vendor.js 7.1 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418
  1. webpackJsonp([2],[
  2. /* 0 */
  3. /***/ function(module, exports, __webpack_require__) {
  4. eval("\"use strict\";\n// Angular\n__webpack_require__(22);\n__webpack_require__(2);\n__webpack_require__(4);\n__webpack_require__(23);\n__webpack_require__(374);\n__webpack_require__(32);\n// RxJS\n__webpack_require__(375);\n// Other vendors for example jQuery, Lodash or Bootstrap\n// You can import js, ts, css, sass, ...\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy92ZW5kb3IudHM/ODIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXG5pbXBvcnQgJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuaW1wb3J0ICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCAnQGFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgJ0Bhbmd1bGFyL3JvdXRlcic7XG4vLyBSeEpTXG5pbXBvcnQgJ3J4anMnO1xuLy8gT3RoZXIgdmVuZG9ycyBmb3IgZXhhbXBsZSBqUXVlcnksIExvZGFzaCBvciBCb290c3RyYXBcbi8vIFlvdSBjYW4gaW1wb3J0IGpzLCB0cywgY3NzLCBzYXNzLCAuLi5cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBub2RlX21vZHVsZXMvYW5ndWxhcjItdGVtcGxhdGUtbG9hZGVyIS4vc3JjL3ZlbmRvci50cyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");
  5. /***/ },
  6. /* 1 */,
  7. /* 2 */
  8. /***/ function(module, exports, __webpack_require__) {
  9. eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * @license Angular v2.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(3), __webpack_require__(4), __webpack_require__(22)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/compiler', '@angular/core', '@angular/platform-browser'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.platformBrowserDynamic = global.ng.platformBrowserDynamic || {}),global.ng.compiler,global.ng.core,global.ng.platformBrowser));\n}(this, function (exports,_angular_compiler,_angular_core,_angular_platformBrowser) { 'use strict';\n\n var INTERNAL_BROWSER_PLATFORM_PROVIDERS = _angular_platformBrowser.__platform_browser_private__.INTERNAL_BROWSER_PLATFORM_PROVIDERS;\n\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var ResourceLoaderImpl = (function (_super) {\n __extends(ResourceLoaderImpl, _super);\n function ResourceLoaderImpl() {\n _super.apply(this, arguments);\n }\n ResourceLoaderImpl.prototype.get = function (url) {\n var resolve;\n var reject;\n var promise = new Promise(function (res, rej) {\n resolve = res;\n reject = rej;\n });\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'text';\n xhr.onload = function () {\n // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n // response/responseType properties were introduced in ResourceLoader Level2 spec (supported\n // by IE10)\n var response = xhr.response || xhr.responseText;\n // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n var status = xhr.status === 1223 ? 204 : xhr.status;\n // fix status code when it is 0 (0 status is undocumented).\n // Occurs when accessing file resources or on Android 4.1 stock browser\n // while retrieving files from application cache.\n if (status === 0) {\n status = response ? 200 : 0;\n }\n if (200 <= status && status <= 300) {\n resolve(response);\n }\n else {\n reject(\"Failed to load \" + url);\n }\n };\n xhr.onerror = function () { reject(\"Failed to load \" + url); };\n xhr.send();\n return promise;\n };\n ResourceLoaderImpl.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n ResourceLoaderImpl.ctorParameters = function () { return []; };\n return ResourceLoaderImpl;\n }(_angular_compiler.ResourceLoader));\n\n var INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS = [\n INTERNAL_BROWSER_PLATFORM_PROVIDERS,\n {\n provide: _angular_core.COMPILER_OPTIONS,\n useValue: { providers: [{ provide: _angular_compiler.ResourceLoader, useClass: ResourceLoaderImpl }] },\n multi: true\n },\n ];\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var globalScope;\n if (typeof window === 'undefined') {\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n globalScope = self;\n }\n else {\n globalScope = global;\n }\n }\n else {\n globalScope = window;\n }\n // Need to declare a new variable for global here since TypeScript\n // exports the original value of the symbol.\n var _global = globalScope;\n // TODO: remove calls to assert in production environment\n // Note: Can't just export this and import in in other files\n // as `assert` is a reserved keyword in Dart\n _global.assert = function assert(condition) {\n // TODO: to be fixed properly via #2830, noop for now\n };\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * An implementation of ResourceLoader that uses a template cache to avoid doing an actual\n * ResourceLoader.\n *\n * The template cache needs to be built and loaded into window.$templateCache\n * via a separate mechanism.\n */\n var CachedResourceLoader = (function (_super) {\n __extends$1(CachedResourceLoader, _super);\n function CachedResourceLoader() {\n _super.call(this);\n this._cache = _global.$templateCache;\n if (this._cache == null) {\n throw new Error('CachedResourceLoader: Template cache was not found in $templateCache.');\n }\n }\n CachedResourceLoader.prototype.get = function (url) {\n if (this._cache.hasOwnProperty(url)) {\n return Promise.resolve(this._cache[url]);\n }\n else {\n return Promise.reject('CachedResourceLoader: Did not find cached template for ' + url);\n }\n };\n return CachedResourceLoader;\n }(_angular_compiler.ResourceLoader));\n\n var __platform_browser_dynamic_private__ = {\n INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS: INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,\n ResourceLoaderImpl: ResourceLoaderImpl\n };\n\n /**\n * @stable\n */\n var VERSION = new _angular_core.Version('2.4.1');\n\n /**\n * @experimental\n */\n var RESOURCE_CACHE_PROVIDER = [{ provide: _angular_compiler.ResourceLoader, useClass: CachedResourceLoader }];\n /**\n * @stable\n */\n var platformBrowserDynamic = _angular_core.createPlatformFactory(_angular_compiler.platformCoreDynamic, 'browserDynamic', INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS);\n\n exports.RESOURCE_CACHE_PROVIDER = RESOURCE_CACHE_PROVIDER;\n exports.platformBrowserDynamic = platformBrowserDynamic;\n exports.VERSION = VERSION;\n exports.__platform_browser_dynamic_private__ = __platform_browser_dynamic_private__;\n\n}));\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljL2J1bmRsZXMvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljLnVtZC5qcz8wNGUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhciB2Mi40LjFcbiAqIChjKSAyMDEwLTIwMTYgR29vZ2xlLCBJbmMuIGh0dHBzOi8vYW5ndWxhci5pby9cbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnQGFuZ3VsYXIvY29tcGlsZXInKSwgcmVxdWlyZSgnQGFuZ3VsYXIvY29yZScpLCByZXF1aXJlKCdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJykpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ0Bhbmd1bGFyL2NvbXBpbGVyJywgJ0Bhbmd1bGFyL2NvcmUnLCAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlciddLCBmYWN0b3J5KSA6XG4gICAgKGZhY3RvcnkoKGdsb2JhbC5uZyA9IGdsb2JhbC5uZyB8fCB7fSwgZ2xvYmFsLm5nLnBsYXRmb3JtQnJvd3NlckR5bmFtaWMgPSBnbG9iYWwubmcucGxhdGZvcm1Ccm93c2VyRHluYW1pYyB8fCB7fSksZ2xvYmFsLm5nLmNvbXBpbGVyLGdsb2JhbC5uZy5jb3JlLGdsb2JhbC5uZy5wbGF0Zm9ybUJyb3dzZXIpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsX2FuZ3VsYXJfY29tcGlsZXIsX2FuZ3VsYXJfY29yZSxfYW5ndWxhcl9wbGF0Zm9ybUJyb3dzZXIpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIElOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTID0gX2FuZ3VsYXJfcGxhdGZvcm1Ccm93c2VyLl9fcGxhdGZvcm1fYnJvd3Nlcl9wcml2YXRlX18uSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlM7XG5cbiAgICB2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgdmFyIFJlc291cmNlTG9hZGVySW1wbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyhSZXNvdXJjZUxvYWRlckltcGwsIF9zdXBlcik7XG4gICAgICAgIGZ1bmN0aW9uIFJlc291cmNlTG9hZGVySW1wbCgpIHtcbiAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIFJlc291cmNlTG9hZGVySW1wbC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgdmFyIHJlc29sdmU7XG4gICAgICAgICAgICB2YXIgcmVqZWN0O1xuICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ3RleHQnO1xuICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KVxuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBSZXNvdXJjZUxvYWRlciBMZXZlbDIgc3BlYyAoc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgLy8gYnkgSUUxMClcbiAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2UgfHwgeGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MClcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXM7XG4gICAgICAgICAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS5cbiAgICAgICAgICAgICAgICAvLyBPY2N1cnMgd2hlbiBhY2Nlc3NpbmcgZmlsZSByZXNvdXJjZXMgb3Igb24gQW5kcm9pZCA0LjEgc3RvY2sgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIHdoaWxlIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBhcHBsaWNhdGlvbiBjYWNoZS5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlID8gMjAwIDogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA8PSBzdGF0dXMgJiYgc3RhdHVzIDw9IDMwMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJlamVjdChcIkZhaWxlZCB0byBsb2FkIFwiICsgdXJsKTsgfTtcbiAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgUmVzb3VyY2VMb2FkZXJJbXBsLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgUmVzb3VyY2VMb2FkZXJJbXBsLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBSZXNvdXJjZUxvYWRlckltcGw7XG4gICAgfShfYW5ndWxhcl9jb21waWxlci5SZXNvdXJjZUxvYWRlcikpO1xuXG4gICAgdmFyIElOVEVSTkFMX0JST1dTRVJfRFlOQU1JQ19QTEFURk9STV9QUk9WSURFUlMgPSBbXG4gICAgICAgIElOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBfYW5ndWxhcl9jb3JlLkNPTVBJTEVSX09QVElPTlMsXG4gICAgICAgICAgICB1c2VWYWx1ZTogeyBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IF9hbmd1bGFyX2NvbXBpbGVyLlJlc291cmNlTG9hZGVyLCB1c2VDbGFzczogUmVzb3VyY2VMb2FkZXJJbXBsIH1dIH0sXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9LFxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIGdsb2JhbFNjb3BlO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgYW55IHdpdGggV29ya2VyR2xvYmFsU2NvcGUgZnJvbSBsaWIud2Vid29ya2VyLmQudHMgIzM0OTJcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlID0gc2VsZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlID0gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbG9iYWxTY29wZSA9IHdpbmRvdztcbiAgICB9XG4gICAgLy8gTmVlZCB0byBkZWNsYXJlIGEgbmV3IHZhcmlhYmxlIGZvciBnbG9iYWwgaGVyZSBzaW5jZSBUeXBlU2NyaXB0XG4gICAgLy8gZXhwb3J0cyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC5cbiAgICB2YXIgX2dsb2JhbCA9IGdsb2JhbFNjb3BlO1xuICAgIC8vIFRPRE86IHJlbW92ZSBjYWxscyB0byBhc3NlcnQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgIC8vIE5vdGU6IENhbid0IGp1c3QgZXhwb3J0IHRoaXMgYW5kIGltcG9ydCBpbiBpbiBvdGhlciBmaWxlc1xuICAgIC8vIGFzIGBhc3NlcnRgIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBEYXJ0XG4gICAgX2dsb2JhbC5hc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uKSB7XG4gICAgICAgIC8vIFRPRE86IHRvIGJlIGZpeGVkIHByb3Blcmx5IHZpYSAjMjgzMCwgbm9vcCBmb3Igbm93XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDEgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBSZXNvdXJjZUxvYWRlciB0aGF0IHVzZXMgYSB0ZW1wbGF0ZSBjYWNoZSB0byBhdm9pZCBkb2luZyBhbiBhY3R1YWxcbiAgICAgKiBSZXNvdXJjZUxvYWRlci5cbiAgICAgKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBjYWNoZSBuZWVkcyB0byBiZSBidWlsdCBhbmQgbG9hZGVkIGludG8gd2luZG93LiR0ZW1wbGF0ZUNhY2hlXG4gICAgICogdmlhIGEgc2VwYXJhdGUgbWVjaGFuaXNtLlxuICAgICAqL1xuICAgIHZhciBDYWNoZWRSZXNvdXJjZUxvYWRlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxKENhY2hlZFJlc291cmNlTG9hZGVyLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBDYWNoZWRSZXNvdXJjZUxvYWRlcigpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSBfZ2xvYmFsLiR0ZW1wbGF0ZUNhY2hlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlZFJlc291cmNlTG9hZGVyOiBUZW1wbGF0ZSBjYWNoZSB3YXMgbm90IGZvdW5kIGluICR0ZW1wbGF0ZUNhY2hlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIENhY2hlZFJlc291cmNlTG9hZGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGUuaGFzT3duUHJvcGVydHkodXJsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fY2FjaGVbdXJsXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhY2hlZFJlc291cmNlTG9hZGVyOiBEaWQgbm90IGZpbmQgY2FjaGVkIHRlbXBsYXRlIGZvciAnICsgdXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENhY2hlZFJlc291cmNlTG9hZGVyO1xuICAgIH0oX2FuZ3VsYXJfY29tcGlsZXIuUmVzb3VyY2VMb2FkZXIpKTtcblxuICAgIHZhciBfX3BsYXRmb3JtX2Jyb3dzZXJfZHluYW1pY19wcml2YXRlX18gPSB7XG4gICAgICAgIElOVEVSTkFMX0JST1dTRVJfRFlOQU1JQ19QTEFURk9STV9QUk9WSURFUlM6IElOVEVSTkFMX0JST1dTRVJfRFlOQU1JQ19QTEFURk9STV9QUk9WSURFUlMsXG4gICAgICAgIFJlc291cmNlTG9hZGVySW1wbDogUmVzb3VyY2VMb2FkZXJJbXBsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgVkVSU0lPTiA9IG5ldyBfYW5ndWxhcl9jb3JlLlZlcnNpb24oJzIuNC4xJyk7XG5cbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIFJFU09VUkNFX0NBQ0hFX1BST1ZJREVSID0gW3sgcHJvdmlkZTogX2FuZ3VsYXJfY29tcGlsZXIuUmVzb3VyY2VMb2FkZXIsIHVzZUNsYXNzOiBDYWNoZWRSZXNvdXJjZUxvYWRlciB9XTtcbiAgICAvKipcbiAgICAgKiBAc3RhYmxlXG4gICAgICovXG4gICAgdmFyIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgPSBfYW5ndWxhcl9jb3JlLmNyZWF0ZVBsYXRmb3JtRmFjdG9yeShfYW5ndWxhcl9jb21waWxlci5wbGF0Zm9ybUNvcmVEeW5hbWljLCAnYnJvd3NlckR5bmFtaWMnLCBJTlRFUk5BTF9CUk9XU0VSX0RZTkFNSUNfUExBVEZPUk1fUFJPVklERVJTKTtcblxuICAgIGV4cG9ydHMuUkVTT1VSQ0VfQ0FDSEVfUFJPVklERVIgPSBSRVNPVVJDRV9DQUNIRV9QUk9WSURFUjtcbiAgICBleHBvcnRzLnBsYXRmb3JtQnJvd3NlckR5bmFtaWMgPSBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljO1xuICAgIGV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG4gICAgZXhwb3J0cy5fX3BsYXRmb3JtX2Jyb3dzZXJfZHluYW1pY19wcml2YXRlX18gPSBfX3BsYXRmb3JtX2Jyb3dzZXJfZHluYW1pY19wcml2YXRlX187XG5cbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljL2J1bmRsZXMvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljLnVtZC5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  10. /***/ },
  11. /* 3 */
  12. /***/ function(module, exports, __webpack_require__) {
  13. eval("/**\n * @license Angular v2.4.0\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(4)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.compiler = global.ng.compiler || {}),global.ng.core));\n}(this, function (exports,_angular_core) { 'use strict';\n\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new _angular_core.Version('2.4.0');\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * A segment of text within the template.\n */\n var TextAst = (function () {\n /**\n * @param {?} value\n * @param {?} ngContentIndex\n * @param {?} sourceSpan\n */\n function TextAst(value, ngContentIndex, sourceSpan) {\n this.value = value;\n this.ngContentIndex = ngContentIndex;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n return TextAst;\n }());\n /**\n * A bound expression within the text of a template.\n */\n var BoundTextAst = (function () {\n /**\n * @param {?} value\n * @param {?} ngContentIndex\n * @param {?} sourceSpan\n */\n function BoundTextAst(value, ngContentIndex, sourceSpan) {\n this.value = value;\n this.ngContentIndex = ngContentIndex;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BoundTextAst.prototype.visit = function (visitor, context) {\n return visitor.visitBoundText(this, context);\n };\n return BoundTextAst;\n }());\n /**\n * A plain attribute on an element.\n */\n var AttrAst = (function () {\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n */\n function AttrAst(name, value, sourceSpan) {\n this.name = name;\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };\n return AttrAst;\n }());\n /**\n * A binding for an element property (e.g. `[property]=\"expression\"`) or an animation trigger (e.g.\n * `[@trigger]=\"stateExp\"`)\n */\n var BoundElementPropertyAst = (function () {\n /**\n * @param {?} name\n * @param {?} type\n * @param {?} securityContext\n * @param {?} needsRuntimeSecurityContext\n * @param {?} value\n * @param {?} unit\n * @param {?} sourceSpan\n */\n function BoundElementPropertyAst(name, type, securityContext, needsRuntimeSecurityContext, value, unit, sourceSpan) {\n this.name = name;\n this.type = type;\n this.securityContext = securityContext;\n this.needsRuntimeSecurityContext = needsRuntimeSecurityContext;\n this.value = value;\n this.unit = unit;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BoundElementPropertyAst.prototype.visit = function (visitor, context) {\n return visitor.visitElementProperty(this, context);\n };\n Object.defineProperty(BoundElementPropertyAst.prototype, \"isAnimation\", {\n /**\n * @return {?}\n */\n get: function () { return this.type === PropertyBindingType.Animation; },\n enumerable: true,\n configurable: true\n });\n return BoundElementPropertyAst;\n }());\n /**\n * A binding for an element event (e.g. `(event)=\"handler()\"`) or an animation trigger event (e.g.\n * `(@trigger.phase)=\"callback($event)\"`).\n */\n var BoundEventAst = (function () {\n /**\n * @param {?} name\n * @param {?} target\n * @param {?} phase\n * @param {?} handler\n * @param {?} sourceSpan\n */\n function BoundEventAst(name, target, phase, handler, sourceSpan) {\n this.name = name;\n this.target = target;\n this.phase = phase;\n this.handler = handler;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} name\n * @param {?} target\n * @param {?} phase\n * @return {?}\n */\n BoundEventAst.calcFullName = function (name, target, phase) {\n if (target) {\n return target + \":\" + name;\n }\n else if (phase) {\n return \"@\" + name + \".\" + phase;\n }\n else {\n return name;\n }\n };\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BoundEventAst.prototype.visit = function (visitor, context) {\n return visitor.visitEvent(this, context);\n };\n Object.defineProperty(BoundEventAst.prototype, \"fullName\", {\n /**\n * @return {?}\n */\n get: function () { return BoundEventAst.calcFullName(this.name, this.target, this.phase); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BoundEventAst.prototype, \"isAnimation\", {\n /**\n * @return {?}\n */\n get: function () { return !!this.phase; },\n enumerable: true,\n configurable: true\n });\n return BoundEventAst;\n }());\n /**\n * A reference declaration on an element (e.g. `let someName=\"expression\"`).\n */\n var ReferenceAst = (function () {\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n */\n function ReferenceAst(name, value, sourceSpan) {\n this.name = name;\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ReferenceAst.prototype.visit = function (visitor, context) {\n return visitor.visitReference(this, context);\n };\n return ReferenceAst;\n }());\n /**\n * A variable declaration on a <template> (e.g. `var-someName=\"someLocalName\"`).\n */\n var VariableAst = (function () {\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n */\n function VariableAst(name, value, sourceSpan) {\n this.name = name;\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n VariableAst.prototype.visit = function (visitor, context) {\n return visitor.visitVariable(this, context);\n };\n return VariableAst;\n }());\n /**\n * An element declaration in a template.\n */\n var ElementAst = (function () {\n /**\n * @param {?} name\n * @param {?} attrs\n * @param {?} inputs\n * @param {?} outputs\n * @param {?} references\n * @param {?} directives\n * @param {?} providers\n * @param {?} hasViewContainer\n * @param {?} children\n * @param {?} ngContentIndex\n * @param {?} sourceSpan\n * @param {?} endSourceSpan\n */\n function ElementAst(name, attrs, inputs, outputs, references, directives, providers, hasViewContainer, children, ngContentIndex, sourceSpan, endSourceSpan) {\n this.name = name;\n this.attrs = attrs;\n this.inputs = inputs;\n this.outputs = outputs;\n this.references = references;\n this.directives = directives;\n this.providers = providers;\n this.hasViewContainer = hasViewContainer;\n this.children = children;\n this.ngContentIndex = ngContentIndex;\n this.sourceSpan = sourceSpan;\n this.endSourceSpan = endSourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ElementAst.prototype.visit = function (visitor, context) {\n return visitor.visitElement(this, context);\n };\n return ElementAst;\n }());\n /**\n * A `<template>` element included in an Angular template.\n */\n var EmbeddedTemplateAst = (function () {\n /**\n * @param {?} attrs\n * @param {?} outputs\n * @param {?} references\n * @param {?} variables\n * @param {?} directives\n * @param {?} providers\n * @param {?} hasViewContainer\n * @param {?} children\n * @param {?} ngContentIndex\n * @param {?} sourceSpan\n */\n function EmbeddedTemplateAst(attrs, outputs, references, variables, directives, providers, hasViewContainer, children, ngContentIndex, sourceSpan) {\n this.attrs = attrs;\n this.outputs = outputs;\n this.references = references;\n this.variables = variables;\n this.directives = directives;\n this.providers = providers;\n this.hasViewContainer = hasViewContainer;\n this.children = children;\n this.ngContentIndex = ngContentIndex;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n EmbeddedTemplateAst.prototype.visit = function (visitor, context) {\n return visitor.visitEmbeddedTemplate(this, context);\n };\n return EmbeddedTemplateAst;\n }());\n /**\n * A directive property with a bound value (e.g. `*ngIf=\"condition\").\n */\n var BoundDirectivePropertyAst = (function () {\n /**\n * @param {?} directiveName\n * @param {?} templateName\n * @param {?} value\n * @param {?} sourceSpan\n */\n function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {\n this.directiveName = directiveName;\n this.templateName = templateName;\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {\n return visitor.visitDirectiveProperty(this, context);\n };\n return BoundDirectivePropertyAst;\n }());\n /**\n * A directive declared on an element.\n */\n var DirectiveAst = (function () {\n /**\n * @param {?} directive\n * @param {?} inputs\n * @param {?} hostProperties\n * @param {?} hostEvents\n * @param {?} sourceSpan\n */\n function DirectiveAst(directive, inputs, hostProperties, hostEvents, sourceSpan) {\n this.directive = directive;\n this.inputs = inputs;\n this.hostProperties = hostProperties;\n this.hostEvents = hostEvents;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n DirectiveAst.prototype.visit = function (visitor, context) {\n return visitor.visitDirective(this, context);\n };\n return DirectiveAst;\n }());\n /**\n * A provider declared on an element\n */\n var ProviderAst = (function () {\n /**\n * @param {?} token\n * @param {?} multiProvider\n * @param {?} eager\n * @param {?} providers\n * @param {?} providerType\n * @param {?} lifecycleHooks\n * @param {?} sourceSpan\n */\n function ProviderAst(token, multiProvider, eager, providers, providerType, lifecycleHooks, sourceSpan) {\n this.token = token;\n this.multiProvider = multiProvider;\n this.eager = eager;\n this.providers = providers;\n this.providerType = providerType;\n this.lifecycleHooks = lifecycleHooks;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ProviderAst.prototype.visit = function (visitor, context) {\n // No visit method in the visitor for now...\n return null;\n };\n return ProviderAst;\n }());\n var ProviderAstType = {};\n ProviderAstType.PublicService = 0;\n ProviderAstType.PrivateService = 1;\n ProviderAstType.Component = 2;\n ProviderAstType.Directive = 3;\n ProviderAstType.Builtin = 4;\n ProviderAstType[ProviderAstType.PublicService] = \"PublicService\";\n ProviderAstType[ProviderAstType.PrivateService] = \"PrivateService\";\n ProviderAstType[ProviderAstType.Component] = \"Component\";\n ProviderAstType[ProviderAstType.Directive] = \"Directive\";\n ProviderAstType[ProviderAstType.Builtin] = \"Builtin\";\n /**\n * Position where content is to be projected (instance of `<ng-content>` in a template).\n */\n var NgContentAst = (function () {\n /**\n * @param {?} index\n * @param {?} ngContentIndex\n * @param {?} sourceSpan\n */\n function NgContentAst(index, ngContentIndex, sourceSpan) {\n this.index = index;\n this.ngContentIndex = ngContentIndex;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n NgContentAst.prototype.visit = function (visitor, context) {\n return visitor.visitNgContent(this, context);\n };\n return NgContentAst;\n }());\n var PropertyBindingType = {};\n PropertyBindingType.Property = 0;\n PropertyBindingType.Attribute = 1;\n PropertyBindingType.Class = 2;\n PropertyBindingType.Style = 3;\n PropertyBindingType.Animation = 4;\n PropertyBindingType[PropertyBindingType.Property] = \"Property\";\n PropertyBindingType[PropertyBindingType.Attribute] = \"Attribute\";\n PropertyBindingType[PropertyBindingType.Class] = \"Class\";\n PropertyBindingType[PropertyBindingType.Style] = \"Style\";\n PropertyBindingType[PropertyBindingType.Animation] = \"Animation\";\n /**\n * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}.\n * @param {?} visitor\n * @param {?} asts\n * @param {?=} context\n * @return {?}\n */\n function templateVisitAll(visitor, asts, context) {\n if (context === void 0) { context = null; }\n var /** @type {?} */ result = [];\n var /** @type {?} */ visit = visitor.visit ?\n function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :\n function (ast) { return ast.visit(visitor, context); };\n asts.forEach(function (ast) {\n var /** @type {?} */ astResult = visit(ast);\n if (astResult) {\n result.push(astResult);\n }\n });\n return result;\n }\n\n /**\n * A token representing the a reference to a static type.\n * *\n * This token is unique for a filePath and name and can be used as a hash table key.\n */\n var StaticSymbol = (function () {\n /**\n * @param {?} filePath\n * @param {?} name\n * @param {?=} members\n */\n function StaticSymbol(filePath, name, members) {\n this.filePath = filePath;\n this.name = name;\n this.members = members;\n }\n return StaticSymbol;\n }());\n /**\n * A cache of static symbol used by the StaticReflector to return the same symbol for the\n * same symbol values.\n */\n var StaticSymbolCache = (function () {\n function StaticSymbolCache() {\n this.cache = new Map();\n }\n /**\n * @param {?} declarationFile\n * @param {?} name\n * @param {?=} members\n * @return {?}\n */\n StaticSymbolCache.prototype.get = function (declarationFile, name, members) {\n members = members || [];\n var /** @type {?} */ memberSuffix = members.length ? \".\" + members.join('.') : '';\n var /** @type {?} */ key = \"\\\"\" + declarationFile + \"\\\".\" + name + memberSuffix;\n var /** @type {?} */ result = this.cache.get(key);\n if (!result) {\n result = new StaticSymbol(declarationFile, name, members);\n this.cache.set(key, result);\n }\n return result;\n };\n return StaticSymbolCache;\n }());\n\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPresent(obj) {\n return obj != null;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isBlank(obj) {\n return obj == null;\n }\n var /** @type {?} */ STRING_MAP_PROTO = Object.getPrototypeOf({});\n /**\n * @param {?} obj\n * @return {?}\n */\n function isStrictStringMap(obj) {\n return typeof obj === 'object' && obj !== null && Object.getPrototypeOf(obj) === STRING_MAP_PROTO;\n }\n /**\n * @param {?} token\n * @return {?}\n */\n function stringify(token) {\n if (typeof token === 'string') {\n return token;\n }\n if (token == null) {\n return '' + token;\n }\n if (token.overriddenName) {\n return \"\" + token.overriddenName;\n }\n if (token.name) {\n return \"\" + token.name;\n }\n var /** @type {?} */ res = token.toString();\n var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n }\n var NumberWrapper = (function () {\n function NumberWrapper() {\n }\n /**\n * @param {?} text\n * @return {?}\n */\n NumberWrapper.parseIntAutoRadix = function (text) {\n var /** @type {?} */ result = parseInt(text);\n if (isNaN(result)) {\n throw new Error('Invalid integer literal when parsing ' + text);\n }\n return result;\n };\n /**\n * @param {?} value\n * @return {?}\n */\n NumberWrapper.isNumeric = function (value) { return !isNaN(value - parseFloat(value)); };\n return NumberWrapper;\n }());\n /**\n * @param {?} o\n * @return {?}\n */\n function isJsObject(o) {\n return o !== null && (typeof o === 'function' || typeof o === 'object');\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPrimitive(obj) {\n return !isJsObject(obj);\n }\n /**\n * @param {?} s\n * @return {?}\n */\n function escapeRegExp(s) {\n return s.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n /**\n * Wraps Javascript Objects\n */\n var StringMapWrapper = (function () {\n function StringMapWrapper() {\n }\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.merge = function (m1, m2) {\n var /** @type {?} */ m = {};\n for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n var k = _a[_i];\n m[k] = m1[k];\n }\n for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n var k = _c[_b];\n m[k] = m2[k];\n }\n return m;\n };\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.equals = function (m1, m2) {\n var /** @type {?} */ k1 = Object.keys(m1);\n var /** @type {?} */ k2 = Object.keys(m2);\n if (k1.length != k2.length) {\n return false;\n }\n for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n var /** @type {?} */ key = k1[i];\n if (m1[key] !== m2[key]) {\n return false;\n }\n }\n return true;\n };\n return StringMapWrapper;\n }());\n var ListWrapper = (function () {\n function ListWrapper() {\n }\n /**\n * @param {?} arr\n * @param {?} condition\n * @return {?}\n */\n ListWrapper.findLast = function (arr, condition) {\n for (var /** @type {?} */ i = arr.length - 1; i >= 0; i--) {\n if (condition(arr[i])) {\n return arr[i];\n }\n }\n return null;\n };\n /**\n * @param {?} list\n * @param {?} items\n * @return {?}\n */\n ListWrapper.removeAll = function (list, items) {\n for (var /** @type {?} */ i = 0; i < items.length; ++i) {\n var /** @type {?} */ index = list.indexOf(items[i]);\n if (index > -1) {\n list.splice(index, 1);\n }\n }\n };\n /**\n * @param {?} list\n * @param {?} el\n * @return {?}\n */\n ListWrapper.remove = function (list, el) {\n var /** @type {?} */ index = list.indexOf(el);\n if (index > -1) {\n list.splice(index, 1);\n return true;\n }\n return false;\n };\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n ListWrapper.equals = function (a, b) {\n if (a.length != b.length)\n return false;\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n };\n /**\n * @param {?} list\n * @return {?}\n */\n ListWrapper.flatten = function (list) {\n return list.reduce(function (flat, item) {\n var /** @type {?} */ flatItem = Array.isArray(item) ? ListWrapper.flatten(item) : item;\n return ((flat)).concat(flatItem);\n }, []);\n };\n return ListWrapper;\n }());\n\n var /** @type {?} */ isDefaultChangeDetectionStrategy = _angular_core.__core_private__.isDefaultChangeDetectionStrategy;\n var /** @type {?} */ ChangeDetectorStatus = _angular_core.__core_private__.ChangeDetectorStatus;\n var /** @type {?} */ LifecycleHooks = _angular_core.__core_private__.LifecycleHooks;\n var /** @type {?} */ LIFECYCLE_HOOKS_VALUES = _angular_core.__core_private__.LIFECYCLE_HOOKS_VALUES;\n var /** @type {?} */ ReflectorReader = _angular_core.__core_private__.ReflectorReader;\n var /** @type {?} */ ViewContainer = _angular_core.__core_private__.ViewContainer;\n var /** @type {?} */ CodegenComponentFactoryResolver = _angular_core.__core_private__.CodegenComponentFactoryResolver;\n var /** @type {?} */ ComponentRef_ = _angular_core.__core_private__.ComponentRef_;\n var /** @type {?} */ AppView = _angular_core.__core_private__.AppView;\n var /** @type {?} */ DebugAppView = _angular_core.__core_private__.DebugAppView;\n var /** @type {?} */ NgModuleInjector = _angular_core.__core_private__.NgModuleInjector;\n var /** @type {?} */ registerModuleFactory = _angular_core.__core_private__.registerModuleFactory;\n var /** @type {?} */ ViewType = _angular_core.__core_private__.ViewType;\n var /** @type {?} */ view_utils = _angular_core.__core_private__.view_utils;\n var /** @type {?} */ DebugContext = _angular_core.__core_private__.DebugContext;\n var /** @type {?} */ StaticNodeDebugInfo = _angular_core.__core_private__.StaticNodeDebugInfo;\n var /** @type {?} */ devModeEqual = _angular_core.__core_private__.devModeEqual;\n var /** @type {?} */ UNINITIALIZED = _angular_core.__core_private__.UNINITIALIZED;\n var /** @type {?} */ ValueUnwrapper = _angular_core.__core_private__.ValueUnwrapper;\n var /** @type {?} */ TemplateRef_ = _angular_core.__core_private__.TemplateRef_;\n var /** @type {?} */ Console = _angular_core.__core_private__.Console;\n var /** @type {?} */ reflector = _angular_core.__core_private__.reflector;\n var /** @type {?} */ Reflector = _angular_core.__core_private__.Reflector;\n var /** @type {?} */ ReflectionCapabilities = _angular_core.__core_private__.ReflectionCapabilities;\n var /** @type {?} */ NoOpAnimationPlayer = _angular_core.__core_private__.NoOpAnimationPlayer;\n var /** @type {?} */ AnimationSequencePlayer = _angular_core.__core_private__.AnimationSequencePlayer;\n var /** @type {?} */ AnimationGroupPlayer = _angular_core.__core_private__.AnimationGroupPlayer;\n var /** @type {?} */ AnimationKeyframe = _angular_core.__core_private__.AnimationKeyframe;\n var /** @type {?} */ AnimationStyles = _angular_core.__core_private__.AnimationStyles;\n var /** @type {?} */ ANY_STATE = _angular_core.__core_private__.ANY_STATE;\n var /** @type {?} */ DEFAULT_STATE = _angular_core.__core_private__.DEFAULT_STATE;\n var /** @type {?} */ EMPTY_STATE = _angular_core.__core_private__.EMPTY_STATE;\n var /** @type {?} */ FILL_STYLE_FLAG = _angular_core.__core_private__.FILL_STYLE_FLAG;\n var /** @type {?} */ prepareFinalAnimationStyles = _angular_core.__core_private__.prepareFinalAnimationStyles;\n var /** @type {?} */ balanceAnimationKeyframes = _angular_core.__core_private__.balanceAnimationKeyframes;\n var /** @type {?} */ clearStyles = _angular_core.__core_private__.clearStyles;\n var /** @type {?} */ collectAndResolveStyles = _angular_core.__core_private__.collectAndResolveStyles;\n var /** @type {?} */ renderStyles = _angular_core.__core_private__.renderStyles;\n var /** @type {?} */ ComponentStillLoadingError = _angular_core.__core_private__.ComponentStillLoadingError;\n var /** @type {?} */ AnimationTransition = _angular_core.__core_private__.AnimationTransition;\n\n var TagContentType = {};\n TagContentType.RAW_TEXT = 0;\n TagContentType.ESCAPABLE_RAW_TEXT = 1;\n TagContentType.PARSABLE_DATA = 2;\n TagContentType[TagContentType.RAW_TEXT] = \"RAW_TEXT\";\n TagContentType[TagContentType.ESCAPABLE_RAW_TEXT] = \"ESCAPABLE_RAW_TEXT\";\n TagContentType[TagContentType.PARSABLE_DATA] = \"PARSABLE_DATA\";\n /**\n * @param {?} elementName\n * @return {?}\n */\n function splitNsName(elementName) {\n if (elementName[0] != ':') {\n return [null, elementName];\n }\n var /** @type {?} */ colonIndex = elementName.indexOf(':', 1);\n if (colonIndex == -1) {\n throw new Error(\"Unsupported format \\\"\" + elementName + \"\\\" expecting \\\":namespace:name\\\"\");\n }\n return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];\n }\n /**\n * @param {?} fullName\n * @return {?}\n */\n function getNsPrefix(fullName) {\n return fullName === null ? null : splitNsName(fullName)[0];\n }\n /**\n * @param {?} prefix\n * @param {?} localName\n * @return {?}\n */\n function mergeNsAndName(prefix, localName) {\n return prefix ? \":\" + prefix + \":\" + localName : localName;\n }\n // see http://www.w3.org/TR/html51/syntax.html#named-character-references\n // see https://html.spec.whatwg.org/multipage/entities.json\n // This list is not exhaustive to keep the compiler footprint low.\n // The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not exist.\n var /** @type {?} */ NAMED_ENTITIES = {\n 'Aacute': '\\u00C1',\n 'aacute': '\\u00E1',\n 'Acirc': '\\u00C2',\n 'acirc': '\\u00E2',\n 'acute': '\\u00B4',\n 'AElig': '\\u00C6',\n 'aelig': '\\u00E6',\n 'Agrave': '\\u00C0',\n 'agrave': '\\u00E0',\n 'alefsym': '\\u2135',\n 'Alpha': '\\u0391',\n 'alpha': '\\u03B1',\n 'amp': '&',\n 'and': '\\u2227',\n 'ang': '\\u2220',\n 'apos': '\\u0027',\n 'Aring': '\\u00C5',\n 'aring': '\\u00E5',\n 'asymp': '\\u2248',\n 'Atilde': '\\u00C3',\n 'atilde': '\\u00E3',\n 'Auml': '\\u00C4',\n 'auml': '\\u00E4',\n 'bdquo': '\\u201E',\n 'Beta': '\\u0392',\n 'beta': '\\u03B2',\n 'brvbar': '\\u00A6',\n 'bull': '\\u2022',\n 'cap': '\\u2229',\n 'Ccedil': '\\u00C7',\n 'ccedil': '\\u00E7',\n 'cedil': '\\u00B8',\n 'cent': '\\u00A2',\n 'Chi': '\\u03A7',\n 'chi': '\\u03C7',\n 'circ': '\\u02C6',\n 'clubs': '\\u2663',\n 'cong': '\\u2245',\n 'copy': '\\u00A9',\n 'crarr': '\\u21B5',\n 'cup': '\\u222A',\n 'curren': '\\u00A4',\n 'dagger': '\\u2020',\n 'Dagger': '\\u2021',\n 'darr': '\\u2193',\n 'dArr': '\\u21D3',\n 'deg': '\\u00B0',\n 'Delta': '\\u0394',\n 'delta': '\\u03B4',\n 'diams': '\\u2666',\n 'divide': '\\u00F7',\n 'Eacute': '\\u00C9',\n 'eacute': '\\u00E9',\n 'Ecirc': '\\u00CA',\n 'ecirc': '\\u00EA',\n 'Egrave': '\\u00C8',\n 'egrave': '\\u00E8',\n 'empty': '\\u2205',\n 'emsp': '\\u2003',\n 'ensp': '\\u2002',\n 'Epsilon': '\\u0395',\n 'epsilon': '\\u03B5',\n 'equiv': '\\u2261',\n 'Eta': '\\u0397',\n 'eta': '\\u03B7',\n 'ETH': '\\u00D0',\n 'eth': '\\u00F0',\n 'Euml': '\\u00CB',\n 'euml': '\\u00EB',\n 'euro': '\\u20AC',\n 'exist': '\\u2203',\n 'fnof': '\\u0192',\n 'forall': '\\u2200',\n 'frac12': '\\u00BD',\n 'frac14': '\\u00BC',\n 'frac34': '\\u00BE',\n 'frasl': '\\u2044',\n 'Gamma': '\\u0393',\n 'gamma': '\\u03B3',\n 'ge': '\\u2265',\n 'gt': '>',\n 'harr': '\\u2194',\n 'hArr': '\\u21D4',\n 'hearts': '\\u2665',\n 'hellip': '\\u2026',\n 'Iacute': '\\u00CD',\n 'iacute': '\\u00ED',\n 'Icirc': '\\u00CE',\n 'icirc': '\\u00EE',\n 'iexcl': '\\u00A1',\n 'Igrave': '\\u00CC',\n 'igrave': '\\u00EC',\n 'image': '\\u2111',\n 'infin': '\\u221E',\n 'int': '\\u222B',\n 'Iota': '\\u0399',\n 'iota': '\\u03B9',\n 'iquest': '\\u00BF',\n 'isin': '\\u2208',\n 'Iuml': '\\u00CF',\n 'iuml': '\\u00EF',\n 'Kappa': '\\u039A',\n 'kappa': '\\u03BA',\n 'Lambda': '\\u039B',\n 'lambda': '\\u03BB',\n 'lang': '\\u27E8',\n 'laquo': '\\u00AB',\n 'larr': '\\u2190',\n 'lArr': '\\u21D0',\n 'lceil': '\\u2308',\n 'ldquo': '\\u201C',\n 'le': '\\u2264',\n 'lfloor': '\\u230A',\n 'lowast': '\\u2217',\n 'loz': '\\u25CA',\n 'lrm': '\\u200E',\n 'lsaquo': '\\u2039',\n 'lsquo': '\\u2018',\n 'lt': '<',\n 'macr': '\\u00AF',\n 'mdash': '\\u2014',\n 'micro': '\\u00B5',\n 'middot': '\\u00B7',\n 'minus': '\\u2212',\n 'Mu': '\\u039C',\n 'mu': '\\u03BC',\n 'nabla': '\\u2207',\n 'nbsp': '\\u00A0',\n 'ndash': '\\u2013',\n 'ne': '\\u2260',\n 'ni': '\\u220B',\n 'not': '\\u00AC',\n 'notin': '\\u2209',\n 'nsub': '\\u2284',\n 'Ntilde': '\\u00D1',\n 'ntilde': '\\u00F1',\n 'Nu': '\\u039D',\n 'nu': '\\u03BD',\n 'Oacute': '\\u00D3',\n 'oacute': '\\u00F3',\n 'Ocirc': '\\u00D4',\n 'ocirc': '\\u00F4',\n 'OElig': '\\u0152',\n 'oelig': '\\u0153',\n 'Ograve': '\\u00D2',\n 'ograve': '\\u00F2',\n 'oline': '\\u203E',\n 'Omega': '\\u03A9',\n 'omega': '\\u03C9',\n 'Omicron': '\\u039F',\n 'omicron': '\\u03BF',\n 'oplus': '\\u2295',\n 'or': '\\u2228',\n 'ordf': '\\u00AA',\n 'ordm': '\\u00BA',\n 'Oslash': '\\u00D8',\n 'oslash': '\\u00F8',\n 'Otilde': '\\u00D5',\n 'otilde': '\\u00F5',\n 'otimes': '\\u2297',\n 'Ouml': '\\u00D6',\n 'ouml': '\\u00F6',\n 'para': '\\u00B6',\n 'permil': '\\u2030',\n 'perp': '\\u22A5',\n 'Phi': '\\u03A6',\n 'phi': '\\u03C6',\n 'Pi': '\\u03A0',\n 'pi': '\\u03C0',\n 'piv': '\\u03D6',\n 'plusmn': '\\u00B1',\n 'pound': '\\u00A3',\n 'prime': '\\u2032',\n 'Prime': '\\u2033',\n 'prod': '\\u220F',\n 'prop': '\\u221D',\n 'Psi': '\\u03A8',\n 'psi': '\\u03C8',\n 'quot': '\\u0022',\n 'radic': '\\u221A',\n 'rang': '\\u27E9',\n 'raquo': '\\u00BB',\n 'rarr': '\\u2192',\n 'rArr': '\\u21D2',\n 'rceil': '\\u2309',\n 'rdquo': '\\u201D',\n 'real': '\\u211C',\n 'reg': '\\u00AE',\n 'rfloor': '\\u230B',\n 'Rho': '\\u03A1',\n 'rho': '\\u03C1',\n 'rlm': '\\u200F',\n 'rsaquo': '\\u203A',\n 'rsquo': '\\u2019',\n 'sbquo': '\\u201A',\n 'Scaron': '\\u0160',\n 'scaron': '\\u0161',\n 'sdot': '\\u22C5',\n 'sect': '\\u00A7',\n 'shy': '\\u00AD',\n 'Sigma': '\\u03A3',\n 'sigma': '\\u03C3',\n 'sigmaf': '\\u03C2',\n 'sim': '\\u223C',\n 'spades': '\\u2660',\n 'sub': '\\u2282',\n 'sube': '\\u2286',\n 'sum': '\\u2211',\n 'sup': '\\u2283',\n 'sup1': '\\u00B9',\n 'sup2': '\\u00B2',\n 'sup3': '\\u00B3',\n 'supe': '\\u2287',\n 'szlig': '\\u00DF',\n 'Tau': '\\u03A4',\n 'tau': '\\u03C4',\n 'there4': '\\u2234',\n 'Theta': '\\u0398',\n 'theta': '\\u03B8',\n 'thetasym': '\\u03D1',\n 'thinsp': '\\u2009',\n 'THORN': '\\u00DE',\n 'thorn': '\\u00FE',\n 'tilde': '\\u02DC',\n 'times': '\\u00D7',\n 'trade': '\\u2122',\n 'Uacute': '\\u00DA',\n 'uacute': '\\u00FA',\n 'uarr': '\\u2191',\n 'uArr': '\\u21D1',\n 'Ucirc': '\\u00DB',\n 'ucirc': '\\u00FB',\n 'Ugrave': '\\u00D9',\n 'ugrave': '\\u00F9',\n 'uml': '\\u00A8',\n 'upsih': '\\u03D2',\n 'Upsilon': '\\u03A5',\n 'upsilon': '\\u03C5',\n 'Uuml': '\\u00DC',\n 'uuml': '\\u00FC',\n 'weierp': '\\u2118',\n 'Xi': '\\u039E',\n 'xi': '\\u03BE',\n 'Yacute': '\\u00DD',\n 'yacute': '\\u00FD',\n 'yen': '\\u00A5',\n 'yuml': '\\u00FF',\n 'Yuml': '\\u0178',\n 'Zeta': '\\u0396',\n 'zeta': '\\u03B6',\n 'zwj': '\\u200D',\n 'zwnj': '\\u200C',\n };\n\n var HtmlTagDefinition = (function () {\n /**\n * @param {?=} __0\n */\n function HtmlTagDefinition(_a) {\n var _this = this;\n var _b = _a === void 0 ? {} : _a, closedByChildren = _b.closedByChildren, requiredParents = _b.requiredParents, implicitNamespacePrefix = _b.implicitNamespacePrefix, _c = _b.contentType, contentType = _c === void 0 ? TagContentType.PARSABLE_DATA : _c, _d = _b.closedByParent, closedByParent = _d === void 0 ? false : _d, _e = _b.isVoid, isVoid = _e === void 0 ? false : _e, _f = _b.ignoreFirstLf, ignoreFirstLf = _f === void 0 ? false : _f;\n this.closedByChildren = {};\n this.closedByParent = false;\n this.canSelfClose = false;\n if (closedByChildren && closedByChildren.length > 0) {\n closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });\n }\n this.isVoid = isVoid;\n this.closedByParent = closedByParent || isVoid;\n if (requiredParents && requiredParents.length > 0) {\n this.requiredParents = {};\n // The first parent is the list is automatically when none of the listed parents are present\n this.parentToAdd = requiredParents[0];\n requiredParents.forEach(function (tagName) { return _this.requiredParents[tagName] = true; });\n }\n this.implicitNamespacePrefix = implicitNamespacePrefix;\n this.contentType = contentType;\n this.ignoreFirstLf = ignoreFirstLf;\n }\n /**\n * @param {?} currentParent\n * @return {?}\n */\n HtmlTagDefinition.prototype.requireExtraParent = function (currentParent) {\n if (!this.requiredParents) {\n return false;\n }\n if (!currentParent) {\n return true;\n }\n var /** @type {?} */ lcParent = currentParent.toLowerCase();\n return this.requiredParents[lcParent] != true && lcParent != 'template';\n };\n /**\n * @param {?} name\n * @return {?}\n */\n HtmlTagDefinition.prototype.isClosedByChild = function (name) {\n return this.isVoid || name.toLowerCase() in this.closedByChildren;\n };\n return HtmlTagDefinition;\n }());\n // see http://www.w3.org/TR/html51/syntax.html#optional-tags\n // This implementation does not fully conform to the HTML5 spec.\n var /** @type {?} */ TAG_DEFINITIONS = {\n 'base': new HtmlTagDefinition({ isVoid: true }),\n 'meta': new HtmlTagDefinition({ isVoid: true }),\n 'area': new HtmlTagDefinition({ isVoid: true }),\n 'embed': new HtmlTagDefinition({ isVoid: true }),\n 'link': new HtmlTagDefinition({ isVoid: true }),\n 'img': new HtmlTagDefinition({ isVoid: true }),\n 'input': new HtmlTagDefinition({ isVoid: true }),\n 'param': new HtmlTagDefinition({ isVoid: true }),\n 'hr': new HtmlTagDefinition({ isVoid: true }),\n 'br': new HtmlTagDefinition({ isVoid: true }),\n 'source': new HtmlTagDefinition({ isVoid: true }),\n 'track': new HtmlTagDefinition({ isVoid: true }),\n 'wbr': new HtmlTagDefinition({ isVoid: true }),\n 'p': new HtmlTagDefinition({\n closedByChildren: [\n 'address', 'article', 'aside', 'blockquote', 'div', 'dl', 'fieldset', 'footer', 'form',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr',\n 'main', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'\n ],\n closedByParent: true\n }),\n 'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),\n 'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),\n 'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),\n 'tr': new HtmlTagDefinition({\n closedByChildren: ['tr'],\n requiredParents: ['tbody', 'tfoot', 'thead'],\n closedByParent: true\n }),\n 'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),\n 'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),\n 'col': new HtmlTagDefinition({ requiredParents: ['colgroup'], isVoid: true }),\n 'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),\n 'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),\n 'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),\n 'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),\n 'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),\n 'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n 'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n 'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),\n 'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),\n 'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),\n 'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),\n 'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),\n 'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),\n 'style': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),\n 'script': new HtmlTagDefinition({ contentType: TagContentType.RAW_TEXT }),\n 'title': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT }),\n 'textarea': new HtmlTagDefinition({ contentType: TagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),\n };\n var /** @type {?} */ _DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();\n /**\n * @param {?} tagName\n * @return {?}\n */\n function getHtmlTagDefinition(tagName) {\n return TAG_DEFINITIONS[tagName.toLowerCase()] || _DEFAULT_TAG_DEFINITION;\n }\n\n var /** @type {?} */ _SELECTOR_REGEXP = new RegExp('(\\\\:not\\\\()|' +\n '([-\\\\w]+)|' +\n '(?:\\\\.([-\\\\w]+))|' +\n '(?:\\\\[([-\\\\w*]+)(?:=([^\\\\]]*))?\\\\])|' +\n '(\\\\))|' +\n '(\\\\s*,\\\\s*)', // \",\"\n 'g');\n /**\n * A css selector contains an element name,\n * css classes and attribute/value pairs with the purpose\n * of selecting subsets out of them.\n */\n var CssSelector = (function () {\n function CssSelector() {\n this.element = null;\n this.classNames = [];\n this.attrs = [];\n this.notSelectors = [];\n }\n /**\n * @param {?} selector\n * @return {?}\n */\n CssSelector.parse = function (selector) {\n var /** @type {?} */ results = [];\n var /** @type {?} */ _addResult = function (res, cssSel) {\n if (cssSel.notSelectors.length > 0 && !cssSel.element && cssSel.classNames.length == 0 &&\n cssSel.attrs.length == 0) {\n cssSel.element = '*';\n }\n res.push(cssSel);\n };\n var /** @type {?} */ cssSelector = new CssSelector();\n var /** @type {?} */ match;\n var /** @type {?} */ current = cssSelector;\n var /** @type {?} */ inNot = false;\n _SELECTOR_REGEXP.lastIndex = 0;\n while (match = _SELECTOR_REGEXP.exec(selector)) {\n if (match[1]) {\n if (inNot) {\n throw new Error('Nesting :not is not allowed in a selector');\n }\n inNot = true;\n current = new CssSelector();\n cssSelector.notSelectors.push(current);\n }\n if (match[2]) {\n current.setElement(match[2]);\n }\n if (match[3]) {\n current.addClassName(match[3]);\n }\n if (match[4]) {\n current.addAttribute(match[4], match[5]);\n }\n if (match[6]) {\n inNot = false;\n current = cssSelector;\n }\n if (match[7]) {\n if (inNot) {\n throw new Error('Multiple selectors in :not are not supported');\n }\n _addResult(results, cssSelector);\n cssSelector = current = new CssSelector();\n }\n }\n _addResult(results, cssSelector);\n return results;\n };\n /**\n * @return {?}\n */\n CssSelector.prototype.isElementSelector = function () {\n return this.hasElementSelector() && this.classNames.length == 0 && this.attrs.length == 0 &&\n this.notSelectors.length === 0;\n };\n /**\n * @return {?}\n */\n CssSelector.prototype.hasElementSelector = function () { return !!this.element; };\n /**\n * @param {?=} element\n * @return {?}\n */\n CssSelector.prototype.setElement = function (element) {\n if (element === void 0) { element = null; }\n this.element = element;\n };\n /**\n * Gets a template string for an element that matches the selector.\n * @return {?}\n */\n CssSelector.prototype.getMatchingElementTemplate = function () {\n var /** @type {?} */ tagName = this.element || 'div';\n var /** @type {?} */ classAttr = this.classNames.length > 0 ? \" class=\\\"\" + this.classNames.join(' ') + \"\\\"\" : '';\n var /** @type {?} */ attrs = '';\n for (var /** @type {?} */ i = 0; i < this.attrs.length; i += 2) {\n var /** @type {?} */ attrName = this.attrs[i];\n var /** @type {?} */ attrValue = this.attrs[i + 1] !== '' ? \"=\\\"\" + this.attrs[i + 1] + \"\\\"\" : '';\n attrs += \" \" + attrName + attrValue;\n }\n return getHtmlTagDefinition(tagName).isVoid ? \"<\" + tagName + classAttr + attrs + \"/>\" :\n \"<\" + tagName + classAttr + attrs + \"></\" + tagName + \">\";\n };\n /**\n * @param {?} name\n * @param {?=} value\n * @return {?}\n */\n CssSelector.prototype.addAttribute = function (name, value) {\n if (value === void 0) { value = ''; }\n this.attrs.push(name, value && value.toLowerCase() || '');\n };\n /**\n * @param {?} name\n * @return {?}\n */\n CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };\n /**\n * @return {?}\n */\n CssSelector.prototype.toString = function () {\n var /** @type {?} */ res = this.element || '';\n if (this.classNames) {\n this.classNames.forEach(function (klass) { return res += \".\" + klass; });\n }\n if (this.attrs) {\n for (var /** @type {?} */ i = 0; i < this.attrs.length; i += 2) {\n var /** @type {?} */ name_1 = this.attrs[i];\n var /** @type {?} */ value = this.attrs[i + 1];\n res += \"[\" + name_1 + (value ? '=' + value : '') + \"]\";\n }\n }\n this.notSelectors.forEach(function (notSelector) { return res += \":not(\" + notSelector + \")\"; });\n return res;\n };\n return CssSelector;\n }());\n /**\n * Reads a list of CssSelectors and allows to calculate which ones\n * are contained in a given CssSelector.\n */\n var SelectorMatcher = (function () {\n function SelectorMatcher() {\n this._elementMap = new Map();\n this._elementPartialMap = new Map();\n this._classMap = new Map();\n this._classPartialMap = new Map();\n this._attrValueMap = new Map();\n this._attrValuePartialMap = new Map();\n this._listContexts = [];\n }\n /**\n * @param {?} notSelectors\n * @return {?}\n */\n SelectorMatcher.createNotMatcher = function (notSelectors) {\n var /** @type {?} */ notMatcher = new SelectorMatcher();\n notMatcher.addSelectables(notSelectors, null);\n return notMatcher;\n };\n /**\n * @param {?} cssSelectors\n * @param {?=} callbackCtxt\n * @return {?}\n */\n SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {\n var /** @type {?} */ listContext = null;\n if (cssSelectors.length > 1) {\n listContext = new SelectorListContext(cssSelectors);\n this._listContexts.push(listContext);\n }\n for (var /** @type {?} */ i = 0; i < cssSelectors.length; i++) {\n this._addSelectable(cssSelectors[i], callbackCtxt, listContext);\n }\n };\n /**\n * Add an object that can be found later on by calling `match`.\n * @param {?} cssSelector A css selector\n * @param {?} callbackCtxt An opaque object that will be given to the callback of the `match` function\n * @param {?} listContext\n * @return {?}\n */\n SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {\n var /** @type {?} */ matcher = this;\n var /** @type {?} */ element = cssSelector.element;\n var /** @type {?} */ classNames = cssSelector.classNames;\n var /** @type {?} */ attrs = cssSelector.attrs;\n var /** @type {?} */ selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);\n if (element) {\n var /** @type {?} */ isTerminal = attrs.length === 0 && classNames.length === 0;\n if (isTerminal) {\n this._addTerminal(matcher._elementMap, element, selectable);\n }\n else {\n matcher = this._addPartial(matcher._elementPartialMap, element);\n }\n }\n if (classNames) {\n for (var /** @type {?} */ i = 0; i < classNames.length; i++) {\n var /** @type {?} */ isTerminal = attrs.length === 0 && i === classNames.length - 1;\n var /** @type {?} */ className = classNames[i];\n if (isTerminal) {\n this._addTerminal(matcher._classMap, className, selectable);\n }\n else {\n matcher = this._addPartial(matcher._classPartialMap, className);\n }\n }\n }\n if (attrs) {\n for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n var /** @type {?} */ isTerminal = i === attrs.length - 2;\n var /** @type {?} */ name_2 = attrs[i];\n var /** @type {?} */ value = attrs[i + 1];\n if (isTerminal) {\n var /** @type {?} */ terminalMap = matcher._attrValueMap;\n var /** @type {?} */ terminalValuesMap = terminalMap.get(name_2);\n if (!terminalValuesMap) {\n terminalValuesMap = new Map();\n terminalMap.set(name_2, terminalValuesMap);\n }\n this._addTerminal(terminalValuesMap, value, selectable);\n }\n else {\n var /** @type {?} */ partialMap = matcher._attrValuePartialMap;\n var /** @type {?} */ partialValuesMap = partialMap.get(name_2);\n if (!partialValuesMap) {\n partialValuesMap = new Map();\n partialMap.set(name_2, partialValuesMap);\n }\n matcher = this._addPartial(partialValuesMap, value);\n }\n }\n }\n };\n /**\n * @param {?} map\n * @param {?} name\n * @param {?} selectable\n * @return {?}\n */\n SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {\n var /** @type {?} */ terminalList = map.get(name);\n if (!terminalList) {\n terminalList = [];\n map.set(name, terminalList);\n }\n terminalList.push(selectable);\n };\n /**\n * @param {?} map\n * @param {?} name\n * @return {?}\n */\n SelectorMatcher.prototype._addPartial = function (map, name) {\n var /** @type {?} */ matcher = map.get(name);\n if (!matcher) {\n matcher = new SelectorMatcher();\n map.set(name, matcher);\n }\n return matcher;\n };\n /**\n * Find the objects that have been added via `addSelectable`\n * whose css selector is contained in the given css selector.\n * @param {?} cssSelector A css selector\n * @param {?} matchedCallback This callback will be called with the object handed into `addSelectable`\n * @return {?} boolean true if a match was found\n */\n SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {\n var /** @type {?} */ result = false;\n var /** @type {?} */ element = cssSelector.element;\n var /** @type {?} */ classNames = cssSelector.classNames;\n var /** @type {?} */ attrs = cssSelector.attrs;\n for (var /** @type {?} */ i = 0; i < this._listContexts.length; i++) {\n this._listContexts[i].alreadyMatched = false;\n }\n result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;\n result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||\n result;\n if (classNames) {\n for (var /** @type {?} */ i = 0; i < classNames.length; i++) {\n var /** @type {?} */ className = classNames[i];\n result =\n this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;\n result =\n this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||\n result;\n }\n }\n if (attrs) {\n for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n var /** @type {?} */ name_3 = attrs[i];\n var /** @type {?} */ value = attrs[i + 1];\n var /** @type {?} */ terminalValuesMap = this._attrValueMap.get(name_3);\n if (value) {\n result =\n this._matchTerminal(terminalValuesMap, '', cssSelector, matchedCallback) || result;\n }\n result =\n this._matchTerminal(terminalValuesMap, value, cssSelector, matchedCallback) || result;\n var /** @type {?} */ partialValuesMap = this._attrValuePartialMap.get(name_3);\n if (value) {\n result = this._matchPartial(partialValuesMap, '', cssSelector, matchedCallback) || result;\n }\n result =\n this._matchPartial(partialValuesMap, value, cssSelector, matchedCallback) || result;\n }\n }\n return result;\n };\n /**\n * @param {?} map\n * @param {?} name\n * @param {?} cssSelector\n * @param {?} matchedCallback\n * @return {?}\n */\n SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {\n if (!map || typeof name !== 'string') {\n return false;\n }\n var /** @type {?} */ selectables = map.get(name) || [];\n var /** @type {?} */ starSelectables = map.get('*');\n if (starSelectables) {\n selectables = selectables.concat(starSelectables);\n }\n if (selectables.length === 0) {\n return false;\n }\n var /** @type {?} */ selectable;\n var /** @type {?} */ result = false;\n for (var /** @type {?} */ i = 0; i < selectables.length; i++) {\n selectable = selectables[i];\n result = selectable.finalize(cssSelector, matchedCallback) || result;\n }\n return result;\n };\n /**\n * @param {?} map\n * @param {?} name\n * @param {?} cssSelector\n * @param {?} matchedCallback\n * @return {?}\n */\n SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback) {\n if (!map || typeof name !== 'string') {\n return false;\n }\n var /** @type {?} */ nestedSelector = map.get(name);\n if (!nestedSelector) {\n return false;\n }\n // TODO(perf): get rid of recursion and measure again\n // TODO(perf): don't pass the whole selector into the recursion,\n // but only the not processed parts\n return nestedSelector.match(cssSelector, matchedCallback);\n };\n return SelectorMatcher;\n }());\n var SelectorListContext = (function () {\n /**\n * @param {?} selectors\n */\n function SelectorListContext(selectors) {\n this.selectors = selectors;\n this.alreadyMatched = false;\n }\n return SelectorListContext;\n }());\n // Store context to pass back selector and context when a selector is matched\n var SelectorContext = (function () {\n /**\n * @param {?} selector\n * @param {?} cbContext\n * @param {?} listContext\n */\n function SelectorContext(selector, cbContext, listContext) {\n this.selector = selector;\n this.cbContext = cbContext;\n this.listContext = listContext;\n this.notSelectors = selector.notSelectors;\n }\n /**\n * @param {?} cssSelector\n * @param {?} callback\n * @return {?}\n */\n SelectorContext.prototype.finalize = function (cssSelector, callback) {\n var /** @type {?} */ result = true;\n if (this.notSelectors.length > 0 && (!this.listContext || !this.listContext.alreadyMatched)) {\n var /** @type {?} */ notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);\n result = !notMatcher.match(cssSelector, null);\n }\n if (result && callback && (!this.listContext || !this.listContext.alreadyMatched)) {\n if (this.listContext) {\n this.listContext.alreadyMatched = true;\n }\n callback(this.selector, this.cbContext);\n }\n return result;\n };\n return SelectorContext;\n }());\n\n var __extends$3 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @stable\n */\n var BaseError = (function (_super) {\n __extends$3(BaseError, _super);\n /**\n * @param {?} message\n */\n function BaseError(message) {\n _super.call(this, message);\n // Errors don't use current this, instead they create a new instance.\n // We have to do forward all of our api to the nativeInstance.\n // TODO(bradfordcsmith): Remove this hack when\n // google/closure-compiler/issues/2102 is fixed.\n var nativeError = new Error(message);\n this._nativeError = nativeError;\n }\n Object.defineProperty(BaseError.prototype, \"message\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.message; },\n /**\n * @param {?} message\n * @return {?}\n */\n set: function (message) { this._nativeError.message = message; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"name\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.name; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () { return ((this._nativeError)).stack; },\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) { ((this._nativeError)).stack = value; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n return BaseError;\n }(Error));\n /**\n * @stable\n */\n var WrappedError = (function (_super) {\n __extends$3(WrappedError, _super);\n /**\n * @param {?} message\n * @param {?} error\n */\n function WrappedError(message, error) {\n _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n this.originalError = error;\n }\n Object.defineProperty(WrappedError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () {\n return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n .stack;\n },\n enumerable: true,\n configurable: true\n });\n return WrappedError;\n }(BaseError));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$2 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ MODULE_SUFFIX = '';\n var /** @type {?} */ DASH_CASE_REGEXP = /-+([a-z0-9])/g;\n /**\n * @param {?} input\n * @return {?}\n */\n function dashCaseToCamelCase(input) {\n return input.replace(DASH_CASE_REGEXP, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n return m[1].toUpperCase();\n });\n }\n /**\n * @param {?} input\n * @param {?} defaultValues\n * @return {?}\n */\n function splitAtColon(input, defaultValues) {\n return _splitAt(input, ':', defaultValues);\n }\n /**\n * @param {?} input\n * @param {?} defaultValues\n * @return {?}\n */\n function splitAtPeriod(input, defaultValues) {\n return _splitAt(input, '.', defaultValues);\n }\n /**\n * @param {?} input\n * @param {?} character\n * @param {?} defaultValues\n * @return {?}\n */\n function _splitAt(input, character, defaultValues) {\n var /** @type {?} */ characterIndex = input.indexOf(character);\n if (characterIndex == -1)\n return defaultValues;\n return [input.slice(0, characterIndex).trim(), input.slice(characterIndex + 1).trim()];\n }\n /**\n * @param {?} value\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n function visitValue(value, visitor, context) {\n if (Array.isArray(value)) {\n return visitor.visitArray(/** @type {?} */ (value), context);\n }\n if (isStrictStringMap(value)) {\n return visitor.visitStringMap(/** @type {?} */ (value), context);\n }\n if (value == null || isPrimitive(value)) {\n return visitor.visitPrimitive(value, context);\n }\n return visitor.visitOther(value, context);\n }\n var ValueTransformer = (function () {\n function ValueTransformer() {\n }\n /**\n * @param {?} arr\n * @param {?} context\n * @return {?}\n */\n ValueTransformer.prototype.visitArray = function (arr, context) {\n var _this = this;\n return arr.map(function (value) { return visitValue(value, _this, context); });\n };\n /**\n * @param {?} map\n * @param {?} context\n * @return {?}\n */\n ValueTransformer.prototype.visitStringMap = function (map, context) {\n var _this = this;\n var /** @type {?} */ result = {};\n Object.keys(map).forEach(function (key) { result[key] = visitValue(map[key], _this, context); });\n return result;\n };\n /**\n * @param {?} value\n * @param {?} context\n * @return {?}\n */\n ValueTransformer.prototype.visitPrimitive = function (value, context) { return value; };\n /**\n * @param {?} value\n * @param {?} context\n * @return {?}\n */\n ValueTransformer.prototype.visitOther = function (value, context) { return value; };\n return ValueTransformer;\n }());\n var SyncAsyncResult = (function () {\n /**\n * @param {?} syncResult\n * @param {?=} asyncResult\n */\n function SyncAsyncResult(syncResult, asyncResult) {\n if (asyncResult === void 0) { asyncResult = null; }\n this.syncResult = syncResult;\n this.asyncResult = asyncResult;\n if (!asyncResult) {\n this.asyncResult = Promise.resolve(syncResult);\n }\n }\n return SyncAsyncResult;\n }());\n var SyntaxError = (function (_super) {\n __extends$2(SyntaxError, _super);\n function SyntaxError() {\n _super.apply(this, arguments);\n }\n return SyntaxError;\n }(BaseError));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n // group 0: \"[prop] or (event) or @trigger\"\n // group 1: \"prop\" from \"[prop]\"\n // group 2: \"event\" from \"(event)\"\n // group 3: \"@trigger\" from \"@trigger\"\n var /** @type {?} */ HOST_REG_EXP = /^(?:(?:\\[([^\\]]+)\\])|(?:\\(([^\\)]+)\\)))|(\\@[-\\w]+)$/;\n var CompileAnimationEntryMetadata = (function () {\n /**\n * @param {?=} name\n * @param {?=} definitions\n */\n function CompileAnimationEntryMetadata(name, definitions) {\n if (name === void 0) { name = null; }\n if (definitions === void 0) { definitions = null; }\n this.name = name;\n this.definitions = definitions;\n }\n return CompileAnimationEntryMetadata;\n }());\n /**\n * @abstract\n */\n var CompileAnimationStateMetadata = (function () {\n function CompileAnimationStateMetadata() {\n }\n return CompileAnimationStateMetadata;\n }());\n var CompileAnimationStateDeclarationMetadata = (function (_super) {\n __extends$1(CompileAnimationStateDeclarationMetadata, _super);\n /**\n * @param {?} stateNameExpr\n * @param {?} styles\n */\n function CompileAnimationStateDeclarationMetadata(stateNameExpr, styles) {\n _super.call(this);\n this.stateNameExpr = stateNameExpr;\n this.styles = styles;\n }\n return CompileAnimationStateDeclarationMetadata;\n }(CompileAnimationStateMetadata));\n var CompileAnimationStateTransitionMetadata = (function (_super) {\n __extends$1(CompileAnimationStateTransitionMetadata, _super);\n /**\n * @param {?} stateChangeExpr\n * @param {?} steps\n */\n function CompileAnimationStateTransitionMetadata(stateChangeExpr, steps) {\n _super.call(this);\n this.stateChangeExpr = stateChangeExpr;\n this.steps = steps;\n }\n return CompileAnimationStateTransitionMetadata;\n }(CompileAnimationStateMetadata));\n /**\n * @abstract\n */\n var CompileAnimationMetadata = (function () {\n function CompileAnimationMetadata() {\n }\n return CompileAnimationMetadata;\n }());\n var CompileAnimationKeyframesSequenceMetadata = (function (_super) {\n __extends$1(CompileAnimationKeyframesSequenceMetadata, _super);\n /**\n * @param {?=} steps\n */\n function CompileAnimationKeyframesSequenceMetadata(steps) {\n if (steps === void 0) { steps = []; }\n _super.call(this);\n this.steps = steps;\n }\n return CompileAnimationKeyframesSequenceMetadata;\n }(CompileAnimationMetadata));\n var CompileAnimationStyleMetadata = (function (_super) {\n __extends$1(CompileAnimationStyleMetadata, _super);\n /**\n * @param {?} offset\n * @param {?=} styles\n */\n function CompileAnimationStyleMetadata(offset, styles) {\n if (styles === void 0) { styles = null; }\n _super.call(this);\n this.offset = offset;\n this.styles = styles;\n }\n return CompileAnimationStyleMetadata;\n }(CompileAnimationMetadata));\n var CompileAnimationAnimateMetadata = (function (_super) {\n __extends$1(CompileAnimationAnimateMetadata, _super);\n /**\n * @param {?=} timings\n * @param {?=} styles\n */\n function CompileAnimationAnimateMetadata(timings, styles) {\n if (timings === void 0) { timings = 0; }\n if (styles === void 0) { styles = null; }\n _super.call(this);\n this.timings = timings;\n this.styles = styles;\n }\n return CompileAnimationAnimateMetadata;\n }(CompileAnimationMetadata));\n /**\n * @abstract\n */\n var CompileAnimationWithStepsMetadata = (function (_super) {\n __extends$1(CompileAnimationWithStepsMetadata, _super);\n /**\n * @param {?=} steps\n */\n function CompileAnimationWithStepsMetadata(steps) {\n if (steps === void 0) { steps = null; }\n _super.call(this);\n this.steps = steps;\n }\n return CompileAnimationWithStepsMetadata;\n }(CompileAnimationMetadata));\n var CompileAnimationSequenceMetadata = (function (_super) {\n __extends$1(CompileAnimationSequenceMetadata, _super);\n /**\n * @param {?=} steps\n */\n function CompileAnimationSequenceMetadata(steps) {\n if (steps === void 0) { steps = null; }\n _super.call(this, steps);\n }\n return CompileAnimationSequenceMetadata;\n }(CompileAnimationWithStepsMetadata));\n var CompileAnimationGroupMetadata = (function (_super) {\n __extends$1(CompileAnimationGroupMetadata, _super);\n /**\n * @param {?=} steps\n */\n function CompileAnimationGroupMetadata(steps) {\n if (steps === void 0) { steps = null; }\n _super.call(this, steps);\n }\n return CompileAnimationGroupMetadata;\n }(CompileAnimationWithStepsMetadata));\n /**\n * @param {?} name\n * @return {?}\n */\n function _sanitizeIdentifier(name) {\n return name.replace(/\\W/g, '_');\n }\n var /** @type {?} */ _anonymousTypeIndex = 0;\n /**\n * @param {?} compileIdentifier\n * @return {?}\n */\n function identifierName(compileIdentifier) {\n if (!compileIdentifier || !compileIdentifier.reference) {\n return null;\n }\n var /** @type {?} */ ref = compileIdentifier.reference;\n if (ref instanceof StaticSymbol) {\n return ref.name;\n }\n if (ref['__anonymousType']) {\n return ref['__anonymousType'];\n }\n var /** @type {?} */ identifier = stringify(ref);\n if (identifier.indexOf('(') >= 0) {\n // case: anonymous functions!\n identifier = \"anonymous_\" + _anonymousTypeIndex++;\n ref['__anonymousType'] = identifier;\n }\n else {\n identifier = _sanitizeIdentifier(identifier);\n }\n return identifier;\n }\n /**\n * @param {?} compileIdentifier\n * @return {?}\n */\n function identifierModuleUrl(compileIdentifier) {\n var /** @type {?} */ ref = compileIdentifier.reference;\n if (ref instanceof StaticSymbol) {\n return ref.filePath;\n }\n return reflector.importUri(ref);\n }\n var CompileSummaryKind = {};\n CompileSummaryKind.Pipe = 0;\n CompileSummaryKind.Directive = 1;\n CompileSummaryKind.NgModule = 2;\n CompileSummaryKind.Injectable = 3;\n CompileSummaryKind[CompileSummaryKind.Pipe] = \"Pipe\";\n CompileSummaryKind[CompileSummaryKind.Directive] = \"Directive\";\n CompileSummaryKind[CompileSummaryKind.NgModule] = \"NgModule\";\n CompileSummaryKind[CompileSummaryKind.Injectable] = \"Injectable\";\n /**\n * @param {?} token\n * @return {?}\n */\n function tokenName(token) {\n return isPresent(token.value) ? _sanitizeIdentifier(token.value) :\n identifierName(token.identifier);\n }\n /**\n * @param {?} token\n * @return {?}\n */\n function tokenReference(token) {\n if (isPresent(token.identifier)) {\n return token.identifier.reference;\n }\n else {\n return token.value;\n }\n }\n /**\n * Metadata about a stylesheet\n */\n var CompileStylesheetMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function CompileStylesheetMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, moduleUrl = _b.moduleUrl, styles = _b.styles, styleUrls = _b.styleUrls;\n this.moduleUrl = moduleUrl;\n this.styles = _normalizeArray(styles);\n this.styleUrls = _normalizeArray(styleUrls);\n }\n return CompileStylesheetMetadata;\n }());\n /**\n * Metadata regarding compilation of a template.\n */\n var CompileTemplateMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function CompileTemplateMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, externalStylesheets = _b.externalStylesheets, animations = _b.animations, ngContentSelectors = _b.ngContentSelectors, interpolation = _b.interpolation;\n this.encapsulation = encapsulation;\n this.template = template;\n this.templateUrl = templateUrl;\n this.styles = _normalizeArray(styles);\n this.styleUrls = _normalizeArray(styleUrls);\n this.externalStylesheets = _normalizeArray(externalStylesheets);\n this.animations = animations ? ListWrapper.flatten(animations) : [];\n this.ngContentSelectors = ngContentSelectors || [];\n if (interpolation && interpolation.length != 2) {\n throw new Error(\"'interpolation' should have a start and an end symbol.\");\n }\n this.interpolation = interpolation;\n }\n /**\n * @return {?}\n */\n CompileTemplateMetadata.prototype.toSummary = function () {\n return {\n animations: this.animations.map(function (anim) { return anim.name; }),\n ngContentSelectors: this.ngContentSelectors,\n encapsulation: this.encapsulation\n };\n };\n return CompileTemplateMetadata;\n }());\n /**\n * Metadata regarding compilation of a directive.\n */\n var CompileDirectiveMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function CompileDirectiveMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, isHost = _b.isHost, type = _b.type, isComponent = _b.isComponent, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, hostListeners = _b.hostListeners, hostProperties = _b.hostProperties, hostAttributes = _b.hostAttributes, providers = _b.providers, viewProviders = _b.viewProviders, queries = _b.queries, viewQueries = _b.viewQueries, entryComponents = _b.entryComponents, template = _b.template;\n this.isHost = !!isHost;\n this.type = type;\n this.isComponent = isComponent;\n this.selector = selector;\n this.exportAs = exportAs;\n this.changeDetection = changeDetection;\n this.inputs = inputs;\n this.outputs = outputs;\n this.hostListeners = hostListeners;\n this.hostProperties = hostProperties;\n this.hostAttributes = hostAttributes;\n this.providers = _normalizeArray(providers);\n this.viewProviders = _normalizeArray(viewProviders);\n this.queries = _normalizeArray(queries);\n this.viewQueries = _normalizeArray(viewQueries);\n this.entryComponents = _normalizeArray(entryComponents);\n this.template = template;\n }\n /**\n * @param {?=} __0\n * @return {?}\n */\n CompileDirectiveMetadata.create = function (_a) {\n var _b = _a === void 0 ? {} : _a, isHost = _b.isHost, type = _b.type, isComponent = _b.isComponent, selector = _b.selector, exportAs = _b.exportAs, changeDetection = _b.changeDetection, inputs = _b.inputs, outputs = _b.outputs, host = _b.host, providers = _b.providers, viewProviders = _b.viewProviders, queries = _b.queries, viewQueries = _b.viewQueries, entryComponents = _b.entryComponents, template = _b.template;\n var /** @type {?} */ hostListeners = {};\n var /** @type {?} */ hostProperties = {};\n var /** @type {?} */ hostAttributes = {};\n if (isPresent(host)) {\n Object.keys(host).forEach(function (key) {\n var /** @type {?} */ value = host[key];\n var /** @type {?} */ matches = key.match(HOST_REG_EXP);\n if (matches === null) {\n hostAttributes[key] = value;\n }\n else if (isPresent(matches[1])) {\n hostProperties[matches[1]] = value;\n }\n else if (isPresent(matches[2])) {\n hostListeners[matches[2]] = value;\n }\n });\n }\n var /** @type {?} */ inputsMap = {};\n if (isPresent(inputs)) {\n inputs.forEach(function (bindConfig) {\n // canonical syntax: `dirProp: elProp`\n // if there is no `:`, use dirProp = elProp\n var /** @type {?} */ parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);\n inputsMap[parts[0]] = parts[1];\n });\n }\n var /** @type {?} */ outputsMap = {};\n if (isPresent(outputs)) {\n outputs.forEach(function (bindConfig) {\n // canonical syntax: `dirProp: elProp`\n // if there is no `:`, use dirProp = elProp\n var /** @type {?} */ parts = splitAtColon(bindConfig, [bindConfig, bindConfig]);\n outputsMap[parts[0]] = parts[1];\n });\n }\n return new CompileDirectiveMetadata({\n isHost: isHost,\n type: type,\n isComponent: !!isComponent, selector: selector, exportAs: exportAs, changeDetection: changeDetection,\n inputs: inputsMap,\n outputs: outputsMap,\n hostListeners: hostListeners,\n hostProperties: hostProperties,\n hostAttributes: hostAttributes,\n providers: providers,\n viewProviders: viewProviders,\n queries: queries,\n viewQueries: viewQueries,\n entryComponents: entryComponents,\n template: template,\n });\n };\n /**\n * @return {?}\n */\n CompileDirectiveMetadata.prototype.toSummary = function () {\n return {\n summaryKind: CompileSummaryKind.Directive,\n type: this.type,\n isComponent: this.isComponent,\n selector: this.selector,\n exportAs: this.exportAs,\n inputs: this.inputs,\n outputs: this.outputs,\n hostListeners: this.hostListeners,\n hostProperties: this.hostProperties,\n hostAttributes: this.hostAttributes,\n providers: this.providers,\n viewProviders: this.viewProviders,\n queries: this.queries,\n entryComponents: this.entryComponents,\n changeDetection: this.changeDetection,\n template: this.template && this.template.toSummary()\n };\n };\n return CompileDirectiveMetadata;\n }());\n /**\n * Construct {@link CompileDirectiveMetadata} from {@link ComponentTypeMetadata} and a selector.\n * @param {?} typeReference\n * @param {?} compMeta\n * @return {?}\n */\n function createHostComponentMeta(typeReference, compMeta) {\n var /** @type {?} */ template = CssSelector.parse(compMeta.selector)[0].getMatchingElementTemplate();\n return CompileDirectiveMetadata.create({\n isHost: true,\n type: { reference: typeReference, diDeps: [], lifecycleHooks: [] },\n template: new CompileTemplateMetadata({\n encapsulation: _angular_core.ViewEncapsulation.None,\n template: template,\n templateUrl: '',\n styles: [],\n styleUrls: [],\n ngContentSelectors: [],\n animations: []\n }),\n changeDetection: _angular_core.ChangeDetectionStrategy.Default,\n inputs: [],\n outputs: [],\n host: {},\n isComponent: true,\n selector: '*',\n providers: [],\n viewProviders: [],\n queries: [],\n viewQueries: []\n });\n }\n var CompilePipeMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function CompilePipeMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, type = _b.type, name = _b.name, pure = _b.pure;\n this.type = type;\n this.name = name;\n this.pure = !!pure;\n }\n /**\n * @return {?}\n */\n CompilePipeMetadata.prototype.toSummary = function () {\n return {\n summaryKind: CompileSummaryKind.Pipe,\n type: this.type,\n name: this.name,\n pure: this.pure\n };\n };\n return CompilePipeMetadata;\n }());\n /**\n * Metadata regarding compilation of a module.\n */\n var CompileNgModuleMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function CompileNgModuleMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, type = _b.type, providers = _b.providers, declaredDirectives = _b.declaredDirectives, exportedDirectives = _b.exportedDirectives, declaredPipes = _b.declaredPipes, exportedPipes = _b.exportedPipes, entryComponents = _b.entryComponents, bootstrapComponents = _b.bootstrapComponents, importedModules = _b.importedModules, exportedModules = _b.exportedModules, schemas = _b.schemas, transitiveModule = _b.transitiveModule, id = _b.id;\n this.type = type;\n this.declaredDirectives = _normalizeArray(declaredDirectives);\n this.exportedDirectives = _normalizeArray(exportedDirectives);\n this.declaredPipes = _normalizeArray(declaredPipes);\n this.exportedPipes = _normalizeArray(exportedPipes);\n this.providers = _normalizeArray(providers);\n this.entryComponents = _normalizeArray(entryComponents);\n this.bootstrapComponents = _normalizeArray(bootstrapComponents);\n this.importedModules = _normalizeArray(importedModules);\n this.exportedModules = _normalizeArray(exportedModules);\n this.schemas = _normalizeArray(schemas);\n this.id = id;\n this.transitiveModule = transitiveModule;\n }\n /**\n * @return {?}\n */\n CompileNgModuleMetadata.prototype.toSummary = function () {\n return {\n summaryKind: CompileSummaryKind.NgModule,\n type: this.type,\n entryComponents: this.transitiveModule.entryComponents,\n providers: this.transitiveModule.providers,\n modules: this.transitiveModule.modules,\n exportedDirectives: this.transitiveModule.exportedDirectives,\n exportedPipes: this.transitiveModule.exportedPipes\n };\n };\n return CompileNgModuleMetadata;\n }());\n var TransitiveCompileNgModuleMetadata = (function () {\n function TransitiveCompileNgModuleMetadata() {\n this.directivesSet = new Set();\n this.directives = [];\n this.exportedDirectivesSet = new Set();\n this.exportedDirectives = [];\n this.pipesSet = new Set();\n this.pipes = [];\n this.exportedPipesSet = new Set();\n this.exportedPipes = [];\n this.modulesSet = new Set();\n this.modules = [];\n this.entryComponentsSet = new Set();\n this.entryComponents = [];\n this.providers = [];\n }\n /**\n * @param {?} provider\n * @param {?} module\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addProvider = function (provider, module) {\n this.providers.push({ provider: provider, module: module });\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addDirective = function (id) {\n if (!this.directivesSet.has(id.reference)) {\n this.directivesSet.add(id.reference);\n this.directives.push(id);\n }\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addExportedDirective = function (id) {\n if (!this.exportedDirectivesSet.has(id.reference)) {\n this.exportedDirectivesSet.add(id.reference);\n this.exportedDirectives.push(id);\n }\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addPipe = function (id) {\n if (!this.pipesSet.has(id.reference)) {\n this.pipesSet.add(id.reference);\n this.pipes.push(id);\n }\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addExportedPipe = function (id) {\n if (!this.exportedPipesSet.has(id.reference)) {\n this.exportedPipesSet.add(id.reference);\n this.exportedPipes.push(id);\n }\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addModule = function (id) {\n if (!this.modulesSet.has(id.reference)) {\n this.modulesSet.add(id.reference);\n this.modules.push(id);\n }\n };\n /**\n * @param {?} id\n * @return {?}\n */\n TransitiveCompileNgModuleMetadata.prototype.addEntryComponent = function (id) {\n if (!this.entryComponentsSet.has(id.reference)) {\n this.entryComponentsSet.add(id.reference);\n this.entryComponents.push(id);\n }\n };\n return TransitiveCompileNgModuleMetadata;\n }());\n /**\n * @param {?} obj\n * @return {?}\n */\n function _normalizeArray(obj) {\n return obj || [];\n }\n var ProviderMeta = (function () {\n /**\n * @param {?} token\n * @param {?} __1\n */\n function ProviderMeta(token, _a) {\n var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;\n this.token = token;\n this.useClass = useClass;\n this.useValue = useValue;\n this.useExisting = useExisting;\n this.useFactory = useFactory;\n this.dependencies = deps;\n this.multi = !!multi;\n }\n return ProviderMeta;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ $EOF = 0;\n var /** @type {?} */ $TAB = 9;\n var /** @type {?} */ $LF = 10;\n var /** @type {?} */ $VTAB = 11;\n var /** @type {?} */ $FF = 12;\n var /** @type {?} */ $CR = 13;\n var /** @type {?} */ $SPACE = 32;\n var /** @type {?} */ $BANG = 33;\n var /** @type {?} */ $DQ = 34;\n var /** @type {?} */ $HASH = 35;\n var /** @type {?} */ $$ = 36;\n var /** @type {?} */ $PERCENT = 37;\n var /** @type {?} */ $AMPERSAND = 38;\n var /** @type {?} */ $SQ = 39;\n var /** @type {?} */ $LPAREN = 40;\n var /** @type {?} */ $RPAREN = 41;\n var /** @type {?} */ $STAR = 42;\n var /** @type {?} */ $PLUS = 43;\n var /** @type {?} */ $COMMA = 44;\n var /** @type {?} */ $MINUS = 45;\n var /** @type {?} */ $PERIOD = 46;\n var /** @type {?} */ $SLASH = 47;\n var /** @type {?} */ $COLON = 58;\n var /** @type {?} */ $SEMICOLON = 59;\n var /** @type {?} */ $LT = 60;\n var /** @type {?} */ $EQ = 61;\n var /** @type {?} */ $GT = 62;\n var /** @type {?} */ $QUESTION = 63;\n var /** @type {?} */ $0 = 48;\n var /** @type {?} */ $9 = 57;\n var /** @type {?} */ $A = 65;\n var /** @type {?} */ $E = 69;\n var /** @type {?} */ $F = 70;\n var /** @type {?} */ $X = 88;\n var /** @type {?} */ $Z = 90;\n var /** @type {?} */ $LBRACKET = 91;\n var /** @type {?} */ $BACKSLASH = 92;\n var /** @type {?} */ $RBRACKET = 93;\n var /** @type {?} */ $CARET = 94;\n var /** @type {?} */ $_ = 95;\n var /** @type {?} */ $a = 97;\n var /** @type {?} */ $e = 101;\n var /** @type {?} */ $f = 102;\n var /** @type {?} */ $n = 110;\n var /** @type {?} */ $r = 114;\n var /** @type {?} */ $t = 116;\n var /** @type {?} */ $u = 117;\n var /** @type {?} */ $v = 118;\n var /** @type {?} */ $x = 120;\n var /** @type {?} */ $z = 122;\n var /** @type {?} */ $LBRACE = 123;\n var /** @type {?} */ $BAR = 124;\n var /** @type {?} */ $RBRACE = 125;\n var /** @type {?} */ $NBSP = 160;\n var /** @type {?} */ $BT = 96;\n /**\n * @param {?} code\n * @return {?}\n */\n function isWhitespace(code) {\n return (code >= $TAB && code <= $SPACE) || (code == $NBSP);\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isDigit(code) {\n return $0 <= code && code <= $9;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isAsciiLetter(code) {\n return code >= $a && code <= $z || code >= $A && code <= $Z;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isAsciiHexDigit(code) {\n return code >= $a && code <= $f || code >= $A && code <= $F || isDigit(code);\n }\n\n /**\n * A replacement for @Injectable to be used in the compiler, so that\n * we don't try to evaluate the metadata in the compiler during AoT.\n * This decorator is enough to make the compiler work with the ReflectiveInjector though.\n * @return {?}\n */\n function CompilerInjectable() {\n return function (x) { return x; };\n }\n\n /**\n * @param {?} identifier\n * @param {?} value\n * @return {?}\n */\n function assertArrayOfStrings(identifier, value) {\n if (!_angular_core.isDevMode() || isBlank(value)) {\n return;\n }\n if (!Array.isArray(value)) {\n throw new Error(\"Expected '\" + identifier + \"' to be an array of strings.\");\n }\n for (var /** @type {?} */ i = 0; i < value.length; i += 1) {\n if (typeof value[i] !== 'string') {\n throw new Error(\"Expected '\" + identifier + \"' to be an array of strings.\");\n }\n }\n }\n var /** @type {?} */ INTERPOLATION_BLACKLIST_REGEXPS = [\n /^\\s*$/,\n /[<>]/,\n /^[{}]$/,\n /&(#|[a-z])/i,\n /^\\/\\//,\n ];\n /**\n * @param {?} identifier\n * @param {?} value\n * @return {?}\n */\n function assertInterpolationSymbols(identifier, value) {\n if (isPresent(value) && !(Array.isArray(value) && value.length == 2)) {\n throw new Error(\"Expected '\" + identifier + \"' to be an array, [start, end].\");\n }\n else if (_angular_core.isDevMode() && !isBlank(value)) {\n var /** @type {?} */ start_1 = (value[0]);\n var /** @type {?} */ end_1 = (value[1]);\n // black list checking\n INTERPOLATION_BLACKLIST_REGEXPS.forEach(function (regexp) {\n if (regexp.test(start_1) || regexp.test(end_1)) {\n throw new Error(\"['\" + start_1 + \"', '\" + end_1 + \"'] contains unusable interpolation symbol.\");\n }\n });\n }\n }\n\n var InterpolationConfig = (function () {\n /**\n * @param {?} start\n * @param {?} end\n */\n function InterpolationConfig(start, end) {\n this.start = start;\n this.end = end;\n }\n /**\n * @param {?} markers\n * @return {?}\n */\n InterpolationConfig.fromArray = function (markers) {\n if (!markers) {\n return DEFAULT_INTERPOLATION_CONFIG;\n }\n assertInterpolationSymbols('interpolation', markers);\n return new InterpolationConfig(markers[0], markers[1]);\n };\n ;\n return InterpolationConfig;\n }());\n var /** @type {?} */ DEFAULT_INTERPOLATION_CONFIG = new InterpolationConfig('{{', '}}');\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$4 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var ParserError = (function () {\n /**\n * @param {?} message\n * @param {?} input\n * @param {?} errLocation\n * @param {?=} ctxLocation\n */\n function ParserError(message, input, errLocation, ctxLocation) {\n this.input = input;\n this.errLocation = errLocation;\n this.ctxLocation = ctxLocation;\n this.message = \"Parser Error: \" + message + \" \" + errLocation + \" [\" + input + \"] in \" + ctxLocation;\n }\n return ParserError;\n }());\n var ParseSpan = (function () {\n /**\n * @param {?} start\n * @param {?} end\n */\n function ParseSpan(start, end) {\n this.start = start;\n this.end = end;\n }\n return ParseSpan;\n }());\n var AST = (function () {\n /**\n * @param {?} span\n */\n function AST(span) {\n this.span = span;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n AST.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return null;\n };\n /**\n * @return {?}\n */\n AST.prototype.toString = function () { return 'AST'; };\n return AST;\n }());\n /**\n * Represents a quoted expression of the form:\n * *\n * quote = prefix `:` uninterpretedExpression\n * prefix = identifier\n * uninterpretedExpression = arbitrary string\n * *\n * A quoted expression is meant to be pre-processed by an AST transformer that\n * converts it into another AST that no longer contains quoted expressions.\n * It is meant to allow third-party developers to extend Angular template\n * expression language. The `uninterpretedExpression` part of the quote is\n * therefore not interpreted by the Angular's own expression parser.\n */\n var Quote = (function (_super) {\n __extends$4(Quote, _super);\n /**\n * @param {?} span\n * @param {?} prefix\n * @param {?} uninterpretedExpression\n * @param {?} location\n */\n function Quote(span, prefix, uninterpretedExpression, location) {\n _super.call(this, span);\n this.prefix = prefix;\n this.uninterpretedExpression = uninterpretedExpression;\n this.location = location;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Quote.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitQuote(this, context);\n };\n /**\n * @return {?}\n */\n Quote.prototype.toString = function () { return 'Quote'; };\n return Quote;\n }(AST));\n var EmptyExpr = (function (_super) {\n __extends$4(EmptyExpr, _super);\n function EmptyExpr() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n EmptyExpr.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n // do nothing\n };\n return EmptyExpr;\n }(AST));\n var ImplicitReceiver = (function (_super) {\n __extends$4(ImplicitReceiver, _super);\n function ImplicitReceiver() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n ImplicitReceiver.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitImplicitReceiver(this, context);\n };\n return ImplicitReceiver;\n }(AST));\n /**\n * Multiple expressions separated by a semicolon.\n */\n var Chain = (function (_super) {\n __extends$4(Chain, _super);\n /**\n * @param {?} span\n * @param {?} expressions\n */\n function Chain(span, expressions) {\n _super.call(this, span);\n this.expressions = expressions;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Chain.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitChain(this, context);\n };\n return Chain;\n }(AST));\n var Conditional = (function (_super) {\n __extends$4(Conditional, _super);\n /**\n * @param {?} span\n * @param {?} condition\n * @param {?} trueExp\n * @param {?} falseExp\n */\n function Conditional(span, condition, trueExp, falseExp) {\n _super.call(this, span);\n this.condition = condition;\n this.trueExp = trueExp;\n this.falseExp = falseExp;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Conditional.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitConditional(this, context);\n };\n return Conditional;\n }(AST));\n var PropertyRead = (function (_super) {\n __extends$4(PropertyRead, _super);\n /**\n * @param {?} span\n * @param {?} receiver\n * @param {?} name\n */\n function PropertyRead(span, receiver, name) {\n _super.call(this, span);\n this.receiver = receiver;\n this.name = name;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n PropertyRead.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitPropertyRead(this, context);\n };\n return PropertyRead;\n }(AST));\n var PropertyWrite = (function (_super) {\n __extends$4(PropertyWrite, _super);\n /**\n * @param {?} span\n * @param {?} receiver\n * @param {?} name\n * @param {?} value\n */\n function PropertyWrite(span, receiver, name, value) {\n _super.call(this, span);\n this.receiver = receiver;\n this.name = name;\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n PropertyWrite.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitPropertyWrite(this, context);\n };\n return PropertyWrite;\n }(AST));\n var SafePropertyRead = (function (_super) {\n __extends$4(SafePropertyRead, _super);\n /**\n * @param {?} span\n * @param {?} receiver\n * @param {?} name\n */\n function SafePropertyRead(span, receiver, name) {\n _super.call(this, span);\n this.receiver = receiver;\n this.name = name;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n SafePropertyRead.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitSafePropertyRead(this, context);\n };\n return SafePropertyRead;\n }(AST));\n var KeyedRead = (function (_super) {\n __extends$4(KeyedRead, _super);\n /**\n * @param {?} span\n * @param {?} obj\n * @param {?} key\n */\n function KeyedRead(span, obj, key) {\n _super.call(this, span);\n this.obj = obj;\n this.key = key;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n KeyedRead.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitKeyedRead(this, context);\n };\n return KeyedRead;\n }(AST));\n var KeyedWrite = (function (_super) {\n __extends$4(KeyedWrite, _super);\n /**\n * @param {?} span\n * @param {?} obj\n * @param {?} key\n * @param {?} value\n */\n function KeyedWrite(span, obj, key, value) {\n _super.call(this, span);\n this.obj = obj;\n this.key = key;\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n KeyedWrite.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitKeyedWrite(this, context);\n };\n return KeyedWrite;\n }(AST));\n var BindingPipe = (function (_super) {\n __extends$4(BindingPipe, _super);\n /**\n * @param {?} span\n * @param {?} exp\n * @param {?} name\n * @param {?} args\n */\n function BindingPipe(span, exp, name, args) {\n _super.call(this, span);\n this.exp = exp;\n this.name = name;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n BindingPipe.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitPipe(this, context);\n };\n return BindingPipe;\n }(AST));\n var LiteralPrimitive = (function (_super) {\n __extends$4(LiteralPrimitive, _super);\n /**\n * @param {?} span\n * @param {?} value\n */\n function LiteralPrimitive(span, value) {\n _super.call(this, span);\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n LiteralPrimitive.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitLiteralPrimitive(this, context);\n };\n return LiteralPrimitive;\n }(AST));\n var LiteralArray = (function (_super) {\n __extends$4(LiteralArray, _super);\n /**\n * @param {?} span\n * @param {?} expressions\n */\n function LiteralArray(span, expressions) {\n _super.call(this, span);\n this.expressions = expressions;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n LiteralArray.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitLiteralArray(this, context);\n };\n return LiteralArray;\n }(AST));\n var LiteralMap = (function (_super) {\n __extends$4(LiteralMap, _super);\n /**\n * @param {?} span\n * @param {?} keys\n * @param {?} values\n */\n function LiteralMap(span, keys, values) {\n _super.call(this, span);\n this.keys = keys;\n this.values = values;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n LiteralMap.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitLiteralMap(this, context);\n };\n return LiteralMap;\n }(AST));\n var Interpolation = (function (_super) {\n __extends$4(Interpolation, _super);\n /**\n * @param {?} span\n * @param {?} strings\n * @param {?} expressions\n */\n function Interpolation(span, strings, expressions) {\n _super.call(this, span);\n this.strings = strings;\n this.expressions = expressions;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Interpolation.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitInterpolation(this, context);\n };\n return Interpolation;\n }(AST));\n var Binary = (function (_super) {\n __extends$4(Binary, _super);\n /**\n * @param {?} span\n * @param {?} operation\n * @param {?} left\n * @param {?} right\n */\n function Binary(span, operation, left, right) {\n _super.call(this, span);\n this.operation = operation;\n this.left = left;\n this.right = right;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Binary.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitBinary(this, context);\n };\n return Binary;\n }(AST));\n var PrefixNot = (function (_super) {\n __extends$4(PrefixNot, _super);\n /**\n * @param {?} span\n * @param {?} expression\n */\n function PrefixNot(span, expression) {\n _super.call(this, span);\n this.expression = expression;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n PrefixNot.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitPrefixNot(this, context);\n };\n return PrefixNot;\n }(AST));\n var MethodCall = (function (_super) {\n __extends$4(MethodCall, _super);\n /**\n * @param {?} span\n * @param {?} receiver\n * @param {?} name\n * @param {?} args\n */\n function MethodCall(span, receiver, name, args) {\n _super.call(this, span);\n this.receiver = receiver;\n this.name = name;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n MethodCall.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitMethodCall(this, context);\n };\n return MethodCall;\n }(AST));\n var SafeMethodCall = (function (_super) {\n __extends$4(SafeMethodCall, _super);\n /**\n * @param {?} span\n * @param {?} receiver\n * @param {?} name\n * @param {?} args\n */\n function SafeMethodCall(span, receiver, name, args) {\n _super.call(this, span);\n this.receiver = receiver;\n this.name = name;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n SafeMethodCall.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitSafeMethodCall(this, context);\n };\n return SafeMethodCall;\n }(AST));\n var FunctionCall = (function (_super) {\n __extends$4(FunctionCall, _super);\n /**\n * @param {?} span\n * @param {?} target\n * @param {?} args\n */\n function FunctionCall(span, target, args) {\n _super.call(this, span);\n this.target = target;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n FunctionCall.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return visitor.visitFunctionCall(this, context);\n };\n return FunctionCall;\n }(AST));\n var ASTWithSource = (function (_super) {\n __extends$4(ASTWithSource, _super);\n /**\n * @param {?} ast\n * @param {?} source\n * @param {?} location\n * @param {?} errors\n */\n function ASTWithSource(ast, source, location, errors) {\n _super.call(this, new ParseSpan(0, isBlank(source) ? 0 : source.length));\n this.ast = ast;\n this.source = source;\n this.location = location;\n this.errors = errors;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n ASTWithSource.prototype.visit = function (visitor, context) {\n if (context === void 0) { context = null; }\n return this.ast.visit(visitor, context);\n };\n /**\n * @return {?}\n */\n ASTWithSource.prototype.toString = function () { return this.source + \" in \" + this.location; };\n return ASTWithSource;\n }(AST));\n var TemplateBinding = (function () {\n /**\n * @param {?} span\n * @param {?} key\n * @param {?} keyIsVar\n * @param {?} name\n * @param {?} expression\n */\n function TemplateBinding(span, key, keyIsVar, name, expression) {\n this.span = span;\n this.key = key;\n this.keyIsVar = keyIsVar;\n this.name = name;\n this.expression = expression;\n }\n return TemplateBinding;\n }());\n var RecursiveAstVisitor = (function () {\n function RecursiveAstVisitor() {\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitBinary = function (ast, context) {\n ast.left.visit(this);\n ast.right.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitChain = function (ast, context) { return this.visitAll(ast.expressions, context); };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitConditional = function (ast, context) {\n ast.condition.visit(this);\n ast.trueExp.visit(this);\n ast.falseExp.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitPipe = function (ast, context) {\n ast.exp.visit(this);\n this.visitAll(ast.args, context);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitFunctionCall = function (ast, context) {\n ast.target.visit(this);\n this.visitAll(ast.args, context);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitInterpolation = function (ast, context) {\n return this.visitAll(ast.expressions, context);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitKeyedRead = function (ast, context) {\n ast.obj.visit(this);\n ast.key.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast, context) {\n ast.obj.visit(this);\n ast.key.visit(this);\n ast.value.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitLiteralArray = function (ast, context) {\n return this.visitAll(ast.expressions, context);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitLiteralMap = function (ast, context) { return this.visitAll(ast.values, context); };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitMethodCall = function (ast, context) {\n ast.receiver.visit(this);\n return this.visitAll(ast.args, context);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitPrefixNot = function (ast, context) {\n ast.expression.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitPropertyRead = function (ast, context) {\n ast.receiver.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast, context) {\n ast.receiver.visit(this);\n ast.value.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast, context) {\n ast.receiver.visit(this);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast, context) {\n ast.receiver.visit(this);\n return this.visitAll(ast.args, context);\n };\n /**\n * @param {?} asts\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitAll = function (asts, context) {\n var _this = this;\n asts.forEach(function (ast) { return ast.visit(_this, context); });\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveAstVisitor.prototype.visitQuote = function (ast, context) { return null; };\n return RecursiveAstVisitor;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$2 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$2 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var TokenType = {};\n TokenType.Character = 0;\n TokenType.Identifier = 1;\n TokenType.Keyword = 2;\n TokenType.String = 3;\n TokenType.Operator = 4;\n TokenType.Number = 5;\n TokenType.Error = 6;\n TokenType[TokenType.Character] = \"Character\";\n TokenType[TokenType.Identifier] = \"Identifier\";\n TokenType[TokenType.Keyword] = \"Keyword\";\n TokenType[TokenType.String] = \"String\";\n TokenType[TokenType.Operator] = \"Operator\";\n TokenType[TokenType.Number] = \"Number\";\n TokenType[TokenType.Error] = \"Error\";\n var /** @type {?} */ KEYWORDS = ['var', 'let', 'null', 'undefined', 'true', 'false', 'if', 'else', 'this'];\n var Lexer = (function () {\n function Lexer() {\n }\n /**\n * @param {?} text\n * @return {?}\n */\n Lexer.prototype.tokenize = function (text) {\n var /** @type {?} */ scanner = new _Scanner(text);\n var /** @type {?} */ tokens = [];\n var /** @type {?} */ token = scanner.scanToken();\n while (token != null) {\n tokens.push(token);\n token = scanner.scanToken();\n }\n return tokens;\n };\n Lexer = __decorate$2([\n CompilerInjectable(), \n __metadata$2('design:paramtypes', [])\n ], Lexer);\n return Lexer;\n }());\n var Token = (function () {\n /**\n * @param {?} index\n * @param {?} type\n * @param {?} numValue\n * @param {?} strValue\n */\n function Token(index, type, numValue, strValue) {\n this.index = index;\n this.type = type;\n this.numValue = numValue;\n this.strValue = strValue;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n Token.prototype.isCharacter = function (code) {\n return this.type == TokenType.Character && this.numValue == code;\n };\n /**\n * @return {?}\n */\n Token.prototype.isNumber = function () { return this.type == TokenType.Number; };\n /**\n * @return {?}\n */\n Token.prototype.isString = function () { return this.type == TokenType.String; };\n /**\n * @param {?} operater\n * @return {?}\n */\n Token.prototype.isOperator = function (operater) {\n return this.type == TokenType.Operator && this.strValue == operater;\n };\n /**\n * @return {?}\n */\n Token.prototype.isIdentifier = function () { return this.type == TokenType.Identifier; };\n /**\n * @return {?}\n */\n Token.prototype.isKeyword = function () { return this.type == TokenType.Keyword; };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordLet = function () { return this.type == TokenType.Keyword && this.strValue == 'let'; };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordNull = function () { return this.type == TokenType.Keyword && this.strValue == 'null'; };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordUndefined = function () {\n return this.type == TokenType.Keyword && this.strValue == 'undefined';\n };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordTrue = function () { return this.type == TokenType.Keyword && this.strValue == 'true'; };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordFalse = function () { return this.type == TokenType.Keyword && this.strValue == 'false'; };\n /**\n * @return {?}\n */\n Token.prototype.isKeywordThis = function () { return this.type == TokenType.Keyword && this.strValue == 'this'; };\n /**\n * @return {?}\n */\n Token.prototype.isError = function () { return this.type == TokenType.Error; };\n /**\n * @return {?}\n */\n Token.prototype.toNumber = function () { return this.type == TokenType.Number ? this.numValue : -1; };\n /**\n * @return {?}\n */\n Token.prototype.toString = function () {\n switch (this.type) {\n case TokenType.Character:\n case TokenType.Identifier:\n case TokenType.Keyword:\n case TokenType.Operator:\n case TokenType.String:\n case TokenType.Error:\n return this.strValue;\n case TokenType.Number:\n return this.numValue.toString();\n default:\n return null;\n }\n };\n return Token;\n }());\n /**\n * @param {?} index\n * @param {?} code\n * @return {?}\n */\n function newCharacterToken(index, code) {\n return new Token(index, TokenType.Character, code, String.fromCharCode(code));\n }\n /**\n * @param {?} index\n * @param {?} text\n * @return {?}\n */\n function newIdentifierToken(index, text) {\n return new Token(index, TokenType.Identifier, 0, text);\n }\n /**\n * @param {?} index\n * @param {?} text\n * @return {?}\n */\n function newKeywordToken(index, text) {\n return new Token(index, TokenType.Keyword, 0, text);\n }\n /**\n * @param {?} index\n * @param {?} text\n * @return {?}\n */\n function newOperatorToken(index, text) {\n return new Token(index, TokenType.Operator, 0, text);\n }\n /**\n * @param {?} index\n * @param {?} text\n * @return {?}\n */\n function newStringToken(index, text) {\n return new Token(index, TokenType.String, 0, text);\n }\n /**\n * @param {?} index\n * @param {?} n\n * @return {?}\n */\n function newNumberToken(index, n) {\n return new Token(index, TokenType.Number, n, '');\n }\n /**\n * @param {?} index\n * @param {?} message\n * @return {?}\n */\n function newErrorToken(index, message) {\n return new Token(index, TokenType.Error, 0, message);\n }\n var /** @type {?} */ EOF = new Token(-1, TokenType.Character, 0, '');\n var _Scanner = (function () {\n /**\n * @param {?} input\n */\n function _Scanner(input) {\n this.input = input;\n this.peek = 0;\n this.index = -1;\n this.length = input.length;\n this.advance();\n }\n /**\n * @return {?}\n */\n _Scanner.prototype.advance = function () {\n this.peek = ++this.index >= this.length ? $EOF : this.input.charCodeAt(this.index);\n };\n /**\n * @return {?}\n */\n _Scanner.prototype.scanToken = function () {\n var /** @type {?} */ input = this.input, /** @type {?} */ length = this.length;\n var /** @type {?} */ peek = this.peek, /** @type {?} */ index = this.index;\n // Skip whitespace.\n while (peek <= $SPACE) {\n if (++index >= length) {\n peek = $EOF;\n break;\n }\n else {\n peek = input.charCodeAt(index);\n }\n }\n this.peek = peek;\n this.index = index;\n if (index >= length) {\n return null;\n }\n // Handle identifiers and numbers.\n if (isIdentifierStart(peek))\n return this.scanIdentifier();\n if (isDigit(peek))\n return this.scanNumber(index);\n var /** @type {?} */ start = index;\n switch (peek) {\n case $PERIOD:\n this.advance();\n return isDigit(this.peek) ? this.scanNumber(start) :\n newCharacterToken(start, $PERIOD);\n case $LPAREN:\n case $RPAREN:\n case $LBRACE:\n case $RBRACE:\n case $LBRACKET:\n case $RBRACKET:\n case $COMMA:\n case $COLON:\n case $SEMICOLON:\n return this.scanCharacter(start, peek);\n case $SQ:\n case $DQ:\n return this.scanString();\n case $HASH:\n case $PLUS:\n case $MINUS:\n case $STAR:\n case $SLASH:\n case $PERCENT:\n case $CARET:\n return this.scanOperator(start, String.fromCharCode(peek));\n case $QUESTION:\n return this.scanComplexOperator(start, '?', $PERIOD, '.');\n case $LT:\n case $GT:\n return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=');\n case $BANG:\n case $EQ:\n return this.scanComplexOperator(start, String.fromCharCode(peek), $EQ, '=', $EQ, '=');\n case $AMPERSAND:\n return this.scanComplexOperator(start, '&', $AMPERSAND, '&');\n case $BAR:\n return this.scanComplexOperator(start, '|', $BAR, '|');\n case $NBSP:\n while (isWhitespace(this.peek))\n this.advance();\n return this.scanToken();\n }\n this.advance();\n return this.error(\"Unexpected character [\" + String.fromCharCode(peek) + \"]\", 0);\n };\n /**\n * @param {?} start\n * @param {?} code\n * @return {?}\n */\n _Scanner.prototype.scanCharacter = function (start, code) {\n this.advance();\n return newCharacterToken(start, code);\n };\n /**\n * @param {?} start\n * @param {?} str\n * @return {?}\n */\n _Scanner.prototype.scanOperator = function (start, str) {\n this.advance();\n return newOperatorToken(start, str);\n };\n /**\n * Tokenize a 2/3 char long operator\n * *\n * @param {?} start start index in the expression\n * @param {?} one first symbol (always part of the operator)\n * @param {?} twoCode code point for the second symbol\n * @param {?} two second symbol (part of the operator when the second code point matches)\n * @param {?=} threeCode code point for the third symbol\n * @param {?=} three third symbol (part of the operator when provided and matches source expression)\n * @return {?}\n */\n _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {\n this.advance();\n var /** @type {?} */ str = one;\n if (this.peek == twoCode) {\n this.advance();\n str += two;\n }\n if (isPresent(threeCode) && this.peek == threeCode) {\n this.advance();\n str += three;\n }\n return newOperatorToken(start, str);\n };\n /**\n * @return {?}\n */\n _Scanner.prototype.scanIdentifier = function () {\n var /** @type {?} */ start = this.index;\n this.advance();\n while (isIdentifierPart(this.peek))\n this.advance();\n var /** @type {?} */ str = this.input.substring(start, this.index);\n return KEYWORDS.indexOf(str) > -1 ? newKeywordToken(start, str) :\n newIdentifierToken(start, str);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Scanner.prototype.scanNumber = function (start) {\n var /** @type {?} */ simple = (this.index === start);\n this.advance(); // Skip initial digit.\n while (true) {\n if (isDigit(this.peek)) {\n }\n else if (this.peek == $PERIOD) {\n simple = false;\n }\n else if (isExponentStart(this.peek)) {\n this.advance();\n if (isExponentSign(this.peek))\n this.advance();\n if (!isDigit(this.peek))\n return this.error('Invalid exponent', -1);\n simple = false;\n }\n else {\n break;\n }\n this.advance();\n }\n var /** @type {?} */ str = this.input.substring(start, this.index);\n var /** @type {?} */ value = simple ? NumberWrapper.parseIntAutoRadix(str) : parseFloat(str);\n return newNumberToken(start, value);\n };\n /**\n * @return {?}\n */\n _Scanner.prototype.scanString = function () {\n var /** @type {?} */ start = this.index;\n var /** @type {?} */ quote = this.peek;\n this.advance(); // Skip initial quote.\n var /** @type {?} */ buffer = '';\n var /** @type {?} */ marker = this.index;\n var /** @type {?} */ input = this.input;\n while (this.peek != quote) {\n if (this.peek == $BACKSLASH) {\n buffer += input.substring(marker, this.index);\n this.advance();\n var /** @type {?} */ unescapedCode = void 0;\n if (this.peek == $u) {\n // 4 character hex code for unicode character.\n var /** @type {?} */ hex = input.substring(this.index + 1, this.index + 5);\n if (/^[0-9a-f]+$/i.test(hex)) {\n unescapedCode = parseInt(hex, 16);\n }\n else {\n return this.error(\"Invalid unicode escape [\\\\u\" + hex + \"]\", 0);\n }\n for (var /** @type {?} */ i = 0; i < 5; i++) {\n this.advance();\n }\n }\n else {\n unescapedCode = unescape(this.peek);\n this.advance();\n }\n buffer += String.fromCharCode(unescapedCode);\n marker = this.index;\n }\n else if (this.peek == $EOF) {\n return this.error('Unterminated quote', 0);\n }\n else {\n this.advance();\n }\n }\n var /** @type {?} */ last = input.substring(marker, this.index);\n this.advance(); // Skip terminating quote.\n return newStringToken(start, buffer + last);\n };\n /**\n * @param {?} message\n * @param {?} offset\n * @return {?}\n */\n _Scanner.prototype.error = function (message, offset) {\n var /** @type {?} */ position = this.index + offset;\n return newErrorToken(position, \"Lexer Error: \" + message + \" at column \" + position + \" in expression [\" + this.input + \"]\");\n };\n return _Scanner;\n }());\n /**\n * @param {?} code\n * @return {?}\n */\n function isIdentifierStart(code) {\n return ($a <= code && code <= $z) || ($A <= code && code <= $Z) ||\n (code == $_) || (code == $$);\n }\n /**\n * @param {?} input\n * @return {?}\n */\n function isIdentifier(input) {\n if (input.length == 0)\n return false;\n var /** @type {?} */ scanner = new _Scanner(input);\n if (!isIdentifierStart(scanner.peek))\n return false;\n scanner.advance();\n while (scanner.peek !== $EOF) {\n if (!isIdentifierPart(scanner.peek))\n return false;\n scanner.advance();\n }\n return true;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isIdentifierPart(code) {\n return isAsciiLetter(code) || isDigit(code) || (code == $_) ||\n (code == $$);\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isExponentStart(code) {\n return code == $e || code == $E;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isExponentSign(code) {\n return code == $MINUS || code == $PLUS;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isQuote(code) {\n return code === $SQ || code === $DQ || code === $BT;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function unescape(code) {\n switch (code) {\n case $n:\n return $LF;\n case $f:\n return $FF;\n case $r:\n return $CR;\n case $t:\n return $TAB;\n case $v:\n return $VTAB;\n default:\n return code;\n }\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$1 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$1 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var SplitInterpolation = (function () {\n /**\n * @param {?} strings\n * @param {?} expressions\n * @param {?} offsets\n */\n function SplitInterpolation(strings, expressions, offsets) {\n this.strings = strings;\n this.expressions = expressions;\n this.offsets = offsets;\n }\n return SplitInterpolation;\n }());\n var TemplateBindingParseResult = (function () {\n /**\n * @param {?} templateBindings\n * @param {?} warnings\n * @param {?} errors\n */\n function TemplateBindingParseResult(templateBindings, warnings, errors) {\n this.templateBindings = templateBindings;\n this.warnings = warnings;\n this.errors = errors;\n }\n return TemplateBindingParseResult;\n }());\n /**\n * @param {?} config\n * @return {?}\n */\n function _createInterpolateRegExp(config) {\n var /** @type {?} */ pattern = escapeRegExp(config.start) + '([\\\\s\\\\S]*?)' + escapeRegExp(config.end);\n return new RegExp(pattern, 'g');\n }\n var Parser = (function () {\n /**\n * @param {?} _lexer\n */\n function Parser(_lexer) {\n this._lexer = _lexer;\n this.errors = [];\n }\n /**\n * @param {?} input\n * @param {?} location\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.parseAction = function (input, location, interpolationConfig) {\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n this._checkNoInterpolation(input, location, interpolationConfig);\n var /** @type {?} */ sourceToLex = this._stripComments(input);\n var /** @type {?} */ tokens = this._lexer.tokenize(this._stripComments(input));\n var /** @type {?} */ ast = new _ParseAST(input, location, tokens, sourceToLex.length, true, this.errors, input.length - sourceToLex.length)\n .parseChain();\n return new ASTWithSource(ast, input, location, this.errors);\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.parseBinding = function (input, location, interpolationConfig) {\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ ast = this._parseBindingAst(input, location, interpolationConfig);\n return new ASTWithSource(ast, input, location, this.errors);\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.parseSimpleBinding = function (input, location, interpolationConfig) {\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ ast = this._parseBindingAst(input, location, interpolationConfig);\n var /** @type {?} */ errors = SimpleExpressionChecker.check(ast);\n if (errors.length > 0) {\n this._reportError(\"Host binding expression cannot contain \" + errors.join(' '), input, location);\n }\n return new ASTWithSource(ast, input, location, this.errors);\n };\n /**\n * @param {?} message\n * @param {?} input\n * @param {?} errLocation\n * @param {?=} ctxLocation\n * @return {?}\n */\n Parser.prototype._reportError = function (message, input, errLocation, ctxLocation) {\n this.errors.push(new ParserError(message, input, errLocation, ctxLocation));\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?} interpolationConfig\n * @return {?}\n */\n Parser.prototype._parseBindingAst = function (input, location, interpolationConfig) {\n // Quotes expressions use 3rd-party expression language. We don't want to use\n // our lexer or parser for that, so we check for that ahead of time.\n var /** @type {?} */ quote = this._parseQuote(input, location);\n if (isPresent(quote)) {\n return quote;\n }\n this._checkNoInterpolation(input, location, interpolationConfig);\n var /** @type {?} */ sourceToLex = this._stripComments(input);\n var /** @type {?} */ tokens = this._lexer.tokenize(sourceToLex);\n return new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, input.length - sourceToLex.length)\n .parseChain();\n };\n /**\n * @param {?} input\n * @param {?} location\n * @return {?}\n */\n Parser.prototype._parseQuote = function (input, location) {\n if (isBlank(input))\n return null;\n var /** @type {?} */ prefixSeparatorIndex = input.indexOf(':');\n if (prefixSeparatorIndex == -1)\n return null;\n var /** @type {?} */ prefix = input.substring(0, prefixSeparatorIndex).trim();\n if (!isIdentifier(prefix))\n return null;\n var /** @type {?} */ uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);\n return new Quote(new ParseSpan(0, input.length), prefix, uninterpretedExpression, location);\n };\n /**\n * @param {?} prefixToken\n * @param {?} input\n * @param {?} location\n * @return {?}\n */\n Parser.prototype.parseTemplateBindings = function (prefixToken, input, location) {\n var /** @type {?} */ tokens = this._lexer.tokenize(input);\n if (prefixToken) {\n // Prefix the tokens with the tokens from prefixToken but have them take no space (0 index).\n var /** @type {?} */ prefixTokens = this._lexer.tokenize(prefixToken).map(function (t) {\n t.index = 0;\n return t;\n });\n tokens.unshift.apply(tokens, prefixTokens);\n }\n return new _ParseAST(input, location, tokens, input.length, false, this.errors, 0)\n .parseTemplateBindings();\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.parseInterpolation = function (input, location, interpolationConfig) {\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ split = this.splitInterpolation(input, location, interpolationConfig);\n if (split == null)\n return null;\n var /** @type {?} */ expressions = [];\n for (var /** @type {?} */ i = 0; i < split.expressions.length; ++i) {\n var /** @type {?} */ expressionText = split.expressions[i];\n var /** @type {?} */ sourceToLex = this._stripComments(expressionText);\n var /** @type {?} */ tokens = this._lexer.tokenize(this._stripComments(split.expressions[i]));\n var /** @type {?} */ ast = new _ParseAST(input, location, tokens, sourceToLex.length, false, this.errors, split.offsets[i] + (expressionText.length - sourceToLex.length))\n .parseChain();\n expressions.push(ast);\n }\n return new ASTWithSource(new Interpolation(new ParseSpan(0, isBlank(input) ? 0 : input.length), split.strings, expressions), input, location, this.errors);\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.splitInterpolation = function (input, location, interpolationConfig) {\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ regexp = _createInterpolateRegExp(interpolationConfig);\n var /** @type {?} */ parts = input.split(regexp);\n if (parts.length <= 1) {\n return null;\n }\n var /** @type {?} */ strings = [];\n var /** @type {?} */ expressions = [];\n var /** @type {?} */ offsets = [];\n var /** @type {?} */ offset = 0;\n for (var /** @type {?} */ i = 0; i < parts.length; i++) {\n var /** @type {?} */ part = parts[i];\n if (i % 2 === 0) {\n // fixed string\n strings.push(part);\n offset += part.length;\n }\n else if (part.trim().length > 0) {\n offset += interpolationConfig.start.length;\n expressions.push(part);\n offsets.push(offset);\n offset += part.length + interpolationConfig.end.length;\n }\n else {\n this._reportError('Blank expressions are not allowed in interpolated strings', input, \"at column \" + this._findInterpolationErrorColumn(parts, i, interpolationConfig) + \" in\", location);\n expressions.push('$implict');\n offsets.push(offset);\n }\n }\n return new SplitInterpolation(strings, expressions, offsets);\n };\n /**\n * @param {?} input\n * @param {?} location\n * @return {?}\n */\n Parser.prototype.wrapLiteralPrimitive = function (input, location) {\n return new ASTWithSource(new LiteralPrimitive(new ParseSpan(0, isBlank(input) ? 0 : input.length), input), input, location, this.errors);\n };\n /**\n * @param {?} input\n * @return {?}\n */\n Parser.prototype._stripComments = function (input) {\n var /** @type {?} */ i = this._commentStart(input);\n return isPresent(i) ? input.substring(0, i).trim() : input;\n };\n /**\n * @param {?} input\n * @return {?}\n */\n Parser.prototype._commentStart = function (input) {\n var /** @type {?} */ outerQuote = null;\n for (var /** @type {?} */ i = 0; i < input.length - 1; i++) {\n var /** @type {?} */ char = input.charCodeAt(i);\n var /** @type {?} */ nextChar = input.charCodeAt(i + 1);\n if (char === $SLASH && nextChar == $SLASH && isBlank(outerQuote))\n return i;\n if (outerQuote === char) {\n outerQuote = null;\n }\n else if (isBlank(outerQuote) && isQuote(char)) {\n outerQuote = char;\n }\n }\n return null;\n };\n /**\n * @param {?} input\n * @param {?} location\n * @param {?} interpolationConfig\n * @return {?}\n */\n Parser.prototype._checkNoInterpolation = function (input, location, interpolationConfig) {\n var /** @type {?} */ regexp = _createInterpolateRegExp(interpolationConfig);\n var /** @type {?} */ parts = input.split(regexp);\n if (parts.length > 1) {\n this._reportError(\"Got interpolation (\" + interpolationConfig.start + interpolationConfig.end + \") where expression was expected\", input, \"at column \" + this._findInterpolationErrorColumn(parts, 1, interpolationConfig) + \" in\", location);\n }\n };\n /**\n * @param {?} parts\n * @param {?} partInErrIdx\n * @param {?} interpolationConfig\n * @return {?}\n */\n Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx, interpolationConfig) {\n var /** @type {?} */ errLocation = '';\n for (var /** @type {?} */ j = 0; j < partInErrIdx; j++) {\n errLocation += j % 2 === 0 ?\n parts[j] :\n \"\" + interpolationConfig.start + parts[j] + interpolationConfig.end;\n }\n return errLocation.length;\n };\n Parser = __decorate$1([\n CompilerInjectable(), \n __metadata$1('design:paramtypes', [Lexer])\n ], Parser);\n return Parser;\n }());\n var _ParseAST = (function () {\n /**\n * @param {?} input\n * @param {?} location\n * @param {?} tokens\n * @param {?} inputLength\n * @param {?} parseAction\n * @param {?} errors\n * @param {?} offset\n */\n function _ParseAST(input, location, tokens, inputLength, parseAction, errors, offset) {\n this.input = input;\n this.location = location;\n this.tokens = tokens;\n this.inputLength = inputLength;\n this.parseAction = parseAction;\n this.errors = errors;\n this.offset = offset;\n this.rparensExpected = 0;\n this.rbracketsExpected = 0;\n this.rbracesExpected = 0;\n this.index = 0;\n }\n /**\n * @param {?} offset\n * @return {?}\n */\n _ParseAST.prototype.peek = function (offset) {\n var /** @type {?} */ i = this.index + offset;\n return i < this.tokens.length ? this.tokens[i] : EOF;\n };\n Object.defineProperty(_ParseAST.prototype, \"next\", {\n /**\n * @return {?}\n */\n get: function () { return this.peek(0); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(_ParseAST.prototype, \"inputIndex\", {\n /**\n * @return {?}\n */\n get: function () {\n return (this.index < this.tokens.length) ? this.next.index + this.offset :\n this.inputLength + this.offset;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} start\n * @return {?}\n */\n _ParseAST.prototype.span = function (start) { return new ParseSpan(start, this.inputIndex); };\n /**\n * @return {?}\n */\n _ParseAST.prototype.advance = function () { this.index++; };\n /**\n * @param {?} code\n * @return {?}\n */\n _ParseAST.prototype.optionalCharacter = function (code) {\n if (this.next.isCharacter(code)) {\n this.advance();\n return true;\n }\n else {\n return false;\n }\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.peekKeywordLet = function () { return this.next.isKeywordLet(); };\n /**\n * @param {?} code\n * @return {?}\n */\n _ParseAST.prototype.expectCharacter = function (code) {\n if (this.optionalCharacter(code))\n return;\n this.error(\"Missing expected \" + String.fromCharCode(code));\n };\n /**\n * @param {?} op\n * @return {?}\n */\n _ParseAST.prototype.optionalOperator = function (op) {\n if (this.next.isOperator(op)) {\n this.advance();\n return true;\n }\n else {\n return false;\n }\n };\n /**\n * @param {?} operator\n * @return {?}\n */\n _ParseAST.prototype.expectOperator = function (operator) {\n if (this.optionalOperator(operator))\n return;\n this.error(\"Missing expected operator \" + operator);\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.expectIdentifierOrKeyword = function () {\n var /** @type {?} */ n = this.next;\n if (!n.isIdentifier() && !n.isKeyword()) {\n this.error(\"Unexpected token \" + n + \", expected identifier or keyword\");\n return '';\n }\n this.advance();\n return n.toString();\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {\n var /** @type {?} */ n = this.next;\n if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {\n this.error(\"Unexpected token \" + n + \", expected identifier, keyword, or string\");\n return '';\n }\n this.advance();\n return n.toString();\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseChain = function () {\n var /** @type {?} */ exprs = [];\n var /** @type {?} */ start = this.inputIndex;\n while (this.index < this.tokens.length) {\n var /** @type {?} */ expr = this.parsePipe();\n exprs.push(expr);\n if (this.optionalCharacter($SEMICOLON)) {\n if (!this.parseAction) {\n this.error('Binding expression cannot contain chained expression');\n }\n while (this.optionalCharacter($SEMICOLON)) {\n } // read all semicolons\n }\n else if (this.index < this.tokens.length) {\n this.error(\"Unexpected token '\" + this.next + \"'\");\n }\n }\n if (exprs.length == 0)\n return new EmptyExpr(this.span(start));\n if (exprs.length == 1)\n return exprs[0];\n return new Chain(this.span(start), exprs);\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parsePipe = function () {\n var /** @type {?} */ result = this.parseExpression();\n if (this.optionalOperator('|')) {\n if (this.parseAction) {\n this.error('Cannot have a pipe in an action expression');\n }\n do {\n var /** @type {?} */ name_1 = this.expectIdentifierOrKeyword();\n var /** @type {?} */ args = [];\n while (this.optionalCharacter($COLON)) {\n args.push(this.parseExpression());\n }\n result = new BindingPipe(this.span(result.span.start), result, name_1, args);\n } while (this.optionalOperator('|'));\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseConditional = function () {\n var /** @type {?} */ start = this.inputIndex;\n var /** @type {?} */ result = this.parseLogicalOr();\n if (this.optionalOperator('?')) {\n var /** @type {?} */ yes = this.parsePipe();\n var /** @type {?} */ no = void 0;\n if (!this.optionalCharacter($COLON)) {\n var /** @type {?} */ end = this.inputIndex;\n var /** @type {?} */ expression = this.input.substring(start, end);\n this.error(\"Conditional expression \" + expression + \" requires all 3 expressions\");\n no = new EmptyExpr(this.span(start));\n }\n else {\n no = this.parsePipe();\n }\n return new Conditional(this.span(start), result, yes, no);\n }\n else {\n return result;\n }\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseLogicalOr = function () {\n // '||'\n var /** @type {?} */ result = this.parseLogicalAnd();\n while (this.optionalOperator('||')) {\n var /** @type {?} */ right = this.parseLogicalAnd();\n result = new Binary(this.span(result.span.start), '||', result, right);\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseLogicalAnd = function () {\n // '&&'\n var /** @type {?} */ result = this.parseEquality();\n while (this.optionalOperator('&&')) {\n var /** @type {?} */ right = this.parseEquality();\n result = new Binary(this.span(result.span.start), '&&', result, right);\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseEquality = function () {\n // '==','!=','===','!=='\n var /** @type {?} */ result = this.parseRelational();\n while (this.next.type == TokenType.Operator) {\n var /** @type {?} */ operator = this.next.strValue;\n switch (operator) {\n case '==':\n case '===':\n case '!=':\n case '!==':\n this.advance();\n var /** @type {?} */ right = this.parseRelational();\n result = new Binary(this.span(result.span.start), operator, result, right);\n continue;\n }\n break;\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseRelational = function () {\n // '<', '>', '<=', '>='\n var /** @type {?} */ result = this.parseAdditive();\n while (this.next.type == TokenType.Operator) {\n var /** @type {?} */ operator = this.next.strValue;\n switch (operator) {\n case '<':\n case '>':\n case '<=':\n case '>=':\n this.advance();\n var /** @type {?} */ right = this.parseAdditive();\n result = new Binary(this.span(result.span.start), operator, result, right);\n continue;\n }\n break;\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseAdditive = function () {\n // '+', '-'\n var /** @type {?} */ result = this.parseMultiplicative();\n while (this.next.type == TokenType.Operator) {\n var /** @type {?} */ operator = this.next.strValue;\n switch (operator) {\n case '+':\n case '-':\n this.advance();\n var /** @type {?} */ right = this.parseMultiplicative();\n result = new Binary(this.span(result.span.start), operator, result, right);\n continue;\n }\n break;\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseMultiplicative = function () {\n // '*', '%', '/'\n var /** @type {?} */ result = this.parsePrefix();\n while (this.next.type == TokenType.Operator) {\n var /** @type {?} */ operator = this.next.strValue;\n switch (operator) {\n case '*':\n case '%':\n case '/':\n this.advance();\n var /** @type {?} */ right = this.parsePrefix();\n result = new Binary(this.span(result.span.start), operator, result, right);\n continue;\n }\n break;\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parsePrefix = function () {\n if (this.next.type == TokenType.Operator) {\n var /** @type {?} */ start = this.inputIndex;\n var /** @type {?} */ operator = this.next.strValue;\n var /** @type {?} */ result = void 0;\n switch (operator) {\n case '+':\n this.advance();\n return this.parsePrefix();\n case '-':\n this.advance();\n result = this.parsePrefix();\n return new Binary(this.span(start), operator, new LiteralPrimitive(new ParseSpan(start, start), 0), result);\n case '!':\n this.advance();\n result = this.parsePrefix();\n return new PrefixNot(this.span(start), result);\n }\n }\n return this.parseCallChain();\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseCallChain = function () {\n var /** @type {?} */ result = this.parsePrimary();\n while (true) {\n if (this.optionalCharacter($PERIOD)) {\n result = this.parseAccessMemberOrMethodCall(result, false);\n }\n else if (this.optionalOperator('?.')) {\n result = this.parseAccessMemberOrMethodCall(result, true);\n }\n else if (this.optionalCharacter($LBRACKET)) {\n this.rbracketsExpected++;\n var /** @type {?} */ key = this.parsePipe();\n this.rbracketsExpected--;\n this.expectCharacter($RBRACKET);\n if (this.optionalOperator('=')) {\n var /** @type {?} */ value = this.parseConditional();\n result = new KeyedWrite(this.span(result.span.start), result, key, value);\n }\n else {\n result = new KeyedRead(this.span(result.span.start), result, key);\n }\n }\n else if (this.optionalCharacter($LPAREN)) {\n this.rparensExpected++;\n var /** @type {?} */ args = this.parseCallArguments();\n this.rparensExpected--;\n this.expectCharacter($RPAREN);\n result = new FunctionCall(this.span(result.span.start), result, args);\n }\n else {\n return result;\n }\n }\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parsePrimary = function () {\n var /** @type {?} */ start = this.inputIndex;\n if (this.optionalCharacter($LPAREN)) {\n this.rparensExpected++;\n var /** @type {?} */ result = this.parsePipe();\n this.rparensExpected--;\n this.expectCharacter($RPAREN);\n return result;\n }\n else if (this.next.isKeywordNull()) {\n this.advance();\n return new LiteralPrimitive(this.span(start), null);\n }\n else if (this.next.isKeywordUndefined()) {\n this.advance();\n return new LiteralPrimitive(this.span(start), void 0);\n }\n else if (this.next.isKeywordTrue()) {\n this.advance();\n return new LiteralPrimitive(this.span(start), true);\n }\n else if (this.next.isKeywordFalse()) {\n this.advance();\n return new LiteralPrimitive(this.span(start), false);\n }\n else if (this.next.isKeywordThis()) {\n this.advance();\n return new ImplicitReceiver(this.span(start));\n }\n else if (this.optionalCharacter($LBRACKET)) {\n this.rbracketsExpected++;\n var /** @type {?} */ elements = this.parseExpressionList($RBRACKET);\n this.rbracketsExpected--;\n this.expectCharacter($RBRACKET);\n return new LiteralArray(this.span(start), elements);\n }\n else if (this.next.isCharacter($LBRACE)) {\n return this.parseLiteralMap();\n }\n else if (this.next.isIdentifier()) {\n return this.parseAccessMemberOrMethodCall(new ImplicitReceiver(this.span(start)), false);\n }\n else if (this.next.isNumber()) {\n var /** @type {?} */ value = this.next.toNumber();\n this.advance();\n return new LiteralPrimitive(this.span(start), value);\n }\n else if (this.next.isString()) {\n var /** @type {?} */ literalValue = this.next.toString();\n this.advance();\n return new LiteralPrimitive(this.span(start), literalValue);\n }\n else if (this.index >= this.tokens.length) {\n this.error(\"Unexpected end of expression: \" + this.input);\n return new EmptyExpr(this.span(start));\n }\n else {\n this.error(\"Unexpected token \" + this.next);\n return new EmptyExpr(this.span(start));\n }\n };\n /**\n * @param {?} terminator\n * @return {?}\n */\n _ParseAST.prototype.parseExpressionList = function (terminator) {\n var /** @type {?} */ result = [];\n if (!this.next.isCharacter(terminator)) {\n do {\n result.push(this.parsePipe());\n } while (this.optionalCharacter($COMMA));\n }\n return result;\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseLiteralMap = function () {\n var /** @type {?} */ keys = [];\n var /** @type {?} */ values = [];\n var /** @type {?} */ start = this.inputIndex;\n this.expectCharacter($LBRACE);\n if (!this.optionalCharacter($RBRACE)) {\n this.rbracesExpected++;\n do {\n var /** @type {?} */ key = this.expectIdentifierOrKeywordOrString();\n keys.push(key);\n this.expectCharacter($COLON);\n values.push(this.parsePipe());\n } while (this.optionalCharacter($COMMA));\n this.rbracesExpected--;\n this.expectCharacter($RBRACE);\n }\n return new LiteralMap(this.span(start), keys, values);\n };\n /**\n * @param {?} receiver\n * @param {?=} isSafe\n * @return {?}\n */\n _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {\n if (isSafe === void 0) { isSafe = false; }\n var /** @type {?} */ start = receiver.span.start;\n var /** @type {?} */ id = this.expectIdentifierOrKeyword();\n if (this.optionalCharacter($LPAREN)) {\n this.rparensExpected++;\n var /** @type {?} */ args = this.parseCallArguments();\n this.expectCharacter($RPAREN);\n this.rparensExpected--;\n var /** @type {?} */ span = this.span(start);\n return isSafe ? new SafeMethodCall(span, receiver, id, args) :\n new MethodCall(span, receiver, id, args);\n }\n else {\n if (isSafe) {\n if (this.optionalOperator('=')) {\n this.error('The \\'?.\\' operator cannot be used in the assignment');\n return new EmptyExpr(this.span(start));\n }\n else {\n return new SafePropertyRead(this.span(start), receiver, id);\n }\n }\n else {\n if (this.optionalOperator('=')) {\n if (!this.parseAction) {\n this.error('Bindings cannot contain assignments');\n return new EmptyExpr(this.span(start));\n }\n var /** @type {?} */ value = this.parseConditional();\n return new PropertyWrite(this.span(start), receiver, id, value);\n }\n else {\n return new PropertyRead(this.span(start), receiver, id);\n }\n }\n }\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseCallArguments = function () {\n if (this.next.isCharacter($RPAREN))\n return [];\n var /** @type {?} */ positionals = [];\n do {\n positionals.push(this.parsePipe());\n } while (this.optionalCharacter($COMMA));\n return (positionals);\n };\n /**\n * An identifier, a keyword, a string with an optional `-` inbetween.\n * @return {?}\n */\n _ParseAST.prototype.expectTemplateBindingKey = function () {\n var /** @type {?} */ result = '';\n var /** @type {?} */ operatorFound = false;\n do {\n result += this.expectIdentifierOrKeywordOrString();\n operatorFound = this.optionalOperator('-');\n if (operatorFound) {\n result += '-';\n }\n } while (operatorFound);\n return result.toString();\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.parseTemplateBindings = function () {\n var /** @type {?} */ bindings = [];\n var /** @type {?} */ prefix = null;\n var /** @type {?} */ warnings = [];\n while (this.index < this.tokens.length) {\n var /** @type {?} */ start = this.inputIndex;\n var /** @type {?} */ keyIsVar = this.peekKeywordLet();\n if (keyIsVar) {\n this.advance();\n }\n var /** @type {?} */ key = this.expectTemplateBindingKey();\n if (!keyIsVar) {\n if (prefix == null) {\n prefix = key;\n }\n else {\n key = prefix + key[0].toUpperCase() + key.substring(1);\n }\n }\n this.optionalCharacter($COLON);\n var /** @type {?} */ name_2 = null;\n var /** @type {?} */ expression = null;\n if (keyIsVar) {\n if (this.optionalOperator('=')) {\n name_2 = this.expectTemplateBindingKey();\n }\n else {\n name_2 = '\\$implicit';\n }\n }\n else if (this.next !== EOF && !this.peekKeywordLet()) {\n var /** @type {?} */ start_1 = this.inputIndex;\n var /** @type {?} */ ast = this.parsePipe();\n var /** @type {?} */ source = this.input.substring(start_1 - this.offset, this.inputIndex - this.offset);\n expression = new ASTWithSource(ast, source, this.location, this.errors);\n }\n bindings.push(new TemplateBinding(this.span(start), key, keyIsVar, name_2, expression));\n if (!this.optionalCharacter($SEMICOLON)) {\n this.optionalCharacter($COMMA);\n }\n }\n return new TemplateBindingParseResult(bindings, warnings, this.errors);\n };\n /**\n * @param {?} message\n * @param {?=} index\n * @return {?}\n */\n _ParseAST.prototype.error = function (message, index) {\n if (index === void 0) { index = null; }\n this.errors.push(new ParserError(message, this.input, this.locationText(index), this.location));\n this.skip();\n };\n /**\n * @param {?=} index\n * @return {?}\n */\n _ParseAST.prototype.locationText = function (index) {\n if (index === void 0) { index = null; }\n if (isBlank(index))\n index = this.index;\n return (index < this.tokens.length) ? \"at column \" + (this.tokens[index].index + 1) + \" in\" :\n \"at the end of the expression\";\n };\n /**\n * @return {?}\n */\n _ParseAST.prototype.skip = function () {\n var /** @type {?} */ n = this.next;\n while (this.index < this.tokens.length && !n.isCharacter($SEMICOLON) &&\n (this.rparensExpected <= 0 || !n.isCharacter($RPAREN)) &&\n (this.rbracesExpected <= 0 || !n.isCharacter($RBRACE)) &&\n (this.rbracketsExpected <= 0 || !n.isCharacter($RBRACKET))) {\n if (this.next.isError()) {\n this.errors.push(new ParserError(this.next.toString(), this.input, this.locationText(), this.location));\n }\n this.advance();\n n = this.next;\n }\n };\n return _ParseAST;\n }());\n var SimpleExpressionChecker = (function () {\n function SimpleExpressionChecker() {\n this.errors = [];\n }\n /**\n * @param {?} ast\n * @return {?}\n */\n SimpleExpressionChecker.check = function (ast) {\n var /** @type {?} */ s = new SimpleExpressionChecker();\n ast.visit(s);\n return s.errors;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitInterpolation = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitPropertyRead = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitMethodCall = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitFunctionCall = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitLiteralArray = function (ast, context) { this.visitAll(ast.expressions); };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitLiteralMap = function (ast, context) { this.visitAll(ast.values); };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitBinary = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitPrefixNot = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitConditional = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitPipe = function (ast, context) { this.errors.push('pipes'); };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitKeyedRead = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast, context) { };\n /**\n * @param {?} asts\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitAll = function (asts) {\n var _this = this;\n return asts.map(function (node) { return node.visit(_this); });\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitChain = function (ast, context) { };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n SimpleExpressionChecker.prototype.visitQuote = function (ast, context) { };\n return SimpleExpressionChecker;\n }());\n\n var ParseLocation = (function () {\n /**\n * @param {?} file\n * @param {?} offset\n * @param {?} line\n * @param {?} col\n */\n function ParseLocation(file, offset, line, col) {\n this.file = file;\n this.offset = offset;\n this.line = line;\n this.col = col;\n }\n /**\n * @return {?}\n */\n ParseLocation.prototype.toString = function () {\n return isPresent(this.offset) ? this.file.url + \"@\" + this.line + \":\" + this.col : this.file.url;\n };\n /**\n * @param {?} delta\n * @return {?}\n */\n ParseLocation.prototype.moveBy = function (delta) {\n var /** @type {?} */ source = this.file.content;\n var /** @type {?} */ len = source.length;\n var /** @type {?} */ offset = this.offset;\n var /** @type {?} */ line = this.line;\n var /** @type {?} */ col = this.col;\n while (offset > 0 && delta < 0) {\n offset--;\n delta++;\n var /** @type {?} */ ch = source.charCodeAt(offset);\n if (ch == $LF) {\n line--;\n var /** @type {?} */ priorLine = source.substr(0, offset - 1).lastIndexOf(String.fromCharCode($LF));\n col = priorLine > 0 ? offset - priorLine : offset;\n }\n else {\n col--;\n }\n }\n while (offset < len && delta > 0) {\n var /** @type {?} */ ch = source.charCodeAt(offset);\n offset++;\n delta--;\n if (ch == $LF) {\n line++;\n col = 0;\n }\n else {\n col++;\n }\n }\n return new ParseLocation(this.file, offset, line, col);\n };\n return ParseLocation;\n }());\n var ParseSourceFile = (function () {\n /**\n * @param {?} content\n * @param {?} url\n */\n function ParseSourceFile(content, url) {\n this.content = content;\n this.url = url;\n }\n return ParseSourceFile;\n }());\n var ParseSourceSpan = (function () {\n /**\n * @param {?} start\n * @param {?} end\n * @param {?=} details\n */\n function ParseSourceSpan(start, end, details) {\n if (details === void 0) { details = null; }\n this.start = start;\n this.end = end;\n this.details = details;\n }\n /**\n * @return {?}\n */\n ParseSourceSpan.prototype.toString = function () {\n return this.start.file.content.substring(this.start.offset, this.end.offset);\n };\n return ParseSourceSpan;\n }());\n var ParseErrorLevel = {};\n ParseErrorLevel.WARNING = 0;\n ParseErrorLevel.FATAL = 1;\n ParseErrorLevel[ParseErrorLevel.WARNING] = \"WARNING\";\n ParseErrorLevel[ParseErrorLevel.FATAL] = \"FATAL\";\n var ParseError = (function () {\n /**\n * @param {?} span\n * @param {?} msg\n * @param {?=} level\n */\n function ParseError(span, msg, level) {\n if (level === void 0) { level = ParseErrorLevel.FATAL; }\n this.span = span;\n this.msg = msg;\n this.level = level;\n }\n /**\n * @return {?}\n */\n ParseError.prototype.toString = function () {\n var /** @type {?} */ source = this.span.start.file.content;\n var /** @type {?} */ ctxStart = this.span.start.offset;\n var /** @type {?} */ contextStr = '';\n var /** @type {?} */ details = '';\n if (isPresent(ctxStart)) {\n if (ctxStart > source.length - 1) {\n ctxStart = source.length - 1;\n }\n var /** @type {?} */ ctxEnd = ctxStart;\n var /** @type {?} */ ctxLen = 0;\n var /** @type {?} */ ctxLines = 0;\n while (ctxLen < 100 && ctxStart > 0) {\n ctxStart--;\n ctxLen++;\n if (source[ctxStart] == '\\n') {\n if (++ctxLines == 3) {\n break;\n }\n }\n }\n ctxLen = 0;\n ctxLines = 0;\n while (ctxLen < 100 && ctxEnd < source.length - 1) {\n ctxEnd++;\n ctxLen++;\n if (source[ctxEnd] == '\\n') {\n if (++ctxLines == 3) {\n break;\n }\n }\n }\n var /** @type {?} */ context = source.substring(ctxStart, this.span.start.offset) + '[ERROR ->]' +\n source.substring(this.span.start.offset, ctxEnd + 1);\n contextStr = \" (\\\"\" + context + \"\\\")\";\n }\n if (this.span.details) {\n details = \", \" + this.span.details;\n }\n return \"\" + this.msg + contextStr + \": \" + this.span.start + details;\n };\n return ParseError;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var Text = (function () {\n /**\n * @param {?} value\n * @param {?} sourceSpan\n */\n function Text(value, sourceSpan) {\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n return Text;\n }());\n var Expansion = (function () {\n /**\n * @param {?} switchValue\n * @param {?} type\n * @param {?} cases\n * @param {?} sourceSpan\n * @param {?} switchValueSourceSpan\n */\n function Expansion(switchValue, type, cases, sourceSpan, switchValueSourceSpan) {\n this.switchValue = switchValue;\n this.type = type;\n this.cases = cases;\n this.sourceSpan = sourceSpan;\n this.switchValueSourceSpan = switchValueSourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Expansion.prototype.visit = function (visitor, context) { return visitor.visitExpansion(this, context); };\n return Expansion;\n }());\n var ExpansionCase = (function () {\n /**\n * @param {?} value\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} valueSourceSpan\n * @param {?} expSourceSpan\n */\n function ExpansionCase(value, expression, sourceSpan, valueSourceSpan, expSourceSpan) {\n this.value = value;\n this.expression = expression;\n this.sourceSpan = sourceSpan;\n this.valueSourceSpan = valueSourceSpan;\n this.expSourceSpan = expSourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ExpansionCase.prototype.visit = function (visitor, context) { return visitor.visitExpansionCase(this, context); };\n return ExpansionCase;\n }());\n var Attribute$1 = (function () {\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?=} valueSpan\n */\n function Attribute(name, value, sourceSpan, valueSpan) {\n this.name = name;\n this.value = value;\n this.sourceSpan = sourceSpan;\n this.valueSpan = valueSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Attribute.prototype.visit = function (visitor, context) { return visitor.visitAttribute(this, context); };\n return Attribute;\n }());\n var Element = (function () {\n /**\n * @param {?} name\n * @param {?} attrs\n * @param {?} children\n * @param {?} sourceSpan\n * @param {?} startSourceSpan\n * @param {?} endSourceSpan\n */\n function Element(name, attrs, children, sourceSpan, startSourceSpan, endSourceSpan) {\n this.name = name;\n this.attrs = attrs;\n this.children = children;\n this.sourceSpan = sourceSpan;\n this.startSourceSpan = startSourceSpan;\n this.endSourceSpan = endSourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Element.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };\n return Element;\n }());\n var Comment = (function () {\n /**\n * @param {?} value\n * @param {?} sourceSpan\n */\n function Comment(value, sourceSpan) {\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Comment.prototype.visit = function (visitor, context) { return visitor.visitComment(this, context); };\n return Comment;\n }());\n /**\n * @param {?} visitor\n * @param {?} nodes\n * @param {?=} context\n * @return {?}\n */\n function visitAll(visitor, nodes, context) {\n if (context === void 0) { context = null; }\n var /** @type {?} */ result = [];\n var /** @type {?} */ visit = visitor.visit ?\n function (ast) { return visitor.visit(ast, context) || ast.visit(visitor, context); } :\n function (ast) { return ast.visit(visitor, context); };\n nodes.forEach(function (ast) {\n var /** @type {?} */ astResult = visit(ast);\n if (astResult) {\n result.push(astResult);\n }\n });\n return result;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$6 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var TokenType$1 = {};\n TokenType$1.TAG_OPEN_START = 0;\n TokenType$1.TAG_OPEN_END = 1;\n TokenType$1.TAG_OPEN_END_VOID = 2;\n TokenType$1.TAG_CLOSE = 3;\n TokenType$1.TEXT = 4;\n TokenType$1.ESCAPABLE_RAW_TEXT = 5;\n TokenType$1.RAW_TEXT = 6;\n TokenType$1.COMMENT_START = 7;\n TokenType$1.COMMENT_END = 8;\n TokenType$1.CDATA_START = 9;\n TokenType$1.CDATA_END = 10;\n TokenType$1.ATTR_NAME = 11;\n TokenType$1.ATTR_VALUE = 12;\n TokenType$1.DOC_TYPE = 13;\n TokenType$1.EXPANSION_FORM_START = 14;\n TokenType$1.EXPANSION_CASE_VALUE = 15;\n TokenType$1.EXPANSION_CASE_EXP_START = 16;\n TokenType$1.EXPANSION_CASE_EXP_END = 17;\n TokenType$1.EXPANSION_FORM_END = 18;\n TokenType$1.EOF = 19;\n TokenType$1[TokenType$1.TAG_OPEN_START] = \"TAG_OPEN_START\";\n TokenType$1[TokenType$1.TAG_OPEN_END] = \"TAG_OPEN_END\";\n TokenType$1[TokenType$1.TAG_OPEN_END_VOID] = \"TAG_OPEN_END_VOID\";\n TokenType$1[TokenType$1.TAG_CLOSE] = \"TAG_CLOSE\";\n TokenType$1[TokenType$1.TEXT] = \"TEXT\";\n TokenType$1[TokenType$1.ESCAPABLE_RAW_TEXT] = \"ESCAPABLE_RAW_TEXT\";\n TokenType$1[TokenType$1.RAW_TEXT] = \"RAW_TEXT\";\n TokenType$1[TokenType$1.COMMENT_START] = \"COMMENT_START\";\n TokenType$1[TokenType$1.COMMENT_END] = \"COMMENT_END\";\n TokenType$1[TokenType$1.CDATA_START] = \"CDATA_START\";\n TokenType$1[TokenType$1.CDATA_END] = \"CDATA_END\";\n TokenType$1[TokenType$1.ATTR_NAME] = \"ATTR_NAME\";\n TokenType$1[TokenType$1.ATTR_VALUE] = \"ATTR_VALUE\";\n TokenType$1[TokenType$1.DOC_TYPE] = \"DOC_TYPE\";\n TokenType$1[TokenType$1.EXPANSION_FORM_START] = \"EXPANSION_FORM_START\";\n TokenType$1[TokenType$1.EXPANSION_CASE_VALUE] = \"EXPANSION_CASE_VALUE\";\n TokenType$1[TokenType$1.EXPANSION_CASE_EXP_START] = \"EXPANSION_CASE_EXP_START\";\n TokenType$1[TokenType$1.EXPANSION_CASE_EXP_END] = \"EXPANSION_CASE_EXP_END\";\n TokenType$1[TokenType$1.EXPANSION_FORM_END] = \"EXPANSION_FORM_END\";\n TokenType$1[TokenType$1.EOF] = \"EOF\";\n var Token$1 = (function () {\n /**\n * @param {?} type\n * @param {?} parts\n * @param {?} sourceSpan\n */\n function Token(type, parts, sourceSpan) {\n this.type = type;\n this.parts = parts;\n this.sourceSpan = sourceSpan;\n }\n return Token;\n }());\n var TokenError = (function (_super) {\n __extends$6(TokenError, _super);\n /**\n * @param {?} errorMsg\n * @param {?} tokenType\n * @param {?} span\n */\n function TokenError(errorMsg, tokenType, span) {\n _super.call(this, span, errorMsg);\n this.tokenType = tokenType;\n }\n return TokenError;\n }(ParseError));\n var TokenizeResult = (function () {\n /**\n * @param {?} tokens\n * @param {?} errors\n */\n function TokenizeResult(tokens, errors) {\n this.tokens = tokens;\n this.errors = errors;\n }\n return TokenizeResult;\n }());\n /**\n * @param {?} source\n * @param {?} url\n * @param {?} getTagDefinition\n * @param {?=} tokenizeExpansionForms\n * @param {?=} interpolationConfig\n * @return {?}\n */\n function tokenize(source, url, getTagDefinition, tokenizeExpansionForms, interpolationConfig) {\n if (tokenizeExpansionForms === void 0) { tokenizeExpansionForms = false; }\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n return new _Tokenizer(new ParseSourceFile(source, url), getTagDefinition, tokenizeExpansionForms, interpolationConfig)\n .tokenize();\n }\n var /** @type {?} */ _CR_OR_CRLF_REGEXP = /\\r\\n?/g;\n /**\n * @param {?} charCode\n * @return {?}\n */\n function _unexpectedCharacterErrorMsg(charCode) {\n var /** @type {?} */ char = charCode === $EOF ? 'EOF' : String.fromCharCode(charCode);\n return \"Unexpected character \\\"\" + char + \"\\\"\";\n }\n /**\n * @param {?} entitySrc\n * @return {?}\n */\n function _unknownEntityErrorMsg(entitySrc) {\n return \"Unknown entity \\\"\" + entitySrc + \"\\\" - use the \\\"&#<decimal>;\\\" or \\\"&#x<hex>;\\\" syntax\";\n }\n var _ControlFlowError = (function () {\n /**\n * @param {?} error\n */\n function _ControlFlowError(error) {\n this.error = error;\n }\n return _ControlFlowError;\n }());\n // See http://www.w3.org/TR/html51/syntax.html#writing\n var _Tokenizer = (function () {\n /**\n * @param {?} _file The html source\n * @param {?} _getTagDefinition\n * @param {?} _tokenizeIcu Whether to tokenize ICU messages (considered as text nodes when false)\n * @param {?=} _interpolationConfig\n */\n function _Tokenizer(_file, _getTagDefinition, _tokenizeIcu, _interpolationConfig) {\n if (_interpolationConfig === void 0) { _interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n this._file = _file;\n this._getTagDefinition = _getTagDefinition;\n this._tokenizeIcu = _tokenizeIcu;\n this._interpolationConfig = _interpolationConfig;\n this._peek = -1;\n this._nextPeek = -1;\n this._index = -1;\n this._line = 0;\n this._column = -1;\n this._expansionCaseStack = [];\n this._inInterpolation = false;\n this.tokens = [];\n this.errors = [];\n this._input = _file.content;\n this._length = _file.content.length;\n this._advance();\n }\n /**\n * @param {?} content\n * @return {?}\n */\n _Tokenizer.prototype._processCarriageReturns = function (content) {\n // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream\n // In order to keep the original position in the source, we can not\n // pre-process it.\n // Instead CRs are processed right before instantiating the tokens.\n return content.replace(_CR_OR_CRLF_REGEXP, '\\n');\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype.tokenize = function () {\n while (this._peek !== $EOF) {\n var /** @type {?} */ start = this._getLocation();\n try {\n if (this._attemptCharCode($LT)) {\n if (this._attemptCharCode($BANG)) {\n if (this._attemptCharCode($LBRACKET)) {\n this._consumeCdata(start);\n }\n else if (this._attemptCharCode($MINUS)) {\n this._consumeComment(start);\n }\n else {\n this._consumeDocType(start);\n }\n }\n else if (this._attemptCharCode($SLASH)) {\n this._consumeTagClose(start);\n }\n else {\n this._consumeTagOpen(start);\n }\n }\n else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) {\n this._consumeText();\n }\n }\n catch (e) {\n if (e instanceof _ControlFlowError) {\n this.errors.push(e.error);\n }\n else {\n throw e;\n }\n }\n }\n this._beginToken(TokenType$1.EOF);\n this._endToken([]);\n return new TokenizeResult(mergeTextTokens(this.tokens), this.errors);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._tokenizeExpansionForm = function () {\n if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) {\n this._consumeExpansionFormStart();\n return true;\n }\n if (isExpansionCaseStart(this._peek) && this._isInExpansionForm()) {\n this._consumeExpansionCaseStart();\n return true;\n }\n if (this._peek === $RBRACE) {\n if (this._isInExpansionCase()) {\n this._consumeExpansionCaseEnd();\n return true;\n }\n if (this._isInExpansionForm()) {\n this._consumeExpansionFormEnd();\n return true;\n }\n }\n return false;\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._getLocation = function () {\n return new ParseLocation(this._file, this._index, this._line, this._column);\n };\n /**\n * @param {?=} start\n * @param {?=} end\n * @return {?}\n */\n _Tokenizer.prototype._getSpan = function (start, end) {\n if (start === void 0) { start = this._getLocation(); }\n if (end === void 0) { end = this._getLocation(); }\n return new ParseSourceSpan(start, end);\n };\n /**\n * @param {?} type\n * @param {?=} start\n * @return {?}\n */\n _Tokenizer.prototype._beginToken = function (type, start) {\n if (start === void 0) { start = this._getLocation(); }\n this._currentTokenStart = start;\n this._currentTokenType = type;\n };\n /**\n * @param {?} parts\n * @param {?=} end\n * @return {?}\n */\n _Tokenizer.prototype._endToken = function (parts, end) {\n if (end === void 0) { end = this._getLocation(); }\n var /** @type {?} */ token = new Token$1(this._currentTokenType, parts, new ParseSourceSpan(this._currentTokenStart, end));\n this.tokens.push(token);\n this._currentTokenStart = null;\n this._currentTokenType = null;\n return token;\n };\n /**\n * @param {?} msg\n * @param {?} span\n * @return {?}\n */\n _Tokenizer.prototype._createError = function (msg, span) {\n if (this._isInExpansionForm()) {\n msg += \" (Do you have an unescaped \\\"{\\\" in your template? Use \\\"{{ '{' }}\\\") to escape it.)\";\n }\n var /** @type {?} */ error = new TokenError(msg, this._currentTokenType, span);\n this._currentTokenStart = null;\n this._currentTokenType = null;\n return new _ControlFlowError(error);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._advance = function () {\n if (this._index >= this._length) {\n throw this._createError(_unexpectedCharacterErrorMsg($EOF), this._getSpan());\n }\n if (this._peek === $LF) {\n this._line++;\n this._column = 0;\n }\n else if (this._peek !== $LF && this._peek !== $CR) {\n this._column++;\n }\n this._index++;\n this._peek = this._index >= this._length ? $EOF : this._input.charCodeAt(this._index);\n this._nextPeek =\n this._index + 1 >= this._length ? $EOF : this._input.charCodeAt(this._index + 1);\n };\n /**\n * @param {?} charCode\n * @return {?}\n */\n _Tokenizer.prototype._attemptCharCode = function (charCode) {\n if (this._peek === charCode) {\n this._advance();\n return true;\n }\n return false;\n };\n /**\n * @param {?} charCode\n * @return {?}\n */\n _Tokenizer.prototype._attemptCharCodeCaseInsensitive = function (charCode) {\n if (compareCharCodeCaseInsensitive(this._peek, charCode)) {\n this._advance();\n return true;\n }\n return false;\n };\n /**\n * @param {?} charCode\n * @return {?}\n */\n _Tokenizer.prototype._requireCharCode = function (charCode) {\n var /** @type {?} */ location = this._getLocation();\n if (!this._attemptCharCode(charCode)) {\n throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(location, location));\n }\n };\n /**\n * @param {?} chars\n * @return {?}\n */\n _Tokenizer.prototype._attemptStr = function (chars) {\n var /** @type {?} */ len = chars.length;\n if (this._index + len > this._length) {\n return false;\n }\n var /** @type {?} */ initialPosition = this._savePosition();\n for (var /** @type {?} */ i = 0; i < len; i++) {\n if (!this._attemptCharCode(chars.charCodeAt(i))) {\n // If attempting to parse the string fails, we want to reset the parser\n // to where it was before the attempt\n this._restorePosition(initialPosition);\n return false;\n }\n }\n return true;\n };\n /**\n * @param {?} chars\n * @return {?}\n */\n _Tokenizer.prototype._attemptStrCaseInsensitive = function (chars) {\n for (var /** @type {?} */ i = 0; i < chars.length; i++) {\n if (!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i))) {\n return false;\n }\n }\n return true;\n };\n /**\n * @param {?} chars\n * @return {?}\n */\n _Tokenizer.prototype._requireStr = function (chars) {\n var /** @type {?} */ location = this._getLocation();\n if (!this._attemptStr(chars)) {\n throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(location));\n }\n };\n /**\n * @param {?} predicate\n * @return {?}\n */\n _Tokenizer.prototype._attemptCharCodeUntilFn = function (predicate) {\n while (!predicate(this._peek)) {\n this._advance();\n }\n };\n /**\n * @param {?} predicate\n * @param {?} len\n * @return {?}\n */\n _Tokenizer.prototype._requireCharCodeUntilFn = function (predicate, len) {\n var /** @type {?} */ start = this._getLocation();\n this._attemptCharCodeUntilFn(predicate);\n if (this._index - start.offset < len) {\n throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(start, start));\n }\n };\n /**\n * @param {?} char\n * @return {?}\n */\n _Tokenizer.prototype._attemptUntilChar = function (char) {\n while (this._peek !== char) {\n this._advance();\n }\n };\n /**\n * @param {?} decodeEntities\n * @return {?}\n */\n _Tokenizer.prototype._readChar = function (decodeEntities) {\n if (decodeEntities && this._peek === $AMPERSAND) {\n return this._decodeEntity();\n }\n else {\n var /** @type {?} */ index = this._index;\n this._advance();\n return this._input[index];\n }\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._decodeEntity = function () {\n var /** @type {?} */ start = this._getLocation();\n this._advance();\n if (this._attemptCharCode($HASH)) {\n var /** @type {?} */ isHex = this._attemptCharCode($x) || this._attemptCharCode($X);\n var /** @type {?} */ numberStart = this._getLocation().offset;\n this._attemptCharCodeUntilFn(isDigitEntityEnd);\n if (this._peek != $SEMICOLON) {\n throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan());\n }\n this._advance();\n var /** @type {?} */ strNum = this._input.substring(numberStart, this._index - 1);\n try {\n var /** @type {?} */ charCode = parseInt(strNum, isHex ? 16 : 10);\n return String.fromCharCode(charCode);\n }\n catch (e) {\n var /** @type {?} */ entity = this._input.substring(start.offset + 1, this._index - 1);\n throw this._createError(_unknownEntityErrorMsg(entity), this._getSpan(start));\n }\n }\n else {\n var /** @type {?} */ startPosition = this._savePosition();\n this._attemptCharCodeUntilFn(isNamedEntityEnd);\n if (this._peek != $SEMICOLON) {\n this._restorePosition(startPosition);\n return '&';\n }\n this._advance();\n var /** @type {?} */ name_1 = this._input.substring(start.offset + 1, this._index - 1);\n var /** @type {?} */ char = NAMED_ENTITIES[name_1];\n if (!char) {\n throw this._createError(_unknownEntityErrorMsg(name_1), this._getSpan(start));\n }\n return char;\n }\n };\n /**\n * @param {?} decodeEntities\n * @param {?} firstCharOfEnd\n * @param {?} attemptEndRest\n * @return {?}\n */\n _Tokenizer.prototype._consumeRawText = function (decodeEntities, firstCharOfEnd, attemptEndRest) {\n var /** @type {?} */ tagCloseStart;\n var /** @type {?} */ textStart = this._getLocation();\n this._beginToken(decodeEntities ? TokenType$1.ESCAPABLE_RAW_TEXT : TokenType$1.RAW_TEXT, textStart);\n var /** @type {?} */ parts = [];\n while (true) {\n tagCloseStart = this._getLocation();\n if (this._attemptCharCode(firstCharOfEnd) && attemptEndRest()) {\n break;\n }\n if (this._index > tagCloseStart.offset) {\n // add the characters consumed by the previous if statement to the output\n parts.push(this._input.substring(tagCloseStart.offset, this._index));\n }\n while (this._peek !== firstCharOfEnd) {\n parts.push(this._readChar(decodeEntities));\n }\n }\n return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeComment = function (start) {\n var _this = this;\n this._beginToken(TokenType$1.COMMENT_START, start);\n this._requireCharCode($MINUS);\n this._endToken([]);\n var /** @type {?} */ textToken = this._consumeRawText(false, $MINUS, function () { return _this._attemptStr('->'); });\n this._beginToken(TokenType$1.COMMENT_END, textToken.sourceSpan.end);\n this._endToken([]);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeCdata = function (start) {\n var _this = this;\n this._beginToken(TokenType$1.CDATA_START, start);\n this._requireStr('CDATA[');\n this._endToken([]);\n var /** @type {?} */ textToken = this._consumeRawText(false, $RBRACKET, function () { return _this._attemptStr(']>'); });\n this._beginToken(TokenType$1.CDATA_END, textToken.sourceSpan.end);\n this._endToken([]);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeDocType = function (start) {\n this._beginToken(TokenType$1.DOC_TYPE, start);\n this._attemptUntilChar($GT);\n this._advance();\n this._endToken([this._input.substring(start.offset + 2, this._index - 1)]);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumePrefixAndName = function () {\n var /** @type {?} */ nameOrPrefixStart = this._index;\n var /** @type {?} */ prefix = null;\n while (this._peek !== $COLON && !isPrefixEnd(this._peek)) {\n this._advance();\n }\n var /** @type {?} */ nameStart;\n if (this._peek === $COLON) {\n this._advance();\n prefix = this._input.substring(nameOrPrefixStart, this._index - 1);\n nameStart = this._index;\n }\n else {\n nameStart = nameOrPrefixStart;\n }\n this._requireCharCodeUntilFn(isNameEnd, this._index === nameStart ? 1 : 0);\n var /** @type {?} */ name = this._input.substring(nameStart, this._index);\n return [prefix, name];\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeTagOpen = function (start) {\n var /** @type {?} */ savedPos = this._savePosition();\n var /** @type {?} */ tagName;\n var /** @type {?} */ lowercaseTagName;\n try {\n if (!isAsciiLetter(this._peek)) {\n throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan());\n }\n var /** @type {?} */ nameStart = this._index;\n this._consumeTagOpenStart(start);\n tagName = this._input.substring(nameStart, this._index);\n lowercaseTagName = tagName.toLowerCase();\n this._attemptCharCodeUntilFn(isNotWhitespace);\n while (this._peek !== $SLASH && this._peek !== $GT) {\n this._consumeAttributeName();\n this._attemptCharCodeUntilFn(isNotWhitespace);\n if (this._attemptCharCode($EQ)) {\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._consumeAttributeValue();\n }\n this._attemptCharCodeUntilFn(isNotWhitespace);\n }\n this._consumeTagOpenEnd();\n }\n catch (e) {\n if (e instanceof _ControlFlowError) {\n // When the start tag is invalid, assume we want a \"<\"\n this._restorePosition(savedPos);\n // Back to back text tokens are merged at the end\n this._beginToken(TokenType$1.TEXT, start);\n this._endToken(['<']);\n return;\n }\n throw e;\n }\n var /** @type {?} */ contentTokenType = this._getTagDefinition(tagName).contentType;\n if (contentTokenType === TagContentType.RAW_TEXT) {\n this._consumeRawTextWithTagClose(lowercaseTagName, false);\n }\n else if (contentTokenType === TagContentType.ESCAPABLE_RAW_TEXT) {\n this._consumeRawTextWithTagClose(lowercaseTagName, true);\n }\n };\n /**\n * @param {?} lowercaseTagName\n * @param {?} decodeEntities\n * @return {?}\n */\n _Tokenizer.prototype._consumeRawTextWithTagClose = function (lowercaseTagName, decodeEntities) {\n var _this = this;\n var /** @type {?} */ textToken = this._consumeRawText(decodeEntities, $LT, function () {\n if (!_this._attemptCharCode($SLASH))\n return false;\n _this._attemptCharCodeUntilFn(isNotWhitespace);\n if (!_this._attemptStrCaseInsensitive(lowercaseTagName))\n return false;\n _this._attemptCharCodeUntilFn(isNotWhitespace);\n return _this._attemptCharCode($GT);\n });\n this._beginToken(TokenType$1.TAG_CLOSE, textToken.sourceSpan.end);\n this._endToken([null, lowercaseTagName]);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeTagOpenStart = function (start) {\n this._beginToken(TokenType$1.TAG_OPEN_START, start);\n var /** @type {?} */ parts = this._consumePrefixAndName();\n this._endToken(parts);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeAttributeName = function () {\n this._beginToken(TokenType$1.ATTR_NAME);\n var /** @type {?} */ prefixAndName = this._consumePrefixAndName();\n this._endToken(prefixAndName);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeAttributeValue = function () {\n this._beginToken(TokenType$1.ATTR_VALUE);\n var /** @type {?} */ value;\n if (this._peek === $SQ || this._peek === $DQ) {\n var /** @type {?} */ quoteChar = this._peek;\n this._advance();\n var /** @type {?} */ parts = [];\n while (this._peek !== quoteChar) {\n parts.push(this._readChar(true));\n }\n value = parts.join('');\n this._advance();\n }\n else {\n var /** @type {?} */ valueStart = this._index;\n this._requireCharCodeUntilFn(isNameEnd, 1);\n value = this._input.substring(valueStart, this._index);\n }\n this._endToken([this._processCarriageReturns(value)]);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeTagOpenEnd = function () {\n var /** @type {?} */ tokenType = this._attemptCharCode($SLASH) ? TokenType$1.TAG_OPEN_END_VOID : TokenType$1.TAG_OPEN_END;\n this._beginToken(tokenType);\n this._requireCharCode($GT);\n this._endToken([]);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _Tokenizer.prototype._consumeTagClose = function (start) {\n this._beginToken(TokenType$1.TAG_CLOSE, start);\n this._attemptCharCodeUntilFn(isNotWhitespace);\n var /** @type {?} */ prefixAndName = this._consumePrefixAndName();\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._requireCharCode($GT);\n this._endToken(prefixAndName);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeExpansionFormStart = function () {\n this._beginToken(TokenType$1.EXPANSION_FORM_START, this._getLocation());\n this._requireCharCode($LBRACE);\n this._endToken([]);\n this._expansionCaseStack.push(TokenType$1.EXPANSION_FORM_START);\n this._beginToken(TokenType$1.RAW_TEXT, this._getLocation());\n var /** @type {?} */ condition = this._readUntil($COMMA);\n this._endToken([condition], this._getLocation());\n this._requireCharCode($COMMA);\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._beginToken(TokenType$1.RAW_TEXT, this._getLocation());\n var /** @type {?} */ type = this._readUntil($COMMA);\n this._endToken([type], this._getLocation());\n this._requireCharCode($COMMA);\n this._attemptCharCodeUntilFn(isNotWhitespace);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeExpansionCaseStart = function () {\n this._beginToken(TokenType$1.EXPANSION_CASE_VALUE, this._getLocation());\n var /** @type {?} */ value = this._readUntil($LBRACE).trim();\n this._endToken([value], this._getLocation());\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._beginToken(TokenType$1.EXPANSION_CASE_EXP_START, this._getLocation());\n this._requireCharCode($LBRACE);\n this._endToken([], this._getLocation());\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._expansionCaseStack.push(TokenType$1.EXPANSION_CASE_EXP_START);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeExpansionCaseEnd = function () {\n this._beginToken(TokenType$1.EXPANSION_CASE_EXP_END, this._getLocation());\n this._requireCharCode($RBRACE);\n this._endToken([], this._getLocation());\n this._attemptCharCodeUntilFn(isNotWhitespace);\n this._expansionCaseStack.pop();\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeExpansionFormEnd = function () {\n this._beginToken(TokenType$1.EXPANSION_FORM_END, this._getLocation());\n this._requireCharCode($RBRACE);\n this._endToken([]);\n this._expansionCaseStack.pop();\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._consumeText = function () {\n var /** @type {?} */ start = this._getLocation();\n this._beginToken(TokenType$1.TEXT, start);\n var /** @type {?} */ parts = [];\n do {\n if (this._interpolationConfig && this._attemptStr(this._interpolationConfig.start)) {\n parts.push(this._interpolationConfig.start);\n this._inInterpolation = true;\n }\n else if (this._interpolationConfig && this._inInterpolation &&\n this._attemptStr(this._interpolationConfig.end)) {\n parts.push(this._interpolationConfig.end);\n this._inInterpolation = false;\n }\n else {\n parts.push(this._readChar(true));\n }\n } while (!this._isTextEnd());\n this._endToken([this._processCarriageReturns(parts.join(''))]);\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._isTextEnd = function () {\n if (this._peek === $LT || this._peek === $EOF) {\n return true;\n }\n if (this._tokenizeIcu && !this._inInterpolation) {\n if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) {\n // start of an expansion form\n return true;\n }\n if (this._peek === $RBRACE && this._isInExpansionCase()) {\n // end of and expansion case\n return true;\n }\n }\n return false;\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._savePosition = function () {\n return [this._peek, this._index, this._column, this._line, this.tokens.length];\n };\n /**\n * @param {?} char\n * @return {?}\n */\n _Tokenizer.prototype._readUntil = function (char) {\n var /** @type {?} */ start = this._index;\n this._attemptUntilChar(char);\n return this._input.substring(start, this._index);\n };\n /**\n * @param {?} position\n * @return {?}\n */\n _Tokenizer.prototype._restorePosition = function (position) {\n this._peek = position[0];\n this._index = position[1];\n this._column = position[2];\n this._line = position[3];\n var /** @type {?} */ nbTokens = position[4];\n if (nbTokens < this.tokens.length) {\n // remove any extra tokens\n this.tokens = this.tokens.slice(0, nbTokens);\n }\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._isInExpansionCase = function () {\n return this._expansionCaseStack.length > 0 &&\n this._expansionCaseStack[this._expansionCaseStack.length - 1] ===\n TokenType$1.EXPANSION_CASE_EXP_START;\n };\n /**\n * @return {?}\n */\n _Tokenizer.prototype._isInExpansionForm = function () {\n return this._expansionCaseStack.length > 0 &&\n this._expansionCaseStack[this._expansionCaseStack.length - 1] ===\n TokenType$1.EXPANSION_FORM_START;\n };\n return _Tokenizer;\n }());\n /**\n * @param {?} code\n * @return {?}\n */\n function isNotWhitespace(code) {\n return !isWhitespace(code) || code === $EOF;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isNameEnd(code) {\n return isWhitespace(code) || code === $GT || code === $SLASH ||\n code === $SQ || code === $DQ || code === $EQ;\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isPrefixEnd(code) {\n return (code < $a || $z < code) && (code < $A || $Z < code) &&\n (code < $0 || code > $9);\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isDigitEntityEnd(code) {\n return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function isNamedEntityEnd(code) {\n return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);\n }\n /**\n * @param {?} input\n * @param {?} offset\n * @param {?} interpolationConfig\n * @return {?}\n */\n function isExpansionFormStart(input, offset, interpolationConfig) {\n var /** @type {?} */ isInterpolationStart = interpolationConfig ? input.indexOf(interpolationConfig.start, offset) == offset : false;\n return input.charCodeAt(offset) == $LBRACE && !isInterpolationStart;\n }\n /**\n * @param {?} peek\n * @return {?}\n */\n function isExpansionCaseStart(peek) {\n return peek === $EQ || isAsciiLetter(peek);\n }\n /**\n * @param {?} code1\n * @param {?} code2\n * @return {?}\n */\n function compareCharCodeCaseInsensitive(code1, code2) {\n return toUpperCaseCharCode(code1) == toUpperCaseCharCode(code2);\n }\n /**\n * @param {?} code\n * @return {?}\n */\n function toUpperCaseCharCode(code) {\n return code >= $a && code <= $z ? code - $a + $A : code;\n }\n /**\n * @param {?} srcTokens\n * @return {?}\n */\n function mergeTextTokens(srcTokens) {\n var /** @type {?} */ dstTokens = [];\n var /** @type {?} */ lastDstToken;\n for (var /** @type {?} */ i = 0; i < srcTokens.length; i++) {\n var /** @type {?} */ token = srcTokens[i];\n if (lastDstToken && lastDstToken.type == TokenType$1.TEXT && token.type == TokenType$1.TEXT) {\n lastDstToken.parts[0] += token.parts[0];\n lastDstToken.sourceSpan.end = token.sourceSpan.end;\n }\n else {\n lastDstToken = token;\n dstTokens.push(lastDstToken);\n }\n }\n return dstTokens;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$5 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var TreeError = (function (_super) {\n __extends$5(TreeError, _super);\n /**\n * @param {?} elementName\n * @param {?} span\n * @param {?} msg\n */\n function TreeError(elementName, span, msg) {\n _super.call(this, span, msg);\n this.elementName = elementName;\n }\n /**\n * @param {?} elementName\n * @param {?} span\n * @param {?} msg\n * @return {?}\n */\n TreeError.create = function (elementName, span, msg) {\n return new TreeError(elementName, span, msg);\n };\n return TreeError;\n }(ParseError));\n var ParseTreeResult = (function () {\n /**\n * @param {?} rootNodes\n * @param {?} errors\n */\n function ParseTreeResult(rootNodes, errors) {\n this.rootNodes = rootNodes;\n this.errors = errors;\n }\n return ParseTreeResult;\n }());\n var Parser$1 = (function () {\n /**\n * @param {?} getTagDefinition\n */\n function Parser(getTagDefinition) {\n this.getTagDefinition = getTagDefinition;\n }\n /**\n * @param {?} source\n * @param {?} url\n * @param {?=} parseExpansionForms\n * @param {?=} interpolationConfig\n * @return {?}\n */\n Parser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ tokensAndErrors = tokenize(source, url, this.getTagDefinition, parseExpansionForms, interpolationConfig);\n var /** @type {?} */ treeAndErrors = new _TreeBuilder(tokensAndErrors.tokens, this.getTagDefinition).build();\n return new ParseTreeResult(treeAndErrors.rootNodes, ((tokensAndErrors.errors)).concat(treeAndErrors.errors));\n };\n return Parser;\n }());\n var _TreeBuilder = (function () {\n /**\n * @param {?} tokens\n * @param {?} getTagDefinition\n */\n function _TreeBuilder(tokens, getTagDefinition) {\n this.tokens = tokens;\n this.getTagDefinition = getTagDefinition;\n this._index = -1;\n this._rootNodes = [];\n this._errors = [];\n this._elementStack = [];\n this._advance();\n }\n /**\n * @return {?}\n */\n _TreeBuilder.prototype.build = function () {\n while (this._peek.type !== TokenType$1.EOF) {\n if (this._peek.type === TokenType$1.TAG_OPEN_START) {\n this._consumeStartTag(this._advance());\n }\n else if (this._peek.type === TokenType$1.TAG_CLOSE) {\n this._consumeEndTag(this._advance());\n }\n else if (this._peek.type === TokenType$1.CDATA_START) {\n this._closeVoidElement();\n this._consumeCdata(this._advance());\n }\n else if (this._peek.type === TokenType$1.COMMENT_START) {\n this._closeVoidElement();\n this._consumeComment(this._advance());\n }\n else if (this._peek.type === TokenType$1.TEXT || this._peek.type === TokenType$1.RAW_TEXT ||\n this._peek.type === TokenType$1.ESCAPABLE_RAW_TEXT) {\n this._closeVoidElement();\n this._consumeText(this._advance());\n }\n else if (this._peek.type === TokenType$1.EXPANSION_FORM_START) {\n this._consumeExpansion(this._advance());\n }\n else {\n // Skip all other tokens...\n this._advance();\n }\n }\n return new ParseTreeResult(this._rootNodes, this._errors);\n };\n /**\n * @return {?}\n */\n _TreeBuilder.prototype._advance = function () {\n var /** @type {?} */ prev = this._peek;\n if (this._index < this.tokens.length - 1) {\n // Note: there is always an EOF token at the end\n this._index++;\n }\n this._peek = this.tokens[this._index];\n return prev;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n _TreeBuilder.prototype._advanceIf = function (type) {\n if (this._peek.type === type) {\n return this._advance();\n }\n return null;\n };\n /**\n * @param {?} startToken\n * @return {?}\n */\n _TreeBuilder.prototype._consumeCdata = function (startToken) {\n this._consumeText(this._advance());\n this._advanceIf(TokenType$1.CDATA_END);\n };\n /**\n * @param {?} token\n * @return {?}\n */\n _TreeBuilder.prototype._consumeComment = function (token) {\n var /** @type {?} */ text = this._advanceIf(TokenType$1.RAW_TEXT);\n this._advanceIf(TokenType$1.COMMENT_END);\n var /** @type {?} */ value = isPresent(text) ? text.parts[0].trim() : null;\n this._addToParent(new Comment(value, token.sourceSpan));\n };\n /**\n * @param {?} token\n * @return {?}\n */\n _TreeBuilder.prototype._consumeExpansion = function (token) {\n var /** @type {?} */ switchValue = this._advance();\n var /** @type {?} */ type = this._advance();\n var /** @type {?} */ cases = [];\n // read =\n while (this._peek.type === TokenType$1.EXPANSION_CASE_VALUE) {\n var /** @type {?} */ expCase = this._parseExpansionCase();\n if (!expCase)\n return; // error\n cases.push(expCase);\n }\n // read the final }\n if (this._peek.type !== TokenType$1.EXPANSION_FORM_END) {\n this._errors.push(TreeError.create(null, this._peek.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n return;\n }\n var /** @type {?} */ sourceSpan = new ParseSourceSpan(token.sourceSpan.start, this._peek.sourceSpan.end);\n this._addToParent(new Expansion(switchValue.parts[0], type.parts[0], cases, sourceSpan, switchValue.sourceSpan));\n this._advance();\n };\n /**\n * @return {?}\n */\n _TreeBuilder.prototype._parseExpansionCase = function () {\n var /** @type {?} */ value = this._advance();\n // read {\n if (this._peek.type !== TokenType$1.EXPANSION_CASE_EXP_START) {\n this._errors.push(TreeError.create(null, this._peek.sourceSpan, \"Invalid ICU message. Missing '{'.\"));\n return null;\n }\n // read until }\n var /** @type {?} */ start = this._advance();\n var /** @type {?} */ exp = this._collectExpansionExpTokens(start);\n if (!exp)\n return null;\n var /** @type {?} */ end = this._advance();\n exp.push(new Token$1(TokenType$1.EOF, [], end.sourceSpan));\n // parse everything in between { and }\n var /** @type {?} */ parsedExp = new _TreeBuilder(exp, this.getTagDefinition).build();\n if (parsedExp.errors.length > 0) {\n this._errors = this._errors.concat(/** @type {?} */ (parsedExp.errors));\n return null;\n }\n var /** @type {?} */ sourceSpan = new ParseSourceSpan(value.sourceSpan.start, end.sourceSpan.end);\n var /** @type {?} */ expSourceSpan = new ParseSourceSpan(start.sourceSpan.start, end.sourceSpan.end);\n return new ExpansionCase(value.parts[0], parsedExp.rootNodes, sourceSpan, value.sourceSpan, expSourceSpan);\n };\n /**\n * @param {?} start\n * @return {?}\n */\n _TreeBuilder.prototype._collectExpansionExpTokens = function (start) {\n var /** @type {?} */ exp = [];\n var /** @type {?} */ expansionFormStack = [TokenType$1.EXPANSION_CASE_EXP_START];\n while (true) {\n if (this._peek.type === TokenType$1.EXPANSION_FORM_START ||\n this._peek.type === TokenType$1.EXPANSION_CASE_EXP_START) {\n expansionFormStack.push(this._peek.type);\n }\n if (this._peek.type === TokenType$1.EXPANSION_CASE_EXP_END) {\n if (lastOnStack(expansionFormStack, TokenType$1.EXPANSION_CASE_EXP_START)) {\n expansionFormStack.pop();\n if (expansionFormStack.length == 0)\n return exp;\n }\n else {\n this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n return null;\n }\n }\n if (this._peek.type === TokenType$1.EXPANSION_FORM_END) {\n if (lastOnStack(expansionFormStack, TokenType$1.EXPANSION_FORM_START)) {\n expansionFormStack.pop();\n }\n else {\n this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n return null;\n }\n }\n if (this._peek.type === TokenType$1.EOF) {\n this._errors.push(TreeError.create(null, start.sourceSpan, \"Invalid ICU message. Missing '}'.\"));\n return null;\n }\n exp.push(this._advance());\n }\n };\n /**\n * @param {?} token\n * @return {?}\n */\n _TreeBuilder.prototype._consumeText = function (token) {\n var /** @type {?} */ text = token.parts[0];\n if (text.length > 0 && text[0] == '\\n') {\n var /** @type {?} */ parent_1 = this._getParentElement();\n if (isPresent(parent_1) && parent_1.children.length == 0 &&\n this.getTagDefinition(parent_1.name).ignoreFirstLf) {\n text = text.substring(1);\n }\n }\n if (text.length > 0) {\n this._addToParent(new Text(text, token.sourceSpan));\n }\n };\n /**\n * @return {?}\n */\n _TreeBuilder.prototype._closeVoidElement = function () {\n if (this._elementStack.length > 0) {\n var /** @type {?} */ el = this._elementStack[this._elementStack.length - 1];\n if (this.getTagDefinition(el.name).isVoid) {\n this._elementStack.pop();\n }\n }\n };\n /**\n * @param {?} startTagToken\n * @return {?}\n */\n _TreeBuilder.prototype._consumeStartTag = function (startTagToken) {\n var /** @type {?} */ prefix = startTagToken.parts[0];\n var /** @type {?} */ name = startTagToken.parts[1];\n var /** @type {?} */ attrs = [];\n while (this._peek.type === TokenType$1.ATTR_NAME) {\n attrs.push(this._consumeAttr(this._advance()));\n }\n var /** @type {?} */ fullName = this._getElementFullName(prefix, name, this._getParentElement());\n var /** @type {?} */ selfClosing = false;\n // Note: There could have been a tokenizer error\n // so that we don't get a token for the end tag...\n if (this._peek.type === TokenType$1.TAG_OPEN_END_VOID) {\n this._advance();\n selfClosing = true;\n var /** @type {?} */ tagDef = this.getTagDefinition(fullName);\n if (!(tagDef.canSelfClose || getNsPrefix(fullName) !== null || tagDef.isVoid)) {\n this._errors.push(TreeError.create(fullName, startTagToken.sourceSpan, \"Only void and foreign elements can be self closed \\\"\" + startTagToken.parts[1] + \"\\\"\"));\n }\n }\n else if (this._peek.type === TokenType$1.TAG_OPEN_END) {\n this._advance();\n selfClosing = false;\n }\n var /** @type {?} */ end = this._peek.sourceSpan.start;\n var /** @type {?} */ span = new ParseSourceSpan(startTagToken.sourceSpan.start, end);\n var /** @type {?} */ el = new Element(fullName, attrs, [], span, span, null);\n this._pushElement(el);\n if (selfClosing) {\n this._popElement(fullName);\n el.endSourceSpan = span;\n }\n };\n /**\n * @param {?} el\n * @return {?}\n */\n _TreeBuilder.prototype._pushElement = function (el) {\n if (this._elementStack.length > 0) {\n var /** @type {?} */ parentEl = this._elementStack[this._elementStack.length - 1];\n if (this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) {\n this._elementStack.pop();\n }\n }\n var /** @type {?} */ tagDef = this.getTagDefinition(el.name);\n var _a = this._getParentElementSkippingContainers(), parent = _a.parent, container = _a.container;\n if (isPresent(parent) && tagDef.requireExtraParent(parent.name)) {\n var /** @type {?} */ newParent = new Element(tagDef.parentToAdd, [], [], el.sourceSpan, el.startSourceSpan, el.endSourceSpan);\n this._insertBeforeContainer(parent, container, newParent);\n }\n this._addToParent(el);\n this._elementStack.push(el);\n };\n /**\n * @param {?} endTagToken\n * @return {?}\n */\n _TreeBuilder.prototype._consumeEndTag = function (endTagToken) {\n var /** @type {?} */ fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());\n if (this._getParentElement()) {\n this._getParentElement().endSourceSpan = endTagToken.sourceSpan;\n }\n if (this.getTagDefinition(fullName).isVoid) {\n this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, \"Void elements do not have end tags \\\"\" + endTagToken.parts[1] + \"\\\"\"));\n }\n else if (!this._popElement(fullName)) {\n this._errors.push(TreeError.create(fullName, endTagToken.sourceSpan, \"Unexpected closing tag \\\"\" + endTagToken.parts[1] + \"\\\"\"));\n }\n };\n /**\n * @param {?} fullName\n * @return {?}\n */\n _TreeBuilder.prototype._popElement = function (fullName) {\n for (var /** @type {?} */ stackIndex = this._elementStack.length - 1; stackIndex >= 0; stackIndex--) {\n var /** @type {?} */ el = this._elementStack[stackIndex];\n if (el.name == fullName) {\n this._elementStack.splice(stackIndex, this._elementStack.length - stackIndex);\n return true;\n }\n if (!this.getTagDefinition(el.name).closedByParent) {\n return false;\n }\n }\n return false;\n };\n /**\n * @param {?} attrName\n * @return {?}\n */\n _TreeBuilder.prototype._consumeAttr = function (attrName) {\n var /** @type {?} */ fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);\n var /** @type {?} */ end = attrName.sourceSpan.end;\n var /** @type {?} */ value = '';\n var /** @type {?} */ valueSpan;\n if (this._peek.type === TokenType$1.ATTR_VALUE) {\n var /** @type {?} */ valueToken = this._advance();\n value = valueToken.parts[0];\n end = valueToken.sourceSpan.end;\n valueSpan = valueToken.sourceSpan;\n }\n return new Attribute$1(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, end), valueSpan);\n };\n /**\n * @return {?}\n */\n _TreeBuilder.prototype._getParentElement = function () {\n return this._elementStack.length > 0 ? this._elementStack[this._elementStack.length - 1] : null;\n };\n /**\n * Returns the parent in the DOM and the container.\n * *\n * `<ng-container>` elements are skipped as they are not rendered as DOM element.\n * @return {?}\n */\n _TreeBuilder.prototype._getParentElementSkippingContainers = function () {\n var /** @type {?} */ container = null;\n for (var /** @type {?} */ i = this._elementStack.length - 1; i >= 0; i--) {\n if (this._elementStack[i].name !== 'ng-container') {\n return { parent: this._elementStack[i], container: container };\n }\n container = this._elementStack[i];\n }\n return { parent: this._elementStack[this._elementStack.length - 1], container: container };\n };\n /**\n * @param {?} node\n * @return {?}\n */\n _TreeBuilder.prototype._addToParent = function (node) {\n var /** @type {?} */ parent = this._getParentElement();\n if (isPresent(parent)) {\n parent.children.push(node);\n }\n else {\n this._rootNodes.push(node);\n }\n };\n /**\n * Insert a node between the parent and the container.\n * When no container is given, the node is appended as a child of the parent.\n * Also updates the element stack accordingly.\n * *\n * @param {?} parent\n * @param {?} container\n * @param {?} node\n * @return {?}\n */\n _TreeBuilder.prototype._insertBeforeContainer = function (parent, container, node) {\n if (!container) {\n this._addToParent(node);\n this._elementStack.push(node);\n }\n else {\n if (parent) {\n // replace the container with the new node in the children\n var /** @type {?} */ index = parent.children.indexOf(container);\n parent.children[index] = node;\n }\n else {\n this._rootNodes.push(node);\n }\n node.children.push(container);\n this._elementStack.splice(this._elementStack.indexOf(container), 0, node);\n }\n };\n /**\n * @param {?} prefix\n * @param {?} localName\n * @param {?} parentElement\n * @return {?}\n */\n _TreeBuilder.prototype._getElementFullName = function (prefix, localName, parentElement) {\n if (isBlank(prefix)) {\n prefix = this.getTagDefinition(localName).implicitNamespacePrefix;\n if (isBlank(prefix) && isPresent(parentElement)) {\n prefix = getNsPrefix(parentElement.name);\n }\n }\n return mergeNsAndName(prefix, localName);\n };\n return _TreeBuilder;\n }());\n /**\n * @param {?} stack\n * @param {?} element\n * @return {?}\n */\n function lastOnStack(stack, element) {\n return stack.length > 0 && stack[stack.length - 1] === element;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var Message = (function () {\n /**\n * @param {?} nodes message AST\n * @param {?} placeholders maps placeholder names to static content\n * @param {?} placeholderToMessage maps placeholder names to messages (used for nested ICU messages)\n * @param {?} meaning\n * @param {?} description\n */\n function Message(nodes, placeholders, placeholderToMessage, meaning, description) {\n this.nodes = nodes;\n this.placeholders = placeholders;\n this.placeholderToMessage = placeholderToMessage;\n this.meaning = meaning;\n this.description = description;\n }\n return Message;\n }());\n var Text$1 = (function () {\n /**\n * @param {?} value\n * @param {?} sourceSpan\n */\n function Text(value, sourceSpan) {\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Text.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };\n return Text;\n }());\n // TODO(vicb): do we really need this node (vs an array) ?\n var Container = (function () {\n /**\n * @param {?} children\n * @param {?} sourceSpan\n */\n function Container(children, sourceSpan) {\n this.children = children;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Container.prototype.visit = function (visitor, context) { return visitor.visitContainer(this, context); };\n return Container;\n }());\n var Icu = (function () {\n /**\n * @param {?} expression\n * @param {?} type\n * @param {?} cases\n * @param {?} sourceSpan\n */\n function Icu(expression, type, cases, sourceSpan) {\n this.expression = expression;\n this.type = type;\n this.cases = cases;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Icu.prototype.visit = function (visitor, context) { return visitor.visitIcu(this, context); };\n return Icu;\n }());\n var TagPlaceholder = (function () {\n /**\n * @param {?} tag\n * @param {?} attrs\n * @param {?} startName\n * @param {?} closeName\n * @param {?} children\n * @param {?} isVoid\n * @param {?} sourceSpan\n */\n function TagPlaceholder(tag, attrs, startName, closeName, children, isVoid, sourceSpan) {\n this.tag = tag;\n this.attrs = attrs;\n this.startName = startName;\n this.closeName = closeName;\n this.children = children;\n this.isVoid = isVoid;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n TagPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitTagPlaceholder(this, context); };\n return TagPlaceholder;\n }());\n var Placeholder = (function () {\n /**\n * @param {?} value\n * @param {?} name\n * @param {?} sourceSpan\n */\n function Placeholder(value, name, sourceSpan) {\n this.value = value;\n this.name = name;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n Placeholder.prototype.visit = function (visitor, context) { return visitor.visitPlaceholder(this, context); };\n return Placeholder;\n }());\n var IcuPlaceholder = (function () {\n /**\n * @param {?} value\n * @param {?} name\n * @param {?} sourceSpan\n */\n function IcuPlaceholder(value, name, sourceSpan) {\n this.value = value;\n this.name = name;\n this.sourceSpan = sourceSpan;\n }\n /**\n * @param {?} visitor\n * @param {?=} context\n * @return {?}\n */\n IcuPlaceholder.prototype.visit = function (visitor, context) { return visitor.visitIcuPlaceholder(this, context); };\n return IcuPlaceholder;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ TAG_TO_PLACEHOLDER_NAMES = {\n 'A': 'LINK',\n 'B': 'BOLD_TEXT',\n 'BR': 'LINE_BREAK',\n 'EM': 'EMPHASISED_TEXT',\n 'H1': 'HEADING_LEVEL1',\n 'H2': 'HEADING_LEVEL2',\n 'H3': 'HEADING_LEVEL3',\n 'H4': 'HEADING_LEVEL4',\n 'H5': 'HEADING_LEVEL5',\n 'H6': 'HEADING_LEVEL6',\n 'HR': 'HORIZONTAL_RULE',\n 'I': 'ITALIC_TEXT',\n 'LI': 'LIST_ITEM',\n 'LINK': 'MEDIA_LINK',\n 'OL': 'ORDERED_LIST',\n 'P': 'PARAGRAPH',\n 'Q': 'QUOTATION',\n 'S': 'STRIKETHROUGH_TEXT',\n 'SMALL': 'SMALL_TEXT',\n 'SUB': 'SUBSTRIPT',\n 'SUP': 'SUPERSCRIPT',\n 'TBODY': 'TABLE_BODY',\n 'TD': 'TABLE_CELL',\n 'TFOOT': 'TABLE_FOOTER',\n 'TH': 'TABLE_HEADER_CELL',\n 'THEAD': 'TABLE_HEADER',\n 'TR': 'TABLE_ROW',\n 'TT': 'MONOSPACED_TEXT',\n 'U': 'UNDERLINED_TEXT',\n 'UL': 'UNORDERED_LIST',\n };\n /**\n * Creates unique names for placeholder with different content.\n * *\n * Returns the same placeholder name when the content is identical.\n * *\n */\n var PlaceholderRegistry = (function () {\n function PlaceholderRegistry() {\n this._placeHolderNameCounts = {};\n this._signatureToName = {};\n }\n /**\n * @param {?} tag\n * @param {?} attrs\n * @param {?} isVoid\n * @return {?}\n */\n PlaceholderRegistry.prototype.getStartTagPlaceholderName = function (tag, attrs, isVoid) {\n var /** @type {?} */ signature = this._hashTag(tag, attrs, isVoid);\n if (this._signatureToName[signature]) {\n return this._signatureToName[signature];\n }\n var /** @type {?} */ upperTag = tag.toUpperCase();\n var /** @type {?} */ baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || \"TAG_\" + upperTag;\n var /** @type {?} */ name = this._generateUniqueName(isVoid ? baseName : \"START_\" + baseName);\n this._signatureToName[signature] = name;\n return name;\n };\n /**\n * @param {?} tag\n * @return {?}\n */\n PlaceholderRegistry.prototype.getCloseTagPlaceholderName = function (tag) {\n var /** @type {?} */ signature = this._hashClosingTag(tag);\n if (this._signatureToName[signature]) {\n return this._signatureToName[signature];\n }\n var /** @type {?} */ upperTag = tag.toUpperCase();\n var /** @type {?} */ baseName = TAG_TO_PLACEHOLDER_NAMES[upperTag] || \"TAG_\" + upperTag;\n var /** @type {?} */ name = this._generateUniqueName(\"CLOSE_\" + baseName);\n this._signatureToName[signature] = name;\n return name;\n };\n /**\n * @param {?} name\n * @param {?} content\n * @return {?}\n */\n PlaceholderRegistry.prototype.getPlaceholderName = function (name, content) {\n var /** @type {?} */ upperName = name.toUpperCase();\n var /** @type {?} */ signature = \"PH: \" + upperName + \"=\" + content;\n if (this._signatureToName[signature]) {\n return this._signatureToName[signature];\n }\n var /** @type {?} */ uniqueName = this._generateUniqueName(upperName);\n this._signatureToName[signature] = uniqueName;\n return uniqueName;\n };\n /**\n * @param {?} name\n * @return {?}\n */\n PlaceholderRegistry.prototype.getUniquePlaceholder = function (name) {\n return this._generateUniqueName(name.toUpperCase());\n };\n /**\n * @param {?} tag\n * @param {?} attrs\n * @param {?} isVoid\n * @return {?}\n */\n PlaceholderRegistry.prototype._hashTag = function (tag, attrs, isVoid) {\n var /** @type {?} */ start = \"<\" + tag;\n var /** @type {?} */ strAttrs = Object.keys(attrs).sort().map(function (name) { return (\" \" + name + \"=\" + attrs[name]); }).join('');\n var /** @type {?} */ end = isVoid ? '/>' : \"></\" + tag + \">\";\n return start + strAttrs + end;\n };\n /**\n * @param {?} tag\n * @return {?}\n */\n PlaceholderRegistry.prototype._hashClosingTag = function (tag) { return this._hashTag(\"/\" + tag, {}, false); };\n /**\n * @param {?} base\n * @return {?}\n */\n PlaceholderRegistry.prototype._generateUniqueName = function (base) {\n var /** @type {?} */ next = this._placeHolderNameCounts[base];\n this._placeHolderNameCounts[base] = next ? next + 1 : 1;\n return next ? base + \"_\" + next : base;\n };\n return PlaceholderRegistry;\n }());\n\n var /** @type {?} */ _expParser = new Parser(new Lexer());\n /**\n * Returns a function converting html nodes to an i18n Message given an interpolationConfig\n * @param {?} interpolationConfig\n * @return {?}\n */\n function createI18nMessageFactory(interpolationConfig) {\n var /** @type {?} */ visitor = new _I18nVisitor(_expParser, interpolationConfig);\n return function (nodes, meaning, description) {\n return visitor.toI18nMessage(nodes, meaning, description);\n };\n }\n var _I18nVisitor = (function () {\n /**\n * @param {?} _expressionParser\n * @param {?} _interpolationConfig\n */\n function _I18nVisitor(_expressionParser, _interpolationConfig) {\n this._expressionParser = _expressionParser;\n this._interpolationConfig = _interpolationConfig;\n }\n /**\n * @param {?} nodes\n * @param {?} meaning\n * @param {?} description\n * @return {?}\n */\n _I18nVisitor.prototype.toI18nMessage = function (nodes, meaning, description) {\n this._isIcu = nodes.length == 1 && nodes[0] instanceof Expansion;\n this._icuDepth = 0;\n this._placeholderRegistry = new PlaceholderRegistry();\n this._placeholderToContent = {};\n this._placeholderToMessage = {};\n var /** @type {?} */ i18nodes = visitAll(this, nodes, {});\n return new Message(i18nodes, this._placeholderToContent, this._placeholderToMessage, meaning, description);\n };\n /**\n * @param {?} el\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitElement = function (el, context) {\n var /** @type {?} */ children = visitAll(this, el.children);\n var /** @type {?} */ attrs = {};\n el.attrs.forEach(function (attr) {\n // Do not visit the attributes, translatable ones are top-level ASTs\n attrs[attr.name] = attr.value;\n });\n var /** @type {?} */ isVoid = getHtmlTagDefinition(el.name).isVoid;\n var /** @type {?} */ startPhName = this._placeholderRegistry.getStartTagPlaceholderName(el.name, attrs, isVoid);\n this._placeholderToContent[startPhName] = el.sourceSpan.toString();\n var /** @type {?} */ closePhName = '';\n if (!isVoid) {\n closePhName = this._placeholderRegistry.getCloseTagPlaceholderName(el.name);\n this._placeholderToContent[closePhName] = \"</\" + el.name + \">\";\n }\n return new TagPlaceholder(el.name, attrs, startPhName, closePhName, children, isVoid, el.sourceSpan);\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitAttribute = function (attribute, context) {\n return this._visitTextWithInterpolation(attribute.value, attribute.sourceSpan);\n };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitText = function (text, context) {\n return this._visitTextWithInterpolation(text.value, text.sourceSpan);\n };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitComment = function (comment, context) { return null; };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitExpansion = function (icu, context) {\n var _this = this;\n this._icuDepth++;\n var /** @type {?} */ i18nIcuCases = {};\n var /** @type {?} */ i18nIcu = new Icu(icu.switchValue, icu.type, i18nIcuCases, icu.sourceSpan);\n icu.cases.forEach(function (caze) {\n i18nIcuCases[caze.value] = new Container(caze.expression.map(function (node) { return node.visit(_this, {}); }), caze.expSourceSpan);\n });\n this._icuDepth--;\n if (this._isIcu || this._icuDepth > 0) {\n // Returns an ICU node when:\n // - the message (vs a part of the message) is an ICU message, or\n // - the ICU message is nested.\n var /** @type {?} */ expPh = this._placeholderRegistry.getUniquePlaceholder(\"VAR_\" + icu.type);\n i18nIcu.expressionPlaceholder = expPh;\n this._placeholderToContent[expPh] = icu.switchValue;\n return i18nIcu;\n }\n // Else returns a placeholder\n // ICU placeholders should not be replaced with their original content but with the their\n // translations. We need to create a new visitor (they are not re-entrant) to compute the\n // message id.\n // TODO(vicb): add a html.Node -> i18n.Message cache to avoid having to re-create the msg\n var /** @type {?} */ phName = this._placeholderRegistry.getPlaceholderName('ICU', icu.sourceSpan.toString());\n var /** @type {?} */ visitor = new _I18nVisitor(this._expressionParser, this._interpolationConfig);\n this._placeholderToMessage[phName] = visitor.toI18nMessage([icu], '', '');\n return new IcuPlaceholder(i18nIcu, phName, icu.sourceSpan);\n };\n /**\n * @param {?} icuCase\n * @param {?} context\n * @return {?}\n */\n _I18nVisitor.prototype.visitExpansionCase = function (icuCase, context) {\n throw new Error('Unreachable code');\n };\n /**\n * @param {?} text\n * @param {?} sourceSpan\n * @return {?}\n */\n _I18nVisitor.prototype._visitTextWithInterpolation = function (text, sourceSpan) {\n var /** @type {?} */ splitInterpolation = this._expressionParser.splitInterpolation(text, sourceSpan.start.toString(), this._interpolationConfig);\n if (!splitInterpolation) {\n // No expression, return a single text\n return new Text$1(text, sourceSpan);\n }\n // Return a group of text + expressions\n var /** @type {?} */ nodes = [];\n var /** @type {?} */ container = new Container(nodes, sourceSpan);\n var _a = this._interpolationConfig, sDelimiter = _a.start, eDelimiter = _a.end;\n for (var /** @type {?} */ i = 0; i < splitInterpolation.strings.length - 1; i++) {\n var /** @type {?} */ expression = splitInterpolation.expressions[i];\n var /** @type {?} */ baseName = _extractPlaceholderName(expression) || 'INTERPOLATION';\n var /** @type {?} */ phName = this._placeholderRegistry.getPlaceholderName(baseName, expression);\n if (splitInterpolation.strings[i].length) {\n // No need to add empty strings\n nodes.push(new Text$1(splitInterpolation.strings[i], sourceSpan));\n }\n nodes.push(new Placeholder(expression, phName, sourceSpan));\n this._placeholderToContent[phName] = sDelimiter + expression + eDelimiter;\n }\n // The last index contains no expression\n var /** @type {?} */ lastStringIdx = splitInterpolation.strings.length - 1;\n if (splitInterpolation.strings[lastStringIdx].length) {\n nodes.push(new Text$1(splitInterpolation.strings[lastStringIdx], sourceSpan));\n }\n return container;\n };\n return _I18nVisitor;\n }());\n var /** @type {?} */ _CUSTOM_PH_EXP = /\\/\\/[\\s\\S]*i18n[\\s\\S]*\\([\\s\\S]*ph[\\s\\S]*=[\\s\\S]*\"([\\s\\S]*?)\"[\\s\\S]*\\)/g;\n /**\n * @param {?} input\n * @return {?}\n */\n function _extractPlaceholderName(input) {\n return input.split(_CUSTOM_PH_EXP)[1];\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$7 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * An i18n error.\n */\n var I18nError = (function (_super) {\n __extends$7(I18nError, _super);\n /**\n * @param {?} span\n * @param {?} msg\n */\n function I18nError(span, msg) {\n _super.call(this, span, msg);\n }\n return I18nError;\n }(ParseError));\n\n var /** @type {?} */ _I18N_ATTR = 'i18n';\n var /** @type {?} */ _I18N_ATTR_PREFIX = 'i18n-';\n var /** @type {?} */ _I18N_COMMENT_PREFIX_REGEXP = /^i18n:?/;\n /**\n * Extract translatable messages from an html AST\n * @param {?} nodes\n * @param {?} interpolationConfig\n * @param {?} implicitTags\n * @param {?} implicitAttrs\n * @return {?}\n */\n function extractMessages(nodes, interpolationConfig, implicitTags, implicitAttrs) {\n var /** @type {?} */ visitor = new _Visitor(implicitTags, implicitAttrs);\n return visitor.extract(nodes, interpolationConfig);\n }\n /**\n * @param {?} nodes\n * @param {?} translations\n * @param {?} interpolationConfig\n * @param {?} implicitTags\n * @param {?} implicitAttrs\n * @return {?}\n */\n function mergeTranslations(nodes, translations, interpolationConfig, implicitTags, implicitAttrs) {\n var /** @type {?} */ visitor = new _Visitor(implicitTags, implicitAttrs);\n return visitor.merge(nodes, translations, interpolationConfig);\n }\n var ExtractionResult = (function () {\n /**\n * @param {?} messages\n * @param {?} errors\n */\n function ExtractionResult(messages, errors) {\n this.messages = messages;\n this.errors = errors;\n }\n return ExtractionResult;\n }());\n var _VisitorMode = {};\n _VisitorMode.Extract = 0;\n _VisitorMode.Merge = 1;\n _VisitorMode[_VisitorMode.Extract] = \"Extract\";\n _VisitorMode[_VisitorMode.Merge] = \"Merge\";\n /**\n * This Visitor is used:\n * 1. to extract all the translatable strings from an html AST (see `extract()`),\n * 2. to replace the translatable strings with the actual translations (see `merge()`)\n * *\n */\n var _Visitor = (function () {\n /**\n * @param {?} _implicitTags\n * @param {?} _implicitAttrs\n */\n function _Visitor(_implicitTags, _implicitAttrs) {\n this._implicitTags = _implicitTags;\n this._implicitAttrs = _implicitAttrs;\n }\n /**\n * Extracts the messages from the tree\n * @param {?} nodes\n * @param {?} interpolationConfig\n * @return {?}\n */\n _Visitor.prototype.extract = function (nodes, interpolationConfig) {\n var _this = this;\n this._init(_VisitorMode.Extract, interpolationConfig);\n nodes.forEach(function (node) { return node.visit(_this, null); });\n if (this._inI18nBlock) {\n this._reportError(nodes[nodes.length - 1], 'Unclosed block');\n }\n return new ExtractionResult(this._messages, this._errors);\n };\n /**\n * Returns a tree where all translatable nodes are translated\n * @param {?} nodes\n * @param {?} translations\n * @param {?} interpolationConfig\n * @return {?}\n */\n _Visitor.prototype.merge = function (nodes, translations, interpolationConfig) {\n this._init(_VisitorMode.Merge, interpolationConfig);\n this._translations = translations;\n // Construct a single fake root element\n var /** @type {?} */ wrapper = new Element('wrapper', [], nodes, null, null, null);\n var /** @type {?} */ translatedNode = wrapper.visit(this, null);\n if (this._inI18nBlock) {\n this._reportError(nodes[nodes.length - 1], 'Unclosed block');\n }\n return new ParseTreeResult(translatedNode.children, this._errors);\n };\n /**\n * @param {?} icuCase\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitExpansionCase = function (icuCase, context) {\n // Parse cases for translatable html attributes\n var /** @type {?} */ expression = visitAll(this, icuCase.expression, context);\n if (this._mode === _VisitorMode.Merge) {\n return new ExpansionCase(icuCase.value, expression, icuCase.sourceSpan, icuCase.valueSourceSpan, icuCase.expSourceSpan);\n }\n };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitExpansion = function (icu, context) {\n this._mayBeAddBlockChildren(icu);\n var /** @type {?} */ wasInIcu = this._inIcu;\n if (!this._inIcu) {\n // nested ICU messages should not be extracted but top-level translated as a whole\n if (this._isInTranslatableSection) {\n this._addMessage([icu]);\n }\n this._inIcu = true;\n }\n var /** @type {?} */ cases = visitAll(this, icu.cases, context);\n if (this._mode === _VisitorMode.Merge) {\n icu = new Expansion(icu.switchValue, icu.type, cases, icu.sourceSpan, icu.switchValueSourceSpan);\n }\n this._inIcu = wasInIcu;\n return icu;\n };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitComment = function (comment, context) {\n var /** @type {?} */ isOpening = _isOpeningComment(comment);\n if (isOpening && this._isInTranslatableSection) {\n this._reportError(comment, 'Could not start a block inside a translatable section');\n return;\n }\n var /** @type {?} */ isClosing = _isClosingComment(comment);\n if (isClosing && !this._inI18nBlock) {\n this._reportError(comment, 'Trying to close an unopened block');\n return;\n }\n if (!this._inI18nNode && !this._inIcu) {\n if (!this._inI18nBlock) {\n if (isOpening) {\n this._inI18nBlock = true;\n this._blockStartDepth = this._depth;\n this._blockChildren = [];\n this._blockMeaningAndDesc = comment.value.replace(_I18N_COMMENT_PREFIX_REGEXP, '').trim();\n this._openTranslatableSection(comment);\n }\n }\n else {\n if (isClosing) {\n if (this._depth == this._blockStartDepth) {\n this._closeTranslatableSection(comment, this._blockChildren);\n this._inI18nBlock = false;\n var /** @type {?} */ message = this._addMessage(this._blockChildren, this._blockMeaningAndDesc);\n // merge attributes in sections\n var /** @type {?} */ nodes = this._translateMessage(comment, message);\n return visitAll(this, nodes);\n }\n else {\n this._reportError(comment, 'I18N blocks should not cross element boundaries');\n return;\n }\n }\n }\n }\n };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitText = function (text, context) {\n if (this._isInTranslatableSection) {\n this._mayBeAddBlockChildren(text);\n }\n return text;\n };\n /**\n * @param {?} el\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitElement = function (el, context) {\n var _this = this;\n this._mayBeAddBlockChildren(el);\n this._depth++;\n var /** @type {?} */ wasInI18nNode = this._inI18nNode;\n var /** @type {?} */ wasInImplicitNode = this._inImplicitNode;\n var /** @type {?} */ childNodes;\n // Extract only top level nodes with the (implicit) \"i18n\" attribute if not in a block or an ICU\n // message\n var /** @type {?} */ i18nAttr = _getI18nAttr(el);\n var /** @type {?} */ isImplicit = this._implicitTags.some(function (tag) { return el.name === tag; }) && !this._inIcu &&\n !this._isInTranslatableSection;\n var /** @type {?} */ isTopLevelImplicit = !wasInImplicitNode && isImplicit;\n this._inImplicitNode = this._inImplicitNode || isImplicit;\n if (!this._isInTranslatableSection && !this._inIcu) {\n if (i18nAttr) {\n // explicit translation\n this._inI18nNode = true;\n var /** @type {?} */ message = this._addMessage(el.children, i18nAttr.value);\n childNodes = this._translateMessage(el, message);\n }\n else if (isTopLevelImplicit) {\n // implicit translation\n this._inI18nNode = true;\n var /** @type {?} */ message = this._addMessage(el.children);\n childNodes = this._translateMessage(el, message);\n }\n if (this._mode == _VisitorMode.Extract) {\n var /** @type {?} */ isTranslatable = i18nAttr || isTopLevelImplicit;\n if (isTranslatable) {\n this._openTranslatableSection(el);\n }\n visitAll(this, el.children);\n if (isTranslatable) {\n this._closeTranslatableSection(el, el.children);\n }\n }\n if (this._mode === _VisitorMode.Merge && !i18nAttr && !isTopLevelImplicit) {\n childNodes = [];\n el.children.forEach(function (child) {\n var /** @type {?} */ visited = child.visit(_this, context);\n if (visited && !_this._isInTranslatableSection) {\n // Do not add the children from translatable sections (= i18n blocks here)\n // They will be added when the section is close (i.e. on `<!-- /i18n -->`)\n childNodes = childNodes.concat(visited);\n }\n });\n }\n }\n else {\n if (i18nAttr || isTopLevelImplicit) {\n this._reportError(el, 'Could not mark an element as translatable inside a translatable section');\n }\n if (this._mode == _VisitorMode.Extract) {\n // Descend into child nodes for extraction\n visitAll(this, el.children);\n }\n if (this._mode == _VisitorMode.Merge) {\n // Translate attributes in ICU messages\n childNodes = [];\n el.children.forEach(function (child) {\n var /** @type {?} */ visited = child.visit(_this, context);\n if (visited && !_this._isInTranslatableSection) {\n // Do not add the children from translatable sections (= i18n blocks here)\n // They will be added when the section is close (i.e. on `<!-- /i18n -->`)\n childNodes = childNodes.concat(visited);\n }\n });\n }\n }\n this._visitAttributesOf(el);\n this._depth--;\n this._inI18nNode = wasInI18nNode;\n this._inImplicitNode = wasInImplicitNode;\n if (this._mode === _VisitorMode.Merge) {\n // There are no childNodes in translatable sections - those nodes will be replace anyway\n var /** @type {?} */ translatedAttrs = this._translateAttributes(el);\n return new Element(el.name, translatedAttrs, childNodes, el.sourceSpan, el.startSourceSpan, el.endSourceSpan);\n }\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n _Visitor.prototype.visitAttribute = function (attribute, context) {\n throw new Error('unreachable code');\n };\n /**\n * @param {?} mode\n * @param {?} interpolationConfig\n * @return {?}\n */\n _Visitor.prototype._init = function (mode, interpolationConfig) {\n this._mode = mode;\n this._inI18nBlock = false;\n this._inI18nNode = false;\n this._depth = 0;\n this._inIcu = false;\n this._msgCountAtSectionStart = void 0;\n this._errors = [];\n this._messages = [];\n this._inImplicitNode = false;\n this._createI18nMessage = createI18nMessageFactory(interpolationConfig);\n };\n /**\n * @param {?} el\n * @return {?}\n */\n _Visitor.prototype._visitAttributesOf = function (el) {\n var _this = this;\n var /** @type {?} */ explicitAttrNameToValue = {};\n var /** @type {?} */ implicitAttrNames = this._implicitAttrs[el.name] || [];\n el.attrs.filter(function (attr) { return attr.name.startsWith(_I18N_ATTR_PREFIX); })\n .forEach(function (attr) { return explicitAttrNameToValue[attr.name.slice(_I18N_ATTR_PREFIX.length)] =\n attr.value; });\n el.attrs.forEach(function (attr) {\n if (attr.name in explicitAttrNameToValue) {\n _this._addMessage([attr], explicitAttrNameToValue[attr.name]);\n }\n else if (implicitAttrNames.some(function (name) { return attr.name === name; })) {\n _this._addMessage([attr]);\n }\n });\n };\n /**\n * @param {?} ast\n * @param {?=} meaningAndDesc\n * @return {?}\n */\n _Visitor.prototype._addMessage = function (ast, meaningAndDesc) {\n if (ast.length == 0 ||\n ast.length == 1 && ast[0] instanceof Attribute$1 && !((ast[0])).value) {\n // Do not create empty messages\n return;\n }\n var _a = _splitMeaningAndDesc(meaningAndDesc), meaning = _a[0], description = _a[1];\n var /** @type {?} */ message = this._createI18nMessage(ast, meaning, description);\n this._messages.push(message);\n return message;\n };\n /**\n * @param {?} el\n * @param {?} message\n * @return {?}\n */\n _Visitor.prototype._translateMessage = function (el, message) {\n if (message && this._mode === _VisitorMode.Merge) {\n var /** @type {?} */ nodes = this._translations.get(message);\n if (nodes) {\n return nodes;\n }\n this._reportError(el, \"Translation unavailable for message id=\\\"\" + this._translations.digest(message) + \"\\\"\");\n }\n return [];\n };\n /**\n * @param {?} el\n * @return {?}\n */\n _Visitor.prototype._translateAttributes = function (el) {\n var _this = this;\n var /** @type {?} */ attributes = el.attrs;\n var /** @type {?} */ i18nAttributeMeanings = {};\n attributes.forEach(function (attr) {\n if (attr.name.startsWith(_I18N_ATTR_PREFIX)) {\n i18nAttributeMeanings[attr.name.slice(_I18N_ATTR_PREFIX.length)] =\n _splitMeaningAndDesc(attr.value)[0];\n }\n });\n var /** @type {?} */ translatedAttributes = [];\n attributes.forEach(function (attr) {\n if (attr.name === _I18N_ATTR || attr.name.startsWith(_I18N_ATTR_PREFIX)) {\n // strip i18n specific attributes\n return;\n }\n if (attr.value && attr.value != '' && i18nAttributeMeanings.hasOwnProperty(attr.name)) {\n var /** @type {?} */ meaning = i18nAttributeMeanings[attr.name];\n var /** @type {?} */ message = _this._createI18nMessage([attr], meaning, '');\n var /** @type {?} */ nodes = _this._translations.get(message);\n if (nodes) {\n if (nodes[0] instanceof Text) {\n var /** @type {?} */ value = ((nodes[0])).value;\n translatedAttributes.push(new Attribute$1(attr.name, value, attr.sourceSpan));\n }\n else {\n _this._reportError(el, \"Unexpected translation for attribute \\\"\" + attr.name + \"\\\" (id=\\\"\" + _this._translations.digest(message) + \"\\\")\");\n }\n }\n else {\n _this._reportError(el, \"Translation unavailable for attribute \\\"\" + attr.name + \"\\\" (id=\\\"\" + _this._translations.digest(message) + \"\\\")\");\n }\n }\n else {\n translatedAttributes.push(attr);\n }\n });\n return translatedAttributes;\n };\n /**\n * Add the node as a child of the block when:\n * - we are in a block,\n * - we are not inside a ICU message (those are handled separately),\n * - the node is a \"direct child\" of the block\n * @param {?} node\n * @return {?}\n */\n _Visitor.prototype._mayBeAddBlockChildren = function (node) {\n if (this._inI18nBlock && !this._inIcu && this._depth == this._blockStartDepth) {\n this._blockChildren.push(node);\n }\n };\n /**\n * Marks the start of a section, see `_endSection`\n * @param {?} node\n * @return {?}\n */\n _Visitor.prototype._openTranslatableSection = function (node) {\n if (this._isInTranslatableSection) {\n this._reportError(node, 'Unexpected section start');\n }\n else {\n this._msgCountAtSectionStart = this._messages.length;\n }\n };\n Object.defineProperty(_Visitor.prototype, \"_isInTranslatableSection\", {\n /**\n * A translatable section could be:\n * - a translatable element,\n * - nodes between `<!-- i18n -->` and `<!-- /i18n -->` comments\n * @return {?}\n */\n get: function () {\n return this._msgCountAtSectionStart !== void 0;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Terminates a section.\n * *\n * If a section has only one significant children (comments not significant) then we should not\n * keep the message from this children:\n * *\n * `<p i18n=\"meaning|description\">{ICU message}</p>` would produce two messages:\n * - one for the <p> content with meaning and description,\n * - another one for the ICU message.\n * *\n * In this case the last message is discarded as it contains less information (the AST is\n * otherwise identical).\n * *\n * Note that we should still keep messages extracted from attributes inside the section (ie in the\n * ICU message here)\n * @param {?} node\n * @param {?} directChildren\n * @return {?}\n */\n _Visitor.prototype._closeTranslatableSection = function (node, directChildren) {\n if (!this._isInTranslatableSection) {\n this._reportError(node, 'Unexpected section end');\n return;\n }\n var /** @type {?} */ startIndex = this._msgCountAtSectionStart;\n var /** @type {?} */ significantChildren = directChildren.reduce(function (count, node) { return count + (node instanceof Comment ? 0 : 1); }, 0);\n if (significantChildren == 1) {\n for (var /** @type {?} */ i = this._messages.length - 1; i >= startIndex; i--) {\n var /** @type {?} */ ast = this._messages[i].nodes;\n if (!(ast.length == 1 && ast[0] instanceof Text$1)) {\n this._messages.splice(i, 1);\n break;\n }\n }\n }\n this._msgCountAtSectionStart = void 0;\n };\n /**\n * @param {?} node\n * @param {?} msg\n * @return {?}\n */\n _Visitor.prototype._reportError = function (node, msg) {\n this._errors.push(new I18nError(node.sourceSpan, msg));\n };\n return _Visitor;\n }());\n /**\n * @param {?} n\n * @return {?}\n */\n function _isOpeningComment(n) {\n return n instanceof Comment && n.value && n.value.startsWith('i18n');\n }\n /**\n * @param {?} n\n * @return {?}\n */\n function _isClosingComment(n) {\n return n instanceof Comment && n.value && n.value === '/i18n';\n }\n /**\n * @param {?} p\n * @return {?}\n */\n function _getI18nAttr(p) {\n return p.attrs.find(function (attr) { return attr.name === _I18N_ATTR; }) || null;\n }\n /**\n * @param {?} i18n\n * @return {?}\n */\n function _splitMeaningAndDesc(i18n) {\n if (!i18n)\n return ['', ''];\n var /** @type {?} */ pipeIndex = i18n.indexOf('|');\n return pipeIndex == -1 ? ['', i18n] : [i18n.slice(0, pipeIndex), i18n.slice(pipeIndex + 1)];\n }\n\n var XmlTagDefinition = (function () {\n function XmlTagDefinition() {\n this.closedByParent = false;\n this.contentType = TagContentType.PARSABLE_DATA;\n this.isVoid = false;\n this.ignoreFirstLf = false;\n this.canSelfClose = true;\n }\n /**\n * @param {?} currentParent\n * @return {?}\n */\n XmlTagDefinition.prototype.requireExtraParent = function (currentParent) { return false; };\n /**\n * @param {?} name\n * @return {?}\n */\n XmlTagDefinition.prototype.isClosedByChild = function (name) { return false; };\n return XmlTagDefinition;\n }());\n var /** @type {?} */ _TAG_DEFINITION = new XmlTagDefinition();\n /**\n * @param {?} tagName\n * @return {?}\n */\n function getXmlTagDefinition(tagName) {\n return _TAG_DEFINITION;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$8 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var XmlParser = (function (_super) {\n __extends$8(XmlParser, _super);\n function XmlParser() {\n _super.call(this, getXmlTagDefinition);\n }\n /**\n * @param {?} source\n * @param {?} url\n * @param {?=} parseExpansionForms\n * @return {?}\n */\n XmlParser.prototype.parse = function (source, url, parseExpansionForms) {\n if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n return _super.prototype.parse.call(this, source, url, parseExpansionForms, null);\n };\n return XmlParser;\n }(Parser$1));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$9 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @param {?} message\n * @return {?}\n */\n function digest(message) {\n return sha1(serializeNodes(message.nodes).join('') + (\"[\" + message.meaning + \"]\"));\n }\n /**\n * @param {?} message\n * @return {?}\n */\n function decimalDigest(message) {\n var /** @type {?} */ visitor = new _SerializerIgnoreIcuExpVisitor();\n var /** @type {?} */ parts = message.nodes.map(function (a) { return a.visit(visitor, null); });\n return computeMsgId(parts.join(''), message.meaning);\n }\n /**\n * Serialize the i18n ast to something xml-like in order to generate an UID.\n * *\n * The visitor is also used in the i18n parser tests\n * *\n */\n var _SerializerVisitor = (function () {\n function _SerializerVisitor() {\n }\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitText = function (text, context) { return text.value; };\n /**\n * @param {?} container\n * @param {?} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitContainer = function (container, context) {\n var _this = this;\n return \"[\" + container.children.map(function (child) { return child.visit(_this); }).join(', ') + \"]\";\n };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitIcu = function (icu, context) {\n var _this = this;\n var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n return \"{\" + icu.expression + \", \" + icu.type + \", \" + strCases.join(', ') + \"}\";\n };\n /**\n * @param {?} ph\n * @param {?} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitTagPlaceholder = function (ph, context) {\n var _this = this;\n return ph.isVoid ?\n \"<ph tag name=\\\"\" + ph.startName + \"\\\"/>\" :\n \"<ph tag name=\\\"\" + ph.startName + \"\\\">\" + ph.children.map(function (child) { return child.visit(_this); }).join(', ') + \"</ph name=\\\"\" + ph.closeName + \"\\\">\";\n };\n /**\n * @param {?} ph\n * @param {?} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitPlaceholder = function (ph, context) {\n return ph.value ? \"<ph name=\\\"\" + ph.name + \"\\\">\" + ph.value + \"</ph>\" : \"<ph name=\\\"\" + ph.name + \"\\\"/>\";\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _SerializerVisitor.prototype.visitIcuPlaceholder = function (ph, context) {\n return \"<ph icu name=\\\"\" + ph.name + \"\\\">\" + ph.value.visit(this) + \"</ph>\";\n };\n return _SerializerVisitor;\n }());\n var /** @type {?} */ serializerVisitor = new _SerializerVisitor();\n /**\n * @param {?} nodes\n * @return {?}\n */\n function serializeNodes(nodes) {\n return nodes.map(function (a) { return a.visit(serializerVisitor, null); });\n }\n /**\n * Serialize the i18n ast to something xml-like in order to generate an UID.\n * *\n * Ignore the ICU expressions so that message IDs stays identical if only the expression changes.\n * *\n */\n var _SerializerIgnoreIcuExpVisitor = (function (_super) {\n __extends$9(_SerializerIgnoreIcuExpVisitor, _super);\n function _SerializerIgnoreIcuExpVisitor() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n _SerializerIgnoreIcuExpVisitor.prototype.visitIcu = function (icu, context) {\n var _this = this;\n var /** @type {?} */ strCases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n // Do not take the expression into account\n return \"{\" + icu.type + \", \" + strCases.join(', ') + \"}\";\n };\n return _SerializerIgnoreIcuExpVisitor;\n }(_SerializerVisitor));\n /**\n * Compute the SHA1 of the given string\n * *\n * see http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n * *\n * WARNING: this function has not been designed not tested with security in mind.\n * DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.\n * @param {?} str\n * @return {?}\n */\n function sha1(str) {\n var /** @type {?} */ utf8 = utf8Encode(str);\n var /** @type {?} */ words32 = stringToWords32(utf8, Endian.Big);\n var /** @type {?} */ len = utf8.length * 8;\n var /** @type {?} */ w = new Array(80);\n var _a = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0], a = _a[0], b = _a[1], c = _a[2], d = _a[3], e = _a[4];\n words32[len >> 5] |= 0x80 << (24 - len % 32);\n words32[((len + 64 >> 9) << 4) + 15] = len;\n for (var /** @type {?} */ i = 0; i < words32.length; i += 16) {\n var _b = [a, b, c, d, e], h0 = _b[0], h1 = _b[1], h2 = _b[2], h3 = _b[3], h4 = _b[4];\n for (var /** @type {?} */ j = 0; j < 80; j++) {\n if (j < 16) {\n w[j] = words32[i + j];\n }\n else {\n w[j] = rol32(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);\n }\n var _c = fk(j, b, c, d), f = _c[0], k = _c[1];\n var /** @type {?} */ temp = [rol32(a, 5), f, e, k, w[j]].reduce(add32);\n _d = [d, c, rol32(b, 30), a, temp], e = _d[0], d = _d[1], c = _d[2], b = _d[3], a = _d[4];\n }\n _e = [add32(a, h0), add32(b, h1), add32(c, h2), add32(d, h3), add32(e, h4)], a = _e[0], b = _e[1], c = _e[2], d = _e[3], e = _e[4];\n }\n return byteStringToHexString(words32ToByteString([a, b, c, d, e]));\n var _d, _e;\n }\n /**\n * @param {?} index\n * @param {?} b\n * @param {?} c\n * @param {?} d\n * @return {?}\n */\n function fk(index, b, c, d) {\n if (index < 20) {\n return [(b & c) | (~b & d), 0x5a827999];\n }\n if (index < 40) {\n return [b ^ c ^ d, 0x6ed9eba1];\n }\n if (index < 60) {\n return [(b & c) | (b & d) | (c & d), 0x8f1bbcdc];\n }\n return [b ^ c ^ d, 0xca62c1d6];\n }\n /**\n * Compute the fingerprint of the given string\n * *\n * The output is 64 bit number encoded as a decimal string\n * *\n * based on:\n * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java\n * @param {?} str\n * @return {?}\n */\n function fingerprint(str) {\n var /** @type {?} */ utf8 = utf8Encode(str);\n var _a = [hash32(utf8, 0), hash32(utf8, 102072)], hi = _a[0], lo = _a[1];\n if (hi == 0 && (lo == 0 || lo == 1)) {\n hi = hi ^ 0x130f9bef;\n lo = lo ^ -0x6b5f56d8;\n }\n return [hi, lo];\n }\n /**\n * @param {?} msg\n * @param {?} meaning\n * @return {?}\n */\n function computeMsgId(msg, meaning) {\n var _a = fingerprint(msg), hi = _a[0], lo = _a[1];\n if (meaning) {\n var _b = fingerprint(meaning), him = _b[0], lom = _b[1];\n _c = add64(rol64([hi, lo], 1), [him, lom]), hi = _c[0], lo = _c[1];\n }\n return byteStringToDecString(words32ToByteString([hi & 0x7fffffff, lo]));\n var _c;\n }\n /**\n * @param {?} str\n * @param {?} c\n * @return {?}\n */\n function hash32(str, c) {\n var _a = [0x9e3779b9, 0x9e3779b9], a = _a[0], b = _a[1];\n var /** @type {?} */ i;\n var /** @type {?} */ len = str.length;\n for (i = 0; i + 12 <= len; i += 12) {\n a = add32(a, wordAt(str, i, Endian.Little));\n b = add32(b, wordAt(str, i + 4, Endian.Little));\n c = add32(c, wordAt(str, i + 8, Endian.Little));\n _b = mix([a, b, c]), a = _b[0], b = _b[1], c = _b[2];\n }\n a = add32(a, wordAt(str, i, Endian.Little));\n b = add32(b, wordAt(str, i + 4, Endian.Little));\n // the first byte of c is reserved for the length\n c = add32(c, len);\n c = add32(c, wordAt(str, i + 8, Endian.Little) << 8);\n return mix([a, b, c])[2];\n var _b;\n }\n /**\n * @param {?} __0\n * @return {?}\n */\n function mix(_a) {\n var a = _a[0], b = _a[1], c = _a[2];\n a = sub32(a, b);\n a = sub32(a, c);\n a ^= c >>> 13;\n b = sub32(b, c);\n b = sub32(b, a);\n b ^= a << 8;\n c = sub32(c, a);\n c = sub32(c, b);\n c ^= b >>> 13;\n a = sub32(a, b);\n a = sub32(a, c);\n a ^= c >>> 12;\n b = sub32(b, c);\n b = sub32(b, a);\n b ^= a << 16;\n c = sub32(c, a);\n c = sub32(c, b);\n c ^= b >>> 5;\n a = sub32(a, b);\n a = sub32(a, c);\n a ^= c >>> 3;\n b = sub32(b, c);\n b = sub32(b, a);\n b ^= a << 10;\n c = sub32(c, a);\n c = sub32(c, b);\n c ^= b >>> 15;\n return [a, b, c];\n }\n var Endian = {};\n Endian.Little = 0;\n Endian.Big = 1;\n Endian[Endian.Little] = \"Little\";\n Endian[Endian.Big] = \"Big\";\n /**\n * @param {?} str\n * @return {?}\n */\n function utf8Encode(str) {\n var /** @type {?} */ encoded = '';\n for (var /** @type {?} */ index = 0; index < str.length; index++) {\n var /** @type {?} */ codePoint = decodeSurrogatePairs(str, index);\n if (codePoint <= 0x7f) {\n encoded += String.fromCharCode(codePoint);\n }\n else if (codePoint <= 0x7ff) {\n encoded += String.fromCharCode(0xc0 | codePoint >>> 6, 0x80 | codePoint & 0x3f);\n }\n else if (codePoint <= 0xffff) {\n encoded += String.fromCharCode(0xe0 | codePoint >>> 12, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);\n }\n else if (codePoint <= 0x1fffff) {\n encoded += String.fromCharCode(0xf0 | codePoint >>> 18, 0x80 | codePoint >>> 12 & 0x3f, 0x80 | codePoint >>> 6 & 0x3f, 0x80 | codePoint & 0x3f);\n }\n }\n return encoded;\n }\n /**\n * @param {?} str\n * @param {?} index\n * @return {?}\n */\n function decodeSurrogatePairs(str, index) {\n if (index < 0 || index >= str.length) {\n throw new Error(\"index=\" + index + \" is out of range in \\\"\" + str + \"\\\"\");\n }\n var /** @type {?} */ high = str.charCodeAt(index);\n if (high >= 0xd800 && high <= 0xdfff && str.length > index + 1) {\n var /** @type {?} */ low = byteAt(str, index + 1);\n if (low >= 0xdc00 && low <= 0xdfff) {\n return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;\n }\n }\n return high;\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function add32(a, b) {\n return add32to64(a, b)[1];\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function add32to64(a, b) {\n var /** @type {?} */ low = (a & 0xffff) + (b & 0xffff);\n var /** @type {?} */ high = (a >>> 16) + (b >>> 16) + (low >>> 16);\n return [high >>> 16, (high << 16) | (low & 0xffff)];\n }\n /**\n * @param {?} __0\n * @param {?} __1\n * @return {?}\n */\n function add64(_a, _b) {\n var ah = _a[0], al = _a[1];\n var bh = _b[0], bl = _b[1];\n var _c = add32to64(al, bl), carry = _c[0], l = _c[1];\n var /** @type {?} */ h = add32(add32(ah, bh), carry);\n return [h, l];\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function sub32(a, b) {\n var /** @type {?} */ low = (a & 0xffff) - (b & 0xffff);\n var /** @type {?} */ high = (a >> 16) - (b >> 16) + (low >> 16);\n return (high << 16) | (low & 0xffff);\n }\n /**\n * @param {?} a\n * @param {?} count\n * @return {?}\n */\n function rol32(a, count) {\n return (a << count) | (a >>> (32 - count));\n }\n /**\n * @param {?} __0\n * @param {?} count\n * @return {?}\n */\n function rol64(_a, count) {\n var hi = _a[0], lo = _a[1];\n var /** @type {?} */ h = (hi << count) | (lo >>> (32 - count));\n var /** @type {?} */ l = (lo << count) | (hi >>> (32 - count));\n return [h, l];\n }\n /**\n * @param {?} str\n * @param {?} endian\n * @return {?}\n */\n function stringToWords32(str, endian) {\n var /** @type {?} */ words32 = Array((str.length + 3) >>> 2);\n for (var /** @type {?} */ i = 0; i < words32.length; i++) {\n words32[i] = wordAt(str, i * 4, endian);\n }\n return words32;\n }\n /**\n * @param {?} str\n * @param {?} index\n * @return {?}\n */\n function byteAt(str, index) {\n return index >= str.length ? 0 : str.charCodeAt(index) & 0xff;\n }\n /**\n * @param {?} str\n * @param {?} index\n * @param {?} endian\n * @return {?}\n */\n function wordAt(str, index, endian) {\n var /** @type {?} */ word = 0;\n if (endian === Endian.Big) {\n for (var /** @type {?} */ i = 0; i < 4; i++) {\n word += byteAt(str, index + i) << (24 - 8 * i);\n }\n }\n else {\n for (var /** @type {?} */ i = 0; i < 4; i++) {\n word += byteAt(str, index + i) << 8 * i;\n }\n }\n return word;\n }\n /**\n * @param {?} words32\n * @return {?}\n */\n function words32ToByteString(words32) {\n return words32.reduce(function (str, word) { return str + word32ToByteString(word); }, '');\n }\n /**\n * @param {?} word\n * @return {?}\n */\n function word32ToByteString(word) {\n var /** @type {?} */ str = '';\n for (var /** @type {?} */ i = 0; i < 4; i++) {\n str += String.fromCharCode((word >>> 8 * (3 - i)) & 0xff);\n }\n return str;\n }\n /**\n * @param {?} str\n * @return {?}\n */\n function byteStringToHexString(str) {\n var /** @type {?} */ hex = '';\n for (var /** @type {?} */ i = 0; i < str.length; i++) {\n var /** @type {?} */ b = byteAt(str, i);\n hex += (b >>> 4).toString(16) + (b & 0x0f).toString(16);\n }\n return hex.toLowerCase();\n }\n /**\n * @param {?} str\n * @return {?}\n */\n function byteStringToDecString(str) {\n var /** @type {?} */ decimal = '';\n var /** @type {?} */ toThePower = '1';\n for (var /** @type {?} */ i = str.length - 1; i >= 0; i--) {\n decimal = addBigInt(decimal, numberTimesBigInt(byteAt(str, i), toThePower));\n toThePower = numberTimesBigInt(256, toThePower);\n }\n return decimal.split('').reverse().join('');\n }\n /**\n * @param {?} x\n * @param {?} y\n * @return {?}\n */\n function addBigInt(x, y) {\n var /** @type {?} */ sum = '';\n var /** @type {?} */ len = Math.max(x.length, y.length);\n for (var /** @type {?} */ i = 0, /** @type {?} */ carry = 0; i < len || carry; i++) {\n var /** @type {?} */ tmpSum = carry + +(x[i] || 0) + +(y[i] || 0);\n if (tmpSum >= 10) {\n carry = 1;\n sum += tmpSum - 10;\n }\n else {\n carry = 0;\n sum += tmpSum;\n }\n }\n return sum;\n }\n /**\n * @param {?} num\n * @param {?} b\n * @return {?}\n */\n function numberTimesBigInt(num, b) {\n var /** @type {?} */ product = '';\n var /** @type {?} */ bToThePower = b;\n for (; num !== 0; num = num >>> 1) {\n if (num & 1)\n product = addBigInt(product, bToThePower);\n bToThePower = addBigInt(bToThePower, bToThePower);\n }\n return product;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$10 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var _Visitor$1 = (function () {\n function _Visitor() {\n }\n /**\n * @param {?} tag\n * @return {?}\n */\n _Visitor.prototype.visitTag = function (tag) {\n var _this = this;\n var /** @type {?} */ strAttrs = this._serializeAttributes(tag.attrs);\n if (tag.children.length == 0) {\n return \"<\" + tag.name + strAttrs + \"/>\";\n }\n var /** @type {?} */ strChildren = tag.children.map(function (node) { return node.visit(_this); });\n return \"<\" + tag.name + strAttrs + \">\" + strChildren.join('') + \"</\" + tag.name + \">\";\n };\n /**\n * @param {?} text\n * @return {?}\n */\n _Visitor.prototype.visitText = function (text) { return text.value; };\n /**\n * @param {?} decl\n * @return {?}\n */\n _Visitor.prototype.visitDeclaration = function (decl) {\n return \"<?xml\" + this._serializeAttributes(decl.attrs) + \" ?>\";\n };\n /**\n * @param {?} attrs\n * @return {?}\n */\n _Visitor.prototype._serializeAttributes = function (attrs) {\n var /** @type {?} */ strAttrs = Object.keys(attrs).map(function (name) { return (name + \"=\\\"\" + attrs[name] + \"\\\"\"); }).join(' ');\n return strAttrs.length > 0 ? ' ' + strAttrs : '';\n };\n /**\n * @param {?} doctype\n * @return {?}\n */\n _Visitor.prototype.visitDoctype = function (doctype) {\n return \"<!DOCTYPE \" + doctype.rootTag + \" [\\n\" + doctype.dtd + \"\\n]>\";\n };\n return _Visitor;\n }());\n var /** @type {?} */ _visitor = new _Visitor$1();\n /**\n * @param {?} nodes\n * @return {?}\n */\n function serialize(nodes) {\n return nodes.map(function (node) { return node.visit(_visitor); }).join('');\n }\n var Declaration = (function () {\n /**\n * @param {?} unescapedAttrs\n */\n function Declaration(unescapedAttrs) {\n var _this = this;\n this.attrs = {};\n Object.keys(unescapedAttrs).forEach(function (k) {\n _this.attrs[k] = _escapeXml(unescapedAttrs[k]);\n });\n }\n /**\n * @param {?} visitor\n * @return {?}\n */\n Declaration.prototype.visit = function (visitor) { return visitor.visitDeclaration(this); };\n return Declaration;\n }());\n var Doctype = (function () {\n /**\n * @param {?} rootTag\n * @param {?} dtd\n */\n function Doctype(rootTag, dtd) {\n this.rootTag = rootTag;\n this.dtd = dtd;\n }\n ;\n /**\n * @param {?} visitor\n * @return {?}\n */\n Doctype.prototype.visit = function (visitor) { return visitor.visitDoctype(this); };\n return Doctype;\n }());\n var Tag = (function () {\n /**\n * @param {?} name\n * @param {?=} unescapedAttrs\n * @param {?=} children\n */\n function Tag(name, unescapedAttrs, children) {\n var _this = this;\n if (unescapedAttrs === void 0) { unescapedAttrs = {}; }\n if (children === void 0) { children = []; }\n this.name = name;\n this.children = children;\n this.attrs = {};\n Object.keys(unescapedAttrs).forEach(function (k) {\n _this.attrs[k] = _escapeXml(unescapedAttrs[k]);\n });\n }\n /**\n * @param {?} visitor\n * @return {?}\n */\n Tag.prototype.visit = function (visitor) { return visitor.visitTag(this); };\n return Tag;\n }());\n var Text$2 = (function () {\n /**\n * @param {?} unescapedValue\n */\n function Text(unescapedValue) {\n this.value = _escapeXml(unescapedValue);\n }\n ;\n /**\n * @param {?} visitor\n * @return {?}\n */\n Text.prototype.visit = function (visitor) { return visitor.visitText(this); };\n return Text;\n }());\n var CR = (function (_super) {\n __extends$10(CR, _super);\n /**\n * @param {?=} ws\n */\n function CR(ws) {\n if (ws === void 0) { ws = 0; }\n _super.call(this, \"\\n\" + new Array(ws + 1).join(' '));\n }\n return CR;\n }(Text$2));\n var /** @type {?} */ _ESCAPED_CHARS = [\n [/&/g, '&amp;'],\n [/\"/g, '&quot;'],\n [/'/g, '&apos;'],\n [/</g, '&lt;'],\n [/>/g, '&gt;'],\n ];\n /**\n * @param {?} text\n * @return {?}\n */\n function _escapeXml(text) {\n return _ESCAPED_CHARS.reduce(function (text, entry) { return text.replace(entry[0], entry[1]); }, text);\n }\n\n var /** @type {?} */ _VERSION = '1.2';\n var /** @type {?} */ _XMLNS = 'urn:oasis:names:tc:xliff:document:1.2';\n // TODO(vicb): make this a param (s/_/-/)\n var /** @type {?} */ _SOURCE_LANG = 'en';\n var /** @type {?} */ _PLACEHOLDER_TAG = 'x';\n var /** @type {?} */ _SOURCE_TAG = 'source';\n var /** @type {?} */ _TARGET_TAG = 'target';\n var /** @type {?} */ _UNIT_TAG = 'trans-unit';\n // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html\n // http://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html\n var Xliff = (function () {\n function Xliff() {\n }\n /**\n * @param {?} messages\n * @return {?}\n */\n Xliff.prototype.write = function (messages) {\n var _this = this;\n var /** @type {?} */ visitor = new _WriteVisitor();\n var /** @type {?} */ visited = {};\n var /** @type {?} */ transUnits = [];\n messages.forEach(function (message) {\n var /** @type {?} */ id = _this.digest(message);\n // deduplicate messages\n if (visited[id])\n return;\n visited[id] = true;\n var /** @type {?} */ transUnit = new Tag(_UNIT_TAG, { id: id, datatype: 'html' });\n transUnit.children.push(new CR(8), new Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)), new CR(8), new Tag(_TARGET_TAG));\n if (message.description) {\n transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'description' }, [new Text$2(message.description)]));\n }\n if (message.meaning) {\n transUnit.children.push(new CR(8), new Tag('note', { priority: '1', from: 'meaning' }, [new Text$2(message.meaning)]));\n }\n transUnit.children.push(new CR(6));\n transUnits.push(new CR(6), transUnit);\n });\n var /** @type {?} */ body = new Tag('body', {}, transUnits.concat([new CR(4)]));\n var /** @type {?} */ file = new Tag('file', { 'source-language': _SOURCE_LANG, datatype: 'plaintext', original: 'ng2.template' }, [new CR(4), body, new CR(2)]);\n var /** @type {?} */ xliff = new Tag('xliff', { version: _VERSION, xmlns: _XMLNS }, [new CR(2), file, new CR()]);\n return serialize([\n new Declaration({ version: '1.0', encoding: 'UTF-8' }), new CR(), xliff, new CR()\n ]);\n };\n /**\n * @param {?} content\n * @param {?} url\n * @return {?}\n */\n Xliff.prototype.load = function (content, url) {\n // xliff to xml nodes\n var /** @type {?} */ xliffParser = new XliffParser();\n var _a = xliffParser.parse(content, url), mlNodesByMsgId = _a.mlNodesByMsgId, errors = _a.errors;\n // xml nodes to i18n nodes\n var /** @type {?} */ i18nNodesByMsgId = {};\n var /** @type {?} */ converter = new XmlToI18n();\n Object.keys(mlNodesByMsgId).forEach(function (msgId) {\n var _a = converter.convert(mlNodesByMsgId[msgId]), i18nNodes = _a.i18nNodes, e = _a.errors;\n errors.push.apply(errors, e);\n i18nNodesByMsgId[msgId] = i18nNodes;\n });\n if (errors.length) {\n throw new Error(\"xliff parse errors:\\n\" + errors.join('\\n'));\n }\n return i18nNodesByMsgId;\n };\n /**\n * @param {?} message\n * @return {?}\n */\n Xliff.prototype.digest = function (message) { return digest(message); };\n return Xliff;\n }());\n var _WriteVisitor = (function () {\n function _WriteVisitor() {\n }\n /**\n * @param {?} text\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };\n /**\n * @param {?} container\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitContainer = function (container, context) {\n var _this = this;\n var /** @type {?} */ nodes = [];\n container.children.forEach(function (node) { return nodes.push.apply(nodes, node.visit(_this)); });\n return nodes;\n };\n /**\n * @param {?} icu\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitIcu = function (icu, context) {\n if (this._isInIcu) {\n // nested ICU is not supported\n throw new Error('xliff does not support nested ICU messages');\n }\n this._isInIcu = true;\n // TODO(vicb): support ICU messages\n // https://lists.oasis-open.org/archives/xliff/201201/msg00028.html\n // http://docs.oasis-open.org/xliff/v1.2/xliff-profile-po/xliff-profile-po-1.2-cd02.html\n var /** @type {?} */ nodes = [];\n this._isInIcu = false;\n return nodes;\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitTagPlaceholder = function (ph, context) {\n var /** @type {?} */ ctype = getCtypeForTag(ph.tag);\n var /** @type {?} */ startTagPh = new Tag(_PLACEHOLDER_TAG, { id: ph.startName, ctype: ctype });\n if (ph.isVoid) {\n // void tags have no children nor closing tags\n return [startTagPh];\n }\n var /** @type {?} */ closeTagPh = new Tag(_PLACEHOLDER_TAG, { id: ph.closeName, ctype: ctype });\n return [startTagPh].concat(this.serialize(ph.children), [closeTagPh]);\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitPlaceholder = function (ph, context) {\n return [new Tag(_PLACEHOLDER_TAG, { id: ph.name })];\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _WriteVisitor.prototype.visitIcuPlaceholder = function (ph, context) {\n return [new Tag(_PLACEHOLDER_TAG, { id: ph.name })];\n };\n /**\n * @param {?} nodes\n * @return {?}\n */\n _WriteVisitor.prototype.serialize = function (nodes) {\n var _this = this;\n this._isInIcu = false;\n return (_a = []).concat.apply(_a, nodes.map(function (node) { return node.visit(_this); }));\n var _a;\n };\n return _WriteVisitor;\n }());\n // TODO(vicb): add error management (structure)\n // Extract messages as xml nodes from the xliff file\n var XliffParser = (function () {\n function XliffParser() {\n }\n /**\n * @param {?} xliff\n * @param {?} url\n * @return {?}\n */\n XliffParser.prototype.parse = function (xliff, url) {\n this._unitMlNodes = [];\n this._mlNodesByMsgId = {};\n var /** @type {?} */ xml = new XmlParser().parse(xliff, url, false);\n this._errors = xml.errors;\n visitAll(this, xml.rootNodes, null);\n return {\n mlNodesByMsgId: this._mlNodesByMsgId,\n errors: this._errors,\n };\n };\n /**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitElement = function (element, context) {\n switch (element.name) {\n case _UNIT_TAG:\n this._unitMlNodes = null;\n var /** @type {?} */ idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });\n if (!idAttr) {\n this._addError(element, \"<\" + _UNIT_TAG + \"> misses the \\\"id\\\" attribute\");\n }\n else {\n var /** @type {?} */ id = idAttr.value;\n if (this._mlNodesByMsgId.hasOwnProperty(id)) {\n this._addError(element, \"Duplicated translations for msg \" + id);\n }\n else {\n visitAll(this, element.children, null);\n if (this._unitMlNodes) {\n this._mlNodesByMsgId[id] = this._unitMlNodes;\n }\n else {\n this._addError(element, \"Message \" + id + \" misses a translation\");\n }\n }\n }\n break;\n case _SOURCE_TAG:\n // ignore source message\n break;\n case _TARGET_TAG:\n this._unitMlNodes = element.children;\n break;\n default:\n // TODO(vicb): assert file structure, xliff version\n // For now only recurse on unhandled nodes\n visitAll(this, element.children, null);\n }\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitAttribute = function (attribute, context) { };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitText = function (text, context) { };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitComment = function (comment, context) { };\n /**\n * @param {?} expansion\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitExpansion = function (expansion, context) { };\n /**\n * @param {?} expansionCase\n * @param {?} context\n * @return {?}\n */\n XliffParser.prototype.visitExpansionCase = function (expansionCase, context) { };\n /**\n * @param {?} node\n * @param {?} message\n * @return {?}\n */\n XliffParser.prototype._addError = function (node, message) {\n this._errors.push(new I18nError(node.sourceSpan, message));\n };\n return XliffParser;\n }());\n // Convert ml nodes (xliff syntax) to i18n nodes\n var XmlToI18n = (function () {\n function XmlToI18n() {\n }\n /**\n * @param {?} nodes\n * @return {?}\n */\n XmlToI18n.prototype.convert = function (nodes) {\n this._errors = [];\n return {\n i18nNodes: visitAll(this, nodes),\n errors: this._errors,\n };\n };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };\n /**\n * @param {?} el\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitElement = function (el, context) {\n if (el.name === _PLACEHOLDER_TAG) {\n var /** @type {?} */ nameAttr = el.attrs.find(function (attr) { return attr.name === 'id'; });\n if (nameAttr) {\n return new Placeholder('', nameAttr.value, el.sourceSpan);\n }\n this._addError(el, \"<\" + _PLACEHOLDER_TAG + \"> misses the \\\"id\\\" attribute\");\n }\n else {\n this._addError(el, \"Unexpected tag\");\n }\n };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitExpansion = function (icu, context) { };\n /**\n * @param {?} icuCase\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) { };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitComment = function (comment, context) { };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitAttribute = function (attribute, context) { };\n /**\n * @param {?} node\n * @param {?} message\n * @return {?}\n */\n XmlToI18n.prototype._addError = function (node, message) {\n this._errors.push(new I18nError(node.sourceSpan, message));\n };\n return XmlToI18n;\n }());\n /**\n * @param {?} tag\n * @return {?}\n */\n function getCtypeForTag(tag) {\n switch (tag.toLowerCase()) {\n case 'br':\n return 'lb';\n case 'img':\n return 'image';\n default:\n return \"x-\" + tag;\n }\n }\n\n var /** @type {?} */ _MESSAGES_TAG = 'messagebundle';\n var /** @type {?} */ _MESSAGE_TAG = 'msg';\n var /** @type {?} */ _PLACEHOLDER_TAG$1 = 'ph';\n var /** @type {?} */ _EXEMPLE_TAG = 'ex';\n var /** @type {?} */ _DOCTYPE = \"<!ELEMENT messagebundle (msg)*>\\n<!ATTLIST messagebundle class CDATA #IMPLIED>\\n\\n<!ELEMENT msg (#PCDATA|ph|source)*>\\n<!ATTLIST msg id CDATA #IMPLIED>\\n<!ATTLIST msg seq CDATA #IMPLIED>\\n<!ATTLIST msg name CDATA #IMPLIED>\\n<!ATTLIST msg desc CDATA #IMPLIED>\\n<!ATTLIST msg meaning CDATA #IMPLIED>\\n<!ATTLIST msg obsolete (obsolete) #IMPLIED>\\n<!ATTLIST msg xml:space (default|preserve) \\\"default\\\">\\n<!ATTLIST msg is_hidden CDATA #IMPLIED>\\n\\n<!ELEMENT source (#PCDATA)>\\n\\n<!ELEMENT ph (#PCDATA|ex)*>\\n<!ATTLIST ph name CDATA #REQUIRED>\\n\\n<!ELEMENT ex (#PCDATA)>\";\n var Xmb = (function () {\n function Xmb() {\n }\n /**\n * @param {?} messages\n * @return {?}\n */\n Xmb.prototype.write = function (messages) {\n var _this = this;\n var /** @type {?} */ exampleVisitor = new ExampleVisitor();\n var /** @type {?} */ visitor = new _Visitor$2();\n var /** @type {?} */ visited = {};\n var /** @type {?} */ rootNode = new Tag(_MESSAGES_TAG);\n messages.forEach(function (message) {\n var /** @type {?} */ id = _this.digest(message);\n // deduplicate messages\n if (visited[id])\n return;\n visited[id] = true;\n var /** @type {?} */ attrs = { id: id };\n if (message.description) {\n attrs['desc'] = message.description;\n }\n if (message.meaning) {\n attrs['meaning'] = message.meaning;\n }\n rootNode.children.push(new CR(2), new Tag(_MESSAGE_TAG, attrs, visitor.serialize(message.nodes)));\n });\n rootNode.children.push(new CR());\n return serialize([\n new Declaration({ version: '1.0', encoding: 'UTF-8' }),\n new CR(),\n new Doctype(_MESSAGES_TAG, _DOCTYPE),\n new CR(),\n exampleVisitor.addDefaultExamples(rootNode),\n new CR(),\n ]);\n };\n /**\n * @param {?} content\n * @param {?} url\n * @return {?}\n */\n Xmb.prototype.load = function (content, url) {\n throw new Error('Unsupported');\n };\n /**\n * @param {?} message\n * @return {?}\n */\n Xmb.prototype.digest = function (message) { return digest$1(message); };\n return Xmb;\n }());\n var _Visitor$2 = (function () {\n function _Visitor() {\n }\n /**\n * @param {?} text\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitText = function (text, context) { return [new Text$2(text.value)]; };\n /**\n * @param {?} container\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitContainer = function (container, context) {\n var _this = this;\n var /** @type {?} */ nodes = [];\n container.children.forEach(function (node) { return nodes.push.apply(nodes, node.visit(_this)); });\n return nodes;\n };\n /**\n * @param {?} icu\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitIcu = function (icu, context) {\n var _this = this;\n var /** @type {?} */ nodes = [new Text$2(\"{\" + icu.expressionPlaceholder + \", \" + icu.type + \", \")];\n Object.keys(icu.cases).forEach(function (c) {\n nodes.push.apply(nodes, [new Text$2(c + \" {\")].concat(icu.cases[c].visit(_this), [new Text$2(\"} \")]));\n });\n nodes.push(new Text$2(\"}\"));\n return nodes;\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitTagPlaceholder = function (ph, context) {\n var /** @type {?} */ startEx = new Tag(_EXEMPLE_TAG, {}, [new Text$2(\"<\" + ph.tag + \">\")]);\n var /** @type {?} */ startTagPh = new Tag(_PLACEHOLDER_TAG$1, { name: ph.startName }, [startEx]);\n if (ph.isVoid) {\n // void tags have no children nor closing tags\n return [startTagPh];\n }\n var /** @type {?} */ closeEx = new Tag(_EXEMPLE_TAG, {}, [new Text$2(\"</\" + ph.tag + \">\")]);\n var /** @type {?} */ closeTagPh = new Tag(_PLACEHOLDER_TAG$1, { name: ph.closeName }, [closeEx]);\n return [startTagPh].concat(this.serialize(ph.children), [closeTagPh]);\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitPlaceholder = function (ph, context) {\n return [new Tag(_PLACEHOLDER_TAG$1, { name: ph.name })];\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n _Visitor.prototype.visitIcuPlaceholder = function (ph, context) {\n return [new Tag(_PLACEHOLDER_TAG$1, { name: ph.name })];\n };\n /**\n * @param {?} nodes\n * @return {?}\n */\n _Visitor.prototype.serialize = function (nodes) {\n var _this = this;\n return (_a = []).concat.apply(_a, nodes.map(function (node) { return node.visit(_this); }));\n var _a;\n };\n return _Visitor;\n }());\n /**\n * @param {?} message\n * @return {?}\n */\n function digest$1(message) {\n return decimalDigest(message);\n }\n // TC requires at least one non-empty example on placeholders\n var ExampleVisitor = (function () {\n function ExampleVisitor() {\n }\n /**\n * @param {?} node\n * @return {?}\n */\n ExampleVisitor.prototype.addDefaultExamples = function (node) {\n node.visit(this);\n return node;\n };\n /**\n * @param {?} tag\n * @return {?}\n */\n ExampleVisitor.prototype.visitTag = function (tag) {\n var _this = this;\n if (tag.name === _PLACEHOLDER_TAG$1) {\n if (!tag.children || tag.children.length == 0) {\n var /** @type {?} */ exText = new Text$2(tag.attrs['name'] || '...');\n tag.children = [new Tag(_EXEMPLE_TAG, {}, [exText])];\n }\n }\n else if (tag.children) {\n tag.children.forEach(function (node) { return node.visit(_this); });\n }\n };\n /**\n * @param {?} text\n * @return {?}\n */\n ExampleVisitor.prototype.visitText = function (text) { };\n /**\n * @param {?} decl\n * @return {?}\n */\n ExampleVisitor.prototype.visitDeclaration = function (decl) { };\n /**\n * @param {?} doctype\n * @return {?}\n */\n ExampleVisitor.prototype.visitDoctype = function (doctype) { };\n return ExampleVisitor;\n }());\n\n var /** @type {?} */ _TRANSLATIONS_TAG = 'translationbundle';\n var /** @type {?} */ _TRANSLATION_TAG = 'translation';\n var /** @type {?} */ _PLACEHOLDER_TAG$2 = 'ph';\n var Xtb = (function () {\n function Xtb() {\n }\n /**\n * @param {?} messages\n * @return {?}\n */\n Xtb.prototype.write = function (messages) { throw new Error('Unsupported'); };\n /**\n * @param {?} content\n * @param {?} url\n * @return {?}\n */\n Xtb.prototype.load = function (content, url) {\n // xtb to xml nodes\n var /** @type {?} */ xtbParser = new XtbParser();\n var _a = xtbParser.parse(content, url), mlNodesByMsgId = _a.mlNodesByMsgId, errors = _a.errors;\n // xml nodes to i18n nodes\n var /** @type {?} */ i18nNodesByMsgId = {};\n var /** @type {?} */ converter = new XmlToI18n$1();\n Object.keys(mlNodesByMsgId).forEach(function (msgId) {\n var _a = converter.convert(mlNodesByMsgId[msgId]), i18nNodes = _a.i18nNodes, e = _a.errors;\n errors.push.apply(errors, e);\n i18nNodesByMsgId[msgId] = i18nNodes;\n });\n if (errors.length) {\n throw new Error(\"xtb parse errors:\\n\" + errors.join('\\n'));\n }\n return i18nNodesByMsgId;\n };\n /**\n * @param {?} message\n * @return {?}\n */\n Xtb.prototype.digest = function (message) { return digest$1(message); };\n return Xtb;\n }());\n // Extract messages as xml nodes from the xtb file\n var XtbParser = (function () {\n function XtbParser() {\n }\n /**\n * @param {?} xtb\n * @param {?} url\n * @return {?}\n */\n XtbParser.prototype.parse = function (xtb, url) {\n this._bundleDepth = 0;\n this._mlNodesByMsgId = {};\n var /** @type {?} */ xml = new XmlParser().parse(xtb, url, true);\n this._errors = xml.errors;\n visitAll(this, xml.rootNodes);\n return {\n mlNodesByMsgId: this._mlNodesByMsgId,\n errors: this._errors,\n };\n };\n /**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitElement = function (element, context) {\n switch (element.name) {\n case _TRANSLATIONS_TAG:\n this._bundleDepth++;\n if (this._bundleDepth > 1) {\n this._addError(element, \"<\" + _TRANSLATIONS_TAG + \"> elements can not be nested\");\n }\n visitAll(this, element.children, null);\n this._bundleDepth--;\n break;\n case _TRANSLATION_TAG:\n var /** @type {?} */ idAttr = element.attrs.find(function (attr) { return attr.name === 'id'; });\n if (!idAttr) {\n this._addError(element, \"<\" + _TRANSLATION_TAG + \"> misses the \\\"id\\\" attribute\");\n }\n else {\n var /** @type {?} */ id = idAttr.value;\n if (this._mlNodesByMsgId.hasOwnProperty(id)) {\n this._addError(element, \"Duplicated translations for msg \" + id);\n }\n else {\n this._mlNodesByMsgId[id] = element.children;\n }\n }\n break;\n default:\n this._addError(element, 'Unexpected tag');\n }\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitAttribute = function (attribute, context) { };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitText = function (text, context) { };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitComment = function (comment, context) { };\n /**\n * @param {?} expansion\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitExpansion = function (expansion, context) { };\n /**\n * @param {?} expansionCase\n * @param {?} context\n * @return {?}\n */\n XtbParser.prototype.visitExpansionCase = function (expansionCase, context) { };\n /**\n * @param {?} node\n * @param {?} message\n * @return {?}\n */\n XtbParser.prototype._addError = function (node, message) {\n this._errors.push(new I18nError(node.sourceSpan, message));\n };\n return XtbParser;\n }());\n // Convert ml nodes (xtb syntax) to i18n nodes\n var XmlToI18n$1 = (function () {\n function XmlToI18n() {\n }\n /**\n * @param {?} nodes\n * @return {?}\n */\n XmlToI18n.prototype.convert = function (nodes) {\n this._errors = [];\n return {\n i18nNodes: visitAll(this, nodes),\n errors: this._errors,\n };\n };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitText = function (text, context) { return new Text$1(text.value, text.sourceSpan); };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitExpansion = function (icu, context) {\n var /** @type {?} */ caseMap = {};\n visitAll(this, icu.cases).forEach(function (c) {\n caseMap[c.value] = new Container(c.nodes, icu.sourceSpan);\n });\n return new Icu(icu.switchValue, icu.type, caseMap, icu.sourceSpan);\n };\n /**\n * @param {?} icuCase\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitExpansionCase = function (icuCase, context) {\n return {\n value: icuCase.value,\n nodes: visitAll(this, icuCase.expression),\n };\n };\n /**\n * @param {?} el\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitElement = function (el, context) {\n if (el.name === _PLACEHOLDER_TAG$2) {\n var /** @type {?} */ nameAttr = el.attrs.find(function (attr) { return attr.name === 'name'; });\n if (nameAttr) {\n return new Placeholder('', nameAttr.value, el.sourceSpan);\n }\n this._addError(el, \"<\" + _PLACEHOLDER_TAG$2 + \"> misses the \\\"name\\\" attribute\");\n }\n else {\n this._addError(el, \"Unexpected tag\");\n }\n };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitComment = function (comment, context) { };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n XmlToI18n.prototype.visitAttribute = function (attribute, context) { };\n /**\n * @param {?} node\n * @param {?} message\n * @return {?}\n */\n XmlToI18n.prototype._addError = function (node, message) {\n this._errors.push(new I18nError(node.sourceSpan, message));\n };\n return XmlToI18n;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$11 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var __decorate$3 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$3 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var HtmlParser = (function (_super) {\n __extends$11(HtmlParser, _super);\n function HtmlParser() {\n _super.call(this, getHtmlTagDefinition);\n }\n /**\n * @param {?} source\n * @param {?} url\n * @param {?=} parseExpansionForms\n * @param {?=} interpolationConfig\n * @return {?}\n */\n HtmlParser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n return _super.prototype.parse.call(this, source, url, parseExpansionForms, interpolationConfig);\n };\n HtmlParser = __decorate$3([\n CompilerInjectable(), \n __metadata$3('design:paramtypes', [])\n ], HtmlParser);\n return HtmlParser;\n }(Parser$1));\n\n /**\n * A container for translated messages\n */\n var TranslationBundle = (function () {\n /**\n * @param {?=} _i18nNodesByMsgId\n * @param {?} digest\n */\n function TranslationBundle(_i18nNodesByMsgId, digest) {\n if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }\n this._i18nNodesByMsgId = _i18nNodesByMsgId;\n this.digest = digest;\n this._i18nToHtml = new I18nToHtmlVisitor(_i18nNodesByMsgId, digest);\n }\n /**\n * @param {?} content\n * @param {?} url\n * @param {?} serializer\n * @return {?}\n */\n TranslationBundle.load = function (content, url, serializer) {\n var /** @type {?} */ i18nNodesByMsgId = serializer.load(content, url);\n var /** @type {?} */ digestFn = function (m) { return serializer.digest(m); };\n return new TranslationBundle(i18nNodesByMsgId, digestFn);\n };\n /**\n * @param {?} srcMsg\n * @return {?}\n */\n TranslationBundle.prototype.get = function (srcMsg) {\n var /** @type {?} */ html = this._i18nToHtml.convert(srcMsg);\n if (html.errors.length) {\n throw new Error(html.errors.join('\\n'));\n }\n return html.nodes;\n };\n /**\n * @param {?} srcMsg\n * @return {?}\n */\n TranslationBundle.prototype.has = function (srcMsg) { return this.digest(srcMsg) in this._i18nNodesByMsgId; };\n return TranslationBundle;\n }());\n var I18nToHtmlVisitor = (function () {\n /**\n * @param {?=} _i18nNodesByMsgId\n * @param {?} _digest\n */\n function I18nToHtmlVisitor(_i18nNodesByMsgId, _digest) {\n if (_i18nNodesByMsgId === void 0) { _i18nNodesByMsgId = {}; }\n this._i18nNodesByMsgId = _i18nNodesByMsgId;\n this._digest = _digest;\n this._srcMsgStack = [];\n this._errors = [];\n }\n /**\n * @param {?} srcMsg\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.convert = function (srcMsg) {\n this._srcMsgStack.length = 0;\n this._errors.length = 0;\n // i18n to text\n var /** @type {?} */ text = this._convertToText(srcMsg);\n // text to html\n var /** @type {?} */ url = srcMsg.nodes[0].sourceSpan.start.file.url;\n var /** @type {?} */ html = new HtmlParser().parse(text, url, true);\n return {\n nodes: html.rootNodes,\n errors: this._errors.concat(html.errors),\n };\n };\n /**\n * @param {?} text\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitText = function (text, context) { return text.value; };\n /**\n * @param {?} container\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitContainer = function (container, context) {\n var _this = this;\n return container.children.map(function (n) { return n.visit(_this); }).join('');\n };\n /**\n * @param {?} icu\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitIcu = function (icu, context) {\n var _this = this;\n var /** @type {?} */ cases = Object.keys(icu.cases).map(function (k) { return (k + \" {\" + icu.cases[k].visit(_this) + \"}\"); });\n // TODO(vicb): Once all format switch to using expression placeholders\n // we should throw when the placeholder is not in the source message\n var /** @type {?} */ exp = this._srcMsg.placeholders.hasOwnProperty(icu.expression) ?\n this._srcMsg.placeholders[icu.expression] :\n icu.expression;\n return \"{\" + exp + \", \" + icu.type + \", \" + cases.join(' ') + \"}\";\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitPlaceholder = function (ph, context) {\n var /** @type {?} */ phName = ph.name;\n if (this._srcMsg.placeholders.hasOwnProperty(phName)) {\n return this._srcMsg.placeholders[phName];\n }\n if (this._srcMsg.placeholderToMessage.hasOwnProperty(phName)) {\n return this._convertToText(this._srcMsg.placeholderToMessage[phName]);\n }\n this._addError(ph, \"Unknown placeholder\");\n return '';\n };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitTagPlaceholder = function (ph, context) { throw 'unreachable code'; };\n /**\n * @param {?} ph\n * @param {?=} context\n * @return {?}\n */\n I18nToHtmlVisitor.prototype.visitIcuPlaceholder = function (ph, context) { throw 'unreachable code'; };\n /**\n * @param {?} srcMsg\n * @return {?}\n */\n I18nToHtmlVisitor.prototype._convertToText = function (srcMsg) {\n var _this = this;\n var /** @type {?} */ digest = this._digest(srcMsg);\n if (this._i18nNodesByMsgId.hasOwnProperty(digest)) {\n this._srcMsgStack.push(this._srcMsg);\n this._srcMsg = srcMsg;\n var /** @type {?} */ nodes = this._i18nNodesByMsgId[digest];\n var /** @type {?} */ text = nodes.map(function (node) { return node.visit(_this); }).join('');\n this._srcMsg = this._srcMsgStack.pop();\n return text;\n }\n this._addError(srcMsg.nodes[0], \"Missing translation for message \" + digest);\n return '';\n };\n /**\n * @param {?} el\n * @param {?} msg\n * @return {?}\n */\n I18nToHtmlVisitor.prototype._addError = function (el, msg) {\n this._errors.push(new I18nError(el.sourceSpan, msg));\n };\n return I18nToHtmlVisitor;\n }());\n\n var I18NHtmlParser = (function () {\n /**\n * @param {?} _htmlParser\n * @param {?=} _translations\n * @param {?=} _translationsFormat\n */\n function I18NHtmlParser(_htmlParser, _translations, _translationsFormat) {\n this._htmlParser = _htmlParser;\n this._translations = _translations;\n this._translationsFormat = _translationsFormat;\n }\n /**\n * @param {?} source\n * @param {?} url\n * @param {?=} parseExpansionForms\n * @param {?=} interpolationConfig\n * @return {?}\n */\n I18NHtmlParser.prototype.parse = function (source, url, parseExpansionForms, interpolationConfig) {\n if (parseExpansionForms === void 0) { parseExpansionForms = false; }\n if (interpolationConfig === void 0) { interpolationConfig = DEFAULT_INTERPOLATION_CONFIG; }\n var /** @type {?} */ parseResult = this._htmlParser.parse(source, url, parseExpansionForms, interpolationConfig);\n if (!this._translations || this._translations === '') {\n // Do not enable i18n when no translation bundle is provided\n return parseResult;\n }\n // TODO(vicb): add support for implicit tags / attributes\n if (parseResult.errors.length) {\n return new ParseTreeResult(parseResult.rootNodes, parseResult.errors);\n }\n var /** @type {?} */ serializer = this._createSerializer();\n var /** @type {?} */ translationBundle = TranslationBundle.load(this._translations, url, serializer);\n return mergeTranslations(parseResult.rootNodes, translationBundle, interpolationConfig, [], {});\n };\n /**\n * @return {?}\n */\n I18NHtmlParser.prototype._createSerializer = function () {\n var /** @type {?} */ format = (this._translationsFormat || 'xlf').toLowerCase();\n switch (format) {\n case 'xmb':\n return new Xmb();\n case 'xtb':\n return new Xtb();\n case 'xliff':\n case 'xlf':\n default:\n return new Xliff();\n }\n };\n return I18NHtmlParser;\n }());\n\n var /** @type {?} */ APP_VIEW_MODULE_URL = assetUrl('core', 'linker/view');\n var /** @type {?} */ VIEW_UTILS_MODULE_URL = assetUrl('core', 'linker/view_utils');\n var /** @type {?} */ CD_MODULE_URL = assetUrl('core', 'change_detection/change_detection');\n var /** @type {?} */ ANIMATION_STYLE_UTIL_ASSET_URL = assetUrl('core', 'animation/animation_style_util');\n var Identifiers = (function () {\n function Identifiers() {\n }\n Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS = {\n name: 'ANALYZE_FOR_ENTRY_COMPONENTS',\n moduleUrl: assetUrl('core', 'metadata/di'),\n runtime: _angular_core.ANALYZE_FOR_ENTRY_COMPONENTS\n };\n Identifiers.ViewUtils = {\n name: 'ViewUtils',\n moduleUrl: assetUrl('core', 'linker/view_utils'),\n runtime: view_utils.ViewUtils\n };\n Identifiers.AppView = { name: 'AppView', moduleUrl: APP_VIEW_MODULE_URL, runtime: AppView };\n Identifiers.DebugAppView = {\n name: 'DebugAppView',\n moduleUrl: APP_VIEW_MODULE_URL,\n runtime: DebugAppView\n };\n Identifiers.ViewContainer = {\n name: 'ViewContainer',\n moduleUrl: assetUrl('core', 'linker/view_container'),\n runtime: ViewContainer\n };\n Identifiers.ElementRef = {\n name: 'ElementRef',\n moduleUrl: assetUrl('core', 'linker/element_ref'),\n runtime: _angular_core.ElementRef\n };\n Identifiers.ViewContainerRef = {\n name: 'ViewContainerRef',\n moduleUrl: assetUrl('core', 'linker/view_container_ref'),\n runtime: _angular_core.ViewContainerRef\n };\n Identifiers.ChangeDetectorRef = {\n name: 'ChangeDetectorRef',\n moduleUrl: assetUrl('core', 'change_detection/change_detector_ref'),\n runtime: _angular_core.ChangeDetectorRef\n };\n Identifiers.RenderComponentType = {\n name: 'RenderComponentType',\n moduleUrl: assetUrl('core', 'render/api'),\n runtime: _angular_core.RenderComponentType\n };\n Identifiers.QueryList = {\n name: 'QueryList',\n moduleUrl: assetUrl('core', 'linker/query_list'),\n runtime: _angular_core.QueryList\n };\n Identifiers.TemplateRef = {\n name: 'TemplateRef',\n moduleUrl: assetUrl('core', 'linker/template_ref'),\n runtime: _angular_core.TemplateRef\n };\n Identifiers.TemplateRef_ = {\n name: 'TemplateRef_',\n moduleUrl: assetUrl('core', 'linker/template_ref'),\n runtime: TemplateRef_\n };\n Identifiers.CodegenComponentFactoryResolver = {\n name: 'CodegenComponentFactoryResolver',\n moduleUrl: assetUrl('core', 'linker/component_factory_resolver'),\n runtime: CodegenComponentFactoryResolver\n };\n Identifiers.ComponentFactoryResolver = {\n name: 'ComponentFactoryResolver',\n moduleUrl: assetUrl('core', 'linker/component_factory_resolver'),\n runtime: _angular_core.ComponentFactoryResolver\n };\n Identifiers.ComponentFactory = {\n name: 'ComponentFactory',\n runtime: _angular_core.ComponentFactory,\n moduleUrl: assetUrl('core', 'linker/component_factory')\n };\n Identifiers.ComponentRef_ = {\n name: 'ComponentRef_',\n runtime: ComponentRef_,\n moduleUrl: assetUrl('core', 'linker/component_factory')\n };\n Identifiers.ComponentRef = {\n name: 'ComponentRef',\n runtime: _angular_core.ComponentRef,\n moduleUrl: assetUrl('core', 'linker/component_factory')\n };\n Identifiers.NgModuleFactory = {\n name: 'NgModuleFactory',\n runtime: _angular_core.NgModuleFactory,\n moduleUrl: assetUrl('core', 'linker/ng_module_factory')\n };\n Identifiers.NgModuleInjector = {\n name: 'NgModuleInjector',\n runtime: NgModuleInjector,\n moduleUrl: assetUrl('core', 'linker/ng_module_factory')\n };\n Identifiers.RegisterModuleFactoryFn = {\n name: 'registerModuleFactory',\n runtime: registerModuleFactory,\n moduleUrl: assetUrl('core', 'linker/ng_module_factory_loader')\n };\n Identifiers.ValueUnwrapper = { name: 'ValueUnwrapper', moduleUrl: CD_MODULE_URL, runtime: ValueUnwrapper };\n Identifiers.Injector = {\n name: 'Injector',\n moduleUrl: assetUrl('core', 'di/injector'),\n runtime: _angular_core.Injector\n };\n Identifiers.ViewEncapsulation = {\n name: 'ViewEncapsulation',\n moduleUrl: assetUrl('core', 'metadata/view'),\n runtime: _angular_core.ViewEncapsulation\n };\n Identifiers.ViewType = {\n name: 'ViewType',\n moduleUrl: assetUrl('core', 'linker/view_type'),\n runtime: ViewType\n };\n Identifiers.ChangeDetectionStrategy = {\n name: 'ChangeDetectionStrategy',\n moduleUrl: CD_MODULE_URL,\n runtime: _angular_core.ChangeDetectionStrategy\n };\n Identifiers.StaticNodeDebugInfo = {\n name: 'StaticNodeDebugInfo',\n moduleUrl: assetUrl('core', 'linker/debug_context'),\n runtime: StaticNodeDebugInfo\n };\n Identifiers.DebugContext = {\n name: 'DebugContext',\n moduleUrl: assetUrl('core', 'linker/debug_context'),\n runtime: DebugContext\n };\n Identifiers.Renderer = {\n name: 'Renderer',\n moduleUrl: assetUrl('core', 'render/api'),\n runtime: _angular_core.Renderer\n };\n Identifiers.SimpleChange = { name: 'SimpleChange', moduleUrl: CD_MODULE_URL, runtime: _angular_core.SimpleChange };\n Identifiers.UNINITIALIZED = { name: 'UNINITIALIZED', moduleUrl: CD_MODULE_URL, runtime: UNINITIALIZED };\n Identifiers.ChangeDetectorStatus = {\n name: 'ChangeDetectorStatus',\n moduleUrl: CD_MODULE_URL,\n runtime: ChangeDetectorStatus\n };\n Identifiers.checkBinding = {\n name: 'checkBinding',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.checkBinding\n };\n Identifiers.devModeEqual = { name: 'devModeEqual', moduleUrl: CD_MODULE_URL, runtime: devModeEqual };\n Identifiers.inlineInterpolate = {\n name: 'inlineInterpolate',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.inlineInterpolate\n };\n Identifiers.interpolate = {\n name: 'interpolate',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.interpolate\n };\n Identifiers.castByValue = {\n name: 'castByValue',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.castByValue\n };\n Identifiers.EMPTY_ARRAY = {\n name: 'EMPTY_ARRAY',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.EMPTY_ARRAY\n };\n Identifiers.EMPTY_MAP = {\n name: 'EMPTY_MAP',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.EMPTY_MAP\n };\n Identifiers.createRenderElement = {\n name: 'createRenderElement',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.createRenderElement\n };\n Identifiers.selectOrCreateRenderHostElement = {\n name: 'selectOrCreateRenderHostElement',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.selectOrCreateRenderHostElement\n };\n Identifiers.pureProxies = [\n null,\n { name: 'pureProxy1', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy1 },\n { name: 'pureProxy2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy2 },\n { name: 'pureProxy3', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy3 },\n { name: 'pureProxy4', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy4 },\n { name: 'pureProxy5', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy5 },\n { name: 'pureProxy6', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy6 },\n { name: 'pureProxy7', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy7 },\n { name: 'pureProxy8', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy8 },\n { name: 'pureProxy9', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy9 },\n { name: 'pureProxy10', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.pureProxy10 },\n ];\n Identifiers.SecurityContext = {\n name: 'SecurityContext',\n moduleUrl: assetUrl('core', 'security'),\n runtime: _angular_core.SecurityContext,\n };\n Identifiers.AnimationKeyframe = {\n name: 'AnimationKeyframe',\n moduleUrl: assetUrl('core', 'animation/animation_keyframe'),\n runtime: AnimationKeyframe\n };\n Identifiers.AnimationStyles = {\n name: 'AnimationStyles',\n moduleUrl: assetUrl('core', 'animation/animation_styles'),\n runtime: AnimationStyles\n };\n Identifiers.NoOpAnimationPlayer = {\n name: 'NoOpAnimationPlayer',\n moduleUrl: assetUrl('core', 'animation/animation_player'),\n runtime: NoOpAnimationPlayer\n };\n Identifiers.AnimationGroupPlayer = {\n name: 'AnimationGroupPlayer',\n moduleUrl: assetUrl('core', 'animation/animation_group_player'),\n runtime: AnimationGroupPlayer\n };\n Identifiers.AnimationSequencePlayer = {\n name: 'AnimationSequencePlayer',\n moduleUrl: assetUrl('core', 'animation/animation_sequence_player'),\n runtime: AnimationSequencePlayer\n };\n Identifiers.prepareFinalAnimationStyles = {\n name: 'prepareFinalAnimationStyles',\n moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n runtime: prepareFinalAnimationStyles\n };\n Identifiers.balanceAnimationKeyframes = {\n name: 'balanceAnimationKeyframes',\n moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n runtime: balanceAnimationKeyframes\n };\n Identifiers.clearStyles = {\n name: 'clearStyles',\n moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n runtime: clearStyles\n };\n Identifiers.renderStyles = {\n name: 'renderStyles',\n moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n runtime: renderStyles\n };\n Identifiers.collectAndResolveStyles = {\n name: 'collectAndResolveStyles',\n moduleUrl: ANIMATION_STYLE_UTIL_ASSET_URL,\n runtime: collectAndResolveStyles\n };\n Identifiers.LOCALE_ID = {\n name: 'LOCALE_ID',\n moduleUrl: assetUrl('core', 'i18n/tokens'),\n runtime: _angular_core.LOCALE_ID\n };\n Identifiers.TRANSLATIONS_FORMAT = {\n name: 'TRANSLATIONS_FORMAT',\n moduleUrl: assetUrl('core', 'i18n/tokens'),\n runtime: _angular_core.TRANSLATIONS_FORMAT\n };\n Identifiers.setBindingDebugInfo = {\n name: 'setBindingDebugInfo',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.setBindingDebugInfo\n };\n Identifiers.setBindingDebugInfoForChanges = {\n name: 'setBindingDebugInfoForChanges',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.setBindingDebugInfoForChanges\n };\n Identifiers.AnimationTransition = {\n name: 'AnimationTransition',\n moduleUrl: assetUrl('core', 'animation/animation_transition'),\n runtime: AnimationTransition\n };\n // This is just the interface!\n Identifiers.InlineArray = { name: 'InlineArray', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: null };\n Identifiers.inlineArrays = [\n { name: 'InlineArray2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray2 },\n { name: 'InlineArray2', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray2 },\n { name: 'InlineArray4', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray4 },\n { name: 'InlineArray8', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray8 },\n { name: 'InlineArray16', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.InlineArray16 },\n ];\n Identifiers.EMPTY_INLINE_ARRAY = {\n name: 'EMPTY_INLINE_ARRAY',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.EMPTY_INLINE_ARRAY\n };\n Identifiers.InlineArrayDynamic = {\n name: 'InlineArrayDynamic',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.InlineArrayDynamic\n };\n Identifiers.subscribeToRenderElement = {\n name: 'subscribeToRenderElement',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.subscribeToRenderElement\n };\n Identifiers.createRenderComponentType = {\n name: 'createRenderComponentType',\n moduleUrl: VIEW_UTILS_MODULE_URL,\n runtime: view_utils.createRenderComponentType\n };\n Identifiers.noop = { name: 'noop', moduleUrl: VIEW_UTILS_MODULE_URL, runtime: view_utils.noop };\n return Identifiers;\n }());\n /**\n * @param {?} pkg\n * @param {?=} path\n * @param {?=} type\n * @return {?}\n */\n function assetUrl(pkg, path, type) {\n if (path === void 0) { path = null; }\n if (type === void 0) { type = 'src'; }\n if (path == null) {\n return \"@angular/\" + pkg + \"/index\";\n }\n else {\n return \"@angular/\" + pkg + \"/\" + type + \"/\" + path;\n }\n }\n /**\n * @param {?} identifier\n * @return {?}\n */\n function resolveIdentifier(identifier) {\n return reflector.resolveIdentifier(identifier.name, identifier.moduleUrl, identifier.runtime);\n }\n /**\n * @param {?} identifier\n * @return {?}\n */\n function createIdentifier(identifier) {\n var /** @type {?} */ reference = reflector.resolveIdentifier(identifier.name, identifier.moduleUrl, identifier.runtime);\n return { reference: reference };\n }\n /**\n * @param {?} identifier\n * @return {?}\n */\n function identifierToken(identifier) {\n return { identifier: identifier };\n }\n /**\n * @param {?} identifier\n * @return {?}\n */\n function createIdentifierToken(identifier) {\n return identifierToken(createIdentifier(identifier));\n }\n /**\n * @param {?} enumType\n * @param {?} name\n * @return {?}\n */\n function createEnumIdentifier(enumType, name) {\n var /** @type {?} */ resolvedEnum = reflector.resolveEnum(resolveIdentifier(enumType), name);\n return { reference: resolvedEnum };\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$12 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n // http://cldr.unicode.org/index/cldr-spec/plural-rules\n var /** @type {?} */ PLURAL_CASES = ['zero', 'one', 'two', 'few', 'many', 'other'];\n /**\n * Expands special forms into elements.\n * *\n * For example,\n * *\n * ```\n * { messages.length, plural,\n * =0 {zero}\n * =1 {one}\n * other {more than one}\n * }\n * ```\n * *\n * will be expanded into\n * *\n * ```\n * <ng-container [ngPlural]=\"messages.length\">\n * <template ngPluralCase=\"=0\">zero</template>\n * <template ngPluralCase=\"=1\">one</template>\n * <template ngPluralCase=\"other\">more than one</template>\n * </ng-container>\n * ```\n * @param {?} nodes\n * @return {?}\n */\n function expandNodes(nodes) {\n var /** @type {?} */ expander = new _Expander();\n return new ExpansionResult(visitAll(expander, nodes), expander.isExpanded, expander.errors);\n }\n var ExpansionResult = (function () {\n /**\n * @param {?} nodes\n * @param {?} expanded\n * @param {?} errors\n */\n function ExpansionResult(nodes, expanded, errors) {\n this.nodes = nodes;\n this.expanded = expanded;\n this.errors = errors;\n }\n return ExpansionResult;\n }());\n var ExpansionError = (function (_super) {\n __extends$12(ExpansionError, _super);\n /**\n * @param {?} span\n * @param {?} errorMsg\n */\n function ExpansionError(span, errorMsg) {\n _super.call(this, span, errorMsg);\n }\n return ExpansionError;\n }(ParseError));\n /**\n * Expand expansion forms (plural, select) to directives\n * *\n */\n var _Expander = (function () {\n function _Expander() {\n this.isExpanded = false;\n this.errors = [];\n }\n /**\n * @param {?} element\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitElement = function (element, context) {\n return new Element(element.name, element.attrs, visitAll(this, element.children), element.sourceSpan, element.startSourceSpan, element.endSourceSpan);\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitAttribute = function (attribute, context) { return attribute; };\n /**\n * @param {?} text\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitText = function (text, context) { return text; };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitComment = function (comment, context) { return comment; };\n /**\n * @param {?} icu\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitExpansion = function (icu, context) {\n this.isExpanded = true;\n return icu.type == 'plural' ? _expandPluralForm(icu, this.errors) :\n _expandDefaultForm(icu, this.errors);\n };\n /**\n * @param {?} icuCase\n * @param {?} context\n * @return {?}\n */\n _Expander.prototype.visitExpansionCase = function (icuCase, context) {\n throw new Error('Should not be reached');\n };\n return _Expander;\n }());\n /**\n * @param {?} ast\n * @param {?} errors\n * @return {?}\n */\n function _expandPluralForm(ast, errors) {\n var /** @type {?} */ children = ast.cases.map(function (c) {\n if (PLURAL_CASES.indexOf(c.value) == -1 && !c.value.match(/^=\\d+$/)) {\n errors.push(new ExpansionError(c.valueSourceSpan, \"Plural cases should be \\\"=<number>\\\" or one of \" + PLURAL_CASES.join(\", \")));\n }\n var /** @type {?} */ expansionResult = expandNodes(c.expression);\n errors.push.apply(errors, expansionResult.errors);\n return new Element(\"template\", [new Attribute$1('ngPluralCase', \"\" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n });\n var /** @type {?} */ switchAttr = new Attribute$1('[ngPlural]', ast.switchValue, ast.switchValueSourceSpan);\n return new Element('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);\n }\n /**\n * @param {?} ast\n * @param {?} errors\n * @return {?}\n */\n function _expandDefaultForm(ast, errors) {\n var /** @type {?} */ children = ast.cases.map(function (c) {\n var /** @type {?} */ expansionResult = expandNodes(c.expression);\n errors.push.apply(errors, expansionResult.errors);\n if (c.value === 'other') {\n // other is the default case when no values match\n return new Element(\"template\", [new Attribute$1('ngSwitchDefault', '', c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n }\n return new Element(\"template\", [new Attribute$1('ngSwitchCase', \"\" + c.value, c.valueSourceSpan)], expansionResult.nodes, c.sourceSpan, c.sourceSpan, c.sourceSpan);\n });\n var /** @type {?} */ switchAttr = new Attribute$1('[ngSwitch]', ast.switchValue, ast.switchValueSourceSpan);\n return new Element('ng-container', [switchAttr], children, ast.sourceSpan, ast.sourceSpan, ast.sourceSpan);\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$13 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var ProviderError = (function (_super) {\n __extends$13(ProviderError, _super);\n /**\n * @param {?} message\n * @param {?} span\n */\n function ProviderError(message, span) {\n _super.call(this, span, message);\n }\n return ProviderError;\n }(ParseError));\n var ProviderViewContext = (function () {\n /**\n * @param {?} component\n * @param {?} sourceSpan\n */\n function ProviderViewContext(component, sourceSpan) {\n var _this = this;\n this.component = component;\n this.sourceSpan = sourceSpan;\n this.errors = [];\n this.viewQueries = _getViewQueries(component);\n this.viewProviders = new Map();\n component.viewProviders.forEach(function (provider) {\n if (isBlank(_this.viewProviders.get(tokenReference(provider.token)))) {\n _this.viewProviders.set(tokenReference(provider.token), true);\n }\n });\n }\n return ProviderViewContext;\n }());\n var ProviderElementContext = (function () {\n /**\n * @param {?} viewContext\n * @param {?} _parent\n * @param {?} _isViewRoot\n * @param {?} _directiveAsts\n * @param {?} attrs\n * @param {?} refs\n * @param {?} _sourceSpan\n */\n function ProviderElementContext(viewContext, _parent, _isViewRoot, _directiveAsts, attrs, refs, _sourceSpan) {\n var _this = this;\n this.viewContext = viewContext;\n this._parent = _parent;\n this._isViewRoot = _isViewRoot;\n this._directiveAsts = _directiveAsts;\n this._sourceSpan = _sourceSpan;\n this._transformedProviders = new Map();\n this._seenProviders = new Map();\n this._hasViewContainer = false;\n this._attrs = {};\n attrs.forEach(function (attrAst) { return _this._attrs[attrAst.name] = attrAst.value; });\n var directivesMeta = _directiveAsts.map(function (directiveAst) { return directiveAst.directive; });\n this._allProviders =\n _resolveProvidersFromDirectives(directivesMeta, _sourceSpan, viewContext.errors);\n this._contentQueries = _getContentQueries(directivesMeta);\n var queriedTokens = new Map();\n Array.from(this._allProviders.values()).forEach(function (provider) {\n _this._addQueryReadsTo(provider.token, queriedTokens);\n });\n refs.forEach(function (refAst) { _this._addQueryReadsTo({ value: refAst.name }, queriedTokens); });\n if (isPresent(queriedTokens.get(resolveIdentifier(Identifiers.ViewContainerRef)))) {\n this._hasViewContainer = true;\n }\n // create the providers that we know are eager first\n Array.from(this._allProviders.values()).forEach(function (provider) {\n var eager = provider.eager || isPresent(queriedTokens.get(tokenReference(provider.token)));\n if (eager) {\n _this._getOrCreateLocalProvider(provider.providerType, provider.token, true);\n }\n });\n }\n /**\n * @return {?}\n */\n ProviderElementContext.prototype.afterElement = function () {\n var _this = this;\n // collect lazy providers\n Array.from(this._allProviders.values()).forEach(function (provider) {\n _this._getOrCreateLocalProvider(provider.providerType, provider.token, false);\n });\n };\n Object.defineProperty(ProviderElementContext.prototype, \"transformProviders\", {\n /**\n * @return {?}\n */\n get: function () {\n return Array.from(this._transformedProviders.values());\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ProviderElementContext.prototype, \"transformedDirectiveAsts\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ sortedProviderTypes = this.transformProviders.map(function (provider) { return provider.token.identifier; });\n var /** @type {?} */ sortedDirectives = this._directiveAsts.slice();\n sortedDirectives.sort(function (dir1, dir2) { return sortedProviderTypes.indexOf(dir1.directive.type) -\n sortedProviderTypes.indexOf(dir2.directive.type); });\n return sortedDirectives;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ProviderElementContext.prototype, \"transformedHasViewContainer\", {\n /**\n * @return {?}\n */\n get: function () { return this._hasViewContainer; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} token\n * @param {?} queryReadTokens\n * @return {?}\n */\n ProviderElementContext.prototype._addQueryReadsTo = function (token, queryReadTokens) {\n this._getQueriesFor(token).forEach(function (query) {\n var /** @type {?} */ queryReadToken = query.read || token;\n if (isBlank(queryReadTokens.get(tokenReference(queryReadToken)))) {\n queryReadTokens.set(tokenReference(queryReadToken), true);\n }\n });\n };\n /**\n * @param {?} token\n * @return {?}\n */\n ProviderElementContext.prototype._getQueriesFor = function (token) {\n var /** @type {?} */ result = [];\n var /** @type {?} */ currentEl = this;\n var /** @type {?} */ distance = 0;\n var /** @type {?} */ queries;\n while (currentEl !== null) {\n queries = currentEl._contentQueries.get(tokenReference(token));\n if (isPresent(queries)) {\n result.push.apply(result, queries.filter(function (query) { return query.descendants || distance <= 1; }));\n }\n if (currentEl._directiveAsts.length > 0) {\n distance++;\n }\n currentEl = currentEl._parent;\n }\n queries = this.viewContext.viewQueries.get(tokenReference(token));\n if (isPresent(queries)) {\n result.push.apply(result, queries);\n }\n return result;\n };\n /**\n * @param {?} requestingProviderType\n * @param {?} token\n * @param {?} eager\n * @return {?}\n */\n ProviderElementContext.prototype._getOrCreateLocalProvider = function (requestingProviderType, token, eager) {\n var _this = this;\n var /** @type {?} */ resolvedProvider = this._allProviders.get(tokenReference(token));\n if (!resolvedProvider || ((requestingProviderType === ProviderAstType.Directive ||\n requestingProviderType === ProviderAstType.PublicService) &&\n resolvedProvider.providerType === ProviderAstType.PrivateService) ||\n ((requestingProviderType === ProviderAstType.PrivateService ||\n requestingProviderType === ProviderAstType.PublicService) &&\n resolvedProvider.providerType === ProviderAstType.Builtin)) {\n return null;\n }\n var /** @type {?} */ transformedProviderAst = this._transformedProviders.get(tokenReference(token));\n if (isPresent(transformedProviderAst)) {\n return transformedProviderAst;\n }\n if (isPresent(this._seenProviders.get(tokenReference(token)))) {\n this.viewContext.errors.push(new ProviderError(\"Cannot instantiate cyclic dependency! \" + tokenName(token), this._sourceSpan));\n return null;\n }\n this._seenProviders.set(tokenReference(token), true);\n var /** @type {?} */ transformedProviders = resolvedProvider.providers.map(function (provider) {\n var /** @type {?} */ transformedUseValue = provider.useValue;\n var /** @type {?} */ transformedUseExisting = provider.useExisting;\n var /** @type {?} */ transformedDeps;\n if (isPresent(provider.useExisting)) {\n var /** @type {?} */ existingDiDep = _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting }, eager);\n if (isPresent(existingDiDep.token)) {\n transformedUseExisting = existingDiDep.token;\n }\n else {\n transformedUseExisting = null;\n transformedUseValue = existingDiDep.value;\n }\n }\n else if (isPresent(provider.useFactory)) {\n var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n transformedDeps =\n deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });\n }\n else if (isPresent(provider.useClass)) {\n var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n transformedDeps =\n deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep, eager); });\n }\n return _transformProvider(provider, {\n useExisting: transformedUseExisting,\n useValue: transformedUseValue,\n deps: transformedDeps\n });\n });\n transformedProviderAst =\n _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders });\n this._transformedProviders.set(tokenReference(token), transformedProviderAst);\n return transformedProviderAst;\n };\n /**\n * @param {?} requestingProviderType\n * @param {?} dep\n * @param {?=} eager\n * @return {?}\n */\n ProviderElementContext.prototype._getLocalDependency = function (requestingProviderType, dep, eager) {\n if (eager === void 0) { eager = null; }\n if (dep.isAttribute) {\n var /** @type {?} */ attrValue = this._attrs[dep.token.value];\n return { isValue: true, value: attrValue == null ? null : attrValue };\n }\n if (isPresent(dep.token)) {\n // access builtints\n if ((requestingProviderType === ProviderAstType.Directive ||\n requestingProviderType === ProviderAstType.Component)) {\n if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Renderer) ||\n tokenReference(dep.token) === resolveIdentifier(Identifiers.ElementRef) ||\n tokenReference(dep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef) ||\n tokenReference(dep.token) === resolveIdentifier(Identifiers.TemplateRef)) {\n return dep;\n }\n if (tokenReference(dep.token) === resolveIdentifier(Identifiers.ViewContainerRef)) {\n this._hasViewContainer = true;\n }\n }\n // access the injector\n if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector)) {\n return dep;\n }\n // access providers\n if (isPresent(this._getOrCreateLocalProvider(requestingProviderType, dep.token, eager))) {\n return dep;\n }\n }\n return null;\n };\n /**\n * @param {?} requestingProviderType\n * @param {?} dep\n * @param {?=} eager\n * @return {?}\n */\n ProviderElementContext.prototype._getDependency = function (requestingProviderType, dep, eager) {\n if (eager === void 0) { eager = null; }\n var /** @type {?} */ currElement = this;\n var /** @type {?} */ currEager = eager;\n var /** @type {?} */ result = null;\n if (!dep.isSkipSelf) {\n result = this._getLocalDependency(requestingProviderType, dep, eager);\n }\n if (dep.isSelf) {\n if (!result && dep.isOptional) {\n result = { isValue: true, value: null };\n }\n }\n else {\n // check parent elements\n while (!result && isPresent(currElement._parent)) {\n var /** @type {?} */ prevElement = currElement;\n currElement = currElement._parent;\n if (prevElement._isViewRoot) {\n currEager = false;\n }\n result = currElement._getLocalDependency(ProviderAstType.PublicService, dep, currEager);\n }\n // check @Host restriction\n if (!result) {\n if (!dep.isHost || this.viewContext.component.isHost ||\n this.viewContext.component.type.reference === tokenReference(dep.token) ||\n isPresent(this.viewContext.viewProviders.get(tokenReference(dep.token)))) {\n result = dep;\n }\n else {\n result = dep.isOptional ? result = { isValue: true, value: null } : null;\n }\n }\n }\n if (!result) {\n this.viewContext.errors.push(new ProviderError(\"No provider for \" + tokenName(dep.token), this._sourceSpan));\n }\n return result;\n };\n return ProviderElementContext;\n }());\n var NgModuleProviderAnalyzer = (function () {\n /**\n * @param {?} ngModule\n * @param {?} extraProviders\n * @param {?} sourceSpan\n */\n function NgModuleProviderAnalyzer(ngModule, extraProviders, sourceSpan) {\n var _this = this;\n this._transformedProviders = new Map();\n this._seenProviders = new Map();\n this._errors = [];\n this._allProviders = new Map();\n ngModule.transitiveModule.modules.forEach(function (ngModuleType) {\n var ngModuleProvider = { token: { identifier: ngModuleType }, useClass: ngModuleType };\n _resolveProviders([ngModuleProvider], ProviderAstType.PublicService, true, sourceSpan, _this._errors, _this._allProviders);\n });\n _resolveProviders(ngModule.transitiveModule.providers.map(function (entry) { return entry.provider; }).concat(extraProviders), ProviderAstType.PublicService, false, sourceSpan, this._errors, this._allProviders);\n }\n /**\n * @return {?}\n */\n NgModuleProviderAnalyzer.prototype.parse = function () {\n var _this = this;\n Array.from(this._allProviders.values()).forEach(function (provider) {\n _this._getOrCreateLocalProvider(provider.token, provider.eager);\n });\n if (this._errors.length > 0) {\n var /** @type {?} */ errorString = this._errors.join('\\n');\n throw new Error(\"Provider parse errors:\\n\" + errorString);\n }\n return Array.from(this._transformedProviders.values());\n };\n /**\n * @param {?} token\n * @param {?} eager\n * @return {?}\n */\n NgModuleProviderAnalyzer.prototype._getOrCreateLocalProvider = function (token, eager) {\n var _this = this;\n var /** @type {?} */ resolvedProvider = this._allProviders.get(tokenReference(token));\n if (!resolvedProvider) {\n return null;\n }\n var /** @type {?} */ transformedProviderAst = this._transformedProviders.get(tokenReference(token));\n if (isPresent(transformedProviderAst)) {\n return transformedProviderAst;\n }\n if (isPresent(this._seenProviders.get(tokenReference(token)))) {\n this._errors.push(new ProviderError(\"Cannot instantiate cyclic dependency! \" + tokenName(token), resolvedProvider.sourceSpan));\n return null;\n }\n this._seenProviders.set(tokenReference(token), true);\n var /** @type {?} */ transformedProviders = resolvedProvider.providers.map(function (provider) {\n var /** @type {?} */ transformedUseValue = provider.useValue;\n var /** @type {?} */ transformedUseExisting = provider.useExisting;\n var /** @type {?} */ transformedDeps;\n if (isPresent(provider.useExisting)) {\n var /** @type {?} */ existingDiDep = _this._getDependency({ token: provider.useExisting }, eager, resolvedProvider.sourceSpan);\n if (isPresent(existingDiDep.token)) {\n transformedUseExisting = existingDiDep.token;\n }\n else {\n transformedUseExisting = null;\n transformedUseValue = existingDiDep.value;\n }\n }\n else if (isPresent(provider.useFactory)) {\n var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n transformedDeps =\n deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); });\n }\n else if (isPresent(provider.useClass)) {\n var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n transformedDeps =\n deps.map(function (dep) { return _this._getDependency(dep, eager, resolvedProvider.sourceSpan); });\n }\n return _transformProvider(provider, {\n useExisting: transformedUseExisting,\n useValue: transformedUseValue,\n deps: transformedDeps\n });\n });\n transformedProviderAst =\n _transformProviderAst(resolvedProvider, { eager: eager, providers: transformedProviders });\n this._transformedProviders.set(tokenReference(token), transformedProviderAst);\n return transformedProviderAst;\n };\n /**\n * @param {?} dep\n * @param {?=} eager\n * @param {?} requestorSourceSpan\n * @return {?}\n */\n NgModuleProviderAnalyzer.prototype._getDependency = function (dep, eager, requestorSourceSpan) {\n if (eager === void 0) { eager = null; }\n var /** @type {?} */ foundLocal = false;\n if (!dep.isSkipSelf && isPresent(dep.token)) {\n // access the injector\n if (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector) ||\n tokenReference(dep.token) === resolveIdentifier(Identifiers.ComponentFactoryResolver)) {\n foundLocal = true;\n }\n else if (isPresent(this._getOrCreateLocalProvider(dep.token, eager))) {\n foundLocal = true;\n }\n }\n var /** @type {?} */ result = dep;\n if (dep.isSelf && !foundLocal) {\n if (dep.isOptional) {\n result = { isValue: true, value: null };\n }\n else {\n this._errors.push(new ProviderError(\"No provider for \" + tokenName(dep.token), requestorSourceSpan));\n }\n }\n return result;\n };\n return NgModuleProviderAnalyzer;\n }());\n /**\n * @param {?} provider\n * @param {?} __1\n * @return {?}\n */\n function _transformProvider(provider, _a) {\n var useExisting = _a.useExisting, useValue = _a.useValue, deps = _a.deps;\n return {\n token: provider.token,\n useClass: provider.useClass,\n useExisting: useExisting,\n useFactory: provider.useFactory,\n useValue: useValue,\n deps: deps,\n multi: provider.multi\n };\n }\n /**\n * @param {?} provider\n * @param {?} __1\n * @return {?}\n */\n function _transformProviderAst(provider, _a) {\n var eager = _a.eager, providers = _a.providers;\n return new ProviderAst(provider.token, provider.multiProvider, provider.eager || eager, providers, provider.providerType, provider.lifecycleHooks, provider.sourceSpan);\n }\n /**\n * @param {?} directives\n * @param {?} sourceSpan\n * @param {?} targetErrors\n * @return {?}\n */\n function _resolveProvidersFromDirectives(directives, sourceSpan, targetErrors) {\n var /** @type {?} */ providersByToken = new Map();\n directives.forEach(function (directive) {\n var /** @type {?} */ dirProvider = { token: { identifier: directive.type }, useClass: directive.type };\n _resolveProviders([dirProvider], directive.isComponent ? ProviderAstType.Component : ProviderAstType.Directive, true, sourceSpan, targetErrors, providersByToken);\n });\n // Note: directives need to be able to overwrite providers of a component!\n var /** @type {?} */ directivesWithComponentFirst = directives.filter(function (dir) { return dir.isComponent; }).concat(directives.filter(function (dir) { return !dir.isComponent; }));\n directivesWithComponentFirst.forEach(function (directive) {\n _resolveProviders(directive.providers, ProviderAstType.PublicService, false, sourceSpan, targetErrors, providersByToken);\n _resolveProviders(directive.viewProviders, ProviderAstType.PrivateService, false, sourceSpan, targetErrors, providersByToken);\n });\n return providersByToken;\n }\n /**\n * @param {?} providers\n * @param {?} providerType\n * @param {?} eager\n * @param {?} sourceSpan\n * @param {?} targetErrors\n * @param {?} targetProvidersByToken\n * @return {?}\n */\n function _resolveProviders(providers, providerType, eager, sourceSpan, targetErrors, targetProvidersByToken) {\n providers.forEach(function (provider) {\n var /** @type {?} */ resolvedProvider = targetProvidersByToken.get(tokenReference(provider.token));\n if (isPresent(resolvedProvider) && !!resolvedProvider.multiProvider !== !!provider.multi) {\n targetErrors.push(new ProviderError(\"Mixing multi and non multi provider is not possible for token \" + tokenName(resolvedProvider.token), sourceSpan));\n }\n if (!resolvedProvider) {\n var /** @type {?} */ lifecycleHooks = provider.token.identifier &&\n ((provider.token.identifier)).lifecycleHooks ?\n ((provider.token.identifier)).lifecycleHooks :\n [];\n resolvedProvider = new ProviderAst(provider.token, provider.multi, eager || lifecycleHooks.length > 0, [provider], providerType, lifecycleHooks, sourceSpan);\n targetProvidersByToken.set(tokenReference(provider.token), resolvedProvider);\n }\n else {\n if (!provider.multi) {\n resolvedProvider.providers.length = 0;\n }\n resolvedProvider.providers.push(provider);\n }\n });\n }\n /**\n * @param {?} component\n * @return {?}\n */\n function _getViewQueries(component) {\n var /** @type {?} */ viewQueries = new Map();\n if (isPresent(component.viewQueries)) {\n component.viewQueries.forEach(function (query) { return _addQueryToTokenMap(viewQueries, query); });\n }\n return viewQueries;\n }\n /**\n * @param {?} directives\n * @return {?}\n */\n function _getContentQueries(directives) {\n var /** @type {?} */ contentQueries = new Map();\n directives.forEach(function (directive) {\n if (isPresent(directive.queries)) {\n directive.queries.forEach(function (query) { return _addQueryToTokenMap(contentQueries, query); });\n }\n });\n return contentQueries;\n }\n /**\n * @param {?} map\n * @param {?} query\n * @return {?}\n */\n function _addQueryToTokenMap(map, query) {\n query.selectors.forEach(function (token) {\n var /** @type {?} */ entry = map.get(tokenReference(token));\n if (!entry) {\n entry = [];\n map.set(tokenReference(token), entry);\n }\n entry.push(query);\n });\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * @abstract\n */\n var ElementSchemaRegistry = (function () {\n function ElementSchemaRegistry() {\n }\n /**\n * @abstract\n * @param {?} tagName\n * @param {?} propName\n * @param {?} schemaMetas\n * @return {?}\n */\n ElementSchemaRegistry.prototype.hasProperty = function (tagName, propName, schemaMetas) { };\n /**\n * @abstract\n * @param {?} tagName\n * @param {?} schemaMetas\n * @return {?}\n */\n ElementSchemaRegistry.prototype.hasElement = function (tagName, schemaMetas) { };\n /**\n * @abstract\n * @param {?} elementName\n * @param {?} propName\n * @param {?} isAttribute\n * @return {?}\n */\n ElementSchemaRegistry.prototype.securityContext = function (elementName, propName, isAttribute) { };\n /**\n * @abstract\n * @return {?}\n */\n ElementSchemaRegistry.prototype.allKnownElementNames = function () { };\n /**\n * @abstract\n * @param {?} propName\n * @return {?}\n */\n ElementSchemaRegistry.prototype.getMappedPropName = function (propName) { };\n /**\n * @abstract\n * @return {?}\n */\n ElementSchemaRegistry.prototype.getDefaultComponentElementName = function () { };\n /**\n * @abstract\n * @param {?} name\n * @return {?}\n */\n ElementSchemaRegistry.prototype.validateProperty = function (name) { };\n /**\n * @abstract\n * @param {?} name\n * @return {?}\n */\n ElementSchemaRegistry.prototype.validateAttribute = function (name) { };\n /**\n * @abstract\n * @param {?} propName\n * @return {?}\n */\n ElementSchemaRegistry.prototype.normalizeAnimationStyleProperty = function (propName) { };\n /**\n * @abstract\n * @param {?} camelCaseProp\n * @param {?} userProvidedProp\n * @param {?} val\n * @return {?}\n */\n ElementSchemaRegistry.prototype.normalizeAnimationStyleValue = function (camelCaseProp, userProvidedProp, val) { };\n return ElementSchemaRegistry;\n }());\n\n var StyleWithImports = (function () {\n /**\n * @param {?} style\n * @param {?} styleUrls\n */\n function StyleWithImports(style, styleUrls) {\n this.style = style;\n this.styleUrls = styleUrls;\n }\n return StyleWithImports;\n }());\n /**\n * @param {?} url\n * @return {?}\n */\n function isStyleUrlResolvable(url) {\n if (isBlank(url) || url.length === 0 || url[0] == '/')\n return false;\n var /** @type {?} */ schemeMatch = url.match(_urlWithSchemaRe);\n return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';\n }\n /**\n * Rewrites stylesheets by resolving and removing the @import urls that\n * are either relative or don't have a `package:` scheme\n * @param {?} resolver\n * @param {?} baseUrl\n * @param {?} cssText\n * @return {?}\n */\n function extractStyleUrls(resolver, baseUrl, cssText) {\n var /** @type {?} */ foundUrls = [];\n var /** @type {?} */ modifiedCssText = cssText.replace(_cssImportRe, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ url = m[1] || m[2];\n if (!isStyleUrlResolvable(url)) {\n // Do not attempt to resolve non-package absolute URLs with URI scheme\n return m[0];\n }\n foundUrls.push(resolver.resolve(baseUrl, url));\n return '';\n });\n return new StyleWithImports(modifiedCssText, foundUrls);\n }\n var /** @type {?} */ _cssImportRe = /@import\\s+(?:url\\()?\\s*(?:(?:['\"]([^'\"]*))|([^;\\)\\s]*))[^;]*;?/g;\n var /** @type {?} */ _urlWithSchemaRe = /^([^:/?#]+):/;\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$14 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ PROPERTY_PARTS_SEPARATOR = '.';\n var /** @type {?} */ ATTRIBUTE_PREFIX = 'attr';\n var /** @type {?} */ CLASS_PREFIX = 'class';\n var /** @type {?} */ STYLE_PREFIX = 'style';\n var /** @type {?} */ ANIMATE_PROP_PREFIX = 'animate-';\n var BoundPropertyType = {};\n BoundPropertyType.DEFAULT = 0;\n BoundPropertyType.LITERAL_ATTR = 1;\n BoundPropertyType.ANIMATION = 2;\n BoundPropertyType[BoundPropertyType.DEFAULT] = \"DEFAULT\";\n BoundPropertyType[BoundPropertyType.LITERAL_ATTR] = \"LITERAL_ATTR\";\n BoundPropertyType[BoundPropertyType.ANIMATION] = \"ANIMATION\";\n /**\n * Represents a parsed property.\n */\n var BoundProperty = (function () {\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} type\n * @param {?} sourceSpan\n */\n function BoundProperty(name, expression, type, sourceSpan) {\n this.name = name;\n this.expression = expression;\n this.type = type;\n this.sourceSpan = sourceSpan;\n }\n Object.defineProperty(BoundProperty.prototype, \"isLiteral\", {\n /**\n * @return {?}\n */\n get: function () { return this.type === BoundPropertyType.LITERAL_ATTR; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BoundProperty.prototype, \"isAnimation\", {\n /**\n * @return {?}\n */\n get: function () { return this.type === BoundPropertyType.ANIMATION; },\n enumerable: true,\n configurable: true\n });\n return BoundProperty;\n }());\n /**\n * Parses bindings in templates and in the directive host area.\n */\n var BindingParser = (function () {\n /**\n * @param {?} _exprParser\n * @param {?} _interpolationConfig\n * @param {?} _schemaRegistry\n * @param {?} pipes\n * @param {?} _targetErrors\n */\n function BindingParser(_exprParser, _interpolationConfig, _schemaRegistry, pipes, _targetErrors) {\n var _this = this;\n this._exprParser = _exprParser;\n this._interpolationConfig = _interpolationConfig;\n this._schemaRegistry = _schemaRegistry;\n this._targetErrors = _targetErrors;\n this.pipesByName = new Map();\n pipes.forEach(function (pipe) { return _this.pipesByName.set(pipe.name, pipe); });\n }\n /**\n * @param {?} dirMeta\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype.createDirectiveHostPropertyAsts = function (dirMeta, sourceSpan) {\n var _this = this;\n if (dirMeta.hostProperties) {\n var /** @type {?} */ boundProps_1 = [];\n Object.keys(dirMeta.hostProperties).forEach(function (propName) {\n var /** @type {?} */ expression = dirMeta.hostProperties[propName];\n if (typeof expression === 'string') {\n _this.parsePropertyBinding(propName, expression, true, sourceSpan, [], boundProps_1);\n }\n else {\n _this._reportError(\"Value of the host property binding \\\"\" + propName + \"\\\" needs to be a string representing an expression but got \\\"\" + expression + \"\\\" (\" + typeof expression + \")\", sourceSpan);\n }\n });\n return boundProps_1.map(function (prop) { return _this.createElementPropertyAst(dirMeta.selector, prop); });\n }\n };\n /**\n * @param {?} dirMeta\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype.createDirectiveHostEventAsts = function (dirMeta, sourceSpan) {\n var _this = this;\n if (dirMeta.hostListeners) {\n var /** @type {?} */ targetEventAsts_1 = [];\n Object.keys(dirMeta.hostListeners).forEach(function (propName) {\n var /** @type {?} */ expression = dirMeta.hostListeners[propName];\n if (typeof expression === 'string') {\n _this.parseEvent(propName, expression, sourceSpan, [], targetEventAsts_1);\n }\n else {\n _this._reportError(\"Value of the host listener \\\"\" + propName + \"\\\" needs to be a string representing an expression but got \\\"\" + expression + \"\\\" (\" + typeof expression + \")\", sourceSpan);\n }\n });\n return targetEventAsts_1;\n }\n };\n /**\n * @param {?} value\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype.parseInterpolation = function (value, sourceSpan) {\n var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n try {\n var /** @type {?} */ ast = this._exprParser.parseInterpolation(value, sourceInfo, this._interpolationConfig);\n if (ast)\n this._reportExpressionParserErrors(ast.errors, sourceSpan);\n this._checkPipes(ast, sourceSpan);\n return ast;\n }\n catch (e) {\n this._reportError(\"\" + e, sourceSpan);\n return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n }\n };\n /**\n * @param {?} name\n * @param {?} prefixToken\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @param {?} targetVars\n * @return {?}\n */\n BindingParser.prototype.parseInlineTemplateBinding = function (name, prefixToken, value, sourceSpan, targetMatchableAttrs, targetProps, targetVars) {\n var /** @type {?} */ bindings = this._parseTemplateBindings(prefixToken, value, sourceSpan);\n for (var /** @type {?} */ i = 0; i < bindings.length; i++) {\n var /** @type {?} */ binding = bindings[i];\n if (binding.keyIsVar) {\n targetVars.push(new VariableAst(binding.key, binding.name, sourceSpan));\n }\n else if (isPresent(binding.expression)) {\n this._parsePropertyAst(binding.key, binding.expression, sourceSpan, targetMatchableAttrs, targetProps);\n }\n else {\n targetMatchableAttrs.push([binding.key, '']);\n this.parseLiteralAttr(binding.key, null, sourceSpan, targetMatchableAttrs, targetProps);\n }\n }\n };\n /**\n * @param {?} prefixToken\n * @param {?} value\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype._parseTemplateBindings = function (prefixToken, value, sourceSpan) {\n var _this = this;\n var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n try {\n var /** @type {?} */ bindingsResult = this._exprParser.parseTemplateBindings(prefixToken, value, sourceInfo);\n this._reportExpressionParserErrors(bindingsResult.errors, sourceSpan);\n bindingsResult.templateBindings.forEach(function (binding) {\n if (isPresent(binding.expression)) {\n _this._checkPipes(binding.expression, sourceSpan);\n }\n });\n bindingsResult.warnings.forEach(function (warning) { _this._reportError(warning, sourceSpan, ParseErrorLevel.WARNING); });\n return bindingsResult.templateBindings;\n }\n catch (e) {\n this._reportError(\"\" + e, sourceSpan);\n return [];\n }\n };\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @return {?}\n */\n BindingParser.prototype.parseLiteralAttr = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {\n if (_isAnimationLabel(name)) {\n name = name.substring(1);\n if (value) {\n this._reportError(\"Assigning animation triggers via @prop=\\\"exp\\\" attributes with an expression is invalid.\" +\n \" Use property bindings (e.g. [@prop]=\\\"exp\\\") or use an attribute without a value (e.g. @prop) instead.\", sourceSpan, ParseErrorLevel.FATAL);\n }\n this._parseAnimation(name, value, sourceSpan, targetMatchableAttrs, targetProps);\n }\n else {\n targetProps.push(new BoundProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), BoundPropertyType.LITERAL_ATTR, sourceSpan));\n }\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} isHost\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @return {?}\n */\n BindingParser.prototype.parsePropertyBinding = function (name, expression, isHost, sourceSpan, targetMatchableAttrs, targetProps) {\n var /** @type {?} */ isAnimationProp = false;\n if (name.startsWith(ANIMATE_PROP_PREFIX)) {\n isAnimationProp = true;\n name = name.substring(ANIMATE_PROP_PREFIX.length);\n }\n else if (_isAnimationLabel(name)) {\n isAnimationProp = true;\n name = name.substring(1);\n }\n if (isAnimationProp) {\n this._parseAnimation(name, expression, sourceSpan, targetMatchableAttrs, targetProps);\n }\n else {\n this._parsePropertyAst(name, this._parseBinding(expression, isHost, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);\n }\n };\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @return {?}\n */\n BindingParser.prototype.parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {\n var /** @type {?} */ expr = this.parseInterpolation(value, sourceSpan);\n if (isPresent(expr)) {\n this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);\n return true;\n }\n return false;\n };\n /**\n * @param {?} name\n * @param {?} ast\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @return {?}\n */\n BindingParser.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {\n targetMatchableAttrs.push([name, ast.source]);\n targetProps.push(new BoundProperty(name, ast, BoundPropertyType.DEFAULT, sourceSpan));\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @return {?}\n */\n BindingParser.prototype._parseAnimation = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {\n // This will occur when a @trigger is not paired with an expression.\n // For animations it is valid to not have an expression since */void\n // states will be applied by angular when the element is attached/detached\n var /** @type {?} */ ast = this._parseBinding(expression || 'null', false, sourceSpan);\n targetMatchableAttrs.push([name, ast.source]);\n targetProps.push(new BoundProperty(name, ast, BoundPropertyType.ANIMATION, sourceSpan));\n };\n /**\n * @param {?} value\n * @param {?} isHostBinding\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype._parseBinding = function (value, isHostBinding, sourceSpan) {\n var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n try {\n var /** @type {?} */ ast = isHostBinding ?\n this._exprParser.parseSimpleBinding(value, sourceInfo, this._interpolationConfig) :\n this._exprParser.parseBinding(value, sourceInfo, this._interpolationConfig);\n if (ast)\n this._reportExpressionParserErrors(ast.errors, sourceSpan);\n this._checkPipes(ast, sourceSpan);\n return ast;\n }\n catch (e) {\n this._reportError(\"\" + e, sourceSpan);\n return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n }\n };\n /**\n * @param {?} elementSelector\n * @param {?} boundProp\n * @return {?}\n */\n BindingParser.prototype.createElementPropertyAst = function (elementSelector, boundProp) {\n if (boundProp.isAnimation) {\n return new BoundElementPropertyAst(boundProp.name, PropertyBindingType.Animation, _angular_core.SecurityContext.NONE, false, boundProp.expression, null, boundProp.sourceSpan);\n }\n var /** @type {?} */ unit = null;\n var /** @type {?} */ bindingType;\n var /** @type {?} */ boundPropertyName = null;\n var /** @type {?} */ parts = boundProp.name.split(PROPERTY_PARTS_SEPARATOR);\n var /** @type {?} */ securityContexts;\n // Check check for special cases (prefix style, attr, class)\n if (parts.length > 1) {\n if (parts[0] == ATTRIBUTE_PREFIX) {\n boundPropertyName = parts[1];\n this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, true);\n securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, true);\n var /** @type {?} */ nsSeparatorIdx = boundPropertyName.indexOf(':');\n if (nsSeparatorIdx > -1) {\n var /** @type {?} */ ns = boundPropertyName.substring(0, nsSeparatorIdx);\n var /** @type {?} */ name_1 = boundPropertyName.substring(nsSeparatorIdx + 1);\n boundPropertyName = mergeNsAndName(ns, name_1);\n }\n bindingType = PropertyBindingType.Attribute;\n }\n else if (parts[0] == CLASS_PREFIX) {\n boundPropertyName = parts[1];\n bindingType = PropertyBindingType.Class;\n securityContexts = [_angular_core.SecurityContext.NONE];\n }\n else if (parts[0] == STYLE_PREFIX) {\n unit = parts.length > 2 ? parts[2] : null;\n boundPropertyName = parts[1];\n bindingType = PropertyBindingType.Style;\n securityContexts = [_angular_core.SecurityContext.STYLE];\n }\n }\n // If not a special case, use the full property name\n if (boundPropertyName === null) {\n boundPropertyName = this._schemaRegistry.getMappedPropName(boundProp.name);\n securityContexts = calcPossibleSecurityContexts(this._schemaRegistry, elementSelector, boundPropertyName, false);\n bindingType = PropertyBindingType.Property;\n this._validatePropertyOrAttributeName(boundPropertyName, boundProp.sourceSpan, false);\n }\n return new BoundElementPropertyAst(boundPropertyName, bindingType, securityContexts.length === 1 ? securityContexts[0] : null, securityContexts.length > 1, boundProp.expression, unit, boundProp.sourceSpan);\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetEvents\n * @return {?}\n */\n BindingParser.prototype.parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n if (_isAnimationLabel(name)) {\n name = name.substr(1);\n this._parseAnimationEvent(name, expression, sourceSpan, targetEvents);\n }\n else {\n this._parseEvent(name, expression, sourceSpan, targetMatchableAttrs, targetEvents);\n }\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} targetEvents\n * @return {?}\n */\n BindingParser.prototype._parseAnimationEvent = function (name, expression, sourceSpan, targetEvents) {\n var /** @type {?} */ matches = splitAtPeriod(name, [name, '']);\n var /** @type {?} */ eventName = matches[0];\n var /** @type {?} */ phase = matches[1].toLowerCase();\n if (phase) {\n switch (phase) {\n case 'start':\n case 'done':\n var /** @type {?} */ ast = this._parseAction(expression, sourceSpan);\n targetEvents.push(new BoundEventAst(eventName, null, phase, ast, sourceSpan));\n break;\n default:\n this._reportError(\"The provided animation output phase value \\\"\" + phase + \"\\\" for \\\"@\" + eventName + \"\\\" is not supported (use start or done)\", sourceSpan);\n break;\n }\n }\n else {\n this._reportError(\"The animation trigger output event (@\" + eventName + \") is missing its phase value name (start or done are currently supported)\", sourceSpan);\n }\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetEvents\n * @return {?}\n */\n BindingParser.prototype._parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n // long format: 'target: eventName'\n var _a = splitAtColon(name, [null, name]), target = _a[0], eventName = _a[1];\n var /** @type {?} */ ast = this._parseAction(expression, sourceSpan);\n targetMatchableAttrs.push([name, ast.source]);\n targetEvents.push(new BoundEventAst(eventName, target, null, ast, sourceSpan));\n // Don't detect directives for event names for now,\n // so don't add the event name to the matchableAttrs\n };\n /**\n * @param {?} value\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype._parseAction = function (value, sourceSpan) {\n var /** @type {?} */ sourceInfo = sourceSpan.start.toString();\n try {\n var /** @type {?} */ ast = this._exprParser.parseAction(value, sourceInfo, this._interpolationConfig);\n if (ast) {\n this._reportExpressionParserErrors(ast.errors, sourceSpan);\n }\n if (!ast || ast.ast instanceof EmptyExpr) {\n this._reportError(\"Empty expressions are not allowed\", sourceSpan);\n return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n }\n this._checkPipes(ast, sourceSpan);\n return ast;\n }\n catch (e) {\n this._reportError(\"\" + e, sourceSpan);\n return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);\n }\n };\n /**\n * @param {?} message\n * @param {?} sourceSpan\n * @param {?=} level\n * @return {?}\n */\n BindingParser.prototype._reportError = function (message, sourceSpan, level) {\n if (level === void 0) { level = ParseErrorLevel.FATAL; }\n this._targetErrors.push(new ParseError(sourceSpan, message, level));\n };\n /**\n * @param {?} errors\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype._reportExpressionParserErrors = function (errors, sourceSpan) {\n for (var _i = 0, errors_1 = errors; _i < errors_1.length; _i++) {\n var error = errors_1[_i];\n this._reportError(error.message, sourceSpan);\n }\n };\n /**\n * @param {?} ast\n * @param {?} sourceSpan\n * @return {?}\n */\n BindingParser.prototype._checkPipes = function (ast, sourceSpan) {\n var _this = this;\n if (isPresent(ast)) {\n var /** @type {?} */ collector = new PipeCollector();\n ast.visit(collector);\n collector.pipes.forEach(function (ast, pipeName) {\n if (!_this.pipesByName.has(pipeName)) {\n _this._reportError(\"The pipe '\" + pipeName + \"' could not be found\", new ParseSourceSpan(sourceSpan.start.moveBy(ast.span.start), sourceSpan.start.moveBy(ast.span.end)));\n }\n });\n }\n };\n /**\n * @param {?} propName the name of the property / attribute\n * @param {?} sourceSpan\n * @param {?} isAttr true when binding to an attribute\n * @return {?}\n */\n BindingParser.prototype._validatePropertyOrAttributeName = function (propName, sourceSpan, isAttr) {\n var /** @type {?} */ report = isAttr ? this._schemaRegistry.validateAttribute(propName) :\n this._schemaRegistry.validateProperty(propName);\n if (report.error) {\n this._reportError(report.msg, sourceSpan, ParseErrorLevel.FATAL);\n }\n };\n return BindingParser;\n }());\n var PipeCollector = (function (_super) {\n __extends$14(PipeCollector, _super);\n function PipeCollector() {\n _super.apply(this, arguments);\n this.pipes = new Map();\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n PipeCollector.prototype.visitPipe = function (ast, context) {\n this.pipes.set(ast.name, ast);\n ast.exp.visit(this);\n this.visitAll(ast.args, context);\n return null;\n };\n return PipeCollector;\n }(RecursiveAstVisitor));\n /**\n * @param {?} name\n * @return {?}\n */\n function _isAnimationLabel(name) {\n return name[0] == '@';\n }\n /**\n * @param {?} registry\n * @param {?} selector\n * @param {?} propName\n * @param {?} isAttribute\n * @return {?}\n */\n function calcPossibleSecurityContexts(registry, selector, propName, isAttribute) {\n var /** @type {?} */ ctxs = [];\n CssSelector.parse(selector).forEach(function (selector) {\n var /** @type {?} */ elementNames = selector.element ? [selector.element] : registry.allKnownElementNames();\n var /** @type {?} */ notElementNames = new Set(selector.notSelectors.filter(function (selector) { return selector.isElementSelector(); })\n .map(function (selector) { return selector.element; }));\n var /** @type {?} */ possibleElementNames = elementNames.filter(function (elementName) { return !notElementNames.has(elementName); });\n ctxs.push.apply(ctxs, possibleElementNames.map(function (elementName) { return registry.securityContext(elementName, propName, isAttribute); }));\n });\n return ctxs.length === 0 ? [_angular_core.SecurityContext.NONE] : Array.from(new Set(ctxs)).sort();\n }\n\n var /** @type {?} */ NG_CONTENT_SELECT_ATTR = 'select';\n var /** @type {?} */ NG_CONTENT_ELEMENT = 'ng-content';\n var /** @type {?} */ LINK_ELEMENT = 'link';\n var /** @type {?} */ LINK_STYLE_REL_ATTR = 'rel';\n var /** @type {?} */ LINK_STYLE_HREF_ATTR = 'href';\n var /** @type {?} */ LINK_STYLE_REL_VALUE = 'stylesheet';\n var /** @type {?} */ STYLE_ELEMENT = 'style';\n var /** @type {?} */ SCRIPT_ELEMENT = 'script';\n var /** @type {?} */ NG_NON_BINDABLE_ATTR = 'ngNonBindable';\n var /** @type {?} */ NG_PROJECT_AS = 'ngProjectAs';\n /**\n * @param {?} ast\n * @return {?}\n */\n function preparseElement(ast) {\n var /** @type {?} */ selectAttr = null;\n var /** @type {?} */ hrefAttr = null;\n var /** @type {?} */ relAttr = null;\n var /** @type {?} */ nonBindable = false;\n var /** @type {?} */ projectAs = null;\n ast.attrs.forEach(function (attr) {\n var /** @type {?} */ lcAttrName = attr.name.toLowerCase();\n if (lcAttrName == NG_CONTENT_SELECT_ATTR) {\n selectAttr = attr.value;\n }\n else if (lcAttrName == LINK_STYLE_HREF_ATTR) {\n hrefAttr = attr.value;\n }\n else if (lcAttrName == LINK_STYLE_REL_ATTR) {\n relAttr = attr.value;\n }\n else if (attr.name == NG_NON_BINDABLE_ATTR) {\n nonBindable = true;\n }\n else if (attr.name == NG_PROJECT_AS) {\n if (attr.value.length > 0) {\n projectAs = attr.value;\n }\n }\n });\n selectAttr = normalizeNgContentSelect(selectAttr);\n var /** @type {?} */ nodeName = ast.name.toLowerCase();\n var /** @type {?} */ type = PreparsedElementType.OTHER;\n if (splitNsName(nodeName)[1] == NG_CONTENT_ELEMENT) {\n type = PreparsedElementType.NG_CONTENT;\n }\n else if (nodeName == STYLE_ELEMENT) {\n type = PreparsedElementType.STYLE;\n }\n else if (nodeName == SCRIPT_ELEMENT) {\n type = PreparsedElementType.SCRIPT;\n }\n else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {\n type = PreparsedElementType.STYLESHEET;\n }\n return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs);\n }\n var PreparsedElementType = {};\n PreparsedElementType.NG_CONTENT = 0;\n PreparsedElementType.STYLE = 1;\n PreparsedElementType.STYLESHEET = 2;\n PreparsedElementType.SCRIPT = 3;\n PreparsedElementType.OTHER = 4;\n PreparsedElementType[PreparsedElementType.NG_CONTENT] = \"NG_CONTENT\";\n PreparsedElementType[PreparsedElementType.STYLE] = \"STYLE\";\n PreparsedElementType[PreparsedElementType.STYLESHEET] = \"STYLESHEET\";\n PreparsedElementType[PreparsedElementType.SCRIPT] = \"SCRIPT\";\n PreparsedElementType[PreparsedElementType.OTHER] = \"OTHER\";\n var PreparsedElement = (function () {\n /**\n * @param {?} type\n * @param {?} selectAttr\n * @param {?} hrefAttr\n * @param {?} nonBindable\n * @param {?} projectAs\n */\n function PreparsedElement(type, selectAttr, hrefAttr, nonBindable, projectAs) {\n this.type = type;\n this.selectAttr = selectAttr;\n this.hrefAttr = hrefAttr;\n this.nonBindable = nonBindable;\n this.projectAs = projectAs;\n }\n return PreparsedElement;\n }());\n /**\n * @param {?} selectAttr\n * @return {?}\n */\n function normalizeNgContentSelect(selectAttr) {\n if (selectAttr === null || selectAttr.length === 0) {\n return '*';\n }\n return selectAttr;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n // Group 1 = \"bind-\"\n // Group 2 = \"let-\"\n // Group 3 = \"ref-/#\"\n // Group 4 = \"on-\"\n // Group 5 = \"bindon-\"\n // Group 6 = \"@\"\n // Group 7 = the identifier after \"bind-\", \"let-\", \"ref-/#\", \"on-\", \"bindon-\" or \"@\"\n // Group 8 = identifier inside [()]\n // Group 9 = identifier inside []\n // Group 10 = identifier inside ()\n var /** @type {?} */ BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\\[\\(([^\\)]+)\\)\\]|\\[([^\\]]+)\\]|\\(([^\\)]+)\\))$/;\n var /** @type {?} */ KW_BIND_IDX = 1;\n var /** @type {?} */ KW_LET_IDX = 2;\n var /** @type {?} */ KW_REF_IDX = 3;\n var /** @type {?} */ KW_ON_IDX = 4;\n var /** @type {?} */ KW_BINDON_IDX = 5;\n var /** @type {?} */ KW_AT_IDX = 6;\n var /** @type {?} */ IDENT_KW_IDX = 7;\n var /** @type {?} */ IDENT_BANANA_BOX_IDX = 8;\n var /** @type {?} */ IDENT_PROPERTY_IDX = 9;\n var /** @type {?} */ IDENT_EVENT_IDX = 10;\n var /** @type {?} */ TEMPLATE_ELEMENT = 'template';\n var /** @type {?} */ TEMPLATE_ATTR = 'template';\n var /** @type {?} */ TEMPLATE_ATTR_PREFIX = '*';\n var /** @type {?} */ CLASS_ATTR = 'class';\n var /** @type {?} */ TEXT_CSS_SELECTOR = CssSelector.parse('*')[0];\n /**\n * Provides an array of {@link TemplateAstVisitor}s which will be used to transform\n * parsed templates before compilation is invoked, allowing custom expression syntax\n * and other advanced transformations.\n *\n * This is currently an internal-only feature and not meant for general use.\n */\n var /** @type {?} */ TEMPLATE_TRANSFORMS = new _angular_core.OpaqueToken('TemplateTransforms');\n var TemplateParseError = (function (_super) {\n __extends(TemplateParseError, _super);\n /**\n * @param {?} message\n * @param {?} span\n * @param {?} level\n */\n function TemplateParseError(message, span, level) {\n _super.call(this, span, message, level);\n }\n return TemplateParseError;\n }(ParseError));\n var TemplateParseResult = (function () {\n /**\n * @param {?=} templateAst\n * @param {?=} errors\n */\n function TemplateParseResult(templateAst, errors) {\n this.templateAst = templateAst;\n this.errors = errors;\n }\n return TemplateParseResult;\n }());\n var TemplateParser = (function () {\n /**\n * @param {?} _exprParser\n * @param {?} _schemaRegistry\n * @param {?} _htmlParser\n * @param {?} _console\n * @param {?} transforms\n */\n function TemplateParser(_exprParser, _schemaRegistry, _htmlParser, _console, transforms) {\n this._exprParser = _exprParser;\n this._schemaRegistry = _schemaRegistry;\n this._htmlParser = _htmlParser;\n this._console = _console;\n this.transforms = transforms;\n }\n /**\n * @param {?} component\n * @param {?} template\n * @param {?} directives\n * @param {?} pipes\n * @param {?} schemas\n * @param {?} templateUrl\n * @return {?}\n */\n TemplateParser.prototype.parse = function (component, template, directives, pipes, schemas, templateUrl) {\n var /** @type {?} */ result = this.tryParse(component, template, directives, pipes, schemas, templateUrl);\n var /** @type {?} */ warnings = result.errors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; });\n var /** @type {?} */ errors = result.errors.filter(function (error) { return error.level === ParseErrorLevel.FATAL; });\n if (warnings.length > 0) {\n this._console.warn(\"Template parse warnings:\\n\" + warnings.join('\\n'));\n }\n if (errors.length > 0) {\n var /** @type {?} */ errorString = errors.join('\\n');\n throw new SyntaxError(\"Template parse errors:\\n\" + errorString);\n }\n return result.templateAst;\n };\n /**\n * @param {?} component\n * @param {?} template\n * @param {?} directives\n * @param {?} pipes\n * @param {?} schemas\n * @param {?} templateUrl\n * @return {?}\n */\n TemplateParser.prototype.tryParse = function (component, template, directives, pipes, schemas, templateUrl) {\n return this.tryParseHtml(this.expandHtml(this._htmlParser.parse(template, templateUrl, true, this.getInterpolationConfig(component))), component, template, directives, pipes, schemas, templateUrl);\n };\n /**\n * @param {?} htmlAstWithErrors\n * @param {?} component\n * @param {?} template\n * @param {?} directives\n * @param {?} pipes\n * @param {?} schemas\n * @param {?} templateUrl\n * @return {?}\n */\n TemplateParser.prototype.tryParseHtml = function (htmlAstWithErrors, component, template, directives, pipes, schemas, templateUrl) {\n var /** @type {?} */ result;\n var /** @type {?} */ errors = htmlAstWithErrors.errors;\n if (htmlAstWithErrors.rootNodes.length > 0) {\n var /** @type {?} */ uniqDirectives = removeSummaryDuplicates(directives);\n var /** @type {?} */ uniqPipes = removeSummaryDuplicates(pipes);\n var /** @type {?} */ providerViewContext = new ProviderViewContext(component, htmlAstWithErrors.rootNodes[0].sourceSpan);\n var /** @type {?} */ interpolationConfig = void 0;\n if (component.template && component.template.interpolation) {\n interpolationConfig = {\n start: component.template.interpolation[0],\n end: component.template.interpolation[1]\n };\n }\n var /** @type {?} */ bindingParser = new BindingParser(this._exprParser, interpolationConfig, this._schemaRegistry, uniqPipes, errors);\n var /** @type {?} */ parseVisitor = new TemplateParseVisitor(providerViewContext, uniqDirectives, bindingParser, this._schemaRegistry, schemas, errors);\n result = visitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_ELEMENT_CONTEXT);\n errors.push.apply(errors, providerViewContext.errors);\n }\n else {\n result = [];\n }\n this._assertNoReferenceDuplicationOnTemplate(result, errors);\n if (errors.length > 0) {\n return new TemplateParseResult(result, errors);\n }\n if (isPresent(this.transforms)) {\n this.transforms.forEach(function (transform) { result = templateVisitAll(transform, result); });\n }\n return new TemplateParseResult(result, errors);\n };\n /**\n * @param {?} htmlAstWithErrors\n * @param {?=} forced\n * @return {?}\n */\n TemplateParser.prototype.expandHtml = function (htmlAstWithErrors, forced) {\n if (forced === void 0) { forced = false; }\n var /** @type {?} */ errors = htmlAstWithErrors.errors;\n if (errors.length == 0 || forced) {\n // Transform ICU messages to angular directives\n var /** @type {?} */ expandedHtmlAst = expandNodes(htmlAstWithErrors.rootNodes);\n errors.push.apply(errors, expandedHtmlAst.errors);\n htmlAstWithErrors = new ParseTreeResult(expandedHtmlAst.nodes, errors);\n }\n return htmlAstWithErrors;\n };\n /**\n * @param {?} component\n * @return {?}\n */\n TemplateParser.prototype.getInterpolationConfig = function (component) {\n if (component.template) {\n return InterpolationConfig.fromArray(component.template.interpolation);\n }\n };\n /**\n * @param {?} result\n * @param {?} errors\n * @return {?}\n */\n TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate = function (result, errors) {\n var /** @type {?} */ existingReferences = [];\n result.filter(function (element) { return !!((element)).references; })\n .forEach(function (element) { return ((element)).references.forEach(function (reference) {\n var /** @type {?} */ name = reference.name;\n if (existingReferences.indexOf(name) < 0) {\n existingReferences.push(name);\n }\n else {\n var /** @type {?} */ error = new TemplateParseError(\"Reference \\\"#\" + name + \"\\\" is defined several times\", reference.sourceSpan, ParseErrorLevel.FATAL);\n errors.push(error);\n }\n }); });\n };\n /** @nocollapse */\n TemplateParser.ctorParameters = function () { return [\n { type: Parser, },\n { type: ElementSchemaRegistry, },\n { type: I18NHtmlParser, },\n { type: Console, },\n { type: Array, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [TEMPLATE_TRANSFORMS,] },] },\n ]; };\n TemplateParser = __decorate([\n CompilerInjectable(), \n __metadata('design:paramtypes', [Parser, ElementSchemaRegistry, I18NHtmlParser, Console, Array])\n ], TemplateParser);\n return TemplateParser;\n }());\n var TemplateParseVisitor = (function () {\n /**\n * @param {?} providerViewContext\n * @param {?} directives\n * @param {?} _bindingParser\n * @param {?} _schemaRegistry\n * @param {?} _schemas\n * @param {?} _targetErrors\n */\n function TemplateParseVisitor(providerViewContext, directives, _bindingParser, _schemaRegistry, _schemas, _targetErrors) {\n var _this = this;\n this.providerViewContext = providerViewContext;\n this._bindingParser = _bindingParser;\n this._schemaRegistry = _schemaRegistry;\n this._schemas = _schemas;\n this._targetErrors = _targetErrors;\n this.selectorMatcher = new SelectorMatcher();\n this.directivesIndex = new Map();\n this.ngContentCount = 0;\n directives.forEach(function (directive, index) {\n var selector = CssSelector.parse(directive.selector);\n _this.selectorMatcher.addSelectables(selector, directive);\n _this.directivesIndex.set(directive, index);\n });\n }\n /**\n * @param {?} expansion\n * @param {?} context\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitExpansion = function (expansion, context) { return null; };\n /**\n * @param {?} expansionCase\n * @param {?} context\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return null; };\n /**\n * @param {?} text\n * @param {?} parent\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitText = function (text, parent) {\n var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR);\n var /** @type {?} */ expr = this._bindingParser.parseInterpolation(text.value, text.sourceSpan);\n if (isPresent(expr)) {\n return new BoundTextAst(expr, ngContentIndex, text.sourceSpan);\n }\n else {\n return new TextAst(text.value, ngContentIndex, text.sourceSpan);\n }\n };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitAttribute = function (attribute, context) {\n return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);\n };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitComment = function (comment, context) { return null; };\n /**\n * @param {?} element\n * @param {?} parent\n * @return {?}\n */\n TemplateParseVisitor.prototype.visitElement = function (element, parent) {\n var _this = this;\n var /** @type {?} */ nodeName = element.name;\n var /** @type {?} */ preparsedElement = preparseElement(element);\n if (preparsedElement.type === PreparsedElementType.SCRIPT ||\n preparsedElement.type === PreparsedElementType.STYLE) {\n // Skipping <script> for security reasons\n // Skipping <style> as we already processed them\n // in the StyleCompiler\n return null;\n }\n if (preparsedElement.type === PreparsedElementType.STYLESHEET &&\n isStyleUrlResolvable(preparsedElement.hrefAttr)) {\n // Skipping stylesheets with either relative urls or package scheme as we already processed\n // them in the StyleCompiler\n return null;\n }\n var /** @type {?} */ matchableAttrs = [];\n var /** @type {?} */ elementOrDirectiveProps = [];\n var /** @type {?} */ elementOrDirectiveRefs = [];\n var /** @type {?} */ elementVars = [];\n var /** @type {?} */ events = [];\n var /** @type {?} */ templateElementOrDirectiveProps = [];\n var /** @type {?} */ templateMatchableAttrs = [];\n var /** @type {?} */ templateElementVars = [];\n var /** @type {?} */ hasInlineTemplates = false;\n var /** @type {?} */ attrs = [];\n var /** @type {?} */ lcElName = splitNsName(nodeName.toLowerCase())[1];\n var /** @type {?} */ isTemplateElement = lcElName == TEMPLATE_ELEMENT;\n element.attrs.forEach(function (attr) {\n var /** @type {?} */ hasBinding = _this._parseAttr(isTemplateElement, attr, matchableAttrs, elementOrDirectiveProps, events, elementOrDirectiveRefs, elementVars);\n var /** @type {?} */ templateBindingsSource = undefined;\n var /** @type {?} */ prefixToken = undefined;\n if (_this._normalizeAttributeName(attr.name) == TEMPLATE_ATTR) {\n templateBindingsSource = attr.value;\n }\n else if (attr.name.startsWith(TEMPLATE_ATTR_PREFIX)) {\n templateBindingsSource = attr.value;\n prefixToken = attr.name.substring(TEMPLATE_ATTR_PREFIX.length); // remove the star\n }\n var /** @type {?} */ hasTemplateBinding = isPresent(templateBindingsSource);\n if (hasTemplateBinding) {\n if (hasInlineTemplates) {\n _this._reportError(\"Can't have multiple template bindings on one element. Use only one attribute named 'template' or prefixed with *\", attr.sourceSpan);\n }\n hasInlineTemplates = true;\n _this._bindingParser.parseInlineTemplateBinding(attr.name, prefixToken, templateBindingsSource, attr.sourceSpan, templateMatchableAttrs, templateElementOrDirectiveProps, templateElementVars);\n }\n if (!hasBinding && !hasTemplateBinding) {\n // don't include the bindings as attributes as well in the AST\n attrs.push(_this.visitAttribute(attr, null));\n matchableAttrs.push([attr.name, attr.value]);\n }\n });\n var /** @type {?} */ elementCssSelector = createElementCssSelector(nodeName, matchableAttrs);\n var _a = this._parseDirectives(this.selectorMatcher, elementCssSelector), directiveMetas = _a.directives, matchElement = _a.matchElement;\n var /** @type {?} */ references = [];\n var /** @type {?} */ directiveAsts = this._createDirectiveAsts(isTemplateElement, element.name, directiveMetas, elementOrDirectiveProps, elementOrDirectiveRefs, element.sourceSpan, references);\n var /** @type {?} */ elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, directiveAsts);\n var /** @type {?} */ isViewRoot = parent.isTemplateElement || hasInlineTemplates;\n var /** @type {?} */ providerContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, isViewRoot, directiveAsts, attrs, references, element.sourceSpan);\n var /** @type {?} */ children = visitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, ElementContext.create(isTemplateElement, directiveAsts, isTemplateElement ? parent.providerContext : providerContext));\n providerContext.afterElement();\n // Override the actual selector when the `ngProjectAs` attribute is provided\n var /** @type {?} */ projectionSelector = isPresent(preparsedElement.projectAs) ?\n CssSelector.parse(preparsedElement.projectAs)[0] :\n elementCssSelector;\n var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(projectionSelector);\n var /** @type {?} */ parsedElement;\n if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {\n if (element.children && !element.children.every(_isEmptyTextNode)) {\n this._reportError(\"<ng-content> element cannot have content.\", element.sourceSpan);\n }\n parsedElement = new NgContentAst(this.ngContentCount++, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);\n }\n else if (isTemplateElement) {\n this._assertAllEventsPublishedByDirectives(directiveAsts, events);\n this._assertNoComponentsNorElementBindingsOnTemplate(directiveAsts, elementProps, element.sourceSpan);\n parsedElement = new EmbeddedTemplateAst(attrs, events, references, elementVars, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, children, hasInlineTemplates ? null : ngContentIndex, element.sourceSpan);\n }\n else {\n this._assertElementExists(matchElement, element);\n this._assertOnlyOneComponent(directiveAsts, element.sourceSpan);\n var /** @type {?} */ ngContentIndex_1 = hasInlineTemplates ? null : parent.findNgContentIndex(projectionSelector);\n parsedElement = new ElementAst(nodeName, attrs, elementProps, events, references, providerContext.transformedDirectiveAsts, providerContext.transformProviders, providerContext.transformedHasViewContainer, children, hasInlineTemplates ? null : ngContentIndex_1, element.sourceSpan, element.endSourceSpan);\n this._findComponentDirectives(directiveAsts)\n .forEach(function (componentDirectiveAst) { return _this._validateElementAnimationInputOutputs(componentDirectiveAst.hostProperties, componentDirectiveAst.hostEvents, componentDirectiveAst.directive.template); });\n var /** @type {?} */ componentTemplate = providerContext.viewContext.component.template;\n this._validateElementAnimationInputOutputs(elementProps, events, componentTemplate.toSummary());\n }\n if (hasInlineTemplates) {\n var /** @type {?} */ templateCssSelector = createElementCssSelector(TEMPLATE_ELEMENT, templateMatchableAttrs);\n var templateDirectiveMetas = this._parseDirectives(this.selectorMatcher, templateCssSelector).directives;\n var /** @type {?} */ templateDirectiveAsts = this._createDirectiveAsts(true, element.name, templateDirectiveMetas, templateElementOrDirectiveProps, [], element.sourceSpan, []);\n var /** @type {?} */ templateElementProps = this._createElementPropertyAsts(element.name, templateElementOrDirectiveProps, templateDirectiveAsts);\n this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectiveAsts, templateElementProps, element.sourceSpan);\n var /** @type {?} */ templateProviderContext = new ProviderElementContext(this.providerViewContext, parent.providerContext, parent.isTemplateElement, templateDirectiveAsts, [], [], element.sourceSpan);\n templateProviderContext.afterElement();\n parsedElement = new EmbeddedTemplateAst([], [], [], templateElementVars, templateProviderContext.transformedDirectiveAsts, templateProviderContext.transformProviders, templateProviderContext.transformedHasViewContainer, [parsedElement], ngContentIndex, element.sourceSpan);\n }\n return parsedElement;\n };\n /**\n * @param {?} inputs\n * @param {?} outputs\n * @param {?} template\n * @return {?}\n */\n TemplateParseVisitor.prototype._validateElementAnimationInputOutputs = function (inputs, outputs, template) {\n var _this = this;\n var /** @type {?} */ triggerLookup = new Set();\n template.animations.forEach(function (entry) { triggerLookup.add(entry); });\n var /** @type {?} */ animationInputs = inputs.filter(function (input) { return input.isAnimation; });\n animationInputs.forEach(function (input) {\n var /** @type {?} */ name = input.name;\n if (!triggerLookup.has(name)) {\n _this._reportError(\"Couldn't find an animation entry for \\\"\" + name + \"\\\"\", input.sourceSpan);\n }\n });\n outputs.forEach(function (output) {\n if (output.isAnimation) {\n var /** @type {?} */ found = animationInputs.find(function (input) { return input.name == output.name; });\n if (!found) {\n _this._reportError(\"Unable to listen on (@\" + output.name + \".\" + output.phase + \") because the animation trigger [@\" + output.name + \"] isn't being used on the same element\", output.sourceSpan);\n }\n }\n });\n };\n /**\n * @param {?} isTemplateElement\n * @param {?} attr\n * @param {?} targetMatchableAttrs\n * @param {?} targetProps\n * @param {?} targetEvents\n * @param {?} targetRefs\n * @param {?} targetVars\n * @return {?}\n */\n TemplateParseVisitor.prototype._parseAttr = function (isTemplateElement, attr, targetMatchableAttrs, targetProps, targetEvents, targetRefs, targetVars) {\n var /** @type {?} */ name = this._normalizeAttributeName(attr.name);\n var /** @type {?} */ value = attr.value;\n var /** @type {?} */ srcSpan = attr.sourceSpan;\n var /** @type {?} */ bindParts = name.match(BIND_NAME_REGEXP);\n var /** @type {?} */ hasBinding = false;\n if (bindParts !== null) {\n hasBinding = true;\n if (isPresent(bindParts[KW_BIND_IDX])) {\n this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n }\n else if (bindParts[KW_LET_IDX]) {\n if (isTemplateElement) {\n var /** @type {?} */ identifier = bindParts[IDENT_KW_IDX];\n this._parseVariable(identifier, value, srcSpan, targetVars);\n }\n else {\n this._reportError(\"\\\"let-\\\" is only supported on template elements.\", srcSpan);\n }\n }\n else if (bindParts[KW_REF_IDX]) {\n var /** @type {?} */ identifier = bindParts[IDENT_KW_IDX];\n this._parseReference(identifier, value, srcSpan, targetRefs);\n }\n else if (bindParts[KW_ON_IDX]) {\n this._bindingParser.parseEvent(bindParts[IDENT_KW_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n }\n else if (bindParts[KW_BINDON_IDX]) {\n this._bindingParser.parsePropertyBinding(bindParts[IDENT_KW_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n this._parseAssignmentEvent(bindParts[IDENT_KW_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n }\n else if (bindParts[KW_AT_IDX]) {\n this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);\n }\n else if (bindParts[IDENT_BANANA_BOX_IDX]) {\n this._bindingParser.parsePropertyBinding(bindParts[IDENT_BANANA_BOX_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n this._parseAssignmentEvent(bindParts[IDENT_BANANA_BOX_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n }\n else if (bindParts[IDENT_PROPERTY_IDX]) {\n this._bindingParser.parsePropertyBinding(bindParts[IDENT_PROPERTY_IDX], value, false, srcSpan, targetMatchableAttrs, targetProps);\n }\n else if (bindParts[IDENT_EVENT_IDX]) {\n this._bindingParser.parseEvent(bindParts[IDENT_EVENT_IDX], value, srcSpan, targetMatchableAttrs, targetEvents);\n }\n }\n else {\n hasBinding = this._bindingParser.parsePropertyInterpolation(name, value, srcSpan, targetMatchableAttrs, targetProps);\n }\n if (!hasBinding) {\n this._bindingParser.parseLiteralAttr(name, value, srcSpan, targetMatchableAttrs, targetProps);\n }\n return hasBinding;\n };\n /**\n * @param {?} attrName\n * @return {?}\n */\n TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {\n return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;\n };\n /**\n * @param {?} identifier\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?} targetVars\n * @return {?}\n */\n TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {\n if (identifier.indexOf('-') > -1) {\n this._reportError(\"\\\"-\\\" is not allowed in variable names\", sourceSpan);\n }\n targetVars.push(new VariableAst(identifier, value, sourceSpan));\n };\n /**\n * @param {?} identifier\n * @param {?} value\n * @param {?} sourceSpan\n * @param {?} targetRefs\n * @return {?}\n */\n TemplateParseVisitor.prototype._parseReference = function (identifier, value, sourceSpan, targetRefs) {\n if (identifier.indexOf('-') > -1) {\n this._reportError(\"\\\"-\\\" is not allowed in reference names\", sourceSpan);\n }\n targetRefs.push(new ElementOrDirectiveRef(identifier, value, sourceSpan));\n };\n /**\n * @param {?} name\n * @param {?} expression\n * @param {?} sourceSpan\n * @param {?} targetMatchableAttrs\n * @param {?} targetEvents\n * @return {?}\n */\n TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {\n this._bindingParser.parseEvent(name + \"Change\", expression + \"=$event\", sourceSpan, targetMatchableAttrs, targetEvents);\n };\n /**\n * @param {?} selectorMatcher\n * @param {?} elementCssSelector\n * @return {?}\n */\n TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {\n var _this = this;\n // Need to sort the directives so that we get consistent results throughout,\n // as selectorMatcher uses Maps inside.\n // Also deduplicate directives as they might match more than one time!\n var /** @type {?} */ directives = new Array(this.directivesIndex.size);\n // Whether any directive selector matches on the element name\n var /** @type {?} */ matchElement = false;\n selectorMatcher.match(elementCssSelector, function (selector, directive) {\n directives[_this.directivesIndex.get(directive)] = directive;\n matchElement = matchElement || selector.hasElementSelector();\n });\n return {\n directives: directives.filter(function (dir) { return !!dir; }),\n matchElement: matchElement,\n };\n };\n /**\n * @param {?} isTemplateElement\n * @param {?} elementName\n * @param {?} directives\n * @param {?} props\n * @param {?} elementOrDirectiveRefs\n * @param {?} elementSourceSpan\n * @param {?} targetReferences\n * @return {?}\n */\n TemplateParseVisitor.prototype._createDirectiveAsts = function (isTemplateElement, elementName, directives, props, elementOrDirectiveRefs, elementSourceSpan, targetReferences) {\n var _this = this;\n var /** @type {?} */ matchedReferences = new Set();\n var /** @type {?} */ component = null;\n var /** @type {?} */ directiveAsts = directives.map(function (directive) {\n var /** @type {?} */ sourceSpan = new ParseSourceSpan(elementSourceSpan.start, elementSourceSpan.end, \"Directive \" + identifierName(directive.type));\n if (directive.isComponent) {\n component = directive;\n }\n var /** @type {?} */ directiveProperties = [];\n var /** @type {?} */ hostProperties = _this._bindingParser.createDirectiveHostPropertyAsts(directive, sourceSpan);\n // Note: We need to check the host properties here as well,\n // as we don't know the element name in the DirectiveWrapperCompiler yet.\n _this._checkPropertiesInSchema(elementName, hostProperties);\n var /** @type {?} */ hostEvents = _this._bindingParser.createDirectiveHostEventAsts(directive, sourceSpan);\n _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties);\n elementOrDirectiveRefs.forEach(function (elOrDirRef) {\n if ((elOrDirRef.value.length === 0 && directive.isComponent) ||\n (directive.exportAs == elOrDirRef.value)) {\n targetReferences.push(new ReferenceAst(elOrDirRef.name, identifierToken(directive.type), elOrDirRef.sourceSpan));\n matchedReferences.add(elOrDirRef.name);\n }\n });\n return new DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, sourceSpan);\n });\n elementOrDirectiveRefs.forEach(function (elOrDirRef) {\n if (elOrDirRef.value.length > 0) {\n if (!matchedReferences.has(elOrDirRef.name)) {\n _this._reportError(\"There is no directive with \\\"exportAs\\\" set to \\\"\" + elOrDirRef.value + \"\\\"\", elOrDirRef.sourceSpan);\n }\n }\n else if (!component) {\n var /** @type {?} */ refToken = null;\n if (isTemplateElement) {\n refToken = createIdentifierToken(Identifiers.TemplateRef);\n }\n targetReferences.push(new ReferenceAst(elOrDirRef.name, refToken, elOrDirRef.sourceSpan));\n }\n }); // fix syntax highlighting issue: `\n return directiveAsts;\n };\n /**\n * @param {?} directiveProperties\n * @param {?} boundProps\n * @param {?} targetBoundDirectiveProps\n * @return {?}\n */\n TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps) {\n if (directiveProperties) {\n var /** @type {?} */ boundPropsByName_1 = new Map();\n boundProps.forEach(function (boundProp) {\n var /** @type {?} */ prevValue = boundPropsByName_1.get(boundProp.name);\n if (!prevValue || prevValue.isLiteral) {\n // give [a]=\"b\" a higher precedence than a=\"b\" on the same element\n boundPropsByName_1.set(boundProp.name, boundProp);\n }\n });\n Object.keys(directiveProperties).forEach(function (dirProp) {\n var /** @type {?} */ elProp = directiveProperties[dirProp];\n var /** @type {?} */ boundProp = boundPropsByName_1.get(elProp);\n // Bindings are optional, so this binding only needs to be set up if an expression is given.\n if (boundProp) {\n targetBoundDirectiveProps.push(new BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));\n }\n });\n }\n };\n /**\n * @param {?} elementName\n * @param {?} props\n * @param {?} directives\n * @return {?}\n */\n TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, directives) {\n var _this = this;\n var /** @type {?} */ boundElementProps = [];\n var /** @type {?} */ boundDirectivePropsIndex = new Map();\n directives.forEach(function (directive) {\n directive.inputs.forEach(function (prop) {\n boundDirectivePropsIndex.set(prop.templateName, prop);\n });\n });\n props.forEach(function (prop) {\n if (!prop.isLiteral && !boundDirectivePropsIndex.get(prop.name)) {\n boundElementProps.push(_this._bindingParser.createElementPropertyAst(elementName, prop));\n }\n });\n this._checkPropertiesInSchema(elementName, boundElementProps);\n return boundElementProps;\n };\n /**\n * @param {?} directives\n * @return {?}\n */\n TemplateParseVisitor.prototype._findComponentDirectives = function (directives) {\n return directives.filter(function (directive) { return directive.directive.isComponent; });\n };\n /**\n * @param {?} directives\n * @return {?}\n */\n TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {\n return this._findComponentDirectives(directives)\n .map(function (directive) { return identifierName(directive.directive.type); });\n };\n /**\n * @param {?} directives\n * @param {?} sourceSpan\n * @return {?}\n */\n TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {\n var /** @type {?} */ componentTypeNames = this._findComponentDirectiveNames(directives);\n if (componentTypeNames.length > 1) {\n this._reportError(\"More than one component matched on this element.\\n\" +\n \"Make sure that only one component's selector can match a given element.\\n\" +\n (\"Conflicting components: \" + componentTypeNames.join(',')), sourceSpan);\n }\n };\n /**\n * Make sure that non-angular tags conform to the schemas.\n * *\n * Note: An element is considered an angular tag when at least one directive selector matches the\n * tag name.\n * *\n * @param {?} matchElement Whether any directive has matched on the tag name\n * @param {?} element the html element\n * @return {?}\n */\n TemplateParseVisitor.prototype._assertElementExists = function (matchElement, element) {\n var /** @type {?} */ elName = element.name.replace(/^:xhtml:/, '');\n if (!matchElement && !this._schemaRegistry.hasElement(elName, this._schemas)) {\n var /** @type {?} */ errorMsg = (\"'\" + elName + \"' is not a known element:\\n\") +\n (\"1. If '\" + elName + \"' is an Angular component, then verify that it is part of this module.\\n\") +\n (\"2. If '\" + elName + \"' is a Web Component then add \\\"CUSTOM_ELEMENTS_SCHEMA\\\" to the '@NgModule.schemas' of this component to suppress this message.\");\n this._reportError(errorMsg, element.sourceSpan);\n }\n };\n /**\n * @param {?} directives\n * @param {?} elementProps\n * @param {?} sourceSpan\n * @return {?}\n */\n TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {\n var _this = this;\n var /** @type {?} */ componentTypeNames = this._findComponentDirectiveNames(directives);\n if (componentTypeNames.length > 0) {\n this._reportError(\"Components on an embedded template: \" + componentTypeNames.join(','), sourceSpan);\n }\n elementProps.forEach(function (prop) {\n _this._reportError(\"Property binding \" + prop.name + \" not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the \\\"@NgModule.declarations\\\".\", sourceSpan);\n });\n };\n /**\n * @param {?} directives\n * @param {?} events\n * @return {?}\n */\n TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {\n var _this = this;\n var /** @type {?} */ allDirectiveEvents = new Set();\n directives.forEach(function (directive) {\n Object.keys(directive.directive.outputs).forEach(function (k) {\n var /** @type {?} */ eventName = directive.directive.outputs[k];\n allDirectiveEvents.add(eventName);\n });\n });\n events.forEach(function (event) {\n if (isPresent(event.target) || !allDirectiveEvents.has(event.name)) {\n _this._reportError(\"Event binding \" + event.fullName + \" not emitted by any directive on an embedded template. Make sure that the event name is spelled correctly and all directives are listed in the \\\"@NgModule.declarations\\\".\", event.sourceSpan);\n }\n });\n };\n /**\n * @param {?} elementName\n * @param {?} boundProps\n * @return {?}\n */\n TemplateParseVisitor.prototype._checkPropertiesInSchema = function (elementName, boundProps) {\n var _this = this;\n boundProps.forEach(function (boundProp) {\n if (boundProp.type === PropertyBindingType.Property &&\n !_this._schemaRegistry.hasProperty(elementName, boundProp.name, _this._schemas)) {\n var /** @type {?} */ errorMsg = \"Can't bind to '\" + boundProp.name + \"' since it isn't a known property of '\" + elementName + \"'.\";\n if (elementName.indexOf('-') > -1) {\n errorMsg +=\n (\"\\n1. If '\" + elementName + \"' is an Angular component and it has '\" + boundProp.name + \"' input, then verify that it is part of this module.\") +\n (\"\\n2. If '\" + elementName + \"' is a Web Component then add \\\"CUSTOM_ELEMENTS_SCHEMA\\\" to the '@NgModule.schemas' of this component to suppress this message.\\n\");\n }\n _this._reportError(errorMsg, boundProp.sourceSpan);\n }\n });\n };\n /**\n * @param {?} message\n * @param {?} sourceSpan\n * @param {?=} level\n * @return {?}\n */\n TemplateParseVisitor.prototype._reportError = function (message, sourceSpan, level) {\n if (level === void 0) { level = ParseErrorLevel.FATAL; }\n this._targetErrors.push(new ParseError(sourceSpan, message, level));\n };\n return TemplateParseVisitor;\n }());\n var NonBindableVisitor = (function () {\n function NonBindableVisitor() {\n }\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n NonBindableVisitor.prototype.visitElement = function (ast, parent) {\n var /** @type {?} */ preparsedElement = preparseElement(ast);\n if (preparsedElement.type === PreparsedElementType.SCRIPT ||\n preparsedElement.type === PreparsedElementType.STYLE ||\n preparsedElement.type === PreparsedElementType.STYLESHEET) {\n // Skipping <script> for security reasons\n // Skipping <style> and stylesheets as we already processed them\n // in the StyleCompiler\n return null;\n }\n var /** @type {?} */ attrNameAndValues = ast.attrs.map(function (attrAst) { return [attrAst.name, attrAst.value]; });\n var /** @type {?} */ selector = createElementCssSelector(ast.name, attrNameAndValues);\n var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(selector);\n var /** @type {?} */ children = visitAll(this, ast.children, EMPTY_ELEMENT_CONTEXT);\n return new ElementAst(ast.name, visitAll(this, ast.attrs), [], [], [], [], [], false, children, ngContentIndex, ast.sourceSpan, ast.endSourceSpan);\n };\n /**\n * @param {?} comment\n * @param {?} context\n * @return {?}\n */\n NonBindableVisitor.prototype.visitComment = function (comment, context) { return null; };\n /**\n * @param {?} attribute\n * @param {?} context\n * @return {?}\n */\n NonBindableVisitor.prototype.visitAttribute = function (attribute, context) {\n return new AttrAst(attribute.name, attribute.value, attribute.sourceSpan);\n };\n /**\n * @param {?} text\n * @param {?} parent\n * @return {?}\n */\n NonBindableVisitor.prototype.visitText = function (text, parent) {\n var /** @type {?} */ ngContentIndex = parent.findNgContentIndex(TEXT_CSS_SELECTOR);\n return new TextAst(text.value, ngContentIndex, text.sourceSpan);\n };\n /**\n * @param {?} expansion\n * @param {?} context\n * @return {?}\n */\n NonBindableVisitor.prototype.visitExpansion = function (expansion, context) { return expansion; };\n /**\n * @param {?} expansionCase\n * @param {?} context\n * @return {?}\n */\n NonBindableVisitor.prototype.visitExpansionCase = function (expansionCase, context) { return expansionCase; };\n return NonBindableVisitor;\n }());\n var ElementOrDirectiveRef = (function () {\n /**\n * @param {?} name\n * @param {?} value\n * @param {?} sourceSpan\n */\n function ElementOrDirectiveRef(name, value, sourceSpan) {\n this.name = name;\n this.value = value;\n this.sourceSpan = sourceSpan;\n }\n return ElementOrDirectiveRef;\n }());\n /**\n * @param {?} classAttrValue\n * @return {?}\n */\n function splitClasses(classAttrValue) {\n return classAttrValue.trim().split(/\\s+/g);\n }\n var ElementContext = (function () {\n /**\n * @param {?} isTemplateElement\n * @param {?} _ngContentIndexMatcher\n * @param {?} _wildcardNgContentIndex\n * @param {?} providerContext\n */\n function ElementContext(isTemplateElement, _ngContentIndexMatcher, _wildcardNgContentIndex, providerContext) {\n this.isTemplateElement = isTemplateElement;\n this._ngContentIndexMatcher = _ngContentIndexMatcher;\n this._wildcardNgContentIndex = _wildcardNgContentIndex;\n this.providerContext = providerContext;\n }\n /**\n * @param {?} isTemplateElement\n * @param {?} directives\n * @param {?} providerContext\n * @return {?}\n */\n ElementContext.create = function (isTemplateElement, directives, providerContext) {\n var /** @type {?} */ matcher = new SelectorMatcher();\n var /** @type {?} */ wildcardNgContentIndex = null;\n var /** @type {?} */ component = directives.find(function (directive) { return directive.directive.isComponent; });\n if (component) {\n var /** @type {?} */ ngContentSelectors = component.directive.template.ngContentSelectors;\n for (var /** @type {?} */ i = 0; i < ngContentSelectors.length; i++) {\n var /** @type {?} */ selector = ngContentSelectors[i];\n if (selector === '*') {\n wildcardNgContentIndex = i;\n }\n else {\n matcher.addSelectables(CssSelector.parse(ngContentSelectors[i]), i);\n }\n }\n }\n return new ElementContext(isTemplateElement, matcher, wildcardNgContentIndex, providerContext);\n };\n /**\n * @param {?} selector\n * @return {?}\n */\n ElementContext.prototype.findNgContentIndex = function (selector) {\n var /** @type {?} */ ngContentIndices = [];\n this._ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });\n ngContentIndices.sort();\n if (isPresent(this._wildcardNgContentIndex)) {\n ngContentIndices.push(this._wildcardNgContentIndex);\n }\n return ngContentIndices.length > 0 ? ngContentIndices[0] : null;\n };\n return ElementContext;\n }());\n /**\n * @param {?} elementName\n * @param {?} matchableAttrs\n * @return {?}\n */\n function createElementCssSelector(elementName, matchableAttrs) {\n var /** @type {?} */ cssSelector = new CssSelector();\n var /** @type {?} */ elNameNoNs = splitNsName(elementName)[1];\n cssSelector.setElement(elNameNoNs);\n for (var /** @type {?} */ i = 0; i < matchableAttrs.length; i++) {\n var /** @type {?} */ attrName = matchableAttrs[i][0];\n var /** @type {?} */ attrNameNoNs = splitNsName(attrName)[1];\n var /** @type {?} */ attrValue = matchableAttrs[i][1];\n cssSelector.addAttribute(attrNameNoNs, attrValue);\n if (attrName.toLowerCase() == CLASS_ATTR) {\n var /** @type {?} */ classes = splitClasses(attrValue);\n classes.forEach(function (className) { return cssSelector.addClassName(className); });\n }\n }\n return cssSelector;\n }\n var /** @type {?} */ EMPTY_ELEMENT_CONTEXT = new ElementContext(true, new SelectorMatcher(), null, null);\n var /** @type {?} */ NON_BINDABLE_VISITOR = new NonBindableVisitor();\n /**\n * @param {?} node\n * @return {?}\n */\n function _isEmptyTextNode(node) {\n return node instanceof Text && node.value.trim().length == 0;\n }\n /**\n * @param {?} items\n * @return {?}\n */\n function removeSummaryDuplicates(items) {\n var /** @type {?} */ map = new Map();\n items.forEach(function (item) {\n if (!map.get(item.type.reference)) {\n map.set(item.type.reference, item);\n }\n });\n return Array.from(map.values());\n }\n\n /**\n * @return {?}\n */\n function unimplemented$2() {\n throw new Error('unimplemented');\n }\n var CompilerConfig = (function () {\n /**\n * @param {?=} __0\n */\n function CompilerConfig(_a) {\n var _b = _a === void 0 ? {} : _a, _c = _b.renderTypes, renderTypes = _c === void 0 ? new DefaultRenderTypes() : _c, _d = _b.defaultEncapsulation, defaultEncapsulation = _d === void 0 ? _angular_core.ViewEncapsulation.Emulated : _d, genDebugInfo = _b.genDebugInfo, logBindingUpdate = _b.logBindingUpdate, _e = _b.useJit, useJit = _e === void 0 ? true : _e;\n this.renderTypes = renderTypes;\n this.defaultEncapsulation = defaultEncapsulation;\n this._genDebugInfo = genDebugInfo;\n this._logBindingUpdate = logBindingUpdate;\n this.useJit = useJit;\n }\n Object.defineProperty(CompilerConfig.prototype, \"genDebugInfo\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._genDebugInfo === void 0 ? _angular_core.isDevMode() : this._genDebugInfo;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(CompilerConfig.prototype, \"logBindingUpdate\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._logBindingUpdate === void 0 ? _angular_core.isDevMode() : this._logBindingUpdate;\n },\n enumerable: true,\n configurable: true\n });\n return CompilerConfig;\n }());\n /**\n * Types used for the renderer.\n * Can be replaced to specialize the generated output to a specific renderer\n * to help tree shaking.\n * @abstract\n */\n var RenderTypes = (function () {\n function RenderTypes() {\n }\n Object.defineProperty(RenderTypes.prototype, \"renderer\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderTypes.prototype, \"renderText\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderTypes.prototype, \"renderElement\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderTypes.prototype, \"renderComment\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderTypes.prototype, \"renderNode\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderTypes.prototype, \"renderEvent\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented$2(); },\n enumerable: true,\n configurable: true\n });\n return RenderTypes;\n }());\n var DefaultRenderTypes = (function () {\n function DefaultRenderTypes() {\n this.renderText = null;\n this.renderElement = null;\n this.renderComment = null;\n this.renderNode = null;\n this.renderEvent = null;\n }\n Object.defineProperty(DefaultRenderTypes.prototype, \"renderer\", {\n /**\n * @return {?}\n */\n get: function () { return createIdentifier(Identifiers.Renderer); },\n enumerable: true,\n configurable: true\n });\n ;\n return DefaultRenderTypes;\n }());\n\n var __extends$16 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @abstract\n */\n var AnimationAst = (function () {\n function AnimationAst() {\n this.startTime = 0;\n this.playTime = 0;\n }\n /**\n * @abstract\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationAst.prototype.visit = function (visitor, context) { };\n return AnimationAst;\n }());\n /**\n * @abstract\n */\n var AnimationStateAst = (function (_super) {\n __extends$16(AnimationStateAst, _super);\n function AnimationStateAst() {\n _super.apply(this, arguments);\n }\n /**\n * @abstract\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationStateAst.prototype.visit = function (visitor, context) { };\n return AnimationStateAst;\n }(AnimationAst));\n var AnimationEntryAst = (function (_super) {\n __extends$16(AnimationEntryAst, _super);\n /**\n * @param {?} name\n * @param {?} stateDeclarations\n * @param {?} stateTransitions\n */\n function AnimationEntryAst(name, stateDeclarations, stateTransitions) {\n _super.call(this);\n this.name = name;\n this.stateDeclarations = stateDeclarations;\n this.stateTransitions = stateTransitions;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationEntryAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationEntry(this, context);\n };\n return AnimationEntryAst;\n }(AnimationAst));\n var AnimationStateDeclarationAst = (function (_super) {\n __extends$16(AnimationStateDeclarationAst, _super);\n /**\n * @param {?} stateName\n * @param {?} styles\n */\n function AnimationStateDeclarationAst(stateName, styles) {\n _super.call(this);\n this.stateName = stateName;\n this.styles = styles;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationStateDeclarationAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationStateDeclaration(this, context);\n };\n return AnimationStateDeclarationAst;\n }(AnimationStateAst));\n var AnimationStateTransitionExpression = (function () {\n /**\n * @param {?} fromState\n * @param {?} toState\n */\n function AnimationStateTransitionExpression(fromState, toState) {\n this.fromState = fromState;\n this.toState = toState;\n }\n return AnimationStateTransitionExpression;\n }());\n var AnimationStateTransitionAst = (function (_super) {\n __extends$16(AnimationStateTransitionAst, _super);\n /**\n * @param {?} stateChanges\n * @param {?} animation\n */\n function AnimationStateTransitionAst(stateChanges, animation) {\n _super.call(this);\n this.stateChanges = stateChanges;\n this.animation = animation;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationStateTransitionAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationStateTransition(this, context);\n };\n return AnimationStateTransitionAst;\n }(AnimationStateAst));\n var AnimationStepAst = (function (_super) {\n __extends$16(AnimationStepAst, _super);\n /**\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n */\n function AnimationStepAst(startingStyles, keyframes, duration, delay, easing) {\n _super.call(this);\n this.startingStyles = startingStyles;\n this.keyframes = keyframes;\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationStepAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationStep(this, context);\n };\n return AnimationStepAst;\n }(AnimationAst));\n var AnimationStylesAst = (function (_super) {\n __extends$16(AnimationStylesAst, _super);\n /**\n * @param {?} styles\n */\n function AnimationStylesAst(styles) {\n _super.call(this);\n this.styles = styles;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationStylesAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationStyles(this, context);\n };\n return AnimationStylesAst;\n }(AnimationAst));\n var AnimationKeyframeAst = (function (_super) {\n __extends$16(AnimationKeyframeAst, _super);\n /**\n * @param {?} offset\n * @param {?} styles\n */\n function AnimationKeyframeAst(offset, styles) {\n _super.call(this);\n this.offset = offset;\n this.styles = styles;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationKeyframeAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationKeyframe(this, context);\n };\n return AnimationKeyframeAst;\n }(AnimationAst));\n /**\n * @abstract\n */\n var AnimationWithStepsAst = (function (_super) {\n __extends$16(AnimationWithStepsAst, _super);\n /**\n * @param {?} steps\n */\n function AnimationWithStepsAst(steps) {\n _super.call(this);\n this.steps = steps;\n }\n return AnimationWithStepsAst;\n }(AnimationAst));\n var AnimationGroupAst = (function (_super) {\n __extends$16(AnimationGroupAst, _super);\n /**\n * @param {?} steps\n */\n function AnimationGroupAst(steps) {\n _super.call(this, steps);\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationGroupAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationGroup(this, context);\n };\n return AnimationGroupAst;\n }(AnimationWithStepsAst));\n var AnimationSequenceAst = (function (_super) {\n __extends$16(AnimationSequenceAst, _super);\n /**\n * @param {?} steps\n */\n function AnimationSequenceAst(steps) {\n _super.call(this, steps);\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n AnimationSequenceAst.prototype.visit = function (visitor, context) {\n return visitor.visitAnimationSequence(this, context);\n };\n return AnimationSequenceAst;\n }(AnimationWithStepsAst));\n\n var StylesCollectionEntry = (function () {\n /**\n * @param {?} time\n * @param {?} value\n */\n function StylesCollectionEntry(time, value) {\n this.time = time;\n this.value = value;\n }\n /**\n * @param {?} time\n * @param {?} value\n * @return {?}\n */\n StylesCollectionEntry.prototype.matches = function (time, value) {\n return time == this.time && value == this.value;\n };\n return StylesCollectionEntry;\n }());\n var StylesCollection = (function () {\n function StylesCollection() {\n this.styles = {};\n }\n /**\n * @param {?} property\n * @param {?} time\n * @param {?} value\n * @return {?}\n */\n StylesCollection.prototype.insertAtTime = function (property, time, value) {\n var /** @type {?} */ tuple = new StylesCollectionEntry(time, value);\n var /** @type {?} */ entries = this.styles[property];\n if (!isPresent(entries)) {\n entries = this.styles[property] = [];\n }\n // insert this at the right stop in the array\n // this way we can keep it sorted\n var /** @type {?} */ insertionIndex = 0;\n for (var /** @type {?} */ i = entries.length - 1; i >= 0; i--) {\n if (entries[i].time <= time) {\n insertionIndex = i + 1;\n break;\n }\n }\n entries.splice(insertionIndex, 0, tuple);\n };\n /**\n * @param {?} property\n * @param {?} index\n * @return {?}\n */\n StylesCollection.prototype.getByIndex = function (property, index) {\n var /** @type {?} */ items = this.styles[property];\n if (isPresent(items)) {\n return index >= items.length ? null : items[index];\n }\n return null;\n };\n /**\n * @param {?} property\n * @param {?} time\n * @return {?}\n */\n StylesCollection.prototype.indexOfAtOrBeforeTime = function (property, time) {\n var /** @type {?} */ entries = this.styles[property];\n if (isPresent(entries)) {\n for (var /** @type {?} */ i = entries.length - 1; i >= 0; i--) {\n if (entries[i].time <= time)\n return i;\n }\n }\n return null;\n };\n return StylesCollection;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$15 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var __decorate$4 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$4 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var /** @type {?} */ _INITIAL_KEYFRAME = 0;\n var /** @type {?} */ _TERMINAL_KEYFRAME = 1;\n var /** @type {?} */ _ONE_SECOND = 1000;\n var AnimationParseError = (function (_super) {\n __extends$15(AnimationParseError, _super);\n /**\n * @param {?} message\n */\n function AnimationParseError(message) {\n _super.call(this, null, message);\n }\n /**\n * @return {?}\n */\n AnimationParseError.prototype.toString = function () { return \"\" + this.msg; };\n return AnimationParseError;\n }(ParseError));\n var AnimationEntryParseResult = (function () {\n /**\n * @param {?} ast\n * @param {?} errors\n */\n function AnimationEntryParseResult(ast, errors) {\n this.ast = ast;\n this.errors = errors;\n }\n return AnimationEntryParseResult;\n }());\n var AnimationParser = (function () {\n /**\n * @param {?} _schema\n */\n function AnimationParser(_schema) {\n this._schema = _schema;\n }\n /**\n * @param {?} component\n * @return {?}\n */\n AnimationParser.prototype.parseComponent = function (component) {\n var _this = this;\n var /** @type {?} */ errors = [];\n var /** @type {?} */ componentName = identifierName(component.type);\n var /** @type {?} */ animationTriggerNames = new Set();\n var /** @type {?} */ asts = component.template.animations.map(function (entry) {\n var /** @type {?} */ result = _this.parseEntry(entry);\n var /** @type {?} */ ast = result.ast;\n var /** @type {?} */ triggerName = ast.name;\n if (animationTriggerNames.has(triggerName)) {\n result.errors.push(new AnimationParseError(\"The animation trigger \\\"\" + triggerName + \"\\\" has already been registered for the \" + componentName + \" component\"));\n }\n else {\n animationTriggerNames.add(triggerName);\n }\n if (result.errors.length > 0) {\n var /** @type {?} */ errorMessage_1 = \"- Unable to parse the animation sequence for \\\"\" + triggerName + \"\\\" on the \" + componentName + \" component due to the following errors:\";\n result.errors.forEach(function (error) { errorMessage_1 += '\\n-- ' + error.msg; });\n errors.push(errorMessage_1);\n }\n return ast;\n });\n if (errors.length > 0) {\n var /** @type {?} */ errorString = errors.join('\\n');\n throw new Error(\"Animation parse errors:\\n\" + errorString);\n }\n return asts;\n };\n /**\n * @param {?} entry\n * @return {?}\n */\n AnimationParser.prototype.parseEntry = function (entry) {\n var _this = this;\n var /** @type {?} */ errors = [];\n var /** @type {?} */ stateStyles = {};\n var /** @type {?} */ transitions = [];\n var /** @type {?} */ stateDeclarationAsts = [];\n entry.definitions.forEach(function (def) {\n if (def instanceof CompileAnimationStateDeclarationMetadata) {\n _parseAnimationDeclarationStates(def, _this._schema, errors).forEach(function (ast) {\n stateDeclarationAsts.push(ast);\n stateStyles[ast.stateName] = ast.styles;\n });\n }\n else {\n transitions.push(/** @type {?} */ (def));\n }\n });\n var /** @type {?} */ stateTransitionAsts = transitions.map(function (transDef) { return _parseAnimationStateTransition(transDef, stateStyles, _this._schema, errors); });\n var /** @type {?} */ ast = new AnimationEntryAst(entry.name, stateDeclarationAsts, stateTransitionAsts);\n return new AnimationEntryParseResult(ast, errors);\n };\n AnimationParser = __decorate$4([\n CompilerInjectable(), \n __metadata$4('design:paramtypes', [ElementSchemaRegistry])\n ], AnimationParser);\n return AnimationParser;\n }());\n /**\n * @param {?} stateMetadata\n * @param {?} schema\n * @param {?} errors\n * @return {?}\n */\n function _parseAnimationDeclarationStates(stateMetadata, schema, errors) {\n var /** @type {?} */ normalizedStyles = _normalizeStyleMetadata(stateMetadata.styles, {}, schema, errors, false);\n var /** @type {?} */ defStyles = new AnimationStylesAst(normalizedStyles);\n var /** @type {?} */ states = stateMetadata.stateNameExpr.split(/\\s*,\\s*/);\n return states.map(function (state) { return new AnimationStateDeclarationAst(state, defStyles); });\n }\n /**\n * @param {?} transitionStateMetadata\n * @param {?} stateStyles\n * @param {?} schema\n * @param {?} errors\n * @return {?}\n */\n function _parseAnimationStateTransition(transitionStateMetadata, stateStyles, schema, errors) {\n var /** @type {?} */ styles = new StylesCollection();\n var /** @type {?} */ transitionExprs = [];\n var /** @type {?} */ transitionStates = transitionStateMetadata.stateChangeExpr.split(/\\s*,\\s*/);\n transitionStates.forEach(function (expr) { transitionExprs.push.apply(transitionExprs, _parseAnimationTransitionExpr(expr, errors)); });\n var /** @type {?} */ entry = _normalizeAnimationEntry(transitionStateMetadata.steps);\n var /** @type {?} */ animation = _normalizeStyleSteps(entry, stateStyles, schema, errors);\n var /** @type {?} */ animationAst = _parseTransitionAnimation(animation, 0, styles, stateStyles, errors);\n if (errors.length == 0) {\n _fillAnimationAstStartingKeyframes(animationAst, styles, errors);\n }\n var /** @type {?} */ stepsAst = (animationAst instanceof AnimationWithStepsAst) ?\n animationAst :\n new AnimationSequenceAst([animationAst]);\n return new AnimationStateTransitionAst(transitionExprs, stepsAst);\n }\n /**\n * @param {?} alias\n * @param {?} errors\n * @return {?}\n */\n function _parseAnimationAlias(alias, errors) {\n switch (alias) {\n case ':enter':\n return 'void => *';\n case ':leave':\n return '* => void';\n default:\n errors.push(new AnimationParseError(\"the transition alias value \\\"\" + alias + \"\\\" is not supported\"));\n return '* => *';\n }\n }\n /**\n * @param {?} eventStr\n * @param {?} errors\n * @return {?}\n */\n function _parseAnimationTransitionExpr(eventStr, errors) {\n var /** @type {?} */ expressions = [];\n if (eventStr[0] == ':') {\n eventStr = _parseAnimationAlias(eventStr, errors);\n }\n var /** @type {?} */ match = eventStr.match(/^(\\*|[-\\w]+)\\s*(<?[=-]>)\\s*(\\*|[-\\w]+)$/);\n if (!isPresent(match) || match.length < 4) {\n errors.push(new AnimationParseError(\"the provided \" + eventStr + \" is not of a supported format\"));\n return expressions;\n }\n var /** @type {?} */ fromState = match[1];\n var /** @type {?} */ separator = match[2];\n var /** @type {?} */ toState = match[3];\n expressions.push(new AnimationStateTransitionExpression(fromState, toState));\n var /** @type {?} */ isFullAnyStateExpr = fromState == ANY_STATE && toState == ANY_STATE;\n if (separator[0] == '<' && !isFullAnyStateExpr) {\n expressions.push(new AnimationStateTransitionExpression(toState, fromState));\n }\n return expressions;\n }\n /**\n * @param {?} entry\n * @return {?}\n */\n function _normalizeAnimationEntry(entry) {\n return Array.isArray(entry) ? new CompileAnimationSequenceMetadata(entry) : entry;\n }\n /**\n * @param {?} entry\n * @param {?} stateStyles\n * @param {?} schema\n * @param {?} errors\n * @param {?} permitStateReferences\n * @return {?}\n */\n function _normalizeStyleMetadata(entry, stateStyles, schema, errors, permitStateReferences) {\n var /** @type {?} */ offset = entry.offset;\n if (offset > 1 || offset < 0) {\n errors.push(new AnimationParseError(\"Offset values for animations must be between 0 and 1\"));\n }\n var /** @type {?} */ normalizedStyles = [];\n entry.styles.forEach(function (styleEntry) {\n if (typeof styleEntry === 'string') {\n if (permitStateReferences) {\n normalizedStyles.push.apply(normalizedStyles, _resolveStylesFromState(/** @type {?} */ (styleEntry), stateStyles, errors));\n }\n else {\n errors.push(new AnimationParseError(\"State based animations cannot contain references to other states\"));\n }\n }\n else {\n var /** @type {?} */ stylesObj_1 = (styleEntry);\n var /** @type {?} */ normalizedStylesObj_1 = {};\n Object.keys(stylesObj_1).forEach(function (propName) {\n var /** @type {?} */ normalizedProp = schema.normalizeAnimationStyleProperty(propName);\n var /** @type {?} */ normalizedOutput = schema.normalizeAnimationStyleValue(normalizedProp, propName, stylesObj_1[propName]);\n var /** @type {?} */ normalizationError = normalizedOutput['error'];\n if (normalizationError) {\n errors.push(new AnimationParseError(normalizationError));\n }\n normalizedStylesObj_1[normalizedProp] = normalizedOutput['value'];\n });\n normalizedStyles.push(normalizedStylesObj_1);\n }\n });\n return normalizedStyles;\n }\n /**\n * @param {?} entry\n * @param {?} stateStyles\n * @param {?} schema\n * @param {?} errors\n * @return {?}\n */\n function _normalizeStyleSteps(entry, stateStyles, schema, errors) {\n var /** @type {?} */ steps = _normalizeStyleStepEntry(entry, stateStyles, schema, errors);\n return (entry instanceof CompileAnimationGroupMetadata) ?\n new CompileAnimationGroupMetadata(steps) :\n new CompileAnimationSequenceMetadata(steps);\n }\n /**\n * @param {?} stylesList\n * @param {?} newItem\n * @return {?}\n */\n function _mergeAnimationStyles(stylesList, newItem) {\n if (typeof newItem === 'object' && newItem !== null && stylesList.length > 0) {\n var /** @type {?} */ lastIndex = stylesList.length - 1;\n var /** @type {?} */ lastItem = stylesList[lastIndex];\n if (typeof lastItem === 'object' && lastItem !== null) {\n stylesList[lastIndex] = StringMapWrapper.merge(/** @type {?} */ (lastItem), /** @type {?} */ (newItem));\n return;\n }\n }\n stylesList.push(newItem);\n }\n /**\n * @param {?} entry\n * @param {?} stateStyles\n * @param {?} schema\n * @param {?} errors\n * @return {?}\n */\n function _normalizeStyleStepEntry(entry, stateStyles, schema, errors) {\n var /** @type {?} */ steps;\n if (entry instanceof CompileAnimationWithStepsMetadata) {\n steps = entry.steps;\n }\n else {\n return [entry];\n }\n var /** @type {?} */ newSteps = [];\n var /** @type {?} */ combinedStyles;\n steps.forEach(function (step) {\n if (step instanceof CompileAnimationStyleMetadata) {\n // this occurs when a style step is followed by a previous style step\n // or when the first style step is run. We want to concatenate all subsequent\n // style steps together into a single style step such that we have the correct\n // starting keyframe data to pass into the animation player.\n if (!isPresent(combinedStyles)) {\n combinedStyles = [];\n }\n _normalizeStyleMetadata(/** @type {?} */ (step), stateStyles, schema, errors, true)\n .forEach(function (entry) { _mergeAnimationStyles(combinedStyles, entry); });\n }\n else {\n // it is important that we create a metadata entry of the combined styles\n // before we go on an process the animate, sequence or group metadata steps.\n // This will ensure that the AST will have the previous styles painted on\n // screen before any further animations that use the styles take place.\n if (isPresent(combinedStyles)) {\n newSteps.push(new CompileAnimationStyleMetadata(0, combinedStyles));\n combinedStyles = null;\n }\n if (step instanceof CompileAnimationAnimateMetadata) {\n // we do not recurse into CompileAnimationAnimateMetadata since\n // those style steps are not going to be squashed\n var /** @type {?} */ animateStyleValue = ((step)).styles;\n if (animateStyleValue instanceof CompileAnimationStyleMetadata) {\n animateStyleValue.styles =\n _normalizeStyleMetadata(animateStyleValue, stateStyles, schema, errors, true);\n }\n else if (animateStyleValue instanceof CompileAnimationKeyframesSequenceMetadata) {\n animateStyleValue.steps.forEach(function (step) {\n step.styles = _normalizeStyleMetadata(step, stateStyles, schema, errors, true);\n });\n }\n }\n else if (step instanceof CompileAnimationWithStepsMetadata) {\n var /** @type {?} */ innerSteps = _normalizeStyleStepEntry(step, stateStyles, schema, errors);\n step = step instanceof CompileAnimationGroupMetadata ?\n new CompileAnimationGroupMetadata(innerSteps) :\n new CompileAnimationSequenceMetadata(innerSteps);\n }\n newSteps.push(step);\n }\n });\n // this happens when only styles were animated within the sequence\n if (isPresent(combinedStyles)) {\n newSteps.push(new CompileAnimationStyleMetadata(0, combinedStyles));\n }\n return newSteps;\n }\n /**\n * @param {?} stateName\n * @param {?} stateStyles\n * @param {?} errors\n * @return {?}\n */\n function _resolveStylesFromState(stateName, stateStyles, errors) {\n var /** @type {?} */ styles = [];\n if (stateName[0] != ':') {\n errors.push(new AnimationParseError(\"Animation states via styles must be prefixed with a \\\":\\\"\"));\n }\n else {\n var /** @type {?} */ normalizedStateName = stateName.substring(1);\n var /** @type {?} */ value = stateStyles[normalizedStateName];\n if (!isPresent(value)) {\n errors.push(new AnimationParseError(\"Unable to apply styles due to missing a state: \\\"\" + normalizedStateName + \"\\\"\"));\n }\n else {\n value.styles.forEach(function (stylesEntry) {\n if (typeof stylesEntry === 'object' && stylesEntry !== null) {\n styles.push(/** @type {?} */ (stylesEntry));\n }\n });\n }\n }\n return styles;\n }\n var _AnimationTimings = (function () {\n /**\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n */\n function _AnimationTimings(duration, delay, easing) {\n this.duration = duration;\n this.delay = delay;\n this.easing = easing;\n }\n return _AnimationTimings;\n }());\n /**\n * @param {?} keyframeSequence\n * @param {?} currentTime\n * @param {?} collectedStyles\n * @param {?} stateStyles\n * @param {?} errors\n * @return {?}\n */\n function _parseAnimationKeyframes(keyframeSequence, currentTime, collectedStyles, stateStyles, errors) {\n var /** @type {?} */ totalEntries = keyframeSequence.steps.length;\n var /** @type {?} */ totalOffsets = 0;\n keyframeSequence.steps.forEach(function (step) { return totalOffsets += (isPresent(step.offset) ? 1 : 0); });\n if (totalOffsets > 0 && totalOffsets < totalEntries) {\n errors.push(new AnimationParseError(\"Not all style() entries contain an offset for the provided keyframe()\"));\n totalOffsets = totalEntries;\n }\n var /** @type {?} */ limit = totalEntries - 1;\n var /** @type {?} */ margin = totalOffsets == 0 ? (1 / limit) : 0;\n var /** @type {?} */ rawKeyframes = [];\n var /** @type {?} */ index = 0;\n var /** @type {?} */ doSortKeyframes = false;\n var /** @type {?} */ lastOffset = 0;\n keyframeSequence.steps.forEach(function (styleMetadata) {\n var /** @type {?} */ offset = styleMetadata.offset;\n var /** @type {?} */ keyframeStyles = {};\n styleMetadata.styles.forEach(function (entry) {\n Object.keys(entry).forEach(function (prop) {\n if (prop != 'offset') {\n keyframeStyles[prop] = ((entry))[prop];\n }\n });\n });\n if (isPresent(offset)) {\n doSortKeyframes = doSortKeyframes || (offset < lastOffset);\n }\n else {\n offset = index == limit ? _TERMINAL_KEYFRAME : (margin * index);\n }\n rawKeyframes.push([offset, keyframeStyles]);\n lastOffset = offset;\n index++;\n });\n if (doSortKeyframes) {\n rawKeyframes.sort(function (a, b) { return a[0] <= b[0] ? -1 : 1; });\n }\n var /** @type {?} */ firstKeyframe = rawKeyframes[0];\n if (firstKeyframe[0] != _INITIAL_KEYFRAME) {\n rawKeyframes.splice(0, 0, firstKeyframe = [_INITIAL_KEYFRAME, {}]);\n }\n var /** @type {?} */ firstKeyframeStyles = firstKeyframe[1];\n limit = rawKeyframes.length - 1;\n var /** @type {?} */ lastKeyframe = rawKeyframes[limit];\n if (lastKeyframe[0] != _TERMINAL_KEYFRAME) {\n rawKeyframes.push(lastKeyframe = [_TERMINAL_KEYFRAME, {}]);\n limit++;\n }\n var /** @type {?} */ lastKeyframeStyles = lastKeyframe[1];\n for (var /** @type {?} */ i = 1; i <= limit; i++) {\n var /** @type {?} */ entry = rawKeyframes[i];\n var /** @type {?} */ styles = entry[1];\n Object.keys(styles).forEach(function (prop) {\n if (!isPresent(firstKeyframeStyles[prop])) {\n firstKeyframeStyles[prop] = FILL_STYLE_FLAG;\n }\n });\n }\n var _loop_1 = function(i) {\n var /** @type {?} */ entry = rawKeyframes[i];\n var /** @type {?} */ styles = entry[1];\n Object.keys(styles).forEach(function (prop) {\n if (!isPresent(lastKeyframeStyles[prop])) {\n lastKeyframeStyles[prop] = styles[prop];\n }\n });\n };\n for (var /** @type {?} */ i = limit - 1; i >= 0; i--) {\n _loop_1(i);\n }\n return rawKeyframes.map(function (entry) { return new AnimationKeyframeAst(entry[0], new AnimationStylesAst([entry[1]])); });\n }\n /**\n * @param {?} entry\n * @param {?} currentTime\n * @param {?} collectedStyles\n * @param {?} stateStyles\n * @param {?} errors\n * @return {?}\n */\n function _parseTransitionAnimation(entry, currentTime, collectedStyles, stateStyles, errors) {\n var /** @type {?} */ ast;\n var /** @type {?} */ playTime = 0;\n var /** @type {?} */ startingTime = currentTime;\n if (entry instanceof CompileAnimationWithStepsMetadata) {\n var /** @type {?} */ maxDuration_1 = 0;\n var /** @type {?} */ steps_1 = [];\n var /** @type {?} */ isGroup_1 = entry instanceof CompileAnimationGroupMetadata;\n var /** @type {?} */ previousStyles_1;\n entry.steps.forEach(function (entry) {\n // these will get picked up by the next step...\n var /** @type {?} */ time = isGroup_1 ? startingTime : currentTime;\n if (entry instanceof CompileAnimationStyleMetadata) {\n entry.styles.forEach(function (stylesEntry) {\n // by this point we know that we only have stringmap values\n var /** @type {?} */ map = (stylesEntry);\n Object.keys(map).forEach(function (prop) { collectedStyles.insertAtTime(prop, time, map[prop]); });\n });\n previousStyles_1 = entry.styles;\n return;\n }\n var /** @type {?} */ innerAst = _parseTransitionAnimation(entry, time, collectedStyles, stateStyles, errors);\n if (isPresent(previousStyles_1)) {\n if (entry instanceof CompileAnimationWithStepsMetadata) {\n var /** @type {?} */ startingStyles = new AnimationStylesAst(previousStyles_1);\n steps_1.push(new AnimationStepAst(startingStyles, [], 0, 0, ''));\n }\n else {\n var /** @type {?} */ innerStep = (innerAst);\n (_a = innerStep.startingStyles.styles).push.apply(_a, previousStyles_1);\n }\n previousStyles_1 = null;\n }\n var /** @type {?} */ astDuration = innerAst.playTime;\n currentTime += astDuration;\n playTime += astDuration;\n maxDuration_1 = Math.max(astDuration, maxDuration_1);\n steps_1.push(innerAst);\n var _a;\n });\n if (isPresent(previousStyles_1)) {\n var /** @type {?} */ startingStyles = new AnimationStylesAst(previousStyles_1);\n steps_1.push(new AnimationStepAst(startingStyles, [], 0, 0, ''));\n }\n if (isGroup_1) {\n ast = new AnimationGroupAst(steps_1);\n playTime = maxDuration_1;\n currentTime = startingTime + playTime;\n }\n else {\n ast = new AnimationSequenceAst(steps_1);\n }\n }\n else if (entry instanceof CompileAnimationAnimateMetadata) {\n var /** @type {?} */ timings = _parseTimeExpression(entry.timings, errors);\n var /** @type {?} */ styles = entry.styles;\n var /** @type {?} */ keyframes = void 0;\n if (styles instanceof CompileAnimationKeyframesSequenceMetadata) {\n keyframes =\n _parseAnimationKeyframes(styles, currentTime, collectedStyles, stateStyles, errors);\n }\n else {\n var /** @type {?} */ styleData = (styles);\n var /** @type {?} */ offset = _TERMINAL_KEYFRAME;\n var /** @type {?} */ styleAst = new AnimationStylesAst(/** @type {?} */ (styleData.styles));\n var /** @type {?} */ keyframe = new AnimationKeyframeAst(offset, styleAst);\n keyframes = [keyframe];\n }\n ast = new AnimationStepAst(new AnimationStylesAst([]), keyframes, timings.duration, timings.delay, timings.easing);\n playTime = timings.duration + timings.delay;\n currentTime += playTime;\n keyframes.forEach(function (keyframe /** TODO #9100 */) { return keyframe.styles.styles.forEach(function (entry /** TODO #9100 */) { return Object.keys(entry).forEach(function (prop) { collectedStyles.insertAtTime(prop, currentTime, entry[prop]); }); }); });\n }\n else {\n // if the code reaches this stage then an error\n // has already been populated within the _normalizeStyleSteps()\n // operation...\n ast = new AnimationStepAst(null, [], 0, 0, '');\n }\n ast.playTime = playTime;\n ast.startTime = startingTime;\n return ast;\n }\n /**\n * @param {?} ast\n * @param {?} collectedStyles\n * @param {?} errors\n * @return {?}\n */\n function _fillAnimationAstStartingKeyframes(ast, collectedStyles, errors) {\n // steps that only contain style will not be filled\n if ((ast instanceof AnimationStepAst) && ast.keyframes.length > 0) {\n var /** @type {?} */ keyframes = ast.keyframes;\n if (keyframes.length == 1) {\n var /** @type {?} */ endKeyframe = keyframes[0];\n var /** @type {?} */ startKeyframe = _createStartKeyframeFromEndKeyframe(endKeyframe, ast.startTime, ast.playTime, collectedStyles, errors);\n ast.keyframes = [startKeyframe, endKeyframe];\n }\n }\n else if (ast instanceof AnimationWithStepsAst) {\n ast.steps.forEach(function (entry) { return _fillAnimationAstStartingKeyframes(entry, collectedStyles, errors); });\n }\n }\n /**\n * @param {?} exp\n * @param {?} errors\n * @return {?}\n */\n function _parseTimeExpression(exp, errors) {\n var /** @type {?} */ regex = /^([\\.\\d]+)(m?s)(?:\\s+([\\.\\d]+)(m?s))?(?:\\s+([-a-z]+(?:\\(.+?\\))?))?/i;\n var /** @type {?} */ duration;\n var /** @type {?} */ delay = 0;\n var /** @type {?} */ easing = null;\n if (typeof exp === 'string') {\n var /** @type {?} */ matches = exp.match(regex);\n if (matches === null) {\n errors.push(new AnimationParseError(\"The provided timing value \\\"\" + exp + \"\\\" is invalid.\"));\n return new _AnimationTimings(0, 0, null);\n }\n var /** @type {?} */ durationMatch = parseFloat(matches[1]);\n var /** @type {?} */ durationUnit = matches[2];\n if (durationUnit == 's') {\n durationMatch *= _ONE_SECOND;\n }\n duration = Math.floor(durationMatch);\n var /** @type {?} */ delayMatch = matches[3];\n var /** @type {?} */ delayUnit = matches[4];\n if (isPresent(delayMatch)) {\n var /** @type {?} */ delayVal = parseFloat(delayMatch);\n if (isPresent(delayUnit) && delayUnit == 's') {\n delayVal *= _ONE_SECOND;\n }\n delay = Math.floor(delayVal);\n }\n var /** @type {?} */ easingVal = matches[5];\n if (!isBlank(easingVal)) {\n easing = easingVal;\n }\n }\n else {\n duration = (exp);\n }\n return new _AnimationTimings(duration, delay, easing);\n }\n /**\n * @param {?} endKeyframe\n * @param {?} startTime\n * @param {?} duration\n * @param {?} collectedStyles\n * @param {?} errors\n * @return {?}\n */\n function _createStartKeyframeFromEndKeyframe(endKeyframe, startTime, duration, collectedStyles, errors) {\n var /** @type {?} */ values = {};\n var /** @type {?} */ endTime = startTime + duration;\n endKeyframe.styles.styles.forEach(function (styleData) {\n Object.keys(styleData).forEach(function (prop) {\n var /** @type {?} */ val = styleData[prop];\n if (prop == 'offset')\n return;\n var /** @type {?} */ resultIndex = collectedStyles.indexOfAtOrBeforeTime(prop, startTime);\n var /** @type {?} */ resultEntry /** TODO #9100 */, /** @type {?} */ nextEntry /** TODO #9100 */, /** @type {?} */ value;\n if (isPresent(resultIndex)) {\n resultEntry = collectedStyles.getByIndex(prop, resultIndex);\n value = resultEntry.value;\n nextEntry = collectedStyles.getByIndex(prop, resultIndex + 1);\n }\n else {\n // this is a flag that the runtime code uses to pass\n // in a value either from the state declaration styles\n // or using the AUTO_STYLE value (e.g. getComputedStyle)\n value = FILL_STYLE_FLAG;\n }\n if (isPresent(nextEntry) && !nextEntry.matches(endTime, val)) {\n errors.push(new AnimationParseError(\"The animated CSS property \\\"\" + prop + \"\\\" unexpectedly changes between steps \\\"\" + resultEntry.time + \"ms\\\" and \\\"\" + endTime + \"ms\\\" at \\\"\" + nextEntry.time + \"ms\\\"\"));\n }\n values[prop] = value;\n });\n });\n return new AnimationKeyframeAst(_INITIAL_KEYFRAME, new AnimationStylesAst([values]));\n }\n\n /**\n * An interface for retrieving documents by URL that the compiler uses\n * to load templates.\n */\n var ResourceLoader = (function () {\n function ResourceLoader() {\n }\n /**\n * @param {?} url\n * @return {?}\n */\n ResourceLoader.prototype.get = function (url) { return null; };\n return ResourceLoader;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$6 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$6 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n /**\n * Create a {@link UrlResolver} with no package prefix.\n * @return {?}\n */\n function createUrlResolverWithoutPackagePrefix() {\n return new UrlResolver();\n }\n /**\n * @return {?}\n */\n function createOfflineCompileUrlResolver() {\n return new UrlResolver('.');\n }\n /**\n * A default provider for {@link PACKAGE_ROOT_URL} that maps to '/'.\n */\n var /** @type {?} */ DEFAULT_PACKAGE_URL_PROVIDER = {\n provide: _angular_core.PACKAGE_ROOT_URL,\n useValue: '/'\n };\n /**\n * Used by the {@link Compiler} when resolving HTML and CSS template URLs.\n * *\n * This class can be overridden by the application developer to create custom behavior.\n * *\n * See {@link Compiler}\n * *\n * ## Example\n * *\n * {@example compiler/ts/url_resolver/url_resolver.ts region='url_resolver'}\n * *\n * ensure that the entire template comes from a trusted source.\n * Attacker-controlled data introduced by a template could expose your\n * application to XSS risks. For more detail, see the [Security Guide](http://g.co/ng/security).\n */\n var UrlResolver = (function () {\n /**\n * @param {?=} _packagePrefix\n */\n function UrlResolver(_packagePrefix) {\n if (_packagePrefix === void 0) { _packagePrefix = null; }\n this._packagePrefix = _packagePrefix;\n }\n /**\n * Resolves the `url` given the `baseUrl`:\n * - when the `url` is null, the `baseUrl` is returned,\n * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of\n * `baseUrl` and `url`,\n * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is\n * returned as is (ignoring the `baseUrl`)\n * @param {?} baseUrl\n * @param {?} url\n * @return {?}\n */\n UrlResolver.prototype.resolve = function (baseUrl, url) {\n var /** @type {?} */ resolvedUrl = url;\n if (isPresent(baseUrl) && baseUrl.length > 0) {\n resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);\n }\n var /** @type {?} */ resolvedParts = _split(resolvedUrl);\n var /** @type {?} */ prefix = this._packagePrefix;\n if (isPresent(prefix) && isPresent(resolvedParts) &&\n resolvedParts[_ComponentIndex.Scheme] == 'package') {\n var /** @type {?} */ path = resolvedParts[_ComponentIndex.Path];\n prefix = prefix.replace(/\\/+$/, '');\n path = path.replace(/^\\/+/, '');\n return prefix + \"/\" + path;\n }\n return resolvedUrl;\n };\n /** @nocollapse */\n UrlResolver.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.PACKAGE_ROOT_URL,] },] },\n ]; };\n UrlResolver = __decorate$6([\n CompilerInjectable(), \n __metadata$6('design:paramtypes', [String])\n ], UrlResolver);\n return UrlResolver;\n }());\n /**\n * Extract the scheme of a URL.\n * @param {?} url\n * @return {?}\n */\n function getUrlScheme(url) {\n var /** @type {?} */ match = _split(url);\n return (match && match[_ComponentIndex.Scheme]) || '';\n }\n /**\n * Builds a URI string from already-encoded parts.\n * *\n * No encoding is performed. Any component may be omitted as either null or\n * undefined.\n * *\n * @param {?=} opt_scheme The scheme such as 'http'.\n * @param {?=} opt_userInfo The user name before the '@'.\n * @param {?=} opt_domain The domain such as 'www.google.com', already\n * URI-encoded.\n * @param {?=} opt_port The port number.\n * @param {?=} opt_path The path, already URI-encoded. If it is not\n * empty, it must begin with a slash.\n * @param {?=} opt_queryData The URI-encoded query data.\n * @param {?=} opt_fragment The URI-encoded fragment identifier.\n * @return {?} The fully combined URI.\n */\n function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {\n var /** @type {?} */ out = [];\n if (isPresent(opt_scheme)) {\n out.push(opt_scheme + ':');\n }\n if (isPresent(opt_domain)) {\n out.push('//');\n if (isPresent(opt_userInfo)) {\n out.push(opt_userInfo + '@');\n }\n out.push(opt_domain);\n if (isPresent(opt_port)) {\n out.push(':' + opt_port);\n }\n }\n if (isPresent(opt_path)) {\n out.push(opt_path);\n }\n if (isPresent(opt_queryData)) {\n out.push('?' + opt_queryData);\n }\n if (isPresent(opt_fragment)) {\n out.push('#' + opt_fragment);\n }\n return out.join('');\n }\n /**\n * A regular expression for breaking a URI into its component parts.\n *\n * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says\n * As the \"first-match-wins\" algorithm is identical to the \"greedy\"\n * disambiguation method used by POSIX regular expressions, it is natural and\n * commonplace to use a regular expression for parsing the potential five\n * components of a URI reference.\n *\n * The following line is the regular expression for breaking-down a\n * well-formed URI reference into its components.\n *\n * <pre>\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n * 12 3 4 5 6 7 8 9\n * </pre>\n *\n * The numbers in the second line above are only to assist readability; they\n * indicate the reference points for each subexpression (i.e., each paired\n * parenthesis). We refer to the value matched for subexpression <n> as $<n>.\n * For example, matching the above expression to\n * <pre>\n * http://www.ics.uci.edu/pub/ietf/uri/#Related\n * </pre>\n * results in the following subexpression matches:\n * <pre>\n * $1 = http:\n * $2 = http\n * $3 = //www.ics.uci.edu\n * $4 = www.ics.uci.edu\n * $5 = /pub/ietf/uri/\n * $6 = <undefined>\n * $7 = <undefined>\n * $8 = #Related\n * $9 = Related\n * </pre>\n * where <undefined> indicates that the component is not present, as is the\n * case for the query component in the above example. Therefore, we can\n * determine the value of the five components as\n * <pre>\n * scheme = $2\n * authority = $4\n * path = $5\n * query = $7\n * fragment = $9\n * </pre>\n *\n * The regular expression has been modified slightly to expose the\n * userInfo, domain, and port separately from the authority.\n * The modified version yields\n * <pre>\n * $1 = http scheme\n * $2 = <undefined> userInfo -\\\n * $3 = www.ics.uci.edu domain | authority\n * $4 = <undefined> port -/\n * $5 = /pub/ietf/uri/ path\n * $6 = <undefined> query without ?\n * $7 = Related fragment without #\n * </pre>\n * @type {!RegExp}\n * @internal\n */\n var /** @type {?} */ _splitRe = new RegExp('^' +\n '(?:' +\n '([^:/?#.]+)' +\n // used by other URL parts such as :,\n // ?, /, #, and .\n ':)?' +\n '(?://' +\n '(?:([^/?#]*)@)?' +\n '([\\\\w\\\\d\\\\-\\\\u0100-\\\\uffff.%]*)' +\n // digits, dashes, dots, percent\n // escapes, and unicode characters.\n '(?::([0-9]+))?' +\n ')?' +\n '([^?#]+)?' +\n '(?:\\\\?([^#]*))?' +\n '(?:#(.*))?' +\n '$');\n var _ComponentIndex = {};\n _ComponentIndex.Scheme = 1;\n _ComponentIndex.UserInfo = 2;\n _ComponentIndex.Domain = 3;\n _ComponentIndex.Port = 4;\n _ComponentIndex.Path = 5;\n _ComponentIndex.QueryData = 6;\n _ComponentIndex.Fragment = 7;\n _ComponentIndex[_ComponentIndex.Scheme] = \"Scheme\";\n _ComponentIndex[_ComponentIndex.UserInfo] = \"UserInfo\";\n _ComponentIndex[_ComponentIndex.Domain] = \"Domain\";\n _ComponentIndex[_ComponentIndex.Port] = \"Port\";\n _ComponentIndex[_ComponentIndex.Path] = \"Path\";\n _ComponentIndex[_ComponentIndex.QueryData] = \"QueryData\";\n _ComponentIndex[_ComponentIndex.Fragment] = \"Fragment\";\n /**\n * Splits a URI into its component parts.\n * *\n * Each component can be accessed via the component indices; for example:\n * <pre>\n * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];\n * </pre>\n * *\n * @param {?} uri The URI string to examine.\n * @return {?} Each component still URI-encoded.\n * Each component that is present will contain the encoded value, whereas\n * components that are not present will be undefined or empty, depending\n * on the browser's regular expression implementation. Never null, since\n * arbitrary strings may still look like path names.\n */\n function _split(uri) {\n return uri.match(_splitRe);\n }\n /**\n * Removes dot segments in given path component, as described in\n * RFC 3986, section 5.2.4.\n * *\n * @param {?} path A non-empty path component.\n * @return {?} Path component with removed dot segments.\n */\n function _removeDotSegments(path) {\n if (path == '/')\n return '/';\n var /** @type {?} */ leadingSlash = path[0] == '/' ? '/' : '';\n var /** @type {?} */ trailingSlash = path[path.length - 1] === '/' ? '/' : '';\n var /** @type {?} */ segments = path.split('/');\n var /** @type {?} */ out = [];\n var /** @type {?} */ up = 0;\n for (var /** @type {?} */ pos = 0; pos < segments.length; pos++) {\n var /** @type {?} */ segment = segments[pos];\n switch (segment) {\n case '':\n case '.':\n break;\n case '..':\n if (out.length > 0) {\n out.pop();\n }\n else {\n up++;\n }\n break;\n default:\n out.push(segment);\n }\n }\n if (leadingSlash == '') {\n while (up-- > 0) {\n out.unshift('..');\n }\n if (out.length === 0)\n out.push('.');\n }\n return leadingSlash + out.join('/') + trailingSlash;\n }\n /**\n * Takes an array of the parts from split and canonicalizes the path part\n * and then joins all the parts.\n * @param {?} parts\n * @return {?}\n */\n function _joinAndCanonicalizePath(parts) {\n var /** @type {?} */ path = parts[_ComponentIndex.Path];\n path = isBlank(path) ? '' : _removeDotSegments(path);\n parts[_ComponentIndex.Path] = path;\n return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);\n }\n /**\n * Resolves a URL.\n * @param {?} base The URL acting as the base URL.\n * @param {?} url\n * @return {?}\n */\n function _resolveUrl(base, url) {\n var /** @type {?} */ parts = _split(encodeURI(url));\n var /** @type {?} */ baseParts = _split(base);\n if (isPresent(parts[_ComponentIndex.Scheme])) {\n return _joinAndCanonicalizePath(parts);\n }\n else {\n parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];\n }\n for (var /** @type {?} */ i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {\n if (isBlank(parts[i])) {\n parts[i] = baseParts[i];\n }\n }\n if (parts[_ComponentIndex.Path][0] == '/') {\n return _joinAndCanonicalizePath(parts);\n }\n var /** @type {?} */ path = baseParts[_ComponentIndex.Path];\n if (isBlank(path))\n path = '/';\n var /** @type {?} */ index = path.lastIndexOf('/');\n path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];\n parts[_ComponentIndex.Path] = path;\n return _joinAndCanonicalizePath(parts);\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$5 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$5 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var DirectiveNormalizer = (function () {\n /**\n * @param {?} _resourceLoader\n * @param {?} _urlResolver\n * @param {?} _htmlParser\n * @param {?} _config\n */\n function DirectiveNormalizer(_resourceLoader, _urlResolver, _htmlParser, _config) {\n this._resourceLoader = _resourceLoader;\n this._urlResolver = _urlResolver;\n this._htmlParser = _htmlParser;\n this._config = _config;\n this._resourceLoaderCache = new Map();\n }\n /**\n * @return {?}\n */\n DirectiveNormalizer.prototype.clearCache = function () { this._resourceLoaderCache.clear(); };\n /**\n * @param {?} normalizedDirective\n * @return {?}\n */\n DirectiveNormalizer.prototype.clearCacheFor = function (normalizedDirective) {\n var _this = this;\n if (!normalizedDirective.isComponent) {\n return;\n }\n this._resourceLoaderCache.delete(normalizedDirective.template.templateUrl);\n normalizedDirective.template.externalStylesheets.forEach(function (stylesheet) { _this._resourceLoaderCache.delete(stylesheet.moduleUrl); });\n };\n /**\n * @param {?} url\n * @return {?}\n */\n DirectiveNormalizer.prototype._fetch = function (url) {\n var /** @type {?} */ result = this._resourceLoaderCache.get(url);\n if (!result) {\n result = this._resourceLoader.get(url);\n this._resourceLoaderCache.set(url, result);\n }\n return result;\n };\n /**\n * @param {?} prenormData\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeTemplate = function (prenormData) {\n var _this = this;\n var /** @type {?} */ normalizedTemplateSync = null;\n var /** @type {?} */ normalizedTemplateAsync;\n if (isPresent(prenormData.template)) {\n normalizedTemplateSync = this.normalizeTemplateSync(prenormData);\n normalizedTemplateAsync = Promise.resolve(normalizedTemplateSync);\n }\n else if (prenormData.templateUrl) {\n normalizedTemplateAsync = this.normalizeTemplateAsync(prenormData);\n }\n else {\n throw new SyntaxError(\"No template specified for component \" + stringify(prenormData.componentType));\n }\n if (normalizedTemplateSync && normalizedTemplateSync.styleUrls.length === 0) {\n // sync case\n return new SyncAsyncResult(normalizedTemplateSync);\n }\n else {\n // async case\n return new SyncAsyncResult(null, normalizedTemplateAsync.then(function (normalizedTemplate) { return _this.normalizeExternalStylesheets(normalizedTemplate); }));\n }\n };\n /**\n * @param {?} prenomData\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeTemplateSync = function (prenomData) {\n return this.normalizeLoadedTemplate(prenomData, prenomData.template, prenomData.moduleUrl);\n };\n /**\n * @param {?} prenomData\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeTemplateAsync = function (prenomData) {\n var _this = this;\n var /** @type {?} */ templateUrl = this._urlResolver.resolve(prenomData.moduleUrl, prenomData.templateUrl);\n return this._fetch(templateUrl)\n .then(function (value) { return _this.normalizeLoadedTemplate(prenomData, value, templateUrl); });\n };\n /**\n * @param {?} prenomData\n * @param {?} template\n * @param {?} templateAbsUrl\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeLoadedTemplate = function (prenomData, template, templateAbsUrl) {\n var /** @type {?} */ interpolationConfig = InterpolationConfig.fromArray(prenomData.interpolation);\n var /** @type {?} */ rootNodesAndErrors = this._htmlParser.parse(template, stringify(prenomData.componentType), false, interpolationConfig);\n if (rootNodesAndErrors.errors.length > 0) {\n var /** @type {?} */ errorString = rootNodesAndErrors.errors.join('\\n');\n throw new SyntaxError(\"Template parse errors:\\n\" + errorString);\n }\n var /** @type {?} */ templateMetadataStyles = this.normalizeStylesheet(new CompileStylesheetMetadata({\n styles: prenomData.styles,\n styleUrls: prenomData.styleUrls,\n moduleUrl: prenomData.moduleUrl\n }));\n var /** @type {?} */ visitor = new TemplatePreparseVisitor();\n visitAll(visitor, rootNodesAndErrors.rootNodes);\n var /** @type {?} */ templateStyles = this.normalizeStylesheet(new CompileStylesheetMetadata({ styles: visitor.styles, styleUrls: visitor.styleUrls, moduleUrl: templateAbsUrl }));\n var /** @type {?} */ encapsulation = prenomData.encapsulation;\n if (isBlank(encapsulation)) {\n encapsulation = this._config.defaultEncapsulation;\n }\n var /** @type {?} */ styles = templateMetadataStyles.styles.concat(templateStyles.styles);\n var /** @type {?} */ styleUrls = templateMetadataStyles.styleUrls.concat(templateStyles.styleUrls);\n if (encapsulation === _angular_core.ViewEncapsulation.Emulated && styles.length === 0 &&\n styleUrls.length === 0) {\n encapsulation = _angular_core.ViewEncapsulation.None;\n }\n return new CompileTemplateMetadata({\n encapsulation: encapsulation,\n template: template,\n templateUrl: templateAbsUrl, styles: styles, styleUrls: styleUrls,\n ngContentSelectors: visitor.ngContentSelectors,\n animations: prenomData.animations,\n interpolation: prenomData.interpolation,\n });\n };\n /**\n * @param {?} templateMeta\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeExternalStylesheets = function (templateMeta) {\n return this._loadMissingExternalStylesheets(templateMeta.styleUrls)\n .then(function (externalStylesheets) { return new CompileTemplateMetadata({\n encapsulation: templateMeta.encapsulation,\n template: templateMeta.template,\n templateUrl: templateMeta.templateUrl,\n styles: templateMeta.styles,\n styleUrls: templateMeta.styleUrls,\n externalStylesheets: externalStylesheets,\n ngContentSelectors: templateMeta.ngContentSelectors,\n animations: templateMeta.animations,\n interpolation: templateMeta.interpolation\n }); });\n };\n /**\n * @param {?} styleUrls\n * @param {?=} loadedStylesheets\n * @return {?}\n */\n DirectiveNormalizer.prototype._loadMissingExternalStylesheets = function (styleUrls, loadedStylesheets) {\n var _this = this;\n if (loadedStylesheets === void 0) { loadedStylesheets = new Map(); }\n return Promise\n .all(styleUrls.filter(function (styleUrl) { return !loadedStylesheets.has(styleUrl); })\n .map(function (styleUrl) { return _this._fetch(styleUrl).then(function (loadedStyle) {\n var /** @type {?} */ stylesheet = _this.normalizeStylesheet(new CompileStylesheetMetadata({ styles: [loadedStyle], moduleUrl: styleUrl }));\n loadedStylesheets.set(styleUrl, stylesheet);\n return _this._loadMissingExternalStylesheets(stylesheet.styleUrls, loadedStylesheets);\n }); }))\n .then(function (_) { return Array.from(loadedStylesheets.values()); });\n };\n /**\n * @param {?} stylesheet\n * @return {?}\n */\n DirectiveNormalizer.prototype.normalizeStylesheet = function (stylesheet) {\n var _this = this;\n var /** @type {?} */ allStyleUrls = stylesheet.styleUrls.filter(isStyleUrlResolvable)\n .map(function (url) { return _this._urlResolver.resolve(stylesheet.moduleUrl, url); });\n var /** @type {?} */ allStyles = stylesheet.styles.map(function (style) {\n var /** @type {?} */ styleWithImports = extractStyleUrls(_this._urlResolver, stylesheet.moduleUrl, style);\n allStyleUrls.push.apply(allStyleUrls, styleWithImports.styleUrls);\n return styleWithImports.style;\n });\n return new CompileStylesheetMetadata({ styles: allStyles, styleUrls: allStyleUrls, moduleUrl: stylesheet.moduleUrl });\n };\n DirectiveNormalizer = __decorate$5([\n CompilerInjectable(), \n __metadata$5('design:paramtypes', [ResourceLoader, UrlResolver, HtmlParser, CompilerConfig])\n ], DirectiveNormalizer);\n return DirectiveNormalizer;\n }());\n var TemplatePreparseVisitor = (function () {\n function TemplatePreparseVisitor() {\n this.ngContentSelectors = [];\n this.styles = [];\n this.styleUrls = [];\n this.ngNonBindableStackCount = 0;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {\n var /** @type {?} */ preparsedElement = preparseElement(ast);\n switch (preparsedElement.type) {\n case PreparsedElementType.NG_CONTENT:\n if (this.ngNonBindableStackCount === 0) {\n this.ngContentSelectors.push(preparsedElement.selectAttr);\n }\n break;\n case PreparsedElementType.STYLE:\n var /** @type {?} */ textContent_1 = '';\n ast.children.forEach(function (child) {\n if (child instanceof Text) {\n textContent_1 += child.value;\n }\n });\n this.styles.push(textContent_1);\n break;\n case PreparsedElementType.STYLESHEET:\n this.styleUrls.push(preparsedElement.hrefAttr);\n break;\n default:\n break;\n }\n if (preparsedElement.nonBindable) {\n this.ngNonBindableStackCount++;\n }\n visitAll(this, ast.children);\n if (preparsedElement.nonBindable) {\n this.ngNonBindableStackCount--;\n }\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitComment = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitAttribute = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitExpansion = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n TemplatePreparseVisitor.prototype.visitExpansionCase = function (ast, context) { return null; };\n return TemplatePreparseVisitor;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$7 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$7 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n /*\n * Resolve a `Type` for {@link Directive}.\n *\n * This interface can be overridden by the application developer to create custom behavior.\n *\n * See {@link Compiler}\n */\n var DirectiveResolver = (function () {\n /**\n * @param {?=} _reflector\n */\n function DirectiveResolver(_reflector) {\n if (_reflector === void 0) { _reflector = reflector; }\n this._reflector = _reflector;\n }\n /**\n * @param {?} type\n * @return {?}\n */\n DirectiveResolver.prototype.isDirective = function (type) {\n var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n return typeMetadata && typeMetadata.some(isDirectiveMetadata);\n };\n /**\n * Return {@link Directive} for a given `Type`.\n * @param {?} type\n * @param {?=} throwIfNotFound\n * @return {?}\n */\n DirectiveResolver.prototype.resolve = function (type, throwIfNotFound) {\n if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n if (typeMetadata) {\n var /** @type {?} */ metadata = ListWrapper.findLast(typeMetadata, isDirectiveMetadata);\n if (metadata) {\n var /** @type {?} */ propertyMetadata = this._reflector.propMetadata(type);\n return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type);\n }\n }\n if (throwIfNotFound) {\n throw new Error(\"No Directive annotation found on \" + stringify(type));\n }\n return null;\n };\n /**\n * @param {?} dm\n * @param {?} propertyMetadata\n * @param {?} directiveType\n * @return {?}\n */\n DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata, directiveType) {\n var /** @type {?} */ inputs = [];\n var /** @type {?} */ outputs = [];\n var /** @type {?} */ host = {};\n var /** @type {?} */ queries = {};\n Object.keys(propertyMetadata).forEach(function (propName) {\n var /** @type {?} */ input = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Input; });\n if (input) {\n if (input.bindingPropertyName) {\n inputs.push(propName + \": \" + input.bindingPropertyName);\n }\n else {\n inputs.push(propName);\n }\n }\n var /** @type {?} */ output = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Output; });\n if (output) {\n if (output.bindingPropertyName) {\n outputs.push(propName + \": \" + output.bindingPropertyName);\n }\n else {\n outputs.push(propName);\n }\n }\n var /** @type {?} */ hostBindings = propertyMetadata[propName].filter(function (a) { return a && a instanceof _angular_core.HostBinding; });\n hostBindings.forEach(function (hostBinding) {\n if (hostBinding.hostPropertyName) {\n var /** @type {?} */ startWith = hostBinding.hostPropertyName[0];\n if (startWith === '(') {\n throw new Error(\"@HostBinding can not bind to events. Use @HostListener instead.\");\n }\n else if (startWith === '[') {\n throw new Error(\"@HostBinding parameter should be a property name, 'class.<name>', or 'attr.<name>'.\");\n }\n host[(\"[\" + hostBinding.hostPropertyName + \"]\")] = propName;\n }\n else {\n host[(\"[\" + propName + \"]\")] = propName;\n }\n });\n var /** @type {?} */ hostListeners = propertyMetadata[propName].filter(function (a) { return a && a instanceof _angular_core.HostListener; });\n hostListeners.forEach(function (hostListener) {\n var /** @type {?} */ args = hostListener.args || [];\n host[(\"(\" + hostListener.eventName + \")\")] = propName + \"(\" + args.join(',') + \")\";\n });\n var /** @type {?} */ query = ListWrapper.findLast(propertyMetadata[propName], function (a) { return a instanceof _angular_core.Query; });\n if (query) {\n queries[propName] = query;\n }\n });\n return this._merge(dm, inputs, outputs, host, queries, directiveType);\n };\n /**\n * @param {?} def\n * @return {?}\n */\n DirectiveResolver.prototype._extractPublicName = function (def) { return splitAtColon(def, [null, def])[1].trim(); };\n /**\n * @param {?} bindings\n * @return {?}\n */\n DirectiveResolver.prototype._dedupeBindings = function (bindings) {\n var /** @type {?} */ names = new Set();\n var /** @type {?} */ reversedResult = [];\n // go last to first to allow later entries to overwrite previous entries\n for (var /** @type {?} */ i = bindings.length - 1; i >= 0; i--) {\n var /** @type {?} */ binding = bindings[i];\n var /** @type {?} */ name_1 = this._extractPublicName(binding);\n if (!names.has(name_1)) {\n names.add(name_1);\n reversedResult.push(binding);\n }\n }\n return reversedResult.reverse();\n };\n /**\n * @param {?} directive\n * @param {?} inputs\n * @param {?} outputs\n * @param {?} host\n * @param {?} queries\n * @param {?} directiveType\n * @return {?}\n */\n DirectiveResolver.prototype._merge = function (directive, inputs, outputs, host, queries, directiveType) {\n var /** @type {?} */ mergedInputs = this._dedupeBindings(directive.inputs ? directive.inputs.concat(inputs) : inputs);\n var /** @type {?} */ mergedOutputs = this._dedupeBindings(directive.outputs ? directive.outputs.concat(outputs) : outputs);\n var /** @type {?} */ mergedHost = directive.host ? StringMapWrapper.merge(directive.host, host) : host;\n var /** @type {?} */ mergedQueries = directive.queries ? StringMapWrapper.merge(directive.queries, queries) : queries;\n if (directive instanceof _angular_core.Component) {\n return new _angular_core.Component({\n selector: directive.selector,\n inputs: mergedInputs,\n outputs: mergedOutputs,\n host: mergedHost,\n exportAs: directive.exportAs,\n moduleId: directive.moduleId,\n queries: mergedQueries,\n changeDetection: directive.changeDetection,\n providers: directive.providers,\n viewProviders: directive.viewProviders,\n entryComponents: directive.entryComponents,\n template: directive.template,\n templateUrl: directive.templateUrl,\n styles: directive.styles,\n styleUrls: directive.styleUrls,\n encapsulation: directive.encapsulation,\n animations: directive.animations,\n interpolation: directive.interpolation\n });\n }\n else {\n return new _angular_core.Directive({\n selector: directive.selector,\n inputs: mergedInputs,\n outputs: mergedOutputs,\n host: mergedHost,\n exportAs: directive.exportAs,\n queries: mergedQueries,\n providers: directive.providers\n });\n }\n };\n DirectiveResolver = __decorate$7([\n CompilerInjectable(), \n __metadata$7('design:paramtypes', [ReflectorReader])\n ], DirectiveResolver);\n return DirectiveResolver;\n }());\n /**\n * @param {?} type\n * @return {?}\n */\n function isDirectiveMetadata(type) {\n return type instanceof _angular_core.Directive;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$17 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var TypeModifier = {};\n TypeModifier.Const = 0;\n TypeModifier[TypeModifier.Const] = \"Const\";\n /**\n * @abstract\n */\n var Type$1 = (function () {\n /**\n * @param {?=} modifiers\n */\n function Type(modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n this.modifiers = modifiers;\n if (!modifiers) {\n this.modifiers = [];\n }\n }\n /**\n * @abstract\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Type.prototype.visitType = function (visitor, context) { };\n /**\n * @param {?} modifier\n * @return {?}\n */\n Type.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n return Type;\n }());\n var BuiltinTypeName = {};\n BuiltinTypeName.Dynamic = 0;\n BuiltinTypeName.Bool = 1;\n BuiltinTypeName.String = 2;\n BuiltinTypeName.Int = 3;\n BuiltinTypeName.Number = 4;\n BuiltinTypeName.Function = 5;\n BuiltinTypeName.Null = 6;\n BuiltinTypeName[BuiltinTypeName.Dynamic] = \"Dynamic\";\n BuiltinTypeName[BuiltinTypeName.Bool] = \"Bool\";\n BuiltinTypeName[BuiltinTypeName.String] = \"String\";\n BuiltinTypeName[BuiltinTypeName.Int] = \"Int\";\n BuiltinTypeName[BuiltinTypeName.Number] = \"Number\";\n BuiltinTypeName[BuiltinTypeName.Function] = \"Function\";\n BuiltinTypeName[BuiltinTypeName.Null] = \"Null\";\n var BuiltinType = (function (_super) {\n __extends$17(BuiltinType, _super);\n /**\n * @param {?} name\n * @param {?=} modifiers\n */\n function BuiltinType(name, modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.name = name;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BuiltinType.prototype.visitType = function (visitor, context) {\n return visitor.visitBuiltintType(this, context);\n };\n return BuiltinType;\n }(Type$1));\n var ExpressionType = (function (_super) {\n __extends$17(ExpressionType, _super);\n /**\n * @param {?} value\n * @param {?=} typeParams\n * @param {?=} modifiers\n */\n function ExpressionType(value, typeParams, modifiers) {\n if (typeParams === void 0) { typeParams = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.value = value;\n this.typeParams = typeParams;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ExpressionType.prototype.visitType = function (visitor, context) {\n return visitor.visitExpressionType(this, context);\n };\n return ExpressionType;\n }(Type$1));\n var ArrayType = (function (_super) {\n __extends$17(ArrayType, _super);\n /**\n * @param {?} of\n * @param {?=} modifiers\n */\n function ArrayType(of, modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.of = of;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ArrayType.prototype.visitType = function (visitor, context) {\n return visitor.visitArrayType(this, context);\n };\n return ArrayType;\n }(Type$1));\n var MapType = (function (_super) {\n __extends$17(MapType, _super);\n /**\n * @param {?} valueType\n * @param {?=} modifiers\n */\n function MapType(valueType, modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.valueType = valueType;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n MapType.prototype.visitType = function (visitor, context) { return visitor.visitMapType(this, context); };\n return MapType;\n }(Type$1));\n var /** @type {?} */ DYNAMIC_TYPE = new BuiltinType(BuiltinTypeName.Dynamic);\n var /** @type {?} */ BOOL_TYPE = new BuiltinType(BuiltinTypeName.Bool);\n var /** @type {?} */ INT_TYPE = new BuiltinType(BuiltinTypeName.Int);\n var /** @type {?} */ NUMBER_TYPE = new BuiltinType(BuiltinTypeName.Number);\n var /** @type {?} */ STRING_TYPE = new BuiltinType(BuiltinTypeName.String);\n var /** @type {?} */ FUNCTION_TYPE = new BuiltinType(BuiltinTypeName.Function);\n var /** @type {?} */ NULL_TYPE = new BuiltinType(BuiltinTypeName.Null);\n var BinaryOperator = {};\n BinaryOperator.Equals = 0;\n BinaryOperator.NotEquals = 1;\n BinaryOperator.Identical = 2;\n BinaryOperator.NotIdentical = 3;\n BinaryOperator.Minus = 4;\n BinaryOperator.Plus = 5;\n BinaryOperator.Divide = 6;\n BinaryOperator.Multiply = 7;\n BinaryOperator.Modulo = 8;\n BinaryOperator.And = 9;\n BinaryOperator.Or = 10;\n BinaryOperator.Lower = 11;\n BinaryOperator.LowerEquals = 12;\n BinaryOperator.Bigger = 13;\n BinaryOperator.BiggerEquals = 14;\n BinaryOperator[BinaryOperator.Equals] = \"Equals\";\n BinaryOperator[BinaryOperator.NotEquals] = \"NotEquals\";\n BinaryOperator[BinaryOperator.Identical] = \"Identical\";\n BinaryOperator[BinaryOperator.NotIdentical] = \"NotIdentical\";\n BinaryOperator[BinaryOperator.Minus] = \"Minus\";\n BinaryOperator[BinaryOperator.Plus] = \"Plus\";\n BinaryOperator[BinaryOperator.Divide] = \"Divide\";\n BinaryOperator[BinaryOperator.Multiply] = \"Multiply\";\n BinaryOperator[BinaryOperator.Modulo] = \"Modulo\";\n BinaryOperator[BinaryOperator.And] = \"And\";\n BinaryOperator[BinaryOperator.Or] = \"Or\";\n BinaryOperator[BinaryOperator.Lower] = \"Lower\";\n BinaryOperator[BinaryOperator.LowerEquals] = \"LowerEquals\";\n BinaryOperator[BinaryOperator.Bigger] = \"Bigger\";\n BinaryOperator[BinaryOperator.BiggerEquals] = \"BiggerEquals\";\n /**\n * @abstract\n */\n var Expression = (function () {\n /**\n * @param {?} type\n */\n function Expression(type) {\n this.type = type;\n }\n /**\n * @abstract\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Expression.prototype.visitExpression = function (visitor, context) { };\n /**\n * @param {?} name\n * @return {?}\n */\n Expression.prototype.prop = function (name) { return new ReadPropExpr(this, name); };\n /**\n * @param {?} index\n * @param {?=} type\n * @return {?}\n */\n Expression.prototype.key = function (index, type) {\n if (type === void 0) { type = null; }\n return new ReadKeyExpr(this, index, type);\n };\n /**\n * @param {?} name\n * @param {?} params\n * @return {?}\n */\n Expression.prototype.callMethod = function (name, params) {\n return new InvokeMethodExpr(this, name, params);\n };\n /**\n * @param {?} params\n * @return {?}\n */\n Expression.prototype.callFn = function (params) { return new InvokeFunctionExpr(this, params); };\n /**\n * @param {?} params\n * @param {?=} type\n * @return {?}\n */\n Expression.prototype.instantiate = function (params, type) {\n if (type === void 0) { type = null; }\n return new InstantiateExpr(this, params, type);\n };\n /**\n * @param {?} trueCase\n * @param {?=} falseCase\n * @return {?}\n */\n Expression.prototype.conditional = function (trueCase, falseCase) {\n if (falseCase === void 0) { falseCase = null; }\n return new ConditionalExpr(this, trueCase, falseCase);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.equals = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Equals, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.notEquals = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.NotEquals, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.identical = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Identical, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.notIdentical = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.NotIdentical, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.minus = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Minus, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.plus = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Plus, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.divide = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Divide, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.multiply = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Multiply, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.modulo = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Modulo, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.and = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.And, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.or = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Or, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.lower = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Lower, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.lowerEquals = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.LowerEquals, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.bigger = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.Bigger, this, rhs);\n };\n /**\n * @param {?} rhs\n * @return {?}\n */\n Expression.prototype.biggerEquals = function (rhs) {\n return new BinaryOperatorExpr(BinaryOperator.BiggerEquals, this, rhs);\n };\n /**\n * @return {?}\n */\n Expression.prototype.isBlank = function () {\n // Note: We use equals by purpose here to compare to null and undefined in JS.\n // We use the typed null to allow strictNullChecks to narrow types.\n return this.equals(TYPED_NULL_EXPR);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n Expression.prototype.cast = function (type) { return new CastExpr(this, type); };\n /**\n * @return {?}\n */\n Expression.prototype.toStmt = function () { return new ExpressionStatement(this); };\n return Expression;\n }());\n var BuiltinVar = {};\n BuiltinVar.This = 0;\n BuiltinVar.Super = 1;\n BuiltinVar.CatchError = 2;\n BuiltinVar.CatchStack = 3;\n BuiltinVar[BuiltinVar.This] = \"This\";\n BuiltinVar[BuiltinVar.Super] = \"Super\";\n BuiltinVar[BuiltinVar.CatchError] = \"CatchError\";\n BuiltinVar[BuiltinVar.CatchStack] = \"CatchStack\";\n var ReadVarExpr = (function (_super) {\n __extends$17(ReadVarExpr, _super);\n /**\n * @param {?} name\n * @param {?=} type\n */\n function ReadVarExpr(name, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n if (typeof name === 'string') {\n this.name = name;\n this.builtin = null;\n }\n else {\n this.name = null;\n this.builtin = name;\n }\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ReadVarExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitReadVarExpr(this, context);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n ReadVarExpr.prototype.set = function (value) { return new WriteVarExpr(this.name, value); };\n return ReadVarExpr;\n }(Expression));\n var WriteVarExpr = (function (_super) {\n __extends$17(WriteVarExpr, _super);\n /**\n * @param {?} name\n * @param {?} value\n * @param {?=} type\n */\n function WriteVarExpr(name, value, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type || value.type);\n this.name = name;\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n WriteVarExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitWriteVarExpr(this, context);\n };\n /**\n * @param {?=} type\n * @param {?=} modifiers\n * @return {?}\n */\n WriteVarExpr.prototype.toDeclStmt = function (type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n return new DeclareVarStmt(this.name, this.value, type, modifiers);\n };\n return WriteVarExpr;\n }(Expression));\n var WriteKeyExpr = (function (_super) {\n __extends$17(WriteKeyExpr, _super);\n /**\n * @param {?} receiver\n * @param {?} index\n * @param {?} value\n * @param {?=} type\n */\n function WriteKeyExpr(receiver, index, value, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type || value.type);\n this.receiver = receiver;\n this.index = index;\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n WriteKeyExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitWriteKeyExpr(this, context);\n };\n return WriteKeyExpr;\n }(Expression));\n var WritePropExpr = (function (_super) {\n __extends$17(WritePropExpr, _super);\n /**\n * @param {?} receiver\n * @param {?} name\n * @param {?} value\n * @param {?=} type\n */\n function WritePropExpr(receiver, name, value, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type || value.type);\n this.receiver = receiver;\n this.name = name;\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n WritePropExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitWritePropExpr(this, context);\n };\n return WritePropExpr;\n }(Expression));\n var BuiltinMethod = {};\n BuiltinMethod.ConcatArray = 0;\n BuiltinMethod.SubscribeObservable = 1;\n BuiltinMethod.Bind = 2;\n BuiltinMethod[BuiltinMethod.ConcatArray] = \"ConcatArray\";\n BuiltinMethod[BuiltinMethod.SubscribeObservable] = \"SubscribeObservable\";\n BuiltinMethod[BuiltinMethod.Bind] = \"Bind\";\n var InvokeMethodExpr = (function (_super) {\n __extends$17(InvokeMethodExpr, _super);\n /**\n * @param {?} receiver\n * @param {?} method\n * @param {?} args\n * @param {?=} type\n */\n function InvokeMethodExpr(receiver, method, args, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.receiver = receiver;\n this.args = args;\n if (typeof method === 'string') {\n this.name = method;\n this.builtin = null;\n }\n else {\n this.name = null;\n this.builtin = method;\n }\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n InvokeMethodExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitInvokeMethodExpr(this, context);\n };\n return InvokeMethodExpr;\n }(Expression));\n var InvokeFunctionExpr = (function (_super) {\n __extends$17(InvokeFunctionExpr, _super);\n /**\n * @param {?} fn\n * @param {?} args\n * @param {?=} type\n */\n function InvokeFunctionExpr(fn, args, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.fn = fn;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n InvokeFunctionExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitInvokeFunctionExpr(this, context);\n };\n return InvokeFunctionExpr;\n }(Expression));\n var InstantiateExpr = (function (_super) {\n __extends$17(InstantiateExpr, _super);\n /**\n * @param {?} classExpr\n * @param {?} args\n * @param {?=} type\n */\n function InstantiateExpr(classExpr, args, type) {\n _super.call(this, type);\n this.classExpr = classExpr;\n this.args = args;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n InstantiateExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitInstantiateExpr(this, context);\n };\n return InstantiateExpr;\n }(Expression));\n var LiteralExpr = (function (_super) {\n __extends$17(LiteralExpr, _super);\n /**\n * @param {?} value\n * @param {?=} type\n */\n function LiteralExpr(value, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n LiteralExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitLiteralExpr(this, context);\n };\n return LiteralExpr;\n }(Expression));\n var ExternalExpr = (function (_super) {\n __extends$17(ExternalExpr, _super);\n /**\n * @param {?} value\n * @param {?=} type\n * @param {?=} typeParams\n */\n function ExternalExpr(value, type, typeParams) {\n if (type === void 0) { type = null; }\n if (typeParams === void 0) { typeParams = null; }\n _super.call(this, type);\n this.value = value;\n this.typeParams = typeParams;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ExternalExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitExternalExpr(this, context);\n };\n return ExternalExpr;\n }(Expression));\n var ConditionalExpr = (function (_super) {\n __extends$17(ConditionalExpr, _super);\n /**\n * @param {?} condition\n * @param {?} trueCase\n * @param {?=} falseCase\n * @param {?=} type\n */\n function ConditionalExpr(condition, trueCase, falseCase, type) {\n if (falseCase === void 0) { falseCase = null; }\n if (type === void 0) { type = null; }\n _super.call(this, type || trueCase.type);\n this.condition = condition;\n this.falseCase = falseCase;\n this.trueCase = trueCase;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ConditionalExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitConditionalExpr(this, context);\n };\n return ConditionalExpr;\n }(Expression));\n var NotExpr = (function (_super) {\n __extends$17(NotExpr, _super);\n /**\n * @param {?} condition\n */\n function NotExpr(condition) {\n _super.call(this, BOOL_TYPE);\n this.condition = condition;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n NotExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitNotExpr(this, context);\n };\n return NotExpr;\n }(Expression));\n var CastExpr = (function (_super) {\n __extends$17(CastExpr, _super);\n /**\n * @param {?} value\n * @param {?} type\n */\n function CastExpr(value, type) {\n _super.call(this, type);\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n CastExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitCastExpr(this, context);\n };\n return CastExpr;\n }(Expression));\n var FnParam = (function () {\n /**\n * @param {?} name\n * @param {?=} type\n */\n function FnParam(name, type) {\n if (type === void 0) { type = null; }\n this.name = name;\n this.type = type;\n }\n return FnParam;\n }());\n var FunctionExpr = (function (_super) {\n __extends$17(FunctionExpr, _super);\n /**\n * @param {?} params\n * @param {?} statements\n * @param {?=} type\n */\n function FunctionExpr(params, statements, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.params = params;\n this.statements = statements;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n FunctionExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitFunctionExpr(this, context);\n };\n /**\n * @param {?} name\n * @param {?=} modifiers\n * @return {?}\n */\n FunctionExpr.prototype.toDeclStmt = function (name, modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n return new DeclareFunctionStmt(name, this.params, this.statements, this.type, modifiers);\n };\n return FunctionExpr;\n }(Expression));\n var BinaryOperatorExpr = (function (_super) {\n __extends$17(BinaryOperatorExpr, _super);\n /**\n * @param {?} operator\n * @param {?} lhs\n * @param {?} rhs\n * @param {?=} type\n */\n function BinaryOperatorExpr(operator, lhs, rhs, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type || lhs.type);\n this.operator = operator;\n this.rhs = rhs;\n this.lhs = lhs;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n BinaryOperatorExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitBinaryOperatorExpr(this, context);\n };\n return BinaryOperatorExpr;\n }(Expression));\n var ReadPropExpr = (function (_super) {\n __extends$17(ReadPropExpr, _super);\n /**\n * @param {?} receiver\n * @param {?} name\n * @param {?=} type\n */\n function ReadPropExpr(receiver, name, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.receiver = receiver;\n this.name = name;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ReadPropExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitReadPropExpr(this, context);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n ReadPropExpr.prototype.set = function (value) {\n return new WritePropExpr(this.receiver, this.name, value);\n };\n return ReadPropExpr;\n }(Expression));\n var ReadKeyExpr = (function (_super) {\n __extends$17(ReadKeyExpr, _super);\n /**\n * @param {?} receiver\n * @param {?} index\n * @param {?=} type\n */\n function ReadKeyExpr(receiver, index, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.receiver = receiver;\n this.index = index;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ReadKeyExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitReadKeyExpr(this, context);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n ReadKeyExpr.prototype.set = function (value) {\n return new WriteKeyExpr(this.receiver, this.index, value);\n };\n return ReadKeyExpr;\n }(Expression));\n var LiteralArrayExpr = (function (_super) {\n __extends$17(LiteralArrayExpr, _super);\n /**\n * @param {?} entries\n * @param {?=} type\n */\n function LiteralArrayExpr(entries, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.entries = entries;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n LiteralArrayExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitLiteralArrayExpr(this, context);\n };\n return LiteralArrayExpr;\n }(Expression));\n var LiteralMapEntry = (function () {\n /**\n * @param {?} key\n * @param {?} value\n * @param {?=} quoted\n */\n function LiteralMapEntry(key, value, quoted) {\n if (quoted === void 0) { quoted = false; }\n this.key = key;\n this.value = value;\n this.quoted = quoted;\n }\n return LiteralMapEntry;\n }());\n var LiteralMapExpr = (function (_super) {\n __extends$17(LiteralMapExpr, _super);\n /**\n * @param {?} entries\n * @param {?=} type\n */\n function LiteralMapExpr(entries, type) {\n if (type === void 0) { type = null; }\n _super.call(this, type);\n this.entries = entries;\n this.valueType = null;\n if (isPresent(type)) {\n this.valueType = type.valueType;\n }\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n LiteralMapExpr.prototype.visitExpression = function (visitor, context) {\n return visitor.visitLiteralMapExpr(this, context);\n };\n return LiteralMapExpr;\n }(Expression));\n var /** @type {?} */ THIS_EXPR = new ReadVarExpr(BuiltinVar.This);\n var /** @type {?} */ SUPER_EXPR = new ReadVarExpr(BuiltinVar.Super);\n var /** @type {?} */ CATCH_ERROR_VAR = new ReadVarExpr(BuiltinVar.CatchError);\n var /** @type {?} */ CATCH_STACK_VAR = new ReadVarExpr(BuiltinVar.CatchStack);\n var /** @type {?} */ NULL_EXPR = new LiteralExpr(null, null);\n var /** @type {?} */ TYPED_NULL_EXPR = new LiteralExpr(null, NULL_TYPE);\n var StmtModifier = {};\n StmtModifier.Final = 0;\n StmtModifier.Private = 1;\n StmtModifier[StmtModifier.Final] = \"Final\";\n StmtModifier[StmtModifier.Private] = \"Private\";\n /**\n * @abstract\n */\n var Statement = (function () {\n /**\n * @param {?=} modifiers\n */\n function Statement(modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n this.modifiers = modifiers;\n if (!modifiers) {\n this.modifiers = [];\n }\n }\n /**\n * @abstract\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n Statement.prototype.visitStatement = function (visitor, context) { };\n /**\n * @param {?} modifier\n * @return {?}\n */\n Statement.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n return Statement;\n }());\n var DeclareVarStmt = (function (_super) {\n __extends$17(DeclareVarStmt, _super);\n /**\n * @param {?} name\n * @param {?} value\n * @param {?=} type\n * @param {?=} modifiers\n */\n function DeclareVarStmt(name, value, type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.name = name;\n this.value = value;\n this.type = type || value.type;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n DeclareVarStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitDeclareVarStmt(this, context);\n };\n return DeclareVarStmt;\n }(Statement));\n var DeclareFunctionStmt = (function (_super) {\n __extends$17(DeclareFunctionStmt, _super);\n /**\n * @param {?} name\n * @param {?} params\n * @param {?} statements\n * @param {?=} type\n * @param {?=} modifiers\n */\n function DeclareFunctionStmt(name, params, statements, type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.name = name;\n this.params = params;\n this.statements = statements;\n this.type = type;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n DeclareFunctionStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitDeclareFunctionStmt(this, context);\n };\n return DeclareFunctionStmt;\n }(Statement));\n var ExpressionStatement = (function (_super) {\n __extends$17(ExpressionStatement, _super);\n /**\n * @param {?} expr\n */\n function ExpressionStatement(expr) {\n _super.call(this);\n this.expr = expr;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ExpressionStatement.prototype.visitStatement = function (visitor, context) {\n return visitor.visitExpressionStmt(this, context);\n };\n return ExpressionStatement;\n }(Statement));\n var ReturnStatement = (function (_super) {\n __extends$17(ReturnStatement, _super);\n /**\n * @param {?} value\n */\n function ReturnStatement(value) {\n _super.call(this);\n this.value = value;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ReturnStatement.prototype.visitStatement = function (visitor, context) {\n return visitor.visitReturnStmt(this, context);\n };\n return ReturnStatement;\n }(Statement));\n var AbstractClassPart = (function () {\n /**\n * @param {?=} type\n * @param {?} modifiers\n */\n function AbstractClassPart(type, modifiers) {\n if (type === void 0) { type = null; }\n this.type = type;\n this.modifiers = modifiers;\n if (!modifiers) {\n this.modifiers = [];\n }\n }\n /**\n * @param {?} modifier\n * @return {?}\n */\n AbstractClassPart.prototype.hasModifier = function (modifier) { return this.modifiers.indexOf(modifier) !== -1; };\n return AbstractClassPart;\n }());\n var ClassField = (function (_super) {\n __extends$17(ClassField, _super);\n /**\n * @param {?} name\n * @param {?=} type\n * @param {?=} modifiers\n */\n function ClassField(name, type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, type, modifiers);\n this.name = name;\n }\n return ClassField;\n }(AbstractClassPart));\n var ClassMethod = (function (_super) {\n __extends$17(ClassMethod, _super);\n /**\n * @param {?} name\n * @param {?} params\n * @param {?} body\n * @param {?=} type\n * @param {?=} modifiers\n */\n function ClassMethod(name, params, body, type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, type, modifiers);\n this.name = name;\n this.params = params;\n this.body = body;\n }\n return ClassMethod;\n }(AbstractClassPart));\n var ClassGetter = (function (_super) {\n __extends$17(ClassGetter, _super);\n /**\n * @param {?} name\n * @param {?} body\n * @param {?=} type\n * @param {?=} modifiers\n */\n function ClassGetter(name, body, type, modifiers) {\n if (type === void 0) { type = null; }\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, type, modifiers);\n this.name = name;\n this.body = body;\n }\n return ClassGetter;\n }(AbstractClassPart));\n var ClassStmt = (function (_super) {\n __extends$17(ClassStmt, _super);\n /**\n * @param {?} name\n * @param {?} parent\n * @param {?} fields\n * @param {?} getters\n * @param {?} constructorMethod\n * @param {?} methods\n * @param {?=} modifiers\n */\n function ClassStmt(name, parent, fields, getters, constructorMethod, methods, modifiers) {\n if (modifiers === void 0) { modifiers = null; }\n _super.call(this, modifiers);\n this.name = name;\n this.parent = parent;\n this.fields = fields;\n this.getters = getters;\n this.constructorMethod = constructorMethod;\n this.methods = methods;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ClassStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitDeclareClassStmt(this, context);\n };\n return ClassStmt;\n }(Statement));\n var IfStmt = (function (_super) {\n __extends$17(IfStmt, _super);\n /**\n * @param {?} condition\n * @param {?} trueCase\n * @param {?=} falseCase\n */\n function IfStmt(condition, trueCase, falseCase) {\n if (falseCase === void 0) { falseCase = []; }\n _super.call(this);\n this.condition = condition;\n this.trueCase = trueCase;\n this.falseCase = falseCase;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n IfStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitIfStmt(this, context);\n };\n return IfStmt;\n }(Statement));\n var CommentStmt = (function (_super) {\n __extends$17(CommentStmt, _super);\n /**\n * @param {?} comment\n */\n function CommentStmt(comment) {\n _super.call(this);\n this.comment = comment;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n CommentStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitCommentStmt(this, context);\n };\n return CommentStmt;\n }(Statement));\n var TryCatchStmt = (function (_super) {\n __extends$17(TryCatchStmt, _super);\n /**\n * @param {?} bodyStmts\n * @param {?} catchStmts\n */\n function TryCatchStmt(bodyStmts, catchStmts) {\n _super.call(this);\n this.bodyStmts = bodyStmts;\n this.catchStmts = catchStmts;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n TryCatchStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitTryCatchStmt(this, context);\n };\n return TryCatchStmt;\n }(Statement));\n var ThrowStmt = (function (_super) {\n __extends$17(ThrowStmt, _super);\n /**\n * @param {?} error\n */\n function ThrowStmt(error) {\n _super.call(this);\n this.error = error;\n }\n /**\n * @param {?} visitor\n * @param {?} context\n * @return {?}\n */\n ThrowStmt.prototype.visitStatement = function (visitor, context) {\n return visitor.visitThrowStmt(this, context);\n };\n return ThrowStmt;\n }(Statement));\n var ExpressionTransformer = (function () {\n function ExpressionTransformer() {\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitReadVarExpr = function (ast, context) { return ast; };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitWriteVarExpr = function (expr, context) {\n return new WriteVarExpr(expr.name, expr.value.visitExpression(this, context));\n };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitWriteKeyExpr = function (expr, context) {\n return new WriteKeyExpr(expr.receiver.visitExpression(this, context), expr.index.visitExpression(this, context), expr.value.visitExpression(this, context));\n };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitWritePropExpr = function (expr, context) {\n return new WritePropExpr(expr.receiver.visitExpression(this, context), expr.name, expr.value.visitExpression(this, context));\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitInvokeMethodExpr = function (ast, context) {\n var /** @type {?} */ method = ast.builtin || ast.name;\n return new InvokeMethodExpr(ast.receiver.visitExpression(this, context), method, this.visitAllExpressions(ast.args, context), ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitInvokeFunctionExpr = function (ast, context) {\n return new InvokeFunctionExpr(ast.fn.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitInstantiateExpr = function (ast, context) {\n return new InstantiateExpr(ast.classExpr.visitExpression(this, context), this.visitAllExpressions(ast.args, context), ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitLiteralExpr = function (ast, context) { return ast; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitExternalExpr = function (ast, context) { return ast; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitConditionalExpr = function (ast, context) {\n return new ConditionalExpr(ast.condition.visitExpression(this, context), ast.trueCase.visitExpression(this, context), ast.falseCase.visitExpression(this, context));\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitNotExpr = function (ast, context) {\n return new NotExpr(ast.condition.visitExpression(this, context));\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitCastExpr = function (ast, context) {\n return new CastExpr(ast.value.visitExpression(this, context), context);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitFunctionExpr = function (ast, context) {\n // Don't descend into nested functions\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitBinaryOperatorExpr = function (ast, context) {\n return new BinaryOperatorExpr(ast.operator, ast.lhs.visitExpression(this, context), ast.rhs.visitExpression(this, context), ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitReadPropExpr = function (ast, context) {\n return new ReadPropExpr(ast.receiver.visitExpression(this, context), ast.name, ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitReadKeyExpr = function (ast, context) {\n return new ReadKeyExpr(ast.receiver.visitExpression(this, context), ast.index.visitExpression(this, context), ast.type);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitLiteralArrayExpr = function (ast, context) {\n return new LiteralArrayExpr(this.visitAllExpressions(ast.entries, context));\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitLiteralMapExpr = function (ast, context) {\n var _this = this;\n var /** @type {?} */ entries = ast.entries.map(function (entry) { return new LiteralMapEntry(entry.key, entry.value.visitExpression(_this, context), entry.quoted); });\n return new LiteralMapExpr(entries);\n };\n /**\n * @param {?} exprs\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitAllExpressions = function (exprs, context) {\n var _this = this;\n return exprs.map(function (expr) { return expr.visitExpression(_this, context); });\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitDeclareVarStmt = function (stmt, context) {\n return new DeclareVarStmt(stmt.name, stmt.value.visitExpression(this, context), stmt.type, stmt.modifiers);\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitDeclareFunctionStmt = function (stmt, context) {\n // Don't descend into nested functions\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitExpressionStmt = function (stmt, context) {\n return new ExpressionStatement(stmt.expr.visitExpression(this, context));\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitReturnStmt = function (stmt, context) {\n return new ReturnStatement(stmt.value.visitExpression(this, context));\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitDeclareClassStmt = function (stmt, context) {\n // Don't descend into nested functions\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitIfStmt = function (stmt, context) {\n return new IfStmt(stmt.condition.visitExpression(this, context), this.visitAllStatements(stmt.trueCase, context), this.visitAllStatements(stmt.falseCase, context));\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitTryCatchStmt = function (stmt, context) {\n return new TryCatchStmt(this.visitAllStatements(stmt.bodyStmts, context), this.visitAllStatements(stmt.catchStmts, context));\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitThrowStmt = function (stmt, context) {\n return new ThrowStmt(stmt.error.visitExpression(this, context));\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitCommentStmt = function (stmt, context) { return stmt; };\n /**\n * @param {?} stmts\n * @param {?} context\n * @return {?}\n */\n ExpressionTransformer.prototype.visitAllStatements = function (stmts, context) {\n var _this = this;\n return stmts.map(function (stmt) { return stmt.visitStatement(_this, context); });\n };\n return ExpressionTransformer;\n }());\n var RecursiveExpressionVisitor = (function () {\n function RecursiveExpressionVisitor() {\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitReadVarExpr = function (ast, context) { return ast; };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitWriteVarExpr = function (expr, context) {\n expr.value.visitExpression(this, context);\n return expr;\n };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitWriteKeyExpr = function (expr, context) {\n expr.receiver.visitExpression(this, context);\n expr.index.visitExpression(this, context);\n expr.value.visitExpression(this, context);\n return expr;\n };\n /**\n * @param {?} expr\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitWritePropExpr = function (expr, context) {\n expr.receiver.visitExpression(this, context);\n expr.value.visitExpression(this, context);\n return expr;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitInvokeMethodExpr = function (ast, context) {\n ast.receiver.visitExpression(this, context);\n this.visitAllExpressions(ast.args, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitInvokeFunctionExpr = function (ast, context) {\n ast.fn.visitExpression(this, context);\n this.visitAllExpressions(ast.args, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitInstantiateExpr = function (ast, context) {\n ast.classExpr.visitExpression(this, context);\n this.visitAllExpressions(ast.args, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitLiteralExpr = function (ast, context) { return ast; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitExternalExpr = function (ast, context) { return ast; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitConditionalExpr = function (ast, context) {\n ast.condition.visitExpression(this, context);\n ast.trueCase.visitExpression(this, context);\n ast.falseCase.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitNotExpr = function (ast, context) {\n ast.condition.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitCastExpr = function (ast, context) {\n ast.value.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitFunctionExpr = function (ast, context) { return ast; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitBinaryOperatorExpr = function (ast, context) {\n ast.lhs.visitExpression(this, context);\n ast.rhs.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitReadPropExpr = function (ast, context) {\n ast.receiver.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitReadKeyExpr = function (ast, context) {\n ast.receiver.visitExpression(this, context);\n ast.index.visitExpression(this, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitLiteralArrayExpr = function (ast, context) {\n this.visitAllExpressions(ast.entries, context);\n return ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitLiteralMapExpr = function (ast, context) {\n var _this = this;\n ast.entries.forEach(function (entry) { return entry.value.visitExpression(_this, context); });\n return ast;\n };\n /**\n * @param {?} exprs\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitAllExpressions = function (exprs, context) {\n var _this = this;\n exprs.forEach(function (expr) { return expr.visitExpression(_this, context); });\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitDeclareVarStmt = function (stmt, context) {\n stmt.value.visitExpression(this, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) {\n // Don't descend into nested functions\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitExpressionStmt = function (stmt, context) {\n stmt.expr.visitExpression(this, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitReturnStmt = function (stmt, context) {\n stmt.value.visitExpression(this, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitDeclareClassStmt = function (stmt, context) {\n // Don't descend into nested functions\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitIfStmt = function (stmt, context) {\n stmt.condition.visitExpression(this, context);\n this.visitAllStatements(stmt.trueCase, context);\n this.visitAllStatements(stmt.falseCase, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitTryCatchStmt = function (stmt, context) {\n this.visitAllStatements(stmt.bodyStmts, context);\n this.visitAllStatements(stmt.catchStmts, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitThrowStmt = function (stmt, context) {\n stmt.error.visitExpression(this, context);\n return stmt;\n };\n /**\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitCommentStmt = function (stmt, context) { return stmt; };\n /**\n * @param {?} stmts\n * @param {?} context\n * @return {?}\n */\n RecursiveExpressionVisitor.prototype.visitAllStatements = function (stmts, context) {\n var _this = this;\n stmts.forEach(function (stmt) { return stmt.visitStatement(_this, context); });\n };\n return RecursiveExpressionVisitor;\n }());\n /**\n * @param {?} varName\n * @param {?} newValue\n * @param {?} expression\n * @return {?}\n */\n function replaceVarInExpression(varName, newValue, expression) {\n var /** @type {?} */ transformer = new _ReplaceVariableTransformer(varName, newValue);\n return expression.visitExpression(transformer, null);\n }\n var _ReplaceVariableTransformer = (function (_super) {\n __extends$17(_ReplaceVariableTransformer, _super);\n /**\n * @param {?} _varName\n * @param {?} _newValue\n */\n function _ReplaceVariableTransformer(_varName, _newValue) {\n _super.call(this);\n this._varName = _varName;\n this._newValue = _newValue;\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _ReplaceVariableTransformer.prototype.visitReadVarExpr = function (ast, context) {\n return ast.name == this._varName ? this._newValue : ast;\n };\n return _ReplaceVariableTransformer;\n }(ExpressionTransformer));\n /**\n * @param {?} stmts\n * @return {?}\n */\n function findReadVarNames(stmts) {\n var /** @type {?} */ finder = new _VariableFinder();\n finder.visitAllStatements(stmts, null);\n return finder.varNames;\n }\n var _VariableFinder = (function (_super) {\n __extends$17(_VariableFinder, _super);\n function _VariableFinder() {\n _super.apply(this, arguments);\n this.varNames = new Set();\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _VariableFinder.prototype.visitReadVarExpr = function (ast, context) {\n this.varNames.add(ast.name);\n return null;\n };\n return _VariableFinder;\n }(RecursiveExpressionVisitor));\n /**\n * @param {?} name\n * @param {?=} type\n * @return {?}\n */\n function variable(name, type) {\n if (type === void 0) { type = null; }\n return new ReadVarExpr(name, type);\n }\n /**\n * @param {?} id\n * @param {?=} typeParams\n * @return {?}\n */\n function importExpr(id, typeParams) {\n if (typeParams === void 0) { typeParams = null; }\n return new ExternalExpr(id, null, typeParams);\n }\n /**\n * @param {?} id\n * @param {?=} typeParams\n * @param {?=} typeModifiers\n * @return {?}\n */\n function importType(id, typeParams, typeModifiers) {\n if (typeParams === void 0) { typeParams = null; }\n if (typeModifiers === void 0) { typeModifiers = null; }\n return isPresent(id) ? expressionType(importExpr(id), typeParams, typeModifiers) : null;\n }\n /**\n * @param {?} expr\n * @param {?=} typeParams\n * @param {?=} typeModifiers\n * @return {?}\n */\n function expressionType(expr, typeParams, typeModifiers) {\n if (typeParams === void 0) { typeParams = null; }\n if (typeModifiers === void 0) { typeModifiers = null; }\n return isPresent(expr) ? new ExpressionType(expr, typeParams, typeModifiers) : null;\n }\n /**\n * @param {?} values\n * @param {?=} type\n * @return {?}\n */\n function literalArr(values, type) {\n if (type === void 0) { type = null; }\n return new LiteralArrayExpr(values, type);\n }\n /**\n * @param {?} values\n * @param {?=} type\n * @return {?}\n */\n function literalMap(values, type) {\n if (type === void 0) { type = null; }\n return new LiteralMapExpr(values.map(function (entry) { return new LiteralMapEntry(entry[0], entry[1]); }), type);\n }\n /**\n * @param {?} expr\n * @return {?}\n */\n function not(expr) {\n return new NotExpr(expr);\n }\n /**\n * @param {?} params\n * @param {?} body\n * @param {?=} type\n * @return {?}\n */\n function fn(params, body, type) {\n if (type === void 0) { type = null; }\n return new FunctionExpr(params, body, type);\n }\n /**\n * @param {?} value\n * @param {?=} type\n * @return {?}\n */\n function literal(value, type) {\n if (type === void 0) { type = null; }\n return new LiteralExpr(value, type);\n }\n\n var CheckBindingField = (function () {\n /**\n * @param {?} expression\n * @param {?} bindingId\n */\n function CheckBindingField(expression, bindingId) {\n this.expression = expression;\n this.bindingId = bindingId;\n }\n return CheckBindingField;\n }());\n /**\n * @param {?} builder\n * @return {?}\n */\n function createCheckBindingField(builder) {\n var /** @type {?} */ bindingId = \"\" + builder.fields.length;\n var /** @type {?} */ fieldExpr = createBindFieldExpr(bindingId);\n // private is fine here as no child view will reference the cached value...\n builder.fields.push(new ClassField(fieldExpr.name, null, [StmtModifier.Private]));\n builder.ctorStmts.push(THIS_EXPR.prop(fieldExpr.name)\n .set(importExpr(createIdentifier(Identifiers.UNINITIALIZED)))\n .toStmt());\n return new CheckBindingField(fieldExpr, bindingId);\n }\n /**\n * @param {?} evalResult\n * @param {?} fieldExpr\n * @param {?} throwOnChangeVar\n * @param {?} actions\n * @return {?}\n */\n function createCheckBindingStmt(evalResult, fieldExpr, throwOnChangeVar, actions) {\n var /** @type {?} */ condition = importExpr(createIdentifier(Identifiers.checkBinding)).callFn([\n throwOnChangeVar, fieldExpr, evalResult.currValExpr\n ]);\n if (evalResult.forceUpdate) {\n condition = evalResult.forceUpdate.or(condition);\n }\n return evalResult.stmts.concat([\n new IfStmt(condition, actions.concat([(THIS_EXPR.prop(fieldExpr.name).set(evalResult.currValExpr).toStmt())\n ]))\n ]);\n }\n /**\n * @param {?} bindingId\n * @return {?}\n */\n function createBindFieldExpr(bindingId) {\n return THIS_EXPR.prop(\"_expr_\" + bindingId);\n }\n\n /**\n * @param {?} token\n * @return {?}\n */\n function createDiTokenExpression(token) {\n if (isPresent(token.value)) {\n return literal(token.value);\n }\n else {\n return importExpr(token.identifier);\n }\n }\n /**\n * @param {?} values\n * @return {?}\n */\n function createInlineArray(values) {\n if (values.length === 0) {\n return importExpr(createIdentifier(Identifiers.EMPTY_INLINE_ARRAY));\n }\n var /** @type {?} */ log2 = Math.log(values.length) / Math.log(2);\n var /** @type {?} */ index = Math.ceil(log2);\n var /** @type {?} */ identifierSpec = index < Identifiers.inlineArrays.length ? Identifiers.inlineArrays[index] :\n Identifiers.InlineArrayDynamic;\n var /** @type {?} */ identifier = createIdentifier(identifierSpec);\n return importExpr(identifier).instantiate([(literal(values.length))\n ].concat(values));\n }\n /**\n * @param {?} fn\n * @param {?} argCount\n * @param {?} pureProxyProp\n * @param {?} builder\n * @return {?}\n */\n function createPureProxy(fn, argCount, pureProxyProp, builder) {\n builder.fields.push(new ClassField(pureProxyProp.name, null));\n var /** @type {?} */ pureProxyId = argCount < Identifiers.pureProxies.length ? Identifiers.pureProxies[argCount] : null;\n if (!pureProxyId) {\n throw new Error(\"Unsupported number of argument for pure functions: \" + argCount);\n }\n builder.ctorStmts.push(THIS_EXPR.prop(pureProxyProp.name)\n .set(importExpr(createIdentifier(pureProxyId)).callFn([fn]))\n .toStmt());\n }\n /**\n * @param {?} enumType\n * @param {?} enumValue\n * @return {?}\n */\n function createEnumExpression(enumType, enumValue) {\n var /** @type {?} */ enumName = Object.keys(enumType.runtime).find(function (propName) { return enumType.runtime[propName] === enumValue; });\n if (!enumName) {\n throw new Error(\"Unknown enum value \" + enumValue + \" in \" + enumType.name);\n }\n return importExpr(createEnumIdentifier(enumType, enumName));\n }\n\n var /** @type {?} */ VAL_UNWRAPPER_VAR = variable(\"valUnwrapper\");\n var EventHandlerVars = (function () {\n function EventHandlerVars() {\n }\n EventHandlerVars.event = variable('$event');\n return EventHandlerVars;\n }());\n var ConvertPropertyBindingResult = (function () {\n /**\n * @param {?} stmts\n * @param {?} currValExpr\n * @param {?} forceUpdate\n */\n function ConvertPropertyBindingResult(stmts, currValExpr, forceUpdate) {\n this.stmts = stmts;\n this.currValExpr = currValExpr;\n this.forceUpdate = forceUpdate;\n }\n return ConvertPropertyBindingResult;\n }());\n /**\n * Converts the given expression AST into an executable output AST, assuming the expression is\n * used in a property binding.\n * @param {?} builder\n * @param {?} nameResolver\n * @param {?} implicitReceiver\n * @param {?} expression\n * @param {?} bindingId\n * @return {?}\n */\n function convertPropertyBinding(builder, nameResolver, implicitReceiver, expression, bindingId) {\n var /** @type {?} */ currValExpr = createCurrValueExpr(bindingId);\n var /** @type {?} */ stmts = [];\n if (!nameResolver) {\n nameResolver = new DefaultNameResolver();\n }\n var /** @type {?} */ visitor = new _AstToIrVisitor(builder, nameResolver, implicitReceiver, VAL_UNWRAPPER_VAR, bindingId, false);\n var /** @type {?} */ outputExpr = expression.visit(visitor, _Mode.Expression);\n if (!outputExpr) {\n // e.g. an empty expression was given\n return null;\n }\n if (visitor.temporaryCount) {\n for (var /** @type {?} */ i = 0; i < visitor.temporaryCount; i++) {\n stmts.push(temporaryDeclaration(bindingId, i));\n }\n }\n if (visitor.needsValueUnwrapper) {\n var /** @type {?} */ initValueUnwrapperStmt = VAL_UNWRAPPER_VAR.callMethod('reset', []).toStmt();\n stmts.push(initValueUnwrapperStmt);\n }\n stmts.push(currValExpr.set(outputExpr).toDeclStmt(null, [StmtModifier.Final]));\n if (visitor.needsValueUnwrapper) {\n return new ConvertPropertyBindingResult(stmts, currValExpr, VAL_UNWRAPPER_VAR.prop('hasWrappedValue'));\n }\n else {\n return new ConvertPropertyBindingResult(stmts, currValExpr, null);\n }\n }\n var ConvertActionBindingResult = (function () {\n /**\n * @param {?} stmts\n * @param {?} preventDefault\n */\n function ConvertActionBindingResult(stmts, preventDefault) {\n this.stmts = stmts;\n this.preventDefault = preventDefault;\n }\n return ConvertActionBindingResult;\n }());\n /**\n * Converts the given expression AST into an executable output AST, assuming the expression is\n * used in an action binding (e.g. an event handler).\n * @param {?} builder\n * @param {?} nameResolver\n * @param {?} implicitReceiver\n * @param {?} action\n * @param {?} bindingId\n * @return {?}\n */\n function convertActionBinding(builder, nameResolver, implicitReceiver, action, bindingId) {\n if (!nameResolver) {\n nameResolver = new DefaultNameResolver();\n }\n var /** @type {?} */ visitor = new _AstToIrVisitor(builder, nameResolver, implicitReceiver, null, bindingId, true);\n var /** @type {?} */ actionStmts = [];\n flattenStatements(action.visit(visitor, _Mode.Statement), actionStmts);\n prependTemporaryDecls(visitor.temporaryCount, bindingId, actionStmts);\n var /** @type {?} */ lastIndex = actionStmts.length - 1;\n var /** @type {?} */ preventDefaultVar = null;\n if (lastIndex >= 0) {\n var /** @type {?} */ lastStatement = actionStmts[lastIndex];\n var /** @type {?} */ returnExpr = convertStmtIntoExpression(lastStatement);\n if (returnExpr) {\n // Note: We need to cast the result of the method call to dynamic,\n // as it might be a void method!\n preventDefaultVar = createPreventDefaultVar(bindingId);\n actionStmts[lastIndex] =\n preventDefaultVar.set(returnExpr.cast(DYNAMIC_TYPE).notIdentical(literal(false)))\n .toDeclStmt(null, [StmtModifier.Final]);\n }\n }\n return new ConvertActionBindingResult(actionStmts, preventDefaultVar);\n }\n /**\n * Creates variables that are shared by multiple calls to `convertActionBinding` /\n * `convertPropertyBinding`\n * @param {?} stmts\n * @return {?}\n */\n function createSharedBindingVariablesIfNeeded(stmts) {\n var /** @type {?} */ unwrapperStmts = [];\n var /** @type {?} */ readVars = findReadVarNames(stmts);\n if (readVars.has(VAL_UNWRAPPER_VAR.name)) {\n unwrapperStmts.push(VAL_UNWRAPPER_VAR\n .set(importExpr(createIdentifier(Identifiers.ValueUnwrapper)).instantiate([]))\n .toDeclStmt(null, [StmtModifier.Final]));\n }\n return unwrapperStmts;\n }\n /**\n * @param {?} bindingId\n * @param {?} temporaryNumber\n * @return {?}\n */\n function temporaryName(bindingId, temporaryNumber) {\n return \"tmp_\" + bindingId + \"_\" + temporaryNumber;\n }\n /**\n * @param {?} bindingId\n * @param {?} temporaryNumber\n * @return {?}\n */\n function temporaryDeclaration(bindingId, temporaryNumber) {\n return new DeclareVarStmt(temporaryName(bindingId, temporaryNumber), NULL_EXPR);\n }\n /**\n * @param {?} temporaryCount\n * @param {?} bindingId\n * @param {?} statements\n * @return {?}\n */\n function prependTemporaryDecls(temporaryCount, bindingId, statements) {\n for (var /** @type {?} */ i = temporaryCount - 1; i >= 0; i--) {\n statements.unshift(temporaryDeclaration(bindingId, i));\n }\n }\n var _Mode = {};\n _Mode.Statement = 0;\n _Mode.Expression = 1;\n _Mode[_Mode.Statement] = \"Statement\";\n _Mode[_Mode.Expression] = \"Expression\";\n /**\n * @param {?} mode\n * @param {?} ast\n * @return {?}\n */\n function ensureStatementMode(mode, ast) {\n if (mode !== _Mode.Statement) {\n throw new Error(\"Expected a statement, but saw \" + ast);\n }\n }\n /**\n * @param {?} mode\n * @param {?} ast\n * @return {?}\n */\n function ensureExpressionMode(mode, ast) {\n if (mode !== _Mode.Expression) {\n throw new Error(\"Expected an expression, but saw \" + ast);\n }\n }\n /**\n * @param {?} mode\n * @param {?} expr\n * @return {?}\n */\n function convertToStatementIfNeeded(mode, expr) {\n if (mode === _Mode.Statement) {\n return expr.toStmt();\n }\n else {\n return expr;\n }\n }\n var _AstToIrVisitor = (function () {\n /**\n * @param {?} _builder\n * @param {?} _nameResolver\n * @param {?} _implicitReceiver\n * @param {?} _valueUnwrapper\n * @param {?} bindingId\n * @param {?} isAction\n */\n function _AstToIrVisitor(_builder, _nameResolver, _implicitReceiver, _valueUnwrapper, bindingId, isAction) {\n this._builder = _builder;\n this._nameResolver = _nameResolver;\n this._implicitReceiver = _implicitReceiver;\n this._valueUnwrapper = _valueUnwrapper;\n this.bindingId = bindingId;\n this.isAction = isAction;\n this._nodeMap = new Map();\n this._resultMap = new Map();\n this._currentTemporary = 0;\n this.needsValueUnwrapper = false;\n this.temporaryCount = 0;\n }\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitBinary = function (ast, mode) {\n var /** @type {?} */ op;\n switch (ast.operation) {\n case '+':\n op = BinaryOperator.Plus;\n break;\n case '-':\n op = BinaryOperator.Minus;\n break;\n case '*':\n op = BinaryOperator.Multiply;\n break;\n case '/':\n op = BinaryOperator.Divide;\n break;\n case '%':\n op = BinaryOperator.Modulo;\n break;\n case '&&':\n op = BinaryOperator.And;\n break;\n case '||':\n op = BinaryOperator.Or;\n break;\n case '==':\n op = BinaryOperator.Equals;\n break;\n case '!=':\n op = BinaryOperator.NotEquals;\n break;\n case '===':\n op = BinaryOperator.Identical;\n break;\n case '!==':\n op = BinaryOperator.NotIdentical;\n break;\n case '<':\n op = BinaryOperator.Lower;\n break;\n case '>':\n op = BinaryOperator.Bigger;\n break;\n case '<=':\n op = BinaryOperator.LowerEquals;\n break;\n case '>=':\n op = BinaryOperator.BiggerEquals;\n break;\n default:\n throw new Error(\"Unsupported operation \" + ast.operation);\n }\n return convertToStatementIfNeeded(mode, new BinaryOperatorExpr(op, this.visit(ast.left, _Mode.Expression), this.visit(ast.right, _Mode.Expression)));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitChain = function (ast, mode) {\n ensureStatementMode(mode, ast);\n return this.visitAll(ast.expressions, mode);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitConditional = function (ast, mode) {\n var /** @type {?} */ value = this.visit(ast.condition, _Mode.Expression);\n return convertToStatementIfNeeded(mode, value.conditional(this.visit(ast.trueExp, _Mode.Expression), this.visit(ast.falseExp, _Mode.Expression)));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitPipe = function (ast, mode) {\n var /** @type {?} */ input = this.visit(ast.exp, _Mode.Expression);\n var /** @type {?} */ args = this.visitAll(ast.args, _Mode.Expression);\n var /** @type {?} */ value = this._nameResolver.callPipe(ast.name, input, args);\n if (!value) {\n throw new Error(\"Illegal state: Pipe \" + ast.name + \" is not allowed here!\");\n }\n this.needsValueUnwrapper = true;\n return convertToStatementIfNeeded(mode, this._valueUnwrapper.callMethod('unwrap', [value]));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitFunctionCall = function (ast, mode) {\n return convertToStatementIfNeeded(mode, this.visit(ast.target, _Mode.Expression).callFn(this.visitAll(ast.args, _Mode.Expression)));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitImplicitReceiver = function (ast, mode) {\n ensureExpressionMode(mode, ast);\n return this._implicitReceiver;\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitInterpolation = function (ast, mode) {\n ensureExpressionMode(mode, ast);\n var /** @type {?} */ args = [literal(ast.expressions.length)];\n for (var /** @type {?} */ i = 0; i < ast.strings.length - 1; i++) {\n args.push(literal(ast.strings[i]));\n args.push(this.visit(ast.expressions[i], _Mode.Expression));\n }\n args.push(literal(ast.strings[ast.strings.length - 1]));\n return ast.expressions.length <= 9 ?\n importExpr(createIdentifier(Identifiers.inlineInterpolate)).callFn(args) :\n importExpr(createIdentifier(Identifiers.interpolate)).callFn([\n args[0], literalArr(args.slice(1))\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitKeyedRead = function (ast, mode) {\n var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n if (leftMostSafe) {\n return this.convertSafeAccess(ast, leftMostSafe, mode);\n }\n else {\n return convertToStatementIfNeeded(mode, this.visit(ast.obj, _Mode.Expression).key(this.visit(ast.key, _Mode.Expression)));\n }\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitKeyedWrite = function (ast, mode) {\n var /** @type {?} */ obj = this.visit(ast.obj, _Mode.Expression);\n var /** @type {?} */ key = this.visit(ast.key, _Mode.Expression);\n var /** @type {?} */ value = this.visit(ast.value, _Mode.Expression);\n return convertToStatementIfNeeded(mode, obj.key(key).set(value));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitLiteralArray = function (ast, mode) {\n var /** @type {?} */ parts = this.visitAll(ast.expressions, mode);\n var /** @type {?} */ literalArr$$ = this.isAction ? literalArr(parts) : createCachedLiteralArray(this._builder, parts);\n return convertToStatementIfNeeded(mode, literalArr$$);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitLiteralMap = function (ast, mode) {\n var /** @type {?} */ parts = [];\n for (var /** @type {?} */ i = 0; i < ast.keys.length; i++) {\n parts.push([ast.keys[i], this.visit(ast.values[i], _Mode.Expression)]);\n }\n var /** @type {?} */ literalMap$$ = this.isAction ? literalMap(parts) : createCachedLiteralMap(this._builder, parts);\n return convertToStatementIfNeeded(mode, literalMap$$);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitLiteralPrimitive = function (ast, mode) {\n return convertToStatementIfNeeded(mode, literal(ast.value));\n };\n /**\n * @param {?} name\n * @return {?}\n */\n _AstToIrVisitor.prototype._getLocal = function (name) {\n if (this.isAction && name == EventHandlerVars.event.name) {\n return EventHandlerVars.event;\n }\n return this._nameResolver.getLocal(name);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitMethodCall = function (ast, mode) {\n var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n if (leftMostSafe) {\n return this.convertSafeAccess(ast, leftMostSafe, mode);\n }\n else {\n var /** @type {?} */ args = this.visitAll(ast.args, _Mode.Expression);\n var /** @type {?} */ result = null;\n var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n if (receiver === this._implicitReceiver) {\n var /** @type {?} */ varExpr = this._getLocal(ast.name);\n if (isPresent(varExpr)) {\n result = varExpr.callFn(args);\n }\n }\n if (isBlank(result)) {\n result = receiver.callMethod(ast.name, args);\n }\n return convertToStatementIfNeeded(mode, result);\n }\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitPrefixNot = function (ast, mode) {\n return convertToStatementIfNeeded(mode, not(this.visit(ast.expression, _Mode.Expression)));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitPropertyRead = function (ast, mode) {\n var /** @type {?} */ leftMostSafe = this.leftMostSafeNode(ast);\n if (leftMostSafe) {\n return this.convertSafeAccess(ast, leftMostSafe, mode);\n }\n else {\n var /** @type {?} */ result = null;\n var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n if (receiver === this._implicitReceiver) {\n result = this._getLocal(ast.name);\n }\n if (isBlank(result)) {\n result = receiver.prop(ast.name);\n }\n return convertToStatementIfNeeded(mode, result);\n }\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitPropertyWrite = function (ast, mode) {\n var /** @type {?} */ receiver = this.visit(ast.receiver, _Mode.Expression);\n if (receiver === this._implicitReceiver) {\n var /** @type {?} */ varExpr = this._getLocal(ast.name);\n if (isPresent(varExpr)) {\n throw new Error('Cannot assign to a reference or variable!');\n }\n }\n return convertToStatementIfNeeded(mode, receiver.prop(ast.name).set(this.visit(ast.value, _Mode.Expression)));\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitSafePropertyRead = function (ast, mode) {\n return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitSafeMethodCall = function (ast, mode) {\n return this.convertSafeAccess(ast, this.leftMostSafeNode(ast), mode);\n };\n /**\n * @param {?} asts\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitAll = function (asts, mode) {\n var _this = this;\n return asts.map(function (ast) { return _this.visit(ast, mode); });\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visitQuote = function (ast, mode) {\n throw new Error('Quotes are not supported for evaluation!');\n };\n /**\n * @param {?} ast\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.visit = function (ast, mode) {\n var /** @type {?} */ result = this._resultMap.get(ast);\n if (result)\n return result;\n return (this._nodeMap.get(ast) || ast).visit(this, mode);\n };\n /**\n * @param {?} ast\n * @param {?} leftMostSafe\n * @param {?} mode\n * @return {?}\n */\n _AstToIrVisitor.prototype.convertSafeAccess = function (ast, leftMostSafe, mode) {\n // If the expression contains a safe access node on the left it needs to be converted to\n // an expression that guards the access to the member by checking the receiver for blank. As\n // execution proceeds from left to right, the left most part of the expression must be guarded\n // first but, because member access is left associative, the right side of the expression is at\n // the top of the AST. The desired result requires lifting a copy of the the left part of the\n // expression up to test it for blank before generating the unguarded version.\n // Consider, for example the following expression: a?.b.c?.d.e\n // This results in the ast:\n // .\n // / \\\n // ?. e\n // / \\\n // . d\n // / \\\n // ?. c\n // / \\\n // a b\n // The following tree should be generated:\n //\n // /---- ? ----\\\n // / | \\\n // a /--- ? ---\\ null\n // / | \\\n // . . null\n // / \\ / \\\n // . c . e\n // / \\ / \\\n // a b , d\n // / \\\n // . c\n // / \\\n // a b\n //\n // Notice that the first guard condition is the left hand of the left most safe access node\n // which comes in as leftMostSafe to this routine.\n var /** @type {?} */ guardedExpression = this.visit(leftMostSafe.receiver, _Mode.Expression);\n var /** @type {?} */ temporary;\n if (this.needsTemporary(leftMostSafe.receiver)) {\n // If the expression has method calls or pipes then we need to save the result into a\n // temporary variable to avoid calling stateful or impure code more than once.\n temporary = this.allocateTemporary();\n // Preserve the result in the temporary variable\n guardedExpression = temporary.set(guardedExpression);\n // Ensure all further references to the guarded expression refer to the temporary instead.\n this._resultMap.set(leftMostSafe.receiver, temporary);\n }\n var /** @type {?} */ condition = guardedExpression.isBlank();\n // Convert the ast to an unguarded access to the receiver's member. The map will substitute\n // leftMostNode with its unguarded version in the call to `this.visit()`.\n if (leftMostSafe instanceof SafeMethodCall) {\n this._nodeMap.set(leftMostSafe, new MethodCall(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name, leftMostSafe.args));\n }\n else {\n this._nodeMap.set(leftMostSafe, new PropertyRead(leftMostSafe.span, leftMostSafe.receiver, leftMostSafe.name));\n }\n // Recursively convert the node now without the guarded member access.\n var /** @type {?} */ access = this.visit(ast, _Mode.Expression);\n // Remove the mapping. This is not strictly required as the converter only traverses each node\n // once but is safer if the conversion is changed to traverse the nodes more than once.\n this._nodeMap.delete(leftMostSafe);\n // If we allcoated a temporary, release it.\n if (temporary) {\n this.releaseTemporary(temporary);\n }\n // Produce the conditional\n return convertToStatementIfNeeded(mode, condition.conditional(literal(null), access));\n };\n /**\n * @param {?} ast\n * @return {?}\n */\n _AstToIrVisitor.prototype.leftMostSafeNode = function (ast) {\n var _this = this;\n var /** @type {?} */ visit = function (visitor, ast) {\n return (_this._nodeMap.get(ast) || ast).visit(visitor);\n };\n return ast.visit({\n /**\n * @param {?} ast\n * @return {?}\n */\n visitBinary: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitChain: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitConditional: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitFunctionCall: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitImplicitReceiver: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitInterpolation: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitKeyedRead: function (ast) { return visit(this, ast.obj); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitKeyedWrite: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralArray: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralMap: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralPrimitive: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitMethodCall: function (ast) { return visit(this, ast.receiver); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPipe: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPrefixNot: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPropertyRead: function (ast) { return visit(this, ast.receiver); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPropertyWrite: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitQuote: function (ast) { return null; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitSafeMethodCall: function (ast) { return visit(this, ast.receiver) || ast; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitSafePropertyRead: function (ast) {\n return visit(this, ast.receiver) || ast;\n }\n });\n };\n /**\n * @param {?} ast\n * @return {?}\n */\n _AstToIrVisitor.prototype.needsTemporary = function (ast) {\n var _this = this;\n var /** @type {?} */ visit = function (visitor, ast) {\n return ast && (_this._nodeMap.get(ast) || ast).visit(visitor);\n };\n var /** @type {?} */ visitSome = function (visitor, ast) {\n return ast.some(function (ast) { return visit(visitor, ast); });\n };\n return ast.visit({\n /**\n * @param {?} ast\n * @return {?}\n */\n visitBinary: function (ast) { return visit(this, ast.left) || visit(this, ast.right); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitChain: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitConditional: function (ast) {\n return visit(this, ast.condition) || visit(this, ast.trueExp) ||\n visit(this, ast.falseExp);\n },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitFunctionCall: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitImplicitReceiver: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitInterpolation: function (ast) { return visitSome(this, ast.expressions); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitKeyedRead: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitKeyedWrite: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralArray: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralMap: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitLiteralPrimitive: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitMethodCall: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPipe: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPrefixNot: function (ast) { return visit(this, ast.expression); },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPropertyRead: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitPropertyWrite: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitQuote: function (ast) { return false; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitSafeMethodCall: function (ast) { return true; },\n /**\n * @param {?} ast\n * @return {?}\n */\n visitSafePropertyRead: function (ast) { return false; }\n });\n };\n /**\n * @return {?}\n */\n _AstToIrVisitor.prototype.allocateTemporary = function () {\n var /** @type {?} */ tempNumber = this._currentTemporary++;\n this.temporaryCount = Math.max(this._currentTemporary, this.temporaryCount);\n return new ReadVarExpr(temporaryName(this.bindingId, tempNumber));\n };\n /**\n * @param {?} temporary\n * @return {?}\n */\n _AstToIrVisitor.prototype.releaseTemporary = function (temporary) {\n this._currentTemporary--;\n if (temporary.name != temporaryName(this.bindingId, this._currentTemporary)) {\n throw new Error(\"Temporary \" + temporary.name + \" released out of order\");\n }\n };\n return _AstToIrVisitor;\n }());\n /**\n * @param {?} arg\n * @param {?} output\n * @return {?}\n */\n function flattenStatements(arg, output) {\n if (Array.isArray(arg)) {\n ((arg)).forEach(function (entry) { return flattenStatements(entry, output); });\n }\n else {\n output.push(arg);\n }\n }\n /**\n * @param {?} builder\n * @param {?} values\n * @return {?}\n */\n function createCachedLiteralArray(builder, values) {\n if (values.length === 0) {\n return importExpr(createIdentifier(Identifiers.EMPTY_ARRAY));\n }\n var /** @type {?} */ proxyExpr = THIS_EXPR.prop(\"_arr_\" + builder.fields.length);\n var /** @type {?} */ proxyParams = [];\n var /** @type {?} */ proxyReturnEntries = [];\n for (var /** @type {?} */ i = 0; i < values.length; i++) {\n var /** @type {?} */ paramName = \"p\" + i;\n proxyParams.push(new FnParam(paramName));\n proxyReturnEntries.push(variable(paramName));\n }\n createPureProxy(fn(proxyParams, [new ReturnStatement(literalArr(proxyReturnEntries))], new ArrayType(DYNAMIC_TYPE)), values.length, proxyExpr, builder);\n return proxyExpr.callFn(values);\n }\n /**\n * @param {?} builder\n * @param {?} entries\n * @return {?}\n */\n function createCachedLiteralMap(builder, entries) {\n if (entries.length === 0) {\n return importExpr(createIdentifier(Identifiers.EMPTY_MAP));\n }\n var /** @type {?} */ proxyExpr = THIS_EXPR.prop(\"_map_\" + builder.fields.length);\n var /** @type {?} */ proxyParams = [];\n var /** @type {?} */ proxyReturnEntries = [];\n var /** @type {?} */ values = [];\n for (var /** @type {?} */ i = 0; i < entries.length; i++) {\n var /** @type {?} */ paramName = \"p\" + i;\n proxyParams.push(new FnParam(paramName));\n proxyReturnEntries.push([entries[i][0], variable(paramName)]);\n values.push(/** @type {?} */ (entries[i][1]));\n }\n createPureProxy(fn(proxyParams, [new ReturnStatement(literalMap(proxyReturnEntries))], new MapType(DYNAMIC_TYPE)), entries.length, proxyExpr, builder);\n return proxyExpr.callFn(values);\n }\n var DefaultNameResolver = (function () {\n function DefaultNameResolver() {\n }\n /**\n * @param {?} name\n * @param {?} input\n * @param {?} args\n * @return {?}\n */\n DefaultNameResolver.prototype.callPipe = function (name, input, args) { return null; };\n /**\n * @param {?} name\n * @return {?}\n */\n DefaultNameResolver.prototype.getLocal = function (name) { return null; };\n return DefaultNameResolver;\n }());\n /**\n * @param {?} bindingId\n * @return {?}\n */\n function createCurrValueExpr(bindingId) {\n return variable(\"currVal_\" + bindingId); // fix syntax highlighting: `\n }\n /**\n * @param {?} bindingId\n * @return {?}\n */\n function createPreventDefaultVar(bindingId) {\n return variable(\"pd_\" + bindingId);\n }\n /**\n * @param {?} stmt\n * @return {?}\n */\n function convertStmtIntoExpression(stmt) {\n if (stmt instanceof ExpressionStatement) {\n return stmt.expr;\n }\n else if (stmt instanceof ReturnStatement) {\n return stmt.value;\n }\n return null;\n }\n\n /**\n * @param {?} view\n * @param {?} boundProp\n * @param {?} renderElement\n * @param {?} renderValue\n * @param {?} logBindingUpdate\n * @param {?=} securityContextExpression\n * @return {?}\n */\n function writeToRenderer(view, boundProp, renderElement, renderValue, logBindingUpdate, securityContextExpression) {\n var /** @type {?} */ updateStmts = [];\n var /** @type {?} */ renderer = view.prop('renderer');\n renderValue = sanitizedValue(view, boundProp, renderValue, securityContextExpression);\n switch (boundProp.type) {\n case PropertyBindingType.Property:\n if (logBindingUpdate) {\n updateStmts.push(importExpr(createIdentifier(Identifiers.setBindingDebugInfo))\n .callFn([renderer, renderElement, literal(boundProp.name), renderValue])\n .toStmt());\n }\n updateStmts.push(renderer\n .callMethod('setElementProperty', [renderElement, literal(boundProp.name), renderValue])\n .toStmt());\n break;\n case PropertyBindingType.Attribute:\n renderValue =\n renderValue.isBlank().conditional(NULL_EXPR, renderValue.callMethod('toString', []));\n updateStmts.push(renderer\n .callMethod('setElementAttribute', [renderElement, literal(boundProp.name), renderValue])\n .toStmt());\n break;\n case PropertyBindingType.Class:\n updateStmts.push(renderer\n .callMethod('setElementClass', [renderElement, literal(boundProp.name), renderValue])\n .toStmt());\n break;\n case PropertyBindingType.Style:\n var /** @type {?} */ strValue = renderValue.callMethod('toString', []);\n if (isPresent(boundProp.unit)) {\n strValue = strValue.plus(literal(boundProp.unit));\n }\n renderValue = renderValue.isBlank().conditional(NULL_EXPR, strValue);\n updateStmts.push(renderer\n .callMethod('setElementStyle', [renderElement, literal(boundProp.name), renderValue])\n .toStmt());\n break;\n case PropertyBindingType.Animation:\n throw new Error('Illegal state: Should not come here!');\n }\n return updateStmts;\n }\n /**\n * @param {?} view\n * @param {?} boundProp\n * @param {?} renderValue\n * @param {?=} securityContextExpression\n * @return {?}\n */\n function sanitizedValue(view, boundProp, renderValue, securityContextExpression) {\n if (boundProp.securityContext === _angular_core.SecurityContext.NONE) {\n return renderValue; // No sanitization needed.\n }\n if (!boundProp.needsRuntimeSecurityContext) {\n securityContextExpression =\n createEnumExpression(Identifiers.SecurityContext, boundProp.securityContext);\n }\n if (!securityContextExpression) {\n throw new Error(\"internal error, no SecurityContext given \" + boundProp.name);\n }\n var /** @type {?} */ ctx = view.prop('viewUtils').prop('sanitizer');\n var /** @type {?} */ args = [securityContextExpression, renderValue];\n return ctx.callMethod('sanitize', args);\n }\n /**\n * @param {?} view\n * @param {?} componentView\n * @param {?} boundProp\n * @param {?} boundOutputs\n * @param {?} eventListener\n * @param {?} renderElement\n * @param {?} renderValue\n * @param {?} lastRenderValue\n * @return {?}\n */\n function triggerAnimation(view, componentView, boundProp, boundOutputs, eventListener, renderElement, renderValue, lastRenderValue) {\n var /** @type {?} */ detachStmts = [];\n var /** @type {?} */ updateStmts = [];\n var /** @type {?} */ animationName = boundProp.name;\n var /** @type {?} */ animationFnExpr = componentView.prop('componentType').prop('animations').key(literal(animationName));\n // it's important to normalize the void value as `void` explicitly\n // so that the styles data can be obtained from the stringmap\n var /** @type {?} */ emptyStateValue = literal(EMPTY_STATE);\n var /** @type {?} */ unitializedValue = importExpr(createIdentifier(Identifiers.UNINITIALIZED));\n var /** @type {?} */ animationTransitionVar = variable('animationTransition_' + animationName);\n updateStmts.push(animationTransitionVar\n .set(animationFnExpr.callFn([\n view, renderElement,\n lastRenderValue.equals(unitializedValue).conditional(emptyStateValue, lastRenderValue),\n renderValue.equals(unitializedValue).conditional(emptyStateValue, renderValue)\n ]))\n .toDeclStmt());\n detachStmts.push(animationTransitionVar\n .set(animationFnExpr.callFn([view, renderElement, lastRenderValue, emptyStateValue]))\n .toDeclStmt());\n var /** @type {?} */ registerStmts = [];\n var /** @type {?} */ animationStartMethodExists = boundOutputs.find(function (event) { return event.isAnimation && event.name == animationName && event.phase == 'start'; });\n if (animationStartMethodExists) {\n registerStmts.push(animationTransitionVar\n .callMethod('onStart', [eventListener.callMethod(BuiltinMethod.Bind, [view, literal(BoundEventAst.calcFullName(animationName, null, 'start'))])])\n .toStmt());\n }\n var /** @type {?} */ animationDoneMethodExists = boundOutputs.find(function (event) { return event.isAnimation && event.name == animationName && event.phase == 'done'; });\n if (animationDoneMethodExists) {\n registerStmts.push(animationTransitionVar\n .callMethod('onDone', [eventListener.callMethod(BuiltinMethod.Bind, [view, literal(BoundEventAst.calcFullName(animationName, null, 'done'))])])\n .toStmt());\n }\n updateStmts.push.apply(updateStmts, registerStmts);\n detachStmts.push.apply(detachStmts, registerStmts);\n return { updateStmts: updateStmts, detachStmts: detachStmts };\n }\n\n /**\n * Create a new class stmts based on the given data.\n * @param {?} config\n * @return {?}\n */\n function createClassStmt(config) {\n var /** @type {?} */ parentArgs = config.parentArgs || [];\n var /** @type {?} */ superCtorStmts = config.parent ? [SUPER_EXPR.callFn(parentArgs).toStmt()] : [];\n var /** @type {?} */ builder = concatClassBuilderParts(Array.isArray(config.builders) ? config.builders : [config.builders]);\n var /** @type {?} */ ctor = new ClassMethod(null, config.ctorParams || [], superCtorStmts.concat(builder.ctorStmts));\n return new ClassStmt(config.name, config.parent, builder.fields, builder.getters, ctor, builder.methods, config.modifiers || []);\n }\n /**\n * @param {?} builders\n * @return {?}\n */\n function concatClassBuilderParts(builders) {\n return {\n fields: (_a = []).concat.apply(_a, builders.map(function (builder) { return builder.fields || []; })),\n methods: (_b = []).concat.apply(_b, builders.map(function (builder) { return builder.methods || []; })),\n getters: (_c = []).concat.apply(_c, builders.map(function (builder) { return builder.getters || []; })),\n ctorStmts: (_d = []).concat.apply(_d, builders.map(function (builder) { return builder.ctorStmts || []; })),\n };\n var _a, _b, _c, _d;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$8 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$8 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var DirectiveWrapperCompileResult = (function () {\n /**\n * @param {?} statements\n * @param {?} dirWrapperClassVar\n */\n function DirectiveWrapperCompileResult(statements, dirWrapperClassVar) {\n this.statements = statements;\n this.dirWrapperClassVar = dirWrapperClassVar;\n }\n return DirectiveWrapperCompileResult;\n }());\n var /** @type {?} */ CONTEXT_FIELD_NAME = 'context';\n var /** @type {?} */ CHANGES_FIELD_NAME = '_changes';\n var /** @type {?} */ CHANGED_FIELD_NAME = '_changed';\n var /** @type {?} */ EVENT_HANDLER_FIELD_NAME = '_eventHandler';\n var /** @type {?} */ CURR_VALUE_VAR = variable('currValue');\n var /** @type {?} */ THROW_ON_CHANGE_VAR = variable('throwOnChange');\n var /** @type {?} */ FORCE_UPDATE_VAR = variable('forceUpdate');\n var /** @type {?} */ VIEW_VAR = variable('view');\n var /** @type {?} */ COMPONENT_VIEW_VAR = variable('componentView');\n var /** @type {?} */ RENDER_EL_VAR = variable('el');\n var /** @type {?} */ EVENT_NAME_VAR = variable('eventName');\n var /** @type {?} */ RESET_CHANGES_STMT = THIS_EXPR.prop(CHANGES_FIELD_NAME).set(literalMap([])).toStmt();\n /**\n * We generate directive wrappers to prevent code bloat when a directive is used.\n * A directive wrapper encapsulates\n * the dirty checking for `@Input`, the handling of `@HostListener` / `@HostBinding`\n * and calling the lifecyclehooks `ngOnInit`, `ngOnChanges`, `ngDoCheck`.\n * *\n * So far, only `@Input` and the lifecycle hooks have been implemented.\n */\n var DirectiveWrapperCompiler = (function () {\n /**\n * @param {?} compilerConfig\n * @param {?} _exprParser\n * @param {?} _schemaRegistry\n * @param {?} _console\n */\n function DirectiveWrapperCompiler(compilerConfig, _exprParser, _schemaRegistry, _console) {\n this.compilerConfig = compilerConfig;\n this._exprParser = _exprParser;\n this._schemaRegistry = _schemaRegistry;\n this._console = _console;\n }\n /**\n * @param {?} id\n * @return {?}\n */\n DirectiveWrapperCompiler.dirWrapperClassName = function (id) {\n return \"Wrapper_\" + identifierName(id);\n };\n /**\n * @param {?} dirMeta\n * @return {?}\n */\n DirectiveWrapperCompiler.prototype.compile = function (dirMeta) {\n var /** @type {?} */ hostParseResult = parseHostBindings(dirMeta, this._exprParser, this._schemaRegistry);\n reportParseErrors(hostParseResult.errors, this._console);\n var /** @type {?} */ builder = new DirectiveWrapperBuilder(this.compilerConfig, dirMeta);\n Object.keys(dirMeta.inputs).forEach(function (inputFieldName) {\n addCheckInputMethod(inputFieldName, builder);\n });\n addNgDoCheckMethod(builder);\n addCheckHostMethod(hostParseResult.hostProps, hostParseResult.hostListeners, builder);\n addHandleEventMethod(hostParseResult.hostListeners, builder);\n addSubscribeMethod(dirMeta, builder);\n var /** @type {?} */ classStmt = builder.build();\n return new DirectiveWrapperCompileResult([classStmt], classStmt.name);\n };\n DirectiveWrapperCompiler = __decorate$8([\n CompilerInjectable(), \n __metadata$8('design:paramtypes', [CompilerConfig, Parser, ElementSchemaRegistry, Console])\n ], DirectiveWrapperCompiler);\n return DirectiveWrapperCompiler;\n }());\n var DirectiveWrapperBuilder = (function () {\n /**\n * @param {?} compilerConfig\n * @param {?} dirMeta\n */\n function DirectiveWrapperBuilder(compilerConfig, dirMeta) {\n this.compilerConfig = compilerConfig;\n this.dirMeta = dirMeta;\n this.fields = [];\n this.getters = [];\n this.methods = [];\n this.ctorStmts = [];\n this.detachStmts = [];\n this.destroyStmts = [];\n var dirLifecycleHooks = dirMeta.type.lifecycleHooks;\n this.genChanges = dirLifecycleHooks.indexOf(LifecycleHooks.OnChanges) !== -1 ||\n this.compilerConfig.logBindingUpdate;\n this.ngOnChanges = dirLifecycleHooks.indexOf(LifecycleHooks.OnChanges) !== -1;\n this.ngOnInit = dirLifecycleHooks.indexOf(LifecycleHooks.OnInit) !== -1;\n this.ngDoCheck = dirLifecycleHooks.indexOf(LifecycleHooks.DoCheck) !== -1;\n this.ngOnDestroy = dirLifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1;\n if (this.ngOnDestroy) {\n this.destroyStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngOnDestroy', []).toStmt());\n }\n }\n /**\n * @return {?}\n */\n DirectiveWrapperBuilder.prototype.build = function () {\n var /** @type {?} */ dirDepParamNames = [];\n for (var /** @type {?} */ i = 0; i < this.dirMeta.type.diDeps.length; i++) {\n dirDepParamNames.push(\"p\" + i);\n }\n var /** @type {?} */ methods = [\n new ClassMethod('ngOnDetach', [\n new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(COMPONENT_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n ], this.detachStmts),\n new ClassMethod('ngOnDestroy', [], this.destroyStmts),\n ];\n var /** @type {?} */ fields = [\n new ClassField(EVENT_HANDLER_FIELD_NAME, FUNCTION_TYPE, [StmtModifier.Private]),\n new ClassField(CONTEXT_FIELD_NAME, importType(this.dirMeta.type)),\n new ClassField(CHANGED_FIELD_NAME, BOOL_TYPE, [StmtModifier.Private]),\n ];\n var /** @type {?} */ ctorStmts = [THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(false)).toStmt()];\n if (this.genChanges) {\n fields.push(new ClassField(CHANGES_FIELD_NAME, new MapType(DYNAMIC_TYPE), [StmtModifier.Private]));\n ctorStmts.push(RESET_CHANGES_STMT);\n }\n ctorStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n .set(importExpr(this.dirMeta.type)\n .instantiate(dirDepParamNames.map(function (paramName) { return variable(paramName); })))\n .toStmt());\n return createClassStmt({\n name: DirectiveWrapperCompiler.dirWrapperClassName(this.dirMeta.type),\n ctorParams: dirDepParamNames.map(function (paramName) { return new FnParam(paramName, DYNAMIC_TYPE); }),\n builders: [{ fields: fields, ctorStmts: ctorStmts, methods: methods }, this]\n });\n };\n return DirectiveWrapperBuilder;\n }());\n /**\n * @param {?} builder\n * @return {?}\n */\n function addNgDoCheckMethod(builder) {\n var /** @type {?} */ changedVar = variable('changed');\n var /** @type {?} */ stmts = [\n changedVar.set(THIS_EXPR.prop(CHANGED_FIELD_NAME)).toDeclStmt(),\n THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(false)).toStmt(),\n ];\n var /** @type {?} */ lifecycleStmts = [];\n if (builder.genChanges) {\n var /** @type {?} */ onChangesStmts = [];\n if (builder.ngOnChanges) {\n onChangesStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n .callMethod('ngOnChanges', [THIS_EXPR.prop(CHANGES_FIELD_NAME)])\n .toStmt());\n }\n if (builder.compilerConfig.logBindingUpdate) {\n onChangesStmts.push(importExpr(createIdentifier(Identifiers.setBindingDebugInfoForChanges))\n .callFn([VIEW_VAR.prop('renderer'), RENDER_EL_VAR, THIS_EXPR.prop(CHANGES_FIELD_NAME)])\n .toStmt());\n }\n onChangesStmts.push(RESET_CHANGES_STMT);\n lifecycleStmts.push(new IfStmt(changedVar, onChangesStmts));\n }\n if (builder.ngOnInit) {\n lifecycleStmts.push(new IfStmt(VIEW_VAR.prop('numberOfChecks').identical(new LiteralExpr(0)), [THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngOnInit', []).toStmt()]));\n }\n if (builder.ngDoCheck) {\n lifecycleStmts.push(THIS_EXPR.prop(CONTEXT_FIELD_NAME).callMethod('ngDoCheck', []).toStmt());\n }\n if (lifecycleStmts.length > 0) {\n stmts.push(new IfStmt(not(THROW_ON_CHANGE_VAR), lifecycleStmts));\n }\n stmts.push(new ReturnStatement(changedVar));\n builder.methods.push(new ClassMethod('ngDoCheck', [\n new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n ], stmts, BOOL_TYPE));\n }\n /**\n * @param {?} input\n * @param {?} builder\n * @return {?}\n */\n function addCheckInputMethod(input, builder) {\n var /** @type {?} */ field = createCheckBindingField(builder);\n var /** @type {?} */ onChangeStatements = [\n THIS_EXPR.prop(CHANGED_FIELD_NAME).set(literal(true)).toStmt(),\n THIS_EXPR.prop(CONTEXT_FIELD_NAME).prop(input).set(CURR_VALUE_VAR).toStmt(),\n ];\n if (builder.genChanges) {\n onChangeStatements.push(THIS_EXPR.prop(CHANGES_FIELD_NAME)\n .key(literal(input))\n .set(importExpr(createIdentifier(Identifiers.SimpleChange))\n .instantiate([field.expression, CURR_VALUE_VAR]))\n .toStmt());\n }\n var /** @type {?} */ methodBody = createCheckBindingStmt({ currValExpr: CURR_VALUE_VAR, forceUpdate: FORCE_UPDATE_VAR, stmts: [] }, field.expression, THROW_ON_CHANGE_VAR, onChangeStatements);\n builder.methods.push(new ClassMethod(\"check_\" + input, [\n new FnParam(CURR_VALUE_VAR.name, DYNAMIC_TYPE),\n new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n new FnParam(FORCE_UPDATE_VAR.name, BOOL_TYPE),\n ], methodBody));\n }\n /**\n * @param {?} hostProps\n * @param {?} hostEvents\n * @param {?} builder\n * @return {?}\n */\n function addCheckHostMethod(hostProps, hostEvents, builder) {\n var /** @type {?} */ stmts = [];\n var /** @type {?} */ methodParams = [\n new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(COMPONENT_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(RENDER_EL_VAR.name, DYNAMIC_TYPE),\n new FnParam(THROW_ON_CHANGE_VAR.name, BOOL_TYPE),\n ];\n hostProps.forEach(function (hostProp, hostPropIdx) {\n var /** @type {?} */ field = createCheckBindingField(builder);\n var /** @type {?} */ evalResult = convertPropertyBinding(builder, null, THIS_EXPR.prop(CONTEXT_FIELD_NAME), hostProp.value, field.bindingId);\n if (!evalResult) {\n return;\n }\n var /** @type {?} */ securityContextExpr;\n if (hostProp.needsRuntimeSecurityContext) {\n securityContextExpr = variable(\"secCtx_\" + methodParams.length);\n methodParams.push(new FnParam(securityContextExpr.name, importType(createIdentifier(Identifiers.SecurityContext))));\n }\n var /** @type {?} */ checkBindingStmts;\n if (hostProp.isAnimation) {\n var _a = triggerAnimation(VIEW_VAR, COMPONENT_VIEW_VAR, hostProp, hostEvents, THIS_EXPR.prop(EVENT_HANDLER_FIELD_NAME)\n .or(importExpr(createIdentifier(Identifiers.noop))), RENDER_EL_VAR, evalResult.currValExpr, field.expression), updateStmts = _a.updateStmts, detachStmts = _a.detachStmts;\n checkBindingStmts = updateStmts;\n (_b = builder.detachStmts).push.apply(_b, detachStmts);\n }\n else {\n checkBindingStmts = writeToRenderer(VIEW_VAR, hostProp, RENDER_EL_VAR, evalResult.currValExpr, builder.compilerConfig.logBindingUpdate, securityContextExpr);\n }\n stmts.push.apply(stmts, createCheckBindingStmt(evalResult, field.expression, THROW_ON_CHANGE_VAR, checkBindingStmts));\n var _b;\n });\n builder.methods.push(new ClassMethod('checkHost', methodParams, stmts));\n }\n /**\n * @param {?} hostListeners\n * @param {?} builder\n * @return {?}\n */\n function addHandleEventMethod(hostListeners, builder) {\n var /** @type {?} */ resultVar = variable(\"result\");\n var /** @type {?} */ actionStmts = [resultVar.set(literal(true)).toDeclStmt(BOOL_TYPE)];\n hostListeners.forEach(function (hostListener, eventIdx) {\n var /** @type {?} */ evalResult = convertActionBinding(builder, null, THIS_EXPR.prop(CONTEXT_FIELD_NAME), hostListener.handler, \"sub_\" + eventIdx);\n var /** @type {?} */ trueStmts = evalResult.stmts;\n if (evalResult.preventDefault) {\n trueStmts.push(resultVar.set(evalResult.preventDefault.and(resultVar)).toStmt());\n }\n // TODO(tbosch): convert this into a `switch` once our OutputAst supports it.\n actionStmts.push(new IfStmt(EVENT_NAME_VAR.equals(literal(hostListener.fullName)), trueStmts));\n });\n actionStmts.push(new ReturnStatement(resultVar));\n builder.methods.push(new ClassMethod('handleEvent', [\n new FnParam(EVENT_NAME_VAR.name, STRING_TYPE),\n new FnParam(EventHandlerVars.event.name, DYNAMIC_TYPE)\n ], actionStmts, BOOL_TYPE));\n }\n /**\n * @param {?} dirMeta\n * @param {?} builder\n * @return {?}\n */\n function addSubscribeMethod(dirMeta, builder) {\n var /** @type {?} */ methodParams = [\n new FnParam(VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(EVENT_HANDLER_FIELD_NAME, DYNAMIC_TYPE)\n ];\n var /** @type {?} */ stmts = [\n THIS_EXPR.prop(EVENT_HANDLER_FIELD_NAME).set(variable(EVENT_HANDLER_FIELD_NAME)).toStmt()\n ];\n Object.keys(dirMeta.outputs).forEach(function (emitterPropName, emitterIdx) {\n var /** @type {?} */ eventName = dirMeta.outputs[emitterPropName];\n var /** @type {?} */ paramName = \"emit\" + emitterIdx;\n methodParams.push(new FnParam(paramName, BOOL_TYPE));\n var /** @type {?} */ subscriptionFieldName = \"subscription\" + emitterIdx;\n builder.fields.push(new ClassField(subscriptionFieldName, DYNAMIC_TYPE));\n stmts.push(new IfStmt(variable(paramName), [\n THIS_EXPR.prop(subscriptionFieldName)\n .set(THIS_EXPR.prop(CONTEXT_FIELD_NAME)\n .prop(emitterPropName)\n .callMethod(BuiltinMethod.SubscribeObservable, [variable(EVENT_HANDLER_FIELD_NAME)\n .callMethod(BuiltinMethod.Bind, [VIEW_VAR, literal(eventName)])]))\n .toStmt()\n ]));\n builder.destroyStmts.push(THIS_EXPR.prop(subscriptionFieldName)\n .and(THIS_EXPR.prop(subscriptionFieldName).callMethod('unsubscribe', []))\n .toStmt());\n });\n builder.methods.push(new ClassMethod('subscribe', methodParams, stmts));\n }\n var ParseResult = (function () {\n /**\n * @param {?} hostProps\n * @param {?} hostListeners\n * @param {?} errors\n */\n function ParseResult(hostProps, hostListeners, errors) {\n this.hostProps = hostProps;\n this.hostListeners = hostListeners;\n this.errors = errors;\n }\n return ParseResult;\n }());\n /**\n * @param {?} dirMeta\n * @param {?} exprParser\n * @param {?} schemaRegistry\n * @return {?}\n */\n function parseHostBindings(dirMeta, exprParser, schemaRegistry) {\n var /** @type {?} */ errors = [];\n var /** @type {?} */ parser = new BindingParser(exprParser, DEFAULT_INTERPOLATION_CONFIG, schemaRegistry, [], errors);\n var /** @type {?} */ moduleUrl = identifierModuleUrl(dirMeta.type);\n var /** @type {?} */ sourceFileName = moduleUrl ?\n \"in Directive \" + identifierName(dirMeta.type) + \" in \" + moduleUrl :\n \"in Directive \" + identifierName(dirMeta.type);\n var /** @type {?} */ sourceFile = new ParseSourceFile('', sourceFileName);\n var /** @type {?} */ sourceSpan = new ParseSourceSpan(new ParseLocation(sourceFile, null, null, null), new ParseLocation(sourceFile, null, null, null));\n var /** @type {?} */ parsedHostProps = parser.createDirectiveHostPropertyAsts(dirMeta.toSummary(), sourceSpan);\n var /** @type {?} */ parsedHostListeners = parser.createDirectiveHostEventAsts(dirMeta.toSummary(), sourceSpan);\n return new ParseResult(parsedHostProps, parsedHostListeners, errors);\n }\n /**\n * @param {?} parseErrors\n * @param {?} console\n * @return {?}\n */\n function reportParseErrors(parseErrors, console) {\n var /** @type {?} */ warnings = parseErrors.filter(function (error) { return error.level === ParseErrorLevel.WARNING; });\n var /** @type {?} */ errors = parseErrors.filter(function (error) { return error.level === ParseErrorLevel.FATAL; });\n if (warnings.length > 0) {\n this._console.warn(\"Directive parse warnings:\\n\" + warnings.join('\\n'));\n }\n if (errors.length > 0) {\n throw new Error(\"Directive parse errors:\\n\" + errors.join('\\n'));\n }\n }\n var DirectiveWrapperExpressions = (function () {\n function DirectiveWrapperExpressions() {\n }\n /**\n * @param {?} dir\n * @param {?} depsExpr\n * @return {?}\n */\n DirectiveWrapperExpressions.create = function (dir, depsExpr) {\n return importExpr(dir).instantiate(depsExpr, importType(dir));\n };\n /**\n * @param {?} dirWrapper\n * @return {?}\n */\n DirectiveWrapperExpressions.context = function (dirWrapper) {\n return dirWrapper.prop(CONTEXT_FIELD_NAME);\n };\n /**\n * @param {?} dirWrapper\n * @param {?} view\n * @param {?} renderElement\n * @param {?} throwOnChange\n * @return {?}\n */\n DirectiveWrapperExpressions.ngDoCheck = function (dirWrapper, view, renderElement, throwOnChange) {\n return dirWrapper.callMethod('ngDoCheck', [view, renderElement, throwOnChange]);\n };\n /**\n * @param {?} hostProps\n * @param {?} dirWrapper\n * @param {?} view\n * @param {?} componentView\n * @param {?} renderElement\n * @param {?} throwOnChange\n * @param {?} runtimeSecurityContexts\n * @return {?}\n */\n DirectiveWrapperExpressions.checkHost = function (hostProps, dirWrapper, view, componentView, renderElement, throwOnChange, runtimeSecurityContexts) {\n if (hostProps.length) {\n return [dirWrapper\n .callMethod('checkHost', [view, componentView, renderElement, throwOnChange].concat(runtimeSecurityContexts))\n .toStmt()];\n }\n else {\n return [];\n }\n };\n /**\n * @param {?} hostProps\n * @param {?} dirWrapper\n * @param {?} view\n * @param {?} componentView\n * @param {?} renderEl\n * @return {?}\n */\n DirectiveWrapperExpressions.ngOnDetach = function (hostProps, dirWrapper, view, componentView, renderEl) {\n if (hostProps.some(function (prop) { return prop.isAnimation; })) {\n return [dirWrapper\n .callMethod('ngOnDetach', [\n view,\n componentView,\n renderEl,\n ])\n .toStmt()];\n }\n else {\n return [];\n }\n };\n /**\n * @param {?} dir\n * @param {?} dirWrapper\n * @return {?}\n */\n DirectiveWrapperExpressions.ngOnDestroy = function (dir, dirWrapper) {\n if (dir.type.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1 ||\n Object.keys(dir.outputs).length > 0) {\n return [dirWrapper.callMethod('ngOnDestroy', []).toStmt()];\n }\n else {\n return [];\n }\n };\n /**\n * @param {?} dirMeta\n * @param {?} hostProps\n * @param {?} usedEvents\n * @param {?} dirWrapper\n * @param {?} view\n * @param {?} eventListener\n * @return {?}\n */\n DirectiveWrapperExpressions.subscribe = function (dirMeta, hostProps, usedEvents, dirWrapper, view, eventListener) {\n var /** @type {?} */ needsSubscribe = false;\n var /** @type {?} */ eventFlags = [];\n Object.keys(dirMeta.outputs).forEach(function (propName) {\n var /** @type {?} */ eventName = dirMeta.outputs[propName];\n var /** @type {?} */ eventUsed = usedEvents.indexOf(eventName) > -1;\n needsSubscribe = needsSubscribe || eventUsed;\n eventFlags.push(literal(eventUsed));\n });\n hostProps.forEach(function (hostProp) {\n if (hostProp.isAnimation && usedEvents.length > 0) {\n needsSubscribe = true;\n }\n });\n if (needsSubscribe) {\n return [\n dirWrapper.callMethod('subscribe', [view, eventListener].concat(eventFlags)).toStmt()\n ];\n }\n else {\n return [];\n }\n };\n /**\n * @param {?} hostEvents\n * @param {?} dirWrapper\n * @param {?} eventName\n * @param {?} event\n * @return {?}\n */\n DirectiveWrapperExpressions.handleEvent = function (hostEvents, dirWrapper, eventName, event) {\n return dirWrapper.callMethod('handleEvent', [eventName, event]);\n };\n return DirectiveWrapperExpressions;\n }());\n\n /**\n * @param {?} hook\n * @param {?} token\n * @return {?}\n */\n function hasLifecycleHook(hook, token) {\n return reflector.hasLifecycleHook(token, getHookName(hook));\n }\n /**\n * @param {?} hook\n * @return {?}\n */\n function getHookName(hook) {\n switch (hook) {\n case LifecycleHooks.OnInit:\n return 'ngOnInit';\n case LifecycleHooks.OnDestroy:\n return 'ngOnDestroy';\n case LifecycleHooks.DoCheck:\n return 'ngDoCheck';\n case LifecycleHooks.OnChanges:\n return 'ngOnChanges';\n case LifecycleHooks.AfterContentInit:\n return 'ngAfterContentInit';\n case LifecycleHooks.AfterContentChecked:\n return 'ngAfterContentChecked';\n case LifecycleHooks.AfterViewInit:\n return 'ngAfterViewInit';\n case LifecycleHooks.AfterViewChecked:\n return 'ngAfterViewChecked';\n }\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$10 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$10 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n function _isNgModuleMetadata(obj) {\n return obj instanceof _angular_core.NgModule;\n }\n /**\n * Resolves types to {@link NgModule}.\n */\n var NgModuleResolver = (function () {\n /**\n * @param {?=} _reflector\n */\n function NgModuleResolver(_reflector) {\n if (_reflector === void 0) { _reflector = reflector; }\n this._reflector = _reflector;\n }\n /**\n * @param {?} type\n * @return {?}\n */\n NgModuleResolver.prototype.isNgModule = function (type) { return this._reflector.annotations(type).some(_isNgModuleMetadata); };\n /**\n * @param {?} type\n * @param {?=} throwIfNotFound\n * @return {?}\n */\n NgModuleResolver.prototype.resolve = function (type, throwIfNotFound) {\n if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n var /** @type {?} */ ngModuleMeta = ListWrapper.findLast(this._reflector.annotations(type), _isNgModuleMetadata);\n if (isPresent(ngModuleMeta)) {\n return ngModuleMeta;\n }\n else {\n if (throwIfNotFound) {\n throw new Error(\"No NgModule metadata found for '\" + stringify(type) + \"'.\");\n }\n return null;\n }\n };\n NgModuleResolver = __decorate$10([\n CompilerInjectable(), \n __metadata$10('design:paramtypes', [ReflectorReader])\n ], NgModuleResolver);\n return NgModuleResolver;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$11 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$11 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n function _isPipeMetadata(type) {\n return type instanceof _angular_core.Pipe;\n }\n /**\n * Resolve a `Type` for {@link Pipe}.\n * *\n * This interface can be overridden by the application developer to create custom behavior.\n * *\n * See {@link Compiler}\n */\n var PipeResolver = (function () {\n /**\n * @param {?=} _reflector\n */\n function PipeResolver(_reflector) {\n if (_reflector === void 0) { _reflector = reflector; }\n this._reflector = _reflector;\n }\n /**\n * @param {?} type\n * @return {?}\n */\n PipeResolver.prototype.isPipe = function (type) {\n var /** @type {?} */ typeMetadata = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n return typeMetadata && typeMetadata.some(_isPipeMetadata);\n };\n /**\n * Return {@link Pipe} for a given `Type`.\n * @param {?} type\n * @param {?=} throwIfNotFound\n * @return {?}\n */\n PipeResolver.prototype.resolve = function (type, throwIfNotFound) {\n if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n var /** @type {?} */ metas = this._reflector.annotations(_angular_core.resolveForwardRef(type));\n if (isPresent(metas)) {\n var /** @type {?} */ annotation = ListWrapper.findLast(metas, _isPipeMetadata);\n if (isPresent(annotation)) {\n return annotation;\n }\n }\n if (throwIfNotFound) {\n throw new Error(\"No Pipe decorator found on \" + stringify(type));\n }\n return null;\n };\n PipeResolver = __decorate$11([\n CompilerInjectable(), \n __metadata$11('design:paramtypes', [ReflectorReader])\n ], PipeResolver);\n return PipeResolver;\n }());\n\n var __decorate$12 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$12 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var SummaryResolver = (function () {\n function SummaryResolver() {\n }\n /**\n * @param {?} reference\n * @return {?}\n */\n SummaryResolver.prototype.resolveSummary = function (reference) { return null; };\n ;\n /**\n * @param {?} filePath\n * @return {?}\n */\n SummaryResolver.prototype.getSymbolsOf = function (filePath) { return []; };\n SummaryResolver = __decorate$12([\n CompilerInjectable(), \n __metadata$12('design:paramtypes', [])\n ], SummaryResolver);\n return SummaryResolver;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$18 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var __decorate$9 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$9 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var /** @type {?} */ ERROR_COLLECTOR_TOKEN = new _angular_core.OpaqueToken('ErrorCollector');\n // Design notes:\n // - don't lazily create metadata:\n // For some metadata, we need to do async work sometimes,\n // so the user has to kick off this loading.\n // But we want to report errors even when the async work is\n // not required to check that the user would have been able\n // to wait correctly.\n var CompileMetadataResolver = (function () {\n /**\n * @param {?} _ngModuleResolver\n * @param {?} _directiveResolver\n * @param {?} _pipeResolver\n * @param {?} _summaryResolver\n * @param {?} _schemaRegistry\n * @param {?} _directiveNormalizer\n * @param {?=} _reflector\n * @param {?=} _errorCollector\n */\n function CompileMetadataResolver(_ngModuleResolver, _directiveResolver, _pipeResolver, _summaryResolver, _schemaRegistry, _directiveNormalizer, _reflector, _errorCollector) {\n if (_reflector === void 0) { _reflector = reflector; }\n this._ngModuleResolver = _ngModuleResolver;\n this._directiveResolver = _directiveResolver;\n this._pipeResolver = _pipeResolver;\n this._summaryResolver = _summaryResolver;\n this._schemaRegistry = _schemaRegistry;\n this._directiveNormalizer = _directiveNormalizer;\n this._reflector = _reflector;\n this._errorCollector = _errorCollector;\n this._directiveCache = new Map();\n this._summaryCache = new Map();\n this._pipeCache = new Map();\n this._ngModuleCache = new Map();\n this._ngModuleOfTypes = new Map();\n }\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype.clearCacheFor = function (type) {\n var /** @type {?} */ dirMeta = this._directiveCache.get(type);\n this._directiveCache.delete(type);\n this._summaryCache.delete(type);\n this._pipeCache.delete(type);\n this._ngModuleOfTypes.delete(type);\n // Clear all of the NgModule as they contain transitive information!\n this._ngModuleCache.clear();\n if (dirMeta) {\n this._directiveNormalizer.clearCacheFor(dirMeta);\n }\n };\n /**\n * @return {?}\n */\n CompileMetadataResolver.prototype.clearCache = function () {\n this._directiveCache.clear();\n this._summaryCache.clear();\n this._pipeCache.clear();\n this._ngModuleCache.clear();\n this._ngModuleOfTypes.clear();\n this._directiveNormalizer.clearCache();\n };\n /**\n * @param {?} entry\n * @return {?}\n */\n CompileMetadataResolver.prototype.getAnimationEntryMetadata = function (entry) {\n var _this = this;\n var /** @type {?} */ defs = entry.definitions.map(function (def) { return _this._getAnimationStateMetadata(def); });\n return new CompileAnimationEntryMetadata(entry.name, defs);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n CompileMetadataResolver.prototype._getAnimationStateMetadata = function (value) {\n if (value instanceof _angular_core.AnimationStateDeclarationMetadata) {\n var /** @type {?} */ styles = this._getAnimationStyleMetadata(value.styles);\n return new CompileAnimationStateDeclarationMetadata(value.stateNameExpr, styles);\n }\n if (value instanceof _angular_core.AnimationStateTransitionMetadata) {\n return new CompileAnimationStateTransitionMetadata(value.stateChangeExpr, this._getAnimationMetadata(value.steps));\n }\n return null;\n };\n /**\n * @param {?} value\n * @return {?}\n */\n CompileMetadataResolver.prototype._getAnimationStyleMetadata = function (value) {\n return new CompileAnimationStyleMetadata(value.offset, value.styles);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n CompileMetadataResolver.prototype._getAnimationMetadata = function (value) {\n var _this = this;\n if (value instanceof _angular_core.AnimationStyleMetadata) {\n return this._getAnimationStyleMetadata(value);\n }\n if (value instanceof _angular_core.AnimationKeyframesSequenceMetadata) {\n return new CompileAnimationKeyframesSequenceMetadata(value.steps.map(function (entry) { return _this._getAnimationStyleMetadata(entry); }));\n }\n if (value instanceof _angular_core.AnimationAnimateMetadata) {\n var /** @type {?} */ animateData = (this\n ._getAnimationMetadata(value.styles));\n return new CompileAnimationAnimateMetadata(value.timings, animateData);\n }\n if (value instanceof _angular_core.AnimationWithStepsMetadata) {\n var /** @type {?} */ steps = value.steps.map(function (step) { return _this._getAnimationMetadata(step); });\n if (value instanceof _angular_core.AnimationGroupMetadata) {\n return new CompileAnimationGroupMetadata(steps);\n }\n return new CompileAnimationSequenceMetadata(steps);\n }\n return null;\n };\n /**\n * @param {?} type\n * @param {?} kind\n * @return {?}\n */\n CompileMetadataResolver.prototype._loadSummary = function (type, kind) {\n var /** @type {?} */ typeSummary = this._summaryCache.get(type);\n if (!typeSummary) {\n var /** @type {?} */ summary = this._summaryResolver.resolveSummary(type);\n typeSummary = summary ? summary.type : null;\n this._summaryCache.set(type, typeSummary);\n }\n return typeSummary && typeSummary.summaryKind === kind ? typeSummary : null;\n };\n /**\n * @param {?} directiveType\n * @param {?} isSync\n * @return {?}\n */\n CompileMetadataResolver.prototype._loadDirectiveMetadata = function (directiveType, isSync) {\n var _this = this;\n if (this._directiveCache.has(directiveType)) {\n return;\n }\n directiveType = _angular_core.resolveForwardRef(directiveType);\n var _a = this.getNonNormalizedDirectiveMetadata(directiveType), annotation = _a.annotation, metadata = _a.metadata;\n var /** @type {?} */ createDirectiveMetadata = function (templateMetadata) {\n var /** @type {?} */ normalizedDirMeta = new CompileDirectiveMetadata({\n type: metadata.type,\n isComponent: metadata.isComponent,\n selector: metadata.selector,\n exportAs: metadata.exportAs,\n changeDetection: metadata.changeDetection,\n inputs: metadata.inputs,\n outputs: metadata.outputs,\n hostListeners: metadata.hostListeners,\n hostProperties: metadata.hostProperties,\n hostAttributes: metadata.hostAttributes,\n providers: metadata.providers,\n viewProviders: metadata.viewProviders,\n queries: metadata.queries,\n viewQueries: metadata.viewQueries,\n entryComponents: metadata.entryComponents,\n template: templateMetadata\n });\n _this._directiveCache.set(directiveType, normalizedDirMeta);\n _this._summaryCache.set(directiveType, normalizedDirMeta.toSummary());\n return normalizedDirMeta;\n };\n if (metadata.isComponent) {\n var /** @type {?} */ templateMeta = this._directiveNormalizer.normalizeTemplate({\n componentType: directiveType,\n moduleUrl: componentModuleUrl(this._reflector, directiveType, annotation),\n encapsulation: metadata.template.encapsulation,\n template: metadata.template.template,\n templateUrl: metadata.template.templateUrl,\n styles: metadata.template.styles,\n styleUrls: metadata.template.styleUrls,\n animations: metadata.template.animations,\n interpolation: metadata.template.interpolation\n });\n if (templateMeta.syncResult) {\n createDirectiveMetadata(templateMeta.syncResult);\n return null;\n }\n else {\n if (isSync) {\n this._reportError(new ComponentStillLoadingError(directiveType), directiveType);\n return null;\n }\n return templateMeta.asyncResult.then(createDirectiveMetadata);\n }\n }\n else {\n // directive\n createDirectiveMetadata(null);\n return null;\n }\n };\n /**\n * @param {?} directiveType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getNonNormalizedDirectiveMetadata = function (directiveType) {\n var _this = this;\n directiveType = _angular_core.resolveForwardRef(directiveType);\n var /** @type {?} */ dirMeta = this._directiveResolver.resolve(directiveType);\n if (!dirMeta) {\n return null;\n }\n var /** @type {?} */ nonNormalizedTemplateMetadata;\n if (dirMeta instanceof _angular_core.Component) {\n // component\n assertArrayOfStrings('styles', dirMeta.styles);\n assertArrayOfStrings('styleUrls', dirMeta.styleUrls);\n assertInterpolationSymbols('interpolation', dirMeta.interpolation);\n var /** @type {?} */ animations = dirMeta.animations ?\n dirMeta.animations.map(function (e) { return _this.getAnimationEntryMetadata(e); }) :\n null;\n nonNormalizedTemplateMetadata = new CompileTemplateMetadata({\n encapsulation: dirMeta.encapsulation,\n template: dirMeta.template,\n templateUrl: dirMeta.templateUrl,\n styles: dirMeta.styles,\n styleUrls: dirMeta.styleUrls,\n animations: animations,\n interpolation: dirMeta.interpolation\n });\n }\n var /** @type {?} */ changeDetectionStrategy = null;\n var /** @type {?} */ viewProviders = [];\n var /** @type {?} */ entryComponentMetadata = [];\n var /** @type {?} */ selector = dirMeta.selector;\n if (dirMeta instanceof _angular_core.Component) {\n // Component\n changeDetectionStrategy = dirMeta.changeDetection;\n if (dirMeta.viewProviders) {\n viewProviders = this._getProvidersMetadata(dirMeta.viewProviders, entryComponentMetadata, \"viewProviders for \\\"\" + stringifyType(directiveType) + \"\\\"\", [], directiveType);\n }\n if (dirMeta.entryComponents) {\n entryComponentMetadata = flattenAndDedupeArray(dirMeta.entryComponents)\n .map(function (type) { return _this._getIdentifierMetadata(type); })\n .concat(entryComponentMetadata);\n }\n if (!selector) {\n selector = this._schemaRegistry.getDefaultComponentElementName();\n }\n }\n else {\n // Directive\n if (!selector) {\n this._reportError(new SyntaxError(\"Directive \" + stringifyType(directiveType) + \" has no selector, please add it!\"), directiveType);\n selector = 'error';\n }\n }\n var /** @type {?} */ providers = [];\n if (isPresent(dirMeta.providers)) {\n providers = this._getProvidersMetadata(dirMeta.providers, entryComponentMetadata, \"providers for \\\"\" + stringifyType(directiveType) + \"\\\"\", [], directiveType);\n }\n var /** @type {?} */ queries = [];\n var /** @type {?} */ viewQueries = [];\n if (isPresent(dirMeta.queries)) {\n queries = this._getQueriesMetadata(dirMeta.queries, false, directiveType);\n viewQueries = this._getQueriesMetadata(dirMeta.queries, true, directiveType);\n }\n var /** @type {?} */ metadata = CompileDirectiveMetadata.create({\n selector: selector,\n exportAs: dirMeta.exportAs,\n isComponent: !!nonNormalizedTemplateMetadata,\n type: this._getTypeMetadata(directiveType),\n template: nonNormalizedTemplateMetadata,\n changeDetection: changeDetectionStrategy,\n inputs: dirMeta.inputs,\n outputs: dirMeta.outputs,\n host: dirMeta.host,\n providers: providers,\n viewProviders: viewProviders,\n queries: queries,\n viewQueries: viewQueries,\n entryComponents: entryComponentMetadata\n });\n return { metadata: metadata, annotation: dirMeta };\n };\n /**\n * Gets the metadata for the given directive.\n * This assumes `loadNgModuleMetadata` has been called first.\n * @param {?} directiveType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getDirectiveMetadata = function (directiveType) {\n var /** @type {?} */ dirMeta = this._directiveCache.get(directiveType);\n if (!dirMeta) {\n this._reportError(new SyntaxError(\"Illegal state: getDirectiveMetadata can only be called after loadNgModuleMetadata for a module that declares it. Directive \" + stringifyType(directiveType) + \".\"), directiveType);\n }\n return dirMeta;\n };\n /**\n * @param {?} dirType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getDirectiveSummary = function (dirType) {\n var /** @type {?} */ dirSummary = (this._loadSummary(dirType, CompileSummaryKind.Directive));\n if (!dirSummary) {\n this._reportError(new SyntaxError(\"Illegal state: Could not load the summary for directive \" + stringifyType(dirType) + \".\"), dirType);\n }\n return dirSummary;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype.isDirective = function (type) { return this._directiveResolver.isDirective(type); };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype.isPipe = function (type) { return this._pipeResolver.isPipe(type); };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getNgModuleSummary = function (moduleType) {\n var /** @type {?} */ moduleSummary = (this._loadSummary(moduleType, CompileSummaryKind.NgModule));\n if (!moduleSummary) {\n var /** @type {?} */ moduleMeta = this.getNgModuleMetadata(moduleType, false);\n moduleSummary = moduleMeta ? moduleMeta.toSummary() : null;\n if (moduleSummary) {\n this._summaryCache.set(moduleType, moduleSummary);\n }\n }\n return moduleSummary;\n };\n /**\n * Loads the declared directives and pipes of an NgModule.\n * @param {?} moduleType\n * @param {?} isSync\n * @param {?=} throwIfNotFound\n * @return {?}\n */\n CompileMetadataResolver.prototype.loadNgModuleDirectiveAndPipeMetadata = function (moduleType, isSync, throwIfNotFound) {\n var _this = this;\n if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n var /** @type {?} */ ngModule = this.getNgModuleMetadata(moduleType, throwIfNotFound);\n var /** @type {?} */ loading = [];\n if (ngModule) {\n ngModule.declaredDirectives.forEach(function (id) {\n var /** @type {?} */ promise = _this._loadDirectiveMetadata(id.reference, isSync);\n if (promise) {\n loading.push(promise);\n }\n });\n ngModule.declaredPipes.forEach(function (id) { return _this._loadPipeMetadata(id.reference); });\n }\n return Promise.all(loading);\n };\n /**\n * @param {?} moduleType\n * @param {?=} throwIfNotFound\n * @return {?}\n */\n CompileMetadataResolver.prototype.getNgModuleMetadata = function (moduleType, throwIfNotFound) {\n var _this = this;\n if (throwIfNotFound === void 0) { throwIfNotFound = true; }\n moduleType = _angular_core.resolveForwardRef(moduleType);\n var /** @type {?} */ compileMeta = this._ngModuleCache.get(moduleType);\n if (compileMeta) {\n return compileMeta;\n }\n var /** @type {?} */ meta = this._ngModuleResolver.resolve(moduleType, throwIfNotFound);\n if (!meta) {\n return null;\n }\n var /** @type {?} */ declaredDirectives = [];\n var /** @type {?} */ exportedNonModuleIdentifiers = [];\n var /** @type {?} */ declaredPipes = [];\n var /** @type {?} */ importedModules = [];\n var /** @type {?} */ exportedModules = [];\n var /** @type {?} */ providers = [];\n var /** @type {?} */ entryComponents = [];\n var /** @type {?} */ bootstrapComponents = [];\n var /** @type {?} */ schemas = [];\n if (meta.imports) {\n flattenAndDedupeArray(meta.imports).forEach(function (importedType) {\n var /** @type {?} */ importedModuleType;\n if (isValidType(importedType)) {\n importedModuleType = importedType;\n }\n else if (importedType && importedType.ngModule) {\n var /** @type {?} */ moduleWithProviders = importedType;\n importedModuleType = moduleWithProviders.ngModule;\n if (moduleWithProviders.providers) {\n providers.push.apply(providers, _this._getProvidersMetadata(moduleWithProviders.providers, entryComponents, \"provider for the NgModule '\" + stringifyType(importedModuleType) + \"'\", [], importedType));\n }\n }\n if (importedModuleType) {\n var /** @type {?} */ importedModuleSummary = _this.getNgModuleSummary(importedModuleType);\n if (!importedModuleSummary) {\n _this._reportError(new SyntaxError(\"Unexpected \" + _this._getTypeDescriptor(importedType) + \" '\" + stringifyType(importedType) + \"' imported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n importedModules.push(importedModuleSummary);\n }\n else {\n _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(importedType) + \"' imported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n });\n }\n if (meta.exports) {\n flattenAndDedupeArray(meta.exports).forEach(function (exportedType) {\n if (!isValidType(exportedType)) {\n _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(exportedType) + \"' exported by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n var /** @type {?} */ exportedModuleSummary = _this.getNgModuleSummary(exportedType);\n if (exportedModuleSummary) {\n exportedModules.push(exportedModuleSummary);\n }\n else {\n exportedNonModuleIdentifiers.push(_this._getIdentifierMetadata(exportedType));\n }\n });\n }\n // Note: This will be modified later, so we rely on\n // getting a new instance every time!\n var /** @type {?} */ transitiveModule = this._getTransitiveNgModuleMetadata(importedModules, exportedModules);\n if (meta.declarations) {\n flattenAndDedupeArray(meta.declarations).forEach(function (declaredType) {\n if (!isValidType(declaredType)) {\n _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(declaredType) + \"' declared by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n var /** @type {?} */ declaredIdentifier = _this._getIdentifierMetadata(declaredType);\n if (_this._directiveResolver.isDirective(declaredType)) {\n transitiveModule.addDirective(declaredIdentifier);\n declaredDirectives.push(declaredIdentifier);\n _this._addTypeToModule(declaredType, moduleType);\n }\n else if (_this._pipeResolver.isPipe(declaredType)) {\n transitiveModule.addPipe(declaredIdentifier);\n transitiveModule.pipes.push(declaredIdentifier);\n declaredPipes.push(declaredIdentifier);\n _this._addTypeToModule(declaredType, moduleType);\n }\n else {\n _this._reportError(new SyntaxError(\"Unexpected \" + _this._getTypeDescriptor(declaredType) + \" '\" + stringifyType(declaredType) + \"' declared by the module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n });\n }\n var /** @type {?} */ exportedDirectives = [];\n var /** @type {?} */ exportedPipes = [];\n exportedNonModuleIdentifiers.forEach(function (exportedId) {\n if (transitiveModule.directivesSet.has(exportedId.reference)) {\n exportedDirectives.push(exportedId);\n transitiveModule.addExportedDirective(exportedId);\n }\n else if (transitiveModule.pipesSet.has(exportedId.reference)) {\n exportedPipes.push(exportedId);\n transitiveModule.addExportedPipe(exportedId);\n }\n else {\n _this._reportError(new SyntaxError(\"Can't export \" + _this._getTypeDescriptor(exportedId.reference) + \" \" + stringifyType(exportedId.reference) + \" from \" + stringifyType(moduleType) + \" as it was neither declared nor imported!\"), moduleType);\n }\n });\n // The providers of the module have to go last\n // so that they overwrite any other provider we already added.\n if (meta.providers) {\n providers.push.apply(providers, this._getProvidersMetadata(meta.providers, entryComponents, \"provider for the NgModule '\" + stringifyType(moduleType) + \"'\", [], moduleType));\n }\n if (meta.entryComponents) {\n entryComponents.push.apply(entryComponents, flattenAndDedupeArray(meta.entryComponents)\n .map(function (type) { return _this._getIdentifierMetadata(type); }));\n }\n if (meta.bootstrap) {\n flattenAndDedupeArray(meta.bootstrap).forEach(function (type) {\n if (!isValidType(type)) {\n _this._reportError(new SyntaxError(\"Unexpected value '\" + stringifyType(type) + \"' used in the bootstrap property of module '\" + stringifyType(moduleType) + \"'\"), moduleType);\n return;\n }\n bootstrapComponents.push(_this._getIdentifierMetadata(type));\n });\n }\n entryComponents.push.apply(entryComponents, bootstrapComponents);\n if (meta.schemas) {\n schemas.push.apply(schemas, flattenAndDedupeArray(meta.schemas));\n }\n compileMeta = new CompileNgModuleMetadata({\n type: this._getTypeMetadata(moduleType),\n providers: providers,\n entryComponents: entryComponents,\n bootstrapComponents: bootstrapComponents,\n schemas: schemas,\n declaredDirectives: declaredDirectives,\n exportedDirectives: exportedDirectives,\n declaredPipes: declaredPipes,\n exportedPipes: exportedPipes,\n importedModules: importedModules,\n exportedModules: exportedModules,\n transitiveModule: transitiveModule,\n id: meta.id,\n });\n entryComponents.forEach(function (id) { return transitiveModule.addEntryComponent(id); });\n providers.forEach(function (provider) { return transitiveModule.addProvider(provider, compileMeta.type); });\n transitiveModule.addModule(compileMeta.type);\n this._ngModuleCache.set(moduleType, compileMeta);\n return compileMeta;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype._getTypeDescriptor = function (type) {\n if (this._directiveResolver.isDirective(type)) {\n return 'directive';\n }\n if (this._pipeResolver.isPipe(type)) {\n return 'pipe';\n }\n if (this._ngModuleResolver.isNgModule(type)) {\n return 'module';\n }\n if (((type)).provide) {\n return 'provider';\n }\n return 'value';\n };\n /**\n * @param {?} type\n * @param {?} moduleType\n * @return {?}\n */\n CompileMetadataResolver.prototype._addTypeToModule = function (type, moduleType) {\n var /** @type {?} */ oldModule = this._ngModuleOfTypes.get(type);\n if (oldModule && oldModule !== moduleType) {\n this._reportError(new SyntaxError((\"Type \" + stringifyType(type) + \" is part of the declarations of 2 modules: \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \"! \") +\n (\"Please consider moving \" + stringifyType(type) + \" to a higher module that imports \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \". \") +\n (\"You can also create a new NgModule that exports and includes \" + stringifyType(type) + \" then import that NgModule in \" + stringifyType(oldModule) + \" and \" + stringifyType(moduleType) + \".\")), moduleType);\n }\n this._ngModuleOfTypes.set(type, moduleType);\n };\n /**\n * @param {?} importedModules\n * @param {?} exportedModules\n * @return {?}\n */\n CompileMetadataResolver.prototype._getTransitiveNgModuleMetadata = function (importedModules, exportedModules) {\n // collect `providers` / `entryComponents` from all imported and all exported modules\n var /** @type {?} */ result = new TransitiveCompileNgModuleMetadata();\n var /** @type {?} */ modulesByToken = new Map();\n importedModules.concat(exportedModules).forEach(function (modSummary) {\n modSummary.modules.forEach(function (mod) { return result.addModule(mod); });\n modSummary.entryComponents.forEach(function (comp) { return result.addEntryComponent(comp); });\n var /** @type {?} */ addedTokens = new Set();\n modSummary.providers.forEach(function (entry) {\n var /** @type {?} */ tokenRef = tokenReference(entry.provider.token);\n var /** @type {?} */ prevModules = modulesByToken.get(tokenRef);\n if (!prevModules) {\n prevModules = new Set();\n modulesByToken.set(tokenRef, prevModules);\n }\n var /** @type {?} */ moduleRef = entry.module.reference;\n // Note: the providers of one module may still contain multiple providers\n // per token (e.g. for multi providers), and we need to preserve these.\n if (addedTokens.has(tokenRef) || !prevModules.has(moduleRef)) {\n prevModules.add(moduleRef);\n addedTokens.add(tokenRef);\n result.addProvider(entry.provider, entry.module);\n }\n });\n });\n exportedModules.forEach(function (modSummary) {\n modSummary.exportedDirectives.forEach(function (id) { return result.addExportedDirective(id); });\n modSummary.exportedPipes.forEach(function (id) { return result.addExportedPipe(id); });\n });\n importedModules.forEach(function (modSummary) {\n modSummary.exportedDirectives.forEach(function (id) { return result.addDirective(id); });\n modSummary.exportedPipes.forEach(function (id) { return result.addPipe(id); });\n });\n return result;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype._getIdentifierMetadata = function (type) {\n type = _angular_core.resolveForwardRef(type);\n return { reference: type };\n };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype.isInjectable = function (type) {\n var /** @type {?} */ annotations = this._reflector.annotations(type);\n // Note: We need an exact check here as @Component / @Directive / ... inherit\n // from @CompilerInjectable!\n return annotations.some(function (ann) { return ann.constructor === _angular_core.Injectable; });\n };\n /**\n * @param {?} type\n * @return {?}\n */\n CompileMetadataResolver.prototype.getInjectableSummary = function (type) {\n return { summaryKind: CompileSummaryKind.Injectable, type: this._getTypeMetadata(type) };\n };\n /**\n * @param {?} type\n * @param {?=} dependencies\n * @return {?}\n */\n CompileMetadataResolver.prototype._getInjectableMetadata = function (type, dependencies) {\n if (dependencies === void 0) { dependencies = null; }\n var /** @type {?} */ typeSummary = this._loadSummary(type, CompileSummaryKind.Injectable);\n if (typeSummary) {\n return typeSummary.type;\n }\n return this._getTypeMetadata(type, dependencies);\n };\n /**\n * @param {?} type\n * @param {?=} dependencies\n * @return {?}\n */\n CompileMetadataResolver.prototype._getTypeMetadata = function (type, dependencies) {\n if (dependencies === void 0) { dependencies = null; }\n var /** @type {?} */ identifier = this._getIdentifierMetadata(type);\n return {\n reference: identifier.reference,\n diDeps: this._getDependenciesMetadata(identifier.reference, dependencies),\n lifecycleHooks: LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return hasLifecycleHook(hook, identifier.reference); }),\n };\n };\n /**\n * @param {?} factory\n * @param {?=} dependencies\n * @return {?}\n */\n CompileMetadataResolver.prototype._getFactoryMetadata = function (factory, dependencies) {\n if (dependencies === void 0) { dependencies = null; }\n factory = _angular_core.resolveForwardRef(factory);\n return { reference: factory, diDeps: this._getDependenciesMetadata(factory, dependencies) };\n };\n /**\n * Gets the metadata for the given pipe.\n * This assumes `loadNgModuleMetadata` has been called first.\n * @param {?} pipeType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getPipeMetadata = function (pipeType) {\n var /** @type {?} */ pipeMeta = this._pipeCache.get(pipeType);\n if (!pipeMeta) {\n this._reportError(new SyntaxError(\"Illegal state: getPipeMetadata can only be called after loadNgModuleMetadata for a module that declares it. Pipe \" + stringifyType(pipeType) + \".\"), pipeType);\n }\n return pipeMeta;\n };\n /**\n * @param {?} pipeType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getPipeSummary = function (pipeType) {\n var /** @type {?} */ pipeSummary = (this._loadSummary(pipeType, CompileSummaryKind.Pipe));\n if (!pipeSummary) {\n this._reportError(new SyntaxError(\"Illegal state: Could not load the summary for pipe \" + stringifyType(pipeType) + \".\"), pipeType);\n }\n return pipeSummary;\n };\n /**\n * @param {?} pipeType\n * @return {?}\n */\n CompileMetadataResolver.prototype.getOrLoadPipeMetadata = function (pipeType) {\n var /** @type {?} */ pipeMeta = this._pipeCache.get(pipeType);\n if (!pipeMeta) {\n pipeMeta = this._loadPipeMetadata(pipeType);\n }\n return pipeMeta;\n };\n /**\n * @param {?} pipeType\n * @return {?}\n */\n CompileMetadataResolver.prototype._loadPipeMetadata = function (pipeType) {\n pipeType = _angular_core.resolveForwardRef(pipeType);\n var /** @type {?} */ pipeAnnotation = this._pipeResolver.resolve(pipeType);\n var /** @type {?} */ pipeMeta = new CompilePipeMetadata({\n type: this._getTypeMetadata(pipeType),\n name: pipeAnnotation.name,\n pure: pipeAnnotation.pure\n });\n this._pipeCache.set(pipeType, pipeMeta);\n this._summaryCache.set(pipeType, pipeMeta.toSummary());\n return pipeMeta;\n };\n /**\n * @param {?} typeOrFunc\n * @param {?} dependencies\n * @return {?}\n */\n CompileMetadataResolver.prototype._getDependenciesMetadata = function (typeOrFunc, dependencies) {\n var _this = this;\n var /** @type {?} */ hasUnknownDeps = false;\n var /** @type {?} */ params = dependencies || this._reflector.parameters(typeOrFunc) || [];\n var /** @type {?} */ dependenciesMetadata = params.map(function (param) {\n var /** @type {?} */ isAttribute = false;\n var /** @type {?} */ isHost = false;\n var /** @type {?} */ isSelf = false;\n var /** @type {?} */ isSkipSelf = false;\n var /** @type {?} */ isOptional = false;\n var /** @type {?} */ token = null;\n if (Array.isArray(param)) {\n param.forEach(function (paramEntry) {\n if (paramEntry instanceof _angular_core.Host) {\n isHost = true;\n }\n else if (paramEntry instanceof _angular_core.Self) {\n isSelf = true;\n }\n else if (paramEntry instanceof _angular_core.SkipSelf) {\n isSkipSelf = true;\n }\n else if (paramEntry instanceof _angular_core.Optional) {\n isOptional = true;\n }\n else if (paramEntry instanceof _angular_core.Attribute) {\n isAttribute = true;\n token = paramEntry.attributeName;\n }\n else if (paramEntry instanceof _angular_core.Inject) {\n token = paramEntry.token;\n }\n else if (isValidType(paramEntry) && isBlank(token)) {\n token = paramEntry;\n }\n });\n }\n else {\n token = param;\n }\n if (isBlank(token)) {\n hasUnknownDeps = true;\n return null;\n }\n return {\n isAttribute: isAttribute,\n isHost: isHost,\n isSelf: isSelf,\n isSkipSelf: isSkipSelf,\n isOptional: isOptional,\n token: _this._getTokenMetadata(token)\n };\n });\n if (hasUnknownDeps) {\n var /** @type {?} */ depsTokens = dependenciesMetadata.map(function (dep) { return dep ? stringifyType(dep.token) : '?'; }).join(', ');\n this._reportError(new SyntaxError(\"Can't resolve all parameters for \" + stringifyType(typeOrFunc) + \": (\" + depsTokens + \").\"), typeOrFunc);\n }\n return dependenciesMetadata;\n };\n /**\n * @param {?} token\n * @return {?}\n */\n CompileMetadataResolver.prototype._getTokenMetadata = function (token) {\n token = _angular_core.resolveForwardRef(token);\n var /** @type {?} */ compileToken;\n if (typeof token === 'string') {\n compileToken = { value: token };\n }\n else {\n compileToken = { identifier: { reference: token } };\n }\n return compileToken;\n };\n /**\n * @param {?} providers\n * @param {?} targetEntryComponents\n * @param {?=} debugInfo\n * @param {?=} compileProviders\n * @param {?=} type\n * @return {?}\n */\n CompileMetadataResolver.prototype._getProvidersMetadata = function (providers, targetEntryComponents, debugInfo, compileProviders, type) {\n var _this = this;\n if (compileProviders === void 0) { compileProviders = []; }\n providers.forEach(function (provider, providerIdx) {\n if (Array.isArray(provider)) {\n _this._getProvidersMetadata(provider, targetEntryComponents, debugInfo, compileProviders);\n }\n else {\n provider = _angular_core.resolveForwardRef(provider);\n var /** @type {?} */ providerMeta = void 0;\n if (provider && typeof provider == 'object' && provider.hasOwnProperty('provide')) {\n providerMeta = new ProviderMeta(provider.provide, provider);\n }\n else if (isValidType(provider)) {\n providerMeta = new ProviderMeta(provider, { useClass: provider });\n }\n else {\n var /** @type {?} */ providersInfo = ((providers.reduce(function (soFar, seenProvider, seenProviderIdx) {\n if (seenProviderIdx < providerIdx) {\n soFar.push(\"\" + stringifyType(seenProvider));\n }\n else if (seenProviderIdx == providerIdx) {\n soFar.push(\"?\" + stringifyType(seenProvider) + \"?\");\n }\n else if (seenProviderIdx == providerIdx + 1) {\n soFar.push('...');\n }\n return soFar;\n }, [])))\n .join(', ');\n _this._reportError(new SyntaxError(\"Invalid \" + (debugInfo ? debugInfo : 'provider') + \" - only instances of Provider and Type are allowed, got: [\" + providersInfo + \"]\"), type);\n }\n if (providerMeta.token === resolveIdentifier(Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS)) {\n targetEntryComponents.push.apply(targetEntryComponents, _this._getEntryComponentsFromProvider(providerMeta, type));\n }\n else {\n compileProviders.push(_this.getProviderMetadata(providerMeta));\n }\n }\n });\n return compileProviders;\n };\n /**\n * @param {?} provider\n * @param {?=} type\n * @return {?}\n */\n CompileMetadataResolver.prototype._getEntryComponentsFromProvider = function (provider, type) {\n var _this = this;\n var /** @type {?} */ components = [];\n var /** @type {?} */ collectedIdentifiers = [];\n if (provider.useFactory || provider.useExisting || provider.useClass) {\n this._reportError(new SyntaxError(\"The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!\"), type);\n return [];\n }\n if (!provider.multi) {\n this._reportError(new SyntaxError(\"The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!\"), type);\n return [];\n }\n extractIdentifiers(provider.useValue, collectedIdentifiers);\n collectedIdentifiers.forEach(function (identifier) {\n if (_this._directiveResolver.isDirective(identifier.reference) ||\n _this._loadSummary(identifier.reference, CompileSummaryKind.Directive)) {\n components.push(identifier);\n }\n });\n return components;\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n CompileMetadataResolver.prototype.getProviderMetadata = function (provider) {\n var /** @type {?} */ compileDeps;\n var /** @type {?} */ compileTypeMetadata = null;\n var /** @type {?} */ compileFactoryMetadata = null;\n var /** @type {?} */ token = this._getTokenMetadata(provider.token);\n if (provider.useClass) {\n compileTypeMetadata = this._getInjectableMetadata(provider.useClass, provider.dependencies);\n compileDeps = compileTypeMetadata.diDeps;\n if (provider.token === provider.useClass) {\n // use the compileTypeMetadata as it contains information about lifecycleHooks...\n token = { identifier: compileTypeMetadata };\n }\n }\n else if (provider.useFactory) {\n compileFactoryMetadata = this._getFactoryMetadata(provider.useFactory, provider.dependencies);\n compileDeps = compileFactoryMetadata.diDeps;\n }\n return {\n token: token,\n useClass: compileTypeMetadata,\n useValue: provider.useValue,\n useFactory: compileFactoryMetadata,\n useExisting: provider.useExisting ? this._getTokenMetadata(provider.useExisting) : null,\n deps: compileDeps,\n multi: provider.multi\n };\n };\n /**\n * @param {?} queries\n * @param {?} isViewQuery\n * @param {?} directiveType\n * @return {?}\n */\n CompileMetadataResolver.prototype._getQueriesMetadata = function (queries, isViewQuery, directiveType) {\n var _this = this;\n var /** @type {?} */ res = [];\n Object.keys(queries).forEach(function (propertyName) {\n var /** @type {?} */ query = queries[propertyName];\n if (query.isViewQuery === isViewQuery) {\n res.push(_this._getQueryMetadata(query, propertyName, directiveType));\n }\n });\n return res;\n };\n /**\n * @param {?} selector\n * @return {?}\n */\n CompileMetadataResolver.prototype._queryVarBindings = function (selector) { return selector.split(/\\s*,\\s*/); };\n /**\n * @param {?} q\n * @param {?} propertyName\n * @param {?} typeOrFunc\n * @return {?}\n */\n CompileMetadataResolver.prototype._getQueryMetadata = function (q, propertyName, typeOrFunc) {\n var _this = this;\n var /** @type {?} */ selectors;\n if (typeof q.selector === 'string') {\n selectors =\n this._queryVarBindings(q.selector).map(function (varName) { return _this._getTokenMetadata(varName); });\n }\n else {\n if (!q.selector) {\n this._reportError(new SyntaxError(\"Can't construct a query for the property \\\"\" + propertyName + \"\\\" of \\\"\" + stringifyType(typeOrFunc) + \"\\\" since the query selector wasn't defined.\"), typeOrFunc);\n }\n selectors = [this._getTokenMetadata(q.selector)];\n }\n return {\n selectors: selectors,\n first: q.first,\n descendants: q.descendants, propertyName: propertyName,\n read: q.read ? this._getTokenMetadata(q.read) : null\n };\n };\n /**\n * @param {?} error\n * @param {?=} type\n * @param {?=} otherType\n * @return {?}\n */\n CompileMetadataResolver.prototype._reportError = function (error, type, otherType) {\n if (this._errorCollector) {\n this._errorCollector(error, type);\n if (otherType) {\n this._errorCollector(error, otherType);\n }\n }\n else {\n throw error;\n }\n };\n /** @nocollapse */\n CompileMetadataResolver.ctorParameters = function () { return [\n { type: NgModuleResolver, },\n { type: DirectiveResolver, },\n { type: PipeResolver, },\n { type: SummaryResolver, },\n { type: ElementSchemaRegistry, },\n { type: DirectiveNormalizer, },\n { type: ReflectorReader, },\n { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [ERROR_COLLECTOR_TOKEN,] },] },\n ]; };\n CompileMetadataResolver = __decorate$9([\n CompilerInjectable(), \n __metadata$9('design:paramtypes', [NgModuleResolver, DirectiveResolver, PipeResolver, SummaryResolver, ElementSchemaRegistry, DirectiveNormalizer, ReflectorReader, Function])\n ], CompileMetadataResolver);\n return CompileMetadataResolver;\n }());\n /**\n * @param {?} tree\n * @param {?=} out\n * @return {?}\n */\n function flattenArray(tree, out) {\n if (out === void 0) { out = []; }\n if (tree) {\n for (var /** @type {?} */ i = 0; i < tree.length; i++) {\n var /** @type {?} */ item = _angular_core.resolveForwardRef(tree[i]);\n if (Array.isArray(item)) {\n flattenArray(item, out);\n }\n else {\n out.push(item);\n }\n }\n }\n return out;\n }\n /**\n * @param {?} array\n * @return {?}\n */\n function dedupeArray(array) {\n if (array) {\n return Array.from(new Set(array));\n }\n return [];\n }\n /**\n * @param {?} tree\n * @return {?}\n */\n function flattenAndDedupeArray(tree) {\n return dedupeArray(flattenArray(tree));\n }\n /**\n * @param {?} value\n * @return {?}\n */\n function isValidType(value) {\n return (value instanceof StaticSymbol) || (value instanceof _angular_core.Type);\n }\n /**\n * @param {?} reflector\n * @param {?} type\n * @param {?} cmpMetadata\n * @return {?}\n */\n function componentModuleUrl(reflector, type, cmpMetadata) {\n if (type instanceof StaticSymbol) {\n return type.filePath;\n }\n var /** @type {?} */ moduleId = cmpMetadata.moduleId;\n if (typeof moduleId === 'string') {\n var /** @type {?} */ scheme = getUrlScheme(moduleId);\n return scheme ? moduleId : \"package:\" + moduleId + MODULE_SUFFIX;\n }\n else if (moduleId !== null && moduleId !== void 0) {\n throw new SyntaxError((\"moduleId should be a string in \\\"\" + stringifyType(type) + \"\\\". See https://goo.gl/wIDDiL for more information.\\n\") +\n \"If you're using Webpack you should inline the template and the styles, see https://goo.gl/X2J8zc.\");\n }\n return reflector.importUri(type);\n }\n /**\n * @param {?} value\n * @param {?} targetIdentifiers\n * @return {?}\n */\n function extractIdentifiers(value, targetIdentifiers) {\n visitValue(value, new _CompileValueConverter(), targetIdentifiers);\n }\n var _CompileValueConverter = (function (_super) {\n __extends$18(_CompileValueConverter, _super);\n function _CompileValueConverter() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} value\n * @param {?} targetIdentifiers\n * @return {?}\n */\n _CompileValueConverter.prototype.visitOther = function (value, targetIdentifiers) {\n targetIdentifiers.push({ reference: value });\n };\n return _CompileValueConverter;\n }(ValueTransformer));\n /**\n * @param {?} type\n * @return {?}\n */\n function stringifyType(type) {\n if (type instanceof StaticSymbol) {\n return type.name + \" in \" + type.filePath;\n }\n else {\n return stringify(type);\n }\n }\n\n var /** @type {?} */ QUOTED_KEYS = '$quoted$';\n /**\n * @param {?} value\n * @param {?=} type\n * @return {?}\n */\n function convertValueToOutputAst(value, type) {\n if (type === void 0) { type = null; }\n return visitValue(value, new _ValueOutputAstTransformer(), type);\n }\n var _ValueOutputAstTransformer = (function () {\n function _ValueOutputAstTransformer() {\n }\n /**\n * @param {?} arr\n * @param {?} type\n * @return {?}\n */\n _ValueOutputAstTransformer.prototype.visitArray = function (arr, type) {\n var _this = this;\n return literalArr(arr.map(function (value) { return visitValue(value, _this, null); }), type);\n };\n /**\n * @param {?} map\n * @param {?} type\n * @return {?}\n */\n _ValueOutputAstTransformer.prototype.visitStringMap = function (map, type) {\n var _this = this;\n var /** @type {?} */ entries = [];\n var /** @type {?} */ quotedSet = new Set(map && map[QUOTED_KEYS]);\n Object.keys(map).forEach(function (key) {\n entries.push(new LiteralMapEntry(key, visitValue(map[key], _this, null), quotedSet.has(key)));\n });\n return new LiteralMapExpr(entries, type);\n };\n /**\n * @param {?} value\n * @param {?} type\n * @return {?}\n */\n _ValueOutputAstTransformer.prototype.visitPrimitive = function (value, type) { return literal(value, type); };\n /**\n * @param {?} value\n * @param {?} type\n * @return {?}\n */\n _ValueOutputAstTransformer.prototype.visitOther = function (value, type) {\n if (value instanceof Expression) {\n return value;\n }\n else {\n return importExpr({ reference: value });\n }\n };\n return _ValueOutputAstTransformer;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$13 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$13 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var ComponentFactoryDependency = (function () {\n /**\n * @param {?} comp\n * @param {?} placeholder\n */\n function ComponentFactoryDependency(comp, placeholder) {\n this.comp = comp;\n this.placeholder = placeholder;\n }\n return ComponentFactoryDependency;\n }());\n var NgModuleCompileResult = (function () {\n /**\n * @param {?} statements\n * @param {?} ngModuleFactoryVar\n * @param {?} dependencies\n */\n function NgModuleCompileResult(statements, ngModuleFactoryVar, dependencies) {\n this.statements = statements;\n this.ngModuleFactoryVar = ngModuleFactoryVar;\n this.dependencies = dependencies;\n }\n return NgModuleCompileResult;\n }());\n var NgModuleCompiler = (function () {\n function NgModuleCompiler() {\n }\n /**\n * @param {?} ngModuleMeta\n * @param {?} extraProviders\n * @return {?}\n */\n NgModuleCompiler.prototype.compile = function (ngModuleMeta, extraProviders) {\n var /** @type {?} */ moduleUrl = identifierModuleUrl(ngModuleMeta.type);\n var /** @type {?} */ sourceFileName = isPresent(moduleUrl) ?\n \"in NgModule \" + identifierName(ngModuleMeta.type) + \" in \" + moduleUrl :\n \"in NgModule \" + identifierName(ngModuleMeta.type);\n var /** @type {?} */ sourceFile = new ParseSourceFile('', sourceFileName);\n var /** @type {?} */ sourceSpan = new ParseSourceSpan(new ParseLocation(sourceFile, null, null, null), new ParseLocation(sourceFile, null, null, null));\n var /** @type {?} */ deps = [];\n var /** @type {?} */ bootstrapComponentFactories = [];\n var /** @type {?} */ entryComponentFactories = ngModuleMeta.transitiveModule.entryComponents.map(function (entryComponent) {\n var /** @type {?} */ id = { reference: null };\n if (ngModuleMeta.bootstrapComponents.some(function (id) { return id.reference === entryComponent.reference; })) {\n bootstrapComponentFactories.push(id);\n }\n deps.push(new ComponentFactoryDependency(entryComponent, id));\n return id;\n });\n var /** @type {?} */ builder = new _InjectorBuilder(ngModuleMeta, entryComponentFactories, bootstrapComponentFactories, sourceSpan);\n var /** @type {?} */ providerParser = new NgModuleProviderAnalyzer(ngModuleMeta, extraProviders, sourceSpan);\n providerParser.parse().forEach(function (provider) { return builder.addProvider(provider); });\n var /** @type {?} */ injectorClass = builder.build();\n var /** @type {?} */ ngModuleFactoryVar = identifierName(ngModuleMeta.type) + \"NgFactory\";\n var /** @type {?} */ ngModuleFactoryStmt = variable(ngModuleFactoryVar)\n .set(importExpr(createIdentifier(Identifiers.NgModuleFactory))\n .instantiate([variable(injectorClass.name), importExpr(ngModuleMeta.type)], importType(createIdentifier(Identifiers.NgModuleFactory), [importType(ngModuleMeta.type)], [TypeModifier.Const])))\n .toDeclStmt(null, [StmtModifier.Final]);\n var /** @type {?} */ stmts = [injectorClass, ngModuleFactoryStmt];\n if (ngModuleMeta.id) {\n var /** @type {?} */ registerFactoryStmt = importExpr(createIdentifier(Identifiers.RegisterModuleFactoryFn))\n .callFn([literal(ngModuleMeta.id), variable(ngModuleFactoryVar)])\n .toStmt();\n stmts.push(registerFactoryStmt);\n }\n return new NgModuleCompileResult(stmts, ngModuleFactoryVar, deps);\n };\n NgModuleCompiler = __decorate$13([\n CompilerInjectable(), \n __metadata$13('design:paramtypes', [])\n ], NgModuleCompiler);\n return NgModuleCompiler;\n }());\n var _InjectorBuilder = (function () {\n /**\n * @param {?} _ngModuleMeta\n * @param {?} _entryComponentFactories\n * @param {?} _bootstrapComponentFactories\n * @param {?} _sourceSpan\n */\n function _InjectorBuilder(_ngModuleMeta, _entryComponentFactories, _bootstrapComponentFactories, _sourceSpan) {\n this._ngModuleMeta = _ngModuleMeta;\n this._entryComponentFactories = _entryComponentFactories;\n this._bootstrapComponentFactories = _bootstrapComponentFactories;\n this._sourceSpan = _sourceSpan;\n this.fields = [];\n this.getters = [];\n this.methods = [];\n this.ctorStmts = [];\n this._tokens = [];\n this._instances = new Map();\n this._createStmts = [];\n this._destroyStmts = [];\n }\n /**\n * @param {?} resolvedProvider\n * @return {?}\n */\n _InjectorBuilder.prototype.addProvider = function (resolvedProvider) {\n var _this = this;\n var /** @type {?} */ providerValueExpressions = resolvedProvider.providers.map(function (provider) { return _this._getProviderValue(provider); });\n var /** @type {?} */ propName = \"_\" + tokenName(resolvedProvider.token) + \"_\" + this._instances.size;\n var /** @type {?} */ instance = this._createProviderProperty(propName, resolvedProvider, providerValueExpressions, resolvedProvider.multiProvider, resolvedProvider.eager);\n if (resolvedProvider.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n this._destroyStmts.push(instance.callMethod('ngOnDestroy', []).toStmt());\n }\n this._tokens.push(resolvedProvider.token);\n this._instances.set(tokenReference(resolvedProvider.token), instance);\n };\n /**\n * @return {?}\n */\n _InjectorBuilder.prototype.build = function () {\n var _this = this;\n var /** @type {?} */ getMethodStmts = this._tokens.map(function (token) {\n var /** @type {?} */ providerExpr = _this._instances.get(tokenReference(token));\n return new IfStmt(InjectMethodVars.token.identical(createDiTokenExpression(token)), [new ReturnStatement(providerExpr)]);\n });\n var /** @type {?} */ methods = [\n new ClassMethod('createInternal', [], this._createStmts.concat(new ReturnStatement(this._instances.get(this._ngModuleMeta.type.reference))), importType(this._ngModuleMeta.type)),\n new ClassMethod('getInternal', [\n new FnParam(InjectMethodVars.token.name, DYNAMIC_TYPE),\n new FnParam(InjectMethodVars.notFoundResult.name, DYNAMIC_TYPE)\n ], getMethodStmts.concat([new ReturnStatement(InjectMethodVars.notFoundResult)]), DYNAMIC_TYPE),\n new ClassMethod('destroyInternal', [], this._destroyStmts),\n ];\n var /** @type {?} */ parentArgs = [\n variable(InjectorProps.parent.name),\n literalArr(this._entryComponentFactories.map(function (componentFactory) { return importExpr(componentFactory); })),\n literalArr(this._bootstrapComponentFactories.map(function (componentFactory) { return importExpr(componentFactory); }))\n ];\n var /** @type {?} */ injClassName = identifierName(this._ngModuleMeta.type) + \"Injector\";\n return createClassStmt({\n name: injClassName,\n ctorParams: [new FnParam(InjectorProps.parent.name, importType(createIdentifier(Identifiers.Injector)))],\n parent: importExpr(createIdentifier(Identifiers.NgModuleInjector), [importType(this._ngModuleMeta.type)]),\n parentArgs: parentArgs,\n builders: [{ methods: methods }, this]\n });\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n _InjectorBuilder.prototype._getProviderValue = function (provider) {\n var _this = this;\n var /** @type {?} */ result;\n if (isPresent(provider.useExisting)) {\n result = this._getDependency({ token: provider.useExisting });\n }\n else if (isPresent(provider.useFactory)) {\n var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(dep); });\n result = importExpr(provider.useFactory).callFn(depsExpr);\n }\n else if (isPresent(provider.useClass)) {\n var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(dep); });\n result =\n importExpr(provider.useClass).instantiate(depsExpr, importType(provider.useClass));\n }\n else {\n result = convertValueToOutputAst(provider.useValue);\n }\n return result;\n };\n /**\n * @param {?} propName\n * @param {?} provider\n * @param {?} providerValueExpressions\n * @param {?} isMulti\n * @param {?} isEager\n * @return {?}\n */\n _InjectorBuilder.prototype._createProviderProperty = function (propName, provider, providerValueExpressions, isMulti, isEager) {\n var /** @type {?} */ resolvedProviderValueExpr;\n var /** @type {?} */ type;\n if (isMulti) {\n resolvedProviderValueExpr = literalArr(providerValueExpressions);\n type = new ArrayType(DYNAMIC_TYPE);\n }\n else {\n resolvedProviderValueExpr = providerValueExpressions[0];\n type = providerValueExpressions[0].type;\n }\n if (!type) {\n type = DYNAMIC_TYPE;\n }\n if (isEager) {\n this.fields.push(new ClassField(propName, type));\n this._createStmts.push(THIS_EXPR.prop(propName).set(resolvedProviderValueExpr).toStmt());\n }\n else {\n var /** @type {?} */ internalField = \"_\" + propName;\n this.fields.push(new ClassField(internalField, type));\n // Note: Equals is important for JS so that it also checks the undefined case!\n var /** @type {?} */ getterStmts = [\n new IfStmt(THIS_EXPR.prop(internalField).isBlank(), [THIS_EXPR.prop(internalField).set(resolvedProviderValueExpr).toStmt()]),\n new ReturnStatement(THIS_EXPR.prop(internalField))\n ];\n this.getters.push(new ClassGetter(propName, getterStmts, type));\n }\n return THIS_EXPR.prop(propName);\n };\n /**\n * @param {?} dep\n * @return {?}\n */\n _InjectorBuilder.prototype._getDependency = function (dep) {\n var /** @type {?} */ result = null;\n if (dep.isValue) {\n result = literal(dep.value);\n }\n if (!dep.isSkipSelf) {\n if (dep.token &&\n (tokenReference(dep.token) === resolveIdentifier(Identifiers.Injector) ||\n tokenReference(dep.token) === resolveIdentifier(Identifiers.ComponentFactoryResolver))) {\n result = THIS_EXPR;\n }\n if (!result) {\n result = this._instances.get(tokenReference(dep.token));\n }\n }\n if (!result) {\n var /** @type {?} */ args = [createDiTokenExpression(dep.token)];\n if (dep.isOptional) {\n args.push(NULL_EXPR);\n }\n result = InjectorProps.parent.callMethod('get', args);\n }\n return result;\n };\n return _InjectorBuilder;\n }());\n var InjectorProps = (function () {\n function InjectorProps() {\n }\n InjectorProps.parent = THIS_EXPR.prop('parent');\n return InjectorProps;\n }());\n var InjectMethodVars = (function () {\n function InjectMethodVars() {\n }\n InjectMethodVars.token = variable('token');\n InjectMethodVars.notFoundResult = variable('notFoundResult');\n return InjectMethodVars;\n }());\n\n var /** @type {?} */ _SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\\\|\\n|\\r|\\$/g;\n var /** @type {?} */ _LEGAL_IDENTIFIER_RE = /^[$A-Z_][0-9A-Z_$]*$/i;\n var /** @type {?} */ CATCH_ERROR_VAR$1 = variable('error');\n var /** @type {?} */ CATCH_STACK_VAR$1 = variable('stack');\n var _EmittedLine = (function () {\n /**\n * @param {?} indent\n */\n function _EmittedLine(indent) {\n this.indent = indent;\n this.parts = [];\n }\n return _EmittedLine;\n }());\n var EmitterVisitorContext = (function () {\n /**\n * @param {?} _exportedVars\n * @param {?} _indent\n */\n function EmitterVisitorContext(_exportedVars, _indent) {\n this._exportedVars = _exportedVars;\n this._indent = _indent;\n this._classes = [];\n this._lines = [new _EmittedLine(_indent)];\n }\n /**\n * @param {?} exportedVars\n * @return {?}\n */\n EmitterVisitorContext.createRoot = function (exportedVars) {\n return new EmitterVisitorContext(exportedVars, 0);\n };\n Object.defineProperty(EmitterVisitorContext.prototype, \"_currentLine\", {\n /**\n * @return {?}\n */\n get: function () { return this._lines[this._lines.length - 1]; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} varName\n * @return {?}\n */\n EmitterVisitorContext.prototype.isExportedVar = function (varName) { return this._exportedVars.indexOf(varName) !== -1; };\n /**\n * @param {?=} lastPart\n * @return {?}\n */\n EmitterVisitorContext.prototype.println = function (lastPart) {\n if (lastPart === void 0) { lastPart = ''; }\n this.print(lastPart, true);\n };\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.lineIsEmpty = function () { return this._currentLine.parts.length === 0; };\n /**\n * @param {?} part\n * @param {?=} newLine\n * @return {?}\n */\n EmitterVisitorContext.prototype.print = function (part, newLine) {\n if (newLine === void 0) { newLine = false; }\n if (part.length > 0) {\n this._currentLine.parts.push(part);\n }\n if (newLine) {\n this._lines.push(new _EmittedLine(this._indent));\n }\n };\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.removeEmptyLastLine = function () {\n if (this.lineIsEmpty()) {\n this._lines.pop();\n }\n };\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.incIndent = function () {\n this._indent++;\n this._currentLine.indent = this._indent;\n };\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.decIndent = function () {\n this._indent--;\n this._currentLine.indent = this._indent;\n };\n /**\n * @param {?} clazz\n * @return {?}\n */\n EmitterVisitorContext.prototype.pushClass = function (clazz) { this._classes.push(clazz); };\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.popClass = function () { return this._classes.pop(); };\n Object.defineProperty(EmitterVisitorContext.prototype, \"currentClass\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._classes.length > 0 ? this._classes[this._classes.length - 1] : null;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n EmitterVisitorContext.prototype.toSource = function () {\n var /** @type {?} */ lines = this._lines;\n if (lines[lines.length - 1].parts.length === 0) {\n lines = lines.slice(0, lines.length - 1);\n }\n return lines\n .map(function (line) {\n if (line.parts.length > 0) {\n return _createIndent(line.indent) + line.parts.join('');\n }\n else {\n return '';\n }\n })\n .join('\\n');\n };\n return EmitterVisitorContext;\n }());\n /**\n * @abstract\n */\n var AbstractEmitterVisitor = (function () {\n /**\n * @param {?} _escapeDollarInStrings\n */\n function AbstractEmitterVisitor(_escapeDollarInStrings) {\n this._escapeDollarInStrings = _escapeDollarInStrings;\n }\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitExpressionStmt = function (stmt, ctx) {\n stmt.expr.visitExpression(this, ctx);\n ctx.println(';');\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitReturnStmt = function (stmt, ctx) {\n ctx.print(\"return \");\n stmt.value.visitExpression(this, ctx);\n ctx.println(';');\n return null;\n };\n /**\n * @abstract\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitCastExpr = function (ast, context) { };\n /**\n * @abstract\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) { };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitIfStmt = function (stmt, ctx) {\n ctx.print(\"if (\");\n stmt.condition.visitExpression(this, ctx);\n ctx.print(\") {\");\n var /** @type {?} */ hasElseCase = isPresent(stmt.falseCase) && stmt.falseCase.length > 0;\n if (stmt.trueCase.length <= 1 && !hasElseCase) {\n ctx.print(\" \");\n this.visitAllStatements(stmt.trueCase, ctx);\n ctx.removeEmptyLastLine();\n ctx.print(\" \");\n }\n else {\n ctx.println();\n ctx.incIndent();\n this.visitAllStatements(stmt.trueCase, ctx);\n ctx.decIndent();\n if (hasElseCase) {\n ctx.println(\"} else {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.falseCase, ctx);\n ctx.decIndent();\n }\n }\n ctx.println(\"}\");\n return null;\n };\n /**\n * @abstract\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) { };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitThrowStmt = function (stmt, ctx) {\n ctx.print(\"throw \");\n stmt.error.visitExpression(this, ctx);\n ctx.println(\";\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitCommentStmt = function (stmt, ctx) {\n var /** @type {?} */ lines = stmt.comment.split('\\n');\n lines.forEach(function (line) { ctx.println(\"// \" + line); });\n return null;\n };\n /**\n * @abstract\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) { };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitWriteVarExpr = function (expr, ctx) {\n var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n if (!lineWasEmpty) {\n ctx.print('(');\n }\n ctx.print(expr.name + \" = \");\n expr.value.visitExpression(this, ctx);\n if (!lineWasEmpty) {\n ctx.print(')');\n }\n return null;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitWriteKeyExpr = function (expr, ctx) {\n var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n if (!lineWasEmpty) {\n ctx.print('(');\n }\n expr.receiver.visitExpression(this, ctx);\n ctx.print(\"[\");\n expr.index.visitExpression(this, ctx);\n ctx.print(\"] = \");\n expr.value.visitExpression(this, ctx);\n if (!lineWasEmpty) {\n ctx.print(')');\n }\n return null;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitWritePropExpr = function (expr, ctx) {\n var /** @type {?} */ lineWasEmpty = ctx.lineIsEmpty();\n if (!lineWasEmpty) {\n ctx.print('(');\n }\n expr.receiver.visitExpression(this, ctx);\n ctx.print(\".\" + expr.name + \" = \");\n expr.value.visitExpression(this, ctx);\n if (!lineWasEmpty) {\n ctx.print(')');\n }\n return null;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitInvokeMethodExpr = function (expr, ctx) {\n expr.receiver.visitExpression(this, ctx);\n var /** @type {?} */ name = expr.name;\n if (isPresent(expr.builtin)) {\n name = this.getBuiltinMethodName(expr.builtin);\n if (isBlank(name)) {\n // some builtins just mean to skip the call.\n return null;\n }\n }\n ctx.print(\".\" + name + \"(\");\n this.visitAllExpressions(expr.args, ctx, \",\");\n ctx.print(\")\");\n return null;\n };\n /**\n * @abstract\n * @param {?} method\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.getBuiltinMethodName = function (method) { };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {\n expr.fn.visitExpression(this, ctx);\n ctx.print(\"(\");\n this.visitAllExpressions(expr.args, ctx, ',');\n ctx.print(\")\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {\n var /** @type {?} */ varName = ast.name;\n if (isPresent(ast.builtin)) {\n switch (ast.builtin) {\n case BuiltinVar.Super:\n varName = 'super';\n break;\n case BuiltinVar.This:\n varName = 'this';\n break;\n case BuiltinVar.CatchError:\n varName = CATCH_ERROR_VAR$1.name;\n break;\n case BuiltinVar.CatchStack:\n varName = CATCH_STACK_VAR$1.name;\n break;\n default:\n throw new Error(\"Unknown builtin variable \" + ast.builtin);\n }\n }\n ctx.print(varName);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitInstantiateExpr = function (ast, ctx) {\n ctx.print(\"new \");\n ast.classExpr.visitExpression(this, ctx);\n ctx.print(\"(\");\n this.visitAllExpressions(ast.args, ctx, ',');\n ctx.print(\")\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {\n var /** @type {?} */ value = ast.value;\n if (typeof value === 'string') {\n ctx.print(escapeIdentifier(value, this._escapeDollarInStrings));\n }\n else {\n ctx.print(\"\" + value);\n }\n return null;\n };\n /**\n * @abstract\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) { };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitConditionalExpr = function (ast, ctx) {\n ctx.print(\"(\");\n ast.condition.visitExpression(this, ctx);\n ctx.print('? ');\n ast.trueCase.visitExpression(this, ctx);\n ctx.print(': ');\n ast.falseCase.visitExpression(this, ctx);\n ctx.print(\")\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitNotExpr = function (ast, ctx) {\n ctx.print('!');\n ast.condition.visitExpression(this, ctx);\n return null;\n };\n /**\n * @abstract\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) { };\n /**\n * @abstract\n * @param {?} stmt\n * @param {?} context\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, context) { };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitBinaryOperatorExpr = function (ast, ctx) {\n var /** @type {?} */ opStr;\n switch (ast.operator) {\n case BinaryOperator.Equals:\n opStr = '==';\n break;\n case BinaryOperator.Identical:\n opStr = '===';\n break;\n case BinaryOperator.NotEquals:\n opStr = '!=';\n break;\n case BinaryOperator.NotIdentical:\n opStr = '!==';\n break;\n case BinaryOperator.And:\n opStr = '&&';\n break;\n case BinaryOperator.Or:\n opStr = '||';\n break;\n case BinaryOperator.Plus:\n opStr = '+';\n break;\n case BinaryOperator.Minus:\n opStr = '-';\n break;\n case BinaryOperator.Divide:\n opStr = '/';\n break;\n case BinaryOperator.Multiply:\n opStr = '*';\n break;\n case BinaryOperator.Modulo:\n opStr = '%';\n break;\n case BinaryOperator.Lower:\n opStr = '<';\n break;\n case BinaryOperator.LowerEquals:\n opStr = '<=';\n break;\n case BinaryOperator.Bigger:\n opStr = '>';\n break;\n case BinaryOperator.BiggerEquals:\n opStr = '>=';\n break;\n default:\n throw new Error(\"Unknown operator \" + ast.operator);\n }\n ctx.print(\"(\");\n ast.lhs.visitExpression(this, ctx);\n ctx.print(\" \" + opStr + \" \");\n ast.rhs.visitExpression(this, ctx);\n ctx.print(\")\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitReadPropExpr = function (ast, ctx) {\n ast.receiver.visitExpression(this, ctx);\n ctx.print(\".\");\n ctx.print(ast.name);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitReadKeyExpr = function (ast, ctx) {\n ast.receiver.visitExpression(this, ctx);\n ctx.print(\"[\");\n ast.index.visitExpression(this, ctx);\n ctx.print(\"]\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n var /** @type {?} */ useNewLine = ast.entries.length > 1;\n ctx.print(\"[\", useNewLine);\n ctx.incIndent();\n this.visitAllExpressions(ast.entries, ctx, ',', useNewLine);\n ctx.decIndent();\n ctx.print(\"]\", useNewLine);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitLiteralMapExpr = function (ast, ctx) {\n var _this = this;\n var /** @type {?} */ useNewLine = ast.entries.length > 1;\n ctx.print(\"{\", useNewLine);\n ctx.incIndent();\n this.visitAllObjects(function (entry) {\n ctx.print(escapeIdentifier(entry.key, _this._escapeDollarInStrings, entry.quoted) + \": \");\n entry.value.visitExpression(_this, ctx);\n }, ast.entries, ctx, ',', useNewLine);\n ctx.decIndent();\n ctx.print(\"}\", useNewLine);\n return null;\n };\n /**\n * @param {?} expressions\n * @param {?} ctx\n * @param {?} separator\n * @param {?=} newLine\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitAllExpressions = function (expressions, ctx, separator, newLine) {\n var _this = this;\n if (newLine === void 0) { newLine = false; }\n this.visitAllObjects(function (expr) { return expr.visitExpression(_this, ctx); }, expressions, ctx, separator, newLine);\n };\n /**\n * @param {?} handler\n * @param {?} expressions\n * @param {?} ctx\n * @param {?} separator\n * @param {?=} newLine\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitAllObjects = function (handler, expressions, ctx, separator, newLine) {\n if (newLine === void 0) { newLine = false; }\n for (var /** @type {?} */ i = 0; i < expressions.length; i++) {\n if (i > 0) {\n ctx.print(separator, newLine);\n }\n handler(expressions[i]);\n }\n if (newLine) {\n ctx.println();\n }\n };\n /**\n * @param {?} statements\n * @param {?} ctx\n * @return {?}\n */\n AbstractEmitterVisitor.prototype.visitAllStatements = function (statements, ctx) {\n var _this = this;\n statements.forEach(function (stmt) { return stmt.visitStatement(_this, ctx); });\n };\n return AbstractEmitterVisitor;\n }());\n /**\n * @param {?} input\n * @param {?} escapeDollar\n * @param {?=} alwaysQuote\n * @return {?}\n */\n function escapeIdentifier(input, escapeDollar, alwaysQuote) {\n if (alwaysQuote === void 0) { alwaysQuote = true; }\n if (isBlank(input)) {\n return null;\n }\n var /** @type {?} */ body = input.replace(_SINGLE_QUOTE_ESCAPE_STRING_RE, function () {\n var match = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n match[_i - 0] = arguments[_i];\n }\n if (match[0] == '$') {\n return escapeDollar ? '\\\\$' : '$';\n }\n else if (match[0] == '\\n') {\n return '\\\\n';\n }\n else if (match[0] == '\\r') {\n return '\\\\r';\n }\n else {\n return \"\\\\\" + match[0];\n }\n });\n var /** @type {?} */ requiresQuotes = alwaysQuote || !_LEGAL_IDENTIFIER_RE.test(body);\n return requiresQuotes ? \"'\" + body + \"'\" : body;\n }\n /**\n * @param {?} count\n * @return {?}\n */\n function _createIndent(count) {\n var /** @type {?} */ res = '';\n for (var /** @type {?} */ i = 0; i < count; i++) {\n res += ' ';\n }\n return res;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$19 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ _debugModuleUrl = '/debug/lib';\n /**\n * @param {?} ast\n * @return {?}\n */\n function debugOutputAstAsTypeScript(ast) {\n var /** @type {?} */ converter = new _TsEmitterVisitor(_debugModuleUrl);\n var /** @type {?} */ ctx = EmitterVisitorContext.createRoot([]);\n var /** @type {?} */ asts = Array.isArray(ast) ? ast : [ast];\n asts.forEach(function (ast) {\n if (ast instanceof Statement) {\n ast.visitStatement(converter, ctx);\n }\n else if (ast instanceof Expression) {\n ast.visitExpression(converter, ctx);\n }\n else if (ast instanceof Type$1) {\n ast.visitType(converter, ctx);\n }\n else {\n throw new Error(\"Don't know how to print debug info for \" + ast);\n }\n });\n return ctx.toSource();\n }\n var TypeScriptEmitter = (function () {\n /**\n * @param {?} _importGenerator\n */\n function TypeScriptEmitter(_importGenerator) {\n this._importGenerator = _importGenerator;\n }\n /**\n * @param {?} moduleUrl\n * @param {?} stmts\n * @param {?} exportedVars\n * @return {?}\n */\n TypeScriptEmitter.prototype.emitStatements = function (moduleUrl, stmts, exportedVars) {\n var _this = this;\n var /** @type {?} */ converter = new _TsEmitterVisitor(moduleUrl);\n var /** @type {?} */ ctx = EmitterVisitorContext.createRoot(exportedVars);\n converter.visitAllStatements(stmts, ctx);\n var /** @type {?} */ srcParts = [];\n converter.importsWithPrefixes.forEach(function (prefix, importedModuleUrl) {\n // Note: can't write the real word for import as it screws up system.js auto detection...\n srcParts.push(\"imp\" +\n (\"ort * as \" + prefix + \" from '\" + _this._importGenerator.fileNameToModuleName(importedModuleUrl, moduleUrl) + \"';\"));\n });\n srcParts.push(ctx.toSource());\n return srcParts.join('\\n');\n };\n return TypeScriptEmitter;\n }());\n var _TsEmitterVisitor = (function (_super) {\n __extends$19(_TsEmitterVisitor, _super);\n /**\n * @param {?} _moduleUrl\n */\n function _TsEmitterVisitor(_moduleUrl) {\n _super.call(this, false);\n this._moduleUrl = _moduleUrl;\n this.importsWithPrefixes = new Map();\n }\n /**\n * @param {?} t\n * @param {?} ctx\n * @param {?=} defaultType\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitType = function (t, ctx, defaultType) {\n if (defaultType === void 0) { defaultType = 'any'; }\n if (isPresent(t)) {\n t.visitType(this, ctx);\n }\n else {\n ctx.print(defaultType);\n }\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitLiteralExpr = function (ast, ctx) {\n var /** @type {?} */ value = ast.value;\n if (isBlank(value) && ast.type != NULL_TYPE) {\n ctx.print(\"(\" + value + \" as any)\");\n return null;\n }\n return _super.prototype.visitLiteralExpr.call(this, ast, ctx);\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n if (ast.entries.length === 0) {\n ctx.print('(');\n }\n var /** @type {?} */ result = _super.prototype.visitLiteralArrayExpr.call(this, ast, ctx);\n if (ast.entries.length === 0) {\n ctx.print(' as any[])');\n }\n return result;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {\n this._visitIdentifier(ast.value, ast.typeParams, ctx);\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n if (ctx.isExportedVar(stmt.name)) {\n ctx.print(\"export \");\n }\n if (stmt.hasModifier(StmtModifier.Final)) {\n ctx.print(\"const\");\n }\n else {\n ctx.print(\"var\");\n }\n ctx.print(\" \" + stmt.name + \":\");\n this.visitType(stmt.type, ctx);\n ctx.print(\" = \");\n stmt.value.visitExpression(this, ctx);\n ctx.println(\";\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {\n ctx.print(\"(<\");\n ast.type.visitType(this, ctx);\n ctx.print(\">\");\n ast.value.visitExpression(this, ctx);\n ctx.print(\")\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n var _this = this;\n ctx.pushClass(stmt);\n if (ctx.isExportedVar(stmt.name)) {\n ctx.print(\"export \");\n }\n ctx.print(\"class \" + stmt.name);\n if (isPresent(stmt.parent)) {\n ctx.print(\" extends \");\n stmt.parent.visitExpression(this, ctx);\n }\n ctx.println(\" {\");\n ctx.incIndent();\n stmt.fields.forEach(function (field) { return _this._visitClassField(field, ctx); });\n if (isPresent(stmt.constructorMethod)) {\n this._visitClassConstructor(stmt, ctx);\n }\n stmt.getters.forEach(function (getter) { return _this._visitClassGetter(getter, ctx); });\n stmt.methods.forEach(function (method) { return _this._visitClassMethod(method, ctx); });\n ctx.decIndent();\n ctx.println(\"}\");\n ctx.popClass();\n return null;\n };\n /**\n * @param {?} field\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitClassField = function (field, ctx) {\n if (field.hasModifier(StmtModifier.Private)) {\n // comment out as a workaround for #10967\n ctx.print(\"/*private*/ \");\n }\n ctx.print(field.name);\n ctx.print(':');\n this.visitType(field.type, ctx);\n ctx.println(\";\");\n };\n /**\n * @param {?} getter\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitClassGetter = function (getter, ctx) {\n if (getter.hasModifier(StmtModifier.Private)) {\n ctx.print(\"private \");\n }\n ctx.print(\"get \" + getter.name + \"()\");\n ctx.print(':');\n this.visitType(getter.type, ctx);\n ctx.println(\" {\");\n ctx.incIndent();\n this.visitAllStatements(getter.body, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {\n ctx.print(\"constructor(\");\n this._visitParams(stmt.constructorMethod.params, ctx);\n ctx.println(\") {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.constructorMethod.body, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n };\n /**\n * @param {?} method\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitClassMethod = function (method, ctx) {\n if (method.hasModifier(StmtModifier.Private)) {\n ctx.print(\"private \");\n }\n ctx.print(method.name + \"(\");\n this._visitParams(method.params, ctx);\n ctx.print(\"):\");\n this.visitType(method.type, ctx, 'void');\n ctx.println(\" {\");\n ctx.incIndent();\n this.visitAllStatements(method.body, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {\n ctx.print(\"(\");\n this._visitParams(ast.params, ctx);\n ctx.print(\"):\");\n this.visitType(ast.type, ctx, 'void');\n ctx.println(\" => {\");\n ctx.incIndent();\n this.visitAllStatements(ast.statements, ctx);\n ctx.decIndent();\n ctx.print(\"}\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n if (ctx.isExportedVar(stmt.name)) {\n ctx.print(\"export \");\n }\n ctx.print(\"function \" + stmt.name + \"(\");\n this._visitParams(stmt.params, ctx);\n ctx.print(\"):\");\n this.visitType(stmt.type, ctx, 'void');\n ctx.println(\" {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.statements, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {\n ctx.println(\"try {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.bodyStmts, ctx);\n ctx.decIndent();\n ctx.println(\"} catch (\" + CATCH_ERROR_VAR$1.name + \") {\");\n ctx.incIndent();\n var /** @type {?} */ catchStmts = [(CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack')).toDeclStmt(null, [\n StmtModifier.Final\n ]))].concat(stmt.catchStmts);\n this.visitAllStatements(catchStmts, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n return null;\n };\n /**\n * @param {?} type\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitBuiltintType = function (type, ctx) {\n var /** @type {?} */ typeStr;\n switch (type.name) {\n case BuiltinTypeName.Bool:\n typeStr = 'boolean';\n break;\n case BuiltinTypeName.Dynamic:\n typeStr = 'any';\n break;\n case BuiltinTypeName.Function:\n typeStr = 'Function';\n break;\n case BuiltinTypeName.Number:\n typeStr = 'number';\n break;\n case BuiltinTypeName.Int:\n typeStr = 'number';\n break;\n case BuiltinTypeName.String:\n typeStr = 'string';\n break;\n default:\n throw new Error(\"Unsupported builtin type \" + type.name);\n }\n ctx.print(typeStr);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitExpressionType = function (ast, ctx) {\n var _this = this;\n ast.value.visitExpression(this, ctx);\n if (isPresent(ast.typeParams) && ast.typeParams.length > 0) {\n ctx.print(\"<\");\n this.visitAllObjects(function (type) { return type.visitType(_this, ctx); }, ast.typeParams, ctx, ',');\n ctx.print(\">\");\n }\n return null;\n };\n /**\n * @param {?} type\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitArrayType = function (type, ctx) {\n this.visitType(type.of, ctx);\n ctx.print(\"[]\");\n return null;\n };\n /**\n * @param {?} type\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype.visitMapType = function (type, ctx) {\n ctx.print(\"{[key: string]:\");\n this.visitType(type.valueType, ctx);\n ctx.print(\"}\");\n return null;\n };\n /**\n * @param {?} method\n * @return {?}\n */\n _TsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {\n var /** @type {?} */ name;\n switch (method) {\n case BuiltinMethod.ConcatArray:\n name = 'concat';\n break;\n case BuiltinMethod.SubscribeObservable:\n name = 'subscribe';\n break;\n case BuiltinMethod.Bind:\n name = 'bind';\n break;\n default:\n throw new Error(\"Unknown builtin method: \" + method);\n }\n return name;\n };\n /**\n * @param {?} params\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitParams = function (params, ctx) {\n var _this = this;\n this.visitAllObjects(function (param) {\n ctx.print(param.name);\n ctx.print(':');\n _this.visitType(param.type, ctx);\n }, params, ctx, ',');\n };\n /**\n * @param {?} value\n * @param {?} typeParams\n * @param {?} ctx\n * @return {?}\n */\n _TsEmitterVisitor.prototype._visitIdentifier = function (value, typeParams, ctx) {\n var _this = this;\n var /** @type {?} */ name = identifierName(value);\n var /** @type {?} */ moduleUrl = identifierModuleUrl(value);\n if (isBlank(name)) {\n throw new Error(\"Internal error: unknown identifier \" + value);\n }\n if (isPresent(moduleUrl) && moduleUrl != this._moduleUrl) {\n var /** @type {?} */ prefix = this.importsWithPrefixes.get(moduleUrl);\n if (isBlank(prefix)) {\n prefix = \"import\" + this.importsWithPrefixes.size;\n this.importsWithPrefixes.set(moduleUrl, prefix);\n }\n ctx.print(prefix + \".\");\n }\n if (value.reference && value.reference.members && value.reference.members.length) {\n ctx.print(value.reference.name);\n ctx.print('.');\n ctx.print(value.reference.members.join('.'));\n }\n else {\n ctx.print(name);\n }\n if (isPresent(typeParams) && typeParams.length > 0) {\n ctx.print(\"<\");\n this.visitAllObjects(function (type) { return type.visitType(_this, ctx); }, typeParams, ctx, ',');\n ctx.print(\">\");\n }\n };\n return _TsEmitterVisitor;\n }(AbstractEmitterVisitor));\n\n // =================================================================================================\n // =================================================================================================\n // =========== S T O P - S T O P - S T O P - S T O P - S T O P - S T O P ===========\n // =================================================================================================\n // =================================================================================================\n //\n // DO NOT EDIT THIS LIST OF SECURITY SENSITIVE PROPERTIES WITHOUT A SECURITY REVIEW!\n // Reach out to mprobst for details.\n //\n // =================================================================================================\n /** Map from tagName|propertyName SecurityContext. Properties applying to all tags use '*'. */\n var /** @type {?} */ SECURITY_SCHEMA = {};\n /**\n * @param {?} ctx\n * @param {?} specs\n * @return {?}\n */\n function registerContext(ctx, specs) {\n for (var _i = 0, specs_1 = specs; _i < specs_1.length; _i++) {\n var spec = specs_1[_i];\n SECURITY_SCHEMA[spec.toLowerCase()] = ctx;\n }\n }\n // Case is insignificant below, all element and attribute names are lower-cased for lookup.\n registerContext(_angular_core.SecurityContext.HTML, [\n 'iframe|srcdoc',\n '*|innerHTML',\n '*|outerHTML',\n ]);\n registerContext(_angular_core.SecurityContext.STYLE, ['*|style']);\n // NB: no SCRIPT contexts here, they are never allowed due to the parser stripping them.\n registerContext(_angular_core.SecurityContext.URL, [\n '*|formAction', 'area|href', 'area|ping', 'audio|src', 'a|href',\n 'a|ping', 'blockquote|cite', 'body|background', 'del|cite', 'form|action',\n 'img|src', 'img|srcset', 'input|src', 'ins|cite', 'q|cite',\n 'source|src', 'source|srcset', 'track|src', 'video|poster', 'video|src',\n ]);\n registerContext(_angular_core.SecurityContext.RESOURCE_URL, [\n 'applet|code',\n 'applet|codebase',\n 'base|href',\n 'embed|src',\n 'frame|src',\n 'head|profile',\n 'html|manifest',\n 'iframe|src',\n 'link|href',\n 'media|src',\n 'object|codebase',\n 'object|data',\n 'script|src',\n ]);\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$20 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var __decorate$14 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$14 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var /** @type {?} */ BOOLEAN = 'boolean';\n var /** @type {?} */ NUMBER = 'number';\n var /** @type {?} */ STRING = 'string';\n var /** @type {?} */ OBJECT = 'object';\n /**\n * This array represents the DOM schema. It encodes inheritance, properties, and events.\n *\n * ## Overview\n *\n * Each line represents one kind of element. The `element_inheritance` and properties are joined\n * using `element_inheritance|properties` syntax.\n *\n * ## Element Inheritance\n *\n * The `element_inheritance` can be further subdivided as `element1,element2,...^parentElement`.\n * Here the individual elements are separated by `,` (commas). Every element in the list\n * has identical properties.\n *\n * An `element` may inherit additional properties from `parentElement` If no `^parentElement` is\n * specified then `\"\"` (blank) element is assumed.\n *\n * NOTE: The blank element inherits from root `[Element]` element, the super element of all\n * elements.\n *\n * NOTE an element prefix such as `:svg:` has no special meaning to the schema.\n *\n * ## Properties\n *\n * Each element has a set of properties separated by `,` (commas). Each property can be prefixed\n * by a special character designating its type:\n *\n * - (no prefix): property is a string.\n * - `*`: property represents an event.\n * - `!`: property is a boolean.\n * - `#`: property is a number.\n * - `%`: property is an object.\n *\n * ## Query\n *\n * The class creates an internal squas representation which allows to easily answer the query of\n * if a given property exist on a given element.\n *\n * NOTE: We don't yet support querying for types or events.\n * NOTE: This schema is auto extracted from `schema_extractor.ts` located in the test folder,\n * see dom_element_schema_registry_spec.ts\n */\n // =================================================================================================\n // =================================================================================================\n // =========== S T O P - S T O P - S T O P - S T O P - S T O P - S T O P ===========\n // =================================================================================================\n // =================================================================================================\n //\n // DO NOT EDIT THIS DOM SCHEMA WITHOUT A SECURITY REVIEW!\n //\n // Newly added properties must be security reviewed and assigned an appropriate SecurityContext in\n // dom_security_schema.ts. Reach out to mprobst & rjamet for details.\n //\n // =================================================================================================\n var /** @type {?} */ SCHEMA = [\n '[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop',\n '[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*beforecopy,*beforecut,*beforepaste,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*message,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*paste,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*search,*seeked,*seeking,*select,*selectstart,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate',\n 'abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*beforecopy,*beforecut,*beforepaste,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*copy,*cuechange,*cut,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*message,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*paste,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*search,*seeked,*seeking,*select,*selectstart,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerText,!spellcheck,%style,#tabIndex,title,!translate',\n 'media^[HTMLElement]|!autoplay,!controls,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,#playbackRate,preload,src,%srcObject,#volume',\n ':svg:^[HTMLElement]|*abort,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex',\n ':svg:graphics^:svg:|',\n ':svg:animation^:svg:|*begin,*end,*repeat',\n ':svg:geometry^:svg:|',\n ':svg:componentTransferFunction^:svg:|',\n ':svg:gradient^:svg:|',\n ':svg:textContent^:svg:graphics|',\n ':svg:textPositioning^:svg:textContent|',\n 'a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username',\n 'area^[HTMLElement]|alt,coords,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,search,shape,target,username',\n 'audio^media|',\n 'br^[HTMLElement]|clear',\n 'base^[HTMLElement]|href,target',\n 'body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink',\n 'button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value',\n 'canvas^[HTMLElement]|#height,#width',\n 'content^[HTMLElement]|select',\n 'dl^[HTMLElement]|!compact',\n 'datalist^[HTMLElement]|',\n 'details^[HTMLElement]|!open',\n 'dialog^[HTMLElement]|!open,returnValue',\n 'dir^[HTMLElement]|!compact',\n 'div^[HTMLElement]|align',\n 'embed^[HTMLElement]|align,height,name,src,type,width',\n 'fieldset^[HTMLElement]|!disabled,name',\n 'font^[HTMLElement]|color,face,size',\n 'form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target',\n 'frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src',\n 'frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows',\n 'hr^[HTMLElement]|align,color,!noShade,size,width',\n 'head^[HTMLElement]|',\n 'h1,h2,h3,h4,h5,h6^[HTMLElement]|align',\n 'html^[HTMLElement]|version',\n 'iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width',\n 'img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width',\n 'input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width',\n 'keygen^[HTMLElement]|!autofocus,challenge,!disabled,keytype,name',\n 'li^[HTMLElement]|type,#value',\n 'label^[HTMLElement]|htmlFor',\n 'legend^[HTMLElement]|align',\n 'link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,rel,%relList,rev,%sizes,target,type',\n 'map^[HTMLElement]|name',\n 'marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width',\n 'menu^[HTMLElement]|!compact',\n 'meta^[HTMLElement]|content,httpEquiv,name,scheme',\n 'meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value',\n 'ins,del^[HTMLElement]|cite,dateTime',\n 'ol^[HTMLElement]|!compact,!reversed,#start,type',\n 'object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width',\n 'optgroup^[HTMLElement]|!disabled,label',\n 'option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value',\n 'output^[HTMLElement]|defaultValue,%htmlFor,name,value',\n 'p^[HTMLElement]|align',\n 'param^[HTMLElement]|name,type,value,valueType',\n 'picture^[HTMLElement]|',\n 'pre^[HTMLElement]|#width',\n 'progress^[HTMLElement]|#max,#value',\n 'q,blockquote,cite^[HTMLElement]|',\n 'script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type',\n 'select^[HTMLElement]|!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value',\n 'shadow^[HTMLElement]|',\n 'source^[HTMLElement]|media,sizes,src,srcset,type',\n 'span^[HTMLElement]|',\n 'style^[HTMLElement]|!disabled,media,type',\n 'caption^[HTMLElement]|align',\n 'th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width',\n 'col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width',\n 'table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width',\n 'tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign',\n 'tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign',\n 'template^[HTMLElement]|',\n 'textarea^[HTMLElement]|autocapitalize,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap',\n 'title^[HTMLElement]|text',\n 'track^[HTMLElement]|!default,kind,label,src,srclang',\n 'ul^[HTMLElement]|!compact,type',\n 'unknown^[HTMLElement]|',\n 'video^media|#height,poster,#width',\n ':svg:a^:svg:graphics|',\n ':svg:animate^:svg:animation|',\n ':svg:animateMotion^:svg:animation|',\n ':svg:animateTransform^:svg:animation|',\n ':svg:circle^:svg:geometry|',\n ':svg:clipPath^:svg:graphics|',\n ':svg:cursor^:svg:|',\n ':svg:defs^:svg:graphics|',\n ':svg:desc^:svg:|',\n ':svg:discard^:svg:|',\n ':svg:ellipse^:svg:geometry|',\n ':svg:feBlend^:svg:|',\n ':svg:feColorMatrix^:svg:|',\n ':svg:feComponentTransfer^:svg:|',\n ':svg:feComposite^:svg:|',\n ':svg:feConvolveMatrix^:svg:|',\n ':svg:feDiffuseLighting^:svg:|',\n ':svg:feDisplacementMap^:svg:|',\n ':svg:feDistantLight^:svg:|',\n ':svg:feDropShadow^:svg:|',\n ':svg:feFlood^:svg:|',\n ':svg:feFuncA^:svg:componentTransferFunction|',\n ':svg:feFuncB^:svg:componentTransferFunction|',\n ':svg:feFuncG^:svg:componentTransferFunction|',\n ':svg:feFuncR^:svg:componentTransferFunction|',\n ':svg:feGaussianBlur^:svg:|',\n ':svg:feImage^:svg:|',\n ':svg:feMerge^:svg:|',\n ':svg:feMergeNode^:svg:|',\n ':svg:feMorphology^:svg:|',\n ':svg:feOffset^:svg:|',\n ':svg:fePointLight^:svg:|',\n ':svg:feSpecularLighting^:svg:|',\n ':svg:feSpotLight^:svg:|',\n ':svg:feTile^:svg:|',\n ':svg:feTurbulence^:svg:|',\n ':svg:filter^:svg:|',\n ':svg:foreignObject^:svg:graphics|',\n ':svg:g^:svg:graphics|',\n ':svg:image^:svg:graphics|',\n ':svg:line^:svg:geometry|',\n ':svg:linearGradient^:svg:gradient|',\n ':svg:mpath^:svg:|',\n ':svg:marker^:svg:|',\n ':svg:mask^:svg:|',\n ':svg:metadata^:svg:|',\n ':svg:path^:svg:geometry|',\n ':svg:pattern^:svg:|',\n ':svg:polygon^:svg:geometry|',\n ':svg:polyline^:svg:geometry|',\n ':svg:radialGradient^:svg:gradient|',\n ':svg:rect^:svg:geometry|',\n ':svg:svg^:svg:graphics|#currentScale,#zoomAndPan',\n ':svg:script^:svg:|type',\n ':svg:set^:svg:animation|',\n ':svg:stop^:svg:|',\n ':svg:style^:svg:|!disabled,media,title,type',\n ':svg:switch^:svg:graphics|',\n ':svg:symbol^:svg:|',\n ':svg:tspan^:svg:textPositioning|',\n ':svg:text^:svg:textPositioning|',\n ':svg:textPath^:svg:textContent|',\n ':svg:title^:svg:|',\n ':svg:use^:svg:graphics|',\n ':svg:view^:svg:|#zoomAndPan',\n 'data^[HTMLElement]|value',\n 'menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default',\n 'summary^[HTMLElement]|',\n 'time^[HTMLElement]|dateTime',\n ];\n var /** @type {?} */ _ATTR_TO_PROP = {\n 'class': 'className',\n 'for': 'htmlFor',\n 'formaction': 'formAction',\n 'innerHtml': 'innerHTML',\n 'readonly': 'readOnly',\n 'tabindex': 'tabIndex',\n };\n var DomElementSchemaRegistry = (function (_super) {\n __extends$20(DomElementSchemaRegistry, _super);\n function DomElementSchemaRegistry() {\n var _this = this;\n _super.call(this);\n this._schema = {};\n SCHEMA.forEach(function (encodedType) {\n var type = {};\n var _a = encodedType.split('|'), strType = _a[0], strProperties = _a[1];\n var properties = strProperties.split(',');\n var _b = strType.split('^'), typeNames = _b[0], superName = _b[1];\n typeNames.split(',').forEach(function (tag) { return _this._schema[tag.toLowerCase()] = type; });\n var superType = superName && _this._schema[superName.toLowerCase()];\n if (superType) {\n Object.keys(superType).forEach(function (prop) { type[prop] = superType[prop]; });\n }\n properties.forEach(function (property) {\n if (property.length > 0) {\n switch (property[0]) {\n case '*':\n // We don't yet support events.\n // If ever allowing to bind to events, GO THROUGH A SECURITY REVIEW, allowing events\n // will\n // almost certainly introduce bad XSS vulnerabilities.\n // type[property.substring(1)] = EVENT;\n break;\n case '!':\n type[property.substring(1)] = BOOLEAN;\n break;\n case '#':\n type[property.substring(1)] = NUMBER;\n break;\n case '%':\n type[property.substring(1)] = OBJECT;\n break;\n default:\n type[property] = STRING;\n }\n }\n });\n });\n }\n /**\n * @param {?} tagName\n * @param {?} propName\n * @param {?} schemaMetas\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName, schemaMetas) {\n if (schemaMetas.some(function (schema) { return schema.name === _angular_core.NO_ERRORS_SCHEMA.name; })) {\n return true;\n }\n if (tagName.indexOf('-') > -1) {\n if (tagName === 'ng-container' || tagName === 'ng-content') {\n return false;\n }\n if (schemaMetas.some(function (schema) { return schema.name === _angular_core.CUSTOM_ELEMENTS_SCHEMA.name; })) {\n // Can't tell now as we don't know which properties a custom element will get\n // once it is instantiated\n return true;\n }\n }\n var /** @type {?} */ elementProperties = this._schema[tagName.toLowerCase()] || this._schema['unknown'];\n return !!elementProperties[propName];\n };\n /**\n * @param {?} tagName\n * @param {?} schemaMetas\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.hasElement = function (tagName, schemaMetas) {\n if (schemaMetas.some(function (schema) { return schema.name === _angular_core.NO_ERRORS_SCHEMA.name; })) {\n return true;\n }\n if (tagName.indexOf('-') > -1) {\n if (tagName === 'ng-container' || tagName === 'ng-content') {\n return true;\n }\n if (schemaMetas.some(function (schema) { return schema.name === _angular_core.CUSTOM_ELEMENTS_SCHEMA.name; })) {\n // Allow any custom elements\n return true;\n }\n }\n return !!this._schema[tagName.toLowerCase()];\n };\n /**\n * securityContext returns the security context for the given property on the given DOM tag.\n * *\n * Tag and property name are statically known and cannot change at runtime, i.e. it is not\n * possible to bind a value into a changing attribute or tag name.\n * *\n * The filtering is white list based. All attributes in the schema above are assumed to have the\n * 'NONE' security context, i.e. that they are safe inert string values. Only specific well known\n * attack vectors are assigned their appropriate context.\n * @param {?} tagName\n * @param {?} propName\n * @param {?} isAttribute\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.securityContext = function (tagName, propName, isAttribute) {\n if (isAttribute) {\n // NB: For security purposes, use the mapped property name, not the attribute name.\n propName = this.getMappedPropName(propName);\n }\n // Make sure comparisons are case insensitive, so that case differences between attribute and\n // property names do not have a security impact.\n tagName = tagName.toLowerCase();\n propName = propName.toLowerCase();\n var /** @type {?} */ ctx = SECURITY_SCHEMA[tagName + '|' + propName];\n if (ctx) {\n return ctx;\n }\n ctx = SECURITY_SCHEMA['*|' + propName];\n return ctx ? ctx : _angular_core.SecurityContext.NONE;\n };\n /**\n * @param {?} propName\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return _ATTR_TO_PROP[propName] || propName; };\n /**\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.getDefaultComponentElementName = function () { return 'ng-component'; };\n /**\n * @param {?} name\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.validateProperty = function (name) {\n if (name.toLowerCase().startsWith('on')) {\n var /** @type {?} */ msg = (\"Binding to event property '\" + name + \"' is disallowed for security reasons, \") +\n (\"please use (\" + name.slice(2) + \")=...\") +\n (\"\\nIf '\" + name + \"' is a directive input, make sure the directive is imported by the\") +\n \" current module.\";\n return { error: true, msg: msg };\n }\n else {\n return { error: false };\n }\n };\n /**\n * @param {?} name\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.validateAttribute = function (name) {\n if (name.toLowerCase().startsWith('on')) {\n var /** @type {?} */ msg = (\"Binding to event attribute '\" + name + \"' is disallowed for security reasons, \") +\n (\"please use (\" + name.slice(2) + \")=...\");\n return { error: true, msg: msg };\n }\n else {\n return { error: false };\n }\n };\n /**\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.allKnownElementNames = function () { return Object.keys(this._schema); };\n /**\n * @param {?} propName\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.normalizeAnimationStyleProperty = function (propName) {\n return dashCaseToCamelCase(propName);\n };\n /**\n * @param {?} camelCaseProp\n * @param {?} userProvidedProp\n * @param {?} val\n * @return {?}\n */\n DomElementSchemaRegistry.prototype.normalizeAnimationStyleValue = function (camelCaseProp, userProvidedProp, val) {\n var /** @type {?} */ unit = '';\n var /** @type {?} */ strVal = val.toString().trim();\n var /** @type {?} */ errorMsg = null;\n if (_isPixelDimensionStyle(camelCaseProp) && val !== 0 && val !== '0') {\n if (typeof val === 'number') {\n unit = 'px';\n }\n else {\n var /** @type {?} */ valAndSuffixMatch = val.match(/^[+-]?[\\d\\.]+([a-z]*)$/);\n if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {\n errorMsg = \"Please provide a CSS unit value for \" + userProvidedProp + \":\" + val;\n }\n }\n }\n return { error: errorMsg, value: strVal + unit };\n };\n DomElementSchemaRegistry = __decorate$14([\n CompilerInjectable(), \n __metadata$14('design:paramtypes', [])\n ], DomElementSchemaRegistry);\n return DomElementSchemaRegistry;\n }(ElementSchemaRegistry));\n /**\n * @param {?} prop\n * @return {?}\n */\n function _isPixelDimensionStyle(prop) {\n switch (prop) {\n case 'width':\n case 'height':\n case 'minWidth':\n case 'minHeight':\n case 'maxWidth':\n case 'maxHeight':\n case 'left':\n case 'top':\n case 'bottom':\n case 'right':\n case 'fontSize':\n case 'outlineWidth':\n case 'outlineOffset':\n case 'paddingTop':\n case 'paddingLeft':\n case 'paddingBottom':\n case 'paddingRight':\n case 'marginTop':\n case 'marginLeft':\n case 'marginBottom':\n case 'marginRight':\n case 'borderRadius':\n case 'borderWidth':\n case 'borderTopWidth':\n case 'borderLeftWidth':\n case 'borderRightWidth':\n case 'borderBottomWidth':\n case 'textIndent':\n return true;\n default:\n return false;\n }\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * This file is a port of shadowCSS from webcomponents.js to TypeScript.\n *\n * Please make sure to keep to edits in sync with the source file.\n *\n * Source:\n * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js\n *\n * The original file level comment is reproduced below\n */\n /*\n This is a limited shim for ShadowDOM css styling.\n https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n\n The intention here is to support only the styling features which can be\n relatively simply implemented. The goal is to allow users to avoid the\n most obvious pitfalls and do so without compromising performance significantly.\n For ShadowDOM styling that's not covered here, a set of best practices\n can be provided that should allow users to accomplish more complex styling.\n\n The following is a list of specific ShadowDOM styling features and a brief\n discussion of the approach used to shim.\n\n Shimmed features:\n\n * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n element using the :host rule. To shim this feature, the :host styles are\n reformatted and prefixed with a given scope name and promoted to a\n document level stylesheet.\n For example, given a scope name of .foo, a rule like this:\n\n :host {\n background: red;\n }\n }\n\n becomes:\n\n .foo {\n background: red;\n }\n\n * encapsulation: Styles defined within ShadowDOM, apply only to\n dom inside the ShadowDOM. Polymer uses one of two techniques to implement\n this feature.\n\n By default, rules are prefixed with the host element tag name\n as a descendant selector. This ensures styling does not leak out of the 'top'\n of the element's ShadowDOM. For example,\n\n div {\n font-weight: bold;\n }\n\n becomes:\n\n x-foo div {\n font-weight: bold;\n }\n\n becomes:\n\n\n Alternatively, if WebComponents.ShadowCSS.strictStyling is set to true then\n selectors are scoped by adding an attribute selector suffix to each\n simple selector that contains the host element tag name. Each element\n in the element's ShadowDOM template is also given the scope attribute.\n Thus, these rules match only elements that have the scope attribute.\n For example, given a scope name of x-foo, a rule like this:\n\n div {\n font-weight: bold;\n }\n\n becomes:\n\n div[x-foo] {\n font-weight: bold;\n }\n\n Note that elements that are dynamically added to a scope must have the scope\n selector added to them manually.\n\n * upper/lower bound encapsulation: Styles which are defined outside a\n shadowRoot should not cross the ShadowDOM boundary and should not apply\n inside a shadowRoot.\n\n This styling behavior is not emulated. Some possible ways to do this that\n were rejected due to complexity and/or performance concerns include: (1) reset\n every possible property for every possible selector for a given scope name;\n (2) re-implement css in javascript.\n\n As an alternative, users should make sure to use selectors\n specific to the scope in which they are working.\n\n * ::distributed: This behavior is not emulated. It's often not necessary\n to style the contents of a specific insertion point and instead, descendants\n of the host element can be styled selectively. Users can also create an\n extra node around an insertion point and style that node's contents\n via descendent selectors. For example, with a shadowRoot like this:\n\n <style>\n ::content(div) {\n background: red;\n }\n </style>\n <content></content>\n\n could become:\n\n <style>\n / *@polyfill .content-container div * /\n ::content(div) {\n background: red;\n }\n </style>\n <div class=\"content-container\">\n <content></content>\n </div>\n\n Note the use of @polyfill in the comment above a ShadowDOM specific style\n declaration. This is a directive to the styling shim to use the selector\n in comments in lieu of the next selector when running under polyfill.\n */\n var ShadowCss = (function () {\n function ShadowCss() {\n this.strictStyling = true;\n }\n /**\n * @param {?} cssText\n * @param {?} selector\n * @param {?=} hostSelector\n * @return {?}\n */\n ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {\n if (hostSelector === void 0) { hostSelector = ''; }\n var /** @type {?} */ sourceMappingUrl = extractSourceMappingUrl(cssText);\n cssText = stripComments(cssText);\n cssText = this._insertDirectives(cssText);\n return this._scopeCssText(cssText, selector, hostSelector) + sourceMappingUrl;\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._insertDirectives = function (cssText) {\n cssText = this._insertPolyfillDirectivesInCssText(cssText);\n return this._insertPolyfillRulesInCssText(cssText);\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {\n // Difference with webcomponents.js: does not handle comments\n return cssText.replace(_cssContentNextSelectorRe, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n return m[2] + '{';\n });\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {\n // Difference with webcomponents.js: does not handle comments\n return cssText.replace(_cssContentRuleRe, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ rule = m[0].replace(m[1], '').replace(m[2], '');\n return m[4] + rule;\n });\n };\n /**\n * @param {?} cssText\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @return {?}\n */\n ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {\n var /** @type {?} */ unscopedRules = this._extractUnscopedRulesFromCssText(cssText);\n // replace :host and :host-context -shadowcsshost and -shadowcsshost respectively\n cssText = this._insertPolyfillHostInCssText(cssText);\n cssText = this._convertColonHost(cssText);\n cssText = this._convertColonHostContext(cssText);\n cssText = this._convertShadowDOMSelectors(cssText);\n if (scopeSelector) {\n cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);\n }\n cssText = cssText + '\\n' + unscopedRules;\n return cssText.trim();\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {\n // Difference with webcomponents.js: does not handle comments\n var /** @type {?} */ r = '';\n var /** @type {?} */ m;\n _cssContentUnscopedRuleRe.lastIndex = 0;\n while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) {\n var /** @type {?} */ rule = m[0].replace(m[2], '').replace(m[1], m[4]);\n r += rule + '\\n\\n';\n }\n return r;\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._convertColonHost = function (cssText) {\n return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._convertColonHostContext = function (cssText) {\n return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);\n };\n /**\n * @param {?} cssText\n * @param {?} regExp\n * @param {?} partReplacer\n * @return {?}\n */\n ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {\n // m[1] = :host(-context), m[2] = contents of (), m[3] rest of rule\n return cssText.replace(regExp, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n if (m[2]) {\n var /** @type {?} */ parts = m[2].split(',');\n var /** @type {?} */ r = [];\n for (var /** @type {?} */ i = 0; i < parts.length; i++) {\n var /** @type {?} */ p = parts[i].trim();\n if (!p)\n break;\n r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));\n }\n return r.join(',');\n }\n else {\n return _polyfillHostNoCombinator + m[3];\n }\n });\n };\n /**\n * @param {?} host\n * @param {?} part\n * @param {?} suffix\n * @return {?}\n */\n ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {\n if (part.indexOf(_polyfillHost) > -1) {\n return this._colonHostPartReplacer(host, part, suffix);\n }\n else {\n return host + part + suffix + ', ' + part + ' ' + host + suffix;\n }\n };\n /**\n * @param {?} host\n * @param {?} part\n * @param {?} suffix\n * @return {?}\n */\n ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {\n return host + part.replace(_polyfillHost, '') + suffix;\n };\n /**\n * @param {?} cssText\n * @return {?}\n */\n ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {\n return _shadowDOMSelectorsRe.reduce(function (result, pattern) { return result.replace(pattern, ' '); }, cssText);\n };\n /**\n * @param {?} cssText\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @return {?}\n */\n ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {\n var _this = this;\n return processRules(cssText, function (rule) {\n var /** @type {?} */ selector = rule.selector;\n var /** @type {?} */ content = rule.content;\n if (rule.selector[0] != '@') {\n selector =\n _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);\n }\n else if (rule.selector.startsWith('@media') || rule.selector.startsWith('@supports') ||\n rule.selector.startsWith('@page') || rule.selector.startsWith('@document')) {\n content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);\n }\n return new CssRule(selector, content);\n });\n };\n /**\n * @param {?} selector\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @param {?} strict\n * @return {?}\n */\n ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {\n var _this = this;\n return selector.split(',')\n .map(function (part) { return part.trim().split(_shadowDeepSelectors); })\n .map(function (deepParts) {\n var shallowPart = deepParts[0], otherParts = deepParts.slice(1);\n var /** @type {?} */ applyScope = function (shallowPart) {\n if (_this._selectorNeedsScoping(shallowPart, scopeSelector)) {\n return strict ?\n _this._applyStrictSelectorScope(shallowPart, scopeSelector, hostSelector) :\n _this._applySelectorScope(shallowPart, scopeSelector, hostSelector);\n }\n else {\n return shallowPart;\n }\n };\n return [applyScope(shallowPart)].concat(otherParts).join(' ');\n })\n .join(', ');\n };\n /**\n * @param {?} selector\n * @param {?} scopeSelector\n * @return {?}\n */\n ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {\n var /** @type {?} */ re = this._makeScopeMatcher(scopeSelector);\n return !re.test(selector);\n };\n /**\n * @param {?} scopeSelector\n * @return {?}\n */\n ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {\n var /** @type {?} */ lre = /\\[/g;\n var /** @type {?} */ rre = /\\]/g;\n scopeSelector = scopeSelector.replace(lre, '\\\\[').replace(rre, '\\\\]');\n return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');\n };\n /**\n * @param {?} selector\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @return {?}\n */\n ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {\n // Difference from webcomponents.js: scopeSelector could not be an array\n return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);\n };\n /**\n * @param {?} selector\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @return {?}\n */\n ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {\n // In Android browser, the lastIndex is not reset when the regex is used in String.replace()\n _polyfillHostRe.lastIndex = 0;\n if (_polyfillHostRe.test(selector)) {\n var /** @type {?} */ replaceBy_1 = this.strictStyling ? \"[\" + hostSelector + \"]\" : scopeSelector;\n return selector\n .replace(_polyfillHostNoCombinatorRe, function (hnc, selector) {\n return selector.replace(/([^:]*)(:*)(.*)/, function (_, before, colon, after) {\n return before + replaceBy_1 + colon + after;\n });\n })\n .replace(_polyfillHostRe, replaceBy_1 + ' ');\n }\n return scopeSelector + ' ' + selector;\n };\n /**\n * @param {?} selector\n * @param {?} scopeSelector\n * @param {?} hostSelector\n * @return {?}\n */\n ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector, hostSelector) {\n var _this = this;\n var /** @type {?} */ isRe = /\\[is=([^\\]]*)\\]/g;\n scopeSelector = scopeSelector.replace(isRe, function (_) {\n var parts = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n parts[_i - 1] = arguments[_i];\n }\n return parts[0];\n });\n var /** @type {?} */ attrName = '[' + scopeSelector + ']';\n var /** @type {?} */ _scopeSelectorPart = function (p) {\n var /** @type {?} */ scopedP = p.trim();\n if (!scopedP) {\n return '';\n }\n if (p.indexOf(_polyfillHostNoCombinator) > -1) {\n scopedP = _this._applySimpleSelectorScope(p, scopeSelector, hostSelector);\n }\n else {\n // remove :host since it should be unnecessary\n var /** @type {?} */ t = p.replace(_polyfillHostRe, '');\n if (t.length > 0) {\n var /** @type {?} */ matches = t.match(/([^:]*)(:*)(.*)/);\n if (matches) {\n scopedP = matches[1] + attrName + matches[2] + matches[3];\n }\n }\n }\n return scopedP;\n };\n var /** @type {?} */ safeContent = new SafeSelector(selector);\n selector = safeContent.content();\n var /** @type {?} */ scopedSelector = '';\n var /** @type {?} */ startIndex = 0;\n var /** @type {?} */ res;\n var /** @type {?} */ sep = /( |>|\\+|~(?!=))\\s*/g;\n var /** @type {?} */ scopeAfter = selector.indexOf(_polyfillHostNoCombinator);\n while ((res = sep.exec(selector)) !== null) {\n var /** @type {?} */ separator = res[1];\n var /** @type {?} */ part = selector.slice(startIndex, res.index).trim();\n // if a selector appears before :host-context it should not be shimmed as it\n // matches on ancestor elements and not on elements in the host's shadow\n var /** @type {?} */ scopedPart = startIndex >= scopeAfter ? _scopeSelectorPart(part) : part;\n scopedSelector += scopedPart + \" \" + separator + \" \";\n startIndex = sep.lastIndex;\n }\n scopedSelector += _scopeSelectorPart(selector.substring(startIndex));\n // replace the placeholders with their original values\n return safeContent.restore(scopedSelector);\n };\n /**\n * @param {?} selector\n * @return {?}\n */\n ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {\n return selector.replace(_colonHostContextRe, _polyfillHostContext)\n .replace(_colonHostRe, _polyfillHost);\n };\n return ShadowCss;\n }());\n var SafeSelector = (function () {\n /**\n * @param {?} selector\n */\n function SafeSelector(selector) {\n var _this = this;\n this.placeholders = [];\n this.index = 0;\n // Replaces attribute selectors with placeholders.\n // The WS in [attr=\"va lue\"] would otherwise be interpreted as a selector separator.\n selector = selector.replace(/(\\[[^\\]]*\\])/g, function (_, keep) {\n var replaceBy = \"__ph-\" + _this.index + \"__\";\n _this.placeholders.push(keep);\n _this.index++;\n return replaceBy;\n });\n // Replaces the expression in `:nth-child(2n + 1)` with a placeholder.\n // WS and \"+\" would otherwise be interpreted as selector separators.\n this._content = selector.replace(/(:nth-[-\\w]+)(\\([^)]+\\))/g, function (_, pseudo, exp) {\n var replaceBy = \"__ph-\" + _this.index + \"__\";\n _this.placeholders.push(exp);\n _this.index++;\n return pseudo + replaceBy;\n });\n }\n ;\n /**\n * @param {?} content\n * @return {?}\n */\n SafeSelector.prototype.restore = function (content) {\n var _this = this;\n return content.replace(/__ph-(\\d+)__/g, function (ph, index) { return _this.placeholders[+index]; });\n };\n /**\n * @return {?}\n */\n SafeSelector.prototype.content = function () { return this._content; };\n return SafeSelector;\n }());\n var /** @type {?} */ _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\\s]*?(['\"])(.*?)\\1[;\\s]*}([^{]*?){/gim;\n var /** @type {?} */ _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\\s]*(['\"])(.*?)\\3)[;\\s]*[^}]*}/gim;\n var /** @type {?} */ _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\\s]*(['\"])(.*?)\\3)[;\\s]*[^}]*}/gim;\n var /** @type {?} */ _polyfillHost = '-shadowcsshost';\n // note: :host-context pre-processed to -shadowcsshostcontext.\n var /** @type {?} */ _polyfillHostContext = '-shadowcsscontext';\n var /** @type {?} */ _parenSuffix = ')(?:\\\\((' +\n '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n ')\\\\))?([^,{]*)';\n var /** @type {?} */ _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim');\n var /** @type {?} */ _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim');\n var /** @type {?} */ _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';\n var /** @type {?} */ _polyfillHostNoCombinatorRe = /-shadowcsshost-no-combinator([^\\s]*)/;\n var /** @type {?} */ _shadowDOMSelectorsRe = [\n /::shadow/g,\n /::content/g,\n // Deprecated selectors\n /\\/shadow-deep\\//g,\n /\\/shadow\\//g,\n ];\n var /** @type {?} */ _shadowDeepSelectors = /(?:>>>)|(?:\\/deep\\/)/g;\n var /** @type {?} */ _selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$';\n var /** @type {?} */ _polyfillHostRe = /-shadowcsshost/gim;\n var /** @type {?} */ _colonHostRe = /:host/gim;\n var /** @type {?} */ _colonHostContextRe = /:host-context/gim;\n var /** @type {?} */ _commentRe = /\\/\\*\\s*[\\s\\S]*?\\*\\//g;\n /**\n * @param {?} input\n * @return {?}\n */\n function stripComments(input) {\n return input.replace(_commentRe, '');\n }\n // all comments except inline source mapping\n var /** @type {?} */ _sourceMappingUrlRe = /\\/\\*\\s*#\\s*sourceMappingURL=[\\s\\S]+?\\*\\//;\n /**\n * @param {?} input\n * @return {?}\n */\n function extractSourceMappingUrl(input) {\n var /** @type {?} */ matcher = input.match(_sourceMappingUrlRe);\n return matcher ? matcher[0] : '';\n }\n var /** @type {?} */ _ruleRe = /(\\s*)([^;\\{\\}]+?)(\\s*)((?:{%BLOCK%}?\\s*;?)|(?:\\s*;))/g;\n var /** @type {?} */ _curlyRe = /([{}])/g;\n var /** @type {?} */ OPEN_CURLY = '{';\n var /** @type {?} */ CLOSE_CURLY = '}';\n var /** @type {?} */ BLOCK_PLACEHOLDER = '%BLOCK%';\n var CssRule = (function () {\n /**\n * @param {?} selector\n * @param {?} content\n */\n function CssRule(selector, content) {\n this.selector = selector;\n this.content = content;\n }\n return CssRule;\n }());\n /**\n * @param {?} input\n * @param {?} ruleCallback\n * @return {?}\n */\n function processRules(input, ruleCallback) {\n var /** @type {?} */ inputWithEscapedBlocks = escapeBlocks(input);\n var /** @type {?} */ nextBlockIndex = 0;\n return inputWithEscapedBlocks.escapedString.replace(_ruleRe, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ selector = m[2];\n var /** @type {?} */ content = '';\n var /** @type {?} */ suffix = m[4];\n var /** @type {?} */ contentPrefix = '';\n if (suffix && suffix.startsWith('{' + BLOCK_PLACEHOLDER)) {\n content = inputWithEscapedBlocks.blocks[nextBlockIndex++];\n suffix = suffix.substring(BLOCK_PLACEHOLDER.length + 1);\n contentPrefix = '{';\n }\n var /** @type {?} */ rule = ruleCallback(new CssRule(selector, content));\n return \"\" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;\n });\n }\n var StringWithEscapedBlocks = (function () {\n /**\n * @param {?} escapedString\n * @param {?} blocks\n */\n function StringWithEscapedBlocks(escapedString, blocks) {\n this.escapedString = escapedString;\n this.blocks = blocks;\n }\n return StringWithEscapedBlocks;\n }());\n /**\n * @param {?} input\n * @return {?}\n */\n function escapeBlocks(input) {\n var /** @type {?} */ inputParts = input.split(_curlyRe);\n var /** @type {?} */ resultParts = [];\n var /** @type {?} */ escapedBlocks = [];\n var /** @type {?} */ bracketCount = 0;\n var /** @type {?} */ currentBlockParts = [];\n for (var /** @type {?} */ partIndex = 0; partIndex < inputParts.length; partIndex++) {\n var /** @type {?} */ part = inputParts[partIndex];\n if (part == CLOSE_CURLY) {\n bracketCount--;\n }\n if (bracketCount > 0) {\n currentBlockParts.push(part);\n }\n else {\n if (currentBlockParts.length > 0) {\n escapedBlocks.push(currentBlockParts.join(''));\n resultParts.push(BLOCK_PLACEHOLDER);\n currentBlockParts = [];\n }\n resultParts.push(part);\n }\n if (part == OPEN_CURLY) {\n bracketCount++;\n }\n }\n if (currentBlockParts.length > 0) {\n escapedBlocks.push(currentBlockParts.join(''));\n resultParts.push(BLOCK_PLACEHOLDER);\n }\n return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$15 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$15 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var /** @type {?} */ COMPONENT_VARIABLE = '%COMP%';\n var /** @type {?} */ HOST_ATTR = \"_nghost-\" + COMPONENT_VARIABLE;\n var /** @type {?} */ CONTENT_ATTR = \"_ngcontent-\" + COMPONENT_VARIABLE;\n var StylesCompileDependency = (function () {\n /**\n * @param {?} name\n * @param {?} moduleUrl\n * @param {?} isShimmed\n * @param {?} valuePlaceholder\n */\n function StylesCompileDependency(name, moduleUrl, isShimmed, valuePlaceholder) {\n this.name = name;\n this.moduleUrl = moduleUrl;\n this.isShimmed = isShimmed;\n this.valuePlaceholder = valuePlaceholder;\n }\n return StylesCompileDependency;\n }());\n var StylesCompileResult = (function () {\n /**\n * @param {?} componentStylesheet\n * @param {?} externalStylesheets\n */\n function StylesCompileResult(componentStylesheet, externalStylesheets) {\n this.componentStylesheet = componentStylesheet;\n this.externalStylesheets = externalStylesheets;\n }\n return StylesCompileResult;\n }());\n var CompiledStylesheet = (function () {\n /**\n * @param {?} statements\n * @param {?} stylesVar\n * @param {?} dependencies\n * @param {?} isShimmed\n * @param {?} meta\n */\n function CompiledStylesheet(statements, stylesVar, dependencies, isShimmed, meta) {\n this.statements = statements;\n this.stylesVar = stylesVar;\n this.dependencies = dependencies;\n this.isShimmed = isShimmed;\n this.meta = meta;\n }\n return CompiledStylesheet;\n }());\n var StyleCompiler = (function () {\n /**\n * @param {?} _urlResolver\n */\n function StyleCompiler(_urlResolver) {\n this._urlResolver = _urlResolver;\n this._shadowCss = new ShadowCss();\n }\n /**\n * @param {?} comp\n * @return {?}\n */\n StyleCompiler.prototype.compileComponent = function (comp) {\n var _this = this;\n var /** @type {?} */ externalStylesheets = [];\n var /** @type {?} */ componentStylesheet = this._compileStyles(comp, new CompileStylesheetMetadata({\n styles: comp.template.styles,\n styleUrls: comp.template.styleUrls,\n moduleUrl: identifierModuleUrl(comp.type)\n }), true);\n comp.template.externalStylesheets.forEach(function (stylesheetMeta) {\n var /** @type {?} */ compiledStylesheet = _this._compileStyles(comp, stylesheetMeta, false);\n externalStylesheets.push(compiledStylesheet);\n });\n return new StylesCompileResult(componentStylesheet, externalStylesheets);\n };\n /**\n * @param {?} comp\n * @param {?} stylesheet\n * @param {?} isComponentStylesheet\n * @return {?}\n */\n StyleCompiler.prototype._compileStyles = function (comp, stylesheet, isComponentStylesheet) {\n var _this = this;\n var /** @type {?} */ shim = comp.template.encapsulation === _angular_core.ViewEncapsulation.Emulated;\n var /** @type {?} */ styleExpressions = stylesheet.styles.map(function (plainStyle) { return literal(_this._shimIfNeeded(plainStyle, shim)); });\n var /** @type {?} */ dependencies = [];\n for (var /** @type {?} */ i = 0; i < stylesheet.styleUrls.length; i++) {\n var /** @type {?} */ identifier = { reference: null };\n dependencies.push(new StylesCompileDependency(getStylesVarName(null), stylesheet.styleUrls[i], shim, identifier));\n styleExpressions.push(new ExternalExpr(identifier));\n }\n // styles variable contains plain strings and arrays of other styles arrays (recursive),\n // so we set its type to dynamic.\n var /** @type {?} */ stylesVar = getStylesVarName(isComponentStylesheet ? comp : null);\n var /** @type {?} */ stmt = variable(stylesVar)\n .set(literalArr(styleExpressions, new ArrayType(DYNAMIC_TYPE, [TypeModifier.Const])))\n .toDeclStmt(null, [StmtModifier.Final]);\n return new CompiledStylesheet([stmt], stylesVar, dependencies, shim, stylesheet);\n };\n /**\n * @param {?} style\n * @param {?} shim\n * @return {?}\n */\n StyleCompiler.prototype._shimIfNeeded = function (style, shim) {\n return shim ? this._shadowCss.shimCssText(style, CONTENT_ATTR, HOST_ATTR) : style;\n };\n StyleCompiler = __decorate$15([\n CompilerInjectable(), \n __metadata$15('design:paramtypes', [UrlResolver])\n ], StyleCompiler);\n return StyleCompiler;\n }());\n /**\n * @param {?} component\n * @return {?}\n */\n function getStylesVarName(component) {\n var /** @type {?} */ result = \"styles\";\n if (component) {\n result += \"_\" + identifierName(component.type);\n }\n return result;\n }\n\n var _DebugState = (function () {\n /**\n * @param {?} nodeIndex\n * @param {?} sourceAst\n */\n function _DebugState(nodeIndex, sourceAst) {\n this.nodeIndex = nodeIndex;\n this.sourceAst = sourceAst;\n }\n return _DebugState;\n }());\n var /** @type {?} */ NULL_DEBUG_STATE = new _DebugState(null, null);\n var CompileMethod = (function () {\n /**\n * @param {?} _view\n */\n function CompileMethod(_view) {\n this._view = _view;\n this._newState = NULL_DEBUG_STATE;\n this._currState = NULL_DEBUG_STATE;\n this._bodyStatements = [];\n this._debugEnabled = this._view.genConfig.genDebugInfo;\n }\n /**\n * @return {?}\n */\n CompileMethod.prototype._updateDebugContextIfNeeded = function () {\n if (this._newState.nodeIndex !== this._currState.nodeIndex ||\n this._newState.sourceAst !== this._currState.sourceAst) {\n var /** @type {?} */ expr = this._updateDebugContext(this._newState);\n if (isPresent(expr)) {\n this._bodyStatements.push(expr.toStmt());\n }\n }\n };\n /**\n * @param {?} newState\n * @return {?}\n */\n CompileMethod.prototype._updateDebugContext = function (newState) {\n this._currState = this._newState = newState;\n if (this._debugEnabled) {\n var /** @type {?} */ sourceLocation = isPresent(newState.sourceAst) ? newState.sourceAst.sourceSpan.start : null;\n return THIS_EXPR.callMethod('debug', [\n literal(newState.nodeIndex),\n isPresent(sourceLocation) ? literal(sourceLocation.line) : NULL_EXPR,\n isPresent(sourceLocation) ? literal(sourceLocation.col) : NULL_EXPR\n ]);\n }\n else {\n return null;\n }\n };\n /**\n * @param {?} nodeIndex\n * @param {?} templateAst\n * @return {?}\n */\n CompileMethod.prototype.resetDebugInfoExpr = function (nodeIndex, templateAst) {\n var /** @type {?} */ res = this._updateDebugContext(new _DebugState(nodeIndex, templateAst));\n return res || NULL_EXPR;\n };\n /**\n * @param {?} nodeIndex\n * @param {?} templateAst\n * @return {?}\n */\n CompileMethod.prototype.resetDebugInfo = function (nodeIndex, templateAst) {\n this._newState = new _DebugState(nodeIndex, templateAst);\n };\n /**\n * @param {...?} stmts\n * @return {?}\n */\n CompileMethod.prototype.push = function () {\n var stmts = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n stmts[_i - 0] = arguments[_i];\n }\n this.addStmts(stmts);\n };\n /**\n * @param {?} stmt\n * @return {?}\n */\n CompileMethod.prototype.addStmt = function (stmt) {\n this._updateDebugContextIfNeeded();\n this._bodyStatements.push(stmt);\n };\n /**\n * @param {?} stmts\n * @return {?}\n */\n CompileMethod.prototype.addStmts = function (stmts) {\n this._updateDebugContextIfNeeded();\n (_a = this._bodyStatements).push.apply(_a, stmts);\n var _a;\n };\n /**\n * @return {?}\n */\n CompileMethod.prototype.finish = function () { return this._bodyStatements; };\n /**\n * @return {?}\n */\n CompileMethod.prototype.isEmpty = function () { return this._bodyStatements.length === 0; };\n return CompileMethod;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$22 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @param {?} property\n * @param {?} callingView\n * @param {?} definedView\n * @return {?}\n */\n function getPropertyInView(property, callingView, definedView) {\n if (callingView === definedView) {\n return property;\n }\n else {\n var /** @type {?} */ viewProp = THIS_EXPR;\n var /** @type {?} */ currView = callingView;\n while (currView !== definedView && isPresent(currView.declarationElement.view)) {\n currView = currView.declarationElement.view;\n viewProp = viewProp.prop('parentView');\n }\n if (currView !== definedView) {\n throw new Error(\"Internal error: Could not calculate a property in a parent view: \" + property);\n }\n return property.visitExpression(new _ReplaceViewTransformer(viewProp, definedView), null);\n }\n }\n var _ReplaceViewTransformer = (function (_super) {\n __extends$22(_ReplaceViewTransformer, _super);\n /**\n * @param {?} _viewExpr\n * @param {?} _view\n */\n function _ReplaceViewTransformer(_viewExpr, _view) {\n _super.call(this);\n this._viewExpr = _viewExpr;\n this._view = _view;\n }\n /**\n * @param {?} expr\n * @return {?}\n */\n _ReplaceViewTransformer.prototype._isThis = function (expr) {\n return expr instanceof ReadVarExpr && expr.builtin === BuiltinVar.This;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _ReplaceViewTransformer.prototype.visitReadVarExpr = function (ast, context) {\n return this._isThis(ast) ? this._viewExpr : ast;\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _ReplaceViewTransformer.prototype.visitReadPropExpr = function (ast, context) {\n if (this._isThis(ast.receiver)) {\n // Note: Don't cast for members of the AppView base class...\n if (this._view.fields.some(function (field) { return field.name == ast.name; }) ||\n this._view.getters.some(function (field) { return field.name == ast.name; })) {\n return this._viewExpr.cast(this._view.classType).prop(ast.name);\n }\n }\n return _super.prototype.visitReadPropExpr.call(this, ast, context);\n };\n return _ReplaceViewTransformer;\n }(ExpressionTransformer));\n /**\n * @param {?} view\n * @param {?} token\n * @param {?} optional\n * @return {?}\n */\n function injectFromViewParentInjector(view, token, optional) {\n var /** @type {?} */ viewExpr;\n if (view.viewType === ViewType.HOST) {\n viewExpr = THIS_EXPR;\n }\n else {\n viewExpr = THIS_EXPR.prop('parentView');\n }\n var /** @type {?} */ args = [createDiTokenExpression(token), THIS_EXPR.prop('parentIndex')];\n if (optional) {\n args.push(NULL_EXPR);\n }\n return viewExpr.callMethod('injectorGet', args);\n }\n /**\n * @param {?} component\n * @param {?} embeddedTemplateIndex\n * @return {?}\n */\n function getViewClassName(component, embeddedTemplateIndex) {\n return \"View_\" + identifierName(component.type) + embeddedTemplateIndex;\n }\n /**\n * @param {?} elementIndex\n * @return {?}\n */\n function getHandleEventMethodName(elementIndex) {\n return \"handleEvent_\" + elementIndex;\n }\n\n var ViewQueryValues = (function () {\n /**\n * @param {?} view\n * @param {?} values\n */\n function ViewQueryValues(view, values) {\n this.view = view;\n this.values = values;\n }\n return ViewQueryValues;\n }());\n var CompileQuery = (function () {\n /**\n * @param {?} meta\n * @param {?} queryList\n * @param {?} ownerDirectiveExpression\n * @param {?} view\n */\n function CompileQuery(meta, queryList, ownerDirectiveExpression, view) {\n this.meta = meta;\n this.queryList = queryList;\n this.ownerDirectiveExpression = ownerDirectiveExpression;\n this.view = view;\n this._values = new ViewQueryValues(view, []);\n }\n /**\n * @param {?} value\n * @param {?} view\n * @return {?}\n */\n CompileQuery.prototype.addValue = function (value, view) {\n var /** @type {?} */ currentView = view;\n var /** @type {?} */ elPath = [];\n while (isPresent(currentView) && currentView !== this.view) {\n var /** @type {?} */ parentEl = currentView.declarationElement;\n elPath.unshift(parentEl);\n currentView = parentEl.view;\n }\n var /** @type {?} */ queryListForDirtyExpr = getPropertyInView(this.queryList, view, this.view);\n var /** @type {?} */ viewValues = this._values;\n elPath.forEach(function (el) {\n var /** @type {?} */ last = viewValues.values.length > 0 ? viewValues.values[viewValues.values.length - 1] : null;\n if (last instanceof ViewQueryValues && last.view === el.embeddedView) {\n viewValues = last;\n }\n else {\n var /** @type {?} */ newViewValues = new ViewQueryValues(el.embeddedView, []);\n viewValues.values.push(newViewValues);\n viewValues = newViewValues;\n }\n });\n viewValues.values.push(value);\n if (elPath.length > 0) {\n view.dirtyParentQueriesMethod.addStmt(queryListForDirtyExpr.callMethod('setDirty', []).toStmt());\n }\n };\n /**\n * @return {?}\n */\n CompileQuery.prototype._isStatic = function () {\n return !this._values.values.some(function (value) { return value instanceof ViewQueryValues; });\n };\n /**\n * @param {?} targetStaticMethod\n * @param {?} targetDynamicMethod\n * @return {?}\n */\n CompileQuery.prototype.afterChildren = function (targetStaticMethod, targetDynamicMethod) {\n var /** @type {?} */ values = createQueryValues(this._values);\n var /** @type {?} */ updateStmts = [this.queryList.callMethod('reset', [literalArr(values)]).toStmt()];\n if (isPresent(this.ownerDirectiveExpression)) {\n var /** @type {?} */ valueExpr = this.meta.first ? this.queryList.prop('first') : this.queryList;\n updateStmts.push(this.ownerDirectiveExpression.prop(this.meta.propertyName).set(valueExpr).toStmt());\n }\n if (!this.meta.first) {\n updateStmts.push(this.queryList.callMethod('notifyOnChanges', []).toStmt());\n }\n if (this.meta.first && this._isStatic()) {\n // for queries that don't change and the user asked for a single element,\n // set it immediately. That is e.g. needed for querying for ViewContainerRefs, ...\n // we don't do this for QueryLists for now as this would break the timing when\n // we call QueryList listeners...\n targetStaticMethod.addStmts(updateStmts);\n }\n else {\n targetDynamicMethod.addStmt(new IfStmt(this.queryList.prop('dirty'), updateStmts));\n }\n };\n return CompileQuery;\n }());\n /**\n * @param {?} viewValues\n * @return {?}\n */\n function createQueryValues(viewValues) {\n return ListWrapper.flatten(viewValues.values.map(function (entry) {\n if (entry instanceof ViewQueryValues) {\n return mapNestedViews(entry.view.declarationElement.viewContainer, entry.view, createQueryValues(entry));\n }\n else {\n return (entry);\n }\n }));\n }\n /**\n * @param {?} viewContainer\n * @param {?} view\n * @param {?} expressions\n * @return {?}\n */\n function mapNestedViews(viewContainer, view, expressions) {\n var /** @type {?} */ adjustedExpressions = expressions.map(function (expr) { return replaceVarInExpression(THIS_EXPR.name, variable('nestedView'), expr); });\n return viewContainer.callMethod('mapNestedViews', [\n variable(view.className),\n fn([new FnParam('nestedView', view.classType)], [new ReturnStatement(literalArr(adjustedExpressions))], DYNAMIC_TYPE)\n ]);\n }\n /**\n * @param {?} query\n * @param {?} directiveInstance\n * @param {?} propertyName\n * @param {?} compileView\n * @return {?}\n */\n function createQueryList(query, directiveInstance, propertyName, compileView) {\n compileView.fields.push(new ClassField(propertyName, importType(createIdentifier(Identifiers.QueryList), [DYNAMIC_TYPE])));\n var /** @type {?} */ expr = THIS_EXPR.prop(propertyName);\n compileView.createMethod.addStmt(THIS_EXPR.prop(propertyName)\n .set(importExpr(createIdentifier(Identifiers.QueryList), [DYNAMIC_TYPE]).instantiate([]))\n .toStmt());\n return expr;\n }\n /**\n * @param {?} map\n * @param {?} query\n * @return {?}\n */\n function addQueryToTokenMap(map, query) {\n query.meta.selectors.forEach(function (selector) {\n var /** @type {?} */ entry = map.get(tokenReference(selector));\n if (!entry) {\n entry = [];\n map.set(tokenReference(selector), entry);\n }\n entry.push(query);\n });\n }\n\n var ViewTypeEnum = (function () {\n function ViewTypeEnum() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n ViewTypeEnum.fromValue = function (value) {\n return createEnumExpression(Identifiers.ViewType, value);\n };\n return ViewTypeEnum;\n }());\n var ViewEncapsulationEnum = (function () {\n function ViewEncapsulationEnum() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n ViewEncapsulationEnum.fromValue = function (value) {\n return createEnumExpression(Identifiers.ViewEncapsulation, value);\n };\n return ViewEncapsulationEnum;\n }());\n var ChangeDetectorStatusEnum = (function () {\n function ChangeDetectorStatusEnum() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n ChangeDetectorStatusEnum.fromValue = function (value) {\n return createEnumExpression(Identifiers.ChangeDetectorStatus, value);\n };\n return ChangeDetectorStatusEnum;\n }());\n var ViewConstructorVars = (function () {\n function ViewConstructorVars() {\n }\n ViewConstructorVars.viewUtils = variable('viewUtils');\n ViewConstructorVars.parentView = variable('parentView');\n ViewConstructorVars.parentIndex = variable('parentIndex');\n ViewConstructorVars.parentElement = variable('parentElement');\n return ViewConstructorVars;\n }());\n var ViewProperties = (function () {\n function ViewProperties() {\n }\n ViewProperties.renderer = THIS_EXPR.prop('renderer');\n ViewProperties.viewUtils = THIS_EXPR.prop('viewUtils');\n return ViewProperties;\n }());\n var InjectMethodVars$1 = (function () {\n function InjectMethodVars() {\n }\n InjectMethodVars.token = variable('token');\n InjectMethodVars.requestNodeIndex = variable('requestNodeIndex');\n InjectMethodVars.notFoundResult = variable('notFoundResult');\n return InjectMethodVars;\n }());\n var DetectChangesVars = (function () {\n function DetectChangesVars() {\n }\n DetectChangesVars.throwOnChange = variable(\"throwOnChange\");\n DetectChangesVars.changes = variable(\"changes\");\n DetectChangesVars.changed = variable(\"changed\");\n return DetectChangesVars;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var ViewClassDependency = (function () {\n /**\n * @param {?} comp\n * @param {?} name\n * @param {?} placeholder\n */\n function ViewClassDependency(comp, name, placeholder) {\n this.comp = comp;\n this.name = name;\n this.placeholder = placeholder;\n }\n return ViewClassDependency;\n }());\n var ComponentFactoryDependency$1 = (function () {\n /**\n * @param {?} comp\n * @param {?} placeholder\n */\n function ComponentFactoryDependency(comp, placeholder) {\n this.comp = comp;\n this.placeholder = placeholder;\n }\n return ComponentFactoryDependency;\n }());\n var DirectiveWrapperDependency = (function () {\n /**\n * @param {?} dir\n * @param {?} name\n * @param {?} placeholder\n */\n function DirectiveWrapperDependency(dir, name, placeholder) {\n this.dir = dir;\n this.name = name;\n this.placeholder = placeholder;\n }\n return DirectiveWrapperDependency;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$21 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var CompileNode = (function () {\n /**\n * @param {?} parent\n * @param {?} view\n * @param {?} nodeIndex\n * @param {?} renderNode\n * @param {?} sourceAst\n */\n function CompileNode(parent, view, nodeIndex, renderNode, sourceAst) {\n this.parent = parent;\n this.view = view;\n this.nodeIndex = nodeIndex;\n this.renderNode = renderNode;\n this.sourceAst = sourceAst;\n }\n /**\n * @return {?}\n */\n CompileNode.prototype.isNull = function () { return !this.renderNode; };\n /**\n * @return {?}\n */\n CompileNode.prototype.isRootElement = function () { return this.view != this.parent.view; };\n return CompileNode;\n }());\n var CompileElement = (function (_super) {\n __extends$21(CompileElement, _super);\n /**\n * @param {?} parent\n * @param {?} view\n * @param {?} nodeIndex\n * @param {?} renderNode\n * @param {?} sourceAst\n * @param {?} component\n * @param {?} _directives\n * @param {?} _resolvedProvidersArray\n * @param {?} hasViewContainer\n * @param {?} hasEmbeddedView\n * @param {?} references\n */\n function CompileElement(parent, view, nodeIndex, renderNode, sourceAst, component, _directives, _resolvedProvidersArray, hasViewContainer, hasEmbeddedView, references) {\n var _this = this;\n _super.call(this, parent, view, nodeIndex, renderNode, sourceAst);\n this.component = component;\n this._directives = _directives;\n this._resolvedProvidersArray = _resolvedProvidersArray;\n this.hasViewContainer = hasViewContainer;\n this.hasEmbeddedView = hasEmbeddedView;\n this.compViewExpr = null;\n this.instances = new Map();\n this.directiveWrapperInstance = new Map();\n this._queryCount = 0;\n this._queries = new Map();\n this.contentNodesByNgContentIndex = null;\n this.referenceTokens = {};\n references.forEach(function (ref) { return _this.referenceTokens[ref.name] = ref.value; });\n this.elementRef =\n importExpr(createIdentifier(Identifiers.ElementRef)).instantiate([this.renderNode]);\n this.instances.set(resolveIdentifier(Identifiers.ElementRef), this.elementRef);\n this.instances.set(resolveIdentifier(Identifiers.Injector), THIS_EXPR.callMethod('injector', [literal(this.nodeIndex)]));\n this.instances.set(resolveIdentifier(Identifiers.Renderer), THIS_EXPR.prop('renderer'));\n if (this.hasViewContainer || this.hasEmbeddedView) {\n this._createViewContainer();\n }\n if (this.component) {\n this._createComponentFactoryResolver();\n }\n }\n /**\n * @return {?}\n */\n CompileElement.createNull = function () {\n return new CompileElement(null, null, null, null, null, null, [], [], false, false, []);\n };\n /**\n * @return {?}\n */\n CompileElement.prototype._createViewContainer = function () {\n var /** @type {?} */ fieldName = \"_vc_\" + this.nodeIndex;\n var /** @type {?} */ parentNodeIndex = this.isRootElement() ? null : this.parent.nodeIndex;\n // private is fine here as no child view will reference a ViewContainer\n this.view.fields.push(new ClassField(fieldName, importType(createIdentifier(Identifiers.ViewContainer)), [StmtModifier.Private]));\n var /** @type {?} */ statement = THIS_EXPR.prop(fieldName)\n .set(importExpr(createIdentifier(Identifiers.ViewContainer)).instantiate([\n literal(this.nodeIndex), literal(parentNodeIndex), THIS_EXPR, this.renderNode\n ]))\n .toStmt();\n this.view.createMethod.addStmt(statement);\n this.viewContainer = THIS_EXPR.prop(fieldName);\n this.instances.set(resolveIdentifier(Identifiers.ViewContainer), this.viewContainer);\n this.view.viewContainers.push(this.viewContainer);\n };\n /**\n * @return {?}\n */\n CompileElement.prototype._createComponentFactoryResolver = function () {\n var _this = this;\n var /** @type {?} */ entryComponents = this.component.entryComponents.map(function (entryComponent) {\n var /** @type {?} */ id = { reference: null };\n _this.view.targetDependencies.push(new ComponentFactoryDependency$1(entryComponent, id));\n return id;\n });\n if (!entryComponents || entryComponents.length === 0) {\n return;\n }\n var /** @type {?} */ createComponentFactoryResolverExpr = importExpr(createIdentifier(Identifiers.CodegenComponentFactoryResolver)).instantiate([\n literalArr(entryComponents.map(function (entryComponent) { return importExpr(entryComponent); })),\n injectFromViewParentInjector(this.view, createIdentifierToken(Identifiers.ComponentFactoryResolver), false)\n ]);\n var /** @type {?} */ provider = {\n token: createIdentifierToken(Identifiers.ComponentFactoryResolver),\n useValue: createComponentFactoryResolverExpr\n };\n // Add ComponentFactoryResolver as first provider as it does not have deps on other providers\n // ProviderAstType.PrivateService as only the component and its view can see it,\n // but nobody else\n this._resolvedProvidersArray.unshift(new ProviderAst(provider.token, false, true, [provider], ProviderAstType.PrivateService, [], this.sourceAst.sourceSpan));\n };\n /**\n * @param {?} compViewExpr\n * @return {?}\n */\n CompileElement.prototype.setComponentView = function (compViewExpr) {\n this.compViewExpr = compViewExpr;\n this.contentNodesByNgContentIndex =\n new Array(this.component.template.ngContentSelectors.length);\n for (var /** @type {?} */ i = 0; i < this.contentNodesByNgContentIndex.length; i++) {\n this.contentNodesByNgContentIndex[i] = [];\n }\n };\n /**\n * @param {?} embeddedView\n * @return {?}\n */\n CompileElement.prototype.setEmbeddedView = function (embeddedView) {\n this.embeddedView = embeddedView;\n if (isPresent(embeddedView)) {\n var /** @type {?} */ createTemplateRefExpr = importExpr(createIdentifier(Identifiers.TemplateRef_)).instantiate([\n THIS_EXPR, literal(this.nodeIndex), this.renderNode\n ]);\n var /** @type {?} */ provider = {\n token: createIdentifierToken(Identifiers.TemplateRef),\n useValue: createTemplateRefExpr\n };\n // Add TemplateRef as first provider as it does not have deps on other providers\n this._resolvedProvidersArray.unshift(new ProviderAst(provider.token, false, true, [provider], ProviderAstType.Builtin, [], this.sourceAst.sourceSpan));\n }\n };\n /**\n * @return {?}\n */\n CompileElement.prototype.beforeChildren = function () {\n var _this = this;\n if (this.hasViewContainer) {\n this.instances.set(resolveIdentifier(Identifiers.ViewContainerRef), this.viewContainer.prop('vcRef'));\n }\n this._resolvedProviders = new Map();\n this._resolvedProvidersArray.forEach(function (provider) { return _this._resolvedProviders.set(tokenReference(provider.token), provider); });\n // create all the provider instances, some in the view constructor,\n // some as getters. We rely on the fact that they are already sorted topologically.\n Array.from(this._resolvedProviders.values()).forEach(function (resolvedProvider) {\n var /** @type {?} */ isDirectiveWrapper = resolvedProvider.providerType === ProviderAstType.Component ||\n resolvedProvider.providerType === ProviderAstType.Directive;\n var /** @type {?} */ providerValueExpressions = resolvedProvider.providers.map(function (provider) {\n if (provider.useExisting) {\n return _this._getDependency(resolvedProvider.providerType, { token: provider.useExisting });\n }\n else if (provider.useFactory) {\n var /** @type {?} */ deps = provider.deps || provider.useFactory.diDeps;\n var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep); });\n return importExpr(provider.useFactory).callFn(depsExpr);\n }\n else if (provider.useClass) {\n var /** @type {?} */ deps = provider.deps || provider.useClass.diDeps;\n var /** @type {?} */ depsExpr = deps.map(function (dep) { return _this._getDependency(resolvedProvider.providerType, dep); });\n if (isDirectiveWrapper) {\n var /** @type {?} */ directiveWrapperIdentifier = { reference: null };\n _this.view.targetDependencies.push(new DirectiveWrapperDependency(provider.useClass, DirectiveWrapperCompiler.dirWrapperClassName(provider.useClass), directiveWrapperIdentifier));\n return DirectiveWrapperExpressions.create(directiveWrapperIdentifier, depsExpr);\n }\n else {\n return importExpr(provider.useClass)\n .instantiate(depsExpr, importType(provider.useClass));\n }\n }\n else {\n return convertValueToOutputAst(provider.useValue);\n }\n });\n var /** @type {?} */ propName = \"_\" + tokenName(resolvedProvider.token) + \"_\" + _this.nodeIndex + \"_\" + _this.instances.size;\n var /** @type {?} */ instance = createProviderProperty(propName, resolvedProvider, providerValueExpressions, resolvedProvider.multiProvider, resolvedProvider.eager, _this);\n if (isDirectiveWrapper) {\n _this.directiveWrapperInstance.set(tokenReference(resolvedProvider.token), instance);\n _this.instances.set(tokenReference(resolvedProvider.token), DirectiveWrapperExpressions.context(instance));\n }\n else {\n _this.instances.set(tokenReference(resolvedProvider.token), instance);\n }\n });\n var _loop_1 = function(i) {\n var /** @type {?} */ directive = this_1._directives[i];\n var /** @type {?} */ directiveInstance = this_1.instances.get(tokenReference(identifierToken(directive.type)));\n directive.queries.forEach(function (queryMeta) { _this._addQuery(queryMeta, directiveInstance); });\n };\n var this_1 = this;\n for (var /** @type {?} */ i = 0; i < this._directives.length; i++) {\n _loop_1(i);\n }\n var /** @type {?} */ queriesWithReads = [];\n Array.from(this._resolvedProviders.values()).forEach(function (resolvedProvider) {\n var /** @type {?} */ queriesForProvider = _this._getQueriesFor(resolvedProvider.token);\n queriesWithReads.push.apply(queriesWithReads, queriesForProvider.map(function (query) { return new _QueryWithRead(query, resolvedProvider.token); }));\n });\n Object.keys(this.referenceTokens).forEach(function (varName) {\n var /** @type {?} */ token = _this.referenceTokens[varName];\n var /** @type {?} */ varValue;\n if (token) {\n varValue = _this.instances.get(tokenReference(token));\n }\n else {\n varValue = _this.renderNode;\n }\n _this.view.locals.set(varName, varValue);\n var /** @type {?} */ varToken = { value: varName };\n queriesWithReads.push.apply(queriesWithReads, _this._getQueriesFor(varToken).map(function (query) { return new _QueryWithRead(query, varToken); }));\n });\n queriesWithReads.forEach(function (queryWithRead) {\n var /** @type {?} */ value;\n if (isPresent(queryWithRead.read.identifier)) {\n // query for an identifier\n value = _this.instances.get(tokenReference(queryWithRead.read));\n }\n else {\n // query for a reference\n var /** @type {?} */ token = _this.referenceTokens[queryWithRead.read.value];\n if (isPresent(token)) {\n value = _this.instances.get(tokenReference(token));\n }\n else {\n value = _this.elementRef;\n }\n }\n if (isPresent(value)) {\n queryWithRead.query.addValue(value, _this.view);\n }\n });\n };\n /**\n * @param {?} childNodeCount\n * @return {?}\n */\n CompileElement.prototype.afterChildren = function (childNodeCount) {\n var _this = this;\n Array.from(this._resolvedProviders.values()).forEach(function (resolvedProvider) {\n // Note: afterChildren is called after recursing into children.\n // This is good so that an injector match in an element that is closer to a requesting element\n // matches first.\n var /** @type {?} */ providerExpr = _this.instances.get(tokenReference(resolvedProvider.token));\n // Note: view providers are only visible on the injector of that element.\n // This is not fully correct as the rules during codegen don't allow a directive\n // to get hold of a view provdier on the same element. We still do this semantic\n // as it simplifies our model to having only one runtime injector per element.\n var /** @type {?} */ providerChildNodeCount = resolvedProvider.providerType === ProviderAstType.PrivateService ? 0 : childNodeCount;\n _this.view.injectorGetMethod.addStmt(createInjectInternalCondition(_this.nodeIndex, providerChildNodeCount, resolvedProvider, providerExpr));\n });\n Array.from(this._queries.values())\n .forEach(function (queries) { return queries.forEach(function (q) {\n return q.afterChildren(_this.view.createMethod, _this.view.updateContentQueriesMethod);\n }); });\n };\n /**\n * @param {?} ngContentIndex\n * @param {?} nodeExpr\n * @return {?}\n */\n CompileElement.prototype.addContentNode = function (ngContentIndex, nodeExpr) {\n this.contentNodesByNgContentIndex[ngContentIndex].push(nodeExpr);\n };\n /**\n * @return {?}\n */\n CompileElement.prototype.getComponent = function () {\n return isPresent(this.component) ?\n this.instances.get(tokenReference(identifierToken(this.component.type))) :\n null;\n };\n /**\n * @return {?}\n */\n CompileElement.prototype.getProviderTokens = function () {\n return Array.from(this._resolvedProviders.values())\n .map(function (resolvedProvider) { return createDiTokenExpression(resolvedProvider.token); });\n };\n /**\n * @param {?} token\n * @return {?}\n */\n CompileElement.prototype._getQueriesFor = function (token) {\n var /** @type {?} */ result = [];\n var /** @type {?} */ currentEl = this;\n var /** @type {?} */ distance = 0;\n var /** @type {?} */ queries;\n while (!currentEl.isNull()) {\n queries = currentEl._queries.get(tokenReference(token));\n if (isPresent(queries)) {\n result.push.apply(result, queries.filter(function (query) { return query.meta.descendants || distance <= 1; }));\n }\n if (currentEl._directives.length > 0) {\n distance++;\n }\n currentEl = currentEl.parent;\n }\n queries = this.view.componentView.viewQueries.get(tokenReference(token));\n if (isPresent(queries)) {\n result.push.apply(result, queries);\n }\n return result;\n };\n /**\n * @param {?} queryMeta\n * @param {?} directiveInstance\n * @return {?}\n */\n CompileElement.prototype._addQuery = function (queryMeta, directiveInstance) {\n var /** @type {?} */ propName = \"_query_\" + tokenName(queryMeta.selectors[0]) + \"_\" + this.nodeIndex + \"_\" + this._queryCount++;\n var /** @type {?} */ queryList = createQueryList(queryMeta, directiveInstance, propName, this.view);\n var /** @type {?} */ query = new CompileQuery(queryMeta, queryList, directiveInstance, this.view);\n addQueryToTokenMap(this._queries, query);\n return query;\n };\n /**\n * @param {?} requestingProviderType\n * @param {?} dep\n * @return {?}\n */\n CompileElement.prototype._getLocalDependency = function (requestingProviderType, dep) {\n var /** @type {?} */ result = null;\n if (isPresent(dep.token)) {\n // access builtins with special visibility\n if (!result) {\n if (tokenReference(dep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef)) {\n if (requestingProviderType === ProviderAstType.Component) {\n return this.compViewExpr.prop('ref');\n }\n else {\n return getPropertyInView(THIS_EXPR.prop('ref'), this.view, this.view.componentView);\n }\n }\n }\n // access regular providers on the element\n if (!result) {\n var /** @type {?} */ resolvedProvider = this._resolvedProviders.get(tokenReference(dep.token));\n // don't allow directives / public services to access private services.\n // only components and private services can access private services.\n if (resolvedProvider && (requestingProviderType === ProviderAstType.Directive ||\n requestingProviderType === ProviderAstType.PublicService) &&\n resolvedProvider.providerType === ProviderAstType.PrivateService) {\n return null;\n }\n result = this.instances.get(tokenReference(dep.token));\n }\n }\n return result;\n };\n /**\n * @param {?} requestingProviderType\n * @param {?} dep\n * @return {?}\n */\n CompileElement.prototype._getDependency = function (requestingProviderType, dep) {\n var /** @type {?} */ currElement = this;\n var /** @type {?} */ result = null;\n if (dep.isValue) {\n result = literal(dep.value);\n }\n if (!result && !dep.isSkipSelf) {\n result = this._getLocalDependency(requestingProviderType, dep);\n }\n // check parent elements\n while (!result && !currElement.parent.isNull()) {\n currElement = currElement.parent;\n result = currElement._getLocalDependency(ProviderAstType.PublicService, { token: dep.token });\n }\n if (!result) {\n result = injectFromViewParentInjector(this.view, dep.token, dep.isOptional);\n }\n if (!result) {\n result = NULL_EXPR;\n }\n return getPropertyInView(result, this.view, currElement.view);\n };\n return CompileElement;\n }(CompileNode));\n /**\n * @param {?} nodeIndex\n * @param {?} childNodeCount\n * @param {?} provider\n * @param {?} providerExpr\n * @return {?}\n */\n function createInjectInternalCondition(nodeIndex, childNodeCount, provider, providerExpr) {\n var /** @type {?} */ indexCondition;\n if (childNodeCount > 0) {\n indexCondition = literal(nodeIndex)\n .lowerEquals(InjectMethodVars$1.requestNodeIndex)\n .and(InjectMethodVars$1.requestNodeIndex.lowerEquals(literal(nodeIndex + childNodeCount)));\n }\n else {\n indexCondition = literal(nodeIndex).identical(InjectMethodVars$1.requestNodeIndex);\n }\n return new IfStmt(InjectMethodVars$1.token.identical(createDiTokenExpression(provider.token)).and(indexCondition), [new ReturnStatement(providerExpr)]);\n }\n /**\n * @param {?} propName\n * @param {?} provider\n * @param {?} providerValueExpressions\n * @param {?} isMulti\n * @param {?} isEager\n * @param {?} compileElement\n * @return {?}\n */\n function createProviderProperty(propName, provider, providerValueExpressions, isMulti, isEager, compileElement) {\n var /** @type {?} */ view = compileElement.view;\n var /** @type {?} */ resolvedProviderValueExpr;\n var /** @type {?} */ type;\n if (isMulti) {\n resolvedProviderValueExpr = literalArr(providerValueExpressions);\n type = new ArrayType(DYNAMIC_TYPE);\n }\n else {\n resolvedProviderValueExpr = providerValueExpressions[0];\n type = providerValueExpressions[0].type;\n }\n if (!type) {\n type = DYNAMIC_TYPE;\n }\n if (isEager) {\n view.fields.push(new ClassField(propName, type));\n view.createMethod.addStmt(THIS_EXPR.prop(propName).set(resolvedProviderValueExpr).toStmt());\n }\n else {\n var /** @type {?} */ internalField = \"_\" + propName;\n view.fields.push(new ClassField(internalField, type));\n var /** @type {?} */ getter = new CompileMethod(view);\n getter.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n // Note: Equals is important for JS so that it also checks the undefined case!\n getter.addStmt(new IfStmt(THIS_EXPR.prop(internalField).isBlank(), [THIS_EXPR.prop(internalField).set(resolvedProviderValueExpr).toStmt()]));\n getter.addStmt(new ReturnStatement(THIS_EXPR.prop(internalField)));\n view.getters.push(new ClassGetter(propName, getter.finish(), type));\n }\n return THIS_EXPR.prop(propName);\n }\n var _QueryWithRead = (function () {\n /**\n * @param {?} query\n * @param {?} match\n */\n function _QueryWithRead(query, match) {\n this.query = query;\n this.read = query.meta.read || match;\n }\n return _QueryWithRead;\n }());\n\n var CompilePipe = (function () {\n /**\n * @param {?} view\n * @param {?} meta\n */\n function CompilePipe(view, meta) {\n var _this = this;\n this.view = view;\n this.meta = meta;\n this._purePipeProxyCount = 0;\n this.instance = THIS_EXPR.prop(\"_pipe_\" + meta.name + \"_\" + view.pipeCount++);\n var deps = this.meta.type.diDeps.map(function (diDep) {\n if (tokenReference(diDep.token) === resolveIdentifier(Identifiers.ChangeDetectorRef)) {\n return getPropertyInView(THIS_EXPR.prop('ref'), _this.view, _this.view.componentView);\n }\n return injectFromViewParentInjector(view, diDep.token, false);\n });\n this.view.fields.push(new ClassField(this.instance.name, importType(this.meta.type)));\n this.view.createMethod.resetDebugInfo(null, null);\n this.view.createMethod.addStmt(THIS_EXPR.prop(this.instance.name)\n .set(importExpr(this.meta.type).instantiate(deps))\n .toStmt());\n }\n /**\n * @param {?} view\n * @param {?} name\n * @param {?} args\n * @return {?}\n */\n CompilePipe.call = function (view, name, args) {\n var /** @type {?} */ compView = view.componentView;\n var /** @type {?} */ meta = _findPipeMeta(compView, name);\n var /** @type {?} */ pipe;\n if (meta.pure) {\n // pure pipes live on the component view\n pipe = compView.purePipes.get(name);\n if (!pipe) {\n pipe = new CompilePipe(compView, meta);\n compView.purePipes.set(name, pipe);\n compView.pipes.push(pipe);\n }\n }\n else {\n // Non pure pipes live on the view that called it\n pipe = new CompilePipe(view, meta);\n view.pipes.push(pipe);\n }\n return pipe._call(view, args);\n };\n Object.defineProperty(CompilePipe.prototype, \"pure\", {\n /**\n * @return {?}\n */\n get: function () { return this.meta.pure; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} callingView\n * @param {?} args\n * @return {?}\n */\n CompilePipe.prototype._call = function (callingView, args) {\n if (this.meta.pure) {\n // PurePipeProxies live on the view that called them.\n var /** @type {?} */ purePipeProxyInstance = THIS_EXPR.prop(this.instance.name + \"_\" + this._purePipeProxyCount++);\n var /** @type {?} */ pipeInstanceSeenFromPureProxy = getPropertyInView(this.instance, callingView, this.view);\n createPureProxy(pipeInstanceSeenFromPureProxy.prop('transform')\n .callMethod(BuiltinMethod.Bind, [pipeInstanceSeenFromPureProxy]), args.length, purePipeProxyInstance, { fields: callingView.fields, ctorStmts: callingView.createMethod });\n return importExpr(createIdentifier(Identifiers.castByValue))\n .callFn([purePipeProxyInstance, pipeInstanceSeenFromPureProxy.prop('transform')])\n .callFn(args);\n }\n else {\n return getPropertyInView(this.instance, callingView, this.view).callMethod('transform', args);\n }\n };\n return CompilePipe;\n }());\n /**\n * @param {?} view\n * @param {?} name\n * @return {?}\n */\n function _findPipeMeta(view, name) {\n var /** @type {?} */ pipeMeta = null;\n for (var /** @type {?} */ i = view.pipeMetas.length - 1; i >= 0; i--) {\n var /** @type {?} */ localPipeMeta = view.pipeMetas[i];\n if (localPipeMeta.name == name) {\n pipeMeta = localPipeMeta;\n break;\n }\n }\n if (!pipeMeta) {\n throw new Error(\"Illegal state: Could not find pipe \" + name + \" although the parser should have detected this error!\");\n }\n return pipeMeta;\n }\n\n var CompileViewRootNodeType = {};\n CompileViewRootNodeType.Node = 0;\n CompileViewRootNodeType.ViewContainer = 1;\n CompileViewRootNodeType.NgContent = 2;\n CompileViewRootNodeType[CompileViewRootNodeType.Node] = \"Node\";\n CompileViewRootNodeType[CompileViewRootNodeType.ViewContainer] = \"ViewContainer\";\n CompileViewRootNodeType[CompileViewRootNodeType.NgContent] = \"NgContent\";\n var CompileViewRootNode = (function () {\n /**\n * @param {?} type\n * @param {?} expr\n * @param {?=} ngContentIndex\n */\n function CompileViewRootNode(type, expr, ngContentIndex) {\n this.type = type;\n this.expr = expr;\n this.ngContentIndex = ngContentIndex;\n }\n return CompileViewRootNode;\n }());\n var CompileView = (function () {\n /**\n * @param {?} component\n * @param {?} genConfig\n * @param {?} pipeMetas\n * @param {?} styles\n * @param {?} animations\n * @param {?} viewIndex\n * @param {?} declarationElement\n * @param {?} templateVariableBindings\n * @param {?} targetDependencies\n */\n function CompileView(component, genConfig, pipeMetas, styles, animations, viewIndex, declarationElement, templateVariableBindings, targetDependencies) {\n var _this = this;\n this.component = component;\n this.genConfig = genConfig;\n this.pipeMetas = pipeMetas;\n this.styles = styles;\n this.animations = animations;\n this.viewIndex = viewIndex;\n this.declarationElement = declarationElement;\n this.templateVariableBindings = templateVariableBindings;\n this.targetDependencies = targetDependencies;\n this.viewChildren = [];\n this.nodes = [];\n this.rootNodes = [];\n this.lastRenderNode = NULL_EXPR;\n this.viewContainers = [];\n this.methods = [];\n this.ctorStmts = [];\n this.fields = [];\n this.getters = [];\n this.disposables = [];\n this.purePipes = new Map();\n this.pipes = [];\n this.locals = new Map();\n this.literalArrayCount = 0;\n this.literalMapCount = 0;\n this.pipeCount = 0;\n this.createMethod = new CompileMethod(this);\n this.animationBindingsMethod = new CompileMethod(this);\n this.injectorGetMethod = new CompileMethod(this);\n this.updateContentQueriesMethod = new CompileMethod(this);\n this.dirtyParentQueriesMethod = new CompileMethod(this);\n this.updateViewQueriesMethod = new CompileMethod(this);\n this.detectChangesInInputsMethod = new CompileMethod(this);\n this.detectChangesRenderPropertiesMethod = new CompileMethod(this);\n this.afterContentLifecycleCallbacksMethod = new CompileMethod(this);\n this.afterViewLifecycleCallbacksMethod = new CompileMethod(this);\n this.destroyMethod = new CompileMethod(this);\n this.detachMethod = new CompileMethod(this);\n this.viewType = getViewType(component, viewIndex);\n this.className = getViewClassName(component, viewIndex);\n this.classType = expressionType(variable(this.className));\n this.classExpr = variable(this.className);\n if (this.viewType === ViewType.COMPONENT || this.viewType === ViewType.HOST) {\n this.componentView = this;\n }\n else {\n this.componentView = this.declarationElement.view.componentView;\n }\n this.componentContext =\n getPropertyInView(THIS_EXPR.prop('context'), this, this.componentView);\n var viewQueries = new Map();\n if (this.viewType === ViewType.COMPONENT) {\n var directiveInstance_1 = THIS_EXPR.prop('context');\n this.component.viewQueries.forEach(function (queryMeta, queryIndex) {\n var propName = \"_viewQuery_\" + tokenName(queryMeta.selectors[0]) + \"_\" + queryIndex;\n var queryList = createQueryList(queryMeta, directiveInstance_1, propName, _this);\n var query = new CompileQuery(queryMeta, queryList, directiveInstance_1, _this);\n addQueryToTokenMap(viewQueries, query);\n });\n }\n this.viewQueries = viewQueries;\n templateVariableBindings.forEach(function (entry) { _this.locals.set(entry[1], THIS_EXPR.prop('context').prop(entry[0])); });\n if (!this.declarationElement.isNull()) {\n this.declarationElement.setEmbeddedView(this);\n }\n }\n /**\n * @param {?} name\n * @param {?} input\n * @param {?} args\n * @return {?}\n */\n CompileView.prototype.callPipe = function (name, input, args) {\n return CompilePipe.call(this, name, [input].concat(args));\n };\n /**\n * @param {?} name\n * @return {?}\n */\n CompileView.prototype.getLocal = function (name) {\n if (name == EventHandlerVars.event.name) {\n return EventHandlerVars.event;\n }\n var /** @type {?} */ currView = this;\n var /** @type {?} */ result = currView.locals.get(name);\n while (!result && isPresent(currView.declarationElement.view)) {\n currView = currView.declarationElement.view;\n result = currView.locals.get(name);\n }\n if (isPresent(result)) {\n return getPropertyInView(result, this, currView);\n }\n else {\n return null;\n }\n };\n /**\n * @return {?}\n */\n CompileView.prototype.afterNodes = function () {\n var _this = this;\n Array.from(this.viewQueries.values())\n .forEach(function (queries) { return queries.forEach(function (q) { return q.afterChildren(_this.createMethod, _this.updateViewQueriesMethod); }); });\n };\n return CompileView;\n }());\n /**\n * @param {?} component\n * @param {?} embeddedTemplateIndex\n * @return {?}\n */\n function getViewType(component, embeddedTemplateIndex) {\n if (embeddedTemplateIndex > 0) {\n return ViewType.EMBEDDED;\n }\n if (component.isHost) {\n return ViewType.HOST;\n }\n return ViewType.COMPONENT;\n }\n\n /**\n * @param {?} boundEvents\n * @param {?} directives\n * @param {?} compileElement\n * @param {?} bindToRenderer\n * @return {?}\n */\n function bindOutputs(boundEvents, directives, compileElement, bindToRenderer) {\n var /** @type {?} */ usedEvents = collectEvents(boundEvents, directives);\n if (!usedEvents.size) {\n return false;\n }\n if (bindToRenderer) {\n subscribeToRenderEvents(usedEvents, compileElement);\n }\n subscribeToDirectiveEvents(usedEvents, directives, compileElement);\n generateHandleEventMethod(boundEvents, directives, compileElement);\n return true;\n }\n /**\n * @param {?} boundEvents\n * @param {?} directives\n * @return {?}\n */\n function collectEvents(boundEvents, directives) {\n var /** @type {?} */ usedEvents = new Map();\n boundEvents.forEach(function (event) { usedEvents.set(event.fullName, event); });\n directives.forEach(function (dirAst) {\n dirAst.hostEvents.forEach(function (event) { usedEvents.set(event.fullName, event); });\n });\n return usedEvents;\n }\n /**\n * @param {?} usedEvents\n * @param {?} compileElement\n * @return {?}\n */\n function subscribeToRenderEvents(usedEvents, compileElement) {\n var /** @type {?} */ eventAndTargetExprs = [];\n usedEvents.forEach(function (event) {\n if (!event.phase) {\n eventAndTargetExprs.push(literal(event.name), literal(event.target));\n }\n });\n if (eventAndTargetExprs.length) {\n var /** @type {?} */ disposableVar = variable(\"disposable_\" + compileElement.view.disposables.length);\n compileElement.view.disposables.push(disposableVar);\n compileElement.view.createMethod.addStmt(disposableVar\n .set(importExpr(createIdentifier(Identifiers.subscribeToRenderElement)).callFn([\n THIS_EXPR, compileElement.renderNode, createInlineArray(eventAndTargetExprs),\n handleEventExpr(compileElement)\n ]))\n .toDeclStmt(FUNCTION_TYPE, [StmtModifier.Private]));\n }\n }\n /**\n * @param {?} usedEvents\n * @param {?} directives\n * @param {?} compileElement\n * @return {?}\n */\n function subscribeToDirectiveEvents(usedEvents, directives, compileElement) {\n var /** @type {?} */ usedEventNames = Array.from(usedEvents.keys());\n directives.forEach(function (dirAst) {\n var /** @type {?} */ dirWrapper = compileElement.directiveWrapperInstance.get(dirAst.directive.type.reference);\n compileElement.view.createMethod.addStmts(DirectiveWrapperExpressions.subscribe(dirAst.directive, dirAst.hostProperties, usedEventNames, dirWrapper, THIS_EXPR, handleEventExpr(compileElement)));\n });\n }\n /**\n * @param {?} boundEvents\n * @param {?} directives\n * @param {?} compileElement\n * @return {?}\n */\n function generateHandleEventMethod(boundEvents, directives, compileElement) {\n var /** @type {?} */ hasComponentHostListener = directives.some(function (dirAst) { return dirAst.hostEvents.some(function (event) { return dirAst.directive.isComponent; }); });\n var /** @type {?} */ markPathToRootStart = hasComponentHostListener ? compileElement.compViewExpr : THIS_EXPR;\n var /** @type {?} */ handleEventStmts = new CompileMethod(compileElement.view);\n handleEventStmts.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n handleEventStmts.push(markPathToRootStart.callMethod('markPathToRootAsCheckOnce', []).toStmt());\n var /** @type {?} */ eventNameVar = variable('eventName');\n var /** @type {?} */ resultVar = variable('result');\n handleEventStmts.push(resultVar.set(literal(true)).toDeclStmt(BOOL_TYPE));\n directives.forEach(function (dirAst, dirIdx) {\n var /** @type {?} */ dirWrapper = compileElement.directiveWrapperInstance.get(dirAst.directive.type.reference);\n if (dirAst.hostEvents.length > 0) {\n handleEventStmts.push(resultVar\n .set(DirectiveWrapperExpressions\n .handleEvent(dirAst.hostEvents, dirWrapper, eventNameVar, EventHandlerVars.event)\n .and(resultVar))\n .toStmt());\n }\n });\n boundEvents.forEach(function (renderEvent, renderEventIdx) {\n var /** @type {?} */ evalResult = convertActionBinding(compileElement.view, compileElement.view, compileElement.view.componentContext, renderEvent.handler, \"sub_\" + renderEventIdx);\n var /** @type {?} */ trueStmts = evalResult.stmts;\n if (evalResult.preventDefault) {\n trueStmts.push(resultVar.set(evalResult.preventDefault.and(resultVar)).toStmt());\n }\n // TODO(tbosch): convert this into a `switch` once our OutputAst supports it.\n handleEventStmts.push(new IfStmt(eventNameVar.equals(literal(renderEvent.fullName)), trueStmts));\n });\n handleEventStmts.push(new ReturnStatement(resultVar));\n compileElement.view.methods.push(new ClassMethod(getHandleEventMethodName(compileElement.nodeIndex), [\n new FnParam(eventNameVar.name, STRING_TYPE),\n new FnParam(EventHandlerVars.event.name, DYNAMIC_TYPE)\n ], handleEventStmts.finish(), BOOL_TYPE));\n }\n /**\n * @param {?} compileElement\n * @return {?}\n */\n function handleEventExpr(compileElement) {\n var /** @type {?} */ handleEventMethodName = getHandleEventMethodName(compileElement.nodeIndex);\n return THIS_EXPR.callMethod('eventHandler', [THIS_EXPR.prop(handleEventMethodName)]);\n }\n\n var /** @type {?} */ STATE_IS_NEVER_CHECKED = THIS_EXPR.prop('numberOfChecks').identical(new LiteralExpr(0));\n var /** @type {?} */ NOT_THROW_ON_CHANGES = not(DetectChangesVars.throwOnChange);\n /**\n * @param {?} directiveMeta\n * @param {?} directiveInstance\n * @param {?} compileElement\n * @return {?}\n */\n function bindDirectiveAfterContentLifecycleCallbacks(directiveMeta, directiveInstance, compileElement) {\n var /** @type {?} */ view = compileElement.view;\n var /** @type {?} */ lifecycleHooks = directiveMeta.type.lifecycleHooks;\n var /** @type {?} */ afterContentLifecycleCallbacksMethod = view.afterContentLifecycleCallbacksMethod;\n afterContentLifecycleCallbacksMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n if (lifecycleHooks.indexOf(LifecycleHooks.AfterContentInit) !== -1) {\n afterContentLifecycleCallbacksMethod.addStmt(new IfStmt(STATE_IS_NEVER_CHECKED, [directiveInstance.callMethod('ngAfterContentInit', []).toStmt()]));\n }\n if (lifecycleHooks.indexOf(LifecycleHooks.AfterContentChecked) !== -1) {\n afterContentLifecycleCallbacksMethod.addStmt(directiveInstance.callMethod('ngAfterContentChecked', []).toStmt());\n }\n }\n /**\n * @param {?} directiveMeta\n * @param {?} directiveInstance\n * @param {?} compileElement\n * @return {?}\n */\n function bindDirectiveAfterViewLifecycleCallbacks(directiveMeta, directiveInstance, compileElement) {\n var /** @type {?} */ view = compileElement.view;\n var /** @type {?} */ lifecycleHooks = directiveMeta.type.lifecycleHooks;\n var /** @type {?} */ afterViewLifecycleCallbacksMethod = view.afterViewLifecycleCallbacksMethod;\n afterViewLifecycleCallbacksMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n if (lifecycleHooks.indexOf(LifecycleHooks.AfterViewInit) !== -1) {\n afterViewLifecycleCallbacksMethod.addStmt(new IfStmt(STATE_IS_NEVER_CHECKED, [directiveInstance.callMethod('ngAfterViewInit', []).toStmt()]));\n }\n if (lifecycleHooks.indexOf(LifecycleHooks.AfterViewChecked) !== -1) {\n afterViewLifecycleCallbacksMethod.addStmt(directiveInstance.callMethod('ngAfterViewChecked', []).toStmt());\n }\n }\n /**\n * @param {?} dir\n * @param {?} directiveWrapperIntance\n * @param {?} compileElement\n * @return {?}\n */\n function bindDirectiveWrapperLifecycleCallbacks(dir, directiveWrapperIntance, compileElement) {\n compileElement.view.destroyMethod.addStmts(DirectiveWrapperExpressions.ngOnDestroy(dir.directive, directiveWrapperIntance));\n compileElement.view.detachMethod.addStmts(DirectiveWrapperExpressions.ngOnDetach(dir.hostProperties, directiveWrapperIntance, THIS_EXPR, compileElement.compViewExpr || THIS_EXPR, compileElement.renderNode));\n }\n /**\n * @param {?} provider\n * @param {?} providerInstance\n * @param {?} compileElement\n * @return {?}\n */\n function bindInjectableDestroyLifecycleCallbacks(provider, providerInstance, compileElement) {\n var /** @type {?} */ onDestroyMethod = compileElement.view.destroyMethod;\n onDestroyMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n if (provider.providerType !== ProviderAstType.Directive &&\n provider.providerType !== ProviderAstType.Component &&\n provider.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n onDestroyMethod.addStmt(providerInstance.callMethod('ngOnDestroy', []).toStmt());\n }\n }\n /**\n * @param {?} pipeMeta\n * @param {?} pipeInstance\n * @param {?} view\n * @return {?}\n */\n function bindPipeDestroyLifecycleCallbacks(pipeMeta, pipeInstance, view) {\n var /** @type {?} */ onDestroyMethod = view.destroyMethod;\n if (pipeMeta.type.lifecycleHooks.indexOf(LifecycleHooks.OnDestroy) !== -1) {\n onDestroyMethod.addStmt(pipeInstance.callMethod('ngOnDestroy', []).toStmt());\n }\n }\n\n /**\n * @param {?} boundText\n * @param {?} compileNode\n * @param {?} view\n * @return {?}\n */\n function bindRenderText(boundText, compileNode, view) {\n var /** @type {?} */ valueField = createCheckBindingField(view);\n var /** @type {?} */ evalResult = convertPropertyBinding(view, view, view.componentContext, boundText.value, valueField.bindingId);\n if (!evalResult) {\n return null;\n }\n view.detectChangesRenderPropertiesMethod.resetDebugInfo(compileNode.nodeIndex, boundText);\n view.detectChangesRenderPropertiesMethod.addStmts(createCheckBindingStmt(evalResult, valueField.expression, DetectChangesVars.throwOnChange, [THIS_EXPR.prop('renderer')\n .callMethod('setText', [compileNode.renderNode, evalResult.currValExpr])\n .toStmt()]));\n }\n /**\n * @param {?} boundProps\n * @param {?} boundOutputs\n * @param {?} hasEvents\n * @param {?} compileElement\n * @return {?}\n */\n function bindRenderInputs(boundProps, boundOutputs, hasEvents, compileElement) {\n var /** @type {?} */ view = compileElement.view;\n var /** @type {?} */ renderNode = compileElement.renderNode;\n boundProps.forEach(function (boundProp) {\n var /** @type {?} */ bindingField = createCheckBindingField(view);\n view.detectChangesRenderPropertiesMethod.resetDebugInfo(compileElement.nodeIndex, boundProp);\n var /** @type {?} */ evalResult = convertPropertyBinding(view, view, compileElement.view.componentContext, boundProp.value, bindingField.bindingId);\n if (!evalResult) {\n return;\n }\n var /** @type {?} */ checkBindingStmts = [];\n var /** @type {?} */ compileMethod = view.detectChangesRenderPropertiesMethod;\n switch (boundProp.type) {\n case PropertyBindingType.Property:\n case PropertyBindingType.Attribute:\n case PropertyBindingType.Class:\n case PropertyBindingType.Style:\n checkBindingStmts.push.apply(checkBindingStmts, writeToRenderer(THIS_EXPR, boundProp, renderNode, evalResult.currValExpr, view.genConfig.logBindingUpdate));\n break;\n case PropertyBindingType.Animation:\n compileMethod = view.animationBindingsMethod;\n var _a = triggerAnimation(THIS_EXPR, THIS_EXPR, boundProp, boundOutputs, (hasEvents ? THIS_EXPR.prop(getHandleEventMethodName(compileElement.nodeIndex)) :\n importExpr(createIdentifier(Identifiers.noop)))\n .callMethod(BuiltinMethod.Bind, [THIS_EXPR]), compileElement.renderNode, evalResult.currValExpr, bindingField.expression), updateStmts = _a.updateStmts, detachStmts = _a.detachStmts;\n checkBindingStmts.push.apply(checkBindingStmts, updateStmts);\n view.detachMethod.addStmts(detachStmts);\n break;\n }\n compileMethod.addStmts(createCheckBindingStmt(evalResult, bindingField.expression, DetectChangesVars.throwOnChange, checkBindingStmts));\n });\n }\n /**\n * @param {?} directiveAst\n * @param {?} directiveWrapperInstance\n * @param {?} compileElement\n * @param {?} elementName\n * @param {?} schemaRegistry\n * @return {?}\n */\n function bindDirectiveHostProps(directiveAst, directiveWrapperInstance, compileElement, elementName, schemaRegistry) {\n // We need to provide the SecurityContext for properties that could need sanitization.\n var /** @type {?} */ runtimeSecurityCtxExprs = directiveAst.hostProperties.filter(function (boundProp) { return boundProp.needsRuntimeSecurityContext; })\n .map(function (boundProp) {\n var /** @type {?} */ ctx;\n switch (boundProp.type) {\n case PropertyBindingType.Property:\n ctx = schemaRegistry.securityContext(elementName, boundProp.name, false);\n break;\n case PropertyBindingType.Attribute:\n ctx = schemaRegistry.securityContext(elementName, boundProp.name, true);\n break;\n default:\n throw new Error(\"Illegal state: Only property / attribute bindings can have an unknown security context! Binding \" + boundProp.name);\n }\n return createEnumExpression(Identifiers.SecurityContext, ctx);\n });\n compileElement.view.detectChangesRenderPropertiesMethod.addStmts(DirectiveWrapperExpressions.checkHost(directiveAst.hostProperties, directiveWrapperInstance, THIS_EXPR, compileElement.compViewExpr || THIS_EXPR, compileElement.renderNode, DetectChangesVars.throwOnChange, runtimeSecurityCtxExprs));\n }\n /**\n * @param {?} directiveAst\n * @param {?} directiveWrapperInstance\n * @param {?} dirIndex\n * @param {?} compileElement\n * @return {?}\n */\n function bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement) {\n var /** @type {?} */ view = compileElement.view;\n var /** @type {?} */ detectChangesInInputsMethod = view.detectChangesInInputsMethod;\n detectChangesInInputsMethod.resetDebugInfo(compileElement.nodeIndex, compileElement.sourceAst);\n directiveAst.inputs.forEach(function (input, inputIdx) {\n // Note: We can't use `fields.length` here, as we are not adding a field!\n var /** @type {?} */ bindingId = compileElement.nodeIndex + \"_\" + dirIndex + \"_\" + inputIdx;\n detectChangesInInputsMethod.resetDebugInfo(compileElement.nodeIndex, input);\n var /** @type {?} */ evalResult = convertPropertyBinding(view, view, view.componentContext, input.value, bindingId);\n if (!evalResult) {\n return;\n }\n detectChangesInInputsMethod.addStmts(evalResult.stmts);\n detectChangesInInputsMethod.addStmt(directiveWrapperInstance\n .callMethod(\"check_\" + input.directiveName, [\n evalResult.currValExpr, DetectChangesVars.throwOnChange,\n evalResult.forceUpdate || literal(false)\n ])\n .toStmt());\n });\n var /** @type {?} */ isOnPushComp = directiveAst.directive.isComponent &&\n !isDefaultChangeDetectionStrategy(directiveAst.directive.changeDetection);\n var /** @type {?} */ directiveDetectChangesExpr = DirectiveWrapperExpressions.ngDoCheck(directiveWrapperInstance, THIS_EXPR, compileElement.renderNode, DetectChangesVars.throwOnChange);\n var /** @type {?} */ directiveDetectChangesStmt = isOnPushComp ?\n new IfStmt(directiveDetectChangesExpr, [compileElement.compViewExpr.callMethod('markAsCheckOnce', []).toStmt()]) :\n directiveDetectChangesExpr.toStmt();\n detectChangesInInputsMethod.addStmt(directiveDetectChangesStmt);\n }\n\n /**\n * @param {?} view\n * @param {?} parsedTemplate\n * @param {?} schemaRegistry\n * @return {?}\n */\n function bindView(view, parsedTemplate, schemaRegistry) {\n var /** @type {?} */ visitor = new ViewBinderVisitor(view, schemaRegistry);\n templateVisitAll(visitor, parsedTemplate);\n view.pipes.forEach(function (pipe) { bindPipeDestroyLifecycleCallbacks(pipe.meta, pipe.instance, pipe.view); });\n }\n var ViewBinderVisitor = (function () {\n /**\n * @param {?} view\n * @param {?} _schemaRegistry\n */\n function ViewBinderVisitor(view, _schemaRegistry) {\n this.view = view;\n this._schemaRegistry = _schemaRegistry;\n this._nodeIndex = 0;\n }\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitBoundText = function (ast, parent) {\n var /** @type {?} */ node = this.view.nodes[this._nodeIndex++];\n bindRenderText(ast, node, this.view);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitText = function (ast, parent) {\n this._nodeIndex++;\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitNgContent = function (ast, parent) { return null; };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitElement = function (ast, parent) {\n var _this = this;\n var /** @type {?} */ compileElement = (this.view.nodes[this._nodeIndex++]);\n var /** @type {?} */ hasEvents = bindOutputs(ast.outputs, ast.directives, compileElement, true);\n bindRenderInputs(ast.inputs, ast.outputs, hasEvents, compileElement);\n ast.directives.forEach(function (directiveAst, dirIndex) {\n var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement);\n bindDirectiveHostProps(directiveAst, directiveWrapperInstance, compileElement, ast.name, _this._schemaRegistry);\n });\n templateVisitAll(this, ast.children, compileElement);\n // afterContent and afterView lifecycles need to be called bottom up\n // so that children are notified before parents\n ast.directives.forEach(function (directiveAst) {\n var /** @type {?} */ directiveInstance = compileElement.instances.get(directiveAst.directive.type.reference);\n var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n bindDirectiveAfterContentLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n bindDirectiveAfterViewLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n bindDirectiveWrapperLifecycleCallbacks(directiveAst, directiveWrapperInstance, compileElement);\n });\n ast.providers.forEach(function (providerAst) {\n var /** @type {?} */ providerInstance = compileElement.instances.get(tokenReference(providerAst.token));\n bindInjectableDestroyLifecycleCallbacks(providerAst, providerInstance, compileElement);\n });\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitEmbeddedTemplate = function (ast, parent) {\n var /** @type {?} */ compileElement = (this.view.nodes[this._nodeIndex++]);\n bindOutputs(ast.outputs, ast.directives, compileElement, false);\n ast.directives.forEach(function (directiveAst, dirIndex) {\n var /** @type {?} */ directiveInstance = compileElement.instances.get(directiveAst.directive.type.reference);\n var /** @type {?} */ directiveWrapperInstance = compileElement.directiveWrapperInstance.get(directiveAst.directive.type.reference);\n bindDirectiveInputs(directiveAst, directiveWrapperInstance, dirIndex, compileElement);\n bindDirectiveAfterContentLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n bindDirectiveAfterViewLifecycleCallbacks(directiveAst.directive, directiveInstance, compileElement);\n bindDirectiveWrapperLifecycleCallbacks(directiveAst, directiveWrapperInstance, compileElement);\n });\n ast.providers.forEach(function (providerAst) {\n var /** @type {?} */ providerInstance = compileElement.instances.get(tokenReference(providerAst.token));\n bindInjectableDestroyLifecycleCallbacks(providerAst, providerInstance, compileElement);\n });\n bindView(compileElement.embeddedView, ast.children, this._schemaRegistry);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitAttr = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitDirective = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} eventTargetAndNames\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitReference = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ViewBinderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };\n return ViewBinderVisitor;\n }());\n\n var /** @type {?} */ IMPLICIT_TEMPLATE_VAR = '\\$implicit';\n var /** @type {?} */ CLASS_ATTR$1 = 'class';\n var /** @type {?} */ STYLE_ATTR = 'style';\n var /** @type {?} */ NG_CONTAINER_TAG = 'ng-container';\n var /** @type {?} */ parentRenderNodeVar = variable('parentRenderNode');\n var /** @type {?} */ rootSelectorVar = variable('rootSelector');\n /**\n * @param {?} view\n * @param {?} template\n * @param {?} targetDependencies\n * @return {?}\n */\n function buildView(view, template, targetDependencies) {\n var /** @type {?} */ builderVisitor = new ViewBuilderVisitor(view, targetDependencies);\n var /** @type {?} */ parentEl = view.declarationElement.isNull() ? view.declarationElement : view.declarationElement.parent;\n templateVisitAll(builderVisitor, template, parentEl);\n if (view.viewType === ViewType.EMBEDDED || view.viewType === ViewType.HOST) {\n view.lastRenderNode = builderVisitor.getOrCreateLastRenderNode();\n }\n return builderVisitor.nestedViewCount;\n }\n /**\n * @param {?} view\n * @param {?} targetStatements\n * @return {?}\n */\n function finishView(view, targetStatements) {\n view.afterNodes();\n createViewTopLevelStmts(view, targetStatements);\n view.nodes.forEach(function (node) {\n if (node instanceof CompileElement && node.hasEmbeddedView) {\n finishView(node.embeddedView, targetStatements);\n }\n });\n }\n var ViewBuilderVisitor = (function () {\n /**\n * @param {?} view\n * @param {?} targetDependencies\n */\n function ViewBuilderVisitor(view, targetDependencies) {\n this.view = view;\n this.targetDependencies = targetDependencies;\n this.nestedViewCount = 0;\n }\n /**\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype._isRootNode = function (parent) { return parent.view !== this.view; };\n /**\n * @param {?} node\n * @return {?}\n */\n ViewBuilderVisitor.prototype._addRootNodeAndProject = function (node) {\n var /** @type {?} */ projectedNode = _getOuterContainerOrSelf(node);\n var /** @type {?} */ parent = projectedNode.parent;\n var /** @type {?} */ ngContentIndex = ((projectedNode.sourceAst)).ngContentIndex;\n var /** @type {?} */ viewContainer = (node instanceof CompileElement && node.hasViewContainer) ? node.viewContainer : null;\n if (this._isRootNode(parent)) {\n if (this.view.viewType !== ViewType.COMPONENT) {\n this.view.rootNodes.push(new CompileViewRootNode(viewContainer ? CompileViewRootNodeType.ViewContainer : CompileViewRootNodeType.Node, viewContainer || node.renderNode));\n }\n }\n else if (isPresent(parent.component) && isPresent(ngContentIndex)) {\n parent.addContentNode(ngContentIndex, new CompileViewRootNode(viewContainer ? CompileViewRootNodeType.ViewContainer : CompileViewRootNodeType.Node, viewContainer || node.renderNode));\n }\n };\n /**\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype._getParentRenderNode = function (parent) {\n parent = _getOuterContainerParentOrSelf(parent);\n if (this._isRootNode(parent)) {\n if (this.view.viewType === ViewType.COMPONENT) {\n return parentRenderNodeVar;\n }\n else {\n // root node of an embedded/host view\n return NULL_EXPR;\n }\n }\n else {\n return isPresent(parent.component) &&\n parent.component.template.encapsulation !== _angular_core.ViewEncapsulation.Native ?\n NULL_EXPR :\n parent.renderNode;\n }\n };\n /**\n * @return {?}\n */\n ViewBuilderVisitor.prototype.getOrCreateLastRenderNode = function () {\n var /** @type {?} */ view = this.view;\n if (view.rootNodes.length === 0 ||\n view.rootNodes[view.rootNodes.length - 1].type !== CompileViewRootNodeType.Node) {\n var /** @type {?} */ fieldName = \"_el_\" + view.nodes.length;\n view.fields.push(new ClassField(fieldName, importType(view.genConfig.renderTypes.renderElement)));\n view.createMethod.addStmt(THIS_EXPR.prop(fieldName)\n .set(ViewProperties.renderer.callMethod('createTemplateAnchor', [NULL_EXPR, NULL_EXPR]))\n .toStmt());\n view.rootNodes.push(new CompileViewRootNode(CompileViewRootNodeType.Node, THIS_EXPR.prop(fieldName)));\n }\n return view.rootNodes[view.rootNodes.length - 1].expr;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitBoundText = function (ast, parent) {\n return this._visitText(ast, '', parent);\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitText = function (ast, parent) {\n return this._visitText(ast, ast.value, parent);\n };\n /**\n * @param {?} ast\n * @param {?} value\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype._visitText = function (ast, value, parent) {\n var /** @type {?} */ fieldName = \"_text_\" + this.view.nodes.length;\n this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderText)));\n var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n var /** @type {?} */ compileNode = new CompileNode(parent, this.view, this.view.nodes.length, renderNode, ast);\n var /** @type {?} */ createRenderNode = THIS_EXPR.prop(fieldName)\n .set(ViewProperties.renderer.callMethod('createText', [\n this._getParentRenderNode(parent), literal(value),\n this.view.createMethod.resetDebugInfoExpr(this.view.nodes.length, ast)\n ]))\n .toStmt();\n this.view.nodes.push(compileNode);\n this.view.createMethod.addStmt(createRenderNode);\n this._addRootNodeAndProject(compileNode);\n return renderNode;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitNgContent = function (ast, parent) {\n // the projected nodes originate from a different view, so we don't\n // have debug information for them...\n this.view.createMethod.resetDebugInfo(null, ast);\n var /** @type {?} */ parentRenderNode = this._getParentRenderNode(parent);\n if (parentRenderNode !== NULL_EXPR) {\n this.view.createMethod.addStmt(THIS_EXPR.callMethod('projectNodes', [parentRenderNode, literal(ast.index)])\n .toStmt());\n }\n else if (this._isRootNode(parent)) {\n if (this.view.viewType !== ViewType.COMPONENT) {\n // store root nodes only for embedded/host views\n this.view.rootNodes.push(new CompileViewRootNode(CompileViewRootNodeType.NgContent, null, ast.index));\n }\n }\n else {\n if (isPresent(parent.component) && isPresent(ast.ngContentIndex)) {\n parent.addContentNode(ast.ngContentIndex, new CompileViewRootNode(CompileViewRootNodeType.NgContent, null, ast.index));\n }\n }\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitElement = function (ast, parent) {\n var /** @type {?} */ nodeIndex = this.view.nodes.length;\n var /** @type {?} */ createRenderNodeExpr;\n var /** @type {?} */ debugContextExpr = this.view.createMethod.resetDebugInfoExpr(nodeIndex, ast);\n var /** @type {?} */ directives = ast.directives.map(function (directiveAst) { return directiveAst.directive; });\n var /** @type {?} */ component = directives.find(function (directive) { return directive.isComponent; });\n if (ast.name === NG_CONTAINER_TAG) {\n createRenderNodeExpr = ViewProperties.renderer.callMethod('createTemplateAnchor', [this._getParentRenderNode(parent), debugContextExpr]);\n }\n else {\n var /** @type {?} */ htmlAttrs = _readHtmlAttrs(ast.attrs);\n var /** @type {?} */ attrNameAndValues = createInlineArray(_mergeHtmlAndDirectiveAttrs(htmlAttrs, directives).map(function (v) { return literal(v); }));\n if (nodeIndex === 0 && this.view.viewType === ViewType.HOST) {\n createRenderNodeExpr =\n importExpr(createIdentifier(Identifiers.selectOrCreateRenderHostElement)).callFn([\n ViewProperties.renderer, literal(ast.name), attrNameAndValues, rootSelectorVar,\n debugContextExpr\n ]);\n }\n else {\n createRenderNodeExpr =\n importExpr(createIdentifier(Identifiers.createRenderElement)).callFn([\n ViewProperties.renderer, this._getParentRenderNode(parent), literal(ast.name),\n attrNameAndValues, debugContextExpr\n ]);\n }\n }\n var /** @type {?} */ fieldName = \"_el_\" + nodeIndex;\n this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderElement)));\n this.view.createMethod.addStmt(THIS_EXPR.prop(fieldName).set(createRenderNodeExpr).toStmt());\n var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n var /** @type {?} */ compileElement = new CompileElement(parent, this.view, nodeIndex, renderNode, ast, component, directives, ast.providers, ast.hasViewContainer, false, ast.references);\n this.view.nodes.push(compileElement);\n var /** @type {?} */ compViewExpr = null;\n if (isPresent(component)) {\n var /** @type {?} */ nestedComponentIdentifier = { reference: null };\n this.targetDependencies.push(new ViewClassDependency(component.type, getViewClassName(component, 0), nestedComponentIdentifier));\n compViewExpr = THIS_EXPR.prop(\"compView_\" + nodeIndex); // fix highlighting: `\n this.view.fields.push(new ClassField(compViewExpr.name, importType(createIdentifier(Identifiers.AppView), [importType(component.type)])));\n this.view.viewChildren.push(compViewExpr);\n compileElement.setComponentView(compViewExpr);\n this.view.createMethod.addStmt(compViewExpr\n .set(importExpr(nestedComponentIdentifier).instantiate([\n ViewProperties.viewUtils, THIS_EXPR, literal(nodeIndex), renderNode\n ]))\n .toStmt());\n }\n compileElement.beforeChildren();\n this._addRootNodeAndProject(compileElement);\n templateVisitAll(this, ast.children, compileElement);\n compileElement.afterChildren(this.view.nodes.length - nodeIndex - 1);\n if (isPresent(compViewExpr)) {\n this.view.createMethod.addStmt(compViewExpr.callMethod('create', [compileElement.getComponent()]).toStmt());\n }\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} parent\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitEmbeddedTemplate = function (ast, parent) {\n var /** @type {?} */ nodeIndex = this.view.nodes.length;\n var /** @type {?} */ fieldName = \"_anchor_\" + nodeIndex;\n this.view.fields.push(new ClassField(fieldName, importType(this.view.genConfig.renderTypes.renderComment)));\n this.view.createMethod.addStmt(THIS_EXPR.prop(fieldName)\n .set(ViewProperties.renderer.callMethod('createTemplateAnchor', [\n this._getParentRenderNode(parent),\n this.view.createMethod.resetDebugInfoExpr(nodeIndex, ast)\n ]))\n .toStmt());\n var /** @type {?} */ renderNode = THIS_EXPR.prop(fieldName);\n var /** @type {?} */ templateVariableBindings = ast.variables.map(function (varAst) { return [varAst.value.length > 0 ? varAst.value : IMPLICIT_TEMPLATE_VAR, varAst.name]; });\n var /** @type {?} */ directives = ast.directives.map(function (directiveAst) { return directiveAst.directive; });\n var /** @type {?} */ compileElement = new CompileElement(parent, this.view, nodeIndex, renderNode, ast, null, directives, ast.providers, ast.hasViewContainer, true, ast.references);\n this.view.nodes.push(compileElement);\n this.nestedViewCount++;\n var /** @type {?} */ embeddedView = new CompileView(this.view.component, this.view.genConfig, this.view.pipeMetas, NULL_EXPR, this.view.animations, this.view.viewIndex + this.nestedViewCount, compileElement, templateVariableBindings, this.targetDependencies);\n this.nestedViewCount += buildView(embeddedView, ast.children, this.targetDependencies);\n compileElement.beforeChildren();\n this._addRootNodeAndProject(compileElement);\n compileElement.afterChildren(0);\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitAttr = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitDirective = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} eventTargetAndNames\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitReference = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n ViewBuilderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };\n return ViewBuilderVisitor;\n }());\n /**\n * Walks up the nodes while the direct parent is a container.\n * *\n * Returns the outer container or the node itself when it is not a direct child of a container.\n * *\n * @param {?} node\n * @return {?}\n */\n function _getOuterContainerOrSelf(node) {\n var /** @type {?} */ view = node.view;\n while (_isNgContainer(node.parent, view)) {\n node = node.parent;\n }\n return node;\n }\n /**\n * Walks up the nodes while they are container and returns the first parent which is not.\n * *\n * Returns the parent of the outer container or the node itself when it is not a container.\n * *\n * @param {?} el\n * @return {?}\n */\n function _getOuterContainerParentOrSelf(el) {\n var /** @type {?} */ view = el.view;\n while (_isNgContainer(el, view)) {\n el = el.parent;\n }\n return el;\n }\n /**\n * @param {?} node\n * @param {?} view\n * @return {?}\n */\n function _isNgContainer(node, view) {\n return !node.isNull() && ((node.sourceAst)).name === NG_CONTAINER_TAG &&\n node.view === view;\n }\n /**\n * @param {?} declaredHtmlAttrs\n * @param {?} directives\n * @return {?}\n */\n function _mergeHtmlAndDirectiveAttrs(declaredHtmlAttrs, directives) {\n var /** @type {?} */ mapResult = {};\n Object.keys(declaredHtmlAttrs).forEach(function (key) { mapResult[key] = declaredHtmlAttrs[key]; });\n directives.forEach(function (directiveMeta) {\n Object.keys(directiveMeta.hostAttributes).forEach(function (name) {\n var /** @type {?} */ value = directiveMeta.hostAttributes[name];\n var /** @type {?} */ prevValue = mapResult[name];\n mapResult[name] = isPresent(prevValue) ? mergeAttributeValue(name, prevValue, value) : value;\n });\n });\n var /** @type {?} */ arrResult = [];\n // Note: We need to sort to get a defined output order\n // for tests and for caching generated artifacts...\n Object.keys(mapResult).sort().forEach(function (attrName) { arrResult.push(attrName, mapResult[attrName]); });\n return arrResult;\n }\n /**\n * @param {?} attrs\n * @return {?}\n */\n function _readHtmlAttrs(attrs) {\n var /** @type {?} */ htmlAttrs = {};\n attrs.forEach(function (ast) { htmlAttrs[ast.name] = ast.value; });\n return htmlAttrs;\n }\n /**\n * @param {?} attrName\n * @param {?} attrValue1\n * @param {?} attrValue2\n * @return {?}\n */\n function mergeAttributeValue(attrName, attrValue1, attrValue2) {\n if (attrName == CLASS_ATTR$1 || attrName == STYLE_ATTR) {\n return attrValue1 + \" \" + attrValue2;\n }\n else {\n return attrValue2;\n }\n }\n /**\n * @param {?} view\n * @param {?} targetStatements\n * @return {?}\n */\n function createViewTopLevelStmts(view, targetStatements) {\n var /** @type {?} */ nodeDebugInfosVar = NULL_EXPR;\n if (view.genConfig.genDebugInfo) {\n nodeDebugInfosVar = variable(\"nodeDebugInfos_\" + identifierName(view.component.type) + view.viewIndex); // fix\n // highlighting:\n // `\n targetStatements.push(((nodeDebugInfosVar))\n .set(literalArr(view.nodes.map(createStaticNodeDebugInfo), new ArrayType(importType(createIdentifier(Identifiers.StaticNodeDebugInfo)), [TypeModifier.Const])))\n .toDeclStmt(null, [StmtModifier.Final]));\n }\n var /** @type {?} */ renderCompTypeVar = variable(\"renderType_\" + identifierName(view.component.type)); // fix highlighting: `\n if (view.viewIndex === 0) {\n var /** @type {?} */ templateUrlInfo = void 0;\n if (view.component.template.templateUrl == identifierModuleUrl(view.component.type)) {\n templateUrlInfo =\n identifierModuleUrl(view.component.type) + \" class \" + identifierName(view.component.type) + \" - inline template\";\n }\n else {\n templateUrlInfo = view.component.template.templateUrl;\n }\n targetStatements.push(renderCompTypeVar\n .set(importExpr(createIdentifier(Identifiers.createRenderComponentType)).callFn([\n view.genConfig.genDebugInfo ? literal(templateUrlInfo) : literal(''),\n literal(view.component.template.ngContentSelectors.length),\n ViewEncapsulationEnum.fromValue(view.component.template.encapsulation),\n view.styles,\n literalMap(view.animations.map(function (entry) { return [entry.name, entry.fnExp]; })),\n ]))\n .toDeclStmt(importType(createIdentifier(Identifiers.RenderComponentType))));\n }\n var /** @type {?} */ viewClass = createViewClass(view, renderCompTypeVar, nodeDebugInfosVar);\n targetStatements.push(viewClass);\n }\n /**\n * @param {?} node\n * @return {?}\n */\n function createStaticNodeDebugInfo(node) {\n var /** @type {?} */ compileElement = node instanceof CompileElement ? node : null;\n var /** @type {?} */ providerTokens = [];\n var /** @type {?} */ componentToken = NULL_EXPR;\n var /** @type {?} */ varTokenEntries = [];\n if (isPresent(compileElement)) {\n providerTokens = compileElement.getProviderTokens();\n if (isPresent(compileElement.component)) {\n componentToken = createDiTokenExpression(identifierToken(compileElement.component.type));\n }\n Object.keys(compileElement.referenceTokens).forEach(function (varName) {\n var /** @type {?} */ token = compileElement.referenceTokens[varName];\n varTokenEntries.push([varName, isPresent(token) ? createDiTokenExpression(token) : NULL_EXPR]);\n });\n }\n return importExpr(createIdentifier(Identifiers.StaticNodeDebugInfo))\n .instantiate([\n literalArr(providerTokens, new ArrayType(DYNAMIC_TYPE, [TypeModifier.Const])),\n componentToken,\n literalMap(varTokenEntries, new MapType(DYNAMIC_TYPE, [TypeModifier.Const]))\n ], importType(createIdentifier(Identifiers.StaticNodeDebugInfo), null, [TypeModifier.Const]));\n }\n /**\n * @param {?} view\n * @param {?} renderCompTypeVar\n * @param {?} nodeDebugInfosVar\n * @return {?}\n */\n function createViewClass(view, renderCompTypeVar, nodeDebugInfosVar) {\n var /** @type {?} */ viewConstructorArgs = [\n new FnParam(ViewConstructorVars.viewUtils.name, importType(createIdentifier(Identifiers.ViewUtils))),\n new FnParam(ViewConstructorVars.parentView.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(ViewConstructorVars.parentIndex.name, NUMBER_TYPE),\n new FnParam(ViewConstructorVars.parentElement.name, DYNAMIC_TYPE)\n ];\n var /** @type {?} */ superConstructorArgs = [\n variable(view.className), renderCompTypeVar, ViewTypeEnum.fromValue(view.viewType),\n ViewConstructorVars.viewUtils, ViewConstructorVars.parentView, ViewConstructorVars.parentIndex,\n ViewConstructorVars.parentElement,\n ChangeDetectorStatusEnum.fromValue(getChangeDetectionMode(view))\n ];\n if (view.genConfig.genDebugInfo) {\n superConstructorArgs.push(nodeDebugInfosVar);\n }\n if (view.viewType === ViewType.EMBEDDED) {\n viewConstructorArgs.push(new FnParam('declaredViewContainer', importType(createIdentifier(Identifiers.ViewContainer))));\n superConstructorArgs.push(variable('declaredViewContainer'));\n }\n var /** @type {?} */ viewMethods = [\n new ClassMethod('createInternal', [new FnParam(rootSelectorVar.name, STRING_TYPE)], generateCreateMethod(view), importType(createIdentifier(Identifiers.ComponentRef), [DYNAMIC_TYPE])),\n new ClassMethod('injectorGetInternal', [\n new FnParam(InjectMethodVars$1.token.name, DYNAMIC_TYPE),\n // Note: Can't use o.INT_TYPE here as the method in AppView uses number\n new FnParam(InjectMethodVars$1.requestNodeIndex.name, NUMBER_TYPE),\n new FnParam(InjectMethodVars$1.notFoundResult.name, DYNAMIC_TYPE)\n ], addReturnValuefNotEmpty(view.injectorGetMethod.finish(), InjectMethodVars$1.notFoundResult), DYNAMIC_TYPE),\n new ClassMethod('detectChangesInternal', [new FnParam(DetectChangesVars.throwOnChange.name, BOOL_TYPE)], generateDetectChangesMethod(view)),\n new ClassMethod('dirtyParentQueriesInternal', [], view.dirtyParentQueriesMethod.finish()),\n new ClassMethod('destroyInternal', [], generateDestroyMethod(view)),\n new ClassMethod('detachInternal', [], view.detachMethod.finish()),\n generateVisitRootNodesMethod(view), generateVisitProjectableNodesMethod(view),\n generateCreateEmbeddedViewsMethod(view)\n ].filter(function (method) { return method.body.length > 0; });\n var /** @type {?} */ superClass = view.genConfig.genDebugInfo ? Identifiers.DebugAppView : Identifiers.AppView;\n var /** @type {?} */ viewClass = createClassStmt({\n name: view.className,\n parent: importExpr(createIdentifier(superClass), [getContextType(view)]),\n parentArgs: superConstructorArgs,\n ctorParams: viewConstructorArgs,\n builders: [{ methods: viewMethods }, view]\n });\n return viewClass;\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateDestroyMethod(view) {\n var /** @type {?} */ stmts = [];\n view.viewContainers.forEach(function (viewContainer) {\n stmts.push(viewContainer.callMethod('destroyNestedViews', []).toStmt());\n });\n view.viewChildren.forEach(function (viewChild) { stmts.push(viewChild.callMethod('destroy', []).toStmt()); });\n stmts.push.apply(stmts, view.destroyMethod.finish());\n return stmts;\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateCreateMethod(view) {\n var /** @type {?} */ parentRenderNodeExpr = NULL_EXPR;\n var /** @type {?} */ parentRenderNodeStmts = [];\n if (view.viewType === ViewType.COMPONENT) {\n parentRenderNodeExpr =\n ViewProperties.renderer.callMethod('createViewRoot', [THIS_EXPR.prop('parentElement')]);\n parentRenderNodeStmts =\n [parentRenderNodeVar.set(parentRenderNodeExpr)\n .toDeclStmt(importType(view.genConfig.renderTypes.renderNode), [StmtModifier.Final])];\n }\n var /** @type {?} */ resultExpr;\n if (view.viewType === ViewType.HOST) {\n var /** @type {?} */ hostEl = (view.nodes[0]);\n resultExpr =\n importExpr(createIdentifier(Identifiers.ComponentRef_), [DYNAMIC_TYPE]).instantiate([\n literal(hostEl.nodeIndex), THIS_EXPR, hostEl.renderNode, hostEl.getComponent()\n ]);\n }\n else {\n resultExpr = NULL_EXPR;\n }\n var /** @type {?} */ allNodesExpr = ViewProperties.renderer.cast(DYNAMIC_TYPE)\n .prop('directRenderer')\n .conditional(NULL_EXPR, literalArr(view.nodes.map(function (node) { return node.renderNode; })));\n return parentRenderNodeStmts.concat(view.createMethod.finish(), [\n THIS_EXPR\n .callMethod('init', [\n view.lastRenderNode,\n allNodesExpr,\n view.disposables.length ? literalArr(view.disposables) : NULL_EXPR,\n ])\n .toStmt(),\n new ReturnStatement(resultExpr)\n ]);\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateDetectChangesMethod(view) {\n var /** @type {?} */ stmts = [];\n if (view.animationBindingsMethod.isEmpty() && view.detectChangesInInputsMethod.isEmpty() &&\n view.updateContentQueriesMethod.isEmpty() &&\n view.afterContentLifecycleCallbacksMethod.isEmpty() &&\n view.detectChangesRenderPropertiesMethod.isEmpty() &&\n view.updateViewQueriesMethod.isEmpty() && view.afterViewLifecycleCallbacksMethod.isEmpty() &&\n view.viewContainers.length === 0 && view.viewChildren.length === 0) {\n return stmts;\n }\n stmts.push.apply(stmts, view.animationBindingsMethod.finish());\n stmts.push.apply(stmts, view.detectChangesInInputsMethod.finish());\n view.viewContainers.forEach(function (viewContainer) {\n stmts.push(viewContainer.callMethod('detectChangesInNestedViews', [DetectChangesVars.throwOnChange])\n .toStmt());\n });\n var /** @type {?} */ afterContentStmts = view.updateContentQueriesMethod.finish().concat(view.afterContentLifecycleCallbacksMethod.finish());\n if (afterContentStmts.length > 0) {\n stmts.push(new IfStmt(not(DetectChangesVars.throwOnChange), afterContentStmts));\n }\n stmts.push.apply(stmts, view.detectChangesRenderPropertiesMethod.finish());\n view.viewChildren.forEach(function (viewChild) {\n stmts.push(viewChild.callMethod('internalDetectChanges', [DetectChangesVars.throwOnChange]).toStmt());\n });\n var /** @type {?} */ afterViewStmts = view.updateViewQueriesMethod.finish().concat(view.afterViewLifecycleCallbacksMethod.finish());\n if (afterViewStmts.length > 0) {\n stmts.push(new IfStmt(not(DetectChangesVars.throwOnChange), afterViewStmts));\n }\n var /** @type {?} */ varStmts = [];\n var /** @type {?} */ readVars = findReadVarNames(stmts);\n if (readVars.has(DetectChangesVars.changed.name)) {\n varStmts.push(DetectChangesVars.changed.set(literal(true)).toDeclStmt(BOOL_TYPE));\n }\n if (readVars.has(DetectChangesVars.changes.name)) {\n varStmts.push(DetectChangesVars.changes.set(NULL_EXPR)\n .toDeclStmt(new MapType(importType(createIdentifier(Identifiers.SimpleChange)))));\n }\n varStmts.push.apply(varStmts, createSharedBindingVariablesIfNeeded(stmts));\n return varStmts.concat(stmts);\n }\n /**\n * @param {?} statements\n * @param {?} value\n * @return {?}\n */\n function addReturnValuefNotEmpty(statements, value) {\n if (statements.length > 0) {\n return statements.concat([new ReturnStatement(value)]);\n }\n else {\n return statements;\n }\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function getContextType(view) {\n if (view.viewType === ViewType.COMPONENT) {\n return importType(view.component.type);\n }\n return DYNAMIC_TYPE;\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function getChangeDetectionMode(view) {\n var /** @type {?} */ mode;\n if (view.viewType === ViewType.COMPONENT) {\n mode = isDefaultChangeDetectionStrategy(view.component.changeDetection) ?\n ChangeDetectorStatus.CheckAlways :\n ChangeDetectorStatus.CheckOnce;\n }\n else {\n mode = ChangeDetectorStatus.CheckAlways;\n }\n return mode;\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateVisitRootNodesMethod(view) {\n var /** @type {?} */ cbVar = variable('cb');\n var /** @type {?} */ ctxVar = variable('ctx');\n var /** @type {?} */ stmts = generateVisitNodesStmts(view.rootNodes, cbVar, ctxVar);\n return new ClassMethod('visitRootNodesInternal', [new FnParam(cbVar.name, DYNAMIC_TYPE), new FnParam(ctxVar.name, DYNAMIC_TYPE)], stmts);\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateVisitProjectableNodesMethod(view) {\n var /** @type {?} */ nodeIndexVar = variable('nodeIndex');\n var /** @type {?} */ ngContentIndexVar = variable('ngContentIndex');\n var /** @type {?} */ cbVar = variable('cb');\n var /** @type {?} */ ctxVar = variable('ctx');\n var /** @type {?} */ stmts = [];\n view.nodes.forEach(function (node) {\n if (node instanceof CompileElement && node.component) {\n node.contentNodesByNgContentIndex.forEach(function (projectedNodes, ngContentIndex) {\n stmts.push(new IfStmt(nodeIndexVar.equals(literal(node.nodeIndex))\n .and(ngContentIndexVar.equals(literal(ngContentIndex))), generateVisitNodesStmts(projectedNodes, cbVar, ctxVar)));\n });\n }\n });\n return new ClassMethod('visitProjectableNodesInternal', [\n new FnParam(nodeIndexVar.name, NUMBER_TYPE),\n new FnParam(ngContentIndexVar.name, NUMBER_TYPE),\n new FnParam(cbVar.name, DYNAMIC_TYPE), new FnParam(ctxVar.name, DYNAMIC_TYPE)\n ], stmts);\n }\n /**\n * @param {?} nodes\n * @param {?} cb\n * @param {?} ctx\n * @return {?}\n */\n function generateVisitNodesStmts(nodes, cb, ctx) {\n var /** @type {?} */ stmts = [];\n nodes.forEach(function (node) {\n switch (node.type) {\n case CompileViewRootNodeType.Node:\n stmts.push(cb.callFn([node.expr, ctx]).toStmt());\n break;\n case CompileViewRootNodeType.ViewContainer:\n stmts.push(cb.callFn([node.expr.prop('nativeElement'), ctx]).toStmt());\n stmts.push(node.expr.callMethod('visitNestedViewRootNodes', [cb, ctx]).toStmt());\n break;\n case CompileViewRootNodeType.NgContent:\n stmts.push(THIS_EXPR.callMethod('visitProjectedNodes', [literal(node.ngContentIndex), cb, ctx])\n .toStmt());\n break;\n }\n });\n return stmts;\n }\n /**\n * @param {?} view\n * @return {?}\n */\n function generateCreateEmbeddedViewsMethod(view) {\n var /** @type {?} */ nodeIndexVar = variable('nodeIndex');\n var /** @type {?} */ stmts = [];\n view.nodes.forEach(function (node) {\n if (node instanceof CompileElement) {\n if (node.embeddedView) {\n var /** @type {?} */ parentNodeIndex = node.isRootElement() ? null : node.parent.nodeIndex;\n stmts.push(new IfStmt(nodeIndexVar.equals(literal(node.nodeIndex)), [new ReturnStatement(node.embeddedView.classExpr.instantiate([\n ViewProperties.viewUtils, THIS_EXPR, literal(node.nodeIndex), node.renderNode,\n node.viewContainer\n ]))]));\n }\n }\n });\n if (stmts.length > 0) {\n stmts.push(new ReturnStatement(NULL_EXPR));\n }\n return new ClassMethod('createEmbeddedViewInternal', [new FnParam(nodeIndexVar.name, NUMBER_TYPE)], stmts, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE]));\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$16 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$16 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var ViewCompileResult = (function () {\n /**\n * @param {?} statements\n * @param {?} viewClassVar\n * @param {?} dependencies\n */\n function ViewCompileResult(statements, viewClassVar, dependencies) {\n this.statements = statements;\n this.viewClassVar = viewClassVar;\n this.dependencies = dependencies;\n }\n return ViewCompileResult;\n }());\n var ViewCompiler = (function () {\n /**\n * @param {?} _genConfig\n * @param {?} _schemaRegistry\n */\n function ViewCompiler(_genConfig, _schemaRegistry) {\n this._genConfig = _genConfig;\n this._schemaRegistry = _schemaRegistry;\n }\n /**\n * @param {?} component\n * @param {?} template\n * @param {?} styles\n * @param {?} pipes\n * @param {?} compiledAnimations\n * @return {?}\n */\n ViewCompiler.prototype.compileComponent = function (component, template, styles, pipes, compiledAnimations) {\n var /** @type {?} */ dependencies = [];\n var /** @type {?} */ view = new CompileView(component, this._genConfig, pipes, styles, compiledAnimations, 0, CompileElement.createNull(), [], dependencies);\n var /** @type {?} */ statements = [];\n buildView(view, template, dependencies);\n // Need to separate binding from creation to be able to refer to\n // variables that have been declared after usage.\n bindView(view, template, this._schemaRegistry);\n finishView(view, statements);\n return new ViewCompileResult(statements, view.classExpr.name, dependencies);\n };\n ViewCompiler = __decorate$16([\n CompilerInjectable(), \n __metadata$16('design:paramtypes', [CompilerConfig, ElementSchemaRegistry])\n ], ViewCompiler);\n return ViewCompiler;\n }());\n\n var AnimationEntryCompileResult = (function () {\n /**\n * @param {?} name\n * @param {?} statements\n * @param {?} fnExp\n */\n function AnimationEntryCompileResult(name, statements, fnExp) {\n this.name = name;\n this.statements = statements;\n this.fnExp = fnExp;\n }\n return AnimationEntryCompileResult;\n }());\n var AnimationCompiler = (function () {\n function AnimationCompiler() {\n }\n /**\n * @param {?} factoryNamePrefix\n * @param {?} parsedAnimations\n * @return {?}\n */\n AnimationCompiler.prototype.compile = function (factoryNamePrefix, parsedAnimations) {\n return parsedAnimations.map(function (entry) {\n var /** @type {?} */ factoryName = factoryNamePrefix + \"_\" + entry.name;\n var /** @type {?} */ visitor = new _AnimationBuilder(entry.name, factoryName);\n return visitor.build(entry);\n });\n };\n return AnimationCompiler;\n }());\n var /** @type {?} */ _ANIMATION_FACTORY_ELEMENT_VAR = variable('element');\n var /** @type {?} */ _ANIMATION_DEFAULT_STATE_VAR = variable('defaultStateStyles');\n var /** @type {?} */ _ANIMATION_FACTORY_VIEW_VAR = variable('view');\n var /** @type {?} */ _ANIMATION_FACTORY_VIEW_CONTEXT = _ANIMATION_FACTORY_VIEW_VAR.prop('animationContext');\n var /** @type {?} */ _ANIMATION_FACTORY_RENDERER_VAR = _ANIMATION_FACTORY_VIEW_VAR.prop('renderer');\n var /** @type {?} */ _ANIMATION_CURRENT_STATE_VAR = variable('currentState');\n var /** @type {?} */ _ANIMATION_NEXT_STATE_VAR = variable('nextState');\n var /** @type {?} */ _ANIMATION_PLAYER_VAR = variable('player');\n var /** @type {?} */ _ANIMATION_TIME_VAR = variable('totalTime');\n var /** @type {?} */ _ANIMATION_START_STATE_STYLES_VAR = variable('startStateStyles');\n var /** @type {?} */ _ANIMATION_END_STATE_STYLES_VAR = variable('endStateStyles');\n var /** @type {?} */ _ANIMATION_COLLECTED_STYLES = variable('collectedStyles');\n var /** @type {?} */ _PREVIOUS_ANIMATION_PLAYERS = variable('previousPlayers');\n var /** @type {?} */ _EMPTY_MAP = literalMap([]);\n var /** @type {?} */ _EMPTY_ARRAY = literalArr([]);\n var _AnimationBuilder = (function () {\n /**\n * @param {?} animationName\n * @param {?} factoryName\n */\n function _AnimationBuilder(animationName, factoryName) {\n this.animationName = animationName;\n this._fnVarName = factoryName + '_factory';\n this._statesMapVarName = factoryName + '_states';\n this._statesMapVar = variable(this._statesMapVarName);\n }\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationStyles = function (ast, context) {\n var /** @type {?} */ stylesArr = [];\n if (context.isExpectingFirstStyleStep) {\n stylesArr.push(_ANIMATION_START_STATE_STYLES_VAR);\n context.isExpectingFirstStyleStep = false;\n }\n ast.styles.forEach(function (entry) {\n var /** @type {?} */ entries = Object.keys(entry).map(function (key) { return [key, literal(entry[key])]; });\n stylesArr.push(literalMap(entries));\n });\n return importExpr(createIdentifier(Identifiers.AnimationStyles)).instantiate([\n importExpr(createIdentifier(Identifiers.collectAndResolveStyles)).callFn([\n _ANIMATION_COLLECTED_STYLES, literalArr(stylesArr)\n ])\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationKeyframe = function (ast, context) {\n return importExpr(createIdentifier(Identifiers.AnimationKeyframe)).instantiate([\n literal(ast.offset), ast.styles.visit(this, context)\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationStep = function (ast, context) {\n var _this = this;\n if (context.endStateAnimateStep === ast) {\n return this._visitEndStateAnimation(ast, context);\n }\n var /** @type {?} */ startingStylesExpr = ast.startingStyles.visit(this, context);\n var /** @type {?} */ keyframeExpressions = ast.keyframes.map(function (keyframeEntry) { return keyframeEntry.visit(_this, context); });\n return this._callAnimateMethod(ast, startingStylesExpr, literalArr(keyframeExpressions), context);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype._visitEndStateAnimation = function (ast, context) {\n var _this = this;\n var /** @type {?} */ startingStylesExpr = ast.startingStyles.visit(this, context);\n var /** @type {?} */ keyframeExpressions = ast.keyframes.map(function (keyframe) { return keyframe.visit(_this, context); });\n var /** @type {?} */ keyframesExpr = importExpr(createIdentifier(Identifiers.balanceAnimationKeyframes)).callFn([\n _ANIMATION_COLLECTED_STYLES, _ANIMATION_END_STATE_STYLES_VAR,\n literalArr(keyframeExpressions)\n ]);\n return this._callAnimateMethod(ast, startingStylesExpr, keyframesExpr, context);\n };\n /**\n * @param {?} ast\n * @param {?} startingStylesExpr\n * @param {?} keyframesExpr\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype._callAnimateMethod = function (ast, startingStylesExpr, keyframesExpr, context) {\n var /** @type {?} */ previousStylesValue = _EMPTY_ARRAY;\n if (context.isExpectingFirstAnimateStep) {\n previousStylesValue = _PREVIOUS_ANIMATION_PLAYERS;\n context.isExpectingFirstAnimateStep = false;\n }\n context.totalTransitionTime += ast.duration + ast.delay;\n return _ANIMATION_FACTORY_RENDERER_VAR.callMethod('animate', [\n _ANIMATION_FACTORY_ELEMENT_VAR, startingStylesExpr, keyframesExpr, literal(ast.duration),\n literal(ast.delay), literal(ast.easing), previousStylesValue\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationSequence = function (ast, context) {\n var _this = this;\n var /** @type {?} */ playerExprs = ast.steps.map(function (step) { return step.visit(_this, context); });\n return importExpr(createIdentifier(Identifiers.AnimationSequencePlayer)).instantiate([\n literalArr(playerExprs)\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationGroup = function (ast, context) {\n var _this = this;\n var /** @type {?} */ playerExprs = ast.steps.map(function (step) { return step.visit(_this, context); });\n return importExpr(createIdentifier(Identifiers.AnimationGroupPlayer)).instantiate([\n literalArr(playerExprs)\n ]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationStateDeclaration = function (ast, context) {\n var /** @type {?} */ flatStyles = {};\n _getStylesArray(ast).forEach(function (entry) { Object.keys(entry).forEach(function (key) { flatStyles[key] = entry[key]; }); });\n context.stateMap.registerState(ast.stateName, flatStyles);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationStateTransition = function (ast, context) {\n var /** @type {?} */ steps = ast.animation.steps;\n var /** @type {?} */ lastStep = steps[steps.length - 1];\n if (_isEndStateAnimateStep(lastStep)) {\n context.endStateAnimateStep = (lastStep);\n }\n context.totalTransitionTime = 0;\n context.isExpectingFirstStyleStep = true;\n context.isExpectingFirstAnimateStep = true;\n var /** @type {?} */ stateChangePreconditions = [];\n ast.stateChanges.forEach(function (stateChange) {\n stateChangePreconditions.push(_compareToAnimationStateExpr(_ANIMATION_CURRENT_STATE_VAR, stateChange.fromState)\n .and(_compareToAnimationStateExpr(_ANIMATION_NEXT_STATE_VAR, stateChange.toState)));\n if (stateChange.fromState != ANY_STATE) {\n context.stateMap.registerState(stateChange.fromState);\n }\n if (stateChange.toState != ANY_STATE) {\n context.stateMap.registerState(stateChange.toState);\n }\n });\n var /** @type {?} */ animationPlayerExpr = ast.animation.visit(this, context);\n var /** @type {?} */ reducedStateChangesPrecondition = stateChangePreconditions.reduce(function (a, b) { return a.or(b); });\n var /** @type {?} */ precondition = _ANIMATION_PLAYER_VAR.equals(NULL_EXPR).and(reducedStateChangesPrecondition);\n var /** @type {?} */ animationStmt = _ANIMATION_PLAYER_VAR.set(animationPlayerExpr).toStmt();\n var /** @type {?} */ totalTimeStmt = _ANIMATION_TIME_VAR.set(literal(context.totalTransitionTime)).toStmt();\n return new IfStmt(precondition, [animationStmt, totalTimeStmt]);\n };\n /**\n * @param {?} ast\n * @param {?} context\n * @return {?}\n */\n _AnimationBuilder.prototype.visitAnimationEntry = function (ast, context) {\n var _this = this;\n // visit each of the declarations first to build the context state map\n ast.stateDeclarations.forEach(function (def) { return def.visit(_this, context); });\n // this should always be defined even if the user overrides it\n context.stateMap.registerState(DEFAULT_STATE, {});\n var /** @type {?} */ statements = [];\n statements.push(_PREVIOUS_ANIMATION_PLAYERS\n .set(_ANIMATION_FACTORY_VIEW_CONTEXT.callMethod('getAnimationPlayers', [\n _ANIMATION_FACTORY_ELEMENT_VAR,\n _ANIMATION_NEXT_STATE_VAR.equals(literal(EMPTY_STATE))\n .conditional(NULL_EXPR, literal(this.animationName))\n ]))\n .toDeclStmt());\n statements.push(_ANIMATION_COLLECTED_STYLES.set(_EMPTY_MAP).toDeclStmt());\n statements.push(_ANIMATION_PLAYER_VAR.set(NULL_EXPR).toDeclStmt());\n statements.push(_ANIMATION_TIME_VAR.set(literal(0)).toDeclStmt());\n statements.push(_ANIMATION_DEFAULT_STATE_VAR.set(this._statesMapVar.key(literal(DEFAULT_STATE)))\n .toDeclStmt());\n statements.push(_ANIMATION_START_STATE_STYLES_VAR.set(this._statesMapVar.key(_ANIMATION_CURRENT_STATE_VAR))\n .toDeclStmt());\n statements.push(new IfStmt(_ANIMATION_START_STATE_STYLES_VAR.equals(NULL_EXPR), [_ANIMATION_START_STATE_STYLES_VAR.set(_ANIMATION_DEFAULT_STATE_VAR).toStmt()]));\n statements.push(_ANIMATION_END_STATE_STYLES_VAR.set(this._statesMapVar.key(_ANIMATION_NEXT_STATE_VAR))\n .toDeclStmt());\n statements.push(new IfStmt(_ANIMATION_END_STATE_STYLES_VAR.equals(NULL_EXPR), [_ANIMATION_END_STATE_STYLES_VAR.set(_ANIMATION_DEFAULT_STATE_VAR).toStmt()]));\n var /** @type {?} */ RENDER_STYLES_FN = importExpr(createIdentifier(Identifiers.renderStyles));\n ast.stateTransitions.forEach(function (transAst) { return statements.push(transAst.visit(_this, context)); });\n // this check ensures that the animation factory always returns a player\n // so that the onDone callback can be used for tracking\n statements.push(new IfStmt(_ANIMATION_PLAYER_VAR.equals(NULL_EXPR), [_ANIMATION_PLAYER_VAR\n .set(importExpr(createIdentifier(Identifiers.NoOpAnimationPlayer)).instantiate([]))\n .toStmt()]));\n // once complete we want to apply the styles on the element\n // since the destination state's values should persist once\n // the animation sequence has completed.\n statements.push(_ANIMATION_PLAYER_VAR\n .callMethod('onDone', [fn([], [\n _ANIMATION_PLAYER_VAR.callMethod('destroy', []).toStmt(),\n RENDER_STYLES_FN\n .callFn([\n _ANIMATION_FACTORY_ELEMENT_VAR, _ANIMATION_FACTORY_RENDERER_VAR,\n importExpr(createIdentifier(Identifiers.prepareFinalAnimationStyles))\n .callFn([\n _ANIMATION_START_STATE_STYLES_VAR,\n _ANIMATION_END_STATE_STYLES_VAR\n ])\n ])\n .toStmt()\n ])])\n .toStmt());\n statements.push(importExpr(createIdentifier(Identifiers.AnimationSequencePlayer))\n .instantiate([_PREVIOUS_ANIMATION_PLAYERS])\n .callMethod('destroy', [])\n .toStmt());\n // before we start any animation we want to clear out the starting\n // styles from the element's style property (since they were placed\n // there at the end of the last animation\n statements.push(RENDER_STYLES_FN\n .callFn([\n _ANIMATION_FACTORY_ELEMENT_VAR, _ANIMATION_FACTORY_RENDERER_VAR,\n importExpr(createIdentifier(Identifiers.clearStyles))\n .callFn([_ANIMATION_START_STATE_STYLES_VAR])\n ])\n .toStmt());\n statements.push(_ANIMATION_FACTORY_VIEW_CONTEXT\n .callMethod('queueAnimation', [\n _ANIMATION_FACTORY_ELEMENT_VAR, literal(this.animationName),\n _ANIMATION_PLAYER_VAR\n ])\n .toStmt());\n statements.push(new ReturnStatement(importExpr(createIdentifier(Identifiers.AnimationTransition)).instantiate([\n _ANIMATION_PLAYER_VAR, _ANIMATION_CURRENT_STATE_VAR, _ANIMATION_NEXT_STATE_VAR,\n _ANIMATION_TIME_VAR\n ])));\n return fn([\n new FnParam(_ANIMATION_FACTORY_VIEW_VAR.name, importType(createIdentifier(Identifiers.AppView), [DYNAMIC_TYPE])),\n new FnParam(_ANIMATION_FACTORY_ELEMENT_VAR.name, DYNAMIC_TYPE),\n new FnParam(_ANIMATION_CURRENT_STATE_VAR.name, DYNAMIC_TYPE),\n new FnParam(_ANIMATION_NEXT_STATE_VAR.name, DYNAMIC_TYPE)\n ], statements, importType(createIdentifier(Identifiers.AnimationTransition)));\n };\n /**\n * @param {?} ast\n * @return {?}\n */\n _AnimationBuilder.prototype.build = function (ast) {\n var /** @type {?} */ context = new _AnimationBuilderContext();\n var /** @type {?} */ fnStatement = ast.visit(this, context).toDeclStmt(this._fnVarName);\n var /** @type {?} */ fnVariable = variable(this._fnVarName);\n var /** @type {?} */ lookupMap = [];\n Object.keys(context.stateMap.states).forEach(function (stateName) {\n var /** @type {?} */ value = context.stateMap.states[stateName];\n var /** @type {?} */ variableValue = _EMPTY_MAP;\n if (isPresent(value)) {\n var /** @type {?} */ styleMap_1 = [];\n Object.keys(value).forEach(function (key) { styleMap_1.push([key, literal(value[key])]); });\n variableValue = literalMap(styleMap_1);\n }\n lookupMap.push([stateName, variableValue]);\n });\n var /** @type {?} */ compiledStatesMapStmt = this._statesMapVar.set(literalMap(lookupMap)).toDeclStmt();\n var /** @type {?} */ statements = [compiledStatesMapStmt, fnStatement];\n return new AnimationEntryCompileResult(this.animationName, statements, fnVariable);\n };\n return _AnimationBuilder;\n }());\n var _AnimationBuilderContext = (function () {\n function _AnimationBuilderContext() {\n this.stateMap = new _AnimationBuilderStateMap();\n this.endStateAnimateStep = null;\n this.isExpectingFirstStyleStep = false;\n this.isExpectingFirstAnimateStep = false;\n this.totalTransitionTime = 0;\n }\n return _AnimationBuilderContext;\n }());\n var _AnimationBuilderStateMap = (function () {\n function _AnimationBuilderStateMap() {\n this._states = {};\n }\n Object.defineProperty(_AnimationBuilderStateMap.prototype, \"states\", {\n /**\n * @return {?}\n */\n get: function () { return this._states; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} name\n * @param {?=} value\n * @return {?}\n */\n _AnimationBuilderStateMap.prototype.registerState = function (name, value) {\n if (value === void 0) { value = null; }\n var /** @type {?} */ existingEntry = this._states[name];\n if (!existingEntry) {\n this._states[name] = value;\n }\n };\n return _AnimationBuilderStateMap;\n }());\n /**\n * @param {?} value\n * @param {?} animationState\n * @return {?}\n */\n function _compareToAnimationStateExpr(value, animationState) {\n var /** @type {?} */ emptyStateLiteral = literal(EMPTY_STATE);\n switch (animationState) {\n case EMPTY_STATE:\n return value.equals(emptyStateLiteral);\n case ANY_STATE:\n return literal(true);\n default:\n return value.equals(literal(animationState));\n }\n }\n /**\n * @param {?} step\n * @return {?}\n */\n function _isEndStateAnimateStep(step) {\n // the final animation step is characterized by having only TWO\n // keyframe values and it must have zero styles for both keyframes\n if (step instanceof AnimationStepAst && step.duration > 0 && step.keyframes.length == 2) {\n var /** @type {?} */ styles1 = _getStylesArray(step.keyframes[0])[0];\n var /** @type {?} */ styles2 = _getStylesArray(step.keyframes[1])[0];\n return Object.keys(styles1).length === 0 && Object.keys(styles2).length === 0;\n }\n return false;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function _getStylesArray(obj) {\n return obj.styles.styles;\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var GeneratedFile = (function () {\n /**\n * @param {?} srcFileUrl\n * @param {?} genFileUrl\n * @param {?} source\n */\n function GeneratedFile(srcFileUrl, genFileUrl, source) {\n this.srcFileUrl = srcFileUrl;\n this.genFileUrl = genFileUrl;\n this.source = source;\n }\n return GeneratedFile;\n }());\n\n var __extends$23 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ STRIP_SRC_FILE_SUFFIXES = /(\\.ts|\\.d\\.ts|\\.js|\\.jsx|\\.tsx)$/;\n /**\n * @param {?} host\n * @param {?} summaryResolver\n * @param {?} symbolResolver\n * @param {?} symbols\n * @param {?} types\n * @return {?}\n */\n function serializeSummaries(host, summaryResolver, symbolResolver, symbols, types) {\n var /** @type {?} */ serializer = new Serializer(host);\n // for symbols, we use everything except for the class metadata itself\n // (we keep the statics though), as the class metadata is contained in the\n // CompileTypeSummary.\n symbols.forEach(function (resolvedSymbol) { return serializer.addOrMergeSummary({ symbol: resolvedSymbol.symbol, metadata: resolvedSymbol.metadata }); });\n // Add summaries that are referenced by the given symbols (transitively)\n // Note: the serializer.symbols array might be growing while\n // we execute the loop!\n for (var /** @type {?} */ processedIndex = 0; processedIndex < serializer.symbols.length; processedIndex++) {\n var /** @type {?} */ symbol = serializer.symbols[processedIndex];\n if (!host.isSourceFile(symbol.filePath)) {\n var /** @type {?} */ summary = summaryResolver.resolveSummary(symbol);\n if (!summary) {\n // some symbols might originate from a plain typescript library\n // that just exported .d.ts and .metadata.json files, i.e. where no summary\n // files were created.\n var /** @type {?} */ resolvedSymbol = symbolResolver.resolveSymbol(symbol);\n if (resolvedSymbol) {\n summary = { symbol: resolvedSymbol.symbol, metadata: resolvedSymbol.metadata };\n }\n }\n if (summary) {\n serializer.addOrMergeSummary(summary);\n }\n }\n }\n // Add type summaries.\n // Note: We don't add the summaries of all referenced symbols as for the ResolvedSymbols,\n // as the type summaries already contain the transitive data that they require\n // (in a minimal way).\n types.forEach(function (typeSummary) {\n serializer.addOrMergeSummary({ symbol: typeSummary.type.reference, metadata: { __symbolic: 'class' }, type: typeSummary });\n if (typeSummary.summaryKind === CompileSummaryKind.NgModule) {\n var /** @type {?} */ ngModuleSummary = (typeSummary);\n ngModuleSummary.exportedDirectives.concat(ngModuleSummary.exportedPipes).forEach(function (id) {\n var /** @type {?} */ symbol = id.reference;\n if (!host.isSourceFile(symbol.filePath)) {\n serializer.addOrMergeSummary(summaryResolver.resolveSummary(symbol));\n }\n });\n }\n });\n return serializer.serialize();\n }\n /**\n * @param {?} symbolCache\n * @param {?} json\n * @return {?}\n */\n function deserializeSummaries(symbolCache, json) {\n var /** @type {?} */ deserializer = new Deserializer(symbolCache);\n return deserializer.deserialize(json);\n }\n /**\n * @param {?} fileName\n * @return {?}\n */\n function summaryFileName(fileName) {\n var /** @type {?} */ fileNameWithoutSuffix = fileName.replace(STRIP_SRC_FILE_SUFFIXES, '');\n return fileNameWithoutSuffix + \".ngsummary.json\";\n }\n var Serializer = (function (_super) {\n __extends$23(Serializer, _super);\n /**\n * @param {?} host\n */\n function Serializer(host) {\n _super.call(this);\n this.host = host;\n this.symbols = [];\n this.indexBySymbol = new Map();\n this.processedSummaryBySymbol = new Map();\n this.processedSummaries = [];\n }\n /**\n * @param {?} summary\n * @return {?}\n */\n Serializer.prototype.addOrMergeSummary = function (summary) {\n var /** @type {?} */ symbolMeta = summary.metadata;\n if (symbolMeta && symbolMeta.__symbolic === 'class') {\n // For classes, we only keep their statics, but not the metadata\n // of the class itself as that has been captured already via other summaries\n // (e.g. DirectiveSummary, ...).\n symbolMeta = { __symbolic: 'class', statics: symbolMeta.statics };\n }\n var /** @type {?} */ processedSummary = this.processedSummaryBySymbol.get(summary.symbol);\n if (!processedSummary) {\n processedSummary = this.processValue({ symbol: summary.symbol });\n this.processedSummaries.push(processedSummary);\n this.processedSummaryBySymbol.set(summary.symbol, processedSummary);\n }\n // Note: == by purpose to compare with undefined!\n if (processedSummary.metadata == null && symbolMeta != null) {\n processedSummary.metadata = this.processValue(symbolMeta);\n }\n // Note: == by purpose to compare with undefined!\n if (processedSummary.type == null && summary.type != null) {\n processedSummary.type = this.processValue(summary.type);\n }\n };\n /**\n * @return {?}\n */\n Serializer.prototype.serialize = function () {\n var _this = this;\n return JSON.stringify({\n summaries: this.processedSummaries,\n symbols: this.symbols.map(function (symbol, index) {\n return {\n __symbol: index,\n name: symbol.name,\n // We convert the source filenames tinto output filenames,\n // as the generated summary file will be used when teh current\n // compilation unit is used as a library\n filePath: _this.host.getOutputFileName(symbol.filePath)\n };\n })\n });\n };\n /**\n * @param {?} value\n * @return {?}\n */\n Serializer.prototype.processValue = function (value) { return visitValue(value, this, null); };\n /**\n * @param {?} value\n * @param {?} context\n * @return {?}\n */\n Serializer.prototype.visitOther = function (value, context) {\n if (value instanceof StaticSymbol) {\n var /** @type {?} */ index = this.indexBySymbol.get(value);\n // Note: == by purpose to compare with undefined!\n if (index == null) {\n index = this.indexBySymbol.size;\n this.indexBySymbol.set(value, index);\n this.symbols.push(value);\n }\n return { __symbol: index };\n }\n };\n return Serializer;\n }(ValueTransformer));\n var Deserializer = (function (_super) {\n __extends$23(Deserializer, _super);\n /**\n * @param {?} symbolCache\n */\n function Deserializer(symbolCache) {\n _super.call(this);\n this.symbolCache = symbolCache;\n }\n /**\n * @param {?} json\n * @return {?}\n */\n Deserializer.prototype.deserialize = function (json) {\n var _this = this;\n var /** @type {?} */ data = JSON.parse(json);\n this.symbols = data.symbols.map(function (serializedSymbol) { return _this.symbolCache.get(serializedSymbol.filePath, serializedSymbol.name); });\n return visitValue(data.summaries, this, null);\n };\n /**\n * @param {?} map\n * @param {?} context\n * @return {?}\n */\n Deserializer.prototype.visitStringMap = function (map, context) {\n if ('__symbol' in map) {\n return this.symbols[map['__symbol']];\n }\n else {\n return _super.prototype.visitStringMap.call(this, map, context);\n }\n };\n return Deserializer;\n }(ValueTransformer));\n\n var AotCompiler = (function () {\n /**\n * @param {?} _host\n * @param {?} _metadataResolver\n * @param {?} _templateParser\n * @param {?} _styleCompiler\n * @param {?} _viewCompiler\n * @param {?} _dirWrapperCompiler\n * @param {?} _ngModuleCompiler\n * @param {?} _outputEmitter\n * @param {?} _summaryResolver\n * @param {?} _localeId\n * @param {?} _translationFormat\n * @param {?} _animationParser\n * @param {?} _symbolResolver\n */\n function AotCompiler(_host, _metadataResolver, _templateParser, _styleCompiler, _viewCompiler, _dirWrapperCompiler, _ngModuleCompiler, _outputEmitter, _summaryResolver, _localeId, _translationFormat, _animationParser, _symbolResolver) {\n this._host = _host;\n this._metadataResolver = _metadataResolver;\n this._templateParser = _templateParser;\n this._styleCompiler = _styleCompiler;\n this._viewCompiler = _viewCompiler;\n this._dirWrapperCompiler = _dirWrapperCompiler;\n this._ngModuleCompiler = _ngModuleCompiler;\n this._outputEmitter = _outputEmitter;\n this._summaryResolver = _summaryResolver;\n this._localeId = _localeId;\n this._translationFormat = _translationFormat;\n this._animationParser = _animationParser;\n this._symbolResolver = _symbolResolver;\n this._animationCompiler = new AnimationCompiler();\n }\n /**\n * @return {?}\n */\n AotCompiler.prototype.clearCache = function () { this._metadataResolver.clearCache(); };\n /**\n * @param {?} rootFiles\n * @return {?}\n */\n AotCompiler.prototype.compileAll = function (rootFiles) {\n var _this = this;\n var /** @type {?} */ programSymbols = extractProgramSymbols(this._symbolResolver, rootFiles, this._host);\n var _a = analyzeAndValidateNgModules(programSymbols, this._host, this._metadataResolver), ngModuleByPipeOrDirective = _a.ngModuleByPipeOrDirective, files = _a.files, ngModules = _a.ngModules;\n return Promise\n .all(ngModules.map(function (ngModule) { return _this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference, false); }))\n .then(function () {\n var /** @type {?} */ sourceModules = files.map(function (file) { return _this._compileSrcFile(file.srcUrl, ngModuleByPipeOrDirective, file.directives, file.pipes, file.ngModules, file.injectables); });\n return ListWrapper.flatten(sourceModules);\n });\n };\n /**\n * @param {?} srcFileUrl\n * @param {?} ngModuleByPipeOrDirective\n * @param {?} directives\n * @param {?} pipes\n * @param {?} ngModules\n * @param {?} injectables\n * @return {?}\n */\n AotCompiler.prototype._compileSrcFile = function (srcFileUrl, ngModuleByPipeOrDirective, directives, pipes, ngModules, injectables) {\n var _this = this;\n var /** @type {?} */ fileSuffix = _splitTypescriptSuffix(srcFileUrl)[1];\n var /** @type {?} */ statements = [];\n var /** @type {?} */ exportedVars = [];\n var /** @type {?} */ generatedFiles = [];\n generatedFiles.push(this._createSummary(srcFileUrl, directives, pipes, ngModules, injectables));\n // compile all ng modules\n exportedVars.push.apply(exportedVars, ngModules.map(function (ngModuleType) { return _this._compileModule(ngModuleType, statements); }));\n // compile directive wrappers\n exportedVars.push.apply(exportedVars, directives.map(function (directiveType) { return _this._compileDirectiveWrapper(directiveType, statements); }));\n // compile components\n directives.forEach(function (dirType) {\n var /** @type {?} */ compMeta = _this._metadataResolver.getDirectiveMetadata(/** @type {?} */ (dirType));\n if (!compMeta.isComponent) {\n return Promise.resolve(null);\n }\n var /** @type {?} */ ngModule = ngModuleByPipeOrDirective.get(dirType);\n if (!ngModule) {\n throw new Error(\"Internal Error: cannot determine the module for component \" + identifierName(compMeta.type) + \"!\");\n }\n _assertComponent(compMeta);\n // compile styles\n var /** @type {?} */ stylesCompileResults = _this._styleCompiler.compileComponent(compMeta);\n stylesCompileResults.externalStylesheets.forEach(function (compiledStyleSheet) {\n generatedFiles.push(_this._codgenStyles(srcFileUrl, compiledStyleSheet, fileSuffix));\n });\n // compile components\n exportedVars.push(_this._compileComponentFactory(compMeta, ngModule, fileSuffix, statements), _this._compileComponent(compMeta, ngModule, ngModule.transitiveModule.directives, stylesCompileResults.componentStylesheet, fileSuffix, statements));\n });\n if (statements.length > 0) {\n var /** @type {?} */ srcModule = this._codegenSourceModule(srcFileUrl, _ngfactoryModuleUrl(srcFileUrl), statements, exportedVars);\n generatedFiles.unshift(srcModule);\n }\n return generatedFiles;\n };\n /**\n * @param {?} srcFileUrl\n * @param {?} directives\n * @param {?} pipes\n * @param {?} ngModules\n * @param {?} injectables\n * @return {?}\n */\n AotCompiler.prototype._createSummary = function (srcFileUrl, directives, pipes, ngModules, injectables) {\n var _this = this;\n var /** @type {?} */ symbolSummaries = this._symbolResolver.getSymbolsOf(srcFileUrl)\n .map(function (symbol) { return _this._symbolResolver.resolveSymbol(symbol); });\n var /** @type {?} */ typeSummaries = ngModules.map(function (ref) { return _this._metadataResolver.getNgModuleSummary(ref); }).concat(directives.map(function (ref) { return _this._metadataResolver.getDirectiveSummary(ref); }), pipes.map(function (ref) { return _this._metadataResolver.getPipeSummary(ref); }), injectables.map(function (ref) { return _this._metadataResolver.getInjectableSummary(ref); }));\n var /** @type {?} */ json = serializeSummaries(this._host, this._summaryResolver, this._symbolResolver, symbolSummaries, typeSummaries);\n return new GeneratedFile(srcFileUrl, summaryFileName(srcFileUrl), json);\n };\n /**\n * @param {?} ngModuleType\n * @param {?} targetStatements\n * @return {?}\n */\n AotCompiler.prototype._compileModule = function (ngModuleType, targetStatements) {\n var _this = this;\n var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(ngModuleType);\n var /** @type {?} */ providers = [];\n if (this._localeId) {\n providers.push({\n token: createIdentifierToken(Identifiers.LOCALE_ID),\n useValue: this._localeId,\n });\n }\n if (this._translationFormat) {\n providers.push({\n token: createIdentifierToken(Identifiers.TRANSLATIONS_FORMAT),\n useValue: this._translationFormat\n });\n }\n var /** @type {?} */ appCompileResult = this._ngModuleCompiler.compile(ngModule, providers);\n appCompileResult.dependencies.forEach(function (dep) {\n dep.placeholder.reference = _this._symbolResolver.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(dep.comp)), _componentFactoryName(dep.comp));\n });\n targetStatements.push.apply(targetStatements, appCompileResult.statements);\n return appCompileResult.ngModuleFactoryVar;\n };\n /**\n * @param {?} directiveType\n * @param {?} targetStatements\n * @return {?}\n */\n AotCompiler.prototype._compileDirectiveWrapper = function (directiveType, targetStatements) {\n var /** @type {?} */ dirMeta = this._metadataResolver.getDirectiveMetadata(directiveType);\n var /** @type {?} */ dirCompileResult = this._dirWrapperCompiler.compile(dirMeta);\n targetStatements.push.apply(targetStatements, dirCompileResult.statements);\n return dirCompileResult.dirWrapperClassVar;\n };\n /**\n * @param {?} compMeta\n * @param {?} ngModule\n * @param {?} fileSuffix\n * @param {?} targetStatements\n * @return {?}\n */\n AotCompiler.prototype._compileComponentFactory = function (compMeta, ngModule, fileSuffix, targetStatements) {\n var /** @type {?} */ hostMeta = createHostComponentMeta(this._symbolResolver.getStaticSymbol(identifierModuleUrl(compMeta.type), identifierName(compMeta.type) + \"_Host\"), compMeta);\n var /** @type {?} */ hostViewFactoryVar = this._compileComponent(hostMeta, ngModule, [compMeta.type], null, fileSuffix, targetStatements);\n var /** @type {?} */ compFactoryVar = _componentFactoryName(compMeta.type);\n targetStatements.push(variable(compFactoryVar)\n .set(importExpr(createIdentifier(Identifiers.ComponentFactory), [importType(compMeta.type)])\n .instantiate([\n literal(compMeta.selector),\n variable(hostViewFactoryVar),\n importExpr(compMeta.type),\n ], importType(createIdentifier(Identifiers.ComponentFactory), [importType(compMeta.type)], [TypeModifier.Const])))\n .toDeclStmt(null, [StmtModifier.Final]));\n return compFactoryVar;\n };\n /**\n * @param {?} compMeta\n * @param {?} ngModule\n * @param {?} directiveIdentifiers\n * @param {?} componentStyles\n * @param {?} fileSuffix\n * @param {?} targetStatements\n * @return {?}\n */\n AotCompiler.prototype._compileComponent = function (compMeta, ngModule, directiveIdentifiers, componentStyles, fileSuffix, targetStatements) {\n var _this = this;\n var /** @type {?} */ parsedAnimations = this._animationParser.parseComponent(compMeta);\n var /** @type {?} */ directives = directiveIdentifiers.map(function (dir) { return _this._metadataResolver.getDirectiveSummary(dir.reference); });\n var /** @type {?} */ pipes = ngModule.transitiveModule.pipes.map(function (pipe) { return _this._metadataResolver.getPipeSummary(pipe.reference); });\n var /** @type {?} */ parsedTemplate = this._templateParser.parse(compMeta, compMeta.template.template, directives, pipes, ngModule.schemas, identifierName(compMeta.type));\n var /** @type {?} */ stylesExpr = componentStyles ? variable(componentStyles.stylesVar) : literalArr([]);\n var /** @type {?} */ compiledAnimations = this._animationCompiler.compile(identifierName(compMeta.type), parsedAnimations);\n var /** @type {?} */ viewResult = this._viewCompiler.compileComponent(compMeta, parsedTemplate, stylesExpr, pipes, compiledAnimations);\n if (componentStyles) {\n targetStatements.push.apply(targetStatements, _resolveStyleStatements(this._symbolResolver, componentStyles, fileSuffix));\n }\n compiledAnimations.forEach(function (entry) { return targetStatements.push.apply(targetStatements, entry.statements); });\n targetStatements.push.apply(targetStatements, _resolveViewStatements(this._symbolResolver, viewResult));\n return viewResult.viewClassVar;\n };\n /**\n * @param {?} fileUrl\n * @param {?} stylesCompileResult\n * @param {?} fileSuffix\n * @return {?}\n */\n AotCompiler.prototype._codgenStyles = function (fileUrl, stylesCompileResult, fileSuffix) {\n _resolveStyleStatements(this._symbolResolver, stylesCompileResult, fileSuffix);\n return this._codegenSourceModule(fileUrl, _stylesModuleUrl(stylesCompileResult.meta.moduleUrl, stylesCompileResult.isShimmed, fileSuffix), stylesCompileResult.statements, [stylesCompileResult.stylesVar]);\n };\n /**\n * @param {?} srcFileUrl\n * @param {?} genFileUrl\n * @param {?} statements\n * @param {?} exportedVars\n * @return {?}\n */\n AotCompiler.prototype._codegenSourceModule = function (srcFileUrl, genFileUrl, statements, exportedVars) {\n return new GeneratedFile(srcFileUrl, genFileUrl, this._outputEmitter.emitStatements(genFileUrl, statements, exportedVars));\n };\n return AotCompiler;\n }());\n /**\n * @param {?} reflector\n * @param {?} compileResult\n * @return {?}\n */\n function _resolveViewStatements(reflector, compileResult) {\n compileResult.dependencies.forEach(function (dep) {\n if (dep instanceof ViewClassDependency) {\n var /** @type {?} */ vfd = (dep);\n vfd.placeholder.reference =\n reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(vfd.comp)), dep.name);\n }\n else if (dep instanceof ComponentFactoryDependency$1) {\n var /** @type {?} */ cfd = (dep);\n cfd.placeholder.reference = reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(cfd.comp)), _componentFactoryName(cfd.comp));\n }\n else if (dep instanceof DirectiveWrapperDependency) {\n var /** @type {?} */ dwd = (dep);\n dwd.placeholder.reference =\n reflector.getStaticSymbol(_ngfactoryModuleUrl(identifierModuleUrl(dwd.dir)), dwd.name);\n }\n });\n return compileResult.statements;\n }\n /**\n * @param {?} reflector\n * @param {?} compileResult\n * @param {?} fileSuffix\n * @return {?}\n */\n function _resolveStyleStatements(reflector, compileResult, fileSuffix) {\n compileResult.dependencies.forEach(function (dep) {\n dep.valuePlaceholder.reference = reflector.getStaticSymbol(_stylesModuleUrl(dep.moduleUrl, dep.isShimmed, fileSuffix), dep.name);\n });\n return compileResult.statements;\n }\n /**\n * @param {?} dirUrl\n * @return {?}\n */\n function _ngfactoryModuleUrl(dirUrl) {\n var /** @type {?} */ urlWithSuffix = _splitTypescriptSuffix(dirUrl);\n return urlWithSuffix[0] + \".ngfactory\" + urlWithSuffix[1];\n }\n /**\n * @param {?} comp\n * @return {?}\n */\n function _componentFactoryName(comp) {\n return identifierName(comp) + \"NgFactory\";\n }\n /**\n * @param {?} stylesheetUrl\n * @param {?} shim\n * @param {?} suffix\n * @return {?}\n */\n function _stylesModuleUrl(stylesheetUrl, shim, suffix) {\n return \"\" + stylesheetUrl + (shim ? '.shim' : '') + \".ngstyle\" + suffix;\n }\n /**\n * @param {?} meta\n * @return {?}\n */\n function _assertComponent(meta) {\n if (!meta.isComponent) {\n throw new Error(\"Could not compile '\" + identifierName(meta.type) + \"' because it is not a component.\");\n }\n }\n /**\n * @param {?} path\n * @return {?}\n */\n function _splitTypescriptSuffix(path) {\n if (path.endsWith('.d.ts')) {\n return [path.slice(0, -5), '.ts'];\n }\n var /** @type {?} */ lastDot = path.lastIndexOf('.');\n if (lastDot !== -1) {\n return [path.substring(0, lastDot), path.substring(lastDot)];\n }\n return [path, ''];\n }\n /**\n * @param {?} programStaticSymbols\n * @param {?} host\n * @param {?} metadataResolver\n * @return {?}\n */\n function analyzeNgModules(programStaticSymbols, host, metadataResolver) {\n var _a = _createNgModules(programStaticSymbols, host, metadataResolver), ngModules = _a.ngModules, symbolsMissingModule = _a.symbolsMissingModule;\n return _analyzeNgModules(programStaticSymbols, ngModules, symbolsMissingModule, metadataResolver);\n }\n /**\n * @param {?} programStaticSymbols\n * @param {?} host\n * @param {?} metadataResolver\n * @return {?}\n */\n function analyzeAndValidateNgModules(programStaticSymbols, host, metadataResolver) {\n var /** @type {?} */ result = analyzeNgModules(programStaticSymbols, host, metadataResolver);\n if (result.symbolsMissingModule && result.symbolsMissingModule.length) {\n var /** @type {?} */ messages = result.symbolsMissingModule.map(function (s) { return (\"Cannot determine the module for class \" + s.name + \" in \" + s.filePath + \"!\"); });\n throw new Error(messages.join('\\n'));\n }\n return result;\n }\n /**\n * @param {?} programSymbols\n * @param {?} ngModuleMetas\n * @param {?} symbolsMissingModule\n * @param {?} metadataResolver\n * @return {?}\n */\n function _analyzeNgModules(programSymbols, ngModuleMetas, symbolsMissingModule, metadataResolver) {\n var /** @type {?} */ moduleMetasByRef = new Map();\n ngModuleMetas.forEach(function (ngModule) { return moduleMetasByRef.set(ngModule.type.reference, ngModule); });\n var /** @type {?} */ ngModuleByPipeOrDirective = new Map();\n var /** @type {?} */ ngModulesByFile = new Map();\n var /** @type {?} */ ngDirectivesByFile = new Map();\n var /** @type {?} */ ngPipesByFile = new Map();\n var /** @type {?} */ ngInjectablesByFile = new Map();\n var /** @type {?} */ filePaths = new Set();\n // Make sure we produce an analyzed file for each input file\n programSymbols.forEach(function (symbol) {\n var /** @type {?} */ filePath = symbol.filePath;\n filePaths.add(filePath);\n if (metadataResolver.isInjectable(symbol)) {\n ngInjectablesByFile.set(filePath, (ngInjectablesByFile.get(filePath) || []).concat(symbol));\n }\n });\n // Looping over all modules to construct:\n // - a map from file to modules `ngModulesByFile`,\n // - a map from file to directives `ngDirectivesByFile`,\n // - a map from file to pipes `ngPipesByFile`,\n // - a map from directive/pipe to module `ngModuleByPipeOrDirective`.\n ngModuleMetas.forEach(function (ngModuleMeta) {\n var /** @type {?} */ srcFileUrl = ngModuleMeta.type.reference.filePath;\n filePaths.add(srcFileUrl);\n ngModulesByFile.set(srcFileUrl, (ngModulesByFile.get(srcFileUrl) || []).concat(ngModuleMeta.type.reference));\n ngModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n var /** @type {?} */ fileUrl = dirIdentifier.reference.filePath;\n filePaths.add(fileUrl);\n ngDirectivesByFile.set(fileUrl, (ngDirectivesByFile.get(fileUrl) || []).concat(dirIdentifier.reference));\n ngModuleByPipeOrDirective.set(dirIdentifier.reference, ngModuleMeta);\n });\n ngModuleMeta.declaredPipes.forEach(function (pipeIdentifier) {\n var /** @type {?} */ fileUrl = pipeIdentifier.reference.filePath;\n filePaths.add(fileUrl);\n ngPipesByFile.set(fileUrl, (ngPipesByFile.get(fileUrl) || []).concat(pipeIdentifier.reference));\n ngModuleByPipeOrDirective.set(pipeIdentifier.reference, ngModuleMeta);\n });\n });\n var /** @type {?} */ files = [];\n filePaths.forEach(function (srcUrl) {\n var /** @type {?} */ directives = ngDirectivesByFile.get(srcUrl) || [];\n var /** @type {?} */ pipes = ngPipesByFile.get(srcUrl) || [];\n var /** @type {?} */ ngModules = ngModulesByFile.get(srcUrl) || [];\n var /** @type {?} */ injectables = ngInjectablesByFile.get(srcUrl) || [];\n files.push({ srcUrl: srcUrl, directives: directives, pipes: pipes, ngModules: ngModules, injectables: injectables });\n });\n return {\n // map directive/pipe to module\n ngModuleByPipeOrDirective: ngModuleByPipeOrDirective,\n // list modules and directives for every source file\n files: files,\n ngModules: ngModuleMetas, symbolsMissingModule: symbolsMissingModule\n };\n }\n /**\n * @param {?} staticSymbolResolver\n * @param {?} files\n * @param {?} host\n * @return {?}\n */\n function extractProgramSymbols(staticSymbolResolver, files, host) {\n var /** @type {?} */ staticSymbols = [];\n files.filter(function (fileName) { return host.isSourceFile(fileName); }).forEach(function (sourceFile) {\n staticSymbolResolver.getSymbolsOf(sourceFile).forEach(function (symbol) {\n var /** @type {?} */ resolvedSymbol = staticSymbolResolver.resolveSymbol(symbol);\n var /** @type {?} */ symbolMeta = resolvedSymbol.metadata;\n if (symbolMeta) {\n if (symbolMeta.__symbolic != 'error') {\n // Ignore symbols that are only included to record error information.\n staticSymbols.push(resolvedSymbol.symbol);\n }\n }\n });\n });\n return staticSymbols;\n }\n /**\n * @param {?} programStaticSymbols\n * @param {?} host\n * @param {?} metadataResolver\n * @return {?}\n */\n function _createNgModules(programStaticSymbols, host, metadataResolver) {\n var /** @type {?} */ ngModules = new Map();\n var /** @type {?} */ programPipesAndDirectives = [];\n var /** @type {?} */ ngModulePipesAndDirective = new Set();\n var /** @type {?} */ addNgModule = function (staticSymbol) {\n if (ngModules.has(staticSymbol) || !host.isSourceFile(staticSymbol.filePath)) {\n return false;\n }\n var /** @type {?} */ ngModule = metadataResolver.getNgModuleMetadata(staticSymbol, false);\n if (ngModule) {\n ngModules.set(ngModule.type.reference, ngModule);\n ngModule.declaredDirectives.forEach(function (dir) { return ngModulePipesAndDirective.add(dir.reference); });\n ngModule.declaredPipes.forEach(function (pipe) { return ngModulePipesAndDirective.add(pipe.reference); });\n // For every input module add the list of transitively included modules\n ngModule.transitiveModule.modules.forEach(function (modMeta) { return addNgModule(modMeta.reference); });\n }\n return !!ngModule;\n };\n programStaticSymbols.forEach(function (staticSymbol) {\n if (!addNgModule(staticSymbol) &&\n (metadataResolver.isDirective(staticSymbol) || metadataResolver.isPipe(staticSymbol))) {\n programPipesAndDirectives.push(staticSymbol);\n }\n });\n // Throw an error if any of the program pipe or directives is not declared by a module\n var /** @type {?} */ symbolsMissingModule = programPipesAndDirectives.filter(function (s) { return !ngModulePipesAndDirective.has(s); });\n return { ngModules: Array.from(ngModules.values()), symbolsMissingModule: symbolsMissingModule };\n }\n\n var StaticAndDynamicReflectionCapabilities = (function () {\n /**\n * @param {?} staticDelegate\n */\n function StaticAndDynamicReflectionCapabilities(staticDelegate) {\n this.staticDelegate = staticDelegate;\n this.dynamicDelegate = new ReflectionCapabilities();\n }\n /**\n * @param {?} staticDelegate\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.install = function (staticDelegate) {\n reflector.updateCapabilities(new StaticAndDynamicReflectionCapabilities(staticDelegate));\n };\n /**\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.factory = function (type) { return this.dynamicDelegate.factory(type); };\n /**\n * @param {?} type\n * @param {?} lcProperty\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.hasLifecycleHook = function (type, lcProperty) {\n return isStaticType(type) ? this.staticDelegate.hasLifecycleHook(type, lcProperty) :\n this.dynamicDelegate.hasLifecycleHook(type, lcProperty);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.parameters = function (type) {\n return isStaticType(type) ? this.staticDelegate.parameters(type) :\n this.dynamicDelegate.parameters(type);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.annotations = function (type) {\n return isStaticType(type) ? this.staticDelegate.annotations(type) :\n this.dynamicDelegate.annotations(type);\n };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {\n return isStaticType(typeOrFunc) ? this.staticDelegate.propMetadata(typeOrFunc) :\n this.dynamicDelegate.propMetadata(typeOrFunc);\n };\n /**\n * @param {?} name\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.getter = function (name) { return this.dynamicDelegate.getter(name); };\n /**\n * @param {?} name\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.setter = function (name) { return this.dynamicDelegate.setter(name); };\n /**\n * @param {?} name\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.method = function (name) { return this.dynamicDelegate.method(name); };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.importUri = function (type) { return this.staticDelegate.importUri(type); };\n /**\n * @param {?} name\n * @param {?} moduleUrl\n * @param {?} runtime\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.resolveIdentifier = function (name, moduleUrl, runtime) {\n return this.staticDelegate.resolveIdentifier(name, moduleUrl);\n };\n /**\n * @param {?} enumIdentifier\n * @param {?} name\n * @return {?}\n */\n StaticAndDynamicReflectionCapabilities.prototype.resolveEnum = function (enumIdentifier, name) {\n if (isStaticType(enumIdentifier)) {\n return this.staticDelegate.resolveEnum(enumIdentifier, name);\n }\n else {\n return null;\n }\n };\n return StaticAndDynamicReflectionCapabilities;\n }());\n /**\n * @param {?} type\n * @return {?}\n */\n function isStaticType(type) {\n return typeof type === 'object' && type.name && type.filePath;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$24 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ ANGULAR_IMPORT_LOCATIONS = {\n coreDecorators: '@angular/core/src/metadata',\n diDecorators: '@angular/core/src/di/metadata',\n diMetadata: '@angular/core/src/di/metadata',\n diOpaqueToken: '@angular/core/src/di/opaque_token',\n animationMetadata: '@angular/core/src/animation/metadata',\n provider: '@angular/core/src/di/provider'\n };\n var /** @type {?} */ HIDDEN_KEY = /^\\$.*\\$$/;\n /**\n * A static reflector implements enough of the Reflector API that is necessary to compile\n * templates statically.\n */\n var StaticReflector = (function () {\n /**\n * @param {?} symbolResolver\n * @param {?=} knownMetadataClasses\n * @param {?=} knownMetadataFunctions\n * @param {?=} errorRecorder\n */\n function StaticReflector(symbolResolver, knownMetadataClasses, knownMetadataFunctions, errorRecorder) {\n var _this = this;\n if (knownMetadataClasses === void 0) { knownMetadataClasses = []; }\n if (knownMetadataFunctions === void 0) { knownMetadataFunctions = []; }\n this.symbolResolver = symbolResolver;\n this.errorRecorder = errorRecorder;\n this.annotationCache = new Map();\n this.propertyCache = new Map();\n this.parameterCache = new Map();\n this.methodCache = new Map();\n this.conversionMap = new Map();\n this.initializeConversionMap();\n knownMetadataClasses.forEach(function (kc) { return _this._registerDecoratorOrConstructor(_this.getStaticSymbol(kc.filePath, kc.name), kc.ctor); });\n knownMetadataFunctions.forEach(function (kf) { return _this._registerFunction(_this.getStaticSymbol(kf.filePath, kf.name), kf.fn); });\n }\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n StaticReflector.prototype.importUri = function (typeOrFunc) {\n var /** @type {?} */ staticSymbol = this.findSymbolDeclaration(typeOrFunc);\n return staticSymbol ? staticSymbol.filePath : null;\n };\n /**\n * @param {?} name\n * @param {?} moduleUrl\n * @return {?}\n */\n StaticReflector.prototype.resolveIdentifier = function (name, moduleUrl) {\n return this.findDeclaration(moduleUrl, name);\n };\n /**\n * @param {?} moduleUrl\n * @param {?} name\n * @param {?=} containingFile\n * @return {?}\n */\n StaticReflector.prototype.findDeclaration = function (moduleUrl, name, containingFile) {\n return this.findSymbolDeclaration(this.symbolResolver.getSymbolByModule(moduleUrl, name, containingFile));\n };\n /**\n * @param {?} symbol\n * @return {?}\n */\n StaticReflector.prototype.findSymbolDeclaration = function (symbol) {\n var /** @type {?} */ resolvedSymbol = this.symbolResolver.resolveSymbol(symbol);\n if (resolvedSymbol && resolvedSymbol.metadata instanceof StaticSymbol) {\n return this.findSymbolDeclaration(resolvedSymbol.metadata);\n }\n else {\n return symbol;\n }\n };\n /**\n * @param {?} enumIdentifier\n * @param {?} name\n * @return {?}\n */\n StaticReflector.prototype.resolveEnum = function (enumIdentifier, name) {\n var /** @type {?} */ staticSymbol = enumIdentifier;\n return this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name, [name]);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticReflector.prototype.annotations = function (type) {\n var /** @type {?} */ annotations = this.annotationCache.get(type);\n if (!annotations) {\n annotations = [];\n var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n if (classMetadata['extends']) {\n var /** @type {?} */ parentAnnotations = this.annotations(this.simplify(type, classMetadata['extends']));\n annotations.push.apply(annotations, parentAnnotations);\n }\n if (classMetadata['decorators']) {\n var /** @type {?} */ ownAnnotations = this.simplify(type, classMetadata['decorators']);\n annotations.push.apply(annotations, ownAnnotations);\n }\n this.annotationCache.set(type, annotations.filter(function (ann) { return !!ann; }));\n }\n return annotations;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticReflector.prototype.propMetadata = function (type) {\n var _this = this;\n var /** @type {?} */ propMetadata = this.propertyCache.get(type);\n if (!propMetadata) {\n var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n propMetadata = {};\n if (classMetadata['extends']) {\n var /** @type {?} */ parentPropMetadata_1 = this.propMetadata(this.simplify(type, classMetadata['extends']));\n Object.keys(parentPropMetadata_1).forEach(function (parentProp) {\n propMetadata[parentProp] = parentPropMetadata_1[parentProp];\n });\n }\n var /** @type {?} */ members_1 = classMetadata['members'] || {};\n Object.keys(members_1).forEach(function (propName) {\n var /** @type {?} */ propData = members_1[propName];\n var /** @type {?} */ prop = ((propData))\n .find(function (a) { return a['__symbolic'] == 'property' || a['__symbolic'] == 'method'; });\n var /** @type {?} */ decorators = [];\n if (propMetadata[propName]) {\n decorators.push.apply(decorators, propMetadata[propName]);\n }\n propMetadata[propName] = decorators;\n if (prop && prop['decorators']) {\n decorators.push.apply(decorators, _this.simplify(type, prop['decorators']));\n }\n });\n this.propertyCache.set(type, propMetadata);\n }\n return propMetadata;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticReflector.prototype.parameters = function (type) {\n if (!(type instanceof StaticSymbol)) {\n this.reportError(new Error(\"parameters received \" + JSON.stringify(type) + \" which is not a StaticSymbol\"), type);\n return [];\n }\n try {\n var /** @type {?} */ parameters_1 = this.parameterCache.get(type);\n if (!parameters_1) {\n var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n var /** @type {?} */ members = classMetadata ? classMetadata['members'] : null;\n var /** @type {?} */ ctorData = members ? members['__ctor__'] : null;\n if (ctorData) {\n var /** @type {?} */ ctor = ((ctorData)).find(function (a) { return a['__symbolic'] == 'constructor'; });\n var /** @type {?} */ parameterTypes = (this.simplify(type, ctor['parameters'] || []));\n var /** @type {?} */ parameterDecorators_1 = (this.simplify(type, ctor['parameterDecorators'] || []));\n parameters_1 = [];\n parameterTypes.forEach(function (paramType, index) {\n var /** @type {?} */ nestedResult = [];\n if (paramType) {\n nestedResult.push(paramType);\n }\n var /** @type {?} */ decorators = parameterDecorators_1 ? parameterDecorators_1[index] : null;\n if (decorators) {\n nestedResult.push.apply(nestedResult, decorators);\n }\n parameters_1.push(nestedResult);\n });\n }\n else if (classMetadata['extends']) {\n parameters_1 = this.parameters(this.simplify(type, classMetadata['extends']));\n }\n if (!parameters_1) {\n parameters_1 = [];\n }\n this.parameterCache.set(type, parameters_1);\n }\n return parameters_1;\n }\n catch (e) {\n console.error(\"Failed on type \" + JSON.stringify(type) + \" with error \" + e);\n throw e;\n }\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticReflector.prototype._methodNames = function (type) {\n var /** @type {?} */ methodNames = this.methodCache.get(type);\n if (!methodNames) {\n var /** @type {?} */ classMetadata = this.getTypeMetadata(type);\n methodNames = {};\n if (classMetadata['extends']) {\n var /** @type {?} */ parentMethodNames_1 = this._methodNames(this.simplify(type, classMetadata['extends']));\n Object.keys(parentMethodNames_1).forEach(function (parentProp) {\n methodNames[parentProp] = parentMethodNames_1[parentProp];\n });\n }\n var /** @type {?} */ members_2 = classMetadata['members'] || {};\n Object.keys(members_2).forEach(function (propName) {\n var /** @type {?} */ propData = members_2[propName];\n var /** @type {?} */ isMethod = ((propData)).some(function (a) { return a['__symbolic'] == 'method'; });\n methodNames[propName] = methodNames[propName] || isMethod;\n });\n this.methodCache.set(type, methodNames);\n }\n return methodNames;\n };\n /**\n * @param {?} type\n * @param {?} lcProperty\n * @return {?}\n */\n StaticReflector.prototype.hasLifecycleHook = function (type, lcProperty) {\n if (!(type instanceof StaticSymbol)) {\n this.reportError(new Error(\"hasLifecycleHook received \" + JSON.stringify(type) + \" which is not a StaticSymbol\"), type);\n }\n try {\n return !!this._methodNames(type)[lcProperty];\n }\n catch (e) {\n console.error(\"Failed on type \" + JSON.stringify(type) + \" with error \" + e);\n throw e;\n }\n };\n /**\n * @param {?} type\n * @param {?} ctor\n * @return {?}\n */\n StaticReflector.prototype._registerDecoratorOrConstructor = function (type, ctor) {\n this.conversionMap.set(type, function (context, args) { return new (ctor.bind.apply(ctor, [void 0].concat(args)))(); });\n };\n /**\n * @param {?} type\n * @param {?} fn\n * @return {?}\n */\n StaticReflector.prototype._registerFunction = function (type, fn) {\n this.conversionMap.set(type, function (context, args) { return fn.apply(undefined, args); });\n };\n /**\n * @return {?}\n */\n StaticReflector.prototype.initializeConversionMap = function () {\n var coreDecorators = ANGULAR_IMPORT_LOCATIONS.coreDecorators, diDecorators = ANGULAR_IMPORT_LOCATIONS.diDecorators, diMetadata = ANGULAR_IMPORT_LOCATIONS.diMetadata, diOpaqueToken = ANGULAR_IMPORT_LOCATIONS.diOpaqueToken, animationMetadata = ANGULAR_IMPORT_LOCATIONS.animationMetadata, provider = ANGULAR_IMPORT_LOCATIONS.provider;\n this.opaqueToken = this.findDeclaration(diOpaqueToken, 'OpaqueToken');\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Host'), _angular_core.Host);\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Injectable'), _angular_core.Injectable);\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Self'), _angular_core.Self);\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'SkipSelf'), _angular_core.SkipSelf);\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Inject'), _angular_core.Inject);\n this._registerDecoratorOrConstructor(this.findDeclaration(diDecorators, 'Optional'), _angular_core.Optional);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Attribute'), _angular_core.Attribute);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ContentChild'), _angular_core.ContentChild);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ContentChildren'), _angular_core.ContentChildren);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ViewChild'), _angular_core.ViewChild);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'ViewChildren'), _angular_core.ViewChildren);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Input'), _angular_core.Input);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Output'), _angular_core.Output);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Pipe'), _angular_core.Pipe);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'HostBinding'), _angular_core.HostBinding);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'HostListener'), _angular_core.HostListener);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Directive'), _angular_core.Directive);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'Component'), _angular_core.Component);\n this._registerDecoratorOrConstructor(this.findDeclaration(coreDecorators, 'NgModule'), _angular_core.NgModule);\n // Note: Some metadata classes can be used directly with Provider.deps.\n this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Host'), _angular_core.Host);\n this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Self'), _angular_core.Self);\n this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'SkipSelf'), _angular_core.SkipSelf);\n this._registerDecoratorOrConstructor(this.findDeclaration(diMetadata, 'Optional'), _angular_core.Optional);\n this._registerFunction(this.findDeclaration(animationMetadata, 'trigger'), _angular_core.trigger);\n this._registerFunction(this.findDeclaration(animationMetadata, 'state'), _angular_core.state);\n this._registerFunction(this.findDeclaration(animationMetadata, 'transition'), _angular_core.transition);\n this._registerFunction(this.findDeclaration(animationMetadata, 'style'), _angular_core.style);\n this._registerFunction(this.findDeclaration(animationMetadata, 'animate'), _angular_core.animate);\n this._registerFunction(this.findDeclaration(animationMetadata, 'keyframes'), _angular_core.keyframes);\n this._registerFunction(this.findDeclaration(animationMetadata, 'sequence'), _angular_core.sequence);\n this._registerFunction(this.findDeclaration(animationMetadata, 'group'), _angular_core.group);\n };\n /**\n * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.\n * All types passed to the StaticResolver should be pseudo-types returned by this method.\n * *\n * @param {?} declarationFile the absolute path of the file where the symbol is declared\n * @param {?} name the name of the type.\n * @param {?=} members\n * @return {?}\n */\n StaticReflector.prototype.getStaticSymbol = function (declarationFile, name, members) {\n return this.symbolResolver.getStaticSymbol(declarationFile, name, members);\n };\n /**\n * @param {?} error\n * @param {?} context\n * @param {?=} path\n * @return {?}\n */\n StaticReflector.prototype.reportError = function (error, context, path) {\n if (this.errorRecorder) {\n this.errorRecorder(error, (context && context.filePath) || path);\n }\n else {\n throw error;\n }\n };\n /**\n * @param {?} context\n * @param {?} value\n * @return {?}\n */\n StaticReflector.prototype.simplify = function (context, value) {\n var _this = this;\n var /** @type {?} */ self = this;\n var /** @type {?} */ scope = BindingScope.empty;\n var /** @type {?} */ calling = new Map();\n /**\n * @param {?} context\n * @param {?} value\n * @param {?} depth\n * @return {?}\n */\n function simplifyInContext(context, value, depth) {\n /**\n * @param {?} staticSymbol\n * @return {?}\n */\n function resolveReferenceValue(staticSymbol) {\n var /** @type {?} */ resolvedSymbol = self.symbolResolver.resolveSymbol(staticSymbol);\n return resolvedSymbol ? resolvedSymbol.metadata : null;\n }\n /**\n * @param {?} functionSymbol\n * @param {?} targetFunction\n * @param {?} args\n * @return {?}\n */\n function simplifyCall(functionSymbol, targetFunction, args) {\n if (targetFunction && targetFunction['__symbolic'] == 'function') {\n if (calling.get(functionSymbol)) {\n throw new Error('Recursion not supported');\n }\n calling.set(functionSymbol, true);\n try {\n var /** @type {?} */ value_1 = targetFunction['value'];\n if (value_1 && (depth != 0 || value_1.__symbolic != 'error')) {\n var /** @type {?} */ parameters = targetFunction['parameters'];\n var /** @type {?} */ defaults = targetFunction.defaults;\n if (defaults && defaults.length > args.length) {\n args.push.apply(args, defaults.slice(args.length).map(function (value) { return simplify(value); }));\n }\n var /** @type {?} */ functionScope = BindingScope.build();\n for (var /** @type {?} */ i = 0; i < parameters.length; i++) {\n functionScope.define(parameters[i], args[i]);\n }\n var /** @type {?} */ oldScope = scope;\n var /** @type {?} */ result_1;\n try {\n scope = functionScope.done();\n result_1 = simplifyInContext(functionSymbol, value_1, depth + 1);\n }\n finally {\n scope = oldScope;\n }\n return result_1;\n }\n }\n finally {\n calling.delete(functionSymbol);\n }\n }\n if (depth === 0) {\n // If depth is 0 we are evaluating the top level expression that is describing element\n // decorator. In this case, it is a decorator we don't understand, such as a custom\n // non-angular decorator, and we should just ignore it.\n return { __symbolic: 'ignore' };\n }\n return simplify({ __symbolic: 'error', message: 'Function call not supported', context: functionSymbol });\n }\n /**\n * @param {?} expression\n * @return {?}\n */\n function simplify(expression) {\n if (isPrimitive$1(expression)) {\n return expression;\n }\n if (expression instanceof Array) {\n var /** @type {?} */ result_2 = [];\n for (var _i = 0, _a = ((expression)); _i < _a.length; _i++) {\n var item = _a[_i];\n // Check for a spread expression\n if (item && item.__symbolic === 'spread') {\n var /** @type {?} */ spreadArray = simplify(item.expression);\n if (Array.isArray(spreadArray)) {\n for (var _b = 0, spreadArray_1 = spreadArray; _b < spreadArray_1.length; _b++) {\n var spreadItem = spreadArray_1[_b];\n result_2.push(spreadItem);\n }\n continue;\n }\n }\n var /** @type {?} */ value_2 = simplify(item);\n if (shouldIgnore(value_2)) {\n continue;\n }\n result_2.push(value_2);\n }\n return result_2;\n }\n if (expression instanceof StaticSymbol) {\n // Stop simplification at builtin symbols\n if (expression === self.opaqueToken || self.conversionMap.has(expression)) {\n return expression;\n }\n else {\n var /** @type {?} */ staticSymbol = expression;\n var /** @type {?} */ declarationValue = resolveReferenceValue(staticSymbol);\n if (declarationValue) {\n return simplifyInContext(staticSymbol, declarationValue, depth + 1);\n }\n else {\n return staticSymbol;\n }\n }\n }\n if (expression) {\n if (expression['__symbolic']) {\n var /** @type {?} */ staticSymbol = void 0;\n switch (expression['__symbolic']) {\n case 'binop':\n var /** @type {?} */ left = simplify(expression['left']);\n if (shouldIgnore(left))\n return left;\n var /** @type {?} */ right = simplify(expression['right']);\n if (shouldIgnore(right))\n return right;\n switch (expression['operator']) {\n case '&&':\n return left && right;\n case '||':\n return left || right;\n case '|':\n return left | right;\n case '^':\n return left ^ right;\n case '&':\n return left & right;\n case '==':\n return left == right;\n case '!=':\n return left != right;\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '<':\n return left < right;\n case '>':\n return left > right;\n case '<=':\n return left <= right;\n case '>=':\n return left >= right;\n case '<<':\n return left << right;\n case '>>':\n return left >> right;\n case '+':\n return left + right;\n case '-':\n return left - right;\n case '*':\n return left * right;\n case '/':\n return left / right;\n case '%':\n return left % right;\n }\n return null;\n case 'if':\n var /** @type {?} */ condition = simplify(expression['condition']);\n return condition ? simplify(expression['thenExpression']) :\n simplify(expression['elseExpression']);\n case 'pre':\n var /** @type {?} */ operand = simplify(expression['operand']);\n if (shouldIgnore(operand))\n return operand;\n switch (expression['operator']) {\n case '+':\n return operand;\n case '-':\n return -operand;\n case '!':\n return !operand;\n case '~':\n return ~operand;\n }\n return null;\n case 'index':\n var /** @type {?} */ indexTarget = simplify(expression['expression']);\n var /** @type {?} */ index = simplify(expression['index']);\n if (indexTarget && isPrimitive$1(index))\n return indexTarget[index];\n return null;\n case 'select':\n var /** @type {?} */ member = expression['member'];\n var /** @type {?} */ selectContext = context;\n var /** @type {?} */ selectTarget = simplify(expression['expression']);\n if (selectTarget instanceof StaticSymbol) {\n var /** @type {?} */ members = selectTarget.members.concat(member);\n selectContext =\n self.getStaticSymbol(selectTarget.filePath, selectTarget.name, members);\n var /** @type {?} */ declarationValue = resolveReferenceValue(selectContext);\n if (declarationValue) {\n return simplifyInContext(selectContext, declarationValue, depth + 1);\n }\n else {\n return selectContext;\n }\n }\n if (selectTarget && isPrimitive$1(member))\n return simplifyInContext(selectContext, selectTarget[member], depth + 1);\n return null;\n case 'reference':\n // Note: This only has to deal with variable references,\n // as symbol references have been converted into StaticSymbols already\n // in the StaticSymbolResolver!\n var /** @type {?} */ name_1 = expression['name'];\n var /** @type {?} */ localValue = scope.resolve(name_1);\n if (localValue != BindingScope.missing) {\n return localValue;\n }\n break;\n case 'class':\n return context;\n case 'function':\n return context;\n case 'new':\n case 'call':\n // Determine if the function is a built-in conversion\n staticSymbol = simplifyInContext(context, expression['expression'], depth + 1);\n if (staticSymbol instanceof StaticSymbol) {\n if (staticSymbol === self.opaqueToken) {\n // if somebody calls new OpaqueToken, don't create an OpaqueToken,\n // but rather return the symbol to which the OpaqueToken is assigned to.\n return context;\n }\n var /** @type {?} */ argExpressions = expression['arguments'] || [];\n var /** @type {?} */ args = argExpressions.map(function (arg) { return simplifyInContext(context, arg, depth + 1); });\n var /** @type {?} */ converter = self.conversionMap.get(staticSymbol);\n if (converter) {\n return converter(context, args);\n }\n else {\n // Determine if the function is one we can simplify.\n var /** @type {?} */ targetFunction = resolveReferenceValue(staticSymbol);\n return simplifyCall(staticSymbol, targetFunction, args);\n }\n }\n break;\n case 'error':\n var /** @type {?} */ message = produceErrorMessage(expression);\n if (expression['line']) {\n message =\n message + \" (position \" + (expression['line'] + 1) + \":\" + (expression['character'] + 1) + \" in the original .ts file)\";\n throw positionalError(message, context.filePath, expression['line'], expression['character']);\n }\n throw new Error(message);\n }\n return null;\n }\n return mapStringMap(expression, function (value, name) { return simplify(value); });\n }\n return null;\n }\n try {\n return simplify(value);\n }\n catch (e) {\n var /** @type {?} */ members = context.members.length ? \".\" + context.members.join('.') : '';\n var /** @type {?} */ message = e.message + \", resolving symbol \" + context.name + members + \" in \" + context.filePath;\n if (e.fileName) {\n throw positionalError(message, e.fileName, e.line, e.column);\n }\n throw new Error(message);\n }\n }\n var /** @type {?} */ recordedSimplifyInContext = function (context, value, depth) {\n try {\n return simplifyInContext(context, value, depth);\n }\n catch (e) {\n _this.reportError(e, context);\n }\n };\n var /** @type {?} */ result = this.errorRecorder ? recordedSimplifyInContext(context, value, 0) :\n simplifyInContext(context, value, 0);\n if (shouldIgnore(result)) {\n return undefined;\n }\n return result;\n };\n /**\n * @param {?} type\n * @return {?}\n */\n StaticReflector.prototype.getTypeMetadata = function (type) {\n var /** @type {?} */ resolvedSymbol = this.symbolResolver.resolveSymbol(type);\n return resolvedSymbol && resolvedSymbol.metadata ? resolvedSymbol.metadata :\n { __symbolic: 'class' };\n };\n return StaticReflector;\n }());\n /**\n * @param {?} error\n * @return {?}\n */\n function expandedMessage(error) {\n switch (error.message) {\n case 'Reference to non-exported class':\n if (error.context && error.context.className) {\n return \"Reference to a non-exported class \" + error.context.className + \". Consider exporting the class\";\n }\n break;\n case 'Variable not initialized':\n return 'Only initialized variables and constants can be referenced because the value of this variable is needed by the template compiler';\n case 'Destructuring not supported':\n return 'Referencing an exported destructured variable or constant is not supported by the template compiler. Consider simplifying this to avoid destructuring';\n case 'Could not resolve type':\n if (error.context && error.context.typeName) {\n return \"Could not resolve type \" + error.context.typeName;\n }\n break;\n case 'Function call not supported':\n var /** @type {?} */ prefix = error.context && error.context.name ? \"Calling function '\" + error.context.name + \"', f\" : 'F';\n return prefix +\n 'unction calls are not supported. Consider replacing the function or lambda with a reference to an exported function';\n case 'Reference to a local symbol':\n if (error.context && error.context.name) {\n return \"Reference to a local (non-exported) symbol '\" + error.context.name + \"'. Consider exporting the symbol\";\n }\n break;\n }\n return error.message;\n }\n /**\n * @param {?} error\n * @return {?}\n */\n function produceErrorMessage(error) {\n return \"Error encountered resolving symbol values statically. \" + expandedMessage(error);\n }\n /**\n * @param {?} input\n * @param {?} transform\n * @return {?}\n */\n function mapStringMap(input, transform) {\n if (!input)\n return {};\n var /** @type {?} */ result = {};\n Object.keys(input).forEach(function (key) {\n var /** @type {?} */ value = transform(input[key], key);\n if (!shouldIgnore(value)) {\n if (HIDDEN_KEY.test(key)) {\n Object.defineProperty(result, key, { enumerable: false, configurable: true, value: value });\n }\n else {\n result[key] = value;\n }\n }\n });\n return result;\n }\n /**\n * @param {?} o\n * @return {?}\n */\n function isPrimitive$1(o) {\n return o === null || (typeof o !== 'function' && typeof o !== 'object');\n }\n /**\n * @abstract\n */\n var BindingScope = (function () {\n function BindingScope() {\n }\n /**\n * @abstract\n * @param {?} name\n * @return {?}\n */\n BindingScope.prototype.resolve = function (name) { };\n /**\n * @return {?}\n */\n BindingScope.build = function () {\n var /** @type {?} */ current = new Map();\n return {\n define: function (name, value) {\n current.set(name, value);\n return this;\n },\n done: function () {\n return current.size > 0 ? new PopulatedScope(current) : BindingScope.empty;\n }\n };\n };\n BindingScope.missing = {};\n BindingScope.empty = { resolve: function (name) { return BindingScope.missing; } };\n return BindingScope;\n }());\n var PopulatedScope = (function (_super) {\n __extends$24(PopulatedScope, _super);\n /**\n * @param {?} bindings\n */\n function PopulatedScope(bindings) {\n _super.call(this);\n this.bindings = bindings;\n }\n /**\n * @param {?} name\n * @return {?}\n */\n PopulatedScope.prototype.resolve = function (name) {\n return this.bindings.has(name) ? this.bindings.get(name) : BindingScope.missing;\n };\n return PopulatedScope;\n }(BindingScope));\n /**\n * @param {?} value\n * @return {?}\n */\n function shouldIgnore(value) {\n return value && value.__symbolic == 'ignore';\n }\n /**\n * @param {?} message\n * @param {?} fileName\n * @param {?} line\n * @param {?} column\n * @return {?}\n */\n function positionalError(message, fileName, line, column) {\n var /** @type {?} */ result = new Error(message);\n ((result)).fileName = fileName;\n ((result)).line = line;\n ((result)).column = column;\n return result;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$25 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var ResolvedStaticSymbol = (function () {\n /**\n * @param {?} symbol\n * @param {?} metadata\n */\n function ResolvedStaticSymbol(symbol, metadata) {\n this.symbol = symbol;\n this.metadata = metadata;\n }\n return ResolvedStaticSymbol;\n }());\n var /** @type {?} */ SUPPORTED_SCHEMA_VERSION = 3;\n /**\n * This class is responsible for loading metadata per symbol,\n * and normalizing references between symbols.\n */\n var StaticSymbolResolver = (function () {\n /**\n * @param {?} host\n * @param {?} staticSymbolCache\n * @param {?} summaryResolver\n * @param {?=} errorRecorder\n */\n function StaticSymbolResolver(host, staticSymbolCache, summaryResolver, errorRecorder) {\n this.host = host;\n this.staticSymbolCache = staticSymbolCache;\n this.summaryResolver = summaryResolver;\n this.errorRecorder = errorRecorder;\n this.metadataCache = new Map();\n this.resolvedSymbols = new Map();\n this.resolvedFilePaths = new Set();\n }\n /**\n * @param {?} staticSymbol\n * @return {?}\n */\n StaticSymbolResolver.prototype.resolveSymbol = function (staticSymbol) {\n if (staticSymbol.members.length > 0) {\n return this._resolveSymbolMembers(staticSymbol);\n }\n var /** @type {?} */ result = this._resolveSymbolFromSummary(staticSymbol);\n if (!result) {\n // Note: Some users use libraries that were not compiled with ngc, i.e. they don't\n // have summaries, only .d.ts files. So we always need to check both, the summary\n // and metadata.\n this._createSymbolsOf(staticSymbol.filePath);\n result = this.resolvedSymbols.get(staticSymbol);\n }\n return result;\n };\n /**\n * @param {?} staticSymbol\n * @return {?}\n */\n StaticSymbolResolver.prototype._resolveSymbolMembers = function (staticSymbol) {\n var /** @type {?} */ members = staticSymbol.members;\n var /** @type {?} */ baseResolvedSymbol = this.resolveSymbol(this.getStaticSymbol(staticSymbol.filePath, staticSymbol.name));\n if (!baseResolvedSymbol) {\n return null;\n }\n var /** @type {?} */ baseMetadata = baseResolvedSymbol.metadata;\n if (baseMetadata instanceof StaticSymbol) {\n return new ResolvedStaticSymbol(staticSymbol, this.getStaticSymbol(baseMetadata.filePath, baseMetadata.name, members));\n }\n else if (baseMetadata && baseMetadata.__symbolic === 'class') {\n if (baseMetadata.statics && members.length === 1) {\n return new ResolvedStaticSymbol(staticSymbol, baseMetadata.statics[members[0]]);\n }\n }\n else {\n var /** @type {?} */ value = baseMetadata;\n for (var /** @type {?} */ i = 0; i < members.length && value; i++) {\n value = value[members[i]];\n }\n return new ResolvedStaticSymbol(staticSymbol, value);\n }\n return null;\n };\n /**\n * @param {?} staticSymbol\n * @return {?}\n */\n StaticSymbolResolver.prototype._resolveSymbolFromSummary = function (staticSymbol) {\n var /** @type {?} */ summary = this.summaryResolver.resolveSummary(staticSymbol);\n return summary ? new ResolvedStaticSymbol(staticSymbol, summary.metadata) : null;\n };\n /**\n * getStaticSymbol produces a Type whose metadata is known but whose implementation is not loaded.\n * All types passed to the StaticResolver should be pseudo-types returned by this method.\n * *\n * @param {?} declarationFile the absolute path of the file where the symbol is declared\n * @param {?} name the name of the type.\n * @param {?=} members\n * @return {?}\n */\n StaticSymbolResolver.prototype.getStaticSymbol = function (declarationFile, name, members) {\n return this.staticSymbolCache.get(declarationFile, name, members);\n };\n /**\n * @param {?} filePath\n * @return {?}\n */\n StaticSymbolResolver.prototype.getSymbolsOf = function (filePath) {\n // Note: Some users use libraries that were not compiled with ngc, i.e. they don't\n // have summaries, only .d.ts files. So we always need to check both, the summary\n // and metadata.\n var /** @type {?} */ symbols = new Set(this.summaryResolver.getSymbolsOf(filePath));\n this._createSymbolsOf(filePath);\n this.resolvedSymbols.forEach(function (resolvedSymbol) {\n if (resolvedSymbol.symbol.filePath === filePath) {\n symbols.add(resolvedSymbol.symbol);\n }\n });\n return Array.from(symbols);\n };\n /**\n * @param {?} filePath\n * @return {?}\n */\n StaticSymbolResolver.prototype._createSymbolsOf = function (filePath) {\n var _this = this;\n if (this.resolvedFilePaths.has(filePath)) {\n return;\n }\n this.resolvedFilePaths.add(filePath);\n var /** @type {?} */ resolvedSymbols = [];\n var /** @type {?} */ metadata = this.getModuleMetadata(filePath);\n if (metadata['metadata']) {\n // handle direct declarations of the symbol\n Object.keys(metadata['metadata']).forEach(function (symbolName) {\n var /** @type {?} */ symbolMeta = metadata['metadata'][symbolName];\n resolvedSymbols.push(_this.createResolvedSymbol(_this.getStaticSymbol(filePath, symbolName), symbolMeta));\n });\n }\n // handle the symbols in one of the re-export location\n if (metadata['exports']) {\n var _loop_1 = function(moduleExport) {\n // handle the symbols in the list of explicitly re-exported symbols.\n if (moduleExport.export) {\n moduleExport.export.forEach(function (exportSymbol) {\n var /** @type {?} */ symbolName;\n if (typeof exportSymbol === 'string') {\n symbolName = exportSymbol;\n }\n else {\n symbolName = exportSymbol.as;\n }\n var /** @type {?} */ symName = symbolName;\n if (typeof exportSymbol !== 'string') {\n symName = exportSymbol.name;\n }\n var /** @type {?} */ resolvedModule = _this.resolveModule(moduleExport.from, filePath);\n if (resolvedModule) {\n var /** @type {?} */ targetSymbol = _this.getStaticSymbol(resolvedModule, symName);\n var /** @type {?} */ sourceSymbol = _this.getStaticSymbol(filePath, symbolName);\n resolvedSymbols.push(new ResolvedStaticSymbol(sourceSymbol, targetSymbol));\n }\n });\n }\n else {\n // handle the symbols via export * directives.\n var /** @type {?} */ resolvedModule = this_1.resolveModule(moduleExport.from, filePath);\n if (resolvedModule) {\n var /** @type {?} */ nestedExports = this_1.getSymbolsOf(resolvedModule);\n nestedExports.forEach(function (targetSymbol) {\n var /** @type {?} */ sourceSymbol = _this.getStaticSymbol(filePath, targetSymbol.name);\n resolvedSymbols.push(new ResolvedStaticSymbol(sourceSymbol, targetSymbol));\n });\n }\n }\n };\n var this_1 = this;\n for (var _i = 0, _a = metadata['exports']; _i < _a.length; _i++) {\n var moduleExport = _a[_i];\n _loop_1(moduleExport);\n }\n }\n resolvedSymbols.forEach(function (resolvedSymbol) { return _this.resolvedSymbols.set(resolvedSymbol.symbol, resolvedSymbol); });\n };\n /**\n * @param {?} sourceSymbol\n * @param {?} metadata\n * @return {?}\n */\n StaticSymbolResolver.prototype.createResolvedSymbol = function (sourceSymbol, metadata) {\n var /** @type {?} */ self = this;\n var ReferenceTransformer = (function (_super) {\n __extends$25(ReferenceTransformer, _super);\n function ReferenceTransformer() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} map\n * @param {?} functionParams\n * @return {?}\n */\n ReferenceTransformer.prototype.visitStringMap = function (map, functionParams) {\n var /** @type {?} */ symbolic = map['__symbolic'];\n if (symbolic === 'function') {\n var /** @type {?} */ oldLen = functionParams.length;\n functionParams.push.apply(functionParams, (map['parameters'] || []));\n var /** @type {?} */ result = _super.prototype.visitStringMap.call(this, map, functionParams);\n functionParams.length = oldLen;\n return result;\n }\n else if (symbolic === 'reference') {\n var /** @type {?} */ module_1 = map['module'];\n var /** @type {?} */ name_1 = map['name'];\n if (!name_1) {\n return null;\n }\n var /** @type {?} */ filePath = void 0;\n if (module_1) {\n filePath = self.resolveModule(module_1, sourceSymbol.filePath);\n if (!filePath) {\n return {\n __symbolic: 'error',\n message: \"Could not resolve \" + module_1 + \" relative to \" + sourceSymbol.filePath + \".\"\n };\n }\n }\n else {\n var /** @type {?} */ isFunctionParam = functionParams.indexOf(name_1) >= 0;\n if (!isFunctionParam) {\n filePath = sourceSymbol.filePath;\n }\n }\n if (filePath) {\n return self.getStaticSymbol(filePath, name_1);\n }\n else {\n // reference to a function parameter\n return { __symbolic: 'reference', name: name_1 };\n }\n }\n else {\n return _super.prototype.visitStringMap.call(this, map, functionParams);\n }\n };\n return ReferenceTransformer;\n }(ValueTransformer));\n var /** @type {?} */ transformedMeta = visitValue(metadata, new ReferenceTransformer(), []);\n return new ResolvedStaticSymbol(sourceSymbol, transformedMeta);\n };\n /**\n * @param {?} error\n * @param {?} context\n * @param {?=} path\n * @return {?}\n */\n StaticSymbolResolver.prototype.reportError = function (error, context, path) {\n if (this.errorRecorder) {\n this.errorRecorder(error, (context && context.filePath) || path);\n }\n else {\n throw error;\n }\n };\n /**\n * @param {?} module an absolute path to a module file.\n * @return {?}\n */\n StaticSymbolResolver.prototype.getModuleMetadata = function (module) {\n var /** @type {?} */ moduleMetadata = this.metadataCache.get(module);\n if (!moduleMetadata) {\n var /** @type {?} */ moduleMetadatas = this.host.getMetadataFor(module);\n if (moduleMetadatas) {\n var /** @type {?} */ maxVersion_1 = -1;\n moduleMetadatas.forEach(function (md) {\n if (md['version'] > maxVersion_1) {\n maxVersion_1 = md['version'];\n moduleMetadata = md;\n }\n });\n }\n if (!moduleMetadata) {\n moduleMetadata =\n { __symbolic: 'module', version: SUPPORTED_SCHEMA_VERSION, module: module, metadata: {} };\n }\n if (moduleMetadata['version'] != SUPPORTED_SCHEMA_VERSION) {\n var /** @type {?} */ errorMessage = moduleMetadata['version'] == 2 ?\n \"Unsupported metadata version \" + moduleMetadata['version'] + \" for module \" + module + \". This module should be compiled with a newer version of ngc\" :\n \"Metadata version mismatch for module \" + module + \", found version \" + moduleMetadata['version'] + \", expected \" + SUPPORTED_SCHEMA_VERSION;\n this.reportError(new Error(errorMessage), null);\n }\n this.metadataCache.set(module, moduleMetadata);\n }\n return moduleMetadata;\n };\n /**\n * @param {?} module\n * @param {?} symbolName\n * @param {?=} containingFile\n * @return {?}\n */\n StaticSymbolResolver.prototype.getSymbolByModule = function (module, symbolName, containingFile) {\n var /** @type {?} */ filePath = this.resolveModule(module, containingFile);\n if (!filePath) {\n throw new Error(\"Could not resolve module \" + module + \" relative to \" + containingFile);\n }\n return this.getStaticSymbol(filePath, symbolName);\n };\n /**\n * @param {?} module\n * @param {?} containingFile\n * @return {?}\n */\n StaticSymbolResolver.prototype.resolveModule = function (module, containingFile) {\n try {\n return this.host.moduleNameToFileName(module, containingFile);\n }\n catch (e) {\n console.error(\"Could not resolve module '\" + module + \"' relative to file \" + containingFile);\n this.reportError(new e, null, containingFile);\n }\n };\n return StaticSymbolResolver;\n }());\n\n var AotSummaryResolver = (function () {\n /**\n * @param {?} host\n * @param {?} staticSymbolCache\n */\n function AotSummaryResolver(host, staticSymbolCache) {\n this.host = host;\n this.staticSymbolCache = staticSymbolCache;\n this.summaryCache = new Map();\n this.loadedFilePaths = new Set();\n }\n /**\n * @param {?} symbol\n * @return {?}\n */\n AotSummaryResolver.prototype._assertNoMembers = function (symbol) {\n if (symbol.members.length) {\n throw new Error(\"Internal state: StaticSymbols in summaries can't have members! \" + JSON.stringify(symbol));\n }\n };\n /**\n * @param {?} staticSymbol\n * @return {?}\n */\n AotSummaryResolver.prototype.resolveSummary = function (staticSymbol) {\n this._assertNoMembers(staticSymbol);\n var /** @type {?} */ summary = this.summaryCache.get(staticSymbol);\n if (!summary) {\n this._loadSummaryFile(staticSymbol.filePath);\n summary = this.summaryCache.get(staticSymbol);\n }\n return summary;\n };\n /**\n * @param {?} filePath\n * @return {?}\n */\n AotSummaryResolver.prototype.getSymbolsOf = function (filePath) {\n this._loadSummaryFile(filePath);\n return Array.from(this.summaryCache.keys()).filter(function (symbol) { return symbol.filePath === filePath; });\n };\n /**\n * @param {?} filePath\n * @return {?}\n */\n AotSummaryResolver.prototype._loadSummaryFile = function (filePath) {\n var _this = this;\n if (this.loadedFilePaths.has(filePath)) {\n return;\n }\n this.loadedFilePaths.add(filePath);\n if (!this.host.isSourceFile(filePath)) {\n var /** @type {?} */ summaryFilePath = summaryFileName(filePath);\n var /** @type {?} */ json = void 0;\n try {\n json = this.host.loadSummary(summaryFilePath);\n }\n catch (e) {\n console.error(\"Error loading summary file \" + summaryFilePath);\n throw e;\n }\n if (json) {\n var /** @type {?} */ readSummaries = deserializeSummaries(this.staticSymbolCache, json);\n readSummaries.forEach(function (summary) { _this.summaryCache.set(summary.symbol, summary); });\n }\n }\n };\n return AotSummaryResolver;\n }());\n\n /**\n * Creates a new AotCompiler based on options and a host.\n * @param {?} compilerHost\n * @param {?} options\n * @return {?}\n */\n function createAotCompiler(compilerHost, options) {\n var /** @type {?} */ translations = options.translations || '';\n var /** @type {?} */ urlResolver = createOfflineCompileUrlResolver();\n var /** @type {?} */ symbolCache = new StaticSymbolCache();\n var /** @type {?} */ summaryResolver = new AotSummaryResolver(compilerHost, symbolCache);\n var /** @type {?} */ symbolResolver = new StaticSymbolResolver(compilerHost, symbolCache, summaryResolver);\n var /** @type {?} */ staticReflector = new StaticReflector(symbolResolver);\n StaticAndDynamicReflectionCapabilities.install(staticReflector);\n var /** @type {?} */ htmlParser = new I18NHtmlParser(new HtmlParser(), translations, options.i18nFormat);\n var /** @type {?} */ config = new CompilerConfig({\n genDebugInfo: options.debug === true,\n defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated,\n logBindingUpdate: false,\n useJit: false\n });\n var /** @type {?} */ normalizer = new DirectiveNormalizer({ get: function (url) { return compilerHost.loadResource(url); } }, urlResolver, htmlParser, config);\n var /** @type {?} */ expressionParser = new Parser(new Lexer());\n var /** @type {?} */ elementSchemaRegistry = new DomElementSchemaRegistry();\n var /** @type {?} */ console = new Console();\n var /** @type {?} */ tmplParser = new TemplateParser(expressionParser, elementSchemaRegistry, htmlParser, console, []);\n var /** @type {?} */ resolver = new CompileMetadataResolver(new NgModuleResolver(staticReflector), new DirectiveResolver(staticReflector), new PipeResolver(staticReflector), summaryResolver, elementSchemaRegistry, normalizer, staticReflector);\n // TODO(vicb): do not pass options.i18nFormat here\n var /** @type {?} */ compiler = new AotCompiler(compilerHost, resolver, tmplParser, new StyleCompiler(urlResolver), new ViewCompiler(config, elementSchemaRegistry), new DirectiveWrapperCompiler(config, expressionParser, elementSchemaRegistry, console), new NgModuleCompiler(), new TypeScriptEmitter(compilerHost), summaryResolver, options.locale, options.i18nFormat, new AnimationParser(elementSchemaRegistry), symbolResolver);\n return { compiler: compiler, reflector: staticReflector };\n }\n\n /**\n * @param {?} statements\n * @param {?} resultVar\n * @return {?}\n */\n function interpretStatements(statements, resultVar) {\n var /** @type {?} */ stmtsWithReturn = statements.concat([new ReturnStatement(variable(resultVar))]);\n var /** @type {?} */ ctx = new _ExecutionContext(null, null, null, new Map());\n var /** @type {?} */ visitor = new StatementInterpreter();\n var /** @type {?} */ result = visitor.visitAllStatements(stmtsWithReturn, ctx);\n return isPresent(result) ? result.value : null;\n }\n /**\n * @param {?} varNames\n * @param {?} varValues\n * @param {?} statements\n * @param {?} ctx\n * @param {?} visitor\n * @return {?}\n */\n function _executeFunctionStatements(varNames, varValues, statements, ctx, visitor) {\n var /** @type {?} */ childCtx = ctx.createChildWihtLocalVars();\n for (var /** @type {?} */ i = 0; i < varNames.length; i++) {\n childCtx.vars.set(varNames[i], varValues[i]);\n }\n var /** @type {?} */ result = visitor.visitAllStatements(statements, childCtx);\n return isPresent(result) ? result.value : null;\n }\n var _ExecutionContext = (function () {\n /**\n * @param {?} parent\n * @param {?} instance\n * @param {?} className\n * @param {?} vars\n */\n function _ExecutionContext(parent, instance, className, vars) {\n this.parent = parent;\n this.instance = instance;\n this.className = className;\n this.vars = vars;\n }\n /**\n * @return {?}\n */\n _ExecutionContext.prototype.createChildWihtLocalVars = function () {\n return new _ExecutionContext(this, this.instance, this.className, new Map());\n };\n return _ExecutionContext;\n }());\n var ReturnValue = (function () {\n /**\n * @param {?} value\n */\n function ReturnValue(value) {\n this.value = value;\n }\n return ReturnValue;\n }());\n /**\n * @param {?} _classStmt\n * @param {?} _ctx\n * @param {?} _visitor\n * @return {?}\n */\n function createDynamicClass(_classStmt, _ctx, _visitor) {\n var /** @type {?} */ propertyDescriptors = {};\n _classStmt.getters.forEach(function (getter) {\n // Note: use `function` instead of arrow function to capture `this`\n propertyDescriptors[getter.name] = {\n configurable: false,\n get: function () {\n var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n return _executeFunctionStatements([], [], getter.body, instanceCtx, _visitor);\n }\n };\n });\n _classStmt.methods.forEach(function (method) {\n var /** @type {?} */ paramNames = method.params.map(function (param) { return param.name; });\n // Note: use `function` instead of arrow function to capture `this`\n propertyDescriptors[method.name] = {\n writable: false,\n configurable: false,\n value: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n return _executeFunctionStatements(paramNames, args, method.body, instanceCtx, _visitor);\n }\n };\n });\n var /** @type {?} */ ctorParamNames = _classStmt.constructorMethod.params.map(function (param) { return param.name; });\n // Note: use `function` instead of arrow function to capture `this`\n var /** @type {?} */ ctor = function () {\n var _this = this;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ instanceCtx = new _ExecutionContext(_ctx, this, _classStmt.name, _ctx.vars);\n _classStmt.fields.forEach(function (field) { _this[field.name] = undefined; });\n _executeFunctionStatements(ctorParamNames, args, _classStmt.constructorMethod.body, instanceCtx, _visitor);\n };\n var /** @type {?} */ superClass = _classStmt.parent ? _classStmt.parent.visitExpression(_visitor, _ctx) : Object;\n ctor.prototype = Object.create(superClass.prototype, propertyDescriptors);\n return ctor;\n }\n var StatementInterpreter = (function () {\n function StatementInterpreter() {\n }\n /**\n * @param {?} ast\n * @return {?}\n */\n StatementInterpreter.prototype.debugAst = function (ast) { return debugOutputAstAsTypeScript(ast); };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n ctx.vars.set(stmt.name, stmt.value.visitExpression(this, ctx));\n return null;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitWriteVarExpr = function (expr, ctx) {\n var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n var /** @type {?} */ currCtx = ctx;\n while (currCtx != null) {\n if (currCtx.vars.has(expr.name)) {\n currCtx.vars.set(expr.name, value);\n return value;\n }\n currCtx = currCtx.parent;\n }\n throw new Error(\"Not declared variable \" + expr.name);\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitReadVarExpr = function (ast, ctx) {\n var /** @type {?} */ varName = ast.name;\n if (isPresent(ast.builtin)) {\n switch (ast.builtin) {\n case BuiltinVar.Super:\n return ctx.instance.__proto__;\n case BuiltinVar.This:\n return ctx.instance;\n case BuiltinVar.CatchError:\n varName = CATCH_ERROR_VAR$2;\n break;\n case BuiltinVar.CatchStack:\n varName = CATCH_STACK_VAR$2;\n break;\n default:\n throw new Error(\"Unknown builtin variable \" + ast.builtin);\n }\n }\n var /** @type {?} */ currCtx = ctx;\n while (currCtx != null) {\n if (currCtx.vars.has(varName)) {\n return currCtx.vars.get(varName);\n }\n currCtx = currCtx.parent;\n }\n throw new Error(\"Not declared variable \" + varName);\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitWriteKeyExpr = function (expr, ctx) {\n var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n var /** @type {?} */ index = expr.index.visitExpression(this, ctx);\n var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n receiver[index] = value;\n return value;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitWritePropExpr = function (expr, ctx) {\n var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n var /** @type {?} */ value = expr.value.visitExpression(this, ctx);\n receiver[expr.name] = value;\n return value;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitInvokeMethodExpr = function (expr, ctx) {\n var /** @type {?} */ receiver = expr.receiver.visitExpression(this, ctx);\n var /** @type {?} */ args = this.visitAllExpressions(expr.args, ctx);\n var /** @type {?} */ result;\n if (isPresent(expr.builtin)) {\n switch (expr.builtin) {\n case BuiltinMethod.ConcatArray:\n result = receiver.concat.apply(receiver, args);\n break;\n case BuiltinMethod.SubscribeObservable:\n result = receiver.subscribe({ next: args[0] });\n break;\n case BuiltinMethod.Bind:\n result = receiver.bind.apply(receiver, args);\n break;\n default:\n throw new Error(\"Unknown builtin method \" + expr.builtin);\n }\n }\n else {\n result = receiver[expr.name].apply(receiver, args);\n }\n return result;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitInvokeFunctionExpr = function (stmt, ctx) {\n var /** @type {?} */ args = this.visitAllExpressions(stmt.args, ctx);\n var /** @type {?} */ fnExpr = stmt.fn;\n if (fnExpr instanceof ReadVarExpr && fnExpr.builtin === BuiltinVar.Super) {\n ctx.instance.constructor.prototype.constructor.apply(ctx.instance, args);\n return null;\n }\n else {\n var /** @type {?} */ fn = stmt.fn.visitExpression(this, ctx);\n return fn.apply(null, args);\n }\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitReturnStmt = function (stmt, ctx) {\n return new ReturnValue(stmt.value.visitExpression(this, ctx));\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n var /** @type {?} */ clazz = createDynamicClass(stmt, ctx, this);\n ctx.vars.set(stmt.name, clazz);\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitExpressionStmt = function (stmt, ctx) {\n return stmt.expr.visitExpression(this, ctx);\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitIfStmt = function (stmt, ctx) {\n var /** @type {?} */ condition = stmt.condition.visitExpression(this, ctx);\n if (condition) {\n return this.visitAllStatements(stmt.trueCase, ctx);\n }\n else if (isPresent(stmt.falseCase)) {\n return this.visitAllStatements(stmt.falseCase, ctx);\n }\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitTryCatchStmt = function (stmt, ctx) {\n try {\n return this.visitAllStatements(stmt.bodyStmts, ctx);\n }\n catch (e) {\n var /** @type {?} */ childCtx = ctx.createChildWihtLocalVars();\n childCtx.vars.set(CATCH_ERROR_VAR$2, e);\n childCtx.vars.set(CATCH_STACK_VAR$2, e.stack);\n return this.visitAllStatements(stmt.catchStmts, childCtx);\n }\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitThrowStmt = function (stmt, ctx) {\n throw stmt.error.visitExpression(this, ctx);\n };\n /**\n * @param {?} stmt\n * @param {?=} context\n * @return {?}\n */\n StatementInterpreter.prototype.visitCommentStmt = function (stmt, context) { return null; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitInstantiateExpr = function (ast, ctx) {\n var /** @type {?} */ args = this.visitAllExpressions(ast.args, ctx);\n var /** @type {?} */ clazz = ast.classExpr.visitExpression(this, ctx);\n return new (clazz.bind.apply(clazz, [void 0].concat(args)))();\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitLiteralExpr = function (ast, ctx) { return ast.value; };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitExternalExpr = function (ast, ctx) {\n return ast.value.reference;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitConditionalExpr = function (ast, ctx) {\n if (ast.condition.visitExpression(this, ctx)) {\n return ast.trueCase.visitExpression(this, ctx);\n }\n else if (isPresent(ast.falseCase)) {\n return ast.falseCase.visitExpression(this, ctx);\n }\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitNotExpr = function (ast, ctx) {\n return !ast.condition.visitExpression(this, ctx);\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitCastExpr = function (ast, ctx) {\n return ast.value.visitExpression(this, ctx);\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitFunctionExpr = function (ast, ctx) {\n var /** @type {?} */ paramNames = ast.params.map(function (param) { return param.name; });\n return _declareFn(paramNames, ast.statements, ctx, this);\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n var /** @type {?} */ paramNames = stmt.params.map(function (param) { return param.name; });\n ctx.vars.set(stmt.name, _declareFn(paramNames, stmt.statements, ctx, this));\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitBinaryOperatorExpr = function (ast, ctx) {\n var _this = this;\n var /** @type {?} */ lhs = function () { return ast.lhs.visitExpression(_this, ctx); };\n var /** @type {?} */ rhs = function () { return ast.rhs.visitExpression(_this, ctx); };\n switch (ast.operator) {\n case BinaryOperator.Equals:\n return lhs() == rhs();\n case BinaryOperator.Identical:\n return lhs() === rhs();\n case BinaryOperator.NotEquals:\n return lhs() != rhs();\n case BinaryOperator.NotIdentical:\n return lhs() !== rhs();\n case BinaryOperator.And:\n return lhs() && rhs();\n case BinaryOperator.Or:\n return lhs() || rhs();\n case BinaryOperator.Plus:\n return lhs() + rhs();\n case BinaryOperator.Minus:\n return lhs() - rhs();\n case BinaryOperator.Divide:\n return lhs() / rhs();\n case BinaryOperator.Multiply:\n return lhs() * rhs();\n case BinaryOperator.Modulo:\n return lhs() % rhs();\n case BinaryOperator.Lower:\n return lhs() < rhs();\n case BinaryOperator.LowerEquals:\n return lhs() <= rhs();\n case BinaryOperator.Bigger:\n return lhs() > rhs();\n case BinaryOperator.BiggerEquals:\n return lhs() >= rhs();\n default:\n throw new Error(\"Unknown operator \" + ast.operator);\n }\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitReadPropExpr = function (ast, ctx) {\n var /** @type {?} */ result;\n var /** @type {?} */ receiver = ast.receiver.visitExpression(this, ctx);\n result = receiver[ast.name];\n return result;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitReadKeyExpr = function (ast, ctx) {\n var /** @type {?} */ receiver = ast.receiver.visitExpression(this, ctx);\n var /** @type {?} */ prop = ast.index.visitExpression(this, ctx);\n return receiver[prop];\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitLiteralArrayExpr = function (ast, ctx) {\n return this.visitAllExpressions(ast.entries, ctx);\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitLiteralMapExpr = function (ast, ctx) {\n var _this = this;\n var /** @type {?} */ result = {};\n ast.entries.forEach(function (entry) { return ((result))[entry.key] = entry.value.visitExpression(_this, ctx); });\n return result;\n };\n /**\n * @param {?} expressions\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitAllExpressions = function (expressions, ctx) {\n var _this = this;\n return expressions.map(function (expr) { return expr.visitExpression(_this, ctx); });\n };\n /**\n * @param {?} statements\n * @param {?} ctx\n * @return {?}\n */\n StatementInterpreter.prototype.visitAllStatements = function (statements, ctx) {\n for (var /** @type {?} */ i = 0; i < statements.length; i++) {\n var /** @type {?} */ stmt = statements[i];\n var /** @type {?} */ val = stmt.visitStatement(this, ctx);\n if (val instanceof ReturnValue) {\n return val;\n }\n }\n return null;\n };\n return StatementInterpreter;\n }());\n /**\n * @param {?} varNames\n * @param {?} statements\n * @param {?} ctx\n * @param {?} visitor\n * @return {?}\n */\n function _declareFn(varNames, statements, ctx, visitor) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return _executeFunctionStatements(varNames, args, statements, ctx, visitor);\n };\n }\n var /** @type {?} */ CATCH_ERROR_VAR$2 = 'error';\n var /** @type {?} */ CATCH_STACK_VAR$2 = 'stack';\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$27 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @abstract\n */\n var AbstractJsEmitterVisitor = (function (_super) {\n __extends$27(AbstractJsEmitterVisitor, _super);\n function AbstractJsEmitterVisitor() {\n _super.call(this, false);\n }\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitDeclareClassStmt = function (stmt, ctx) {\n var _this = this;\n ctx.pushClass(stmt);\n this._visitClassConstructor(stmt, ctx);\n if (isPresent(stmt.parent)) {\n ctx.print(stmt.name + \".prototype = Object.create(\");\n stmt.parent.visitExpression(this, ctx);\n ctx.println(\".prototype);\");\n }\n stmt.getters.forEach(function (getter) { return _this._visitClassGetter(stmt, getter, ctx); });\n stmt.methods.forEach(function (method) { return _this._visitClassMethod(stmt, method, ctx); });\n ctx.popClass();\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype._visitClassConstructor = function (stmt, ctx) {\n ctx.print(\"function \" + stmt.name + \"(\");\n if (isPresent(stmt.constructorMethod)) {\n this._visitParams(stmt.constructorMethod.params, ctx);\n }\n ctx.println(\") {\");\n ctx.incIndent();\n if (isPresent(stmt.constructorMethod)) {\n if (stmt.constructorMethod.body.length > 0) {\n ctx.println(\"var self = this;\");\n this.visitAllStatements(stmt.constructorMethod.body, ctx);\n }\n }\n ctx.decIndent();\n ctx.println(\"}\");\n };\n /**\n * @param {?} stmt\n * @param {?} getter\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype._visitClassGetter = function (stmt, getter, ctx) {\n ctx.println(\"Object.defineProperty(\" + stmt.name + \".prototype, '\" + getter.name + \"', { get: function() {\");\n ctx.incIndent();\n if (getter.body.length > 0) {\n ctx.println(\"var self = this;\");\n this.visitAllStatements(getter.body, ctx);\n }\n ctx.decIndent();\n ctx.println(\"}});\");\n };\n /**\n * @param {?} stmt\n * @param {?} method\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype._visitClassMethod = function (stmt, method, ctx) {\n ctx.print(stmt.name + \".prototype.\" + method.name + \" = function(\");\n this._visitParams(method.params, ctx);\n ctx.println(\") {\");\n ctx.incIndent();\n if (method.body.length > 0) {\n ctx.println(\"var self = this;\");\n this.visitAllStatements(method.body, ctx);\n }\n ctx.decIndent();\n ctx.println(\"};\");\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitReadVarExpr = function (ast, ctx) {\n if (ast.builtin === BuiltinVar.This) {\n ctx.print('self');\n }\n else if (ast.builtin === BuiltinVar.Super) {\n throw new Error(\"'super' needs to be handled at a parent ast node, not at the variable level!\");\n }\n else {\n _super.prototype.visitReadVarExpr.call(this, ast, ctx);\n }\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitDeclareVarStmt = function (stmt, ctx) {\n ctx.print(\"var \" + stmt.name + \" = \");\n stmt.value.visitExpression(this, ctx);\n ctx.println(\";\");\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitCastExpr = function (ast, ctx) {\n ast.value.visitExpression(this, ctx);\n return null;\n };\n /**\n * @param {?} expr\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitInvokeFunctionExpr = function (expr, ctx) {\n var /** @type {?} */ fnExpr = expr.fn;\n if (fnExpr instanceof ReadVarExpr && fnExpr.builtin === BuiltinVar.Super) {\n ctx.currentClass.parent.visitExpression(this, ctx);\n ctx.print(\".call(this\");\n if (expr.args.length > 0) {\n ctx.print(\", \");\n this.visitAllExpressions(expr.args, ctx, ',');\n }\n ctx.print(\")\");\n }\n else {\n _super.prototype.visitInvokeFunctionExpr.call(this, expr, ctx);\n }\n return null;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitFunctionExpr = function (ast, ctx) {\n ctx.print(\"function(\");\n this._visitParams(ast.params, ctx);\n ctx.println(\") {\");\n ctx.incIndent();\n this.visitAllStatements(ast.statements, ctx);\n ctx.decIndent();\n ctx.print(\"}\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitDeclareFunctionStmt = function (stmt, ctx) {\n ctx.print(\"function \" + stmt.name + \"(\");\n this._visitParams(stmt.params, ctx);\n ctx.println(\") {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.statements, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n return null;\n };\n /**\n * @param {?} stmt\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.visitTryCatchStmt = function (stmt, ctx) {\n ctx.println(\"try {\");\n ctx.incIndent();\n this.visitAllStatements(stmt.bodyStmts, ctx);\n ctx.decIndent();\n ctx.println(\"} catch (\" + CATCH_ERROR_VAR$1.name + \") {\");\n ctx.incIndent();\n var /** @type {?} */ catchStmts = [(CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop('stack')).toDeclStmt(null, [\n StmtModifier.Final\n ]))].concat(stmt.catchStmts);\n this.visitAllStatements(catchStmts, ctx);\n ctx.decIndent();\n ctx.println(\"}\");\n return null;\n };\n /**\n * @param {?} params\n * @param {?} ctx\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype._visitParams = function (params, ctx) {\n this.visitAllObjects(function (param) { return ctx.print(param.name); }, params, ctx, ',');\n };\n /**\n * @param {?} method\n * @return {?}\n */\n AbstractJsEmitterVisitor.prototype.getBuiltinMethodName = function (method) {\n var /** @type {?} */ name;\n switch (method) {\n case BuiltinMethod.ConcatArray:\n name = 'concat';\n break;\n case BuiltinMethod.SubscribeObservable:\n name = 'subscribe';\n break;\n case BuiltinMethod.Bind:\n name = 'bind';\n break;\n default:\n throw new Error(\"Unknown builtin method: \" + method);\n }\n return name;\n };\n return AbstractJsEmitterVisitor;\n }(AbstractEmitterVisitor));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$26 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @param {?} sourceUrl\n * @param {?} expr\n * @param {?} declarations\n * @param {?} vars\n * @return {?}\n */\n function evalExpression(sourceUrl, expr, declarations, vars) {\n var /** @type {?} */ fnBody = declarations + \"\\nreturn \" + expr + \"\\n//# sourceURL=\" + sourceUrl;\n var /** @type {?} */ fnArgNames = [];\n var /** @type {?} */ fnArgValues = [];\n for (var argName in vars) {\n fnArgNames.push(argName);\n fnArgValues.push(vars[argName]);\n }\n return new (Function.bind.apply(Function, [void 0].concat(fnArgNames.concat(fnBody))))().apply(void 0, fnArgValues);\n }\n /**\n * @param {?} sourceUrl\n * @param {?} statements\n * @param {?} resultVar\n * @return {?}\n */\n function jitStatements(sourceUrl, statements, resultVar) {\n var /** @type {?} */ converter = new JitEmitterVisitor();\n var /** @type {?} */ ctx = EmitterVisitorContext.createRoot([resultVar]);\n converter.visitAllStatements(statements, ctx);\n return evalExpression(sourceUrl, resultVar, ctx.toSource(), converter.getArgs());\n }\n var JitEmitterVisitor = (function (_super) {\n __extends$26(JitEmitterVisitor, _super);\n function JitEmitterVisitor() {\n _super.apply(this, arguments);\n this._evalArgNames = [];\n this._evalArgValues = [];\n }\n /**\n * @return {?}\n */\n JitEmitterVisitor.prototype.getArgs = function () {\n var /** @type {?} */ result = {};\n for (var /** @type {?} */ i = 0; i < this._evalArgNames.length; i++) {\n result[this._evalArgNames[i]] = this._evalArgValues[i];\n }\n return result;\n };\n /**\n * @param {?} ast\n * @param {?} ctx\n * @return {?}\n */\n JitEmitterVisitor.prototype.visitExternalExpr = function (ast, ctx) {\n var /** @type {?} */ value = ast.value.reference;\n var /** @type {?} */ id = this._evalArgValues.indexOf(value);\n if (id === -1) {\n id = this._evalArgValues.length;\n this._evalArgValues.push(value);\n var /** @type {?} */ name_1 = identifierName(ast.value) || 'val';\n this._evalArgNames.push(\"jit_\" + name_1 + id);\n }\n ctx.print(this._evalArgNames[id]);\n return null;\n };\n return JitEmitterVisitor;\n }(AbstractJsEmitterVisitor));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$17 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$17 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n /**\n * An internal module of the Angular compiler that begins with component types,\n * extracts templates, and eventually produces a compiled version of the component\n * ready for linking into an application.\n * *\n * from a trusted source. Attacker-controlled data introduced by a template could expose your\n * application to XSS risks. For more detail, see the [Security Guide](http://g.co/ng/security).\n */\n var JitCompiler = (function () {\n /**\n * @param {?} _injector\n * @param {?} _metadataResolver\n * @param {?} _templateParser\n * @param {?} _styleCompiler\n * @param {?} _viewCompiler\n * @param {?} _ngModuleCompiler\n * @param {?} _directiveWrapperCompiler\n * @param {?} _compilerConfig\n * @param {?} _animationParser\n */\n function JitCompiler(_injector, _metadataResolver, _templateParser, _styleCompiler, _viewCompiler, _ngModuleCompiler, _directiveWrapperCompiler, _compilerConfig, _animationParser) {\n this._injector = _injector;\n this._metadataResolver = _metadataResolver;\n this._templateParser = _templateParser;\n this._styleCompiler = _styleCompiler;\n this._viewCompiler = _viewCompiler;\n this._ngModuleCompiler = _ngModuleCompiler;\n this._directiveWrapperCompiler = _directiveWrapperCompiler;\n this._compilerConfig = _compilerConfig;\n this._animationParser = _animationParser;\n this._compiledTemplateCache = new Map();\n this._compiledHostTemplateCache = new Map();\n this._compiledDirectiveWrapperCache = new Map();\n this._compiledNgModuleCache = new Map();\n this._animationCompiler = new AnimationCompiler();\n }\n Object.defineProperty(JitCompiler.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._injector; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} moduleType\n * @return {?}\n */\n JitCompiler.prototype.compileModuleSync = function (moduleType) {\n return this._compileModuleAndComponents(moduleType, true).syncResult;\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n JitCompiler.prototype.compileModuleAsync = function (moduleType) {\n return this._compileModuleAndComponents(moduleType, false).asyncResult;\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n JitCompiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n return this._compileModuleAndAllComponents(moduleType, true).syncResult;\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n JitCompiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n return this._compileModuleAndAllComponents(moduleType, false).asyncResult;\n };\n /**\n * @param {?} component\n * @return {?}\n */\n JitCompiler.prototype.getNgContentSelectors = function (component) {\n var /** @type {?} */ template = this._compiledTemplateCache.get(component);\n if (!template) {\n throw new Error(\"The component \" + stringify(component) + \" is not yet compiled!\");\n }\n return template.compMeta.template.ngContentSelectors;\n };\n /**\n * @param {?} moduleType\n * @param {?} isSync\n * @return {?}\n */\n JitCompiler.prototype._compileModuleAndComponents = function (moduleType, isSync) {\n var _this = this;\n var /** @type {?} */ loadingPromise = this._loadModules(moduleType, isSync);\n var /** @type {?} */ createResult = function () {\n _this._compileComponents(moduleType, null);\n return _this._compileModule(moduleType);\n };\n if (isSync) {\n return new SyncAsyncResult(createResult());\n }\n else {\n return new SyncAsyncResult(null, loadingPromise.then(createResult));\n }\n };\n /**\n * @param {?} moduleType\n * @param {?} isSync\n * @return {?}\n */\n JitCompiler.prototype._compileModuleAndAllComponents = function (moduleType, isSync) {\n var _this = this;\n var /** @type {?} */ loadingPromise = this._loadModules(moduleType, isSync);\n var /** @type {?} */ createResult = function () {\n var /** @type {?} */ componentFactories = [];\n _this._compileComponents(moduleType, componentFactories);\n return new _angular_core.ModuleWithComponentFactories(_this._compileModule(moduleType), componentFactories);\n };\n if (isSync) {\n return new SyncAsyncResult(createResult());\n }\n else {\n return new SyncAsyncResult(null, loadingPromise.then(createResult));\n }\n };\n /**\n * @param {?} mainModule\n * @param {?} isSync\n * @return {?}\n */\n JitCompiler.prototype._loadModules = function (mainModule, isSync) {\n var _this = this;\n var /** @type {?} */ loadingPromises = [];\n var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(mainModule);\n // Note: the loadingPromise for a module only includes the loading of the exported directives\n // of imported modules.\n // However, for runtime compilation, we want to transitively compile all modules,\n // so we also need to call loadNgModuleMetadata for all nested modules.\n ngModule.transitiveModule.modules.forEach(function (localModuleMeta) {\n loadingPromises.push(_this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(localModuleMeta.reference, isSync));\n });\n return Promise.all(loadingPromises);\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n JitCompiler.prototype._compileModule = function (moduleType) {\n var _this = this;\n var /** @type {?} */ ngModuleFactory = this._compiledNgModuleCache.get(moduleType);\n if (!ngModuleFactory) {\n var /** @type {?} */ moduleMeta_1 = this._metadataResolver.getNgModuleMetadata(moduleType);\n // Always provide a bound Compiler\n var /** @type {?} */ extraProviders = [this._metadataResolver.getProviderMetadata(new ProviderMeta(_angular_core.Compiler, { useFactory: function () { return new ModuleBoundCompiler(_this, moduleMeta_1.type.reference); } }))];\n var /** @type {?} */ compileResult = this._ngModuleCompiler.compile(moduleMeta_1, extraProviders);\n compileResult.dependencies.forEach(function (dep) {\n dep.placeholder.reference =\n _this._assertComponentKnown(dep.comp.reference, true).proxyComponentFactory;\n });\n if (!this._compilerConfig.useJit) {\n ngModuleFactory =\n interpretStatements(compileResult.statements, compileResult.ngModuleFactoryVar);\n }\n else {\n ngModuleFactory = jitStatements(\"/\" + identifierName(moduleMeta_1.type) + \"/module.ngfactory.js\", compileResult.statements, compileResult.ngModuleFactoryVar);\n }\n this._compiledNgModuleCache.set(moduleMeta_1.type.reference, ngModuleFactory);\n }\n return ngModuleFactory;\n };\n /**\n * @param {?} mainModule\n * @param {?} allComponentFactories\n * @return {?}\n */\n JitCompiler.prototype._compileComponents = function (mainModule, allComponentFactories) {\n var _this = this;\n var /** @type {?} */ ngModule = this._metadataResolver.getNgModuleMetadata(mainModule);\n var /** @type {?} */ moduleByDirective = new Map();\n var /** @type {?} */ templates = new Set();\n ngModule.transitiveModule.modules.forEach(function (localModuleSummary) {\n var /** @type {?} */ localModuleMeta = _this._metadataResolver.getNgModuleMetadata(localModuleSummary.reference);\n localModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n moduleByDirective.set(dirIdentifier.reference, localModuleMeta);\n var /** @type {?} */ dirMeta = _this._metadataResolver.getDirectiveMetadata(dirIdentifier.reference);\n _this._compileDirectiveWrapper(dirMeta, localModuleMeta);\n if (dirMeta.isComponent) {\n templates.add(_this._createCompiledTemplate(dirMeta, localModuleMeta));\n if (allComponentFactories) {\n var /** @type {?} */ template = _this._createCompiledHostTemplate(dirMeta.type.reference, localModuleMeta);\n templates.add(template);\n allComponentFactories.push(template.proxyComponentFactory);\n }\n }\n });\n });\n ngModule.transitiveModule.modules.forEach(function (localModuleSummary) {\n var /** @type {?} */ localModuleMeta = _this._metadataResolver.getNgModuleMetadata(localModuleSummary.reference);\n localModuleMeta.declaredDirectives.forEach(function (dirIdentifier) {\n var /** @type {?} */ dirMeta = _this._metadataResolver.getDirectiveMetadata(dirIdentifier.reference);\n if (dirMeta.isComponent) {\n dirMeta.entryComponents.forEach(function (entryComponentType) {\n var /** @type {?} */ moduleMeta = moduleByDirective.get(entryComponentType.reference);\n templates.add(_this._createCompiledHostTemplate(entryComponentType.reference, moduleMeta));\n });\n }\n });\n localModuleMeta.entryComponents.forEach(function (entryComponentType) {\n var /** @type {?} */ moduleMeta = moduleByDirective.get(entryComponentType.reference);\n templates.add(_this._createCompiledHostTemplate(entryComponentType.reference, moduleMeta));\n });\n });\n templates.forEach(function (template) { return _this._compileTemplate(template); });\n };\n /**\n * @param {?} type\n * @return {?}\n */\n JitCompiler.prototype.clearCacheFor = function (type) {\n this._compiledNgModuleCache.delete(type);\n this._metadataResolver.clearCacheFor(type);\n this._compiledHostTemplateCache.delete(type);\n var /** @type {?} */ compiledTemplate = this._compiledTemplateCache.get(type);\n if (compiledTemplate) {\n this._compiledTemplateCache.delete(type);\n }\n };\n /**\n * @return {?}\n */\n JitCompiler.prototype.clearCache = function () {\n this._metadataResolver.clearCache();\n this._compiledTemplateCache.clear();\n this._compiledHostTemplateCache.clear();\n this._compiledNgModuleCache.clear();\n };\n /**\n * @param {?} compType\n * @param {?} ngModule\n * @return {?}\n */\n JitCompiler.prototype._createCompiledHostTemplate = function (compType, ngModule) {\n if (!ngModule) {\n throw new Error(\"Component \" + stringify(compType) + \" is not part of any NgModule or the module has not been imported into your module.\");\n }\n var /** @type {?} */ compiledTemplate = this._compiledHostTemplateCache.get(compType);\n if (!compiledTemplate) {\n var /** @type {?} */ compMeta = this._metadataResolver.getDirectiveMetadata(compType);\n assertComponent(compMeta);\n var /** @type {?} */ HostClass = function HostClass() { };\n ((HostClass)).overriddenName = identifierName(compMeta.type) + \"_Host\";\n var /** @type {?} */ hostMeta = createHostComponentMeta(HostClass, compMeta);\n compiledTemplate = new CompiledTemplate(true, compMeta.selector, compMeta.type, hostMeta, ngModule, [compMeta.type]);\n this._compiledHostTemplateCache.set(compType, compiledTemplate);\n }\n return compiledTemplate;\n };\n /**\n * @param {?} compMeta\n * @param {?} ngModule\n * @return {?}\n */\n JitCompiler.prototype._createCompiledTemplate = function (compMeta, ngModule) {\n var /** @type {?} */ compiledTemplate = this._compiledTemplateCache.get(compMeta.type.reference);\n if (!compiledTemplate) {\n assertComponent(compMeta);\n compiledTemplate = new CompiledTemplate(false, compMeta.selector, compMeta.type, compMeta, ngModule, ngModule.transitiveModule.directives);\n this._compiledTemplateCache.set(compMeta.type.reference, compiledTemplate);\n }\n return compiledTemplate;\n };\n /**\n * @param {?} compType\n * @param {?} isHost\n * @return {?}\n */\n JitCompiler.prototype._assertComponentKnown = function (compType, isHost) {\n var /** @type {?} */ compiledTemplate = isHost ? this._compiledHostTemplateCache.get(compType) :\n this._compiledTemplateCache.get(compType);\n if (!compiledTemplate) {\n throw new Error(\"Illegal state: Compiled view for component \" + stringify(compType) + \" (host: \" + isHost + \") does not exist!\");\n }\n return compiledTemplate;\n };\n /**\n * @param {?} dirType\n * @return {?}\n */\n JitCompiler.prototype._assertDirectiveWrapper = function (dirType) {\n var /** @type {?} */ dirWrapper = this._compiledDirectiveWrapperCache.get(dirType);\n if (!dirWrapper) {\n throw new Error(\"Illegal state: Directive wrapper for \" + stringify(dirType) + \" has not been compiled!\");\n }\n return dirWrapper;\n };\n /**\n * @param {?} dirMeta\n * @param {?} moduleMeta\n * @return {?}\n */\n JitCompiler.prototype._compileDirectiveWrapper = function (dirMeta, moduleMeta) {\n var /** @type {?} */ compileResult = this._directiveWrapperCompiler.compile(dirMeta);\n var /** @type {?} */ statements = compileResult.statements;\n var /** @type {?} */ directiveWrapperClass;\n if (!this._compilerConfig.useJit) {\n directiveWrapperClass = interpretStatements(statements, compileResult.dirWrapperClassVar);\n }\n else {\n directiveWrapperClass = jitStatements(\"/\" + identifierName(moduleMeta.type) + \"/\" + identifierName(dirMeta.type) + \"/wrapper.ngfactory.js\", statements, compileResult.dirWrapperClassVar);\n }\n this._compiledDirectiveWrapperCache.set(dirMeta.type.reference, directiveWrapperClass);\n };\n /**\n * @param {?} template\n * @return {?}\n */\n JitCompiler.prototype._compileTemplate = function (template) {\n var _this = this;\n if (template.isCompiled) {\n return;\n }\n var /** @type {?} */ compMeta = template.compMeta;\n var /** @type {?} */ externalStylesheetsByModuleUrl = new Map();\n var /** @type {?} */ stylesCompileResult = this._styleCompiler.compileComponent(compMeta);\n stylesCompileResult.externalStylesheets.forEach(function (r) { externalStylesheetsByModuleUrl.set(r.meta.moduleUrl, r); });\n this._resolveStylesCompileResult(stylesCompileResult.componentStylesheet, externalStylesheetsByModuleUrl);\n var /** @type {?} */ parsedAnimations = this._animationParser.parseComponent(compMeta);\n var /** @type {?} */ directives = template.directives.map(function (dir) { return _this._metadataResolver.getDirectiveSummary(dir.reference); });\n var /** @type {?} */ pipes = template.ngModule.transitiveModule.pipes.map(function (pipe) { return _this._metadataResolver.getPipeSummary(pipe.reference); });\n var /** @type {?} */ parsedTemplate = this._templateParser.parse(compMeta, compMeta.template.template, directives, pipes, template.ngModule.schemas, identifierName(compMeta.type));\n var /** @type {?} */ compiledAnimations = this._animationCompiler.compile(identifierName(compMeta.type), parsedAnimations);\n var /** @type {?} */ compileResult = this._viewCompiler.compileComponent(compMeta, parsedTemplate, variable(stylesCompileResult.componentStylesheet.stylesVar), pipes, compiledAnimations);\n compileResult.dependencies.forEach(function (dep) {\n var /** @type {?} */ depTemplate;\n if (dep instanceof ViewClassDependency) {\n var /** @type {?} */ vfd = (dep);\n depTemplate = _this._assertComponentKnown(vfd.comp.reference, false);\n vfd.placeholder.reference = depTemplate.proxyViewClass;\n }\n else if (dep instanceof ComponentFactoryDependency$1) {\n var /** @type {?} */ cfd = (dep);\n depTemplate = _this._assertComponentKnown(cfd.comp.reference, true);\n cfd.placeholder.reference = depTemplate.proxyComponentFactory;\n }\n else if (dep instanceof DirectiveWrapperDependency) {\n var /** @type {?} */ dwd = (dep);\n dwd.placeholder.reference = _this._assertDirectiveWrapper(dwd.dir.reference);\n }\n });\n var /** @type {?} */ statements = (_a = stylesCompileResult.componentStylesheet.statements).concat.apply(_a, compiledAnimations.map(function (ca) { return ca.statements; }))\n .concat(compileResult.statements);\n var /** @type {?} */ viewClass;\n if (!this._compilerConfig.useJit) {\n viewClass = interpretStatements(statements, compileResult.viewClassVar);\n }\n else {\n viewClass = jitStatements(\"/\" + identifierName(template.ngModule.type) + \"/\" + identifierName(template.compType) + \"/\" + (template.isHost ? 'host' : 'component') + \".ngfactory.js\", statements, compileResult.viewClassVar);\n }\n template.compiled(viewClass);\n var _a;\n };\n /**\n * @param {?} result\n * @param {?} externalStylesheetsByModuleUrl\n * @return {?}\n */\n JitCompiler.prototype._resolveStylesCompileResult = function (result, externalStylesheetsByModuleUrl) {\n var _this = this;\n result.dependencies.forEach(function (dep, i) {\n var /** @type {?} */ nestedCompileResult = externalStylesheetsByModuleUrl.get(dep.moduleUrl);\n var /** @type {?} */ nestedStylesArr = _this._resolveAndEvalStylesCompileResult(nestedCompileResult, externalStylesheetsByModuleUrl);\n dep.valuePlaceholder.reference = nestedStylesArr;\n });\n };\n /**\n * @param {?} result\n * @param {?} externalStylesheetsByModuleUrl\n * @return {?}\n */\n JitCompiler.prototype._resolveAndEvalStylesCompileResult = function (result, externalStylesheetsByModuleUrl) {\n this._resolveStylesCompileResult(result, externalStylesheetsByModuleUrl);\n if (!this._compilerConfig.useJit) {\n return interpretStatements(result.statements, result.stylesVar);\n }\n else {\n return jitStatements(\"/\" + result.meta.moduleUrl + \".ngstyle.js\", result.statements, result.stylesVar);\n }\n };\n JitCompiler = __decorate$17([\n CompilerInjectable(), \n __metadata$17('design:paramtypes', [_angular_core.Injector, CompileMetadataResolver, TemplateParser, StyleCompiler, ViewCompiler, NgModuleCompiler, DirectiveWrapperCompiler, CompilerConfig, AnimationParser])\n ], JitCompiler);\n return JitCompiler;\n }());\n var CompiledTemplate = (function () {\n /**\n * @param {?} isHost\n * @param {?} selector\n * @param {?} compType\n * @param {?} compMeta\n * @param {?} ngModule\n * @param {?} directives\n */\n function CompiledTemplate(isHost, selector, compType, compMeta, ngModule, directives) {\n this.isHost = isHost;\n this.compType = compType;\n this.compMeta = compMeta;\n this.ngModule = ngModule;\n this.directives = directives;\n this._viewClass = null;\n this.isCompiled = false;\n var self = this;\n this.proxyViewClass = function () {\n if (!self._viewClass) {\n throw new Error(\"Illegal state: CompiledTemplate for \" + stringify(self.compType) + \" is not compiled yet!\");\n }\n return self._viewClass.apply(this, arguments);\n };\n this.proxyComponentFactory = isHost ?\n new _angular_core.ComponentFactory(selector, this.proxyViewClass, compType.reference) :\n null;\n }\n /**\n * @param {?} viewClass\n * @return {?}\n */\n CompiledTemplate.prototype.compiled = function (viewClass) {\n this._viewClass = viewClass;\n this.proxyViewClass.prototype = viewClass.prototype;\n this.isCompiled = true;\n };\n return CompiledTemplate;\n }());\n /**\n * @param {?} meta\n * @return {?}\n */\n function assertComponent(meta) {\n if (!meta.isComponent) {\n throw new Error(\"Could not compile '\" + identifierName(meta.type) + \"' because it is not a component.\");\n }\n }\n /**\n * Implements `Compiler` by delegating to the JitCompiler using a known module.\n */\n var ModuleBoundCompiler = (function () {\n /**\n * @param {?} _delegate\n * @param {?} _ngModule\n */\n function ModuleBoundCompiler(_delegate, _ngModule) {\n this._delegate = _delegate;\n this._ngModule = _ngModule;\n }\n Object.defineProperty(ModuleBoundCompiler.prototype, \"_injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._delegate.injector; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} moduleType\n * @return {?}\n */\n ModuleBoundCompiler.prototype.compileModuleSync = function (moduleType) {\n return this._delegate.compileModuleSync(moduleType);\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n ModuleBoundCompiler.prototype.compileModuleAsync = function (moduleType) {\n return this._delegate.compileModuleAsync(moduleType);\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n ModuleBoundCompiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n return this._delegate.compileModuleAndAllComponentsSync(moduleType);\n };\n /**\n * @param {?} moduleType\n * @return {?}\n */\n ModuleBoundCompiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n return this._delegate.compileModuleAndAllComponentsAsync(moduleType);\n };\n /**\n * @param {?} component\n * @return {?}\n */\n ModuleBoundCompiler.prototype.getNgContentSelectors = function (component) {\n return this._delegate.getNgContentSelectors(component);\n };\n /**\n * Clears all caches\n * @return {?}\n */\n ModuleBoundCompiler.prototype.clearCache = function () { this._delegate.clearCache(); };\n /**\n * Clears the cache for the given component/ngModule.\n * @param {?} type\n * @return {?}\n */\n ModuleBoundCompiler.prototype.clearCacheFor = function (type) { this._delegate.clearCacheFor(type); };\n return ModuleBoundCompiler;\n }());\n\n /**\n * A container for message extracted from the templates.\n */\n var MessageBundle = (function () {\n /**\n * @param {?} _htmlParser\n * @param {?} _implicitTags\n * @param {?} _implicitAttrs\n */\n function MessageBundle(_htmlParser, _implicitTags, _implicitAttrs) {\n this._htmlParser = _htmlParser;\n this._implicitTags = _implicitTags;\n this._implicitAttrs = _implicitAttrs;\n this._messages = [];\n }\n /**\n * @param {?} html\n * @param {?} url\n * @param {?} interpolationConfig\n * @return {?}\n */\n MessageBundle.prototype.updateFromTemplate = function (html, url, interpolationConfig) {\n var /** @type {?} */ htmlParserResult = this._htmlParser.parse(html, url, true, interpolationConfig);\n if (htmlParserResult.errors.length) {\n return htmlParserResult.errors;\n }\n var /** @type {?} */ i18nParserResult = extractMessages(htmlParserResult.rootNodes, interpolationConfig, this._implicitTags, this._implicitAttrs);\n if (i18nParserResult.errors.length) {\n return i18nParserResult.errors;\n }\n (_a = this._messages).push.apply(_a, i18nParserResult.messages);\n var _a;\n };\n /**\n * @return {?}\n */\n MessageBundle.prototype.getMessages = function () { return this._messages; };\n /**\n * @param {?} serializer\n * @return {?}\n */\n MessageBundle.prototype.write = function (serializer) { return serializer.write(this._messages); };\n return MessageBundle;\n }());\n\n var Extractor = (function () {\n /**\n * @param {?} host\n * @param {?} staticSymbolResolver\n * @param {?} messageBundle\n * @param {?} metadataResolver\n */\n function Extractor(host, staticSymbolResolver, messageBundle, metadataResolver) {\n this.host = host;\n this.staticSymbolResolver = staticSymbolResolver;\n this.messageBundle = messageBundle;\n this.metadataResolver = metadataResolver;\n }\n /**\n * @param {?} rootFiles\n * @return {?}\n */\n Extractor.prototype.extract = function (rootFiles) {\n var _this = this;\n var /** @type {?} */ programSymbols = extractProgramSymbols(this.staticSymbolResolver, rootFiles, this.host);\n var _a = analyzeAndValidateNgModules(programSymbols, this.host, this.metadataResolver), ngModuleByPipeOrDirective = _a.ngModuleByPipeOrDirective, files = _a.files, ngModules = _a.ngModules;\n return Promise\n .all(ngModules.map(function (ngModule) { return _this.metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference, false); }))\n .then(function () {\n var /** @type {?} */ errors = [];\n files.forEach(function (file) {\n var /** @type {?} */ compMetas = [];\n file.directives.forEach(function (directiveType) {\n var /** @type {?} */ dirMeta = _this.metadataResolver.getDirectiveMetadata(directiveType);\n if (dirMeta && dirMeta.isComponent) {\n compMetas.push(dirMeta);\n }\n });\n compMetas.forEach(function (compMeta) {\n var /** @type {?} */ html = compMeta.template.template;\n var /** @type {?} */ interpolationConfig = InterpolationConfig.fromArray(compMeta.template.interpolation);\n errors.push.apply(errors, _this.messageBundle.updateFromTemplate(html, file.srcUrl, interpolationConfig));\n });\n });\n if (errors.length) {\n throw new Error(errors.map(function (e) { return e.toString(); }).join('\\n'));\n }\n return _this.messageBundle;\n });\n };\n /**\n * @param {?} host\n * @return {?}\n */\n Extractor.create = function (host) {\n var /** @type {?} */ htmlParser = new I18NHtmlParser(new HtmlParser());\n var /** @type {?} */ urlResolver = createOfflineCompileUrlResolver();\n var /** @type {?} */ symbolCache = new StaticSymbolCache();\n var /** @type {?} */ summaryResolver = new AotSummaryResolver(host, symbolCache);\n var /** @type {?} */ staticSymbolResolver = new StaticSymbolResolver(host, symbolCache, summaryResolver);\n var /** @type {?} */ staticReflector = new StaticReflector(staticSymbolResolver);\n StaticAndDynamicReflectionCapabilities.install(staticReflector);\n var /** @type {?} */ config = new CompilerConfig({\n genDebugInfo: false,\n defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated,\n logBindingUpdate: false,\n useJit: false\n });\n var /** @type {?} */ normalizer = new DirectiveNormalizer({ get: function (url) { return host.loadResource(url); } }, urlResolver, htmlParser, config);\n var /** @type {?} */ elementSchemaRegistry = new DomElementSchemaRegistry();\n var /** @type {?} */ resolver = new CompileMetadataResolver(new NgModuleResolver(staticReflector), new DirectiveResolver(staticReflector), new PipeResolver(staticReflector), summaryResolver, elementSchemaRegistry, normalizer, staticReflector);\n // TODO(vicb): implicit tags & attributes\n var /** @type {?} */ messageBundle = new MessageBundle(htmlParser, [], {});\n var /** @type {?} */ extractor = new Extractor(host, staticSymbolResolver, messageBundle, resolver);\n return { extractor: extractor, staticReflector: staticReflector };\n };\n return Extractor;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __decorate$18 = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n };\n var __metadata$18 = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n };\n var /** @type {?} */ _NO_RESOURCE_LOADER = {\n /**\n * @param {?} url\n * @return {?}\n */\n get: function (url) {\n throw new Error(\"No ResourceLoader implementation has been provided. Can't read the url \\\"\" + url + \"\\\"\");\n }\n };\n /**\n * A set of providers that provide `JitCompiler` and its dependencies to use for\n * template compilation.\n */\n var /** @type {?} */ COMPILER_PROVIDERS = [\n { provide: Reflector, useValue: reflector },\n { provide: ReflectorReader, useExisting: Reflector },\n { provide: ResourceLoader, useValue: _NO_RESOURCE_LOADER },\n SummaryResolver,\n Console,\n Lexer,\n Parser,\n HtmlParser,\n {\n provide: I18NHtmlParser,\n useFactory: function (parser, translations, format) {\n return new I18NHtmlParser(parser, translations, format);\n },\n deps: [\n HtmlParser,\n [new _angular_core.Optional(), new _angular_core.Inject(_angular_core.TRANSLATIONS)],\n [new _angular_core.Optional(), new _angular_core.Inject(_angular_core.TRANSLATIONS_FORMAT)],\n ]\n },\n TemplateParser,\n DirectiveNormalizer,\n CompileMetadataResolver,\n DEFAULT_PACKAGE_URL_PROVIDER,\n StyleCompiler,\n ViewCompiler,\n NgModuleCompiler,\n DirectiveWrapperCompiler,\n { provide: CompilerConfig, useValue: new CompilerConfig() },\n JitCompiler,\n { provide: _angular_core.Compiler, useExisting: JitCompiler },\n DomElementSchemaRegistry,\n { provide: ElementSchemaRegistry, useExisting: DomElementSchemaRegistry },\n UrlResolver,\n DirectiveResolver,\n PipeResolver,\n NgModuleResolver,\n AnimationParser\n ];\n var JitCompilerFactory = (function () {\n /**\n * @param {?} defaultOptions\n */\n function JitCompilerFactory(defaultOptions) {\n this._defaultOptions = [{\n useDebug: _angular_core.isDevMode(),\n useJit: true,\n defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated\n }].concat(defaultOptions);\n }\n /**\n * @param {?=} options\n * @return {?}\n */\n JitCompilerFactory.prototype.createCompiler = function (options) {\n if (options === void 0) { options = []; }\n var /** @type {?} */ mergedOptions = _mergeOptions(this._defaultOptions.concat(options));\n var /** @type {?} */ injector = _angular_core.ReflectiveInjector.resolveAndCreate([\n COMPILER_PROVIDERS, {\n provide: CompilerConfig,\n useFactory: function () {\n return new CompilerConfig({\n // let explicit values from the compiler options overwrite options\n // from the app providers. E.g. important for the testing platform.\n genDebugInfo: mergedOptions.useDebug,\n // let explicit values from the compiler options overwrite options\n // from the app providers\n useJit: mergedOptions.useJit,\n // let explicit values from the compiler options overwrite options\n // from the app providers\n defaultEncapsulation: mergedOptions.defaultEncapsulation,\n logBindingUpdate: mergedOptions.useDebug\n });\n },\n deps: []\n },\n mergedOptions.providers\n ]);\n return injector.get(_angular_core.Compiler);\n };\n /** @nocollapse */\n JitCompilerFactory.ctorParameters = function () { return [\n { type: Array, decorators: [{ type: _angular_core.Inject, args: [_angular_core.COMPILER_OPTIONS,] },] },\n ]; };\n JitCompilerFactory = __decorate$18([\n CompilerInjectable(), \n __metadata$18('design:paramtypes', [Array])\n ], JitCompilerFactory);\n return JitCompilerFactory;\n }());\n /**\n * @return {?}\n */\n function _initReflector() {\n reflector.reflectionCapabilities = new ReflectionCapabilities();\n }\n /**\n * A platform that included corePlatform and the compiler.\n *\n * @experimental\n */\n var /** @type {?} */ platformCoreDynamic = _angular_core.createPlatformFactory(_angular_core.platformCore, 'coreDynamic', [\n { provide: _angular_core.COMPILER_OPTIONS, useValue: {}, multi: true },\n { provide: _angular_core.CompilerFactory, useClass: JitCompilerFactory },\n { provide: _angular_core.PLATFORM_INITIALIZER, useValue: _initReflector, multi: true },\n ]);\n /**\n * @param {?} optionsArr\n * @return {?}\n */\n function _mergeOptions(optionsArr) {\n return {\n useDebug: _lastDefined(optionsArr.map(function (options) { return options.useDebug; })),\n useJit: _lastDefined(optionsArr.map(function (options) { return options.useJit; })),\n defaultEncapsulation: _lastDefined(optionsArr.map(function (options) { return options.defaultEncapsulation; })),\n providers: _mergeArrays(optionsArr.map(function (options) { return options.providers; }))\n };\n }\n /**\n * @param {?} args\n * @return {?}\n */\n function _lastDefined(args) {\n for (var /** @type {?} */ i = args.length - 1; i >= 0; i--) {\n if (args[i] !== undefined) {\n return args[i];\n }\n }\n return undefined;\n }\n /**\n * @param {?} parts\n * @return {?}\n */\n function _mergeArrays(parts) {\n var /** @type {?} */ result = [];\n parts.forEach(function (part) { return part && result.push.apply(result, part); });\n return result;\n }\n\n /**\n * Interface that defines how import statements should be generated.\n * @abstract\n */\n var ImportResolver = (function () {\n function ImportResolver() {\n }\n /**\n * Converts a file path to a module name that can be used as an `import.\n * I.e. `path/to/importedFile.ts` should be imported by `path/to/containingFile.ts`.\n * @abstract\n * @param {?} importedFilePath\n * @param {?} containingFilePath\n * @return {?}\n */\n ImportResolver.prototype.fileNameToModuleName = function (importedFilePath, containingFilePath) { };\n return ImportResolver;\n }());\n\n exports.VERSION = VERSION;\n exports.TextAst = TextAst;\n exports.BoundTextAst = BoundTextAst;\n exports.AttrAst = AttrAst;\n exports.BoundElementPropertyAst = BoundElementPropertyAst;\n exports.BoundEventAst = BoundEventAst;\n exports.ReferenceAst = ReferenceAst;\n exports.VariableAst = VariableAst;\n exports.ElementAst = ElementAst;\n exports.EmbeddedTemplateAst = EmbeddedTemplateAst;\n exports.BoundDirectivePropertyAst = BoundDirectivePropertyAst;\n exports.DirectiveAst = DirectiveAst;\n exports.ProviderAst = ProviderAst;\n exports.ProviderAstType = ProviderAstType;\n exports.NgContentAst = NgContentAst;\n exports.PropertyBindingType = PropertyBindingType;\n exports.templateVisitAll = templateVisitAll;\n exports.TEMPLATE_TRANSFORMS = TEMPLATE_TRANSFORMS;\n exports.CompilerConfig = CompilerConfig;\n exports.RenderTypes = RenderTypes;\n exports.CompileAnimationEntryMetadata = CompileAnimationEntryMetadata;\n exports.CompileAnimationStateMetadata = CompileAnimationStateMetadata;\n exports.CompileAnimationStateDeclarationMetadata = CompileAnimationStateDeclarationMetadata;\n exports.CompileAnimationStateTransitionMetadata = CompileAnimationStateTransitionMetadata;\n exports.CompileAnimationMetadata = CompileAnimationMetadata;\n exports.CompileAnimationKeyframesSequenceMetadata = CompileAnimationKeyframesSequenceMetadata;\n exports.CompileAnimationStyleMetadata = CompileAnimationStyleMetadata;\n exports.CompileAnimationAnimateMetadata = CompileAnimationAnimateMetadata;\n exports.CompileAnimationWithStepsMetadata = CompileAnimationWithStepsMetadata;\n exports.CompileAnimationSequenceMetadata = CompileAnimationSequenceMetadata;\n exports.CompileAnimationGroupMetadata = CompileAnimationGroupMetadata;\n exports.identifierName = identifierName;\n exports.identifierModuleUrl = identifierModuleUrl;\n exports.CompileSummaryKind = CompileSummaryKind;\n exports.tokenName = tokenName;\n exports.tokenReference = tokenReference;\n exports.CompileStylesheetMetadata = CompileStylesheetMetadata;\n exports.CompileTemplateMetadata = CompileTemplateMetadata;\n exports.CompileDirectiveMetadata = CompileDirectiveMetadata;\n exports.createHostComponentMeta = createHostComponentMeta;\n exports.CompilePipeMetadata = CompilePipeMetadata;\n exports.CompileNgModuleMetadata = CompileNgModuleMetadata;\n exports.TransitiveCompileNgModuleMetadata = TransitiveCompileNgModuleMetadata;\n exports.ProviderMeta = ProviderMeta;\n exports.createAotCompiler = createAotCompiler;\n exports.AotCompiler = AotCompiler;\n exports.analyzeNgModules = analyzeNgModules;\n exports.analyzeAndValidateNgModules = analyzeAndValidateNgModules;\n exports.extractProgramSymbols = extractProgramSymbols;\n exports.StaticReflector = StaticReflector;\n exports.StaticAndDynamicReflectionCapabilities = StaticAndDynamicReflectionCapabilities;\n exports.StaticSymbol = StaticSymbol;\n exports.StaticSymbolCache = StaticSymbolCache;\n exports.ResolvedStaticSymbol = ResolvedStaticSymbol;\n exports.StaticSymbolResolver = StaticSymbolResolver;\n exports.AotSummaryResolver = AotSummaryResolver;\n exports.SummaryResolver = SummaryResolver;\n exports.JitCompiler = JitCompiler;\n exports.COMPILER_PROVIDERS = COMPILER_PROVIDERS;\n exports.JitCompilerFactory = JitCompilerFactory;\n exports.platformCoreDynamic = platformCoreDynamic;\n exports.createUrlResolverWithoutPackagePrefix = createUrlResolverWithoutPackagePrefix;\n exports.createOfflineCompileUrlResolver = createOfflineCompileUrlResolver;\n exports.DEFAULT_PACKAGE_URL_PROVIDER = DEFAULT_PACKAGE_URL_PROVIDER;\n exports.UrlResolver = UrlResolver;\n exports.getUrlScheme = getUrlScheme;\n exports.ResourceLoader = ResourceLoader;\n exports.DirectiveResolver = DirectiveResolver;\n exports.PipeResolver = PipeResolver;\n exports.NgModuleResolver = NgModuleResolver;\n exports.DEFAULT_INTERPOLATION_CONFIG = DEFAULT_INTERPOLATION_CONFIG;\n exports.InterpolationConfig = InterpolationConfig;\n exports.ElementSchemaRegistry = ElementSchemaRegistry;\n exports.Extractor = Extractor;\n exports.I18NHtmlParser = I18NHtmlParser;\n exports.MessageBundle = MessageBundle;\n exports.Xliff = Xliff;\n exports.Xmb = Xmb;\n exports.Xtb = Xtb;\n exports.DirectiveNormalizer = DirectiveNormalizer;\n exports.TokenType = TokenType;\n exports.Lexer = Lexer;\n exports.Token = Token;\n exports.EOF = EOF;\n exports.isIdentifier = isIdentifier;\n exports.isQuote = isQuote;\n exports.SplitInterpolation = SplitInterpolation;\n exports.TemplateBindingParseResult = TemplateBindingParseResult;\n exports.Parser = Parser;\n exports._ParseAST = _ParseAST;\n exports.ERROR_COLLECTOR_TOKEN = ERROR_COLLECTOR_TOKEN;\n exports.CompileMetadataResolver = CompileMetadataResolver;\n exports.componentModuleUrl = componentModuleUrl;\n exports.ParseTreeResult = ParseTreeResult;\n exports.TreeError = TreeError;\n exports.HtmlParser = HtmlParser;\n exports.NgModuleCompiler = NgModuleCompiler;\n exports.DirectiveWrapperCompiler = DirectiveWrapperCompiler;\n exports.ImportResolver = ImportResolver;\n exports.debugOutputAstAsTypeScript = debugOutputAstAsTypeScript;\n exports.TypeScriptEmitter = TypeScriptEmitter;\n exports.ParseLocation = ParseLocation;\n exports.ParseSourceFile = ParseSourceFile;\n exports.ParseSourceSpan = ParseSourceSpan;\n exports.ParseErrorLevel = ParseErrorLevel;\n exports.ParseError = ParseError;\n exports.DomElementSchemaRegistry = DomElementSchemaRegistry;\n exports.CssSelector = CssSelector;\n exports.SelectorMatcher = SelectorMatcher;\n exports.SelectorListContext = SelectorListContext;\n exports.SelectorContext = SelectorContext;\n exports.StylesCompileDependency = StylesCompileDependency;\n exports.StylesCompileResult = StylesCompileResult;\n exports.CompiledStylesheet = CompiledStylesheet;\n exports.StyleCompiler = StyleCompiler;\n exports.TemplateParseError = TemplateParseError;\n exports.TemplateParseResult = TemplateParseResult;\n exports.TemplateParser = TemplateParser;\n exports.splitClasses = splitClasses;\n exports.createElementCssSelector = createElementCssSelector;\n exports.removeSummaryDuplicates = removeSummaryDuplicates;\n exports.ViewCompiler = ViewCompiler;\n exports.AnimationParser = AnimationParser;\n exports.SyntaxError = SyntaxError;\n\n}));//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vQGFuZ3VsYXIvY29tcGlsZXIvYnVuZGxlcy9jb21waWxlci51bWQuanM/OWRmNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjIuNC4wXG4gKiAoYykgMjAxMC0yMDE2IEdvb2dsZSwgSW5jLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdAYW5ndWxhci9jb3JlJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdAYW5ndWxhci9jb3JlJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC5uZyA9IGdsb2JhbC5uZyB8fCB7fSwgZ2xvYmFsLm5nLmNvbXBpbGVyID0gZ2xvYmFsLm5nLmNvbXBpbGVyIHx8IHt9KSxnbG9iYWwubmcuY29yZSkpO1xufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cyxfYW5ndWxhcl9jb3JlKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogQHN0YWJsZVxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVkVSU0lPTiA9IG5ldyBfYW5ndWxhcl9jb3JlLlZlcnNpb24oJzIuNC4wJyk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICAvKipcbiAgICogIEEgc2VnbWVudCBvZiB0ZXh0IHdpdGhpbiB0aGUgdGVtcGxhdGUuXG4gICAqL1xuICB2YXIgVGV4dEFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gbmdDb250ZW50SW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUZXh0QXN0KHZhbHVlLCBuZ0NvbnRlbnRJbmRleCwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm5nQ29udGVudEluZGV4ID0gbmdDb250ZW50SW5kZXg7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRleHRBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0KHRoaXMsIGNvbnRleHQpOyB9O1xuICAgICAgcmV0dXJuIFRleHRBc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQSBib3VuZCBleHByZXNzaW9uIHdpdGhpbiB0aGUgdGV4dCBvZiBhIHRlbXBsYXRlLlxuICAgKi9cbiAgdmFyIEJvdW5kVGV4dEFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gbmdDb250ZW50SW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBCb3VuZFRleHRBc3QodmFsdWUsIG5nQ29udGVudEluZGV4LCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMubmdDb250ZW50SW5kZXggPSBuZ0NvbnRlbnRJbmRleDtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQm91bmRUZXh0QXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCb3VuZFRleHQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJvdW5kVGV4dEFzdDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBBIHBsYWluIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICAgKi9cbiAgdmFyIEF0dHJBc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBdHRyQXN0KG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEF0dHJBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgICAgcmV0dXJuIEF0dHJBc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQSBiaW5kaW5nIGZvciBhbiBlbGVtZW50IHByb3BlcnR5IChlLmcuIGBbcHJvcGVydHldPVwiZXhwcmVzc2lvblwiYCkgb3IgYW4gYW5pbWF0aW9uIHRyaWdnZXIgKGUuZy5cbiAgICAqIGBbQHRyaWdnZXJdPVwic3RhdGVFeHBcImApXG4gICAqL1xuICB2YXIgQm91bmRFbGVtZW50UHJvcGVydHlBc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBzZWN1cml0eUNvbnRleHRcbiAgICAgICAqIEBwYXJhbSB7P30gbmVlZHNSdW50aW1lU2VjdXJpdHlDb250ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHVuaXRcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdChuYW1lLCB0eXBlLCBzZWN1cml0eUNvbnRleHQsIG5lZWRzUnVudGltZVNlY3VyaXR5Q29udGV4dCwgdmFsdWUsIHVuaXQsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgdGhpcy5zZWN1cml0eUNvbnRleHQgPSBzZWN1cml0eUNvbnRleHQ7XG4gICAgICAgICAgdGhpcy5uZWVkc1J1bnRpbWVTZWN1cml0eUNvbnRleHQgPSBuZWVkc1J1bnRpbWVTZWN1cml0eUNvbnRleHQ7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50UHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LnByb3RvdHlwZSwgXCJpc0FuaW1hdGlvblwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5BbmltYXRpb247IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0O1xuICB9KCkpO1xuICAvKipcbiAgICogIEEgYmluZGluZyBmb3IgYW4gZWxlbWVudCBldmVudCAoZS5nLiBgKGV2ZW50KT1cImhhbmRsZXIoKVwiYCkgb3IgYW4gYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgKGUuZy5cbiAgICAqIGAoQHRyaWdnZXIucGhhc2UpPVwiY2FsbGJhY2soJGV2ZW50KVwiYCkuXG4gICAqL1xuICB2YXIgQm91bmRFdmVudEFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRcbiAgICAgICAqIEBwYXJhbSB7P30gcGhhc2VcbiAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlclxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEJvdW5kRXZlbnRBc3QobmFtZSwgdGFyZ2V0LCBwaGFzZSwgaGFuZGxlciwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlO1xuICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFxuICAgICAgICogQHBhcmFtIHs/fSBwaGFzZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQm91bmRFdmVudEFzdC5jYWxjRnVsbE5hbWUgPSBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0LCBwaGFzZSkge1xuICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCArIFwiOlwiICsgbmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiQFwiICsgbmFtZSArIFwiLlwiICsgcGhhc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQm91bmRFdmVudEFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXZlbnQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJvdW5kRXZlbnRBc3QucHJvdG90eXBlLCBcImZ1bGxOYW1lXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQm91bmRFdmVudEFzdC5jYWxjRnVsbE5hbWUodGhpcy5uYW1lLCB0aGlzLnRhcmdldCwgdGhpcy5waGFzZSk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJvdW5kRXZlbnRBc3QucHJvdG90eXBlLCBcImlzQW5pbWF0aW9uXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gISF0aGlzLnBoYXNlOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBCb3VuZEV2ZW50QXN0O1xuICB9KCkpO1xuICAvKipcbiAgICogIEEgcmVmZXJlbmNlIGRlY2xhcmF0aW9uIG9uIGFuIGVsZW1lbnQgKGUuZy4gYGxldCBzb21lTmFtZT1cImV4cHJlc3Npb25cImApLlxuICAgKi9cbiAgdmFyIFJlZmVyZW5jZUFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJlZmVyZW5jZUFzdChuYW1lLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWZlcmVuY2VBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZmVyZW5jZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gUmVmZXJlbmNlQXN0O1xuICB9KCkpO1xuICAvKipcbiAgICogIEEgdmFyaWFibGUgZGVjbGFyYXRpb24gb24gYSA8dGVtcGxhdGU+IChlLmcuIGB2YXItc29tZU5hbWU9XCJzb21lTG9jYWxOYW1lXCJgKS5cbiAgICovXG4gIHZhciBWYXJpYWJsZUFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFZhcmlhYmxlQXN0KG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZhcmlhYmxlQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gVmFyaWFibGVBc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpbiBhIHRlbXBsYXRlLlxuICAgKi9cbiAgdmFyIEVsZW1lbnRBc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cnNcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRzXG4gICAgICAgKiBAcGFyYW0gez99IG91dHB1dHNcbiAgICAgICAqIEBwYXJhbSB7P30gcmVmZXJlbmNlc1xuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAgICogQHBhcmFtIHs/fSBoYXNWaWV3Q29udGFpbmVyXG4gICAgICAgKiBAcGFyYW0gez99IGNoaWxkcmVuXG4gICAgICAgKiBAcGFyYW0gez99IG5nQ29udGVudEluZGV4XG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gZW5kU291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBFbGVtZW50QXN0KG5hbWUsIGF0dHJzLCBpbnB1dHMsIG91dHB1dHMsIHJlZmVyZW5jZXMsIGRpcmVjdGl2ZXMsIHByb3ZpZGVycywgaGFzVmlld0NvbnRhaW5lciwgY2hpbGRyZW4sIG5nQ29udGVudEluZGV4LCBzb3VyY2VTcGFuLCBlbmRTb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7XG4gICAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7XG4gICAgICAgICAgdGhpcy5oYXNWaWV3Q29udGFpbmVyID0gaGFzVmlld0NvbnRhaW5lcjtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgICAgdGhpcy5uZ0NvbnRlbnRJbmRleCA9IG5nQ29udGVudEluZGV4O1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICAgICAgdGhpcy5lbmRTb3VyY2VTcGFuID0gZW5kU291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEVsZW1lbnRBc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQSBgPHRlbXBsYXRlPmAgZWxlbWVudCBpbmNsdWRlZCBpbiBhbiBBbmd1bGFyIHRlbXBsYXRlLlxuICAgKi9cbiAgdmFyIEVtYmVkZGVkVGVtcGxhdGVBc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IG91dHB1dHNcbiAgICAgICAqIEBwYXJhbSB7P30gcmVmZXJlbmNlc1xuICAgICAgICogQHBhcmFtIHs/fSB2YXJpYWJsZXNcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAqIEBwYXJhbSB7P30gaGFzVmlld0NvbnRhaW5lclxuICAgICAgICogQHBhcmFtIHs/fSBjaGlsZHJlblxuICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRlbnRJbmRleFxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEVtYmVkZGVkVGVtcGxhdGVBc3QoYXR0cnMsIG91dHB1dHMsIHJlZmVyZW5jZXMsIHZhcmlhYmxlcywgZGlyZWN0aXZlcywgcHJvdmlkZXJzLCBoYXNWaWV3Q29udGFpbmVyLCBjaGlsZHJlbiwgbmdDb250ZW50SW5kZXgsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICAgIHRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzO1xuICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7XG4gICAgICAgICAgdGhpcy5oYXNWaWV3Q29udGFpbmVyID0gaGFzVmlld0NvbnRhaW5lcjtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgICAgdGhpcy5uZ0NvbnRlbnRJbmRleCA9IG5nQ29udGVudEluZGV4O1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbWJlZGRlZFRlbXBsYXRlQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbWJlZGRlZFRlbXBsYXRlKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBFbWJlZGRlZFRlbXBsYXRlQXN0O1xuICB9KCkpO1xuICAvKipcbiAgICogIEEgZGlyZWN0aXZlIHByb3BlcnR5IHdpdGggYSBib3VuZCB2YWx1ZSAoZS5nLiBgKm5nSWY9XCJjb25kaXRpb25cIikuXG4gICAqL1xuICB2YXIgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZU5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0KGRpcmVjdGl2ZU5hbWUsIHRlbXBsYXRlTmFtZSwgdmFsdWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdGl2ZU5hbWUgPSBkaXJlY3RpdmVOYW1lO1xuICAgICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQSBkaXJlY3RpdmUgZGVjbGFyZWQgb24gYW4gZWxlbWVudC5cbiAgICovXG4gIHZhciBEaXJlY3RpdmVBc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dHNcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFByb3BlcnRpZXNcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdEV2ZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERpcmVjdGl2ZUFzdChkaXJlY3RpdmUsIGlucHV0cywgaG9zdFByb3BlcnRpZXMsIGhvc3RFdmVudHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICAgICAgICB0aGlzLmhvc3RQcm9wZXJ0aWVzID0gaG9zdFByb3BlcnRpZXM7XG4gICAgICAgICAgdGhpcy5ob3N0RXZlbnRzID0gaG9zdEV2ZW50cztcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaXJlY3RpdmUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIERpcmVjdGl2ZUFzdDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBBIHByb3ZpZGVyIGRlY2xhcmVkIG9uIGFuIGVsZW1lbnRcbiAgICovXG4gIHZhciBQcm92aWRlckFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEBwYXJhbSB7P30gbXVsdGlQcm92aWRlclxuICAgICAgICogQHBhcmFtIHs/fSBlYWdlclxuICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGxpZmVjeWNsZUhvb2tzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUHJvdmlkZXJBc3QodG9rZW4sIG11bHRpUHJvdmlkZXIsIGVhZ2VyLCBwcm92aWRlcnMsIHByb3ZpZGVyVHlwZSwgbGlmZWN5Y2xlSG9va3MsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgdGhpcy5tdWx0aVByb3ZpZGVyID0gbXVsdGlQcm92aWRlcjtcbiAgICAgICAgICB0aGlzLmVhZ2VyID0gZWFnZXI7XG4gICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7XG4gICAgICAgICAgdGhpcy5wcm92aWRlclR5cGUgPSBwcm92aWRlclR5cGU7XG4gICAgICAgICAgdGhpcy5saWZlY3ljbGVIb29rcyA9IGxpZmVjeWNsZUhvb2tzO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcm92aWRlckFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIC8vIE5vIHZpc2l0IG1ldGhvZCBpbiB0aGUgdmlzaXRvciBmb3Igbm93Li4uXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFByb3ZpZGVyQXN0O1xuICB9KCkpO1xuICB2YXIgUHJvdmlkZXJBc3RUeXBlID0ge307XG4gIFByb3ZpZGVyQXN0VHlwZS5QdWJsaWNTZXJ2aWNlID0gMDtcbiAgUHJvdmlkZXJBc3RUeXBlLlByaXZhdGVTZXJ2aWNlID0gMTtcbiAgUHJvdmlkZXJBc3RUeXBlLkNvbXBvbmVudCA9IDI7XG4gIFByb3ZpZGVyQXN0VHlwZS5EaXJlY3RpdmUgPSAzO1xuICBQcm92aWRlckFzdFR5cGUuQnVpbHRpbiA9IDQ7XG4gIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGUuUHVibGljU2VydmljZV0gPSBcIlB1YmxpY1NlcnZpY2VcIjtcbiAgUHJvdmlkZXJBc3RUeXBlW1Byb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZV0gPSBcIlByaXZhdGVTZXJ2aWNlXCI7XG4gIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGUuQ29tcG9uZW50XSA9IFwiQ29tcG9uZW50XCI7XG4gIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlXSA9IFwiRGlyZWN0aXZlXCI7XG4gIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGUuQnVpbHRpbl0gPSBcIkJ1aWx0aW5cIjtcbiAgLyoqXG4gICAqICBQb3NpdGlvbiB3aGVyZSBjb250ZW50IGlzIHRvIGJlIHByb2plY3RlZCAoaW5zdGFuY2Ugb2YgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZSkuXG4gICAqL1xuICB2YXIgTmdDb250ZW50QXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRlbnRJbmRleFxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5nQ29udGVudEFzdChpbmRleCwgbmdDb250ZW50SW5kZXgsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgdGhpcy5uZ0NvbnRlbnRJbmRleCA9IG5nQ29udGVudEluZGV4O1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOZ0NvbnRlbnRBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdE5nQ29udGVudCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTmdDb250ZW50QXN0O1xuICB9KCkpO1xuICB2YXIgUHJvcGVydHlCaW5kaW5nVHlwZSA9IHt9O1xuICBQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5ID0gMDtcbiAgUHJvcGVydHlCaW5kaW5nVHlwZS5BdHRyaWJ1dGUgPSAxO1xuICBQcm9wZXJ0eUJpbmRpbmdUeXBlLkNsYXNzID0gMjtcbiAgUHJvcGVydHlCaW5kaW5nVHlwZS5TdHlsZSA9IDM7XG4gIFByb3BlcnR5QmluZGluZ1R5cGUuQW5pbWF0aW9uID0gNDtcbiAgUHJvcGVydHlCaW5kaW5nVHlwZVtQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5XSA9IFwiUHJvcGVydHlcIjtcbiAgUHJvcGVydHlCaW5kaW5nVHlwZVtQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZV0gPSBcIkF0dHJpYnV0ZVwiO1xuICBQcm9wZXJ0eUJpbmRpbmdUeXBlW1Byb3BlcnR5QmluZGluZ1R5cGUuQ2xhc3NdID0gXCJDbGFzc1wiO1xuICBQcm9wZXJ0eUJpbmRpbmdUeXBlW1Byb3BlcnR5QmluZGluZ1R5cGUuU3R5bGVdID0gXCJTdHlsZVwiO1xuICBQcm9wZXJ0eUJpbmRpbmdUeXBlW1Byb3BlcnR5QmluZGluZ1R5cGUuQW5pbWF0aW9uXSA9IFwiQW5pbWF0aW9uXCI7XG4gIC8qKlxuICAgKiAgVmlzaXQgZXZlcnkgbm9kZSBpbiBhIGxpc3Qgb2Yge0BsaW5rIFRlbXBsYXRlQXN0fXMgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlQXN0VmlzaXRvcn0uXG4gICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgKiBAcGFyYW0gez99IGFzdHNcbiAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBhc3RzLCBjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0ID0gdmlzaXRvci52aXNpdCA/XG4gICAgICAgICAgZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXRvci52aXNpdChhc3QsIGNvbnRleHQpIHx8IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTsgfSA6XG4gICAgICAgICAgZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gYXN0LnZpc2l0KHZpc2l0b3IsIGNvbnRleHQpOyB9O1xuICAgICAgYXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3RSZXN1bHQgPSB2aXNpdChhc3QpO1xuICAgICAgICAgIGlmIChhc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXN0UmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogIEEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBhIHJlZmVyZW5jZSB0byBhIHN0YXRpYyB0eXBlLlxuICAgICogKlxuICAgICogVGhpcyB0b2tlbiBpcyB1bmlxdWUgZm9yIGEgZmlsZVBhdGggYW5kIG5hbWUgYW5kIGNhbiBiZSB1c2VkIGFzIGEgaGFzaCB0YWJsZSBrZXkuXG4gICAqL1xuICB2YXIgU3RhdGljU3ltYm9sID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmaWxlUGF0aFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSBtZW1iZXJzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFN0YXRpY1N5bWJvbChmaWxlUGF0aCwgbmFtZSwgbWVtYmVycykge1xuICAgICAgICAgIHRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3RhdGljU3ltYm9sO1xuICB9KCkpO1xuICAvKipcbiAgICogIEEgY2FjaGUgb2Ygc3RhdGljIHN5bWJvbCB1c2VkIGJ5IHRoZSBTdGF0aWNSZWZsZWN0b3IgdG8gcmV0dXJuIHRoZSBzYW1lIHN5bWJvbCBmb3IgdGhlXG4gICAgKiBzYW1lIHN5bWJvbCB2YWx1ZXMuXG4gICAqL1xuICB2YXIgU3RhdGljU3ltYm9sQ2FjaGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU3RhdGljU3ltYm9sQ2FjaGUoKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbkZpbGVcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gbWVtYmVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljU3ltYm9sQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChkZWNsYXJhdGlvbkZpbGUsIG5hbWUsIG1lbWJlcnMpIHtcbiAgICAgICAgICBtZW1iZXJzID0gbWVtYmVycyB8fCBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZW1iZXJTdWZmaXggPSBtZW1iZXJzLmxlbmd0aCA/IFwiLlwiICsgbWVtYmVycy5qb2luKCcuJykgOiAnJztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXkgPSBcIlxcXCJcIiArIGRlY2xhcmF0aW9uRmlsZSArIFwiXFxcIi5cIiArIG5hbWUgKyBtZW1iZXJTdWZmaXg7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RhdGljU3ltYm9sKGRlY2xhcmF0aW9uRmlsZSwgbmFtZSwgbWVtYmVycyk7XG4gICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RhdGljU3ltYm9sQ2FjaGU7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2JqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc1ByZXNlbnQob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICE9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2JqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0JsYW5rKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiA9PSBudWxsO1xuICB9XG4gIHZhciAvKiogQHR5cGUgez99ICovIFNUUklOR19NQVBfUFJPVE8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBvYmpcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzU3RyaWN0U3RyaW5nTWFwKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gU1RSSU5HX01BUF9QUk9UTztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5KHRva2VuKSB7XG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICcnICsgdG9rZW47XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm92ZXJyaWRkZW5OYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm5hbWU7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB0b2tlbi50b1N0cmluZygpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoJ1xcbicpO1xuICAgICAgcmV0dXJuIG5ld0xpbmVJbmRleCA9PT0gLTEgPyByZXMgOiByZXMuc3Vic3RyaW5nKDAsIG5ld0xpbmVJbmRleCk7XG4gIH1cbiAgdmFyIE51bWJlcldyYXBwZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTnVtYmVyV3JhcHBlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBwYXJzZUludCh0ZXh0KTtcbiAgICAgICAgICBpZiAoaXNOYU4ocmVzdWx0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyAnICsgdGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOdW1iZXJXcmFwcGVyLmlzTnVtZXJpYyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gIWlzTmFOKHZhbHVlIC0gcGFyc2VGbG9hdCh2YWx1ZSkpOyB9O1xuICAgICAgcmV0dXJuIE51bWJlcldyYXBwZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG9cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzSnNPYmplY3Qobykge1xuICAgICAgcmV0dXJuIG8gIT09IG51bGwgJiYgKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvID09PSAnb2JqZWN0Jyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2JqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc1ByaW1pdGl2ZShvYmopIHtcbiAgICAgIHJldHVybiAhaXNKc09iamVjdChvYmopO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzKSB7XG4gICAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG4gIH1cblxuICAvKipcbiAgICogIFdyYXBzIEphdmFzY3JpcHQgT2JqZWN0c1xuICAgKi9cbiAgdmFyIFN0cmluZ01hcFdyYXBwZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU3RyaW5nTWFwV3JhcHBlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtMVxuICAgICAgICogQHBhcmFtIHs/fSBtMlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5tZXJnZSA9IGZ1bmN0aW9uIChtMSwgbTIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtID0ge307XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IE9iamVjdC5rZXlzKG0xKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgdmFyIGsgPSBfYVtfaV07XG4gICAgICAgICAgICAgIG1ba10gPSBtMVtrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IE9iamVjdC5rZXlzKG0yKTsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgICAgICAgdmFyIGsgPSBfY1tfYl07XG4gICAgICAgICAgICAgIG1ba10gPSBtMltrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG0xXG4gICAgICAgKiBAcGFyYW0gez99IG0yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdHJpbmdNYXBXcmFwcGVyLmVxdWFscyA9IGZ1bmN0aW9uIChtMSwgbTIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrMSA9IE9iamVjdC5rZXlzKG0xKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrMiA9IE9iamVjdC5rZXlzKG0yKTtcbiAgICAgICAgICBpZiAoazEubGVuZ3RoICE9IGsyLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBrMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXkgPSBrMVtpXTtcbiAgICAgICAgICAgICAgaWYgKG0xW2tleV0gIT09IG0yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlcjtcbiAgfSgpKTtcbiAgdmFyIExpc3RXcmFwcGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIExpc3RXcmFwcGVyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFyclxuICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb25cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIExpc3RXcmFwcGVyLmZpbmRMYXN0ID0gZnVuY3Rpb24gKGFyciwgY29uZGl0aW9uKSB7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGlmIChjb25kaXRpb24oYXJyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycltpXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbGlzdFxuICAgICAgICogQHBhcmFtIHs/fSBpdGVtc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlQWxsID0gZnVuY3Rpb24gKGxpc3QsIGl0ZW1zKSB7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gbGlzdC5pbmRleE9mKGl0ZW1zW2ldKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbGlzdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlID0gZnVuY3Rpb24gKGxpc3QsIGVsKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSBsaXN0LmluZGV4T2YoZWwpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYVxuICAgICAgICogQHBhcmFtIHs/fSBiXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBMaXN0V3JhcHBlci5lcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGlmIChhW2ldICE9PSBiW2ldKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbGlzdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGlzdFdyYXBwZXIuZmxhdHRlbiA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgICAgcmV0dXJuIGxpc3QucmVkdWNlKGZ1bmN0aW9uIChmbGF0LCBpdGVtKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZsYXRJdGVtID0gQXJyYXkuaXNBcnJheShpdGVtKSA/IExpc3RXcmFwcGVyLmZsYXR0ZW4oaXRlbSkgOiBpdGVtO1xuICAgICAgICAgICAgICByZXR1cm4gKChmbGF0KSkuY29uY2F0KGZsYXRJdGVtKTtcbiAgICAgICAgICB9LCBbXSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIExpc3RXcmFwcGVyO1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIGlzRGVmYXVsdENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLmlzRGVmYXVsdENoYW5nZURldGVjdGlvblN0cmF0ZWd5O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDaGFuZ2VEZXRlY3RvclN0YXR1cyA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5DaGFuZ2VEZXRlY3RvclN0YXR1cztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTGlmZWN5Y2xlSG9va3MgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uTGlmZWN5Y2xlSG9va3M7XG4gIHZhciAvKiogQHR5cGUgez99ICovIExJRkVDWUNMRV9IT09LU19WQUxVRVMgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uTElGRUNZQ0xFX0hPT0tTX1ZBTFVFUztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUmVmbGVjdG9yUmVhZGVyID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLlJlZmxlY3RvclJlYWRlcjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVmlld0NvbnRhaW5lciA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5WaWV3Q29udGFpbmVyO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENvbXBvbmVudFJlZl8gPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uQ29tcG9uZW50UmVmXztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQXBwVmlldyA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5BcHBWaWV3O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEZWJ1Z0FwcFZpZXcgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uRGVidWdBcHBWaWV3O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOZ01vZHVsZUluamVjdG9yID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLk5nTW9kdWxlSW5qZWN0b3I7XG4gIHZhciAvKiogQHR5cGUgez99ICovIHJlZ2lzdGVyTW9kdWxlRmFjdG9yeSA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5yZWdpc3Rlck1vZHVsZUZhY3Rvcnk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFZpZXdUeXBlID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLlZpZXdUeXBlO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3X3V0aWxzID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLnZpZXdfdXRpbHM7XG4gIHZhciAvKiogQHR5cGUgez99ICovIERlYnVnQ29udGV4dCA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5EZWJ1Z0NvbnRleHQ7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFN0YXRpY05vZGVEZWJ1Z0luZm8gPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uU3RhdGljTm9kZURlYnVnSW5mbztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGV2TW9kZUVxdWFsID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLmRldk1vZGVFcXVhbDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVU5JTklUSUFMSVpFRCA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5VTklOSVRJQUxJWkVEO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWYWx1ZVVud3JhcHBlciA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5WYWx1ZVVud3JhcHBlcjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVGVtcGxhdGVSZWZfID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLlRlbXBsYXRlUmVmXztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ29uc29sZSA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5Db25zb2xlO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWZsZWN0b3IgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18ucmVmbGVjdG9yO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBSZWZsZWN0b3IgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uUmVmbGVjdG9yO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLlJlZmxlY3Rpb25DYXBhYmlsaXRpZXM7XG4gIHZhciAvKiogQHR5cGUgez99ICovIE5vT3BBbmltYXRpb25QbGF5ZXIgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uTm9PcEFuaW1hdGlvblBsYXllcjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXI7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEFuaW1hdGlvbkdyb3VwUGxheWVyID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkFuaW1hdGlvbkdyb3VwUGxheWVyO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBbmltYXRpb25LZXlmcmFtZSA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5BbmltYXRpb25LZXlmcmFtZTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQW5pbWF0aW9uU3R5bGVzID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkFuaW1hdGlvblN0eWxlcztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQU5ZX1NUQVRFID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkFOWV9TVEFURTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gREVGQVVMVF9TVEFURSA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5ERUZBVUxUX1NUQVRFO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBFTVBUWV9TVEFURSA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5FTVBUWV9TVEFURTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRklMTF9TVFlMRV9GTEFHID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkZJTExfU1RZTEVfRkxBRztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlcGFyZUZpbmFsQW5pbWF0aW9uU3R5bGVzID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLnByZXBhcmVGaW5hbEFuaW1hdGlvblN0eWxlcztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmFsYW5jZUFuaW1hdGlvbktleWZyYW1lcyA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5iYWxhbmNlQW5pbWF0aW9uS2V5ZnJhbWVzO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbGVhclN0eWxlcyA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5jbGVhclN0eWxlcztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29sbGVjdEFuZFJlc29sdmVTdHlsZXMgPSBfYW5ndWxhcl9jb3JlLl9fY29yZV9wcml2YXRlX18uY29sbGVjdEFuZFJlc29sdmVTdHlsZXM7XG4gIHZhciAvKiogQHR5cGUgez99ICovIHJlbmRlclN0eWxlcyA9IF9hbmd1bGFyX2NvcmUuX19jb3JlX3ByaXZhdGVfXy5yZW5kZXJTdHlsZXM7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENvbXBvbmVudFN0aWxsTG9hZGluZ0Vycm9yID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkNvbXBvbmVudFN0aWxsTG9hZGluZ0Vycm9yO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBbmltYXRpb25UcmFuc2l0aW9uID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLkFuaW1hdGlvblRyYW5zaXRpb247XG5cbiAgdmFyIFRhZ0NvbnRlbnRUeXBlID0ge307XG4gIFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUID0gMDtcbiAgVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUID0gMTtcbiAgVGFnQ29udGVudFR5cGUuUEFSU0FCTEVfREFUQSA9IDI7XG4gIFRhZ0NvbnRlbnRUeXBlW1RhZ0NvbnRlbnRUeXBlLlJBV19URVhUXSA9IFwiUkFXX1RFWFRcIjtcbiAgVGFnQ29udGVudFR5cGVbVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUXSA9IFwiRVNDQVBBQkxFX1JBV19URVhUXCI7XG4gIFRhZ0NvbnRlbnRUeXBlW1RhZ0NvbnRlbnRUeXBlLlBBUlNBQkxFX0RBVEFdID0gXCJQQVJTQUJMRV9EQVRBXCI7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGVsZW1lbnROYW1lXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE5zTmFtZShlbGVtZW50TmFtZSkge1xuICAgICAgaWYgKGVsZW1lbnROYW1lWzBdICE9ICc6Jykge1xuICAgICAgICAgIHJldHVybiBbbnVsbCwgZWxlbWVudE5hbWVdO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29sb25JbmRleCA9IGVsZW1lbnROYW1lLmluZGV4T2YoJzonLCAxKTtcbiAgICAgIGlmIChjb2xvbkluZGV4ID09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgZm9ybWF0IFxcXCJcIiArIGVsZW1lbnROYW1lICsgXCJcXFwiIGV4cGVjdGluZyBcXFwiOm5hbWVzcGFjZTpuYW1lXFxcIlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbZWxlbWVudE5hbWUuc2xpY2UoMSwgY29sb25JbmRleCksIGVsZW1lbnROYW1lLnNsaWNlKGNvbG9uSW5kZXggKyAxKV07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZnVsbE5hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldE5zUHJlZml4KGZ1bGxOYW1lKSB7XG4gICAgICByZXR1cm4gZnVsbE5hbWUgPT09IG51bGwgPyBudWxsIDogc3BsaXROc05hbWUoZnVsbE5hbWUpWzBdO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHByZWZpeFxuICAgKiBAcGFyYW0gez99IGxvY2FsTmFtZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VOc0FuZE5hbWUocHJlZml4LCBsb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBwcmVmaXggPyBcIjpcIiArIHByZWZpeCArIFwiOlwiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lO1xuICB9XG4gIC8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXNcbiAgLy8gc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VudGl0aWVzLmpzb25cbiAgLy8gVGhpcyBsaXN0IGlzIG5vdCBleGhhdXN0aXZlIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGZvb3RwcmludCBsb3cuXG4gIC8vIFRoZSBgJiMxMjM7YCAvIGAmI3gxYWI7YCBzeW50YXggc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTkFNRURfRU5USVRJRVMgPSB7XG4gICAgICAnQWFjdXRlJzogJ1xcdTAwQzEnLFxuICAgICAgJ2FhY3V0ZSc6ICdcXHUwMEUxJyxcbiAgICAgICdBY2lyYyc6ICdcXHUwMEMyJyxcbiAgICAgICdhY2lyYyc6ICdcXHUwMEUyJyxcbiAgICAgICdhY3V0ZSc6ICdcXHUwMEI0JyxcbiAgICAgICdBRWxpZyc6ICdcXHUwMEM2JyxcbiAgICAgICdhZWxpZyc6ICdcXHUwMEU2JyxcbiAgICAgICdBZ3JhdmUnOiAnXFx1MDBDMCcsXG4gICAgICAnYWdyYXZlJzogJ1xcdTAwRTAnLFxuICAgICAgJ2FsZWZzeW0nOiAnXFx1MjEzNScsXG4gICAgICAnQWxwaGEnOiAnXFx1MDM5MScsXG4gICAgICAnYWxwaGEnOiAnXFx1MDNCMScsXG4gICAgICAnYW1wJzogJyYnLFxuICAgICAgJ2FuZCc6ICdcXHUyMjI3JyxcbiAgICAgICdhbmcnOiAnXFx1MjIyMCcsXG4gICAgICAnYXBvcyc6ICdcXHUwMDI3JyxcbiAgICAgICdBcmluZyc6ICdcXHUwMEM1JyxcbiAgICAgICdhcmluZyc6ICdcXHUwMEU1JyxcbiAgICAgICdhc3ltcCc6ICdcXHUyMjQ4JyxcbiAgICAgICdBdGlsZGUnOiAnXFx1MDBDMycsXG4gICAgICAnYXRpbGRlJzogJ1xcdTAwRTMnLFxuICAgICAgJ0F1bWwnOiAnXFx1MDBDNCcsXG4gICAgICAnYXVtbCc6ICdcXHUwMEU0JyxcbiAgICAgICdiZHF1byc6ICdcXHUyMDFFJyxcbiAgICAgICdCZXRhJzogJ1xcdTAzOTInLFxuICAgICAgJ2JldGEnOiAnXFx1MDNCMicsXG4gICAgICAnYnJ2YmFyJzogJ1xcdTAwQTYnLFxuICAgICAgJ2J1bGwnOiAnXFx1MjAyMicsXG4gICAgICAnY2FwJzogJ1xcdTIyMjknLFxuICAgICAgJ0NjZWRpbCc6ICdcXHUwMEM3JyxcbiAgICAgICdjY2VkaWwnOiAnXFx1MDBFNycsXG4gICAgICAnY2VkaWwnOiAnXFx1MDBCOCcsXG4gICAgICAnY2VudCc6ICdcXHUwMEEyJyxcbiAgICAgICdDaGknOiAnXFx1MDNBNycsXG4gICAgICAnY2hpJzogJ1xcdTAzQzcnLFxuICAgICAgJ2NpcmMnOiAnXFx1MDJDNicsXG4gICAgICAnY2x1YnMnOiAnXFx1MjY2MycsXG4gICAgICAnY29uZyc6ICdcXHUyMjQ1JyxcbiAgICAgICdjb3B5JzogJ1xcdTAwQTknLFxuICAgICAgJ2NyYXJyJzogJ1xcdTIxQjUnLFxuICAgICAgJ2N1cCc6ICdcXHUyMjJBJyxcbiAgICAgICdjdXJyZW4nOiAnXFx1MDBBNCcsXG4gICAgICAnZGFnZ2VyJzogJ1xcdTIwMjAnLFxuICAgICAgJ0RhZ2dlcic6ICdcXHUyMDIxJyxcbiAgICAgICdkYXJyJzogJ1xcdTIxOTMnLFxuICAgICAgJ2RBcnInOiAnXFx1MjFEMycsXG4gICAgICAnZGVnJzogJ1xcdTAwQjAnLFxuICAgICAgJ0RlbHRhJzogJ1xcdTAzOTQnLFxuICAgICAgJ2RlbHRhJzogJ1xcdTAzQjQnLFxuICAgICAgJ2RpYW1zJzogJ1xcdTI2NjYnLFxuICAgICAgJ2RpdmlkZSc6ICdcXHUwMEY3JyxcbiAgICAgICdFYWN1dGUnOiAnXFx1MDBDOScsXG4gICAgICAnZWFjdXRlJzogJ1xcdTAwRTknLFxuICAgICAgJ0VjaXJjJzogJ1xcdTAwQ0EnLFxuICAgICAgJ2VjaXJjJzogJ1xcdTAwRUEnLFxuICAgICAgJ0VncmF2ZSc6ICdcXHUwMEM4JyxcbiAgICAgICdlZ3JhdmUnOiAnXFx1MDBFOCcsXG4gICAgICAnZW1wdHknOiAnXFx1MjIwNScsXG4gICAgICAnZW1zcCc6ICdcXHUyMDAzJyxcbiAgICAgICdlbnNwJzogJ1xcdTIwMDInLFxuICAgICAgJ0Vwc2lsb24nOiAnXFx1MDM5NScsXG4gICAgICAnZXBzaWxvbic6ICdcXHUwM0I1JyxcbiAgICAgICdlcXVpdic6ICdcXHUyMjYxJyxcbiAgICAgICdFdGEnOiAnXFx1MDM5NycsXG4gICAgICAnZXRhJzogJ1xcdTAzQjcnLFxuICAgICAgJ0VUSCc6ICdcXHUwMEQwJyxcbiAgICAgICdldGgnOiAnXFx1MDBGMCcsXG4gICAgICAnRXVtbCc6ICdcXHUwMENCJyxcbiAgICAgICdldW1sJzogJ1xcdTAwRUInLFxuICAgICAgJ2V1cm8nOiAnXFx1MjBBQycsXG4gICAgICAnZXhpc3QnOiAnXFx1MjIwMycsXG4gICAgICAnZm5vZic6ICdcXHUwMTkyJyxcbiAgICAgICdmb3JhbGwnOiAnXFx1MjIwMCcsXG4gICAgICAnZnJhYzEyJzogJ1xcdTAwQkQnLFxuICAgICAgJ2ZyYWMxNCc6ICdcXHUwMEJDJyxcbiAgICAgICdmcmFjMzQnOiAnXFx1MDBCRScsXG4gICAgICAnZnJhc2wnOiAnXFx1MjA0NCcsXG4gICAgICAnR2FtbWEnOiAnXFx1MDM5MycsXG4gICAgICAnZ2FtbWEnOiAnXFx1MDNCMycsXG4gICAgICAnZ2UnOiAnXFx1MjI2NScsXG4gICAgICAnZ3QnOiAnPicsXG4gICAgICAnaGFycic6ICdcXHUyMTk0JyxcbiAgICAgICdoQXJyJzogJ1xcdTIxRDQnLFxuICAgICAgJ2hlYXJ0cyc6ICdcXHUyNjY1JyxcbiAgICAgICdoZWxsaXAnOiAnXFx1MjAyNicsXG4gICAgICAnSWFjdXRlJzogJ1xcdTAwQ0QnLFxuICAgICAgJ2lhY3V0ZSc6ICdcXHUwMEVEJyxcbiAgICAgICdJY2lyYyc6ICdcXHUwMENFJyxcbiAgICAgICdpY2lyYyc6ICdcXHUwMEVFJyxcbiAgICAgICdpZXhjbCc6ICdcXHUwMEExJyxcbiAgICAgICdJZ3JhdmUnOiAnXFx1MDBDQycsXG4gICAgICAnaWdyYXZlJzogJ1xcdTAwRUMnLFxuICAgICAgJ2ltYWdlJzogJ1xcdTIxMTEnLFxuICAgICAgJ2luZmluJzogJ1xcdTIyMUUnLFxuICAgICAgJ2ludCc6ICdcXHUyMjJCJyxcbiAgICAgICdJb3RhJzogJ1xcdTAzOTknLFxuICAgICAgJ2lvdGEnOiAnXFx1MDNCOScsXG4gICAgICAnaXF1ZXN0JzogJ1xcdTAwQkYnLFxuICAgICAgJ2lzaW4nOiAnXFx1MjIwOCcsXG4gICAgICAnSXVtbCc6ICdcXHUwMENGJyxcbiAgICAgICdpdW1sJzogJ1xcdTAwRUYnLFxuICAgICAgJ0thcHBhJzogJ1xcdTAzOUEnLFxuICAgICAgJ2thcHBhJzogJ1xcdTAzQkEnLFxuICAgICAgJ0xhbWJkYSc6ICdcXHUwMzlCJyxcbiAgICAgICdsYW1iZGEnOiAnXFx1MDNCQicsXG4gICAgICAnbGFuZyc6ICdcXHUyN0U4JyxcbiAgICAgICdsYXF1byc6ICdcXHUwMEFCJyxcbiAgICAgICdsYXJyJzogJ1xcdTIxOTAnLFxuICAgICAgJ2xBcnInOiAnXFx1MjFEMCcsXG4gICAgICAnbGNlaWwnOiAnXFx1MjMwOCcsXG4gICAgICAnbGRxdW8nOiAnXFx1MjAxQycsXG4gICAgICAnbGUnOiAnXFx1MjI2NCcsXG4gICAgICAnbGZsb29yJzogJ1xcdTIzMEEnLFxuICAgICAgJ2xvd2FzdCc6ICdcXHUyMjE3JyxcbiAgICAgICdsb3onOiAnXFx1MjVDQScsXG4gICAgICAnbHJtJzogJ1xcdTIwMEUnLFxuICAgICAgJ2xzYXF1byc6ICdcXHUyMDM5JyxcbiAgICAgICdsc3F1byc6ICdcXHUyMDE4JyxcbiAgICAgICdsdCc6ICc8JyxcbiAgICAgICdtYWNyJzogJ1xcdTAwQUYnLFxuICAgICAgJ21kYXNoJzogJ1xcdTIwMTQnLFxuICAgICAgJ21pY3JvJzogJ1xcdTAwQjUnLFxuICAgICAgJ21pZGRvdCc6ICdcXHUwMEI3JyxcbiAgICAgICdtaW51cyc6ICdcXHUyMjEyJyxcbiAgICAgICdNdSc6ICdcXHUwMzlDJyxcbiAgICAgICdtdSc6ICdcXHUwM0JDJyxcbiAgICAgICduYWJsYSc6ICdcXHUyMjA3JyxcbiAgICAgICduYnNwJzogJ1xcdTAwQTAnLFxuICAgICAgJ25kYXNoJzogJ1xcdTIwMTMnLFxuICAgICAgJ25lJzogJ1xcdTIyNjAnLFxuICAgICAgJ25pJzogJ1xcdTIyMEInLFxuICAgICAgJ25vdCc6ICdcXHUwMEFDJyxcbiAgICAgICdub3Rpbic6ICdcXHUyMjA5JyxcbiAgICAgICduc3ViJzogJ1xcdTIyODQnLFxuICAgICAgJ050aWxkZSc6ICdcXHUwMEQxJyxcbiAgICAgICdudGlsZGUnOiAnXFx1MDBGMScsXG4gICAgICAnTnUnOiAnXFx1MDM5RCcsXG4gICAgICAnbnUnOiAnXFx1MDNCRCcsXG4gICAgICAnT2FjdXRlJzogJ1xcdTAwRDMnLFxuICAgICAgJ29hY3V0ZSc6ICdcXHUwMEYzJyxcbiAgICAgICdPY2lyYyc6ICdcXHUwMEQ0JyxcbiAgICAgICdvY2lyYyc6ICdcXHUwMEY0JyxcbiAgICAgICdPRWxpZyc6ICdcXHUwMTUyJyxcbiAgICAgICdvZWxpZyc6ICdcXHUwMTUzJyxcbiAgICAgICdPZ3JhdmUnOiAnXFx1MDBEMicsXG4gICAgICAnb2dyYXZlJzogJ1xcdTAwRjInLFxuICAgICAgJ29saW5lJzogJ1xcdTIwM0UnLFxuICAgICAgJ09tZWdhJzogJ1xcdTAzQTknLFxuICAgICAgJ29tZWdhJzogJ1xcdTAzQzknLFxuICAgICAgJ09taWNyb24nOiAnXFx1MDM5RicsXG4gICAgICAnb21pY3Jvbic6ICdcXHUwM0JGJyxcbiAgICAgICdvcGx1cyc6ICdcXHUyMjk1JyxcbiAgICAgICdvcic6ICdcXHUyMjI4JyxcbiAgICAgICdvcmRmJzogJ1xcdTAwQUEnLFxuICAgICAgJ29yZG0nOiAnXFx1MDBCQScsXG4gICAgICAnT3NsYXNoJzogJ1xcdTAwRDgnLFxuICAgICAgJ29zbGFzaCc6ICdcXHUwMEY4JyxcbiAgICAgICdPdGlsZGUnOiAnXFx1MDBENScsXG4gICAgICAnb3RpbGRlJzogJ1xcdTAwRjUnLFxuICAgICAgJ290aW1lcyc6ICdcXHUyMjk3JyxcbiAgICAgICdPdW1sJzogJ1xcdTAwRDYnLFxuICAgICAgJ291bWwnOiAnXFx1MDBGNicsXG4gICAgICAncGFyYSc6ICdcXHUwMEI2JyxcbiAgICAgICdwZXJtaWwnOiAnXFx1MjAzMCcsXG4gICAgICAncGVycCc6ICdcXHUyMkE1JyxcbiAgICAgICdQaGknOiAnXFx1MDNBNicsXG4gICAgICAncGhpJzogJ1xcdTAzQzYnLFxuICAgICAgJ1BpJzogJ1xcdTAzQTAnLFxuICAgICAgJ3BpJzogJ1xcdTAzQzAnLFxuICAgICAgJ3Bpdic6ICdcXHUwM0Q2JyxcbiAgICAgICdwbHVzbW4nOiAnXFx1MDBCMScsXG4gICAgICAncG91bmQnOiAnXFx1MDBBMycsXG4gICAgICAncHJpbWUnOiAnXFx1MjAzMicsXG4gICAgICAnUHJpbWUnOiAnXFx1MjAzMycsXG4gICAgICAncHJvZCc6ICdcXHUyMjBGJyxcbiAgICAgICdwcm9wJzogJ1xcdTIyMUQnLFxuICAgICAgJ1BzaSc6ICdcXHUwM0E4JyxcbiAgICAgICdwc2knOiAnXFx1MDNDOCcsXG4gICAgICAncXVvdCc6ICdcXHUwMDIyJyxcbiAgICAgICdyYWRpYyc6ICdcXHUyMjFBJyxcbiAgICAgICdyYW5nJzogJ1xcdTI3RTknLFxuICAgICAgJ3JhcXVvJzogJ1xcdTAwQkInLFxuICAgICAgJ3JhcnInOiAnXFx1MjE5MicsXG4gICAgICAnckFycic6ICdcXHUyMUQyJyxcbiAgICAgICdyY2VpbCc6ICdcXHUyMzA5JyxcbiAgICAgICdyZHF1byc6ICdcXHUyMDFEJyxcbiAgICAgICdyZWFsJzogJ1xcdTIxMUMnLFxuICAgICAgJ3JlZyc6ICdcXHUwMEFFJyxcbiAgICAgICdyZmxvb3InOiAnXFx1MjMwQicsXG4gICAgICAnUmhvJzogJ1xcdTAzQTEnLFxuICAgICAgJ3Jobyc6ICdcXHUwM0MxJyxcbiAgICAgICdybG0nOiAnXFx1MjAwRicsXG4gICAgICAncnNhcXVvJzogJ1xcdTIwM0EnLFxuICAgICAgJ3JzcXVvJzogJ1xcdTIwMTknLFxuICAgICAgJ3NicXVvJzogJ1xcdTIwMUEnLFxuICAgICAgJ1NjYXJvbic6ICdcXHUwMTYwJyxcbiAgICAgICdzY2Fyb24nOiAnXFx1MDE2MScsXG4gICAgICAnc2RvdCc6ICdcXHUyMkM1JyxcbiAgICAgICdzZWN0JzogJ1xcdTAwQTcnLFxuICAgICAgJ3NoeSc6ICdcXHUwMEFEJyxcbiAgICAgICdTaWdtYSc6ICdcXHUwM0EzJyxcbiAgICAgICdzaWdtYSc6ICdcXHUwM0MzJyxcbiAgICAgICdzaWdtYWYnOiAnXFx1MDNDMicsXG4gICAgICAnc2ltJzogJ1xcdTIyM0MnLFxuICAgICAgJ3NwYWRlcyc6ICdcXHUyNjYwJyxcbiAgICAgICdzdWInOiAnXFx1MjI4MicsXG4gICAgICAnc3ViZSc6ICdcXHUyMjg2JyxcbiAgICAgICdzdW0nOiAnXFx1MjIxMScsXG4gICAgICAnc3VwJzogJ1xcdTIyODMnLFxuICAgICAgJ3N1cDEnOiAnXFx1MDBCOScsXG4gICAgICAnc3VwMic6ICdcXHUwMEIyJyxcbiAgICAgICdzdXAzJzogJ1xcdTAwQjMnLFxuICAgICAgJ3N1cGUnOiAnXFx1MjI4NycsXG4gICAgICAnc3psaWcnOiAnXFx1MDBERicsXG4gICAgICAnVGF1JzogJ1xcdTAzQTQnLFxuICAgICAgJ3RhdSc6ICdcXHUwM0M0JyxcbiAgICAgICd0aGVyZTQnOiAnXFx1MjIzNCcsXG4gICAgICAnVGhldGEnOiAnXFx1MDM5OCcsXG4gICAgICAndGhldGEnOiAnXFx1MDNCOCcsXG4gICAgICAndGhldGFzeW0nOiAnXFx1MDNEMScsXG4gICAgICAndGhpbnNwJzogJ1xcdTIwMDknLFxuICAgICAgJ1RIT1JOJzogJ1xcdTAwREUnLFxuICAgICAgJ3Rob3JuJzogJ1xcdTAwRkUnLFxuICAgICAgJ3RpbGRlJzogJ1xcdTAyREMnLFxuICAgICAgJ3RpbWVzJzogJ1xcdTAwRDcnLFxuICAgICAgJ3RyYWRlJzogJ1xcdTIxMjInLFxuICAgICAgJ1VhY3V0ZSc6ICdcXHUwMERBJyxcbiAgICAgICd1YWN1dGUnOiAnXFx1MDBGQScsXG4gICAgICAndWFycic6ICdcXHUyMTkxJyxcbiAgICAgICd1QXJyJzogJ1xcdTIxRDEnLFxuICAgICAgJ1VjaXJjJzogJ1xcdTAwREInLFxuICAgICAgJ3VjaXJjJzogJ1xcdTAwRkInLFxuICAgICAgJ1VncmF2ZSc6ICdcXHUwMEQ5JyxcbiAgICAgICd1Z3JhdmUnOiAnXFx1MDBGOScsXG4gICAgICAndW1sJzogJ1xcdTAwQTgnLFxuICAgICAgJ3Vwc2loJzogJ1xcdTAzRDInLFxuICAgICAgJ1Vwc2lsb24nOiAnXFx1MDNBNScsXG4gICAgICAndXBzaWxvbic6ICdcXHUwM0M1JyxcbiAgICAgICdVdW1sJzogJ1xcdTAwREMnLFxuICAgICAgJ3V1bWwnOiAnXFx1MDBGQycsXG4gICAgICAnd2VpZXJwJzogJ1xcdTIxMTgnLFxuICAgICAgJ1hpJzogJ1xcdTAzOUUnLFxuICAgICAgJ3hpJzogJ1xcdTAzQkUnLFxuICAgICAgJ1lhY3V0ZSc6ICdcXHUwMEREJyxcbiAgICAgICd5YWN1dGUnOiAnXFx1MDBGRCcsXG4gICAgICAneWVuJzogJ1xcdTAwQTUnLFxuICAgICAgJ3l1bWwnOiAnXFx1MDBGRicsXG4gICAgICAnWXVtbCc6ICdcXHUwMTc4JyxcbiAgICAgICdaZXRhJzogJ1xcdTAzOTYnLFxuICAgICAgJ3pldGEnOiAnXFx1MDNCNicsXG4gICAgICAnendqJzogJ1xcdTIwMEQnLFxuICAgICAgJ3p3bmonOiAnXFx1MjAwQycsXG4gIH07XG5cbiAgdmFyIEh0bWxUYWdEZWZpbml0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX18wXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEh0bWxUYWdEZWZpbml0aW9uKF9hKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgY2xvc2VkQnlDaGlsZHJlbiA9IF9iLmNsb3NlZEJ5Q2hpbGRyZW4sIHJlcXVpcmVkUGFyZW50cyA9IF9iLnJlcXVpcmVkUGFyZW50cywgaW1wbGljaXROYW1lc3BhY2VQcmVmaXggPSBfYi5pbXBsaWNpdE5hbWVzcGFjZVByZWZpeCwgX2MgPSBfYi5jb250ZW50VHlwZSwgY29udGVudFR5cGUgPSBfYyA9PT0gdm9pZCAwID8gVGFnQ29udGVudFR5cGUuUEFSU0FCTEVfREFUQSA6IF9jLCBfZCA9IF9iLmNsb3NlZEJ5UGFyZW50LCBjbG9zZWRCeVBhcmVudCA9IF9kID09PSB2b2lkIDAgPyBmYWxzZSA6IF9kLCBfZSA9IF9iLmlzVm9pZCwgaXNWb2lkID0gX2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX2UsIF9mID0gX2IuaWdub3JlRmlyc3RMZiwgaWdub3JlRmlyc3RMZiA9IF9mID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mO1xuICAgICAgICAgIHRoaXMuY2xvc2VkQnlDaGlsZHJlbiA9IHt9O1xuICAgICAgICAgIHRoaXMuY2xvc2VkQnlQYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNhblNlbGZDbG9zZSA9IGZhbHNlO1xuICAgICAgICAgIGlmIChjbG9zZWRCeUNoaWxkcmVuICYmIGNsb3NlZEJ5Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjbG9zZWRCeUNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKHRhZ05hbWUpIHsgcmV0dXJuIF90aGlzLmNsb3NlZEJ5Q2hpbGRyZW5bdGFnTmFtZV0gPSB0cnVlOyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc1ZvaWQgPSBpc1ZvaWQ7XG4gICAgICAgICAgdGhpcy5jbG9zZWRCeVBhcmVudCA9IGNsb3NlZEJ5UGFyZW50IHx8IGlzVm9pZDtcbiAgICAgICAgICBpZiAocmVxdWlyZWRQYXJlbnRzICYmIHJlcXVpcmVkUGFyZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQYXJlbnRzID0ge307XG4gICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBwYXJlbnQgaXMgdGhlIGxpc3QgaXMgYXV0b21hdGljYWxseSB3aGVuIG5vbmUgb2YgdGhlIGxpc3RlZCBwYXJlbnRzIGFyZSBwcmVzZW50XG4gICAgICAgICAgICAgIHRoaXMucGFyZW50VG9BZGQgPSByZXF1aXJlZFBhcmVudHNbMF07XG4gICAgICAgICAgICAgIHJlcXVpcmVkUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0YWdOYW1lKSB7IHJldHVybiBfdGhpcy5yZXF1aXJlZFBhcmVudHNbdGFnTmFtZV0gPSB0cnVlOyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbXBsaWNpdE5hbWVzcGFjZVByZWZpeCA9IGltcGxpY2l0TmFtZXNwYWNlUHJlZml4O1xuICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcbiAgICAgICAgICB0aGlzLmlnbm9yZUZpcnN0TGYgPSBpZ25vcmVGaXJzdExmO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRQYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEh0bWxUYWdEZWZpbml0aW9uLnByb3RvdHlwZS5yZXF1aXJlRXh0cmFQYXJlbnQgPSBmdW5jdGlvbiAoY3VycmVudFBhcmVudCkge1xuICAgICAgICAgIGlmICghdGhpcy5yZXF1aXJlZFBhcmVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxjUGFyZW50ID0gY3VycmVudFBhcmVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVkUGFyZW50c1tsY1BhcmVudF0gIT0gdHJ1ZSAmJiBsY1BhcmVudCAhPSAndGVtcGxhdGUnO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBIdG1sVGFnRGVmaW5pdGlvbi5wcm90b3R5cGUuaXNDbG9zZWRCeUNoaWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZvaWQgfHwgbmFtZS50b0xvd2VyQ2FzZSgpIGluIHRoaXMuY2xvc2VkQnlDaGlsZHJlbjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gSHRtbFRhZ0RlZmluaXRpb247XG4gIH0oKSk7XG4gIC8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjb3B0aW9uYWwtdGFnc1xuICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGZ1bGx5IGNvbmZvcm0gdG8gdGhlIEhUTUw1IHNwZWMuXG4gIHZhciAvKiogQHR5cGUgez99ICovIFRBR19ERUZJTklUSU9OUyA9IHtcbiAgICAgICdiYXNlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgJ21ldGEnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAnYXJlYSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdlbWJlZCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdsaW5rJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgJ2ltZyc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdpbnB1dCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdwYXJhbSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdocic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdicic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICdzb3VyY2UnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAndHJhY2snOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAnd2JyJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgJ3AnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe1xuICAgICAgICAgIGNsb3NlZEJ5Q2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgJ2FkZHJlc3MnLCAnYXJ0aWNsZScsICdhc2lkZScsICdibG9ja3F1b3RlJywgJ2RpdicsICdkbCcsICdmaWVsZHNldCcsICdmb290ZXInLCAnZm9ybScsXG4gICAgICAgICAgICAgICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJyxcbiAgICAgICAgICAgICAgJ21haW4nLCAnbmF2JywgJ29sJywgJ3AnLCAncHJlJywgJ3NlY3Rpb24nLCAndGFibGUnLCAndWwnXG4gICAgICAgICAgXSxcbiAgICAgICAgICBjbG9zZWRCeVBhcmVudDogdHJ1ZVxuICAgICAgfSksXG4gICAgICAndGhlYWQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J10gfSksXG4gICAgICAndGJvZHknOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ3Rmb290JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWyd0Ym9keSddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICd0cic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7XG4gICAgICAgICAgY2xvc2VkQnlDaGlsZHJlbjogWyd0ciddLFxuICAgICAgICAgIHJlcXVpcmVkUGFyZW50czogWyd0Ym9keScsICd0Zm9vdCcsICd0aGVhZCddLFxuICAgICAgICAgIGNsb3NlZEJ5UGFyZW50OiB0cnVlXG4gICAgICB9KSxcbiAgICAgICd0ZCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsndGQnLCAndGgnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAndGgnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3RkJywgJ3RoJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ2NvbCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IHJlcXVpcmVkUGFyZW50czogWydjb2xncm91cCddLCBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAnc3ZnJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaW1wbGljaXROYW1lc3BhY2VQcmVmaXg6ICdzdmcnIH0pLFxuICAgICAgJ21hdGgnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeDogJ21hdGgnIH0pLFxuICAgICAgJ2xpJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydsaSddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICdkdCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsnZHQnLCAnZGQnXSB9KSxcbiAgICAgICdkZCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsnZHQnLCAnZGQnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAncmInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0JywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICdydCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsncmInLCAncnQnLCAncnRjJywgJ3JwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ3J0Yyc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsncmInLCAncnRjJywgJ3JwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ3JwJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydyYicsICdydCcsICdydGMnLCAncnAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAnb3B0Z3JvdXAnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ29wdGdyb3VwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ29wdGlvbic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsnb3B0aW9uJywgJ29wdGdyb3VwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgJ3ByZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlnbm9yZUZpcnN0TGY6IHRydWUgfSksXG4gICAgICAnbGlzdGluZyc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlnbm9yZUZpcnN0TGY6IHRydWUgfSksXG4gICAgICAnc3R5bGUnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjb250ZW50VHlwZTogVGFnQ29udGVudFR5cGUuUkFXX1RFWFQgfSksXG4gICAgICAnc2NyaXB0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY29udGVudFR5cGU6IFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUIH0pLFxuICAgICAgJ3RpdGxlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY29udGVudFR5cGU6IFRhZ0NvbnRlbnRUeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCB9KSxcbiAgICAgICd0ZXh0YXJlYSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNvbnRlbnRUeXBlOiBUYWdDb250ZW50VHlwZS5FU0NBUEFCTEVfUkFXX1RFWFQsIGlnbm9yZUZpcnN0TGY6IHRydWUgfSksXG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9ERUZBVUxUX1RBR19ERUZJTklUSU9OID0gbmV3IEh0bWxUYWdEZWZpbml0aW9uKCk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHRhZ05hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldEh0bWxUYWdEZWZpbml0aW9uKHRhZ05hbWUpIHtcbiAgICAgIHJldHVybiBUQUdfREVGSU5JVElPTlNbdGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCBfREVGQVVMVF9UQUdfREVGSU5JVElPTjtcbiAgfVxuXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9TRUxFQ1RPUl9SRUdFWFAgPSBuZXcgUmVnRXhwKCcoXFxcXDpub3RcXFxcKCl8JyArXG4gICAgICAnKFstXFxcXHddKyl8JyArXG4gICAgICAnKD86XFxcXC4oWy1cXFxcd10rKSl8JyArXG4gICAgICAnKD86XFxcXFsoWy1cXFxcdypdKykoPzo9KFteXFxcXF1dKikpP1xcXFxdKXwnICtcbiAgICAgICcoXFxcXCkpfCcgK1xuICAgICAgJyhcXFxccyosXFxcXHMqKScsIC8vIFwiLFwiXG4gICdnJyk7XG4gIC8qKlxuICAgKiAgQSBjc3Mgc2VsZWN0b3IgY29udGFpbnMgYW4gZWxlbWVudCBuYW1lLFxuICAgICogY3NzIGNsYXNzZXMgYW5kIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyB3aXRoIHRoZSBwdXJwb3NlXG4gICAgKiBvZiBzZWxlY3Rpbmcgc3Vic2V0cyBvdXQgb2YgdGhlbS5cbiAgICovXG4gIHZhciBDc3NTZWxlY3RvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBDc3NTZWxlY3RvcigpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IFtdO1xuICAgICAgICAgIHRoaXMuYXR0cnMgPSBbXTtcbiAgICAgICAgICB0aGlzLm5vdFNlbGVjdG9ycyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDc3NTZWxlY3Rvci5wYXJzZSA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfYWRkUmVzdWx0ID0gZnVuY3Rpb24gKHJlcywgY3NzU2VsKSB7XG4gICAgICAgICAgICAgIGlmIChjc3NTZWwubm90U2VsZWN0b3JzLmxlbmd0aCA+IDAgJiYgIWNzc1NlbC5lbGVtZW50ICYmIGNzc1NlbC5jbGFzc05hbWVzLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICBjc3NTZWwuYXR0cnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNzc1NlbC5lbGVtZW50ID0gJyonO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5wdXNoKGNzc1NlbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjc3NTZWxlY3RvciA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnQgPSBjc3NTZWxlY3RvcjtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbk5vdCA9IGZhbHNlO1xuICAgICAgICAgIF9TRUxFQ1RPUl9SRUdFWFAubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBfU0VMRUNUT1JfUkVHRVhQLmV4ZWMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGluTm90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXN0aW5nIDpub3QgaXMgbm90IGFsbG93ZWQgaW4gYSBzZWxlY3RvcicpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaW5Ob3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgICAgICAgICAgICAgY3NzU2VsZWN0b3Iubm90U2VsZWN0b3JzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50LnNldEVsZW1lbnQobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGRDbGFzc05hbWUobWF0Y2hbM10pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGRBdHRyaWJ1dGUobWF0Y2hbNF0sIG1hdGNoWzVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobWF0Y2hbNl0pIHtcbiAgICAgICAgICAgICAgICAgIGluTm90ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3NzU2VsZWN0b3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1hdGNoWzddKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaW5Ob3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIHNlbGVjdG9ycyBpbiA6bm90IGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBfYWRkUmVzdWx0KHJlc3VsdHMsIGNzc1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgIGNzc1NlbGVjdG9yID0gY3VycmVudCA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIF9hZGRSZXN1bHQocmVzdWx0cywgY3NzU2VsZWN0b3IpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ3NzU2VsZWN0b3IucHJvdG90eXBlLmlzRWxlbWVudFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhc0VsZW1lbnRTZWxlY3RvcigpICYmIHRoaXMuY2xhc3NOYW1lcy5sZW5ndGggPT0gMCAmJiB0aGlzLmF0dHJzLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgIHRoaXMubm90U2VsZWN0b3JzLmxlbmd0aCA9PT0gMDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENzc1NlbGVjdG9yLnByb3RvdHlwZS5oYXNFbGVtZW50U2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAhIXRoaXMuZWxlbWVudDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ3NzU2VsZWN0b3IucHJvdG90eXBlLnNldEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSB2b2lkIDApIHsgZWxlbWVudCA9IG51bGw7IH1cbiAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIEdldHMgYSB0ZW1wbGF0ZSBzdHJpbmcgZm9yIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENzc1NlbGVjdG9yLnByb3RvdHlwZS5nZXRNYXRjaGluZ0VsZW1lbnRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YWdOYW1lID0gdGhpcy5lbGVtZW50IHx8ICdkaXYnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsYXNzQXR0ciA9IHRoaXMuY2xhc3NOYW1lcy5sZW5ndGggPiAwID8gXCIgY2xhc3M9XFxcIlwiICsgdGhpcy5jbGFzc05hbWVzLmpvaW4oJyAnKSArIFwiXFxcIlwiIDogJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cnMgPSAnJztcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTmFtZSA9IHRoaXMuYXR0cnNbaV07XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSArIDFdICE9PSAnJyA/IFwiPVxcXCJcIiArIHRoaXMuYXR0cnNbaSArIDFdICsgXCJcXFwiXCIgOiAnJztcbiAgICAgICAgICAgICAgYXR0cnMgKz0gXCIgXCIgKyBhdHRyTmFtZSArIGF0dHJWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEh0bWxUYWdEZWZpbml0aW9uKHRhZ05hbWUpLmlzVm9pZCA/IFwiPFwiICsgdGFnTmFtZSArIGNsYXNzQXR0ciArIGF0dHJzICsgXCIvPlwiIDpcbiAgICAgICAgICAgICAgXCI8XCIgKyB0YWdOYW1lICsgY2xhc3NBdHRyICsgYXR0cnMgKyBcIj48L1wiICsgdGFnTmFtZSArIFwiPlwiO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ3NzU2VsZWN0b3IucHJvdG90eXBlLmFkZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7IHZhbHVlID0gJyc7IH1cbiAgICAgICAgICB0aGlzLmF0dHJzLnB1c2gobmFtZSwgdmFsdWUgJiYgdmFsdWUudG9Mb3dlckNhc2UoKSB8fCAnJyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENzc1NlbGVjdG9yLnByb3RvdHlwZS5hZGRDbGFzc05hbWUgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLmNsYXNzTmFtZXMucHVzaChuYW1lLnRvTG93ZXJDYXNlKCkpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDc3NTZWxlY3Rvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gdGhpcy5lbGVtZW50IHx8ICcnO1xuICAgICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWVzLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7IHJldHVybiByZXMgKz0gXCIuXCIgKyBrbGFzczsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB0aGlzLmF0dHJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lXzEgPSB0aGlzLmF0dHJzW2ldO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSB0aGlzLmF0dHJzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgIHJlcyArPSBcIltcIiArIG5hbWVfMSArICh2YWx1ZSA/ICc9JyArIHZhbHVlIDogJycpICsgXCJdXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ub3RTZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiAobm90U2VsZWN0b3IpIHsgcmV0dXJuIHJlcyArPSBcIjpub3QoXCIgKyBub3RTZWxlY3RvciArIFwiKVwiOyB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDc3NTZWxlY3RvcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBSZWFkcyBhIGxpc3Qgb2YgQ3NzU2VsZWN0b3JzIGFuZCBhbGxvd3MgdG8gY2FsY3VsYXRlIHdoaWNoIG9uZXNcbiAgICAqIGFyZSBjb250YWluZWQgaW4gYSBnaXZlbiBDc3NTZWxlY3Rvci5cbiAgICovXG4gIHZhciBTZWxlY3Rvck1hdGNoZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU2VsZWN0b3JNYXRjaGVyKCkge1xuICAgICAgICAgIHRoaXMuX2VsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudFBhcnRpYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY2xhc3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY2xhc3NQYXJ0aWFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX2F0dHJWYWx1ZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9hdHRyVmFsdWVQYXJ0aWFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX2xpc3RDb250ZXh0cyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vdFNlbGVjdG9yc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2VsZWN0b3JNYXRjaGVyLmNyZWF0ZU5vdE1hdGNoZXIgPSBmdW5jdGlvbiAobm90U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm90TWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgICAgICBub3RNYXRjaGVyLmFkZFNlbGVjdGFibGVzKG5vdFNlbGVjdG9ycywgbnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG5vdE1hdGNoZXI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNzc1NlbGVjdG9yc1xuICAgICAgICogQHBhcmFtIHs/PX0gY2FsbGJhY2tDdHh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLmFkZFNlbGVjdGFibGVzID0gZnVuY3Rpb24gKGNzc1NlbGVjdG9ycywgY2FsbGJhY2tDdHh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGlzdENvbnRleHQgPSBudWxsO1xuICAgICAgICAgIGlmIChjc3NTZWxlY3RvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBsaXN0Q29udGV4dCA9IG5ldyBTZWxlY3Rvckxpc3RDb250ZXh0KGNzc1NlbGVjdG9ycyk7XG4gICAgICAgICAgICAgIHRoaXMuX2xpc3RDb250ZXh0cy5wdXNoKGxpc3RDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGNzc1NlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB0aGlzLl9hZGRTZWxlY3RhYmxlKGNzc1NlbGVjdG9yc1tpXSwgY2FsbGJhY2tDdHh0LCBsaXN0Q29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIEFkZCBhbiBvYmplY3QgdGhhdCBjYW4gYmUgZm91bmQgbGF0ZXIgb24gYnkgY2FsbGluZyBgbWF0Y2hgLlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFja0N0eHQgQW4gb3BhcXVlIG9iamVjdCB0aGF0IHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIGNhbGxiYWNrIG9mIHRoZSBgbWF0Y2hgIGZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0gez99IGxpc3RDb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLl9hZGRTZWxlY3RhYmxlID0gZnVuY3Rpb24gKGNzc1NlbGVjdG9yLCBjYWxsYmFja0N0eHQsIGxpc3RDb250ZXh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlciA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudCA9IGNzc1NlbGVjdG9yLmVsZW1lbnQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xhc3NOYW1lcyA9IGNzc1NlbGVjdG9yLmNsYXNzTmFtZXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWxlY3RhYmxlID0gbmV3IFNlbGVjdG9yQ29udGV4dChjc3NTZWxlY3RvciwgY2FsbGJhY2tDdHh0LCBsaXN0Q29udGV4dCk7XG4gICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNUZXJtaW5hbCA9IGF0dHJzLmxlbmd0aCA9PT0gMCAmJiBjbGFzc05hbWVzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgaWYgKGlzVGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKG1hdGNoZXIuX2VsZW1lbnRNYXAsIGVsZW1lbnQsIHNlbGVjdGFibGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwobWF0Y2hlci5fZWxlbWVudFBhcnRpYWxNYXAsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjbGFzc05hbWVzKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc1Rlcm1pbmFsID0gYXR0cnMubGVuZ3RoID09PSAwICYmIGkgPT09IGNsYXNzTmFtZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaV07XG4gICAgICAgICAgICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKG1hdGNoZXIuX2NsYXNzTWFwLCBjbGFzc05hbWUsIHNlbGVjdGFibGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwobWF0Y2hlci5fY2xhc3NQYXJ0aWFsTWFwLCBjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRycykge1xuICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzVGVybWluYWwgPSBpID09PSBhdHRycy5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZV8yID0gYXR0cnNbaV07XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGF0dHJzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgIGlmIChpc1Rlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVybWluYWxNYXAgPSBtYXRjaGVyLl9hdHRyVmFsdWVNYXA7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVybWluYWxWYWx1ZXNNYXAgPSB0ZXJtaW5hbE1hcC5nZXQobmFtZV8yKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsVmFsdWVzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsVmFsdWVzTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbE1hcC5zZXQobmFtZV8yLCB0ZXJtaW5hbFZhbHVlc01hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKHRlcm1pbmFsVmFsdWVzTWFwLCB2YWx1ZSwgc2VsZWN0YWJsZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0aWFsTWFwID0gbWF0Y2hlci5fYXR0clZhbHVlUGFydGlhbE1hcDtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0aWFsVmFsdWVzTWFwID0gcGFydGlhbE1hcC5nZXQobmFtZV8yKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnRpYWxWYWx1ZXNNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFZhbHVlc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbE1hcC5zZXQobmFtZV8yLCBwYXJ0aWFsVmFsdWVzTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RhYmxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLl9hZGRUZXJtaW5hbCA9IGZ1bmN0aW9uIChtYXAsIG5hbWUsIHNlbGVjdGFibGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXJtaW5hbExpc3QgPSBtYXAuZ2V0KG5hbWUpO1xuICAgICAgICAgIGlmICghdGVybWluYWxMaXN0KSB7XG4gICAgICAgICAgICAgIHRlcm1pbmFsTGlzdCA9IFtdO1xuICAgICAgICAgICAgICBtYXAuc2V0KG5hbWUsIHRlcm1pbmFsTGlzdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRlcm1pbmFsTGlzdC5wdXNoKHNlbGVjdGFibGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2VsZWN0b3JNYXRjaGVyLnByb3RvdHlwZS5fYWRkUGFydGlhbCA9IGZ1bmN0aW9uIChtYXAsIG5hbWUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXRjaGVyID0gbWFwLmdldChuYW1lKTtcbiAgICAgICAgICBpZiAoIW1hdGNoZXIpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgICAgICAgICAgbWFwLnNldChuYW1lLCBtYXRjaGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1hdGNoZXI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgRmluZCB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB2aWEgYGFkZFNlbGVjdGFibGVgXG4gICAgICAgICogd2hvc2UgY3NzIHNlbGVjdG9yIGlzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gY3NzIHNlbGVjdG9yLlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBtYXRjaGVkQ2FsbGJhY2sgVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBvYmplY3QgaGFuZGVkIGludG8gYGFkZFNlbGVjdGFibGVgXG4gICAgICAgKiBAcmV0dXJuIHs/fSBib29sZWFuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmRcbiAgICAgICAqL1xuICAgICAgU2VsZWN0b3JNYXRjaGVyLnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIChjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudCA9IGNzc1NlbGVjdG9yLmVsZW1lbnQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xhc3NOYW1lcyA9IGNzc1NlbGVjdG9yLmNsYXNzTmFtZXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdGhpcy5fbGlzdENvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2xpc3RDb250ZXh0c1tpXS5hbHJlYWR5TWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFRlcm1pbmFsKHRoaXMuX2VsZW1lbnRNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgICAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFBhcnRpYWwodGhpcy5fZWxlbWVudFBhcnRpYWxNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgICBpZiAoY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xhc3NOYW1lID0gY2xhc3NOYW1lc1tpXTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF0Y2hUZXJtaW5hbCh0aGlzLl9jbGFzc01hcCwgY2xhc3NOYW1lLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoUGFydGlhbCh0aGlzLl9jbGFzc1BhcnRpYWxNYXAsIGNsYXNzTmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhdHRycykge1xuICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMyA9IGF0dHJzW2ldO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBhdHRyc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXJtaW5hbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZU1hcC5nZXQobmFtZV8zKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsICcnLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsIHZhbHVlLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0aWFsVmFsdWVzTWFwID0gdGhpcy5fYXR0clZhbHVlUGFydGlhbE1hcC5nZXQobmFtZV8zKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX21hdGNoUGFydGlhbChwYXJ0aWFsVmFsdWVzTWFwLCAnJywgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXRjaFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgdmFsdWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBjc3NTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBtYXRjaGVkQ2FsbGJhY2tcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNlbGVjdG9yTWF0Y2hlci5wcm90b3R5cGUuX21hdGNoVGVybWluYWwgPSBmdW5jdGlvbiAobWFwLCBuYW1lLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB7XG4gICAgICAgICAgaWYgKCFtYXAgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VsZWN0YWJsZXMgPSBtYXAuZ2V0KG5hbWUpIHx8IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJTZWxlY3RhYmxlcyA9IG1hcC5nZXQoJyonKTtcbiAgICAgICAgICBpZiAoc3RhclNlbGVjdGFibGVzKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGFibGVzID0gc2VsZWN0YWJsZXMuY29uY2F0KHN0YXJTZWxlY3RhYmxlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWxlY3RhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWxlY3RhYmxlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBzZWxlY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbaV07XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGVjdGFibGUuZmluYWxpemUoY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHwgcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBjc3NTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBtYXRjaGVkQ2FsbGJhY2tcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNlbGVjdG9yTWF0Y2hlci5wcm90b3R5cGUuX21hdGNoUGFydGlhbCA9IGZ1bmN0aW9uIChtYXAsIG5hbWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHtcbiAgICAgICAgICBpZiAoIW1hcCB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXN0ZWRTZWxlY3RvciA9IG1hcC5nZXQobmFtZSk7XG4gICAgICAgICAgaWYgKCFuZXN0ZWRTZWxlY3Rvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE8ocGVyZik6IGdldCByaWQgb2YgcmVjdXJzaW9uIGFuZCBtZWFzdXJlIGFnYWluXG4gICAgICAgICAgLy8gVE9ETyhwZXJmKTogZG9uJ3QgcGFzcyB0aGUgd2hvbGUgc2VsZWN0b3IgaW50byB0aGUgcmVjdXJzaW9uLFxuICAgICAgICAgIC8vIGJ1dCBvbmx5IHRoZSBub3QgcHJvY2Vzc2VkIHBhcnRzXG4gICAgICAgICAgcmV0dXJuIG5lc3RlZFNlbGVjdG9yLm1hdGNoKGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBTZWxlY3Rvck1hdGNoZXI7XG4gIH0oKSk7XG4gIHZhciBTZWxlY3Rvckxpc3RDb250ZXh0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gU2VsZWN0b3JMaXN0Q29udGV4dChzZWxlY3RvcnMpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9ycztcbiAgICAgICAgICB0aGlzLmFscmVhZHlNYXRjaGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2VsZWN0b3JMaXN0Q29udGV4dDtcbiAgfSgpKTtcbiAgLy8gU3RvcmUgY29udGV4dCB0byBwYXNzIGJhY2sgc2VsZWN0b3IgYW5kIGNvbnRleHQgd2hlbiBhIHNlbGVjdG9yIGlzIG1hdGNoZWRcbiAgdmFyIFNlbGVjdG9yQ29udGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY2JDb250ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IGxpc3RDb250ZXh0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFNlbGVjdG9yQ29udGV4dChzZWxlY3RvciwgY2JDb250ZXh0LCBsaXN0Q29udGV4dCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICB0aGlzLmNiQ29udGV4dCA9IGNiQ29udGV4dDtcbiAgICAgICAgICB0aGlzLmxpc3RDb250ZXh0ID0gbGlzdENvbnRleHQ7XG4gICAgICAgICAgdGhpcy5ub3RTZWxlY3RvcnMgPSBzZWxlY3Rvci5ub3RTZWxlY3RvcnM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3NzU2VsZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNlbGVjdG9yQ29udGV4dC5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoY3NzU2VsZWN0b3IsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RTZWxlY3RvcnMubGVuZ3RoID4gMCAmJiAoIXRoaXMubGlzdENvbnRleHQgfHwgIXRoaXMubGlzdENvbnRleHQuYWxyZWFkeU1hdGNoZWQpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vdE1hdGNoZXIgPSBTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlcih0aGlzLm5vdFNlbGVjdG9ycyk7XG4gICAgICAgICAgICAgIHJlc3VsdCA9ICFub3RNYXRjaGVyLm1hdGNoKGNzc1NlbGVjdG9yLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCAmJiBjYWxsYmFjayAmJiAoIXRoaXMubGlzdENvbnRleHQgfHwgIXRoaXMubGlzdENvbnRleHQuYWxyZWFkeU1hdGNoZWQpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb250ZXh0LmFscmVhZHlNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLnNlbGVjdG9yLCB0aGlzLmNiQ29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFNlbGVjdG9yQ29udGV4dDtcbiAgfSgpKTtcblxuICB2YXIgX19leHRlbmRzJDMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIC8qKlxuICAgKiBAc3RhYmxlXG4gICAqL1xuICB2YXIgQmFzZUVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQzKEJhc2VFcnJvciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEJhc2VFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgICAgLy8gRXJyb3JzIGRvbid0IHVzZSBjdXJyZW50IHRoaXMsIGluc3RlYWQgdGhleSBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuXG4gICAgICAgICAgLy8gV2UgaGF2ZSB0byBkbyBmb3J3YXJkIGFsbCBvZiBvdXIgYXBpIHRvIHRoZSBuYXRpdmVJbnN0YW5jZS5cbiAgICAgICAgICAvLyBUT0RPKGJyYWRmb3JkY3NtaXRoKTogUmVtb3ZlIHRoaXMgaGFjayB3aGVuXG4gICAgICAgICAgLy8gICAgIGdvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8yMTAyIGlzIGZpeGVkLlxuICAgICAgICAgIHZhciBuYXRpdmVFcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLl9uYXRpdmVFcnJvciA9IG5hdGl2ZUVycm9yO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2VFcnJvci5wcm90b3R5cGUsIFwibWVzc2FnZVwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLm1lc3NhZ2U7IH0sXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHRoaXMuX25hdGl2ZUVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcIm5hbWVcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9uYXRpdmVFcnJvci5uYW1lOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcInN0YWNrXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKCh0aGlzLl9uYXRpdmVFcnJvcikpLnN0YWNrOyB9LFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7ICgodGhpcy5fbmF0aXZlRXJyb3IpKS5zdGFjayA9IHZhbHVlOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmFzZUVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLnRvU3RyaW5nKCk7IH07XG4gICAgICByZXR1cm4gQmFzZUVycm9yO1xuICB9KEVycm9yKSk7XG4gIC8qKlxuICAgKiBAc3RhYmxlXG4gICAqL1xuICB2YXIgV3JhcHBlZEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQzKFdyYXBwZWRFcnJvciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFdyYXBwZWRFcnJvcihtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UgKyBcIiBjYXVzZWQgYnk6IFwiICsgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKTtcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcmFwcGVkRXJyb3IucHJvdG90eXBlLCBcInN0YWNrXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gKCgodGhpcy5vcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLm9yaWdpbmFsRXJyb3IgOiB0aGlzLl9uYXRpdmVFcnJvcikpKVxuICAgICAgICAgICAgICAgICAgLnN0YWNrO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFdyYXBwZWRFcnJvcjtcbiAgfShCYXNlRXJyb3IpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMiA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTU9EVUxFX1NVRkZJWCA9ICcnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEQVNIX0NBU0VfUkVHRVhQID0gLy0rKFthLXowLTldKS9nO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGFzaENhc2VUb0NhbWVsQ2FzZShpbnB1dCkge1xuICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoREFTSF9DQVNFX1JFR0VYUCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgbVtfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1bMV0udG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAqIEBwYXJhbSB7P30gZGVmYXVsdFZhbHVlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRBdENvbG9uKGlucHV0LCBkZWZhdWx0VmFsdWVzKSB7XG4gICAgICByZXR1cm4gX3NwbGl0QXQoaW5wdXQsICc6JywgZGVmYXVsdFZhbHVlcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHBhcmFtIHs/fSBkZWZhdWx0VmFsdWVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdEF0UGVyaW9kKGlucHV0LCBkZWZhdWx0VmFsdWVzKSB7XG4gICAgICByZXR1cm4gX3NwbGl0QXQoaW5wdXQsICcuJywgZGVmYXVsdFZhbHVlcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHBhcmFtIHs/fSBjaGFyYWN0ZXJcbiAgICogQHBhcmFtIHs/fSBkZWZhdWx0VmFsdWVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfc3BsaXRBdChpbnB1dCwgY2hhcmFjdGVyLCBkZWZhdWx0VmFsdWVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFyYWN0ZXJJbmRleCA9IGlucHV0LmluZGV4T2YoY2hhcmFjdGVyKTtcbiAgICAgIGlmIChjaGFyYWN0ZXJJbmRleCA9PSAtMSlcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgICAgIHJldHVybiBbaW5wdXQuc2xpY2UoMCwgY2hhcmFjdGVySW5kZXgpLnRyaW0oKSwgaW5wdXQuc2xpY2UoY2hhcmFjdGVySW5kZXggKyAxKS50cmltKCldO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0VmFsdWUodmFsdWUsIHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXJyYXkoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmljdFN0cmluZ01hcCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0cmluZ01hcCgvKiogQHR5cGUgez99ICovICh2YWx1ZSksIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcmltaXRpdmUodmFsdWUsIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRPdGhlcih2YWx1ZSwgY29udGV4dCk7XG4gIH1cbiAgdmFyIFZhbHVlVHJhbnNmb3JtZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVmFsdWVUcmFuc2Zvcm1lcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhcnJcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmFsdWVUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRBcnJheSA9IGZ1bmN0aW9uIChhcnIsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnIubWFwKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmlzaXRWYWx1ZSh2YWx1ZSwgX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWFwXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZhbHVlVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0ge307XG4gICAgICAgICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmVzdWx0W2tleV0gPSB2aXNpdFZhbHVlKG1hcFtrZXldLCBfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZhbHVlVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UHJpbWl0aXZlID0gZnVuY3Rpb24gKHZhbHVlLCBjb250ZXh0KSB7IHJldHVybiB2YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWYWx1ZVRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCBjb250ZXh0KSB7IHJldHVybiB2YWx1ZTsgfTtcbiAgICAgIHJldHVybiBWYWx1ZVRyYW5zZm9ybWVyO1xuICB9KCkpO1xuICB2YXIgU3luY0FzeW5jUmVzdWx0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzeW5jUmVzdWx0XG4gICAgICAgKiBAcGFyYW0gez89fSBhc3luY1Jlc3VsdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTeW5jQXN5bmNSZXN1bHQoc3luY1Jlc3VsdCwgYXN5bmNSZXN1bHQpIHtcbiAgICAgICAgICBpZiAoYXN5bmNSZXN1bHQgPT09IHZvaWQgMCkgeyBhc3luY1Jlc3VsdCA9IG51bGw7IH1cbiAgICAgICAgICB0aGlzLnN5bmNSZXN1bHQgPSBzeW5jUmVzdWx0O1xuICAgICAgICAgIHRoaXMuYXN5bmNSZXN1bHQgPSBhc3luY1Jlc3VsdDtcbiAgICAgICAgICBpZiAoIWFzeW5jUmVzdWx0KSB7XG4gICAgICAgICAgICAgIHRoaXMuYXN5bmNSZXN1bHQgPSBQcm9taXNlLnJlc29sdmUoc3luY1Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFN5bmNBc3luY1Jlc3VsdDtcbiAgfSgpKTtcbiAgdmFyIFN5bnRheEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQyKFN5bnRheEVycm9yLCBfc3VwZXIpO1xuICAgICAgZnVuY3Rpb24gU3ludGF4RXJyb3IoKSB7XG4gICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3ludGF4RXJyb3I7XG4gIH0oQmFzZUVycm9yKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDEgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIC8vIGdyb3VwIDA6IFwiW3Byb3BdIG9yIChldmVudCkgb3IgQHRyaWdnZXJcIlxuICAvLyBncm91cCAxOiBcInByb3BcIiBmcm9tIFwiW3Byb3BdXCJcbiAgLy8gZ3JvdXAgMjogXCJldmVudFwiIGZyb20gXCIoZXZlbnQpXCJcbiAgLy8gZ3JvdXAgMzogXCJAdHJpZ2dlclwiIGZyb20gXCJAdHJpZ2dlclwiXG4gIHZhciAvKiogQHR5cGUgez99ICovIEhPU1RfUkVHX0VYUCA9IC9eKD86KD86XFxbKFteXFxdXSspXFxdKXwoPzpcXCgoW15cXCldKylcXCkpKXwoXFxAWy1cXHddKykkLztcbiAgdmFyIENvbXBpbGVBbmltYXRpb25FbnRyeU1ldGFkYXRhID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gbmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gZGVmaW5pdGlvbnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUFuaW1hdGlvbkVudHJ5TWV0YWRhdGEobmFtZSwgZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7IG5hbWUgPSBudWxsOyB9XG4gICAgICAgICAgaWYgKGRlZmluaXRpb25zID09PSB2b2lkIDApIHsgZGVmaW5pdGlvbnMgPSBudWxsOyB9XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvbkVudHJ5TWV0YWRhdGE7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBDb21waWxlQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBDb21waWxlQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSgpIHtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb21waWxlQW5pbWF0aW9uU3RhdGVNZXRhZGF0YTtcbiAgfSgpKTtcbiAgdmFyIENvbXBpbGVBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDEoQ29tcGlsZUFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25NZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZU5hbWVFeHByXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbk1ldGFkYXRhKHN0YXRlTmFtZUV4cHIsIHN0eWxlcykge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuc3RhdGVOYW1lRXhwciA9IHN0YXRlTmFtZUV4cHI7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25NZXRhZGF0YTtcbiAgfShDb21waWxlQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSkpO1xuICB2YXIgQ29tcGlsZUFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxKENvbXBpbGVBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZUNoYW5nZUV4cHJcbiAgICAgICAqIEBwYXJhbSB7P30gc3RlcHNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhKHN0YXRlQ2hhbmdlRXhwciwgc3RlcHMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlRXhwciA9IHN0YXRlQ2hhbmdlRXhwcjtcbiAgICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhO1xuICB9KENvbXBpbGVBbmltYXRpb25TdGF0ZU1ldGFkYXRhKSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBDb21waWxlQW5pbWF0aW9uTWV0YWRhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUFuaW1hdGlvbk1ldGFkYXRhKCkge1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbXBpbGVBbmltYXRpb25NZXRhZGF0YTtcbiAgfSgpKTtcbiAgdmFyIENvbXBpbGVBbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxKENvbXBpbGVBbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSBzdGVwc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YShzdGVwcykge1xuICAgICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gW107IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvbktleWZyYW1lc1NlcXVlbmNlTWV0YWRhdGE7XG4gIH0oQ29tcGlsZUFuaW1hdGlvbk1ldGFkYXRhKSk7XG4gIHZhciBDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRcbiAgICAgICAqIEBwYXJhbSB7Pz19IHN0eWxlc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YShvZmZzZXQsIHN0eWxlcykge1xuICAgICAgICAgIGlmIChzdHlsZXMgPT09IHZvaWQgMCkgeyBzdHlsZXMgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvblN0eWxlTWV0YWRhdGE7XG4gIH0oQ29tcGlsZUFuaW1hdGlvbk1ldGFkYXRhKSk7XG4gIHZhciBDb21waWxlQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxKENvbXBpbGVBbmltYXRpb25BbmltYXRlTWV0YWRhdGEsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IHRpbWluZ3NcbiAgICAgICAqIEBwYXJhbSB7Pz19IHN0eWxlc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhKHRpbWluZ3MsIHN0eWxlcykge1xuICAgICAgICAgIGlmICh0aW1pbmdzID09PSB2b2lkIDApIHsgdGltaW5ncyA9IDA7IH1cbiAgICAgICAgICBpZiAoc3R5bGVzID09PSB2b2lkIDApIHsgc3R5bGVzID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMudGltaW5ncyA9IHRpbWluZ3M7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvbkFuaW1hdGVNZXRhZGF0YTtcbiAgfShDb21waWxlQW5pbWF0aW9uTWV0YWRhdGEpKTtcbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIENvbXBpbGVBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShDb21waWxlQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IHN0ZXBzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbXBpbGVBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YShzdGVwcykge1xuICAgICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuc3RlcHMgPSBzdGVwcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb21waWxlQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGE7XG4gIH0oQ29tcGlsZUFuaW1hdGlvbk1ldGFkYXRhKSk7XG4gIHZhciBDb21waWxlQW5pbWF0aW9uU2VxdWVuY2VNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShDb21waWxlQW5pbWF0aW9uU2VxdWVuY2VNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gc3RlcHNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGEoc3RlcHMpIHtcbiAgICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzdGVwcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGE7XG4gIH0oQ29tcGlsZUFuaW1hdGlvbldpdGhTdGVwc01ldGFkYXRhKSk7XG4gIHZhciBDb21waWxlQW5pbWF0aW9uR3JvdXBNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShDb21waWxlQW5pbWF0aW9uR3JvdXBNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gc3RlcHNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUFuaW1hdGlvbkdyb3VwTWV0YWRhdGEoc3RlcHMpIHtcbiAgICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzdGVwcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcGlsZUFuaW1hdGlvbkdyb3VwTWV0YWRhdGE7XG4gIH0oQ29tcGlsZUFuaW1hdGlvbldpdGhTdGVwc01ldGFkYXRhKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9zYW5pdGl6ZUlkZW50aWZpZXIobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXFxXL2csICdfJyk7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX2Fub255bW91c1R5cGVJbmRleCA9IDA7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVJZGVudGlmaWVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpZGVudGlmaWVyTmFtZShjb21waWxlSWRlbnRpZmllcikge1xuICAgICAgaWYgKCFjb21waWxlSWRlbnRpZmllciB8fCAhY29tcGlsZUlkZW50aWZpZXIucmVmZXJlbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWYgPSBjb21waWxlSWRlbnRpZmllci5yZWZlcmVuY2U7XG4gICAgICBpZiAocmVmIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZi5uYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHJlZlsnX19hbm9ueW1vdXNUeXBlJ10pIHtcbiAgICAgICAgICByZXR1cm4gcmVmWydfX2Fub255bW91c1R5cGUnXTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkZW50aWZpZXIgPSBzdHJpbmdpZnkocmVmKTtcbiAgICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJygnKSA+PSAwKSB7XG4gICAgICAgICAgLy8gY2FzZTogYW5vbnltb3VzIGZ1bmN0aW9ucyFcbiAgICAgICAgICBpZGVudGlmaWVyID0gXCJhbm9ueW1vdXNfXCIgKyBfYW5vbnltb3VzVHlwZUluZGV4Kys7XG4gICAgICAgICAgcmVmWydfX2Fub255bW91c1R5cGUnXSA9IGlkZW50aWZpZXI7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICBpZGVudGlmaWVyID0gX3Nhbml0aXplSWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZGVudGlmaWVyO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVJZGVudGlmaWVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpZGVudGlmaWVyTW9kdWxlVXJsKGNvbXBpbGVJZGVudGlmaWVyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWYgPSBjb21waWxlSWRlbnRpZmllci5yZWZlcmVuY2U7XG4gICAgICBpZiAocmVmIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZi5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWZsZWN0b3IuaW1wb3J0VXJpKHJlZik7XG4gIH1cbiAgdmFyIENvbXBpbGVTdW1tYXJ5S2luZCA9IHt9O1xuICBDb21waWxlU3VtbWFyeUtpbmQuUGlwZSA9IDA7XG4gIENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUgPSAxO1xuICBDb21waWxlU3VtbWFyeUtpbmQuTmdNb2R1bGUgPSAyO1xuICBDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZSA9IDM7XG4gIENvbXBpbGVTdW1tYXJ5S2luZFtDb21waWxlU3VtbWFyeUtpbmQuUGlwZV0gPSBcIlBpcGVcIjtcbiAgQ29tcGlsZVN1bW1hcnlLaW5kW0NvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmVdID0gXCJEaXJlY3RpdmVcIjtcbiAgQ29tcGlsZVN1bW1hcnlLaW5kW0NvbXBpbGVTdW1tYXJ5S2luZC5OZ01vZHVsZV0gPSBcIk5nTW9kdWxlXCI7XG4gIENvbXBpbGVTdW1tYXJ5S2luZFtDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZV0gPSBcIkluamVjdGFibGVcIjtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuTmFtZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGlzUHJlc2VudCh0b2tlbi52YWx1ZSkgPyBfc2FuaXRpemVJZGVudGlmaWVyKHRva2VuLnZhbHVlKSA6XG4gICAgICAgICAgaWRlbnRpZmllck5hbWUodG9rZW4uaWRlbnRpZmllcik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuUmVmZXJlbmNlKHRva2VuKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KHRva2VuLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuLmlkZW50aWZpZXIucmVmZXJlbmNlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiAgTWV0YWRhdGEgYWJvdXQgYSBzdHlsZXNoZWV0XG4gICAqL1xuICB2YXIgQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IF9fMFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlU3R5bGVzaGVldE1ldGFkYXRhKF9hKSB7XG4gICAgICAgICAgdmFyIF9iID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsIG1vZHVsZVVybCA9IF9iLm1vZHVsZVVybCwgc3R5bGVzID0gX2Iuc3R5bGVzLCBzdHlsZVVybHMgPSBfYi5zdHlsZVVybHM7XG4gICAgICAgICAgdGhpcy5tb2R1bGVVcmwgPSBtb2R1bGVVcmw7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVzKTtcbiAgICAgICAgICB0aGlzLnN0eWxlVXJscyA9IF9ub3JtYWxpemVBcnJheShzdHlsZVVybHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGE7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgTWV0YWRhdGEgcmVnYXJkaW5nIGNvbXBpbGF0aW9uIG9mIGEgdGVtcGxhdGUuXG4gICAqL1xuICB2YXIgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSBfXzBcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoX2EpIHtcbiAgICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgZW5jYXBzdWxhdGlvbiA9IF9iLmVuY2Fwc3VsYXRpb24sIHRlbXBsYXRlID0gX2IudGVtcGxhdGUsIHRlbXBsYXRlVXJsID0gX2IudGVtcGxhdGVVcmwsIHN0eWxlcyA9IF9iLnN0eWxlcywgc3R5bGVVcmxzID0gX2Iuc3R5bGVVcmxzLCBleHRlcm5hbFN0eWxlc2hlZXRzID0gX2IuZXh0ZXJuYWxTdHlsZXNoZWV0cywgYW5pbWF0aW9ucyA9IF9iLmFuaW1hdGlvbnMsIG5nQ29udGVudFNlbGVjdG9ycyA9IF9iLm5nQ29udGVudFNlbGVjdG9ycywgaW50ZXJwb2xhdGlvbiA9IF9iLmludGVycG9sYXRpb247XG4gICAgICAgICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gZW5jYXBzdWxhdGlvbjtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsO1xuICAgICAgICAgIHRoaXMuc3R5bGVzID0gX25vcm1hbGl6ZUFycmF5KHN0eWxlcyk7XG4gICAgICAgICAgdGhpcy5zdHlsZVVybHMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVVcmxzKTtcbiAgICAgICAgICB0aGlzLmV4dGVybmFsU3R5bGVzaGVldHMgPSBfbm9ybWFsaXplQXJyYXkoZXh0ZXJuYWxTdHlsZXNoZWV0cyk7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb25zID0gYW5pbWF0aW9ucyA/IExpc3RXcmFwcGVyLmZsYXR0ZW4oYW5pbWF0aW9ucykgOiBbXTtcbiAgICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9IG5nQ29udGVudFNlbGVjdG9ycyB8fCBbXTtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbiAmJiBpbnRlcnBvbGF0aW9uLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIidpbnRlcnBvbGF0aW9uJyBzaG91bGQgaGF2ZSBhIHN0YXJ0IGFuZCBhbiBlbmQgc3ltYm9sLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEucHJvdG90eXBlLnRvU3VtbWFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBhbmltYXRpb25zOiB0aGlzLmFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChhbmltKSB7IHJldHVybiBhbmltLm5hbWU7IH0pLFxuICAgICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IHRoaXMubmdDb250ZW50U2VsZWN0b3JzLFxuICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmVuY2Fwc3VsYXRpb25cbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YTtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSBkaXJlY3RpdmUuXG4gICAqL1xuICB2YXIgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX18wXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YShfYSkge1xuICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBpc0hvc3QgPSBfYi5pc0hvc3QsIHR5cGUgPSBfYi50eXBlLCBpc0NvbXBvbmVudCA9IF9iLmlzQ29tcG9uZW50LCBzZWxlY3RvciA9IF9iLnNlbGVjdG9yLCBleHBvcnRBcyA9IF9iLmV4cG9ydEFzLCBjaGFuZ2VEZXRlY3Rpb24gPSBfYi5jaGFuZ2VEZXRlY3Rpb24sIGlucHV0cyA9IF9iLmlucHV0cywgb3V0cHV0cyA9IF9iLm91dHB1dHMsIGhvc3RMaXN0ZW5lcnMgPSBfYi5ob3N0TGlzdGVuZXJzLCBob3N0UHJvcGVydGllcyA9IF9iLmhvc3RQcm9wZXJ0aWVzLCBob3N0QXR0cmlidXRlcyA9IF9iLmhvc3RBdHRyaWJ1dGVzLCBwcm92aWRlcnMgPSBfYi5wcm92aWRlcnMsIHZpZXdQcm92aWRlcnMgPSBfYi52aWV3UHJvdmlkZXJzLCBxdWVyaWVzID0gX2IucXVlcmllcywgdmlld1F1ZXJpZXMgPSBfYi52aWV3UXVlcmllcywgZW50cnlDb21wb25lbnRzID0gX2IuZW50cnlDb21wb25lbnRzLCB0ZW1wbGF0ZSA9IF9iLnRlbXBsYXRlO1xuICAgICAgICAgIHRoaXMuaXNIb3N0ID0gISFpc0hvc3Q7XG4gICAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gaXNDb21wb25lbnQ7XG4gICAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICAgIHRoaXMuZXhwb3J0QXMgPSBleHBvcnRBcztcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvbiA9IGNoYW5nZURldGVjdGlvbjtcbiAgICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICAgICAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgICAgICAgIHRoaXMuaG9zdExpc3RlbmVycyA9IGhvc3RMaXN0ZW5lcnM7XG4gICAgICAgICAgdGhpcy5ob3N0UHJvcGVydGllcyA9IGhvc3RQcm9wZXJ0aWVzO1xuICAgICAgICAgIHRoaXMuaG9zdEF0dHJpYnV0ZXMgPSBob3N0QXR0cmlidXRlcztcbiAgICAgICAgICB0aGlzLnByb3ZpZGVycyA9IF9ub3JtYWxpemVBcnJheShwcm92aWRlcnMpO1xuICAgICAgICAgIHRoaXMudmlld1Byb3ZpZGVycyA9IF9ub3JtYWxpemVBcnJheSh2aWV3UHJvdmlkZXJzKTtcbiAgICAgICAgICB0aGlzLnF1ZXJpZXMgPSBfbm9ybWFsaXplQXJyYXkocXVlcmllcyk7XG4gICAgICAgICAgdGhpcy52aWV3UXVlcmllcyA9IF9ub3JtYWxpemVBcnJheSh2aWV3UXVlcmllcyk7XG4gICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHMgPSBfbm9ybWFsaXplQXJyYXkoZW50cnlDb21wb25lbnRzKTtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IF9fMFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBpc0hvc3QgPSBfYi5pc0hvc3QsIHR5cGUgPSBfYi50eXBlLCBpc0NvbXBvbmVudCA9IF9iLmlzQ29tcG9uZW50LCBzZWxlY3RvciA9IF9iLnNlbGVjdG9yLCBleHBvcnRBcyA9IF9iLmV4cG9ydEFzLCBjaGFuZ2VEZXRlY3Rpb24gPSBfYi5jaGFuZ2VEZXRlY3Rpb24sIGlucHV0cyA9IF9iLmlucHV0cywgb3V0cHV0cyA9IF9iLm91dHB1dHMsIGhvc3QgPSBfYi5ob3N0LCBwcm92aWRlcnMgPSBfYi5wcm92aWRlcnMsIHZpZXdQcm92aWRlcnMgPSBfYi52aWV3UHJvdmlkZXJzLCBxdWVyaWVzID0gX2IucXVlcmllcywgdmlld1F1ZXJpZXMgPSBfYi52aWV3UXVlcmllcywgZW50cnlDb21wb25lbnRzID0gX2IuZW50cnlDb21wb25lbnRzLCB0ZW1wbGF0ZSA9IF9iLnRlbXBsYXRlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RMaXN0ZW5lcnMgPSB7fTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0UHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RBdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChob3N0KSkge1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhob3N0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gaG9zdFtrZXldO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlcyA9IGtleS5tYXRjaChIT1NUX1JFR19FWFApO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBob3N0QXR0cmlidXRlc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1ByZXNlbnQobWF0Y2hlc1sxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBob3N0UHJvcGVydGllc1ttYXRjaGVzWzFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KG1hdGNoZXNbMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyc1ttYXRjaGVzWzJdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5wdXRzTWFwID0ge307XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChpbnB1dHMpKSB7XG4gICAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjYW5vbmljYWwgc3ludGF4OiBgZGlyUHJvcDogZWxQcm9wYFxuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYDpgLCB1c2UgZGlyUHJvcCA9IGVsUHJvcFxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBzcGxpdEF0Q29sb24oYmluZENvbmZpZywgW2JpbmRDb25maWcsIGJpbmRDb25maWddKTtcbiAgICAgICAgICAgICAgICAgIGlucHV0c01hcFtwYXJ0c1swXV0gPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dHB1dHNNYXAgPSB7fTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KG91dHB1dHMpKSB7XG4gICAgICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAoYmluZENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IGVsUHJvcGBcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGA6YCwgdXNlIGRpclByb3AgPSBlbFByb3BcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gc3BsaXRBdENvbG9uKGJpbmRDb25maWcsIFtiaW5kQ29uZmlnLCBiaW5kQ29uZmlnXSk7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRzTWFwW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICBpc0hvc3Q6IGlzSG9zdCxcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgaXNDb21wb25lbnQ6ICEhaXNDb21wb25lbnQsIHNlbGVjdG9yOiBzZWxlY3RvciwgZXhwb3J0QXM6IGV4cG9ydEFzLCBjaGFuZ2VEZXRlY3Rpb246IGNoYW5nZURldGVjdGlvbixcbiAgICAgICAgICAgICAgaW5wdXRzOiBpbnB1dHNNYXAsXG4gICAgICAgICAgICAgIG91dHB1dHM6IG91dHB1dHNNYXAsXG4gICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IGhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzOiBob3N0UHJvcGVydGllcyxcbiAgICAgICAgICAgICAgaG9zdEF0dHJpYnV0ZXM6IGhvc3RBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyxcbiAgICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogdmlld1Byb3ZpZGVycyxcbiAgICAgICAgICAgICAgcXVlcmllczogcXVlcmllcyxcbiAgICAgICAgICAgICAgdmlld1F1ZXJpZXM6IHZpZXdRdWVyaWVzLFxuICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IGVudHJ5Q29tcG9uZW50cyxcbiAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLnByb3RvdHlwZS50b1N1bW1hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VtbWFyeUtpbmQ6IENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgaXNDb21wb25lbnQ6IHRoaXMuaXNDb21wb25lbnQsXG4gICAgICAgICAgICAgIHNlbGVjdG9yOiB0aGlzLnNlbGVjdG9yLFxuICAgICAgICAgICAgICBleHBvcnRBczogdGhpcy5leHBvcnRBcyxcbiAgICAgICAgICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgICAgICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiB0aGlzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzOiB0aGlzLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBob3N0QXR0cmlidXRlczogdGhpcy5ob3N0QXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLnByb3ZpZGVycyxcbiAgICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogdGhpcy52aWV3UHJvdmlkZXJzLFxuICAgICAgICAgICAgICBxdWVyaWVzOiB0aGlzLnF1ZXJpZXMsXG4gICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5lbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogdGhpcy5jaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlICYmIHRoaXMudGVtcGxhdGUudG9TdW1tYXJ5KClcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGE7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQ29uc3RydWN0IHtAbGluayBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20ge0BsaW5rIENvbXBvbmVudFR5cGVNZXRhZGF0YX0gYW5kIGEgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7P30gdHlwZVJlZmVyZW5jZVxuICAgKiBAcGFyYW0gez99IGNvbXBNZXRhXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVIb3N0Q29tcG9uZW50TWV0YSh0eXBlUmVmZXJlbmNlLCBjb21wTWV0YSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcGxhdGUgPSBDc3NTZWxlY3Rvci5wYXJzZShjb21wTWV0YS5zZWxlY3RvcilbMF0uZ2V0TWF0Y2hpbmdFbGVtZW50VGVtcGxhdGUoKTtcbiAgICAgIHJldHVybiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEuY3JlYXRlKHtcbiAgICAgICAgICBpc0hvc3Q6IHRydWUsXG4gICAgICAgICAgdHlwZTogeyByZWZlcmVuY2U6IHR5cGVSZWZlcmVuY2UsIGRpRGVwczogW10sIGxpZmVjeWNsZUhvb2tzOiBbXSB9LFxuICAgICAgICAgIHRlbXBsYXRlOiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBfYW5ndWxhcl9jb3JlLlZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcnLFxuICAgICAgICAgICAgICBzdHlsZXM6IFtdLFxuICAgICAgICAgICAgICBzdHlsZVVybHM6IFtdLFxuICAgICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IFtdLFxuICAgICAgICAgICAgICBhbmltYXRpb25zOiBbXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogX2FuZ3VsYXJfY29yZS5DaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxuICAgICAgICAgIGlucHV0czogW10sXG4gICAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgICAgaG9zdDoge30sXG4gICAgICAgICAgaXNDb21wb25lbnQ6IHRydWUsXG4gICAgICAgICAgc2VsZWN0b3I6ICcqJyxcbiAgICAgICAgICBwcm92aWRlcnM6IFtdLFxuICAgICAgICAgIHZpZXdQcm92aWRlcnM6IFtdLFxuICAgICAgICAgIHF1ZXJpZXM6IFtdLFxuICAgICAgICAgIHZpZXdRdWVyaWVzOiBbXVxuICAgICAgfSk7XG4gIH1cbiAgdmFyIENvbXBpbGVQaXBlTWV0YWRhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSBfXzBcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZVBpcGVNZXRhZGF0YShfYSkge1xuICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCB0eXBlID0gX2IudHlwZSwgbmFtZSA9IF9iLm5hbWUsIHB1cmUgPSBfYi5wdXJlO1xuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnB1cmUgPSAhIXB1cmU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVQaXBlTWV0YWRhdGEucHJvdG90eXBlLnRvU3VtbWFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdW1tYXJ5S2luZDogQ29tcGlsZVN1bW1hcnlLaW5kLlBpcGUsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICBwdXJlOiB0aGlzLnB1cmVcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlUGlwZU1ldGFkYXRhO1xuICB9KCkpO1xuICAvKipcbiAgICogIE1ldGFkYXRhIHJlZ2FyZGluZyBjb21waWxhdGlvbiBvZiBhIG1vZHVsZS5cbiAgICovXG4gIHZhciBDb21waWxlTmdNb2R1bGVNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IF9fMFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlTmdNb2R1bGVNZXRhZGF0YShfYSkge1xuICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCB0eXBlID0gX2IudHlwZSwgcHJvdmlkZXJzID0gX2IucHJvdmlkZXJzLCBkZWNsYXJlZERpcmVjdGl2ZXMgPSBfYi5kZWNsYXJlZERpcmVjdGl2ZXMsIGV4cG9ydGVkRGlyZWN0aXZlcyA9IF9iLmV4cG9ydGVkRGlyZWN0aXZlcywgZGVjbGFyZWRQaXBlcyA9IF9iLmRlY2xhcmVkUGlwZXMsIGV4cG9ydGVkUGlwZXMgPSBfYi5leHBvcnRlZFBpcGVzLCBlbnRyeUNvbXBvbmVudHMgPSBfYi5lbnRyeUNvbXBvbmVudHMsIGJvb3RzdHJhcENvbXBvbmVudHMgPSBfYi5ib290c3RyYXBDb21wb25lbnRzLCBpbXBvcnRlZE1vZHVsZXMgPSBfYi5pbXBvcnRlZE1vZHVsZXMsIGV4cG9ydGVkTW9kdWxlcyA9IF9iLmV4cG9ydGVkTW9kdWxlcywgc2NoZW1hcyA9IF9iLnNjaGVtYXMsIHRyYW5zaXRpdmVNb2R1bGUgPSBfYi50cmFuc2l0aXZlTW9kdWxlLCBpZCA9IF9iLmlkO1xuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgdGhpcy5kZWNsYXJlZERpcmVjdGl2ZXMgPSBfbm9ybWFsaXplQXJyYXkoZGVjbGFyZWREaXJlY3RpdmVzKTtcbiAgICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlcyA9IF9ub3JtYWxpemVBcnJheShleHBvcnRlZERpcmVjdGl2ZXMpO1xuICAgICAgICAgIHRoaXMuZGVjbGFyZWRQaXBlcyA9IF9ub3JtYWxpemVBcnJheShkZWNsYXJlZFBpcGVzKTtcbiAgICAgICAgICB0aGlzLmV4cG9ydGVkUGlwZXMgPSBfbm9ybWFsaXplQXJyYXkoZXhwb3J0ZWRQaXBlcyk7XG4gICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBfbm9ybWFsaXplQXJyYXkocHJvdmlkZXJzKTtcbiAgICAgICAgICB0aGlzLmVudHJ5Q29tcG9uZW50cyA9IF9ub3JtYWxpemVBcnJheShlbnRyeUNvbXBvbmVudHMpO1xuICAgICAgICAgIHRoaXMuYm9vdHN0cmFwQ29tcG9uZW50cyA9IF9ub3JtYWxpemVBcnJheShib290c3RyYXBDb21wb25lbnRzKTtcbiAgICAgICAgICB0aGlzLmltcG9ydGVkTW9kdWxlcyA9IF9ub3JtYWxpemVBcnJheShpbXBvcnRlZE1vZHVsZXMpO1xuICAgICAgICAgIHRoaXMuZXhwb3J0ZWRNb2R1bGVzID0gX25vcm1hbGl6ZUFycmF5KGV4cG9ydGVkTW9kdWxlcyk7XG4gICAgICAgICAgdGhpcy5zY2hlbWFzID0gX25vcm1hbGl6ZUFycmF5KHNjaGVtYXMpO1xuICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpdmVNb2R1bGUgPSB0cmFuc2l0aXZlTW9kdWxlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTmdNb2R1bGVNZXRhZGF0YS5wcm90b3R5cGUudG9TdW1tYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHN1bW1hcnlLaW5kOiBDb21waWxlU3VtbWFyeUtpbmQuTmdNb2R1bGUsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiB0aGlzLnRyYW5zaXRpdmVNb2R1bGUuZW50cnlDb21wb25lbnRzLFxuICAgICAgICAgICAgICBwcm92aWRlcnM6IHRoaXMudHJhbnNpdGl2ZU1vZHVsZS5wcm92aWRlcnMsXG4gICAgICAgICAgICAgIG1vZHVsZXM6IHRoaXMudHJhbnNpdGl2ZU1vZHVsZS5tb2R1bGVzLFxuICAgICAgICAgICAgICBleHBvcnRlZERpcmVjdGl2ZXM6IHRoaXMudHJhbnNpdGl2ZU1vZHVsZS5leHBvcnRlZERpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgIGV4cG9ydGVkUGlwZXM6IHRoaXMudHJhbnNpdGl2ZU1vZHVsZS5leHBvcnRlZFBpcGVzXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGE7XG4gIH0oKSk7XG4gIHZhciBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKCkge1xuICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICAgIHRoaXMucGlwZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdGhpcy5waXBlcyA9IFtdO1xuICAgICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB0aGlzLmV4cG9ydGVkUGlwZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLm1vZHVsZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdGhpcy5tb2R1bGVzID0gW107XG4gICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICB0aGlzLnByb3ZpZGVycyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlciwgbW9kdWxlKSB7XG4gICAgICAgICAgdGhpcy5wcm92aWRlcnMucHVzaCh7IHByb3ZpZGVyOiBwcm92aWRlciwgbW9kdWxlOiBtb2R1bGUgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEucHJvdG90eXBlLmFkZERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgIGlmICghdGhpcy5kaXJlY3RpdmVzU2V0LmhhcyhpZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRyYW5zaXRpdmVDb21waWxlTmdNb2R1bGVNZXRhZGF0YS5wcm90b3R5cGUuYWRkRXhwb3J0ZWREaXJlY3RpdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuZXhwb3J0ZWREaXJlY3RpdmVzU2V0LmhhcyhpZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwb3J0ZWREaXJlY3RpdmVzU2V0LmFkZChpZC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlcy5wdXNoKGlkKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEucHJvdG90eXBlLmFkZFBpcGUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMucGlwZXNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5waXBlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgdGhpcy5waXBlcy5wdXNoKGlkKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEucHJvdG90eXBlLmFkZEV4cG9ydGVkUGlwZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgIGlmICghdGhpcy5leHBvcnRlZFBpcGVzU2V0LmhhcyhpZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgdGhpcy5leHBvcnRlZFBpcGVzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRyYW5zaXRpdmVDb21waWxlTmdNb2R1bGVNZXRhZGF0YS5wcm90b3R5cGUuYWRkTW9kdWxlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5tb2R1bGVzU2V0LmFkZChpZC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICB0aGlzLm1vZHVsZXMucHVzaChpZCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRFbnRyeUNvbXBvbmVudCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgIGlmICghdGhpcy5lbnRyeUNvbXBvbmVudHNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHNTZXQuYWRkKGlkLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgIHRoaXMuZW50cnlDb21wb25lbnRzLnB1c2goaWQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBvYmpcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9ub3JtYWxpemVBcnJheShvYmopIHtcbiAgICAgIHJldHVybiBvYmogfHwgW107XG4gIH1cbiAgdmFyIFByb3ZpZGVyTWV0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEBwYXJhbSB7P30gX18xXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFByb3ZpZGVyTWV0YSh0b2tlbiwgX2EpIHtcbiAgICAgICAgICB2YXIgdXNlQ2xhc3MgPSBfYS51c2VDbGFzcywgdXNlVmFsdWUgPSBfYS51c2VWYWx1ZSwgdXNlRXhpc3RpbmcgPSBfYS51c2VFeGlzdGluZywgdXNlRmFjdG9yeSA9IF9hLnVzZUZhY3RvcnksIGRlcHMgPSBfYS5kZXBzLCBtdWx0aSA9IF9hLm11bHRpO1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICB0aGlzLnVzZUNsYXNzID0gdXNlQ2xhc3M7XG4gICAgICAgICAgdGhpcy51c2VWYWx1ZSA9IHVzZVZhbHVlO1xuICAgICAgICAgIHRoaXMudXNlRXhpc3RpbmcgPSB1c2VFeGlzdGluZztcbiAgICAgICAgICB0aGlzLnVzZUZhY3RvcnkgPSB1c2VGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwcztcbiAgICAgICAgICB0aGlzLm11bHRpID0gISFtdWx0aTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm92aWRlck1ldGE7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkRU9GID0gMDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJFRBQiA9IDk7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRMRiA9IDEwO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkVlRBQiA9IDExO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkRkYgPSAxMjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJENSID0gMTM7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRTUEFDRSA9IDMyO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkQkFORyA9IDMzO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkRFEgPSAzNDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJEhBU0ggPSAzNTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJCQgPSAzNjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJFBFUkNFTlQgPSAzNztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJEFNUEVSU0FORCA9IDM4O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkU1EgPSAzOTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJExQQVJFTiA9IDQwO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkUlBBUkVOID0gNDE7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRTVEFSID0gNDI7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRQTFVTID0gNDM7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRDT01NQSA9IDQ0O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkTUlOVVMgPSA0NTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJFBFUklPRCA9IDQ2O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkU0xBU0ggPSA0NztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJENPTE9OID0gNTg7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRTRU1JQ09MT04gPSA1OTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJExUID0gNjA7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRFUSA9IDYxO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkR1QgPSA2MjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJFFVRVNUSU9OID0gNjM7XG4gIHZhciAvKiogQHR5cGUgez99ICovICQwID0gNDg7XG4gIHZhciAvKiogQHR5cGUgez99ICovICQ5ID0gNTc7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRBID0gNjU7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRFID0gNjk7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRGID0gNzA7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRYID0gODg7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRaID0gOTA7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRMQlJBQ0tFVCA9IDkxO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkQkFDS1NMQVNIID0gOTI7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRSQlJBQ0tFVCA9IDkzO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkQ0FSRVQgPSA5NDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJF8gPSA5NTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJGEgPSA5NztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJGUgPSAxMDE7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRmID0gMTAyO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkbiA9IDExMDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJHIgPSAxMTQ7XG4gIHZhciAvKiogQHR5cGUgez99ICovICR0ID0gMTE2O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkdSA9IDExNztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJHYgPSAxMTg7XG4gIHZhciAvKiogQHR5cGUgez99ICovICR4ID0gMTIwO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyAkeiA9IDEyMjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJExCUkFDRSA9IDEyMztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJEJBUiA9IDEyNDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJFJCUkFDRSA9IDEyNTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gJE5CU1AgPSAxNjA7XG4gIHZhciAvKiogQHR5cGUgez99ICovICRCVCA9IDk2O1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc1doaXRlc3BhY2UoY29kZSkge1xuICAgICAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09ICROQlNQKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0RpZ2l0KGNvZGUpIHtcbiAgICAgIHJldHVybiAkMCA8PSBjb2RlICYmIGNvZGUgPD0gJDk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBc2NpaUxldHRlcihjb2RlKSB7XG4gICAgICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6IHx8IGNvZGUgPj0gJEEgJiYgY29kZSA8PSAkWjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0FzY2lpSGV4RGlnaXQoY29kZSkge1xuICAgICAgcmV0dXJuIGNvZGUgPj0gJGEgJiYgY29kZSA8PSAkZiB8fCBjb2RlID49ICRBICYmIGNvZGUgPD0gJEYgfHwgaXNEaWdpdChjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQSByZXBsYWNlbWVudCBmb3IgQEluamVjdGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgY29tcGlsZXIsIHNvIHRoYXRcbiAgICAqIHdlIGRvbid0IHRyeSB0byBldmFsdWF0ZSB0aGUgbWV0YWRhdGEgaW4gdGhlIGNvbXBpbGVyIGR1cmluZyBBb1QuXG4gICAgKiBUaGlzIGRlY29yYXRvciBpcyBlbm91Z2ggdG8gbWFrZSB0aGUgY29tcGlsZXIgd29yayB3aXRoIHRoZSBSZWZsZWN0aXZlSW5qZWN0b3IgdGhvdWdoLlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gQ29tcGlsZXJJbmplY3RhYmxlKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7IHJldHVybiB4OyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaWRlbnRpZmllclxuICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhc3NlcnRBcnJheU9mU3RyaW5ncyhpZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgaWYgKCFfYW5ndWxhcl9jb3JlLmlzRGV2TW9kZSgpIHx8IGlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkICdcIiArIGlkZW50aWZpZXIgKyBcIicgdG8gYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cIik7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAnXCIgKyBpZGVudGlmaWVyICsgXCInIHRvIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuXCIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBJTlRFUlBPTEFUSU9OX0JMQUNLTElTVF9SRUdFWFBTID0gW1xuICAgICAgL15cXHMqJC8sXG4gICAgICAvWzw+XS8sXG4gICAgICAvXlt7fV0kLyxcbiAgICAgIC8mKCN8W2Etel0pL2ksXG4gICAgICAvXlxcL1xcLy8sXG4gIF07XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHMoaWRlbnRpZmllciwgdmFsdWUpIHtcbiAgICAgIGlmIChpc1ByZXNlbnQodmFsdWUpICYmICEoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09IDIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgJ1wiICsgaWRlbnRpZmllciArIFwiJyB0byBiZSBhbiBhcnJheSwgW3N0YXJ0LCBlbmRdLlwiKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF9hbmd1bGFyX2NvcmUuaXNEZXZNb2RlKCkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnRfMSA9ICh2YWx1ZVswXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW5kXzEgPSAodmFsdWVbMV0pO1xuICAgICAgICAgIC8vIGJsYWNrIGxpc3QgY2hlY2tpbmdcbiAgICAgICAgICBJTlRFUlBPTEFUSU9OX0JMQUNLTElTVF9SRUdFWFBTLmZvckVhY2goZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgICAgICAgICBpZiAocmVnZXhwLnRlc3Qoc3RhcnRfMSkgfHwgcmVnZXhwLnRlc3QoZW5kXzEpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbJ1wiICsgc3RhcnRfMSArIFwiJywgJ1wiICsgZW5kXzEgKyBcIiddIGNvbnRhaW5zIHVudXNhYmxlIGludGVycG9sYXRpb24gc3ltYm9sLlwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIEludGVycG9sYXRpb25Db25maWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcGFyYW0gez99IGVuZFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBJbnRlcnBvbGF0aW9uQ29uZmlnKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWFya2Vyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSW50ZXJwb2xhdGlvbkNvbmZpZy5mcm9tQXJyYXkgPSBmdW5jdGlvbiAobWFya2Vycykge1xuICAgICAgICAgIGlmICghbWFya2Vycykge1xuICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRztcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHMoJ2ludGVycG9sYXRpb24nLCBtYXJrZXJzKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRpb25Db25maWcobWFya2Vyc1swXSwgbWFya2Vyc1sxXSk7XG4gICAgICB9O1xuICAgICAgO1xuICAgICAgcmV0dXJuIEludGVycG9sYXRpb25Db25maWc7XG4gIH0oKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUcgPSBuZXcgSW50ZXJwb2xhdGlvbkNvbmZpZygne3snLCAnfX0nKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkNCA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIFBhcnNlckVycm9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGVyckxvY2F0aW9uXG4gICAgICAgKiBAcGFyYW0gez89fSBjdHhMb2NhdGlvblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYXJzZXJFcnJvcihtZXNzYWdlLCBpbnB1dCwgZXJyTG9jYXRpb24sIGN0eExvY2F0aW9uKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICAgIHRoaXMuZXJyTG9jYXRpb24gPSBlcnJMb2NhdGlvbjtcbiAgICAgICAgICB0aGlzLmN0eExvY2F0aW9uID0gY3R4TG9jYXRpb247XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gXCJQYXJzZXIgRXJyb3I6IFwiICsgbWVzc2FnZSArIFwiIFwiICsgZXJyTG9jYXRpb24gKyBcIiBbXCIgKyBpbnB1dCArIFwiXSBpbiBcIiArIGN0eExvY2F0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFBhcnNlckVycm9yO1xuICB9KCkpO1xuICB2YXIgUGFyc2VTcGFuID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGFydFxuICAgICAgICogQHBhcmFtIHs/fSBlbmRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUGFyc2VTcGFuKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gUGFyc2VTcGFuO1xuICB9KCkpO1xuICB2YXIgQVNUID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFTVChzcGFuKSB7XG4gICAgICAgICAgdGhpcy5zcGFuID0gc3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBU1QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBU1QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ0FTVCc7IH07XG4gICAgICByZXR1cm4gQVNUO1xuICB9KCkpO1xuICAvKipcbiAgICogIFJlcHJlc2VudHMgYSBxdW90ZWQgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybTpcbiAgICAqICpcbiAgICAqIHF1b3RlID0gcHJlZml4IGA6YCB1bmludGVycHJldGVkRXhwcmVzc2lvblxuICAgICogcHJlZml4ID0gaWRlbnRpZmllclxuICAgICogdW5pbnRlcnByZXRlZEV4cHJlc3Npb24gPSBhcmJpdHJhcnkgc3RyaW5nXG4gICAgKiAqXG4gICAgKiBBIHF1b3RlZCBleHByZXNzaW9uIGlzIG1lYW50IHRvIGJlIHByZS1wcm9jZXNzZWQgYnkgYW4gQVNUIHRyYW5zZm9ybWVyIHRoYXRcbiAgICAqIGNvbnZlcnRzIGl0IGludG8gYW5vdGhlciBBU1QgdGhhdCBubyBsb25nZXIgY29udGFpbnMgcXVvdGVkIGV4cHJlc3Npb25zLlxuICAgICogSXQgaXMgbWVhbnQgdG8gYWxsb3cgdGhpcmQtcGFydHkgZGV2ZWxvcGVycyB0byBleHRlbmQgQW5ndWxhciB0ZW1wbGF0ZVxuICAgICogZXhwcmVzc2lvbiBsYW5ndWFnZS4gVGhlIGB1bmludGVycHJldGVkRXhwcmVzc2lvbmAgcGFydCBvZiB0aGUgcXVvdGUgaXNcbiAgICAqIHRoZXJlZm9yZSBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIncyBvd24gZXhwcmVzc2lvbiBwYXJzZXIuXG4gICAqL1xuICB2YXIgUXVvdGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoUXVvdGUsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBwcmVmaXhcbiAgICAgICAqIEBwYXJhbSB7P30gdW5pbnRlcnByZXRlZEV4cHJlc3Npb25cbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb25cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUXVvdGUoc3BhbiwgcHJlZml4LCB1bmludGVycHJldGVkRXhwcmVzc2lvbiwgbG9jYXRpb24pIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgICB0aGlzLnVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uID0gdW5pbnRlcnByZXRlZEV4cHJlc3Npb247XG4gICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFF1b3RlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UXVvdGUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBRdW90ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnUXVvdGUnOyB9O1xuICAgICAgcmV0dXJuIFF1b3RlO1xuICB9KEFTVCkpO1xuICB2YXIgRW1wdHlFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ0KEVtcHR5RXhwciwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIEVtcHR5RXhwcigpIHtcbiAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbXB0eUV4cHIucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfTtcbiAgICAgIHJldHVybiBFbXB0eUV4cHI7XG4gIH0oQVNUKSk7XG4gIHZhciBJbXBsaWNpdFJlY2VpdmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ0KEltcGxpY2l0UmVjZWl2ZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBJbXBsaWNpdFJlY2VpdmVyKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEltcGxpY2l0UmVjZWl2ZXIucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbXBsaWNpdFJlY2VpdmVyKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBJbXBsaWNpdFJlY2VpdmVyO1xuICB9KEFTVCkpO1xuICAvKipcbiAgICogIE11bHRpcGxlIGV4cHJlc3Npb25zIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbi5cbiAgICovXG4gIHZhciBDaGFpbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChDaGFpbiwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IGV4cHJlc3Npb25zXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENoYWluKHNwYW4sIGV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENoYWluLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2hhaW4odGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIENoYWluO1xuICB9KEFTVCkpO1xuICB2YXIgQ29uZGl0aW9uYWwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoQ29uZGl0aW9uYWwsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gdHJ1ZUV4cFxuICAgICAgICogQHBhcmFtIHs/fSBmYWxzZUV4cFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb25kaXRpb25hbChzcGFuLCBjb25kaXRpb24sIHRydWVFeHAsIGZhbHNlRXhwKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgICAgdGhpcy50cnVlRXhwID0gdHJ1ZUV4cDtcbiAgICAgICAgICB0aGlzLmZhbHNlRXhwID0gZmFsc2VFeHA7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29uZGl0aW9uYWwucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25kaXRpb25hbCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ29uZGl0aW9uYWw7XG4gIH0oQVNUKSk7XG4gIHZhciBQcm9wZXJ0eVJlYWQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoUHJvcGVydHlSZWFkLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gcmVjZWl2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQcm9wZXJ0eVJlYWQoc3BhbiwgcmVjZWl2ZXIsIG5hbWUpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcm9wZXJ0eVJlYWQucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcm9wZXJ0eVJlYWQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFByb3BlcnR5UmVhZDtcbiAgfShBU1QpKTtcbiAgdmFyIFByb3BlcnR5V3JpdGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoUHJvcGVydHlXcml0ZSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUHJvcGVydHlXcml0ZShzcGFuLCByZWNlaXZlciwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJvcGVydHlXcml0ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFByb3BlcnR5V3JpdGUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFByb3BlcnR5V3JpdGU7XG4gIH0oQVNUKSk7XG4gIHZhciBTYWZlUHJvcGVydHlSZWFkID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ0KFNhZmVQcm9wZXJ0eVJlYWQsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSByZWNlaXZlclxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFNhZmVQcm9wZXJ0eVJlYWQoc3BhbiwgcmVjZWl2ZXIsIG5hbWUpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlUHJvcGVydHlSZWFkLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2FmZVByb3BlcnR5UmVhZCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU2FmZVByb3BlcnR5UmVhZDtcbiAgfShBU1QpKTtcbiAgdmFyIEtleWVkUmVhZCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChLZXllZFJlYWQsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBvYmpcbiAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEtleWVkUmVhZChzcGFuLCBvYmosIGtleSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pO1xuICAgICAgICAgIHRoaXMub2JqID0gb2JqO1xuICAgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEtleWVkUmVhZC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEtleWVkUmVhZCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gS2V5ZWRSZWFkO1xuICB9KEFTVCkpO1xuICB2YXIgS2V5ZWRXcml0ZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChLZXllZFdyaXRlLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICAgKiBAcGFyYW0gez99IGtleVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBLZXllZFdyaXRlKHNwYW4sIG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pO1xuICAgICAgICAgIHRoaXMub2JqID0gb2JqO1xuICAgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBLZXllZFdyaXRlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gS2V5ZWRXcml0ZTtcbiAgfShBU1QpKTtcbiAgdmFyIEJpbmRpbmdQaXBlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ0KEJpbmRpbmdQaXBlLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gZXhwXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gYXJnc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBCaW5kaW5nUGlwZShzcGFuLCBleHAsIG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLmV4cCA9IGV4cDtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BpcGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQaXBlKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBCaW5kaW5nUGlwZTtcbiAgfShBU1QpKTtcbiAgdmFyIExpdGVyYWxQcmltaXRpdmUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoTGl0ZXJhbFByaW1pdGl2ZSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIExpdGVyYWxQcmltaXRpdmUoc3BhbiwgdmFsdWUpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGl0ZXJhbFByaW1pdGl2ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxQcmltaXRpdmUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIExpdGVyYWxQcmltaXRpdmU7XG4gIH0oQVNUKSk7XG4gIHZhciBMaXRlcmFsQXJyYXkgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoTGl0ZXJhbEFycmF5LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTGl0ZXJhbEFycmF5KHNwYW4sIGV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIExpdGVyYWxBcnJheS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxBcnJheSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTGl0ZXJhbEFycmF5O1xuICB9KEFTVCkpO1xuICB2YXIgTGl0ZXJhbE1hcCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChMaXRlcmFsTWFwLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30ga2V5c1xuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTGl0ZXJhbE1hcChzcGFuLCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLmtleXMgPSBrZXlzO1xuICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIExpdGVyYWxNYXAucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsTWFwKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBMaXRlcmFsTWFwO1xuICB9KEFTVCkpO1xuICB2YXIgSW50ZXJwb2xhdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChJbnRlcnBvbGF0aW9uLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gc3RyaW5nc1xuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBJbnRlcnBvbGF0aW9uKHNwYW4sIHN0cmluZ3MsIGV4cHJlc3Npb25zKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICAgICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSW50ZXJwb2xhdGlvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEludGVycG9sYXRpb24odGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEludGVycG9sYXRpb247XG4gIH0oQVNUKSk7XG4gIHZhciBCaW5hcnkgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoQmluYXJ5LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gb3BlcmF0aW9uXG4gICAgICAgKiBAcGFyYW0gez99IGxlZnRcbiAgICAgICAqIEBwYXJhbSB7P30gcmlnaHRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQmluYXJ5KHNwYW4sIG9wZXJhdGlvbiwgbGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5hcnkucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCaW5hcnkodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJpbmFyeTtcbiAgfShBU1QpKTtcbiAgdmFyIFByZWZpeE5vdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChQcmVmaXhOb3QsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFByZWZpeE5vdChzcGFuLCBleHByZXNzaW9uKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVmaXhOb3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcmVmaXhOb3QodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFByZWZpeE5vdDtcbiAgfShBU1QpKTtcbiAgdmFyIE1ldGhvZENhbGwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoTWV0aG9kQ2FsbCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gYXJnc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBNZXRob2RDYWxsKHNwYW4sIHJlY2VpdmVyLCBuYW1lLCBhcmdzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNZXRob2RDYWxsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWV0aG9kQ2FsbCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTWV0aG9kQ2FsbDtcbiAgfShBU1QpKTtcbiAgdmFyIFNhZmVNZXRob2RDYWxsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ0KFNhZmVNZXRob2RDYWxsLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gcmVjZWl2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBhcmdzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFNhZmVNZXRob2RDYWxsKHNwYW4sIHJlY2VpdmVyLCBuYW1lLCBhcmdzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlTWV0aG9kQ2FsbC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFNhZmVNZXRob2RDYWxsKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBTYWZlTWV0aG9kQ2FsbDtcbiAgfShBU1QpKTtcbiAgdmFyIEZ1bmN0aW9uQ2FsbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNChGdW5jdGlvbkNhbGwsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRcbiAgICAgICAqIEBwYXJhbSB7P30gYXJnc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBGdW5jdGlvbkNhbGwoc3BhbiwgdGFyZ2V0LCBhcmdzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3Bhbik7XG4gICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBGdW5jdGlvbkNhbGwucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbkNhbGwodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEZ1bmN0aW9uQ2FsbDtcbiAgfShBU1QpKTtcbiAgdmFyIEFTVFdpdGhTb3VyY2UgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoQVNUV2l0aFNvdXJjZSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlXG4gICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBU1RXaXRoU291cmNlKGFzdCwgc291cmNlLCBsb2NhdGlvbiwgZXJyb3JzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbmV3IFBhcnNlU3BhbigwLCBpc0JsYW5rKHNvdXJjZSkgPyAwIDogc291cmNlLmxlbmd0aCkpO1xuICAgICAgICAgIHRoaXMuYXN0ID0gYXN0O1xuICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBU1RXaXRoU291cmNlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFTVFdpdGhTb3VyY2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zb3VyY2UgKyBcIiBpbiBcIiArIHRoaXMubG9jYXRpb247IH07XG4gICAgICByZXR1cm4gQVNUV2l0aFNvdXJjZTtcbiAgfShBU1QpKTtcbiAgdmFyIFRlbXBsYXRlQmluZGluZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAqIEBwYXJhbSB7P30ga2V5SXNWYXJcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlQmluZGluZyhzcGFuLCBrZXksIGtleUlzVmFyLCBuYW1lLCBleHByZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy5zcGFuID0gc3BhbjtcbiAgICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgICB0aGlzLmtleUlzVmFyID0ga2V5SXNWYXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFRlbXBsYXRlQmluZGluZztcbiAgfSgpKTtcbiAgdmFyIFJlY3Vyc2l2ZUFzdFZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUmVjdXJzaXZlQXN0VmlzaXRvcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0LmxlZnQudmlzaXQodGhpcyk7XG4gICAgICAgICAgYXN0LnJpZ2h0LnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRDaGFpbiA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zLCBjb250ZXh0KTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIGFzdC50cnVlRXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIGFzdC5mYWxzZUV4cC52aXNpdCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGlwZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuZXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRGdW5jdGlvbkNhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0LnRhcmdldC52aXNpdCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW1wbGljaXRSZWNlaXZlciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRLZXllZFJlYWQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICAgICAgICBhc3Qua2V5LnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRLZXllZFdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgICAgICAgYXN0LmtleS52aXNpdCh0aGlzKTtcbiAgICAgICAgICBhc3QudmFsdWUudmlzaXQodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QudmFsdWVzLCBjb250ZXh0KTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsUHJpbWl0aXZlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuYXJncywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFByZWZpeE5vdCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJvcGVydHlSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJvcGVydHlXcml0ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgICAgICAgYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRTYWZlUHJvcGVydHlSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZU1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0c1xuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFsbCA9IGZ1bmN0aW9uIChhc3RzLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBhc3RzLmZvckVhY2goZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gYXN0LnZpc2l0KF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFF1b3RlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIHJldHVybiBSZWN1cnNpdmVBc3RWaXNpdG9yO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkMiA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQyID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICB2YXIgVG9rZW5UeXBlID0ge307XG4gIFRva2VuVHlwZS5DaGFyYWN0ZXIgPSAwO1xuICBUb2tlblR5cGUuSWRlbnRpZmllciA9IDE7XG4gIFRva2VuVHlwZS5LZXl3b3JkID0gMjtcbiAgVG9rZW5UeXBlLlN0cmluZyA9IDM7XG4gIFRva2VuVHlwZS5PcGVyYXRvciA9IDQ7XG4gIFRva2VuVHlwZS5OdW1iZXIgPSA1O1xuICBUb2tlblR5cGUuRXJyb3IgPSA2O1xuICBUb2tlblR5cGVbVG9rZW5UeXBlLkNoYXJhY3Rlcl0gPSBcIkNoYXJhY3RlclwiO1xuICBUb2tlblR5cGVbVG9rZW5UeXBlLklkZW50aWZpZXJdID0gXCJJZGVudGlmaWVyXCI7XG4gIFRva2VuVHlwZVtUb2tlblR5cGUuS2V5d29yZF0gPSBcIktleXdvcmRcIjtcbiAgVG9rZW5UeXBlW1Rva2VuVHlwZS5TdHJpbmddID0gXCJTdHJpbmdcIjtcbiAgVG9rZW5UeXBlW1Rva2VuVHlwZS5PcGVyYXRvcl0gPSBcIk9wZXJhdG9yXCI7XG4gIFRva2VuVHlwZVtUb2tlblR5cGUuTnVtYmVyXSA9IFwiTnVtYmVyXCI7XG4gIFRva2VuVHlwZVtUb2tlblR5cGUuRXJyb3JdID0gXCJFcnJvclwiO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBLRVlXT1JEUyA9IFsndmFyJywgJ2xldCcsICdudWxsJywgJ3VuZGVmaW5lZCcsICd0cnVlJywgJ2ZhbHNlJywgJ2lmJywgJ2Vsc2UnLCAndGhpcyddO1xuICB2YXIgTGV4ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTGV4ZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGV4ZXIucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY2FubmVyID0gbmV3IF9TY2FubmVyKHRleHQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VucyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcbiAgICAgICAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgIHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICAgIH07XG4gICAgICBMZXhlciA9IF9fZGVjb3JhdGUkMihbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMignZGVzaWduOnBhcmFtdHlwZXMnLCBbXSlcbiAgICAgIF0sIExleGVyKTtcbiAgICAgIHJldHVybiBMZXhlcjtcbiAgfSgpKTtcbiAgdmFyIFRva2VuID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IG51bVZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHN0clZhbHVlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRva2VuKGluZGV4LCB0eXBlLCBudW1WYWx1ZSwgc3RyVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLm51bVZhbHVlID0gbnVtVmFsdWU7XG4gICAgICAgICAgdGhpcy5zdHJWYWx1ZSA9IHN0clZhbHVlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRva2VuLnByb3RvdHlwZS5pc0NoYXJhY3RlciA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuQ2hhcmFjdGVyICYmIHRoaXMubnVtVmFsdWUgPT0gY29kZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRva2VuLnByb3RvdHlwZS5pc051bWJlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuTnVtYmVyOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUb2tlbi5wcm90b3R5cGUuaXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBvcGVyYXRlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzT3BlcmF0b3IgPSBmdW5jdGlvbiAob3BlcmF0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5PcGVyYXRvciAmJiB0aGlzLnN0clZhbHVlID09IG9wZXJhdGVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzSWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuSWRlbnRpZmllcjsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZExldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICdsZXQnOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUb2tlbi5wcm90b3R5cGUuaXNLZXl3b3JkTnVsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICdudWxsJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZFVuZGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gJ3VuZGVmaW5lZCc7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUb2tlbi5wcm90b3R5cGUuaXNLZXl3b3JkVHJ1ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICd0cnVlJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZEZhbHNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gJ2ZhbHNlJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZFRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSAndGhpcyc7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRva2VuLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5FcnJvcjsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVG9rZW4ucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZS5OdW1iZXIgPyB0aGlzLm51bVZhbHVlIDogLTE7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRva2VuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5DaGFyYWN0ZXI6XG4gICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLklkZW50aWZpZXI6XG4gICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLktleXdvcmQ6XG4gICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLk9wZXJhdG9yOlxuICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkVycm9yOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyVmFsdWU7XG4gICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLk51bWJlcjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm51bVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFRva2VuO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgKiBAcGFyYW0gez99IGNvZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG5ld0NoYXJhY3RlclRva2VuKGluZGV4LCBjb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuQ2hhcmFjdGVyLCBjb2RlLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgKiBAcGFyYW0gez99IHRleHRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG5ld0lkZW50aWZpZXJUb2tlbihpbmRleCwgdGV4dCkge1xuICAgICAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLklkZW50aWZpZXIsIDAsIHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAqIEBwYXJhbSB7P30gdGV4dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbmV3S2V5d29yZFRva2VuKGluZGV4LCB0ZXh0KSB7XG4gICAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuS2V5d29yZCwgMCwgdGV4dCk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBuZXdPcGVyYXRvclRva2VuKGluZGV4LCB0ZXh0KSB7XG4gICAgICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuT3BlcmF0b3IsIDAsIHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAqIEBwYXJhbSB7P30gdGV4dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbmV3U3RyaW5nVG9rZW4oaW5kZXgsIHRleHQpIHtcbiAgICAgIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5TdHJpbmcsIDAsIHRleHQpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAqIEBwYXJhbSB7P30gblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbmV3TnVtYmVyVG9rZW4oaW5kZXgsIG4pIHtcbiAgICAgIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5OdW1iZXIsIG4sICcnKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG5ld0Vycm9yVG9rZW4oaW5kZXgsIG1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5FcnJvciwgMCwgbWVzc2FnZSk7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRU9GID0gbmV3IFRva2VuKC0xLCBUb2tlblR5cGUuQ2hhcmFjdGVyLCAwLCAnJyk7XG4gIHZhciBfU2Nhbm5lciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX1NjYW5uZXIoaW5wdXQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgICAgdGhpcy5wZWVrID0gMDtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gLTE7XG4gICAgICAgICAgdGhpcy5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9TY2FubmVyLnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMucGVlayA9ICsrdGhpcy5pbmRleCA+PSB0aGlzLmxlbmd0aCA/ICRFT0YgOiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfU2Nhbm5lci5wcm90b3R5cGUuc2NhblRva2VuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlucHV0ID0gdGhpcy5pbnB1dCwgLyoqIEB0eXBlIHs/fSAqLyBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwZWVrID0gdGhpcy5wZWVrLCAvKiogQHR5cGUgez99ICovIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UuXG4gICAgICAgICAgd2hpbGUgKHBlZWsgPD0gJFNQQUNFKSB7XG4gICAgICAgICAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgcGVlayA9ICRFT0Y7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZWsgPSBpbnB1dC5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnBlZWsgPSBwZWVrO1xuICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBIYW5kbGUgaWRlbnRpZmllcnMgYW5kIG51bWJlcnMuXG4gICAgICAgICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHBlZWspKVxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xuICAgICAgICAgIGlmIChpc0RpZ2l0KHBlZWspKVxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKGluZGV4KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIHN3aXRjaCAocGVlaykge1xuICAgICAgICAgICAgICBjYXNlICRQRVJJT0Q6XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpc0RpZ2l0KHRoaXMucGVlaykgPyB0aGlzLnNjYW5OdW1iZXIoc3RhcnQpIDpcbiAgICAgICAgICAgICAgICAgICAgICBuZXdDaGFyYWN0ZXJUb2tlbihzdGFydCwgJFBFUklPRCk7XG4gICAgICAgICAgICAgIGNhc2UgJExQQVJFTjpcbiAgICAgICAgICAgICAgY2FzZSAkUlBBUkVOOlxuICAgICAgICAgICAgICBjYXNlICRMQlJBQ0U6XG4gICAgICAgICAgICAgIGNhc2UgJFJCUkFDRTpcbiAgICAgICAgICAgICAgY2FzZSAkTEJSQUNLRVQ6XG4gICAgICAgICAgICAgIGNhc2UgJFJCUkFDS0VUOlxuICAgICAgICAgICAgICBjYXNlICRDT01NQTpcbiAgICAgICAgICAgICAgY2FzZSAkQ09MT046XG4gICAgICAgICAgICAgIGNhc2UgJFNFTUlDT0xPTjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5DaGFyYWN0ZXIoc3RhcnQsIHBlZWspO1xuICAgICAgICAgICAgICBjYXNlICRTUTpcbiAgICAgICAgICAgICAgY2FzZSAkRFE6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuU3RyaW5nKCk7XG4gICAgICAgICAgICAgIGNhc2UgJEhBU0g6XG4gICAgICAgICAgICAgIGNhc2UgJFBMVVM6XG4gICAgICAgICAgICAgIGNhc2UgJE1JTlVTOlxuICAgICAgICAgICAgICBjYXNlICRTVEFSOlxuICAgICAgICAgICAgICBjYXNlICRTTEFTSDpcbiAgICAgICAgICAgICAgY2FzZSAkUEVSQ0VOVDpcbiAgICAgICAgICAgICAgY2FzZSAkQ0FSRVQ6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUocGVlaykpO1xuICAgICAgICAgICAgICBjYXNlICRRVUVTVElPTjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICc/JywgJFBFUklPRCwgJy4nKTtcbiAgICAgICAgICAgICAgY2FzZSAkTFQ6XG4gICAgICAgICAgICAgIGNhc2UgJEdUOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgU3RyaW5nLmZyb21DaGFyQ29kZShwZWVrKSwgJEVRLCAnPScpO1xuICAgICAgICAgICAgICBjYXNlICRCQU5HOlxuICAgICAgICAgICAgICBjYXNlICRFUTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUocGVlayksICRFUSwgJz0nLCAkRVEsICc9Jyk7XG4gICAgICAgICAgICAgIGNhc2UgJEFNUEVSU0FORDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICcmJywgJEFNUEVSU0FORCwgJyYnKTtcbiAgICAgICAgICAgICAgY2FzZSAkQkFSOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJ3wnLCAkQkFSLCAnfCcpO1xuICAgICAgICAgICAgICBjYXNlICROQlNQOlxuICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzV2hpdGVzcGFjZSh0aGlzLnBlZWspKVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiVW5leHBlY3RlZCBjaGFyYWN0ZXIgW1wiICsgU3RyaW5nLmZyb21DaGFyQ29kZShwZWVrKSArIFwiXVwiLCAwKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5DaGFyYWN0ZXIgPSBmdW5jdGlvbiAoc3RhcnQsIGNvZGUpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICByZXR1cm4gbmV3Q2hhcmFjdGVyVG9rZW4oc3RhcnQsIGNvZGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGFydFxuICAgICAgICogQHBhcmFtIHs/fSBzdHJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuT3BlcmF0b3IgPSBmdW5jdGlvbiAoc3RhcnQsIHN0cikge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHJldHVybiBuZXdPcGVyYXRvclRva2VuKHN0YXJ0LCBzdHIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFRva2VuaXplIGEgMi8zIGNoYXIgbG9uZyBvcGVyYXRvclxuICAgICAgICAqICpcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnQgc3RhcnQgaW5kZXggaW4gdGhlIGV4cHJlc3Npb25cbiAgICAgICAqIEBwYXJhbSB7P30gb25lIGZpcnN0IHN5bWJvbCAoYWx3YXlzIHBhcnQgb2YgdGhlIG9wZXJhdG9yKVxuICAgICAgICogQHBhcmFtIHs/fSB0d29Db2RlIGNvZGUgcG9pbnQgZm9yIHRoZSBzZWNvbmQgc3ltYm9sXG4gICAgICAgKiBAcGFyYW0gez99IHR3byBzZWNvbmQgc3ltYm9sIChwYXJ0IG9mIHRoZSBvcGVyYXRvciB3aGVuIHRoZSBzZWNvbmQgY29kZSBwb2ludCBtYXRjaGVzKVxuICAgICAgICogQHBhcmFtIHs/PX0gdGhyZWVDb2RlIGNvZGUgcG9pbnQgZm9yIHRoZSB0aGlyZCBzeW1ib2xcbiAgICAgICAqIEBwYXJhbSB7Pz19IHRocmVlIHRoaXJkIHN5bWJvbCAocGFydCBvZiB0aGUgb3BlcmF0b3Igd2hlbiBwcm92aWRlZCBhbmQgbWF0Y2hlcyBzb3VyY2UgZXhwcmVzc2lvbilcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuQ29tcGxleE9wZXJhdG9yID0gZnVuY3Rpb24gKHN0YXJ0LCBvbmUsIHR3b0NvZGUsIHR3bywgdGhyZWVDb2RlLCB0aHJlZSkge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ciA9IG9uZTtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrID09IHR3b0NvZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHN0ciArPSB0d287XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1ByZXNlbnQodGhyZWVDb2RlKSAmJiB0aGlzLnBlZWsgPT0gdGhyZWVDb2RlKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBzdHIgKz0gdGhyZWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXdPcGVyYXRvclRva2VuKHN0YXJ0LCBzdHIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5JZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB3aGlsZSAoaXNJZGVudGlmaWVyUGFydCh0aGlzLnBlZWspKVxuICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHIgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgcmV0dXJuIEtFWVdPUkRTLmluZGV4T2Yoc3RyKSA+IC0xID8gbmV3S2V5d29yZFRva2VuKHN0YXJ0LCBzdHIpIDpcbiAgICAgICAgICAgICAgbmV3SWRlbnRpZmllclRva2VuKHN0YXJ0LCBzdHIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGFydFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5OdW1iZXIgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzaW1wbGUgPSAodGhpcy5pbmRleCA9PT0gc3RhcnQpO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBTa2lwIGluaXRpYWwgZGlnaXQuXG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRGlnaXQodGhpcy5wZWVrKSkge1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGVlayA9PSAkUEVSSU9EKSB7XG4gICAgICAgICAgICAgICAgICBzaW1wbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChpc0V4cG9uZW50U3RhcnQodGhpcy5wZWVrKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNFeHBvbmVudFNpZ24odGhpcy5wZWVrKSlcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdCh0aGlzLnBlZWspKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdJbnZhbGlkIGV4cG9uZW50JywgLTEpO1xuICAgICAgICAgICAgICAgICAgc2ltcGxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RyID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gc2ltcGxlID8gTnVtYmVyV3JhcHBlci5wYXJzZUludEF1dG9SYWRpeChzdHIpIDogcGFyc2VGbG9hdChzdHIpO1xuICAgICAgICAgIHJldHVybiBuZXdOdW1iZXJUb2tlbihzdGFydCwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1b3RlID0gdGhpcy5wZWVrO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBTa2lwIGluaXRpYWwgcXVvdGUuXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYnVmZmVyID0gJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWFya2VyID0gdGhpcy5pbmRleDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICAgICAgd2hpbGUgKHRoaXMucGVlayAhPSBxdW90ZSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrID09ICRCQUNLU0xBU0gpIHtcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdW5lc2NhcGVkQ29kZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlZWsgPT0gJHUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyA0IGNoYXJhY3RlciBoZXggY29kZSBmb3IgdW5pY29kZSBjaGFyYWN0ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGV4ID0gaW5wdXQuc3Vic3RyaW5nKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4ICsgNSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKC9eWzAtOWEtZl0rJC9pLnRlc3QoaGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRDb2RlID0gcGFyc2VJbnQoaGV4LCAxNik7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihcIkludmFsaWQgdW5pY29kZSBlc2NhcGUgW1xcXFx1XCIgKyBoZXggKyBcIl1cIiwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGVkQ29kZSA9IHVuZXNjYXBlKHRoaXMucGVlayk7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBidWZmZXIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmVzY2FwZWRDb2RlKTtcbiAgICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wZWVrID09ICRFT0YpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3QgPSBpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KTtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTsgLy8gU2tpcCB0ZXJtaW5hdGluZyBxdW90ZS5cbiAgICAgICAgICByZXR1cm4gbmV3U3RyaW5nVG9rZW4oc3RhcnQsIGJ1ZmZlciArIGxhc3QpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcGFyYW0gez99IG9mZnNldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NjYW5uZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG9mZnNldCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBvc2l0aW9uID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICAgICAgICByZXR1cm4gbmV3RXJyb3JUb2tlbihwb3NpdGlvbiwgXCJMZXhlciBFcnJvcjogXCIgKyBtZXNzYWdlICsgXCIgYXQgY29sdW1uIFwiICsgcG9zaXRpb24gKyBcIiBpbiBleHByZXNzaW9uIFtcIiArIHRoaXMuaW5wdXQgKyBcIl1cIik7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9TY2FubmVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydChjb2RlKSB7XG4gICAgICByZXR1cm4gKCRhIDw9IGNvZGUgJiYgY29kZSA8PSAkeikgfHwgKCRBIDw9IGNvZGUgJiYgY29kZSA8PSAkWikgfHxcbiAgICAgICAgICAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0lkZW50aWZpZXIoaW5wdXQpIHtcbiAgICAgIGlmIChpbnB1dC5sZW5ndGggPT0gMClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY2FubmVyID0gbmV3IF9TY2FubmVyKGlucHV0KTtcbiAgICAgIGlmICghaXNJZGVudGlmaWVyU3RhcnQoc2Nhbm5lci5wZWVrKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBzY2FubmVyLmFkdmFuY2UoKTtcbiAgICAgIHdoaWxlIChzY2FubmVyLnBlZWsgIT09ICRFT0YpIHtcbiAgICAgICAgICBpZiAoIWlzSWRlbnRpZmllclBhcnQoc2Nhbm5lci5wZWVrKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHNjYW5uZXIuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydChjb2RlKSB7XG4gICAgICByZXR1cm4gaXNBc2NpaUxldHRlcihjb2RlKSB8fCBpc0RpZ2l0KGNvZGUpIHx8IChjb2RlID09ICRfKSB8fFxuICAgICAgICAgIChjb2RlID09ICQkKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0V4cG9uZW50U3RhcnQoY29kZSkge1xuICAgICAgcmV0dXJuIGNvZGUgPT0gJGUgfHwgY29kZSA9PSAkRTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0V4cG9uZW50U2lnbihjb2RlKSB7XG4gICAgICByZXR1cm4gY29kZSA9PSAkTUlOVVMgfHwgY29kZSA9PSAkUExVUztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc1F1b3RlKGNvZGUpIHtcbiAgICAgIHJldHVybiBjb2RlID09PSAkU1EgfHwgY29kZSA9PT0gJERRIHx8IGNvZGUgPT09ICRCVDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICBjYXNlICRuOlxuICAgICAgICAgICAgICByZXR1cm4gJExGO1xuICAgICAgICAgIGNhc2UgJGY6XG4gICAgICAgICAgICAgIHJldHVybiAkRkY7XG4gICAgICAgICAgY2FzZSAkcjpcbiAgICAgICAgICAgICAgcmV0dXJuICRDUjtcbiAgICAgICAgICBjYXNlICR0OlxuICAgICAgICAgICAgICByZXR1cm4gJFRBQjtcbiAgICAgICAgICBjYXNlICR2OlxuICAgICAgICAgICAgICByZXR1cm4gJFZUQUI7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2RlY29yYXRlJDEgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIFNwbGl0SW50ZXJwb2xhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RyaW5nc1xuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uc1xuICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFNwbGl0SW50ZXJwb2xhdGlvbihzdHJpbmdzLCBleHByZXNzaW9ucywgb2Zmc2V0cykge1xuICAgICAgICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG9mZnNldHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3BsaXRJbnRlcnBvbGF0aW9uO1xuICB9KCkpO1xuICB2YXIgVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlQmluZGluZ3NcbiAgICAgICAqIEBwYXJhbSB7P30gd2FybmluZ3NcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlQmluZGluZ1BhcnNlUmVzdWx0KHRlbXBsYXRlQmluZGluZ3MsIHdhcm5pbmdzLCBlcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlQmluZGluZ3MgPSB0ZW1wbGF0ZUJpbmRpbmdzO1xuICAgICAgICAgIHRoaXMud2FybmluZ3MgPSB3YXJuaW5ncztcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgIH1cbiAgICAgIHJldHVybiBUZW1wbGF0ZUJpbmRpbmdQYXJzZVJlc3VsdDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfY3JlYXRlSW50ZXJwb2xhdGVSZWdFeHAoY29uZmlnKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXR0ZXJuID0gZXNjYXBlUmVnRXhwKGNvbmZpZy5zdGFydCkgKyAnKFtcXFxcc1xcXFxTXSo/KScgKyBlc2NhcGVSZWdFeHAoY29uZmlnLmVuZCk7XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCAnZycpO1xuICB9XG4gIHZhciBQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9sZXhlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYXJzZXIoX2xleGVyKSB7XG4gICAgICAgICAgdGhpcy5fbGV4ZXIgPSBfbGV4ZXI7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblxuICAgICAgICogQHBhcmFtIHs/PX0gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFjdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgICAgICAgdGhpcy5fY2hlY2tOb0ludGVycG9sYXRpb24oaW5wdXQsIGxvY2F0aW9uLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VUb0xleCA9IHRoaXMuX3N0cmlwQ29tbWVudHMoaW5wdXQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKHRoaXMuX3N0cmlwQ29tbWVudHMoaW5wdXQpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3QgPSBuZXcgX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCBzb3VyY2VUb0xleC5sZW5ndGgsIHRydWUsIHRoaXMuZXJyb3JzLCBpbnB1dC5sZW5ndGggLSBzb3VyY2VUb0xleC5sZW5ndGgpXG4gICAgICAgICAgICAgIC5wYXJzZUNoYWluKCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKGFzdCwgaW5wdXQsIGxvY2F0aW9uLCB0aGlzLmVycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAgICAgKiBAcGFyYW0gez89fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZyA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gdGhpcy5fcGFyc2VCaW5kaW5nQXN0KGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKGFzdCwgaW5wdXQsIGxvY2F0aW9uLCB0aGlzLmVycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAgICAgKiBAcGFyYW0gez89fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU2ltcGxlQmluZGluZyA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gdGhpcy5fcGFyc2VCaW5kaW5nQXN0KGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JzID0gU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2soYXN0KTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoXCJIb3N0IGJpbmRpbmcgZXhwcmVzc2lvbiBjYW5ub3QgY29udGFpbiBcIiArIGVycm9ycy5qb2luKCcgJyksIGlucHV0LCBsb2NhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbiwgdGhpcy5lcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGVyckxvY2F0aW9uXG4gICAgICAgKiBAcGFyYW0gez89fSBjdHhMb2NhdGlvblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS5fcmVwb3J0RXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgaW5wdXQsIGVyckxvY2F0aW9uLCBjdHhMb2NhdGlvbikge1xuICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFBhcnNlckVycm9yKG1lc3NhZ2UsIGlucHV0LCBlcnJMb2NhdGlvbiwgY3R4TG9jYXRpb24pKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS5fcGFyc2VCaW5kaW5nQXN0ID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIC8vIFF1b3RlcyBleHByZXNzaW9ucyB1c2UgM3JkLXBhcnR5IGV4cHJlc3Npb24gbGFuZ3VhZ2UuIFdlIGRvbid0IHdhbnQgdG8gdXNlXG4gICAgICAgICAgLy8gb3VyIGxleGVyIG9yIHBhcnNlciBmb3IgdGhhdCwgc28gd2UgY2hlY2sgZm9yIHRoYXQgYWhlYWQgb2YgdGltZS5cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBxdW90ZSA9IHRoaXMuX3BhcnNlUXVvdGUoaW5wdXQsIGxvY2F0aW9uKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHF1b3RlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcXVvdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlVG9MZXggPSB0aGlzLl9zdHJpcENvbW1lbnRzKGlucHV0KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlbnMgPSB0aGlzLl9sZXhlci50b2tlbml6ZShzb3VyY2VUb0xleCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBfUGFyc2VBU1QoaW5wdXQsIGxvY2F0aW9uLCB0b2tlbnMsIHNvdXJjZVRvTGV4Lmxlbmd0aCwgZmFsc2UsIHRoaXMuZXJyb3JzLCBpbnB1dC5sZW5ndGggLSBzb3VyY2VUb0xleC5sZW5ndGgpXG4gICAgICAgICAgICAgIC5wYXJzZUNoYWluKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLl9wYXJzZVF1b3RlID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbikge1xuICAgICAgICAgIGlmIChpc0JsYW5rKGlucHV0KSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlZml4U2VwYXJhdG9ySW5kZXggPSBpbnB1dC5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgaWYgKHByZWZpeFNlcGFyYXRvckluZGV4ID09IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXggPSBpbnB1dC5zdWJzdHJpbmcoMCwgcHJlZml4U2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICAgICAgICBpZiAoIWlzSWRlbnRpZmllcihwcmVmaXgpKVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bmludGVycHJldGVkRXhwcmVzc2lvbiA9IGlucHV0LnN1YnN0cmluZyhwcmVmaXhTZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgICAgIHJldHVybiBuZXcgUXVvdGUobmV3IFBhcnNlU3BhbigwLCBpbnB1dC5sZW5ndGgpLCBwcmVmaXgsIHVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uLCBsb2NhdGlvbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByZWZpeFRva2VuXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVCaW5kaW5ncyA9IGZ1bmN0aW9uIChwcmVmaXhUb2tlbiwgaW5wdXQsIGxvY2F0aW9uKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdG9rZW5zID0gdGhpcy5fbGV4ZXIudG9rZW5pemUoaW5wdXQpO1xuICAgICAgICAgIGlmIChwcmVmaXhUb2tlbikge1xuICAgICAgICAgICAgICAvLyBQcmVmaXggdGhlIHRva2VucyB3aXRoIHRoZSB0b2tlbnMgZnJvbSBwcmVmaXhUb2tlbiBidXQgaGF2ZSB0aGVtIHRha2Ugbm8gc3BhY2UgKDAgaW5kZXgpLlxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXhUb2tlbnMgPSB0aGlzLl9sZXhlci50b2tlbml6ZShwcmVmaXhUb2tlbikubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICB0LmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdG9rZW5zLnVuc2hpZnQuYXBwbHkodG9rZW5zLCBwcmVmaXhUb2tlbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgaW5wdXQubGVuZ3RoLCBmYWxzZSwgdGhpcy5lcnJvcnMsIDApXG4gICAgICAgICAgICAgIC5wYXJzZVRlbXBsYXRlQmluZGluZ3MoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb25cbiAgICAgICAqIEBwYXJhbSB7Pz19IGludGVycG9sYXRpb25Db25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzcGxpdCA9IHRoaXMuc3BsaXRJbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgaWYgKHNwbGl0ID09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHJlc3Npb25zID0gW107XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHNwbGl0LmV4cHJlc3Npb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHJlc3Npb25UZXh0ID0gc3BsaXQuZXhwcmVzc2lvbnNbaV07XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZVRvTGV4ID0gdGhpcy5fc3RyaXBDb21tZW50cyhleHByZXNzaW9uVGV4dCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKHRoaXMuX3N0cmlwQ29tbWVudHMoc3BsaXQuZXhwcmVzc2lvbnNbaV0pKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2Vucywgc291cmNlVG9MZXgubGVuZ3RoLCBmYWxzZSwgdGhpcy5lcnJvcnMsIHNwbGl0Lm9mZnNldHNbaV0gKyAoZXhwcmVzc2lvblRleHQubGVuZ3RoIC0gc291cmNlVG9MZXgubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgIC5wYXJzZUNoYWluKCk7XG4gICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goYXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKG5ldyBJbnRlcnBvbGF0aW9uKG5ldyBQYXJzZVNwYW4oMCwgaXNCbGFuayhpbnB1dCkgPyAwIDogaW5wdXQubGVuZ3RoKSwgc3BsaXQuc3RyaW5ncywgZXhwcmVzc2lvbnMpLCBpbnB1dCwgbG9jYXRpb24sIHRoaXMuZXJyb3JzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb25cbiAgICAgICAqIEBwYXJhbSB7Pz19IGludGVycG9sYXRpb25Db25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBhcnNlci5wcm90b3R5cGUuc3BsaXRJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWdleHAgPSBfY3JlYXRlSW50ZXJwb2xhdGVSZWdFeHAoaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBpbnB1dC5zcGxpdChyZWdleHApO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RyaW5ncyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHJlc3Npb25zID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2Zmc2V0cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9mZnNldCA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAvLyBmaXhlZCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBwYXJ0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0LnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW50ZXJwb2xhdGlvbkNvbmZpZy5zdGFydC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcGFydC5sZW5ndGggKyBpbnRlcnBvbGF0aW9uQ29uZmlnLmVuZC5sZW5ndGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcignQmxhbmsgZXhwcmVzc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGludGVycG9sYXRlZCBzdHJpbmdzJywgaW5wdXQsIFwiYXQgY29sdW1uIFwiICsgdGhpcy5fZmluZEludGVycG9sYXRpb25FcnJvckNvbHVtbihwYXJ0cywgaSwgaW50ZXJwb2xhdGlvbkNvbmZpZykgKyBcIiBpblwiLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKCckaW1wbGljdCcpO1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBTcGxpdEludGVycG9sYXRpb24oc3RyaW5ncywgZXhwcmVzc2lvbnMsIG9mZnNldHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS53cmFwTGl0ZXJhbFByaW1pdGl2ZSA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEFTVFdpdGhTb3VyY2UobmV3IExpdGVyYWxQcmltaXRpdmUobmV3IFBhcnNlU3BhbigwLCBpc0JsYW5rKGlucHV0KSA/IDAgOiBpbnB1dC5sZW5ndGgpLCBpbnB1dCksIGlucHV0LCBsb2NhdGlvbiwgdGhpcy5lcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS5fc3RyaXBDb21tZW50cyA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGkgPSB0aGlzLl9jb21tZW50U3RhcnQoaW5wdXQpO1xuICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQoaSkgPyBpbnB1dC5zdWJzdHJpbmcoMCwgaSkudHJpbSgpIDogaW5wdXQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLl9jb21tZW50U3RhcnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRlclF1b3RlID0gbnVsbDtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoYXIgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXh0Q2hhciA9IGlucHV0LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICAgICAgICBpZiAoY2hhciA9PT0gJFNMQVNIICYmIG5leHRDaGFyID09ICRTTEFTSCAmJiBpc0JsYW5rKG91dGVyUXVvdGUpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgIGlmIChvdXRlclF1b3RlID09PSBjaGFyKSB7XG4gICAgICAgICAgICAgICAgICBvdXRlclF1b3RlID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChpc0JsYW5rKG91dGVyUXVvdGUpICYmIGlzUXVvdGUoY2hhcikpIHtcbiAgICAgICAgICAgICAgICAgIG91dGVyUXVvdGUgPSBjaGFyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZXIucHJvdG90eXBlLl9jaGVja05vSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWdleHAgPSBfY3JlYXRlSW50ZXJwb2xhdGVSZWdFeHAoaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBpbnB1dC5zcGxpdChyZWdleHApO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiR290IGludGVycG9sYXRpb24gKFwiICsgaW50ZXJwb2xhdGlvbkNvbmZpZy5zdGFydCArIGludGVycG9sYXRpb25Db25maWcuZW5kICsgXCIpIHdoZXJlIGV4cHJlc3Npb24gd2FzIGV4cGVjdGVkXCIsIGlucHV0LCBcImF0IGNvbHVtbiBcIiArIHRoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIDEsIGludGVycG9sYXRpb25Db25maWcpICsgXCIgaW5cIiwgbG9jYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFydHNcbiAgICAgICAqIEBwYXJhbSB7P30gcGFydEluRXJySWR4XG4gICAgICAgKiBAcGFyYW0gez99IGludGVycG9sYXRpb25Db25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBhcnNlci5wcm90b3R5cGUuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4gPSBmdW5jdGlvbiAocGFydHMsIHBhcnRJbkVycklkeCwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVyckxvY2F0aW9uID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBqID0gMDsgaiA8IHBhcnRJbkVycklkeDsgaisrKSB7XG4gICAgICAgICAgICAgIGVyckxvY2F0aW9uICs9IGogJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICAgIHBhcnRzW2pdIDpcbiAgICAgICAgICAgICAgICAgIFwiXCIgKyBpbnRlcnBvbGF0aW9uQ29uZmlnLnN0YXJ0ICsgcGFydHNbal0gKyBpbnRlcnBvbGF0aW9uQ29uZmlnLmVuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVyckxvY2F0aW9uLmxlbmd0aDtcbiAgICAgIH07XG4gICAgICBQYXJzZXIgPSBfX2RlY29yYXRlJDEoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhJDEoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW0xleGVyXSlcbiAgICAgIF0sIFBhcnNlcik7XG4gICAgICByZXR1cm4gUGFyc2VyO1xuICB9KCkpO1xuICB2YXIgX1BhcnNlQVNUID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlbnNcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRMZW5ndGhcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyc2VBY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKiBAcGFyYW0gez99IG9mZnNldFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfUGFyc2VBU1QoaW5wdXQsIGxvY2F0aW9uLCB0b2tlbnMsIGlucHV0TGVuZ3RoLCBwYXJzZUFjdGlvbiwgZXJyb3JzLCBvZmZzZXQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuICAgICAgICAgIHRoaXMuaW5wdXRMZW5ndGggPSBpbnB1dExlbmd0aDtcbiAgICAgICAgICB0aGlzLnBhcnNlQWN0aW9uID0gcGFyc2VBY3Rpb247XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgdGhpcy5ycGFyZW5zRXhwZWN0ZWQgPSAwO1xuICAgICAgICAgIHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQgPSAwO1xuICAgICAgICAgIHRoaXMucmJyYWNlc0V4cGVjdGVkID0gMDtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICAgICAgICByZXR1cm4gaSA8IHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMudG9rZW5zW2ldIDogRU9GO1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfUGFyc2VBU1QucHJvdG90eXBlLCBcIm5leHRcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnBlZWsoMCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9QYXJzZUFTVC5wcm90b3R5cGUsIFwiaW5wdXRJbmRleFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSA/IHRoaXMubmV4dC5pbmRleCArIHRoaXMub2Zmc2V0IDpcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRMZW5ndGggKyB0aGlzLm9mZnNldDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGFydFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5zcGFuID0gZnVuY3Rpb24gKHN0YXJ0KSB7IHJldHVybiBuZXcgUGFyc2VTcGFuKHN0YXJ0LCB0aGlzLmlucHV0SW5kZXgpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLmFkdmFuY2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMuaW5kZXgrKzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLm9wdGlvbmFsQ2hhcmFjdGVyID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5uZXh0LmlzQ2hhcmFjdGVyKGNvZGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBlZWtLZXl3b3JkTGV0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5uZXh0LmlzS2V5d29yZExldCgpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuZXhwZWN0Q2hhcmFjdGVyID0gZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3Rlcihjb2RlKSlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuZXJyb3IoXCJNaXNzaW5nIGV4cGVjdGVkIFwiICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG9wXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLm9wdGlvbmFsT3BlcmF0b3IgPSBmdW5jdGlvbiAob3ApIHtcbiAgICAgICAgICBpZiAodGhpcy5uZXh0LmlzT3BlcmF0b3Iob3ApKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG9wZXJhdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLmV4cGVjdE9wZXJhdG9yID0gZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcihvcGVyYXRvcikpXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB0aGlzLmVycm9yKFwiTWlzc2luZyBleHBlY3RlZCBvcGVyYXRvciBcIiArIG9wZXJhdG9yKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuID0gdGhpcy5uZXh0O1xuICAgICAgICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSkge1xuICAgICAgICAgICAgICB0aGlzLmVycm9yKFwiVW5leHBlY3RlZCB0b2tlbiBcIiArIG4gKyBcIiwgZXhwZWN0ZWQgaWRlbnRpZmllciBvciBrZXl3b3JkXCIpO1xuICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHJldHVybiBuLnRvU3RyaW5nKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLmV4cGVjdElkZW50aWZpZXJPcktleXdvcmRPclN0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuID0gdGhpcy5uZXh0O1xuICAgICAgICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSAmJiAhbi5pc1N0cmluZygpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuIFwiICsgbiArIFwiLCBleHBlY3RlZCBpZGVudGlmaWVyLCBrZXl3b3JkLCBvciBzdHJpbmdcIik7XG4gICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgcmV0dXJuIG4udG9TdHJpbmcoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VDaGFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHIgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgICAgICAgICBleHBycy5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcignQmluZGluZyBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIGNoYWluZWQgZXhwcmVzc2lvbicpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFNFTUlDT0xPTikpIHtcbiAgICAgICAgICAgICAgICAgIH0gLy8gcmVhZCBhbGwgc2VtaWNvbG9uc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuICdcIiArIHRoaXMubmV4dCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhwcnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFeHByKHRoaXMuc3BhbihzdGFydCkpO1xuICAgICAgICAgIGlmIChleHBycy5sZW5ndGggPT0gMSlcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cHJzWzBdO1xuICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW4odGhpcy5zcGFuKHN0YXJ0KSwgZXhwcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZVBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCd8JykpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoJ0Nhbm5vdCBoYXZlIGEgcGlwZSBpbiBhbiBhY3Rpb24gZXhwcmVzc2lvbicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMSA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTE9OKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5kaW5nUGlwZSh0aGlzLnNwYW4ocmVzdWx0LnNwYW4uc3RhcnQpLCByZXN1bHQsIG5hbWVfMSwgYXJncyk7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignfCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VDb25kaXRpb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbE9yKCk7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPycpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHllcyA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTE9OKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW5kID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvbiA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcIkNvbmRpdGlvbmFsIGV4cHJlc3Npb24gXCIgKyBleHByZXNzaW9uICsgXCIgcmVxdWlyZXMgYWxsIDMgZXhwcmVzc2lvbnNcIik7XG4gICAgICAgICAgICAgICAgICBubyA9IG5ldyBFbXB0eUV4cHIodGhpcy5zcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBubyA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbCh0aGlzLnNwYW4oc3RhcnQpLCByZXN1bHQsIHllcywgbm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlTG9naWNhbE9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICd8fCdcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbEFuZCgpO1xuICAgICAgICAgIHdoaWxlICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJ3x8JykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmlnaHQgPSB0aGlzLnBhcnNlTG9naWNhbEFuZCgpO1xuICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KHRoaXMuc3BhbihyZXN1bHQuc3Bhbi5zdGFydCksICd8fCcsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUxvZ2ljYWxBbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gJyYmJ1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHRoaXMucGFyc2VFcXVhbGl0eSgpO1xuICAgICAgICAgIHdoaWxlICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJyYmJykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmlnaHQgPSB0aGlzLnBhcnNlRXF1YWxpdHkoKTtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSh0aGlzLnNwYW4ocmVzdWx0LnNwYW4uc3RhcnQpLCAnJiYnLCByZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VFcXVhbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyAnPT0nLCchPScsJz09PScsJyE9PSdcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLnBhcnNlUmVsYXRpb25hbCgpO1xuICAgICAgICAgIHdoaWxlICh0aGlzLm5leHQudHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3BlcmF0b3IgPSB0aGlzLm5leHQuc3RyVmFsdWU7XG4gICAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgICBjYXNlICchPSc6XG4gICAgICAgICAgICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJpZ2h0ID0gdGhpcy5wYXJzZVJlbGF0aW9uYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KHRoaXMuc3BhbihyZXN1bHQuc3Bhbi5zdGFydCksIG9wZXJhdG9yLCByZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VSZWxhdGlvbmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICc8JywgJz4nLCAnPD0nLCAnPj0nXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5wYXJzZUFkZGl0aXZlKCk7XG4gICAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZS5PcGVyYXRvcikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcGVyYXRvciA9IHRoaXMubmV4dC5zdHJWYWx1ZTtcbiAgICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByaWdodCA9IHRoaXMucGFyc2VBZGRpdGl2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgb3BlcmF0b3IsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUFkZGl0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICcrJywgJy0nXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5wYXJzZU11bHRpcGxpY2F0aXZlKCk7XG4gICAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZS5PcGVyYXRvcikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcGVyYXRvciA9IHRoaXMubmV4dC5zdHJWYWx1ZTtcbiAgICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByaWdodCA9IHRoaXMucGFyc2VNdWx0aXBsaWNhdGl2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgb3BlcmF0b3IsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZU11bHRpcGxpY2F0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vICcqJywgJyUnLCAnLydcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZS5PcGVyYXRvcikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcGVyYXRvciA9IHRoaXMubmV4dC5zdHJWYWx1ZTtcbiAgICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJpZ2h0ID0gdGhpcy5wYXJzZVByZWZpeCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgb3BlcmF0b3IsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZVByZWZpeCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5uZXh0LnR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcGVyYXRvciA9IHRoaXMubmV4dC5zdHJWYWx1ZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVByZWZpeCgpO1xuICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZVByZWZpeCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5KHRoaXMuc3BhbihzdGFydCksIG9wZXJhdG9yLCBuZXcgTGl0ZXJhbFByaW1pdGl2ZShuZXcgUGFyc2VTcGFuKHN0YXJ0LCBzdGFydCksIDApLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZVByZWZpeCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZml4Tm90KHRoaXMuc3BhbihzdGFydCksIHJlc3VsdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDYWxsQ2hhaW4oKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VDYWxsQ2hhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5wYXJzZVByaW1hcnkoKTtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkUEVSSU9EKSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz8uJykpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRMQlJBQ0tFVCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQrKztcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJicmFja2V0c0V4cGVjdGVkLS07XG4gICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNLRVQpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgS2V5ZWRXcml0ZSh0aGlzLnNwYW4ocmVzdWx0LnNwYW4uc3RhcnQpLCByZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEtleWVkUmVhZCh0aGlzLnNwYW4ocmVzdWx0LnNwYW4uc3RhcnQpLCByZXN1bHQsIGtleSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTFBBUkVOKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5ycGFyZW5zRXhwZWN0ZWQrKztcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFyZ3MgPSB0aGlzLnBhcnNlQ2FsbEFyZ3VtZW50cygpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5ycGFyZW5zRXhwZWN0ZWQtLTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSUEFSRU4pO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEZ1bmN0aW9uQ2FsbCh0aGlzLnNwYW4ocmVzdWx0LnNwYW4uc3RhcnQpLCByZXN1bHQsIGFyZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VQcmltYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRMUEFSRU4pKSB7XG4gICAgICAgICAgICAgIHRoaXMucnBhcmVuc0V4cGVjdGVkKys7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICAgIHRoaXMucnBhcmVuc0V4cGVjdGVkLS07XG4gICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSUEFSRU4pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQuaXNLZXl3b3JkTnVsbCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodGhpcy5zcGFuKHN0YXJ0KSwgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmRVbmRlZmluZWQoKSkge1xuICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKHRoaXMuc3BhbihzdGFydCksIHZvaWQgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmRUcnVlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0aGlzLnNwYW4oc3RhcnQpLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5uZXh0LmlzS2V5d29yZEZhbHNlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0aGlzLnNwYW4oc3RhcnQpLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmRUaGlzKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSW1wbGljaXRSZWNlaXZlcih0aGlzLnNwYW4oc3RhcnQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTEJSQUNLRVQpKSB7XG4gICAgICAgICAgICAgIHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQrKztcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbkxpc3QoJFJCUkFDS0VUKTtcbiAgICAgICAgICAgICAgdGhpcy5yYnJhY2tldHNFeHBlY3RlZC0tO1xuICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNLRVQpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheSh0aGlzLnNwYW4oc3RhcnQpLCBlbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkTEJSQUNFKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWxNYXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5uZXh0LmlzSWRlbnRpZmllcigpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlQWNjZXNzTWVtYmVyT3JNZXRob2RDYWxsKG5ldyBJbXBsaWNpdFJlY2VpdmVyKHRoaXMuc3BhbihzdGFydCkpLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc051bWJlcigpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gdGhpcy5uZXh0LnRvTnVtYmVyKCk7XG4gICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodGhpcy5zcGFuKHN0YXJ0KSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXRlcmFsVmFsdWUgPSB0aGlzLm5leHQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0aGlzLnNwYW4oc3RhcnQpLCBsaXRlcmFsVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmVycm9yKFwiVW5leHBlY3RlZCBlbmQgb2YgZXhwcmVzc2lvbjogXCIgKyB0aGlzLmlucHV0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUV4cHIodGhpcy5zcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVycm9yKFwiVW5leHBlY3RlZCB0b2tlbiBcIiArIHRoaXMubmV4dCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFeHByKHRoaXMuc3BhbihzdGFydCkpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGVybWluYXRvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUV4cHJlc3Npb25MaXN0ID0gZnVuY3Rpb24gKHRlcm1pbmF0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBbXTtcbiAgICAgICAgICBpZiAoIXRoaXMubmV4dC5pc0NoYXJhY3Rlcih0ZXJtaW5hdG9yKSkge1xuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnBhcnNlUGlwZSgpKTtcbiAgICAgICAgICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09NTUEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VMaXRlcmFsTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkTEJSQUNFKTtcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFJCUkFDRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5yYnJhY2VzRXhwZWN0ZWQrKztcbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJENPTE9OKTtcbiAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgICAgICAgICAgICB9IHdoaWxlICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT01NQSkpO1xuICAgICAgICAgICAgICB0aGlzLnJicmFjZXNFeHBlY3RlZC0tO1xuICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNFKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwKHRoaXMuc3BhbihzdGFydCksIGtleXMsIHZhbHVlcyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez89fSBpc1NhZmVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwgPSBmdW5jdGlvbiAocmVjZWl2ZXIsIGlzU2FmZSkge1xuICAgICAgICAgIGlmIChpc1NhZmUgPT09IHZvaWQgMCkgeyBpc1NhZmUgPSBmYWxzZTsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gcmVjZWl2ZXIuc3Bhbi5zdGFydDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZCA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpO1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRMUEFSRU4pKSB7XG4gICAgICAgICAgICAgIHRoaXMucnBhcmVuc0V4cGVjdGVkKys7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFyZ3MgPSB0aGlzLnBhcnNlQ2FsbEFyZ3VtZW50cygpO1xuICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUlBBUkVOKTtcbiAgICAgICAgICAgICAgdGhpcy5ycGFyZW5zRXhwZWN0ZWQtLTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3BhbiA9IHRoaXMuc3BhbihzdGFydCk7XG4gICAgICAgICAgICAgIHJldHVybiBpc1NhZmUgPyBuZXcgU2FmZU1ldGhvZENhbGwoc3BhbiwgcmVjZWl2ZXIsIGlkLCBhcmdzKSA6XG4gICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbChzcGFuLCByZWNlaXZlciwgaWQsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGlzU2FmZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcignVGhlIFxcJz8uXFwnIG9wZXJhdG9yIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBhc3NpZ25tZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUV4cHIodGhpcy5zcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhZmVQcm9wZXJ0eVJlYWQodGhpcy5zcGFuKHN0YXJ0KSwgcmVjZWl2ZXIsIGlkKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZUFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKCdCaW5kaW5ncyBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RXhwcih0aGlzLnNwYW4oc3RhcnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5V3JpdGUodGhpcy5zcGFuKHN0YXJ0KSwgcmVjZWl2ZXIsIGlkLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5UmVhZCh0aGlzLnNwYW4oc3RhcnQpLCByZWNlaXZlciwgaWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUNhbGxBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkUlBBUkVOKSlcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBvc2l0aW9uYWxzID0gW107XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBwb3NpdGlvbmFscy5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgICAgICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgICAgICAgcmV0dXJuIChwb3NpdGlvbmFscyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgQW4gaWRlbnRpZmllciwgYSBrZXl3b3JkLCBhIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsIGAtYCBpbmJldHdlZW4uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUGFyc2VBU1QucHJvdG90eXBlLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSAnJztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcGVyYXRvckZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmcoKTtcbiAgICAgICAgICAgICAgb3BlcmF0b3JGb3VuZCA9IHRoaXMub3B0aW9uYWxPcGVyYXRvcignLScpO1xuICAgICAgICAgICAgICBpZiAob3BlcmF0b3JGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICctJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKG9wZXJhdG9yRm91bmQpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUJpbmRpbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJpbmRpbmdzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlZml4ID0gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3YXJuaW5ncyA9IFtdO1xuICAgICAgICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlJc1ZhciA9IHRoaXMucGVla0tleXdvcmRMZXQoKTtcbiAgICAgICAgICAgICAgaWYgKGtleUlzVmFyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXkgPSB0aGlzLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSgpO1xuICAgICAgICAgICAgICBpZiAoIWtleUlzVmFyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBrZXk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwcmVmaXggKyBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09MT04pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lXzIgPSBudWxsO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGtleUlzVmFyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lXzIgPSB0aGlzLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZV8yID0gJ1xcJGltcGxpY2l0JztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQgIT09IEVPRiAmJiAhdGhpcy5wZWVrS2V5d29yZExldCgpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydF8xID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gdGhpcy5wYXJzZVBpcGUoKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0XzEgLSB0aGlzLm9mZnNldCwgdGhpcy5pbnB1dEluZGV4IC0gdGhpcy5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IG5ldyBBU1RXaXRoU291cmNlKGFzdCwgc291cmNlLCB0aGlzLmxvY2F0aW9uLCB0aGlzLmVycm9ycyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYmluZGluZ3MucHVzaChuZXcgVGVtcGxhdGVCaW5kaW5nKHRoaXMuc3BhbihzdGFydCksIGtleSwga2V5SXNWYXIsIG5hbWVfMiwgZXhwcmVzc2lvbikpO1xuICAgICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFNFTUlDT0xPTikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlQmluZGluZ1BhcnNlUmVzdWx0KGJpbmRpbmdzLCB3YXJuaW5ncywgdGhpcy5lcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcGFyYW0gez89fSBpbmRleFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1BhcnNlQVNULnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBpbmRleCkge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gbnVsbDsgfVxuICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFBhcnNlckVycm9yKG1lc3NhZ2UsIHRoaXMuaW5wdXQsIHRoaXMubG9jYXRpb25UZXh0KGluZGV4KSwgdGhpcy5sb2NhdGlvbikpO1xuICAgICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUubG9jYXRpb25UZXh0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHsgaW5kZXggPSBudWxsOyB9XG4gICAgICAgICAgaWYgKGlzQmxhbmsoaW5kZXgpKVxuICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgcmV0dXJuIChpbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkgPyBcImF0IGNvbHVtbiBcIiArICh0aGlzLnRva2Vuc1tpbmRleF0uaW5kZXggKyAxKSArIFwiIGluXCIgOlxuICAgICAgICAgICAgICBcImF0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb25cIjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuID0gdGhpcy5uZXh0O1xuICAgICAgICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoICYmICFuLmlzQ2hhcmFjdGVyKCRTRU1JQ09MT04pICYmXG4gICAgICAgICAgICAgICh0aGlzLnJwYXJlbnNFeHBlY3RlZCA8PSAwIHx8ICFuLmlzQ2hhcmFjdGVyKCRSUEFSRU4pKSAmJlxuICAgICAgICAgICAgICAodGhpcy5yYnJhY2VzRXhwZWN0ZWQgPD0gMCB8fCAhbi5pc0NoYXJhY3RlcigkUkJSQUNFKSkgJiZcbiAgICAgICAgICAgICAgKHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQgPD0gMCB8fCAhbi5pc0NoYXJhY3RlcigkUkJSQUNLRVQpKSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0LmlzRXJyb3IoKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2VyRXJyb3IodGhpcy5uZXh0LnRvU3RyaW5nKCksIHRoaXMuaW5wdXQsIHRoaXMubG9jYXRpb25UZXh0KCksIHRoaXMubG9jYXRpb24pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgbiA9IHRoaXMubmV4dDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9QYXJzZUFTVDtcbiAgfSgpKTtcbiAgdmFyIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyKCkge1xuICAgICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5jaGVjayA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gbmV3IFNpbXBsZUV4cHJlc3Npb25DaGVja2VyKCk7XG4gICAgICAgICAgYXN0LnZpc2l0KHMpO1xuICAgICAgICAgIHJldHVybiBzLmVycm9ycztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEltcGxpY2l0UmVjZWl2ZXIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdFByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0UHJvcGVydHlXcml0ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0TWV0aG9kQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0U2FmZU1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdExpdGVyYWxNYXAgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHRoaXMudmlzaXRBbGwoYXN0LnZhbHVlcyk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0UHJlZml4Tm90ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0UGlwZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgdGhpcy5lcnJvcnMucHVzaCgncGlwZXMnKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRLZXllZFdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEFsbCA9IGZ1bmN0aW9uIChhc3RzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gYXN0cy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdENoYWluID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRRdW90ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICAgIHJldHVybiBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlcjtcbiAgfSgpKTtcblxuICB2YXIgUGFyc2VMb2NhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZmlsZVxuICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRcbiAgICAgICAqIEBwYXJhbSB7P30gbGluZVxuICAgICAgICogQHBhcmFtIHs/fSBjb2xcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUGFyc2VMb2NhdGlvbihmaWxlLCBvZmZzZXQsIGxpbmUsIGNvbCkge1xuICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgdGhpcy5saW5lID0gbGluZTtcbiAgICAgICAgICB0aGlzLmNvbCA9IGNvbDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VMb2NhdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLm9mZnNldCkgPyB0aGlzLmZpbGUudXJsICsgXCJAXCIgKyB0aGlzLmxpbmUgKyBcIjpcIiArIHRoaXMuY29sIDogdGhpcy5maWxlLnVybDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVsdGFcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBhcnNlTG9jYXRpb24ucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkZWx0YSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZSA9IHRoaXMuZmlsZS5jb250ZW50O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxlbiA9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGluZSA9IHRoaXMubGluZTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb2wgPSB0aGlzLmNvbDtcbiAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gMCAmJiBkZWx0YSA8IDApIHtcbiAgICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICAgIGRlbHRhKys7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgICAgICAgaWYgKGNoID09ICRMRikge1xuICAgICAgICAgICAgICAgICAgbGluZS0tO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJpb3JMaW5lID0gc291cmNlLnN1YnN0cigwLCBvZmZzZXQgLSAxKS5sYXN0SW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKCRMRikpO1xuICAgICAgICAgICAgICAgICAgY29sID0gcHJpb3JMaW5lID4gMCA/IG9mZnNldCAtIHByaW9yTGluZSA6IG9mZnNldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbC0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW4gJiYgZGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgIGRlbHRhLS07XG4gICAgICAgICAgICAgIGlmIChjaCA9PSAkTEYpIHtcbiAgICAgICAgICAgICAgICAgIGxpbmUrKztcbiAgICAgICAgICAgICAgICAgIGNvbCA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb2wrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlTG9jYXRpb24odGhpcy5maWxlLCBvZmZzZXQsIGxpbmUsIGNvbCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFBhcnNlTG9jYXRpb247XG4gIH0oKSk7XG4gIHZhciBQYXJzZVNvdXJjZUZpbGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRlbnRcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFBhcnNlU291cmNlRmlsZShjb250ZW50LCB1cmwpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFBhcnNlU291cmNlRmlsZTtcbiAgfSgpKTtcbiAgdmFyIFBhcnNlU291cmNlU3BhbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRcbiAgICAgICAqIEBwYXJhbSB7P30gZW5kXG4gICAgICAgKiBAcGFyYW0gez89fSBkZXRhaWxzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFBhcnNlU291cmNlU3BhbihzdGFydCwgZW5kLCBkZXRhaWxzKSB7XG4gICAgICAgICAgaWYgKGRldGFpbHMgPT09IHZvaWQgMCkgeyBkZXRhaWxzID0gbnVsbDsgfVxuICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQYXJzZVNvdXJjZVNwYW4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0LmZpbGUuY29udGVudC5zdWJzdHJpbmcodGhpcy5zdGFydC5vZmZzZXQsIHRoaXMuZW5kLm9mZnNldCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFBhcnNlU291cmNlU3BhbjtcbiAgfSgpKTtcbiAgdmFyIFBhcnNlRXJyb3JMZXZlbCA9IHt9O1xuICBQYXJzZUVycm9yTGV2ZWwuV0FSTklORyA9IDA7XG4gIFBhcnNlRXJyb3JMZXZlbC5GQVRBTCA9IDE7XG4gIFBhcnNlRXJyb3JMZXZlbFtQYXJzZUVycm9yTGV2ZWwuV0FSTklOR10gPSBcIldBUk5JTkdcIjtcbiAgUGFyc2VFcnJvckxldmVsW1BhcnNlRXJyb3JMZXZlbC5GQVRBTF0gPSBcIkZBVEFMXCI7XG4gIHZhciBQYXJzZUVycm9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IG1zZ1xuICAgICAgICogQHBhcmFtIHs/PX0gbGV2ZWxcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUGFyc2VFcnJvcihzcGFuLCBtc2csIGxldmVsKSB7XG4gICAgICAgICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSBQYXJzZUVycm9yTGV2ZWwuRkFUQUw7IH1cbiAgICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICAgIHRoaXMubXNnID0gbXNnO1xuICAgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlID0gdGhpcy5zcGFuLnN0YXJ0LmZpbGUuY29udGVudDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHhTdGFydCA9IHRoaXMuc3Bhbi5zdGFydC5vZmZzZXQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGV4dFN0ciA9ICcnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRldGFpbHMgPSAnJztcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGN0eFN0YXJ0KSkge1xuICAgICAgICAgICAgICBpZiAoY3R4U3RhcnQgPiBzb3VyY2UubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgY3R4U3RhcnQgPSBzb3VyY2UubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHhFbmQgPSBjdHhTdGFydDtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3R4TGVuID0gMDtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3R4TGluZXMgPSAwO1xuICAgICAgICAgICAgICB3aGlsZSAoY3R4TGVuIDwgMTAwICYmIGN0eFN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgY3R4U3RhcnQtLTtcbiAgICAgICAgICAgICAgICAgIGN0eExlbisrO1xuICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVtjdHhTdGFydF0gPT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoKytjdHhMaW5lcyA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdHhMZW4gPSAwO1xuICAgICAgICAgICAgICBjdHhMaW5lcyA9IDA7XG4gICAgICAgICAgICAgIHdoaWxlIChjdHhMZW4gPCAxMDAgJiYgY3R4RW5kIDwgc291cmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgIGN0eEVuZCsrO1xuICAgICAgICAgICAgICAgICAgY3R4TGVuKys7XG4gICAgICAgICAgICAgICAgICBpZiAoc291cmNlW2N0eEVuZF0gPT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoKytjdHhMaW5lcyA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250ZXh0ID0gc291cmNlLnN1YnN0cmluZyhjdHhTdGFydCwgdGhpcy5zcGFuLnN0YXJ0Lm9mZnNldCkgKyAnW0VSUk9SIC0+XScgK1xuICAgICAgICAgICAgICAgICAgc291cmNlLnN1YnN0cmluZyh0aGlzLnNwYW4uc3RhcnQub2Zmc2V0LCBjdHhFbmQgKyAxKTtcbiAgICAgICAgICAgICAgY29udGV4dFN0ciA9IFwiIChcXFwiXCIgKyBjb250ZXh0ICsgXCJcXFwiKVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5zcGFuLmRldGFpbHMpIHtcbiAgICAgICAgICAgICAgZGV0YWlscyA9IFwiLCBcIiArIHRoaXMuc3Bhbi5kZXRhaWxzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCJcIiArIHRoaXMubXNnICsgY29udGV4dFN0ciArIFwiOiBcIiArIHRoaXMuc3Bhbi5zdGFydCArIGRldGFpbHM7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFBhcnNlRXJyb3I7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgVGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUZXh0KHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZXh0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBUZXh0O1xuICB9KCkpO1xuICB2YXIgRXhwYW5zaW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzd2l0Y2hWYWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IGNhc2VzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gc3dpdGNoVmFsdWVTb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEV4cGFuc2lvbihzd2l0Y2hWYWx1ZSwgdHlwZSwgY2FzZXMsIHNvdXJjZVNwYW4sIHN3aXRjaFZhbHVlU291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMuc3dpdGNoVmFsdWUgPSBzd2l0Y2hWYWx1ZTtcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuc3dpdGNoVmFsdWVTb3VyY2VTcGFuID0gc3dpdGNoVmFsdWVTb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwYW5zaW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RXhwYW5zaW9uKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgICAgcmV0dXJuIEV4cGFuc2lvbjtcbiAgfSgpKTtcbiAgdmFyIEV4cGFuc2lvbkNhc2UgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IGV4cHJlc3Npb25cbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gZXhwU291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBFeHBhbnNpb25DYXNlKHZhbHVlLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCB2YWx1ZVNvdXJjZVNwYW4sIGV4cFNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMudmFsdWVTb3VyY2VTcGFuID0gdmFsdWVTb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuZXhwU291cmNlU3BhbiA9IGV4cFNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHBhbnNpb25DYXNlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RXhwYW5zaW9uQ2FzZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBFeHBhbnNpb25DYXNlO1xuICB9KCkpO1xuICB2YXIgQXR0cmlidXRlJDEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/PX0gdmFsdWVTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgc291cmNlU3BhbiwgdmFsdWVTcGFuKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgICB0aGlzLnZhbHVlU3BhbiA9IHZhbHVlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEF0dHJpYnV0ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEF0dHJpYnV0ZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBBdHRyaWJ1dGU7XG4gIH0oKSk7XG4gIHZhciBFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IGNoaWxkcmVuXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRTb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IGVuZFNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRWxlbWVudChuYW1lLCBhdHRycywgY2hpbGRyZW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuc3RhcnRTb3VyY2VTcGFuID0gc3RhcnRTb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuZW5kU291cmNlU3BhbiA9IGVuZFNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbGVtZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RWxlbWVudCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBFbGVtZW50O1xuICB9KCkpO1xuICB2YXIgQ29tbWVudCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21tZW50KHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21tZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0Q29tbWVudCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBDb21tZW50O1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRBbGwodmlzaXRvciwgbm9kZXMsIGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXQgPSB2aXNpdG9yLnZpc2l0ID9cbiAgICAgICAgICBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0KGFzdCwgY29udGV4dCkgfHwgYXN0LnZpc2l0KHZpc2l0b3IsIGNvbnRleHQpOyB9IDpcbiAgICAgICAgICBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBhc3QudmlzaXQodmlzaXRvciwgY29udGV4dCk7IH07XG4gICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3RSZXN1bHQgPSB2aXNpdChhc3QpO1xuICAgICAgICAgIGlmIChhc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYXN0UmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkNiA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIFRva2VuVHlwZSQxID0ge307XG4gIFRva2VuVHlwZSQxLlRBR19PUEVOX1NUQVJUID0gMDtcbiAgVG9rZW5UeXBlJDEuVEFHX09QRU5fRU5EID0gMTtcbiAgVG9rZW5UeXBlJDEuVEFHX09QRU5fRU5EX1ZPSUQgPSAyO1xuICBUb2tlblR5cGUkMS5UQUdfQ0xPU0UgPSAzO1xuICBUb2tlblR5cGUkMS5URVhUID0gNDtcbiAgVG9rZW5UeXBlJDEuRVNDQVBBQkxFX1JBV19URVhUID0gNTtcbiAgVG9rZW5UeXBlJDEuUkFXX1RFWFQgPSA2O1xuICBUb2tlblR5cGUkMS5DT01NRU5UX1NUQVJUID0gNztcbiAgVG9rZW5UeXBlJDEuQ09NTUVOVF9FTkQgPSA4O1xuICBUb2tlblR5cGUkMS5DREFUQV9TVEFSVCA9IDk7XG4gIFRva2VuVHlwZSQxLkNEQVRBX0VORCA9IDEwO1xuICBUb2tlblR5cGUkMS5BVFRSX05BTUUgPSAxMTtcbiAgVG9rZW5UeXBlJDEuQVRUUl9WQUxVRSA9IDEyO1xuICBUb2tlblR5cGUkMS5ET0NfVFlQRSA9IDEzO1xuICBUb2tlblR5cGUkMS5FWFBBTlNJT05fRk9STV9TVEFSVCA9IDE0O1xuICBUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9WQUxVRSA9IDE1O1xuICBUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9FWFBfU1RBUlQgPSAxNjtcbiAgVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0NBU0VfRVhQX0VORCA9IDE3O1xuICBUb2tlblR5cGUkMS5FWFBBTlNJT05fRk9STV9FTkQgPSAxODtcbiAgVG9rZW5UeXBlJDEuRU9GID0gMTk7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLlRBR19PUEVOX1NUQVJUXSA9IFwiVEFHX09QRU5fU1RBUlRcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuVEFHX09QRU5fRU5EXSA9IFwiVEFHX09QRU5fRU5EXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLlRBR19PUEVOX0VORF9WT0lEXSA9IFwiVEFHX09QRU5fRU5EX1ZPSURcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuVEFHX0NMT1NFXSA9IFwiVEFHX0NMT1NFXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLlRFWFRdID0gXCJURVhUXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkVTQ0FQQUJMRV9SQVdfVEVYVF0gPSBcIkVTQ0FQQUJMRV9SQVdfVEVYVFwiO1xuICBUb2tlblR5cGUkMVtUb2tlblR5cGUkMS5SQVdfVEVYVF0gPSBcIlJBV19URVhUXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkNPTU1FTlRfU1RBUlRdID0gXCJDT01NRU5UX1NUQVJUXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkNPTU1FTlRfRU5EXSA9IFwiQ09NTUVOVF9FTkRcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuQ0RBVEFfU1RBUlRdID0gXCJDREFUQV9TVEFSVFwiO1xuICBUb2tlblR5cGUkMVtUb2tlblR5cGUkMS5DREFUQV9FTkRdID0gXCJDREFUQV9FTkRcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuQVRUUl9OQU1FXSA9IFwiQVRUUl9OQU1FXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkFUVFJfVkFMVUVdID0gXCJBVFRSX1ZBTFVFXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkRPQ19UWVBFXSA9IFwiRE9DX1RZUEVcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0ZPUk1fU1RBUlRdID0gXCJFWFBBTlNJT05fRk9STV9TVEFSVFwiO1xuICBUb2tlblR5cGUkMVtUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9WQUxVRV0gPSBcIkVYUEFOU0lPTl9DQVNFX1ZBTFVFXCI7XG4gIFRva2VuVHlwZSQxW1Rva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVF0gPSBcIkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVFwiO1xuICBUb2tlblR5cGUkMVtUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9FWFBfRU5EXSA9IFwiRVhQQU5TSU9OX0NBU0VfRVhQX0VORFwiO1xuICBUb2tlblR5cGUkMVtUb2tlblR5cGUkMS5FWFBBTlNJT05fRk9STV9FTkRdID0gXCJFWFBBTlNJT05fRk9STV9FTkRcIjtcbiAgVG9rZW5UeXBlJDFbVG9rZW5UeXBlJDEuRU9GXSA9IFwiRU9GXCI7XG4gIHZhciBUb2tlbiQxID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcnRzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVG9rZW4odHlwZSwgcGFydHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgIHRoaXMucGFydHMgPSBwYXJ0cztcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFRva2VuO1xuICB9KCkpO1xuICB2YXIgVG9rZW5FcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNihUb2tlbkVycm9yLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yTXNnXG4gICAgICAgKiBAcGFyYW0gez99IHRva2VuVHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRva2VuRXJyb3IoZXJyb3JNc2csIHRva2VuVHlwZSwgc3Bhbikge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHNwYW4sIGVycm9yTXNnKTtcbiAgICAgICAgICB0aGlzLnRva2VuVHlwZSA9IHRva2VuVHlwZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBUb2tlbkVycm9yO1xuICB9KFBhcnNlRXJyb3IpKTtcbiAgdmFyIFRva2VuaXplUmVzdWx0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlbnNcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRva2VuaXplUmVzdWx0KHRva2VucywgZXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gVG9rZW5pemVSZXN1bHQ7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNvdXJjZVxuICAgKiBAcGFyYW0gez99IHVybFxuICAgKiBAcGFyYW0gez99IGdldFRhZ0RlZmluaXRpb25cbiAgICogQHBhcmFtIHs/PX0gdG9rZW5pemVFeHBhbnNpb25Gb3Jtc1xuICAgKiBAcGFyYW0gez89fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZShzb3VyY2UsIHVybCwgZ2V0VGFnRGVmaW5pdGlvbiwgdG9rZW5pemVFeHBhbnNpb25Gb3JtcywgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgaWYgKHRva2VuaXplRXhwYW5zaW9uRm9ybXMgPT09IHZvaWQgMCkgeyB0b2tlbml6ZUV4cGFuc2lvbkZvcm1zID0gZmFsc2U7IH1cbiAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgIHJldHVybiBuZXcgX1Rva2VuaXplcihuZXcgUGFyc2VTb3VyY2VGaWxlKHNvdXJjZSwgdXJsKSwgZ2V0VGFnRGVmaW5pdGlvbiwgdG9rZW5pemVFeHBhbnNpb25Gb3JtcywgaW50ZXJwb2xhdGlvbkNvbmZpZylcbiAgICAgICAgICAudG9rZW5pemUoKTtcbiAgfVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfQ1JfT1JfQ1JMRl9SRUdFWFAgPSAvXFxyXFxuPy9nO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBjaGFyQ29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3VuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyhjaGFyQ29kZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hhciA9IGNoYXJDb2RlID09PSAkRU9GID8gJ0VPRicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgICAgIHJldHVybiBcIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIFxcXCJcIiArIGNoYXIgKyBcIlxcXCJcIjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbnRpdHlTcmNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF91bmtub3duRW50aXR5RXJyb3JNc2coZW50aXR5U3JjKSB7XG4gICAgICByZXR1cm4gXCJVbmtub3duIGVudGl0eSBcXFwiXCIgKyBlbnRpdHlTcmMgKyBcIlxcXCIgLSB1c2UgdGhlIFxcXCImIzxkZWNpbWFsPjtcXFwiIG9yICBcXFwiJiN4PGhleD47XFxcIiBzeW50YXhcIjtcbiAgfVxuICB2YXIgX0NvbnRyb2xGbG93RXJyb3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9Db250cm9sRmxvd0Vycm9yKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9Db250cm9sRmxvd0Vycm9yO1xuICB9KCkpO1xuICAvLyBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUxL3N5bnRheC5odG1sI3dyaXRpbmdcbiAgdmFyIF9Ub2tlbml6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9maWxlIFRoZSBodG1sIHNvdXJjZVxuICAgICAgICogQHBhcmFtIHs/fSBfZ2V0VGFnRGVmaW5pdGlvblxuICAgICAgICogQHBhcmFtIHs/fSBfdG9rZW5pemVJY3UgV2hldGhlciB0byB0b2tlbml6ZSBJQ1UgbWVzc2FnZXMgKGNvbnNpZGVyZWQgYXMgdGV4dCBub2RlcyB3aGVuIGZhbHNlKVxuICAgICAgICogQHBhcmFtIHs/PX0gX2ludGVycG9sYXRpb25Db25maWdcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX1Rva2VuaXplcihfZmlsZSwgX2dldFRhZ0RlZmluaXRpb24sIF90b2tlbml6ZUljdSwgX2ludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICBpZiAoX2ludGVycG9sYXRpb25Db25maWcgPT09IHZvaWQgMCkgeyBfaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgICB0aGlzLl9maWxlID0gX2ZpbGU7XG4gICAgICAgICAgdGhpcy5fZ2V0VGFnRGVmaW5pdGlvbiA9IF9nZXRUYWdEZWZpbml0aW9uO1xuICAgICAgICAgIHRoaXMuX3Rva2VuaXplSWN1ID0gX3Rva2VuaXplSWN1O1xuICAgICAgICAgIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgPSBfaW50ZXJwb2xhdGlvbkNvbmZpZztcbiAgICAgICAgICB0aGlzLl9wZWVrID0gLTE7XG4gICAgICAgICAgdGhpcy5fbmV4dFBlZWsgPSAtMTtcbiAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgIHRoaXMuX2xpbmUgPSAwO1xuICAgICAgICAgIHRoaXMuX2NvbHVtbiA9IC0xO1xuICAgICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuX2luSW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9pbnB1dCA9IF9maWxlLmNvbnRlbnQ7XG4gICAgICAgICAgdGhpcy5fbGVuZ3RoID0gX2ZpbGUuY29udGVudC5sZW5ndGg7XG4gICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbiAgICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpbiB0aGUgc291cmNlLCB3ZSBjYW4gbm90XG4gICAgICAgICAgLy8gcHJlLXByb2Nlc3MgaXQuXG4gICAgICAgICAgLy8gSW5zdGVhZCBDUnMgYXJlIHByb2Nlc3NlZCByaWdodCBiZWZvcmUgaW5zdGFudGlhdGluZyB0aGUgdG9rZW5zLlxuICAgICAgICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoX0NSX09SX0NSTEZfUkVHRVhQLCAnXFxuJyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB3aGlsZSAodGhpcy5fcGVlayAhPT0gJEVPRikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRMVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRCQU5HKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRMQlJBQ0tFVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDZGF0YShzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRNSU5VUykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDb21tZW50KHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVEb2NUeXBlKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9hdHRlbXB0Q2hhckNvZGUoJFNMQVNIKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lVGFnQ2xvc2Uoc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZVRhZ09wZW4oc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEodGhpcy5fdG9rZW5pemVJY3UgJiYgdGhpcy5fdG9rZW5pemVFeHBhbnNpb25Gb3JtKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZVRleHQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfQ29udHJvbEZsb3dFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuRU9GKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbml6ZVJlc3VsdChtZXJnZVRleHRUb2tlbnModGhpcy50b2tlbnMpLCB0aGlzLmVycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fdG9rZW5pemVFeHBhbnNpb25Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpc0V4cGFuc2lvbkZvcm1TdGFydCh0aGlzLl9pbnB1dCwgdGhpcy5faW5kZXgsIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVFeHBhbnNpb25Gb3JtU3RhcnQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0V4cGFuc2lvbkNhc2VTdGFydCh0aGlzLl9wZWVrKSAmJiB0aGlzLl9pc0luRXhwYW5zaW9uRm9ybSgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVFeHBhbnNpb25DYXNlU3RhcnQoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZWVrID09PSAkUkJSQUNFKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9pc0luRXhwYW5zaW9uQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lRXhwYW5zaW9uQ2FzZUVuZCgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5FeHBhbnNpb25Gb3JtKCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVFeHBhbnNpb25Gb3JtRW5kKCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZUxvY2F0aW9uKHRoaXMuX2ZpbGUsIHRoaXMuX2luZGV4LCB0aGlzLl9saW5lLCB0aGlzLl9jb2x1bW4pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gc3RhcnRcbiAgICAgICAqIEBwYXJhbSB7Pz19IGVuZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2dldFNwYW4gPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7IHN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTsgfVxuICAgICAgICAgIGlmIChlbmQgPT09IHZvaWQgMCkgeyBlbmQgPSB0aGlzLl9nZXRMb2NhdGlvbigpOyB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVNvdXJjZVNwYW4oc3RhcnQsIGVuZCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYmVnaW5Ub2tlbiA9IGZ1bmN0aW9uICh0eXBlLCBzdGFydCkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7IHN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTsgfVxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb2tlblN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFRva2VuVHlwZSA9IHR5cGU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcnRzXG4gICAgICAgKiBAcGFyYW0gez89fSBlbmRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9lbmRUb2tlbiA9IGZ1bmN0aW9uIChwYXJ0cywgZW5kKSB7XG4gICAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IHRoaXMuX2dldExvY2F0aW9uKCk7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlbiA9IG5ldyBUb2tlbiQxKHRoaXMuX2N1cnJlbnRUb2tlblR5cGUsIHBhcnRzLCBuZXcgUGFyc2VTb3VyY2VTcGFuKHRoaXMuX2N1cnJlbnRUb2tlblN0YXJ0LCBlbmQpKTtcbiAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW5TdGFydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtc2dcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NyZWF0ZUVycm9yID0gZnVuY3Rpb24gKG1zZywgc3Bhbikge1xuICAgICAgICAgIGlmICh0aGlzLl9pc0luRXhwYW5zaW9uRm9ybSgpKSB7XG4gICAgICAgICAgICAgIG1zZyArPSBcIiAoRG8geW91IGhhdmUgYW4gdW5lc2NhcGVkIFxcXCJ7XFxcIiBpbiB5b3VyIHRlbXBsYXRlPyBVc2UgXFxcInt7ICd7JyB9fVxcXCIpIHRvIGVzY2FwZSBpdC4pXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9yID0gbmV3IFRva2VuRXJyb3IobXNnLCB0aGlzLl9jdXJyZW50VG9rZW5UeXBlLCBzcGFuKTtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW5TdGFydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG5ldyBfQ29udHJvbEZsb3dFcnJvcihlcnJvcik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2coJEVPRiksIHRoaXMuX2dldFNwYW4oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZWVrID09PSAkTEYpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbGluZSsrO1xuICAgICAgICAgICAgICB0aGlzLl9jb2x1bW4gPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrICE9PSAkTEYgJiYgdGhpcy5fcGVlayAhPT0gJENSKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbHVtbisrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgIHRoaXMuX3BlZWsgPSB0aGlzLl9pbmRleCA+PSB0aGlzLl9sZW5ndGggPyAkRU9GIDogdGhpcy5faW5wdXQuY2hhckNvZGVBdCh0aGlzLl9pbmRleCk7XG4gICAgICAgICAgdGhpcy5fbmV4dFBlZWsgPVxuICAgICAgICAgICAgICB0aGlzLl9pbmRleCArIDEgPj0gdGhpcy5fbGVuZ3RoID8gJEVPRiA6IHRoaXMuX2lucHV0LmNoYXJDb2RlQXQodGhpcy5faW5kZXggKyAxKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY2hhckNvZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9hdHRlbXB0Q2hhckNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fcGVlayA9PT0gY2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjaGFyQ29kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2F0dGVtcHRDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICAgICAgICAgIGlmIChjb21wYXJlQ2hhckNvZGVDYXNlSW5zZW5zaXRpdmUodGhpcy5fcGVlaywgY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY2hhckNvZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9yZXF1aXJlQ2hhckNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhckNvZGUoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2codGhpcy5fcGVlayksIHRoaXMuX2dldFNwYW4obG9jYXRpb24sIGxvY2F0aW9uKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjaGFyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2F0dGVtcHRTdHIgPSBmdW5jdGlvbiAoY2hhcnMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsZW4gPSBjaGFycy5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRoaXMuX2luZGV4ICsgbGVuID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5pdGlhbFBvc2l0aW9uID0gdGhpcy5fc2F2ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5fYXR0ZW1wdENoYXJDb2RlKGNoYXJzLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBJZiBhdHRlbXB0aW5nIHRvIHBhcnNlIHRoZSBzdHJpbmcgZmFpbHMsIHdlIHdhbnQgdG8gcmVzZXQgdGhlIHBhcnNlclxuICAgICAgICAgICAgICAgICAgLy8gdG8gd2hlcmUgaXQgd2FzIGJlZm9yZSB0aGUgYXR0ZW1wdFxuICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoYXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYXR0ZW1wdFN0ckNhc2VJbnNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjaGFycykge1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuX2F0dGVtcHRDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZShjaGFycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjaGFyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX3JlcXVpcmVTdHIgPSBmdW5jdGlvbiAoY2hhcnMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLl9hdHRlbXB0U3RyKGNoYXJzKSkge1xuICAgICAgICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcihfdW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMuX3BlZWspLCB0aGlzLl9nZXRTcGFuKGxvY2F0aW9uKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcmVkaWNhdGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgICAgICAgIHdoaWxlICghcHJlZGljYXRlKHRoaXMuX3BlZWspKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZVxuICAgICAgICogQHBhcmFtIHs/fSBsZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9yZXF1aXJlQ2hhckNvZGVVbnRpbEZuID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgbGVuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4ocHJlZGljYXRlKTtcbiAgICAgICAgICBpZiAodGhpcy5faW5kZXggLSBzdGFydC5vZmZzZXQgPCBsZW4pIHtcbiAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3VuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLl9wZWVrKSwgdGhpcy5fZ2V0U3BhbihzdGFydCwgc3RhcnQpKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoYXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9hdHRlbXB0VW50aWxDaGFyID0gZnVuY3Rpb24gKGNoYXIpIHtcbiAgICAgICAgICB3aGlsZSAodGhpcy5fcGVlayAhPT0gY2hhcikge1xuICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkZWNvZGVFbnRpdGllc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX3JlYWRDaGFyID0gZnVuY3Rpb24gKGRlY29kZUVudGl0aWVzKSB7XG4gICAgICAgICAgaWYgKGRlY29kZUVudGl0aWVzICYmIHRoaXMuX3BlZWsgPT09ICRBTVBFUlNBTkQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZUVudGl0eSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9kZWNvZGVFbnRpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRIQVNIKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc0hleCA9IHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkeCkgfHwgdGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRYKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbnVtYmVyU3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpLm9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc0RpZ2l0RW50aXR5RW5kKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsgIT0gJFNFTUlDT0xPTikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3VuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLl9wZWVrKSwgdGhpcy5fZ2V0U3BhbigpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ck51bSA9IHRoaXMuX2lucHV0LnN1YnN0cmluZyhudW1iZXJTdGFydCwgdGhpcy5faW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoYXJDb2RlID0gcGFyc2VJbnQoc3RyTnVtLCBpc0hleCA/IDE2IDogMTApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbnRpdHkgPSB0aGlzLl9pbnB1dC5zdWJzdHJpbmcoc3RhcnQub2Zmc2V0ICsgMSwgdGhpcy5faW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmtub3duRW50aXR5RXJyb3JNc2coZW50aXR5KSwgdGhpcy5fZ2V0U3BhbihzdGFydCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydFBvc2l0aW9uID0gdGhpcy5fc2F2ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOYW1lZEVudGl0eUVuZCk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9wZWVrICE9ICRTRU1JQ09MT04pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVQb3NpdGlvbihzdGFydFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAnJic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lXzEgPSB0aGlzLl9pbnB1dC5zdWJzdHJpbmcoc3RhcnQub2Zmc2V0ICsgMSwgdGhpcy5faW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hhciA9IE5BTUVEX0VOVElUSUVTW25hbWVfMV07XG4gICAgICAgICAgICAgIGlmICghY2hhcikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3Vua25vd25FbnRpdHlFcnJvck1zZyhuYW1lXzEpLCB0aGlzLl9nZXRTcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGNoYXI7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkZWNvZGVFbnRpdGllc1xuICAgICAgICogQHBhcmFtIHs/fSBmaXJzdENoYXJPZkVuZFxuICAgICAgICogQHBhcmFtIHs/fSBhdHRlbXB0RW5kUmVzdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVSYXdUZXh0ID0gZnVuY3Rpb24gKGRlY29kZUVudGl0aWVzLCBmaXJzdENoYXJPZkVuZCwgYXR0ZW1wdEVuZFJlc3QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YWdDbG9zZVN0YXJ0O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRleHRTdGFydCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihkZWNvZGVFbnRpdGllcyA/IFRva2VuVHlwZSQxLkVTQ0FQQUJMRV9SQVdfVEVYVCA6IFRva2VuVHlwZSQxLlJBV19URVhULCB0ZXh0U3RhcnQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gW107XG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgdGFnQ2xvc2VTdGFydCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9hdHRlbXB0Q2hhckNvZGUoZmlyc3RDaGFyT2ZFbmQpICYmIGF0dGVtcHRFbmRSZXN0KCkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+IHRhZ0Nsb3NlU3RhcnQub2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoYXJhY3RlcnMgY29uc3VtZWQgYnkgdGhlIHByZXZpb3VzIGlmIHN0YXRlbWVudCB0byB0aGUgb3V0cHV0XG4gICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuX2lucHV0LnN1YnN0cmluZyh0YWdDbG9zZVN0YXJ0Lm9mZnNldCwgdGhpcy5faW5kZXgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fcGVlayAhPT0gZmlyc3RDaGFyT2ZFbmQpIHtcbiAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIoZGVjb2RlRW50aXRpZXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fZW5kVG9rZW4oW3RoaXMuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMocGFydHMuam9pbignJykpXSwgdGFnQ2xvc2VTdGFydCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUNvbW1lbnQgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuQ09NTUVOVF9TVEFSVCwgc3RhcnQpO1xuICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkTUlOVVMpO1xuICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXh0VG9rZW4gPSB0aGlzLl9jb25zdW1lUmF3VGV4dChmYWxzZSwgJE1JTlVTLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYXR0ZW1wdFN0cignLT4nKTsgfSk7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5DT01NRU5UX0VORCwgdGV4dFRva2VuLnNvdXJjZVNwYW4uZW5kKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUNkYXRhID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLkNEQVRBX1NUQVJULCBzdGFydCk7XG4gICAgICAgICAgdGhpcy5fcmVxdWlyZVN0cignQ0RBVEFbJyk7XG4gICAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRleHRUb2tlbiA9IHRoaXMuX2NvbnN1bWVSYXdUZXh0KGZhbHNlLCAkUkJSQUNLRVQsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9hdHRlbXB0U3RyKCddPicpOyB9KTtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLkNEQVRBX0VORCwgdGV4dFRva2VuLnNvdXJjZVNwYW4uZW5kKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZURvY1R5cGUgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLkRPQ19UWVBFLCBzdGFydCk7XG4gICAgICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsQ2hhcigkR1QpO1xuICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5faW5wdXQuc3Vic3RyaW5nKHN0YXJ0Lm9mZnNldCArIDIsIHRoaXMuX2luZGV4IC0gMSldKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lUHJlZml4QW5kTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lT3JQcmVmaXhTdGFydCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZWZpeCA9IG51bGw7XG4gICAgICAgICAgd2hpbGUgKHRoaXMuX3BlZWsgIT09ICRDT0xPTiAmJiAhaXNQcmVmaXhFbmQodGhpcy5fcGVlaykpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lU3RhcnQ7XG4gICAgICAgICAgaWYgKHRoaXMuX3BlZWsgPT09ICRDT0xPTikge1xuICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHByZWZpeCA9IHRoaXMuX2lucHV0LnN1YnN0cmluZyhuYW1lT3JQcmVmaXhTdGFydCwgdGhpcy5faW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgbmFtZVN0YXJ0ID0gdGhpcy5faW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBuYW1lU3RhcnQgPSBuYW1lT3JQcmVmaXhTdGFydDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlVW50aWxGbihpc05hbWVFbmQsIHRoaXMuX2luZGV4ID09PSBuYW1lU3RhcnQgPyAxIDogMCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZSA9IHRoaXMuX2lucHV0LnN1YnN0cmluZyhuYW1lU3RhcnQsIHRoaXMuX2luZGV4KTtcbiAgICAgICAgICByZXR1cm4gW3ByZWZpeCwgbmFtZV07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZVRhZ09wZW4gPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzYXZlZFBvcyA9IHRoaXMuX3NhdmVQb3NpdGlvbigpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRhZ05hbWU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG93ZXJjYXNlVGFnTmFtZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIWlzQXNjaWlMZXR0ZXIodGhpcy5fcGVlaykpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2codGhpcy5fcGVlayksIHRoaXMuX2dldFNwYW4oKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZVN0YXJ0ID0gdGhpcy5faW5kZXg7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuU3RhcnQoc3RhcnQpO1xuICAgICAgICAgICAgICB0YWdOYW1lID0gdGhpcy5faW5wdXQuc3Vic3RyaW5nKG5hbWVTdGFydCwgdGhpcy5faW5kZXgpO1xuICAgICAgICAgICAgICBsb3dlcmNhc2VUYWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9wZWVrICE9PSAkU0xBU0ggJiYgdGhpcy5fcGVlayAhPT0gJEdUKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQXR0cmlidXRlTmFtZSgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkRVEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVBdHRyaWJ1dGVWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgX0NvbnRyb2xGbG93RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YXJ0IHRhZyBpcyBpbnZhbGlkLCBhc3N1bWUgd2Ugd2FudCBhIFwiPFwiXG4gICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlUG9zaXRpb24oc2F2ZWRQb3MpO1xuICAgICAgICAgICAgICAgICAgLy8gQmFjayB0byBiYWNrIHRleHQgdG9rZW5zIGFyZSBtZXJnZWQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5URVhULCBzdGFydCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbJzwnXSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGVudFRva2VuVHlwZSA9IHRoaXMuX2dldFRhZ0RlZmluaXRpb24odGFnTmFtZSkuY29udGVudFR5cGU7XG4gICAgICAgICAgaWYgKGNvbnRlbnRUb2tlblR5cGUgPT09IFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVSYXdUZXh0V2l0aFRhZ0Nsb3NlKGxvd2VyY2FzZVRhZ05hbWUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudFRva2VuVHlwZSA9PT0gVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVSYXdUZXh0V2l0aFRhZ0Nsb3NlKGxvd2VyY2FzZVRhZ05hbWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbG93ZXJjYXNlVGFnTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBkZWNvZGVFbnRpdGllc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVSYXdUZXh0V2l0aFRhZ0Nsb3NlID0gZnVuY3Rpb24gKGxvd2VyY2FzZVRhZ05hbWUsIGRlY29kZUVudGl0aWVzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXh0VG9rZW4gPSB0aGlzLl9jb25zdW1lUmF3VGV4dChkZWNvZGVFbnRpdGllcywgJExULCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGlmICghX3RoaXMuX2F0dGVtcHRDaGFyQ29kZSgkU0xBU0gpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBfdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICBpZiAoIV90aGlzLl9hdHRlbXB0U3RyQ2FzZUluc2Vuc2l0aXZlKGxvd2VyY2FzZVRhZ05hbWUpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBfdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2F0dGVtcHRDaGFyQ29kZSgkR1QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuVEFHX0NMT1NFLCB0ZXh0VG9rZW4uc291cmNlU3Bhbi5lbmQpO1xuICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFtudWxsLCBsb3dlcmNhc2VUYWdOYW1lXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZVRhZ09wZW5TdGFydCA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuVEFHX09QRU5fU1RBUlQsIHN0YXJ0KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IHRoaXMuX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk7XG4gICAgICAgICAgdGhpcy5fZW5kVG9rZW4ocGFydHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuQVRUUl9OQU1FKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXhBbmROYW1lID0gdGhpcy5fY29uc3VtZVByZWZpeEFuZE5hbWUoKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihwcmVmaXhBbmROYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lQXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5BVFRSX1ZBTFVFKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZTtcbiAgICAgICAgICBpZiAodGhpcy5fcGVlayA9PT0gJFNRIHx8IHRoaXMuX3BlZWsgPT09ICREUSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBxdW90ZUNoYXIgPSB0aGlzLl9wZWVrO1xuICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gW107XG4gICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9wZWVrICE9PSBxdW90ZUNoYXIpIHtcbiAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIodHJ1ZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlID0gcGFydHMuam9pbignJyk7XG4gICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlU3RhcnQgPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlVW50aWxGbihpc05hbWVFbmQsIDEpO1xuICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2lucHV0LnN1YnN0cmluZyh2YWx1ZVN0YXJ0LCB0aGlzLl9pbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFt0aGlzLl9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zKHZhbHVlKV0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVUYWdPcGVuRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VuVHlwZSA9IHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkU0xBU0gpID8gVG9rZW5UeXBlJDEuVEFHX09QRU5fRU5EX1ZPSUQgOiBUb2tlblR5cGUkMS5UQUdfT1BFTl9FTkQ7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbih0b2tlblR5cGUpO1xuICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkR1QpO1xuICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lVGFnQ2xvc2UgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLlRBR19DTE9TRSwgc3RhcnQpO1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXhBbmROYW1lID0gdGhpcy5fY29uc3VtZVByZWZpeEFuZE5hbWUoKTtcbiAgICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRHVCk7XG4gICAgICAgICAgdGhpcy5fZW5kVG9rZW4ocHJlZml4QW5kTmFtZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUV4cGFuc2lvbkZvcm1TdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLkVYUEFOU0lPTl9GT1JNX1NUQVJULCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgICB0aGlzLl9yZXF1aXJlQ2hhckNvZGUoJExCUkFDRSk7XG4gICAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5wdXNoKFRva2VuVHlwZSQxLkVYUEFOU0lPTl9GT1JNX1NUQVJUKTtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLlJBV19URVhULCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb25kaXRpb24gPSB0aGlzLl9yZWFkVW50aWwoJENPTU1BKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbY29uZGl0aW9uXSwgdGhpcy5fZ2V0TG9jYXRpb24oKSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRDT01NQSk7XG4gICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuUkFXX1RFWFQsIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGUgPSB0aGlzLl9yZWFkVW50aWwoJENPTU1BKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbdHlwZV0sIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkQ09NTUEpO1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lRXhwYW5zaW9uQ2FzZVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0NBU0VfVkFMVUUsIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gdGhpcy5fcmVhZFVudGlsKCRMQlJBQ0UpLnRyaW0oKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbdmFsdWVdLCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9FWFBfU1RBUlQsIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkTEJSQUNFKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSwgdGhpcy5fZ2V0TG9jYXRpb24oKSk7XG4gICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5wdXNoKFRva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUV4cGFuc2lvbkNhc2VFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9FWFBfRU5ELCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgICAgICB0aGlzLl9yZXF1aXJlQ2hhckNvZGUoJFJCUkFDRSk7XG4gICAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10sIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgICAgICB0aGlzLl9leHBhbnNpb25DYXNlU3RhY2sucG9wKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUV4cGFuc2lvbkZvcm1FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUkMS5FWFBBTlNJT05fRk9STV9FTkQsIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkUkJSQUNFKTtcbiAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLnBvcCgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZSQxLlRFWFQsIHN0YXJ0KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IFtdO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgJiYgdGhpcy5fYXR0ZW1wdFN0cih0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnLnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2luSW50ZXJwb2xhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyAmJiB0aGlzLl9pbkludGVycG9sYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2F0dGVtcHRTdHIodGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZy5lbmQpKSB7XG4gICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcuZW5kKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2luSW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh0aGlzLl9yZWFkQ2hhcih0cnVlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlICghdGhpcy5faXNUZXh0RW5kKCkpO1xuICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFt0aGlzLl9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zKHBhcnRzLmpvaW4oJycpKV0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2lzVGV4dEVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5fcGVlayA9PT0gJExUIHx8IHRoaXMuX3BlZWsgPT09ICRFT0YpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl90b2tlbml6ZUljdSAmJiAhdGhpcy5faW5JbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgICAgIGlmIChpc0V4cGFuc2lvbkZvcm1TdGFydCh0aGlzLl9pbnB1dCwgdGhpcy5faW5kZXgsIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBvZiBhbiBleHBhbnNpb24gZm9ybVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsgPT09ICRSQlJBQ0UgJiYgdGhpcy5faXNJbkV4cGFuc2lvbkNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGFuZCBleHBhbnNpb24gY2FzZVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Rva2VuaXplci5wcm90b3R5cGUuX3NhdmVQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gW3RoaXMuX3BlZWssIHRoaXMuX2luZGV4LCB0aGlzLl9jb2x1bW4sIHRoaXMuX2xpbmUsIHRoaXMudG9rZW5zLmxlbmd0aF07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoYXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9yZWFkVW50aWwgPSBmdW5jdGlvbiAoY2hhcikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gdGhpcy5faW5kZXg7XG4gICAgICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsQ2hhcihjaGFyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLl9pbmRleCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fcmVzdG9yZVBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy5fcGVlayA9IHBvc2l0aW9uWzBdO1xuICAgICAgICAgIHRoaXMuX2luZGV4ID0gcG9zaXRpb25bMV07XG4gICAgICAgICAgdGhpcy5fY29sdW1uID0gcG9zaXRpb25bMl07XG4gICAgICAgICAgdGhpcy5fbGluZSA9IHBvc2l0aW9uWzNdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5iVG9rZW5zID0gcG9zaXRpb25bNF07XG4gICAgICAgICAgaWYgKG5iVG9rZW5zIDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgZXh0cmEgdG9rZW5zXG4gICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gdGhpcy50b2tlbnMuc2xpY2UoMCwgbmJUb2tlbnMpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9pc0luRXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrW3RoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5sZW5ndGggLSAxXSA9PT1cbiAgICAgICAgICAgICAgICAgIFRva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9pc0luRXhwYW5zaW9uRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrW3RoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5sZW5ndGggLSAxXSA9PT1cbiAgICAgICAgICAgICAgICAgIFRva2VuVHlwZSQxLkVYUEFOU0lPTl9GT1JNX1NUQVJUO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfVG9rZW5pemVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc05vdFdoaXRlc3BhY2UoY29kZSkge1xuICAgICAgcmV0dXJuICFpc1doaXRlc3BhY2UoY29kZSkgfHwgY29kZSA9PT0gJEVPRjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc05hbWVFbmQoY29kZSkge1xuICAgICAgcmV0dXJuIGlzV2hpdGVzcGFjZShjb2RlKSB8fCBjb2RlID09PSAkR1QgfHwgY29kZSA9PT0gJFNMQVNIIHx8XG4gICAgICAgICAgY29kZSA9PT0gJFNRIHx8IGNvZGUgPT09ICREUSB8fCBjb2RlID09PSAkRVE7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQcmVmaXhFbmQoY29kZSkge1xuICAgICAgcmV0dXJuIChjb2RlIDwgJGEgfHwgJHogPCBjb2RlKSAmJiAoY29kZSA8ICRBIHx8ICRaIDwgY29kZSkgJiZcbiAgICAgICAgICAoY29kZSA8ICQwIHx8IGNvZGUgPiAkOSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNEaWdpdEVudGl0eUVuZChjb2RlKSB7XG4gICAgICByZXR1cm4gY29kZSA9PSAkU0VNSUNPTE9OIHx8IGNvZGUgPT0gJEVPRiB8fCAhaXNBc2NpaUhleERpZ2l0KGNvZGUpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzTmFtZWRFbnRpdHlFbmQoY29kZSkge1xuICAgICAgcmV0dXJuIGNvZGUgPT0gJFNFTUlDT0xPTiB8fCBjb2RlID09ICRFT0YgfHwgIWlzQXNjaWlMZXR0ZXIoY29kZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHBhcmFtIHs/fSBvZmZzZXRcbiAgICogQHBhcmFtIHs/fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc0V4cGFuc2lvbkZvcm1TdGFydChpbnB1dCwgb2Zmc2V0LCBpbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc0ludGVycG9sYXRpb25TdGFydCA9IGludGVycG9sYXRpb25Db25maWcgPyBpbnB1dC5pbmRleE9mKGludGVycG9sYXRpb25Db25maWcuc3RhcnQsIG9mZnNldCkgPT0gb2Zmc2V0IDogZmFsc2U7XG4gICAgICByZXR1cm4gaW5wdXQuY2hhckNvZGVBdChvZmZzZXQpID09ICRMQlJBQ0UgJiYgIWlzSW50ZXJwb2xhdGlvblN0YXJ0O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBlZWtcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzRXhwYW5zaW9uQ2FzZVN0YXJ0KHBlZWspIHtcbiAgICAgIHJldHVybiBwZWVrID09PSAkRVEgfHwgaXNBc2NpaUxldHRlcihwZWVrKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb2RlMVxuICAgKiBAcGFyYW0gez99IGNvZGUyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb21wYXJlQ2hhckNvZGVDYXNlSW5zZW5zaXRpdmUoY29kZTEsIGNvZGUyKSB7XG4gICAgICByZXR1cm4gdG9VcHBlckNhc2VDaGFyQ29kZShjb2RlMSkgPT0gdG9VcHBlckNhc2VDaGFyQ29kZShjb2RlMik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdG9VcHBlckNhc2VDaGFyQ29kZShjb2RlKSB7XG4gICAgICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6ID8gY29kZSAtICRhICsgJEEgOiBjb2RlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNyY1Rva2Vuc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VUZXh0VG9rZW5zKHNyY1Rva2Vucykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZHN0VG9rZW5zID0gW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0RHN0VG9rZW47XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgc3JjVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdG9rZW4gPSBzcmNUb2tlbnNbaV07XG4gICAgICAgICAgaWYgKGxhc3REc3RUb2tlbiAmJiBsYXN0RHN0VG9rZW4udHlwZSA9PSBUb2tlblR5cGUkMS5URVhUICYmIHRva2VuLnR5cGUgPT0gVG9rZW5UeXBlJDEuVEVYVCkge1xuICAgICAgICAgICAgICBsYXN0RHN0VG9rZW4ucGFydHNbMF0gKz0gdG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgICAgIGxhc3REc3RUb2tlbi5zb3VyY2VTcGFuLmVuZCA9IHRva2VuLnNvdXJjZVNwYW4uZW5kO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgbGFzdERzdFRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgIGRzdFRva2Vucy5wdXNoKGxhc3REc3RUb2tlbik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRzdFRva2VucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQ1ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgVHJlZUVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ1KFRyZWVFcnJvciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50TmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IG1zZ1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUcmVlRXJyb3IoZWxlbWVudE5hbWUsIHNwYW4sIG1zZykge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHNwYW4sIG1zZyk7XG4gICAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gbXNnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmVlRXJyb3IuY3JlYXRlID0gZnVuY3Rpb24gKGVsZW1lbnROYW1lLCBzcGFuLCBtc2cpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRyZWVFcnJvcihlbGVtZW50TmFtZSwgc3BhbiwgbXNnKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gVHJlZUVycm9yO1xuICB9KFBhcnNlRXJyb3IpKTtcbiAgdmFyIFBhcnNlVHJlZVJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm9vdE5vZGVzXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYXJzZVRyZWVSZXN1bHQocm9vdE5vZGVzLCBlcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlcyA9IHJvb3ROb2RlcztcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgIH1cbiAgICAgIHJldHVybiBQYXJzZVRyZWVSZXN1bHQ7XG4gIH0oKSk7XG4gIHZhciBQYXJzZXIkMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZ2V0VGFnRGVmaW5pdGlvblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYXJzZXIoZ2V0VGFnRGVmaW5pdGlvbikge1xuICAgICAgICAgIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbiA9IGdldFRhZ0RlZmluaXRpb247XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHBhcmFtIHs/PX0gcGFyc2VFeHBhbnNpb25Gb3Jtc1xuICAgICAgICogQHBhcmFtIHs/PX0gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHVybCwgcGFyc2VFeHBhbnNpb25Gb3JtcywgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIGlmIChwYXJzZUV4cGFuc2lvbkZvcm1zID09PSB2b2lkIDApIHsgcGFyc2VFeHBhbnNpb25Gb3JtcyA9IGZhbHNlOyB9XG4gICAgICAgICAgaWYgKGludGVycG9sYXRpb25Db25maWcgPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRzsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2Vuc0FuZEVycm9ycyA9IHRva2VuaXplKHNvdXJjZSwgdXJsLCB0aGlzLmdldFRhZ0RlZmluaXRpb24sIHBhcnNlRXhwYW5zaW9uRm9ybXMsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyZWVBbmRFcnJvcnMgPSBuZXcgX1RyZWVCdWlsZGVyKHRva2Vuc0FuZEVycm9ycy50b2tlbnMsIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbikuYnVpbGQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhcnNlVHJlZVJlc3VsdCh0cmVlQW5kRXJyb3JzLnJvb3ROb2RlcywgKCh0b2tlbnNBbmRFcnJvcnMuZXJyb3JzKSkuY29uY2F0KHRyZWVBbmRFcnJvcnMuZXJyb3JzKSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFBhcnNlcjtcbiAgfSgpKTtcbiAgdmFyIF9UcmVlQnVpbGRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5zXG4gICAgICAgKiBAcGFyYW0gez99IGdldFRhZ0RlZmluaXRpb25cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gX1RyZWVCdWlsZGVyKHRva2VucywgZ2V0VGFnRGVmaW5pdGlvbikge1xuICAgICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuICAgICAgICAgIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbiA9IGdldFRhZ0RlZmluaXRpb247XG4gICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICB0aGlzLl9yb290Tm9kZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9lbGVtZW50U3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2hpbGUgKHRoaXMuX3BlZWsudHlwZSAhPT0gVG9rZW5UeXBlJDEuRU9GKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLlRBR19PUEVOX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lU3RhcnRUYWcodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLlRBR19DTE9TRSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZUVuZFRhZyh0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuQ0RBVEFfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlVm9pZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDZGF0YSh0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuQ09NTUVOVF9TVEFSVCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VWb2lkRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZUNvbW1lbnQodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLlRFWFQgfHwgdGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUkMS5SQVdfVEVYVCB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUkMS5FU0NBUEFCTEVfUkFXX1RFWFQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlVm9pZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUkMS5FWFBBTlNJT05fRk9STV9TVEFSVCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZUV4cGFuc2lvbih0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgb3RoZXIgdG9rZW5zLi4uXG4gICAgICAgICAgICAgICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVRyZWVSZXN1bHQodGhpcy5fcm9vdE5vZGVzLCB0aGlzLl9lcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2ID0gdGhpcy5fcGVlaztcbiAgICAgICAgICBpZiAodGhpcy5faW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IHRoZXJlIGlzIGFsd2F5cyBhbiBFT0YgdG9rZW4gYXQgdGhlIGVuZFxuICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9wZWVrID0gdGhpcy50b2tlbnNbdGhpcy5faW5kZXhdO1xuICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9hZHZhbmNlSWYgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0VG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2NvbnN1bWVDZGF0YSA9IGZ1bmN0aW9uIChzdGFydFRva2VuKSB7XG4gICAgICAgICAgdGhpcy5fY29uc3VtZVRleHQodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICB0aGlzLl9hZHZhbmNlSWYoVG9rZW5UeXBlJDEuQ0RBVEFfRU5EKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2NvbnN1bWVDb21tZW50ID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGV4dCA9IHRoaXMuX2FkdmFuY2VJZihUb2tlblR5cGUkMS5SQVdfVEVYVCk7XG4gICAgICAgICAgdGhpcy5fYWR2YW5jZUlmKFRva2VuVHlwZSQxLkNPTU1FTlRfRU5EKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGlzUHJlc2VudCh0ZXh0KSA/IHRleHQucGFydHNbMF0udHJpbSgpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9hZGRUb1BhcmVudChuZXcgQ29tbWVudCh2YWx1ZSwgdG9rZW4uc291cmNlU3BhbikpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZUV4cGFuc2lvbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN3aXRjaFZhbHVlID0gdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGUgPSB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2FzZXMgPSBbXTtcbiAgICAgICAgICAvLyByZWFkID1cbiAgICAgICAgICB3aGlsZSAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUkMS5FWFBBTlNJT05fQ0FTRV9WQUxVRSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBDYXNlID0gdGhpcy5fcGFyc2VFeHBhbnNpb25DYXNlKCk7XG4gICAgICAgICAgICAgIGlmICghZXhwQ2FzZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgY2FzZXMucHVzaChleHBDYXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVhZCB0aGUgZmluYWwgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgIT09IFRva2VuVHlwZSQxLkVYUEFOU0lPTl9GT1JNX0VORCkge1xuICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKG51bGwsIHRoaXMuX3BlZWsuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd9Jy5cIikpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKHRva2VuLnNvdXJjZVNwYW4uc3RhcnQsIHRoaXMuX3BlZWsuc291cmNlU3Bhbi5lbmQpO1xuICAgICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5ldyBFeHBhbnNpb24oc3dpdGNoVmFsdWUucGFydHNbMF0sIHR5cGUucGFydHNbMF0sIGNhc2VzLCBzb3VyY2VTcGFuLCBzd2l0Y2hWYWx1ZS5zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fcGFyc2VFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgIC8vIHJlYWQge1xuICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgIT09IFRva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVCkge1xuICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKG51bGwsIHRoaXMuX3BlZWsuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd7Jy5cIikpO1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVhZCB1bnRpbCB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnQgPSB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwID0gdGhpcy5fY29sbGVjdEV4cGFuc2lvbkV4cFRva2VucyhzdGFydCk7XG4gICAgICAgICAgaWYgKCFleHApXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVuZCA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICBleHAucHVzaChuZXcgVG9rZW4kMShUb2tlblR5cGUkMS5FT0YsIFtdLCBlbmQuc291cmNlU3BhbikpO1xuICAgICAgICAgIC8vIHBhcnNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB7IGFuZCB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyc2VkRXhwID0gbmV3IF9UcmVlQnVpbGRlcihleHAsIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbikuYnVpbGQoKTtcbiAgICAgICAgICBpZiAocGFyc2VkRXhwLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9ycyA9IHRoaXMuX2Vycm9ycy5jb25jYXQoLyoqIEB0eXBlIHs/fSAqLyAocGFyc2VkRXhwLmVycm9ycykpO1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlU3BhbiA9IG5ldyBQYXJzZVNvdXJjZVNwYW4odmFsdWUuc291cmNlU3Bhbi5zdGFydCwgZW5kLnNvdXJjZVNwYW4uZW5kKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBTb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihzdGFydC5zb3VyY2VTcGFuLnN0YXJ0LCBlbmQuc291cmNlU3Bhbi5lbmQpO1xuICAgICAgICAgIHJldHVybiBuZXcgRXhwYW5zaW9uQ2FzZSh2YWx1ZS5wYXJ0c1swXSwgcGFyc2VkRXhwLnJvb3ROb2Rlcywgc291cmNlU3BhbiwgdmFsdWUuc291cmNlU3BhbiwgZXhwU291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9jb2xsZWN0RXhwYW5zaW9uRXhwVG9rZW5zID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwYW5zaW9uRm9ybVN0YWNrID0gW1Rva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVF07XG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0ZPUk1fU1RBUlQgfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0NBU0VfRVhQX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgICBleHBhbnNpb25Gb3JtU3RhY2sucHVzaCh0aGlzLl9wZWVrLnR5cGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9FTkQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsYXN0T25TdGFjayhleHBhbnNpb25Gb3JtU3RhY2ssIFRva2VuVHlwZSQxLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Gb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvbkZvcm1TdGFjay5sZW5ndGggPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKFRyZWVFcnJvci5jcmVhdGUobnVsbCwgc3RhcnQuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd9Jy5cIikpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLkVYUEFOU0lPTl9GT1JNX0VORCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGxhc3RPblN0YWNrKGV4cGFuc2lvbkZvcm1TdGFjaywgVG9rZW5UeXBlJDEuRVhQQU5TSU9OX0ZPUk1fU1RBUlQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXhwYW5zaW9uRm9ybVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goVHJlZUVycm9yLmNyZWF0ZShudWxsLCBzdGFydC5zb3VyY2VTcGFuLCBcIkludmFsaWQgSUNVIG1lc3NhZ2UuIE1pc3NpbmcgJ30nLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuRU9GKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKG51bGwsIHN0YXJ0LnNvdXJjZVNwYW4sIFwiSW52YWxpZCBJQ1UgbWVzc2FnZS4gTWlzc2luZyAnfScuXCIpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV4cC5wdXNoKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZVRleHQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXh0ID0gdG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gMCAmJiB0ZXh0WzBdID09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudF8xID0gdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHBhcmVudF8xKSAmJiBwYXJlbnRfMS5jaGlsZHJlbi5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWdEZWZpbml0aW9uKHBhcmVudF8xLm5hbWUpLmlnbm9yZUZpcnN0TGYpIHtcbiAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5ldyBUZXh0KHRleHQsIHRva2VuLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9jbG9zZVZvaWRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50U3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbCA9IHRoaXMuX2VsZW1lbnRTdGFja1t0aGlzLl9lbGVtZW50U3RhY2subGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdldFRhZ0RlZmluaXRpb24oZWwubmFtZSkuaXNWb2lkKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0VGFnVG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2NvbnN1bWVTdGFydFRhZyA9IGZ1bmN0aW9uIChzdGFydFRhZ1Rva2VuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlZml4ID0gc3RhcnRUYWdUb2tlbi5wYXJ0c1swXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lID0gc3RhcnRUYWdUb2tlbi5wYXJ0c1sxXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRycyA9IFtdO1xuICAgICAgICAgIHdoaWxlICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLkFUVFJfTkFNRSkge1xuICAgICAgICAgICAgICBhdHRycy5wdXNoKHRoaXMuX2NvbnN1bWVBdHRyKHRoaXMuX2FkdmFuY2UoKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdWxsTmFtZSA9IHRoaXMuX2dldEVsZW1lbnRGdWxsTmFtZShwcmVmaXgsIG5hbWUsIHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAvLyBOb3RlOiBUaGVyZSBjb3VsZCBoYXZlIGJlZW4gYSB0b2tlbml6ZXIgZXJyb3JcbiAgICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IGdldCBhIHRva2VuIGZvciB0aGUgZW5kIHRhZy4uLlxuICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZSQxLlRBR19PUEVOX0VORF9WT0lEKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgICAgc2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YWdEZWYgPSB0aGlzLmdldFRhZ0RlZmluaXRpb24oZnVsbE5hbWUpO1xuICAgICAgICAgICAgICBpZiAoISh0YWdEZWYuY2FuU2VsZkNsb3NlIHx8IGdldE5zUHJlZml4KGZ1bGxOYW1lKSAhPT0gbnVsbCB8fCB0YWdEZWYuaXNWb2lkKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goVHJlZUVycm9yLmNyZWF0ZShmdWxsTmFtZSwgc3RhcnRUYWdUb2tlbi5zb3VyY2VTcGFuLCBcIk9ubHkgdm9pZCBhbmQgZm9yZWlnbiBlbGVtZW50cyBjYW4gYmUgc2VsZiBjbG9zZWQgXFxcIlwiICsgc3RhcnRUYWdUb2tlbi5wYXJ0c1sxXSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUkMS5UQUdfT1BFTl9FTkQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbmQgPSB0aGlzLl9wZWVrLnNvdXJjZVNwYW4uc3RhcnQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3BhbiA9IG5ldyBQYXJzZVNvdXJjZVNwYW4oc3RhcnRUYWdUb2tlbi5zb3VyY2VTcGFuLnN0YXJ0LCBlbmQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVsID0gbmV3IEVsZW1lbnQoZnVsbE5hbWUsIGF0dHJzLCBbXSwgc3Bhbiwgc3BhbiwgbnVsbCk7XG4gICAgICAgICAgdGhpcy5fcHVzaEVsZW1lbnQoZWwpO1xuICAgICAgICAgIGlmIChzZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgICB0aGlzLl9wb3BFbGVtZW50KGZ1bGxOYW1lKTtcbiAgICAgICAgICAgICAgZWwuZW5kU291cmNlU3BhbiA9IHNwYW47XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fcHVzaEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50RWwgPSB0aGlzLl9lbGVtZW50U3RhY2tbdGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICBpZiAodGhpcy5nZXRUYWdEZWZpbml0aW9uKHBhcmVudEVsLm5hbWUpLmlzQ2xvc2VkQnlDaGlsZChlbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRhZ0RlZiA9IHRoaXMuZ2V0VGFnRGVmaW5pdGlvbihlbC5uYW1lKTtcbiAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9nZXRQYXJlbnRFbGVtZW50U2tpcHBpbmdDb250YWluZXJzKCksIHBhcmVudCA9IF9hLnBhcmVudCwgY29udGFpbmVyID0gX2EuY29udGFpbmVyO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSAmJiB0YWdEZWYucmVxdWlyZUV4dHJhUGFyZW50KHBhcmVudC5uYW1lKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdQYXJlbnQgPSBuZXcgRWxlbWVudCh0YWdEZWYucGFyZW50VG9BZGQsIFtdLCBbXSwgZWwuc291cmNlU3BhbiwgZWwuc3RhcnRTb3VyY2VTcGFuLCBlbC5lbmRTb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0QmVmb3JlQ29udGFpbmVyKHBhcmVudCwgY29udGFpbmVyLCBuZXdQYXJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9hZGRUb1BhcmVudChlbCk7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnB1c2goZWwpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbmRUYWdUb2tlblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZUVuZFRhZyA9IGZ1bmN0aW9uIChlbmRUYWdUb2tlbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZ1bGxOYW1lID0gdGhpcy5fZ2V0RWxlbWVudEZ1bGxOYW1lKGVuZFRhZ1Rva2VuLnBhcnRzWzBdLCBlbmRUYWdUb2tlbi5wYXJ0c1sxXSwgdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpKTtcbiAgICAgICAgICBpZiAodGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKS5lbmRTb3VyY2VTcGFuID0gZW5kVGFnVG9rZW4uc291cmNlU3BhbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuZ2V0VGFnRGVmaW5pdGlvbihmdWxsTmFtZSkuaXNWb2lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKFRyZWVFcnJvci5jcmVhdGUoZnVsbE5hbWUsIGVuZFRhZ1Rva2VuLnNvdXJjZVNwYW4sIFwiVm9pZCBlbGVtZW50cyBkbyBub3QgaGF2ZSBlbmQgdGFncyBcXFwiXCIgKyBlbmRUYWdUb2tlbi5wYXJ0c1sxXSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9wb3BFbGVtZW50KGZ1bGxOYW1lKSkge1xuICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKGZ1bGxOYW1lLCBlbmRUYWdUb2tlbi5zb3VyY2VTcGFuLCBcIlVuZXhwZWN0ZWQgY2xvc2luZyB0YWcgXFxcIlwiICsgZW5kVGFnVG9rZW4ucGFydHNbMV0gKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZnVsbE5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX3BvcEVsZW1lbnQgPSBmdW5jdGlvbiAoZnVsbE5hbWUpIHtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIHN0YWNrSW5kZXggPSB0aGlzLl9lbGVtZW50U3RhY2subGVuZ3RoIC0gMTsgc3RhY2tJbmRleCA+PSAwOyBzdGFja0luZGV4LS0pIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWwgPSB0aGlzLl9lbGVtZW50U3RhY2tbc3RhY2tJbmRleF07XG4gICAgICAgICAgICAgIGlmIChlbC5uYW1lID09IGZ1bGxOYW1lKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50U3RhY2suc3BsaWNlKHN0YWNrSW5kZXgsIHRoaXMuX2VsZW1lbnRTdGFjay5sZW5ndGggLSBzdGFja0luZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghdGhpcy5nZXRUYWdEZWZpbml0aW9uKGVsLm5hbWUpLmNsb3NlZEJ5UGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyTmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZUF0dHIgPSBmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdWxsTmFtZSA9IG1lcmdlTnNBbmROYW1lKGF0dHJOYW1lLnBhcnRzWzBdLCBhdHRyTmFtZS5wYXJ0c1sxXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW5kID0gYXR0ck5hbWUuc291cmNlU3Bhbi5lbmQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSAnJztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZVNwYW47XG4gICAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlJDEuQVRUUl9WQUxVRSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZVRva2VuID0gdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlVG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgICAgIGVuZCA9IHZhbHVlVG9rZW4uc291cmNlU3Bhbi5lbmQ7XG4gICAgICAgICAgICAgIHZhbHVlU3BhbiA9IHZhbHVlVG9rZW4uc291cmNlU3BhbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUkMShmdWxsTmFtZSwgdmFsdWUsIG5ldyBQYXJzZVNvdXJjZVNwYW4oYXR0ck5hbWUuc291cmNlU3Bhbi5zdGFydCwgZW5kKSwgdmFsdWVTcGFuKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2dldFBhcmVudEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRTdGFjay5sZW5ndGggPiAwID8gdGhpcy5fZWxlbWVudFN0YWNrW3RoaXMuX2VsZW1lbnRTdGFjay5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUmV0dXJucyB0aGUgcGFyZW50IGluIHRoZSBET00gYW5kIHRoZSBjb250YWluZXIuXG4gICAgICAgICogKlxuICAgICAgICAqIGA8bmctY29udGFpbmVyPmAgZWxlbWVudHMgYXJlIHNraXBwZWQgYXMgdGhleSBhcmUgbm90IHJlbmRlcmVkIGFzIERPTSBlbGVtZW50LlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fZ2V0UGFyZW50RWxlbWVudFNraXBwaW5nQ29udGFpbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250YWluZXIgPSBudWxsO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IHRoaXMuX2VsZW1lbnRTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudFN0YWNrW2ldLm5hbWUgIT09ICduZy1jb250YWluZXInKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnQ6IHRoaXMuX2VsZW1lbnRTdGFja1tpXSwgY29udGFpbmVyOiBjb250YWluZXIgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLl9lbGVtZW50U3RhY2tbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHBhcmVudDogdGhpcy5fZWxlbWVudFN0YWNrW3RoaXMuX2VsZW1lbnRTdGFjay5sZW5ndGggLSAxXSwgY29udGFpbmVyOiBjb250YWluZXIgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fYWRkVG9QYXJlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudCA9IHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkpIHtcbiAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9yb290Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgSW5zZXJ0IGEgbm9kZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIHRoZSBjb250YWluZXIuXG4gICAgICAgICogV2hlbiBubyBjb250YWluZXIgaXMgZ2l2ZW4sIHRoZSBub2RlIGlzIGFwcGVuZGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC5cbiAgICAgICAgKiBBbHNvIHVwZGF0ZXMgdGhlIGVsZW1lbnQgc3RhY2sgYWNjb3JkaW5nbHkuXG4gICAgICAgICogKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGFpbmVyXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2luc2VydEJlZm9yZUNvbnRhaW5lciA9IGZ1bmN0aW9uIChwYXJlbnQsIGNvbnRhaW5lciwgbm9kZSkge1xuICAgICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5vZGUpO1xuICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50U3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBuZXcgbm9kZSBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoY29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0gPSBub2RlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRTdGFjay5zcGxpY2UodGhpcy5fZWxlbWVudFN0YWNrLmluZGV4T2YoY29udGFpbmVyKSwgMCwgbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcmVmaXhcbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYWxOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2dldEVsZW1lbnRGdWxsTmFtZSA9IGZ1bmN0aW9uIChwcmVmaXgsIGxvY2FsTmFtZSwgcGFyZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0JsYW5rKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgcHJlZml4ID0gdGhpcy5nZXRUYWdEZWZpbml0aW9uKGxvY2FsTmFtZSkuaW1wbGljaXROYW1lc3BhY2VQcmVmaXg7XG4gICAgICAgICAgICAgIGlmIChpc0JsYW5rKHByZWZpeCkgJiYgaXNQcmVzZW50KHBhcmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZXROc1ByZWZpeChwYXJlbnRFbGVtZW50Lm5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtZXJnZU5zQW5kTmFtZShwcmVmaXgsIGxvY2FsTmFtZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9UcmVlQnVpbGRlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RhY2tcbiAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBsYXN0T25TdGFjayhzdGFjaywgZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHN0YWNrLmxlbmd0aCA+IDAgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0gPT09IGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBNZXNzYWdlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlcyBtZXNzYWdlIEFTVFxuICAgICAgICogQHBhcmFtIHs/fSBwbGFjZWhvbGRlcnMgbWFwcyBwbGFjZWhvbGRlciBuYW1lcyB0byBzdGF0aWMgY29udGVudFxuICAgICAgICogQHBhcmFtIHs/fSBwbGFjZWhvbGRlclRvTWVzc2FnZSBtYXBzIHBsYWNlaG9sZGVyIG5hbWVzIHRvIG1lc3NhZ2VzICh1c2VkIGZvciBuZXN0ZWQgSUNVIG1lc3NhZ2VzKVxuICAgICAgICogQHBhcmFtIHs/fSBtZWFuaW5nXG4gICAgICAgKiBAcGFyYW0gez99IGRlc2NyaXB0aW9uXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE1lc3NhZ2Uobm9kZXMsIHBsYWNlaG9sZGVycywgcGxhY2Vob2xkZXJUb01lc3NhZ2UsIG1lYW5pbmcsIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJzID0gcGxhY2Vob2xkZXJzO1xuICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJUb01lc3NhZ2UgPSBwbGFjZWhvbGRlclRvTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLm1lYW5pbmcgPSBtZWFuaW5nO1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBNZXNzYWdlO1xuICB9KCkpO1xuICB2YXIgVGV4dCQxID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRleHQodmFsdWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZXh0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBUZXh0O1xuICB9KCkpO1xuICAvLyBUT0RPKHZpY2IpOiBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzIG5vZGUgKHZzIGFuIGFycmF5KSA/XG4gIHZhciBDb250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoaWxkcmVuXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29udGFpbmVyKGNoaWxkcmVuLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29udGFpbmVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0Q29udGFpbmVyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgICAgcmV0dXJuIENvbnRhaW5lcjtcbiAgfSgpKTtcbiAgdmFyIEljdSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IGNhc2VzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gSWN1KGV4cHJlc3Npb24sIHR5cGUsIGNhc2VzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEljdS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEljdSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBJY3U7XG4gIH0oKSk7XG4gIHZhciBUYWdQbGFjZWhvbGRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0TmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBjbG9zZU5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gY2hpbGRyZW5cbiAgICAgICAqIEBwYXJhbSB7P30gaXNWb2lkXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVGFnUGxhY2Vob2xkZXIodGFnLCBhdHRycywgc3RhcnROYW1lLCBjbG9zZU5hbWUsIGNoaWxkcmVuLCBpc1ZvaWQsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgICAgdGhpcy5zdGFydE5hbWUgPSBzdGFydE5hbWU7XG4gICAgICAgICAgdGhpcy5jbG9zZU5hbWUgPSBjbG9zZU5hbWU7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgIHRoaXMuaXNWb2lkID0gaXNWb2lkO1xuICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGFnUGxhY2Vob2xkZXIucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRUYWdQbGFjZWhvbGRlcih0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBUYWdQbGFjZWhvbGRlcjtcbiAgfSgpKTtcbiAgdmFyIFBsYWNlaG9sZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUGxhY2Vob2xkZXIodmFsdWUsIG5hbWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBsYWNlaG9sZGVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UGxhY2Vob2xkZXIodGhpcywgY29udGV4dCk7IH07XG4gICAgICByZXR1cm4gUGxhY2Vob2xkZXI7XG4gIH0oKSk7XG4gIHZhciBJY3VQbGFjZWhvbGRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEljdVBsYWNlaG9sZGVyKHZhbHVlLCBuYW1lLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJY3VQbGFjZWhvbGRlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEljdVBsYWNlaG9sZGVyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgICAgcmV0dXJuIEljdVBsYWNlaG9sZGVyO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTID0ge1xuICAgICAgJ0EnOiAnTElOSycsXG4gICAgICAnQic6ICdCT0xEX1RFWFQnLFxuICAgICAgJ0JSJzogJ0xJTkVfQlJFQUsnLFxuICAgICAgJ0VNJzogJ0VNUEhBU0lTRURfVEVYVCcsXG4gICAgICAnSDEnOiAnSEVBRElOR19MRVZFTDEnLFxuICAgICAgJ0gyJzogJ0hFQURJTkdfTEVWRUwyJyxcbiAgICAgICdIMyc6ICdIRUFESU5HX0xFVkVMMycsXG4gICAgICAnSDQnOiAnSEVBRElOR19MRVZFTDQnLFxuICAgICAgJ0g1JzogJ0hFQURJTkdfTEVWRUw1JyxcbiAgICAgICdINic6ICdIRUFESU5HX0xFVkVMNicsXG4gICAgICAnSFInOiAnSE9SSVpPTlRBTF9SVUxFJyxcbiAgICAgICdJJzogJ0lUQUxJQ19URVhUJyxcbiAgICAgICdMSSc6ICdMSVNUX0lURU0nLFxuICAgICAgJ0xJTksnOiAnTUVESUFfTElOSycsXG4gICAgICAnT0wnOiAnT1JERVJFRF9MSVNUJyxcbiAgICAgICdQJzogJ1BBUkFHUkFQSCcsXG4gICAgICAnUSc6ICdRVU9UQVRJT04nLFxuICAgICAgJ1MnOiAnU1RSSUtFVEhST1VHSF9URVhUJyxcbiAgICAgICdTTUFMTCc6ICdTTUFMTF9URVhUJyxcbiAgICAgICdTVUInOiAnU1VCU1RSSVBUJyxcbiAgICAgICdTVVAnOiAnU1VQRVJTQ1JJUFQnLFxuICAgICAgJ1RCT0RZJzogJ1RBQkxFX0JPRFknLFxuICAgICAgJ1REJzogJ1RBQkxFX0NFTEwnLFxuICAgICAgJ1RGT09UJzogJ1RBQkxFX0ZPT1RFUicsXG4gICAgICAnVEgnOiAnVEFCTEVfSEVBREVSX0NFTEwnLFxuICAgICAgJ1RIRUFEJzogJ1RBQkxFX0hFQURFUicsXG4gICAgICAnVFInOiAnVEFCTEVfUk9XJyxcbiAgICAgICdUVCc6ICdNT05PU1BBQ0VEX1RFWFQnLFxuICAgICAgJ1UnOiAnVU5ERVJMSU5FRF9URVhUJyxcbiAgICAgICdVTCc6ICdVTk9SREVSRURfTElTVCcsXG4gIH07XG4gIC8qKlxuICAgKiAgQ3JlYXRlcyB1bmlxdWUgbmFtZXMgZm9yIHBsYWNlaG9sZGVyIHdpdGggZGlmZmVyZW50IGNvbnRlbnQuXG4gICAgKiAqXG4gICAgKiBSZXR1cm5zIHRoZSBzYW1lIHBsYWNlaG9sZGVyIG5hbWUgd2hlbiB0aGUgY29udGVudCBpcyBpZGVudGljYWwuXG4gICAgKiAqXG4gICAqL1xuICB2YXIgUGxhY2Vob2xkZXJSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBQbGFjZWhvbGRlclJlZ2lzdHJ5KCkge1xuICAgICAgICAgIHRoaXMuX3BsYWNlSG9sZGVyTmFtZUNvdW50cyA9IHt9O1xuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZVRvTmFtZSA9IHt9O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRhZ1xuICAgICAgICogQHBhcmFtIHs/fSBhdHRyc1xuICAgICAgICogQHBhcmFtIHs/fSBpc1ZvaWRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBsYWNlaG9sZGVyUmVnaXN0cnkucHJvdG90eXBlLmdldFN0YXJ0VGFnUGxhY2Vob2xkZXJOYW1lID0gZnVuY3Rpb24gKHRhZywgYXR0cnMsIGlzVm9pZCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNpZ25hdHVyZSA9IHRoaXMuX2hhc2hUYWcodGFnLCBhdHRycywgaXNWb2lkKTtcbiAgICAgICAgICBpZiAodGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZVRvTmFtZVtzaWduYXR1cmVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cHBlclRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJhc2VOYW1lID0gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW3VwcGVyVGFnXSB8fCBcIlRBR19cIiArIHVwcGVyVGFnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWUgPSB0aGlzLl9nZW5lcmF0ZVVuaXF1ZU5hbWUoaXNWb2lkID8gYmFzZU5hbWUgOiBcIlNUQVJUX1wiICsgYmFzZU5hbWUpO1xuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZVRvTmFtZVtzaWduYXR1cmVdID0gbmFtZTtcbiAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRDbG9zZVRhZ1BsYWNlaG9sZGVyTmFtZSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzaWduYXR1cmUgPSB0aGlzLl9oYXNoQ2xvc2luZ1RhZyh0YWcpO1xuICAgICAgICAgIGlmICh0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVwcGVyVGFnID0gdGFnLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmFzZU5hbWUgPSBUQUdfVE9fUExBQ0VIT0xERVJfTkFNRVNbdXBwZXJUYWddIHx8IFwiVEFHX1wiICsgdXBwZXJUYWc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZSA9IHRoaXMuX2dlbmVyYXRlVW5pcXVlTmFtZShcIkNMT1NFX1wiICsgYmFzZU5hbWUpO1xuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZVRvTmFtZVtzaWduYXR1cmVdID0gbmFtZTtcbiAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRQbGFjZWhvbGRlck5hbWUgPSBmdW5jdGlvbiAobmFtZSwgY29udGVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVwcGVyTmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzaWduYXR1cmUgPSBcIlBIOiBcIiArIHVwcGVyTmFtZSArIFwiPVwiICsgY29udGVudDtcbiAgICAgICAgICBpZiAodGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZVRvTmFtZVtzaWduYXR1cmVdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bmlxdWVOYW1lID0gdGhpcy5fZ2VuZXJhdGVVbmlxdWVOYW1lKHVwcGVyTmFtZSk7XG4gICAgICAgICAgdGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV0gPSB1bmlxdWVOYW1lO1xuICAgICAgICAgIHJldHVybiB1bmlxdWVOYW1lO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRVbmlxdWVQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2dlbmVyYXRlVW5pcXVlTmFtZShuYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0YWdcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cnNcbiAgICAgICAqIEBwYXJhbSB7P30gaXNWb2lkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5faGFzaFRhZyA9IGZ1bmN0aW9uICh0YWcsIGF0dHJzLCBpc1ZvaWQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IFwiPFwiICsgdGFnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ckF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpLnNvcnQoKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIChcIiBcIiArIG5hbWUgKyBcIj1cIiArIGF0dHJzW25hbWVdKTsgfSkuam9pbignJyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW5kID0gaXNWb2lkID8gJy8+JyA6IFwiPjwvXCIgKyB0YWcgKyBcIj5cIjtcbiAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzdHJBdHRycyArIGVuZDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5faGFzaENsb3NpbmdUYWcgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiB0aGlzLl9oYXNoVGFnKFwiL1wiICsgdGFnLCB7fSwgZmFsc2UpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGJhc2VcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBsYWNlaG9sZGVyUmVnaXN0cnkucHJvdG90eXBlLl9nZW5lcmF0ZVVuaXF1ZU5hbWUgPSBmdW5jdGlvbiAoYmFzZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHQgPSB0aGlzLl9wbGFjZUhvbGRlck5hbWVDb3VudHNbYmFzZV07XG4gICAgICAgICAgdGhpcy5fcGxhY2VIb2xkZXJOYW1lQ291bnRzW2Jhc2VdID0gbmV4dCA/IG5leHQgKyAxIDogMTtcbiAgICAgICAgICByZXR1cm4gbmV4dCA/IGJhc2UgKyBcIl9cIiArIG5leHQgOiBiYXNlO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQbGFjZWhvbGRlclJlZ2lzdHJ5O1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9leHBQYXJzZXIgPSBuZXcgUGFyc2VyKG5ldyBMZXhlcigpKTtcbiAgLyoqXG4gICAqICBSZXR1cm5zIGEgZnVuY3Rpb24gY29udmVydGluZyBodG1sIG5vZGVzIHRvIGFuIGkxOG4gTWVzc2FnZSBnaXZlbiBhbiBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAqIEBwYXJhbSB7P30gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlSTE4bk1lc3NhZ2VGYWN0b3J5KGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0b3IgPSBuZXcgX0kxOG5WaXNpdG9yKF9leHBQYXJzZXIsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlcywgbWVhbmluZywgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci50b0kxOG5NZXNzYWdlKG5vZGVzLCBtZWFuaW5nLCBkZXNjcmlwdGlvbik7XG4gICAgICB9O1xuICB9XG4gIHZhciBfSTE4blZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9leHByZXNzaW9uUGFyc2VyXG4gICAgICAgKiBAcGFyYW0gez99IF9pbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9JMThuVmlzaXRvcihfZXhwcmVzc2lvblBhcnNlciwgX2ludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICB0aGlzLl9leHByZXNzaW9uUGFyc2VyID0gX2V4cHJlc3Npb25QYXJzZXI7XG4gICAgICAgICAgdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyA9IF9pbnRlcnBvbGF0aW9uQ29uZmlnO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVzXG4gICAgICAgKiBAcGFyYW0gez99IG1lYW5pbmdcbiAgICAgICAqIEBwYXJhbSB7P30gZGVzY3JpcHRpb25cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9JMThuVmlzaXRvci5wcm90b3R5cGUudG9JMThuTWVzc2FnZSA9IGZ1bmN0aW9uIChub2RlcywgbWVhbmluZywgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLl9pc0ljdSA9IG5vZGVzLmxlbmd0aCA9PSAxICYmIG5vZGVzWzBdIGluc3RhbmNlb2YgRXhwYW5zaW9uO1xuICAgICAgICAgIHRoaXMuX2ljdURlcHRoID0gMDtcbiAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclJlZ2lzdHJ5ID0gbmV3IFBsYWNlaG9sZGVyUmVnaXN0cnkoKTtcbiAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudCA9IHt9O1xuICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyVG9NZXNzYWdlID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaTE4bm9kZXMgPSB2aXNpdEFsbCh0aGlzLCBub2Rlcywge30pO1xuICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShpMThub2RlcywgdGhpcy5fcGxhY2Vob2xkZXJUb0NvbnRlbnQsIHRoaXMuX3BsYWNlaG9sZGVyVG9NZXNzYWdlLCBtZWFuaW5nLCBkZXNjcmlwdGlvbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9JMThuVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSB2aXNpdEFsbCh0aGlzLCBlbC5jaGlsZHJlbik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cnMgPSB7fTtcbiAgICAgICAgICBlbC5hdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgICAgIC8vIERvIG5vdCB2aXNpdCB0aGUgYXR0cmlidXRlcywgdHJhbnNsYXRhYmxlIG9uZXMgYXJlIHRvcC1sZXZlbCBBU1RzXG4gICAgICAgICAgICAgIGF0dHJzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzVm9pZCA9IGdldEh0bWxUYWdEZWZpbml0aW9uKGVsLm5hbWUpLmlzVm9pZDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydFBoTmFtZSA9IHRoaXMuX3BsYWNlaG9sZGVyUmVnaXN0cnkuZ2V0U3RhcnRUYWdQbGFjZWhvbGRlck5hbWUoZWwubmFtZSwgYXR0cnMsIGlzVm9pZCk7XG4gICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXJUb0NvbnRlbnRbc3RhcnRQaE5hbWVdID0gZWwuc291cmNlU3Bhbi50b1N0cmluZygpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsb3NlUGhOYW1lID0gJyc7XG4gICAgICAgICAgaWYgKCFpc1ZvaWQpIHtcbiAgICAgICAgICAgICAgY2xvc2VQaE5hbWUgPSB0aGlzLl9wbGFjZWhvbGRlclJlZ2lzdHJ5LmdldENsb3NlVGFnUGxhY2Vob2xkZXJOYW1lKGVsLm5hbWUpO1xuICAgICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudFtjbG9zZVBoTmFtZV0gPSBcIjwvXCIgKyBlbC5uYW1lICsgXCI+XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgVGFnUGxhY2Vob2xkZXIoZWwubmFtZSwgYXR0cnMsIHN0YXJ0UGhOYW1lLCBjbG9zZVBoTmFtZSwgY2hpbGRyZW4sIGlzVm9pZCwgZWwuc291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbihhdHRyaWJ1dGUudmFsdWUsIGF0dHJpYnV0ZS5zb3VyY2VTcGFuKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0VGV4dFdpdGhJbnRlcnBvbGF0aW9uKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0kxOG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpY3VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0kxOG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMuX2ljdURlcHRoKys7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaTE4bkljdUNhc2VzID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaTE4bkljdSA9IG5ldyBJY3UoaWN1LnN3aXRjaFZhbHVlLCBpY3UudHlwZSwgaTE4bkljdUNhc2VzLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgICAgICAgaWN1LmNhc2VzLmZvckVhY2goZnVuY3Rpb24gKGNhemUpIHtcbiAgICAgICAgICAgICAgaTE4bkljdUNhc2VzW2NhemUudmFsdWVdID0gbmV3IENvbnRhaW5lcihjYXplLmV4cHJlc3Npb24ubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzLCB7fSk7IH0pLCBjYXplLmV4cFNvdXJjZVNwYW4pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX2ljdURlcHRoLS07XG4gICAgICAgICAgaWYgKHRoaXMuX2lzSWN1IHx8IHRoaXMuX2ljdURlcHRoID4gMCkge1xuICAgICAgICAgICAgICAvLyBSZXR1cm5zIGFuIElDVSBub2RlIHdoZW46XG4gICAgICAgICAgICAgIC8vIC0gdGhlIG1lc3NhZ2UgKHZzIGEgcGFydCBvZiB0aGUgbWVzc2FnZSkgaXMgYW4gSUNVIG1lc3NhZ2UsIG9yXG4gICAgICAgICAgICAgIC8vIC0gdGhlIElDVSBtZXNzYWdlIGlzIG5lc3RlZC5cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwUGggPSB0aGlzLl9wbGFjZWhvbGRlclJlZ2lzdHJ5LmdldFVuaXF1ZVBsYWNlaG9sZGVyKFwiVkFSX1wiICsgaWN1LnR5cGUpO1xuICAgICAgICAgICAgICBpMThuSWN1LmV4cHJlc3Npb25QbGFjZWhvbGRlciA9IGV4cFBoO1xuICAgICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudFtleHBQaF0gPSBpY3Uuc3dpdGNoVmFsdWU7XG4gICAgICAgICAgICAgIHJldHVybiBpMThuSWN1O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbHNlIHJldHVybnMgYSBwbGFjZWhvbGRlclxuICAgICAgICAgIC8vIElDVSBwbGFjZWhvbGRlcnMgc2hvdWxkIG5vdCBiZSByZXBsYWNlZCB3aXRoIHRoZWlyIG9yaWdpbmFsIGNvbnRlbnQgYnV0IHdpdGggdGhlIHRoZWlyXG4gICAgICAgICAgLy8gdHJhbnNsYXRpb25zLiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2aXNpdG9yICh0aGV5IGFyZSBub3QgcmUtZW50cmFudCkgdG8gY29tcHV0ZSB0aGVcbiAgICAgICAgICAvLyBtZXNzYWdlIGlkLlxuICAgICAgICAgIC8vIFRPRE8odmljYik6IGFkZCBhIGh0bWwuTm9kZSAtPiBpMThuLk1lc3NhZ2UgY2FjaGUgdG8gYXZvaWQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgbXNnXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGhOYW1lID0gdGhpcy5fcGxhY2Vob2xkZXJSZWdpc3RyeS5nZXRQbGFjZWhvbGRlck5hbWUoJ0lDVScsIGljdS5zb3VyY2VTcGFuLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0b3IgPSBuZXcgX0kxOG5WaXNpdG9yKHRoaXMuX2V4cHJlc3Npb25QYXJzZXIsIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyVG9NZXNzYWdlW3BoTmFtZV0gPSB2aXNpdG9yLnRvSTE4bk1lc3NhZ2UoW2ljdV0sICcnLCAnJyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJY3VQbGFjZWhvbGRlcihpMThuSWN1LCBwaE5hbWUsIGljdS5zb3VyY2VTcGFuKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChpY3VDYXNlLCBjb250ZXh0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBjb2RlJyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRleHRcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0kxOG5WaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRUZXh0V2l0aEludGVycG9sYXRpb24gPSBmdW5jdGlvbiAodGV4dCwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNwbGl0SW50ZXJwb2xhdGlvbiA9IHRoaXMuX2V4cHJlc3Npb25QYXJzZXIuc3BsaXRJbnRlcnBvbGF0aW9uKHRleHQsIHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKSwgdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgaWYgKCFzcGxpdEludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgLy8gTm8gZXhwcmVzc2lvbiwgcmV0dXJuIGEgc2luZ2xlIHRleHRcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0JDEodGV4dCwgc291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHVybiBhIGdyb3VwIG9mIHRleHQgKyBleHByZXNzaW9uc1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGFpbmVyID0gbmV3IENvbnRhaW5lcihub2Rlcywgc291cmNlU3Bhbik7XG4gICAgICAgICAgdmFyIF9hID0gdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZywgc0RlbGltaXRlciA9IF9hLnN0YXJ0LCBlRGVsaW1pdGVyID0gX2EuZW5kO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBzcGxpdEludGVycG9sYXRpb24uc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvbiA9IHNwbGl0SW50ZXJwb2xhdGlvbi5leHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmFzZU5hbWUgPSBfZXh0cmFjdFBsYWNlaG9sZGVyTmFtZShleHByZXNzaW9uKSB8fCAnSU5URVJQT0xBVElPTic7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBoTmFtZSA9IHRoaXMuX3BsYWNlaG9sZGVyUmVnaXN0cnkuZ2V0UGxhY2Vob2xkZXJOYW1lKGJhc2VOYW1lLCBleHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgaWYgKHNwbGl0SW50ZXJwb2xhdGlvbi5zdHJpbmdzW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgZW1wdHkgc3RyaW5nc1xuICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgVGV4dCQxKHNwbGl0SW50ZXJwb2xhdGlvbi5zdHJpbmdzW2ldLCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgUGxhY2Vob2xkZXIoZXhwcmVzc2lvbiwgcGhOYW1lLCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyVG9Db250ZW50W3BoTmFtZV0gPSBzRGVsaW1pdGVyICsgZXhwcmVzc2lvbiArIGVEZWxpbWl0ZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsYXN0IGluZGV4IGNvbnRhaW5zIG5vIGV4cHJlc3Npb25cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0U3RyaW5nSWR4ID0gc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAoc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3NbbGFzdFN0cmluZ0lkeF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG5vZGVzLnB1c2gobmV3IFRleHQkMShzcGxpdEludGVycG9sYXRpb24uc3RyaW5nc1tsYXN0U3RyaW5nSWR4XSwgc291cmNlU3BhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfSTE4blZpc2l0b3I7XG4gIH0oKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9DVVNUT01fUEhfRVhQID0gL1xcL1xcL1tcXHNcXFNdKmkxOG5bXFxzXFxTXSpcXChbXFxzXFxTXSpwaFtcXHNcXFNdKj1bXFxzXFxTXSpcIihbXFxzXFxTXSo/KVwiW1xcc1xcU10qXFwpL2c7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZXh0cmFjdFBsYWNlaG9sZGVyTmFtZShpbnB1dCkge1xuICAgICAgcmV0dXJuIGlucHV0LnNwbGl0KF9DVVNUT01fUEhfRVhQKVsxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQ3ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogIEFuIGkxOG4gZXJyb3IuXG4gICAqL1xuICB2YXIgSTE4bkVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ3KEkxOG5FcnJvciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcGFuXG4gICAgICAgKiBAcGFyYW0gez99IG1zZ1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBJMThuRXJyb3Ioc3BhbiwgbXNnKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3BhbiwgbXNnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBJMThuRXJyb3I7XG4gIH0oUGFyc2VFcnJvcikpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9JMThOX0FUVFIgPSAnaTE4bic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9JMThOX0FUVFJfUFJFRklYID0gJ2kxOG4tJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0kxOE5fQ09NTUVOVF9QUkVGSVhfUkVHRVhQID0gL15pMThuOj8vO1xuICAvKipcbiAgICogIEV4dHJhY3QgdHJhbnNsYXRhYmxlIG1lc3NhZ2VzIGZyb20gYW4gaHRtbCBBU1RcbiAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgKiBAcGFyYW0gez99IGludGVycG9sYXRpb25Db25maWdcbiAgICogQHBhcmFtIHs/fSBpbXBsaWNpdFRhZ3NcbiAgICogQHBhcmFtIHs/fSBpbXBsaWNpdEF0dHJzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBleHRyYWN0TWVzc2FnZXMobm9kZXMsIGludGVycG9sYXRpb25Db25maWcsIGltcGxpY2l0VGFncywgaW1wbGljaXRBdHRycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRvciA9IG5ldyBfVmlzaXRvcihpbXBsaWNpdFRhZ3MsIGltcGxpY2l0QXR0cnMpO1xuICAgICAgcmV0dXJuIHZpc2l0b3IuZXh0cmFjdChub2RlcywgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICogQHBhcmFtIHs/fSB0cmFuc2xhdGlvbnNcbiAgICogQHBhcmFtIHs/fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAqIEBwYXJhbSB7P30gaW1wbGljaXRUYWdzXG4gICAqIEBwYXJhbSB7P30gaW1wbGljaXRBdHRyc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VUcmFuc2xhdGlvbnMobm9kZXMsIHRyYW5zbGF0aW9ucywgaW50ZXJwb2xhdGlvbkNvbmZpZywgaW1wbGljaXRUYWdzLCBpbXBsaWNpdEF0dHJzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdG9yID0gbmV3IF9WaXNpdG9yKGltcGxpY2l0VGFncywgaW1wbGljaXRBdHRycyk7XG4gICAgICByZXR1cm4gdmlzaXRvci5tZXJnZShub2RlcywgdHJhbnNsYXRpb25zLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgfVxuICB2YXIgRXh0cmFjdGlvblJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZXNcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEV4dHJhY3Rpb25SZXN1bHQobWVzc2FnZXMsIGVycm9ycykge1xuICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgIH1cbiAgICAgIHJldHVybiBFeHRyYWN0aW9uUmVzdWx0O1xuICB9KCkpO1xuICB2YXIgX1Zpc2l0b3JNb2RlID0ge307XG4gIF9WaXNpdG9yTW9kZS5FeHRyYWN0ID0gMDtcbiAgX1Zpc2l0b3JNb2RlLk1lcmdlID0gMTtcbiAgX1Zpc2l0b3JNb2RlW19WaXNpdG9yTW9kZS5FeHRyYWN0XSA9IFwiRXh0cmFjdFwiO1xuICBfVmlzaXRvck1vZGVbX1Zpc2l0b3JNb2RlLk1lcmdlXSA9IFwiTWVyZ2VcIjtcbiAgLyoqXG4gICAqICBUaGlzIFZpc2l0b3IgaXMgdXNlZDpcbiAgICAqIDEuIHRvIGV4dHJhY3QgYWxsIHRoZSB0cmFuc2xhdGFibGUgc3RyaW5ncyBmcm9tIGFuIGh0bWwgQVNUIChzZWUgYGV4dHJhY3QoKWApLFxuICAgICogMi4gdG8gcmVwbGFjZSB0aGUgdHJhbnNsYXRhYmxlIHN0cmluZ3Mgd2l0aCB0aGUgYWN0dWFsIHRyYW5zbGF0aW9ucyAoc2VlIGBtZXJnZSgpYClcbiAgICAqICpcbiAgICovXG4gIHZhciBfVmlzaXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX2ltcGxpY2l0VGFnc1xuICAgICAgICogQHBhcmFtIHs/fSBfaW1wbGljaXRBdHRyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfVmlzaXRvcihfaW1wbGljaXRUYWdzLCBfaW1wbGljaXRBdHRycykge1xuICAgICAgICAgIHRoaXMuX2ltcGxpY2l0VGFncyA9IF9pbXBsaWNpdFRhZ3M7XG4gICAgICAgICAgdGhpcy5faW1wbGljaXRBdHRycyA9IF9pbXBsaWNpdEF0dHJzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgRXh0cmFjdHMgdGhlIG1lc3NhZ2VzIGZyb20gdGhlIHRyZWVcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAobm9kZXMsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMuX2luaXQoX1Zpc2l0b3JNb2RlLkV4dHJhY3QsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMsIG51bGwpOyB9KTtcbiAgICAgICAgICBpZiAodGhpcy5faW5JMThuQmxvY2spIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3Iobm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0sICdVbmNsb3NlZCBibG9jaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IEV4dHJhY3Rpb25SZXN1bHQodGhpcy5fbWVzc2FnZXMsIHRoaXMuX2Vycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUmV0dXJucyBhIHRyZWUgd2hlcmUgYWxsIHRyYW5zbGF0YWJsZSBub2RlcyBhcmUgdHJhbnNsYXRlZFxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHBhcmFtIHs/fSB0cmFuc2xhdGlvbnNcbiAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKG5vZGVzLCB0cmFuc2xhdGlvbnMsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICB0aGlzLl9pbml0KF9WaXNpdG9yTW9kZS5NZXJnZSwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zO1xuICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHNpbmdsZSBmYWtlIHJvb3QgZWxlbWVudFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHdyYXBwZXIgPSBuZXcgRWxlbWVudCgnd3JhcHBlcicsIFtdLCBub2RlcywgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNsYXRlZE5vZGUgPSB3cmFwcGVyLnZpc2l0KHRoaXMsIG51bGwpO1xuICAgICAgICAgIGlmICh0aGlzLl9pbkkxOG5CbG9jaykge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSwgJ1VuY2xvc2VkIGJsb2NrJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VUcmVlUmVzdWx0KHRyYW5zbGF0ZWROb2RlLmNoaWxkcmVuLCB0aGlzLl9lcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpY3VDYXNlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoaWN1Q2FzZSwgY29udGV4dCkge1xuICAgICAgICAgIC8vIFBhcnNlIGNhc2VzIGZvciB0cmFuc2xhdGFibGUgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvbiA9IHZpc2l0QWxsKHRoaXMsIGljdUNhc2UuZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IF9WaXNpdG9yTW9kZS5NZXJnZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cGFuc2lvbkNhc2UoaWN1Q2FzZS52YWx1ZSwgZXhwcmVzc2lvbiwgaWN1Q2FzZS5zb3VyY2VTcGFuLCBpY3VDYXNlLnZhbHVlU291cmNlU3BhbiwgaWN1Q2FzZS5leHBTb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGljdVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgICAgdGhpcy5fbWF5QmVBZGRCbG9ja0NoaWxkcmVuKGljdSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd2FzSW5JY3UgPSB0aGlzLl9pbkljdTtcbiAgICAgICAgICBpZiAoIXRoaXMuX2luSWN1KSB7XG4gICAgICAgICAgICAgIC8vIG5lc3RlZCBJQ1UgbWVzc2FnZXMgc2hvdWxkIG5vdCBiZSBleHRyYWN0ZWQgYnV0IHRvcC1sZXZlbCB0cmFuc2xhdGVkIGFzIGEgd2hvbGVcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKFtpY3VdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9pbkljdSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhc2VzID0gdmlzaXRBbGwodGhpcywgaWN1LmNhc2VzLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gX1Zpc2l0b3JNb2RlLk1lcmdlKSB7XG4gICAgICAgICAgICAgIGljdSA9IG5ldyBFeHBhbnNpb24oaWN1LnN3aXRjaFZhbHVlLCBpY3UudHlwZSwgY2FzZXMsIGljdS5zb3VyY2VTcGFuLCBpY3Uuc3dpdGNoVmFsdWVTb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faW5JY3UgPSB3YXNJbkljdTtcbiAgICAgICAgICByZXR1cm4gaWN1O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21tZW50XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzT3BlbmluZyA9IF9pc09wZW5pbmdDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgIGlmIChpc09wZW5pbmcgJiYgdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoY29tbWVudCwgJ0NvdWxkIG5vdCBzdGFydCBhIGJsb2NrIGluc2lkZSBhIHRyYW5zbGF0YWJsZSBzZWN0aW9uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNDbG9zaW5nID0gX2lzQ2xvc2luZ0NvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgaWYgKGlzQ2xvc2luZyAmJiAhdGhpcy5faW5JMThuQmxvY2spIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoY29tbWVudCwgJ1RyeWluZyB0byBjbG9zZSBhbiB1bm9wZW5lZCBibG9jaycpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5faW5JMThuTm9kZSAmJiAhdGhpcy5faW5JY3UpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbkkxOG5CbG9jaykge1xuICAgICAgICAgICAgICAgICAgaWYgKGlzT3BlbmluZykge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luSTE4bkJsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja1N0YXJ0RGVwdGggPSB0aGlzLl9kZXB0aDtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja0NoaWxkcmVuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmxvY2tNZWFuaW5nQW5kRGVzYyA9IGNvbW1lbnQudmFsdWUucmVwbGFjZShfSTE4Tl9DT01NRU5UX1BSRUZJWF9SRUdFWFAsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlblRyYW5zbGF0YWJsZVNlY3Rpb24oY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNDbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlcHRoID09IHRoaXMuX2Jsb2NrU3RhcnREZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZVRyYW5zbGF0YWJsZVNlY3Rpb24oY29tbWVudCwgdGhpcy5fYmxvY2tDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luSTE4bkJsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lc3NhZ2UgPSB0aGlzLl9hZGRNZXNzYWdlKHRoaXMuX2Jsb2NrQ2hpbGRyZW4sIHRoaXMuX2Jsb2NrTWVhbmluZ0FuZERlc2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhdHRyaWJ1dGVzIGluIHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gdGhpcy5fdHJhbnNsYXRlTWVzc2FnZShjb21tZW50LCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0QWxsKHRoaXMsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGNvbW1lbnQsICdJMThOIGJsb2NrcyBzaG91bGQgbm90IGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkge1xuICAgICAgICAgIGlmICh0aGlzLl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9tYXlCZUFkZEJsb2NrQ2hpbGRyZW4odGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLl9tYXlCZUFkZEJsb2NrQ2hpbGRyZW4oZWwpO1xuICAgICAgICAgIHRoaXMuX2RlcHRoKys7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd2FzSW5JMThuTm9kZSA9IHRoaXMuX2luSTE4bk5vZGU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd2FzSW5JbXBsaWNpdE5vZGUgPSB0aGlzLl9pbkltcGxpY2l0Tm9kZTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZE5vZGVzO1xuICAgICAgICAgIC8vIEV4dHJhY3Qgb25seSB0b3AgbGV2ZWwgbm9kZXMgd2l0aCB0aGUgKGltcGxpY2l0KSBcImkxOG5cIiBhdHRyaWJ1dGUgaWYgbm90IGluIGEgYmxvY2sgb3IgYW4gSUNVXG4gICAgICAgICAgLy8gbWVzc2FnZVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGkxOG5BdHRyID0gX2dldEkxOG5BdHRyKGVsKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc0ltcGxpY2l0ID0gdGhpcy5faW1wbGljaXRUYWdzLnNvbWUoZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gZWwubmFtZSA9PT0gdGFnOyB9KSAmJiAhdGhpcy5faW5JY3UgJiZcbiAgICAgICAgICAgICAgIXRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzVG9wTGV2ZWxJbXBsaWNpdCA9ICF3YXNJbkltcGxpY2l0Tm9kZSAmJiBpc0ltcGxpY2l0O1xuICAgICAgICAgIHRoaXMuX2luSW1wbGljaXROb2RlID0gdGhpcy5faW5JbXBsaWNpdE5vZGUgfHwgaXNJbXBsaWNpdDtcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uICYmICF0aGlzLl9pbkljdSkge1xuICAgICAgICAgICAgICBpZiAoaTE4bkF0dHIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IHRyYW5zbGF0aW9uXG4gICAgICAgICAgICAgICAgICB0aGlzLl9pbkkxOG5Ob2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lc3NhZ2UgPSB0aGlzLl9hZGRNZXNzYWdlKGVsLmNoaWxkcmVuLCBpMThuQXR0ci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzID0gdGhpcy5fdHJhbnNsYXRlTWVzc2FnZShlbCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoaXNUb3BMZXZlbEltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCB0cmFuc2xhdGlvblxuICAgICAgICAgICAgICAgICAgdGhpcy5faW5JMThuTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXNzYWdlID0gdGhpcy5fYWRkTWVzc2FnZShlbC5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzID0gdGhpcy5fdHJhbnNsYXRlTWVzc2FnZShlbCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT0gX1Zpc2l0b3JNb2RlLkV4dHJhY3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzVHJhbnNsYXRhYmxlID0gaTE4bkF0dHIgfHwgaXNUb3BMZXZlbEltcGxpY2l0O1xuICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhbnNsYXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlblRyYW5zbGF0YWJsZVNlY3Rpb24oZWwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmlzaXRBbGwodGhpcywgZWwuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhbnNsYXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VUcmFuc2xhdGFibGVTZWN0aW9uKGVsLCBlbC5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IF9WaXNpdG9yTW9kZS5NZXJnZSAmJiAhaTE4bkF0dHIgJiYgIWlzVG9wTGV2ZWxJbXBsaWNpdCkge1xuICAgICAgICAgICAgICAgICAgY2hpbGROb2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZWwuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdGVkID0gY2hpbGQudmlzaXQoX3RoaXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkICYmICFfdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCB0aGUgY2hpbGRyZW4gZnJvbSB0cmFuc2xhdGFibGUgc2VjdGlvbnMgKD0gaTE4biBibG9ja3MgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhleSB3aWxsIGJlIGFkZGVkIHdoZW4gdGhlIHNlY3Rpb24gaXMgY2xvc2UgKGkuZS4gb24gYDwhLS0gL2kxOG4gLS0+YClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlcyA9IGNoaWxkTm9kZXMuY29uY2F0KHZpc2l0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoaTE4bkF0dHIgfHwgaXNUb3BMZXZlbEltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlbCwgJ0NvdWxkIG5vdCBtYXJrIGFuIGVsZW1lbnQgYXMgdHJhbnNsYXRhYmxlIGluc2lkZSBhIHRyYW5zbGF0YWJsZSBzZWN0aW9uJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT0gX1Zpc2l0b3JNb2RlLkV4dHJhY3QpIHtcbiAgICAgICAgICAgICAgICAgIC8vIERlc2NlbmQgaW50byBjaGlsZCBub2RlcyBmb3IgZXh0cmFjdGlvblxuICAgICAgICAgICAgICAgICAgdmlzaXRBbGwodGhpcywgZWwuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09IF9WaXNpdG9yTW9kZS5NZXJnZSkge1xuICAgICAgICAgICAgICAgICAgLy8gVHJhbnNsYXRlIGF0dHJpYnV0ZXMgaW4gSUNVIG1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICBlbC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0ZWQgPSBjaGlsZC52aXNpdChfdGhpcywgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHZpc2l0ZWQgJiYgIV90aGlzLl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgYWRkIHRoZSBjaGlsZHJlbiBmcm9tIHRyYW5zbGF0YWJsZSBzZWN0aW9ucyAoPSBpMThuIGJsb2NrcyBoZXJlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGV5IHdpbGwgYmUgYWRkZWQgd2hlbiB0aGUgc2VjdGlvbiBpcyBjbG9zZSAoaS5lLiBvbiBgPCEtLSAvaTE4biAtLT5gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGVzID0gY2hpbGROb2Rlcy5jb25jYXQodmlzaXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fdmlzaXRBdHRyaWJ1dGVzT2YoZWwpO1xuICAgICAgICAgIHRoaXMuX2RlcHRoLS07XG4gICAgICAgICAgdGhpcy5faW5JMThuTm9kZSA9IHdhc0luSTE4bk5vZGU7XG4gICAgICAgICAgdGhpcy5faW5JbXBsaWNpdE5vZGUgPSB3YXNJbkltcGxpY2l0Tm9kZTtcbiAgICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gX1Zpc2l0b3JNb2RlLk1lcmdlKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBjaGlsZE5vZGVzIGluIHRyYW5zbGF0YWJsZSBzZWN0aW9ucyAtIHRob3NlIG5vZGVzIHdpbGwgYmUgcmVwbGFjZSBhbnl3YXlcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNsYXRlZEF0dHJzID0gdGhpcy5fdHJhbnNsYXRlQXR0cmlidXRlcyhlbCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbC5uYW1lLCB0cmFuc2xhdGVkQXR0cnMsIGNoaWxkTm9kZXMsIGVsLnNvdXJjZVNwYW4sIGVsLnN0YXJ0U291cmNlU3BhbiwgZWwuZW5kU291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUgY29kZScpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcGFyYW0gez99IGludGVycG9sYXRpb25Db25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChtb2RlLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZSA9IG1vZGU7XG4gICAgICAgICAgdGhpcy5faW5JMThuQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9pbkkxOG5Ob2RlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fZGVwdGggPSAwO1xuICAgICAgICAgIHRoaXMuX2luSWN1ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fbXNnQ291bnRBdFNlY3Rpb25TdGFydCA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2luSW1wbGljaXROb2RlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlSTE4bk1lc3NhZ2UgPSBjcmVhdGVJMThuTWVzc2FnZUZhY3RvcnkoaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0QXR0cmlidXRlc09mID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBsaWNpdEF0dHJOYW1lVG9WYWx1ZSA9IHt9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGltcGxpY2l0QXR0ck5hbWVzID0gdGhpcy5faW1wbGljaXRBdHRyc1tlbC5uYW1lXSB8fCBbXTtcbiAgICAgICAgICBlbC5hdHRycy5maWx0ZXIoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZS5zdGFydHNXaXRoKF9JMThOX0FUVFJfUFJFRklYKTsgfSlcbiAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGV4cGxpY2l0QXR0ck5hbWVUb1ZhbHVlW2F0dHIubmFtZS5zbGljZShfSTE4Tl9BVFRSX1BSRUZJWC5sZW5ndGgpXSA9XG4gICAgICAgICAgICAgIGF0dHIudmFsdWU7IH0pO1xuICAgICAgICAgIGVsLmF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZSBpbiBleHBsaWNpdEF0dHJOYW1lVG9WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuX2FkZE1lc3NhZ2UoW2F0dHJdLCBleHBsaWNpdEF0dHJOYW1lVG9WYWx1ZVthdHRyLm5hbWVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChpbXBsaWNpdEF0dHJOYW1lcy5zb21lKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBhdHRyLm5hbWUgPT09IG5hbWU7IH0pKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fYWRkTWVzc2FnZShbYXR0cl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/PX0gbWVhbmluZ0FuZERlc2NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS5fYWRkTWVzc2FnZSA9IGZ1bmN0aW9uIChhc3QsIG1lYW5pbmdBbmREZXNjKSB7XG4gICAgICAgICAgaWYgKGFzdC5sZW5ndGggPT0gMCB8fFxuICAgICAgICAgICAgICBhc3QubGVuZ3RoID09IDEgJiYgYXN0WzBdIGluc3RhbmNlb2YgQXR0cmlidXRlJDEgJiYgISgoYXN0WzBdKSkudmFsdWUpIHtcbiAgICAgICAgICAgICAgLy8gRG8gbm90IGNyZWF0ZSBlbXB0eSBtZXNzYWdlc1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBfYSA9IF9zcGxpdE1lYW5pbmdBbmREZXNjKG1lYW5pbmdBbmREZXNjKSwgbWVhbmluZyA9IF9hWzBdLCBkZXNjcmlwdGlvbiA9IF9hWzFdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lc3NhZ2UgPSB0aGlzLl9jcmVhdGVJMThuTWVzc2FnZShhc3QsIG1lYW5pbmcsIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUuX3RyYW5zbGF0ZU1lc3NhZ2UgPSBmdW5jdGlvbiAoZWwsIG1lc3NhZ2UpIHtcbiAgICAgICAgICBpZiAobWVzc2FnZSAmJiB0aGlzLl9tb2RlID09PSBfVmlzaXRvck1vZGUuTWVyZ2UpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZXMgPSB0aGlzLl90cmFuc2xhdGlvbnMuZ2V0KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlbCwgXCJUcmFuc2xhdGlvbiB1bmF2YWlsYWJsZSBmb3IgbWVzc2FnZSBpZD1cXFwiXCIgKyB0aGlzLl90cmFuc2xhdGlvbnMuZGlnZXN0KG1lc3NhZ2UpICsgXCJcXFwiXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUuX3RyYW5zbGF0ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGF0dHJpYnV0ZXMgPSBlbC5hdHRycztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpMThuQXR0cmlidXRlTWVhbmluZ3MgPSB7fTtcbiAgICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZS5zdGFydHNXaXRoKF9JMThOX0FUVFJfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgICAgaTE4bkF0dHJpYnV0ZU1lYW5pbmdzW2F0dHIubmFtZS5zbGljZShfSTE4Tl9BVFRSX1BSRUZJWC5sZW5ndGgpXSA9XG4gICAgICAgICAgICAgICAgICAgICAgX3NwbGl0TWVhbmluZ0FuZERlc2MoYXR0ci52YWx1ZSlbMF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2xhdGVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgICBpZiAoYXR0ci5uYW1lID09PSBfSTE4Tl9BVFRSIHx8IGF0dHIubmFtZS5zdGFydHNXaXRoKF9JMThOX0FUVFJfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgaTE4biBzcGVjaWZpYyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGF0dHIudmFsdWUgJiYgYXR0ci52YWx1ZSAhPSAnJyAmJiBpMThuQXR0cmlidXRlTWVhbmluZ3MuaGFzT3duUHJvcGVydHkoYXR0ci5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVhbmluZyA9IGkxOG5BdHRyaWJ1dGVNZWFuaW5nc1thdHRyLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVzc2FnZSA9IF90aGlzLl9jcmVhdGVJMThuTWVzc2FnZShbYXR0cl0sIG1lYW5pbmcsICcnKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gX3RoaXMuX3RyYW5zbGF0aW9ucy5nZXQobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXNbMF0gaW5zdGFuY2VvZiBUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gKChub2Rlc1swXSkpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkQXR0cmlidXRlcy5wdXNoKG5ldyBBdHRyaWJ1dGUkMShhdHRyLm5hbWUsIHZhbHVlLCBhdHRyLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihlbCwgXCJVbmV4cGVjdGVkIHRyYW5zbGF0aW9uIGZvciBhdHRyaWJ1dGUgXFxcIlwiICsgYXR0ci5uYW1lICsgXCJcXFwiIChpZD1cXFwiXCIgKyBfdGhpcy5fdHJhbnNsYXRpb25zLmRpZ2VzdChtZXNzYWdlKSArIFwiXFxcIilcIik7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKGVsLCBcIlRyYW5zbGF0aW9uIHVuYXZhaWxhYmxlIGZvciBhdHRyaWJ1dGUgXFxcIlwiICsgYXR0ci5uYW1lICsgXCJcXFwiIChpZD1cXFwiXCIgKyBfdGhpcy5fdHJhbnNsYXRpb25zLmRpZ2VzdChtZXNzYWdlKSArIFwiXFxcIilcIik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkQXR0cmlidXRlcy5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRBdHRyaWJ1dGVzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIEFkZCB0aGUgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBibG9jayB3aGVuOlxuICAgICAgICAqIC0gd2UgYXJlIGluIGEgYmxvY2ssXG4gICAgICAgICogLSB3ZSBhcmUgbm90IGluc2lkZSBhIElDVSBtZXNzYWdlICh0aG9zZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5KSxcbiAgICAgICAgKiAtIHRoZSBub2RlIGlzIGEgXCJkaXJlY3QgY2hpbGRcIiBvZiB0aGUgYmxvY2tcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLl9tYXlCZUFkZEJsb2NrQ2hpbGRyZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9pbkkxOG5CbG9jayAmJiAhdGhpcy5faW5JY3UgJiYgdGhpcy5fZGVwdGggPT0gdGhpcy5fYmxvY2tTdGFydERlcHRoKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Jsb2NrQ2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgTWFya3MgdGhlIHN0YXJ0IG9mIGEgc2VjdGlvbiwgc2VlIGBfZW5kU2VjdGlvbmBcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLl9vcGVuVHJhbnNsYXRhYmxlU2VjdGlvbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKG5vZGUsICdVbmV4cGVjdGVkIHNlY3Rpb24gc3RhcnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX21zZ0NvdW50QXRTZWN0aW9uU3RhcnQgPSB0aGlzLl9tZXNzYWdlcy5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfVmlzaXRvci5wcm90b3R5cGUsIFwiX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgQSB0cmFuc2xhdGFibGUgc2VjdGlvbiBjb3VsZCBiZTpcbiAgICAgICAgICAgICogLSBhIHRyYW5zbGF0YWJsZSBlbGVtZW50LFxuICAgICAgICAgICAgKiAtIG5vZGVzIGJldHdlZW4gYDwhLS0gaTE4biAtLT5gIGFuZCBgPCEtLSAvaTE4biAtLT5gIGNvbW1lbnRzXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21zZ0NvdW50QXRTZWN0aW9uU3RhcnQgIT09IHZvaWQgMDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogIFRlcm1pbmF0ZXMgYSBzZWN0aW9uLlxuICAgICAgICAqICpcbiAgICAgICAgKiBJZiBhIHNlY3Rpb24gaGFzIG9ubHkgb25lIHNpZ25pZmljYW50IGNoaWxkcmVuIChjb21tZW50cyBub3Qgc2lnbmlmaWNhbnQpIHRoZW4gd2Ugc2hvdWxkIG5vdFxuICAgICAgICAqIGtlZXAgdGhlIG1lc3NhZ2UgZnJvbSB0aGlzIGNoaWxkcmVuOlxuICAgICAgICAqICpcbiAgICAgICAgKiBgPHAgaTE4bj1cIm1lYW5pbmd8ZGVzY3JpcHRpb25cIj57SUNVIG1lc3NhZ2V9PC9wPmAgd291bGQgcHJvZHVjZSB0d28gbWVzc2FnZXM6XG4gICAgICAgICogLSBvbmUgZm9yIHRoZSA8cD4gY29udGVudCB3aXRoIG1lYW5pbmcgYW5kIGRlc2NyaXB0aW9uLFxuICAgICAgICAqIC0gYW5vdGhlciBvbmUgZm9yIHRoZSBJQ1UgbWVzc2FnZS5cbiAgICAgICAgKiAqXG4gICAgICAgICogSW4gdGhpcyBjYXNlIHRoZSBsYXN0IG1lc3NhZ2UgaXMgZGlzY2FyZGVkIGFzIGl0IGNvbnRhaW5zIGxlc3MgaW5mb3JtYXRpb24gKHRoZSBBU1QgaXNcbiAgICAgICAgKiBvdGhlcndpc2UgaWRlbnRpY2FsKS5cbiAgICAgICAgKiAqXG4gICAgICAgICogTm90ZSB0aGF0IHdlIHNob3VsZCBzdGlsbCBrZWVwIG1lc3NhZ2VzIGV4dHJhY3RlZCBmcm9tIGF0dHJpYnV0ZXMgaW5zaWRlIHRoZSBzZWN0aW9uIChpZSBpbiB0aGVcbiAgICAgICAgKiBJQ1UgbWVzc2FnZSBoZXJlKVxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdENoaWxkcmVuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUuX2Nsb3NlVHJhbnNsYXRhYmxlU2VjdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBkaXJlY3RDaGlsZHJlbikge1xuICAgICAgICAgIGlmICghdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3Iobm9kZSwgJ1VuZXhwZWN0ZWQgc2VjdGlvbiBlbmQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydEluZGV4ID0gdGhpcy5fbXNnQ291bnRBdFNlY3Rpb25TdGFydDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzaWduaWZpY2FudENoaWxkcmVuID0gZGlyZWN0Q2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uIChjb3VudCwgbm9kZSkgeyByZXR1cm4gY291bnQgKyAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQgPyAwIDogMSk7IH0sIDApO1xuICAgICAgICAgIGlmIChzaWduaWZpY2FudENoaWxkcmVuID09IDEpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gdGhpcy5fbWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSBzdGFydEluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFzdCA9IHRoaXMuX21lc3NhZ2VzW2ldLm5vZGVzO1xuICAgICAgICAgICAgICAgICAgaWYgKCEoYXN0Lmxlbmd0aCA9PSAxICYmIGFzdFswXSBpbnN0YW5jZW9mIFRleHQkMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbXNnQ291bnRBdFNlY3Rpb25TdGFydCA9IHZvaWQgMDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBtc2dcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS5fcmVwb3J0RXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbXNnKSB7XG4gICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihub2RlLnNvdXJjZVNwYW4sIG1zZykpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfVmlzaXRvcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzT3BlbmluZ0NvbW1lbnQobikge1xuICAgICAgcmV0dXJuIG4gaW5zdGFuY2VvZiBDb21tZW50ICYmIG4udmFsdWUgJiYgbi52YWx1ZS5zdGFydHNXaXRoKCdpMThuJyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzQ2xvc2luZ0NvbW1lbnQobikge1xuICAgICAgcmV0dXJuIG4gaW5zdGFuY2VvZiBDb21tZW50ICYmIG4udmFsdWUgJiYgbi52YWx1ZSA9PT0gJy9pMThuJztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZ2V0STE4bkF0dHIocCkge1xuICAgICAgcmV0dXJuIHAuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSBfSTE4Tl9BVFRSOyB9KSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGkxOG5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9zcGxpdE1lYW5pbmdBbmREZXNjKGkxOG4pIHtcbiAgICAgIGlmICghaTE4bilcbiAgICAgICAgICByZXR1cm4gWycnLCAnJ107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaXBlSW5kZXggPSBpMThuLmluZGV4T2YoJ3wnKTtcbiAgICAgIHJldHVybiBwaXBlSW5kZXggPT0gLTEgPyBbJycsIGkxOG5dIDogW2kxOG4uc2xpY2UoMCwgcGlwZUluZGV4KSwgaTE4bi5zbGljZShwaXBlSW5kZXggKyAxKV07XG4gIH1cblxuICB2YXIgWG1sVGFnRGVmaW5pdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBYbWxUYWdEZWZpbml0aW9uKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VkQnlQYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gVGFnQ29udGVudFR5cGUuUEFSU0FCTEVfREFUQTtcbiAgICAgICAgICB0aGlzLmlzVm9pZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaWdub3JlRmlyc3RMZiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2FuU2VsZkNsb3NlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50UGFyZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUYWdEZWZpbml0aW9uLnByb3RvdHlwZS5yZXF1aXJlRXh0cmFQYXJlbnQgPSBmdW5jdGlvbiAoY3VycmVudFBhcmVudCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVGFnRGVmaW5pdGlvbi5wcm90b3R5cGUuaXNDbG9zZWRCeUNoaWxkID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgICAgcmV0dXJuIFhtbFRhZ0RlZmluaXRpb247XG4gIH0oKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9UQUdfREVGSU5JVElPTiA9IG5ldyBYbWxUYWdEZWZpbml0aW9uKCk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHRhZ05hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFhtbFRhZ0RlZmluaXRpb24odGFnTmFtZSkge1xuICAgICAgcmV0dXJuIF9UQUdfREVGSU5JVElPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQ4ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgWG1sUGFyc2VyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ4KFhtbFBhcnNlciwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIFhtbFBhcnNlcigpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBnZXRYbWxUYWdEZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez89fSBwYXJzZUV4cGFuc2lvbkZvcm1zXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHNvdXJjZSwgdXJsLCBwYXJzZUV4cGFuc2lvbkZvcm1zKSB7XG4gICAgICAgICAgaWYgKHBhcnNlRXhwYW5zaW9uRm9ybXMgPT09IHZvaWQgMCkgeyBwYXJzZUV4cGFuc2lvbkZvcm1zID0gZmFsc2U7IH1cbiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5wYXJzZS5jYWxsKHRoaXMsIHNvdXJjZSwgdXJsLCBwYXJzZUV4cGFuc2lvbkZvcm1zLCBudWxsKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gWG1sUGFyc2VyO1xuICB9KFBhcnNlciQxKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDkgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGRpZ2VzdChtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gc2hhMShzZXJpYWxpemVOb2RlcyhtZXNzYWdlLm5vZGVzKS5qb2luKCcnKSArIChcIltcIiArIG1lc3NhZ2UubWVhbmluZyArIFwiXVwiKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGVjaW1hbERpZ2VzdChtZXNzYWdlKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdG9yID0gbmV3IF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvcigpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBtZXNzYWdlLm5vZGVzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gYS52aXNpdCh2aXNpdG9yLCBudWxsKTsgfSk7XG4gICAgICByZXR1cm4gY29tcHV0ZU1zZ0lkKHBhcnRzLmpvaW4oJycpLCBtZXNzYWdlLm1lYW5pbmcpO1xuICB9XG4gIC8qKlxuICAgKiAgU2VyaWFsaXplIHRoZSBpMThuIGFzdCB0byBzb21ldGhpbmcgeG1sLWxpa2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYW4gVUlELlxuICAgICogKlxuICAgICogVGhlIHZpc2l0b3IgaXMgYWxzbyB1c2VkIGluIHRoZSBpMThuIHBhcnNlciB0ZXN0c1xuICAgICogKlxuICAgKi9cbiAgdmFyIF9TZXJpYWxpemVyVmlzaXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBfU2VyaWFsaXplclZpc2l0b3IoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiB0ZXh0LnZhbHVlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY29udGV4dCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIFwiW1wiICsgY29udGFpbmVyLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLnZpc2l0KF90aGlzKTsgfSkuam9pbignLCAnKSArIFwiXVwiO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpY3VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdSA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ckNhc2VzID0gT2JqZWN0LmtleXMoaWN1LmNhc2VzKS5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIChrICsgXCIge1wiICsgaWN1LmNhc2VzW2tdLnZpc2l0KF90aGlzKSArIFwifVwiKTsgfSk7XG4gICAgICAgICAgcmV0dXJuIFwie1wiICsgaWN1LmV4cHJlc3Npb24gKyBcIiwgXCIgKyBpY3UudHlwZSArIFwiLCBcIiArIHN0ckNhc2VzLmpvaW4oJywgJykgKyBcIn1cIjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGhcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZ1BsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gcGguaXNWb2lkID9cbiAgICAgICAgICAgICAgXCI8cGggdGFnIG5hbWU9XFxcIlwiICsgcGguc3RhcnROYW1lICsgXCJcXFwiLz5cIiA6XG4gICAgICAgICAgICAgIFwiPHBoIHRhZyBuYW1lPVxcXCJcIiArIHBoLnN0YXJ0TmFtZSArIFwiXFxcIj5cIiArIHBoLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLnZpc2l0KF90aGlzKTsgfSkuam9pbignLCAnKSArIFwiPC9waCBuYW1lPVxcXCJcIiArIHBoLmNsb3NlTmFtZSArIFwiXFxcIj5cIjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGhcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHBoLnZhbHVlID8gXCI8cGggbmFtZT1cXFwiXCIgKyBwaC5uYW1lICsgXCJcXFwiPlwiICsgcGgudmFsdWUgKyBcIjwvcGg+XCIgOiBcIjxwaCBuYW1lPVxcXCJcIiArIHBoLm5hbWUgKyBcIlxcXCIvPlwiO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwaFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiPHBoIGljdSBuYW1lPVxcXCJcIiArIHBoLm5hbWUgKyBcIlxcXCI+XCIgKyBwaC52YWx1ZS52aXNpdCh0aGlzKSArIFwiPC9waD5cIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gX1NlcmlhbGl6ZXJWaXNpdG9yO1xuICB9KCkpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZXJpYWxpemVyVmlzaXRvciA9IG5ldyBfU2VyaWFsaXplclZpc2l0b3IoKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZU5vZGVzKG5vZGVzKSB7XG4gICAgICByZXR1cm4gbm9kZXMubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLnZpc2l0KHNlcmlhbGl6ZXJWaXNpdG9yLCBudWxsKTsgfSk7XG4gIH1cbiAgLyoqXG4gICAqICBTZXJpYWxpemUgdGhlIGkxOG4gYXN0IHRvIHNvbWV0aGluZyB4bWwtbGlrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSBhbiBVSUQuXG4gICAgKiAqXG4gICAgKiBJZ25vcmUgdGhlIElDVSBleHByZXNzaW9ucyBzbyB0aGF0IG1lc3NhZ2UgSURzIHN0YXlzIGlkZW50aWNhbCBpZiBvbmx5IHRoZSBleHByZXNzaW9uIGNoYW5nZXMuXG4gICAgKiAqXG4gICAqL1xuICB2YXIgX1NlcmlhbGl6ZXJJZ25vcmVJY3VFeHBWaXNpdG9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ5KF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvciwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvcigpIHtcbiAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpY3VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1NlcmlhbGl6ZXJJZ25vcmVJY3VFeHBWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdSA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ckNhc2VzID0gT2JqZWN0LmtleXMoaWN1LmNhc2VzKS5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIChrICsgXCIge1wiICsgaWN1LmNhc2VzW2tdLnZpc2l0KF90aGlzKSArIFwifVwiKTsgfSk7XG4gICAgICAgICAgLy8gRG8gbm90IHRha2UgdGhlIGV4cHJlc3Npb24gaW50byBhY2NvdW50XG4gICAgICAgICAgcmV0dXJuIFwie1wiICsgaWN1LnR5cGUgKyBcIiwgXCIgKyBzdHJDYXNlcy5qb2luKCcsICcpICsgXCJ9XCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvcjtcbiAgfShfU2VyaWFsaXplclZpc2l0b3IpKTtcbiAgLyoqXG4gICAqICBDb21wdXRlIHRoZSBTSEExIG9mIHRoZSBnaXZlbiBzdHJpbmdcbiAgICAqICpcbiAgICAqIHNlZSBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTgwLTQvZmlwcy0xODAtNC5wZGZcbiAgICAqICpcbiAgICAqIFdBUk5JTkc6IHRoaXMgZnVuY3Rpb24gaGFzIG5vdCBiZWVuIGRlc2lnbmVkIG5vdCB0ZXN0ZWQgd2l0aCBzZWN1cml0eSBpbiBtaW5kLlxuICAgICogRE8gTk9UIFVTRSBJVCBJTiBBIFNFQ1VSSVRZIFNFTlNJVElWRSBDT05URVhULlxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2hhMShzdHIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHV0ZjggPSB1dGY4RW5jb2RlKHN0cik7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3b3JkczMyID0gc3RyaW5nVG9Xb3JkczMyKHV0ZjgsIEVuZGlhbi5CaWcpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGVuID0gdXRmOC5sZW5ndGggKiA4O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdyA9IG5ldyBBcnJheSg4MCk7XG4gICAgICB2YXIgX2EgPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF0sIGEgPSBfYVswXSwgYiA9IF9hWzFdLCBjID0gX2FbMl0sIGQgPSBfYVszXSwgZSA9IF9hWzRdO1xuICAgICAgd29yZHMzMltsZW4gPj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBsZW4gJSAzMik7XG4gICAgICB3b3JkczMyWygobGVuICsgNjQgPj4gOSkgPDwgNCkgKyAxNV0gPSBsZW47XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgd29yZHMzMi5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgICB2YXIgX2IgPSBbYSwgYiwgYywgZCwgZV0sIGgwID0gX2JbMF0sIGgxID0gX2JbMV0sIGgyID0gX2JbMl0sIGgzID0gX2JbM10sIGg0ID0gX2JbNF07XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBqID0gMDsgaiA8IDgwOyBqKyspIHtcbiAgICAgICAgICAgICAgaWYgKGogPCAxNikge1xuICAgICAgICAgICAgICAgICAgd1tqXSA9IHdvcmRzMzJbaSArIGpdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgd1tqXSA9IHJvbDMyKHdbaiAtIDNdIF4gd1tqIC0gOF0gXiB3W2ogLSAxNF0gXiB3W2ogLSAxNl0sIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciBfYyA9IGZrKGosIGIsIGMsIGQpLCBmID0gX2NbMF0sIGsgPSBfY1sxXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcCA9IFtyb2wzMihhLCA1KSwgZiwgZSwgaywgd1tqXV0ucmVkdWNlKGFkZDMyKTtcbiAgICAgICAgICAgICAgX2QgPSBbZCwgYywgcm9sMzIoYiwgMzApLCBhLCB0ZW1wXSwgZSA9IF9kWzBdLCBkID0gX2RbMV0sIGMgPSBfZFsyXSwgYiA9IF9kWzNdLCBhID0gX2RbNF07XG4gICAgICAgICAgfVxuICAgICAgICAgIF9lID0gW2FkZDMyKGEsIGgwKSwgYWRkMzIoYiwgaDEpLCBhZGQzMihjLCBoMiksIGFkZDMyKGQsIGgzKSwgYWRkMzIoZSwgaDQpXSwgYSA9IF9lWzBdLCBiID0gX2VbMV0sIGMgPSBfZVsyXSwgZCA9IF9lWzNdLCBlID0gX2VbNF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYnl0ZVN0cmluZ1RvSGV4U3RyaW5nKHdvcmRzMzJUb0J5dGVTdHJpbmcoW2EsIGIsIGMsIGQsIGVdKSk7XG4gICAgICB2YXIgX2QsIF9lO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcGFyYW0gez99IGNcbiAgICogQHBhcmFtIHs/fSBkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBmayhpbmRleCwgYiwgYywgZCkge1xuICAgICAgaWYgKGluZGV4IDwgMjApIHtcbiAgICAgICAgICByZXR1cm4gWyhiICYgYykgfCAofmIgJiBkKSwgMHg1YTgyNzk5OV07XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXggPCA0MCkge1xuICAgICAgICAgIHJldHVybiBbYiBeIGMgXiBkLCAweDZlZDllYmExXTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IDYwKSB7XG4gICAgICAgICAgcmV0dXJuIFsoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCksIDB4OGYxYmJjZGNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtiIF4gYyBeIGQsIDB4Y2E2MmMxZDZdO1xuICB9XG4gIC8qKlxuICAgKiAgQ29tcHV0ZSB0aGUgZmluZ2VycHJpbnQgb2YgdGhlIGdpdmVuIHN0cmluZ1xuICAgICogKlxuICAgICogVGhlIG91dHB1dCBpcyA2NCBiaXQgbnVtYmVyIGVuY29kZWQgYXMgYSBkZWNpbWFsIHN0cmluZ1xuICAgICogKlxuICAgICogYmFzZWQgb246XG4gICAgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvYmxvYi9tYXN0ZXIvc3JjL2NvbS9nb29nbGUvamF2YXNjcmlwdC9qc2NvbXAvR29vZ2xlSnNNZXNzYWdlSWRHZW5lcmF0b3IuamF2YVxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZ2VycHJpbnQoc3RyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1dGY4ID0gdXRmOEVuY29kZShzdHIpO1xuICAgICAgdmFyIF9hID0gW2hhc2gzMih1dGY4LCAwKSwgaGFzaDMyKHV0ZjgsIDEwMjA3MildLCBoaSA9IF9hWzBdLCBsbyA9IF9hWzFdO1xuICAgICAgaWYgKGhpID09IDAgJiYgKGxvID09IDAgfHwgbG8gPT0gMSkpIHtcbiAgICAgICAgICBoaSA9IGhpIF4gMHgxMzBmOWJlZjtcbiAgICAgICAgICBsbyA9IGxvIF4gLTB4NmI1ZjU2ZDg7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2hpLCBsb107XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbXNnXG4gICAqIEBwYXJhbSB7P30gbWVhbmluZ1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY29tcHV0ZU1zZ0lkKG1zZywgbWVhbmluZykge1xuICAgICAgdmFyIF9hID0gZmluZ2VycHJpbnQobXNnKSwgaGkgPSBfYVswXSwgbG8gPSBfYVsxXTtcbiAgICAgIGlmIChtZWFuaW5nKSB7XG4gICAgICAgICAgdmFyIF9iID0gZmluZ2VycHJpbnQobWVhbmluZyksIGhpbSA9IF9iWzBdLCBsb20gPSBfYlsxXTtcbiAgICAgICAgICBfYyA9IGFkZDY0KHJvbDY0KFtoaSwgbG9dLCAxKSwgW2hpbSwgbG9tXSksIGhpID0gX2NbMF0sIGxvID0gX2NbMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYnl0ZVN0cmluZ1RvRGVjU3RyaW5nKHdvcmRzMzJUb0J5dGVTdHJpbmcoW2hpICYgMHg3ZmZmZmZmZiwgbG9dKSk7XG4gICAgICB2YXIgX2M7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RyXG4gICAqIEBwYXJhbSB7P30gY1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzaDMyKHN0ciwgYykge1xuICAgICAgdmFyIF9hID0gWzB4OWUzNzc5YjksIDB4OWUzNzc5YjldLCBhID0gX2FbMF0sIGIgPSBfYVsxXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgZm9yIChpID0gMDsgaSArIDEyIDw9IGxlbjsgaSArPSAxMikge1xuICAgICAgICAgIGEgPSBhZGQzMihhLCB3b3JkQXQoc3RyLCBpLCBFbmRpYW4uTGl0dGxlKSk7XG4gICAgICAgICAgYiA9IGFkZDMyKGIsIHdvcmRBdChzdHIsIGkgKyA0LCBFbmRpYW4uTGl0dGxlKSk7XG4gICAgICAgICAgYyA9IGFkZDMyKGMsIHdvcmRBdChzdHIsIGkgKyA4LCBFbmRpYW4uTGl0dGxlKSk7XG4gICAgICAgICAgX2IgPSBtaXgoW2EsIGIsIGNdKSwgYSA9IF9iWzBdLCBiID0gX2JbMV0sIGMgPSBfYlsyXTtcbiAgICAgIH1cbiAgICAgIGEgPSBhZGQzMihhLCB3b3JkQXQoc3RyLCBpLCBFbmRpYW4uTGl0dGxlKSk7XG4gICAgICBiID0gYWRkMzIoYiwgd29yZEF0KHN0ciwgaSArIDQsIEVuZGlhbi5MaXR0bGUpKTtcbiAgICAgIC8vIHRoZSBmaXJzdCBieXRlIG9mIGMgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGhcbiAgICAgIGMgPSBhZGQzMihjLCBsZW4pO1xuICAgICAgYyA9IGFkZDMyKGMsIHdvcmRBdChzdHIsIGkgKyA4LCBFbmRpYW4uTGl0dGxlKSA8PCA4KTtcbiAgICAgIHJldHVybiBtaXgoW2EsIGIsIGNdKVsyXTtcbiAgICAgIHZhciBfYjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBfXzBcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG1peChfYSkge1xuICAgICAgdmFyIGEgPSBfYVswXSwgYiA9IF9hWzFdLCBjID0gX2FbMl07XG4gICAgICBhID0gc3ViMzIoYSwgYik7XG4gICAgICBhID0gc3ViMzIoYSwgYyk7XG4gICAgICBhIF49IGMgPj4+IDEzO1xuICAgICAgYiA9IHN1YjMyKGIsIGMpO1xuICAgICAgYiA9IHN1YjMyKGIsIGEpO1xuICAgICAgYiBePSBhIDw8IDg7XG4gICAgICBjID0gc3ViMzIoYywgYSk7XG4gICAgICBjID0gc3ViMzIoYywgYik7XG4gICAgICBjIF49IGIgPj4+IDEzO1xuICAgICAgYSA9IHN1YjMyKGEsIGIpO1xuICAgICAgYSA9IHN1YjMyKGEsIGMpO1xuICAgICAgYSBePSBjID4+PiAxMjtcbiAgICAgIGIgPSBzdWIzMihiLCBjKTtcbiAgICAgIGIgPSBzdWIzMihiLCBhKTtcbiAgICAgIGIgXj0gYSA8PCAxNjtcbiAgICAgIGMgPSBzdWIzMihjLCBhKTtcbiAgICAgIGMgPSBzdWIzMihjLCBiKTtcbiAgICAgIGMgXj0gYiA+Pj4gNTtcbiAgICAgIGEgPSBzdWIzMihhLCBiKTtcbiAgICAgIGEgPSBzdWIzMihhLCBjKTtcbiAgICAgIGEgXj0gYyA+Pj4gMztcbiAgICAgIGIgPSBzdWIzMihiLCBjKTtcbiAgICAgIGIgPSBzdWIzMihiLCBhKTtcbiAgICAgIGIgXj0gYSA8PCAxMDtcbiAgICAgIGMgPSBzdWIzMihjLCBhKTtcbiAgICAgIGMgPSBzdWIzMihjLCBiKTtcbiAgICAgIGMgXj0gYiA+Pj4gMTU7XG4gICAgICByZXR1cm4gW2EsIGIsIGNdO1xuICB9XG4gIHZhciBFbmRpYW4gPSB7fTtcbiAgRW5kaWFuLkxpdHRsZSA9IDA7XG4gIEVuZGlhbi5CaWcgPSAxO1xuICBFbmRpYW5bRW5kaWFuLkxpdHRsZV0gPSBcIkxpdHRsZVwiO1xuICBFbmRpYW5bRW5kaWFuLkJpZ10gPSBcIkJpZ1wiO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHV0ZjhFbmNvZGUoc3RyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbmNvZGVkID0gJyc7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gMDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29kZVBvaW50ID0gZGVjb2RlU3Vycm9nYXRlUGFpcnMoc3RyLCBpbmRleCk7XG4gICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweDdmKSB7XG4gICAgICAgICAgICAgIGVuY29kZWQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPD0gMHg3ZmYpIHtcbiAgICAgICAgICAgICAgZW5jb2RlZCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4YzAgfCBjb2RlUG9pbnQgPj4+IDYsIDB4ODAgfCBjb2RlUG9pbnQgJiAweDNmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgICAgICAgICBlbmNvZGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhlMCB8IGNvZGVQb2ludCA+Pj4gMTIsIDB4ODAgfCBjb2RlUG9pbnQgPj4+IDYgJiAweDNmLCAweDgwIHwgY29kZVBvaW50ICYgMHgzZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweDFmZmZmZikge1xuICAgICAgICAgICAgICBlbmNvZGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMCB8IGNvZGVQb2ludCA+Pj4gMTgsIDB4ODAgfCBjb2RlUG9pbnQgPj4+IDEyICYgMHgzZiwgMHg4MCB8IGNvZGVQb2ludCA+Pj4gNiAmIDB4M2YsIDB4ODAgfCBjb2RlUG9pbnQgJiAweDNmKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHJcbiAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGVjb2RlU3Vycm9nYXRlUGFpcnMoc3RyLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5kZXg9XCIgKyBpbmRleCArIFwiIGlzIG91dCBvZiByYW5nZSBpbiBcXFwiXCIgKyBzdHIgKyBcIlxcXCJcIik7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoaWdoID0gc3RyLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgaWYgKGhpZ2ggPj0gMHhkODAwICYmIGhpZ2ggPD0gMHhkZmZmICYmIHN0ci5sZW5ndGggPiBpbmRleCArIDEpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb3cgPSBieXRlQXQoc3RyLCBpbmRleCArIDEpO1xuICAgICAgICAgIGlmIChsb3cgPj0gMHhkYzAwICYmIGxvdyA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChoaWdoIC0gMHhkODAwKSAqIDB4NDAwICsgbG93IC0gMHhkYzAwICsgMHgxMDAwMDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGlnaDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkMzIoYSwgYikge1xuICAgICAgcmV0dXJuIGFkZDMydG82NChhLCBiKVsxXTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkMzJ0bzY0KGEsIGIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvdyA9IChhICYgMHhmZmZmKSArIChiICYgMHhmZmZmKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhpZ2ggPSAoYSA+Pj4gMTYpICsgKGIgPj4+IDE2KSArIChsb3cgPj4+IDE2KTtcbiAgICAgIHJldHVybiBbaGlnaCA+Pj4gMTYsIChoaWdoIDw8IDE2KSB8IChsb3cgJiAweGZmZmYpXTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBfXzBcbiAgICogQHBhcmFtIHs/fSBfXzFcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFkZDY0KF9hLCBfYikge1xuICAgICAgdmFyIGFoID0gX2FbMF0sIGFsID0gX2FbMV07XG4gICAgICB2YXIgYmggPSBfYlswXSwgYmwgPSBfYlsxXTtcbiAgICAgIHZhciBfYyA9IGFkZDMydG82NChhbCwgYmwpLCBjYXJyeSA9IF9jWzBdLCBsID0gX2NbMV07XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoID0gYWRkMzIoYWRkMzIoYWgsIGJoKSwgY2FycnkpO1xuICAgICAgcmV0dXJuIFtoLCBsXTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3ViMzIoYSwgYikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG93ID0gKGEgJiAweGZmZmYpIC0gKGIgJiAweGZmZmYpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGlnaCA9IChhID4+IDE2KSAtIChiID4+IDE2KSArIChsb3cgPj4gMTYpO1xuICAgICAgcmV0dXJuIChoaWdoIDw8IDE2KSB8IChsb3cgJiAweGZmZmYpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFcbiAgICogQHBhcmFtIHs/fSBjb3VudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcm9sMzIoYSwgY291bnQpIHtcbiAgICAgIHJldHVybiAoYSA8PCBjb3VudCkgfCAoYSA+Pj4gKDMyIC0gY291bnQpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBfXzBcbiAgICogQHBhcmFtIHs/fSBjb3VudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcm9sNjQoX2EsIGNvdW50KSB7XG4gICAgICB2YXIgaGkgPSBfYVswXSwgbG8gPSBfYVsxXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGggPSAoaGkgPDwgY291bnQpIHwgKGxvID4+PiAoMzIgLSBjb3VudCkpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbCA9IChsbyA8PCBjb3VudCkgfCAoaGkgPj4+ICgzMiAtIGNvdW50KSk7XG4gICAgICByZXR1cm4gW2gsIGxdO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcGFyYW0gez99IGVuZGlhblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9Xb3JkczMyKHN0ciwgZW5kaWFuKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3b3JkczMyID0gQXJyYXkoKHN0ci5sZW5ndGggKyAzKSA+Pj4gMik7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgd29yZHMzMi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHdvcmRzMzJbaV0gPSB3b3JkQXQoc3RyLCBpICogNCwgZW5kaWFuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3b3JkczMyO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBieXRlQXQoc3RyLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGluZGV4ID49IHN0ci5sZW5ndGggPyAwIDogc3RyLmNoYXJDb2RlQXQoaW5kZXgpICYgMHhmZjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHJcbiAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgKiBAcGFyYW0gez99IGVuZGlhblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gd29yZEF0KHN0ciwgaW5kZXgsIGVuZGlhbikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd29yZCA9IDA7XG4gICAgICBpZiAoZW5kaWFuID09PSBFbmRpYW4uQmlnKSB7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICB3b3JkICs9IGJ5dGVBdChzdHIsIGluZGV4ICsgaSkgPDwgKDI0IC0gOCAqIGkpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgd29yZCArPSBieXRlQXQoc3RyLCBpbmRleCArIGkpIDw8IDggKiBpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3b3JkO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHdvcmRzMzJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHdvcmRzMzJUb0J5dGVTdHJpbmcod29yZHMzMikge1xuICAgICAgcmV0dXJuIHdvcmRzMzIucmVkdWNlKGZ1bmN0aW9uIChzdHIsIHdvcmQpIHsgcmV0dXJuIHN0ciArIHdvcmQzMlRvQnl0ZVN0cmluZyh3b3JkKTsgfSwgJycpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHdvcmRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHdvcmQzMlRvQnl0ZVN0cmluZyh3b3JkKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHIgPSAnJztcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgod29yZCA+Pj4gOCAqICgzIC0gaSkpICYgMHhmZik7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYnl0ZVN0cmluZ1RvSGV4U3RyaW5nKHN0cikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGV4ID0gJyc7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYiA9IGJ5dGVBdChzdHIsIGkpO1xuICAgICAgICAgIGhleCArPSAoYiA+Pj4gNCkudG9TdHJpbmcoMTYpICsgKGIgJiAweDBmKS50b1N0cmluZygxNik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGV4LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBieXRlU3RyaW5nVG9EZWNTdHJpbmcoc3RyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNpbWFsID0gJyc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b1RoZVBvd2VyID0gJzEnO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgZGVjaW1hbCA9IGFkZEJpZ0ludChkZWNpbWFsLCBudW1iZXJUaW1lc0JpZ0ludChieXRlQXQoc3RyLCBpKSwgdG9UaGVQb3dlcikpO1xuICAgICAgICAgIHRvVGhlUG93ZXIgPSBudW1iZXJUaW1lc0JpZ0ludCgyNTYsIHRvVGhlUG93ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlY2ltYWwuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB4XG4gICAqIEBwYXJhbSB7P30geVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQmlnSW50KHgsIHkpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN1bSA9ICcnO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGVuID0gTWF0aC5tYXgoeC5sZW5ndGgsIHkubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDAsIC8qKiBAdHlwZSB7P30gKi8gY2FycnkgPSAwOyBpIDwgbGVuIHx8IGNhcnJ5OyBpKyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0bXBTdW0gPSBjYXJyeSArICsoeFtpXSB8fCAwKSArICsoeVtpXSB8fCAwKTtcbiAgICAgICAgICBpZiAodG1wU3VtID49IDEwKSB7XG4gICAgICAgICAgICAgIGNhcnJ5ID0gMTtcbiAgICAgICAgICAgICAgc3VtICs9IHRtcFN1bSAtIDEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY2FycnkgPSAwO1xuICAgICAgICAgICAgICBzdW0gKz0gdG1wU3VtO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdW07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbnVtXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbnVtYmVyVGltZXNCaWdJbnQobnVtLCBiKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9kdWN0ID0gJyc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiVG9UaGVQb3dlciA9IGI7XG4gICAgICBmb3IgKDsgbnVtICE9PSAwOyBudW0gPSBudW0gPj4+IDEpIHtcbiAgICAgICAgICBpZiAobnVtICYgMSlcbiAgICAgICAgICAgICAgcHJvZHVjdCA9IGFkZEJpZ0ludChwcm9kdWN0LCBiVG9UaGVQb3dlcik7XG4gICAgICAgICAgYlRvVGhlUG93ZXIgPSBhZGRCaWdJbnQoYlRvVGhlUG93ZXIsIGJUb1RoZVBvd2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9kdWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDEwID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgX1Zpc2l0b3IkMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBfVmlzaXRvcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0YWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ckF0dHJzID0gdGhpcy5fc2VyaWFsaXplQXR0cmlidXRlcyh0YWcuYXR0cnMpO1xuICAgICAgICAgIGlmICh0YWcuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiPFwiICsgdGFnLm5hbWUgKyBzdHJBdHRycyArIFwiLz5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RyQ2hpbGRyZW4gPSB0YWcuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSk7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiICsgdGFnLm5hbWUgKyBzdHJBdHRycyArIFwiPlwiICsgc3RyQ2hpbGRyZW4uam9pbignJykgKyBcIjwvXCIgKyB0YWcubmFtZSArIFwiPlwiO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIHRleHQudmFsdWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVjbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoZGVjbCkge1xuICAgICAgICAgIHJldHVybiBcIjw/eG1sXCIgKyB0aGlzLl9zZXJpYWxpemVBdHRyaWJ1dGVzKGRlY2wuYXR0cnMpICsgXCIgPz5cIjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WaXNpdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRycykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ckF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gKG5hbWUgKyBcIj1cXFwiXCIgKyBhdHRyc1tuYW1lXSArIFwiXFxcIlwiKTsgfSkuam9pbignICcpO1xuICAgICAgICAgIHJldHVybiBzdHJBdHRycy5sZW5ndGggPiAwID8gJyAnICsgc3RyQXR0cnMgOiAnJztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZG9jdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0RG9jdHlwZSA9IGZ1bmN0aW9uIChkb2N0eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIFwiPCFET0NUWVBFIFwiICsgZG9jdHlwZS5yb290VGFnICsgXCIgW1xcblwiICsgZG9jdHlwZS5kdGQgKyBcIlxcbl0+XCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9WaXNpdG9yO1xuICB9KCkpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfdmlzaXRvciA9IG5ldyBfVmlzaXRvciQxKCk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5vZGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzZXJpYWxpemUobm9kZXMpIHtcbiAgICAgIHJldHVybiBub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3Zpc2l0b3IpOyB9KS5qb2luKCcnKTtcbiAgfVxuICB2YXIgRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHVuZXNjYXBlZEF0dHJzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERlY2xhcmF0aW9uKHVuZXNjYXBlZEF0dHJzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLmF0dHJzID0ge307XG4gICAgICAgICAgT2JqZWN0LmtleXModW5lc2NhcGVkQXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgICAgX3RoaXMuYXR0cnNba10gPSBfZXNjYXBlWG1sKHVuZXNjYXBlZEF0dHJzW2tdKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWNsYXJhdGlvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdERlY2xhcmF0aW9uKHRoaXMpOyB9O1xuICAgICAgcmV0dXJuIERlY2xhcmF0aW9uO1xuICB9KCkpO1xuICB2YXIgRG9jdHlwZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm9vdFRhZ1xuICAgICAgICogQHBhcmFtIHs/fSBkdGRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRG9jdHlwZShyb290VGFnLCBkdGQpIHtcbiAgICAgICAgICB0aGlzLnJvb3RUYWcgPSByb290VGFnO1xuICAgICAgICAgIHRoaXMuZHRkID0gZHRkO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvY3R5cGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXREb2N0eXBlKHRoaXMpOyB9O1xuICAgICAgcmV0dXJuIERvY3R5cGU7XG4gIH0oKSk7XG4gIHZhciBUYWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHVuZXNjYXBlZEF0dHJzXG4gICAgICAgKiBAcGFyYW0gez89fSBjaGlsZHJlblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUYWcobmFtZSwgdW5lc2NhcGVkQXR0cnMsIGNoaWxkcmVuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAodW5lc2NhcGVkQXR0cnMgPT09IHZvaWQgMCkgeyB1bmVzY2FwZWRBdHRycyA9IHt9OyB9XG4gICAgICAgICAgaWYgKGNoaWxkcmVuID09PSB2b2lkIDApIHsgY2hpbGRyZW4gPSBbXTsgfVxuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgIHRoaXMuYXR0cnMgPSB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh1bmVzY2FwZWRBdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgICBfdGhpcy5hdHRyc1trXSA9IF9lc2NhcGVYbWwodW5lc2NhcGVkQXR0cnNba10pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRhZy5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdFRhZyh0aGlzKTsgfTtcbiAgICAgIHJldHVybiBUYWc7XG4gIH0oKSk7XG4gIHZhciBUZXh0JDIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHVuZXNjYXBlZFZhbHVlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRleHQodW5lc2NhcGVkVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gX2VzY2FwZVhtbCh1bmVzY2FwZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgICA7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGV4dC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcyk7IH07XG4gICAgICByZXR1cm4gVGV4dDtcbiAgfSgpKTtcbiAgdmFyIENSID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxMChDUiwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gd3NcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ1Iod3MpIHtcbiAgICAgICAgICBpZiAod3MgPT09IHZvaWQgMCkgeyB3cyA9IDA7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIlxcblwiICsgbmV3IEFycmF5KHdzICsgMSkuam9pbignICcpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDUjtcbiAgfShUZXh0JDIpKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0VTQ0FQRURfQ0hBUlMgPSBbXG4gICAgICBbLyYvZywgJyZhbXA7J10sXG4gICAgICBbL1wiL2csICcmcXVvdDsnXSxcbiAgICAgIFsvJy9nLCAnJmFwb3M7J10sXG4gICAgICBbLzwvZywgJyZsdDsnXSxcbiAgICAgIFsvPi9nLCAnJmd0OyddLFxuICBdO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZXNjYXBlWG1sKHRleHQpIHtcbiAgICAgIHJldHVybiBfRVNDQVBFRF9DSEFSUy5yZWR1Y2UoZnVuY3Rpb24gKHRleHQsIGVudHJ5KSB7IHJldHVybiB0ZXh0LnJlcGxhY2UoZW50cnlbMF0sIGVudHJ5WzFdKTsgfSwgdGV4dCk7XG4gIH1cblxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfVkVSU0lPTiA9ICcxLjInO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfWE1MTlMgPSAndXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMic7XG4gIC8vIFRPRE8odmljYik6IG1ha2UgdGhpcyBhIHBhcmFtIChzL18vLS8pXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9TT1VSQ0VfTEFORyA9ICdlbic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9QTEFDRUhPTERFUl9UQUcgPSAneCc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9TT1VSQ0VfVEFHID0gJ3NvdXJjZSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9UQVJHRVRfVEFHID0gJ3RhcmdldCc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9VTklUX1RBRyA9ICd0cmFucy11bml0JztcbiAgLy8gaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcveGxpZmYvdjEuMi9vcy94bGlmZi1jb3JlLmh0bWxcbiAgLy8gaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcveGxpZmYvdjEuMi94bGlmZi1wcm9maWxlLWh0bWwveGxpZmYtcHJvZmlsZS1odG1sLTEuMi5odG1sXG4gIHZhciBYbGlmZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBYbGlmZigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmYucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG1lc3NhZ2VzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdG9yID0gbmV3IF9Xcml0ZVZpc2l0b3IoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdGVkID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNVbml0cyA9IFtdO1xuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaWQgPSBfdGhpcy5kaWdlc3QobWVzc2FnZSk7XG4gICAgICAgICAgICAgIC8vIGRlZHVwbGljYXRlIG1lc3NhZ2VzXG4gICAgICAgICAgICAgIGlmICh2aXNpdGVkW2lkXSlcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgdmlzaXRlZFtpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc1VuaXQgPSBuZXcgVGFnKF9VTklUX1RBRywgeyBpZDogaWQsIGRhdGF0eXBlOiAnaHRtbCcgfSk7XG4gICAgICAgICAgICAgIHRyYW5zVW5pdC5jaGlsZHJlbi5wdXNoKG5ldyBDUig4KSwgbmV3IFRhZyhfU09VUkNFX1RBRywge30sIHZpc2l0b3Iuc2VyaWFsaXplKG1lc3NhZ2Uubm9kZXMpKSwgbmV3IENSKDgpLCBuZXcgVGFnKF9UQVJHRVRfVEFHKSk7XG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0cmFuc1VuaXQuY2hpbGRyZW4ucHVzaChuZXcgQ1IoOCksIG5ldyBUYWcoJ25vdGUnLCB7IHByaW9yaXR5OiAnMScsIGZyb206ICdkZXNjcmlwdGlvbicgfSwgW25ldyBUZXh0JDIobWVzc2FnZS5kZXNjcmlwdGlvbildKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVhbmluZykge1xuICAgICAgICAgICAgICAgICAgdHJhbnNVbml0LmNoaWxkcmVuLnB1c2gobmV3IENSKDgpLCBuZXcgVGFnKCdub3RlJywgeyBwcmlvcml0eTogJzEnLCBmcm9tOiAnbWVhbmluZycgfSwgW25ldyBUZXh0JDIobWVzc2FnZS5tZWFuaW5nKV0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmFuc1VuaXQuY2hpbGRyZW4ucHVzaChuZXcgQ1IoNikpO1xuICAgICAgICAgICAgICB0cmFuc1VuaXRzLnB1c2gobmV3IENSKDYpLCB0cmFuc1VuaXQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJvZHkgPSBuZXcgVGFnKCdib2R5Jywge30sIHRyYW5zVW5pdHMuY29uY2F0KFtuZXcgQ1IoNCldKSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZSA9IG5ldyBUYWcoJ2ZpbGUnLCB7ICdzb3VyY2UtbGFuZ3VhZ2UnOiBfU09VUkNFX0xBTkcsIGRhdGF0eXBlOiAncGxhaW50ZXh0Jywgb3JpZ2luYWw6ICduZzIudGVtcGxhdGUnIH0sIFtuZXcgQ1IoNCksIGJvZHksIG5ldyBDUigyKV0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHhsaWZmID0gbmV3IFRhZygneGxpZmYnLCB7IHZlcnNpb246IF9WRVJTSU9OLCB4bWxuczogX1hNTE5TIH0sIFtuZXcgQ1IoMiksIGZpbGUsIG5ldyBDUigpXSk7XG4gICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZShbXG4gICAgICAgICAgICAgIG5ldyBEZWNsYXJhdGlvbih7IHZlcnNpb246ICcxLjAnLCBlbmNvZGluZzogJ1VURi04JyB9KSwgbmV3IENSKCksIHhsaWZmLCBuZXcgQ1IoKVxuICAgICAgICAgIF0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50XG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmYucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoY29udGVudCwgdXJsKSB7XG4gICAgICAgICAgLy8geGxpZmYgdG8geG1sIG5vZGVzXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8geGxpZmZQYXJzZXIgPSBuZXcgWGxpZmZQYXJzZXIoKTtcbiAgICAgICAgICB2YXIgX2EgPSB4bGlmZlBhcnNlci5wYXJzZShjb250ZW50LCB1cmwpLCBtbE5vZGVzQnlNc2dJZCA9IF9hLm1sTm9kZXNCeU1zZ0lkLCBlcnJvcnMgPSBfYS5lcnJvcnM7XG4gICAgICAgICAgLy8geG1sIG5vZGVzIHRvIGkxOG4gbm9kZXNcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpMThuTm9kZXNCeU1zZ0lkID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udmVydGVyID0gbmV3IFhtbFRvSTE4bigpO1xuICAgICAgICAgIE9iamVjdC5rZXlzKG1sTm9kZXNCeU1zZ0lkKS5mb3JFYWNoKGZ1bmN0aW9uIChtc2dJZCkge1xuICAgICAgICAgICAgICB2YXIgX2EgPSBjb252ZXJ0ZXIuY29udmVydChtbE5vZGVzQnlNc2dJZFttc2dJZF0pLCBpMThuTm9kZXMgPSBfYS5pMThuTm9kZXMsIGUgPSBfYS5lcnJvcnM7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoLmFwcGx5KGVycm9ycywgZSk7XG4gICAgICAgICAgICAgIGkxOG5Ob2Rlc0J5TXNnSWRbbXNnSWRdID0gaTE4bk5vZGVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInhsaWZmIHBhcnNlIGVycm9yczpcXG5cIiArIGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpMThuTm9kZXNCeU1zZ0lkO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbGlmZi5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsgcmV0dXJuIGRpZ2VzdChtZXNzYWdlKTsgfTtcbiAgICAgIHJldHVybiBYbGlmZjtcbiAgfSgpKTtcbiAgdmFyIF9Xcml0ZVZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gX1dyaXRlVmlzaXRvcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gW25ldyBUZXh0JDIodGV4dC52YWx1ZSldOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlcyA9IFtdO1xuICAgICAgICAgIGNvbnRhaW5lci5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2Rlcy5wdXNoLmFwcGx5KG5vZGVzLCBub2RlLnZpc2l0KF90aGlzKSk7IH0pO1xuICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1XG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdSA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAodGhpcy5faXNJbkljdSkge1xuICAgICAgICAgICAgICAvLyBuZXN0ZWQgSUNVIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd4bGlmZiBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBJQ1UgbWVzc2FnZXMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faXNJbkljdSA9IHRydWU7XG4gICAgICAgICAgLy8gVE9ETyh2aWNiKTogc3VwcG9ydCBJQ1UgbWVzc2FnZXNcbiAgICAgICAgICAvLyBodHRwczovL2xpc3RzLm9hc2lzLW9wZW4ub3JnL2FyY2hpdmVzL3hsaWZmLzIwMTIwMS9tc2cwMDAyOC5odG1sXG4gICAgICAgICAgLy8gaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcveGxpZmYvdjEuMi94bGlmZi1wcm9maWxlLXBvL3hsaWZmLXByb2ZpbGUtcG8tMS4yLWNkMDIuaHRtbFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gW107XG4gICAgICAgICAgdGhpcy5faXNJbkljdSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGhcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGFnUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHlwZSA9IGdldEN0eXBlRm9yVGFnKHBoLnRhZyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnRUYWdQaCA9IG5ldyBUYWcoX1BMQUNFSE9MREVSX1RBRywgeyBpZDogcGguc3RhcnROYW1lLCBjdHlwZTogY3R5cGUgfSk7XG4gICAgICAgICAgaWYgKHBoLmlzVm9pZCkge1xuICAgICAgICAgICAgICAvLyB2b2lkIHRhZ3MgaGF2ZSBubyBjaGlsZHJlbiBub3IgY2xvc2luZyB0YWdzXG4gICAgICAgICAgICAgIHJldHVybiBbc3RhcnRUYWdQaF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsb3NlVGFnUGggPSBuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUcsIHsgaWQ6IHBoLmNsb3NlTmFtZSwgY3R5cGU6IGN0eXBlIH0pO1xuICAgICAgICAgIHJldHVybiBbc3RhcnRUYWdQaF0uY29uY2F0KHRoaXMuc2VyaWFsaXplKHBoLmNoaWxkcmVuKSwgW2Nsb3NlVGFnUGhdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGhcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gW25ldyBUYWcoX1BMQUNFSE9MREVSX1RBRywgeyBpZDogcGgubmFtZSB9KV07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBoXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIFtuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUcsIHsgaWQ6IHBoLm5hbWUgfSldO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLl9pc0luSWN1ID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIChfYSA9IFtdKS5jb25jYXQuYXBwbHkoX2EsIG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pKTtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9Xcml0ZVZpc2l0b3I7XG4gIH0oKSk7XG4gIC8vIFRPRE8odmljYik6IGFkZCBlcnJvciBtYW5hZ2VtZW50IChzdHJ1Y3R1cmUpXG4gIC8vIEV4dHJhY3QgbWVzc2FnZXMgYXMgeG1sIG5vZGVzIGZyb20gdGhlIHhsaWZmIGZpbGVcbiAgdmFyIFhsaWZmUGFyc2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFhsaWZmUGFyc2VyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHhsaWZmXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHhsaWZmLCB1cmwpIHtcbiAgICAgICAgICB0aGlzLl91bml0TWxOb2RlcyA9IFtdO1xuICAgICAgICAgIHRoaXMuX21sTm9kZXNCeU1zZ0lkID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8geG1sID0gbmV3IFhtbFBhcnNlcigpLnBhcnNlKHhsaWZmLCB1cmwsIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMgPSB4bWwuZXJyb3JzO1xuICAgICAgICAgIHZpc2l0QWxsKHRoaXMsIHhtbC5yb290Tm9kZXMsIG51bGwpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1sTm9kZXNCeU1zZ0lkOiB0aGlzLl9tbE5vZGVzQnlNc2dJZCxcbiAgICAgICAgICAgICAgZXJyb3JzOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbGlmZlBhcnNlci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRleHQpIHtcbiAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIF9VTklUX1RBRzpcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3VuaXRNbE5vZGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkQXR0ciA9IGVsZW1lbnQuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSAnaWQnOyB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghaWRBdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCI8XCIgKyBfVU5JVF9UQUcgKyBcIj4gbWlzc2VzIHRoZSBcXFwiaWRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0gaWRBdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tbE5vZGVzQnlNc2dJZC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCJEdXBsaWNhdGVkIHRyYW5zbGF0aW9ucyBmb3IgbXNnIFwiICsgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRBbGwodGhpcywgZWxlbWVudC5jaGlsZHJlbiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91bml0TWxOb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWxOb2Rlc0J5TXNnSWRbaWRdID0gdGhpcy5fdW5pdE1sTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbGVtZW50LCBcIk1lc3NhZ2UgXCIgKyBpZCArIFwiIG1pc3NlcyBhIHRyYW5zbGF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgX1NPVVJDRV9UQUc6XG4gICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgc291cmNlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIF9UQVJHRVRfVEFHOlxuICAgICAgICAgICAgICAgICAgdGhpcy5fdW5pdE1sTm9kZXMgPSBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOiBhc3NlcnQgZmlsZSBzdHJ1Y3R1cmUsIHhsaWZmIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgb25seSByZWN1cnNlIG9uIHVuaGFuZGxlZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgdmlzaXRBbGwodGhpcywgZWxlbWVudC5jaGlsZHJlbiwgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRleHRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbGlmZlBhcnNlci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHBhbnNpb25cbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGV4cGFuc2lvbiwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cGFuc2lvbkNhc2VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChleHBhbnNpb25DYXNlLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbGlmZlBhcnNlci5wcm90b3R5cGUuX2FkZEVycm9yID0gZnVuY3Rpb24gKG5vZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKG5vZGUuc291cmNlU3BhbiwgbWVzc2FnZSkpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBYbGlmZlBhcnNlcjtcbiAgfSgpKTtcbiAgLy8gQ29udmVydCBtbCBub2RlcyAoeGxpZmYgc3ludGF4KSB0byBpMThuIG5vZGVzXG4gIHZhciBYbWxUb0kxOG4gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gWG1sVG9JMThuKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpMThuTm9kZXM6IHZpc2l0QWxsKHRoaXMsIG5vZGVzKSxcbiAgICAgICAgICAgICAgZXJyb3JzOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiBuZXcgVGV4dCQxKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwsIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoZWwubmFtZSA9PT0gX1BMQUNFSE9MREVSX1RBRykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lQXR0ciA9IGVsLmF0dHJzLmZpbmQoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZSA9PT0gJ2lkJzsgfSk7XG4gICAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcignJywgbmFtZUF0dHIudmFsdWUsIGVsLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIjxcIiArIF9QTEFDRUhPTERFUl9UQUcgKyBcIj4gbWlzc2VzIHRoZSBcXFwiaWRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIlVuZXhwZWN0ZWQgdGFnXCIpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChpY3VDYXNlLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLl9hZGRFcnJvciA9IGZ1bmN0aW9uIChub2RlLCBtZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihub2RlLnNvdXJjZVNwYW4sIG1lc3NhZ2UpKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gWG1sVG9JMThuO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB0YWdcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldEN0eXBlRm9yVGFnKHRhZykge1xuICAgICAgc3dpdGNoICh0YWcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2JyJzpcbiAgICAgICAgICAgICAgcmV0dXJuICdsYic7XG4gICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgICAgcmV0dXJuICdpbWFnZSc7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFwieC1cIiArIHRhZztcbiAgICAgIH1cbiAgfVxuXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9NRVNTQUdFU19UQUcgPSAnbWVzc2FnZWJ1bmRsZSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9NRVNTQUdFX1RBRyA9ICdtc2cnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfUExBQ0VIT0xERVJfVEFHJDEgPSAncGgnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfRVhFTVBMRV9UQUcgPSAnZXgnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfRE9DVFlQRSA9IFwiPCFFTEVNRU5UIG1lc3NhZ2VidW5kbGUgKG1zZykqPlxcbjwhQVRUTElTVCBtZXNzYWdlYnVuZGxlIGNsYXNzIENEQVRBICNJTVBMSUVEPlxcblxcbjwhRUxFTUVOVCBtc2cgKCNQQ0RBVEF8cGh8c291cmNlKSo+XFxuPCFBVFRMSVNUIG1zZyBpZCBDREFUQSAjSU1QTElFRD5cXG48IUFUVExJU1QgbXNnIHNlcSBDREFUQSAjSU1QTElFRD5cXG48IUFUVExJU1QgbXNnIG5hbWUgQ0RBVEEgI0lNUExJRUQ+XFxuPCFBVFRMSVNUIG1zZyBkZXNjIENEQVRBICNJTVBMSUVEPlxcbjwhQVRUTElTVCBtc2cgbWVhbmluZyBDREFUQSAjSU1QTElFRD5cXG48IUFUVExJU1QgbXNnIG9ic29sZXRlIChvYnNvbGV0ZSkgI0lNUExJRUQ+XFxuPCFBVFRMSVNUIG1zZyB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpIFxcXCJkZWZhdWx0XFxcIj5cXG48IUFUVExJU1QgbXNnIGlzX2hpZGRlbiBDREFUQSAjSU1QTElFRD5cXG5cXG48IUVMRU1FTlQgc291cmNlICgjUENEQVRBKT5cXG5cXG48IUVMRU1FTlQgcGggKCNQQ0RBVEF8ZXgpKj5cXG48IUFUVExJU1QgcGggbmFtZSBDREFUQSAjUkVRVUlSRUQ+XFxuXFxuPCFFTEVNRU5UIGV4ICgjUENEQVRBKT5cIjtcbiAgdmFyIFhtYiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBYbWIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtYi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4YW1wbGVWaXNpdG9yID0gbmV3IEV4YW1wbGVWaXNpdG9yKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRvciA9IG5ldyBfVmlzaXRvciQyKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRlZCA9IHt9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvb3ROb2RlID0gbmV3IFRhZyhfTUVTU0FHRVNfVEFHKTtcbiAgICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0gX3RoaXMuZGlnZXN0KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAvLyBkZWR1cGxpY2F0ZSBtZXNzYWdlc1xuICAgICAgICAgICAgICBpZiAodmlzaXRlZFtpZF0pXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIHZpc2l0ZWRbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cnMgPSB7IGlkOiBpZCB9O1xuICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgYXR0cnNbJ2Rlc2MnXSA9IG1lc3NhZ2UuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVhbmluZykge1xuICAgICAgICAgICAgICAgICAgYXR0cnNbJ21lYW5pbmcnXSA9IG1lc3NhZ2UubWVhbmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByb290Tm9kZS5jaGlsZHJlbi5wdXNoKG5ldyBDUigyKSwgbmV3IFRhZyhfTUVTU0FHRV9UQUcsIGF0dHJzLCB2aXNpdG9yLnNlcmlhbGl6ZShtZXNzYWdlLm5vZGVzKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJvb3ROb2RlLmNoaWxkcmVuLnB1c2gobmV3IENSKCkpO1xuICAgICAgICAgIHJldHVybiBzZXJpYWxpemUoW1xuICAgICAgICAgICAgICBuZXcgRGVjbGFyYXRpb24oeyB2ZXJzaW9uOiAnMS4wJywgZW5jb2Rpbmc6ICdVVEYtOCcgfSksXG4gICAgICAgICAgICAgIG5ldyBDUigpLFxuICAgICAgICAgICAgICBuZXcgRG9jdHlwZShfTUVTU0FHRVNfVEFHLCBfRE9DVFlQRSksXG4gICAgICAgICAgICAgIG5ldyBDUigpLFxuICAgICAgICAgICAgICBleGFtcGxlVmlzaXRvci5hZGREZWZhdWx0RXhhbXBsZXMocm9vdE5vZGUpLFxuICAgICAgICAgICAgICBuZXcgQ1IoKSxcbiAgICAgICAgICBdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGVudFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtYi5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChjb250ZW50LCB1cmwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkJyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtYi5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsgcmV0dXJuIGRpZ2VzdCQxKG1lc3NhZ2UpOyB9O1xuICAgICAgcmV0dXJuIFhtYjtcbiAgfSgpKTtcbiAgdmFyIF9WaXNpdG9yJDIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gX1Zpc2l0b3IoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiBbbmV3IFRleHQkMih0ZXh0LnZhbHVlKV07IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGFpbmVyXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlcyA9IFtdO1xuICAgICAgICAgIGNvbnRhaW5lci5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2Rlcy5wdXNoLmFwcGx5KG5vZGVzLCBub2RlLnZpc2l0KF90aGlzKSk7IH0pO1xuICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1XG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlcyA9IFtuZXcgVGV4dCQyKFwie1wiICsgaWN1LmV4cHJlc3Npb25QbGFjZWhvbGRlciArIFwiLCBcIiArIGljdS50eXBlICsgXCIsIFwiKV07XG4gICAgICAgICAgT2JqZWN0LmtleXMoaWN1LmNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIFtuZXcgVGV4dCQyKGMgKyBcIiB7XCIpXS5jb25jYXQoaWN1LmNhc2VzW2NdLnZpc2l0KF90aGlzKSwgW25ldyBUZXh0JDIoXCJ9IFwiKV0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBub2Rlcy5wdXNoKG5ldyBUZXh0JDIoXCJ9XCIpKTtcbiAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBoXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0RXggPSBuZXcgVGFnKF9FWEVNUExFX1RBRywge30sIFtuZXcgVGV4dCQyKFwiPFwiICsgcGgudGFnICsgXCI+XCIpXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnRUYWdQaCA9IG5ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQxLCB7IG5hbWU6IHBoLnN0YXJ0TmFtZSB9LCBbc3RhcnRFeF0pO1xuICAgICAgICAgIGlmIChwaC5pc1ZvaWQpIHtcbiAgICAgICAgICAgICAgLy8gdm9pZCB0YWdzIGhhdmUgbm8gY2hpbGRyZW4gbm9yIGNsb3NpbmcgdGFnc1xuICAgICAgICAgICAgICByZXR1cm4gW3N0YXJ0VGFnUGhdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbG9zZUV4ID0gbmV3IFRhZyhfRVhFTVBMRV9UQUcsIHt9LCBbbmV3IFRleHQkMihcIjwvXCIgKyBwaC50YWcgKyBcIj5cIildKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbG9zZVRhZ1BoID0gbmV3IFRhZyhfUExBQ0VIT0xERVJfVEFHJDEsIHsgbmFtZTogcGguY2xvc2VOYW1lIH0sIFtjbG9zZUV4XSk7XG4gICAgICAgICAgcmV0dXJuIFtzdGFydFRhZ1BoXS5jb25jYXQodGhpcy5zZXJpYWxpemUocGguY2hpbGRyZW4pLCBbY2xvc2VUYWdQaF0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwaFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gW25ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQxLCB7IG5hbWU6IHBoLm5hbWUgfSldO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwaFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gW25ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQxLCB7IG5hbWU6IHBoLm5hbWUgfSldO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1Zpc2l0b3IucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIChfYSA9IFtdKS5jb25jYXQuYXBwbHkoX2EsIG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pKTtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9WaXNpdG9yO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBkaWdlc3QkMShtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZGVjaW1hbERpZ2VzdChtZXNzYWdlKTtcbiAgfVxuICAvLyBUQyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbm9uLWVtcHR5IGV4YW1wbGUgb24gcGxhY2Vob2xkZXJzXG4gIHZhciBFeGFtcGxlVmlzaXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBFeGFtcGxlVmlzaXRvcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeGFtcGxlVmlzaXRvci5wcm90b3R5cGUuYWRkRGVmYXVsdEV4YW1wbGVzID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICBub2RlLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0YWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0YWcubmFtZSA9PT0gX1BMQUNFSE9MREVSX1RBRyQxKSB7XG4gICAgICAgICAgICAgIGlmICghdGFnLmNoaWxkcmVuIHx8IHRhZy5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhUZXh0ID0gbmV3IFRleHQkMih0YWcuYXR0cnNbJ25hbWUnXSB8fCAnLi4uJyk7XG4gICAgICAgICAgICAgICAgICB0YWcuY2hpbGRyZW4gPSBbbmV3IFRhZyhfRVhFTVBMRV9UQUcsIHt9LCBbZXhUZXh0XSldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRhZy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICB0YWcuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhhbXBsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVjbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhhbXBsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoZGVjbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRvY3R5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdERvY3R5cGUgPSBmdW5jdGlvbiAoZG9jdHlwZSkgeyB9O1xuICAgICAgcmV0dXJuIEV4YW1wbGVWaXNpdG9yO1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9UUkFOU0xBVElPTlNfVEFHID0gJ3RyYW5zbGF0aW9uYnVuZGxlJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX1RSQU5TTEFUSU9OX1RBRyA9ICd0cmFuc2xhdGlvbic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9QTEFDRUhPTERFUl9UQUckMiA9ICdwaCc7XG4gIHZhciBYdGIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gWHRiKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYdGIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG1lc3NhZ2VzKSB7IHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQnKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50XG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWHRiLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCkge1xuICAgICAgICAgIC8vIHh0YiB0byB4bWwgbm9kZXNcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB4dGJQYXJzZXIgPSBuZXcgWHRiUGFyc2VyKCk7XG4gICAgICAgICAgdmFyIF9hID0geHRiUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHVybCksIG1sTm9kZXNCeU1zZ0lkID0gX2EubWxOb2Rlc0J5TXNnSWQsIGVycm9ycyA9IF9hLmVycm9ycztcbiAgICAgICAgICAvLyB4bWwgbm9kZXMgdG8gaTE4biBub2Rlc1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGkxOG5Ob2Rlc0J5TXNnSWQgPSB7fTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb252ZXJ0ZXIgPSBuZXcgWG1sVG9JMThuJDEoKTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhtbE5vZGVzQnlNc2dJZCkuZm9yRWFjaChmdW5jdGlvbiAobXNnSWQpIHtcbiAgICAgICAgICAgICAgdmFyIF9hID0gY29udmVydGVyLmNvbnZlcnQobWxOb2Rlc0J5TXNnSWRbbXNnSWRdKSwgaTE4bk5vZGVzID0gX2EuaTE4bk5vZGVzLCBlID0gX2EuZXJyb3JzO1xuICAgICAgICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIGUpO1xuICAgICAgICAgICAgICBpMThuTm9kZXNCeU1zZ0lkW21zZ0lkXSA9IGkxOG5Ob2RlcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ4dGIgcGFyc2UgZXJyb3JzOlxcblwiICsgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGkxOG5Ob2Rlc0J5TXNnSWQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFh0Yi5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsgcmV0dXJuIGRpZ2VzdCQxKG1lc3NhZ2UpOyB9O1xuICAgICAgcmV0dXJuIFh0YjtcbiAgfSgpKTtcbiAgLy8gRXh0cmFjdCBtZXNzYWdlcyBhcyB4bWwgbm9kZXMgZnJvbSB0aGUgeHRiIGZpbGVcbiAgdmFyIFh0YlBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBYdGJQYXJzZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30geHRiXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWHRiUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh4dGIsIHVybCkge1xuICAgICAgICAgIHRoaXMuX2J1bmRsZURlcHRoID0gMDtcbiAgICAgICAgICB0aGlzLl9tbE5vZGVzQnlNc2dJZCA9IHt9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHhtbCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSh4dGIsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5fZXJyb3JzID0geG1sLmVycm9ycztcbiAgICAgICAgICB2aXNpdEFsbCh0aGlzLCB4bWwucm9vdE5vZGVzKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtbE5vZGVzQnlNc2dJZDogdGhpcy5fbWxOb2Rlc0J5TXNnSWQsXG4gICAgICAgICAgICAgIGVycm9yczogdGhpcy5fZXJyb3JzLFxuICAgICAgICAgIH07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWHRiUGFyc2VyLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dCkge1xuICAgICAgICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG4gICAgICAgICAgICAgIGNhc2UgX1RSQU5TTEFUSU9OU19UQUc6XG4gICAgICAgICAgICAgICAgICB0aGlzLl9idW5kbGVEZXB0aCsrO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2J1bmRsZURlcHRoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsZW1lbnQsIFwiPFwiICsgX1RSQU5TTEFUSU9OU19UQUcgKyBcIj4gZWxlbWVudHMgY2FuIG5vdCBiZSBuZXN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50LmNoaWxkcmVuLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2J1bmRsZURlcHRoLS07XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBfVFJBTlNMQVRJT05fVEFHOlxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaWRBdHRyID0gZWxlbWVudC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICdpZCc7IH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpZEF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbGVtZW50LCBcIjxcIiArIF9UUkFOU0xBVElPTl9UQUcgKyBcIj4gbWlzc2VzIHRoZSBcXFwiaWRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0gaWRBdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tbE5vZGVzQnlNc2dJZC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCJEdXBsaWNhdGVkIHRyYW5zbGF0aW9ucyBmb3IgbXNnIFwiICsgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWxOb2Rlc0J5TXNnSWRbaWRdID0gZWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsZW1lbnQsICdVbmV4cGVjdGVkIHRhZycpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFh0YlBhcnNlci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYdGJQYXJzZXIucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYdGJQYXJzZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5zaW9uXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFh0YlBhcnNlci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoZXhwYW5zaW9uLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5zaW9uQ2FzZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYdGJQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChleHBhbnNpb25DYXNlLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYdGJQYXJzZXIucHJvdG90eXBlLl9hZGRFcnJvciA9IGZ1bmN0aW9uIChub2RlLCBtZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihub2RlLnNvdXJjZVNwYW4sIG1lc3NhZ2UpKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gWHRiUGFyc2VyO1xuICB9KCkpO1xuICAvLyBDb252ZXJ0IG1sIG5vZGVzICh4dGIgc3ludGF4KSB0byBpMThuIG5vZGVzXG4gIHZhciBYbWxUb0kxOG4kMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBYbWxUb0kxOG4oKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtbFRvSTE4bi5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGkxOG5Ob2RlczogdmlzaXRBbGwodGhpcywgbm9kZXMpLFxuICAgICAgICAgICAgICBlcnJvcnM6IHRoaXMuX2Vycm9ycyxcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNvbnRleHQpIHsgcmV0dXJuIG5ldyBUZXh0JDEodGV4dC52YWx1ZSwgdGV4dC5zb3VyY2VTcGFuKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpY3VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYXNlTWFwID0ge307XG4gICAgICAgICAgdmlzaXRBbGwodGhpcywgaWN1LmNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIGNhc2VNYXBbYy52YWx1ZV0gPSBuZXcgQ29udGFpbmVyKGMubm9kZXMsIGljdS5zb3VyY2VTcGFuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IEljdShpY3Uuc3dpdGNoVmFsdWUsIGljdS50eXBlLCBjYXNlTWFwLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGljdUNhc2VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoaWN1Q2FzZSwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBpY3VDYXNlLnZhbHVlLFxuICAgICAgICAgICAgICBub2RlczogdmlzaXRBbGwodGhpcywgaWN1Q2FzZS5leHByZXNzaW9uKSxcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbCwgY29udGV4dCkge1xuICAgICAgICAgIGlmIChlbC5uYW1lID09PSBfUExBQ0VIT0xERVJfVEFHJDIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZUF0dHIgPSBlbC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICduYW1lJzsgfSk7XG4gICAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcignJywgbmFtZUF0dHIudmFsdWUsIGVsLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIjxcIiArIF9QTEFDRUhPTERFUl9UQUckMiArIFwiPiBtaXNzZXMgdGhlIFxcXCJuYW1lXFxcIiBhdHRyaWJ1dGVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbCwgXCJVbmV4cGVjdGVkIHRhZ1wiKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgWG1sVG9JMThuLnByb3RvdHlwZS5fYWRkRXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKG5ldyBJMThuRXJyb3Iobm9kZS5zb3VyY2VTcGFuLCBtZXNzYWdlKSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFhtbFRvSTE4bjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMTEgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBfX2RlY29yYXRlJDMgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMyA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIEh0bWxQYXJzZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDExKEh0bWxQYXJzZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBIdG1sUGFyc2VyKCkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGdldEh0bWxUYWdEZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez89fSBwYXJzZUV4cGFuc2lvbkZvcm1zXG4gICAgICAgKiBAcGFyYW0gez89fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBIdG1sUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHVybCwgcGFyc2VFeHBhbnNpb25Gb3JtcywgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIGlmIChwYXJzZUV4cGFuc2lvbkZvcm1zID09PSB2b2lkIDApIHsgcGFyc2VFeHBhbnNpb25Gb3JtcyA9IGZhbHNlOyB9XG4gICAgICAgICAgaWYgKGludGVycG9sYXRpb25Db25maWcgPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRzsgfVxuICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnBhcnNlLmNhbGwodGhpcywgc291cmNlLCB1cmwsIHBhcnNlRXhwYW5zaW9uRm9ybXMsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgfTtcbiAgICAgIEh0bWxQYXJzZXIgPSBfX2RlY29yYXRlJDMoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhJDMoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW10pXG4gICAgICBdLCBIdG1sUGFyc2VyKTtcbiAgICAgIHJldHVybiBIdG1sUGFyc2VyO1xuICB9KFBhcnNlciQxKSk7XG5cbiAgLyoqXG4gICAqICBBIGNvbnRhaW5lciBmb3IgdHJhbnNsYXRlZCBtZXNzYWdlc1xuICAgKi9cbiAgdmFyIFRyYW5zbGF0aW9uQnVuZGxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX2kxOG5Ob2Rlc0J5TXNnSWRcbiAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRyYW5zbGF0aW9uQnVuZGxlKF9pMThuTm9kZXNCeU1zZ0lkLCBkaWdlc3QpIHtcbiAgICAgICAgICBpZiAoX2kxOG5Ob2Rlc0J5TXNnSWQgPT09IHZvaWQgMCkgeyBfaTE4bk5vZGVzQnlNc2dJZCA9IHt9OyB9XG4gICAgICAgICAgdGhpcy5faTE4bk5vZGVzQnlNc2dJZCA9IF9pMThuTm9kZXNCeU1zZ0lkO1xuICAgICAgICAgIHRoaXMuZGlnZXN0ID0gZGlnZXN0O1xuICAgICAgICAgIHRoaXMuX2kxOG5Ub0h0bWwgPSBuZXcgSTE4blRvSHRtbFZpc2l0b3IoX2kxOG5Ob2Rlc0J5TXNnSWQsIGRpZ2VzdCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGVudFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEBwYXJhbSB7P30gc2VyaWFsaXplclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJhbnNsYXRpb25CdW5kbGUubG9hZCA9IGZ1bmN0aW9uIChjb250ZW50LCB1cmwsIHNlcmlhbGl6ZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpMThuTm9kZXNCeU1zZ0lkID0gc2VyaWFsaXplci5sb2FkKGNvbnRlbnQsIHVybCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlnZXN0Rm4gPSBmdW5jdGlvbiAobSkgeyByZXR1cm4gc2VyaWFsaXplci5kaWdlc3QobSk7IH07XG4gICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2xhdGlvbkJ1bmRsZShpMThuTm9kZXNCeU1zZ0lkLCBkaWdlc3RGbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNyY01zZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJhbnNsYXRpb25CdW5kbGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBodG1sID0gdGhpcy5faTE4blRvSHRtbC5jb252ZXJ0KHNyY01zZyk7XG4gICAgICAgICAgaWYgKGh0bWwuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaHRtbC5lcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaHRtbC5ub2RlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3JjTXNnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmFuc2xhdGlvbkJ1bmRsZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHNyY01zZykgeyByZXR1cm4gdGhpcy5kaWdlc3Qoc3JjTXNnKSBpbiB0aGlzLl9pMThuTm9kZXNCeU1zZ0lkOyB9O1xuICAgICAgcmV0dXJuIFRyYW5zbGF0aW9uQnVuZGxlO1xuICB9KCkpO1xuICB2YXIgSTE4blRvSHRtbFZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSBfaTE4bk5vZGVzQnlNc2dJZFxuICAgICAgICogQHBhcmFtIHs/fSBfZGlnZXN0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEkxOG5Ub0h0bWxWaXNpdG9yKF9pMThuTm9kZXNCeU1zZ0lkLCBfZGlnZXN0KSB7XG4gICAgICAgICAgaWYgKF9pMThuTm9kZXNCeU1zZ0lkID09PSB2b2lkIDApIHsgX2kxOG5Ob2Rlc0J5TXNnSWQgPSB7fTsgfVxuICAgICAgICAgIHRoaXMuX2kxOG5Ob2Rlc0J5TXNnSWQgPSBfaTE4bk5vZGVzQnlNc2dJZDtcbiAgICAgICAgICB0aGlzLl9kaWdlc3QgPSBfZGlnZXN0O1xuICAgICAgICAgIHRoaXMuX3NyY01zZ1N0YWNrID0gW107XG4gICAgICAgICAgdGhpcy5fZXJyb3JzID0gW107XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3JjTXNnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgICB0aGlzLl9zcmNNc2dTdGFjay5sZW5ndGggPSAwO1xuICAgICAgICAgIHRoaXMuX2Vycm9ycy5sZW5ndGggPSAwO1xuICAgICAgICAgIC8vIGkxOG4gdG8gdGV4dFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRleHQgPSB0aGlzLl9jb252ZXJ0VG9UZXh0KHNyY01zZyk7XG4gICAgICAgICAgLy8gdGV4dCB0byBodG1sXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsID0gc3JjTXNnLm5vZGVzWzBdLnNvdXJjZVNwYW4uc3RhcnQuZmlsZS51cmw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaHRtbCA9IG5ldyBIdG1sUGFyc2VyKCkucGFyc2UodGV4dCwgdXJsLCB0cnVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBub2RlczogaHRtbC5yb290Tm9kZXMsXG4gICAgICAgICAgICAgIGVycm9yczogdGhpcy5fZXJyb3JzLmNvbmNhdChodG1sLmVycm9ycyksXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSTE4blRvSHRtbFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiB0ZXh0LnZhbHVlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSTE4blRvSHRtbFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY29udGV4dCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udmlzaXQoX3RoaXMpOyB9KS5qb2luKCcnKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWN1XG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYXNlcyA9IE9iamVjdC5rZXlzKGljdS5jYXNlcykubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiAoayArIFwiIHtcIiArIGljdS5jYXNlc1trXS52aXNpdChfdGhpcykgKyBcIn1cIik7IH0pO1xuICAgICAgICAgIC8vIFRPRE8odmljYik6IE9uY2UgYWxsIGZvcm1hdCBzd2l0Y2ggdG8gdXNpbmcgZXhwcmVzc2lvbiBwbGFjZWhvbGRlcnNcbiAgICAgICAgICAvLyB3ZSBzaG91bGQgdGhyb3cgd2hlbiB0aGUgcGxhY2Vob2xkZXIgaXMgbm90IGluIHRoZSBzb3VyY2UgbWVzc2FnZVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cCA9IHRoaXMuX3NyY01zZy5wbGFjZWhvbGRlcnMuaGFzT3duUHJvcGVydHkoaWN1LmV4cHJlc3Npb24pID9cbiAgICAgICAgICAgICAgdGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVyc1tpY3UuZXhwcmVzc2lvbl0gOlxuICAgICAgICAgICAgICBpY3UuZXhwcmVzc2lvbjtcbiAgICAgICAgICByZXR1cm4gXCJ7XCIgKyBleHAgKyBcIiwgXCIgKyBpY3UudHlwZSArIFwiLCBcIiArIGNhc2VzLmpvaW4oJyAnKSArIFwifVwiO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwaFxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSTE4blRvSHRtbFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaE5hbWUgPSBwaC5uYW1lO1xuICAgICAgICAgIGlmICh0aGlzLl9zcmNNc2cucGxhY2Vob2xkZXJzLmhhc093blByb3BlcnR5KHBoTmFtZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NyY01zZy5wbGFjZWhvbGRlcnNbcGhOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX3NyY01zZy5wbGFjZWhvbGRlclRvTWVzc2FnZS5oYXNPd25Qcm9wZXJ0eShwaE5hbWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0VG9UZXh0KHRoaXMuX3NyY01zZy5wbGFjZWhvbGRlclRvTWVzc2FnZVtwaE5hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fYWRkRXJyb3IocGgsIFwiVW5rbm93biBwbGFjZWhvbGRlclwiKTtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBoXG4gICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkgeyB0aHJvdyAndW5yZWFjaGFibGUgY29kZSc7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGhcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEkxOG5Ub0h0bWxWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7IHRocm93ICd1bnJlYWNoYWJsZSBjb2RlJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcmNNc2dcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEkxOG5Ub0h0bWxWaXNpdG9yLnByb3RvdHlwZS5fY29udmVydFRvVGV4dCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpZ2VzdCA9IHRoaXMuX2RpZ2VzdChzcmNNc2cpO1xuICAgICAgICAgIGlmICh0aGlzLl9pMThuTm9kZXNCeU1zZ0lkLmhhc093blByb3BlcnR5KGRpZ2VzdCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fc3JjTXNnU3RhY2sucHVzaCh0aGlzLl9zcmNNc2cpO1xuICAgICAgICAgICAgICB0aGlzLl9zcmNNc2cgPSBzcmNNc2c7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gdGhpcy5faTE4bk5vZGVzQnlNc2dJZFtkaWdlc3RdO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXh0ID0gbm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSkuam9pbignJyk7XG4gICAgICAgICAgICAgIHRoaXMuX3NyY01zZyA9IHRoaXMuX3NyY01zZ1N0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fYWRkRXJyb3Ioc3JjTXNnLm5vZGVzWzBdLCBcIk1pc3NpbmcgdHJhbnNsYXRpb24gZm9yIG1lc3NhZ2UgXCIgKyBkaWdlc3QpO1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbXNnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUuX2FkZEVycm9yID0gZnVuY3Rpb24gKGVsLCBtc2cpIHtcbiAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKGVsLnNvdXJjZVNwYW4sIG1zZykpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBJMThuVG9IdG1sVmlzaXRvcjtcbiAgfSgpKTtcblxuICB2YXIgSTE4Tkh0bWxQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9odG1sUGFyc2VyXG4gICAgICAgKiBAcGFyYW0gez89fSBfdHJhbnNsYXRpb25zXG4gICAgICAgKiBAcGFyYW0gez89fSBfdHJhbnNsYXRpb25zRm9ybWF0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEkxOE5IdG1sUGFyc2VyKF9odG1sUGFyc2VyLCBfdHJhbnNsYXRpb25zLCBfdHJhbnNsYXRpb25zRm9ybWF0KSB7XG4gICAgICAgICAgdGhpcy5faHRtbFBhcnNlciA9IF9odG1sUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0aW9ucyA9IF90cmFuc2xhdGlvbnM7XG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25zRm9ybWF0ID0gX3RyYW5zbGF0aW9uc0Zvcm1hdDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez89fSBwYXJzZUV4cGFuc2lvbkZvcm1zXG4gICAgICAgKiBAcGFyYW0gez89fSBpbnRlcnBvbGF0aW9uQ29uZmlnXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThOSHRtbFBhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc291cmNlLCB1cmwsIHBhcnNlRXhwYW5zaW9uRm9ybXMsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgICBpZiAocGFyc2VFeHBhbnNpb25Gb3JtcyA9PT0gdm9pZCAwKSB7IHBhcnNlRXhwYW5zaW9uRm9ybXMgPSBmYWxzZTsgfVxuICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJzZVJlc3VsdCA9IHRoaXMuX2h0bWxQYXJzZXIucGFyc2Uoc291cmNlLCB1cmwsIHBhcnNlRXhwYW5zaW9uRm9ybXMsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgIGlmICghdGhpcy5fdHJhbnNsYXRpb25zIHx8IHRoaXMuX3RyYW5zbGF0aW9ucyA9PT0gJycpIHtcbiAgICAgICAgICAgICAgLy8gRG8gbm90IGVuYWJsZSBpMThuIHdoZW4gbm8gdHJhbnNsYXRpb24gYnVuZGxlIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVE9ETyh2aWNiKTogYWRkIHN1cHBvcnQgZm9yIGltcGxpY2l0IHRhZ3MgLyBhdHRyaWJ1dGVzXG4gICAgICAgICAgaWYgKHBhcnNlUmVzdWx0LmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVRyZWVSZXN1bHQocGFyc2VSZXN1bHQucm9vdE5vZGVzLCBwYXJzZVJlc3VsdC5lcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZXJpYWxpemVyID0gdGhpcy5fY3JlYXRlU2VyaWFsaXplcigpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYW5zbGF0aW9uQnVuZGxlID0gVHJhbnNsYXRpb25CdW5kbGUubG9hZCh0aGlzLl90cmFuc2xhdGlvbnMsIHVybCwgc2VyaWFsaXplcik7XG4gICAgICAgICAgcmV0dXJuIG1lcmdlVHJhbnNsYXRpb25zKHBhcnNlUmVzdWx0LnJvb3ROb2RlcywgdHJhbnNsYXRpb25CdW5kbGUsIGludGVycG9sYXRpb25Db25maWcsIFtdLCB7fSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJMThOSHRtbFBhcnNlci5wcm90b3R5cGUuX2NyZWF0ZVNlcmlhbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm9ybWF0ID0gKHRoaXMuX3RyYW5zbGF0aW9uc0Zvcm1hdCB8fCAneGxmJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICBjYXNlICd4bWInOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWIoKTtcbiAgICAgICAgICAgICAgY2FzZSAneHRiJzpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWHRiKCk7XG4gICAgICAgICAgICAgIGNhc2UgJ3hsaWZmJzpcbiAgICAgICAgICAgICAgY2FzZSAneGxmJzpcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWGxpZmYoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEkxOE5IdG1sUGFyc2VyO1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIEFQUF9WSUVXX01PRFVMRV9VUkwgPSBhc3NldFVybCgnY29yZScsICdsaW5rZXIvdmlldycpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWSUVXX1VUSUxTX01PRFVMRV9VUkwgPSBhc3NldFVybCgnY29yZScsICdsaW5rZXIvdmlld191dGlscycpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDRF9NT0RVTEVfVVJMID0gYXNzZXRVcmwoJ2NvcmUnLCAnY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEFOSU1BVElPTl9TVFlMRV9VVElMX0FTU0VUX1VSTCA9IGFzc2V0VXJsKCdjb3JlJywgJ2FuaW1hdGlvbi9hbmltYXRpb25fc3R5bGVfdXRpbCcpO1xuICB2YXIgSWRlbnRpZmllcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gSWRlbnRpZmllcnMoKSB7XG4gICAgICB9XG4gICAgICBJZGVudGlmaWVycy5BTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0ge1xuICAgICAgICAgIG5hbWU6ICdBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ21ldGFkYXRhL2RpJyksXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5BTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuVmlld1V0aWxzID0ge1xuICAgICAgICAgIG5hbWU6ICdWaWV3VXRpbHMnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL3ZpZXdfdXRpbHMnKSxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLlZpZXdVdGlsc1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkFwcFZpZXcgPSB7IG5hbWU6ICdBcHBWaWV3JywgbW9kdWxlVXJsOiBBUFBfVklFV19NT0RVTEVfVVJMLCBydW50aW1lOiBBcHBWaWV3IH07XG4gICAgICBJZGVudGlmaWVycy5EZWJ1Z0FwcFZpZXcgPSB7XG4gICAgICAgICAgbmFtZTogJ0RlYnVnQXBwVmlldycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBBUFBfVklFV19NT0RVTEVfVVJMLFxuICAgICAgICAgIHJ1bnRpbWU6IERlYnVnQXBwVmlld1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLlZpZXdDb250YWluZXIgPSB7XG4gICAgICAgICAgbmFtZTogJ1ZpZXdDb250YWluZXInLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL3ZpZXdfY29udGFpbmVyJyksXG4gICAgICAgICAgcnVudGltZTogVmlld0NvbnRhaW5lclxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkVsZW1lbnRSZWYgPSB7XG4gICAgICAgICAgbmFtZTogJ0VsZW1lbnRSZWYnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2VsZW1lbnRfcmVmJyksXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5FbGVtZW50UmVmXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuVmlld0NvbnRhaW5lclJlZiA9IHtcbiAgICAgICAgICBuYW1lOiAnVmlld0NvbnRhaW5lclJlZicsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdsaW5rZXIvdmlld19jb250YWluZXJfcmVmJyksXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5WaWV3Q29udGFpbmVyUmVmXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JSZWYgPSB7XG4gICAgICAgICAgbmFtZTogJ0NoYW5nZURldGVjdG9yUmVmJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdG9yX3JlZicpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5SZW5kZXJDb21wb25lbnRUeXBlID0ge1xuICAgICAgICAgIG5hbWU6ICdSZW5kZXJDb21wb25lbnRUeXBlJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ3JlbmRlci9hcGknKSxcbiAgICAgICAgICBydW50aW1lOiBfYW5ndWxhcl9jb3JlLlJlbmRlckNvbXBvbmVudFR5cGVcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5RdWVyeUxpc3QgPSB7XG4gICAgICAgICAgbmFtZTogJ1F1ZXJ5TGlzdCcsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdsaW5rZXIvcXVlcnlfbGlzdCcpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuUXVlcnlMaXN0XG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuVGVtcGxhdGVSZWYgPSB7XG4gICAgICAgICAgbmFtZTogJ1RlbXBsYXRlUmVmJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2xpbmtlci90ZW1wbGF0ZV9yZWYnKSxcbiAgICAgICAgICBydW50aW1lOiBfYW5ndWxhcl9jb3JlLlRlbXBsYXRlUmVmXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuVGVtcGxhdGVSZWZfID0ge1xuICAgICAgICAgIG5hbWU6ICdUZW1wbGF0ZVJlZl8nLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL3RlbXBsYXRlX3JlZicpLFxuICAgICAgICAgIHJ1bnRpbWU6IFRlbXBsYXRlUmVmX1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSB7XG4gICAgICAgICAgbmFtZTogJ0NvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXInLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2NvbXBvbmVudF9mYWN0b3J5X3Jlc29sdmVyJyksXG4gICAgICAgICAgcnVudGltZTogQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IHtcbiAgICAgICAgICBuYW1lOiAnQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2xpbmtlci9jb21wb25lbnRfZmFjdG9yeV9yZXNvbHZlcicpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeSA9IHtcbiAgICAgICAgICBuYW1lOiAnQ29tcG9uZW50RmFjdG9yeScsXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5Db21wb25lbnRGYWN0b3J5LFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2NvbXBvbmVudF9mYWN0b3J5JylcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5Db21wb25lbnRSZWZfID0ge1xuICAgICAgICAgIG5hbWU6ICdDb21wb25lbnRSZWZfJyxcbiAgICAgICAgICBydW50aW1lOiBDb21wb25lbnRSZWZfLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2NvbXBvbmVudF9mYWN0b3J5JylcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5Db21wb25lbnRSZWYgPSB7XG4gICAgICAgICAgbmFtZTogJ0NvbXBvbmVudFJlZicsXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5Db21wb25lbnRSZWYsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdsaW5rZXIvY29tcG9uZW50X2ZhY3RvcnknKVxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLk5nTW9kdWxlRmFjdG9yeSA9IHtcbiAgICAgICAgICBuYW1lOiAnTmdNb2R1bGVGYWN0b3J5JyxcbiAgICAgICAgICBydW50aW1lOiBfYW5ndWxhcl9jb3JlLk5nTW9kdWxlRmFjdG9yeSxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeScpXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuTmdNb2R1bGVJbmplY3RvciA9IHtcbiAgICAgICAgICBuYW1lOiAnTmdNb2R1bGVJbmplY3RvcicsXG4gICAgICAgICAgcnVudGltZTogTmdNb2R1bGVJbmplY3RvcixcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeScpXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuUmVnaXN0ZXJNb2R1bGVGYWN0b3J5Rm4gPSB7XG4gICAgICAgICAgbmFtZTogJ3JlZ2lzdGVyTW9kdWxlRmFjdG9yeScsXG4gICAgICAgICAgcnVudGltZTogcmVnaXN0ZXJNb2R1bGVGYWN0b3J5LFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL25nX21vZHVsZV9mYWN0b3J5X2xvYWRlcicpXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuVmFsdWVVbndyYXBwZXIgPSB7IG5hbWU6ICdWYWx1ZVVud3JhcHBlcicsIG1vZHVsZVVybDogQ0RfTU9EVUxFX1VSTCwgcnVudGltZTogVmFsdWVVbndyYXBwZXIgfTtcbiAgICAgIElkZW50aWZpZXJzLkluamVjdG9yID0ge1xuICAgICAgICAgIG5hbWU6ICdJbmplY3RvcicsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdkaS9pbmplY3RvcicpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0b3JcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5WaWV3RW5jYXBzdWxhdGlvbiA9IHtcbiAgICAgICAgICBuYW1lOiAnVmlld0VuY2Fwc3VsYXRpb24nLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbWV0YWRhdGEvdmlldycpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuVmlld0VuY2Fwc3VsYXRpb25cbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5WaWV3VHlwZSA9IHtcbiAgICAgICAgICBuYW1lOiAnVmlld1R5cGUnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL3ZpZXdfdHlwZScpLFxuICAgICAgICAgIHJ1bnRpbWU6IFZpZXdUeXBlXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSB7XG4gICAgICAgICAgbmFtZTogJ0NoYW5nZURldGVjdGlvblN0cmF0ZWd5JyxcbiAgICAgICAgICBtb2R1bGVVcmw6IENEX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5DaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLlN0YXRpY05vZGVEZWJ1Z0luZm8gPSB7XG4gICAgICAgICAgbmFtZTogJ1N0YXRpY05vZGVEZWJ1Z0luZm8nLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2RlYnVnX2NvbnRleHQnKSxcbiAgICAgICAgICBydW50aW1lOiBTdGF0aWNOb2RlRGVidWdJbmZvXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuRGVidWdDb250ZXh0ID0ge1xuICAgICAgICAgIG5hbWU6ICdEZWJ1Z0NvbnRleHQnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnbGlua2VyL2RlYnVnX2NvbnRleHQnKSxcbiAgICAgICAgICBydW50aW1lOiBEZWJ1Z0NvbnRleHRcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5SZW5kZXJlciA9IHtcbiAgICAgICAgICBuYW1lOiAnUmVuZGVyZXInLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAncmVuZGVyL2FwaScpLFxuICAgICAgICAgIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuUmVuZGVyZXJcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5TaW1wbGVDaGFuZ2UgPSB7IG5hbWU6ICdTaW1wbGVDaGFuZ2UnLCBtb2R1bGVVcmw6IENEX01PRFVMRV9VUkwsIHJ1bnRpbWU6IF9hbmd1bGFyX2NvcmUuU2ltcGxlQ2hhbmdlIH07XG4gICAgICBJZGVudGlmaWVycy5VTklOSVRJQUxJWkVEID0geyBuYW1lOiAnVU5JTklUSUFMSVpFRCcsIG1vZHVsZVVybDogQ0RfTU9EVUxFX1VSTCwgcnVudGltZTogVU5JTklUSUFMSVpFRCB9O1xuICAgICAgSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JTdGF0dXMgPSB7XG4gICAgICAgICAgbmFtZTogJ0NoYW5nZURldGVjdG9yU3RhdHVzJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IENEX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogQ2hhbmdlRGV0ZWN0b3JTdGF0dXNcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5jaGVja0JpbmRpbmcgPSB7XG4gICAgICAgICAgbmFtZTogJ2NoZWNrQmluZGluZycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogdmlld191dGlscy5jaGVja0JpbmRpbmdcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5kZXZNb2RlRXF1YWwgPSB7IG5hbWU6ICdkZXZNb2RlRXF1YWwnLCBtb2R1bGVVcmw6IENEX01PRFVMRV9VUkwsIHJ1bnRpbWU6IGRldk1vZGVFcXVhbCB9O1xuICAgICAgSWRlbnRpZmllcnMuaW5saW5lSW50ZXJwb2xhdGUgPSB7XG4gICAgICAgICAgbmFtZTogJ2lubGluZUludGVycG9sYXRlJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLmlubGluZUludGVycG9sYXRlXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuaW50ZXJwb2xhdGUgPSB7XG4gICAgICAgICAgbmFtZTogJ2ludGVycG9sYXRlJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLmludGVycG9sYXRlXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuY2FzdEJ5VmFsdWUgPSB7XG4gICAgICAgICAgbmFtZTogJ2Nhc3RCeVZhbHVlJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLmNhc3RCeVZhbHVlXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuRU1QVFlfQVJSQVkgPSB7XG4gICAgICAgICAgbmFtZTogJ0VNUFRZX0FSUkFZJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLkVNUFRZX0FSUkFZXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuRU1QVFlfTUFQID0ge1xuICAgICAgICAgIG5hbWU6ICdFTVBUWV9NQVAnLFxuICAgICAgICAgIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLFxuICAgICAgICAgIHJ1bnRpbWU6IHZpZXdfdXRpbHMuRU1QVFlfTUFQXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuY3JlYXRlUmVuZGVyRWxlbWVudCA9IHtcbiAgICAgICAgICBuYW1lOiAnY3JlYXRlUmVuZGVyRWxlbWVudCcsXG4gICAgICAgICAgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogdmlld191dGlscy5jcmVhdGVSZW5kZXJFbGVtZW50XG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuc2VsZWN0T3JDcmVhdGVSZW5kZXJIb3N0RWxlbWVudCA9IHtcbiAgICAgICAgICBuYW1lOiAnc2VsZWN0T3JDcmVhdGVSZW5kZXJIb3N0RWxlbWVudCcsXG4gICAgICAgICAgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogdmlld191dGlscy5zZWxlY3RPckNyZWF0ZVJlbmRlckhvc3RFbGVtZW50XG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMucHVyZVByb3hpZXMgPSBbXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB7IG5hbWU6ICdwdXJlUHJveHkxJywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IHZpZXdfdXRpbHMucHVyZVByb3h5MSB9LFxuICAgICAgICAgIHsgbmFtZTogJ3B1cmVQcm94eTInLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5wdXJlUHJveHkyIH0sXG4gICAgICAgICAgeyBuYW1lOiAncHVyZVByb3h5MycsIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLCBydW50aW1lOiB2aWV3X3V0aWxzLnB1cmVQcm94eTMgfSxcbiAgICAgICAgICB7IG5hbWU6ICdwdXJlUHJveHk0JywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IHZpZXdfdXRpbHMucHVyZVByb3h5NCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3B1cmVQcm94eTUnLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5wdXJlUHJveHk1IH0sXG4gICAgICAgICAgeyBuYW1lOiAncHVyZVByb3h5NicsIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLCBydW50aW1lOiB2aWV3X3V0aWxzLnB1cmVQcm94eTYgfSxcbiAgICAgICAgICB7IG5hbWU6ICdwdXJlUHJveHk3JywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IHZpZXdfdXRpbHMucHVyZVByb3h5NyB9LFxuICAgICAgICAgIHsgbmFtZTogJ3B1cmVQcm94eTgnLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5wdXJlUHJveHk4IH0sXG4gICAgICAgICAgeyBuYW1lOiAncHVyZVByb3h5OScsIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLCBydW50aW1lOiB2aWV3X3V0aWxzLnB1cmVQcm94eTkgfSxcbiAgICAgICAgICB7IG5hbWU6ICdwdXJlUHJveHkxMCcsIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLCBydW50aW1lOiB2aWV3X3V0aWxzLnB1cmVQcm94eTEwIH0sXG4gICAgICBdO1xuICAgICAgSWRlbnRpZmllcnMuU2VjdXJpdHlDb250ZXh0ID0ge1xuICAgICAgICAgIG5hbWU6ICdTZWN1cml0eUNvbnRleHQnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnc2VjdXJpdHknKSxcbiAgICAgICAgICBydW50aW1lOiBfYW5ndWxhcl9jb3JlLlNlY3VyaXR5Q29udGV4dCxcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5BbmltYXRpb25LZXlmcmFtZSA9IHtcbiAgICAgICAgICBuYW1lOiAnQW5pbWF0aW9uS2V5ZnJhbWUnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnYW5pbWF0aW9uL2FuaW1hdGlvbl9rZXlmcmFtZScpLFxuICAgICAgICAgIHJ1bnRpbWU6IEFuaW1hdGlvbktleWZyYW1lXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQW5pbWF0aW9uU3R5bGVzID0ge1xuICAgICAgICAgIG5hbWU6ICdBbmltYXRpb25TdHlsZXMnLFxuICAgICAgICAgIG1vZHVsZVVybDogYXNzZXRVcmwoJ2NvcmUnLCAnYW5pbWF0aW9uL2FuaW1hdGlvbl9zdHlsZXMnKSxcbiAgICAgICAgICBydW50aW1lOiBBbmltYXRpb25TdHlsZXNcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5Ob09wQW5pbWF0aW9uUGxheWVyID0ge1xuICAgICAgICAgIG5hbWU6ICdOb09wQW5pbWF0aW9uUGxheWVyJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2FuaW1hdGlvbi9hbmltYXRpb25fcGxheWVyJyksXG4gICAgICAgICAgcnVudGltZTogTm9PcEFuaW1hdGlvblBsYXllclxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkFuaW1hdGlvbkdyb3VwUGxheWVyID0ge1xuICAgICAgICAgIG5hbWU6ICdBbmltYXRpb25Hcm91cFBsYXllcicsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdhbmltYXRpb24vYW5pbWF0aW9uX2dyb3VwX3BsYXllcicpLFxuICAgICAgICAgIHJ1bnRpbWU6IEFuaW1hdGlvbkdyb3VwUGxheWVyXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIgPSB7XG4gICAgICAgICAgbmFtZTogJ0FuaW1hdGlvblNlcXVlbmNlUGxheWVyJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2FuaW1hdGlvbi9hbmltYXRpb25fc2VxdWVuY2VfcGxheWVyJyksXG4gICAgICAgICAgcnVudGltZTogQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXJcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5wcmVwYXJlRmluYWxBbmltYXRpb25TdHlsZXMgPSB7XG4gICAgICAgICAgbmFtZTogJ3ByZXBhcmVGaW5hbEFuaW1hdGlvblN0eWxlcycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBBTklNQVRJT05fU1RZTEVfVVRJTF9BU1NFVF9VUkwsXG4gICAgICAgICAgcnVudGltZTogcHJlcGFyZUZpbmFsQW5pbWF0aW9uU3R5bGVzXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuYmFsYW5jZUFuaW1hdGlvbktleWZyYW1lcyA9IHtcbiAgICAgICAgICBuYW1lOiAnYmFsYW5jZUFuaW1hdGlvbktleWZyYW1lcycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBBTklNQVRJT05fU1RZTEVfVVRJTF9BU1NFVF9VUkwsXG4gICAgICAgICAgcnVudGltZTogYmFsYW5jZUFuaW1hdGlvbktleWZyYW1lc1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLmNsZWFyU3R5bGVzID0ge1xuICAgICAgICAgIG5hbWU6ICdjbGVhclN0eWxlcycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBBTklNQVRJT05fU1RZTEVfVVRJTF9BU1NFVF9VUkwsXG4gICAgICAgICAgcnVudGltZTogY2xlYXJTdHlsZXNcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5yZW5kZXJTdHlsZXMgPSB7XG4gICAgICAgICAgbmFtZTogJ3JlbmRlclN0eWxlcycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBBTklNQVRJT05fU1RZTEVfVVRJTF9BU1NFVF9VUkwsXG4gICAgICAgICAgcnVudGltZTogcmVuZGVyU3R5bGVzXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuY29sbGVjdEFuZFJlc29sdmVTdHlsZXMgPSB7XG4gICAgICAgICAgbmFtZTogJ2NvbGxlY3RBbmRSZXNvbHZlU3R5bGVzJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IEFOSU1BVElPTl9TVFlMRV9VVElMX0FTU0VUX1VSTCxcbiAgICAgICAgICBydW50aW1lOiBjb2xsZWN0QW5kUmVzb2x2ZVN0eWxlc1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLkxPQ0FMRV9JRCA9IHtcbiAgICAgICAgICBuYW1lOiAnTE9DQUxFX0lEJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2kxOG4vdG9rZW5zJyksXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5MT0NBTEVfSURcbiAgICAgIH07XG4gICAgICBJZGVudGlmaWVycy5UUkFOU0xBVElPTlNfRk9STUFUID0ge1xuICAgICAgICAgIG5hbWU6ICdUUkFOU0xBVElPTlNfRk9STUFUJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IGFzc2V0VXJsKCdjb3JlJywgJ2kxOG4vdG9rZW5zJyksXG4gICAgICAgICAgcnVudGltZTogX2FuZ3VsYXJfY29yZS5UUkFOU0xBVElPTlNfRk9STUFUXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuc2V0QmluZGluZ0RlYnVnSW5mbyA9IHtcbiAgICAgICAgICBuYW1lOiAnc2V0QmluZGluZ0RlYnVnSW5mbycsXG4gICAgICAgICAgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsXG4gICAgICAgICAgcnVudGltZTogdmlld191dGlscy5zZXRCaW5kaW5nRGVidWdJbmZvXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuc2V0QmluZGluZ0RlYnVnSW5mb0ZvckNoYW5nZXMgPSB7XG4gICAgICAgICAgbmFtZTogJ3NldEJpbmRpbmdEZWJ1Z0luZm9Gb3JDaGFuZ2VzJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLnNldEJpbmRpbmdEZWJ1Z0luZm9Gb3JDaGFuZ2VzXG4gICAgICB9O1xuICAgICAgSWRlbnRpZmllcnMuQW5pbWF0aW9uVHJhbnNpdGlvbiA9IHtcbiAgICAgICAgICBuYW1lOiAnQW5pbWF0aW9uVHJhbnNpdGlvbicsXG4gICAgICAgICAgbW9kdWxlVXJsOiBhc3NldFVybCgnY29yZScsICdhbmltYXRpb24vYW5pbWF0aW9uX3RyYW5zaXRpb24nKSxcbiAgICAgICAgICBydW50aW1lOiBBbmltYXRpb25UcmFuc2l0aW9uXG4gICAgICB9O1xuICAgICAgLy8gVGhpcyBpcyBqdXN0IHRoZSBpbnRlcmZhY2UhXG4gICAgICBJZGVudGlmaWVycy5JbmxpbmVBcnJheSA9IHsgbmFtZTogJ0lubGluZUFycmF5JywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IG51bGwgfTtcbiAgICAgIElkZW50aWZpZXJzLmlubGluZUFycmF5cyA9IFtcbiAgICAgICAgICB7IG5hbWU6ICdJbmxpbmVBcnJheTInLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5JbmxpbmVBcnJheTIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbmxpbmVBcnJheTInLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5JbmxpbmVBcnJheTIgfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbmxpbmVBcnJheTQnLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5JbmxpbmVBcnJheTQgfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbmxpbmVBcnJheTgnLCBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCwgcnVudGltZTogdmlld191dGlscy5JbmxpbmVBcnJheTggfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbmxpbmVBcnJheTE2JywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IHZpZXdfdXRpbHMuSW5saW5lQXJyYXkxNiB9LFxuICAgICAgXTtcbiAgICAgIElkZW50aWZpZXJzLkVNUFRZX0lOTElORV9BUlJBWSA9IHtcbiAgICAgICAgICBuYW1lOiAnRU1QVFlfSU5MSU5FX0FSUkFZJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLkVNUFRZX0lOTElORV9BUlJBWVxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLklubGluZUFycmF5RHluYW1pYyA9IHtcbiAgICAgICAgICBuYW1lOiAnSW5saW5lQXJyYXlEeW5hbWljJyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLklubGluZUFycmF5RHluYW1pY1xuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLnN1YnNjcmliZVRvUmVuZGVyRWxlbWVudCA9IHtcbiAgICAgICAgICBuYW1lOiAnc3Vic2NyaWJlVG9SZW5kZXJFbGVtZW50JyxcbiAgICAgICAgICBtb2R1bGVVcmw6IFZJRVdfVVRJTFNfTU9EVUxFX1VSTCxcbiAgICAgICAgICBydW50aW1lOiB2aWV3X3V0aWxzLnN1YnNjcmliZVRvUmVuZGVyRWxlbWVudFxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLmNyZWF0ZVJlbmRlckNvbXBvbmVudFR5cGUgPSB7XG4gICAgICAgICAgbmFtZTogJ2NyZWF0ZVJlbmRlckNvbXBvbmVudFR5cGUnLFxuICAgICAgICAgIG1vZHVsZVVybDogVklFV19VVElMU19NT0RVTEVfVVJMLFxuICAgICAgICAgIHJ1bnRpbWU6IHZpZXdfdXRpbHMuY3JlYXRlUmVuZGVyQ29tcG9uZW50VHlwZVxuICAgICAgfTtcbiAgICAgIElkZW50aWZpZXJzLm5vb3AgPSB7IG5hbWU6ICdub29wJywgbW9kdWxlVXJsOiBWSUVXX1VUSUxTX01PRFVMRV9VUkwsIHJ1bnRpbWU6IHZpZXdfdXRpbHMubm9vcCB9O1xuICAgICAgcmV0dXJuIElkZW50aWZpZXJzO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBwa2dcbiAgICogQHBhcmFtIHs/PX0gcGF0aFxuICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhc3NldFVybChwa2csIHBhdGgsIHR5cGUpIHtcbiAgICAgIGlmIChwYXRoID09PSB2b2lkIDApIHsgcGF0aCA9IG51bGw7IH1cbiAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9ICdzcmMnOyB9XG4gICAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIFwiQGFuZ3VsYXIvXCIgKyBwa2cgKyBcIi9pbmRleFwiO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFwiQGFuZ3VsYXIvXCIgKyBwa2cgKyBcIi9cIiArIHR5cGUgKyBcIi9cIiArIHBhdGg7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHJlZmxlY3Rvci5yZXNvbHZlSWRlbnRpZmllcihpZGVudGlmaWVyLm5hbWUsIGlkZW50aWZpZXIubW9kdWxlVXJsLCBpZGVudGlmaWVyLnJ1bnRpbWUpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVmZXJlbmNlID0gcmVmbGVjdG9yLnJlc29sdmVJZGVudGlmaWVyKGlkZW50aWZpZXIubmFtZSwgaWRlbnRpZmllci5tb2R1bGVVcmwsIGlkZW50aWZpZXIucnVudGltZSk7XG4gICAgICByZXR1cm4geyByZWZlcmVuY2U6IHJlZmVyZW5jZSB9O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlkZW50aWZpZXJUb2tlbihpZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4geyBpZGVudGlmaWVyOiBpZGVudGlmaWVyIH07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlSWRlbnRpZmllclRva2VuKGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBpZGVudGlmaWVyVG9rZW4oY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZW51bVR5cGVcbiAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVFbnVtSWRlbnRpZmllcihlbnVtVHlwZSwgbmFtZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRFbnVtID0gcmVmbGVjdG9yLnJlc29sdmVFbnVtKHJlc29sdmVJZGVudGlmaWVyKGVudW1UeXBlKSwgbmFtZSk7XG4gICAgICByZXR1cm4geyByZWZlcmVuY2U6IHJlc29sdmVkRW51bSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDEyID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvLyBodHRwOi8vY2xkci51bmljb2RlLm9yZy9pbmRleC9jbGRyLXNwZWMvcGx1cmFsLXJ1bGVzXG4gIHZhciAvKiogQHR5cGUgez99ICovIFBMVVJBTF9DQVNFUyA9IFsnemVybycsICdvbmUnLCAndHdvJywgJ2ZldycsICdtYW55JywgJ290aGVyJ107XG4gIC8qKlxuICAgKiAgRXhwYW5kcyBzcGVjaWFsIGZvcm1zIGludG8gZWxlbWVudHMuXG4gICAgKiAqXG4gICAgKiBGb3IgZXhhbXBsZSxcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogeyBtZXNzYWdlcy5sZW5ndGgsIHBsdXJhbCxcbiAgICAqID0wIHt6ZXJvfVxuICAgICogPTEge29uZX1cbiAgICAqIG90aGVyIHttb3JlIHRoYW4gb25lfVxuICAgICogfVxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiB3aWxsIGJlIGV4cGFuZGVkIGludG9cbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogPG5nLWNvbnRhaW5lciBbbmdQbHVyYWxdPVwibWVzc2FnZXMubGVuZ3RoXCI+XG4gICAgKiA8dGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTBcIj56ZXJvPC90ZW1wbGF0ZT5cbiAgICAqIDx0ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MVwiPm9uZTwvdGVtcGxhdGU+XG4gICAgKiA8dGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwib3RoZXJcIj5tb3JlIHRoYW4gb25lPC90ZW1wbGF0ZT5cbiAgICAqIDwvbmctY29udGFpbmVyPlxuICAgICogYGBgXG4gICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGV4cGFuZE5vZGVzKG5vZGVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBhbmRlciA9IG5ldyBfRXhwYW5kZXIoKTtcbiAgICAgIHJldHVybiBuZXcgRXhwYW5zaW9uUmVzdWx0KHZpc2l0QWxsKGV4cGFuZGVyLCBub2RlcyksIGV4cGFuZGVyLmlzRXhwYW5kZWQsIGV4cGFuZGVyLmVycm9ycyk7XG4gIH1cbiAgdmFyIEV4cGFuc2lvblJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5kZWRcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEV4cGFuc2lvblJlc3VsdChub2RlcywgZXhwYW5kZWQsIGVycm9ycykge1xuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gRXhwYW5zaW9uUmVzdWx0O1xuICB9KCkpO1xuICB2YXIgRXhwYW5zaW9uRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDEyKEV4cGFuc2lvbkVycm9yLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JNc2dcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRXhwYW5zaW9uRXJyb3Ioc3BhbiwgZXJyb3JNc2cpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBlcnJvck1zZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRXhwYW5zaW9uRXJyb3I7XG4gIH0oUGFyc2VFcnJvcikpO1xuICAvKipcbiAgICogIEV4cGFuZCBleHBhbnNpb24gZm9ybXMgKHBsdXJhbCwgc2VsZWN0KSB0byBkaXJlY3RpdmVzXG4gICAgKiAqXG4gICAqL1xuICB2YXIgX0V4cGFuZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIF9FeHBhbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmlzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0V4cGFuZGVyLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbGVtZW50Lm5hbWUsIGVsZW1lbnQuYXR0cnMsIHZpc2l0QWxsKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4pLCBlbGVtZW50LnNvdXJjZVNwYW4sIGVsZW1lbnQuc3RhcnRTb3VyY2VTcGFuLCBlbGVtZW50LmVuZFNvdXJjZVNwYW4pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0V4cGFuZGVyLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHsgcmV0dXJuIGF0dHJpYnV0ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9FeHBhbmRlci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNvbnRleHQpIHsgcmV0dXJuIHRleHQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfRXhwYW5kZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IHJldHVybiBjb21tZW50OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGljdVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfRXhwYW5kZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGljdSwgY29udGV4dCkge1xuICAgICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGljdS50eXBlID09ICdwbHVyYWwnID8gX2V4cGFuZFBsdXJhbEZvcm0oaWN1LCB0aGlzLmVycm9ycykgOlxuICAgICAgICAgICAgICBfZXhwYW5kRGVmYXVsdEZvcm0oaWN1LCB0aGlzLmVycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGljdUNhc2VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0V4cGFuZGVyLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoaWN1Q2FzZSwgY29udGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBiZSByZWFjaGVkJyk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9FeHBhbmRlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYXN0XG4gICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZXhwYW5kUGx1cmFsRm9ybShhc3QsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSBhc3QuY2FzZXMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgaWYgKFBMVVJBTF9DQVNFUy5pbmRleE9mKGMudmFsdWUpID09IC0xICYmICFjLnZhbHVlLm1hdGNoKC9ePVxcZCskLykpIHtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEV4cGFuc2lvbkVycm9yKGMudmFsdWVTb3VyY2VTcGFuLCBcIlBsdXJhbCBjYXNlcyBzaG91bGQgYmUgXFxcIj08bnVtYmVyPlxcXCIgb3Igb25lIG9mIFwiICsgUExVUkFMX0NBU0VTLmpvaW4oXCIsIFwiKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBhbnNpb25SZXN1bHQgPSBleHBhbmROb2RlcyhjLmV4cHJlc3Npb24pO1xuICAgICAgICAgIGVycm9ycy5wdXNoLmFwcGx5KGVycm9ycywgZXhwYW5zaW9uUmVzdWx0LmVycm9ycyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KFwidGVtcGxhdGVcIiwgW25ldyBBdHRyaWJ1dGUkMSgnbmdQbHVyYWxDYXNlJywgXCJcIiArIGMudmFsdWUsIGMudmFsdWVTb3VyY2VTcGFuKV0sIGV4cGFuc2lvblJlc3VsdC5ub2RlcywgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4sIGMuc291cmNlU3Bhbik7XG4gICAgICB9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN3aXRjaEF0dHIgPSBuZXcgQXR0cmlidXRlJDEoJ1tuZ1BsdXJhbF0nLCBhc3Quc3dpdGNoVmFsdWUsIGFzdC5zd2l0Y2hWYWx1ZVNvdXJjZVNwYW4pO1xuICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KCduZy1jb250YWluZXInLCBbc3dpdGNoQXR0cl0sIGNoaWxkcmVuLCBhc3Quc291cmNlU3BhbiwgYXN0LnNvdXJjZVNwYW4sIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhc3RcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9leHBhbmREZWZhdWx0Rm9ybShhc3QsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSBhc3QuY2FzZXMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwYW5zaW9uUmVzdWx0ID0gZXhwYW5kTm9kZXMoYy5leHByZXNzaW9uKTtcbiAgICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIGV4cGFuc2lvblJlc3VsdC5lcnJvcnMpO1xuICAgICAgICAgIGlmIChjLnZhbHVlID09PSAnb3RoZXInKSB7XG4gICAgICAgICAgICAgIC8vIG90aGVyIGlzIHRoZSBkZWZhdWx0IGNhc2Ugd2hlbiBubyB2YWx1ZXMgbWF0Y2hcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KFwidGVtcGxhdGVcIiwgW25ldyBBdHRyaWJ1dGUkMSgnbmdTd2l0Y2hEZWZhdWx0JywgJycsIGMudmFsdWVTb3VyY2VTcGFuKV0sIGV4cGFuc2lvblJlc3VsdC5ub2RlcywgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4sIGMuc291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChcInRlbXBsYXRlXCIsIFtuZXcgQXR0cmlidXRlJDEoJ25nU3dpdGNoQ2FzZScsIFwiXCIgKyBjLnZhbHVlLCBjLnZhbHVlU291cmNlU3BhbildLCBleHBhbnNpb25SZXN1bHQubm9kZXMsIGMuc291cmNlU3BhbiwgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4pO1xuICAgICAgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzd2l0Y2hBdHRyID0gbmV3IEF0dHJpYnV0ZSQxKCdbbmdTd2l0Y2hdJywgYXN0LnN3aXRjaFZhbHVlLCBhc3Quc3dpdGNoVmFsdWVTb3VyY2VTcGFuKTtcbiAgICAgIHJldHVybiBuZXcgRWxlbWVudCgnbmctY29udGFpbmVyJywgW3N3aXRjaEF0dHJdLCBjaGlsZHJlbiwgYXN0LnNvdXJjZVNwYW4sIGFzdC5zb3VyY2VTcGFuLCBhc3Quc291cmNlU3Bhbik7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMTMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBQcm92aWRlckVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxMyhQcm92aWRlckVycm9yLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQcm92aWRlckVycm9yKG1lc3NhZ2UsIHNwYW4pIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm92aWRlckVycm9yO1xuICB9KFBhcnNlRXJyb3IpKTtcbiAgdmFyIFByb3ZpZGVyVmlld0NvbnRleHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFByb3ZpZGVyVmlld0NvbnRleHQoY29tcG9uZW50LCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgICAgdGhpcy52aWV3UXVlcmllcyA9IF9nZXRWaWV3UXVlcmllcyhjb21wb25lbnQpO1xuICAgICAgICAgIHRoaXMudmlld1Byb3ZpZGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBjb21wb25lbnQudmlld1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgICBpZiAoaXNCbGFuayhfdGhpcy52aWV3UHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZShwcm92aWRlci50b2tlbikpKSkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMudmlld1Byb3ZpZGVycy5zZXQodG9rZW5SZWZlcmVuY2UocHJvdmlkZXIudG9rZW4pLCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb3ZpZGVyVmlld0NvbnRleHQ7XG4gIH0oKSk7XG4gIHZhciBQcm92aWRlckVsZW1lbnRDb250ZXh0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50XG4gICAgICAgKiBAcGFyYW0gez99IF9pc1ZpZXdSb290XG4gICAgICAgKiBAcGFyYW0gez99IF9kaXJlY3RpdmVBc3RzXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHJlZnNcbiAgICAgICAqIEBwYXJhbSB7P30gX3NvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUHJvdmlkZXJFbGVtZW50Q29udGV4dCh2aWV3Q29udGV4dCwgX3BhcmVudCwgX2lzVmlld1Jvb3QsIF9kaXJlY3RpdmVBc3RzLCBhdHRycywgcmVmcywgX3NvdXJjZVNwYW4pIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMudmlld0NvbnRleHQgPSB2aWV3Q29udGV4dDtcbiAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICAgIHRoaXMuX2lzVmlld1Jvb3QgPSBfaXNWaWV3Um9vdDtcbiAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVBc3RzID0gX2RpcmVjdGl2ZUFzdHM7XG4gICAgICAgICAgdGhpcy5fc291cmNlU3BhbiA9IF9zb3VyY2VTcGFuO1xuICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX3NlZW5Qcm92aWRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5faGFzVmlld0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2F0dHJzID0ge307XG4gICAgICAgICAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0ckFzdCkgeyByZXR1cm4gX3RoaXMuX2F0dHJzW2F0dHJBc3QubmFtZV0gPSBhdHRyQXN0LnZhbHVlOyB9KTtcbiAgICAgICAgICB2YXIgZGlyZWN0aXZlc01ldGEgPSBfZGlyZWN0aXZlQXN0cy5tYXAoZnVuY3Rpb24gKGRpcmVjdGl2ZUFzdCkgeyByZXR1cm4gZGlyZWN0aXZlQXN0LmRpcmVjdGl2ZTsgfSk7XG4gICAgICAgICAgdGhpcy5fYWxsUHJvdmlkZXJzID1cbiAgICAgICAgICAgICAgX3Jlc29sdmVQcm92aWRlcnNGcm9tRGlyZWN0aXZlcyhkaXJlY3RpdmVzTWV0YSwgX3NvdXJjZVNwYW4sIHZpZXdDb250ZXh0LmVycm9ycyk7XG4gICAgICAgICAgdGhpcy5fY29udGVudFF1ZXJpZXMgPSBfZ2V0Q29udGVudFF1ZXJpZXMoZGlyZWN0aXZlc01ldGEpO1xuICAgICAgICAgIHZhciBxdWVyaWVkVG9rZW5zID0gbmV3IE1hcCgpO1xuICAgICAgICAgIEFycmF5LmZyb20odGhpcy5fYWxsUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgICBfdGhpcy5fYWRkUXVlcnlSZWFkc1RvKHByb3ZpZGVyLnRva2VuLCBxdWVyaWVkVG9rZW5zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWZzLmZvckVhY2goZnVuY3Rpb24gKHJlZkFzdCkgeyBfdGhpcy5fYWRkUXVlcnlSZWFkc1RvKHsgdmFsdWU6IHJlZkFzdC5uYW1lIH0sIHF1ZXJpZWRUb2tlbnMpOyB9KTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHF1ZXJpZWRUb2tlbnMuZ2V0KHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYpKSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGFzVmlld0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXJzIHRoYXQgd2Uga25vdyBhcmUgZWFnZXIgZmlyc3RcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuX2FsbFByb3ZpZGVycy52YWx1ZXMoKSkuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgdmFyIGVhZ2VyID0gcHJvdmlkZXIuZWFnZXIgfHwgaXNQcmVzZW50KHF1ZXJpZWRUb2tlbnMuZ2V0KHRva2VuUmVmZXJlbmNlKHByb3ZpZGVyLnRva2VuKSkpO1xuICAgICAgICAgICAgICBpZiAoZWFnZXIpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9nZXRPckNyZWF0ZUxvY2FsUHJvdmlkZXIocHJvdmlkZXIucHJvdmlkZXJUeXBlLCBwcm92aWRlci50b2tlbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUuYWZ0ZXJFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgLy8gY29sbGVjdCBsYXp5IHByb3ZpZGVyc1xuICAgICAgICAgIEFycmF5LmZyb20odGhpcy5fYWxsUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgICBfdGhpcy5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyKHByb3ZpZGVyLnByb3ZpZGVyVHlwZSwgcHJvdmlkZXIudG9rZW4sIGZhbHNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUsIFwidHJhbnNmb3JtUHJvdmlkZXJzXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl90cmFuc2Zvcm1lZFByb3ZpZGVycy52YWx1ZXMoKSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUsIFwidHJhbnNmb3JtZWREaXJlY3RpdmVBc3RzXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3J0ZWRQcm92aWRlclR5cGVzID0gdGhpcy50cmFuc2Zvcm1Qcm92aWRlcnMubWFwKGZ1bmN0aW9uIChwcm92aWRlcikgeyByZXR1cm4gcHJvdmlkZXIudG9rZW4uaWRlbnRpZmllcjsgfSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvcnRlZERpcmVjdGl2ZXMgPSB0aGlzLl9kaXJlY3RpdmVBc3RzLnNsaWNlKCk7XG4gICAgICAgICAgICAgIHNvcnRlZERpcmVjdGl2ZXMuc29ydChmdW5jdGlvbiAoZGlyMSwgZGlyMikgeyByZXR1cm4gc29ydGVkUHJvdmlkZXJUeXBlcy5pbmRleE9mKGRpcjEuZGlyZWN0aXZlLnR5cGUpIC1cbiAgICAgICAgICAgICAgICAgIHNvcnRlZFByb3ZpZGVyVHlwZXMuaW5kZXhPZihkaXIyLmRpcmVjdGl2ZS50eXBlKTsgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBzb3J0ZWREaXJlY3RpdmVzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFByb3ZpZGVyRWxlbWVudENvbnRleHQucHJvdG90eXBlLCBcInRyYW5zZm9ybWVkSGFzVmlld0NvbnRhaW5lclwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2hhc1ZpZXdDb250YWluZXI7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UmVhZFRva2Vuc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUuX2FkZFF1ZXJ5UmVhZHNUbyA9IGZ1bmN0aW9uICh0b2tlbiwgcXVlcnlSZWFkVG9rZW5zKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0UXVlcmllc0Zvcih0b2tlbikuZm9yRWFjaChmdW5jdGlvbiAocXVlcnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcnlSZWFkVG9rZW4gPSBxdWVyeS5yZWFkIHx8IHRva2VuO1xuICAgICAgICAgICAgICBpZiAoaXNCbGFuayhxdWVyeVJlYWRUb2tlbnMuZ2V0KHRva2VuUmVmZXJlbmNlKHF1ZXJ5UmVhZFRva2VuKSkpKSB7XG4gICAgICAgICAgICAgICAgICBxdWVyeVJlYWRUb2tlbnMuc2V0KHRva2VuUmVmZXJlbmNlKHF1ZXJ5UmVhZFRva2VuKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFByb3ZpZGVyRWxlbWVudENvbnRleHQucHJvdG90eXBlLl9nZXRRdWVyaWVzRm9yID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VycmVudEVsID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXN0YW5jZSA9IDA7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcmllcztcbiAgICAgICAgICB3aGlsZSAoY3VycmVudEVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHF1ZXJpZXMgPSBjdXJyZW50RWwuX2NvbnRlbnRRdWVyaWVzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHF1ZXJpZXMpKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIHF1ZXJpZXMuZmlsdGVyKGZ1bmN0aW9uIChxdWVyeSkgeyByZXR1cm4gcXVlcnkuZGVzY2VuZGFudHMgfHwgZGlzdGFuY2UgPD0gMTsgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RWwuX2RpcmVjdGl2ZUFzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2UrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXJyZW50RWwgPSBjdXJyZW50RWwuX3BhcmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcmllcyA9IHRoaXMudmlld0NvbnRleHQudmlld1F1ZXJpZXMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChxdWVyaWVzKSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIHF1ZXJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZXF1ZXN0aW5nUHJvdmlkZXJUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgKiBAcGFyYW0gez99IGVhZ2VyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyID0gZnVuY3Rpb24gKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIHRva2VuLCBlYWdlcikge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRQcm92aWRlciA9IHRoaXMuX2FsbFByb3ZpZGVycy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgICBpZiAoIXJlc29sdmVkUHJvdmlkZXIgfHwgKChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlIHx8XG4gICAgICAgICAgICAgIHJlcXVlc3RpbmdQcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5QdWJsaWNTZXJ2aWNlKSAmJlxuICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLlByaXZhdGVTZXJ2aWNlKSB8fFxuICAgICAgICAgICAgICAoKHJlcXVlc3RpbmdQcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZSB8fFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UpICYmXG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkJ1aWx0aW4pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0ID0gdGhpcy5fdHJhbnNmb3JtZWRQcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRQcm92aWRlckFzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLl9zZWVuUHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpKSkge1xuICAgICAgICAgICAgICB0aGlzLnZpZXdDb250ZXh0LmVycm9ycy5wdXNoKG5ldyBQcm92aWRlckVycm9yKFwiQ2Fubm90IGluc3RhbnRpYXRlIGN5Y2xpYyBkZXBlbmRlbmN5ISBcIiArIHRva2VuTmFtZSh0b2tlbiksIHRoaXMuX3NvdXJjZVNwYW4pKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3NlZW5Qcm92aWRlcnMuc2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSwgdHJ1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNmb3JtZWRQcm92aWRlcnMgPSByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYW5zZm9ybWVkVXNlVmFsdWUgPSBwcm92aWRlci51c2VWYWx1ZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNmb3JtZWRVc2VFeGlzdGluZyA9IHByb3ZpZGVyLnVzZUV4aXN0aW5nO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2Zvcm1lZERlcHM7XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocHJvdmlkZXIudXNlRXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleGlzdGluZ0RpRGVwID0gX3RoaXMuX2dldERlcGVuZGVuY3kocmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUsIHsgdG9rZW46IHByb3ZpZGVyLnVzZUV4aXN0aW5nIH0sIGVhZ2VyKTtcbiAgICAgICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZXhpc3RpbmdEaURlcC50b2tlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nID0gZXhpc3RpbmdEaURlcC50b2tlbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVXNlRXhpc3RpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVXNlVmFsdWUgPSBleGlzdGluZ0RpRGVwLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VGYWN0b3J5KSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwcyA9IHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlRmFjdG9yeS5kaURlcHM7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZERlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJUeXBlLCBkZXAsIGVhZ2VyKTsgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KHByb3ZpZGVyLnVzZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwcyA9IHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlQ2xhc3MuZGlEZXBzO1xuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWREZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICBkZXBzLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBfdGhpcy5fZ2V0RGVwZW5kZW5jeShyZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSwgZGVwLCBlYWdlcik7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfdHJhbnNmb3JtUHJvdmlkZXIocHJvdmlkZXIsIHtcbiAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nLFxuICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHRyYW5zZm9ybWVkVXNlVmFsdWUsXG4gICAgICAgICAgICAgICAgICBkZXBzOiB0cmFuc2Zvcm1lZERlcHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdHJhbnNmb3JtZWRQcm92aWRlckFzdCA9XG4gICAgICAgICAgICAgIF90cmFuc2Zvcm1Qcm92aWRlckFzdChyZXNvbHZlZFByb3ZpZGVyLCB7IGVhZ2VyOiBlYWdlciwgcHJvdmlkZXJzOiB0cmFuc2Zvcm1lZFByb3ZpZGVycyB9KTtcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm1lZFByb3ZpZGVycy5zZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pLCB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0KTtcbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRQcm92aWRlckFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdGluZ1Byb3ZpZGVyVHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBkZXBcbiAgICAgICAqIEBwYXJhbSB7Pz19IGVhZ2VyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5fZ2V0TG9jYWxEZXBlbmRlbmN5ID0gZnVuY3Rpb24gKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIGRlcCwgZWFnZXIpIHtcbiAgICAgICAgICBpZiAoZWFnZXIgPT09IHZvaWQgMCkgeyBlYWdlciA9IG51bGw7IH1cbiAgICAgICAgICBpZiAoZGVwLmlzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGF0dHJWYWx1ZSA9IHRoaXMuX2F0dHJzW2RlcC50b2tlbi52YWx1ZV07XG4gICAgICAgICAgICAgIHJldHVybiB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBhdHRyVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBhdHRyVmFsdWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChkZXAudG9rZW4pKSB7XG4gICAgICAgICAgICAgIC8vIGFjY2VzcyBidWlsdGludHNcbiAgICAgICAgICAgICAgaWYgKChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlIHx8XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLlJlbmRlcmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkVsZW1lbnRSZWYpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgdG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSA9PT0gcmVzb2x2ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JSZWYpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgdG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSA9PT0gcmVzb2x2ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuVGVtcGxhdGVSZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pID09PSByZXNvbHZlSWRlbnRpZmllcihJZGVudGlmaWVycy5WaWV3Q29udGFpbmVyUmVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1ZpZXdDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGFjY2VzcyB0aGUgaW5qZWN0b3JcbiAgICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkluamVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBhY2Nlc3MgcHJvdmlkZXJzXG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIGRlcC50b2tlbiwgZWFnZXIpKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdGluZ1Byb3ZpZGVyVHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBkZXBcbiAgICAgICAqIEBwYXJhbSB7Pz19IGVhZ2VyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5fZ2V0RGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlLCBkZXAsIGVhZ2VyKSB7XG4gICAgICAgICAgaWYgKGVhZ2VyID09PSB2b2lkIDApIHsgZWFnZXIgPSBudWxsOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyckVsZW1lbnQgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJFYWdlciA9IGVhZ2VyO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgaWYgKCFkZXAuaXNTa2lwU2VsZikge1xuICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRMb2NhbERlcGVuZGVuY3kocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSwgZGVwLCBlYWdlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZXAuaXNTZWxmKSB7XG4gICAgICAgICAgICAgIGlmICghcmVzdWx0ICYmIGRlcC5pc09wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNoZWNrIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgICB3aGlsZSAoIXJlc3VsdCAmJiBpc1ByZXNlbnQoY3VyckVsZW1lbnQuX3BhcmVudCkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZFbGVtZW50ID0gY3VyckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICBjdXJyRWxlbWVudCA9IGN1cnJFbGVtZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICBpZiAocHJldkVsZW1lbnQuX2lzVmlld1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyRWFnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJFbGVtZW50Ll9nZXRMb2NhbERlcGVuZGVuY3koUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UsIGRlcCwgY3VyckVhZ2VyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBjaGVjayBASG9zdCByZXN0cmljdGlvblxuICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFkZXAuaXNIb3N0IHx8IHRoaXMudmlld0NvbnRleHQuY29tcG9uZW50LmlzSG9zdCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuY29tcG9uZW50LnR5cGUucmVmZXJlbmNlID09PSB0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaXNQcmVzZW50KHRoaXMudmlld0NvbnRleHQudmlld1Byb3ZpZGVycy5nZXQodG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVwLmlzT3B0aW9uYWwgPyByZXN1bHQgPSB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBudWxsIH0gOiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuZXJyb3JzLnB1c2gobmV3IFByb3ZpZGVyRXJyb3IoXCJObyBwcm92aWRlciBmb3IgXCIgKyB0b2tlbk5hbWUoZGVwLnRva2VuKSwgdGhpcy5fc291cmNlU3BhbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQcm92aWRlckVsZW1lbnRDb250ZXh0O1xuICB9KCkpO1xuICB2YXIgTmdNb2R1bGVQcm92aWRlckFuYWx5emVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZVxuICAgICAgICogQHBhcmFtIHs/fSBleHRyYVByb3ZpZGVyc1xuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5nTW9kdWxlUHJvdmlkZXJBbmFseXplcihuZ01vZHVsZSwgZXh0cmFQcm92aWRlcnMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX3NlZW5Qcm92aWRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fZXJyb3JzID0gW107XG4gICAgICAgICAgdGhpcy5fYWxsUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgICAgdmFyIG5nTW9kdWxlUHJvdmlkZXIgPSB7IHRva2VuOiB7IGlkZW50aWZpZXI6IG5nTW9kdWxlVHlwZSB9LCB1c2VDbGFzczogbmdNb2R1bGVUeXBlIH07XG4gICAgICAgICAgICAgIF9yZXNvbHZlUHJvdmlkZXJzKFtuZ01vZHVsZVByb3ZpZGVyXSwgUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UsIHRydWUsIHNvdXJjZVNwYW4sIF90aGlzLl9lcnJvcnMsIF90aGlzLl9hbGxQcm92aWRlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9yZXNvbHZlUHJvdmlkZXJzKG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUucHJvdmlkZXJzLm1hcChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIGVudHJ5LnByb3ZpZGVyOyB9KS5jb25jYXQoZXh0cmFQcm92aWRlcnMpLCBQcm92aWRlckFzdFR5cGUuUHVibGljU2VydmljZSwgZmFsc2UsIHNvdXJjZVNwYW4sIHRoaXMuX2Vycm9ycywgdGhpcy5fYWxsUHJvdmlkZXJzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTmdNb2R1bGVQcm92aWRlckFuYWx5emVyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIEFycmF5LmZyb20odGhpcy5fYWxsUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgICBfdGhpcy5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyKHByb3ZpZGVyLnRva2VuLCBwcm92aWRlci5lYWdlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuX2Vycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9yU3RyaW5nID0gdGhpcy5fZXJyb3JzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlciBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvclN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzLnZhbHVlcygpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEBwYXJhbSB7P30gZWFnZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5nTW9kdWxlUHJvdmlkZXJBbmFseXplci5wcm90b3R5cGUuX2dldE9yQ3JlYXRlTG9jYWxQcm92aWRlciA9IGZ1bmN0aW9uICh0b2tlbiwgZWFnZXIpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVkUHJvdmlkZXIgPSB0aGlzLl9hbGxQcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0ID0gdGhpcy5fdHJhbnNmb3JtZWRQcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRQcm92aWRlckFzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLl9zZWVuUHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpKSkge1xuICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgUHJvdmlkZXJFcnJvcihcIkNhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEgXCIgKyB0b2tlbk5hbWUodG9rZW4pLCByZXNvbHZlZFByb3ZpZGVyLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3NlZW5Qcm92aWRlcnMuc2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSwgdHJ1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNmb3JtZWRQcm92aWRlcnMgPSByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYW5zZm9ybWVkVXNlVmFsdWUgPSBwcm92aWRlci51c2VWYWx1ZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNmb3JtZWRVc2VFeGlzdGluZyA9IHByb3ZpZGVyLnVzZUV4aXN0aW5nO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2Zvcm1lZERlcHM7XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocHJvdmlkZXIudXNlRXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleGlzdGluZ0RpRGVwID0gX3RoaXMuX2dldERlcGVuZGVuY3koeyB0b2tlbjogcHJvdmlkZXIudXNlRXhpc3RpbmcgfSwgZWFnZXIsIHJlc29sdmVkUHJvdmlkZXIuc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGV4aXN0aW5nRGlEZXAudG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRVc2VFeGlzdGluZyA9IGV4aXN0aW5nRGlEZXAudG9rZW47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFVzZVZhbHVlID0gZXhpc3RpbmdEaURlcC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChpc1ByZXNlbnQocHJvdmlkZXIudXNlRmFjdG9yeSkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUZhY3RvcnkuZGlEZXBzO1xuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWREZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICBkZXBzLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBfdGhpcy5fZ2V0RGVwZW5kZW5jeShkZXAsIGVhZ2VyLCByZXNvbHZlZFByb3ZpZGVyLnNvdXJjZVNwYW4pOyB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChpc1ByZXNlbnQocHJvdmlkZXIudXNlQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBzID0gcHJvdmlkZXIuZGVwcyB8fCBwcm92aWRlci51c2VDbGFzcy5kaURlcHM7XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZERlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KGRlcCwgZWFnZXIsIHJlc29sdmVkUHJvdmlkZXIuc291cmNlU3Bhbik7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfdHJhbnNmb3JtUHJvdmlkZXIocHJvdmlkZXIsIHtcbiAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nLFxuICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHRyYW5zZm9ybWVkVXNlVmFsdWUsXG4gICAgICAgICAgICAgICAgICBkZXBzOiB0cmFuc2Zvcm1lZERlcHNcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdHJhbnNmb3JtZWRQcm92aWRlckFzdCA9XG4gICAgICAgICAgICAgIF90cmFuc2Zvcm1Qcm92aWRlckFzdChyZXNvbHZlZFByb3ZpZGVyLCB7IGVhZ2VyOiBlYWdlciwgcHJvdmlkZXJzOiB0cmFuc2Zvcm1lZFByb3ZpZGVycyB9KTtcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm1lZFByb3ZpZGVycy5zZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pLCB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0KTtcbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRQcm92aWRlckFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwXG4gICAgICAgKiBAcGFyYW0gez89fSBlYWdlclxuICAgICAgICogQHBhcmFtIHs/fSByZXF1ZXN0b3JTb3VyY2VTcGFuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOZ01vZHVsZVByb3ZpZGVyQW5hbHl6ZXIucHJvdG90eXBlLl9nZXREZXBlbmRlbmN5ID0gZnVuY3Rpb24gKGRlcCwgZWFnZXIsIHJlcXVlc3RvclNvdXJjZVNwYW4pIHtcbiAgICAgICAgICBpZiAoZWFnZXIgPT09IHZvaWQgMCkgeyBlYWdlciA9IG51bGw7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmb3VuZExvY2FsID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFkZXAuaXNTa2lwU2VsZiAmJiBpc1ByZXNlbnQoZGVwLnRva2VuKSkge1xuICAgICAgICAgICAgICAvLyBhY2Nlc3MgdGhlIGluamVjdG9yXG4gICAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pID09PSByZXNvbHZlSWRlbnRpZmllcihJZGVudGlmaWVycy5JbmplY3RvcikgfHxcbiAgICAgICAgICAgICAgICAgIHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikpIHtcbiAgICAgICAgICAgICAgICAgIGZvdW5kTG9jYWwgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGlzUHJlc2VudCh0aGlzLl9nZXRPckNyZWF0ZUxvY2FsUHJvdmlkZXIoZGVwLnRva2VuLCBlYWdlcikpKSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZExvY2FsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBkZXA7XG4gICAgICAgICAgaWYgKGRlcC5pc1NlbGYgJiYgIWZvdW5kTG9jYWwpIHtcbiAgICAgICAgICAgICAgaWYgKGRlcC5pc09wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgUHJvdmlkZXJFcnJvcihcIk5vIHByb3ZpZGVyIGZvciBcIiArIHRva2VuTmFtZShkZXAudG9rZW4pLCByZXF1ZXN0b3JTb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTmdNb2R1bGVQcm92aWRlckFuYWx5emVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgKiBAcGFyYW0gez99IF9fMVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3RyYW5zZm9ybVByb3ZpZGVyKHByb3ZpZGVyLCBfYSkge1xuICAgICAgdmFyIHVzZUV4aXN0aW5nID0gX2EudXNlRXhpc3RpbmcsIHVzZVZhbHVlID0gX2EudXNlVmFsdWUsIGRlcHMgPSBfYS5kZXBzO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbjogcHJvdmlkZXIudG9rZW4sXG4gICAgICAgICAgdXNlQ2xhc3M6IHByb3ZpZGVyLnVzZUNsYXNzLFxuICAgICAgICAgIHVzZUV4aXN0aW5nOiB1c2VFeGlzdGluZyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBwcm92aWRlci51c2VGYWN0b3J5LFxuICAgICAgICAgIHVzZVZhbHVlOiB1c2VWYWx1ZSxcbiAgICAgICAgICBkZXBzOiBkZXBzLFxuICAgICAgICAgIG11bHRpOiBwcm92aWRlci5tdWx0aVxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgKiBAcGFyYW0gez99IF9fMVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3RyYW5zZm9ybVByb3ZpZGVyQXN0KHByb3ZpZGVyLCBfYSkge1xuICAgICAgdmFyIGVhZ2VyID0gX2EuZWFnZXIsIHByb3ZpZGVycyA9IF9hLnByb3ZpZGVycztcbiAgICAgIHJldHVybiBuZXcgUHJvdmlkZXJBc3QocHJvdmlkZXIudG9rZW4sIHByb3ZpZGVyLm11bHRpUHJvdmlkZXIsIHByb3ZpZGVyLmVhZ2VyIHx8IGVhZ2VyLCBwcm92aWRlcnMsIHByb3ZpZGVyLnByb3ZpZGVyVHlwZSwgcHJvdmlkZXIubGlmZWN5Y2xlSG9va3MsIHByb3ZpZGVyLnNvdXJjZVNwYW4pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAqIEBwYXJhbSB7P30gdGFyZ2V0RXJyb3JzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcmVzb2x2ZVByb3ZpZGVyc0Zyb21EaXJlY3RpdmVzKGRpcmVjdGl2ZXMsIHNvdXJjZVNwYW4sIHRhcmdldEVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJzQnlUb2tlbiA9IG5ldyBNYXAoKTtcbiAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyUHJvdmlkZXIgPSB7IHRva2VuOiB7IGlkZW50aWZpZXI6IGRpcmVjdGl2ZS50eXBlIH0sIHVzZUNsYXNzOiBkaXJlY3RpdmUudHlwZSB9O1xuICAgICAgICAgIF9yZXNvbHZlUHJvdmlkZXJzKFtkaXJQcm92aWRlcl0sIGRpcmVjdGl2ZS5pc0NvbXBvbmVudCA/IFByb3ZpZGVyQXN0VHlwZS5Db21wb25lbnQgOiBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlLCB0cnVlLCBzb3VyY2VTcGFuLCB0YXJnZXRFcnJvcnMsIHByb3ZpZGVyc0J5VG9rZW4pO1xuICAgICAgfSk7XG4gICAgICAvLyBOb3RlOiBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgYWJsZSB0byBvdmVyd3JpdGUgcHJvdmlkZXJzIG9mIGEgY29tcG9uZW50IVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyZWN0aXZlc1dpdGhDb21wb25lbnRGaXJzdCA9IGRpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGRpci5pc0NvbXBvbmVudDsgfSkuY29uY2F0KGRpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuICFkaXIuaXNDb21wb25lbnQ7IH0pKTtcbiAgICAgIGRpcmVjdGl2ZXNXaXRoQ29tcG9uZW50Rmlyc3QuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlKSB7XG4gICAgICAgICAgX3Jlc29sdmVQcm92aWRlcnMoZGlyZWN0aXZlLnByb3ZpZGVycywgUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UsIGZhbHNlLCBzb3VyY2VTcGFuLCB0YXJnZXRFcnJvcnMsIHByb3ZpZGVyc0J5VG9rZW4pO1xuICAgICAgICAgIF9yZXNvbHZlUHJvdmlkZXJzKGRpcmVjdGl2ZS52aWV3UHJvdmlkZXJzLCBQcm92aWRlckFzdFR5cGUuUHJpdmF0ZVNlcnZpY2UsIGZhbHNlLCBzb3VyY2VTcGFuLCB0YXJnZXRFcnJvcnMsIHByb3ZpZGVyc0J5VG9rZW4pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvdmlkZXJzQnlUb2tlbjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlclR5cGVcbiAgICogQHBhcmFtIHs/fSBlYWdlclxuICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICogQHBhcmFtIHs/fSB0YXJnZXRFcnJvcnNcbiAgICogQHBhcmFtIHs/fSB0YXJnZXRQcm92aWRlcnNCeVRva2VuXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcmVzb2x2ZVByb3ZpZGVycyhwcm92aWRlcnMsIHByb3ZpZGVyVHlwZSwgZWFnZXIsIHNvdXJjZVNwYW4sIHRhcmdldEVycm9ycywgdGFyZ2V0UHJvdmlkZXJzQnlUb2tlbikge1xuICAgICAgcHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRQcm92aWRlciA9IHRhcmdldFByb3ZpZGVyc0J5VG9rZW4uZ2V0KHRva2VuUmVmZXJlbmNlKHByb3ZpZGVyLnRva2VuKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChyZXNvbHZlZFByb3ZpZGVyKSAmJiAhIXJlc29sdmVkUHJvdmlkZXIubXVsdGlQcm92aWRlciAhPT0gISFwcm92aWRlci5tdWx0aSkge1xuICAgICAgICAgICAgICB0YXJnZXRFcnJvcnMucHVzaChuZXcgUHJvdmlkZXJFcnJvcihcIk1peGluZyBtdWx0aSBhbmQgbm9uIG11bHRpIHByb3ZpZGVyIGlzIG5vdCBwb3NzaWJsZSBmb3IgdG9rZW4gXCIgKyB0b2tlbk5hbWUocmVzb2x2ZWRQcm92aWRlci50b2tlbiksIHNvdXJjZVNwYW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpZmVjeWNsZUhvb2tzID0gcHJvdmlkZXIudG9rZW4uaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICAgKChwcm92aWRlci50b2tlbi5pZGVudGlmaWVyKSkubGlmZWN5Y2xlSG9va3MgP1xuICAgICAgICAgICAgICAgICAgKChwcm92aWRlci50b2tlbi5pZGVudGlmaWVyKSkubGlmZWN5Y2xlSG9va3MgOlxuICAgICAgICAgICAgICAgICAgW107XG4gICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJBc3QocHJvdmlkZXIudG9rZW4sIHByb3ZpZGVyLm11bHRpLCBlYWdlciB8fCBsaWZlY3ljbGVIb29rcy5sZW5ndGggPiAwLCBbcHJvdmlkZXJdLCBwcm92aWRlclR5cGUsIGxpZmVjeWNsZUhvb2tzLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJzQnlUb2tlbi5zZXQodG9rZW5SZWZlcmVuY2UocHJvdmlkZXIudG9rZW4pLCByZXNvbHZlZFByb3ZpZGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghcHJvdmlkZXIubXVsdGkpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZWRQcm92aWRlci5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZ2V0Vmlld1F1ZXJpZXMoY29tcG9uZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3UXVlcmllcyA9IG5ldyBNYXAoKTtcbiAgICAgIGlmIChpc1ByZXNlbnQoY29tcG9uZW50LnZpZXdRdWVyaWVzKSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3UXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkgeyByZXR1cm4gX2FkZFF1ZXJ5VG9Ub2tlbk1hcCh2aWV3UXVlcmllcywgcXVlcnkpOyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2aWV3UXVlcmllcztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfZ2V0Q29udGVudFF1ZXJpZXMoZGlyZWN0aXZlcykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGVudFF1ZXJpZXMgPSBuZXcgTWFwKCk7XG4gICAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGl2ZSkge1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGlyZWN0aXZlLnF1ZXJpZXMpKSB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZS5xdWVyaWVzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5KSB7IHJldHVybiBfYWRkUXVlcnlUb1Rva2VuTWFwKGNvbnRlbnRRdWVyaWVzLCBxdWVyeSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbnRlbnRRdWVyaWVzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG1hcFxuICAgKiBAcGFyYW0gez99IHF1ZXJ5XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfYWRkUXVlcnlUb1Rva2VuTWFwKG1hcCwgcXVlcnkpIHtcbiAgICAgIHF1ZXJ5LnNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJ5ID0gbWFwLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpO1xuICAgICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgICAgZW50cnkgPSBbXTtcbiAgICAgICAgICAgICAgbWFwLnNldCh0b2tlblJlZmVyZW5jZSh0b2tlbiksIGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkucHVzaChxdWVyeSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBFbGVtZW50U2NoZW1hUmVnaXN0cnkoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB0YWdOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHNjaGVtYU1ldGFzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbGVtZW50U2NoZW1hUmVnaXN0cnkucHJvdG90eXBlLmhhc1Byb3BlcnR5ID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BOYW1lLCBzY2hlbWFNZXRhcykgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBzY2hlbWFNZXRhc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5oYXNFbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWUsIHNjaGVtYU1ldGFzKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50TmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBpc0F0dHJpYnV0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5zZWN1cml0eUNvbnRleHQgPSBmdW5jdGlvbiAoZWxlbWVudE5hbWUsIHByb3BOYW1lLCBpc0F0dHJpYnV0ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuYWxsS25vd25FbGVtZW50TmFtZXMgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRNYXBwZWRQcm9wTmFtZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXBvbmVudEVsZW1lbnROYW1lID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS52YWxpZGF0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUudmFsaWRhdGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUubm9ybWFsaXplQW5pbWF0aW9uU3R5bGVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wTmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gY2FtZWxDYXNlUHJvcFxuICAgICAgICogQHBhcmFtIHs/fSB1c2VyUHJvdmlkZWRQcm9wXG4gICAgICAgKiBAcGFyYW0gez99IHZhbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5ub3JtYWxpemVBbmltYXRpb25TdHlsZVZhbHVlID0gZnVuY3Rpb24gKGNhbWVsQ2FzZVByb3AsIHVzZXJQcm92aWRlZFByb3AsIHZhbCkgeyB9O1xuICAgICAgcmV0dXJuIEVsZW1lbnRTY2hlbWFSZWdpc3RyeTtcbiAgfSgpKTtcblxuICB2YXIgU3R5bGVXaXRoSW1wb3J0cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVVcmxzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFN0eWxlV2l0aEltcG9ydHMoc3R5bGUsIHN0eWxlVXJscykge1xuICAgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgICB0aGlzLnN0eWxlVXJscyA9IHN0eWxlVXJscztcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHlsZVdpdGhJbXBvcnRzO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB1cmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHVybCkge1xuICAgICAgaWYgKGlzQmxhbmsodXJsKSB8fCB1cmwubGVuZ3RoID09PSAwIHx8IHVybFswXSA9PSAnLycpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2NoZW1lTWF0Y2ggPSB1cmwubWF0Y2goX3VybFdpdGhTY2hlbWFSZSk7XG4gICAgICByZXR1cm4gc2NoZW1lTWF0Y2ggPT09IG51bGwgfHwgc2NoZW1lTWF0Y2hbMV0gPT0gJ3BhY2thZ2UnIHx8IHNjaGVtZU1hdGNoWzFdID09ICdhc3NldCc7XG4gIH1cbiAgLyoqXG4gICAqICBSZXdyaXRlcyBzdHlsZXNoZWV0cyBieSByZXNvbHZpbmcgYW5kIHJlbW92aW5nIHRoZSBAaW1wb3J0IHVybHMgdGhhdFxuICAgICogYXJlIGVpdGhlciByZWxhdGl2ZSBvciBkb24ndCBoYXZlIGEgYHBhY2thZ2U6YCBzY2hlbWVcbiAgICogQHBhcmFtIHs/fSByZXNvbHZlclxuICAgKiBAcGFyYW0gez99IGJhc2VVcmxcbiAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBleHRyYWN0U3R5bGVVcmxzKHJlc29sdmVyLCBiYXNlVXJsLCBjc3NUZXh0KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmb3VuZFVybHMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZGlmaWVkQ3NzVGV4dCA9IGNzc1RleHQucmVwbGFjZShfY3NzSW1wb3J0UmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgbSA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG1bX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVybCA9IG1bMV0gfHwgbVsyXTtcbiAgICAgICAgICBpZiAoIWlzU3R5bGVVcmxSZXNvbHZhYmxlKHVybCkpIHtcbiAgICAgICAgICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZSBub24tcGFja2FnZSBhYnNvbHV0ZSBVUkxzIHdpdGggVVJJIHNjaGVtZVxuICAgICAgICAgICAgICByZXR1cm4gbVswXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm91bmRVcmxzLnB1c2gocmVzb2x2ZXIucmVzb2x2ZShiYXNlVXJsLCB1cmwpKTtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgU3R5bGVXaXRoSW1wb3J0cyhtb2RpZmllZENzc1RleHQsIGZvdW5kVXJscyk7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX2Nzc0ltcG9ydFJlID0gL0BpbXBvcnRcXHMrKD86dXJsXFwoKT9cXHMqKD86KD86WydcIl0oW14nXCJdKikpfChbXjtcXClcXHNdKikpW147XSo7Py9nO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfdXJsV2l0aFNjaGVtYVJlID0gL14oW146Lz8jXSspOi87XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDE0ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IgPSAnLic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEFUVFJJQlVURV9QUkVGSVggPSAnYXR0cic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENMQVNTX1BSRUZJWCA9ICdjbGFzcyc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFNUWUxFX1BSRUZJWCA9ICdzdHlsZSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEFOSU1BVEVfUFJPUF9QUkVGSVggPSAnYW5pbWF0ZS0nO1xuICB2YXIgQm91bmRQcm9wZXJ0eVR5cGUgPSB7fTtcbiAgQm91bmRQcm9wZXJ0eVR5cGUuREVGQVVMVCA9IDA7XG4gIEJvdW5kUHJvcGVydHlUeXBlLkxJVEVSQUxfQVRUUiA9IDE7XG4gIEJvdW5kUHJvcGVydHlUeXBlLkFOSU1BVElPTiA9IDI7XG4gIEJvdW5kUHJvcGVydHlUeXBlW0JvdW5kUHJvcGVydHlUeXBlLkRFRkFVTFRdID0gXCJERUZBVUxUXCI7XG4gIEJvdW5kUHJvcGVydHlUeXBlW0JvdW5kUHJvcGVydHlUeXBlLkxJVEVSQUxfQVRUUl0gPSBcIkxJVEVSQUxfQVRUUlwiO1xuICBCb3VuZFByb3BlcnR5VHlwZVtCb3VuZFByb3BlcnR5VHlwZS5BTklNQVRJT05dID0gXCJBTklNQVRJT05cIjtcbiAgLyoqXG4gICAqICBSZXByZXNlbnRzIGEgcGFyc2VkIHByb3BlcnR5LlxuICAgKi9cbiAgdmFyIEJvdW5kUHJvcGVydHkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQm91bmRQcm9wZXJ0eShuYW1lLCBleHByZXNzaW9uLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCb3VuZFByb3BlcnR5LnByb3RvdHlwZSwgXCJpc0xpdGVyYWxcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT09IEJvdW5kUHJvcGVydHlUeXBlLkxJVEVSQUxfQVRUUjsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQm91bmRQcm9wZXJ0eS5wcm90b3R5cGUsIFwiaXNBbmltYXRpb25cIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT09IEJvdW5kUHJvcGVydHlUeXBlLkFOSU1BVElPTjsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gQm91bmRQcm9wZXJ0eTtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBQYXJzZXMgYmluZGluZ3MgaW4gdGVtcGxhdGVzIGFuZCBpbiB0aGUgZGlyZWN0aXZlIGhvc3QgYXJlYS5cbiAgICovXG4gIHZhciBCaW5kaW5nUGFyc2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfZXhwclBhcnNlclxuICAgICAgICogQHBhcmFtIHs/fSBfaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHBhcmFtIHs/fSBfc2NoZW1hUmVnaXN0cnlcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZXNcbiAgICAgICAqIEBwYXJhbSB7P30gX3RhcmdldEVycm9yc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBCaW5kaW5nUGFyc2VyKF9leHByUGFyc2VyLCBfaW50ZXJwb2xhdGlvbkNvbmZpZywgX3NjaGVtYVJlZ2lzdHJ5LCBwaXBlcywgX3RhcmdldEVycm9ycykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy5fZXhwclBhcnNlciA9IF9leHByUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgPSBfaW50ZXJwb2xhdGlvbkNvbmZpZztcbiAgICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgICB0aGlzLl90YXJnZXRFcnJvcnMgPSBfdGFyZ2V0RXJyb3JzO1xuICAgICAgICAgIHRoaXMucGlwZXNCeU5hbWUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgcGlwZXMuZm9yRWFjaChmdW5jdGlvbiAocGlwZSkgeyByZXR1cm4gX3RoaXMucGlwZXNCeU5hbWUuc2V0KHBpcGUubmFtZSwgcGlwZSk7IH0pO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpck1ldGFcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuY3JlYXRlRGlyZWN0aXZlSG9zdFByb3BlcnR5QXN0cyA9IGZ1bmN0aW9uIChkaXJNZXRhLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAoZGlyTWV0YS5ob3N0UHJvcGVydGllcykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBib3VuZFByb3BzXzEgPSBbXTtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlyTWV0YS5ob3N0UHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHJlc3Npb24gPSBkaXJNZXRhLmhvc3RQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYXJzZVByb3BlcnR5QmluZGluZyhwcm9wTmFtZSwgZXhwcmVzc2lvbiwgdHJ1ZSwgc291cmNlU3BhbiwgW10sIGJvdW5kUHJvcHNfMSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJWYWx1ZSBvZiB0aGUgaG9zdCBwcm9wZXJ0eSBiaW5kaW5nIFxcXCJcIiArIHByb3BOYW1lICsgXCJcXFwiIG5lZWRzIHRvIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBleHByZXNzaW9uIGJ1dCBnb3QgXFxcIlwiICsgZXhwcmVzc2lvbiArIFwiXFxcIiAoXCIgKyB0eXBlb2YgZXhwcmVzc2lvbiArIFwiKVwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBib3VuZFByb3BzXzEubWFwKGZ1bmN0aW9uIChwcm9wKSB7IHJldHVybiBfdGhpcy5jcmVhdGVFbGVtZW50UHJvcGVydHlBc3QoZGlyTWV0YS5zZWxlY3RvciwgcHJvcCk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyTWV0YVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzID0gZnVuY3Rpb24gKGRpck1ldGEsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmIChkaXJNZXRhLmhvc3RMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGFyZ2V0RXZlbnRBc3RzXzEgPSBbXTtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlyTWV0YS5ob3N0TGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvbiA9IGRpck1ldGEuaG9zdExpc3RlbmVyc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMucGFyc2VFdmVudChwcm9wTmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgW10sIHRhcmdldEV2ZW50QXN0c18xKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihcIlZhbHVlIG9mIHRoZSBob3N0IGxpc3RlbmVyIFxcXCJcIiArIHByb3BOYW1lICsgXCJcXFwiIG5lZWRzIHRvIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBleHByZXNzaW9uIGJ1dCBnb3QgXFxcIlwiICsgZXhwcmVzc2lvbiArIFwiXFxcIiAoXCIgKyB0eXBlb2YgZXhwcmVzc2lvbiArIFwiKVwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRFdmVudEFzdHNfMTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLnBhcnNlSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZUluZm8gPSBzb3VyY2VTcGFuLnN0YXJ0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gdGhpcy5fZXhwclBhcnNlci5wYXJzZUludGVycG9sYXRpb24odmFsdWUsIHNvdXJjZUluZm8sIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgICAgICBpZiAoYXN0KVxuICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXhwcmVzc2lvblBhcnNlckVycm9ycyhhc3QuZXJyb3JzLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2hlY2tQaXBlcyhhc3QsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlwiICsgZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKCdFUlJPUicsIHNvdXJjZUluZm8pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBwcmVmaXhUb2tlblxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFByb3BzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFZhcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUsIHByZWZpeFRva2VuLCB2YWx1ZSwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzLCB0YXJnZXRWYXJzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmluZGluZ3MgPSB0aGlzLl9wYXJzZVRlbXBsYXRlQmluZGluZ3MocHJlZml4VG9rZW4sIHZhbHVlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICAgICAgICBpZiAoYmluZGluZy5rZXlJc1Zhcikge1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFycy5wdXNoKG5ldyBWYXJpYWJsZUFzdChiaW5kaW5nLmtleSwgYmluZGluZy5uYW1lLCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KGJpbmRpbmcuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHlBc3QoYmluZGluZy5rZXksIGJpbmRpbmcuZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLnB1c2goW2JpbmRpbmcua2V5LCAnJ10pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUxpdGVyYWxBdHRyKGJpbmRpbmcua2V5LCBudWxsLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcmVmaXhUb2tlblxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5fcGFyc2VUZW1wbGF0ZUJpbmRpbmdzID0gZnVuY3Rpb24gKHByZWZpeFRva2VuLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlSW5mbyA9IHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiaW5kaW5nc1Jlc3VsdCA9IHRoaXMuX2V4cHJQYXJzZXIucGFyc2VUZW1wbGF0ZUJpbmRpbmdzKHByZWZpeFRva2VuLCB2YWx1ZSwgc291cmNlSW5mbyk7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEV4cHJlc3Npb25QYXJzZXJFcnJvcnMoYmluZGluZ3NSZXN1bHQuZXJyb3JzLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgYmluZGluZ3NSZXN1bHQudGVtcGxhdGVCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGJpbmRpbmcuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2hlY2tQaXBlcyhiaW5kaW5nLmV4cHJlc3Npb24sIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYmluZGluZ3NSZXN1bHQud2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAod2FybmluZykgeyBfdGhpcy5fcmVwb3J0RXJyb3Iod2FybmluZywgc291cmNlU3BhbiwgUGFyc2VFcnJvckxldmVsLldBUk5JTkcpOyB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzUmVzdWx0LnRlbXBsYXRlQmluZGluZ3M7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiXCIgKyBlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFByb3BzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxpdGVyYWxBdHRyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICBpZiAoX2lzQW5pbWF0aW9uTGFiZWwobmFtZSkpIHtcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiQXNzaWduaW5nIGFuaW1hdGlvbiB0cmlnZ2VycyB2aWEgQHByb3A9XFxcImV4cFxcXCIgYXR0cmlidXRlcyB3aXRoIGFuIGV4cHJlc3Npb24gaXMgaW52YWxpZC5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCIgVXNlIHByb3BlcnR5IGJpbmRpbmdzIChlLmcuIFtAcHJvcF09XFxcImV4cFxcXCIpIG9yIHVzZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCBhIHZhbHVlIChlLmcuIEBwcm9wKSBpbnN0ZWFkLlwiLCBzb3VyY2VTcGFuLCBQYXJzZUVycm9yTGV2ZWwuRkFUQUwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX3BhcnNlQW5pbWF0aW9uKG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0UHJvcHMucHVzaChuZXcgQm91bmRQcm9wZXJ0eShuYW1lLCB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKHZhbHVlLCAnJyksIEJvdW5kUHJvcGVydHlUeXBlLkxJVEVSQUxfQVRUUiwgc291cmNlU3BhbikpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKiBAcGFyYW0gez99IGlzSG9zdFxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFByb3BzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5QmluZGluZyA9IGZ1bmN0aW9uIChuYW1lLCBleHByZXNzaW9uLCBpc0hvc3QsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzQW5pbWF0aW9uUHJvcCA9IGZhbHNlO1xuICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoQU5JTUFURV9QUk9QX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgaXNBbmltYXRpb25Qcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKEFOSU1BVEVfUFJPUF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoX2lzQW5pbWF0aW9uTGFiZWwobmFtZSkpIHtcbiAgICAgICAgICAgICAgaXNBbmltYXRpb25Qcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNBbmltYXRpb25Qcm9wKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BhcnNlQW5pbWF0aW9uKG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9wYXJzZVByb3BlcnR5QXN0KG5hbWUsIHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBpc0hvc3QsIHNvdXJjZVNwYW4pLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFByb3BzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwciA9IHRoaXMucGFyc2VJbnRlcnBvbGF0aW9uKHZhbHVlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGV4cHIpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHlBc3QobmFtZSwgZXhwciwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRNYXRjaGFibGVBdHRyc1xuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRQcm9wc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlUHJvcGVydHlBc3QgPSBmdW5jdGlvbiAobmFtZSwgYXN0LCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycy5wdXNoKFtuYW1lLCBhc3Quc291cmNlXSk7XG4gICAgICAgICAgdGFyZ2V0UHJvcHMucHVzaChuZXcgQm91bmRQcm9wZXJ0eShuYW1lLCBhc3QsIEJvdW5kUHJvcGVydHlUeXBlLkRFRkFVTFQsIHNvdXJjZVNwYW4pKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0TWF0Y2hhYmxlQXR0cnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0UHJvcHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9wYXJzZUFuaW1hdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgICAvLyBUaGlzIHdpbGwgb2NjdXIgd2hlbiBhIEB0cmlnZ2VyIGlzIG5vdCBwYWlyZWQgd2l0aCBhbiBleHByZXNzaW9uLlxuICAgICAgICAgIC8vIEZvciBhbmltYXRpb25zIGl0IGlzIHZhbGlkIHRvIG5vdCBoYXZlIGFuIGV4cHJlc3Npb24gc2luY2UgKi92b2lkXG4gICAgICAgICAgLy8gc3RhdGVzIHdpbGwgYmUgYXBwbGllZCBieSBhbmd1bGFyIHdoZW4gdGhlIGVsZW1lbnQgaXMgYXR0YWNoZWQvZGV0YWNoZWRcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3QgPSB0aGlzLl9wYXJzZUJpbmRpbmcoZXhwcmVzc2lvbiB8fCAnbnVsbCcsIGZhbHNlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycy5wdXNoKFtuYW1lLCBhc3Quc291cmNlXSk7XG4gICAgICAgICAgdGFyZ2V0UHJvcHMucHVzaChuZXcgQm91bmRQcm9wZXJ0eShuYW1lLCBhc3QsIEJvdW5kUHJvcGVydHlUeXBlLkFOSU1BVElPTiwgc291cmNlU3BhbikpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBpc0hvc3RCaW5kaW5nXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9wYXJzZUJpbmRpbmcgPSBmdW5jdGlvbiAodmFsdWUsIGlzSG9zdEJpbmRpbmcsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFzdCA9IGlzSG9zdEJpbmRpbmcgP1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZXhwclBhcnNlci5wYXJzZVNpbXBsZUJpbmRpbmcodmFsdWUsIHNvdXJjZUluZm8sIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpIDpcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cHJQYXJzZXIucGFyc2VCaW5kaW5nKHZhbHVlLCBzb3VyY2VJbmZvLCB0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgICAgICAgaWYgKGFzdClcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEV4cHJlc3Npb25QYXJzZXJFcnJvcnMoYXN0LmVycm9ycywgc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGlwZXMoYXN0LCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoXCJcIiArIGUsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBib3VuZFByb3BcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnRQcm9wZXJ0eUFzdCA9IGZ1bmN0aW9uIChlbGVtZW50U2VsZWN0b3IsIGJvdW5kUHJvcCkge1xuICAgICAgICAgIGlmIChib3VuZFByb3AuaXNBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdChib3VuZFByb3AubmFtZSwgUHJvcGVydHlCaW5kaW5nVHlwZS5BbmltYXRpb24sIF9hbmd1bGFyX2NvcmUuU2VjdXJpdHlDb250ZXh0Lk5PTkUsIGZhbHNlLCBib3VuZFByb3AuZXhwcmVzc2lvbiwgbnVsbCwgYm91bmRQcm9wLnNvdXJjZVNwYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bml0ID0gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiaW5kaW5nVHlwZTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBib3VuZFByb3BlcnR5TmFtZSA9IG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBib3VuZFByb3AubmFtZS5zcGxpdChQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlY3VyaXR5Q29udGV4dHM7XG4gICAgICAgICAgLy8gQ2hlY2sgY2hlY2sgZm9yIHNwZWNpYWwgY2FzZXMgKHByZWZpeCBzdHlsZSwgYXR0ciwgY2xhc3MpXG4gICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09IEFUVFJJQlVURV9QUkVGSVgpIHtcbiAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gcGFydHNbMV07XG4gICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVByb3BlcnR5T3JBdHRyaWJ1dGVOYW1lKGJvdW5kUHJvcGVydHlOYW1lLCBib3VuZFByb3Auc291cmNlU3BhbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHRzID0gY2FsY1Bvc3NpYmxlU2VjdXJpdHlDb250ZXh0cyh0aGlzLl9zY2hlbWFSZWdpc3RyeSwgZWxlbWVudFNlbGVjdG9yLCBib3VuZFByb3BlcnR5TmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuc1NlcGFyYXRvcklkeCA9IGJvdW5kUHJvcGVydHlOYW1lLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuc1NlcGFyYXRvcklkeCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbnMgPSBib3VuZFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgbnNTZXBhcmF0b3JJZHgpO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMSA9IGJvdW5kUHJvcGVydHlOYW1lLnN1YnN0cmluZyhuc1NlcGFyYXRvcklkeCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gbWVyZ2VOc0FuZE5hbWUobnMsIG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZSA9IFByb3BlcnR5QmluZGluZ1R5cGUuQXR0cmlidXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRzWzBdID09IENMQVNTX1BSRUZJWCkge1xuICAgICAgICAgICAgICAgICAgYm91bmRQcm9wZXJ0eU5hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gUHJvcGVydHlCaW5kaW5nVHlwZS5DbGFzcztcbiAgICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dHMgPSBbX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuTk9ORV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAocGFydHNbMF0gPT0gU1RZTEVfUFJFRklYKSB7XG4gICAgICAgICAgICAgICAgICB1bml0ID0gcGFydHMubGVuZ3RoID4gMiA/IHBhcnRzWzJdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gcGFydHNbMV07XG4gICAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZSA9IFByb3BlcnR5QmluZGluZ1R5cGUuU3R5bGU7XG4gICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHRzID0gW19hbmd1bGFyX2NvcmUuU2VjdXJpdHlDb250ZXh0LlNUWUxFXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiBub3QgYSBzcGVjaWFsIGNhc2UsIHVzZSB0aGUgZnVsbCBwcm9wZXJ0eSBuYW1lXG4gICAgICAgICAgaWYgKGJvdW5kUHJvcGVydHlOYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gdGhpcy5fc2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUoYm91bmRQcm9wLm5hbWUpO1xuICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHRzID0gY2FsY1Bvc3NpYmxlU2VjdXJpdHlDb250ZXh0cyh0aGlzLl9zY2hlbWFSZWdpc3RyeSwgZWxlbWVudFNlbGVjdG9yLCBib3VuZFByb3BlcnR5TmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgICBiaW5kaW5nVHlwZSA9IFByb3BlcnR5QmluZGluZ1R5cGUuUHJvcGVydHk7XG4gICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlUHJvcGVydHlPckF0dHJpYnV0ZU5hbWUoYm91bmRQcm9wZXJ0eU5hbWUsIGJvdW5kUHJvcC5zb3VyY2VTcGFuLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQm91bmRFbGVtZW50UHJvcGVydHlBc3QoYm91bmRQcm9wZXJ0eU5hbWUsIGJpbmRpbmdUeXBlLCBzZWN1cml0eUNvbnRleHRzLmxlbmd0aCA9PT0gMSA/IHNlY3VyaXR5Q29udGV4dHNbMF0gOiBudWxsLCBzZWN1cml0eUNvbnRleHRzLmxlbmd0aCA+IDEsIGJvdW5kUHJvcC5leHByZXNzaW9uLCB1bml0LCBib3VuZFByb3Auc291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldEV2ZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUucGFyc2VFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKSB7XG4gICAgICAgICAgaWYgKF9pc0FuaW1hdGlvbkxhYmVsKG5hbWUpKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxKTtcbiAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBbmltYXRpb25FdmVudChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCB0YXJnZXRFdmVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFyc2VFdmVudChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldEV2ZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlQW5pbWF0aW9uRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdGFyZ2V0RXZlbnRzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlcyA9IHNwbGl0QXRQZXJpb2QobmFtZSwgW25hbWUsICcnXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZlbnROYW1lID0gbWF0Y2hlc1swXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaGFzZSA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gdGhpcy5fcGFyc2VBY3Rpb24oZXhwcmVzc2lvbiwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzLnB1c2gobmV3IEJvdW5kRXZlbnRBc3QoZXZlbnROYW1lLCBudWxsLCBwaGFzZSwgYXN0LCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiVGhlIHByb3ZpZGVkIGFuaW1hdGlvbiBvdXRwdXQgcGhhc2UgdmFsdWUgXFxcIlwiICsgcGhhc2UgKyBcIlxcXCIgZm9yIFxcXCJAXCIgKyBldmVudE5hbWUgKyBcIlxcXCIgaXMgbm90IHN1cHBvcnRlZCAodXNlIHN0YXJ0IG9yIGRvbmUpXCIsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlRoZSBhbmltYXRpb24gdHJpZ2dlciBvdXRwdXQgZXZlbnQgKEBcIiArIGV2ZW50TmFtZSArIFwiKSBpcyBtaXNzaW5nIGl0cyBwaGFzZSB2YWx1ZSBuYW1lIChzdGFydCBvciBkb25lIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkKVwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldE1hdGNoYWJsZUF0dHJzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldEV2ZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldEV2ZW50cykge1xuICAgICAgICAgIC8vIGxvbmcgZm9ybWF0OiAndGFyZ2V0OiBldmVudE5hbWUnXG4gICAgICAgICAgdmFyIF9hID0gc3BsaXRBdENvbG9uKG5hbWUsIFtudWxsLCBuYW1lXSksIHRhcmdldCA9IF9hWzBdLCBldmVudE5hbWUgPSBfYVsxXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3QgPSB0aGlzLl9wYXJzZUFjdGlvbihleHByZXNzaW9uLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycy5wdXNoKFtuYW1lLCBhc3Quc291cmNlXSk7XG4gICAgICAgICAgdGFyZ2V0RXZlbnRzLnB1c2gobmV3IEJvdW5kRXZlbnRBc3QoZXZlbnROYW1lLCB0YXJnZXQsIG51bGwsIGFzdCwgc291cmNlU3BhbikpO1xuICAgICAgICAgIC8vIERvbid0IGRldGVjdCBkaXJlY3RpdmVzIGZvciBldmVudCBuYW1lcyBmb3Igbm93LFxuICAgICAgICAgIC8vIHNvIGRvbid0IGFkZCB0aGUgZXZlbnQgbmFtZSB0byB0aGUgbWF0Y2hhYmxlQXR0cnNcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlQWN0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlSW5mbyA9IHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3QgPSB0aGlzLl9leHByUGFyc2VyLnBhcnNlQWN0aW9uKHZhbHVlLCBzb3VyY2VJbmZvLCB0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgICAgICAgaWYgKGFzdCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXhwcmVzc2lvblBhcnNlckVycm9ycyhhc3QuZXJyb3JzLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWFzdCB8fCBhc3QuYXN0IGluc3RhbmNlb2YgRW1wdHlFeHByKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIkVtcHR5IGV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZFwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKCdFUlJPUicsIHNvdXJjZUluZm8pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2NoZWNrUGlwZXMoYXN0LCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoXCJcIiArIGUsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/PX0gbGV2ZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2VTcGFuLCBsZXZlbCkge1xuICAgICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gUGFyc2VFcnJvckxldmVsLkZBVEFMOyB9XG4gICAgICAgICAgdGhpcy5fdGFyZ2V0RXJyb3JzLnB1c2gobmV3IFBhcnNlRXJyb3Ioc291cmNlU3BhbiwgbWVzc2FnZSwgbGV2ZWwpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9yZXBvcnRFeHByZXNzaW9uUGFyc2VyRXJyb3JzID0gZnVuY3Rpb24gKGVycm9ycywgc291cmNlU3Bhbikge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgZXJyb3JzXzEgPSBlcnJvcnM7IF9pIDwgZXJyb3JzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc18xW19pXTtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IubWVzc2FnZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX2NoZWNrUGlwZXMgPSBmdW5jdGlvbiAoYXN0LCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGFzdCkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29sbGVjdG9yID0gbmV3IFBpcGVDb2xsZWN0b3IoKTtcbiAgICAgICAgICAgICAgYXN0LnZpc2l0KGNvbGxlY3Rvcik7XG4gICAgICAgICAgICAgIGNvbGxlY3Rvci5waXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChhc3QsIHBpcGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLnBpcGVzQnlOYW1lLmhhcyhwaXBlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJUaGUgcGlwZSAnXCIgKyBwaXBlTmFtZSArIFwiJyBjb3VsZCBub3QgYmUgZm91bmRcIiwgbmV3IFBhcnNlU291cmNlU3Bhbihzb3VyY2VTcGFuLnN0YXJ0Lm1vdmVCeShhc3Quc3Bhbi5zdGFydCksIHNvdXJjZVNwYW4uc3RhcnQubW92ZUJ5KGFzdC5zcGFuLmVuZCkpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgLyBhdHRyaWJ1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/fSBpc0F0dHIgdHJ1ZSB3aGVuIGJpbmRpbmcgdG8gYW4gYXR0cmlidXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5fdmFsaWRhdGVQcm9wZXJ0eU9yQXR0cmlidXRlTmFtZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc291cmNlU3BhbiwgaXNBdHRyKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVwb3J0ID0gaXNBdHRyID8gdGhpcy5fc2NoZW1hUmVnaXN0cnkudmFsaWRhdGVBdHRyaWJ1dGUocHJvcE5hbWUpIDpcbiAgICAgICAgICAgICAgdGhpcy5fc2NoZW1hUmVnaXN0cnkudmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHJlcG9ydC5lcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihyZXBvcnQubXNnLCBzb3VyY2VTcGFuLCBQYXJzZUVycm9yTGV2ZWwuRkFUQUwpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gQmluZGluZ1BhcnNlcjtcbiAgfSgpKTtcbiAgdmFyIFBpcGVDb2xsZWN0b3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE0KFBpcGVDb2xsZWN0b3IsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBQaXBlQ29sbGVjdG9yKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIHRoaXMucGlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFBpcGVDb2xsZWN0b3IucHJvdG90eXBlLnZpc2l0UGlwZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICB0aGlzLnBpcGVzLnNldChhc3QubmFtZSwgYXN0KTtcbiAgICAgICAgICBhc3QuZXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQaXBlQ29sbGVjdG9yO1xuICB9KFJlY3Vyc2l2ZUFzdFZpc2l0b3IpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbmFtZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzQW5pbWF0aW9uTGFiZWwobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWVbMF0gPT0gJ0AnO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHs/fSBwcm9wTmFtZVxuICAgKiBAcGFyYW0gez99IGlzQXR0cmlidXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjYWxjUG9zc2libGVTZWN1cml0eUNvbnRleHRzKHJlZ2lzdHJ5LCBzZWxlY3RvciwgcHJvcE5hbWUsIGlzQXR0cmlidXRlKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHhzID0gW107XG4gICAgICBDc3NTZWxlY3Rvci5wYXJzZShzZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbGVtZW50TmFtZXMgPSBzZWxlY3Rvci5lbGVtZW50ID8gW3NlbGVjdG9yLmVsZW1lbnRdIDogcmVnaXN0cnkuYWxsS25vd25FbGVtZW50TmFtZXMoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub3RFbGVtZW50TmFtZXMgPSBuZXcgU2V0KHNlbGVjdG9yLm5vdFNlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24gKHNlbGVjdG9yKSB7IHJldHVybiBzZWxlY3Rvci5pc0VsZW1lbnRTZWxlY3RvcigpOyB9KVxuICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChzZWxlY3RvcikgeyByZXR1cm4gc2VsZWN0b3IuZWxlbWVudDsgfSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBvc3NpYmxlRWxlbWVudE5hbWVzID0gZWxlbWVudE5hbWVzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudE5hbWUpIHsgcmV0dXJuICFub3RFbGVtZW50TmFtZXMuaGFzKGVsZW1lbnROYW1lKTsgfSk7XG4gICAgICAgICAgY3R4cy5wdXNoLmFwcGx5KGN0eHMsIHBvc3NpYmxlRWxlbWVudE5hbWVzLm1hcChmdW5jdGlvbiAoZWxlbWVudE5hbWUpIHsgcmV0dXJuIHJlZ2lzdHJ5LnNlY3VyaXR5Q29udGV4dChlbGVtZW50TmFtZSwgcHJvcE5hbWUsIGlzQXR0cmlidXRlKTsgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3R4cy5sZW5ndGggPT09IDAgPyBbX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuTk9ORV0gOiBBcnJheS5mcm9tKG5ldyBTZXQoY3R4cykpLnNvcnQoKTtcbiAgfVxuXG4gIHZhciAvKiogQHR5cGUgez99ICovIE5HX0NPTlRFTlRfU0VMRUNUX0FUVFIgPSAnc2VsZWN0JztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTkdfQ09OVEVOVF9FTEVNRU5UID0gJ25nLWNvbnRlbnQnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBMSU5LX0VMRU1FTlQgPSAnbGluayc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIExJTktfU1RZTEVfUkVMX0FUVFIgPSAncmVsJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTElOS19TVFlMRV9IUkVGX0FUVFIgPSAnaHJlZic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIExJTktfU1RZTEVfUkVMX1ZBTFVFID0gJ3N0eWxlc2hlZXQnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTVFlMRV9FTEVNRU5UID0gJ3N0eWxlJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gU0NSSVBUX0VMRU1FTlQgPSAnc2NyaXB0JztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTkdfTk9OX0JJTkRBQkxFX0FUVFIgPSAnbmdOb25CaW5kYWJsZSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIE5HX1BST0pFQ1RfQVMgPSAnbmdQcm9qZWN0QXMnO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBhc3RcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHByZXBhcnNlRWxlbWVudChhc3QpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdEF0dHIgPSBudWxsO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaHJlZkF0dHIgPSBudWxsO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVsQXR0ciA9IG51bGw7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub25CaW5kYWJsZSA9IGZhbHNlO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvamVjdEFzID0gbnVsbDtcbiAgICAgIGFzdC5hdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGNBdHRyTmFtZSA9IGF0dHIubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChsY0F0dHJOYW1lID09IE5HX0NPTlRFTlRfU0VMRUNUX0FUVFIpIHtcbiAgICAgICAgICAgICAgc2VsZWN0QXR0ciA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9IUkVGX0FUVFIpIHtcbiAgICAgICAgICAgICAgaHJlZkF0dHIgPSBhdHRyLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChsY0F0dHJOYW1lID09IExJTktfU1RZTEVfUkVMX0FUVFIpIHtcbiAgICAgICAgICAgICAgcmVsQXR0ciA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGF0dHIubmFtZSA9PSBOR19OT05fQklOREFCTEVfQVRUUikge1xuICAgICAgICAgICAgICBub25CaW5kYWJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGF0dHIubmFtZSA9PSBOR19QUk9KRUNUX0FTKSB7XG4gICAgICAgICAgICAgIGlmIChhdHRyLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHByb2plY3RBcyA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNlbGVjdEF0dHIgPSBub3JtYWxpemVOZ0NvbnRlbnRTZWxlY3Qoc2VsZWN0QXR0cik7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlTmFtZSA9IGFzdC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuT1RIRVI7XG4gICAgICBpZiAoc3BsaXROc05hbWUobm9kZU5hbWUpWzFdID09IE5HX0NPTlRFTlRfRUxFTUVOVCkge1xuICAgICAgICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT0gU1RZTEVfRUxFTUVOVCkge1xuICAgICAgICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09IFNDUklQVF9FTEVNRU5UKSB7XG4gICAgICAgICAgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNDUklQVDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09IExJTktfRUxFTUVOVCAmJiByZWxBdHRyID09IExJTktfU1RZTEVfUkVMX1ZBTFVFKSB7XG4gICAgICAgICAgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByZXBhcnNlZEVsZW1lbnQodHlwZSwgc2VsZWN0QXR0ciwgaHJlZkF0dHIsIG5vbkJpbmRhYmxlLCBwcm9qZWN0QXMpO1xuICB9XG4gIHZhciBQcmVwYXJzZWRFbGVtZW50VHlwZSA9IHt9O1xuICBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UID0gMDtcbiAgUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUgPSAxO1xuICBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUID0gMjtcbiAgUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUID0gMztcbiAgUHJlcGFyc2VkRWxlbWVudFR5cGUuT1RIRVIgPSA0O1xuICBQcmVwYXJzZWRFbGVtZW50VHlwZVtQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UXSA9IFwiTkdfQ09OVEVOVFwiO1xuICBQcmVwYXJzZWRFbGVtZW50VHlwZVtQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRV0gPSBcIlNUWUxFXCI7XG4gIFByZXBhcnNlZEVsZW1lbnRUeXBlW1ByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVRdID0gXCJTVFlMRVNIRUVUXCI7XG4gIFByZXBhcnNlZEVsZW1lbnRUeXBlW1ByZXBhcnNlZEVsZW1lbnRUeXBlLlNDUklQVF0gPSBcIlNDUklQVFwiO1xuICBQcmVwYXJzZWRFbGVtZW50VHlwZVtQcmVwYXJzZWRFbGVtZW50VHlwZS5PVEhFUl0gPSBcIk9USEVSXCI7XG4gIHZhciBQcmVwYXJzZWRFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdEF0dHJcbiAgICAgICAqIEBwYXJhbSB7P30gaHJlZkF0dHJcbiAgICAgICAqIEBwYXJhbSB7P30gbm9uQmluZGFibGVcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvamVjdEFzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFByZXBhcnNlZEVsZW1lbnQodHlwZSwgc2VsZWN0QXR0ciwgaHJlZkF0dHIsIG5vbkJpbmRhYmxlLCBwcm9qZWN0QXMpIHtcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgIHRoaXMuc2VsZWN0QXR0ciA9IHNlbGVjdEF0dHI7XG4gICAgICAgICAgdGhpcy5ocmVmQXR0ciA9IGhyZWZBdHRyO1xuICAgICAgICAgIHRoaXMubm9uQmluZGFibGUgPSBub25CaW5kYWJsZTtcbiAgICAgICAgICB0aGlzLnByb2plY3RBcyA9IHByb2plY3RBcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcmVwYXJzZWRFbGVtZW50O1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzZWxlY3RBdHRyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVOZ0NvbnRlbnRTZWxlY3Qoc2VsZWN0QXR0cikge1xuICAgICAgaWYgKHNlbGVjdEF0dHIgPT09IG51bGwgfHwgc2VsZWN0QXR0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gJyonO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdEF0dHI7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBfX2RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG4gIH07XG4gIHZhciBfX21ldGFkYXRhID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICAvLyBHcm91cCAxID0gXCJiaW5kLVwiXG4gIC8vIEdyb3VwIDIgPSBcImxldC1cIlxuICAvLyBHcm91cCAzID0gXCJyZWYtLyNcIlxuICAvLyBHcm91cCA0ID0gXCJvbi1cIlxuICAvLyBHcm91cCA1ID0gXCJiaW5kb24tXCJcbiAgLy8gR3JvdXAgNiA9IFwiQFwiXG4gIC8vIEdyb3VwIDcgPSB0aGUgaWRlbnRpZmllciBhZnRlciBcImJpbmQtXCIsIFwibGV0LVwiLCBcInJlZi0vI1wiLCBcIm9uLVwiLCBcImJpbmRvbi1cIiBvciBcIkBcIlxuICAvLyBHcm91cCA4ID0gaWRlbnRpZmllciBpbnNpZGUgWygpXVxuICAvLyBHcm91cCA5ID0gaWRlbnRpZmllciBpbnNpZGUgW11cbiAgLy8gR3JvdXAgMTAgPSBpZGVudGlmaWVyIGluc2lkZSAoKVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBCSU5EX05BTUVfUkVHRVhQID0gL14oPzooPzooPzooYmluZC0pfChsZXQtKXwocmVmLXwjKXwob24tKXwoYmluZG9uLSl8KEApKSguKykpfFxcW1xcKChbXlxcKV0rKVxcKVxcXXxcXFsoW15cXF1dKylcXF18XFwoKFteXFwpXSspXFwpKSQvO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBLV19CSU5EX0lEWCA9IDE7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEtXX0xFVF9JRFggPSAyO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBLV19SRUZfSURYID0gMztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gS1dfT05fSURYID0gNDtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gS1dfQklORE9OX0lEWCA9IDU7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEtXX0FUX0lEWCA9IDY7XG4gIHZhciAvKiogQHR5cGUgez99ICovIElERU5UX0tXX0lEWCA9IDc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIElERU5UX0JBTkFOQV9CT1hfSURYID0gODtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSURFTlRfUFJPUEVSVFlfSURYID0gOTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSURFTlRfRVZFTlRfSURYID0gMTA7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFRFTVBMQVRFX0VMRU1FTlQgPSAndGVtcGxhdGUnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBURU1QTEFURV9BVFRSID0gJ3RlbXBsYXRlJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVEVNUExBVEVfQVRUUl9QUkVGSVggPSAnKic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENMQVNTX0FUVFIgPSAnY2xhc3MnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBURVhUX0NTU19TRUxFQ1RPUiA9IENzc1NlbGVjdG9yLnBhcnNlKCcqJylbMF07XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBhcnJheSBvZiB7QGxpbmsgVGVtcGxhdGVBc3RWaXNpdG9yfXMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHRyYW5zZm9ybVxuICAgKiBwYXJzZWQgdGVtcGxhdGVzIGJlZm9yZSBjb21waWxhdGlvbiBpcyBpbnZva2VkLCBhbGxvd2luZyBjdXN0b20gZXhwcmVzc2lvbiBzeW50YXhcbiAgICogYW5kIG90aGVyIGFkdmFuY2VkIHRyYW5zZm9ybWF0aW9ucy5cbiAgICpcbiAgICogVGhpcyBpcyBjdXJyZW50bHkgYW4gaW50ZXJuYWwtb25seSBmZWF0dXJlIGFuZCBub3QgbWVhbnQgZm9yIGdlbmVyYWwgdXNlLlxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVEVNUExBVEVfVFJBTlNGT1JNUyA9IG5ldyBfYW5ndWxhcl9jb3JlLk9wYXF1ZVRva2VuKCdUZW1wbGF0ZVRyYW5zZm9ybXMnKTtcbiAgdmFyIFRlbXBsYXRlUGFyc2VFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMoVGVtcGxhdGVQYXJzZUVycm9yLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqIEBwYXJhbSB7P30gc3BhblxuICAgICAgICogQHBhcmFtIHs/fSBsZXZlbFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUZW1wbGF0ZVBhcnNlRXJyb3IobWVzc2FnZSwgc3BhbiwgbGV2ZWwpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBtZXNzYWdlLCBsZXZlbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gVGVtcGxhdGVQYXJzZUVycm9yO1xuICB9KFBhcnNlRXJyb3IpKTtcbiAgdmFyIFRlbXBsYXRlUGFyc2VSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSB0ZW1wbGF0ZUFzdFxuICAgICAgICogQHBhcmFtIHs/PX0gZXJyb3JzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlUGFyc2VSZXN1bHQodGVtcGxhdGVBc3QsIGVycm9ycykge1xuICAgICAgICAgIHRoaXMudGVtcGxhdGVBc3QgPSB0ZW1wbGF0ZUFzdDtcbiAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgIH1cbiAgICAgIHJldHVybiBUZW1wbGF0ZVBhcnNlUmVzdWx0O1xuICB9KCkpO1xuICB2YXIgVGVtcGxhdGVQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9leHByUGFyc2VyXG4gICAgICAgKiBAcGFyYW0gez99IF9zY2hlbWFSZWdpc3RyeVxuICAgICAgICogQHBhcmFtIHs/fSBfaHRtbFBhcnNlclxuICAgICAgICogQHBhcmFtIHs/fSBfY29uc29sZVxuICAgICAgICogQHBhcmFtIHs/fSB0cmFuc2Zvcm1zXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlUGFyc2VyKF9leHByUGFyc2VyLCBfc2NoZW1hUmVnaXN0cnksIF9odG1sUGFyc2VyLCBfY29uc29sZSwgdHJhbnNmb3Jtcykge1xuICAgICAgICAgIHRoaXMuX2V4cHJQYXJzZXIgPSBfZXhwclBhcnNlcjtcbiAgICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgICB0aGlzLl9odG1sUGFyc2VyID0gX2h0bWxQYXJzZXI7XG4gICAgICAgICAgdGhpcy5fY29uc29sZSA9IF9jb25zb2xlO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZXNcbiAgICAgICAqIEBwYXJhbSB7P30gc2NoZW1hc1xuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBzY2hlbWFzLCB0ZW1wbGF0ZVVybCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHRoaXMudHJ5UGFyc2UoY29tcG9uZW50LCB0ZW1wbGF0ZSwgZGlyZWN0aXZlcywgcGlwZXMsIHNjaGVtYXMsIHRlbXBsYXRlVXJsKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3YXJuaW5ncyA9IHJlc3VsdC5lcnJvcnMuZmlsdGVyKGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gZXJyb3IubGV2ZWwgPT09IFBhcnNlRXJyb3JMZXZlbC5XQVJOSU5HOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvcnMgPSByZXN1bHQuZXJyb3JzLmZpbHRlcihmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGVycm9yLmxldmVsID09PSBQYXJzZUVycm9yTGV2ZWwuRkFUQUw7IH0pO1xuICAgICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnNvbGUud2FybihcIlRlbXBsYXRlIHBhcnNlIHdhcm5pbmdzOlxcblwiICsgd2FybmluZ3Muam9pbignXFxuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JTdHJpbmcgPSBlcnJvcnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlRlbXBsYXRlIHBhcnNlIGVycm9yczpcXG5cIiArIGVycm9yU3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC50ZW1wbGF0ZUFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZXNcbiAgICAgICAqIEBwYXJhbSB7P30gc2NoZW1hc1xuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZXIucHJvdG90eXBlLnRyeVBhcnNlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBzY2hlbWFzLCB0ZW1wbGF0ZVVybCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyeVBhcnNlSHRtbCh0aGlzLmV4cGFuZEh0bWwodGhpcy5faHRtbFBhcnNlci5wYXJzZSh0ZW1wbGF0ZSwgdGVtcGxhdGVVcmwsIHRydWUsIHRoaXMuZ2V0SW50ZXJwb2xhdGlvbkNvbmZpZyhjb21wb25lbnQpKSksIGNvbXBvbmVudCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBzY2hlbWFzLCB0ZW1wbGF0ZVVybCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGh0bWxBc3RXaXRoRXJyb3JzXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IHBpcGVzXG4gICAgICAgKiBAcGFyYW0gez99IHNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVVcmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VyLnByb3RvdHlwZS50cnlQYXJzZUh0bWwgPSBmdW5jdGlvbiAoaHRtbEFzdFdpdGhFcnJvcnMsIGNvbXBvbmVudCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBzY2hlbWFzLCB0ZW1wbGF0ZVVybCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvcnMgPSBodG1sQXN0V2l0aEVycm9ycy5lcnJvcnM7XG4gICAgICAgICAgaWYgKGh0bWxBc3RXaXRoRXJyb3JzLnJvb3ROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVuaXFEaXJlY3RpdmVzID0gcmVtb3ZlU3VtbWFyeUR1cGxpY2F0ZXMoZGlyZWN0aXZlcyk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVuaXFQaXBlcyA9IHJlbW92ZVN1bW1hcnlEdXBsaWNhdGVzKHBpcGVzKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJWaWV3Q29udGV4dCA9IG5ldyBQcm92aWRlclZpZXdDb250ZXh0KGNvbXBvbmVudCwgaHRtbEFzdFdpdGhFcnJvcnMucm9vdE5vZGVzWzBdLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlICYmIGNvbXBvbmVudC50ZW1wbGF0ZS5pbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBjb21wb25lbnQudGVtcGxhdGUuaW50ZXJwb2xhdGlvblswXSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGNvbXBvbmVudC50ZW1wbGF0ZS5pbnRlcnBvbGF0aW9uWzFdXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJpbmRpbmdQYXJzZXIgPSBuZXcgQmluZGluZ1BhcnNlcih0aGlzLl9leHByUGFyc2VyLCBpbnRlcnBvbGF0aW9uQ29uZmlnLCB0aGlzLl9zY2hlbWFSZWdpc3RyeSwgdW5pcVBpcGVzLCBlcnJvcnMpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJzZVZpc2l0b3IgPSBuZXcgVGVtcGxhdGVQYXJzZVZpc2l0b3IocHJvdmlkZXJWaWV3Q29udGV4dCwgdW5pcURpcmVjdGl2ZXMsIGJpbmRpbmdQYXJzZXIsIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5LCBzY2hlbWFzLCBlcnJvcnMpO1xuICAgICAgICAgICAgICByZXN1bHQgPSB2aXNpdEFsbChwYXJzZVZpc2l0b3IsIGh0bWxBc3RXaXRoRXJyb3JzLnJvb3ROb2RlcywgRU1QVFlfRUxFTUVOVF9DT05URVhUKTtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBwcm92aWRlclZpZXdDb250ZXh0LmVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fYXNzZXJ0Tm9SZWZlcmVuY2VEdXBsaWNhdGlvbk9uVGVtcGxhdGUocmVzdWx0LCBlcnJvcnMpO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlUGFyc2VSZXN1bHQocmVzdWx0LCBlcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMudHJhbnNmb3JtcykpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1zLmZvckVhY2goZnVuY3Rpb24gKHRyYW5zZm9ybSkgeyByZXN1bHQgPSB0ZW1wbGF0ZVZpc2l0QWxsKHRyYW5zZm9ybSwgcmVzdWx0KTsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGVQYXJzZVJlc3VsdChyZXN1bHQsIGVycm9ycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGh0bWxBc3RXaXRoRXJyb3JzXG4gICAgICAgKiBAcGFyYW0gez89fSBmb3JjZWRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VyLnByb3RvdHlwZS5leHBhbmRIdG1sID0gZnVuY3Rpb24gKGh0bWxBc3RXaXRoRXJyb3JzLCBmb3JjZWQpIHtcbiAgICAgICAgICBpZiAoZm9yY2VkID09PSB2b2lkIDApIHsgZm9yY2VkID0gZmFsc2U7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvcnMgPSBodG1sQXN0V2l0aEVycm9ycy5lcnJvcnM7XG4gICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT0gMCB8fCBmb3JjZWQpIHtcbiAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIElDVSBtZXNzYWdlcyB0byBhbmd1bGFyIGRpcmVjdGl2ZXNcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwYW5kZWRIdG1sQXN0ID0gZXhwYW5kTm9kZXMoaHRtbEFzdFdpdGhFcnJvcnMucm9vdE5vZGVzKTtcbiAgICAgICAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBleHBhbmRlZEh0bWxBc3QuZXJyb3JzKTtcbiAgICAgICAgICAgICAgaHRtbEFzdFdpdGhFcnJvcnMgPSBuZXcgUGFyc2VUcmVlUmVzdWx0KGV4cGFuZGVkSHRtbEFzdC5ub2RlcywgZXJyb3JzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGh0bWxBc3RXaXRoRXJyb3JzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VyLnByb3RvdHlwZS5nZXRJbnRlcnBvbGF0aW9uQ29uZmlnID0gZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICAgIGlmIChjb21wb25lbnQudGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEludGVycG9sYXRpb25Db25maWcuZnJvbUFycmF5KGNvbXBvbmVudC50ZW1wbGF0ZS5pbnRlcnBvbGF0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlc3VsdFxuICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VyLnByb3RvdHlwZS5fYXNzZXJ0Tm9SZWZlcmVuY2VEdXBsaWNhdGlvbk9uVGVtcGxhdGUgPSBmdW5jdGlvbiAocmVzdWx0LCBlcnJvcnMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleGlzdGluZ1JlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgICByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiAhISgoZWxlbWVudCkpLnJlZmVyZW5jZXM7IH0pXG4gICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiAoKGVsZW1lbnQpKS5yZWZlcmVuY2VzLmZvckVhY2goZnVuY3Rpb24gKHJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lID0gcmVmZXJlbmNlLm5hbWU7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZ1JlZmVyZW5jZXMuaW5kZXhPZihuYW1lKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUmVmZXJlbmNlcy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3IgPSBuZXcgVGVtcGxhdGVQYXJzZUVycm9yKFwiUmVmZXJlbmNlIFxcXCIjXCIgKyBuYW1lICsgXCJcXFwiIGlzIGRlZmluZWQgc2V2ZXJhbCB0aW1lc1wiLCByZWZlcmVuY2Uuc291cmNlU3BhbiwgUGFyc2VFcnJvckxldmVsLkZBVEFMKTtcbiAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyB9KTtcbiAgICAgIH07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VyLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogUGFyc2VyLCB9LFxuICAgICAgICAgIHsgdHlwZTogRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LCB9LFxuICAgICAgICAgIHsgdHlwZTogSTE4Tkh0bWxQYXJzZXIsIH0sXG4gICAgICAgICAgeyB0eXBlOiBDb25zb2xlLCB9LFxuICAgICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuT3B0aW9uYWwgfSwgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdCwgYXJnczogW1RFTVBMQVRFX1RSQU5TRk9STVMsXSB9LF0gfSxcbiAgICAgIF07IH07XG4gICAgICBUZW1wbGF0ZVBhcnNlciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhKCdkZXNpZ246cGFyYW10eXBlcycsIFtQYXJzZXIsIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgSTE4Tkh0bWxQYXJzZXIsIENvbnNvbGUsIEFycmF5XSlcbiAgICAgIF0sIFRlbXBsYXRlUGFyc2VyKTtcbiAgICAgIHJldHVybiBUZW1wbGF0ZVBhcnNlcjtcbiAgfSgpKTtcbiAgdmFyIFRlbXBsYXRlUGFyc2VWaXNpdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclZpZXdDb250ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gX2JpbmRpbmdQYXJzZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3NjaGVtYVJlZ2lzdHJ5XG4gICAgICAgKiBAcGFyYW0gez99IF9zY2hlbWFzXG4gICAgICAgKiBAcGFyYW0gez99IF90YXJnZXRFcnJvcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVGVtcGxhdGVQYXJzZVZpc2l0b3IocHJvdmlkZXJWaWV3Q29udGV4dCwgZGlyZWN0aXZlcywgX2JpbmRpbmdQYXJzZXIsIF9zY2hlbWFSZWdpc3RyeSwgX3NjaGVtYXMsIF90YXJnZXRFcnJvcnMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMucHJvdmlkZXJWaWV3Q29udGV4dCA9IHByb3ZpZGVyVmlld0NvbnRleHQ7XG4gICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlciA9IF9iaW5kaW5nUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5ID0gX3NjaGVtYVJlZ2lzdHJ5O1xuICAgICAgICAgIHRoaXMuX3NjaGVtYXMgPSBfc2NoZW1hcztcbiAgICAgICAgICB0aGlzLl90YXJnZXRFcnJvcnMgPSBfdGFyZ2V0RXJyb3JzO1xuICAgICAgICAgIHRoaXMuc2VsZWN0b3JNYXRjaGVyID0gbmV3IFNlbGVjdG9yTWF0Y2hlcigpO1xuICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc0luZGV4ID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMubmdDb250ZW50Q291bnQgPSAwO1xuICAgICAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlLCBpbmRleCkge1xuICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBDc3NTZWxlY3Rvci5wYXJzZShkaXJlY3RpdmUuc2VsZWN0b3IpO1xuICAgICAgICAgICAgICBfdGhpcy5zZWxlY3Rvck1hdGNoZXIuYWRkU2VsZWN0YWJsZXMoc2VsZWN0b3IsIGRpcmVjdGl2ZSk7XG4gICAgICAgICAgICAgIF90aGlzLmRpcmVjdGl2ZXNJbmRleC5zZXQoZGlyZWN0aXZlLCBpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5zaW9uXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChleHBhbnNpb24sIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5zaW9uQ2FzZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGV4cGFuc2lvbkNhc2UsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgcGFyZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KFRFWFRfQ1NTX1NFTEVDVE9SKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHByID0gdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZUludGVycG9sYXRpb24odGV4dC52YWx1ZSwgdGV4dC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGV4cHIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQm91bmRUZXh0QXN0KGV4cHIsIG5nQ29udGVudEluZGV4LCB0ZXh0LnNvdXJjZVNwYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0QXN0KHRleHQudmFsdWUsIG5nQ29udGVudEluZGV4LCB0ZXh0LnNvdXJjZVNwYW4pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJBc3QoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSwgYXR0cmlidXRlLnNvdXJjZVNwYW4pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21tZW50XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBwYXJlbnQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVOYW1lID0gZWxlbWVudC5uYW1lO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUIHx8XG4gICAgICAgICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcHBpbmcgPHNjcmlwdD4gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgICAgICAgLy8gU2tpcHBpbmcgPHN0eWxlPiBhcyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGVtXG4gICAgICAgICAgICAgIC8vIGluIHRoZSBTdHlsZUNvbXBpbGVyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUICYmXG4gICAgICAgICAgICAgIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHByZXBhcnNlZEVsZW1lbnQuaHJlZkF0dHIpKSB7XG4gICAgICAgICAgICAgIC8vIFNraXBwaW5nIHN0eWxlc2hlZXRzIHdpdGggZWl0aGVyIHJlbGF0aXZlIHVybHMgb3IgcGFja2FnZSBzY2hlbWUgYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgICAgLy8gdGhlbSBpbiB0aGUgU3R5bGVDb21waWxlclxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hhYmxlQXR0cnMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbGVtZW50T3JEaXJlY3RpdmVQcm9wcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbGVtZW50VmFycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlRWxlbWVudE9yRGlyZWN0aXZlUHJvcHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZU1hdGNoYWJsZUF0dHJzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcGxhdGVFbGVtZW50VmFycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhhc0lubGluZVRlbXBsYXRlcyA9IGZhbHNlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGF0dHJzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGNFbE5hbWUgPSBzcGxpdE5zTmFtZShub2RlTmFtZS50b0xvd2VyQ2FzZSgpKVsxXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc1RlbXBsYXRlRWxlbWVudCA9IGxjRWxOYW1lID09IFRFTVBMQVRFX0VMRU1FTlQ7XG4gICAgICAgICAgZWxlbWVudC5hdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhhc0JpbmRpbmcgPSBfdGhpcy5fcGFyc2VBdHRyKGlzVGVtcGxhdGVFbGVtZW50LCBhdHRyLCBtYXRjaGFibGVBdHRycywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGV2ZW50cywgZWxlbWVudE9yRGlyZWN0aXZlUmVmcywgZWxlbWVudFZhcnMpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZUJpbmRpbmdzU291cmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXhUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgaWYgKF90aGlzLl9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lKGF0dHIubmFtZSkgPT0gVEVNUExBVEVfQVRUUikge1xuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ci5uYW1lLnN0YXJ0c1dpdGgoVEVNUExBVEVfQVRUUl9QUkVGSVgpKSB7XG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUJpbmRpbmdzU291cmNlID0gYXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHByZWZpeFRva2VuID0gYXR0ci5uYW1lLnN1YnN0cmluZyhURU1QTEFURV9BVFRSX1BSRUZJWC5sZW5ndGgpOyAvLyByZW1vdmUgdGhlIHN0YXJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoYXNUZW1wbGF0ZUJpbmRpbmcgPSBpc1ByZXNlbnQodGVtcGxhdGVCaW5kaW5nc1NvdXJjZSk7XG4gICAgICAgICAgICAgIGlmIChoYXNUZW1wbGF0ZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChoYXNJbmxpbmVUZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJDYW4ndCBoYXZlIG11bHRpcGxlIHRlbXBsYXRlIGJpbmRpbmdzIG9uIG9uZSBlbGVtZW50LiBVc2Ugb25seSBvbmUgYXR0cmlidXRlIG5hbWVkICd0ZW1wbGF0ZScgb3IgcHJlZml4ZWQgd2l0aCAqXCIsIGF0dHIuc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBoYXNJbmxpbmVUZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgX3RoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VJbmxpbmVUZW1wbGF0ZUJpbmRpbmcoYXR0ci5uYW1lLCBwcmVmaXhUb2tlbiwgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSwgYXR0ci5zb3VyY2VTcGFuLCB0ZW1wbGF0ZU1hdGNoYWJsZUF0dHJzLCB0ZW1wbGF0ZUVsZW1lbnRPckRpcmVjdGl2ZVByb3BzLCB0ZW1wbGF0ZUVsZW1lbnRWYXJzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIWhhc0JpbmRpbmcgJiYgIWhhc1RlbXBsYXRlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSB0aGUgYmluZGluZ3MgYXMgYXR0cmlidXRlcyBhcyB3ZWxsIGluIHRoZSBBU1RcbiAgICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goX3RoaXMudmlzaXRBdHRyaWJ1dGUoYXR0ciwgbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgbWF0Y2hhYmxlQXR0cnMucHVzaChbYXR0ci5uYW1lLCBhdHRyLnZhbHVlXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbGVtZW50Q3NzU2VsZWN0b3IgPSBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3Iobm9kZU5hbWUsIG1hdGNoYWJsZUF0dHJzKTtcbiAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9wYXJzZURpcmVjdGl2ZXModGhpcy5zZWxlY3Rvck1hdGNoZXIsIGVsZW1lbnRDc3NTZWxlY3RvciksIGRpcmVjdGl2ZU1ldGFzID0gX2EuZGlyZWN0aXZlcywgbWF0Y2hFbGVtZW50ID0gX2EubWF0Y2hFbGVtZW50O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVBc3RzID0gdGhpcy5fY3JlYXRlRGlyZWN0aXZlQXN0cyhpc1RlbXBsYXRlRWxlbWVudCwgZWxlbWVudC5uYW1lLCBkaXJlY3RpdmVNZXRhcywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMsIGVsZW1lbnQuc291cmNlU3BhbiwgcmVmZXJlbmNlcyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudFByb3BzID0gdGhpcy5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyhlbGVtZW50Lm5hbWUsIGVsZW1lbnRPckRpcmVjdGl2ZVByb3BzLCBkaXJlY3RpdmVBc3RzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc1ZpZXdSb290ID0gcGFyZW50LmlzVGVtcGxhdGVFbGVtZW50IHx8IGhhc0lubGluZVRlbXBsYXRlcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlckNvbnRleHQgPSBuZXcgUHJvdmlkZXJFbGVtZW50Q29udGV4dCh0aGlzLnByb3ZpZGVyVmlld0NvbnRleHQsIHBhcmVudC5wcm92aWRlckNvbnRleHQsIGlzVmlld1Jvb3QsIGRpcmVjdGl2ZUFzdHMsIGF0dHJzLCByZWZlcmVuY2VzLCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuID0gdmlzaXRBbGwocHJlcGFyc2VkRWxlbWVudC5ub25CaW5kYWJsZSA/IE5PTl9CSU5EQUJMRV9WSVNJVE9SIDogdGhpcywgZWxlbWVudC5jaGlsZHJlbiwgRWxlbWVudENvbnRleHQuY3JlYXRlKGlzVGVtcGxhdGVFbGVtZW50LCBkaXJlY3RpdmVBc3RzLCBpc1RlbXBsYXRlRWxlbWVudCA/IHBhcmVudC5wcm92aWRlckNvbnRleHQgOiBwcm92aWRlckNvbnRleHQpKTtcbiAgICAgICAgICBwcm92aWRlckNvbnRleHQuYWZ0ZXJFbGVtZW50KCk7XG4gICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGFjdHVhbCBzZWxlY3RvciB3aGVuIHRoZSBgbmdQcm9qZWN0QXNgIGF0dHJpYnV0ZSBpcyBwcm92aWRlZFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb2plY3Rpb25TZWxlY3RvciA9IGlzUHJlc2VudChwcmVwYXJzZWRFbGVtZW50LnByb2plY3RBcykgP1xuICAgICAgICAgICAgICBDc3NTZWxlY3Rvci5wYXJzZShwcmVwYXJzZWRFbGVtZW50LnByb2plY3RBcylbMF0gOlxuICAgICAgICAgICAgICBlbGVtZW50Q3NzU2VsZWN0b3I7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KHByb2plY3Rpb25TZWxlY3Rvcik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyc2VkRWxlbWVudDtcbiAgICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkcmVuICYmICFlbGVtZW50LmNoaWxkcmVuLmV2ZXJ5KF9pc0VtcHR5VGV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIjxuZy1jb250ZW50PiBlbGVtZW50IGNhbm5vdCBoYXZlIGNvbnRlbnQuXCIsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyc2VkRWxlbWVudCA9IG5ldyBOZ0NvbnRlbnRBc3QodGhpcy5uZ0NvbnRlbnRDb3VudCsrLCBoYXNJbmxpbmVUZW1wbGF0ZXMgPyBudWxsIDogbmdDb250ZW50SW5kZXgsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyhkaXJlY3RpdmVBc3RzLCBldmVudHMpO1xuICAgICAgICAgICAgICB0aGlzLl9hc3NlcnROb0NvbXBvbmVudHNOb3JFbGVtZW50QmluZGluZ3NPblRlbXBsYXRlKGRpcmVjdGl2ZUFzdHMsIGVsZW1lbnRQcm9wcywgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgcGFyc2VkRWxlbWVudCA9IG5ldyBFbWJlZGRlZFRlbXBsYXRlQXN0KGF0dHJzLCBldmVudHMsIHJlZmVyZW5jZXMsIGVsZW1lbnRWYXJzLCBwcm92aWRlckNvbnRleHQudHJhbnNmb3JtZWREaXJlY3RpdmVBc3RzLCBwcm92aWRlckNvbnRleHQudHJhbnNmb3JtUHJvdmlkZXJzLCBwcm92aWRlckNvbnRleHQudHJhbnNmb3JtZWRIYXNWaWV3Q29udGFpbmVyLCBjaGlsZHJlbiwgaGFzSW5saW5lVGVtcGxhdGVzID8gbnVsbCA6IG5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fYXNzZXJ0RWxlbWVudEV4aXN0cyhtYXRjaEVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICB0aGlzLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50KGRpcmVjdGl2ZUFzdHMsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nQ29udGVudEluZGV4XzEgPSBoYXNJbmxpbmVUZW1wbGF0ZXMgPyBudWxsIDogcGFyZW50LmZpbmROZ0NvbnRlbnRJbmRleChwcm9qZWN0aW9uU2VsZWN0b3IpO1xuICAgICAgICAgICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IEVsZW1lbnRBc3Qobm9kZU5hbWUsIGF0dHJzLCBlbGVtZW50UHJvcHMsIGV2ZW50cywgcmVmZXJlbmNlcywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybWVkRGlyZWN0aXZlQXN0cywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybVByb3ZpZGVycywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybWVkSGFzVmlld0NvbnRhaW5lciwgY2hpbGRyZW4sIGhhc0lubGluZVRlbXBsYXRlcyA/IG51bGwgOiBuZ0NvbnRlbnRJbmRleF8xLCBlbGVtZW50LnNvdXJjZVNwYW4sIGVsZW1lbnQuZW5kU291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVzKGRpcmVjdGl2ZUFzdHMpXG4gICAgICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50RGlyZWN0aXZlQXN0KSB7IHJldHVybiBfdGhpcy5fdmFsaWRhdGVFbGVtZW50QW5pbWF0aW9uSW5wdXRPdXRwdXRzKGNvbXBvbmVudERpcmVjdGl2ZUFzdC5ob3N0UHJvcGVydGllcywgY29tcG9uZW50RGlyZWN0aXZlQXN0Lmhvc3RFdmVudHMsIGNvbXBvbmVudERpcmVjdGl2ZUFzdC5kaXJlY3RpdmUudGVtcGxhdGUpOyB9KTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50VGVtcGxhdGUgPSBwcm92aWRlckNvbnRleHQudmlld0NvbnRleHQuY29tcG9uZW50LnRlbXBsYXRlO1xuICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUVsZW1lbnRBbmltYXRpb25JbnB1dE91dHB1dHMoZWxlbWVudFByb3BzLCBldmVudHMsIGNvbXBvbmVudFRlbXBsYXRlLnRvU3VtbWFyeSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0lubGluZVRlbXBsYXRlcykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZUNzc1NlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKFRFTVBMQVRFX0VMRU1FTlQsIHRlbXBsYXRlTWF0Y2hhYmxlQXR0cnMpO1xuICAgICAgICAgICAgICB2YXIgdGVtcGxhdGVEaXJlY3RpdmVNZXRhcyA9IHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgdGVtcGxhdGVDc3NTZWxlY3RvcikuZGlyZWN0aXZlcztcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcGxhdGVEaXJlY3RpdmVBc3RzID0gdGhpcy5fY3JlYXRlRGlyZWN0aXZlQXN0cyh0cnVlLCBlbGVtZW50Lm5hbWUsIHRlbXBsYXRlRGlyZWN0aXZlTWV0YXMsIHRlbXBsYXRlRWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIFtdLCBlbGVtZW50LnNvdXJjZVNwYW4sIFtdKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcGxhdGVFbGVtZW50UHJvcHMgPSB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKGVsZW1lbnQubmFtZSwgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVEaXJlY3RpdmVBc3RzKTtcbiAgICAgICAgICAgICAgdGhpcy5fYXNzZXJ0Tm9Db21wb25lbnRzTm9yRWxlbWVudEJpbmRpbmdzT25UZW1wbGF0ZSh0ZW1wbGF0ZURpcmVjdGl2ZUFzdHMsIHRlbXBsYXRlRWxlbWVudFByb3BzLCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZVByb3ZpZGVyQ29udGV4dCA9IG5ldyBQcm92aWRlckVsZW1lbnRDb250ZXh0KHRoaXMucHJvdmlkZXJWaWV3Q29udGV4dCwgcGFyZW50LnByb3ZpZGVyQ29udGV4dCwgcGFyZW50LmlzVGVtcGxhdGVFbGVtZW50LCB0ZW1wbGF0ZURpcmVjdGl2ZUFzdHMsIFtdLCBbXSwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlckNvbnRleHQuYWZ0ZXJFbGVtZW50KCk7XG4gICAgICAgICAgICAgIHBhcnNlZEVsZW1lbnQgPSBuZXcgRW1iZWRkZWRUZW1wbGF0ZUFzdChbXSwgW10sIFtdLCB0ZW1wbGF0ZUVsZW1lbnRWYXJzLCB0ZW1wbGF0ZVByb3ZpZGVyQ29udGV4dC50cmFuc2Zvcm1lZERpcmVjdGl2ZUFzdHMsIHRlbXBsYXRlUHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybVByb3ZpZGVycywgdGVtcGxhdGVQcm92aWRlckNvbnRleHQudHJhbnNmb3JtZWRIYXNWaWV3Q29udGFpbmVyLCBbcGFyc2VkRWxlbWVudF0sIG5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFyc2VkRWxlbWVudDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRzXG4gICAgICAgKiBAcGFyYW0gez99IG91dHB1dHNcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVFbGVtZW50QW5pbWF0aW9uSW5wdXRPdXRwdXRzID0gZnVuY3Rpb24gKGlucHV0cywgb3V0cHV0cywgdGVtcGxhdGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyaWdnZXJMb29rdXAgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdGVtcGxhdGUuYW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyB0cmlnZ2VyTG9va3VwLmFkZChlbnRyeSk7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFuaW1hdGlvbklucHV0cyA9IGlucHV0cy5maWx0ZXIoZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBpbnB1dC5pc0FuaW1hdGlvbjsgfSk7XG4gICAgICAgICAgYW5pbWF0aW9uSW5wdXRzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWUgPSBpbnB1dC5uYW1lO1xuICAgICAgICAgICAgICBpZiAoIXRyaWdnZXJMb29rdXAuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJDb3VsZG4ndCBmaW5kIGFuIGFuaW1hdGlvbiBlbnRyeSBmb3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiLCBpbnB1dC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgICAgICAgIGlmIChvdXRwdXQuaXNBbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZvdW5kID0gYW5pbWF0aW9uSW5wdXRzLmZpbmQoZnVuY3Rpb24gKGlucHV0KSB7IHJldHVybiBpbnB1dC5uYW1lID09IG91dHB1dC5uYW1lOyB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJVbmFibGUgdG8gbGlzdGVuIG9uIChAXCIgKyBvdXRwdXQubmFtZSArIFwiLlwiICsgb3V0cHV0LnBoYXNlICsgXCIpIGJlY2F1c2UgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyIFtAXCIgKyBvdXRwdXQubmFtZSArIFwiXSBpc24ndCBiZWluZyB1c2VkIG9uIHRoZSBzYW1lIGVsZW1lbnRcIiwgb3V0cHV0LnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlzVGVtcGxhdGVFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0TWF0Y2hhYmxlQXR0cnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0UHJvcHNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0RXZlbnRzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFJlZnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0VmFyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9wYXJzZUF0dHIgPSBmdW5jdGlvbiAoaXNUZW1wbGF0ZUVsZW1lbnQsIGF0dHIsIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcywgdGFyZ2V0RXZlbnRzLCB0YXJnZXRSZWZzLCB0YXJnZXRWYXJzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZSA9IHRoaXMuX25vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUoYXR0ci5uYW1lKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3JjU3BhbiA9IGF0dHIuc291cmNlU3BhbjtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiaW5kUGFydHMgPSBuYW1lLm1hdGNoKEJJTkRfTkFNRV9SRUdFWFApO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhhc0JpbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoYmluZFBhcnRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGhhc0JpbmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGJpbmRQYXJ0c1tLV19CSU5EX0lEWF0pKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9LV19JRFhdLCB2YWx1ZSwgZmFsc2UsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX0xFVF9JRFhdKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZGVudGlmaWVyID0gYmluZFBhcnRzW0lERU5UX0tXX0lEWF07XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VWYXJpYWJsZShpZGVudGlmaWVyLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0VmFycyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlxcXCJsZXQtXFxcIiBpcyBvbmx5IHN1cHBvcnRlZCBvbiB0ZW1wbGF0ZSBlbGVtZW50cy5cIiwgc3JjU3Bhbik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX1JFRl9JRFhdKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZGVudGlmaWVyID0gYmluZFBhcnRzW0lERU5UX0tXX0lEWF07XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVJlZmVyZW5jZShpZGVudGlmaWVyLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0UmVmcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX09OX0lEWF0pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VFdmVudChiaW5kUGFydHNbSURFTlRfS1dfSURYXSwgdmFsdWUsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRFdmVudHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tLV19CSU5ET05fSURYXSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZVByb3BlcnR5QmluZGluZyhiaW5kUGFydHNbSURFTlRfS1dfSURYXSwgdmFsdWUsIGZhbHNlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBc3NpZ25tZW50RXZlbnQoYmluZFBhcnRzW0lERU5UX0tXX0lEWF0sIHZhbHVlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbS1dfQVRfSURYXSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZUxpdGVyYWxBdHRyKG5hbWUsIHZhbHVlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tJREVOVF9CQU5BTkFfQk9YX0lEWF0pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VQcm9wZXJ0eUJpbmRpbmcoYmluZFBhcnRzW0lERU5UX0JBTkFOQV9CT1hfSURYXSwgdmFsdWUsIGZhbHNlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBc3NpZ25tZW50RXZlbnQoYmluZFBhcnRzW0lERU5UX0JBTkFOQV9CT1hfSURYXSwgdmFsdWUsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRFdmVudHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tJREVOVF9QUk9QRVJUWV9JRFhdKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9QUk9QRVJUWV9JRFhdLCB2YWx1ZSwgZmFsc2UsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0lERU5UX0VWRU5UX0lEWF0pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VFdmVudChiaW5kUGFydHNbSURFTlRfRVZFTlRfSURYXSwgdmFsdWUsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRFdmVudHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBoYXNCaW5kaW5nID0gdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbihuYW1lLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFoYXNCaW5kaW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VMaXRlcmFsQXR0cihuYW1lLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhc0JpbmRpbmc7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX25vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gL15kYXRhLS9pLnRlc3QoYXR0ck5hbWUpID8gYXR0ck5hbWUuc3Vic3RyaW5nKDUpIDogYXR0ck5hbWU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlkZW50aWZpZXJcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRWYXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX3BhcnNlVmFyaWFibGUgPSBmdW5jdGlvbiAoaWRlbnRpZmllciwgdmFsdWUsIHNvdXJjZVNwYW4sIHRhcmdldFZhcnMpIHtcbiAgICAgICAgICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlxcXCItXFxcIiBpcyBub3QgYWxsb3dlZCBpbiB2YXJpYWJsZSBuYW1lc1wiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0VmFycy5wdXNoKG5ldyBWYXJpYWJsZUFzdChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbikpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpZGVudGlmaWVyXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0UmVmc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9wYXJzZVJlZmVyZW5jZSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbiwgdGFyZ2V0UmVmcykge1xuICAgICAgICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiXFxcIi1cXFwiIGlzIG5vdCBhbGxvd2VkIGluIHJlZmVyZW5jZSBuYW1lc1wiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0UmVmcy5wdXNoKG5ldyBFbGVtZW50T3JEaXJlY3RpdmVSZWYoaWRlbnRpZmllciwgdmFsdWUsIHNvdXJjZVNwYW4pKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0TWF0Y2hhYmxlQXR0cnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0RXZlbnRzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX3BhcnNlQXNzaWdubWVudEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRFdmVudHMpIHtcbiAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlRXZlbnQobmFtZSArIFwiQ2hhbmdlXCIsIGV4cHJlc3Npb24gKyBcIj0kZXZlbnRcIiwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldEV2ZW50cyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yTWF0Y2hlclxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50Q3NzU2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fcGFyc2VEaXJlY3RpdmVzID0gZnVuY3Rpb24gKHNlbGVjdG9yTWF0Y2hlciwgZWxlbWVudENzc1NlbGVjdG9yKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAvLyBOZWVkIHRvIHNvcnQgdGhlIGRpcmVjdGl2ZXMgc28gdGhhdCB3ZSBnZXQgY29uc2lzdGVudCByZXN1bHRzIHRocm91Z2hvdXQsXG4gICAgICAgICAgLy8gYXMgc2VsZWN0b3JNYXRjaGVyIHVzZXMgTWFwcyBpbnNpZGUuXG4gICAgICAgICAgLy8gQWxzbyBkZWR1cGxpY2F0ZSBkaXJlY3RpdmVzIGFzIHRoZXkgbWlnaHQgbWF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lIVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZXMgPSBuZXcgQXJyYXkodGhpcy5kaXJlY3RpdmVzSW5kZXguc2l6ZSk7XG4gICAgICAgICAgLy8gV2hldGhlciBhbnkgZGlyZWN0aXZlIHNlbGVjdG9yIG1hdGNoZXMgb24gdGhlIGVsZW1lbnQgbmFtZVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoRWxlbWVudCA9IGZhbHNlO1xuICAgICAgICAgIHNlbGVjdG9yTWF0Y2hlci5tYXRjaChlbGVtZW50Q3NzU2VsZWN0b3IsIGZ1bmN0aW9uIChzZWxlY3RvciwgZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXNbX3RoaXMuZGlyZWN0aXZlc0luZGV4LmdldChkaXJlY3RpdmUpXSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgbWF0Y2hFbGVtZW50ID0gbWF0Y2hFbGVtZW50IHx8IHNlbGVjdG9yLmhhc0VsZW1lbnRTZWxlY3RvcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuICEhZGlyOyB9KSxcbiAgICAgICAgICAgICAgbWF0Y2hFbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaXNUZW1wbGF0ZUVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgICAgICogQHBhcmFtIHs/fSBwcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50T3JEaXJlY3RpdmVSZWZzXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRTb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFJlZmVyZW5jZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fY3JlYXRlRGlyZWN0aXZlQXN0cyA9IGZ1bmN0aW9uIChpc1RlbXBsYXRlRWxlbWVudCwgZWxlbWVudE5hbWUsIGRpcmVjdGl2ZXMsIHByb3BzLCBlbGVtZW50T3JEaXJlY3RpdmVSZWZzLCBlbGVtZW50U291cmNlU3BhbiwgdGFyZ2V0UmVmZXJlbmNlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlZFJlZmVyZW5jZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50ID0gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVBc3RzID0gZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24gKGRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihlbGVtZW50U291cmNlU3Bhbi5zdGFydCwgZWxlbWVudFNvdXJjZVNwYW4uZW5kLCBcIkRpcmVjdGl2ZSBcIiArIGlkZW50aWZpZXJOYW1lKGRpcmVjdGl2ZS50eXBlKSk7XG4gICAgICAgICAgICAgIGlmIChkaXJlY3RpdmUuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVQcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RQcm9wZXJ0aWVzID0gX3RoaXMuX2JpbmRpbmdQYXJzZXIuY3JlYXRlRGlyZWN0aXZlSG9zdFByb3BlcnR5QXN0cyhkaXJlY3RpdmUsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBuZWVkIHRvIGNoZWNrIHRoZSBob3N0IHByb3BlcnRpZXMgaGVyZSBhcyB3ZWxsLFxuICAgICAgICAgICAgICAvLyBhcyB3ZSBkb24ndCBrbm93IHRoZSBlbGVtZW50IG5hbWUgaW4gdGhlIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlciB5ZXQuXG4gICAgICAgICAgICAgIF90aGlzLl9jaGVja1Byb3BlcnRpZXNJblNjaGVtYShlbGVtZW50TmFtZSwgaG9zdFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0RXZlbnRzID0gX3RoaXMuX2JpbmRpbmdQYXJzZXIuY3JlYXRlRGlyZWN0aXZlSG9zdEV2ZW50QXN0cyhkaXJlY3RpdmUsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICBfdGhpcy5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzKGRpcmVjdGl2ZS5pbnB1dHMsIHByb3BzLCBkaXJlY3RpdmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgZWxlbWVudE9yRGlyZWN0aXZlUmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChlbE9yRGlyUmVmKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKGVsT3JEaXJSZWYudmFsdWUubGVuZ3RoID09PSAwICYmIGRpcmVjdGl2ZS5pc0NvbXBvbmVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlLmV4cG9ydEFzID09IGVsT3JEaXJSZWYudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmZXJlbmNlcy5wdXNoKG5ldyBSZWZlcmVuY2VBc3QoZWxPckRpclJlZi5uYW1lLCBpZGVudGlmaWVyVG9rZW4oZGlyZWN0aXZlLnR5cGUpLCBlbE9yRGlyUmVmLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVmZXJlbmNlcy5hZGQoZWxPckRpclJlZi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRGlyZWN0aXZlQXN0KGRpcmVjdGl2ZSwgZGlyZWN0aXZlUHJvcGVydGllcywgaG9zdFByb3BlcnRpZXMsIGhvc3RFdmVudHMsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMuZm9yRWFjaChmdW5jdGlvbiAoZWxPckRpclJlZikge1xuICAgICAgICAgICAgICBpZiAoZWxPckRpclJlZi52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRSZWZlcmVuY2VzLmhhcyhlbE9yRGlyUmVmLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKFwiVGhlcmUgaXMgbm8gZGlyZWN0aXZlIHdpdGggXFxcImV4cG9ydEFzXFxcIiBzZXQgdG8gXFxcIlwiICsgZWxPckRpclJlZi52YWx1ZSArIFwiXFxcIlwiLCBlbE9yRGlyUmVmLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlZlRva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGlmIChpc1RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlZlRva2VuID0gY3JlYXRlSWRlbnRpZmllclRva2VuKElkZW50aWZpZXJzLlRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRhcmdldFJlZmVyZW5jZXMucHVzaChuZXcgUmVmZXJlbmNlQXN0KGVsT3JEaXJSZWYubmFtZSwgcmVmVG9rZW4sIGVsT3JEaXJSZWYuc291cmNlU3BhbikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7IC8vIGZpeCBzeW50YXggaGlnaGxpZ2h0aW5nIGlzc3VlOiBgXG4gICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZUFzdHM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVByb3BlcnRpZXNcbiAgICAgICAqIEBwYXJhbSB7P30gYm91bmRQcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX2NyZWF0ZURpcmVjdGl2ZVByb3BlcnR5QXN0cyA9IGZ1bmN0aW9uIChkaXJlY3RpdmVQcm9wZXJ0aWVzLCBib3VuZFByb3BzLCB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzKSB7XG4gICAgICAgICAgaWYgKGRpcmVjdGl2ZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYm91bmRQcm9wc0J5TmFtZV8xID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICBib3VuZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGJvdW5kUHJvcCkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJldlZhbHVlID0gYm91bmRQcm9wc0J5TmFtZV8xLmdldChib3VuZFByb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICBpZiAoIXByZXZWYWx1ZSB8fCBwcmV2VmFsdWUuaXNMaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBbYV09XCJiXCIgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGE9XCJiXCIgb24gdGhlIHNhbWUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcHNCeU5hbWVfMS5zZXQoYm91bmRQcm9wLm5hbWUsIGJvdW5kUHJvcCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhkaXJlY3RpdmVQcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChkaXJQcm9wKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbFByb3AgPSBkaXJlY3RpdmVQcm9wZXJ0aWVzW2RpclByb3BdO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYm91bmRQcm9wID0gYm91bmRQcm9wc0J5TmFtZV8xLmdldChlbFByb3ApO1xuICAgICAgICAgICAgICAgICAgLy8gQmluZGluZ3MgYXJlIG9wdGlvbmFsLCBzbyB0aGlzIGJpbmRpbmcgb25seSBuZWVkcyB0byBiZSBzZXQgdXAgaWYgYW4gZXhwcmVzc2lvbiBpcyBnaXZlbi5cbiAgICAgICAgICAgICAgICAgIGlmIChib3VuZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzLnB1c2gobmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoZGlyUHJvcCwgYm91bmRQcm9wLm5hbWUsIGJvdW5kUHJvcC5leHByZXNzaW9uLCBib3VuZFByb3Auc291cmNlU3BhbikpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BzXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyA9IGZ1bmN0aW9uIChlbGVtZW50TmFtZSwgcHJvcHMsIGRpcmVjdGl2ZXMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJvdW5kRWxlbWVudFByb3BzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYm91bmREaXJlY3RpdmVQcm9wc0luZGV4ID0gbmV3IE1hcCgpO1xuICAgICAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZS5pbnB1dHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgYm91bmREaXJlY3RpdmVQcm9wc0luZGV4LnNldChwcm9wLnRlbXBsYXRlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgaWYgKCFwcm9wLmlzTGl0ZXJhbCAmJiAhYm91bmREaXJlY3RpdmVQcm9wc0luZGV4LmdldChwcm9wLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRQcm9wcy5wdXNoKF90aGlzLl9iaW5kaW5nUGFyc2VyLmNyZWF0ZUVsZW1lbnRQcm9wZXJ0eUFzdChlbGVtZW50TmFtZSwgcHJvcCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fY2hlY2tQcm9wZXJ0aWVzSW5TY2hlbWEoZWxlbWVudE5hbWUsIGJvdW5kRWxlbWVudFByb3BzKTtcbiAgICAgICAgICByZXR1cm4gYm91bmRFbGVtZW50UHJvcHM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fZmluZENvbXBvbmVudERpcmVjdGl2ZXMgPSBmdW5jdGlvbiAoZGlyZWN0aXZlcykge1xuICAgICAgICAgIHJldHVybiBkaXJlY3RpdmVzLmZpbHRlcihmdW5jdGlvbiAoZGlyZWN0aXZlKSB7IHJldHVybiBkaXJlY3RpdmUuZGlyZWN0aXZlLmlzQ29tcG9uZW50OyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlTmFtZXMgPSBmdW5jdGlvbiAoZGlyZWN0aXZlcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlcyhkaXJlY3RpdmVzKVxuICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHsgcmV0dXJuIGlkZW50aWZpZXJOYW1lKGRpcmVjdGl2ZS5kaXJlY3RpdmUudHlwZSk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZVNwYW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fYXNzZXJ0T25seU9uZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChkaXJlY3RpdmVzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50VHlwZU5hbWVzID0gdGhpcy5fZmluZENvbXBvbmVudERpcmVjdGl2ZU5hbWVzKGRpcmVjdGl2ZXMpO1xuICAgICAgICAgIGlmIChjb21wb25lbnRUeXBlTmFtZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIk1vcmUgdGhhbiBvbmUgY29tcG9uZW50IG1hdGNoZWQgb24gdGhpcyBlbGVtZW50LlxcblwiICtcbiAgICAgICAgICAgICAgICAgIFwiTWFrZSBzdXJlIHRoYXQgb25seSBvbmUgY29tcG9uZW50J3Mgc2VsZWN0b3IgY2FuIG1hdGNoIGEgZ2l2ZW4gZWxlbWVudC5cXG5cIiArXG4gICAgICAgICAgICAgICAgICAoXCJDb25mbGljdGluZyBjb21wb25lbnRzOiBcIiArIGNvbXBvbmVudFR5cGVOYW1lcy5qb2luKCcsJykpLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgTWFrZSBzdXJlIHRoYXQgbm9uLWFuZ3VsYXIgdGFncyBjb25mb3JtIHRvIHRoZSBzY2hlbWFzLlxuICAgICAgICAqICpcbiAgICAgICAgKiBOb3RlOiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYW4gYW5ndWxhciB0YWcgd2hlbiBhdCBsZWFzdCBvbmUgZGlyZWN0aXZlIHNlbGVjdG9yIG1hdGNoZXMgdGhlXG4gICAgICAgICogdGFnIG5hbWUuXG4gICAgICAgICogKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXRjaEVsZW1lbnQgV2hldGhlciBhbnkgZGlyZWN0aXZlIGhhcyBtYXRjaGVkIG9uIHRoZSB0YWcgbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50IHRoZSBodG1sIGVsZW1lbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fYXNzZXJ0RWxlbWVudEV4aXN0cyA9IGZ1bmN0aW9uIChtYXRjaEVsZW1lbnQsIGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbE5hbWUgPSBlbGVtZW50Lm5hbWUucmVwbGFjZSgvXjp4aHRtbDovLCAnJyk7XG4gICAgICAgICAgaWYgKCFtYXRjaEVsZW1lbnQgJiYgIXRoaXMuX3NjaGVtYVJlZ2lzdHJ5Lmhhc0VsZW1lbnQoZWxOYW1lLCB0aGlzLl9zY2hlbWFzKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvck1zZyA9IChcIidcIiArIGVsTmFtZSArIFwiJyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxcblwiKSArXG4gICAgICAgICAgICAgICAgICAoXCIxLiBJZiAnXCIgKyBlbE5hbWUgKyBcIicgaXMgYW4gQW5ndWxhciBjb21wb25lbnQsIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgcGFydCBvZiB0aGlzIG1vZHVsZS5cXG5cIikgK1xuICAgICAgICAgICAgICAgICAgKFwiMi4gSWYgJ1wiICsgZWxOYW1lICsgXCInIGlzIGEgV2ViIENvbXBvbmVudCB0aGVuIGFkZCBcXFwiQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQVxcXCIgdG8gdGhlICdATmdNb2R1bGUuc2NoZW1hcycgb2YgdGhpcyBjb21wb25lbnQgdG8gc3VwcHJlc3MgdGhpcyBtZXNzYWdlLlwiKTtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3JNc2csIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRQcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUgPSBmdW5jdGlvbiAoZGlyZWN0aXZlcywgZWxlbWVudFByb3BzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wb25lbnRUeXBlTmFtZXMgPSB0aGlzLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlTmFtZXMoZGlyZWN0aXZlcyk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiQ29tcG9uZW50cyBvbiBhbiBlbWJlZGRlZCB0ZW1wbGF0ZTogXCIgKyBjb21wb25lbnRUeXBlTmFtZXMuam9pbignLCcpLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKFwiUHJvcGVydHkgYmluZGluZyBcIiArIHByb3AubmFtZSArIFwiIG5vdCB1c2VkIGJ5IGFueSBkaXJlY3RpdmUgb24gYW4gZW1iZWRkZWQgdGVtcGxhdGUuIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHNwZWxsZWQgY29ycmVjdGx5IGFuZCBhbGwgZGlyZWN0aXZlcyBhcmUgbGlzdGVkIGluIHRoZSBcXFwiQE5nTW9kdWxlLmRlY2xhcmF0aW9uc1xcXCIuXCIsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9hc3NlcnRBbGxFdmVudHNQdWJsaXNoZWRCeURpcmVjdGl2ZXMgPSBmdW5jdGlvbiAoZGlyZWN0aXZlcywgZXZlbnRzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbGxEaXJlY3RpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlyZWN0aXZlLmRpcmVjdGl2ZS5vdXRwdXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBldmVudE5hbWUgPSBkaXJlY3RpdmUuZGlyZWN0aXZlLm91dHB1dHNba107XG4gICAgICAgICAgICAgICAgICBhbGxEaXJlY3RpdmVFdmVudHMuYWRkKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGV2ZW50LnRhcmdldCkgfHwgIWFsbERpcmVjdGl2ZUV2ZW50cy5oYXMoZXZlbnQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihcIkV2ZW50IGJpbmRpbmcgXCIgKyBldmVudC5mdWxsTmFtZSArIFwiIG5vdCBlbWl0dGVkIGJ5IGFueSBkaXJlY3RpdmUgb24gYW4gZW1iZWRkZWQgdGVtcGxhdGUuIE1ha2Ugc3VyZSB0aGF0IHRoZSBldmVudCBuYW1lIGlzIHNwZWxsZWQgY29ycmVjdGx5IGFuZCBhbGwgZGlyZWN0aXZlcyBhcmUgbGlzdGVkIGluIHRoZSBcXFwiQE5nTW9kdWxlLmRlY2xhcmF0aW9uc1xcXCIuXCIsIGV2ZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGJvdW5kUHJvcHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fY2hlY2tQcm9wZXJ0aWVzSW5TY2hlbWEgPSBmdW5jdGlvbiAoZWxlbWVudE5hbWUsIGJvdW5kUHJvcHMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGJvdW5kUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoYm91bmRQcm9wKSB7XG4gICAgICAgICAgICAgIGlmIChib3VuZFByb3AudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5Qcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgIV90aGlzLl9zY2hlbWFSZWdpc3RyeS5oYXNQcm9wZXJ0eShlbGVtZW50TmFtZSwgYm91bmRQcm9wLm5hbWUsIF90aGlzLl9zY2hlbWFzKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JNc2cgPSBcIkNhbid0IGJpbmQgdG8gJ1wiICsgYm91bmRQcm9wLm5hbWUgKyBcIicgc2luY2UgaXQgaXNuJ3QgYSBrbm93biBwcm9wZXJ0eSBvZiAnXCIgKyBlbGVtZW50TmFtZSArIFwiJy5cIjtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcIlxcbjEuIElmICdcIiArIGVsZW1lbnROYW1lICsgXCInIGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50IGFuZCBpdCBoYXMgJ1wiICsgYm91bmRQcm9wLm5hbWUgKyBcIicgaW5wdXQsIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgcGFydCBvZiB0aGlzIG1vZHVsZS5cIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiXFxuMi4gSWYgJ1wiICsgZWxlbWVudE5hbWUgKyBcIicgaXMgYSBXZWIgQ29tcG9uZW50IHRoZW4gYWRkIFxcXCJDVVNUT01fRUxFTUVOVFNfU0NIRU1BXFxcIiB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudCB0byBzdXBwcmVzcyB0aGlzIG1lc3NhZ2UuXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKGVycm9yTXNnLCBib3VuZFByb3Auc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTcGFuXG4gICAgICAgKiBAcGFyYW0gez89fSBsZXZlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2VTcGFuLCBsZXZlbCkge1xuICAgICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gUGFyc2VFcnJvckxldmVsLkZBVEFMOyB9XG4gICAgICAgICAgdGhpcy5fdGFyZ2V0RXJyb3JzLnB1c2gobmV3IFBhcnNlRXJyb3Ioc291cmNlU3BhbiwgbWVzc2FnZSwgbGV2ZWwpKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gVGVtcGxhdGVQYXJzZVZpc2l0b3I7XG4gIH0oKSk7XG4gIHZhciBOb25CaW5kYWJsZVZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTm9uQmluZGFibGVWaXNpdG9yKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5vbkJpbmRhYmxlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgcGFyZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlcGFyc2VkRWxlbWVudCA9IHByZXBhcnNlRWxlbWVudChhc3QpO1xuICAgICAgICAgIGlmIChwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNDUklQVCB8fFxuICAgICAgICAgICAgICBwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFIHx8XG4gICAgICAgICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEVTSEVFVCkge1xuICAgICAgICAgICAgICAvLyBTa2lwcGluZyA8c2NyaXB0PiBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgICAgICAgICAvLyBTa2lwcGluZyA8c3R5bGU+IGFuZCBzdHlsZXNoZWV0cyBhcyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGVtXG4gICAgICAgICAgICAgIC8vIGluIHRoZSBTdHlsZUNvbXBpbGVyXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTmFtZUFuZFZhbHVlcyA9IGFzdC5hdHRycy5tYXAoZnVuY3Rpb24gKGF0dHJBc3QpIHsgcmV0dXJuIFthdHRyQXN0Lm5hbWUsIGF0dHJBc3QudmFsdWVdOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWxlY3RvciA9IGNyZWF0ZUVsZW1lbnRDc3NTZWxlY3Rvcihhc3QubmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nQ29udGVudEluZGV4ID0gcGFyZW50LmZpbmROZ0NvbnRlbnRJbmRleChzZWxlY3Rvcik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSB2aXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4sIEVNUFRZX0VMRU1FTlRfQ09OVEVYVCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50QXN0KGFzdC5uYW1lLCB2aXNpdEFsbCh0aGlzLCBhc3QuYXR0cnMpLCBbXSwgW10sIFtdLCBbXSwgW10sIGZhbHNlLCBjaGlsZHJlbiwgbmdDb250ZW50SW5kZXgsIGFzdC5zb3VyY2VTcGFuLCBhc3QuZW5kU291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEF0dHJBc3QoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSwgYXR0cmlidXRlLnNvdXJjZVNwYW4pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgcGFyZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KFRFWFRfQ1NTX1NFTEVDVE9SKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFRleHRBc3QodGV4dC52YWx1ZSwgbmdDb250ZW50SW5kZXgsIHRleHQuc291cmNlU3Bhbik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cGFuc2lvblxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGV4cGFuc2lvbiwgY29udGV4dCkgeyByZXR1cm4gZXhwYW5zaW9uOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cGFuc2lvbkNhc2VcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoZXhwYW5zaW9uQ2FzZSwgY29udGV4dCkgeyByZXR1cm4gZXhwYW5zaW9uQ2FzZTsgfTtcbiAgICAgIHJldHVybiBOb25CaW5kYWJsZVZpc2l0b3I7XG4gIH0oKSk7XG4gIHZhciBFbGVtZW50T3JEaXJlY3RpdmVSZWYgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlU3BhblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBFbGVtZW50T3JEaXJlY3RpdmVSZWYobmFtZSwgdmFsdWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEVsZW1lbnRPckRpcmVjdGl2ZVJlZjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY2xhc3NBdHRyVmFsdWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0Q2xhc3NlcyhjbGFzc0F0dHJWYWx1ZSkge1xuICAgICAgcmV0dXJuIGNsYXNzQXR0clZhbHVlLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbiAgfVxuICB2YXIgRWxlbWVudENvbnRleHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlzVGVtcGxhdGVFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IF9uZ0NvbnRlbnRJbmRleE1hdGNoZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3dpbGRjYXJkTmdDb250ZW50SW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJDb250ZXh0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEVsZW1lbnRDb250ZXh0KGlzVGVtcGxhdGVFbGVtZW50LCBfbmdDb250ZW50SW5kZXhNYXRjaGVyLCBfd2lsZGNhcmROZ0NvbnRlbnRJbmRleCwgcHJvdmlkZXJDb250ZXh0KSB7XG4gICAgICAgICAgdGhpcy5pc1RlbXBsYXRlRWxlbWVudCA9IGlzVGVtcGxhdGVFbGVtZW50O1xuICAgICAgICAgIHRoaXMuX25nQ29udGVudEluZGV4TWF0Y2hlciA9IF9uZ0NvbnRlbnRJbmRleE1hdGNoZXI7XG4gICAgICAgICAgdGhpcy5fd2lsZGNhcmROZ0NvbnRlbnRJbmRleCA9IF93aWxkY2FyZE5nQ29udGVudEluZGV4O1xuICAgICAgICAgIHRoaXMucHJvdmlkZXJDb250ZXh0ID0gcHJvdmlkZXJDb250ZXh0O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlzVGVtcGxhdGVFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJDb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbGVtZW50Q29udGV4dC5jcmVhdGUgPSBmdW5jdGlvbiAoaXNUZW1wbGF0ZUVsZW1lbnQsIGRpcmVjdGl2ZXMsIHByb3ZpZGVyQ29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd2lsZGNhcmROZ0NvbnRlbnRJbmRleCA9IG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50ID0gZGlyZWN0aXZlcy5maW5kKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHsgcmV0dXJuIGRpcmVjdGl2ZS5kaXJlY3RpdmUuaXNDb21wb25lbnQ7IH0pO1xuICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdDb250ZW50U2VsZWN0b3JzID0gY29tcG9uZW50LmRpcmVjdGl2ZS50ZW1wbGF0ZS5uZ0NvbnRlbnRTZWxlY3RvcnM7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBuZ0NvbnRlbnRTZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdG9yID0gbmdDb250ZW50U2VsZWN0b3JzW2ldO1xuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIuYWRkU2VsZWN0YWJsZXMoQ3NzU2VsZWN0b3IucGFyc2UobmdDb250ZW50U2VsZWN0b3JzW2ldKSwgaSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50Q29udGV4dChpc1RlbXBsYXRlRWxlbWVudCwgbWF0Y2hlciwgd2lsZGNhcmROZ0NvbnRlbnRJbmRleCwgcHJvdmlkZXJDb250ZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5maW5kTmdDb250ZW50SW5kZXggPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZ0NvbnRlbnRJbmRpY2VzID0gW107XG4gICAgICAgICAgdGhpcy5fbmdDb250ZW50SW5kZXhNYXRjaGVyLm1hdGNoKHNlbGVjdG9yLCBmdW5jdGlvbiAoc2VsZWN0b3IsIG5nQ29udGVudEluZGV4KSB7IG5nQ29udGVudEluZGljZXMucHVzaChuZ0NvbnRlbnRJbmRleCk7IH0pO1xuICAgICAgICAgIG5nQ29udGVudEluZGljZXMuc29ydCgpO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fd2lsZGNhcmROZ0NvbnRlbnRJbmRleCkpIHtcbiAgICAgICAgICAgICAgbmdDb250ZW50SW5kaWNlcy5wdXNoKHRoaXMuX3dpbGRjYXJkTmdDb250ZW50SW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmdDb250ZW50SW5kaWNlcy5sZW5ndGggPiAwID8gbmdDb250ZW50SW5kaWNlc1swXSA6IG51bGw7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEVsZW1lbnRDb250ZXh0O1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbGVtZW50TmFtZVxuICAgKiBAcGFyYW0gez99IG1hdGNoYWJsZUF0dHJzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IoZWxlbWVudE5hbWUsIG1hdGNoYWJsZUF0dHJzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjc3NTZWxlY3RvciA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxOYW1lTm9OcyA9IHNwbGl0TnNOYW1lKGVsZW1lbnROYW1lKVsxXTtcbiAgICAgIGNzc1NlbGVjdG9yLnNldEVsZW1lbnQoZWxOYW1lTm9Ocyk7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgbWF0Y2hhYmxlQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTmFtZSA9IG1hdGNoYWJsZUF0dHJzW2ldWzBdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGF0dHJOYW1lTm9OcyA9IHNwbGl0TnNOYW1lKGF0dHJOYW1lKVsxXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyVmFsdWUgPSBtYXRjaGFibGVBdHRyc1tpXVsxXTtcbiAgICAgICAgICBjc3NTZWxlY3Rvci5hZGRBdHRyaWJ1dGUoYXR0ck5hbWVOb05zLCBhdHRyVmFsdWUpO1xuICAgICAgICAgIGlmIChhdHRyTmFtZS50b0xvd2VyQ2FzZSgpID09IENMQVNTX0FUVFIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xhc3NlcyA9IHNwbGl0Q2xhc3NlcyhhdHRyVmFsdWUpO1xuICAgICAgICAgICAgICBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNsYXNzTmFtZSkgeyByZXR1cm4gY3NzU2VsZWN0b3IuYWRkQ2xhc3NOYW1lKGNsYXNzTmFtZSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjc3NTZWxlY3RvcjtcbiAgfVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBFTVBUWV9FTEVNRU5UX0NPTlRFWFQgPSBuZXcgRWxlbWVudENvbnRleHQodHJ1ZSwgbmV3IFNlbGVjdG9yTWF0Y2hlcigpLCBudWxsLCBudWxsKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTk9OX0JJTkRBQkxFX1ZJU0lUT1IgPSBuZXcgTm9uQmluZGFibGVWaXNpdG9yKCk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9pc0VtcHR5VGV4dE5vZGUobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBUZXh0ICYmIG5vZGUudmFsdWUudHJpbSgpLmxlbmd0aCA9PSAwO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGl0ZW1zXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVTdW1tYXJ5RHVwbGljYXRlcyhpdGVtcykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWFwID0gbmV3IE1hcCgpO1xuICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIGlmICghbWFwLmdldChpdGVtLnR5cGUucmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICBtYXAuc2V0KGl0ZW0udHlwZS5yZWZlcmVuY2UsIGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20obWFwLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdW5pbXBsZW1lbnRlZCQyKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkJyk7XG4gIH1cbiAgdmFyIENvbXBpbGVyQ29uZmlnID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX18wXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbXBpbGVyQ29uZmlnKF9hKSB7XG4gICAgICAgICAgdmFyIF9iID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsIF9jID0gX2IucmVuZGVyVHlwZXMsIHJlbmRlclR5cGVzID0gX2MgPT09IHZvaWQgMCA/IG5ldyBEZWZhdWx0UmVuZGVyVHlwZXMoKSA6IF9jLCBfZCA9IF9iLmRlZmF1bHRFbmNhcHN1bGF0aW9uLCBkZWZhdWx0RW5jYXBzdWxhdGlvbiA9IF9kID09PSB2b2lkIDAgPyBfYW5ndWxhcl9jb3JlLlZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkIDogX2QsIGdlbkRlYnVnSW5mbyA9IF9iLmdlbkRlYnVnSW5mbywgbG9nQmluZGluZ1VwZGF0ZSA9IF9iLmxvZ0JpbmRpbmdVcGRhdGUsIF9lID0gX2IudXNlSml0LCB1c2VKaXQgPSBfZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9lO1xuICAgICAgICAgIHRoaXMucmVuZGVyVHlwZXMgPSByZW5kZXJUeXBlcztcbiAgICAgICAgICB0aGlzLmRlZmF1bHRFbmNhcHN1bGF0aW9uID0gZGVmYXVsdEVuY2Fwc3VsYXRpb247XG4gICAgICAgICAgdGhpcy5fZ2VuRGVidWdJbmZvID0gZ2VuRGVidWdJbmZvO1xuICAgICAgICAgIHRoaXMuX2xvZ0JpbmRpbmdVcGRhdGUgPSBsb2dCaW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHRoaXMudXNlSml0ID0gdXNlSml0O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBpbGVyQ29uZmlnLnByb3RvdHlwZSwgXCJnZW5EZWJ1Z0luZm9cIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZW5EZWJ1Z0luZm8gPT09IHZvaWQgMCA/IF9hbmd1bGFyX2NvcmUuaXNEZXZNb2RlKCkgOiB0aGlzLl9nZW5EZWJ1Z0luZm87XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcGlsZXJDb25maWcucHJvdG90eXBlLCBcImxvZ0JpbmRpbmdVcGRhdGVcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2dCaW5kaW5nVXBkYXRlID09PSB2b2lkIDAgPyBfYW5ndWxhcl9jb3JlLmlzRGV2TW9kZSgpIDogdGhpcy5fbG9nQmluZGluZ1VwZGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBDb21waWxlckNvbmZpZztcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBUeXBlcyB1c2VkIGZvciB0aGUgcmVuZGVyZXIuXG4gICAgKiBDYW4gYmUgcmVwbGFjZWQgdG8gc3BlY2lhbGl6ZSB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIHNwZWNpZmljIHJlbmRlcmVyXG4gICAgKiB0byBoZWxwIHRyZWUgc2hha2luZy5cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgUmVuZGVyVHlwZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUmVuZGVyVHlwZXMoKSB7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVuZGVyVHlwZXMucHJvdG90eXBlLCBcInJlbmRlcmVyXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCQyKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlclR5cGVzLnByb3RvdHlwZSwgXCJyZW5kZXJUZXh0XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCQyKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlclR5cGVzLnByb3RvdHlwZSwgXCJyZW5kZXJFbGVtZW50XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCQyKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlclR5cGVzLnByb3RvdHlwZSwgXCJyZW5kZXJDb21tZW50XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCQyKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlclR5cGVzLnByb3RvdHlwZSwgXCJyZW5kZXJOb2RlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCQyKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlclR5cGVzLnByb3RvdHlwZSwgXCJyZW5kZXJFdmVudFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQkMigpOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBSZW5kZXJUeXBlcztcbiAgfSgpKTtcbiAgdmFyIERlZmF1bHRSZW5kZXJUeXBlcyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBEZWZhdWx0UmVuZGVyVHlwZXMoKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJUZXh0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlbmRlckVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucmVuZGVyQ29tbWVudCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5yZW5kZXJOb2RlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlbmRlckV2ZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZhdWx0UmVuZGVyVHlwZXMucHJvdG90eXBlLCBcInJlbmRlcmVyXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5SZW5kZXJlcik7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgO1xuICAgICAgcmV0dXJuIERlZmF1bHRSZW5kZXJUeXBlcztcbiAgfSgpKTtcblxuICB2YXIgX19leHRlbmRzJDE2ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogQGxpY2Vuc2UgdW5kZWZpbmVkXG4gICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAqICpcbiAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIEFuaW1hdGlvbkFzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25Bc3QoKSB7XG4gICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgICAgICAgIHRoaXMucGxheVRpbWUgPSAwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25Bc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgfTtcbiAgICAgIHJldHVybiBBbmltYXRpb25Bc3Q7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBBbmltYXRpb25TdGF0ZUFzdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTYoQW5pbWF0aW9uU3RhdGVBc3QsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25TdGF0ZUFzdCgpIHtcbiAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW5pbWF0aW9uU3RhdGVBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgfTtcbiAgICAgIHJldHVybiBBbmltYXRpb25TdGF0ZUFzdDtcbiAgfShBbmltYXRpb25Bc3QpKTtcbiAgdmFyIEFuaW1hdGlvbkVudHJ5QXN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNihBbmltYXRpb25FbnRyeUFzdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlRGVjbGFyYXRpb25zXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlVHJhbnNpdGlvbnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uRW50cnlBc3QobmFtZSwgc3RhdGVEZWNsYXJhdGlvbnMsIHN0YXRlVHJhbnNpdGlvbnMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMuc3RhdGVEZWNsYXJhdGlvbnMgPSBzdGF0ZURlY2xhcmF0aW9ucztcbiAgICAgICAgICB0aGlzLnN0YXRlVHJhbnNpdGlvbnMgPSBzdGF0ZVRyYW5zaXRpb25zO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW5pbWF0aW9uRW50cnlBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGlvbkVudHJ5KHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBBbmltYXRpb25FbnRyeUFzdDtcbiAgfShBbmltYXRpb25Bc3QpKTtcbiAgdmFyIEFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25Bc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE2KEFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25Bc3QsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uQXN0KHN0YXRlTmFtZSwgc3R5bGVzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZU5hbWUgPSBzdGF0ZU5hbWU7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uQXN0O1xuICB9KEFuaW1hdGlvblN0YXRlQXN0KSk7XG4gIHZhciBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGVcbiAgICAgICAqIEBwYXJhbSB7P30gdG9TdGF0ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25FeHByZXNzaW9uKGZyb21TdGF0ZSwgdG9TdGF0ZSkge1xuICAgICAgICAgIHRoaXMuZnJvbVN0YXRlID0gZnJvbVN0YXRlO1xuICAgICAgICAgIHRoaXMudG9TdGF0ZSA9IHRvU3RhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uRXhwcmVzc2lvbjtcbiAgfSgpKTtcbiAgdmFyIEFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbkFzdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTYoQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uQXN0LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlQ2hhbmdlc1xuICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uQXN0KHN0YXRlQ2hhbmdlcywgYW5pbWF0aW9uKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMgPSBzdGF0ZUNoYW5nZXM7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb24gPSBhbmltYXRpb247XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25Bc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uQXN0O1xuICB9KEFuaW1hdGlvblN0YXRlQXN0KSk7XG4gIHZhciBBbmltYXRpb25TdGVwQXN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNihBbmltYXRpb25TdGVwQXN0LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nU3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc1xuICAgICAgICogQHBhcmFtIHs/fSBkdXJhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSBkZWxheVxuICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmdcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uU3RlcEFzdChzdGFydGluZ1N0eWxlcywga2V5ZnJhbWVzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZykge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuc3RhcnRpbmdTdHlsZXMgPSBzdGFydGluZ1N0eWxlcztcbiAgICAgICAgICB0aGlzLmtleWZyYW1lcyA9IGtleWZyYW1lcztcbiAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuICAgICAgICAgIHRoaXMuZWFzaW5nID0gZWFzaW5nO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW5pbWF0aW9uU3RlcEFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QW5pbWF0aW9uU3RlcCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uU3RlcEFzdDtcbiAgfShBbmltYXRpb25Bc3QpKTtcbiAgdmFyIEFuaW1hdGlvblN0eWxlc0FzdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTYoQW5pbWF0aW9uU3R5bGVzQXN0LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25TdHlsZXNBc3Qoc3R5bGVzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25TdHlsZXNBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGlvblN0eWxlcyh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uU3R5bGVzQXN0O1xuICB9KEFuaW1hdGlvbkFzdCkpO1xuICB2YXIgQW5pbWF0aW9uS2V5ZnJhbWVBc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE2KEFuaW1hdGlvbktleWZyYW1lQXN0LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG9mZnNldFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uS2V5ZnJhbWVBc3Qob2Zmc2V0LCBzdHlsZXMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFuaW1hdGlvbktleWZyYW1lQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbmltYXRpb25LZXlmcmFtZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uS2V5ZnJhbWVBc3Q7XG4gIH0oQW5pbWF0aW9uQXN0KSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBBbmltYXRpb25XaXRoU3RlcHNBc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE2KEFuaW1hdGlvbldpdGhTdGVwc0FzdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGVwc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25XaXRoU3RlcHNBc3Qoc3RlcHMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQW5pbWF0aW9uV2l0aFN0ZXBzQXN0O1xuICB9KEFuaW1hdGlvbkFzdCkpO1xuICB2YXIgQW5pbWF0aW9uR3JvdXBBc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE2KEFuaW1hdGlvbkdyb3VwQXN0LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0ZXBzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkdyb3VwQXN0KHN0ZXBzKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc3RlcHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW5pbWF0aW9uR3JvdXBBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGlvbkdyb3VwKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBBbmltYXRpb25Hcm91cEFzdDtcbiAgfShBbmltYXRpb25XaXRoU3RlcHNBc3QpKTtcbiAgdmFyIEFuaW1hdGlvblNlcXVlbmNlQXN0ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNihBbmltYXRpb25TZXF1ZW5jZUFzdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGVwc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25TZXF1ZW5jZUFzdChzdGVwcykge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHN0ZXBzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFuaW1hdGlvblNlcXVlbmNlQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbmltYXRpb25TZXF1ZW5jZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uU2VxdWVuY2VBc3Q7XG4gIH0oQW5pbWF0aW9uV2l0aFN0ZXBzQXN0KSk7XG5cbiAgdmFyIFN0eWxlc0NvbGxlY3Rpb25FbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGltZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdHlsZXNDb2xsZWN0aW9uRW50cnkodGltZSwgdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0aW1lXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdHlsZXNDb2xsZWN0aW9uRW50cnkucHJvdG90eXBlLm1hdGNoZXMgPSBmdW5jdGlvbiAodGltZSwgdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gdGltZSA9PSB0aGlzLnRpbWUgJiYgdmFsdWUgPT0gdGhpcy52YWx1ZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3R5bGVzQ29sbGVjdGlvbkVudHJ5O1xuICB9KCkpO1xuICB2YXIgU3R5bGVzQ29sbGVjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTdHlsZXNDb2xsZWN0aW9uKCkge1xuICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlcbiAgICAgICAqIEBwYXJhbSB7P30gdGltZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3R5bGVzQ29sbGVjdGlvbi5wcm90b3R5cGUuaW5zZXJ0QXRUaW1lID0gZnVuY3Rpb24gKHByb3BlcnR5LCB0aW1lLCB2YWx1ZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR1cGxlID0gbmV3IFN0eWxlc0NvbGxlY3Rpb25FbnRyeSh0aW1lLCB2YWx1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW50cmllcyA9IHRoaXMuc3R5bGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICBpZiAoIWlzUHJlc2VudChlbnRyaWVzKSkge1xuICAgICAgICAgICAgICBlbnRyaWVzID0gdGhpcy5zdHlsZXNbcHJvcGVydHldID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGluc2VydCB0aGlzIGF0IHRoZSByaWdodCBzdG9wIGluIHRoZSBhcnJheVxuICAgICAgICAgIC8vIHRoaXMgd2F5IHdlIGNhbiBrZWVwIGl0IHNvcnRlZFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluc2VydGlvbkluZGV4ID0gMDtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnRpbWUgPD0gdGltZSkge1xuICAgICAgICAgICAgICAgICAgaW5zZXJ0aW9uSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVudHJpZXMuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCB0dXBsZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5XG4gICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdHlsZXNDb2xsZWN0aW9uLnByb3RvdHlwZS5nZXRCeUluZGV4ID0gZnVuY3Rpb24gKHByb3BlcnR5LCBpbmRleCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGl0ZW1zID0gdGhpcy5zdHlsZXNbcHJvcGVydHldO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoaXRlbXMpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbmRleCA+PSBpdGVtcy5sZW5ndGggPyBudWxsIDogaXRlbXNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlcbiAgICAgICAqIEBwYXJhbSB7P30gdGltZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3R5bGVzQ29sbGVjdGlvbi5wcm90b3R5cGUuaW5kZXhPZkF0T3JCZWZvcmVUaW1lID0gZnVuY3Rpb24gKHByb3BlcnR5LCB0aW1lKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW50cmllcyA9IHRoaXMuc3R5bGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGVudHJpZXMpKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnRpbWUgPD0gdGltZSlcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3R5bGVzQ29sbGVjdGlvbjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMTUgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBfX2RlY29yYXRlJDQgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkNCA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0lOSVRJQUxfS0VZRlJBTUUgPSAwO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfVEVSTUlOQUxfS0VZRlJBTUUgPSAxO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfT05FX1NFQ09ORCA9IDEwMDA7XG4gIHZhciBBbmltYXRpb25QYXJzZUVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNShBbmltYXRpb25QYXJzZUVycm9yLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uUGFyc2VFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbnVsbCwgbWVzc2FnZSk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFuaW1hdGlvblBhcnNlRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJcIiArIHRoaXMubXNnOyB9O1xuICAgICAgcmV0dXJuIEFuaW1hdGlvblBhcnNlRXJyb3I7XG4gIH0oUGFyc2VFcnJvcikpO1xuICB2YXIgQW5pbWF0aW9uRW50cnlQYXJzZVJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25FbnRyeVBhcnNlUmVzdWx0KGFzdCwgZXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy5hc3QgPSBhc3Q7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gQW5pbWF0aW9uRW50cnlQYXJzZVJlc3VsdDtcbiAgfSgpKTtcbiAgdmFyIEFuaW1hdGlvblBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX3NjaGVtYVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25QYXJzZXIoX3NjaGVtYSkge1xuICAgICAgICAgIHRoaXMuX3NjaGVtYSA9IF9zY2hlbWE7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25QYXJzZXIucHJvdG90eXBlLnBhcnNlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50TmFtZSA9IGlkZW50aWZpZXJOYW1lKGNvbXBvbmVudC50eXBlKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25UcmlnZ2VyTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0cyA9IGNvbXBvbmVudC50ZW1wbGF0ZS5hbmltYXRpb25zLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gX3RoaXMucGFyc2VFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFzdCA9IHJlc3VsdC5hc3Q7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyaWdnZXJOYW1lID0gYXN0Lm5hbWU7XG4gICAgICAgICAgICAgIGlmIChhbmltYXRpb25UcmlnZ2VyTmFtZXMuaGFzKHRyaWdnZXJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwiVGhlIGFuaW1hdGlvbiB0cmlnZ2VyIFxcXCJcIiArIHRyaWdnZXJOYW1lICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBmb3IgdGhlIFwiICsgY29tcG9uZW50TmFtZSArIFwiIGNvbXBvbmVudFwiKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBhbmltYXRpb25UcmlnZ2VyTmFtZXMuYWRkKHRyaWdnZXJOYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvck1lc3NhZ2VfMSA9IFwiLSBVbmFibGUgdG8gcGFyc2UgdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZSBmb3IgXFxcIlwiICsgdHJpZ2dlck5hbWUgKyBcIlxcXCIgb24gdGhlIFwiICsgY29tcG9uZW50TmFtZSArIFwiIGNvbXBvbmVudCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6XCI7XG4gICAgICAgICAgICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7IGVycm9yTWVzc2FnZV8xICs9ICdcXG4tLSAnICsgZXJyb3IubXNnOyB9KTtcbiAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yTWVzc2FnZV8xKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvclN0cmluZyA9IGVycm9ycy5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW5pbWF0aW9uIHBhcnNlIGVycm9yczpcXG5cIiArIGVycm9yU3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFzdHM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVudHJ5XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25QYXJzZXIucHJvdG90eXBlLnBhcnNlRW50cnkgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9ycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRlU3R5bGVzID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNpdGlvbnMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZURlY2xhcmF0aW9uQXN0cyA9IFtdO1xuICAgICAgICAgIGVudHJ5LmRlZmluaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGRlZikge1xuICAgICAgICAgICAgICBpZiAoZGVmIGluc3RhbmNlb2YgQ29tcGlsZUFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25NZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgX3BhcnNlQW5pbWF0aW9uRGVjbGFyYXRpb25TdGF0ZXMoZGVmLCBfdGhpcy5fc2NoZW1hLCBlcnJvcnMpLmZvckVhY2goZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlRGVjbGFyYXRpb25Bc3RzLnB1c2goYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0eWxlc1thc3Quc3RhdGVOYW1lXSA9IGFzdC5zdHlsZXM7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLnB1c2goLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZVRyYW5zaXRpb25Bc3RzID0gdHJhbnNpdGlvbnMubWFwKGZ1bmN0aW9uICh0cmFuc0RlZikgeyByZXR1cm4gX3BhcnNlQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uKHRyYW5zRGVmLCBzdGF0ZVN0eWxlcywgX3RoaXMuX3NjaGVtYSwgZXJyb3JzKTsgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXN0ID0gbmV3IEFuaW1hdGlvbkVudHJ5QXN0KGVudHJ5Lm5hbWUsIHN0YXRlRGVjbGFyYXRpb25Bc3RzLCBzdGF0ZVRyYW5zaXRpb25Bc3RzKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbkVudHJ5UGFyc2VSZXN1bHQoYXN0LCBlcnJvcnMpO1xuICAgICAgfTtcbiAgICAgIEFuaW1hdGlvblBhcnNlciA9IF9fZGVjb3JhdGUkNChbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkNCgnZGVzaWduOnBhcmFtdHlwZXMnLCBbRWxlbWVudFNjaGVtYVJlZ2lzdHJ5XSlcbiAgICAgIF0sIEFuaW1hdGlvblBhcnNlcik7XG4gICAgICByZXR1cm4gQW5pbWF0aW9uUGFyc2VyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdGF0ZU1ldGFkYXRhXG4gICAqIEBwYXJhbSB7P30gc2NoZW1hXG4gICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcGFyc2VBbmltYXRpb25EZWNsYXJhdGlvblN0YXRlcyhzdGF0ZU1ldGFkYXRhLCBzY2hlbWEsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9ybWFsaXplZFN0eWxlcyA9IF9ub3JtYWxpemVTdHlsZU1ldGFkYXRhKHN0YXRlTWV0YWRhdGEuc3R5bGVzLCB7fSwgc2NoZW1hLCBlcnJvcnMsIGZhbHNlKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlZlN0eWxlcyA9IG5ldyBBbmltYXRpb25TdHlsZXNBc3Qobm9ybWFsaXplZFN0eWxlcyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZXMgPSBzdGF0ZU1ldGFkYXRhLnN0YXRlTmFtZUV4cHIuc3BsaXQoL1xccyosXFxzKi8pO1xuICAgICAgcmV0dXJuIHN0YXRlcy5tYXAoZnVuY3Rpb24gKHN0YXRlKSB7IHJldHVybiBuZXcgQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbkFzdChzdGF0ZSwgZGVmU3R5bGVzKTsgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdHJhbnNpdGlvblN0YXRlTWV0YWRhdGFcbiAgICogQHBhcmFtIHs/fSBzdGF0ZVN0eWxlc1xuICAgKiBAcGFyYW0gez99IHNjaGVtYVxuICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3BhcnNlQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uKHRyYW5zaXRpb25TdGF0ZU1ldGFkYXRhLCBzdGF0ZVN0eWxlcywgc2NoZW1hLCBlcnJvcnMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlcyA9IG5ldyBTdHlsZXNDb2xsZWN0aW9uKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2l0aW9uRXhwcnMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYW5zaXRpb25TdGF0ZXMgPSB0cmFuc2l0aW9uU3RhdGVNZXRhZGF0YS5zdGF0ZUNoYW5nZUV4cHIuc3BsaXQoL1xccyosXFxzKi8pO1xuICAgICAgdHJhbnNpdGlvblN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChleHByKSB7IHRyYW5zaXRpb25FeHBycy5wdXNoLmFwcGx5KHRyYW5zaXRpb25FeHBycywgX3BhcnNlQW5pbWF0aW9uVHJhbnNpdGlvbkV4cHIoZXhwciwgZXJyb3JzKSk7IH0pO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW50cnkgPSBfbm9ybWFsaXplQW5pbWF0aW9uRW50cnkodHJhbnNpdGlvblN0YXRlTWV0YWRhdGEuc3RlcHMpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5pbWF0aW9uID0gX25vcm1hbGl6ZVN0eWxlU3RlcHMoZW50cnksIHN0YXRlU3R5bGVzLCBzY2hlbWEsIGVycm9ycyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25Bc3QgPSBfcGFyc2VUcmFuc2l0aW9uQW5pbWF0aW9uKGFuaW1hdGlvbiwgMCwgc3R5bGVzLCBzdGF0ZVN0eWxlcywgZXJyb3JzKTtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICBfZmlsbEFuaW1hdGlvbkFzdFN0YXJ0aW5nS2V5ZnJhbWVzKGFuaW1hdGlvbkFzdCwgc3R5bGVzLCBlcnJvcnMpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RlcHNBc3QgPSAoYW5pbWF0aW9uQXN0IGluc3RhbmNlb2YgQW5pbWF0aW9uV2l0aFN0ZXBzQXN0KSA/XG4gICAgICAgICAgYW5pbWF0aW9uQXN0IDpcbiAgICAgICAgICBuZXcgQW5pbWF0aW9uU2VxdWVuY2VBc3QoW2FuaW1hdGlvbkFzdF0pO1xuICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25Bc3QodHJhbnNpdGlvbkV4cHJzLCBzdGVwc0FzdCk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYWxpYXNcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9wYXJzZUFuaW1hdGlvbkFsaWFzKGFsaWFzLCBlcnJvcnMpIHtcbiAgICAgIHN3aXRjaCAoYWxpYXMpIHtcbiAgICAgICAgICBjYXNlICc6ZW50ZXInOlxuICAgICAgICAgICAgICByZXR1cm4gJ3ZvaWQgPT4gKic7XG4gICAgICAgICAgY2FzZSAnOmxlYXZlJzpcbiAgICAgICAgICAgICAgcmV0dXJuICcqID0+IHZvaWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwidGhlIHRyYW5zaXRpb24gYWxpYXMgdmFsdWUgXFxcIlwiICsgYWxpYXMgKyBcIlxcXCIgaXMgbm90IHN1cHBvcnRlZFwiKSk7XG4gICAgICAgICAgICAgIHJldHVybiAnKiA9PiAqJztcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBldmVudFN0clxuICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3BhcnNlQW5pbWF0aW9uVHJhbnNpdGlvbkV4cHIoZXZlbnRTdHIsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgIGlmIChldmVudFN0clswXSA9PSAnOicpIHtcbiAgICAgICAgICBldmVudFN0ciA9IF9wYXJzZUFuaW1hdGlvbkFsaWFzKGV2ZW50U3RyLCBlcnJvcnMpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2ggPSBldmVudFN0ci5tYXRjaCgvXihcXCp8Wy1cXHddKylcXHMqKDw/Wz0tXT4pXFxzKihcXCp8Wy1cXHddKykkLyk7XG4gICAgICBpZiAoIWlzUHJlc2VudChtYXRjaCkgfHwgbWF0Y2gubGVuZ3RoIDwgNCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwidGhlIHByb3ZpZGVkIFwiICsgZXZlbnRTdHIgKyBcIiBpcyBub3Qgb2YgYSBzdXBwb3J0ZWQgZm9ybWF0XCIpKTtcbiAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmcm9tU3RhdGUgPSBtYXRjaFsxXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlcGFyYXRvciA9IG1hdGNoWzJdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdG9TdGF0ZSA9IG1hdGNoWzNdO1xuICAgICAgZXhwcmVzc2lvbnMucHVzaChuZXcgQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uRXhwcmVzc2lvbihmcm9tU3RhdGUsIHRvU3RhdGUpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzRnVsbEFueVN0YXRlRXhwciA9IGZyb21TdGF0ZSA9PSBBTllfU1RBVEUgJiYgdG9TdGF0ZSA9PSBBTllfU1RBVEU7XG4gICAgICBpZiAoc2VwYXJhdG9yWzBdID09ICc8JyAmJiAhaXNGdWxsQW55U3RhdGVFeHByKSB7XG4gICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChuZXcgQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uRXhwcmVzc2lvbih0b1N0YXRlLCBmcm9tU3RhdGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHByZXNzaW9ucztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbnRyeVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX25vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KGVudHJ5KSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlbnRyeSkgPyBuZXcgQ29tcGlsZUFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGEoZW50cnkpIDogZW50cnk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZW50cnlcbiAgICogQHBhcmFtIHs/fSBzdGF0ZVN0eWxlc1xuICAgKiBAcGFyYW0gez99IHNjaGVtYVxuICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgKiBAcGFyYW0gez99IHBlcm1pdFN0YXRlUmVmZXJlbmNlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX25vcm1hbGl6ZVN0eWxlTWV0YWRhdGEoZW50cnksIHN0YXRlU3R5bGVzLCBzY2hlbWEsIGVycm9ycywgcGVybWl0U3RhdGVSZWZlcmVuY2VzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvZmZzZXQgPSBlbnRyeS5vZmZzZXQ7XG4gICAgICBpZiAob2Zmc2V0ID4gMSB8fCBvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEFuaW1hdGlvblBhcnNlRXJyb3IoXCJPZmZzZXQgdmFsdWVzIGZvciBhbmltYXRpb25zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxXCIpKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZWRTdHlsZXMgPSBbXTtcbiAgICAgIGVudHJ5LnN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZUVudHJ5KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZUVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBpZiAocGVybWl0U3RhdGVSZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3R5bGVzLnB1c2guYXBwbHkobm9ybWFsaXplZFN0eWxlcywgX3Jlc29sdmVTdHlsZXNGcm9tU3RhdGUoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGVFbnRyeSksIHN0YXRlU3R5bGVzLCBlcnJvcnMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwiU3RhdGUgYmFzZWQgYW5pbWF0aW9ucyBjYW5ub3QgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIHN0YXRlc1wiKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlc09ial8xID0gKHN0eWxlRW50cnkpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub3JtYWxpemVkU3R5bGVzT2JqXzEgPSB7fTtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzT2JqXzEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub3JtYWxpemVkUHJvcCA9IHNjaGVtYS5ub3JtYWxpemVBbmltYXRpb25TdHlsZVByb3BlcnR5KHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZWRPdXRwdXQgPSBzY2hlbWEubm9ybWFsaXplQW5pbWF0aW9uU3R5bGVWYWx1ZShub3JtYWxpemVkUHJvcCwgcHJvcE5hbWUsIHN0eWxlc09ial8xW3Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub3JtYWxpemF0aW9uRXJyb3IgPSBub3JtYWxpemVkT3V0cHV0WydlcnJvciddO1xuICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6YXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKG5vcm1hbGl6YXRpb25FcnJvcikpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN0eWxlc09ial8xW25vcm1hbGl6ZWRQcm9wXSA9IG5vcm1hbGl6ZWRPdXRwdXRbJ3ZhbHVlJ107XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBub3JtYWxpemVkU3R5bGVzLnB1c2gobm9ybWFsaXplZFN0eWxlc09ial8xKTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkU3R5bGVzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGVudHJ5XG4gICAqIEBwYXJhbSB7P30gc3RhdGVTdHlsZXNcbiAgICogQHBhcmFtIHs/fSBzY2hlbWFcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9ub3JtYWxpemVTdHlsZVN0ZXBzKGVudHJ5LCBzdGF0ZVN0eWxlcywgc2NoZW1hLCBlcnJvcnMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0ZXBzID0gX25vcm1hbGl6ZVN0eWxlU3RlcEVudHJ5KGVudHJ5LCBzdGF0ZVN0eWxlcywgc2NoZW1hLCBlcnJvcnMpO1xuICAgICAgcmV0dXJuIChlbnRyeSBpbnN0YW5jZW9mIENvbXBpbGVBbmltYXRpb25Hcm91cE1ldGFkYXRhKSA/XG4gICAgICAgICAgbmV3IENvbXBpbGVBbmltYXRpb25Hcm91cE1ldGFkYXRhKHN0ZXBzKSA6XG4gICAgICAgICAgbmV3IENvbXBpbGVBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhKHN0ZXBzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHlsZXNMaXN0XG4gICAqIEBwYXJhbSB7P30gbmV3SXRlbVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX21lcmdlQW5pbWF0aW9uU3R5bGVzKHN0eWxlc0xpc3QsIG5ld0l0ZW0pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3SXRlbSA9PT0gJ29iamVjdCcgJiYgbmV3SXRlbSAhPT0gbnVsbCAmJiBzdHlsZXNMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0SW5kZXggPSBzdHlsZXNMaXN0Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGFzdEl0ZW0gPSBzdHlsZXNMaXN0W2xhc3RJbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBsYXN0SXRlbSA9PT0gJ29iamVjdCcgJiYgbGFzdEl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3R5bGVzTGlzdFtsYXN0SW5kZXhdID0gU3RyaW5nTWFwV3JhcHBlci5tZXJnZSgvKiogQHR5cGUgez99ICovIChsYXN0SXRlbSksIC8qKiBAdHlwZSB7P30gKi8gKG5ld0l0ZW0pKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0eWxlc0xpc3QucHVzaChuZXdJdGVtKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbnRyeVxuICAgKiBAcGFyYW0gez99IHN0YXRlU3R5bGVzXG4gICAqIEBwYXJhbSB7P30gc2NoZW1hXG4gICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfbm9ybWFsaXplU3R5bGVTdGVwRW50cnkoZW50cnksIHN0YXRlU3R5bGVzLCBzY2hlbWEsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RlcHM7XG4gICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEpIHtcbiAgICAgICAgICBzdGVwcyA9IGVudHJ5LnN0ZXBzO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdTdGVwcyA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tYmluZWRTdHlsZXM7XG4gICAgICBzdGVwcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgICAgaWYgKHN0ZXAgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAvLyB0aGlzIG9jY3VycyB3aGVuIGEgc3R5bGUgc3RlcCBpcyBmb2xsb3dlZCBieSBhIHByZXZpb3VzIHN0eWxlIHN0ZXBcbiAgICAgICAgICAgICAgLy8gb3Igd2hlbiB0aGUgZmlyc3Qgc3R5bGUgc3RlcCBpcyBydW4uIFdlIHdhbnQgdG8gY29uY2F0ZW5hdGUgYWxsIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgLy8gc3R5bGUgc3RlcHMgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBzdHlsZSBzdGVwIHN1Y2ggdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0XG4gICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIGtleWZyYW1lIGRhdGEgdG8gcGFzcyBpbnRvIHRoZSBhbmltYXRpb24gcGxheWVyLlxuICAgICAgICAgICAgICBpZiAoIWlzUHJlc2VudChjb21iaW5lZFN0eWxlcykpIHtcbiAgICAgICAgICAgICAgICAgIGNvbWJpbmVkU3R5bGVzID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX25vcm1hbGl6ZVN0eWxlTWV0YWRhdGEoLyoqIEB0eXBlIHs/fSAqLyAoc3RlcCksIHN0YXRlU3R5bGVzLCBzY2hlbWEsIGVycm9ycywgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyBfbWVyZ2VBbmltYXRpb25TdHlsZXMoY29tYmluZWRTdHlsZXMsIGVudHJ5KTsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBjcmVhdGUgYSBtZXRhZGF0YSBlbnRyeSBvZiB0aGUgY29tYmluZWQgc3R5bGVzXG4gICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBnbyBvbiBhbiBwcm9jZXNzIHRoZSBhbmltYXRlLCBzZXF1ZW5jZSBvciBncm91cCBtZXRhZGF0YSBzdGVwcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBBU1Qgd2lsbCBoYXZlIHRoZSBwcmV2aW91cyBzdHlsZXMgcGFpbnRlZCBvblxuICAgICAgICAgICAgICAvLyBzY3JlZW4gYmVmb3JlIGFueSBmdXJ0aGVyIGFuaW1hdGlvbnMgdGhhdCB1c2UgdGhlIHN0eWxlcyB0YWtlIHBsYWNlLlxuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGNvbWJpbmVkU3R5bGVzKSkge1xuICAgICAgICAgICAgICAgICAgbmV3U3RlcHMucHVzaChuZXcgQ29tcGlsZUFuaW1hdGlvblN0eWxlTWV0YWRhdGEoMCwgY29tYmluZWRTdHlsZXMpKTtcbiAgICAgICAgICAgICAgICAgIGNvbWJpbmVkU3R5bGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc3RlcCBpbnN0YW5jZW9mIENvbXBpbGVBbmltYXRpb25BbmltYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCByZWN1cnNlIGludG8gQ29tcGlsZUFuaW1hdGlvbkFuaW1hdGVNZXRhZGF0YSBzaW5jZVxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2Ugc3R5bGUgc3RlcHMgYXJlIG5vdCBnb2luZyB0byBiZSBzcXVhc2hlZFxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5pbWF0ZVN0eWxlVmFsdWUgPSAoKHN0ZXApKS5zdHlsZXM7XG4gICAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZVN0eWxlVmFsdWUgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVTdHlsZVZhbHVlLnN0eWxlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9ub3JtYWxpemVTdHlsZU1ldGFkYXRhKGFuaW1hdGVTdHlsZVZhbHVlLCBzdGF0ZVN0eWxlcywgc2NoZW1hLCBlcnJvcnMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYW5pbWF0ZVN0eWxlVmFsdWUgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVTdHlsZVZhbHVlLnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5zdHlsZXMgPSBfbm9ybWFsaXplU3R5bGVNZXRhZGF0YShzdGVwLCBzdGF0ZVN0eWxlcywgc2NoZW1hLCBlcnJvcnMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHN0ZXAgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlubmVyU3RlcHMgPSBfbm9ybWFsaXplU3R5bGVTdGVwRW50cnkoc3RlcCwgc3RhdGVTdHlsZXMsIHNjaGVtYSwgZXJyb3JzKTtcbiAgICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwIGluc3RhbmNlb2YgQ29tcGlsZUFuaW1hdGlvbkdyb3VwTWV0YWRhdGEgP1xuICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21waWxlQW5pbWF0aW9uR3JvdXBNZXRhZGF0YShpbm5lclN0ZXBzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBpbGVBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhKGlubmVyU3RlcHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5ld1N0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiBvbmx5IHN0eWxlcyB3ZXJlIGFuaW1hdGVkIHdpdGhpbiB0aGUgc2VxdWVuY2VcbiAgICAgIGlmIChpc1ByZXNlbnQoY29tYmluZWRTdHlsZXMpKSB7XG4gICAgICAgICAgbmV3U3RlcHMucHVzaChuZXcgQ29tcGlsZUFuaW1hdGlvblN0eWxlTWV0YWRhdGEoMCwgY29tYmluZWRTdHlsZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTdGVwcztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdGF0ZU5hbWVcbiAgICogQHBhcmFtIHs/fSBzdGF0ZVN0eWxlc1xuICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3Jlc29sdmVTdHlsZXNGcm9tU3RhdGUoc3RhdGVOYW1lLCBzdGF0ZVN0eWxlcywgZXJyb3JzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZXMgPSBbXTtcbiAgICAgIGlmIChzdGF0ZU5hbWVbMF0gIT0gJzonKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEFuaW1hdGlvblBhcnNlRXJyb3IoXCJBbmltYXRpb24gc3RhdGVzIHZpYSBzdHlsZXMgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIGEgXFxcIjpcXFwiXCIpKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZWRTdGF0ZU5hbWUgPSBzdGF0ZU5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gc3RhdGVTdHlsZXNbbm9ybWFsaXplZFN0YXRlTmFtZV07XG4gICAgICAgICAgaWYgKCFpc1ByZXNlbnQodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwiVW5hYmxlIHRvIGFwcGx5IHN0eWxlcyBkdWUgdG8gbWlzc2luZyBhIHN0YXRlOiBcXFwiXCIgKyBub3JtYWxpemVkU3RhdGVOYW1lICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlLnN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZXNFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZXNFbnRyeSA9PT0gJ29iamVjdCcgJiYgc3R5bGVzRW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaCgvKiogQHR5cGUgez99ICovIChzdHlsZXNFbnRyeSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGVzO1xuICB9XG4gIHZhciBfQW5pbWF0aW9uVGltaW5ncyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gZGVsYXlcbiAgICAgICAqIEBwYXJhbSB7P30gZWFzaW5nXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9BbmltYXRpb25UaW1pbmdzKGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nKSB7XG4gICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICAgICAgICB0aGlzLmVhc2luZyA9IGVhc2luZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBfQW5pbWF0aW9uVGltaW5ncztcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVTZXF1ZW5jZVxuICAgKiBAcGFyYW0gez99IGN1cnJlbnRUaW1lXG4gICAqIEBwYXJhbSB7P30gY29sbGVjdGVkU3R5bGVzXG4gICAqIEBwYXJhbSB7P30gc3RhdGVTdHlsZXNcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9wYXJzZUFuaW1hdGlvbktleWZyYW1lcyhrZXlmcmFtZVNlcXVlbmNlLCBjdXJyZW50VGltZSwgY29sbGVjdGVkU3R5bGVzLCBzdGF0ZVN0eWxlcywgZXJyb3JzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b3RhbEVudHJpZXMgPSBrZXlmcmFtZVNlcXVlbmNlLnN0ZXBzLmxlbmd0aDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRvdGFsT2Zmc2V0cyA9IDA7XG4gICAgICBrZXlmcmFtZVNlcXVlbmNlLnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXApIHsgcmV0dXJuIHRvdGFsT2Zmc2V0cyArPSAoaXNQcmVzZW50KHN0ZXAub2Zmc2V0KSA/IDEgOiAwKTsgfSk7XG4gICAgICBpZiAodG90YWxPZmZzZXRzID4gMCAmJiB0b3RhbE9mZnNldHMgPCB0b3RhbEVudHJpZXMpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChuZXcgQW5pbWF0aW9uUGFyc2VFcnJvcihcIk5vdCBhbGwgc3R5bGUoKSBlbnRyaWVzIGNvbnRhaW4gYW4gb2Zmc2V0IGZvciB0aGUgcHJvdmlkZWQga2V5ZnJhbWUoKVwiKSk7XG4gICAgICAgICAgdG90YWxPZmZzZXRzID0gdG90YWxFbnRyaWVzO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGltaXQgPSB0b3RhbEVudHJpZXMgLSAxO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWFyZ2luID0gdG90YWxPZmZzZXRzID09IDAgPyAoMSAvIGxpbWl0KSA6IDA7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByYXdLZXlmcmFtZXMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gMDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRvU29ydEtleWZyYW1lcyA9IGZhbHNlO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGFzdE9mZnNldCA9IDA7XG4gICAgICBrZXlmcmFtZVNlcXVlbmNlLnN0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlTWV0YWRhdGEpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvZmZzZXQgPSBzdHlsZU1ldGFkYXRhLm9mZnNldDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlmcmFtZVN0eWxlcyA9IHt9O1xuICAgICAgICAgIHN0eWxlTWV0YWRhdGEuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVudHJ5KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSAnb2Zmc2V0Jykge1xuICAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lU3R5bGVzW3Byb3BdID0gKChlbnRyeSkpW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KG9mZnNldCkpIHtcbiAgICAgICAgICAgICAgZG9Tb3J0S2V5ZnJhbWVzID0gZG9Tb3J0S2V5ZnJhbWVzIHx8IChvZmZzZXQgPCBsYXN0T2Zmc2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGluZGV4ID09IGxpbWl0ID8gX1RFUk1JTkFMX0tFWUZSQU1FIDogKG1hcmdpbiAqIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmF3S2V5ZnJhbWVzLnB1c2goW29mZnNldCwga2V5ZnJhbWVTdHlsZXNdKTtcbiAgICAgICAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICB9KTtcbiAgICAgIGlmIChkb1NvcnRLZXlmcmFtZXMpIHtcbiAgICAgICAgICByYXdLZXlmcmFtZXMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSA8PSBiWzBdID8gLTEgOiAxOyB9KTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpcnN0S2V5ZnJhbWUgPSByYXdLZXlmcmFtZXNbMF07XG4gICAgICBpZiAoZmlyc3RLZXlmcmFtZVswXSAhPSBfSU5JVElBTF9LRVlGUkFNRSkge1xuICAgICAgICAgIHJhd0tleWZyYW1lcy5zcGxpY2UoMCwgMCwgZmlyc3RLZXlmcmFtZSA9IFtfSU5JVElBTF9LRVlGUkFNRSwge31dKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpcnN0S2V5ZnJhbWVTdHlsZXMgPSBmaXJzdEtleWZyYW1lWzFdO1xuICAgICAgbGltaXQgPSByYXdLZXlmcmFtZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3RLZXlmcmFtZSA9IHJhd0tleWZyYW1lc1tsaW1pdF07XG4gICAgICBpZiAobGFzdEtleWZyYW1lWzBdICE9IF9URVJNSU5BTF9LRVlGUkFNRSkge1xuICAgICAgICAgIHJhd0tleWZyYW1lcy5wdXNoKGxhc3RLZXlmcmFtZSA9IFtfVEVSTUlOQUxfS0VZRlJBTUUsIHt9XSk7XG4gICAgICAgICAgbGltaXQrKztcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3RLZXlmcmFtZVN0eWxlcyA9IGxhc3RLZXlmcmFtZVsxXTtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDE7IGkgPD0gbGltaXQ7IGkrKykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJ5ID0gcmF3S2V5ZnJhbWVzW2ldO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlcyA9IGVudHJ5WzFdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICBpZiAoIWlzUHJlc2VudChmaXJzdEtleWZyYW1lU3R5bGVzW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgZmlyc3RLZXlmcmFtZVN0eWxlc1twcm9wXSA9IEZJTExfU1RZTEVfRkxBRztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW50cnkgPSByYXdLZXlmcmFtZXNbaV07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzID0gZW50cnlbMV07XG4gICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgIGlmICghaXNQcmVzZW50KGxhc3RLZXlmcmFtZVN0eWxlc1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgIGxhc3RLZXlmcmFtZVN0eWxlc1twcm9wXSA9IHN0eWxlc1twcm9wXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IGxpbWl0IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJhd0tleWZyYW1lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBuZXcgQW5pbWF0aW9uS2V5ZnJhbWVBc3QoZW50cnlbMF0sIG5ldyBBbmltYXRpb25TdHlsZXNBc3QoW2VudHJ5WzFdXSkpOyB9KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbnRyeVxuICAgKiBAcGFyYW0gez99IGN1cnJlbnRUaW1lXG4gICAqIEBwYXJhbSB7P30gY29sbGVjdGVkU3R5bGVzXG4gICAqIEBwYXJhbSB7P30gc3RhdGVTdHlsZXNcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9wYXJzZVRyYW5zaXRpb25BbmltYXRpb24oZW50cnksIGN1cnJlbnRUaW1lLCBjb2xsZWN0ZWRTdHlsZXMsIHN0YXRlU3R5bGVzLCBlcnJvcnMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFzdDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXlUaW1lID0gMDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0aW5nVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgQ29tcGlsZUFuaW1hdGlvbldpdGhTdGVwc01ldGFkYXRhKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF4RHVyYXRpb25fMSA9IDA7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RlcHNfMSA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzR3JvdXBfMSA9IGVudHJ5IGluc3RhbmNlb2YgQ29tcGlsZUFuaW1hdGlvbkdyb3VwTWV0YWRhdGE7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJldmlvdXNTdHlsZXNfMTtcbiAgICAgICAgICBlbnRyeS5zdGVwcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAvLyB0aGVzZSB3aWxsIGdldCBwaWNrZWQgdXAgYnkgdGhlIG5leHQgc3RlcC4uLlxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0aW1lID0gaXNHcm91cF8xID8gc3RhcnRpbmdUaW1lIDogY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIENvbXBpbGVBbmltYXRpb25TdHlsZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICBlbnRyeS5zdHlsZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVzRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB3ZSBvbmx5IGhhdmUgc3RyaW5nbWFwIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hcCA9IChzdHlsZXNFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7IGNvbGxlY3RlZFN0eWxlcy5pbnNlcnRBdFRpbWUocHJvcCwgdGltZSwgbWFwW3Byb3BdKTsgfSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzU3R5bGVzXzEgPSBlbnRyeS5zdHlsZXM7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5uZXJBc3QgPSBfcGFyc2VUcmFuc2l0aW9uQW5pbWF0aW9uKGVudHJ5LCB0aW1lLCBjb2xsZWN0ZWRTdHlsZXMsIHN0YXRlU3R5bGVzLCBlcnJvcnMpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHByZXZpb3VzU3R5bGVzXzEpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydGluZ1N0eWxlcyA9IG5ldyBBbmltYXRpb25TdHlsZXNBc3QocHJldmlvdXNTdHlsZXNfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgc3RlcHNfMS5wdXNoKG5ldyBBbmltYXRpb25TdGVwQXN0KHN0YXJ0aW5nU3R5bGVzLCBbXSwgMCwgMCwgJycpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlubmVyU3RlcCA9IChpbm5lckFzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgKF9hID0gaW5uZXJTdGVwLnN0YXJ0aW5nU3R5bGVzLnN0eWxlcykucHVzaC5hcHBseShfYSwgcHJldmlvdXNTdHlsZXNfMSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBwcmV2aW91c1N0eWxlc18xID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhc3REdXJhdGlvbiA9IGlubmVyQXN0LnBsYXlUaW1lO1xuICAgICAgICAgICAgICBjdXJyZW50VGltZSArPSBhc3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgcGxheVRpbWUgKz0gYXN0RHVyYXRpb247XG4gICAgICAgICAgICAgIG1heER1cmF0aW9uXzEgPSBNYXRoLm1heChhc3REdXJhdGlvbiwgbWF4RHVyYXRpb25fMSk7XG4gICAgICAgICAgICAgIHN0ZXBzXzEucHVzaChpbm5lckFzdCk7XG4gICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHByZXZpb3VzU3R5bGVzXzEpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0aW5nU3R5bGVzID0gbmV3IEFuaW1hdGlvblN0eWxlc0FzdChwcmV2aW91c1N0eWxlc18xKTtcbiAgICAgICAgICAgICAgc3RlcHNfMS5wdXNoKG5ldyBBbmltYXRpb25TdGVwQXN0KHN0YXJ0aW5nU3R5bGVzLCBbXSwgMCwgMCwgJycpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzR3JvdXBfMSkge1xuICAgICAgICAgICAgICBhc3QgPSBuZXcgQW5pbWF0aW9uR3JvdXBBc3Qoc3RlcHNfMSk7XG4gICAgICAgICAgICAgIHBsYXlUaW1lID0gbWF4RHVyYXRpb25fMTtcbiAgICAgICAgICAgICAgY3VycmVudFRpbWUgPSBzdGFydGluZ1RpbWUgKyBwbGF5VGltZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGFzdCA9IG5ldyBBbmltYXRpb25TZXF1ZW5jZUFzdChzdGVwc18xKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbnRyeSBpbnN0YW5jZW9mIENvbXBpbGVBbmltYXRpb25BbmltYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0aW1pbmdzID0gX3BhcnNlVGltZUV4cHJlc3Npb24oZW50cnkudGltaW5ncywgZXJyb3JzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZXMgPSBlbnRyeS5zdHlsZXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ZnJhbWVzID0gdm9pZCAwO1xuICAgICAgICAgIGlmIChzdHlsZXMgaW5zdGFuY2VvZiBDb21waWxlQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YSkge1xuICAgICAgICAgICAgICBrZXlmcmFtZXMgPVxuICAgICAgICAgICAgICAgICAgX3BhcnNlQW5pbWF0aW9uS2V5ZnJhbWVzKHN0eWxlcywgY3VycmVudFRpbWUsIGNvbGxlY3RlZFN0eWxlcywgc3RhdGVTdHlsZXMsIGVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZURhdGEgPSAoc3R5bGVzKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2Zmc2V0ID0gX1RFUk1JTkFMX0tFWUZSQU1FO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZUFzdCA9IG5ldyBBbmltYXRpb25TdHlsZXNBc3QoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGVEYXRhLnN0eWxlcykpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlmcmFtZSA9IG5ldyBBbmltYXRpb25LZXlmcmFtZUFzdChvZmZzZXQsIHN0eWxlQXN0KTtcbiAgICAgICAgICAgICAga2V5ZnJhbWVzID0gW2tleWZyYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXN0ID0gbmV3IEFuaW1hdGlvblN0ZXBBc3QobmV3IEFuaW1hdGlvblN0eWxlc0FzdChbXSksIGtleWZyYW1lcywgdGltaW5ncy5kdXJhdGlvbiwgdGltaW5ncy5kZWxheSwgdGltaW5ncy5lYXNpbmcpO1xuICAgICAgICAgIHBsYXlUaW1lID0gdGltaW5ncy5kdXJhdGlvbiArIHRpbWluZ3MuZGVsYXk7XG4gICAgICAgICAgY3VycmVudFRpbWUgKz0gcGxheVRpbWU7XG4gICAgICAgICAga2V5ZnJhbWVzLmZvckVhY2goZnVuY3Rpb24gKGtleWZyYW1lIC8qKiBUT0RPICM5MTAwICovKSB7IHJldHVybiBrZXlmcmFtZS5zdHlsZXMuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5IC8qKiBUT0RPICM5MTAwICovKSB7IHJldHVybiBPYmplY3Qua2V5cyhlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeyBjb2xsZWN0ZWRTdHlsZXMuaW5zZXJ0QXRUaW1lKHByb3AsIGN1cnJlbnRUaW1lLCBlbnRyeVtwcm9wXSk7IH0pOyB9KTsgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBpZiB0aGUgY29kZSByZWFjaGVzIHRoaXMgc3RhZ2UgdGhlbiBhbiBlcnJvclxuICAgICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gcG9wdWxhdGVkIHdpdGhpbiB0aGUgX25vcm1hbGl6ZVN0eWxlU3RlcHMoKVxuICAgICAgICAgIC8vIG9wZXJhdGlvbi4uLlxuICAgICAgICAgIGFzdCA9IG5ldyBBbmltYXRpb25TdGVwQXN0KG51bGwsIFtdLCAwLCAwLCAnJyk7XG4gICAgICB9XG4gICAgICBhc3QucGxheVRpbWUgPSBwbGF5VGltZTtcbiAgICAgIGFzdC5zdGFydFRpbWUgPSBzdGFydGluZ1RpbWU7XG4gICAgICByZXR1cm4gYXN0O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFzdFxuICAgKiBAcGFyYW0gez99IGNvbGxlY3RlZFN0eWxlc1xuICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2ZpbGxBbmltYXRpb25Bc3RTdGFydGluZ0tleWZyYW1lcyhhc3QsIGNvbGxlY3RlZFN0eWxlcywgZXJyb3JzKSB7XG4gICAgICAvLyBzdGVwcyB0aGF0IG9ubHkgY29udGFpbiBzdHlsZSB3aWxsIG5vdCBiZSBmaWxsZWRcbiAgICAgIGlmICgoYXN0IGluc3RhbmNlb2YgQW5pbWF0aW9uU3RlcEFzdCkgJiYgYXN0LmtleWZyYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ZnJhbWVzID0gYXN0LmtleWZyYW1lcztcbiAgICAgICAgICBpZiAoa2V5ZnJhbWVzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVuZEtleWZyYW1lID0ga2V5ZnJhbWVzWzBdO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydEtleWZyYW1lID0gX2NyZWF0ZVN0YXJ0S2V5ZnJhbWVGcm9tRW5kS2V5ZnJhbWUoZW5kS2V5ZnJhbWUsIGFzdC5zdGFydFRpbWUsIGFzdC5wbGF5VGltZSwgY29sbGVjdGVkU3R5bGVzLCBlcnJvcnMpO1xuICAgICAgICAgICAgICBhc3Qua2V5ZnJhbWVzID0gW3N0YXJ0S2V5ZnJhbWUsIGVuZEtleWZyYW1lXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhc3QgaW5zdGFuY2VvZiBBbmltYXRpb25XaXRoU3RlcHNBc3QpIHtcbiAgICAgICAgICBhc3Quc3RlcHMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIF9maWxsQW5pbWF0aW9uQXN0U3RhcnRpbmdLZXlmcmFtZXMoZW50cnksIGNvbGxlY3RlZFN0eWxlcywgZXJyb3JzKTsgfSk7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZXhwXG4gICAqIEBwYXJhbSB7P30gZXJyb3JzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcGFyc2VUaW1lRXhwcmVzc2lvbihleHAsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVnZXggPSAvXihbXFwuXFxkXSspKG0/cykoPzpcXHMrKFtcXC5cXGRdKykobT9zKSk/KD86XFxzKyhbLWEtel0rKD86XFwoLis/XFwpKT8pKT8vaTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGR1cmF0aW9uO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVsYXkgPSAwO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWFzaW5nID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgZXhwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoZXMgPSBleHAubWF0Y2gocmVnZXgpO1xuICAgICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBBbmltYXRpb25QYXJzZUVycm9yKFwiVGhlIHByb3ZpZGVkIHRpbWluZyB2YWx1ZSBcXFwiXCIgKyBleHAgKyBcIlxcXCIgaXMgaW52YWxpZC5cIikpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IF9BbmltYXRpb25UaW1pbmdzKDAsIDAsIG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkdXJhdGlvbk1hdGNoID0gcGFyc2VGbG9hdChtYXRjaGVzWzFdKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkdXJhdGlvblVuaXQgPSBtYXRjaGVzWzJdO1xuICAgICAgICAgIGlmIChkdXJhdGlvblVuaXQgPT0gJ3MnKSB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uTWF0Y2ggKj0gX09ORV9TRUNPTkQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGR1cmF0aW9uID0gTWF0aC5mbG9vcihkdXJhdGlvbk1hdGNoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWxheU1hdGNoID0gbWF0Y2hlc1szXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWxheVVuaXQgPSBtYXRjaGVzWzRdO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGVsYXlNYXRjaCkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVsYXlWYWwgPSBwYXJzZUZsb2F0KGRlbGF5TWF0Y2gpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGRlbGF5VW5pdCkgJiYgZGVsYXlVbml0ID09ICdzJykge1xuICAgICAgICAgICAgICAgICAgZGVsYXlWYWwgKj0gX09ORV9TRUNPTkQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVsYXkgPSBNYXRoLmZsb29yKGRlbGF5VmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWFzaW5nVmFsID0gbWF0Y2hlc1s1XTtcbiAgICAgICAgICBpZiAoIWlzQmxhbmsoZWFzaW5nVmFsKSkge1xuICAgICAgICAgICAgICBlYXNpbmcgPSBlYXNpbmdWYWw7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgZHVyYXRpb24gPSAoZXhwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgX0FuaW1hdGlvblRpbWluZ3MoZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGVuZEtleWZyYW1lXG4gICAqIEBwYXJhbSB7P30gc3RhcnRUaW1lXG4gICAqIEBwYXJhbSB7P30gZHVyYXRpb25cbiAgICogQHBhcmFtIHs/fSBjb2xsZWN0ZWRTdHlsZXNcbiAgICogQHBhcmFtIHs/fSBlcnJvcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9jcmVhdGVTdGFydEtleWZyYW1lRnJvbUVuZEtleWZyYW1lKGVuZEtleWZyYW1lLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBjb2xsZWN0ZWRTdHlsZXMsIGVycm9ycykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWVzID0ge307XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbmRUaW1lID0gc3RhcnRUaW1lICsgZHVyYXRpb247XG4gICAgICBlbmRLZXlmcmFtZS5zdHlsZXMuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlRGF0YSkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlRGF0YSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWwgPSBzdHlsZURhdGFbcHJvcF07XG4gICAgICAgICAgICAgIGlmIChwcm9wID09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHRJbmRleCA9IGNvbGxlY3RlZFN0eWxlcy5pbmRleE9mQXRPckJlZm9yZVRpbWUocHJvcCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0RW50cnkgLyoqIFRPRE8gIzkxMDAgKi8sIC8qKiBAdHlwZSB7P30gKi8gbmV4dEVudHJ5IC8qKiBUT0RPICM5MTAwICovLCAvKiogQHR5cGUgez99ICovIHZhbHVlO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHJlc3VsdEluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkgPSBjb2xsZWN0ZWRTdHlsZXMuZ2V0QnlJbmRleChwcm9wLCByZXN1bHRJbmRleCk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdEVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gY29sbGVjdGVkU3R5bGVzLmdldEJ5SW5kZXgocHJvcCwgcmVzdWx0SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBmbGFnIHRoYXQgdGhlIHJ1bnRpbWUgY29kZSB1c2VzIHRvIHBhc3NcbiAgICAgICAgICAgICAgICAgIC8vIGluIGEgdmFsdWUgZWl0aGVyIGZyb20gdGhlIHN0YXRlIGRlY2xhcmF0aW9uIHN0eWxlc1xuICAgICAgICAgICAgICAgICAgLy8gb3IgdXNpbmcgdGhlIEFVVE9fU1RZTEUgdmFsdWUgKGUuZy4gZ2V0Q29tcHV0ZWRTdHlsZSlcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gRklMTF9TVFlMRV9GTEFHO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQobmV4dEVudHJ5KSAmJiAhbmV4dEVudHJ5Lm1hdGNoZXMoZW5kVGltZSwgdmFsKSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEFuaW1hdGlvblBhcnNlRXJyb3IoXCJUaGUgYW5pbWF0ZWQgQ1NTIHByb3BlcnR5IFxcXCJcIiArIHByb3AgKyBcIlxcXCIgdW5leHBlY3RlZGx5IGNoYW5nZXMgYmV0d2VlbiBzdGVwcyBcXFwiXCIgKyByZXN1bHRFbnRyeS50aW1lICsgXCJtc1xcXCIgYW5kIFxcXCJcIiArIGVuZFRpbWUgKyBcIm1zXFxcIiBhdCBcXFwiXCIgKyBuZXh0RW50cnkudGltZSArIFwibXNcXFwiXCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXNbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25LZXlmcmFtZUFzdChfSU5JVElBTF9LRVlGUkFNRSwgbmV3IEFuaW1hdGlvblN0eWxlc0FzdChbdmFsdWVzXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqICBBbiBpbnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgZG9jdW1lbnRzIGJ5IFVSTCB0aGF0IHRoZSBjb21waWxlciB1c2VzXG4gICAgKiB0byBsb2FkIHRlbXBsYXRlcy5cbiAgICovXG4gIHZhciBSZXNvdXJjZUxvYWRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBSZXNvdXJjZUxvYWRlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlc291cmNlTG9hZGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodXJsKSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgcmV0dXJuIFJlc291cmNlTG9hZGVyO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkNiA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQ2ID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICAvKipcbiAgICogIENyZWF0ZSBhIHtAbGluayBVcmxSZXNvbHZlcn0gd2l0aCBubyBwYWNrYWdlIHByZWZpeC5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVVybFJlc29sdmVyV2l0aG91dFBhY2thZ2VQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gbmV3IFVybFJlc29sdmVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVPZmZsaW5lQ29tcGlsZVVybFJlc29sdmVyKCkge1xuICAgICAgcmV0dXJuIG5ldyBVcmxSZXNvbHZlcignLicpO1xuICB9XG4gIC8qKlxuICAgKiBBIGRlZmF1bHQgcHJvdmlkZXIgZm9yIHtAbGluayBQQUNLQUdFX1JPT1RfVVJMfSB0aGF0IG1hcHMgdG8gJy8nLlxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUiA9IHtcbiAgICAgIHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuUEFDS0FHRV9ST09UX1VSTCxcbiAgICAgIHVzZVZhbHVlOiAnLydcbiAgfTtcbiAgLyoqXG4gICAqICBVc2VkIGJ5IHRoZSB7QGxpbmsgQ29tcGlsZXJ9IHdoZW4gcmVzb2x2aW5nIEhUTUwgYW5kIENTUyB0ZW1wbGF0ZSBVUkxzLlxuICAgICogKlxuICAgICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gICAgKiAqXG4gICAgKiBTZWUge0BsaW5rIENvbXBpbGVyfVxuICAgICogKlxuICAgICogIyMgRXhhbXBsZVxuICAgICogKlxuICAgICoge0BleGFtcGxlIGNvbXBpbGVyL3RzL3VybF9yZXNvbHZlci91cmxfcmVzb2x2ZXIudHMgcmVnaW9uPSd1cmxfcmVzb2x2ZXInfVxuICAgICogKlxuICAgICogZW5zdXJlIHRoYXQgdGhlIGVudGlyZSB0ZW1wbGF0ZSBjb21lcyBmcm9tIGEgdHJ1c3RlZCBzb3VyY2UuXG4gICAgKiBBdHRhY2tlci1jb250cm9sbGVkIGRhdGEgaW50cm9kdWNlZCBieSBhIHRlbXBsYXRlIGNvdWxkIGV4cG9zZSB5b3VyXG4gICAgKiBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuIEZvciBtb3JlIGRldGFpbCwgc2VlIHRoZSBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS5cbiAgICovXG4gIHZhciBVcmxSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IF9wYWNrYWdlUHJlZml4XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFVybFJlc29sdmVyKF9wYWNrYWdlUHJlZml4KSB7XG4gICAgICAgICAgaWYgKF9wYWNrYWdlUHJlZml4ID09PSB2b2lkIDApIHsgX3BhY2thZ2VQcmVmaXggPSBudWxsOyB9XG4gICAgICAgICAgdGhpcy5fcGFja2FnZVByZWZpeCA9IF9wYWNrYWdlUHJlZml4O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgUmVzb2x2ZXMgdGhlIGB1cmxgIGdpdmVuIHRoZSBgYmFzZVVybGA6XG4gICAgICAgICogLSB3aGVuIHRoZSBgdXJsYCBpcyBudWxsLCB0aGUgYGJhc2VVcmxgIGlzIHJldHVybmVkLFxuICAgICAgICAqIC0gaWYgYHVybGAgaXMgcmVsYXRpdmUgKCdwYXRoL3RvL2hlcmUnLCAnLi9wYXRoL3RvL2hlcmUnKSwgdGhlIHJlc29sdmVkIHVybCBpcyBhIGNvbWJpbmF0aW9uIG9mXG4gICAgICAgICogYGJhc2VVcmxgIGFuZCBgdXJsYCxcbiAgICAgICAgKiAtIGlmIGB1cmxgIGlzIGFic29sdXRlIChpdCBoYXMgYSBzY2hlbWU6ICdodHRwOi8vJywgJ2h0dHBzOi8vJyBvciBzdGFydCB3aXRoICcvJyksIHRoZSBgdXJsYCBpc1xuICAgICAgICAqIHJldHVybmVkIGFzIGlzIChpZ25vcmluZyB0aGUgYGJhc2VVcmxgKVxuICAgICAgICogQHBhcmFtIHs/fSBiYXNlVXJsXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVXJsUmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAoYmFzZVVybCwgdXJsKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRVcmwgPSB1cmw7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChiYXNlVXJsKSAmJiBiYXNlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRVcmwgPSBfcmVzb2x2ZVVybChiYXNlVXJsLCByZXNvbHZlZFVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVkUGFydHMgPSBfc3BsaXQocmVzb2x2ZWRVcmwpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZWZpeCA9IHRoaXMuX3BhY2thZ2VQcmVmaXg7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChwcmVmaXgpICYmIGlzUHJlc2VudChyZXNvbHZlZFBhcnRzKSAmJlxuICAgICAgICAgICAgICByZXNvbHZlZFBhcnRzW19Db21wb25lbnRJbmRleC5TY2hlbWVdID09ICdwYWNrYWdlJykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXRoID0gcmVzb2x2ZWRQYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBcIi9cIiArIHBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXNvbHZlZFVybDtcbiAgICAgIH07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIFVybFJlc29sdmVyLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdCwgYXJnczogW19hbmd1bGFyX2NvcmUuUEFDS0FHRV9ST09UX1VSTCxdIH0sXSB9LFxuICAgICAgXTsgfTtcbiAgICAgIFVybFJlc29sdmVyID0gX19kZWNvcmF0ZSQ2KFtcbiAgICAgICAgICBDb21waWxlckluamVjdGFibGUoKSwgXG4gICAgICAgICAgX19tZXRhZGF0YSQ2KCdkZXNpZ246cGFyYW10eXBlcycsIFtTdHJpbmddKVxuICAgICAgXSwgVXJsUmVzb2x2ZXIpO1xuICAgICAgcmV0dXJuIFVybFJlc29sdmVyO1xuICB9KCkpO1xuICAvKipcbiAgICogIEV4dHJhY3QgdGhlIHNjaGVtZSBvZiBhIFVSTC5cbiAgICogQHBhcmFtIHs/fSB1cmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFVybFNjaGVtZSh1cmwpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoID0gX3NwbGl0KHVybCk7XG4gICAgICByZXR1cm4gKG1hdGNoICYmIG1hdGNoW19Db21wb25lbnRJbmRleC5TY2hlbWVdKSB8fCAnJztcbiAgfVxuICAvKipcbiAgICogIEJ1aWxkcyBhIFVSSSBzdHJpbmcgZnJvbSBhbHJlYWR5LWVuY29kZWQgcGFydHMuXG4gICAgKiAqXG4gICAgKiBObyBlbmNvZGluZyBpcyBwZXJmb3JtZWQuICBBbnkgY29tcG9uZW50IG1heSBiZSBvbWl0dGVkIGFzIGVpdGhlciBudWxsIG9yXG4gICAgKiB1bmRlZmluZWQuXG4gICAgKiAqXG4gICAqIEBwYXJhbSB7Pz19IG9wdF9zY2hlbWUgVGhlIHNjaGVtZSBzdWNoIGFzICdodHRwJy5cbiAgICogQHBhcmFtIHs/PX0gb3B0X3VzZXJJbmZvIFRoZSB1c2VyIG5hbWUgYmVmb3JlIHRoZSAnQCcuXG4gICAqIEBwYXJhbSB7Pz19IG9wdF9kb21haW4gVGhlIGRvbWFpbiBzdWNoIGFzICd3d3cuZ29vZ2xlLmNvbScsIGFscmVhZHlcbiAgICAqIFVSSS1lbmNvZGVkLlxuICAgKiBAcGFyYW0gez89fSBvcHRfcG9ydCBUaGUgcG9ydCBudW1iZXIuXG4gICAqIEBwYXJhbSB7Pz19IG9wdF9wYXRoIFRoZSBwYXRoLCBhbHJlYWR5IFVSSS1lbmNvZGVkLiAgSWYgaXQgaXMgbm90XG4gICAgKiBlbXB0eSwgaXQgbXVzdCBiZWdpbiB3aXRoIGEgc2xhc2guXG4gICAqIEBwYXJhbSB7Pz19IG9wdF9xdWVyeURhdGEgVGhlIFVSSS1lbmNvZGVkIHF1ZXJ5IGRhdGEuXG4gICAqIEBwYXJhbSB7Pz19IG9wdF9mcmFnbWVudCBUaGUgVVJJLWVuY29kZWQgZnJhZ21lbnQgaWRlbnRpZmllci5cbiAgICogQHJldHVybiB7P30gVGhlIGZ1bGx5IGNvbWJpbmVkIFVSSS5cbiAgICovXG4gIGZ1bmN0aW9uIF9idWlsZEZyb21FbmNvZGVkUGFydHMob3B0X3NjaGVtZSwgb3B0X3VzZXJJbmZvLCBvcHRfZG9tYWluLCBvcHRfcG9ydCwgb3B0X3BhdGgsIG9wdF9xdWVyeURhdGEsIG9wdF9mcmFnbWVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3V0ID0gW107XG4gICAgICBpZiAoaXNQcmVzZW50KG9wdF9zY2hlbWUpKSB7XG4gICAgICAgICAgb3V0LnB1c2gob3B0X3NjaGVtZSArICc6Jyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG9wdF9kb21haW4pKSB7XG4gICAgICAgICAgb3V0LnB1c2goJy8vJyk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChvcHRfdXNlckluZm8pKSB7XG4gICAgICAgICAgICAgIG91dC5wdXNoKG9wdF91c2VySW5mbyArICdAJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dC5wdXNoKG9wdF9kb21haW4pO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQob3B0X3BvcnQpKSB7XG4gICAgICAgICAgICAgIG91dC5wdXNoKCc6JyArIG9wdF9wb3J0KTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG9wdF9wYXRoKSkge1xuICAgICAgICAgIG91dC5wdXNoKG9wdF9wYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQob3B0X3F1ZXJ5RGF0YSkpIHtcbiAgICAgICAgICBvdXQucHVzaCgnPycgKyBvcHRfcXVlcnlEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQob3B0X2ZyYWdtZW50KSkge1xuICAgICAgICAgIG91dC5wdXNoKCcjJyArIG9wdF9mcmFnbWVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0LmpvaW4oJycpO1xuICB9XG4gIC8qKlxuICAgKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYnJlYWtpbmcgYSBVUkkgaW50byBpdHMgY29tcG9uZW50IHBhcnRzLlxuICAgKlxuICAgKiB7QGxpbmsgaHR0cDovL3d3dy5nYml2LmNvbS9wcm90b2NvbHMvdXJpL3JmYy9yZmMzOTg2Lmh0bWwjUkZDMjIzNH0gc2F5c1xuICAgKiBBcyB0aGUgXCJmaXJzdC1tYXRjaC13aW5zXCIgYWxnb3JpdGhtIGlzIGlkZW50aWNhbCB0byB0aGUgXCJncmVlZHlcIlxuICAgKiBkaXNhbWJpZ3VhdGlvbiBtZXRob2QgdXNlZCBieSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLCBpdCBpcyBuYXR1cmFsIGFuZFxuICAgKiBjb21tb25wbGFjZSB0byB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgdGhlIHBvdGVudGlhbCBmaXZlXG4gICAqIGNvbXBvbmVudHMgb2YgYSBVUkkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYnJlYWtpbmctZG93biBhXG4gICAqIHdlbGwtZm9ybWVkIFVSSSByZWZlcmVuY2UgaW50byBpdHMgY29tcG9uZW50cy5cbiAgICpcbiAgICogPHByZT5cbiAgICogXigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIyguKikpP1xuICAgKiAgMTIgICAgICAgICAgICAzICA0ICAgICAgICAgIDUgICAgICAgNiAgNyAgICAgICAgOCA5XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUaGUgbnVtYmVycyBpbiB0aGUgc2Vjb25kIGxpbmUgYWJvdmUgYXJlIG9ubHkgdG8gYXNzaXN0IHJlYWRhYmlsaXR5OyB0aGV5XG4gICAqIGluZGljYXRlIHRoZSByZWZlcmVuY2UgcG9pbnRzIGZvciBlYWNoIHN1YmV4cHJlc3Npb24gKGkuZS4sIGVhY2ggcGFpcmVkXG4gICAqIHBhcmVudGhlc2lzKS4gV2UgcmVmZXIgdG8gdGhlIHZhbHVlIG1hdGNoZWQgZm9yIHN1YmV4cHJlc3Npb24gPG4+IGFzICQ8bj4uXG4gICAqIEZvciBleGFtcGxlLCBtYXRjaGluZyB0aGUgYWJvdmUgZXhwcmVzc2lvbiB0b1xuICAgKiA8cHJlPlxuICAgKiAgICAgaHR0cDovL3d3dy5pY3MudWNpLmVkdS9wdWIvaWV0Zi91cmkvI1JlbGF0ZWRcbiAgICogPC9wcmU+XG4gICAqIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBzdWJleHByZXNzaW9uIG1hdGNoZXM6XG4gICAqIDxwcmU+XG4gICAqICAgICQxID0gaHR0cDpcbiAgICogICAgJDIgPSBodHRwXG4gICAqICAgICQzID0gLy93d3cuaWNzLnVjaS5lZHVcbiAgICogICAgJDQgPSB3d3cuaWNzLnVjaS5lZHVcbiAgICogICAgJDUgPSAvcHViL2lldGYvdXJpL1xuICAgKiAgICAkNiA9IDx1bmRlZmluZWQ+XG4gICAqICAgICQ3ID0gPHVuZGVmaW5lZD5cbiAgICogICAgJDggPSAjUmVsYXRlZFxuICAgKiAgICAkOSA9IFJlbGF0ZWRcbiAgICogPC9wcmU+XG4gICAqIHdoZXJlIDx1bmRlZmluZWQ+IGluZGljYXRlcyB0aGF0IHRoZSBjb21wb25lbnQgaXMgbm90IHByZXNlbnQsIGFzIGlzIHRoZVxuICAgKiBjYXNlIGZvciB0aGUgcXVlcnkgY29tcG9uZW50IGluIHRoZSBhYm92ZSBleGFtcGxlLiBUaGVyZWZvcmUsIHdlIGNhblxuICAgKiBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBmaXZlIGNvbXBvbmVudHMgYXNcbiAgICogPHByZT5cbiAgICogICAgc2NoZW1lICAgID0gJDJcbiAgICogICAgYXV0aG9yaXR5ID0gJDRcbiAgICogICAgcGF0aCAgICAgID0gJDVcbiAgICogICAgcXVlcnkgICAgID0gJDdcbiAgICogICAgZnJhZ21lbnQgID0gJDlcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgdG8gZXhwb3NlIHRoZVxuICAgKiB1c2VySW5mbywgZG9tYWluLCBhbmQgcG9ydCBzZXBhcmF0ZWx5IGZyb20gdGhlIGF1dGhvcml0eS5cbiAgICogVGhlIG1vZGlmaWVkIHZlcnNpb24geWllbGRzXG4gICAqIDxwcmU+XG4gICAqICAgICQxID0gaHR0cCAgICAgICAgICAgICAgc2NoZW1lXG4gICAqICAgICQyID0gPHVuZGVmaW5lZD4gICAgICAgdXNlckluZm8gLVxcXG4gICAqICAgICQzID0gd3d3Lmljcy51Y2kuZWR1ICAgZG9tYWluICAgICB8IGF1dGhvcml0eVxuICAgKiAgICAkNCA9IDx1bmRlZmluZWQ+ICAgICAgIHBvcnQgICAgIC0vXG4gICAqICAgICQ1ID0gL3B1Yi9pZXRmL3VyaS8gICAgcGF0aFxuICAgKiAgICAkNiA9IDx1bmRlZmluZWQ+ICAgICAgIHF1ZXJ5IHdpdGhvdXQgP1xuICAgKiAgICAkNyA9IFJlbGF0ZWQgICAgICAgICAgIGZyYWdtZW50IHdpdGhvdXQgI1xuICAgKiA8L3ByZT5cbiAgICogQHR5cGUgeyFSZWdFeHB9XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3NwbGl0UmUgPSBuZXcgUmVnRXhwKCdeJyArXG4gICAgICAnKD86JyArXG4gICAgICAnKFteOi8/Iy5dKyknICtcbiAgICAgIC8vIHVzZWQgYnkgb3RoZXIgVVJMIHBhcnRzIHN1Y2ggYXMgOixcbiAgICAgIC8vID8sIC8sICMsIGFuZCAuXG4gICAgICAnOik/JyArXG4gICAgICAnKD86Ly8nICtcbiAgICAgICcoPzooW14vPyNdKilAKT8nICtcbiAgICAgICcoW1xcXFx3XFxcXGRcXFxcLVxcXFx1MDEwMC1cXFxcdWZmZmYuJV0qKScgK1xuICAgICAgLy8gZGlnaXRzLCBkYXNoZXMsIGRvdHMsIHBlcmNlbnRcbiAgICAgIC8vIGVzY2FwZXMsIGFuZCB1bmljb2RlIGNoYXJhY3RlcnMuXG4gICAgICAnKD86OihbMC05XSspKT8nICtcbiAgICAgICcpPycgK1xuICAgICAgJyhbXj8jXSspPycgK1xuICAgICAgJyg/OlxcXFw/KFteI10qKSk/JyArXG4gICAgICAnKD86IyguKikpPycgK1xuICAgICAgJyQnKTtcbiAgdmFyIF9Db21wb25lbnRJbmRleCA9IHt9O1xuICBfQ29tcG9uZW50SW5kZXguU2NoZW1lID0gMTtcbiAgX0NvbXBvbmVudEluZGV4LlVzZXJJbmZvID0gMjtcbiAgX0NvbXBvbmVudEluZGV4LkRvbWFpbiA9IDM7XG4gIF9Db21wb25lbnRJbmRleC5Qb3J0ID0gNDtcbiAgX0NvbXBvbmVudEluZGV4LlBhdGggPSA1O1xuICBfQ29tcG9uZW50SW5kZXguUXVlcnlEYXRhID0gNjtcbiAgX0NvbXBvbmVudEluZGV4LkZyYWdtZW50ID0gNztcbiAgX0NvbXBvbmVudEluZGV4W19Db21wb25lbnRJbmRleC5TY2hlbWVdID0gXCJTY2hlbWVcIjtcbiAgX0NvbXBvbmVudEluZGV4W19Db21wb25lbnRJbmRleC5Vc2VySW5mb10gPSBcIlVzZXJJbmZvXCI7XG4gIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXguRG9tYWluXSA9IFwiRG9tYWluXCI7XG4gIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXguUG9ydF0gPSBcIlBvcnRcIjtcbiAgX0NvbXBvbmVudEluZGV4W19Db21wb25lbnRJbmRleC5QYXRoXSA9IFwiUGF0aFwiO1xuICBfQ29tcG9uZW50SW5kZXhbX0NvbXBvbmVudEluZGV4LlF1ZXJ5RGF0YV0gPSBcIlF1ZXJ5RGF0YVwiO1xuICBfQ29tcG9uZW50SW5kZXhbX0NvbXBvbmVudEluZGV4LkZyYWdtZW50XSA9IFwiRnJhZ21lbnRcIjtcbiAgLyoqXG4gICAqICBTcGxpdHMgYSBVUkkgaW50byBpdHMgY29tcG9uZW50IHBhcnRzLlxuICAgICogKlxuICAgICogRWFjaCBjb21wb25lbnQgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgY29tcG9uZW50IGluZGljZXM7IGZvciBleGFtcGxlOlxuICAgICogPHByZT5cbiAgICAqIGdvb2cudXJpLnV0aWxzLnNwbGl0KHNvbWVTdHIpW2dvb2cudXJpLnV0aWxzLkNvbXBvbnRlbnRJbmRleC5RVUVSWV9EQVRBXTtcbiAgICAqIDwvcHJlPlxuICAgICogKlxuICAgKiBAcGFyYW0gez99IHVyaSBUaGUgVVJJIHN0cmluZyB0byBleGFtaW5lLlxuICAgKiBAcmV0dXJuIHs/fSBFYWNoIGNvbXBvbmVudCBzdGlsbCBVUkktZW5jb2RlZC5cbiAgICAqIEVhY2ggY29tcG9uZW50IHRoYXQgaXMgcHJlc2VudCB3aWxsIGNvbnRhaW4gdGhlIGVuY29kZWQgdmFsdWUsIHdoZXJlYXNcbiAgICAqIGNvbXBvbmVudHMgdGhhdCBhcmUgbm90IHByZXNlbnQgd2lsbCBiZSB1bmRlZmluZWQgb3IgZW1wdHksIGRlcGVuZGluZ1xuICAgICogb24gdGhlIGJyb3dzZXIncyByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uICBOZXZlciBudWxsLCBzaW5jZVxuICAgICogYXJiaXRyYXJ5IHN0cmluZ3MgbWF5IHN0aWxsIGxvb2sgbGlrZSBwYXRoIG5hbWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gX3NwbGl0KHVyaSkge1xuICAgICAgcmV0dXJuIHVyaS5tYXRjaChfc3BsaXRSZSk7XG4gIH1cbiAgLyoqXG4gICAqICBSZW1vdmVzIGRvdCBzZWdtZW50cyBpbiBnaXZlbiBwYXRoIGNvbXBvbmVudCwgYXMgZGVzY3JpYmVkIGluXG4gICAgKiBSRkMgMzk4Niwgc2VjdGlvbiA1LjIuNC5cbiAgICAqICpcbiAgICogQHBhcmFtIHs/fSBwYXRoIEEgbm9uLWVtcHR5IHBhdGggY29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHs/fSBQYXRoIGNvbXBvbmVudCB3aXRoIHJlbW92ZWQgZG90IHNlZ21lbnRzLlxuICAgKi9cbiAgZnVuY3Rpb24gX3JlbW92ZURvdFNlZ21lbnRzKHBhdGgpIHtcbiAgICAgIGlmIChwYXRoID09ICcvJylcbiAgICAgICAgICByZXR1cm4gJy8nO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGVhZGluZ1NsYXNoID0gcGF0aFswXSA9PSAnLycgPyAnLycgOiAnJztcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYWlsaW5nU2xhc2ggPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJyA/ICcvJyA6ICcnO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXQgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVwID0gMDtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gcG9zID0gMDsgcG9zIDwgc2VnbWVudHMubGVuZ3RoOyBwb3MrKykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlZ21lbnQgPSBzZWdtZW50c1twb3NdO1xuICAgICAgICAgIHN3aXRjaCAoc2VnbWVudCkge1xuICAgICAgICAgICAgICBjYXNlICcnOlxuICAgICAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICcuLic6XG4gICAgICAgICAgICAgICAgICBpZiAob3V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXQucG9wKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB1cCsrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBvdXQucHVzaChzZWdtZW50KTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGVhZGluZ1NsYXNoID09ICcnKSB7XG4gICAgICAgICAgd2hpbGUgKHVwLS0gPiAwKSB7XG4gICAgICAgICAgICAgIG91dC51bnNoaWZ0KCcuLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3V0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgb3V0LnB1c2goJy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWFkaW5nU2xhc2ggKyBvdXQuam9pbignLycpICsgdHJhaWxpbmdTbGFzaDtcbiAgfVxuICAvKipcbiAgICogIFRha2VzIGFuIGFycmF5IG9mIHRoZSBwYXJ0cyBmcm9tIHNwbGl0IGFuZCBjYW5vbmljYWxpemVzIHRoZSBwYXRoIHBhcnRcbiAgICAqIGFuZCB0aGVuIGpvaW5zIGFsbCB0aGUgcGFydHMuXG4gICAqIEBwYXJhbSB7P30gcGFydHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGF0aCA9IHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXTtcbiAgICAgIHBhdGggPSBpc0JsYW5rKHBhdGgpID8gJycgOiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCk7XG4gICAgICBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF0gPSBwYXRoO1xuICAgICAgcmV0dXJuIF9idWlsZEZyb21FbmNvZGVkUGFydHMocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0sIHBhcnRzW19Db21wb25lbnRJbmRleC5Vc2VySW5mb10sIHBhcnRzW19Db21wb25lbnRJbmRleC5Eb21haW5dLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUG9ydF0sIHBhdGgsIHBhcnRzW19Db21wb25lbnRJbmRleC5RdWVyeURhdGFdLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguRnJhZ21lbnRdKTtcbiAgfVxuICAvKipcbiAgICogIFJlc29sdmVzIGEgVVJMLlxuICAgKiBAcGFyYW0gez99IGJhc2UgVGhlIFVSTCBhY3RpbmcgYXMgdGhlIGJhc2UgVVJMLlxuICAgKiBAcGFyYW0gez99IHVybFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3Jlc29sdmVVcmwoYmFzZSwgdXJsKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IF9zcGxpdChlbmNvZGVVUkkodXJsKSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiYXNlUGFydHMgPSBfc3BsaXQoYmFzZSk7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcnRzW19Db21wb25lbnRJbmRleC5TY2hlbWVdKSkge1xuICAgICAgICAgIHJldHVybiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHMpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0gPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV07XG4gICAgICB9XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSBfQ29tcG9uZW50SW5kZXguU2NoZW1lOyBpIDw9IF9Db21wb25lbnRJbmRleC5Qb3J0OyBpKyspIHtcbiAgICAgICAgICBpZiAoaXNCbGFuayhwYXJ0c1tpXSkpIHtcbiAgICAgICAgICAgICAgcGFydHNbaV0gPSBiYXNlUGFydHNbaV07XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXVswXSA9PSAnLycpIHtcbiAgICAgICAgICByZXR1cm4gX2pvaW5BbmRDYW5vbmljYWxpemVQYXRoKHBhcnRzKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdO1xuICAgICAgaWYgKGlzQmxhbmsocGF0aCkpXG4gICAgICAgICAgcGF0aCA9ICcvJztcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkgKyBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gICAgICBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF0gPSBwYXRoO1xuICAgICAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2RlY29yYXRlJDUgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkNSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIERpcmVjdGl2ZU5vcm1hbGl6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9yZXNvdXJjZUxvYWRlclxuICAgICAgICogQHBhcmFtIHs/fSBfdXJsUmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX2h0bWxQYXJzZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZ1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBEaXJlY3RpdmVOb3JtYWxpemVyKF9yZXNvdXJjZUxvYWRlciwgX3VybFJlc29sdmVyLCBfaHRtbFBhcnNlciwgX2NvbmZpZykge1xuICAgICAgICAgIHRoaXMuX3Jlc291cmNlTG9hZGVyID0gX3Jlc291cmNlTG9hZGVyO1xuICAgICAgICAgIHRoaXMuX3VybFJlc29sdmVyID0gX3VybFJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX2h0bWxQYXJzZXIgPSBfaHRtbFBhcnNlcjtcbiAgICAgICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnO1xuICAgICAgICAgIHRoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUuY2xlYXIoKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub3JtYWxpemVkRGlyZWN0aXZlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKG5vcm1hbGl6ZWREaXJlY3RpdmUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICghbm9ybWFsaXplZERpcmVjdGl2ZS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWREaXJlY3RpdmUudGVtcGxhdGUudGVtcGxhdGVVcmwpO1xuICAgICAgICAgIG5vcm1hbGl6ZWREaXJlY3RpdmUudGVtcGxhdGUuZXh0ZXJuYWxTdHlsZXNoZWV0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZXNoZWV0KSB7IF90aGlzLl9yZXNvdXJjZUxvYWRlckNhY2hlLmRlbGV0ZShzdHlsZXNoZWV0Lm1vZHVsZVVybCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLl9mZXRjaCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLl9yZXNvdXJjZUxvYWRlckNhY2hlLmdldCh1cmwpO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX3Jlc291cmNlTG9hZGVyLmdldCh1cmwpO1xuICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZUxvYWRlckNhY2hlLnNldCh1cmwsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByZW5vcm1EYXRhXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5ub3JtYWxpemVUZW1wbGF0ZSA9IGZ1bmN0aW9uIChwcmVub3JtRGF0YSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9ybWFsaXplZFRlbXBsYXRlU3luYyA9IG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9ybWFsaXplZFRlbXBsYXRlQXN5bmM7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChwcmVub3JtRGF0YS50ZW1wbGF0ZSkpIHtcbiAgICAgICAgICAgICAgbm9ybWFsaXplZFRlbXBsYXRlU3luYyA9IHRoaXMubm9ybWFsaXplVGVtcGxhdGVTeW5jKHByZW5vcm1EYXRhKTtcbiAgICAgICAgICAgICAgbm9ybWFsaXplZFRlbXBsYXRlQXN5bmMgPSBQcm9taXNlLnJlc29sdmUobm9ybWFsaXplZFRlbXBsYXRlU3luYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHByZW5vcm1EYXRhLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRUZW1wbGF0ZUFzeW5jID0gdGhpcy5ub3JtYWxpemVUZW1wbGF0ZUFzeW5jKHByZW5vcm1EYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIk5vIHRlbXBsYXRlIHNwZWNpZmllZCBmb3IgY29tcG9uZW50IFwiICsgc3RyaW5naWZ5KHByZW5vcm1EYXRhLmNvbXBvbmVudFR5cGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZWRUZW1wbGF0ZVN5bmMgJiYgbm9ybWFsaXplZFRlbXBsYXRlU3luYy5zdHlsZVVybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIC8vIHN5bmMgY2FzZVxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN5bmNBc3luY1Jlc3VsdChub3JtYWxpemVkVGVtcGxhdGVTeW5jKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGFzeW5jIGNhc2VcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeW5jQXN5bmNSZXN1bHQobnVsbCwgbm9ybWFsaXplZFRlbXBsYXRlQXN5bmMudGhlbihmdW5jdGlvbiAobm9ybWFsaXplZFRlbXBsYXRlKSB7IHJldHVybiBfdGhpcy5ub3JtYWxpemVFeHRlcm5hbFN0eWxlc2hlZXRzKG5vcm1hbGl6ZWRUZW1wbGF0ZSk7IH0pKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByZW5vbURhdGFcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLm5vcm1hbGl6ZVRlbXBsYXRlU3luYyA9IGZ1bmN0aW9uIChwcmVub21EYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTG9hZGVkVGVtcGxhdGUocHJlbm9tRGF0YSwgcHJlbm9tRGF0YS50ZW1wbGF0ZSwgcHJlbm9tRGF0YS5tb2R1bGVVcmwpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcmVub21EYXRhXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5ub3JtYWxpemVUZW1wbGF0ZUFzeW5jID0gZnVuY3Rpb24gKHByZW5vbURhdGEpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlVXJsID0gdGhpcy5fdXJsUmVzb2x2ZXIucmVzb2x2ZShwcmVub21EYXRhLm1vZHVsZVVybCwgcHJlbm9tRGF0YS50ZW1wbGF0ZVVybCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoKHRlbXBsYXRlVXJsKVxuICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIF90aGlzLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlKHByZW5vbURhdGEsIHZhbHVlLCB0ZW1wbGF0ZVVybCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcmVub21EYXRhXG4gICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlXG4gICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlQWJzVXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5ub3JtYWxpemVMb2FkZWRUZW1wbGF0ZSA9IGZ1bmN0aW9uIChwcmVub21EYXRhLCB0ZW1wbGF0ZSwgdGVtcGxhdGVBYnNVcmwpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gSW50ZXJwb2xhdGlvbkNvbmZpZy5mcm9tQXJyYXkocHJlbm9tRGF0YS5pbnRlcnBvbGF0aW9uKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb290Tm9kZXNBbmRFcnJvcnMgPSB0aGlzLl9odG1sUGFyc2VyLnBhcnNlKHRlbXBsYXRlLCBzdHJpbmdpZnkocHJlbm9tRGF0YS5jb21wb25lbnRUeXBlKSwgZmFsc2UsIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgIGlmIChyb290Tm9kZXNBbmRFcnJvcnMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JTdHJpbmcgPSByb290Tm9kZXNBbmRFcnJvcnMuZXJyb3JzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJUZW1wbGF0ZSBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvclN0cmluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlTWV0YWRhdGFTdHlsZXMgPSB0aGlzLm5vcm1hbGl6ZVN0eWxlc2hlZXQobmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoe1xuICAgICAgICAgICAgICBzdHlsZXM6IHByZW5vbURhdGEuc3R5bGVzLFxuICAgICAgICAgICAgICBzdHlsZVVybHM6IHByZW5vbURhdGEuc3R5bGVVcmxzLFxuICAgICAgICAgICAgICBtb2R1bGVVcmw6IHByZW5vbURhdGEubW9kdWxlVXJsXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0b3IgPSBuZXcgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IoKTtcbiAgICAgICAgICB2aXNpdEFsbCh2aXNpdG9yLCByb290Tm9kZXNBbmRFcnJvcnMucm9vdE5vZGVzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZVN0eWxlcyA9IHRoaXMubm9ybWFsaXplU3R5bGVzaGVldChuZXcgQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSh7IHN0eWxlczogdmlzaXRvci5zdHlsZXMsIHN0eWxlVXJsczogdmlzaXRvci5zdHlsZVVybHMsIG1vZHVsZVVybDogdGVtcGxhdGVBYnNVcmwgfSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVuY2Fwc3VsYXRpb24gPSBwcmVub21EYXRhLmVuY2Fwc3VsYXRpb247XG4gICAgICAgICAgaWYgKGlzQmxhbmsoZW5jYXBzdWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbiA9IHRoaXMuX2NvbmZpZy5kZWZhdWx0RW5jYXBzdWxhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzID0gdGVtcGxhdGVNZXRhZGF0YVN0eWxlcy5zdHlsZXMuY29uY2F0KHRlbXBsYXRlU3R5bGVzLnN0eWxlcyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVVcmxzID0gdGVtcGxhdGVNZXRhZGF0YVN0eWxlcy5zdHlsZVVybHMuY29uY2F0KHRlbXBsYXRlU3R5bGVzLnN0eWxlVXJscyk7XG4gICAgICAgICAgaWYgKGVuY2Fwc3VsYXRpb24gPT09IF9hbmd1bGFyX2NvcmUuVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQgJiYgc3R5bGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICBzdHlsZVVybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24gPSBfYW5ndWxhcl9jb3JlLlZpZXdFbmNhcHN1bGF0aW9uLk5vbmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBlbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZUFic1VybCwgc3R5bGVzOiBzdHlsZXMsIHN0eWxlVXJsczogc3R5bGVVcmxzLFxuICAgICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IHZpc2l0b3IubmdDb250ZW50U2VsZWN0b3JzLFxuICAgICAgICAgICAgICBhbmltYXRpb25zOiBwcmVub21EYXRhLmFuaW1hdGlvbnMsXG4gICAgICAgICAgICAgIGludGVycG9sYXRpb246IHByZW5vbURhdGEuaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVNZXRhXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5ub3JtYWxpemVFeHRlcm5hbFN0eWxlc2hlZXRzID0gZnVuY3Rpb24gKHRlbXBsYXRlTWV0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9sb2FkTWlzc2luZ0V4dGVybmFsU3R5bGVzaGVldHModGVtcGxhdGVNZXRhLnN0eWxlVXJscylcbiAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGV4dGVybmFsU3R5bGVzaGVldHMpIHsgcmV0dXJuIG5ldyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IHRlbXBsYXRlTWV0YS5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVNZXRhLnRlbXBsYXRlLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogdGVtcGxhdGVNZXRhLnRlbXBsYXRlVXJsLFxuICAgICAgICAgICAgICBzdHlsZXM6IHRlbXBsYXRlTWV0YS5zdHlsZXMsXG4gICAgICAgICAgICAgIHN0eWxlVXJsczogdGVtcGxhdGVNZXRhLnN0eWxlVXJscyxcbiAgICAgICAgICAgICAgZXh0ZXJuYWxTdHlsZXNoZWV0czogZXh0ZXJuYWxTdHlsZXNoZWV0cyxcbiAgICAgICAgICAgICAgbmdDb250ZW50U2VsZWN0b3JzOiB0ZW1wbGF0ZU1ldGEubmdDb250ZW50U2VsZWN0b3JzLFxuICAgICAgICAgICAgICBhbmltYXRpb25zOiB0ZW1wbGF0ZU1ldGEuYW5pbWF0aW9ucyxcbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbjogdGVtcGxhdGVNZXRhLmludGVycG9sYXRpb25cbiAgICAgICAgICB9KTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlVXJsc1xuICAgICAgICogQHBhcmFtIHs/PX0gbG9hZGVkU3R5bGVzaGVldHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLl9sb2FkTWlzc2luZ0V4dGVybmFsU3R5bGVzaGVldHMgPSBmdW5jdGlvbiAoc3R5bGVVcmxzLCBsb2FkZWRTdHlsZXNoZWV0cykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKGxvYWRlZFN0eWxlc2hlZXRzID09PSB2b2lkIDApIHsgbG9hZGVkU3R5bGVzaGVldHMgPSBuZXcgTWFwKCk7IH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZVxuICAgICAgICAgICAgICAuYWxsKHN0eWxlVXJscy5maWx0ZXIoZnVuY3Rpb24gKHN0eWxlVXJsKSB7IHJldHVybiAhbG9hZGVkU3R5bGVzaGVldHMuaGFzKHN0eWxlVXJsKTsgfSlcbiAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoc3R5bGVVcmwpIHsgcmV0dXJuIF90aGlzLl9mZXRjaChzdHlsZVVybCkudGhlbihmdW5jdGlvbiAobG9hZGVkU3R5bGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzaGVldCA9IF90aGlzLm5vcm1hbGl6ZVN0eWxlc2hlZXQobmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBzdHlsZXM6IFtsb2FkZWRTdHlsZV0sIG1vZHVsZVVybDogc3R5bGVVcmwgfSkpO1xuICAgICAgICAgICAgICBsb2FkZWRTdHlsZXNoZWV0cy5zZXQoc3R5bGVVcmwsIHN0eWxlc2hlZXQpO1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2xvYWRNaXNzaW5nRXh0ZXJuYWxTdHlsZXNoZWV0cyhzdHlsZXNoZWV0LnN0eWxlVXJscywgbG9hZGVkU3R5bGVzaGVldHMpO1xuICAgICAgICAgIH0pOyB9KSlcbiAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKF8pIHsgcmV0dXJuIEFycmF5LmZyb20obG9hZGVkU3R5bGVzaGVldHMudmFsdWVzKCkpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzaGVldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlTm9ybWFsaXplci5wcm90b3R5cGUubm9ybWFsaXplU3R5bGVzaGVldCA9IGZ1bmN0aW9uIChzdHlsZXNoZWV0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbGxTdHlsZVVybHMgPSBzdHlsZXNoZWV0LnN0eWxlVXJscy5maWx0ZXIoaXNTdHlsZVVybFJlc29sdmFibGUpXG4gICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gX3RoaXMuX3VybFJlc29sdmVyLnJlc29sdmUoc3R5bGVzaGVldC5tb2R1bGVVcmwsIHVybCk7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFsbFN0eWxlcyA9IHN0eWxlc2hlZXQuc3R5bGVzLm1hcChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVXaXRoSW1wb3J0cyA9IGV4dHJhY3RTdHlsZVVybHMoX3RoaXMuX3VybFJlc29sdmVyLCBzdHlsZXNoZWV0Lm1vZHVsZVVybCwgc3R5bGUpO1xuICAgICAgICAgICAgICBhbGxTdHlsZVVybHMucHVzaC5hcHBseShhbGxTdHlsZVVybHMsIHN0eWxlV2l0aEltcG9ydHMuc3R5bGVVcmxzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlV2l0aEltcG9ydHMuc3R5bGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlU3R5bGVzaGVldE1ldGFkYXRhKHsgc3R5bGVzOiBhbGxTdHlsZXMsIHN0eWxlVXJsczogYWxsU3R5bGVVcmxzLCBtb2R1bGVVcmw6IHN0eWxlc2hlZXQubW9kdWxlVXJsIH0pO1xuICAgICAgfTtcbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIgPSBfX2RlY29yYXRlJDUoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhJDUoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW1Jlc291cmNlTG9hZGVyLCBVcmxSZXNvbHZlciwgSHRtbFBhcnNlciwgQ29tcGlsZXJDb25maWddKVxuICAgICAgXSwgRGlyZWN0aXZlTm9ybWFsaXplcik7XG4gICAgICByZXR1cm4gRGlyZWN0aXZlTm9ybWFsaXplcjtcbiAgfSgpKTtcbiAgdmFyIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yKCkge1xuICAgICAgICAgIHRoaXMubmdDb250ZW50U2VsZWN0b3JzID0gW107XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnN0eWxlVXJscyA9IFtdO1xuICAgICAgICAgIHRoaXMubmdOb25CaW5kYWJsZVN0YWNrQ291bnQgPSAwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoYXN0KTtcbiAgICAgICAgICBzd2l0Y2ggKHByZXBhcnNlZEVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFByZXBhcnNlZEVsZW1lbnRUeXBlLk5HX0NPTlRFTlQ6XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdDb250ZW50U2VsZWN0b3JzLnB1c2gocHJlcGFyc2VkRWxlbWVudC5zZWxlY3RBdHRyKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFOlxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGV4dENvbnRlbnRfMSA9ICcnO1xuICAgICAgICAgICAgICAgICAgYXN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudF8xICs9IGNoaWxkLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaCh0ZXh0Q29udGVudF8xKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVQ6XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlVXJscy5wdXNoKHByZXBhcnNlZEVsZW1lbnQuaHJlZkF0dHIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXBhcnNlZEVsZW1lbnQubm9uQmluZGFibGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2aXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICAgICAgICAgIHRoaXMubmdOb25CaW5kYWJsZVN0YWNrQ291bnQtLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgcmV0dXJuIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkNyA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQ3ID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICAvKlxuICAgKiBSZXNvbHZlIGEgYFR5cGVgIGZvciB7QGxpbmsgRGlyZWN0aXZlfS5cbiAgICpcbiAgICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB0byBjcmVhdGUgY3VzdG9tIGJlaGF2aW9yLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIENvbXBpbGVyfVxuICAgKi9cbiAgdmFyIERpcmVjdGl2ZVJlc29sdmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX3JlZmxlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBEaXJlY3RpdmVSZXNvbHZlcihfcmVmbGVjdG9yKSB7XG4gICAgICAgICAgaWYgKF9yZWZsZWN0b3IgPT09IHZvaWQgMCkgeyBfcmVmbGVjdG9yID0gcmVmbGVjdG9yOyB9XG4gICAgICAgICAgdGhpcy5fcmVmbGVjdG9yID0gX3JlZmxlY3RvcjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVSZXNvbHZlci5wcm90b3R5cGUuaXNEaXJlY3RpdmUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGVNZXRhZGF0YSA9IHRoaXMuX3JlZmxlY3Rvci5hbm5vdGF0aW9ucyhfYW5ndWxhcl9jb3JlLnJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgICByZXR1cm4gdHlwZU1ldGFkYXRhICYmIHR5cGVNZXRhZGF0YS5zb21lKGlzRGlyZWN0aXZlTWV0YWRhdGEpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFJldHVybiB7QGxpbmsgRGlyZWN0aXZlfSBmb3IgYSBnaXZlbiBgVHlwZWAuXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHRocm93SWZOb3RGb3VuZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlUmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAodHlwZSwgdGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCA9PT0gdm9pZCAwKSB7IHRocm93SWZOb3RGb3VuZCA9IHRydWU7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0eXBlTWV0YWRhdGEgPSB0aGlzLl9yZWZsZWN0b3IuYW5ub3RhdGlvbnMoX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZih0eXBlKSk7XG4gICAgICAgICAgaWYgKHR5cGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRhZGF0YSA9IExpc3RXcmFwcGVyLmZpbmRMYXN0KHR5cGVNZXRhZGF0YSwgaXNEaXJlY3RpdmVNZXRhZGF0YSk7XG4gICAgICAgICAgICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvcGVydHlNZXRhZGF0YSA9IHRoaXMuX3JlZmxlY3Rvci5wcm9wTWV0YWRhdGEodHlwZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YShtZXRhZGF0YSwgcHJvcGVydHlNZXRhZGF0YSwgdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBEaXJlY3RpdmUgYW5ub3RhdGlvbiBmb3VuZCBvbiBcIiArIHN0cmluZ2lmeSh0eXBlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkbVxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eU1ldGFkYXRhXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVJlc29sdmVyLnByb3RvdHlwZS5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YSA9IGZ1bmN0aW9uIChkbSwgcHJvcGVydHlNZXRhZGF0YSwgZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlucHV0cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dHB1dHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0ID0ge307XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcmllcyA9IHt9O1xuICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnR5TWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlucHV0ID0gTGlzdFdyYXBwZXIuZmluZExhc3QocHJvcGVydHlNZXRhZGF0YVtwcm9wTmFtZV0sIGZ1bmN0aW9uIChhKSB7IHJldHVybiBhIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5JbnB1dDsgfSk7XG4gICAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmJpbmRpbmdQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbnB1dHMucHVzaChwcm9wTmFtZSArIFwiOiBcIiArIGlucHV0LmJpbmRpbmdQcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5wdXRzLnB1c2gocHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dHB1dCA9IExpc3RXcmFwcGVyLmZpbmRMYXN0KHByb3BlcnR5TWV0YWRhdGFbcHJvcE5hbWVdLCBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuT3V0cHV0OyB9KTtcbiAgICAgICAgICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5iaW5kaW5nUHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHByb3BOYW1lICsgXCI6IFwiICsgb3V0cHV0LmJpbmRpbmdQcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0QmluZGluZ3MgPSBwcm9wZXJ0eU1ldGFkYXRhW3Byb3BOYW1lXS5maWx0ZXIoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEgJiYgYSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuSG9zdEJpbmRpbmc7IH0pO1xuICAgICAgICAgICAgICBob3N0QmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbiAoaG9zdEJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChob3N0QmluZGluZy5ob3N0UHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnRXaXRoID0gaG9zdEJpbmRpbmcuaG9zdFByb3BlcnR5TmFtZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRXaXRoID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQEhvc3RCaW5kaW5nIGNhbiBub3QgYmluZCB0byBldmVudHMuIFVzZSBASG9zdExpc3RlbmVyIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydFdpdGggPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJASG9zdEJpbmRpbmcgcGFyYW1ldGVyIHNob3VsZCBiZSBhIHByb3BlcnR5IG5hbWUsICdjbGFzcy48bmFtZT4nLCBvciAnYXR0ci48bmFtZT4nLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaG9zdFsoXCJbXCIgKyBob3N0QmluZGluZy5ob3N0UHJvcGVydHlOYW1lICsgXCJdXCIpXSA9IHByb3BOYW1lO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaG9zdFsoXCJbXCIgKyBwcm9wTmFtZSArIFwiXVwiKV0gPSBwcm9wTmFtZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RMaXN0ZW5lcnMgPSBwcm9wZXJ0eU1ldGFkYXRhW3Byb3BOYW1lXS5maWx0ZXIoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEgJiYgYSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuSG9zdExpc3RlbmVyOyB9KTtcbiAgICAgICAgICAgICAgaG9zdExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChob3N0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFyZ3MgPSBob3N0TGlzdGVuZXIuYXJncyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgIGhvc3RbKFwiKFwiICsgaG9zdExpc3RlbmVyLmV2ZW50TmFtZSArIFwiKVwiKV0gPSBwcm9wTmFtZSArIFwiKFwiICsgYXJncy5qb2luKCcsJykgKyBcIilcIjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJ5ID0gTGlzdFdyYXBwZXIuZmluZExhc3QocHJvcGVydHlNZXRhZGF0YVtwcm9wTmFtZV0sIGZ1bmN0aW9uIChhKSB7IHJldHVybiBhIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5RdWVyeTsgfSk7XG4gICAgICAgICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgICAgICAgcXVlcmllc1twcm9wTmFtZV0gPSBxdWVyeTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9tZXJnZShkbSwgaW5wdXRzLCBvdXRwdXRzLCBob3N0LCBxdWVyaWVzLCBkaXJlY3RpdmVUeXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVmXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVSZXNvbHZlci5wcm90b3R5cGUuX2V4dHJhY3RQdWJsaWNOYW1lID0gZnVuY3Rpb24gKGRlZikgeyByZXR1cm4gc3BsaXRBdENvbG9uKGRlZiwgW251bGwsIGRlZl0pWzFdLnRyaW0oKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBiaW5kaW5nc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlUmVzb2x2ZXIucHJvdG90eXBlLl9kZWR1cGVCaW5kaW5ncyA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJldmVyc2VkUmVzdWx0ID0gW107XG4gICAgICAgICAgLy8gZ28gbGFzdCB0byBmaXJzdCB0byBhbGxvdyBsYXRlciBlbnRyaWVzIHRvIG92ZXJ3cml0ZSBwcmV2aW91cyBlbnRyaWVzXG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gYmluZGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lXzEgPSB0aGlzLl9leHRyYWN0UHVibGljTmFtZShiaW5kaW5nKTtcbiAgICAgICAgICAgICAgaWYgKCFuYW1lcy5oYXMobmFtZV8xKSkge1xuICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgICByZXZlcnNlZFJlc3VsdC5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXZlcnNlZFJlc3VsdC5yZXZlcnNlKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVxuICAgICAgICogQHBhcmFtIHs/fSBpbnB1dHNcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0cHV0c1xuICAgICAgICogQHBhcmFtIHs/fSBob3N0XG4gICAgICAgKiBAcGFyYW0gez99IHF1ZXJpZXNcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlVHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlUmVzb2x2ZXIucHJvdG90eXBlLl9tZXJnZSA9IGZ1bmN0aW9uIChkaXJlY3RpdmUsIGlucHV0cywgb3V0cHV0cywgaG9zdCwgcXVlcmllcywgZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lcmdlZElucHV0cyA9IHRoaXMuX2RlZHVwZUJpbmRpbmdzKGRpcmVjdGl2ZS5pbnB1dHMgPyBkaXJlY3RpdmUuaW5wdXRzLmNvbmNhdChpbnB1dHMpIDogaW5wdXRzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXJnZWRPdXRwdXRzID0gdGhpcy5fZGVkdXBlQmluZGluZ3MoZGlyZWN0aXZlLm91dHB1dHMgPyBkaXJlY3RpdmUub3V0cHV0cy5jb25jYXQob3V0cHV0cykgOiBvdXRwdXRzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXJnZWRIb3N0ID0gZGlyZWN0aXZlLmhvc3QgPyBTdHJpbmdNYXBXcmFwcGVyLm1lcmdlKGRpcmVjdGl2ZS5ob3N0LCBob3N0KSA6IGhvc3Q7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVyZ2VkUXVlcmllcyA9IGRpcmVjdGl2ZS5xdWVyaWVzID8gU3RyaW5nTWFwV3JhcHBlci5tZXJnZShkaXJlY3RpdmUucXVlcmllcywgcXVlcmllcykgOiBxdWVyaWVzO1xuICAgICAgICAgIGlmIChkaXJlY3RpdmUgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IF9hbmd1bGFyX2NvcmUuQ29tcG9uZW50KHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBkaXJlY3RpdmUuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lcmdlZElucHV0cyxcbiAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lcmdlZE91dHB1dHMsXG4gICAgICAgICAgICAgICAgICBob3N0OiBtZXJnZWRIb3N0LFxuICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IGRpcmVjdGl2ZS5leHBvcnRBcyxcbiAgICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBkaXJlY3RpdmUubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgICBxdWVyaWVzOiBtZXJnZWRRdWVyaWVzLFxuICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBkaXJlY3RpdmUuY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBkaXJlY3RpdmUucHJvdmlkZXJzLFxuICAgICAgICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogZGlyZWN0aXZlLnZpZXdQcm92aWRlcnMsXG4gICAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IGRpcmVjdGl2ZS5lbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogZGlyZWN0aXZlLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6IGRpcmVjdGl2ZS50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczogZGlyZWN0aXZlLnN0eWxlcyxcbiAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogZGlyZWN0aXZlLnN0eWxlVXJscyxcbiAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IGRpcmVjdGl2ZS5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uczogZGlyZWN0aXZlLmFuaW1hdGlvbnMsXG4gICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uOiBkaXJlY3RpdmUuaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUoe1xuICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IGRpcmVjdGl2ZS5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgIGlucHV0czogbWVyZ2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgb3V0cHV0czogbWVyZ2VkT3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgIGhvc3Q6IG1lcmdlZEhvc3QsXG4gICAgICAgICAgICAgICAgICBleHBvcnRBczogZGlyZWN0aXZlLmV4cG9ydEFzLFxuICAgICAgICAgICAgICAgICAgcXVlcmllczogbWVyZ2VkUXVlcmllcyxcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogZGlyZWN0aXZlLnByb3ZpZGVyc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgRGlyZWN0aXZlUmVzb2x2ZXIgPSBfX2RlY29yYXRlJDcoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhJDcoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW1JlZmxlY3RvclJlYWRlcl0pXG4gICAgICBdLCBEaXJlY3RpdmVSZXNvbHZlcik7XG4gICAgICByZXR1cm4gRGlyZWN0aXZlUmVzb2x2ZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzRGlyZWN0aXZlTWV0YWRhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkRpcmVjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQxNyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIFR5cGVNb2RpZmllciA9IHt9O1xuICBUeXBlTW9kaWZpZXIuQ29uc3QgPSAwO1xuICBUeXBlTW9kaWZpZXJbVHlwZU1vZGlmaWVyLkNvbnN0XSA9IFwiQ29uc3RcIjtcbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIFR5cGUkMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUeXBlKG1vZGlmaWVycykge1xuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7XG4gICAgICAgICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFR5cGUucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFR5cGUucHJvdG90eXBlLmhhc01vZGlmaWVyID0gZnVuY3Rpb24gKG1vZGlmaWVyKSB7IHJldHVybiB0aGlzLm1vZGlmaWVycy5pbmRleE9mKG1vZGlmaWVyKSAhPT0gLTE7IH07XG4gICAgICByZXR1cm4gVHlwZTtcbiAgfSgpKTtcbiAgdmFyIEJ1aWx0aW5UeXBlTmFtZSA9IHt9O1xuICBCdWlsdGluVHlwZU5hbWUuRHluYW1pYyA9IDA7XG4gIEJ1aWx0aW5UeXBlTmFtZS5Cb29sID0gMTtcbiAgQnVpbHRpblR5cGVOYW1lLlN0cmluZyA9IDI7XG4gIEJ1aWx0aW5UeXBlTmFtZS5JbnQgPSAzO1xuICBCdWlsdGluVHlwZU5hbWUuTnVtYmVyID0gNDtcbiAgQnVpbHRpblR5cGVOYW1lLkZ1bmN0aW9uID0gNTtcbiAgQnVpbHRpblR5cGVOYW1lLk51bGwgPSA2O1xuICBCdWlsdGluVHlwZU5hbWVbQnVpbHRpblR5cGVOYW1lLkR5bmFtaWNdID0gXCJEeW5hbWljXCI7XG4gIEJ1aWx0aW5UeXBlTmFtZVtCdWlsdGluVHlwZU5hbWUuQm9vbF0gPSBcIkJvb2xcIjtcbiAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZS5TdHJpbmddID0gXCJTdHJpbmdcIjtcbiAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZS5JbnRdID0gXCJJbnRcIjtcbiAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZS5OdW1iZXJdID0gXCJOdW1iZXJcIjtcbiAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZS5GdW5jdGlvbl0gPSBcIkZ1bmN0aW9uXCI7XG4gIEJ1aWx0aW5UeXBlTmFtZVtCdWlsdGluVHlwZU5hbWUuTnVsbF0gPSBcIk51bGxcIjtcbiAgdmFyIEJ1aWx0aW5UeXBlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhCdWlsdGluVHlwZSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQnVpbHRpblR5cGUobmFtZSwgbW9kaWZpZXJzKSB7XG4gICAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCdWlsdGluVHlwZS5wcm90b3R5cGUudmlzaXRUeXBlID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEJ1aWx0aW50VHlwZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQnVpbHRpblR5cGU7XG4gIH0oVHlwZSQxKSk7XG4gIHZhciBFeHByZXNzaW9uVHlwZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoRXhwcmVzc2lvblR5cGUsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVQYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBFeHByZXNzaW9uVHlwZSh2YWx1ZSwgdHlwZVBhcmFtcywgbW9kaWZpZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGVQYXJhbXMgPT09IHZvaWQgMCkgeyB0eXBlUGFyYW1zID0gbnVsbDsgfVxuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbW9kaWZpZXJzKTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy50eXBlUGFyYW1zID0gdHlwZVBhcmFtcztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UeXBlLnByb3RvdHlwZS52aXNpdFR5cGUgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXhwcmVzc2lvblR5cGUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEV4cHJlc3Npb25UeXBlO1xuICB9KFR5cGUkMSkpO1xuICB2YXIgQXJyYXlUeXBlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhBcnJheVR5cGUsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gb2ZcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBcnJheVR5cGUob2YsIG1vZGlmaWVycykge1xuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbW9kaWZpZXJzKTtcbiAgICAgICAgICB0aGlzLm9mID0gb2Y7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcnJheVR5cGUucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBcnJheVR5cGUodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFycmF5VHlwZTtcbiAgfShUeXBlJDEpKTtcbiAgdmFyIE1hcFR5cGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KE1hcFR5cGUsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVUeXBlXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTWFwVHlwZSh2YWx1ZVR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbW9kaWZpZXJzKTtcbiAgICAgICAgICB0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE1hcFR5cGUucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TWFwVHlwZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICAgIHJldHVybiBNYXBUeXBlO1xuICB9KFR5cGUkMSkpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEWU5BTUlDX1RZUEUgPSBuZXcgQnVpbHRpblR5cGUoQnVpbHRpblR5cGVOYW1lLkR5bmFtaWMpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBCT09MX1RZUEUgPSBuZXcgQnVpbHRpblR5cGUoQnVpbHRpblR5cGVOYW1lLkJvb2wpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBJTlRfVFlQRSA9IG5ldyBCdWlsdGluVHlwZShCdWlsdGluVHlwZU5hbWUuSW50KTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTlVNQkVSX1RZUEUgPSBuZXcgQnVpbHRpblR5cGUoQnVpbHRpblR5cGVOYW1lLk51bWJlcik7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFNUUklOR19UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5TdHJpbmcpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBGVU5DVElPTl9UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5GdW5jdGlvbik7XG4gIHZhciAvKiogQHR5cGUgez99ICovIE5VTExfVFlQRSA9IG5ldyBCdWlsdGluVHlwZShCdWlsdGluVHlwZU5hbWUuTnVsbCk7XG4gIHZhciBCaW5hcnlPcGVyYXRvciA9IHt9O1xuICBCaW5hcnlPcGVyYXRvci5FcXVhbHMgPSAwO1xuICBCaW5hcnlPcGVyYXRvci5Ob3RFcXVhbHMgPSAxO1xuICBCaW5hcnlPcGVyYXRvci5JZGVudGljYWwgPSAyO1xuICBCaW5hcnlPcGVyYXRvci5Ob3RJZGVudGljYWwgPSAzO1xuICBCaW5hcnlPcGVyYXRvci5NaW51cyA9IDQ7XG4gIEJpbmFyeU9wZXJhdG9yLlBsdXMgPSA1O1xuICBCaW5hcnlPcGVyYXRvci5EaXZpZGUgPSA2O1xuICBCaW5hcnlPcGVyYXRvci5NdWx0aXBseSA9IDc7XG4gIEJpbmFyeU9wZXJhdG9yLk1vZHVsbyA9IDg7XG4gIEJpbmFyeU9wZXJhdG9yLkFuZCA9IDk7XG4gIEJpbmFyeU9wZXJhdG9yLk9yID0gMTA7XG4gIEJpbmFyeU9wZXJhdG9yLkxvd2VyID0gMTE7XG4gIEJpbmFyeU9wZXJhdG9yLkxvd2VyRXF1YWxzID0gMTI7XG4gIEJpbmFyeU9wZXJhdG9yLkJpZ2dlciA9IDEzO1xuICBCaW5hcnlPcGVyYXRvci5CaWdnZXJFcXVhbHMgPSAxNDtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuRXF1YWxzXSA9IFwiRXF1YWxzXCI7XG4gIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yLk5vdEVxdWFsc10gPSBcIk5vdEVxdWFsc1wiO1xuICBCaW5hcnlPcGVyYXRvcltCaW5hcnlPcGVyYXRvci5JZGVudGljYWxdID0gXCJJZGVudGljYWxcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuTm90SWRlbnRpY2FsXSA9IFwiTm90SWRlbnRpY2FsXCI7XG4gIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yLk1pbnVzXSA9IFwiTWludXNcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuUGx1c10gPSBcIlBsdXNcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuRGl2aWRlXSA9IFwiRGl2aWRlXCI7XG4gIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yLk11bHRpcGx5XSA9IFwiTXVsdGlwbHlcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuTW9kdWxvXSA9IFwiTW9kdWxvXCI7XG4gIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yLkFuZF0gPSBcIkFuZFwiO1xuICBCaW5hcnlPcGVyYXRvcltCaW5hcnlPcGVyYXRvci5Pcl0gPSBcIk9yXCI7XG4gIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yLkxvd2VyXSA9IFwiTG93ZXJcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuTG93ZXJFcXVhbHNdID0gXCJMb3dlckVxdWFsc1wiO1xuICBCaW5hcnlPcGVyYXRvcltCaW5hcnlPcGVyYXRvci5CaWdnZXJdID0gXCJCaWdnZXJcIjtcbiAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3IuQmlnZ2VyRXF1YWxzXSA9IFwiQmlnZ2VyRXF1YWxzXCI7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEV4cHJlc3Npb24odHlwZSkge1xuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvbi5wcm90b3R5cGUucHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBuZXcgUmVhZFByb3BFeHByKHRoaXMsIG5hbWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiAoaW5kZXgsIHR5cGUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWFkS2V5RXhwcih0aGlzLCBpbmRleCwgdHlwZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5jYWxsTWV0aG9kID0gZnVuY3Rpb24gKG5hbWUsIHBhcmFtcykge1xuICAgICAgICAgIHJldHVybiBuZXcgSW52b2tlTWV0aG9kRXhwcih0aGlzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmNhbGxGbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHsgcmV0dXJuIG5ldyBJbnZva2VGdW5jdGlvbkV4cHIodGhpcywgcGFyYW1zKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmluc3RhbnRpYXRlID0gZnVuY3Rpb24gKHBhcmFtcywgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRlRXhwcih0aGlzLCBwYXJhbXMsIHR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0cnVlQ2FzZVxuICAgICAgICogQHBhcmFtIHs/PX0gZmFsc2VDYXNlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5jb25kaXRpb25hbCA9IGZ1bmN0aW9uICh0cnVlQ2FzZSwgZmFsc2VDYXNlKSB7XG4gICAgICAgICAgaWYgKGZhbHNlQ2FzZSA9PT0gdm9pZCAwKSB7IGZhbHNlQ2FzZSA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsRXhwcih0aGlzLCB0cnVlQ2FzZSwgZmFsc2VDYXNlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAocmhzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuRXF1YWxzLCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Ob3RFcXVhbHMsIHRoaXMsIHJocyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJoc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuaWRlbnRpY2FsID0gZnVuY3Rpb24gKHJocykge1xuICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLklkZW50aWNhbCwgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5ub3RJZGVudGljYWwgPSBmdW5jdGlvbiAocmhzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuTm90SWRlbnRpY2FsLCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm1pbnVzID0gZnVuY3Rpb24gKHJocykge1xuICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLk1pbnVzLCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLnBsdXMgPSBmdW5jdGlvbiAocmhzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuUGx1cywgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiAocmhzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuRGl2aWRlLCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKHJocykge1xuICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLk11bHRpcGx5LCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Nb2R1bG8sIHRoaXMsIHJocyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJoc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gKHJocykge1xuICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLkFuZCwgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5PciwgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5sb3dlciA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Mb3dlciwgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5sb3dlckVxdWFscyA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Mb3dlckVxdWFscywgdGhpcywgcmhzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmhzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5iaWdnZXIgPSBmdW5jdGlvbiAocmhzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuQmlnZ2VyLCB0aGlzLCByaHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmJpZ2dlckVxdWFscyA9IGZ1bmN0aW9uIChyaHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5CaWdnZXJFcXVhbHMsIHRoaXMsIHJocyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5pc0JsYW5rID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIE5vdGU6IFdlIHVzZSBlcXVhbHMgYnkgcHVycG9zZSBoZXJlIHRvIGNvbXBhcmUgdG8gbnVsbCBhbmQgdW5kZWZpbmVkIGluIEpTLlxuICAgICAgICAgIC8vIFdlIHVzZSB0aGUgdHlwZWQgbnVsbCB0byBhbGxvdyBzdHJpY3ROdWxsQ2hlY2tzIHRvIG5hcnJvdyB0eXBlcy5cbiAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoVFlQRURfTlVMTF9FWFBSKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuY2FzdCA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiBuZXcgQ2FzdEV4cHIodGhpcywgdHlwZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLnRvU3RtdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMpOyB9O1xuICAgICAgcmV0dXJuIEV4cHJlc3Npb247XG4gIH0oKSk7XG4gIHZhciBCdWlsdGluVmFyID0ge307XG4gIEJ1aWx0aW5WYXIuVGhpcyA9IDA7XG4gIEJ1aWx0aW5WYXIuU3VwZXIgPSAxO1xuICBCdWlsdGluVmFyLkNhdGNoRXJyb3IgPSAyO1xuICBCdWlsdGluVmFyLkNhdGNoU3RhY2sgPSAzO1xuICBCdWlsdGluVmFyW0J1aWx0aW5WYXIuVGhpc10gPSBcIlRoaXNcIjtcbiAgQnVpbHRpblZhcltCdWlsdGluVmFyLlN1cGVyXSA9IFwiU3VwZXJcIjtcbiAgQnVpbHRpblZhcltCdWlsdGluVmFyLkNhdGNoRXJyb3JdID0gXCJDYXRjaEVycm9yXCI7XG4gIEJ1aWx0aW5WYXJbQnVpbHRpblZhci5DYXRjaFN0YWNrXSA9IFwiQ2F0Y2hTdGFja1wiO1xuICB2YXIgUmVhZFZhckV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KFJlYWRWYXJFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUmVhZFZhckV4cHIobmFtZSwgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICAgIHRoaXMuYnVpbHRpbiA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLmJ1aWx0aW4gPSBuYW1lO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlYWRWYXJFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UmVhZFZhckV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWFkVmFyRXhwci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgV3JpdGVWYXJFeHByKHRoaXMubmFtZSwgdmFsdWUpOyB9O1xuICAgICAgcmV0dXJuIFJlYWRWYXJFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIFdyaXRlVmFyRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoV3JpdGVWYXJFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gV3JpdGVWYXJFeHByKG5hbWUsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUgfHwgdmFsdWUudHlwZSk7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXcml0ZVZhckV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRXcml0ZVZhckV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFdyaXRlVmFyRXhwci5wcm90b3R5cGUudG9EZWNsU3RtdCA9IGZ1bmN0aW9uICh0eXBlLCBtb2RpZmllcnMpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgICByZXR1cm4gbmV3IERlY2xhcmVWYXJTdG10KHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgdHlwZSwgbW9kaWZpZXJzKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gV3JpdGVWYXJFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIFdyaXRlS2V5RXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoV3JpdGVLZXlFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFdyaXRlS2V5RXhwcihyZWNlaXZlciwgaW5kZXgsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUgfHwgdmFsdWUudHlwZSk7XG4gICAgICAgICAgdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXcml0ZUtleUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRXcml0ZUtleUV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFdyaXRlS2V5RXhwcjtcbiAgfShFeHByZXNzaW9uKSk7XG4gIHZhciBXcml0ZVByb3BFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhXcml0ZVByb3BFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gV3JpdGVQcm9wRXhwcihyZWNlaXZlciwgbmFtZSwgdmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgdHlwZSB8fCB2YWx1ZS50eXBlKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXcml0ZVByb3BFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0V3JpdGVQcm9wRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gV3JpdGVQcm9wRXhwcjtcbiAgfShFeHByZXNzaW9uKSk7XG4gIHZhciBCdWlsdGluTWV0aG9kID0ge307XG4gIEJ1aWx0aW5NZXRob2QuQ29uY2F0QXJyYXkgPSAwO1xuICBCdWlsdGluTWV0aG9kLlN1YnNjcmliZU9ic2VydmFibGUgPSAxO1xuICBCdWlsdGluTWV0aG9kLkJpbmQgPSAyO1xuICBCdWlsdGluTWV0aG9kW0J1aWx0aW5NZXRob2QuQ29uY2F0QXJyYXldID0gXCJDb25jYXRBcnJheVwiO1xuICBCdWlsdGluTWV0aG9kW0J1aWx0aW5NZXRob2QuU3Vic2NyaWJlT2JzZXJ2YWJsZV0gPSBcIlN1YnNjcmliZU9ic2VydmFibGVcIjtcbiAgQnVpbHRpbk1ldGhvZFtCdWlsdGluTWV0aG9kLkJpbmRdID0gXCJCaW5kXCI7XG4gIHZhciBJbnZva2VNZXRob2RFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhJbnZva2VNZXRob2RFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IG1ldGhvZFxuICAgICAgICogQHBhcmFtIHs/fSBhcmdzXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEludm9rZU1ldGhvZEV4cHIocmVjZWl2ZXIsIG1ldGhvZCwgYXJncywgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbWV0aG9kO1xuICAgICAgICAgICAgICB0aGlzLmJ1aWx0aW4gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgdGhpcy5idWlsdGluID0gbWV0aG9kO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEludm9rZU1ldGhvZEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnZva2VNZXRob2RFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBJbnZva2VNZXRob2RFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIEludm9rZUZ1bmN0aW9uRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoSW52b2tlRnVuY3Rpb25FeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gSW52b2tlRnVuY3Rpb25FeHByKGZuLCBhcmdzLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUpO1xuICAgICAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSW52b2tlRnVuY3Rpb25FeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52b2tlRnVuY3Rpb25FeHByKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBJbnZva2VGdW5jdGlvbkV4cHI7XG4gIH0oRXhwcmVzc2lvbikpO1xuICB2YXIgSW5zdGFudGlhdGVFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhJbnN0YW50aWF0ZUV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NFeHByXG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gSW5zdGFudGlhdGVFeHByKGNsYXNzRXhwciwgYXJncywgdHlwZSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUpO1xuICAgICAgICAgIHRoaXMuY2xhc3NFeHByID0gY2xhc3NFeHByO1xuICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJbnN0YW50aWF0ZUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnN0YW50aWF0ZUV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEluc3RhbnRpYXRlRXhwcjtcbiAgfShFeHByZXNzaW9uKSk7XG4gIHZhciBMaXRlcmFsRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoTGl0ZXJhbEV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTGl0ZXJhbEV4cHIodmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgdHlwZSk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTGl0ZXJhbEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTGl0ZXJhbEV4cHI7XG4gIH0oRXhwcmVzc2lvbikpO1xuICB2YXIgRXh0ZXJuYWxFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhFeHRlcm5hbEV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVQYXJhbXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRXh0ZXJuYWxFeHByKHZhbHVlLCB0eXBlLCB0eXBlUGFyYW1zKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIGlmICh0eXBlUGFyYW1zID09PSB2b2lkIDApIHsgdHlwZVBhcmFtcyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy50eXBlUGFyYW1zID0gdHlwZVBhcmFtcztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4dGVybmFsRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEV4dGVybmFsRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gRXh0ZXJuYWxFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIENvbmRpdGlvbmFsRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoQ29uZGl0aW9uYWxFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbmRpdGlvblxuICAgICAgICogQHBhcmFtIHs/fSB0cnVlQ2FzZVxuICAgICAgICogQHBhcmFtIHs/PX0gZmFsc2VDYXNlXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbmRpdGlvbmFsRXhwcihjb25kaXRpb24sIHRydWVDYXNlLCBmYWxzZUNhc2UsIHR5cGUpIHtcbiAgICAgICAgICBpZiAoZmFsc2VDYXNlID09PSB2b2lkIDApIHsgZmFsc2VDYXNlID0gbnVsbDsgfVxuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlIHx8IHRydWVDYXNlLnR5cGUpO1xuICAgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICAgIHRoaXMuZmFsc2VDYXNlID0gZmFsc2VDYXNlO1xuICAgICAgICAgIHRoaXMudHJ1ZUNhc2UgPSB0cnVlQ2FzZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbmRpdGlvbmFsRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbmRpdGlvbmFsRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ29uZGl0aW9uYWxFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIE5vdEV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KE5vdEV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29uZGl0aW9uXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5vdEV4cHIoY29uZGl0aW9uKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgQk9PTF9UWVBFKTtcbiAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5vdEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXROb3RFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBOb3RFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIENhc3RFeHByID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhDYXN0RXhwciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENhc3RFeHByKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgdHlwZSk7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ2FzdEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDYXN0RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ2FzdEV4cHI7XG4gIH0oRXhwcmVzc2lvbikpO1xuICB2YXIgRm5QYXJhbSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBGblBhcmFtKG5hbWUsIHR5cGUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEZuUGFyYW07XG4gIH0oKSk7XG4gIHZhciBGdW5jdGlvbkV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KEZ1bmN0aW9uRXhwciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBGdW5jdGlvbkV4cHIocGFyYW1zLCBzdGF0ZW1lbnRzLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUpO1xuICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBGdW5jdGlvbkV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbkV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRnVuY3Rpb25FeHByLnByb3RvdHlwZS50b0RlY2xTdG10ID0gZnVuY3Rpb24gKG5hbWUsIG1vZGlmaWVycykge1xuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJlRnVuY3Rpb25TdG10KG5hbWUsIHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlbWVudHMsIHRoaXMudHlwZSwgbW9kaWZpZXJzKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gRnVuY3Rpb25FeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIEJpbmFyeU9wZXJhdG9yRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoQmluYXJ5T3BlcmF0b3JFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG9wZXJhdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGxoc1xuICAgICAgICogQHBhcmFtIHs/fSByaHNcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQmluYXJ5T3BlcmF0b3JFeHByKG9wZXJhdG9yLCBsaHMsIHJocywgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlIHx8IGxocy50eXBlKTtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgICAgdGhpcy5yaHMgPSByaHM7XG4gICAgICAgICAgdGhpcy5saHMgPSBsaHM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCaW5hcnlPcGVyYXRvckV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yRXhwcjtcbiAgfShFeHByZXNzaW9uKSk7XG4gIHZhciBSZWFkUHJvcEV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KFJlYWRQcm9wRXhwciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWNlaXZlclxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJlYWRQcm9wRXhwcihyZWNlaXZlciwgbmFtZSwgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlYWRQcm9wRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlYWRQcm9wRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlYWRQcm9wRXhwci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVByb3BFeHByKHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBSZWFkUHJvcEV4cHI7XG4gIH0oRXhwcmVzc2lvbikpO1xuICB2YXIgUmVhZEtleUV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KFJlYWRLZXlFeHByLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlY2VpdmVyXG4gICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJlYWRLZXlFeHByKHJlY2VpdmVyLCBpbmRleCwgdHlwZSkge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlKTtcbiAgICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVhZEtleUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRSZWFkS2V5RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlYWRLZXlFeHByLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlS2V5RXhwcih0aGlzLnJlY2VpdmVyLCB0aGlzLmluZGV4LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFJlYWRLZXlFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIExpdGVyYWxBcnJheUV4cHIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KExpdGVyYWxBcnJheUV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZW50cmllc1xuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBMaXRlcmFsQXJyYXlFeHByKGVudHJpZXMsIHR5cGUpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgdHlwZSk7XG4gICAgICAgICAgdGhpcy5lbnRyaWVzID0gZW50cmllcztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIExpdGVyYWxBcnJheUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsQXJyYXlFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBMaXRlcmFsQXJyYXlFeHByO1xuICB9KEV4cHJlc3Npb24pKTtcbiAgdmFyIExpdGVyYWxNYXBFbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez89fSBxdW90ZWRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTGl0ZXJhbE1hcEVudHJ5KGtleSwgdmFsdWUsIHF1b3RlZCkge1xuICAgICAgICAgIGlmIChxdW90ZWQgPT09IHZvaWQgMCkgeyBxdW90ZWQgPSBmYWxzZTsgfVxuICAgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLnF1b3RlZCA9IHF1b3RlZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBMaXRlcmFsTWFwRW50cnk7XG4gIH0oKSk7XG4gIHZhciBMaXRlcmFsTWFwRXhwciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoTGl0ZXJhbE1hcEV4cHIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZW50cmllc1xuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBMaXRlcmFsTWFwRXhwcihlbnRyaWVzLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUpO1xuICAgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSBudWxsO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQodHlwZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB0eXBlLnZhbHVlVHlwZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBMaXRlcmFsTWFwRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxNYXBFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBMaXRlcmFsTWFwRXhwcjtcbiAgfShFeHByZXNzaW9uKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFRISVNfRVhQUiA9IG5ldyBSZWFkVmFyRXhwcihCdWlsdGluVmFyLlRoaXMpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTVVBFUl9FWFBSID0gbmV3IFJlYWRWYXJFeHByKEJ1aWx0aW5WYXIuU3VwZXIpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDQVRDSF9FUlJPUl9WQVIgPSBuZXcgUmVhZFZhckV4cHIoQnVpbHRpblZhci5DYXRjaEVycm9yKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ0FUQ0hfU1RBQ0tfVkFSID0gbmV3IFJlYWRWYXJFeHByKEJ1aWx0aW5WYXIuQ2F0Y2hTdGFjayk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIE5VTExfRVhQUiA9IG5ldyBMaXRlcmFsRXhwcihudWxsLCBudWxsKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVFlQRURfTlVMTF9FWFBSID0gbmV3IExpdGVyYWxFeHByKG51bGwsIE5VTExfVFlQRSk7XG4gIHZhciBTdG10TW9kaWZpZXIgPSB7fTtcbiAgU3RtdE1vZGlmaWVyLkZpbmFsID0gMDtcbiAgU3RtdE1vZGlmaWVyLlByaXZhdGUgPSAxO1xuICBTdG10TW9kaWZpZXJbU3RtdE1vZGlmaWVyLkZpbmFsXSA9IFwiRmluYWxcIjtcbiAgU3RtdE1vZGlmaWVyW1N0bXRNb2RpZmllci5Qcml2YXRlXSA9IFwiUHJpdmF0ZVwiO1xuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gbW9kaWZpZXJzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFN0YXRlbWVudChtb2RpZmllcnMpIHtcbiAgICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzO1xuICAgICAgICAgIGlmICghbW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgIHRoaXMubW9kaWZpZXJzID0gW107XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50LnByb3RvdHlwZS5oYXNNb2RpZmllciA9IGZ1bmN0aW9uIChtb2RpZmllcikgeyByZXR1cm4gdGhpcy5tb2RpZmllcnMuaW5kZXhPZihtb2RpZmllcikgIT09IC0xOyB9O1xuICAgICAgcmV0dXJuIFN0YXRlbWVudDtcbiAgfSgpKTtcbiAgdmFyIERlY2xhcmVWYXJTdG10ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhEZWNsYXJlVmFyU3RtdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRGVjbGFyZVZhclN0bXQobmFtZSwgdmFsdWUsIHR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1vZGlmaWVycyk7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCB2YWx1ZS50eXBlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGVjbGFyZVZhclN0bXQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdERlY2xhcmVWYXJTdG10KHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBEZWNsYXJlVmFyU3RtdDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIERlY2xhcmVGdW5jdGlvblN0bXQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KERlY2xhcmVGdW5jdGlvblN0bXQsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICogQHBhcmFtIHs/PX0gbW9kaWZpZXJzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERlY2xhcmVGdW5jdGlvblN0bXQobmFtZSwgcGFyYW1zLCBzdGF0ZW1lbnRzLCB0eXBlLCBtb2RpZmllcnMpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGVjbGFyZUZ1bmN0aW9uU3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gRGVjbGFyZUZ1bmN0aW9uU3RtdDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIEV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KEV4cHJlc3Npb25TdGF0ZW1lbnQsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmV4cHIgPSBleHByO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblN0YXRlbWVudC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXhwcmVzc2lvblN0bXQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEV4cHJlc3Npb25TdGF0ZW1lbnQ7XG4gIH0oU3RhdGVtZW50KSk7XG4gIHZhciBSZXR1cm5TdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KFJldHVyblN0YXRlbWVudCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSZXR1cm5TdGF0ZW1lbnQodmFsdWUpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZXR1cm5TdGF0ZW1lbnQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJldHVyblN0bXQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFJldHVyblN0YXRlbWVudDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIEFic3RyYWN0Q2xhc3NQYXJ0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQWJzdHJhY3RDbGFzc1BhcnQodHlwZSwgbW9kaWZpZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7XG4gICAgICAgICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0Q2xhc3NQYXJ0LnByb3RvdHlwZS5oYXNNb2RpZmllciA9IGZ1bmN0aW9uIChtb2RpZmllcikgeyByZXR1cm4gdGhpcy5tb2RpZmllcnMuaW5kZXhPZihtb2RpZmllcikgIT09IC0xOyB9O1xuICAgICAgcmV0dXJuIEFic3RyYWN0Q2xhc3NQYXJ0O1xuICB9KCkpO1xuICB2YXIgQ2xhc3NGaWVsZCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoQ2xhc3NGaWVsZCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ2xhc3NGaWVsZChuYW1lLCB0eXBlLCBtb2RpZmllcnMpIHtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBtb2RpZmllcnMpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ2xhc3NGaWVsZDtcbiAgfShBYnN0cmFjdENsYXNzUGFydCkpO1xuICB2YXIgQ2xhc3NNZXRob2QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KENsYXNzTWV0aG9kLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zXG4gICAgICAgKiBAcGFyYW0gez99IGJvZHlcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDbGFzc01ldGhvZChuYW1lLCBwYXJhbXMsIGJvZHksIHR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHR5cGUsIG1vZGlmaWVycyk7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIENsYXNzTWV0aG9kO1xuICB9KEFic3RyYWN0Q2xhc3NQYXJ0KSk7XG4gIHZhciBDbGFzc0dldHRlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoQ2xhc3NHZXR0ZXIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBib2R5XG4gICAgICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAgICAgKiBAcGFyYW0gez89fSBtb2RpZmllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ2xhc3NHZXR0ZXIobmFtZSwgYm9keSwgdHlwZSwgbW9kaWZpZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgbW9kaWZpZXJzKTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ2xhc3NHZXR0ZXI7XG4gIH0oQWJzdHJhY3RDbGFzc1BhcnQpKTtcbiAgdmFyIENsYXNzU3RtdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoQ2xhc3NTdG10LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgKiBAcGFyYW0gez99IGZpZWxkc1xuICAgICAgICogQHBhcmFtIHs/fSBnZXR0ZXJzXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnN0cnVjdG9yTWV0aG9kXG4gICAgICAgKiBAcGFyYW0gez99IG1ldGhvZHNcbiAgICAgICAqIEBwYXJhbSB7Pz19IG1vZGlmaWVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDbGFzc1N0bXQobmFtZSwgcGFyZW50LCBmaWVsZHMsIGdldHRlcnMsIGNvbnN0cnVjdG9yTWV0aG9kLCBtZXRob2RzLCBtb2RpZmllcnMpIHtcbiAgICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1vZGlmaWVycyk7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgICB0aGlzLmdldHRlcnMgPSBnZXR0ZXJzO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3JNZXRob2QgPSBjb25zdHJ1Y3Rvck1ldGhvZDtcbiAgICAgICAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ2xhc3NTdG10LnByb3RvdHlwZS52aXNpdFN0YXRlbWVudCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWNsYXJlQ2xhc3NTdG10KHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDbGFzc1N0bXQ7XG4gIH0oU3RhdGVtZW50KSk7XG4gIHZhciBJZlN0bXQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE3KElmU3RtdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gdHJ1ZUNhc2VcbiAgICAgICAqIEBwYXJhbSB7Pz19IGZhbHNlQ2FzZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBJZlN0bXQoY29uZGl0aW9uLCB0cnVlQ2FzZSwgZmFsc2VDYXNlKSB7XG4gICAgICAgICAgaWYgKGZhbHNlQ2FzZSA9PT0gdm9pZCAwKSB7IGZhbHNlQ2FzZSA9IFtdOyB9XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgICAgdGhpcy50cnVlQ2FzZSA9IHRydWVDYXNlO1xuICAgICAgICAgIHRoaXMuZmFsc2VDYXNlID0gZmFsc2VDYXNlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSWZTdG10LnByb3RvdHlwZS52aXNpdFN0YXRlbWVudCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJZlN0bXQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIElmU3RtdDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIENvbW1lbnRTdG10ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhDb21tZW50U3RtdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21tZW50XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbW1lbnRTdG10KGNvbW1lbnQpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tbWVudFN0bXQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbW1lbnRTdG10KHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21tZW50U3RtdDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIFRyeUNhdGNoU3RtdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoVHJ5Q2F0Y2hTdG10LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGJvZHlTdG10c1xuICAgICAgICogQHBhcmFtIHs/fSBjYXRjaFN0bXRzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRyeUNhdGNoU3RtdChib2R5U3RtdHMsIGNhdGNoU3RtdHMpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmJvZHlTdG10cyA9IGJvZHlTdG10cztcbiAgICAgICAgICB0aGlzLmNhdGNoU3RtdHMgPSBjYXRjaFN0bXRzO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJ5Q2F0Y2hTdG10LnByb3RvdHlwZS52aXNpdFN0YXRlbWVudCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUcnlDYXRjaFN0bXQodGhpcywgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFRyeUNhdGNoU3RtdDtcbiAgfShTdGF0ZW1lbnQpKTtcbiAgdmFyIFRocm93U3RtdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoVGhyb3dTdG10LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFRocm93U3RtdChlcnJvcikge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aXNpdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRocm93U3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGhyb3dTdG10KHRoaXMsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBUaHJvd1N0bXQ7XG4gIH0oU3RhdGVtZW50KSk7XG4gIHZhciBFeHByZXNzaW9uVHJhbnNmb3JtZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gRXhwcmVzc2lvblRyYW5zZm9ybWVyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBhc3Q7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0V3JpdGVWYXJFeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlVmFyRXhwcihleHByLm5hbWUsIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0V3JpdGVLZXlFeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlS2V5RXhwcihleHByLnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgZXhwci5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0V3JpdGVQcm9wRXhwciA9IGZ1bmN0aW9uIChleHByLCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVByb3BFeHByKGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBleHByLm5hbWUsIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRJbnZva2VNZXRob2RFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1ldGhvZCA9IGFzdC5idWlsdGluIHx8IGFzdC5uYW1lO1xuICAgICAgICAgIHJldHVybiBuZXcgSW52b2tlTWV0aG9kRXhwcihhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBtZXRob2QsIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY29udGV4dCksIGFzdC50eXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VGdW5jdGlvbkV4cHIoYXN0LmZuLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5hcmdzLCBjb250ZXh0KSwgYXN0LnR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEluc3RhbnRpYXRlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbnRpYXRlRXhwcihhc3QuY2xhc3NFeHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5hcmdzLCBjb250ZXh0KSwgYXN0LnR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gYXN0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gYXN0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29uZGl0aW9uYWxFeHByKGFzdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3QudHJ1ZUNhc2UudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3QuZmFsc2VDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Tm90RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE5vdEV4cHIoYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdENhc3RFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ2FzdEV4cHIoYXN0LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIC8vIERvbid0IGRlc2NlbmQgaW50byBuZXN0ZWQgZnVuY3Rpb25zXG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoYXN0Lm9wZXJhdG9yLCBhc3QubGhzLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgYXN0LnJocy52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC50eXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWFkUHJvcEV4cHIoYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgYXN0Lm5hbWUsIGFzdC50eXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRSZWFkS2V5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlYWRLZXlFeHByKGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC50eXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEFycmF5RXhwcih0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmVudHJpZXMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJpZXMgPSBhc3QuZW50cmllcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBuZXcgTGl0ZXJhbE1hcEVudHJ5KGVudHJ5LmtleSwgZW50cnkudmFsdWUudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KSwgZW50cnkucXVvdGVkKTsgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwRXhwcihlbnRyaWVzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcnNcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFsbEV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGV4cHJzLCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gZXhwcnMubWFwKGZ1bmN0aW9uIChleHByKSB7IHJldHVybiBleHByLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXREZWNsYXJlVmFyU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJlVmFyU3RtdChzdG10Lm5hbWUsIHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBzdG10LnR5cGUsIHN0bXQubW9kaWZpZXJzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgLy8gRG9uJ3QgZGVzY2VuZCBpbnRvIG5lc3RlZCBmdW5jdGlvbnNcbiAgICAgICAgICByZXR1cm4gc3RtdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChzdG10LmV4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UmV0dXJuU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQoc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXREZWNsYXJlQ2xhc3NTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBEb24ndCBkZXNjZW5kIGludG8gbmVzdGVkIGZ1bmN0aW9uc1xuICAgICAgICAgIHJldHVybiBzdG10O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV4cHJlc3Npb25UcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRJZlN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBuZXcgSWZTdG10KHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY29udGV4dCksIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuZmFsc2VDYXNlLCBjb250ZXh0KSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFRyeUNhdGNoU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBUcnlDYXRjaFN0bXQodGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5ib2R5U3RtdHMsIGNvbnRleHQpLCB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNhdGNoU3RtdHMsIGNvbnRleHQpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0VGhyb3dTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFRocm93U3RtdChzdG10LmVycm9yLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdENvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHsgcmV0dXJuIHN0bXQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdHNcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXhwcmVzc2lvblRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFsbFN0YXRlbWVudHMgPSBmdW5jdGlvbiAoc3RtdHMsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBzdG10cy5tYXAoZnVuY3Rpb24gKHN0bXQpIHsgcmV0dXJuIHN0bXQudmlzaXRTdGF0ZW1lbnQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gRXhwcmVzc2lvblRyYW5zZm9ybWVyO1xuICB9KCkpO1xuICB2YXIgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gYXN0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cHJcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVWYXJFeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgICBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRXcml0ZUtleUV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY29udGV4dCkge1xuICAgICAgICAgIGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIGV4cHIuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBleHByO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHByXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyaXRlUHJvcEV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY29udGV4dCkge1xuICAgICAgICAgIGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBleHByO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW52b2tlTWV0aG9kRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdEludm9rZUZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuZm4udmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdEluc3RhbnRpYXRlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuY2xhc3NFeHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBhc3Q7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIGFzdDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gYXN0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgYXN0LnRydWVDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICBhc3QuZmFsc2VDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0Tm90RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gYXN0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgYXN0Lmxocy52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgYXN0LnJocy52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRQcm9wRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBhc3Q7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZWFkS2V5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIGFzdC5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5lbnRyaWVzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbE1hcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBhc3QuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnkudmFsdWUudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgICAgcmV0dXJuIGFzdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcnNcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoZXhwcnMsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGV4cHJzLmZvckVhY2goZnVuY3Rpb24gKGV4cHIpIHsgcmV0dXJuIGV4cHIudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBzdG10O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVGdW5jdGlvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIC8vIERvbid0IGRlc2NlbmQgaW50byBuZXN0ZWQgZnVuY3Rpb25zXG4gICAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHN0bXQuZXhwci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmV0dXJuU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgICAgLy8gRG9uJ3QgZGVzY2VuZCBpbnRvIG5lc3RlZCBmdW5jdGlvbnNcbiAgICAgICAgICByZXR1cm4gc3RtdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRJZlN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LnRydWVDYXNlLCBjb250ZXh0KTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmZhbHNlQ2FzZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHJ5Q2F0Y2hTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmJvZHlTdG10cywgY29udGV4dCk7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5jYXRjaFN0bXRzLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gc3RtdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvci5wcm90b3R5cGUudmlzaXRUaHJvd1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAgIHN0bXQuZXJyb3IudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHJldHVybiBzdG10O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHsgcmV0dXJuIHN0bXQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdHNcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjdXJzaXZlRXhwcmVzc2lvblZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsU3RhdGVtZW50cyA9IGZ1bmN0aW9uIChzdG10cywgY29udGV4dCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgc3RtdHMuZm9yRWFjaChmdW5jdGlvbiAoc3RtdCkgeyByZXR1cm4gc3RtdC52aXNpdFN0YXRlbWVudChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBSZWN1cnNpdmVFeHByZXNzaW9uVmlzaXRvcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmFyTmFtZVxuICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlXG4gICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVZhckluRXhwcmVzc2lvbih2YXJOYW1lLCBuZXdWYWx1ZSwgZXhwcmVzc2lvbikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNmb3JtZXIgPSBuZXcgX1JlcGxhY2VWYXJpYWJsZVRyYW5zZm9ybWVyKHZhck5hbWUsIG5ld1ZhbHVlKTtcbiAgICAgIHJldHVybiBleHByZXNzaW9uLnZpc2l0RXhwcmVzc2lvbih0cmFuc2Zvcm1lciwgbnVsbCk7XG4gIH1cbiAgdmFyIF9SZXBsYWNlVmFyaWFibGVUcmFuc2Zvcm1lciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMTcoX1JlcGxhY2VWYXJpYWJsZVRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF92YXJOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IF9uZXdWYWx1ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfUmVwbGFjZVZhcmlhYmxlVHJhbnNmb3JtZXIoX3Zhck5hbWUsIF9uZXdWYWx1ZSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuX3Zhck5hbWUgPSBfdmFyTmFtZTtcbiAgICAgICAgICB0aGlzLl9uZXdWYWx1ZSA9IF9uZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1JlcGxhY2VWYXJpYWJsZVRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBhc3QubmFtZSA9PSB0aGlzLl92YXJOYW1lID8gdGhpcy5fbmV3VmFsdWUgOiBhc3Q7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9SZXBsYWNlVmFyaWFibGVUcmFuc2Zvcm1lcjtcbiAgfShFeHByZXNzaW9uVHJhbnNmb3JtZXIpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RtdHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRSZWFkVmFyTmFtZXMoc3RtdHMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpbmRlciA9IG5ldyBfVmFyaWFibGVGaW5kZXIoKTtcbiAgICAgIGZpbmRlci52aXNpdEFsbFN0YXRlbWVudHMoc3RtdHMsIG51bGwpO1xuICAgICAgcmV0dXJuIGZpbmRlci52YXJOYW1lcztcbiAgfVxuICB2YXIgX1ZhcmlhYmxlRmluZGVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxNyhfVmFyaWFibGVGaW5kZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBfVmFyaWFibGVGaW5kZXIoKSB7XG4gICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhpcy52YXJOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1ZhcmlhYmxlRmluZGVyLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHRoaXMudmFyTmFtZXMuYWRkKGFzdC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gX1ZhcmlhYmxlRmluZGVyO1xuICB9KFJlY3Vyc2l2ZUV4cHJlc3Npb25WaXNpdG9yKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdmFyaWFibGUobmFtZSwgdHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgcmV0dXJuIG5ldyBSZWFkVmFyRXhwcihuYW1lLCB0eXBlKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBpZFxuICAgKiBAcGFyYW0gez89fSB0eXBlUGFyYW1zXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpbXBvcnRFeHByKGlkLCB0eXBlUGFyYW1zKSB7XG4gICAgICBpZiAodHlwZVBhcmFtcyA9PT0gdm9pZCAwKSB7IHR5cGVQYXJhbXMgPSBudWxsOyB9XG4gICAgICByZXR1cm4gbmV3IEV4dGVybmFsRXhwcihpZCwgbnVsbCwgdHlwZVBhcmFtcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaWRcbiAgICogQHBhcmFtIHs/PX0gdHlwZVBhcmFtc1xuICAgKiBAcGFyYW0gez89fSB0eXBlTW9kaWZpZXJzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpbXBvcnRUeXBlKGlkLCB0eXBlUGFyYW1zLCB0eXBlTW9kaWZpZXJzKSB7XG4gICAgICBpZiAodHlwZVBhcmFtcyA9PT0gdm9pZCAwKSB7IHR5cGVQYXJhbXMgPSBudWxsOyB9XG4gICAgICBpZiAodHlwZU1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IHR5cGVNb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICByZXR1cm4gaXNQcmVzZW50KGlkKSA/IGV4cHJlc3Npb25UeXBlKGltcG9ydEV4cHIoaWQpLCB0eXBlUGFyYW1zLCB0eXBlTW9kaWZpZXJzKSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZXhwclxuICAgKiBAcGFyYW0gez89fSB0eXBlUGFyYW1zXG4gICAqIEBwYXJhbSB7Pz19IHR5cGVNb2RpZmllcnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGV4cHJlc3Npb25UeXBlKGV4cHIsIHR5cGVQYXJhbXMsIHR5cGVNb2RpZmllcnMpIHtcbiAgICAgIGlmICh0eXBlUGFyYW1zID09PSB2b2lkIDApIHsgdHlwZVBhcmFtcyA9IG51bGw7IH1cbiAgICAgIGlmICh0eXBlTW9kaWZpZXJzID09PSB2b2lkIDApIHsgdHlwZU1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgIHJldHVybiBpc1ByZXNlbnQoZXhwcikgPyBuZXcgRXhwcmVzc2lvblR5cGUoZXhwciwgdHlwZVBhcmFtcywgdHlwZU1vZGlmaWVycykgOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlc1xuICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBsaXRlcmFsQXJyKHZhbHVlcywgdHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQXJyYXlFeHByKHZhbHVlcywgdHlwZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmFsdWVzXG4gICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGxpdGVyYWxNYXAodmFsdWVzLCB0eXBlKSB7XG4gICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXBFeHByKHZhbHVlcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBuZXcgTGl0ZXJhbE1hcEVudHJ5KGVudHJ5WzBdLCBlbnRyeVsxXSk7IH0pLCB0eXBlKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBleHByXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBub3QoZXhwcikge1xuICAgICAgcmV0dXJuIG5ldyBOb3RFeHByKGV4cHIpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgKiBAcGFyYW0gez99IGJvZHlcbiAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZm4ocGFyYW1zLCBib2R5LCB0eXBlKSB7XG4gICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcihwYXJhbXMsIGJvZHksIHR5cGUpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGxpdGVyYWwodmFsdWUsIHR5cGUpIHtcbiAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEV4cHIodmFsdWUsIHR5cGUpO1xuICB9XG5cbiAgdmFyIENoZWNrQmluZGluZ0ZpZWxkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJZFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDaGVja0JpbmRpbmdGaWVsZChleHByZXNzaW9uLCBiaW5kaW5nSWQpIHtcbiAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICAgIHRoaXMuYmluZGluZ0lkID0gYmluZGluZ0lkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENoZWNrQmluZGluZ0ZpZWxkO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDaGVja0JpbmRpbmdGaWVsZChidWlsZGVyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiaW5kaW5nSWQgPSBcIlwiICsgYnVpbGRlci5maWVsZHMubGVuZ3RoO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmllbGRFeHByID0gY3JlYXRlQmluZEZpZWxkRXhwcihiaW5kaW5nSWQpO1xuICAgICAgLy8gcHJpdmF0ZSBpcyBmaW5lIGhlcmUgYXMgbm8gY2hpbGQgdmlldyB3aWxsIHJlZmVyZW5jZSB0aGUgY2FjaGVkIHZhbHVlLi4uXG4gICAgICBidWlsZGVyLmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGZpZWxkRXhwci5uYW1lLCBudWxsLCBbU3RtdE1vZGlmaWVyLlByaXZhdGVdKSk7XG4gICAgICBidWlsZGVyLmN0b3JTdG10cy5wdXNoKFRISVNfRVhQUi5wcm9wKGZpZWxkRXhwci5uYW1lKVxuICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlVOSU5JVElBTElaRUQpKSlcbiAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgcmV0dXJuIG5ldyBDaGVja0JpbmRpbmdGaWVsZChmaWVsZEV4cHIsIGJpbmRpbmdJZCk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZXZhbFJlc3VsdFxuICAgKiBAcGFyYW0gez99IGZpZWxkRXhwclxuICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VWYXJcbiAgICogQHBhcmFtIHs/fSBhY3Rpb25zXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDaGVja0JpbmRpbmdTdG10KGV2YWxSZXN1bHQsIGZpZWxkRXhwciwgdGhyb3dPbkNoYW5nZVZhciwgYWN0aW9ucykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uZGl0aW9uID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLmNoZWNrQmluZGluZykpLmNhbGxGbihbXG4gICAgICAgICAgdGhyb3dPbkNoYW5nZVZhciwgZmllbGRFeHByLCBldmFsUmVzdWx0LmN1cnJWYWxFeHByXG4gICAgICBdKTtcbiAgICAgIGlmIChldmFsUmVzdWx0LmZvcmNlVXBkYXRlKSB7XG4gICAgICAgICAgY29uZGl0aW9uID0gZXZhbFJlc3VsdC5mb3JjZVVwZGF0ZS5vcihjb25kaXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2YWxSZXN1bHQuc3RtdHMuY29uY2F0KFtcbiAgICAgICAgICBuZXcgSWZTdG10KGNvbmRpdGlvbiwgYWN0aW9ucy5jb25jYXQoWyhUSElTX0VYUFIucHJvcChmaWVsZEV4cHIubmFtZSkuc2V0KGV2YWxSZXN1bHQuY3VyclZhbEV4cHIpLnRvU3RtdCgpKVxuICAgICAgICAgIF0pKVxuICAgICAgXSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYmluZGluZ0lkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVCaW5kRmllbGRFeHByKGJpbmRpbmdJZCkge1xuICAgICAgcmV0dXJuIFRISVNfRVhQUi5wcm9wKFwiX2V4cHJfXCIgKyBiaW5kaW5nSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZURpVG9rZW5FeHByZXNzaW9uKHRva2VuKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KHRva2VuLnZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBsaXRlcmFsKHRva2VuLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKHRva2VuLmlkZW50aWZpZXIpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlSW5saW5lQXJyYXkodmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuRU1QVFlfSU5MSU5FX0FSUkFZKSk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb2cyID0gTWF0aC5sb2codmFsdWVzLmxlbmd0aCkgLyBNYXRoLmxvZygyKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gTWF0aC5jZWlsKGxvZzIpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaWRlbnRpZmllclNwZWMgPSBpbmRleCA8IElkZW50aWZpZXJzLmlubGluZUFycmF5cy5sZW5ndGggPyBJZGVudGlmaWVycy5pbmxpbmVBcnJheXNbaW5kZXhdIDpcbiAgICAgICAgICBJZGVudGlmaWVycy5JbmxpbmVBcnJheUR5bmFtaWM7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZGVudGlmaWVyID0gY3JlYXRlSWRlbnRpZmllcihpZGVudGlmaWVyU3BlYyk7XG4gICAgICByZXR1cm4gaW1wb3J0RXhwcihpZGVudGlmaWVyKS5pbnN0YW50aWF0ZShbKGxpdGVyYWwodmFsdWVzLmxlbmd0aCkpXG4gICAgICBdLmNvbmNhdCh2YWx1ZXMpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBmblxuICAgKiBAcGFyYW0gez99IGFyZ0NvdW50XG4gICAqIEBwYXJhbSB7P30gcHVyZVByb3h5UHJvcFxuICAgKiBAcGFyYW0gez99IGJ1aWxkZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVB1cmVQcm94eShmbiwgYXJnQ291bnQsIHB1cmVQcm94eVByb3AsIGJ1aWxkZXIpIHtcbiAgICAgIGJ1aWxkZXIuZmllbGRzLnB1c2gobmV3IENsYXNzRmllbGQocHVyZVByb3h5UHJvcC5uYW1lLCBudWxsKSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwdXJlUHJveHlJZCA9IGFyZ0NvdW50IDwgSWRlbnRpZmllcnMucHVyZVByb3hpZXMubGVuZ3RoID8gSWRlbnRpZmllcnMucHVyZVByb3hpZXNbYXJnQ291bnRdIDogbnVsbDtcbiAgICAgIGlmICghcHVyZVByb3h5SWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgYXJndW1lbnQgZm9yIHB1cmUgZnVuY3Rpb25zOiBcIiArIGFyZ0NvdW50KTtcbiAgICAgIH1cbiAgICAgIGJ1aWxkZXIuY3RvclN0bXRzLnB1c2goVEhJU19FWFBSLnByb3AocHVyZVByb3h5UHJvcC5uYW1lKVxuICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKHB1cmVQcm94eUlkKSkuY2FsbEZuKFtmbl0pKVxuICAgICAgICAgIC50b1N0bXQoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZW51bVR5cGVcbiAgICogQHBhcmFtIHs/fSBlbnVtVmFsdWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1FeHByZXNzaW9uKGVudW1UeXBlLCBlbnVtVmFsdWUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudW1OYW1lID0gT2JqZWN0LmtleXMoZW51bVR5cGUucnVudGltZSkuZmluZChmdW5jdGlvbiAocHJvcE5hbWUpIHsgcmV0dXJuIGVudW1UeXBlLnJ1bnRpbWVbcHJvcE5hbWVdID09PSBlbnVtVmFsdWU7IH0pO1xuICAgICAgaWYgKCFlbnVtTmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZW51bSB2YWx1ZSBcIiArIGVudW1WYWx1ZSArIFwiIGluIFwiICsgZW51bVR5cGUubmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW1wb3J0RXhwcihjcmVhdGVFbnVtSWRlbnRpZmllcihlbnVtVHlwZSwgZW51bU5hbWUpKTtcbiAgfVxuXG4gIHZhciAvKiogQHR5cGUgez99ICovIFZBTF9VTldSQVBQRVJfVkFSID0gdmFyaWFibGUoXCJ2YWxVbndyYXBwZXJcIik7XG4gIHZhciBFdmVudEhhbmRsZXJWYXJzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEV2ZW50SGFuZGxlclZhcnMoKSB7XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXJWYXJzLmV2ZW50ID0gdmFyaWFibGUoJyRldmVudCcpO1xuICAgICAgcmV0dXJuIEV2ZW50SGFuZGxlclZhcnM7XG4gIH0oKSk7XG4gIHZhciBDb252ZXJ0UHJvcGVydHlCaW5kaW5nUmVzdWx0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10c1xuICAgICAgICogQHBhcmFtIHs/fSBjdXJyVmFsRXhwclxuICAgICAgICogQHBhcmFtIHs/fSBmb3JjZVVwZGF0ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb252ZXJ0UHJvcGVydHlCaW5kaW5nUmVzdWx0KHN0bXRzLCBjdXJyVmFsRXhwciwgZm9yY2VVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLnN0bXRzID0gc3RtdHM7XG4gICAgICAgICAgdGhpcy5jdXJyVmFsRXhwciA9IGN1cnJWYWxFeHByO1xuICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUgPSBmb3JjZVVwZGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb252ZXJ0UHJvcGVydHlCaW5kaW5nUmVzdWx0O1xuICB9KCkpO1xuICAvKipcbiAgICogIENvbnZlcnRzIHRoZSBnaXZlbiBleHByZXNzaW9uIEFTVCBpbnRvIGFuIGV4ZWN1dGFibGUgb3V0cHV0IEFTVCwgYXNzdW1pbmcgdGhlIGV4cHJlc3Npb24gaXNcbiAgICAqIHVzZWQgaW4gYSBwcm9wZXJ0eSBiaW5kaW5nLlxuICAgKiBAcGFyYW0gez99IGJ1aWxkZXJcbiAgICogQHBhcmFtIHs/fSBuYW1lUmVzb2x2ZXJcbiAgICogQHBhcmFtIHs/fSBpbXBsaWNpdFJlY2VpdmVyXG4gICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvblxuICAgKiBAcGFyYW0gez99IGJpbmRpbmdJZFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydFByb3BlcnR5QmluZGluZyhidWlsZGVyLCBuYW1lUmVzb2x2ZXIsIGltcGxpY2l0UmVjZWl2ZXIsIGV4cHJlc3Npb24sIGJpbmRpbmdJZCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyclZhbEV4cHIgPSBjcmVhdGVDdXJyVmFsdWVFeHByKGJpbmRpbmdJZCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdG10cyA9IFtdO1xuICAgICAgaWYgKCFuYW1lUmVzb2x2ZXIpIHtcbiAgICAgICAgICBuYW1lUmVzb2x2ZXIgPSBuZXcgRGVmYXVsdE5hbWVSZXNvbHZlcigpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRvciA9IG5ldyBfQXN0VG9JclZpc2l0b3IoYnVpbGRlciwgbmFtZVJlc29sdmVyLCBpbXBsaWNpdFJlY2VpdmVyLCBWQUxfVU5XUkFQUEVSX1ZBUiwgYmluZGluZ0lkLCBmYWxzZSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRwdXRFeHByID0gZXhwcmVzc2lvbi52aXNpdCh2aXNpdG9yLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgIGlmICghb3V0cHV0RXhwcikge1xuICAgICAgICAgIC8vIGUuZy4gYW4gZW1wdHkgZXhwcmVzc2lvbiB3YXMgZ2l2ZW5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh2aXNpdG9yLnRlbXBvcmFyeUNvdW50KSB7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHZpc2l0b3IudGVtcG9yYXJ5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgICBzdG10cy5wdXNoKHRlbXBvcmFyeURlY2xhcmF0aW9uKGJpbmRpbmdJZCwgaSkpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2aXNpdG9yLm5lZWRzVmFsdWVVbndyYXBwZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbml0VmFsdWVVbndyYXBwZXJTdG10ID0gVkFMX1VOV1JBUFBFUl9WQVIuY2FsbE1ldGhvZCgncmVzZXQnLCBbXSkudG9TdG10KCk7XG4gICAgICAgICAgc3RtdHMucHVzaChpbml0VmFsdWVVbndyYXBwZXJTdG10KTtcbiAgICAgIH1cbiAgICAgIHN0bXRzLnB1c2goY3VyclZhbEV4cHIuc2V0KG91dHB1dEV4cHIpLnRvRGVjbFN0bXQobnVsbCwgW1N0bXRNb2RpZmllci5GaW5hbF0pKTtcbiAgICAgIGlmICh2aXNpdG9yLm5lZWRzVmFsdWVVbndyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbnZlcnRQcm9wZXJ0eUJpbmRpbmdSZXN1bHQoc3RtdHMsIGN1cnJWYWxFeHByLCBWQUxfVU5XUkFQUEVSX1ZBUi5wcm9wKCdoYXNXcmFwcGVkVmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbnZlcnRQcm9wZXJ0eUJpbmRpbmdSZXN1bHQoc3RtdHMsIGN1cnJWYWxFeHByLCBudWxsKTtcbiAgICAgIH1cbiAgfVxuICB2YXIgQ29udmVydEFjdGlvbkJpbmRpbmdSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRzXG4gICAgICAgKiBAcGFyYW0gez99IHByZXZlbnREZWZhdWx0XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbnZlcnRBY3Rpb25CaW5kaW5nUmVzdWx0KHN0bXRzLCBwcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIHRoaXMuc3RtdHMgPSBzdG10cztcbiAgICAgICAgICB0aGlzLnByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29udmVydEFjdGlvbkJpbmRpbmdSZXN1bHQ7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgQ29udmVydHMgdGhlIGdpdmVuIGV4cHJlc3Npb24gQVNUIGludG8gYW4gZXhlY3V0YWJsZSBvdXRwdXQgQVNULCBhc3N1bWluZyB0aGUgZXhwcmVzc2lvbiBpc1xuICAgICogdXNlZCBpbiBhbiBhY3Rpb24gYmluZGluZyAoZS5nLiBhbiBldmVudCBoYW5kbGVyKS5cbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEBwYXJhbSB7P30gbmFtZVJlc29sdmVyXG4gICAqIEBwYXJhbSB7P30gaW1wbGljaXRSZWNlaXZlclxuICAgKiBAcGFyYW0gez99IGFjdGlvblxuICAgKiBAcGFyYW0gez99IGJpbmRpbmdJZFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY29udmVydEFjdGlvbkJpbmRpbmcoYnVpbGRlciwgbmFtZVJlc29sdmVyLCBpbXBsaWNpdFJlY2VpdmVyLCBhY3Rpb24sIGJpbmRpbmdJZCkge1xuICAgICAgaWYgKCFuYW1lUmVzb2x2ZXIpIHtcbiAgICAgICAgICBuYW1lUmVzb2x2ZXIgPSBuZXcgRGVmYXVsdE5hbWVSZXNvbHZlcigpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRvciA9IG5ldyBfQXN0VG9JclZpc2l0b3IoYnVpbGRlciwgbmFtZVJlc29sdmVyLCBpbXBsaWNpdFJlY2VpdmVyLCBudWxsLCBiaW5kaW5nSWQsIHRydWUpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWN0aW9uU3RtdHMgPSBbXTtcbiAgICAgIGZsYXR0ZW5TdGF0ZW1lbnRzKGFjdGlvbi52aXNpdCh2aXNpdG9yLCBfTW9kZS5TdGF0ZW1lbnQpLCBhY3Rpb25TdG10cyk7XG4gICAgICBwcmVwZW5kVGVtcG9yYXJ5RGVjbHModmlzaXRvci50ZW1wb3JhcnlDb3VudCwgYmluZGluZ0lkLCBhY3Rpb25TdG10cyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0SW5kZXggPSBhY3Rpb25TdG10cy5sZW5ndGggLSAxO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJldmVudERlZmF1bHRWYXIgPSBudWxsO1xuICAgICAgaWYgKGxhc3RJbmRleCA+PSAwKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGFzdFN0YXRlbWVudCA9IGFjdGlvblN0bXRzW2xhc3RJbmRleF07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmV0dXJuRXhwciA9IGNvbnZlcnRTdG10SW50b0V4cHJlc3Npb24obGFzdFN0YXRlbWVudCk7XG4gICAgICAgICAgaWYgKHJldHVybkV4cHIpIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBjYXN0IHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBjYWxsIHRvIGR5bmFtaWMsXG4gICAgICAgICAgICAgIC8vIGFzIGl0IG1pZ2h0IGJlIGEgdm9pZCBtZXRob2QhXG4gICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0VmFyID0gY3JlYXRlUHJldmVudERlZmF1bHRWYXIoYmluZGluZ0lkKTtcbiAgICAgICAgICAgICAgYWN0aW9uU3RtdHNbbGFzdEluZGV4XSA9XG4gICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdFZhci5zZXQocmV0dXJuRXhwci5jYXN0KERZTkFNSUNfVFlQRSkubm90SWRlbnRpY2FsKGxpdGVyYWwoZmFsc2UpKSlcbiAgICAgICAgICAgICAgICAgICAgICAudG9EZWNsU3RtdChudWxsLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDb252ZXJ0QWN0aW9uQmluZGluZ1Jlc3VsdChhY3Rpb25TdG10cywgcHJldmVudERlZmF1bHRWYXIpO1xuICB9XG4gIC8qKlxuICAgKiAgQ3JlYXRlcyB2YXJpYWJsZXMgdGhhdCBhcmUgc2hhcmVkIGJ5IG11bHRpcGxlIGNhbGxzIHRvIGBjb252ZXJ0QWN0aW9uQmluZGluZ2AgL1xuICAgICogYGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmdgXG4gICAqIEBwYXJhbSB7P30gc3RtdHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXJlZEJpbmRpbmdWYXJpYWJsZXNJZk5lZWRlZChzdG10cykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdW53cmFwcGVyU3RtdHMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlYWRWYXJzID0gZmluZFJlYWRWYXJOYW1lcyhzdG10cyk7XG4gICAgICBpZiAocmVhZFZhcnMuaGFzKFZBTF9VTldSQVBQRVJfVkFSLm5hbWUpKSB7XG4gICAgICAgICAgdW53cmFwcGVyU3RtdHMucHVzaChWQUxfVU5XUkFQUEVSX1ZBUlxuICAgICAgICAgICAgICAuc2V0KGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5WYWx1ZVVud3JhcHBlcikpLmluc3RhbnRpYXRlKFtdKSlcbiAgICAgICAgICAgICAgLnRvRGVjbFN0bXQobnVsbCwgW1N0bXRNb2RpZmllci5GaW5hbF0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZXJTdG10cztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBiaW5kaW5nSWRcbiAgICogQHBhcmFtIHs/fSB0ZW1wb3JhcnlOdW1iZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHRlbXBvcmFyeU5hbWUoYmluZGluZ0lkLCB0ZW1wb3JhcnlOdW1iZXIpIHtcbiAgICAgIHJldHVybiBcInRtcF9cIiArIGJpbmRpbmdJZCArIFwiX1wiICsgdGVtcG9yYXJ5TnVtYmVyO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGJpbmRpbmdJZFxuICAgKiBAcGFyYW0gez99IHRlbXBvcmFyeU51bWJlclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdGVtcG9yYXJ5RGVjbGFyYXRpb24oYmluZGluZ0lkLCB0ZW1wb3JhcnlOdW1iZXIpIHtcbiAgICAgIHJldHVybiBuZXcgRGVjbGFyZVZhclN0bXQodGVtcG9yYXJ5TmFtZShiaW5kaW5nSWQsIHRlbXBvcmFyeU51bWJlciksIE5VTExfRVhQUik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdGVtcG9yYXJ5Q291bnRcbiAgICogQHBhcmFtIHs/fSBiaW5kaW5nSWRcbiAgICogQHBhcmFtIHs/fSBzdGF0ZW1lbnRzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBwcmVwZW5kVGVtcG9yYXJ5RGVjbHModGVtcG9yYXJ5Q291bnQsIGJpbmRpbmdJZCwgc3RhdGVtZW50cykge1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gdGVtcG9yYXJ5Q291bnQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHN0YXRlbWVudHMudW5zaGlmdCh0ZW1wb3JhcnlEZWNsYXJhdGlvbihiaW5kaW5nSWQsIGkpKTtcbiAgICAgIH1cbiAgfVxuICB2YXIgX01vZGUgPSB7fTtcbiAgX01vZGUuU3RhdGVtZW50ID0gMDtcbiAgX01vZGUuRXhwcmVzc2lvbiA9IDE7XG4gIF9Nb2RlW19Nb2RlLlN0YXRlbWVudF0gPSBcIlN0YXRlbWVudFwiO1xuICBfTW9kZVtfTW9kZS5FeHByZXNzaW9uXSA9IFwiRXhwcmVzc2lvblwiO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAqIEBwYXJhbSB7P30gYXN0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBlbnN1cmVTdGF0ZW1lbnRNb2RlKG1vZGUsIGFzdCkge1xuICAgICAgaWYgKG1vZGUgIT09IF9Nb2RlLlN0YXRlbWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGEgc3RhdGVtZW50LCBidXQgc2F3IFwiICsgYXN0KTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAqIEBwYXJhbSB7P30gYXN0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBlbnN1cmVFeHByZXNzaW9uTW9kZShtb2RlLCBhc3QpIHtcbiAgICAgIGlmIChtb2RlICE9PSBfTW9kZS5FeHByZXNzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgYW4gZXhwcmVzc2lvbiwgYnV0IHNhdyBcIiArIGFzdCk7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbW9kZVxuICAgKiBAcGFyYW0gez99IGV4cHJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIGV4cHIpIHtcbiAgICAgIGlmIChtb2RlID09PSBfTW9kZS5TdGF0ZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZXhwci50b1N0bXQoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiBleHByO1xuICAgICAgfVxuICB9XG4gIHZhciBfQXN0VG9JclZpc2l0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9idWlsZGVyXG4gICAgICAgKiBAcGFyYW0gez99IF9uYW1lUmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX2ltcGxpY2l0UmVjZWl2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3ZhbHVlVW53cmFwcGVyXG4gICAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJZFxuICAgICAgICogQHBhcmFtIHs/fSBpc0FjdGlvblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfQXN0VG9JclZpc2l0b3IoX2J1aWxkZXIsIF9uYW1lUmVzb2x2ZXIsIF9pbXBsaWNpdFJlY2VpdmVyLCBfdmFsdWVVbndyYXBwZXIsIGJpbmRpbmdJZCwgaXNBY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLl9idWlsZGVyID0gX2J1aWxkZXI7XG4gICAgICAgICAgdGhpcy5fbmFtZVJlc29sdmVyID0gX25hbWVSZXNvbHZlcjtcbiAgICAgICAgICB0aGlzLl9pbXBsaWNpdFJlY2VpdmVyID0gX2ltcGxpY2l0UmVjZWl2ZXI7XG4gICAgICAgICAgdGhpcy5fdmFsdWVVbndyYXBwZXIgPSBfdmFsdWVVbndyYXBwZXI7XG4gICAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSWQ7XG4gICAgICAgICAgdGhpcy5pc0FjdGlvbiA9IGlzQWN0aW9uO1xuICAgICAgICAgIHRoaXMuX25vZGVNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fcmVzdWx0TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRUZW1wb3JhcnkgPSAwO1xuICAgICAgICAgIHRoaXMubmVlZHNWYWx1ZVVud3JhcHBlciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudGVtcG9yYXJ5Q291bnQgPSAwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9wO1xuICAgICAgICAgIHN3aXRjaCAoYXN0Lm9wZXJhdGlvbikge1xuICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuUGx1cztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuTWludXM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLk11bHRpcGx5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5EaXZpZGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLk1vZHVsbztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLkFuZDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLk9yO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuRXF1YWxzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuTm90RXF1YWxzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLklkZW50aWNhbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5Ob3RJZGVudGljYWw7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLkxvd2VyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5CaWdnZXI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5Mb3dlckVxdWFscztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLkJpZ2dlckVxdWFscztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIFwiICsgYXN0Lm9wZXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKG9wLCB0aGlzLnZpc2l0KGFzdC5sZWZ0LCBfTW9kZS5FeHByZXNzaW9uKSwgdGhpcy52aXNpdChhc3QucmlnaHQsIF9Nb2RlLkV4cHJlc3Npb24pKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2hhaW4gPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgZW5zdXJlU3RhdGVtZW50TW9kZShtb2RlLCBhc3QpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucywgbW9kZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWwgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSB0aGlzLnZpc2l0KGFzdC5jb25kaXRpb24sIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCB2YWx1ZS5jb25kaXRpb25hbCh0aGlzLnZpc2l0KGFzdC50cnVlRXhwLCBfTW9kZS5FeHByZXNzaW9uKSwgdGhpcy52aXNpdChhc3QuZmFsc2VFeHAsIF9Nb2RlLkV4cHJlc3Npb24pKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGlwZSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnB1dCA9IHRoaXMudmlzaXQoYXN0LmV4cCwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gdGhpcy5fbmFtZVJlc29sdmVyLmNhbGxQaXBlKGFzdC5uYW1lLCBpbnB1dCwgYXJncyk7XG4gICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBQaXBlIFwiICsgYXN0Lm5hbWUgKyBcIiBpcyBub3QgYWxsb3dlZCBoZXJlIVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZWVkc1ZhbHVlVW53cmFwcGVyID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgdGhpcy5fdmFsdWVVbndyYXBwZXIuY2FsbE1ldGhvZCgndW53cmFwJywgW3ZhbHVlXSkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgdGhpcy52aXNpdChhc3QudGFyZ2V0LCBfTW9kZS5FeHByZXNzaW9uKS5jYWxsRm4odGhpcy52aXNpdEFsbChhc3QuYXJncywgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbXBsaWNpdFJlY2VpdmVyID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICAgIGVuc3VyZUV4cHJlc3Npb25Nb2RlKG1vZGUsIGFzdCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICBlbnN1cmVFeHByZXNzaW9uTW9kZShtb2RlLCBhc3QpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFyZ3MgPSBbbGl0ZXJhbChhc3QuZXhwcmVzc2lvbnMubGVuZ3RoKV07XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGFzdC5zdHJpbmdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICBhcmdzLnB1c2gobGl0ZXJhbChhc3Quc3RyaW5nc1tpXSkpO1xuICAgICAgICAgICAgICBhcmdzLnB1c2godGhpcy52aXNpdChhc3QuZXhwcmVzc2lvbnNbaV0sIF9Nb2RlLkV4cHJlc3Npb24pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXJncy5wdXNoKGxpdGVyYWwoYXN0LnN0cmluZ3NbYXN0LnN0cmluZ3MubGVuZ3RoIC0gMV0pKTtcbiAgICAgICAgICByZXR1cm4gYXN0LmV4cHJlc3Npb25zLmxlbmd0aCA8PSA5ID9cbiAgICAgICAgICAgICAgaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLmlubGluZUludGVycG9sYXRlKSkuY2FsbEZuKGFyZ3MpIDpcbiAgICAgICAgICAgICAgaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLmludGVycG9sYXRlKSkuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICAgIGFyZ3NbMF0sIGxpdGVyYWxBcnIoYXJncy5zbGljZSgxKSlcbiAgICAgICAgICAgICAgXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxlZnRNb3N0U2FmZSA9IHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpO1xuICAgICAgICAgIGlmIChsZWZ0TW9zdFNhZmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNhZmVBY2Nlc3MoYXN0LCBsZWZ0TW9zdFNhZmUsIG1vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIHRoaXMudmlzaXQoYXN0Lm9iaiwgX01vZGUuRXhwcmVzc2lvbikua2V5KHRoaXMudmlzaXQoYXN0LmtleSwgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0S2V5ZWRXcml0ZSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvYmogPSB0aGlzLnZpc2l0KGFzdC5vYmosIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IHRoaXMudmlzaXQoYXN0LmtleSwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSB0aGlzLnZpc2l0KGFzdC52YWx1ZSwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIG9iai5rZXkoa2V5KS5zZXQodmFsdWUpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXkgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucywgbW9kZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGl0ZXJhbEFyciQkID0gdGhpcy5pc0FjdGlvbiA/IGxpdGVyYWxBcnIocGFydHMpIDogY3JlYXRlQ2FjaGVkTGl0ZXJhbEFycmF5KHRoaXMuX2J1aWxkZXIsIHBhcnRzKTtcbiAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgbGl0ZXJhbEFyciQkKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gW107XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGFzdC5rZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goW2FzdC5rZXlzW2ldLCB0aGlzLnZpc2l0KGFzdC52YWx1ZXNbaV0sIF9Nb2RlLkV4cHJlc3Npb24pXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpdGVyYWxNYXAkJCA9IHRoaXMuaXNBY3Rpb24gPyBsaXRlcmFsTWFwKHBhcnRzKSA6IGNyZWF0ZUNhY2hlZExpdGVyYWxNYXAodGhpcy5fYnVpbGRlciwgcGFydHMpO1xuICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCBsaXRlcmFsTWFwJCQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIGxpdGVyYWwoYXN0LnZhbHVlKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUuX2dldExvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0FjdGlvbiAmJiBuYW1lID09IEV2ZW50SGFuZGxlclZhcnMuZXZlbnQubmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVyVmFycy5ldmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVSZXNvbHZlci5nZXRMb2NhbChuYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxlZnRNb3N0U2FmZSA9IHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpO1xuICAgICAgICAgIGlmIChsZWZ0TW9zdFNhZmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNhZmVBY2Nlc3MoYXN0LCBsZWZ0TW9zdFNhZmUsIG1vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNlaXZlciA9IHRoaXMudmlzaXQoYXN0LnJlY2VpdmVyLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09PSB0aGlzLl9pbXBsaWNpdFJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YXJFeHByID0gdGhpcy5fZ2V0TG9jYWwoYXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh2YXJFeHByKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhckV4cHIuY2FsbEZuKGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc0JsYW5rKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlY2VpdmVyLmNhbGxNZXRob2QoYXN0Lm5hbWUsIGFyZ3MpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRQcmVmaXhOb3QgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIG5vdCh0aGlzLnZpc2l0KGFzdC5leHByZXNzaW9uLCBfTW9kZS5FeHByZXNzaW9uKSkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsZWZ0TW9zdFNhZmUgPSB0aGlzLmxlZnRNb3N0U2FmZU5vZGUoYXN0KTtcbiAgICAgICAgICBpZiAobGVmdE1vc3RTYWZlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTYWZlQWNjZXNzKGFzdCwgbGVmdE1vc3RTYWZlLCBtb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY2VpdmVyID0gdGhpcy52aXNpdChhc3QucmVjZWl2ZXIsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT09IHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldExvY2FsKGFzdC5uYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNCbGFuayhyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5wcm9wKGFzdC5uYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJvcGVydHlXcml0ZSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNlaXZlciA9IHRoaXMudmlzaXQoYXN0LnJlY2VpdmVyLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgICAgICBpZiAocmVjZWl2ZXIgPT09IHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFyRXhwciA9IHRoaXMuX2dldExvY2FsKGFzdC5uYW1lKTtcbiAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh2YXJFeHByKSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXNzaWduIHRvIGEgcmVmZXJlbmNlIG9yIHZhcmlhYmxlIScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCByZWNlaXZlci5wcm9wKGFzdC5uYW1lKS5zZXQodGhpcy52aXNpdChhc3QudmFsdWUsIF9Nb2RlLkV4cHJlc3Npb24pKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2FmZUFjY2Vzcyhhc3QsIHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpLCBtb2RlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRTYWZlTWV0aG9kQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2FmZUFjY2Vzcyhhc3QsIHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpLCBtb2RlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0c1xuICAgICAgICogQHBhcmFtIHs/fSBtb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsID0gZnVuY3Rpb24gKGFzdHMsIG1vZGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhc3RzLm1hcChmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBfdGhpcy52aXNpdChhc3QsIG1vZGUpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRRdW90ZSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1b3RlcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgZXZhbHVhdGlvbiEnKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IG1vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5fcmVzdWx0TWFwLmdldChhc3QpO1xuICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLl9ub2RlTWFwLmdldChhc3QpIHx8IGFzdCkudmlzaXQodGhpcywgbW9kZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBsZWZ0TW9zdFNhZmVcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS5jb252ZXJ0U2FmZUFjY2VzcyA9IGZ1bmN0aW9uIChhc3QsIGxlZnRNb3N0U2FmZSwgbW9kZSkge1xuICAgICAgICAgIC8vIElmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIGEgc2FmZSBhY2Nlc3Mgbm9kZSBvbiB0aGUgbGVmdCBpdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG9cbiAgICAgICAgICAvLyBhbiBleHByZXNzaW9uIHRoYXQgZ3VhcmRzIHRoZSBhY2Nlc3MgdG8gdGhlIG1lbWJlciBieSBjaGVja2luZyB0aGUgcmVjZWl2ZXIgZm9yIGJsYW5rLiBBc1xuICAgICAgICAgIC8vIGV4ZWN1dGlvbiBwcm9jZWVkcyBmcm9tIGxlZnQgdG8gcmlnaHQsIHRoZSBsZWZ0IG1vc3QgcGFydCBvZiB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIGd1YXJkZWRcbiAgICAgICAgICAvLyBmaXJzdCBidXQsIGJlY2F1c2UgbWVtYmVyIGFjY2VzcyBpcyBsZWZ0IGFzc29jaWF0aXZlLCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBhdFxuICAgICAgICAgIC8vIHRoZSB0b3Agb2YgdGhlIEFTVC4gVGhlIGRlc2lyZWQgcmVzdWx0IHJlcXVpcmVzIGxpZnRpbmcgYSBjb3B5IG9mIHRoZSB0aGUgbGVmdCBwYXJ0IG9mIHRoZVxuICAgICAgICAgIC8vIGV4cHJlc3Npb24gdXAgdG8gdGVzdCBpdCBmb3IgYmxhbmsgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIHVuZ3VhcmRlZCB2ZXJzaW9uLlxuICAgICAgICAgIC8vIENvbnNpZGVyLCBmb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb246IGE/LmIuYz8uZC5lXG4gICAgICAgICAgLy8gVGhpcyByZXN1bHRzIGluIHRoZSBhc3Q6XG4gICAgICAgICAgLy8gICAgICAgICAuXG4gICAgICAgICAgLy8gICAgICAgIC8gXFxcbiAgICAgICAgICAvLyAgICAgICA/LiAgIGVcbiAgICAgICAgICAvLyAgICAgIC8gIFxcXG4gICAgICAgICAgLy8gICAgIC4gICAgZFxuICAgICAgICAgIC8vICAgIC8gXFxcbiAgICAgICAgICAvLyAgID8uICBjXG4gICAgICAgICAgLy8gIC8gIFxcXG4gICAgICAgICAgLy8gYSAgICBiXG4gICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0cmVlIHNob3VsZCBiZSBnZW5lcmF0ZWQ6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgICAgICAgLy0tLS0gPyAtLS0tXFxcbiAgICAgICAgICAvLyAgICAgICAvICAgICAgfCAgICAgIFxcXG4gICAgICAgICAgLy8gICAgIGEgICAvLS0tID8gLS0tXFwgIG51bGxcbiAgICAgICAgICAvLyAgICAgICAgLyAgICAgfCAgICAgXFxcbiAgICAgICAgICAvLyAgICAgICAuICAgICAgLiAgICAgbnVsbFxuICAgICAgICAgIC8vICAgICAgLyBcXCAgICAvIFxcXG4gICAgICAgICAgLy8gICAgIC4gIGMgICAuICAgZVxuICAgICAgICAgIC8vICAgIC8gXFwgICAgLyBcXFxuICAgICAgICAgIC8vICAgYSAgIGIgICwgICBkXG4gICAgICAgICAgLy8gICAgICAgICAvIFxcXG4gICAgICAgICAgLy8gICAgICAgIC4gICBjXG4gICAgICAgICAgLy8gICAgICAgLyBcXFxuICAgICAgICAgIC8vICAgICAgYSAgIGJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE5vdGljZSB0aGF0IHRoZSBmaXJzdCBndWFyZCBjb25kaXRpb24gaXMgdGhlIGxlZnQgaGFuZCBvZiB0aGUgbGVmdCBtb3N0IHNhZmUgYWNjZXNzIG5vZGVcbiAgICAgICAgICAvLyB3aGljaCBjb21lcyBpbiBhcyBsZWZ0TW9zdFNhZmUgdG8gdGhpcyByb3V0aW5lLlxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGd1YXJkZWRFeHByZXNzaW9uID0gdGhpcy52aXNpdChsZWZ0TW9zdFNhZmUucmVjZWl2ZXIsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBvcmFyeTtcbiAgICAgICAgICBpZiAodGhpcy5uZWVkc1RlbXBvcmFyeShsZWZ0TW9zdFNhZmUucmVjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBleHByZXNzaW9uIGhhcyBtZXRob2QgY2FsbHMgb3IgcGlwZXMgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgdGhlIHJlc3VsdCBpbnRvIGFcbiAgICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIGF2b2lkIGNhbGxpbmcgc3RhdGVmdWwgb3IgaW1wdXJlIGNvZGUgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgICAgIHRlbXBvcmFyeSA9IHRoaXMuYWxsb2NhdGVUZW1wb3JhcnkoKTtcbiAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIHJlc3VsdCBpbiB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlXG4gICAgICAgICAgICAgIGd1YXJkZWRFeHByZXNzaW9uID0gdGVtcG9yYXJ5LnNldChndWFyZGVkRXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgIC8vIEVuc3VyZSBhbGwgZnVydGhlciByZWZlcmVuY2VzIHRvIHRoZSBndWFyZGVkIGV4cHJlc3Npb24gcmVmZXIgdG8gdGhlIHRlbXBvcmFyeSBpbnN0ZWFkLlxuICAgICAgICAgICAgICB0aGlzLl9yZXN1bHRNYXAuc2V0KGxlZnRNb3N0U2FmZS5yZWNlaXZlciwgdGVtcG9yYXJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uZGl0aW9uID0gZ3VhcmRlZEV4cHJlc3Npb24uaXNCbGFuaygpO1xuICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGFzdCB0byBhbiB1bmd1YXJkZWQgYWNjZXNzIHRvIHRoZSByZWNlaXZlcidzIG1lbWJlci4gVGhlIG1hcCB3aWxsIHN1YnN0aXR1dGVcbiAgICAgICAgICAvLyBsZWZ0TW9zdE5vZGUgd2l0aCBpdHMgdW5ndWFyZGVkIHZlcnNpb24gaW4gdGhlIGNhbGwgdG8gYHRoaXMudmlzaXQoKWAuXG4gICAgICAgICAgaWYgKGxlZnRNb3N0U2FmZSBpbnN0YW5jZW9mIFNhZmVNZXRob2RDYWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25vZGVNYXAuc2V0KGxlZnRNb3N0U2FmZSwgbmV3IE1ldGhvZENhbGwobGVmdE1vc3RTYWZlLnNwYW4sIGxlZnRNb3N0U2FmZS5yZWNlaXZlciwgbGVmdE1vc3RTYWZlLm5hbWUsIGxlZnRNb3N0U2FmZS5hcmdzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9ub2RlTWFwLnNldChsZWZ0TW9zdFNhZmUsIG5ldyBQcm9wZXJ0eVJlYWQobGVmdE1vc3RTYWZlLnNwYW4sIGxlZnRNb3N0U2FmZS5yZWNlaXZlciwgbGVmdE1vc3RTYWZlLm5hbWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB0aGUgbm9kZSBub3cgd2l0aG91dCB0aGUgZ3VhcmRlZCBtZW1iZXIgYWNjZXNzLlxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFjY2VzcyA9IHRoaXMudmlzaXQoYXN0LCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIG1hcHBpbmcuIFRoaXMgaXMgbm90IHN0cmljdGx5IHJlcXVpcmVkIGFzIHRoZSBjb252ZXJ0ZXIgb25seSB0cmF2ZXJzZXMgZWFjaCBub2RlXG4gICAgICAgICAgLy8gb25jZSBidXQgaXMgc2FmZXIgaWYgdGhlIGNvbnZlcnNpb24gaXMgY2hhbmdlZCB0byB0cmF2ZXJzZSB0aGUgbm9kZXMgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgICAgdGhpcy5fbm9kZU1hcC5kZWxldGUobGVmdE1vc3RTYWZlKTtcbiAgICAgICAgICAvLyBJZiB3ZSBhbGxjb2F0ZWQgYSB0ZW1wb3JhcnksIHJlbGVhc2UgaXQuXG4gICAgICAgICAgaWYgKHRlbXBvcmFyeSkge1xuICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VUZW1wb3JhcnkodGVtcG9yYXJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJvZHVjZSB0aGUgY29uZGl0aW9uYWxcbiAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgY29uZGl0aW9uLmNvbmRpdGlvbmFsKGxpdGVyYWwobnVsbCksIGFjY2VzcykpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUubGVmdE1vc3RTYWZlTm9kZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGFzdCkge1xuICAgICAgICAgICAgICByZXR1cm4gKF90aGlzLl9ub2RlTWFwLmdldChhc3QpIHx8IGFzdCkudmlzaXQodmlzaXRvcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXN0LnZpc2l0KHtcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdEJpbmFyeTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdENoYWluOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0Q29uZGl0aW9uYWw6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRGdW5jdGlvbkNhbGw6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdEtleWVkUmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXQodGhpcywgYXN0Lm9iaik7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRLZXllZFdyaXRlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0TGl0ZXJhbEFycmF5OiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0TGl0ZXJhbE1hcDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdExpdGVyYWxQcmltaXRpdmU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0UGlwZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFByZWZpeE5vdDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFByb3BlcnR5UmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXQodGhpcywgYXN0LnJlY2VpdmVyKTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFByb3BlcnR5V3JpdGU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRRdW90ZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFNhZmVNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpIHx8IGFzdDsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQ6IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpIHx8IGFzdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUubmVlZHNUZW1wb3JhcnkgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBhc3QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzdCAmJiAoX3RoaXMuX25vZGVNYXAuZ2V0KGFzdCkgfHwgYXN0KS52aXNpdCh2aXNpdG9yKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0U29tZSA9IGZ1bmN0aW9uICh2aXNpdG9yLCBhc3QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzdC5zb21lKGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHZpc2l0KHZpc2l0b3IsIGFzdCk7IH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFzdC52aXNpdCh7XG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRCaW5hcnk6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHZpc2l0KHRoaXMsIGFzdC5sZWZ0KSB8fCB2aXNpdCh0aGlzLCBhc3QucmlnaHQpOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0Q2hhaW46IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0Q29uZGl0aW9uYWw6IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdCh0aGlzLCBhc3QuY29uZGl0aW9uKSB8fCB2aXNpdCh0aGlzLCBhc3QudHJ1ZUV4cCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICB2aXNpdCh0aGlzLCBhc3QuZmFsc2VFeHApO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0RnVuY3Rpb25DYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0SW1wbGljaXRSZWNlaXZlcjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdFNvbWUodGhpcywgYXN0LmV4cHJlc3Npb25zKTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdEtleWVkUmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRLZXllZFdyaXRlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdExpdGVyYWxBcnJheTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdHJ1ZTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdExpdGVyYWxNYXA6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRMaXRlcmFsUHJpbWl0aXZlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdE1ldGhvZENhbGw6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRQaXBlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0UHJlZml4Tm90OiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3QuZXhwcmVzc2lvbik7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRQcm9wZXJ0eVJlYWQ6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIHZpc2l0UHJvcGVydHlXcml0ZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRRdW90ZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgdmlzaXRTYWZlTWV0aG9kQ2FsbDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdHJ1ZTsgfSxcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQ6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLmFsbG9jYXRlVGVtcG9yYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBOdW1iZXIgPSB0aGlzLl9jdXJyZW50VGVtcG9yYXJ5Kys7XG4gICAgICAgICAgdGhpcy50ZW1wb3JhcnlDb3VudCA9IE1hdGgubWF4KHRoaXMuX2N1cnJlbnRUZW1wb3JhcnksIHRoaXMudGVtcG9yYXJ5Q291bnQpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVhZFZhckV4cHIodGVtcG9yYXJ5TmFtZSh0aGlzLmJpbmRpbmdJZCwgdGVtcE51bWJlcikpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wb3JhcnlcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUucmVsZWFzZVRlbXBvcmFyeSA9IGZ1bmN0aW9uICh0ZW1wb3JhcnkpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50VGVtcG9yYXJ5LS07XG4gICAgICAgICAgaWYgKHRlbXBvcmFyeS5uYW1lICE9IHRlbXBvcmFyeU5hbWUodGhpcy5iaW5kaW5nSWQsIHRoaXMuX2N1cnJlbnRUZW1wb3JhcnkpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRlbXBvcmFyeSBcIiArIHRlbXBvcmFyeS5uYW1lICsgXCIgcmVsZWFzZWQgb3V0IG9mIG9yZGVyXCIpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gX0FzdFRvSXJWaXNpdG9yO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBhcmdcbiAgICogQHBhcmFtIHs/fSBvdXRwdXRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXR0ZW5TdGF0ZW1lbnRzKGFyZywgb3V0cHV0KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgKChhcmcpKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZmxhdHRlblN0YXRlbWVudHMoZW50cnksIG91dHB1dCk7IH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goYXJnKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEBwYXJhbSB7P30gdmFsdWVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDYWNoZWRMaXRlcmFsQXJyYXkoYnVpbGRlciwgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuRU1QVFlfQVJSQVkpKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3h5RXhwciA9IFRISVNfRVhQUi5wcm9wKFwiX2Fycl9cIiArIGJ1aWxkZXIuZmllbGRzLmxlbmd0aCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm94eVBhcmFtcyA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJveHlSZXR1cm5FbnRyaWVzID0gW107XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1OYW1lID0gXCJwXCIgKyBpO1xuICAgICAgICAgIHByb3h5UGFyYW1zLnB1c2gobmV3IEZuUGFyYW0ocGFyYW1OYW1lKSk7XG4gICAgICAgICAgcHJveHlSZXR1cm5FbnRyaWVzLnB1c2godmFyaWFibGUocGFyYW1OYW1lKSk7XG4gICAgICB9XG4gICAgICBjcmVhdGVQdXJlUHJveHkoZm4ocHJveHlQYXJhbXMsIFtuZXcgUmV0dXJuU3RhdGVtZW50KGxpdGVyYWxBcnIocHJveHlSZXR1cm5FbnRyaWVzKSldLCBuZXcgQXJyYXlUeXBlKERZTkFNSUNfVFlQRSkpLCB2YWx1ZXMubGVuZ3RoLCBwcm94eUV4cHIsIGJ1aWxkZXIpO1xuICAgICAgcmV0dXJuIHByb3h5RXhwci5jYWxsRm4odmFsdWVzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEBwYXJhbSB7P30gZW50cmllc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlQ2FjaGVkTGl0ZXJhbE1hcChidWlsZGVyLCBlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkVNUFRZX01BUCkpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJveHlFeHByID0gVEhJU19FWFBSLnByb3AoXCJfbWFwX1wiICsgYnVpbGRlci5maWVsZHMubGVuZ3RoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3h5UGFyYW1zID0gW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm94eVJldHVybkVudHJpZXMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbU5hbWUgPSBcInBcIiArIGk7XG4gICAgICAgICAgcHJveHlQYXJhbXMucHVzaChuZXcgRm5QYXJhbShwYXJhbU5hbWUpKTtcbiAgICAgICAgICBwcm94eVJldHVybkVudHJpZXMucHVzaChbZW50cmllc1tpXVswXSwgdmFyaWFibGUocGFyYW1OYW1lKV0pO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKC8qKiBAdHlwZSB7P30gKi8gKGVudHJpZXNbaV1bMV0pKTtcbiAgICAgIH1cbiAgICAgIGNyZWF0ZVB1cmVQcm94eShmbihwcm94eVBhcmFtcywgW25ldyBSZXR1cm5TdGF0ZW1lbnQobGl0ZXJhbE1hcChwcm94eVJldHVybkVudHJpZXMpKV0sIG5ldyBNYXBUeXBlKERZTkFNSUNfVFlQRSkpLCBlbnRyaWVzLmxlbmd0aCwgcHJveHlFeHByLCBidWlsZGVyKTtcbiAgICAgIHJldHVybiBwcm94eUV4cHIuY2FsbEZuKHZhbHVlcyk7XG4gIH1cbiAgdmFyIERlZmF1bHROYW1lUmVzb2x2ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gRGVmYXVsdE5hbWVSZXNvbHZlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERlZmF1bHROYW1lUmVzb2x2ZXIucHJvdG90eXBlLmNhbGxQaXBlID0gZnVuY3Rpb24gKG5hbWUsIGlucHV0LCBhcmdzKSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERlZmF1bHROYW1lUmVzb2x2ZXIucHJvdG90eXBlLmdldExvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICByZXR1cm4gRGVmYXVsdE5hbWVSZXNvbHZlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYmluZGluZ0lkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDdXJyVmFsdWVFeHByKGJpbmRpbmdJZCkge1xuICAgICAgcmV0dXJuIHZhcmlhYmxlKFwiY3VyclZhbF9cIiArIGJpbmRpbmdJZCk7IC8vIGZpeCBzeW50YXggaGlnaGxpZ2h0aW5nOiBgXG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYmluZGluZ0lkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVQcmV2ZW50RGVmYXVsdFZhcihiaW5kaW5nSWQpIHtcbiAgICAgIHJldHVybiB2YXJpYWJsZShcInBkX1wiICsgYmluZGluZ0lkKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdG10XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0U3RtdEludG9FeHByZXNzaW9uKHN0bXQpIHtcbiAgICAgIGlmIChzdG10IGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCkge1xuICAgICAgICAgIHJldHVybiBzdG10LmV4cHI7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdG10IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHN0bXQudmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHBhcmFtIHs/fSBib3VuZFByb3BcbiAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAqIEBwYXJhbSB7P30gcmVuZGVyVmFsdWVcbiAgICogQHBhcmFtIHs/fSBsb2dCaW5kaW5nVXBkYXRlXG4gICAqIEBwYXJhbSB7Pz19IHNlY3VyaXR5Q29udGV4dEV4cHJlc3Npb25cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHdyaXRlVG9SZW5kZXJlcih2aWV3LCBib3VuZFByb3AsIHJlbmRlckVsZW1lbnQsIHJlbmRlclZhbHVlLCBsb2dCaW5kaW5nVXBkYXRlLCBzZWN1cml0eUNvbnRleHRFeHByZXNzaW9uKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cGRhdGVTdG10cyA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVuZGVyZXIgPSB2aWV3LnByb3AoJ3JlbmRlcmVyJyk7XG4gICAgICByZW5kZXJWYWx1ZSA9IHNhbml0aXplZFZhbHVlKHZpZXcsIGJvdW5kUHJvcCwgcmVuZGVyVmFsdWUsIHNlY3VyaXR5Q29udGV4dEV4cHJlc3Npb24pO1xuICAgICAgc3dpdGNoIChib3VuZFByb3AudHlwZSkge1xuICAgICAgICAgIGNhc2UgUHJvcGVydHlCaW5kaW5nVHlwZS5Qcm9wZXJ0eTpcbiAgICAgICAgICAgICAgaWYgKGxvZ0JpbmRpbmdVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0bXRzLnB1c2goaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLnNldEJpbmRpbmdEZWJ1Z0luZm8pKVxuICAgICAgICAgICAgICAgICAgICAgIC5jYWxsRm4oW3JlbmRlcmVyLCByZW5kZXJFbGVtZW50LCBsaXRlcmFsKGJvdW5kUHJvcC5uYW1lKSwgcmVuZGVyVmFsdWVdKVxuICAgICAgICAgICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdXBkYXRlU3RtdHMucHVzaChyZW5kZXJlclxuICAgICAgICAgICAgICAgICAgLmNhbGxNZXRob2QoJ3NldEVsZW1lbnRQcm9wZXJ0eScsIFtyZW5kZXJFbGVtZW50LCBsaXRlcmFsKGJvdW5kUHJvcC5uYW1lKSwgcmVuZGVyVmFsdWVdKVxuICAgICAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZTpcbiAgICAgICAgICAgICAgcmVuZGVyVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgcmVuZGVyVmFsdWUuaXNCbGFuaygpLmNvbmRpdGlvbmFsKE5VTExfRVhQUiwgcmVuZGVyVmFsdWUuY2FsbE1ldGhvZCgndG9TdHJpbmcnLCBbXSkpO1xuICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKHJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnc2V0RWxlbWVudEF0dHJpYnV0ZScsIFtyZW5kZXJFbGVtZW50LCBsaXRlcmFsKGJvdW5kUHJvcC5uYW1lKSwgcmVuZGVyVmFsdWVdKVxuICAgICAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkNsYXNzOlxuICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKHJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnc2V0RWxlbWVudENsYXNzJywgW3JlbmRlckVsZW1lbnQsIGxpdGVyYWwoYm91bmRQcm9wLm5hbWUpLCByZW5kZXJWYWx1ZV0pXG4gICAgICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFByb3BlcnR5QmluZGluZ1R5cGUuU3R5bGU6XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0clZhbHVlID0gcmVuZGVyVmFsdWUuY2FsbE1ldGhvZCgndG9TdHJpbmcnLCBbXSk7XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoYm91bmRQcm9wLnVuaXQpKSB7XG4gICAgICAgICAgICAgICAgICBzdHJWYWx1ZSA9IHN0clZhbHVlLnBsdXMobGl0ZXJhbChib3VuZFByb3AudW5pdCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlbmRlclZhbHVlID0gcmVuZGVyVmFsdWUuaXNCbGFuaygpLmNvbmRpdGlvbmFsKE5VTExfRVhQUiwgc3RyVmFsdWUpO1xuICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKHJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnc2V0RWxlbWVudFN0eWxlJywgW3JlbmRlckVsZW1lbnQsIGxpdGVyYWwoYm91bmRQcm9wLm5hbWUpLCByZW5kZXJWYWx1ZV0pXG4gICAgICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFByb3BlcnR5QmluZGluZ1R5cGUuQW5pbWF0aW9uOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgc3RhdGU6IFNob3VsZCBub3QgY29tZSBoZXJlIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZVN0bXRzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHBhcmFtIHs/fSBib3VuZFByb3BcbiAgICogQHBhcmFtIHs/fSByZW5kZXJWYWx1ZVxuICAgKiBAcGFyYW0gez89fSBzZWN1cml0eUNvbnRleHRFeHByZXNzaW9uXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzYW5pdGl6ZWRWYWx1ZSh2aWV3LCBib3VuZFByb3AsIHJlbmRlclZhbHVlLCBzZWN1cml0eUNvbnRleHRFeHByZXNzaW9uKSB7XG4gICAgICBpZiAoYm91bmRQcm9wLnNlY3VyaXR5Q29udGV4dCA9PT0gX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuTk9ORSkge1xuICAgICAgICAgIHJldHVybiByZW5kZXJWYWx1ZTsgLy8gTm8gc2FuaXRpemF0aW9uIG5lZWRlZC5cbiAgICAgIH1cbiAgICAgIGlmICghYm91bmRQcm9wLm5lZWRzUnVudGltZVNlY3VyaXR5Q29udGV4dCkge1xuICAgICAgICAgIHNlY3VyaXR5Q29udGV4dEV4cHJlc3Npb24gPVxuICAgICAgICAgICAgICBjcmVhdGVFbnVtRXhwcmVzc2lvbihJZGVudGlmaWVycy5TZWN1cml0eUNvbnRleHQsIGJvdW5kUHJvcC5zZWN1cml0eUNvbnRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZWN1cml0eUNvbnRleHRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJuYWwgZXJyb3IsIG5vIFNlY3VyaXR5Q29udGV4dCBnaXZlbiBcIiArIGJvdW5kUHJvcC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN0eCA9IHZpZXcucHJvcCgndmlld1V0aWxzJykucHJvcCgnc2FuaXRpemVyJyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcmdzID0gW3NlY3VyaXR5Q29udGV4dEV4cHJlc3Npb24sIHJlbmRlclZhbHVlXTtcbiAgICAgIHJldHVybiBjdHguY2FsbE1ldGhvZCgnc2FuaXRpemUnLCBhcmdzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEBwYXJhbSB7P30gY29tcG9uZW50Vmlld1xuICAgKiBAcGFyYW0gez99IGJvdW5kUHJvcFxuICAgKiBAcGFyYW0gez99IGJvdW5kT3V0cHV0c1xuICAgKiBAcGFyYW0gez99IGV2ZW50TGlzdGVuZXJcbiAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAqIEBwYXJhbSB7P30gcmVuZGVyVmFsdWVcbiAgICogQHBhcmFtIHs/fSBsYXN0UmVuZGVyVmFsdWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJBbmltYXRpb24odmlldywgY29tcG9uZW50VmlldywgYm91bmRQcm9wLCBib3VuZE91dHB1dHMsIGV2ZW50TGlzdGVuZXIsIHJlbmRlckVsZW1lbnQsIHJlbmRlclZhbHVlLCBsYXN0UmVuZGVyVmFsdWUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRldGFjaFN0bXRzID0gW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cGRhdGVTdG10cyA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5pbWF0aW9uTmFtZSA9IGJvdW5kUHJvcC5uYW1lO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5pbWF0aW9uRm5FeHByID0gY29tcG9uZW50Vmlldy5wcm9wKCdjb21wb25lbnRUeXBlJykucHJvcCgnYW5pbWF0aW9ucycpLmtleShsaXRlcmFsKGFuaW1hdGlvbk5hbWUpKTtcbiAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRvIG5vcm1hbGl6ZSB0aGUgdm9pZCB2YWx1ZSBhcyBgdm9pZGAgZXhwbGljaXRseVxuICAgICAgLy8gc28gdGhhdCB0aGUgc3R5bGVzIGRhdGEgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIHN0cmluZ21hcFxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW1wdHlTdGF0ZVZhbHVlID0gbGl0ZXJhbChFTVBUWV9TVEFURSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bml0aWFsaXplZFZhbHVlID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlVOSU5JVElBTElaRUQpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFuaW1hdGlvblRyYW5zaXRpb25WYXIgPSB2YXJpYWJsZSgnYW5pbWF0aW9uVHJhbnNpdGlvbl8nICsgYW5pbWF0aW9uTmFtZSk7XG4gICAgICB1cGRhdGVTdG10cy5wdXNoKGFuaW1hdGlvblRyYW5zaXRpb25WYXJcbiAgICAgICAgICAuc2V0KGFuaW1hdGlvbkZuRXhwci5jYWxsRm4oW1xuICAgICAgICAgIHZpZXcsIHJlbmRlckVsZW1lbnQsXG4gICAgICAgICAgbGFzdFJlbmRlclZhbHVlLmVxdWFscyh1bml0aWFsaXplZFZhbHVlKS5jb25kaXRpb25hbChlbXB0eVN0YXRlVmFsdWUsIGxhc3RSZW5kZXJWYWx1ZSksXG4gICAgICAgICAgcmVuZGVyVmFsdWUuZXF1YWxzKHVuaXRpYWxpemVkVmFsdWUpLmNvbmRpdGlvbmFsKGVtcHR5U3RhdGVWYWx1ZSwgcmVuZGVyVmFsdWUpXG4gICAgICBdKSlcbiAgICAgICAgICAudG9EZWNsU3RtdCgpKTtcbiAgICAgIGRldGFjaFN0bXRzLnB1c2goYW5pbWF0aW9uVHJhbnNpdGlvblZhclxuICAgICAgICAgIC5zZXQoYW5pbWF0aW9uRm5FeHByLmNhbGxGbihbdmlldywgcmVuZGVyRWxlbWVudCwgbGFzdFJlbmRlclZhbHVlLCBlbXB0eVN0YXRlVmFsdWVdKSlcbiAgICAgICAgICAudG9EZWNsU3RtdCgpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlZ2lzdGVyU3RtdHMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFuaW1hdGlvblN0YXJ0TWV0aG9kRXhpc3RzID0gYm91bmRPdXRwdXRzLmZpbmQoZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBldmVudC5pc0FuaW1hdGlvbiAmJiBldmVudC5uYW1lID09IGFuaW1hdGlvbk5hbWUgJiYgZXZlbnQucGhhc2UgPT0gJ3N0YXJ0JzsgfSk7XG4gICAgICBpZiAoYW5pbWF0aW9uU3RhcnRNZXRob2RFeGlzdHMpIHtcbiAgICAgICAgICByZWdpc3RlclN0bXRzLnB1c2goYW5pbWF0aW9uVHJhbnNpdGlvblZhclxuICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnb25TdGFydCcsIFtldmVudExpc3RlbmVyLmNhbGxNZXRob2QoQnVpbHRpbk1ldGhvZC5CaW5kLCBbdmlldywgbGl0ZXJhbChCb3VuZEV2ZW50QXN0LmNhbGNGdWxsTmFtZShhbmltYXRpb25OYW1lLCBudWxsLCAnc3RhcnQnKSldKV0pXG4gICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25Eb25lTWV0aG9kRXhpc3RzID0gYm91bmRPdXRwdXRzLmZpbmQoZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBldmVudC5pc0FuaW1hdGlvbiAmJiBldmVudC5uYW1lID09IGFuaW1hdGlvbk5hbWUgJiYgZXZlbnQucGhhc2UgPT0gJ2RvbmUnOyB9KTtcbiAgICAgIGlmIChhbmltYXRpb25Eb25lTWV0aG9kRXhpc3RzKSB7XG4gICAgICAgICAgcmVnaXN0ZXJTdG10cy5wdXNoKGFuaW1hdGlvblRyYW5zaXRpb25WYXJcbiAgICAgICAgICAgICAgLmNhbGxNZXRob2QoJ29uRG9uZScsIFtldmVudExpc3RlbmVyLmNhbGxNZXRob2QoQnVpbHRpbk1ldGhvZC5CaW5kLCBbdmlldywgbGl0ZXJhbChCb3VuZEV2ZW50QXN0LmNhbGNGdWxsTmFtZShhbmltYXRpb25OYW1lLCBudWxsLCAnZG9uZScpKV0pXSlcbiAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVN0bXRzLnB1c2guYXBwbHkodXBkYXRlU3RtdHMsIHJlZ2lzdGVyU3RtdHMpO1xuICAgICAgZGV0YWNoU3RtdHMucHVzaC5hcHBseShkZXRhY2hTdG10cywgcmVnaXN0ZXJTdG10cyk7XG4gICAgICByZXR1cm4geyB1cGRhdGVTdG10czogdXBkYXRlU3RtdHMsIGRldGFjaFN0bXRzOiBkZXRhY2hTdG10cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBDcmVhdGUgYSBuZXcgY2xhc3Mgc3RtdHMgYmFzZWQgb24gdGhlIGdpdmVuIGRhdGEuXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDbGFzc1N0bXQoY29uZmlnKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRBcmdzID0gY29uZmlnLnBhcmVudEFyZ3MgfHwgW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdXBlckN0b3JTdG10cyA9IGNvbmZpZy5wYXJlbnQgPyBbU1VQRVJfRVhQUi5jYWxsRm4ocGFyZW50QXJncykudG9TdG10KCldIDogW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBidWlsZGVyID0gY29uY2F0Q2xhc3NCdWlsZGVyUGFydHMoQXJyYXkuaXNBcnJheShjb25maWcuYnVpbGRlcnMpID8gY29uZmlnLmJ1aWxkZXJzIDogW2NvbmZpZy5idWlsZGVyc10pO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3RvciA9IG5ldyBDbGFzc01ldGhvZChudWxsLCBjb25maWcuY3RvclBhcmFtcyB8fCBbXSwgc3VwZXJDdG9yU3RtdHMuY29uY2F0KGJ1aWxkZXIuY3RvclN0bXRzKSk7XG4gICAgICByZXR1cm4gbmV3IENsYXNzU3RtdChjb25maWcubmFtZSwgY29uZmlnLnBhcmVudCwgYnVpbGRlci5maWVsZHMsIGJ1aWxkZXIuZ2V0dGVycywgY3RvciwgYnVpbGRlci5tZXRob2RzLCBjb25maWcubW9kaWZpZXJzIHx8IFtdKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY29uY2F0Q2xhc3NCdWlsZGVyUGFydHMoYnVpbGRlcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGRzOiAoX2EgPSBbXSkuY29uY2F0LmFwcGx5KF9hLCBidWlsZGVycy5tYXAoZnVuY3Rpb24gKGJ1aWxkZXIpIHsgcmV0dXJuIGJ1aWxkZXIuZmllbGRzIHx8IFtdOyB9KSksXG4gICAgICAgICAgbWV0aG9kczogKF9iID0gW10pLmNvbmNhdC5hcHBseShfYiwgYnVpbGRlcnMubWFwKGZ1bmN0aW9uIChidWlsZGVyKSB7IHJldHVybiBidWlsZGVyLm1ldGhvZHMgfHwgW107IH0pKSxcbiAgICAgICAgICBnZXR0ZXJzOiAoX2MgPSBbXSkuY29uY2F0LmFwcGx5KF9jLCBidWlsZGVycy5tYXAoZnVuY3Rpb24gKGJ1aWxkZXIpIHsgcmV0dXJuIGJ1aWxkZXIuZ2V0dGVycyB8fCBbXTsgfSkpLFxuICAgICAgICAgIGN0b3JTdG10czogKF9kID0gW10pLmNvbmNhdC5hcHBseShfZCwgYnVpbGRlcnMubWFwKGZ1bmN0aW9uIChidWlsZGVyKSB7IHJldHVybiBidWlsZGVyLmN0b3JTdG10cyB8fCBbXTsgfSkpLFxuICAgICAgfTtcbiAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkOCA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQ4ID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICB2YXIgRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyV3JhcHBlckNsYXNzVmFyXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlUmVzdWx0KHN0YXRlbWVudHMsIGRpcldyYXBwZXJDbGFzc1Zhcikge1xuICAgICAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7XG4gICAgICAgICAgdGhpcy5kaXJXcmFwcGVyQ2xhc3NWYXIgPSBkaXJXcmFwcGVyQ2xhc3NWYXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVSZXN1bHQ7XG4gIH0oKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENPTlRFWFRfRklFTERfTkFNRSA9ICdjb250ZXh0JztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ0hBTkdFU19GSUVMRF9OQU1FID0gJ19jaGFuZ2VzJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ0hBTkdFRF9GSUVMRF9OQU1FID0gJ19jaGFuZ2VkJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRVZFTlRfSEFORExFUl9GSUVMRF9OQU1FID0gJ19ldmVudEhhbmRsZXInO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDVVJSX1ZBTFVFX1ZBUiA9IHZhcmlhYmxlKCdjdXJyVmFsdWUnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVEhST1dfT05fQ0hBTkdFX1ZBUiA9IHZhcmlhYmxlKCd0aHJvd09uQ2hhbmdlJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEZPUkNFX1VQREFURV9WQVIgPSB2YXJpYWJsZSgnZm9yY2VVcGRhdGUnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVklFV19WQVIgPSB2YXJpYWJsZSgndmlldycpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT01QT05FTlRfVklFV19WQVIgPSB2YXJpYWJsZSgnY29tcG9uZW50VmlldycpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBSRU5ERVJfRUxfVkFSID0gdmFyaWFibGUoJ2VsJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEVWRU5UX05BTUVfVkFSID0gdmFyaWFibGUoJ2V2ZW50TmFtZScpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBSRVNFVF9DSEFOR0VTX1NUTVQgPSBUSElTX0VYUFIucHJvcChDSEFOR0VTX0ZJRUxEX05BTUUpLnNldChsaXRlcmFsTWFwKFtdKSkudG9TdG10KCk7XG4gIC8qKlxuICAgKiAgV2UgZ2VuZXJhdGUgZGlyZWN0aXZlIHdyYXBwZXJzIHRvIHByZXZlbnQgY29kZSBibG9hdCB3aGVuIGEgZGlyZWN0aXZlIGlzIHVzZWQuXG4gICAgKiBBIGRpcmVjdGl2ZSB3cmFwcGVyIGVuY2Fwc3VsYXRlc1xuICAgICogdGhlIGRpcnR5IGNoZWNraW5nIGZvciBgQElucHV0YCwgdGhlIGhhbmRsaW5nIG9mIGBASG9zdExpc3RlbmVyYCAvIGBASG9zdEJpbmRpbmdgXG4gICAgKiBhbmQgY2FsbGluZyB0aGUgbGlmZWN5Y2xlaG9va3MgYG5nT25Jbml0YCwgYG5nT25DaGFuZ2VzYCwgYG5nRG9DaGVja2AuXG4gICAgKiAqXG4gICAgKiBTbyBmYXIsIG9ubHkgYEBJbnB1dGAgYW5kIHRoZSBsaWZlY3ljbGUgaG9va3MgaGF2ZSBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgdmFyIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcGlsZXJDb25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gX2V4cHJQYXJzZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3NjaGVtYVJlZ2lzdHJ5XG4gICAgICAgKiBAcGFyYW0gez99IF9jb25zb2xlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlcihjb21waWxlckNvbmZpZywgX2V4cHJQYXJzZXIsIF9zY2hlbWFSZWdpc3RyeSwgX2NvbnNvbGUpIHtcbiAgICAgICAgICB0aGlzLmNvbXBpbGVyQ29uZmlnID0gY29tcGlsZXJDb25maWc7XG4gICAgICAgICAgdGhpcy5fZXhwclBhcnNlciA9IF9leHByUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5ID0gX3NjaGVtYVJlZ2lzdHJ5O1xuICAgICAgICAgIHRoaXMuX2NvbnNvbGUgPSBfY29uc29sZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVyLmRpcldyYXBwZXJDbGFzc05hbWUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICByZXR1cm4gXCJXcmFwcGVyX1wiICsgaWRlbnRpZmllck5hbWUoaWQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJNZXRhXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVXcmFwcGVyQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoZGlyTWV0YSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RQYXJzZVJlc3VsdCA9IHBhcnNlSG9zdEJpbmRpbmdzKGRpck1ldGEsIHRoaXMuX2V4cHJQYXJzZXIsIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5KTtcbiAgICAgICAgICByZXBvcnRQYXJzZUVycm9ycyhob3N0UGFyc2VSZXN1bHQuZXJyb3JzLCB0aGlzLl9jb25zb2xlKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBidWlsZGVyID0gbmV3IERpcmVjdGl2ZVdyYXBwZXJCdWlsZGVyKHRoaXMuY29tcGlsZXJDb25maWcsIGRpck1ldGEpO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGRpck1ldGEuaW5wdXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dEZpZWxkTmFtZSkge1xuICAgICAgICAgICAgICBhZGRDaGVja0lucHV0TWV0aG9kKGlucHV0RmllbGROYW1lLCBidWlsZGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhZGROZ0RvQ2hlY2tNZXRob2QoYnVpbGRlcik7XG4gICAgICAgICAgYWRkQ2hlY2tIb3N0TWV0aG9kKGhvc3RQYXJzZVJlc3VsdC5ob3N0UHJvcHMsIGhvc3RQYXJzZVJlc3VsdC5ob3N0TGlzdGVuZXJzLCBidWlsZGVyKTtcbiAgICAgICAgICBhZGRIYW5kbGVFdmVudE1ldGhvZChob3N0UGFyc2VSZXN1bHQuaG9zdExpc3RlbmVycywgYnVpbGRlcik7XG4gICAgICAgICAgYWRkU3Vic2NyaWJlTWV0aG9kKGRpck1ldGEsIGJ1aWxkZXIpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsYXNzU3RtdCA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdGl2ZVdyYXBwZXJDb21waWxlUmVzdWx0KFtjbGFzc1N0bXRdLCBjbGFzc1N0bXQubmFtZSk7XG4gICAgICB9O1xuICAgICAgRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVyID0gX19kZWNvcmF0ZSQ4KFtcbiAgICAgICAgICBDb21waWxlckluamVjdGFibGUoKSwgXG4gICAgICAgICAgX19tZXRhZGF0YSQ4KCdkZXNpZ246cGFyYW10eXBlcycsIFtDb21waWxlckNvbmZpZywgUGFyc2VyLCBFbGVtZW50U2NoZW1hUmVnaXN0cnksIENvbnNvbGVdKVxuICAgICAgXSwgRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVyKTtcbiAgICAgIHJldHVybiBEaXJlY3RpdmVXcmFwcGVyQ29tcGlsZXI7XG4gIH0oKSk7XG4gIHZhciBEaXJlY3RpdmVXcmFwcGVyQnVpbGRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcGlsZXJDb25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyTWV0YVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBEaXJlY3RpdmVXcmFwcGVyQnVpbGRlcihjb21waWxlckNvbmZpZywgZGlyTWV0YSkge1xuICAgICAgICAgIHRoaXMuY29tcGlsZXJDb25maWcgPSBjb21waWxlckNvbmZpZztcbiAgICAgICAgICB0aGlzLmRpck1ldGEgPSBkaXJNZXRhO1xuICAgICAgICAgIHRoaXMuZmllbGRzID0gW107XG4gICAgICAgICAgdGhpcy5nZXR0ZXJzID0gW107XG4gICAgICAgICAgdGhpcy5tZXRob2RzID0gW107XG4gICAgICAgICAgdGhpcy5jdG9yU3RtdHMgPSBbXTtcbiAgICAgICAgICB0aGlzLmRldGFjaFN0bXRzID0gW107XG4gICAgICAgICAgdGhpcy5kZXN0cm95U3RtdHMgPSBbXTtcbiAgICAgICAgICB2YXIgZGlyTGlmZWN5Y2xlSG9va3MgPSBkaXJNZXRhLnR5cGUubGlmZWN5Y2xlSG9va3M7XG4gICAgICAgICAgdGhpcy5nZW5DaGFuZ2VzID0gZGlyTGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXMpICE9PSAtMSB8fFxuICAgICAgICAgICAgICB0aGlzLmNvbXBpbGVyQ29uZmlnLmxvZ0JpbmRpbmdVcGRhdGU7XG4gICAgICAgICAgdGhpcy5uZ09uQ2hhbmdlcyA9IGRpckxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuT25DaGFuZ2VzKSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5uZ09uSW5pdCA9IGRpckxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuT25Jbml0KSAhPT0gLTE7XG4gICAgICAgICAgdGhpcy5uZ0RvQ2hlY2sgPSBkaXJMaWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLkRvQ2hlY2spICE9PSAtMTtcbiAgICAgICAgICB0aGlzLm5nT25EZXN0cm95ID0gZGlyTGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3kpICE9PSAtMTtcbiAgICAgICAgICBpZiAodGhpcy5uZ09uRGVzdHJveSkge1xuICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lTdG10cy5wdXNoKFRISVNfRVhQUi5wcm9wKENPTlRFWFRfRklFTERfTkFNRSkuY2FsbE1ldGhvZCgnbmdPbkRlc3Ryb3knLCBbXSkudG9TdG10KCkpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlV3JhcHBlckJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpckRlcFBhcmFtTmFtZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdGhpcy5kaXJNZXRhLnR5cGUuZGlEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGRpckRlcFBhcmFtTmFtZXMucHVzaChcInBcIiArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRob2RzID0gW1xuICAgICAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ25nT25EZXRhY2gnLCBbXG4gICAgICAgICAgICAgICAgICBuZXcgRm5QYXJhbShWSUVXX1ZBUi5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQXBwVmlldyksIFtEWU5BTUlDX1RZUEVdKSksXG4gICAgICAgICAgICAgICAgICBuZXcgRm5QYXJhbShDT01QT05FTlRfVklFV19WQVIubmFtZSwgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFwcFZpZXcpLCBbRFlOQU1JQ19UWVBFXSkpLFxuICAgICAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oUkVOREVSX0VMX1ZBUi5uYW1lLCBEWU5BTUlDX1RZUEUpLFxuICAgICAgICAgICAgICBdLCB0aGlzLmRldGFjaFN0bXRzKSxcbiAgICAgICAgICAgICAgbmV3IENsYXNzTWV0aG9kKCduZ09uRGVzdHJveScsIFtdLCB0aGlzLmRlc3Ryb3lTdG10cyksXG4gICAgICAgICAgXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaWVsZHMgPSBbXG4gICAgICAgICAgICAgIG5ldyBDbGFzc0ZpZWxkKEVWRU5UX0hBTkRMRVJfRklFTERfTkFNRSwgRlVOQ1RJT05fVFlQRSwgW1N0bXRNb2RpZmllci5Qcml2YXRlXSksXG4gICAgICAgICAgICAgIG5ldyBDbGFzc0ZpZWxkKENPTlRFWFRfRklFTERfTkFNRSwgaW1wb3J0VHlwZSh0aGlzLmRpck1ldGEudHlwZSkpLFxuICAgICAgICAgICAgICBuZXcgQ2xhc3NGaWVsZChDSEFOR0VEX0ZJRUxEX05BTUUsIEJPT0xfVFlQRSwgW1N0bXRNb2RpZmllci5Qcml2YXRlXSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdG9yU3RtdHMgPSBbVEhJU19FWFBSLnByb3AoQ0hBTkdFRF9GSUVMRF9OQU1FKS5zZXQobGl0ZXJhbChmYWxzZSkpLnRvU3RtdCgpXTtcbiAgICAgICAgICBpZiAodGhpcy5nZW5DaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIGZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKENIQU5HRVNfRklFTERfTkFNRSwgbmV3IE1hcFR5cGUoRFlOQU1JQ19UWVBFKSwgW1N0bXRNb2RpZmllci5Qcml2YXRlXSkpO1xuICAgICAgICAgICAgICBjdG9yU3RtdHMucHVzaChSRVNFVF9DSEFOR0VTX1NUTVQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdG9yU3RtdHMucHVzaChUSElTX0VYUFIucHJvcChDT05URVhUX0ZJRUxEX05BTUUpXG4gICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcih0aGlzLmRpck1ldGEudHlwZSlcbiAgICAgICAgICAgICAgLmluc3RhbnRpYXRlKGRpckRlcFBhcmFtTmFtZXMubWFwKGZ1bmN0aW9uIChwYXJhbU5hbWUpIHsgcmV0dXJuIHZhcmlhYmxlKHBhcmFtTmFtZSk7IH0pKSlcbiAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQ2xhc3NTdG10KHtcbiAgICAgICAgICAgICAgbmFtZTogRGlyZWN0aXZlV3JhcHBlckNvbXBpbGVyLmRpcldyYXBwZXJDbGFzc05hbWUodGhpcy5kaXJNZXRhLnR5cGUpLFxuICAgICAgICAgICAgICBjdG9yUGFyYW1zOiBkaXJEZXBQYXJhbU5hbWVzLm1hcChmdW5jdGlvbiAocGFyYW1OYW1lKSB7IHJldHVybiBuZXcgRm5QYXJhbShwYXJhbU5hbWUsIERZTkFNSUNfVFlQRSk7IH0pLFxuICAgICAgICAgICAgICBidWlsZGVyczogW3sgZmllbGRzOiBmaWVsZHMsIGN0b3JTdG10czogY3RvclN0bXRzLCBtZXRob2RzOiBtZXRob2RzIH0sIHRoaXNdXG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIERpcmVjdGl2ZVdyYXBwZXJCdWlsZGVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhZGROZ0RvQ2hlY2tNZXRob2QoYnVpbGRlcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hhbmdlZFZhciA9IHZhcmlhYmxlKCdjaGFuZ2VkJyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdG10cyA9IFtcbiAgICAgICAgICBjaGFuZ2VkVmFyLnNldChUSElTX0VYUFIucHJvcChDSEFOR0VEX0ZJRUxEX05BTUUpKS50b0RlY2xTdG10KCksXG4gICAgICAgICAgVEhJU19FWFBSLnByb3AoQ0hBTkdFRF9GSUVMRF9OQU1FKS5zZXQobGl0ZXJhbChmYWxzZSkpLnRvU3RtdCgpLFxuICAgICAgXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpZmVjeWNsZVN0bXRzID0gW107XG4gICAgICBpZiAoYnVpbGRlci5nZW5DaGFuZ2VzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb25DaGFuZ2VzU3RtdHMgPSBbXTtcbiAgICAgICAgICBpZiAoYnVpbGRlci5uZ09uQ2hhbmdlcykge1xuICAgICAgICAgICAgICBvbkNoYW5nZXNTdG10cy5wdXNoKFRISVNfRVhQUi5wcm9wKENPTlRFWFRfRklFTERfTkFNRSlcbiAgICAgICAgICAgICAgICAgIC5jYWxsTWV0aG9kKCduZ09uQ2hhbmdlcycsIFtUSElTX0VYUFIucHJvcChDSEFOR0VTX0ZJRUxEX05BTUUpXSlcbiAgICAgICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChidWlsZGVyLmNvbXBpbGVyQ29uZmlnLmxvZ0JpbmRpbmdVcGRhdGUpIHtcbiAgICAgICAgICAgICAgb25DaGFuZ2VzU3RtdHMucHVzaChpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuc2V0QmluZGluZ0RlYnVnSW5mb0ZvckNoYW5nZXMpKVxuICAgICAgICAgICAgICAgICAgLmNhbGxGbihbVklFV19WQVIucHJvcCgncmVuZGVyZXInKSwgUkVOREVSX0VMX1ZBUiwgVEhJU19FWFBSLnByb3AoQ0hBTkdFU19GSUVMRF9OQU1FKV0pXG4gICAgICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbkNoYW5nZXNTdG10cy5wdXNoKFJFU0VUX0NIQU5HRVNfU1RNVCk7XG4gICAgICAgICAgbGlmZWN5Y2xlU3RtdHMucHVzaChuZXcgSWZTdG10KGNoYW5nZWRWYXIsIG9uQ2hhbmdlc1N0bXRzKSk7XG4gICAgICB9XG4gICAgICBpZiAoYnVpbGRlci5uZ09uSW5pdCkge1xuICAgICAgICAgIGxpZmVjeWNsZVN0bXRzLnB1c2gobmV3IElmU3RtdChWSUVXX1ZBUi5wcm9wKCdudW1iZXJPZkNoZWNrcycpLmlkZW50aWNhbChuZXcgTGl0ZXJhbEV4cHIoMCkpLCBbVEhJU19FWFBSLnByb3AoQ09OVEVYVF9GSUVMRF9OQU1FKS5jYWxsTWV0aG9kKCduZ09uSW5pdCcsIFtdKS50b1N0bXQoKV0pKTtcbiAgICAgIH1cbiAgICAgIGlmIChidWlsZGVyLm5nRG9DaGVjaykge1xuICAgICAgICAgIGxpZmVjeWNsZVN0bXRzLnB1c2goVEhJU19FWFBSLnByb3AoQ09OVEVYVF9GSUVMRF9OQU1FKS5jYWxsTWV0aG9kKCduZ0RvQ2hlY2snLCBbXSkudG9TdG10KCkpO1xuICAgICAgfVxuICAgICAgaWYgKGxpZmVjeWNsZVN0bXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdG10cy5wdXNoKG5ldyBJZlN0bXQobm90KFRIUk9XX09OX0NIQU5HRV9WQVIpLCBsaWZlY3ljbGVTdG10cykpO1xuICAgICAgfVxuICAgICAgc3RtdHMucHVzaChuZXcgUmV0dXJuU3RhdGVtZW50KGNoYW5nZWRWYXIpKTtcbiAgICAgIGJ1aWxkZXIubWV0aG9kcy5wdXNoKG5ldyBDbGFzc01ldGhvZCgnbmdEb0NoZWNrJywgW1xuICAgICAgICAgIG5ldyBGblBhcmFtKFZJRVdfVkFSLm5hbWUsIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5BcHBWaWV3KSwgW0RZTkFNSUNfVFlQRV0pKSxcbiAgICAgICAgICBuZXcgRm5QYXJhbShSRU5ERVJfRUxfVkFSLm5hbWUsIERZTkFNSUNfVFlQRSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oVEhST1dfT05fQ0hBTkdFX1ZBUi5uYW1lLCBCT09MX1RZUEUpLFxuICAgICAgXSwgc3RtdHMsIEJPT0xfVFlQRSkpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAqIEBwYXJhbSB7P30gYnVpbGRlclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2hlY2tJbnB1dE1ldGhvZChpbnB1dCwgYnVpbGRlcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmllbGQgPSBjcmVhdGVDaGVja0JpbmRpbmdGaWVsZChidWlsZGVyKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9uQ2hhbmdlU3RhdGVtZW50cyA9IFtcbiAgICAgICAgICBUSElTX0VYUFIucHJvcChDSEFOR0VEX0ZJRUxEX05BTUUpLnNldChsaXRlcmFsKHRydWUpKS50b1N0bXQoKSxcbiAgICAgICAgICBUSElTX0VYUFIucHJvcChDT05URVhUX0ZJRUxEX05BTUUpLnByb3AoaW5wdXQpLnNldChDVVJSX1ZBTFVFX1ZBUikudG9TdG10KCksXG4gICAgICBdO1xuICAgICAgaWYgKGJ1aWxkZXIuZ2VuQ2hhbmdlcykge1xuICAgICAgICAgIG9uQ2hhbmdlU3RhdGVtZW50cy5wdXNoKFRISVNfRVhQUi5wcm9wKENIQU5HRVNfRklFTERfTkFNRSlcbiAgICAgICAgICAgICAgLmtleShsaXRlcmFsKGlucHV0KSlcbiAgICAgICAgICAgICAgLnNldChpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuU2ltcGxlQ2hhbmdlKSlcbiAgICAgICAgICAgICAgLmluc3RhbnRpYXRlKFtmaWVsZC5leHByZXNzaW9uLCBDVVJSX1ZBTFVFX1ZBUl0pKVxuICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWV0aG9kQm9keSA9IGNyZWF0ZUNoZWNrQmluZGluZ1N0bXQoeyBjdXJyVmFsRXhwcjogQ1VSUl9WQUxVRV9WQVIsIGZvcmNlVXBkYXRlOiBGT1JDRV9VUERBVEVfVkFSLCBzdG10czogW10gfSwgZmllbGQuZXhwcmVzc2lvbiwgVEhST1dfT05fQ0hBTkdFX1ZBUiwgb25DaGFuZ2VTdGF0ZW1lbnRzKTtcbiAgICAgIGJ1aWxkZXIubWV0aG9kcy5wdXNoKG5ldyBDbGFzc01ldGhvZChcImNoZWNrX1wiICsgaW5wdXQsIFtcbiAgICAgICAgICBuZXcgRm5QYXJhbShDVVJSX1ZBTFVFX1ZBUi5uYW1lLCBEWU5BTUlDX1RZUEUpLFxuICAgICAgICAgIG5ldyBGblBhcmFtKFRIUk9XX09OX0NIQU5HRV9WQVIubmFtZSwgQk9PTF9UWVBFKSxcbiAgICAgICAgICBuZXcgRm5QYXJhbShGT1JDRV9VUERBVEVfVkFSLm5hbWUsIEJPT0xfVFlQRSksXG4gICAgICBdLCBtZXRob2RCb2R5KSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaG9zdFByb3BzXG4gICAqIEBwYXJhbSB7P30gaG9zdEV2ZW50c1xuICAgKiBAcGFyYW0gez99IGJ1aWxkZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFkZENoZWNrSG9zdE1ldGhvZChob3N0UHJvcHMsIGhvc3RFdmVudHMsIGJ1aWxkZXIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0bXRzID0gW107XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRob2RQYXJhbXMgPSBbXG4gICAgICAgICAgbmV3IEZuUGFyYW0oVklFV19WQVIubmFtZSwgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFwcFZpZXcpLCBbRFlOQU1JQ19UWVBFXSkpLFxuICAgICAgICAgIG5ldyBGblBhcmFtKENPTVBPTkVOVF9WSUVXX1ZBUi5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQXBwVmlldyksIFtEWU5BTUlDX1RZUEVdKSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oUkVOREVSX0VMX1ZBUi5uYW1lLCBEWU5BTUlDX1RZUEUpLFxuICAgICAgICAgIG5ldyBGblBhcmFtKFRIUk9XX09OX0NIQU5HRV9WQVIubmFtZSwgQk9PTF9UWVBFKSxcbiAgICAgIF07XG4gICAgICBob3N0UHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoaG9zdFByb3AsIGhvc3RQcm9wSWR4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmllbGQgPSBjcmVhdGVDaGVja0JpbmRpbmdGaWVsZChidWlsZGVyKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBldmFsUmVzdWx0ID0gY29udmVydFByb3BlcnR5QmluZGluZyhidWlsZGVyLCBudWxsLCBUSElTX0VYUFIucHJvcChDT05URVhUX0ZJRUxEX05BTUUpLCBob3N0UHJvcC52YWx1ZSwgZmllbGQuYmluZGluZ0lkKTtcbiAgICAgICAgICBpZiAoIWV2YWxSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWN1cml0eUNvbnRleHRFeHByO1xuICAgICAgICAgIGlmIChob3N0UHJvcC5uZWVkc1J1bnRpbWVTZWN1cml0eUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0RXhwciA9IHZhcmlhYmxlKFwic2VjQ3R4X1wiICsgbWV0aG9kUGFyYW1zLmxlbmd0aCk7XG4gICAgICAgICAgICAgIG1ldGhvZFBhcmFtcy5wdXNoKG5ldyBGblBhcmFtKHNlY3VyaXR5Q29udGV4dEV4cHIubmFtZSwgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlNlY3VyaXR5Q29udGV4dCkpKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoZWNrQmluZGluZ1N0bXRzO1xuICAgICAgICAgIGlmIChob3N0UHJvcC5pc0FuaW1hdGlvbikge1xuICAgICAgICAgICAgICB2YXIgX2EgPSB0cmlnZ2VyQW5pbWF0aW9uKFZJRVdfVkFSLCBDT01QT05FTlRfVklFV19WQVIsIGhvc3RQcm9wLCBob3N0RXZlbnRzLCBUSElTX0VYUFIucHJvcChFVkVOVF9IQU5ETEVSX0ZJRUxEX05BTUUpXG4gICAgICAgICAgICAgICAgICAub3IoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLm5vb3ApKSksIFJFTkRFUl9FTF9WQVIsIGV2YWxSZXN1bHQuY3VyclZhbEV4cHIsIGZpZWxkLmV4cHJlc3Npb24pLCB1cGRhdGVTdG10cyA9IF9hLnVwZGF0ZVN0bXRzLCBkZXRhY2hTdG10cyA9IF9hLmRldGFjaFN0bXRzO1xuICAgICAgICAgICAgICBjaGVja0JpbmRpbmdTdG10cyA9IHVwZGF0ZVN0bXRzO1xuICAgICAgICAgICAgICAoX2IgPSBidWlsZGVyLmRldGFjaFN0bXRzKS5wdXNoLmFwcGx5KF9iLCBkZXRhY2hTdG10cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjaGVja0JpbmRpbmdTdG10cyA9IHdyaXRlVG9SZW5kZXJlcihWSUVXX1ZBUiwgaG9zdFByb3AsIFJFTkRFUl9FTF9WQVIsIGV2YWxSZXN1bHQuY3VyclZhbEV4cHIsIGJ1aWxkZXIuY29tcGlsZXJDb25maWcubG9nQmluZGluZ1VwZGF0ZSwgc2VjdXJpdHlDb250ZXh0RXhwcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0bXRzLnB1c2guYXBwbHkoc3RtdHMsIGNyZWF0ZUNoZWNrQmluZGluZ1N0bXQoZXZhbFJlc3VsdCwgZmllbGQuZXhwcmVzc2lvbiwgVEhST1dfT05fQ0hBTkdFX1ZBUiwgY2hlY2tCaW5kaW5nU3RtdHMpKTtcbiAgICAgICAgICB2YXIgX2I7XG4gICAgICB9KTtcbiAgICAgIGJ1aWxkZXIubWV0aG9kcy5wdXNoKG5ldyBDbGFzc01ldGhvZCgnY2hlY2tIb3N0JywgbWV0aG9kUGFyYW1zLCBzdG10cykpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGhvc3RMaXN0ZW5lcnNcbiAgICogQHBhcmFtIHs/fSBidWlsZGVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhZGRIYW5kbGVFdmVudE1ldGhvZChob3N0TGlzdGVuZXJzLCBidWlsZGVyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHRWYXIgPSB2YXJpYWJsZShcInJlc3VsdFwiKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFjdGlvblN0bXRzID0gW3Jlc3VsdFZhci5zZXQobGl0ZXJhbCh0cnVlKSkudG9EZWNsU3RtdChCT09MX1RZUEUpXTtcbiAgICAgIGhvc3RMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoaG9zdExpc3RlbmVyLCBldmVudElkeCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2YWxSZXN1bHQgPSBjb252ZXJ0QWN0aW9uQmluZGluZyhidWlsZGVyLCBudWxsLCBUSElTX0VYUFIucHJvcChDT05URVhUX0ZJRUxEX05BTUUpLCBob3N0TGlzdGVuZXIuaGFuZGxlciwgXCJzdWJfXCIgKyBldmVudElkeCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJ1ZVN0bXRzID0gZXZhbFJlc3VsdC5zdG10cztcbiAgICAgICAgICBpZiAoZXZhbFJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgICB0cnVlU3RtdHMucHVzaChyZXN1bHRWYXIuc2V0KGV2YWxSZXN1bHQucHJldmVudERlZmF1bHQuYW5kKHJlc3VsdFZhcikpLnRvU3RtdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBjb252ZXJ0IHRoaXMgaW50byBhIGBzd2l0Y2hgIG9uY2Ugb3VyIE91dHB1dEFzdCBzdXBwb3J0cyBpdC5cbiAgICAgICAgICBhY3Rpb25TdG10cy5wdXNoKG5ldyBJZlN0bXQoRVZFTlRfTkFNRV9WQVIuZXF1YWxzKGxpdGVyYWwoaG9zdExpc3RlbmVyLmZ1bGxOYW1lKSksIHRydWVTdG10cykpO1xuICAgICAgfSk7XG4gICAgICBhY3Rpb25TdG10cy5wdXNoKG5ldyBSZXR1cm5TdGF0ZW1lbnQocmVzdWx0VmFyKSk7XG4gICAgICBidWlsZGVyLm1ldGhvZHMucHVzaChuZXcgQ2xhc3NNZXRob2QoJ2hhbmRsZUV2ZW50JywgW1xuICAgICAgICAgIG5ldyBGblBhcmFtKEVWRU5UX05BTUVfVkFSLm5hbWUsIFNUUklOR19UWVBFKSxcbiAgICAgICAgICBuZXcgRm5QYXJhbShFdmVudEhhbmRsZXJWYXJzLmV2ZW50Lm5hbWUsIERZTkFNSUNfVFlQRSlcbiAgICAgIF0sIGFjdGlvblN0bXRzLCBCT09MX1RZUEUpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBkaXJNZXRhXG4gICAqIEBwYXJhbSB7P30gYnVpbGRlclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkU3Vic2NyaWJlTWV0aG9kKGRpck1ldGEsIGJ1aWxkZXIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1ldGhvZFBhcmFtcyA9IFtcbiAgICAgICAgICBuZXcgRm5QYXJhbShWSUVXX1ZBUi5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQXBwVmlldyksIFtEWU5BTUlDX1RZUEVdKSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oRVZFTlRfSEFORExFUl9GSUVMRF9OQU1FLCBEWU5BTUlDX1RZUEUpXG4gICAgICBdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBbXG4gICAgICAgICAgVEhJU19FWFBSLnByb3AoRVZFTlRfSEFORExFUl9GSUVMRF9OQU1FKS5zZXQodmFyaWFibGUoRVZFTlRfSEFORExFUl9GSUVMRF9OQU1FKSkudG9TdG10KClcbiAgICAgIF07XG4gICAgICBPYmplY3Qua2V5cyhkaXJNZXRhLm91dHB1dHMpLmZvckVhY2goZnVuY3Rpb24gKGVtaXR0ZXJQcm9wTmFtZSwgZW1pdHRlcklkeCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50TmFtZSA9IGRpck1ldGEub3V0cHV0c1tlbWl0dGVyUHJvcE5hbWVdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtTmFtZSA9IFwiZW1pdFwiICsgZW1pdHRlcklkeDtcbiAgICAgICAgICBtZXRob2RQYXJhbXMucHVzaChuZXcgRm5QYXJhbShwYXJhbU5hbWUsIEJPT0xfVFlQRSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN1YnNjcmlwdGlvbkZpZWxkTmFtZSA9IFwic3Vic2NyaXB0aW9uXCIgKyBlbWl0dGVySWR4O1xuICAgICAgICAgIGJ1aWxkZXIuZmllbGRzLnB1c2gobmV3IENsYXNzRmllbGQoc3Vic2NyaXB0aW9uRmllbGROYW1lLCBEWU5BTUlDX1RZUEUpKTtcbiAgICAgICAgICBzdG10cy5wdXNoKG5ldyBJZlN0bXQodmFyaWFibGUocGFyYW1OYW1lKSwgW1xuICAgICAgICAgICAgICBUSElTX0VYUFIucHJvcChzdWJzY3JpcHRpb25GaWVsZE5hbWUpXG4gICAgICAgICAgICAgICAgICAuc2V0KFRISVNfRVhQUi5wcm9wKENPTlRFWFRfRklFTERfTkFNRSlcbiAgICAgICAgICAgICAgICAgIC5wcm9wKGVtaXR0ZXJQcm9wTmFtZSlcbiAgICAgICAgICAgICAgICAgIC5jYWxsTWV0aG9kKEJ1aWx0aW5NZXRob2QuU3Vic2NyaWJlT2JzZXJ2YWJsZSwgW3ZhcmlhYmxlKEVWRU5UX0hBTkRMRVJfRklFTERfTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZChCdWlsdGluTWV0aG9kLkJpbmQsIFtWSUVXX1ZBUiwgbGl0ZXJhbChldmVudE5hbWUpXSldKSlcbiAgICAgICAgICAgICAgICAgIC50b1N0bXQoKVxuICAgICAgICAgIF0pKTtcbiAgICAgICAgICBidWlsZGVyLmRlc3Ryb3lTdG10cy5wdXNoKFRISVNfRVhQUi5wcm9wKHN1YnNjcmlwdGlvbkZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgLmFuZChUSElTX0VYUFIucHJvcChzdWJzY3JpcHRpb25GaWVsZE5hbWUpLmNhbGxNZXRob2QoJ3Vuc3Vic2NyaWJlJywgW10pKVxuICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgfSk7XG4gICAgICBidWlsZGVyLm1ldGhvZHMucHVzaChuZXcgQ2xhc3NNZXRob2QoJ3N1YnNjcmliZScsIG1ldGhvZFBhcmFtcywgc3RtdHMpKTtcbiAgfVxuICB2YXIgUGFyc2VSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RQcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSBob3N0TGlzdGVuZXJzXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYXJzZVJlc3VsdChob3N0UHJvcHMsIGhvc3RMaXN0ZW5lcnMsIGVycm9ycykge1xuICAgICAgICAgIHRoaXMuaG9zdFByb3BzID0gaG9zdFByb3BzO1xuICAgICAgICAgIHRoaXMuaG9zdExpc3RlbmVycyA9IGhvc3RMaXN0ZW5lcnM7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gUGFyc2VSZXN1bHQ7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGRpck1ldGFcbiAgICogQHBhcmFtIHs/fSBleHByUGFyc2VyXG4gICAqIEBwYXJhbSB7P30gc2NoZW1hUmVnaXN0cnlcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSG9zdEJpbmRpbmdzKGRpck1ldGEsIGV4cHJQYXJzZXIsIHNjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlciA9IG5ldyBCaW5kaW5nUGFyc2VyKGV4cHJQYXJzZXIsIERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUcsIHNjaGVtYVJlZ2lzdHJ5LCBbXSwgZXJyb3JzKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZVVybCA9IGlkZW50aWZpZXJNb2R1bGVVcmwoZGlyTWV0YS50eXBlKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZUZpbGVOYW1lID0gbW9kdWxlVXJsID9cbiAgICAgICAgICBcImluIERpcmVjdGl2ZSBcIiArIGlkZW50aWZpZXJOYW1lKGRpck1ldGEudHlwZSkgKyBcIiBpbiBcIiArIG1vZHVsZVVybCA6XG4gICAgICAgICAgXCJpbiBEaXJlY3RpdmUgXCIgKyBpZGVudGlmaWVyTmFtZShkaXJNZXRhLnR5cGUpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlRmlsZSA9IG5ldyBQYXJzZVNvdXJjZUZpbGUoJycsIHNvdXJjZUZpbGVOYW1lKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKG5ldyBQYXJzZUxvY2F0aW9uKHNvdXJjZUZpbGUsIG51bGwsIG51bGwsIG51bGwpLCBuZXcgUGFyc2VMb2NhdGlvbihzb3VyY2VGaWxlLCBudWxsLCBudWxsLCBudWxsKSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJzZWRIb3N0UHJvcHMgPSBwYXJzZXIuY3JlYXRlRGlyZWN0aXZlSG9zdFByb3BlcnR5QXN0cyhkaXJNZXRhLnRvU3VtbWFyeSgpLCBzb3VyY2VTcGFuKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlZEhvc3RMaXN0ZW5lcnMgPSBwYXJzZXIuY3JlYXRlRGlyZWN0aXZlSG9zdEV2ZW50QXN0cyhkaXJNZXRhLnRvU3VtbWFyeSgpLCBzb3VyY2VTcGFuKTtcbiAgICAgIHJldHVybiBuZXcgUGFyc2VSZXN1bHQocGFyc2VkSG9zdFByb3BzLCBwYXJzZWRIb3N0TGlzdGVuZXJzLCBlcnJvcnMpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBhcnNlRXJyb3JzXG4gICAqIEBwYXJhbSB7P30gY29uc29sZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwb3J0UGFyc2VFcnJvcnMocGFyc2VFcnJvcnMsIGNvbnNvbGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHdhcm5pbmdzID0gcGFyc2VFcnJvcnMuZmlsdGVyKGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gZXJyb3IubGV2ZWwgPT09IFBhcnNlRXJyb3JMZXZlbC5XQVJOSU5HOyB9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9ycyA9IHBhcnNlRXJyb3JzLmZpbHRlcihmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGVycm9yLmxldmVsID09PSBQYXJzZUVycm9yTGV2ZWwuRkFUQUw7IH0pO1xuICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9jb25zb2xlLndhcm4oXCJEaXJlY3RpdmUgcGFyc2Ugd2FybmluZ3M6XFxuXCIgKyB3YXJuaW5ncy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEaXJlY3RpdmUgcGFyc2UgZXJyb3JzOlxcblwiICsgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgfVxuICB2YXIgRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucygpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwc0V4cHJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5jcmVhdGUgPSBmdW5jdGlvbiAoZGlyLCBkZXBzRXhwcikge1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGRpcikuaW5zdGFudGlhdGUoZGVwc0V4cHIsIGltcG9ydFR5cGUoZGlyKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcldyYXBwZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5jb250ZXh0ID0gZnVuY3Rpb24gKGRpcldyYXBwZXIpIHtcbiAgICAgICAgICByZXR1cm4gZGlyV3JhcHBlci5wcm9wKENPTlRFWFRfRklFTERfTkFNRSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcldyYXBwZXJcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5uZ0RvQ2hlY2sgPSBmdW5jdGlvbiAoZGlyV3JhcHBlciwgdmlldywgcmVuZGVyRWxlbWVudCwgdGhyb3dPbkNoYW5nZSkge1xuICAgICAgICAgIHJldHVybiBkaXJXcmFwcGVyLmNhbGxNZXRob2QoJ25nRG9DaGVjaycsIFt2aWV3LCByZW5kZXJFbGVtZW50LCB0aHJvd09uQ2hhbmdlXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RQcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSBkaXJXcmFwcGVyXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50Vmlld1xuICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VcbiAgICAgICAqIEBwYXJhbSB7P30gcnVudGltZVNlY3VyaXR5Q29udGV4dHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5jaGVja0hvc3QgPSBmdW5jdGlvbiAoaG9zdFByb3BzLCBkaXJXcmFwcGVyLCB2aWV3LCBjb21wb25lbnRWaWV3LCByZW5kZXJFbGVtZW50LCB0aHJvd09uQ2hhbmdlLCBydW50aW1lU2VjdXJpdHlDb250ZXh0cykge1xuICAgICAgICAgIGlmIChob3N0UHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbZGlyV3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTWV0aG9kKCdjaGVja0hvc3QnLCBbdmlldywgY29tcG9uZW50VmlldywgcmVuZGVyRWxlbWVudCwgdGhyb3dPbkNoYW5nZV0uY29uY2F0KHJ1bnRpbWVTZWN1cml0eUNvbnRleHRzKSlcbiAgICAgICAgICAgICAgICAgICAgICAudG9TdG10KCldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFByb3BzXG4gICAgICAgKiBAcGFyYW0gez99IGRpcldyYXBwZXJcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRWaWV3XG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVXcmFwcGVyRXhwcmVzc2lvbnMubmdPbkRldGFjaCA9IGZ1bmN0aW9uIChob3N0UHJvcHMsIGRpcldyYXBwZXIsIHZpZXcsIGNvbXBvbmVudFZpZXcsIHJlbmRlckVsKSB7XG4gICAgICAgICAgaWYgKGhvc3RQcm9wcy5zb21lKGZ1bmN0aW9uIChwcm9wKSB7IHJldHVybiBwcm9wLmlzQW5pbWF0aW9uOyB9KSkge1xuICAgICAgICAgICAgICByZXR1cm4gW2RpcldyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnbmdPbkRldGFjaCcsIFtcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3LFxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRWwsXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgIC50b1N0bXQoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyV3JhcHBlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKGRpciwgZGlyV3JhcHBlcikge1xuICAgICAgICAgIGlmIChkaXIudHlwZS5saWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLk9uRGVzdHJveSkgIT09IC0xIHx8XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpci5vdXRwdXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbZGlyV3JhcHBlci5jYWxsTWV0aG9kKCduZ09uRGVzdHJveScsIFtdKS50b1N0bXQoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJNZXRhXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RQcm9wc1xuICAgICAgICogQHBhcmFtIHs/fSB1c2VkRXZlbnRzXG4gICAgICAgKiBAcGFyYW0gez99IGRpcldyYXBwZXJcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSBldmVudExpc3RlbmVyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEaXJlY3RpdmVXcmFwcGVyRXhwcmVzc2lvbnMuc3Vic2NyaWJlID0gZnVuY3Rpb24gKGRpck1ldGEsIGhvc3RQcm9wcywgdXNlZEV2ZW50cywgZGlyV3JhcHBlciwgdmlldywgZXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5lZWRzU3Vic2NyaWJlID0gZmFsc2U7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZlbnRGbGFncyA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGRpck1ldGEub3V0cHV0cykuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZlbnROYW1lID0gZGlyTWV0YS5vdXRwdXRzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZlbnRVc2VkID0gdXNlZEV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMTtcbiAgICAgICAgICAgICAgbmVlZHNTdWJzY3JpYmUgPSBuZWVkc1N1YnNjcmliZSB8fCBldmVudFVzZWQ7XG4gICAgICAgICAgICAgIGV2ZW50RmxhZ3MucHVzaChsaXRlcmFsKGV2ZW50VXNlZCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhvc3RQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChob3N0UHJvcCkge1xuICAgICAgICAgICAgICBpZiAoaG9zdFByb3AuaXNBbmltYXRpb24gJiYgdXNlZEV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBuZWVkc1N1YnNjcmliZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobmVlZHNTdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGRpcldyYXBwZXIuY2FsbE1ldGhvZCgnc3Vic2NyaWJlJywgW3ZpZXcsIGV2ZW50TGlzdGVuZXJdLmNvbmNhdChldmVudEZsYWdzKSkudG9TdG10KClcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RFdmVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyV3JhcHBlclxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uIChob3N0RXZlbnRzLCBkaXJXcmFwcGVyLCBldmVudE5hbWUsIGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGRpcldyYXBwZXIuY2FsbE1ldGhvZCgnaGFuZGxlRXZlbnQnLCBbZXZlbnROYW1lLCBldmVudF0pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBEaXJlY3RpdmVXcmFwcGVyRXhwcmVzc2lvbnM7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaG9va1xuICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGhvb2ssIHRva2VuKSB7XG4gICAgICByZXR1cm4gcmVmbGVjdG9yLmhhc0xpZmVjeWNsZUhvb2sodG9rZW4sIGdldEhvb2tOYW1lKGhvb2spKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBob29rXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIb29rTmFtZShob29rKSB7XG4gICAgICBzd2l0Y2ggKGhvb2spIHtcbiAgICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLk9uSW5pdDpcbiAgICAgICAgICAgICAgcmV0dXJuICduZ09uSW5pdCc7XG4gICAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3k6XG4gICAgICAgICAgICAgIHJldHVybiAnbmdPbkRlc3Ryb3knO1xuICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuRG9DaGVjazpcbiAgICAgICAgICAgICAgcmV0dXJuICduZ0RvQ2hlY2snO1xuICAgICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuT25DaGFuZ2VzOlxuICAgICAgICAgICAgICByZXR1cm4gJ25nT25DaGFuZ2VzJztcbiAgICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQ6XG4gICAgICAgICAgICAgIHJldHVybiAnbmdBZnRlckNvbnRlbnRJbml0JztcbiAgICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQ6XG4gICAgICAgICAgICAgIHJldHVybiAnbmdBZnRlckNvbnRlbnRDaGVja2VkJztcbiAgICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0luaXQ6XG4gICAgICAgICAgICAgIHJldHVybiAnbmdBZnRlclZpZXdJbml0JztcbiAgICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICAgICAgICAgIHJldHVybiAnbmdBZnRlclZpZXdDaGVja2VkJztcbiAgICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkMTAgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMTAgPSAodGhpcyAmJiB0aGlzLl9fbWV0YWRhdGEpIHx8IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG4gIH07XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG9ialxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzTmdNb2R1bGVNZXRhZGF0YShvYmopIHtcbiAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLk5nTW9kdWxlO1xuICB9XG4gIC8qKlxuICAgKiAgUmVzb2x2ZXMgdHlwZXMgdG8ge0BsaW5rIE5nTW9kdWxlfS5cbiAgICovXG4gIHZhciBOZ01vZHVsZVJlc29sdmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX3JlZmxlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBOZ01vZHVsZVJlc29sdmVyKF9yZWZsZWN0b3IpIHtcbiAgICAgICAgICBpZiAoX3JlZmxlY3RvciA9PT0gdm9pZCAwKSB7IF9yZWZsZWN0b3IgPSByZWZsZWN0b3I7IH1cbiAgICAgICAgICB0aGlzLl9yZWZsZWN0b3IgPSBfcmVmbGVjdG9yO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5nTW9kdWxlUmVzb2x2ZXIucHJvdG90eXBlLmlzTmdNb2R1bGUgPSBmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHR5cGUpLnNvbWUoX2lzTmdNb2R1bGVNZXRhZGF0YSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/PX0gdGhyb3dJZk5vdEZvdW5kXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOZ01vZHVsZVJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHR5cGUsIHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICAgIGlmICh0aHJvd0lmTm90Rm91bmQgPT09IHZvaWQgMCkgeyB0aHJvd0lmTm90Rm91bmQgPSB0cnVlOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGVNZXRhID0gTGlzdFdyYXBwZXIuZmluZExhc3QodGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHR5cGUpLCBfaXNOZ01vZHVsZU1ldGFkYXRhKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KG5nTW9kdWxlTWV0YSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kdWxlTWV0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aHJvd0lmTm90Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIE5nTW9kdWxlIG1ldGFkYXRhIGZvdW5kIGZvciAnXCIgKyBzdHJpbmdpZnkodHlwZSkgKyBcIicuXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICBOZ01vZHVsZVJlc29sdmVyID0gX19kZWNvcmF0ZSQxMChbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTAoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW1JlZmxlY3RvclJlYWRlcl0pXG4gICAgICBdLCBOZ01vZHVsZVJlc29sdmVyKTtcbiAgICAgIHJldHVybiBOZ01vZHVsZVJlc29sdmVyO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkMTEgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMTEgPSAodGhpcyAmJiB0aGlzLl9fbWV0YWRhdGEpIHx8IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG4gIH07XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9pc1BpcGVNZXRhZGF0YSh0eXBlKSB7XG4gICAgICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuUGlwZTtcbiAgfVxuICAvKipcbiAgICogIFJlc29sdmUgYSBgVHlwZWAgZm9yIHtAbGluayBQaXBlfS5cbiAgICAqICpcbiAgICAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdG8gY3JlYXRlIGN1c3RvbSBiZWhhdmlvci5cbiAgICAqICpcbiAgICAqIFNlZSB7QGxpbmsgQ29tcGlsZXJ9XG4gICAqL1xuICB2YXIgUGlwZVJlc29sdmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gX3JlZmxlY3RvclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQaXBlUmVzb2x2ZXIoX3JlZmxlY3Rvcikge1xuICAgICAgICAgIGlmIChfcmVmbGVjdG9yID09PSB2b2lkIDApIHsgX3JlZmxlY3RvciA9IHJlZmxlY3RvcjsgfVxuICAgICAgICAgIHRoaXMuX3JlZmxlY3RvciA9IF9yZWZsZWN0b3I7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGlwZVJlc29sdmVyLnByb3RvdHlwZS5pc1BpcGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGVNZXRhZGF0YSA9IHRoaXMuX3JlZmxlY3Rvci5hbm5vdGF0aW9ucyhfYW5ndWxhcl9jb3JlLnJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgICByZXR1cm4gdHlwZU1ldGFkYXRhICYmIHR5cGVNZXRhZGF0YS5zb21lKF9pc1BpcGVNZXRhZGF0YSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUmV0dXJuIHtAbGluayBQaXBlfSBmb3IgYSBnaXZlbiBgVHlwZWAuXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHRocm93SWZOb3RGb3VuZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUGlwZVJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHR5cGUsIHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICAgIGlmICh0aHJvd0lmTm90Rm91bmQgPT09IHZvaWQgMCkgeyB0aHJvd0lmTm90Rm91bmQgPSB0cnVlOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWV0YXMgPSB0aGlzLl9yZWZsZWN0b3IuYW5ub3RhdGlvbnMoX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZih0eXBlKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChtZXRhcykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5ub3RhdGlvbiA9IExpc3RXcmFwcGVyLmZpbmRMYXN0KG1ldGFzLCBfaXNQaXBlTWV0YWRhdGEpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIFBpcGUgZGVjb3JhdG9yIGZvdW5kIG9uIFwiICsgc3RyaW5naWZ5KHR5cGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgUGlwZVJlc29sdmVyID0gX19kZWNvcmF0ZSQxMShbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTEoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW1JlZmxlY3RvclJlYWRlcl0pXG4gICAgICBdLCBQaXBlUmVzb2x2ZXIpO1xuICAgICAgcmV0dXJuIFBpcGVSZXNvbHZlcjtcbiAgfSgpKTtcblxuICB2YXIgX19kZWNvcmF0ZSQxMiA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQxMiA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIFN1bW1hcnlSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTdW1tYXJ5UmVzb2x2ZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVmZXJlbmNlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmVTdW1tYXJ5ID0gZnVuY3Rpb24gKHJlZmVyZW5jZSkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIDtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmaWxlUGF0aFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5nZXRTeW1ib2xzT2YgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgU3VtbWFyeVJlc29sdmVyID0gX19kZWNvcmF0ZSQxMihbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTIoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW10pXG4gICAgICBdLCBTdW1tYXJ5UmVzb2x2ZXIpO1xuICAgICAgcmV0dXJuIFN1bW1hcnlSZXNvbHZlcjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMTggPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBfX2RlY29yYXRlJDkgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkOSA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRVJST1JfQ09MTEVDVE9SX1RPS0VOID0gbmV3IF9hbmd1bGFyX2NvcmUuT3BhcXVlVG9rZW4oJ0Vycm9yQ29sbGVjdG9yJyk7XG4gIC8vIERlc2lnbiBub3RlczpcbiAgLy8gLSBkb24ndCBsYXppbHkgY3JlYXRlIG1ldGFkYXRhOlxuICAvLyAgIEZvciBzb21lIG1ldGFkYXRhLCB3ZSBuZWVkIHRvIGRvIGFzeW5jIHdvcmsgc29tZXRpbWVzLFxuICAvLyAgIHNvIHRoZSB1c2VyIGhhcyB0byBraWNrIG9mZiB0aGlzIGxvYWRpbmcuXG4gIC8vICAgQnV0IHdlIHdhbnQgdG8gcmVwb3J0IGVycm9ycyBldmVuIHdoZW4gdGhlIGFzeW5jIHdvcmsgaXNcbiAgLy8gICBub3QgcmVxdWlyZWQgdG8gY2hlY2sgdGhhdCB0aGUgdXNlciB3b3VsZCBoYXZlIGJlZW4gYWJsZVxuICAvLyAgIHRvIHdhaXQgY29ycmVjdGx5LlxuICB2YXIgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9uZ01vZHVsZVJlc29sdmVyXG4gICAgICAgKiBAcGFyYW0gez99IF9kaXJlY3RpdmVSZXNvbHZlclxuICAgICAgICogQHBhcmFtIHs/fSBfcGlwZVJlc29sdmVyXG4gICAgICAgKiBAcGFyYW0gez99IF9zdW1tYXJ5UmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3NjaGVtYVJlZ2lzdHJ5XG4gICAgICAgKiBAcGFyYW0gez99IF9kaXJlY3RpdmVOb3JtYWxpemVyXG4gICAgICAgKiBAcGFyYW0gez89fSBfcmVmbGVjdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBfZXJyb3JDb2xsZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIoX25nTW9kdWxlUmVzb2x2ZXIsIF9kaXJlY3RpdmVSZXNvbHZlciwgX3BpcGVSZXNvbHZlciwgX3N1bW1hcnlSZXNvbHZlciwgX3NjaGVtYVJlZ2lzdHJ5LCBfZGlyZWN0aXZlTm9ybWFsaXplciwgX3JlZmxlY3RvciwgX2Vycm9yQ29sbGVjdG9yKSB7XG4gICAgICAgICAgaWYgKF9yZWZsZWN0b3IgPT09IHZvaWQgMCkgeyBfcmVmbGVjdG9yID0gcmVmbGVjdG9yOyB9XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVSZXNvbHZlciA9IF9uZ01vZHVsZVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX2RpcmVjdGl2ZVJlc29sdmVyID0gX2RpcmVjdGl2ZVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX3BpcGVSZXNvbHZlciA9IF9waXBlUmVzb2x2ZXI7XG4gICAgICAgICAgdGhpcy5fc3VtbWFyeVJlc29sdmVyID0gX3N1bW1hcnlSZXNvbHZlcjtcbiAgICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVOb3JtYWxpemVyID0gX2RpcmVjdGl2ZU5vcm1hbGl6ZXI7XG4gICAgICAgICAgdGhpcy5fcmVmbGVjdG9yID0gX3JlZmxlY3RvcjtcbiAgICAgICAgICB0aGlzLl9lcnJvckNvbGxlY3RvciA9IF9lcnJvckNvbGxlY3RvcjtcbiAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9zdW1tYXJ5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fcGlwZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX25nTW9kdWxlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVPZlR5cGVzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJNZXRhID0gdGhpcy5fZGlyZWN0aXZlQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICAgIHRoaXMuX2RpcmVjdGl2ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgICB0aGlzLl9zdW1tYXJ5Q2FjaGUuZGVsZXRlKHR5cGUpO1xuICAgICAgICAgIHRoaXMuX3BpcGVDYWNoZS5kZWxldGUodHlwZSk7XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVPZlR5cGVzLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgICAvLyBDbGVhciBhbGwgb2YgdGhlIE5nTW9kdWxlIGFzIHRoZXkgY29udGFpbiB0cmFuc2l0aXZlIGluZm9ybWF0aW9uIVxuICAgICAgICAgIHRoaXMuX25nTW9kdWxlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICBpZiAoZGlyTWV0YSkge1xuICAgICAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVOb3JtYWxpemVyLmNsZWFyQ2FjaGVGb3IoZGlyTWV0YSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5fZGlyZWN0aXZlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLl9zdW1tYXJ5Q2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLl9waXBlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLl9uZ01vZHVsZUNhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVPZlR5cGVzLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5fZGlyZWN0aXZlTm9ybWFsaXplci5jbGVhckNhY2hlKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVudHJ5XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uRW50cnlNZXRhZGF0YSA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVmcyA9IGVudHJ5LmRlZmluaXRpb25zLm1hcChmdW5jdGlvbiAoZGVmKSB7IHJldHVybiBfdGhpcy5fZ2V0QW5pbWF0aW9uU3RhdGVNZXRhZGF0YShkZWYpOyB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVBbmltYXRpb25FbnRyeU1ldGFkYXRhKGVudHJ5Lm5hbWUsIGRlZnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRBbmltYXRpb25TdGF0ZU1ldGFkYXRhID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5BbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzID0gdGhpcy5fZ2V0QW5pbWF0aW9uU3R5bGVNZXRhZGF0YSh2YWx1ZS5zdHlsZXMpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEodmFsdWUuc3RhdGVOYW1lRXhwciwgc3R5bGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5BbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YSh2YWx1ZS5zdGF0ZUNoYW5nZUV4cHIsIHRoaXMuX2dldEFuaW1hdGlvbk1ldGFkYXRhKHZhbHVlLnN0ZXBzKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRBbmltYXRpb25TdHlsZU1ldGFkYXRhID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSh2YWx1ZS5vZmZzZXQsIHZhbHVlLnN0eWxlcyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldEFuaW1hdGlvbk1ldGFkYXRhID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkFuaW1hdGlvblN0eWxlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFuaW1hdGlvblN0eWxlTWV0YWRhdGEodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkFuaW1hdGlvbktleWZyYW1lc1NlcXVlbmNlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YSh2YWx1ZS5zdGVwcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBfdGhpcy5fZ2V0QW5pbWF0aW9uU3R5bGVNZXRhZGF0YShlbnRyeSk7IH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5BbmltYXRpb25BbmltYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5pbWF0ZURhdGEgPSAodGhpc1xuICAgICAgICAgICAgICAgICAgLl9nZXRBbmltYXRpb25NZXRhZGF0YSh2YWx1ZS5zdHlsZXMpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhKHZhbHVlLnRpbWluZ3MsIGFuaW1hdGVEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5BbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGVwcyA9IHZhbHVlLnN0ZXBzLm1hcChmdW5jdGlvbiAoc3RlcCkgeyByZXR1cm4gX3RoaXMuX2dldEFuaW1hdGlvbk1ldGFkYXRhKHN0ZXApOyB9KTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5BbmltYXRpb25Hcm91cE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVBbmltYXRpb25Hcm91cE1ldGFkYXRhKHN0ZXBzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhKHN0ZXBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30ga2luZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9sb2FkU3VtbWFyeSA9IGZ1bmN0aW9uICh0eXBlLCBraW5kKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHlwZVN1bW1hcnkgPSB0aGlzLl9zdW1tYXJ5Q2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICAgIGlmICghdHlwZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VtbWFyeSA9IHRoaXMuX3N1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeSh0eXBlKTtcbiAgICAgICAgICAgICAgdHlwZVN1bW1hcnkgPSBzdW1tYXJ5ID8gc3VtbWFyeS50eXBlIDogbnVsbDtcbiAgICAgICAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLnNldCh0eXBlLCB0eXBlU3VtbWFyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0eXBlU3VtbWFyeSAmJiB0eXBlU3VtbWFyeS5zdW1tYXJ5S2luZCA9PT0ga2luZCA/IHR5cGVTdW1tYXJ5IDogbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlVHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBpc1N5bmNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fbG9hZERpcmVjdGl2ZU1ldGFkYXRhID0gZnVuY3Rpb24gKGRpcmVjdGl2ZVR5cGUsIGlzU3luYykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGl2ZUNhY2hlLmhhcyhkaXJlY3RpdmVUeXBlKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRpcmVjdGl2ZVR5cGUgPSBfYW5ndWxhcl9jb3JlLnJlc29sdmVGb3J3YXJkUmVmKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0Tm9uTm9ybWFsaXplZERpcmVjdGl2ZU1ldGFkYXRhKGRpcmVjdGl2ZVR5cGUpLCBhbm5vdGF0aW9uID0gX2EuYW5ub3RhdGlvbiwgbWV0YWRhdGEgPSBfYS5tZXRhZGF0YTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjcmVhdGVEaXJlY3RpdmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZWREaXJNZXRhID0gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBtZXRhZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgICAgaXNDb21wb25lbnQ6IG1ldGFkYXRhLmlzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG1ldGFkYXRhLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgZXhwb3J0QXM6IG1ldGFkYXRhLmV4cG9ydEFzLFxuICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBtZXRhZGF0YS5jaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBpbnB1dHM6IG1ldGFkYXRhLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1ldGFkYXRhLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBtZXRhZGF0YS5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgaG9zdFByb3BlcnRpZXM6IG1ldGFkYXRhLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgaG9zdEF0dHJpYnV0ZXM6IG1ldGFkYXRhLmhvc3RBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBtZXRhZGF0YS5wcm92aWRlcnMsXG4gICAgICAgICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiBtZXRhZGF0YS52aWV3UHJvdmlkZXJzLFxuICAgICAgICAgICAgICAgICAgcXVlcmllczogbWV0YWRhdGEucXVlcmllcyxcbiAgICAgICAgICAgICAgICAgIHZpZXdRdWVyaWVzOiBtZXRhZGF0YS52aWV3UXVlcmllcyxcbiAgICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogbWV0YWRhdGEuZW50cnlDb21wb25lbnRzLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlTWV0YWRhdGFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIF90aGlzLl9kaXJlY3RpdmVDYWNoZS5zZXQoZGlyZWN0aXZlVHlwZSwgbm9ybWFsaXplZERpck1ldGEpO1xuICAgICAgICAgICAgICBfdGhpcy5fc3VtbWFyeUNhY2hlLnNldChkaXJlY3RpdmVUeXBlLCBub3JtYWxpemVkRGlyTWV0YS50b1N1bW1hcnkoKSk7XG4gICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkRGlyTWV0YTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZU1ldGEgPSB0aGlzLl9kaXJlY3RpdmVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IGRpcmVjdGl2ZVR5cGUsXG4gICAgICAgICAgICAgICAgICBtb2R1bGVVcmw6IGNvbXBvbmVudE1vZHVsZVVybCh0aGlzLl9yZWZsZWN0b3IsIGRpcmVjdGl2ZVR5cGUsIGFubm90YXRpb24pLFxuICAgICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogbWV0YWRhdGEudGVtcGxhdGUuZW5jYXBzdWxhdGlvbixcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBtZXRhZGF0YS50ZW1wbGF0ZS50ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiBtZXRhZGF0YS50ZW1wbGF0ZS50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczogbWV0YWRhdGEudGVtcGxhdGUuc3R5bGVzLFxuICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBtZXRhZGF0YS50ZW1wbGF0ZS5zdHlsZVVybHMsXG4gICAgICAgICAgICAgICAgICBhbmltYXRpb25zOiBtZXRhZGF0YS50ZW1wbGF0ZS5hbmltYXRpb25zLFxuICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbjogbWV0YWRhdGEudGVtcGxhdGUuaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWV0YS5zeW5jUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICBjcmVhdGVEaXJlY3RpdmVNZXRhZGF0YSh0ZW1wbGF0ZU1ldGEuc3luY1Jlc3VsdCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihuZXcgQ29tcG9uZW50U3RpbGxMb2FkaW5nRXJyb3IoZGlyZWN0aXZlVHlwZSksIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlTWV0YS5hc3luY1Jlc3VsdC50aGVuKGNyZWF0ZURpcmVjdGl2ZU1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gZGlyZWN0aXZlXG4gICAgICAgICAgICAgIGNyZWF0ZURpcmVjdGl2ZU1ldGFkYXRhKG51bGwpO1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXROb25Ob3JtYWxpemVkRGlyZWN0aXZlTWV0YWRhdGEgPSBmdW5jdGlvbiAoZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgZGlyZWN0aXZlVHlwZSA9IF9hbmd1bGFyX2NvcmUucmVzb2x2ZUZvcndhcmRSZWYoZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyTWV0YSA9IHRoaXMuX2RpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUoZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgaWYgKCFkaXJNZXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub25Ob3JtYWxpemVkVGVtcGxhdGVNZXRhZGF0YTtcbiAgICAgICAgICBpZiAoZGlyTWV0YSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgICAgICAgICBhc3NlcnRBcnJheU9mU3RyaW5ncygnc3R5bGVzJywgZGlyTWV0YS5zdHlsZXMpO1xuICAgICAgICAgICAgICBhc3NlcnRBcnJheU9mU3RyaW5ncygnc3R5bGVVcmxzJywgZGlyTWV0YS5zdHlsZVVybHMpO1xuICAgICAgICAgICAgICBhc3NlcnRJbnRlcnBvbGF0aW9uU3ltYm9scygnaW50ZXJwb2xhdGlvbicsIGRpck1ldGEuaW50ZXJwb2xhdGlvbik7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFuaW1hdGlvbnMgPSBkaXJNZXRhLmFuaW1hdGlvbnMgP1xuICAgICAgICAgICAgICAgICAgZGlyTWV0YS5hbmltYXRpb25zLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuZ2V0QW5pbWF0aW9uRW50cnlNZXRhZGF0YShlKTsgfSkgOlxuICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgICAgICAgbm9uTm9ybWFsaXplZFRlbXBsYXRlTWV0YWRhdGEgPSBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogZGlyTWV0YS5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGRpck1ldGEudGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogZGlyTWV0YS50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICAgIHN0eWxlczogZGlyTWV0YS5zdHlsZXMsXG4gICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IGRpck1ldGEuc3R5bGVVcmxzLFxuICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uczogYW5pbWF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb246IGRpck1ldGEuaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSBudWxsO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdQcm92aWRlcnMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbnRyeUNvbXBvbmVudE1ldGFkYXRhID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VsZWN0b3IgPSBkaXJNZXRhLnNlbGVjdG9yO1xuICAgICAgICAgIGlmIChkaXJNZXRhIGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgLy8gQ29tcG9uZW50XG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gZGlyTWV0YS5jaGFuZ2VEZXRlY3Rpb247XG4gICAgICAgICAgICAgIGlmIChkaXJNZXRhLnZpZXdQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgIHZpZXdQcm92aWRlcnMgPSB0aGlzLl9nZXRQcm92aWRlcnNNZXRhZGF0YShkaXJNZXRhLnZpZXdQcm92aWRlcnMsIGVudHJ5Q29tcG9uZW50TWV0YWRhdGEsIFwidmlld1Byb3ZpZGVycyBmb3IgXFxcIlwiICsgc3RyaW5naWZ5VHlwZShkaXJlY3RpdmVUeXBlKSArIFwiXFxcIlwiLCBbXSwgZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRpck1ldGEuZW50cnlDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudE1ldGFkYXRhID0gZmxhdHRlbkFuZERlZHVwZUFycmF5KGRpck1ldGEuZW50cnlDb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIF90aGlzLl9nZXRJZGVudGlmaWVyTWV0YWRhdGEodHlwZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChlbnRyeUNvbXBvbmVudE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHRoaXMuX3NjaGVtYVJlZ2lzdHJ5LmdldERlZmF1bHRDb21wb25lbnRFbGVtZW50TmFtZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEaXJlY3RpdmVcbiAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiRGlyZWN0aXZlIFwiICsgc3RyaW5naWZ5VHlwZShkaXJlY3RpdmVUeXBlKSArIFwiIGhhcyBubyBzZWxlY3RvciwgcGxlYXNlIGFkZCBpdCFcIiksIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAnZXJyb3InO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3ZpZGVycyA9IFtdO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGlyTWV0YS5wcm92aWRlcnMpKSB7XG4gICAgICAgICAgICAgIHByb3ZpZGVycyA9IHRoaXMuX2dldFByb3ZpZGVyc01ldGFkYXRhKGRpck1ldGEucHJvdmlkZXJzLCBlbnRyeUNvbXBvbmVudE1ldGFkYXRhLCBcInByb3ZpZGVycyBmb3IgXFxcIlwiICsgc3RyaW5naWZ5VHlwZShkaXJlY3RpdmVUeXBlKSArIFwiXFxcIlwiLCBbXSwgZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJpZXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3UXVlcmllcyA9IFtdO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGlyTWV0YS5xdWVyaWVzKSkge1xuICAgICAgICAgICAgICBxdWVyaWVzID0gdGhpcy5fZ2V0UXVlcmllc01ldGFkYXRhKGRpck1ldGEucXVlcmllcywgZmFsc2UsIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICB2aWV3UXVlcmllcyA9IHRoaXMuX2dldFF1ZXJpZXNNZXRhZGF0YShkaXJNZXRhLnF1ZXJpZXMsIHRydWUsIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRhZGF0YSA9IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5jcmVhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgIGV4cG9ydEFzOiBkaXJNZXRhLmV4cG9ydEFzLFxuICAgICAgICAgICAgICBpc0NvbXBvbmVudDogISFub25Ob3JtYWxpemVkVGVtcGxhdGVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgdHlwZTogdGhpcy5fZ2V0VHlwZU1ldGFkYXRhKGRpcmVjdGl2ZVR5cGUpLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZTogbm9uTm9ybWFsaXplZFRlbXBsYXRlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgICAgICAgICAgIGlucHV0czogZGlyTWV0YS5pbnB1dHMsXG4gICAgICAgICAgICAgIG91dHB1dHM6IGRpck1ldGEub3V0cHV0cyxcbiAgICAgICAgICAgICAgaG9zdDogZGlyTWV0YS5ob3N0LFxuICAgICAgICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyxcbiAgICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogdmlld1Byb3ZpZGVycyxcbiAgICAgICAgICAgICAgcXVlcmllczogcXVlcmllcyxcbiAgICAgICAgICAgICAgdmlld1F1ZXJpZXM6IHZpZXdRdWVyaWVzLFxuICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IGVudHJ5Q29tcG9uZW50TWV0YWRhdGFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBtZXRhZGF0YTogbWV0YWRhdGEsIGFubm90YXRpb246IGRpck1ldGEgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBHZXRzIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGRpcmVjdGl2ZS5cbiAgICAgICAgKiBUaGlzIGFzc3VtZXMgYGxvYWROZ01vZHVsZU1ldGFkYXRhYCBoYXMgYmVlbiBjYWxsZWQgZmlyc3QuXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXREaXJlY3RpdmVNZXRhZGF0YSA9IGZ1bmN0aW9uIChkaXJlY3RpdmVUeXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyTWV0YSA9IHRoaXMuX2RpcmVjdGl2ZUNhY2hlLmdldChkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgICBpZiAoIWRpck1ldGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogZ2V0RGlyZWN0aXZlTWV0YWRhdGEgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxvYWROZ01vZHVsZU1ldGFkYXRhIGZvciBhIG1vZHVsZSB0aGF0IGRlY2xhcmVzIGl0LiBEaXJlY3RpdmUgXCIgKyBzdHJpbmdpZnlUeXBlKGRpcmVjdGl2ZVR5cGUpICsgXCIuXCIpLCBkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpck1ldGE7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpclR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXREaXJlY3RpdmVTdW1tYXJ5ID0gZnVuY3Rpb24gKGRpclR5cGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJTdW1tYXJ5ID0gKHRoaXMuX2xvYWRTdW1tYXJ5KGRpclR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUpKTtcbiAgICAgICAgICBpZiAoIWRpclN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogQ291bGQgbm90IGxvYWQgdGhlIHN1bW1hcnkgZm9yIGRpcmVjdGl2ZSBcIiArIHN0cmluZ2lmeVR5cGUoZGlyVHlwZSkgKyBcIi5cIiksIGRpclR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGlyU3VtbWFyeTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmlzRGlyZWN0aXZlID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMuX2RpcmVjdGl2ZVJlc29sdmVyLmlzRGlyZWN0aXZlKHR5cGUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5pc1BpcGUgPSBmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdGhpcy5fcGlwZVJlc29sdmVyLmlzUGlwZSh0eXBlKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0TmdNb2R1bGVTdW1tYXJ5ID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVTdW1tYXJ5ID0gKHRoaXMuX2xvYWRTdW1tYXJ5KG1vZHVsZVR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5OZ01vZHVsZSkpO1xuICAgICAgICAgIGlmICghbW9kdWxlU3VtbWFyeSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVNZXRhID0gdGhpcy5nZXROZ01vZHVsZU1ldGFkYXRhKG1vZHVsZVR5cGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgbW9kdWxlU3VtbWFyeSA9IG1vZHVsZU1ldGEgPyBtb2R1bGVNZXRhLnRvU3VtbWFyeSgpIDogbnVsbDtcbiAgICAgICAgICAgICAgaWYgKG1vZHVsZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3N1bW1hcnlDYWNoZS5zZXQobW9kdWxlVHlwZSwgbW9kdWxlU3VtbWFyeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZHVsZVN1bW1hcnk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgTG9hZHMgdGhlIGRlY2xhcmVkIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIG9mIGFuIE5nTW9kdWxlLlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGlzU3luY1xuICAgICAgICogQHBhcmFtIHs/PX0gdGhyb3dJZk5vdEZvdW5kXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUubG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGlzU3luYywgdGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kID09PSB2b2lkIDApIHsgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlID0gdGhpcy5nZXROZ01vZHVsZU1ldGFkYXRhKG1vZHVsZVR5cGUsIHRocm93SWZOb3RGb3VuZCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG9hZGluZyA9IFtdO1xuICAgICAgICAgIGlmIChuZ01vZHVsZSkge1xuICAgICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJlZERpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb21pc2UgPSBfdGhpcy5fbG9hZERpcmVjdGl2ZU1ldGFkYXRhKGlkLnJlZmVyZW5jZSwgaXNTeW5jKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy5wdXNoKHByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbmdNb2R1bGUuZGVjbGFyZWRQaXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gX3RoaXMuX2xvYWRQaXBlTWV0YWRhdGEoaWQucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICogQHBhcmFtIHs/PX0gdGhyb3dJZk5vdEZvdW5kXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0TmdNb2R1bGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlLCB0aHJvd0lmTm90Rm91bmQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aHJvd0lmTm90Rm91bmQgPT09IHZvaWQgMCkgeyB0aHJvd0lmTm90Rm91bmQgPSB0cnVlOyB9XG4gICAgICAgICAgbW9kdWxlVHlwZSA9IF9hbmd1bGFyX2NvcmUucmVzb2x2ZUZvcndhcmRSZWYobW9kdWxlVHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZU1ldGEgPSB0aGlzLl9uZ01vZHVsZUNhY2hlLmdldChtb2R1bGVUeXBlKTtcbiAgICAgICAgICBpZiAoY29tcGlsZU1ldGEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVNZXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRhID0gdGhpcy5fbmdNb2R1bGVSZXNvbHZlci5yZXNvbHZlKG1vZHVsZVR5cGUsIHRocm93SWZOb3RGb3VuZCk7XG4gICAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNsYXJlZERpcmVjdGl2ZXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBvcnRlZE5vbk1vZHVsZUlkZW50aWZpZXJzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVjbGFyZWRQaXBlcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGltcG9ydGVkTW9kdWxlcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cG9ydGVkTW9kdWxlcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3ZpZGVycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJ5Q29tcG9uZW50cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJvb3RzdHJhcENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY2hlbWFzID0gW107XG4gICAgICAgICAgaWYgKG1ldGEuaW1wb3J0cykge1xuICAgICAgICAgICAgICBmbGF0dGVuQW5kRGVkdXBlQXJyYXkobWV0YS5pbXBvcnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpbXBvcnRlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGltcG9ydGVkTW9kdWxlVHlwZTtcbiAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkVHlwZShpbXBvcnRlZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRNb2R1bGVUeXBlID0gaW1wb3J0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW1wb3J0ZWRUeXBlICYmIGltcG9ydGVkVHlwZS5uZ01vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZVdpdGhQcm92aWRlcnMgPSBpbXBvcnRlZFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRNb2R1bGVUeXBlID0gbW9kdWxlV2l0aFByb3ZpZGVycy5uZ01vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlV2l0aFByb3ZpZGVycy5wcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2guYXBwbHkocHJvdmlkZXJzLCBfdGhpcy5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEobW9kdWxlV2l0aFByb3ZpZGVycy5wcm92aWRlcnMsIGVudHJ5Q29tcG9uZW50cywgXCJwcm92aWRlciBmb3IgdGhlIE5nTW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUoaW1wb3J0ZWRNb2R1bGVUeXBlKSArIFwiJ1wiLCBbXSwgaW1wb3J0ZWRUeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkTW9kdWxlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGltcG9ydGVkTW9kdWxlU3VtbWFyeSA9IF90aGlzLmdldE5nTW9kdWxlU3VtbWFyeShpbXBvcnRlZE1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1wb3J0ZWRNb2R1bGVTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIFwiICsgX3RoaXMuX2dldFR5cGVEZXNjcmlwdG9yKGltcG9ydGVkVHlwZSkgKyBcIiAnXCIgKyBzdHJpbmdpZnlUeXBlKGltcG9ydGVkVHlwZSkgKyBcIicgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZE1vZHVsZXMucHVzaChpbXBvcnRlZE1vZHVsZVN1bW1hcnkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKG5ldyBTeW50YXhFcnJvcihcIlVuZXhwZWN0ZWQgdmFsdWUgJ1wiICsgc3RyaW5naWZ5VHlwZShpbXBvcnRlZFR5cGUpICsgXCInIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJ1wiKSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGEuZXhwb3J0cykge1xuICAgICAgICAgICAgICBmbGF0dGVuQW5kRGVkdXBlQXJyYXkobWV0YS5leHBvcnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChleHBvcnRlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZFR5cGUoZXhwb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlICdcIiArIHN0cmluZ2lmeVR5cGUoZXhwb3J0ZWRUeXBlKSArIFwiJyBleHBvcnRlZCBieSB0aGUgbW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIidcIiksIG1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cG9ydGVkTW9kdWxlU3VtbWFyeSA9IF90aGlzLmdldE5nTW9kdWxlU3VtbWFyeShleHBvcnRlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgaWYgKGV4cG9ydGVkTW9kdWxlU3VtbWFyeSkge1xuICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkTW9kdWxlcy5wdXNoKGV4cG9ydGVkTW9kdWxlU3VtbWFyeSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRlZE5vbk1vZHVsZUlkZW50aWZpZXJzLnB1c2goX3RoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YShleHBvcnRlZFR5cGUpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBiZSBtb2RpZmllZCBsYXRlciwgc28gd2UgcmVseSBvblxuICAgICAgICAgIC8vIGdldHRpbmcgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSFcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFuc2l0aXZlTW9kdWxlID0gdGhpcy5fZ2V0VHJhbnNpdGl2ZU5nTW9kdWxlTWV0YWRhdGEoaW1wb3J0ZWRNb2R1bGVzLCBleHBvcnRlZE1vZHVsZXMpO1xuICAgICAgICAgIGlmIChtZXRhLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgICBmbGF0dGVuQW5kRGVkdXBlQXJyYXkobWV0YS5kZWNsYXJhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGRlY2xhcmVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShkZWNsYXJlZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKG5ldyBTeW50YXhFcnJvcihcIlVuZXhwZWN0ZWQgdmFsdWUgJ1wiICsgc3RyaW5naWZ5VHlwZShkZWNsYXJlZFR5cGUpICsgXCInIGRlY2xhcmVkIGJ5IHRoZSBtb2R1bGUgJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJ1wiKSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVjbGFyZWRJZGVudGlmaWVyID0gX3RoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YShkZWNsYXJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLl9kaXJlY3RpdmVSZXNvbHZlci5pc0RpcmVjdGl2ZShkZWNsYXJlZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGl2ZU1vZHVsZS5hZGREaXJlY3RpdmUoZGVjbGFyZWRJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERpcmVjdGl2ZXMucHVzaChkZWNsYXJlZElkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9hZGRUeXBlVG9Nb2R1bGUoZGVjbGFyZWRUeXBlLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9waXBlUmVzb2x2ZXIuaXNQaXBlKGRlY2xhcmVkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aXZlTW9kdWxlLmFkZFBpcGUoZGVjbGFyZWRJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aXZlTW9kdWxlLnBpcGVzLnB1c2goZGVjbGFyZWRJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZFBpcGVzLnB1c2goZGVjbGFyZWRJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYWRkVHlwZVRvTW9kdWxlKGRlY2xhcmVkVHlwZSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBcIiArIF90aGlzLl9nZXRUeXBlRGVzY3JpcHRvcihkZWNsYXJlZFR5cGUpICsgXCIgJ1wiICsgc3RyaW5naWZ5VHlwZShkZWNsYXJlZFR5cGUpICsgXCInIGRlY2xhcmVkIGJ5IHRoZSBtb2R1bGUgJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJ1wiKSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwb3J0ZWREaXJlY3RpdmVzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwb3J0ZWRQaXBlcyA9IFtdO1xuICAgICAgICAgIGV4cG9ydGVkTm9uTW9kdWxlSWRlbnRpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoZXhwb3J0ZWRJZCkge1xuICAgICAgICAgICAgICBpZiAodHJhbnNpdGl2ZU1vZHVsZS5kaXJlY3RpdmVzU2V0LmhhcyhleHBvcnRlZElkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgIGV4cG9ydGVkRGlyZWN0aXZlcy5wdXNoKGV4cG9ydGVkSWQpO1xuICAgICAgICAgICAgICAgICAgdHJhbnNpdGl2ZU1vZHVsZS5hZGRFeHBvcnRlZERpcmVjdGl2ZShleHBvcnRlZElkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh0cmFuc2l0aXZlTW9kdWxlLnBpcGVzU2V0LmhhcyhleHBvcnRlZElkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgIGV4cG9ydGVkUGlwZXMucHVzaChleHBvcnRlZElkKTtcbiAgICAgICAgICAgICAgICAgIHRyYW5zaXRpdmVNb2R1bGUuYWRkRXhwb3J0ZWRQaXBlKGV4cG9ydGVkSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKG5ldyBTeW50YXhFcnJvcihcIkNhbid0IGV4cG9ydCBcIiArIF90aGlzLl9nZXRUeXBlRGVzY3JpcHRvcihleHBvcnRlZElkLnJlZmVyZW5jZSkgKyBcIiBcIiArIHN0cmluZ2lmeVR5cGUoZXhwb3J0ZWRJZC5yZWZlcmVuY2UpICsgXCIgZnJvbSBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIiBhcyBpdCB3YXMgbmVpdGhlciBkZWNsYXJlZCBub3IgaW1wb3J0ZWQhXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFRoZSBwcm92aWRlcnMgb2YgdGhlIG1vZHVsZSBoYXZlIHRvIGdvIGxhc3RcbiAgICAgICAgICAvLyBzbyB0aGF0IHRoZXkgb3ZlcndyaXRlIGFueSBvdGhlciBwcm92aWRlciB3ZSBhbHJlYWR5IGFkZGVkLlxuICAgICAgICAgIGlmIChtZXRhLnByb3ZpZGVycykge1xuICAgICAgICAgICAgICBwcm92aWRlcnMucHVzaC5hcHBseShwcm92aWRlcnMsIHRoaXMuX2dldFByb3ZpZGVyc01ldGFkYXRhKG1ldGEucHJvdmlkZXJzLCBlbnRyeUNvbXBvbmVudHMsIFwicHJvdmlkZXIgZm9yIHRoZSBOZ01vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIsIFtdLCBtb2R1bGVUeXBlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtZXRhLmVudHJ5Q29tcG9uZW50cykge1xuICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHMucHVzaC5hcHBseShlbnRyeUNvbXBvbmVudHMsIGZsYXR0ZW5BbmREZWR1cGVBcnJheShtZXRhLmVudHJ5Q29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIF90aGlzLl9nZXRJZGVudGlmaWVyTWV0YWRhdGEodHlwZSk7IH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1ldGEuYm9vdHN0cmFwKSB7XG4gICAgICAgICAgICAgIGZsYXR0ZW5BbmREZWR1cGVBcnJheShtZXRhLmJvb3RzdHJhcCkuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlICdcIiArIHN0cmluZ2lmeVR5cGUodHlwZSkgKyBcIicgdXNlZCBpbiB0aGUgYm9vdHN0cmFwIHByb3BlcnR5IG9mIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBib290c3RyYXBDb21wb25lbnRzLnB1c2goX3RoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YSh0eXBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeUNvbXBvbmVudHMucHVzaC5hcHBseShlbnRyeUNvbXBvbmVudHMsIGJvb3RzdHJhcENvbXBvbmVudHMpO1xuICAgICAgICAgIGlmIChtZXRhLnNjaGVtYXMpIHtcbiAgICAgICAgICAgICAgc2NoZW1hcy5wdXNoLmFwcGx5KHNjaGVtYXMsIGZsYXR0ZW5BbmREZWR1cGVBcnJheShtZXRhLnNjaGVtYXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGlsZU1ldGEgPSBuZXcgQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICB0eXBlOiB0aGlzLl9nZXRUeXBlTWV0YWRhdGEobW9kdWxlVHlwZSksXG4gICAgICAgICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IGVudHJ5Q29tcG9uZW50cyxcbiAgICAgICAgICAgICAgYm9vdHN0cmFwQ29tcG9uZW50czogYm9vdHN0cmFwQ29tcG9uZW50cyxcbiAgICAgICAgICAgICAgc2NoZW1hczogc2NoZW1hcyxcbiAgICAgICAgICAgICAgZGVjbGFyZWREaXJlY3RpdmVzOiBkZWNsYXJlZERpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgIGV4cG9ydGVkRGlyZWN0aXZlczogZXhwb3J0ZWREaXJlY3RpdmVzLFxuICAgICAgICAgICAgICBkZWNsYXJlZFBpcGVzOiBkZWNsYXJlZFBpcGVzLFxuICAgICAgICAgICAgICBleHBvcnRlZFBpcGVzOiBleHBvcnRlZFBpcGVzLFxuICAgICAgICAgICAgICBpbXBvcnRlZE1vZHVsZXM6IGltcG9ydGVkTW9kdWxlcyxcbiAgICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzOiBleHBvcnRlZE1vZHVsZXMsXG4gICAgICAgICAgICAgIHRyYW5zaXRpdmVNb2R1bGU6IHRyYW5zaXRpdmVNb2R1bGUsXG4gICAgICAgICAgICAgIGlkOiBtZXRhLmlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gdHJhbnNpdGl2ZU1vZHVsZS5hZGRFbnRyeUNvbXBvbmVudChpZCk7IH0pO1xuICAgICAgICAgIHByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikgeyByZXR1cm4gdHJhbnNpdGl2ZU1vZHVsZS5hZGRQcm92aWRlcihwcm92aWRlciwgY29tcGlsZU1ldGEudHlwZSk7IH0pO1xuICAgICAgICAgIHRyYW5zaXRpdmVNb2R1bGUuYWRkTW9kdWxlKGNvbXBpbGVNZXRhLnR5cGUpO1xuICAgICAgICAgIHRoaXMuX25nTW9kdWxlQ2FjaGUuc2V0KG1vZHVsZVR5cGUsIGNvbXBpbGVNZXRhKTtcbiAgICAgICAgICByZXR1cm4gY29tcGlsZU1ldGE7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0VHlwZURlc2NyaXB0b3IgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9kaXJlY3RpdmVSZXNvbHZlci5pc0RpcmVjdGl2ZSh0eXBlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9waXBlUmVzb2x2ZXIuaXNQaXBlKHR5cGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiAncGlwZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9uZ01vZHVsZVJlc29sdmVyLmlzTmdNb2R1bGUodHlwZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICdtb2R1bGUnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKCh0eXBlKSkucHJvdmlkZSkge1xuICAgICAgICAgICAgICByZXR1cm4gJ3Byb3ZpZGVyJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICd2YWx1ZSc7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9hZGRUeXBlVG9Nb2R1bGUgPSBmdW5jdGlvbiAodHlwZSwgbW9kdWxlVHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9sZE1vZHVsZSA9IHRoaXMuX25nTW9kdWxlT2ZUeXBlcy5nZXQodHlwZSk7XG4gICAgICAgICAgaWYgKG9sZE1vZHVsZSAmJiBvbGRNb2R1bGUgIT09IG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKChcIlR5cGUgXCIgKyBzdHJpbmdpZnlUeXBlKHR5cGUpICsgXCIgaXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb25zIG9mIDIgbW9kdWxlczogXCIgKyBzdHJpbmdpZnlUeXBlKG9sZE1vZHVsZSkgKyBcIiBhbmQgXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCIhIFwiKSArXG4gICAgICAgICAgICAgICAgICAoXCJQbGVhc2UgY29uc2lkZXIgbW92aW5nIFwiICsgc3RyaW5naWZ5VHlwZSh0eXBlKSArIFwiIHRvIGEgaGlnaGVyIG1vZHVsZSB0aGF0IGltcG9ydHMgXCIgKyBzdHJpbmdpZnlUeXBlKG9sZE1vZHVsZSkgKyBcIiBhbmQgXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCIuIFwiKSArXG4gICAgICAgICAgICAgICAgICAoXCJZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgXCIgKyBzdHJpbmdpZnlUeXBlKHR5cGUpICsgXCIgdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiBcIiArIHN0cmluZ2lmeVR5cGUob2xkTW9kdWxlKSArIFwiIGFuZCBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIi5cIikpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVPZlR5cGVzLnNldCh0eXBlLCBtb2R1bGVUeXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWRNb2R1bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGV4cG9ydGVkTW9kdWxlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRUcmFuc2l0aXZlTmdNb2R1bGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChpbXBvcnRlZE1vZHVsZXMsIGV4cG9ydGVkTW9kdWxlcykge1xuICAgICAgICAgIC8vIGNvbGxlY3QgYHByb3ZpZGVyc2AgLyBgZW50cnlDb21wb25lbnRzYCBmcm9tIGFsbCBpbXBvcnRlZCBhbmQgYWxsIGV4cG9ydGVkIG1vZHVsZXNcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBuZXcgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlc0J5VG9rZW4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgaW1wb3J0ZWRNb2R1bGVzLmNvbmNhdChleHBvcnRlZE1vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG1vZFN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgbW9kU3VtbWFyeS5tb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG1vZCkgeyByZXR1cm4gcmVzdWx0LmFkZE1vZHVsZShtb2QpOyB9KTtcbiAgICAgICAgICAgICAgbW9kU3VtbWFyeS5lbnRyeUNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcCkgeyByZXR1cm4gcmVzdWx0LmFkZEVudHJ5Q29tcG9uZW50KGNvbXApOyB9KTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWRkZWRUb2tlbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgIG1vZFN1bW1hcnkucHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlblJlZiA9IHRva2VuUmVmZXJlbmNlKGVudHJ5LnByb3ZpZGVyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZNb2R1bGVzID0gbW9kdWxlc0J5VG9rZW4uZ2V0KHRva2VuUmVmKTtcbiAgICAgICAgICAgICAgICAgIGlmICghcHJldk1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2TW9kdWxlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzQnlUb2tlbi5zZXQodG9rZW5SZWYsIHByZXZNb2R1bGVzKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZVJlZiA9IGVudHJ5Lm1vZHVsZS5yZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAvLyBOb3RlOiB0aGUgcHJvdmlkZXJzIG9mIG9uZSBtb2R1bGUgbWF5IHN0aWxsIGNvbnRhaW4gbXVsdGlwbGUgcHJvdmlkZXJzXG4gICAgICAgICAgICAgICAgICAvLyBwZXIgdG9rZW4gKGUuZy4gZm9yIG11bHRpIHByb3ZpZGVycyksIGFuZCB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZXNlLlxuICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkVG9rZW5zLmhhcyh0b2tlblJlZikgfHwgIXByZXZNb2R1bGVzLmhhcyhtb2R1bGVSZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJldk1vZHVsZXMuYWRkKG1vZHVsZVJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgYWRkZWRUb2tlbnMuYWRkKHRva2VuUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkUHJvdmlkZXIoZW50cnkucHJvdmlkZXIsIGVudHJ5Lm1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV4cG9ydGVkTW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgIG1vZFN1bW1hcnkuZXhwb3J0ZWREaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IHJldHVybiByZXN1bHQuYWRkRXhwb3J0ZWREaXJlY3RpdmUoaWQpOyB9KTtcbiAgICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IHJldHVybiByZXN1bHQuYWRkRXhwb3J0ZWRQaXBlKGlkKTsgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaW1wb3J0ZWRNb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG1vZFN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZERpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHJlc3VsdC5hZGREaXJlY3RpdmUoaWQpOyB9KTtcbiAgICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IHJldHVybiByZXN1bHQuYWRkUGlwZShpZCk7IH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0SWRlbnRpZmllck1ldGFkYXRhID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICB0eXBlID0gX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICAgICAgICByZXR1cm4geyByZWZlcmVuY2U6IHR5cGUgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmlzSW5qZWN0YWJsZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0b3IuYW5ub3RhdGlvbnModHlwZSk7XG4gICAgICAgICAgLy8gTm90ZTogV2UgbmVlZCBhbiBleGFjdCBjaGVjayBoZXJlIGFzIEBDb21wb25lbnQgLyBARGlyZWN0aXZlIC8gLi4uIGluaGVyaXRcbiAgICAgICAgICAvLyBmcm9tIEBDb21waWxlckluamVjdGFibGUhXG4gICAgICAgICAgcmV0dXJuIGFubm90YXRpb25zLnNvbWUoZnVuY3Rpb24gKGFubikgeyByZXR1cm4gYW5uLmNvbnN0cnVjdG9yID09PSBfYW5ndWxhcl9jb3JlLkluamVjdGFibGU7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0SW5qZWN0YWJsZVN1bW1hcnkgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHJldHVybiB7IHN1bW1hcnlLaW5kOiBDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZSwgdHlwZTogdGhpcy5fZ2V0VHlwZU1ldGFkYXRhKHR5cGUpIH07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IGRlcGVuZGVuY2llc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRJbmplY3RhYmxlTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZSwgZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PT0gdm9pZCAwKSB7IGRlcGVuZGVuY2llcyA9IG51bGw7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0eXBlU3VtbWFyeSA9IHRoaXMuX2xvYWRTdW1tYXJ5KHR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5JbmplY3RhYmxlKTtcbiAgICAgICAgICBpZiAodHlwZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHR5cGVTdW1tYXJ5LnR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRUeXBlTWV0YWRhdGEodHlwZSwgZGVwZW5kZW5jaWVzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/PX0gZGVwZW5kZW5jaWVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFR5cGVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB2b2lkIDApIHsgZGVwZW5kZW5jaWVzID0gbnVsbDsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkZW50aWZpZXIgPSB0aGlzLl9nZXRJZGVudGlmaWVyTWV0YWRhdGEodHlwZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVmZXJlbmNlOiBpZGVudGlmaWVyLnJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgZGlEZXBzOiB0aGlzLl9nZXREZXBlbmRlbmNpZXNNZXRhZGF0YShpZGVudGlmaWVyLnJlZmVyZW5jZSwgZGVwZW5kZW5jaWVzKSxcbiAgICAgICAgICAgICAgbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU19WQUxVRVMuZmlsdGVyKGZ1bmN0aW9uIChob29rKSB7IHJldHVybiBoYXNMaWZlY3ljbGVIb29rKGhvb2ssIGlkZW50aWZpZXIucmVmZXJlbmNlKTsgfSksXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZmFjdG9yeVxuICAgICAgICogQHBhcmFtIHs/PX0gZGVwZW5kZW5jaWVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldEZhY3RvcnlNZXRhZGF0YSA9IGZ1bmN0aW9uIChmYWN0b3J5LCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB2b2lkIDApIHsgZGVwZW5kZW5jaWVzID0gbnVsbDsgfVxuICAgICAgICAgIGZhY3RvcnkgPSBfYW5ndWxhcl9jb3JlLnJlc29sdmVGb3J3YXJkUmVmKGZhY3RvcnkpO1xuICAgICAgICAgIHJldHVybiB7IHJlZmVyZW5jZTogZmFjdG9yeSwgZGlEZXBzOiB0aGlzLl9nZXREZXBlbmRlbmNpZXNNZXRhZGF0YShmYWN0b3J5LCBkZXBlbmRlbmNpZXMpIH07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgR2V0cyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBwaXBlLlxuICAgICAgICAqIFRoaXMgYXNzdW1lcyBgbG9hZE5nTW9kdWxlTWV0YWRhdGFgIGhhcyBiZWVuIGNhbGxlZCBmaXJzdC5cbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXRQaXBlTWV0YWRhdGEgPSBmdW5jdGlvbiAocGlwZVR5cGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaXBlTWV0YSA9IHRoaXMuX3BpcGVDYWNoZS5nZXQocGlwZVR5cGUpO1xuICAgICAgICAgIGlmICghcGlwZU1ldGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogZ2V0UGlwZU1ldGFkYXRhIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBsb2FkTmdNb2R1bGVNZXRhZGF0YSBmb3IgYSBtb2R1bGUgdGhhdCBkZWNsYXJlcyBpdC4gUGlwZSBcIiArIHN0cmluZ2lmeVR5cGUocGlwZVR5cGUpICsgXCIuXCIpLCBwaXBlVHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwaXBlTWV0YTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXRQaXBlU3VtbWFyeSA9IGZ1bmN0aW9uIChwaXBlVHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBpcGVTdW1tYXJ5ID0gKHRoaXMuX2xvYWRTdW1tYXJ5KHBpcGVUeXBlLCBDb21waWxlU3VtbWFyeUtpbmQuUGlwZSkpO1xuICAgICAgICAgIGlmICghcGlwZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogQ291bGQgbm90IGxvYWQgdGhlIHN1bW1hcnkgZm9yIHBpcGUgXCIgKyBzdHJpbmdpZnlUeXBlKHBpcGVUeXBlKSArIFwiLlwiKSwgcGlwZVR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGlwZVN1bW1hcnk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBpcGVUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0T3JMb2FkUGlwZU1ldGFkYXRhID0gZnVuY3Rpb24gKHBpcGVUeXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGlwZU1ldGEgPSB0aGlzLl9waXBlQ2FjaGUuZ2V0KHBpcGVUeXBlKTtcbiAgICAgICAgICBpZiAoIXBpcGVNZXRhKSB7XG4gICAgICAgICAgICAgIHBpcGVNZXRhID0gdGhpcy5fbG9hZFBpcGVNZXRhZGF0YShwaXBlVHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwaXBlTWV0YTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fbG9hZFBpcGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChwaXBlVHlwZSkge1xuICAgICAgICAgIHBpcGVUeXBlID0gX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZihwaXBlVHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGlwZUFubm90YXRpb24gPSB0aGlzLl9waXBlUmVzb2x2ZXIucmVzb2x2ZShwaXBlVHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGlwZU1ldGEgPSBuZXcgQ29tcGlsZVBpcGVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgIHR5cGU6IHRoaXMuX2dldFR5cGVNZXRhZGF0YShwaXBlVHlwZSksXG4gICAgICAgICAgICAgIG5hbWU6IHBpcGVBbm5vdGF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgIHB1cmU6IHBpcGVBbm5vdGF0aW9uLnB1cmVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9waXBlQ2FjaGUuc2V0KHBpcGVUeXBlLCBwaXBlTWV0YSk7XG4gICAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLnNldChwaXBlVHlwZSwgcGlwZU1ldGEudG9TdW1tYXJ5KCkpO1xuICAgICAgICAgIHJldHVybiBwaXBlTWV0YTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICogQHBhcmFtIHs/fSBkZXBlbmRlbmNpZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0RGVwZW5kZW5jaWVzTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYywgZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoYXNVbmtub3duRGVwcyA9IGZhbHNlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtcyA9IGRlcGVuZGVuY2llcyB8fCB0aGlzLl9yZWZsZWN0b3IucGFyYW1ldGVycyh0eXBlT3JGdW5jKSB8fCBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBlbmRlbmNpZXNNZXRhZGF0YSA9IHBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzQXR0cmlidXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzSG9zdCA9IGZhbHNlO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc1NlbGYgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNTa2lwU2VsZiA9IGZhbHNlO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc09wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICBwYXJhbS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtRW50cnkgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkhvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3N0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1FbnRyeSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuU2VsZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGYgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbUVudHJ5IGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5Ta2lwU2VsZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NraXBTZWxmID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1FbnRyeSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtRW50cnkgaW5zdGFuY2VvZiBfYW5ndWxhcl9jb3JlLkF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dHJpYnV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gcGFyYW1FbnRyeS5hdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbUVudHJ5IGluc3RhbmNlb2YgX2FuZ3VsYXJfY29yZS5JbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBwYXJhbUVudHJ5LnRva2VuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1ZhbGlkVHlwZShwYXJhbUVudHJ5KSAmJiBpc0JsYW5rKHRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHBhcmFtRW50cnk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbiA9IHBhcmFtO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc0JsYW5rKHRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgaGFzVW5rbm93bkRlcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlOiBpc0F0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgIGlzSG9zdDogaXNIb3N0LFxuICAgICAgICAgICAgICAgICAgaXNTZWxmOiBpc1NlbGYsXG4gICAgICAgICAgICAgICAgICBpc1NraXBTZWxmOiBpc1NraXBTZWxmLFxuICAgICAgICAgICAgICAgICAgaXNPcHRpb25hbDogaXNPcHRpb25hbCxcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBfdGhpcy5fZ2V0VG9rZW5NZXRhZGF0YSh0b2tlbilcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaGFzVW5rbm93bkRlcHMpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwc1Rva2VucyA9IGRlcGVuZGVuY2llc01ldGFkYXRhLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBkZXAgPyBzdHJpbmdpZnlUeXBlKGRlcC50b2tlbikgOiAnPyc7IH0pLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKG5ldyBTeW50YXhFcnJvcihcIkNhbid0IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwiICsgc3RyaW5naWZ5VHlwZSh0eXBlT3JGdW5jKSArIFwiOiAoXCIgKyBkZXBzVG9rZW5zICsgXCIpLlwiKSwgdHlwZU9yRnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXNNZXRhZGF0YTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0VG9rZW5NZXRhZGF0YSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgIHRva2VuID0gX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZih0b2tlbik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZVRva2VuO1xuICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbXBpbGVUb2tlbiA9IHsgdmFsdWU6IHRva2VuIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb21waWxlVG9rZW4gPSB7IGlkZW50aWZpZXI6IHsgcmVmZXJlbmNlOiB0b2tlbiB9IH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21waWxlVG9rZW47XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRFbnRyeUNvbXBvbmVudHNcbiAgICAgICAqIEBwYXJhbSB7Pz19IGRlYnVnSW5mb1xuICAgICAgICogQHBhcmFtIHs/PX0gY29tcGlsZVByb3ZpZGVyc1xuICAgICAgICogQHBhcmFtIHs/PX0gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRQcm92aWRlcnNNZXRhZGF0YSA9IGZ1bmN0aW9uIChwcm92aWRlcnMsIHRhcmdldEVudHJ5Q29tcG9uZW50cywgZGVidWdJbmZvLCBjb21waWxlUHJvdmlkZXJzLCB0eXBlKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAoY29tcGlsZVByb3ZpZGVycyA9PT0gdm9pZCAwKSB7IGNvbXBpbGVQcm92aWRlcnMgPSBbXTsgfVxuICAgICAgICAgIHByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlciwgcHJvdmlkZXJJZHgpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEocHJvdmlkZXIsIHRhcmdldEVudHJ5Q29tcG9uZW50cywgZGVidWdJbmZvLCBjb21waWxlUHJvdmlkZXJzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlck1ldGEgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgJiYgdHlwZW9mIHByb3ZpZGVyID09ICdvYmplY3QnICYmIHByb3ZpZGVyLmhhc093blByb3BlcnR5KCdwcm92aWRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1ldGEgPSBuZXcgUHJvdmlkZXJNZXRhKHByb3ZpZGVyLnByb3ZpZGUsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVmFsaWRUeXBlKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YSA9IG5ldyBQcm92aWRlck1ldGEocHJvdmlkZXIsIHsgdXNlQ2xhc3M6IHByb3ZpZGVyIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJzSW5mbyA9ICgocHJvdmlkZXJzLnJlZHVjZShmdW5jdGlvbiAoc29GYXIsIHNlZW5Qcm92aWRlciwgc2VlblByb3ZpZGVySWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWVuUHJvdmlkZXJJZHggPCBwcm92aWRlcklkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29GYXIucHVzaChcIlwiICsgc3RyaW5naWZ5VHlwZShzZWVuUHJvdmlkZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWVuUHJvdmlkZXJJZHggPT0gcHJvdmlkZXJJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvRmFyLnB1c2goXCI/XCIgKyBzdHJpbmdpZnlUeXBlKHNlZW5Qcm92aWRlcikgKyBcIj9cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VlblByb3ZpZGVySWR4ID09IHByb3ZpZGVySWR4ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29GYXIucHVzaCgnLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvRmFyO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJJbnZhbGlkIFwiICsgKGRlYnVnSW5mbyA/IGRlYnVnSW5mbyA6ICdwcm92aWRlcicpICsgXCIgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBbXCIgKyBwcm92aWRlcnNJbmZvICsgXCJdXCIpLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlck1ldGEudG9rZW4gPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RW50cnlDb21wb25lbnRzLnB1c2guYXBwbHkodGFyZ2V0RW50cnlDb21wb25lbnRzLCBfdGhpcy5fZ2V0RW50cnlDb21wb25lbnRzRnJvbVByb3ZpZGVyKHByb3ZpZGVyTWV0YSwgdHlwZSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVByb3ZpZGVycy5wdXNoKF90aGlzLmdldFByb3ZpZGVyTWV0YWRhdGEocHJvdmlkZXJNZXRhKSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY29tcGlsZVByb3ZpZGVycztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0RW50cnlDb21wb25lbnRzRnJvbVByb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyLCB0eXBlKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wb25lbnRzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29sbGVjdGVkSWRlbnRpZmllcnMgPSBbXTtcbiAgICAgICAgICBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSB8fCBwcm92aWRlci51c2VFeGlzdGluZyB8fCBwcm92aWRlci51c2VDbGFzcykge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJUaGUgQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUyB0b2tlbiBvbmx5IHN1cHBvcnRzIHVzZVZhbHVlIVwiKSwgdHlwZSk7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwcm92aWRlci5tdWx0aSkge1xuICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihuZXcgU3ludGF4RXJyb3IoXCJUaGUgQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUyB0b2tlbiBvbmx5IHN1cHBvcnRzICdtdWx0aSA9IHRydWUnIVwiKSwgdHlwZSk7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXh0cmFjdElkZW50aWZpZXJzKHByb3ZpZGVyLnVzZVZhbHVlLCBjb2xsZWN0ZWRJZGVudGlmaWVycyk7XG4gICAgICAgICAgY29sbGVjdGVkSWRlbnRpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICBpZiAoX3RoaXMuX2RpcmVjdGl2ZVJlc29sdmVyLmlzRGlyZWN0aXZlKGlkZW50aWZpZXIucmVmZXJlbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgX3RoaXMuX2xvYWRTdW1tYXJ5KGlkZW50aWZpZXIucmVmZXJlbmNlLCBDb21waWxlU3VtbWFyeUtpbmQuRGlyZWN0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0UHJvdmlkZXJNZXRhZGF0YSA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVEZXBzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVUeXBlTWV0YWRhdGEgPSBudWxsO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVGYWN0b3J5TWV0YWRhdGEgPSBudWxsO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VuID0gdGhpcy5fZ2V0VG9rZW5NZXRhZGF0YShwcm92aWRlci50b2tlbik7XG4gICAgICAgICAgaWYgKHByb3ZpZGVyLnVzZUNsYXNzKSB7XG4gICAgICAgICAgICAgIGNvbXBpbGVUeXBlTWV0YWRhdGEgPSB0aGlzLl9nZXRJbmplY3RhYmxlTWV0YWRhdGEocHJvdmlkZXIudXNlQ2xhc3MsIHByb3ZpZGVyLmRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICAgIGNvbXBpbGVEZXBzID0gY29tcGlsZVR5cGVNZXRhZGF0YS5kaURlcHM7XG4gICAgICAgICAgICAgIGlmIChwcm92aWRlci50b2tlbiA9PT0gcHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY29tcGlsZVR5cGVNZXRhZGF0YSBhcyBpdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBsaWZlY3ljbGVIb29rcy4uLlxuICAgICAgICAgICAgICAgICAgdG9rZW4gPSB7IGlkZW50aWZpZXI6IGNvbXBpbGVUeXBlTWV0YWRhdGEgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgICAgICAgIGNvbXBpbGVGYWN0b3J5TWV0YWRhdGEgPSB0aGlzLl9nZXRGYWN0b3J5TWV0YWRhdGEocHJvdmlkZXIudXNlRmFjdG9yeSwgcHJvdmlkZXIuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgY29tcGlsZURlcHMgPSBjb21waWxlRmFjdG9yeU1ldGFkYXRhLmRpRGVwcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgICB1c2VDbGFzczogY29tcGlsZVR5cGVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgdXNlVmFsdWU6IHByb3ZpZGVyLnVzZVZhbHVlLFxuICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBjb21waWxlRmFjdG9yeU1ldGFkYXRhLFxuICAgICAgICAgICAgICB1c2VFeGlzdGluZzogcHJvdmlkZXIudXNlRXhpc3RpbmcgPyB0aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSA6IG51bGwsXG4gICAgICAgICAgICAgIGRlcHM6IGNvbXBpbGVEZXBzLFxuICAgICAgICAgICAgICBtdWx0aTogcHJvdmlkZXIubXVsdGlcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBxdWVyaWVzXG4gICAgICAgKiBAcGFyYW0gez99IGlzVmlld1F1ZXJ5XG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0UXVlcmllc01ldGFkYXRhID0gZnVuY3Rpb24gKHF1ZXJpZXMsIGlzVmlld1F1ZXJ5LCBkaXJlY3RpdmVUeXBlKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSBbXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhxdWVyaWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcnkgPSBxdWVyaWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICAgIGlmIChxdWVyeS5pc1ZpZXdRdWVyeSA9PT0gaXNWaWV3UXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKF90aGlzLl9nZXRRdWVyeU1ldGFkYXRhKHF1ZXJ5LCBwcm9wZXJ0eU5hbWUsIGRpcmVjdGl2ZVR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX3F1ZXJ5VmFyQmluZGluZ3MgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHsgcmV0dXJuIHNlbGVjdG9yLnNwbGl0KC9cXHMqLFxccyovKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBxXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFF1ZXJ5TWV0YWRhdGEgPSBmdW5jdGlvbiAocSwgcHJvcGVydHlOYW1lLCB0eXBlT3JGdW5jKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWxlY3RvcnM7XG4gICAgICAgICAgaWYgKHR5cGVvZiBxLnNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBzZWxlY3RvcnMgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5fcXVlcnlWYXJCaW5kaW5ncyhxLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24gKHZhck5hbWUpIHsgcmV0dXJuIF90aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHZhck5hbWUpOyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghcS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IobmV3IFN5bnRheEVycm9yKFwiQ2FuJ3QgY29uc3RydWN0IGEgcXVlcnkgZm9yIHRoZSBwcm9wZXJ0eSBcXFwiXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIlxcXCIgb2YgXFxcIlwiICsgc3RyaW5naWZ5VHlwZSh0eXBlT3JGdW5jKSArIFwiXFxcIiBzaW5jZSB0aGUgcXVlcnkgc2VsZWN0b3Igd2Fzbid0IGRlZmluZWQuXCIpLCB0eXBlT3JGdW5jKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxlY3RvcnMgPSBbdGhpcy5fZ2V0VG9rZW5NZXRhZGF0YShxLnNlbGVjdG9yKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlbGVjdG9yczogc2VsZWN0b3JzLFxuICAgICAgICAgICAgICBmaXJzdDogcS5maXJzdCxcbiAgICAgICAgICAgICAgZGVzY2VuZGFudHM6IHEuZGVzY2VuZGFudHMsIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICByZWFkOiBxLnJlYWQgPyB0aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHEucmVhZCkgOiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7Pz19IG90aGVyVHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgdHlwZSwgb3RoZXJUeXBlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Vycm9yQ29sbGVjdG9yKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9yQ29sbGVjdG9yKGVycm9yLCB0eXBlKTtcbiAgICAgICAgICAgICAgaWYgKG90aGVyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JDb2xsZWN0b3IoZXJyb3IsIG90aGVyVHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogTmdNb2R1bGVSZXNvbHZlciwgfSxcbiAgICAgICAgICB7IHR5cGU6IERpcmVjdGl2ZVJlc29sdmVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogUGlwZVJlc29sdmVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogU3VtbWFyeVJlc29sdmVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LCB9LFxuICAgICAgICAgIHsgdHlwZTogRGlyZWN0aXZlTm9ybWFsaXplciwgfSxcbiAgICAgICAgICB7IHR5cGU6IFJlZmxlY3RvclJlYWRlciwgfSxcbiAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5PcHRpb25hbCB9LCB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0LCBhcmdzOiBbRVJST1JfQ09MTEVDVE9SX1RPS0VOLF0gfSxdIH0sXG4gICAgICBdOyB9O1xuICAgICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIgPSBfX2RlY29yYXRlJDkoW1xuICAgICAgICAgIENvbXBpbGVySW5qZWN0YWJsZSgpLCBcbiAgICAgICAgICBfX21ldGFkYXRhJDkoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW05nTW9kdWxlUmVzb2x2ZXIsIERpcmVjdGl2ZVJlc29sdmVyLCBQaXBlUmVzb2x2ZXIsIFN1bW1hcnlSZXNvbHZlciwgRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LCBEaXJlY3RpdmVOb3JtYWxpemVyLCBSZWZsZWN0b3JSZWFkZXIsIEZ1bmN0aW9uXSlcbiAgICAgIF0sIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyKTtcbiAgICAgIHJldHVybiBDb21waWxlTWV0YWRhdGFSZXNvbHZlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdHJlZVxuICAgKiBAcGFyYW0gez89fSBvdXRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXR0ZW5BcnJheSh0cmVlLCBvdXQpIHtcbiAgICAgIGlmIChvdXQgPT09IHZvaWQgMCkgeyBvdXQgPSBbXTsgfVxuICAgICAgaWYgKHRyZWUpIHtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpdGVtID0gX2FuZ3VsYXJfY29yZS5yZXNvbHZlRm9yd2FyZFJlZih0cmVlW2ldKTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIGZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFycmF5XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBkZWR1cGVBcnJheShhcnJheSkge1xuICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhcnJheSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHRyZWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXR0ZW5BbmREZWR1cGVBcnJheSh0cmVlKSB7XG4gICAgICByZXR1cm4gZGVkdXBlQXJyYXkoZmxhdHRlbkFycmF5KHRyZWUpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNWYWxpZFR5cGUodmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHx8ICh2YWx1ZSBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuVHlwZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcmVmbGVjdG9yXG4gICAqIEBwYXJhbSB7P30gdHlwZVxuICAgKiBAcGFyYW0gez99IGNtcE1ldGFkYXRhXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb21wb25lbnRNb2R1bGVVcmwocmVmbGVjdG9yLCB0eXBlLCBjbXBNZXRhZGF0YSkge1xuICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZUlkID0gY21wTWV0YWRhdGEubW9kdWxlSWQ7XG4gICAgICBpZiAodHlwZW9mIG1vZHVsZUlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNjaGVtZSA9IGdldFVybFNjaGVtZShtb2R1bGVJZCk7XG4gICAgICAgICAgcmV0dXJuIHNjaGVtZSA/IG1vZHVsZUlkIDogXCJwYWNrYWdlOlwiICsgbW9kdWxlSWQgKyBNT0RVTEVfU1VGRklYO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobW9kdWxlSWQgIT09IG51bGwgJiYgbW9kdWxlSWQgIT09IHZvaWQgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcigoXCJtb2R1bGVJZCBzaG91bGQgYmUgYSBzdHJpbmcgaW4gXFxcIlwiICsgc3RyaW5naWZ5VHlwZSh0eXBlKSArIFwiXFxcIi4gU2VlIGh0dHBzOi8vZ29vLmdsL3dJRERpTCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cXG5cIikgK1xuICAgICAgICAgICAgICBcIklmIHlvdSdyZSB1c2luZyBXZWJwYWNrIHlvdSBzaG91bGQgaW5saW5lIHRoZSB0ZW1wbGF0ZSBhbmQgdGhlIHN0eWxlcywgc2VlIGh0dHBzOi8vZ29vLmdsL1gySjh6Yy5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVmbGVjdG9yLmltcG9ydFVyaSh0eXBlKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcGFyYW0gez99IHRhcmdldElkZW50aWZpZXJzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBleHRyYWN0SWRlbnRpZmllcnModmFsdWUsIHRhcmdldElkZW50aWZpZXJzKSB7XG4gICAgICB2aXNpdFZhbHVlKHZhbHVlLCBuZXcgX0NvbXBpbGVWYWx1ZUNvbnZlcnRlcigpLCB0YXJnZXRJZGVudGlmaWVycyk7XG4gIH1cbiAgdmFyIF9Db21waWxlVmFsdWVDb252ZXJ0ZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDE4KF9Db21waWxlVmFsdWVDb252ZXJ0ZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBfQ29tcGlsZVZhbHVlQ29udmVydGVyKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldElkZW50aWZpZXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQ29tcGlsZVZhbHVlQ29udmVydGVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCB0YXJnZXRJZGVudGlmaWVycykge1xuICAgICAgICAgIHRhcmdldElkZW50aWZpZXJzLnB1c2goeyByZWZlcmVuY2U6IHZhbHVlIH0pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfQ29tcGlsZVZhbHVlQ29udmVydGVyO1xuICB9KFZhbHVlVHJhbnNmb3JtZXIpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdHlwZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5VHlwZSh0eXBlKSB7XG4gICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgIHJldHVybiB0eXBlLm5hbWUgKyBcIiBpbiBcIiArIHR5cGUuZmlsZVBhdGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KHR5cGUpO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUVVPVEVEX0tFWVMgPSAnJHF1b3RlZCQnO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcGFyYW0gez89fSB0eXBlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWVUb091dHB1dEFzdCh2YWx1ZSwgdHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgICAgcmV0dXJuIHZpc2l0VmFsdWUodmFsdWUsIG5ldyBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lcigpLCB0eXBlKTtcbiAgfVxuICB2YXIgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXJyXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WYWx1ZU91dHB1dEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFycmF5ID0gZnVuY3Rpb24gKGFyciwgdHlwZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoYXJyLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZpc2l0VmFsdWUodmFsdWUsIF90aGlzLCBudWxsKTsgfSksIHR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwID0gZnVuY3Rpb24gKG1hcCwgdHlwZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZW50cmllcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1b3RlZFNldCA9IG5ldyBTZXQobWFwICYmIG1hcFtRVU9URURfS0VZU10pO1xuICAgICAgICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIGVudHJpZXMucHVzaChuZXcgTGl0ZXJhbE1hcEVudHJ5KGtleSwgdmlzaXRWYWx1ZShtYXBba2V5XSwgX3RoaXMsIG51bGwpLCBxdW90ZWRTZXQuaGFzKGtleSkpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXBFeHByKGVudHJpZXMsIHR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRQcmltaXRpdmUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHsgcmV0dXJuIGxpdGVyYWwodmFsdWUsIHR5cGUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9WYWx1ZU91dHB1dEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcih7IHJlZmVyZW5jZTogdmFsdWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lcjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2RlY29yYXRlJDEzID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG4gIH07XG4gIHZhciBfX21ldGFkYXRhJDEzID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICB2YXIgQ29tcG9uZW50RmFjdG9yeURlcGVuZGVuY3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBcbiAgICAgICAqIEBwYXJhbSB7P30gcGxhY2Vob2xkZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcG9uZW50RmFjdG9yeURlcGVuZGVuY3koY29tcCwgcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmNvbXAgPSBjb21wO1xuICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5RGVwZW5kZW5jeTtcbiAgfSgpKTtcbiAgdmFyIE5nTW9kdWxlQ29tcGlsZVJlc3VsdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZUZhY3RvcnlWYXJcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwZW5kZW5jaWVzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5nTW9kdWxlQ29tcGlsZVJlc3VsdChzdGF0ZW1lbnRzLCBuZ01vZHVsZUZhY3RvcnlWYXIsIGRlcGVuZGVuY2llcykge1xuICAgICAgICAgIHRoaXMuc3RhdGVtZW50cyA9IHN0YXRlbWVudHM7XG4gICAgICAgICAgdGhpcy5uZ01vZHVsZUZhY3RvcnlWYXIgPSBuZ01vZHVsZUZhY3RvcnlWYXI7XG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gTmdNb2R1bGVDb21waWxlUmVzdWx0O1xuICB9KCkpO1xuICB2YXIgTmdNb2R1bGVDb21waWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBOZ01vZHVsZUNvbXBpbGVyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlTWV0YVxuICAgICAgICogQHBhcmFtIHs/fSBleHRyYVByb3ZpZGVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTmdNb2R1bGVDb21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uIChuZ01vZHVsZU1ldGEsIGV4dHJhUHJvdmlkZXJzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlVXJsID0gaWRlbnRpZmllck1vZHVsZVVybChuZ01vZHVsZU1ldGEudHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlRmlsZU5hbWUgPSBpc1ByZXNlbnQobW9kdWxlVXJsKSA/XG4gICAgICAgICAgICAgIFwiaW4gTmdNb2R1bGUgXCIgKyBpZGVudGlmaWVyTmFtZShuZ01vZHVsZU1ldGEudHlwZSkgKyBcIiBpbiBcIiArIG1vZHVsZVVybCA6XG4gICAgICAgICAgICAgIFwiaW4gTmdNb2R1bGUgXCIgKyBpZGVudGlmaWVyTmFtZShuZ01vZHVsZU1ldGEudHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlRmlsZSA9IG5ldyBQYXJzZVNvdXJjZUZpbGUoJycsIHNvdXJjZUZpbGVOYW1lKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihuZXcgUGFyc2VMb2NhdGlvbihzb3VyY2VGaWxlLCBudWxsLCBudWxsLCBudWxsKSwgbmV3IFBhcnNlTG9jYXRpb24oc291cmNlRmlsZSwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBib290c3RyYXBDb21wb25lbnRGYWN0b3JpZXMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbnRyeUNvbXBvbmVudEZhY3RvcmllcyA9IG5nTW9kdWxlTWV0YS50cmFuc2l0aXZlTW9kdWxlLmVudHJ5Q29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGVudHJ5Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0geyByZWZlcmVuY2U6IG51bGwgfTtcbiAgICAgICAgICAgICAgaWYgKG5nTW9kdWxlTWV0YS5ib290c3RyYXBDb21wb25lbnRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBpZC5yZWZlcmVuY2UgPT09IGVudHJ5Q29tcG9uZW50LnJlZmVyZW5jZTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcENvbXBvbmVudEZhY3Rvcmllcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZXBzLnB1c2gobmV3IENvbXBvbmVudEZhY3RvcnlEZXBlbmRlbmN5KGVudHJ5Q29tcG9uZW50LCBpZCkpO1xuICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYnVpbGRlciA9IG5ldyBfSW5qZWN0b3JCdWlsZGVyKG5nTW9kdWxlTWV0YSwgZW50cnlDb21wb25lbnRGYWN0b3JpZXMsIGJvb3RzdHJhcENvbXBvbmVudEZhY3Rvcmllcywgc291cmNlU3Bhbik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJQYXJzZXIgPSBuZXcgTmdNb2R1bGVQcm92aWRlckFuYWx5emVyKG5nTW9kdWxlTWV0YSwgZXh0cmFQcm92aWRlcnMsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgIHByb3ZpZGVyUGFyc2VyLnBhcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHsgcmV0dXJuIGJ1aWxkZXIuYWRkUHJvdmlkZXIocHJvdmlkZXIpOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmplY3RvckNsYXNzID0gYnVpbGRlci5idWlsZCgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlRmFjdG9yeVZhciA9IGlkZW50aWZpZXJOYW1lKG5nTW9kdWxlTWV0YS50eXBlKSArIFwiTmdGYWN0b3J5XCI7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGVGYWN0b3J5U3RtdCA9IHZhcmlhYmxlKG5nTW9kdWxlRmFjdG9yeVZhcilcbiAgICAgICAgICAgICAgLnNldChpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuTmdNb2R1bGVGYWN0b3J5KSlcbiAgICAgICAgICAgICAgLmluc3RhbnRpYXRlKFt2YXJpYWJsZShpbmplY3RvckNsYXNzLm5hbWUpLCBpbXBvcnRFeHByKG5nTW9kdWxlTWV0YS50eXBlKV0sIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5OZ01vZHVsZUZhY3RvcnkpLCBbaW1wb3J0VHlwZShuZ01vZHVsZU1ldGEudHlwZSldLCBbVHlwZU1vZGlmaWVyLkNvbnN0XSkpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdChudWxsLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBbaW5qZWN0b3JDbGFzcywgbmdNb2R1bGVGYWN0b3J5U3RtdF07XG4gICAgICAgICAgaWYgKG5nTW9kdWxlTWV0YS5pZCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWdpc3RlckZhY3RvcnlTdG10ID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlJlZ2lzdGVyTW9kdWxlRmFjdG9yeUZuKSlcbiAgICAgICAgICAgICAgICAgIC5jYWxsRm4oW2xpdGVyYWwobmdNb2R1bGVNZXRhLmlkKSwgdmFyaWFibGUobmdNb2R1bGVGYWN0b3J5VmFyKV0pXG4gICAgICAgICAgICAgICAgICAudG9TdG10KCk7XG4gICAgICAgICAgICAgIHN0bXRzLnB1c2gocmVnaXN0ZXJGYWN0b3J5U3RtdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgTmdNb2R1bGVDb21waWxlUmVzdWx0KHN0bXRzLCBuZ01vZHVsZUZhY3RvcnlWYXIsIGRlcHMpO1xuICAgICAgfTtcbiAgICAgIE5nTW9kdWxlQ29tcGlsZXIgPSBfX2RlY29yYXRlJDEzKFtcbiAgICAgICAgICBDb21waWxlckluamVjdGFibGUoKSwgXG4gICAgICAgICAgX19tZXRhZGF0YSQxMygnZGVzaWduOnBhcmFtdHlwZXMnLCBbXSlcbiAgICAgIF0sIE5nTW9kdWxlQ29tcGlsZXIpO1xuICAgICAgcmV0dXJuIE5nTW9kdWxlQ29tcGlsZXI7XG4gIH0oKSk7XG4gIHZhciBfSW5qZWN0b3JCdWlsZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfbmdNb2R1bGVNZXRhXG4gICAgICAgKiBAcGFyYW0gez99IF9lbnRyeUNvbXBvbmVudEZhY3Rvcmllc1xuICAgICAgICogQHBhcmFtIHs/fSBfYm9vdHN0cmFwQ29tcG9uZW50RmFjdG9yaWVzXG4gICAgICAgKiBAcGFyYW0gez99IF9zb3VyY2VTcGFuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9JbmplY3RvckJ1aWxkZXIoX25nTW9kdWxlTWV0YSwgX2VudHJ5Q29tcG9uZW50RmFjdG9yaWVzLCBfYm9vdHN0cmFwQ29tcG9uZW50RmFjdG9yaWVzLCBfc291cmNlU3Bhbikge1xuICAgICAgICAgIHRoaXMuX25nTW9kdWxlTWV0YSA9IF9uZ01vZHVsZU1ldGE7XG4gICAgICAgICAgdGhpcy5fZW50cnlDb21wb25lbnRGYWN0b3JpZXMgPSBfZW50cnlDb21wb25lbnRGYWN0b3JpZXM7XG4gICAgICAgICAgdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50RmFjdG9yaWVzID0gX2Jvb3RzdHJhcENvbXBvbmVudEZhY3RvcmllcztcbiAgICAgICAgICB0aGlzLl9zb3VyY2VTcGFuID0gX3NvdXJjZVNwYW47XG4gICAgICAgICAgdGhpcy5maWVsZHMgPSBbXTtcbiAgICAgICAgICB0aGlzLmdldHRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLm1ldGhvZHMgPSBbXTtcbiAgICAgICAgICB0aGlzLmN0b3JTdG10cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX3Rva2VucyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2luc3RhbmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9jcmVhdGVTdG10cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lTdG10cyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlc29sdmVkUHJvdmlkZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9JbmplY3RvckJ1aWxkZXIucHJvdG90eXBlLmFkZFByb3ZpZGVyID0gZnVuY3Rpb24gKHJlc29sdmVkUHJvdmlkZXIpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3ZpZGVyVmFsdWVFeHByZXNzaW9ucyA9IHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJzLm1hcChmdW5jdGlvbiAocHJvdmlkZXIpIHsgcmV0dXJuIF90aGlzLl9nZXRQcm92aWRlclZhbHVlKHByb3ZpZGVyKTsgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvcE5hbWUgPSBcIl9cIiArIHRva2VuTmFtZShyZXNvbHZlZFByb3ZpZGVyLnRva2VuKSArIFwiX1wiICsgdGhpcy5faW5zdGFuY2VzLnNpemU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5zdGFuY2UgPSB0aGlzLl9jcmVhdGVQcm92aWRlclByb3BlcnR5KHByb3BOYW1lLCByZXNvbHZlZFByb3ZpZGVyLCBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnMsIHJlc29sdmVkUHJvdmlkZXIubXVsdGlQcm92aWRlciwgcmVzb2x2ZWRQcm92aWRlci5lYWdlcik7XG4gICAgICAgICAgaWYgKHJlc29sdmVkUHJvdmlkZXIubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3kpICE9PSAtMSkge1xuICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95U3RtdHMucHVzaChpbnN0YW5jZS5jYWxsTWV0aG9kKCduZ09uRGVzdHJveScsIFtdKS50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3Rva2Vucy5wdXNoKHJlc29sdmVkUHJvdmlkZXIudG9rZW4pO1xuICAgICAgICAgIHRoaXMuX2luc3RhbmNlcy5zZXQodG9rZW5SZWZlcmVuY2UocmVzb2x2ZWRQcm92aWRlci50b2tlbiksIGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9JbmplY3RvckJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZ2V0TWV0aG9kU3RtdHMgPSB0aGlzLl90b2tlbnMubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlckV4cHIgPSBfdGhpcy5faW5zdGFuY2VzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IElmU3RtdChJbmplY3RNZXRob2RWYXJzLnRva2VuLmlkZW50aWNhbChjcmVhdGVEaVRva2VuRXhwcmVzc2lvbih0b2tlbikpLCBbbmV3IFJldHVyblN0YXRlbWVudChwcm92aWRlckV4cHIpXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWV0aG9kcyA9IFtcbiAgICAgICAgICAgICAgbmV3IENsYXNzTWV0aG9kKCdjcmVhdGVJbnRlcm5hbCcsIFtdLCB0aGlzLl9jcmVhdGVTdG10cy5jb25jYXQobmV3IFJldHVyblN0YXRlbWVudCh0aGlzLl9pbnN0YW5jZXMuZ2V0KHRoaXMuX25nTW9kdWxlTWV0YS50eXBlLnJlZmVyZW5jZSkpKSwgaW1wb3J0VHlwZSh0aGlzLl9uZ01vZHVsZU1ldGEudHlwZSkpLFxuICAgICAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ2dldEludGVybmFsJywgW1xuICAgICAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oSW5qZWN0TWV0aG9kVmFycy50b2tlbi5uYW1lLCBEWU5BTUlDX1RZUEUpLFxuICAgICAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oSW5qZWN0TWV0aG9kVmFycy5ub3RGb3VuZFJlc3VsdC5uYW1lLCBEWU5BTUlDX1RZUEUpXG4gICAgICAgICAgICAgIF0sIGdldE1ldGhvZFN0bXRzLmNvbmNhdChbbmV3IFJldHVyblN0YXRlbWVudChJbmplY3RNZXRob2RWYXJzLm5vdEZvdW5kUmVzdWx0KV0pLCBEWU5BTUlDX1RZUEUpLFxuICAgICAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ2Rlc3Ryb3lJbnRlcm5hbCcsIFtdLCB0aGlzLl9kZXN0cm95U3RtdHMpLFxuICAgICAgICAgIF07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50QXJncyA9IFtcbiAgICAgICAgICAgICAgdmFyaWFibGUoSW5qZWN0b3JQcm9wcy5wYXJlbnQubmFtZSksXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIodGhpcy5fZW50cnlDb21wb25lbnRGYWN0b3JpZXMubWFwKGZ1bmN0aW9uIChjb21wb25lbnRGYWN0b3J5KSB7IHJldHVybiBpbXBvcnRFeHByKGNvbXBvbmVudEZhY3RvcnkpOyB9KSksXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIodGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50RmFjdG9yaWVzLm1hcChmdW5jdGlvbiAoY29tcG9uZW50RmFjdG9yeSkgeyByZXR1cm4gaW1wb3J0RXhwcihjb21wb25lbnRGYWN0b3J5KTsgfSkpXG4gICAgICAgICAgXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmpDbGFzc05hbWUgPSBpZGVudGlmaWVyTmFtZSh0aGlzLl9uZ01vZHVsZU1ldGEudHlwZSkgKyBcIkluamVjdG9yXCI7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUNsYXNzU3RtdCh7XG4gICAgICAgICAgICAgIG5hbWU6IGluakNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgY3RvclBhcmFtczogW25ldyBGblBhcmFtKEluamVjdG9yUHJvcHMucGFyZW50Lm5hbWUsIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5JbmplY3RvcikpKV0sXG4gICAgICAgICAgICAgIHBhcmVudDogaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLk5nTW9kdWxlSW5qZWN0b3IpLCBbaW1wb3J0VHlwZSh0aGlzLl9uZ01vZHVsZU1ldGEudHlwZSldKSxcbiAgICAgICAgICAgICAgcGFyZW50QXJnczogcGFyZW50QXJncyxcbiAgICAgICAgICAgICAgYnVpbGRlcnM6IFt7IG1ldGhvZHM6IG1ldGhvZHMgfSwgdGhpc11cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9JbmplY3RvckJ1aWxkZXIucHJvdG90eXBlLl9nZXRQcm92aWRlclZhbHVlID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VFeGlzdGluZykpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0RGVwZW5kZW5jeSh7IHRva2VuOiBwcm92aWRlci51c2VFeGlzdGluZyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KHByb3ZpZGVyLnVzZUZhY3RvcnkpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUZhY3RvcnkuZGlEZXBzO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBzRXhwciA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KGRlcCk7IH0pO1xuICAgICAgICAgICAgICByZXN1bHQgPSBpbXBvcnRFeHByKHByb3ZpZGVyLnVzZUZhY3RvcnkpLmNhbGxGbihkZXBzRXhwcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VDbGFzcykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwcyA9IHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlQ2xhc3MuZGlEZXBzO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBzRXhwciA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KGRlcCk7IH0pO1xuICAgICAgICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgaW1wb3J0RXhwcihwcm92aWRlci51c2VDbGFzcykuaW5zdGFudGlhdGUoZGVwc0V4cHIsIGltcG9ydFR5cGUocHJvdmlkZXIudXNlQ2xhc3MpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0KHByb3ZpZGVyLnVzZVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJWYWx1ZUV4cHJlc3Npb25zXG4gICAgICAgKiBAcGFyYW0gez99IGlzTXVsdGlcbiAgICAgICAqIEBwYXJhbSB7P30gaXNFYWdlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0luamVjdG9yQnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZVByb3ZpZGVyUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHByb3ZpZGVyLCBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnMsIGlzTXVsdGksIGlzRWFnZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZFByb3ZpZGVyVmFsdWVFeHByO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGU7XG4gICAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQcm92aWRlclZhbHVlRXhwciA9IGxpdGVyYWxBcnIocHJvdmlkZXJWYWx1ZUV4cHJlc3Npb25zKTtcbiAgICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUoRFlOQU1JQ19UWVBFKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXJWYWx1ZUV4cHIgPSBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnNbMF07XG4gICAgICAgICAgICAgIHR5cGUgPSBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnNbMF0udHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgIHR5cGUgPSBEWU5BTUlDX1RZUEU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0VhZ2VyKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmllbGRzLnB1c2gobmV3IENsYXNzRmllbGQocHJvcE5hbWUsIHR5cGUpKTtcbiAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlU3RtdHMucHVzaChUSElTX0VYUFIucHJvcChwcm9wTmFtZSkuc2V0KHJlc29sdmVkUHJvdmlkZXJWYWx1ZUV4cHIpLnRvU3RtdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGludGVybmFsRmllbGQgPSBcIl9cIiArIHByb3BOYW1lO1xuICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGludGVybmFsRmllbGQsIHR5cGUpKTtcbiAgICAgICAgICAgICAgLy8gTm90ZTogRXF1YWxzIGlzIGltcG9ydGFudCBmb3IgSlMgc28gdGhhdCBpdCBhbHNvIGNoZWNrcyB0aGUgdW5kZWZpbmVkIGNhc2UhXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGdldHRlclN0bXRzID0gW1xuICAgICAgICAgICAgICAgICAgbmV3IElmU3RtdChUSElTX0VYUFIucHJvcChpbnRlcm5hbEZpZWxkKS5pc0JsYW5rKCksIFtUSElTX0VYUFIucHJvcChpbnRlcm5hbEZpZWxkKS5zZXQocmVzb2x2ZWRQcm92aWRlclZhbHVlRXhwcikudG9TdG10KCldKSxcbiAgICAgICAgICAgICAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQoVEhJU19FWFBSLnByb3AoaW50ZXJuYWxGaWVsZCkpXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIHRoaXMuZ2V0dGVycy5wdXNoKG5ldyBDbGFzc0dldHRlcihwcm9wTmFtZSwgZ2V0dGVyU3RtdHMsIHR5cGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFRISVNfRVhQUi5wcm9wKHByb3BOYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfSW5qZWN0b3JCdWlsZGVyLnByb3RvdHlwZS5fZ2V0RGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChkZXApIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGlmIChkZXAuaXNWYWx1ZSkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBsaXRlcmFsKGRlcC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZGVwLmlzU2tpcFNlbGYpIHtcbiAgICAgICAgICAgICAgaWYgKGRlcC50b2tlbiAmJlxuICAgICAgICAgICAgICAgICAgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkluamVjdG9yKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09IHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikpKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBUSElTX0VYUFI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2luc3RhbmNlcy5nZXQodG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IFtjcmVhdGVEaVRva2VuRXhwcmVzc2lvbihkZXAudG9rZW4pXTtcbiAgICAgICAgICAgICAgaWYgKGRlcC5pc09wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzLnB1c2goTlVMTF9FWFBSKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXN1bHQgPSBJbmplY3RvclByb3BzLnBhcmVudC5jYWxsTWV0aG9kKCdnZXQnLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gX0luamVjdG9yQnVpbGRlcjtcbiAgfSgpKTtcbiAgdmFyIEluamVjdG9yUHJvcHMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gSW5qZWN0b3JQcm9wcygpIHtcbiAgICAgIH1cbiAgICAgIEluamVjdG9yUHJvcHMucGFyZW50ID0gVEhJU19FWFBSLnByb3AoJ3BhcmVudCcpO1xuICAgICAgcmV0dXJuIEluamVjdG9yUHJvcHM7XG4gIH0oKSk7XG4gIHZhciBJbmplY3RNZXRob2RWYXJzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEluamVjdE1ldGhvZFZhcnMoKSB7XG4gICAgICB9XG4gICAgICBJbmplY3RNZXRob2RWYXJzLnRva2VuID0gdmFyaWFibGUoJ3Rva2VuJyk7XG4gICAgICBJbmplY3RNZXRob2RWYXJzLm5vdEZvdW5kUmVzdWx0ID0gdmFyaWFibGUoJ25vdEZvdW5kUmVzdWx0Jyk7XG4gICAgICByZXR1cm4gSW5qZWN0TWV0aG9kVmFycztcbiAgfSgpKTtcblxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvJ3xcXFxcfFxcbnxcXHJ8XFwkL2c7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9MRUdBTF9JREVOVElGSUVSX1JFID0gL15bJEEtWl9dWzAtOUEtWl8kXSokL2k7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENBVENIX0VSUk9SX1ZBUiQxID0gdmFyaWFibGUoJ2Vycm9yJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENBVENIX1NUQUNLX1ZBUiQxID0gdmFyaWFibGUoJ3N0YWNrJyk7XG4gIHZhciBfRW1pdHRlZExpbmUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGluZGVudFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfRW1pdHRlZExpbmUoaW5kZW50KSB7XG4gICAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7XG4gICAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9FbWl0dGVkTGluZTtcbiAgfSgpKTtcbiAgdmFyIEVtaXR0ZXJWaXNpdG9yQ29udGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX2V4cG9ydGVkVmFyc1xuICAgICAgICogQHBhcmFtIHs/fSBfaW5kZW50XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEVtaXR0ZXJWaXNpdG9yQ29udGV4dChfZXhwb3J0ZWRWYXJzLCBfaW5kZW50KSB7XG4gICAgICAgICAgdGhpcy5fZXhwb3J0ZWRWYXJzID0gX2V4cG9ydGVkVmFycztcbiAgICAgICAgICB0aGlzLl9pbmRlbnQgPSBfaW5kZW50O1xuICAgICAgICAgIHRoaXMuX2NsYXNzZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9saW5lcyA9IFtuZXcgX0VtaXR0ZWRMaW5lKF9pbmRlbnQpXTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHBvcnRlZFZhcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5jcmVhdGVSb290ID0gZnVuY3Rpb24gKGV4cG9ydGVkVmFycykge1xuICAgICAgICAgIHJldHVybiBuZXcgRW1pdHRlclZpc2l0b3JDb250ZXh0KGV4cG9ydGVkVmFycywgMCk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUsIFwiX2N1cnJlbnRMaW5lXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbGluZXNbdGhpcy5fbGluZXMubGVuZ3RoIC0gMV07IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhck5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUuaXNFeHBvcnRlZFZhciA9IGZ1bmN0aW9uICh2YXJOYW1lKSB7IHJldHVybiB0aGlzLl9leHBvcnRlZFZhcnMuaW5kZXhPZih2YXJOYW1lKSAhPT0gLTE7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Pz19IGxhc3RQYXJ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLnByaW50bG4gPSBmdW5jdGlvbiAobGFzdFBhcnQpIHtcbiAgICAgICAgICBpZiAobGFzdFBhcnQgPT09IHZvaWQgMCkgeyBsYXN0UGFydCA9ICcnOyB9XG4gICAgICAgICAgdGhpcy5wcmludChsYXN0UGFydCwgdHJ1ZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLmxpbmVJc0VtcHR5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY3VycmVudExpbmUucGFydHMubGVuZ3RoID09PSAwOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcnRcbiAgICAgICAqIEBwYXJhbSB7Pz19IG5ld0xpbmVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUucHJpbnQgPSBmdW5jdGlvbiAocGFydCwgbmV3TGluZSkge1xuICAgICAgICAgIGlmIChuZXdMaW5lID09PSB2b2lkIDApIHsgbmV3TGluZSA9IGZhbHNlOyB9XG4gICAgICAgICAgaWYgKHBhcnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50TGluZS5wYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3TGluZSkge1xuICAgICAgICAgICAgICB0aGlzLl9saW5lcy5wdXNoKG5ldyBfRW1pdHRlZExpbmUodGhpcy5faW5kZW50KSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5yZW1vdmVFbXB0eUxhc3RMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLmxpbmVJc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fbGluZXMucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5pbmNJbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5faW5kZW50Kys7XG4gICAgICAgICAgdGhpcy5fY3VycmVudExpbmUuaW5kZW50ID0gdGhpcy5faW5kZW50O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5kZWNJbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5faW5kZW50LS07XG4gICAgICAgICAgdGhpcy5fY3VycmVudExpbmUuaW5kZW50ID0gdGhpcy5faW5kZW50O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjbGF6elxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5wdXNoQ2xhc3MgPSBmdW5jdGlvbiAoY2xhenopIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKGNsYXp6KTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5wb3BDbGFzcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NsYXNzZXMucG9wKCk7IH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZSwgXCJjdXJyZW50Q2xhc3NcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzLmxlbmd0aCA+IDAgPyB0aGlzLl9jbGFzc2VzW3RoaXMuX2NsYXNzZXMubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLnRvU291cmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpbmVzID0gdGhpcy5fbGluZXM7XG4gICAgICAgICAgaWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBsaW5lcyA9IGxpbmVzLnNsaWNlKDAsIGxpbmVzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgICBpZiAobGluZS5wYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX2NyZWF0ZUluZGVudChsaW5lLmluZGVudCkgKyBsaW5lLnBhcnRzLmpvaW4oJycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBFbWl0dGVyVmlzaXRvckNvbnRleHQ7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfZXNjYXBlRG9sbGFySW5TdHJpbmdzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFic3RyYWN0RW1pdHRlclZpc2l0b3IoX2VzY2FwZURvbGxhckluU3RyaW5ncykge1xuICAgICAgICAgIHRoaXMuX2VzY2FwZURvbGxhckluU3RyaW5ncyA9IF9lc2NhcGVEb2xsYXJJblN0cmluZ3M7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgc3RtdC5leHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKCc7Jyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJldHVyblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50KFwicmV0dXJuIFwiKTtcbiAgICAgICAgICBzdG10LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKCc7Jyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlQ2xhc3NTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdElmU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCJpZiAoXCIpO1xuICAgICAgICAgIHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIikge1wiKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoYXNFbHNlQ2FzZSA9IGlzUHJlc2VudChzdG10LmZhbHNlQ2FzZSkgJiYgc3RtdC5mYWxzZUNhc2UubGVuZ3RoID4gMDtcbiAgICAgICAgICBpZiAoc3RtdC50cnVlQ2FzZS5sZW5ndGggPD0gMSAmJiAhaGFzRWxzZUNhc2UpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiIFwiKTtcbiAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY3R4KTtcbiAgICAgICAgICAgICAgY3R4LnJlbW92ZUVtcHR5TGFzdExpbmUoKTtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiIFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludGxuKCk7XG4gICAgICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY3R4KTtcbiAgICAgICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgICAgICBpZiAoaGFzRWxzZUNhc2UpIHtcbiAgICAgICAgICAgICAgICAgIGN0eC5wcmludGxuKFwifSBlbHNlIHtcIik7XG4gICAgICAgICAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmZhbHNlQ2FzZSwgY3R4KTtcbiAgICAgICAgICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHJpbnRsbihcIn1cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHJ5Q2F0Y2hTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRocm93U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCJ0aHJvdyBcIik7XG4gICAgICAgICAgc3RtdC5lcnJvci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIjtcIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpbmVzID0gc3RtdC5jb21tZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7IGN0eC5wcmludGxuKFwiLy8gXCIgKyBsaW5lKTsgfSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVWYXJFeHByID0gZnVuY3Rpb24gKGV4cHIsIGN0eCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpbmVXYXNFbXB0eSA9IGN0eC5saW5lSXNFbXB0eSgpO1xuICAgICAgICAgIGlmICghbGluZVdhc0VtcHR5KSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludCgnKCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHJpbnQoZXhwci5uYW1lICsgXCIgPSBcIik7XG4gICAgICAgICAgZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJyknKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cHJcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyaXRlS2V5RXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaW5lV2FzRW1wdHkgPSBjdHgubGluZUlzRW1wdHkoKTtcbiAgICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJygnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJbXCIpO1xuICAgICAgICAgIGV4cHIuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgY3R4LnByaW50KFwiXSA9IFwiKTtcbiAgICAgICAgICBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGlmICghbGluZVdhc0VtcHR5KSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludCgnKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVQcm9wRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaW5lV2FzRW1wdHkgPSBjdHgubGluZUlzRW1wdHkoKTtcbiAgICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJygnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIuXCIgKyBleHByLm5hbWUgKyBcIiA9IFwiKTtcbiAgICAgICAgICBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGlmICghbGluZVdhc0VtcHR5KSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludCgnKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW52b2tlTWV0aG9kRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgICBleHByLnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWUgPSBleHByLm5hbWU7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChleHByLmJ1aWx0aW4pKSB7XG4gICAgICAgICAgICAgIG5hbWUgPSB0aGlzLmdldEJ1aWx0aW5NZXRob2ROYW1lKGV4cHIuYnVpbHRpbik7XG4gICAgICAgICAgICAgIGlmIChpc0JsYW5rKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBzb21lIGJ1aWx0aW5zIGp1c3QgbWVhbiB0byBza2lwIHRoZSBjYWxsLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LnByaW50KFwiLlwiICsgbmFtZSArIFwiKFwiKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoZXhwci5hcmdzLCBjdHgsIFwiLFwiKTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIpXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG1ldGhvZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuZ2V0QnVpbHRpbk1ldGhvZE5hbWUgPSBmdW5jdGlvbiAobWV0aG9kKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW52b2tlRnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGV4cHIsIGN0eCkge1xuICAgICAgICAgIGV4cHIuZm4udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgY3R4LnByaW50KFwiKFwiKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoZXhwci5hcmdzLCBjdHgsICcsJyk7XG4gICAgICAgICAgY3R4LnByaW50KFwiKVwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZWFkVmFyRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhck5hbWUgPSBhc3QubmFtZTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGFzdC5idWlsdGluKSkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGFzdC5idWlsdGluKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuU3VwZXI6XG4gICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9ICdzdXBlcic7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuVGhpczpcbiAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gJ3RoaXMnO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluVmFyLkNhdGNoRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9IENBVENIX0VSUk9SX1ZBUiQxLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuQ2F0Y2hTdGFjazpcbiAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gQ0FUQ0hfU1RBQ0tfVkFSJDEubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBidWlsdGluIHZhcmlhYmxlIFwiICsgYXN0LmJ1aWx0aW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludCh2YXJOYW1lKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnN0YW50aWF0ZUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCJuZXcgXCIpO1xuICAgICAgICAgIGFzdC5jbGFzc0V4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgY3R4LnByaW50KFwiKFwiKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmFyZ3MsIGN0eCwgJywnKTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIpXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBhc3QudmFsdWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KGVzY2FwZUlkZW50aWZpZXIodmFsdWUsIHRoaXMuX2VzY2FwZURvbGxhckluU3RyaW5ncykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCIoXCIpO1xuICAgICAgICAgIGFzdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgY3R4LnByaW50KCc/ICcpO1xuICAgICAgICAgIGFzdC50cnVlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoJzogJyk7XG4gICAgICAgICAgYXN0LmZhbHNlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIpXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdE5vdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoJyEnKTtcbiAgICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcFN0cjtcbiAgICAgICAgICBzd2l0Y2ggKGFzdC5vcGVyYXRvcikge1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkVxdWFsczpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJz09JztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLklkZW50aWNhbDpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJz09PSc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Ob3RFcXVhbHM6XG4gICAgICAgICAgICAgICAgICBvcFN0ciA9ICchPSc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Ob3RJZGVudGljYWw6XG4gICAgICAgICAgICAgICAgICBvcFN0ciA9ICchPT0nO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuQW5kOlxuICAgICAgICAgICAgICAgICAgb3BTdHIgPSAnJiYnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuT3I6XG4gICAgICAgICAgICAgICAgICBvcFN0ciA9ICd8fCc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5QbHVzOlxuICAgICAgICAgICAgICAgICAgb3BTdHIgPSAnKyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5NaW51czpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJy0nO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuRGl2aWRlOlxuICAgICAgICAgICAgICAgICAgb3BTdHIgPSAnLyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5NdWx0aXBseTpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJyonO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTW9kdWxvOlxuICAgICAgICAgICAgICAgICAgb3BTdHIgPSAnJSc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Mb3dlcjpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJzwnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTG93ZXJFcXVhbHM6XG4gICAgICAgICAgICAgICAgICBvcFN0ciA9ICc8PSc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5CaWdnZXI6XG4gICAgICAgICAgICAgICAgICBvcFN0ciA9ICc+JztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkJpZ2dlckVxdWFsczpcbiAgICAgICAgICAgICAgICAgIG9wU3RyID0gJz49JztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcGVyYXRvciBcIiArIGFzdC5vcGVyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludChcIihcIik7XG4gICAgICAgICAgYXN0Lmxocy52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIgXCIgKyBvcFN0ciArIFwiIFwiKTtcbiAgICAgICAgICBhc3QucmhzLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIilcIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmVhZFByb3BFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIi5cIik7XG4gICAgICAgICAgY3R4LnByaW50KGFzdC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZWFkS2V5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJbXCIpO1xuICAgICAgICAgIGFzdC5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJdXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1c2VOZXdMaW5lID0gYXN0LmVudHJpZXMubGVuZ3RoID4gMTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJbXCIsIHVzZU5ld0xpbmUpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmVudHJpZXMsIGN0eCwgJywnLCB1c2VOZXdMaW5lKTtcbiAgICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgICAgY3R4LnByaW50KFwiXVwiLCB1c2VOZXdMaW5lKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXNlTmV3TGluZSA9IGFzdC5lbnRyaWVzLmxlbmd0aCA+IDE7XG4gICAgICAgICAgY3R4LnByaW50KFwie1wiLCB1c2VOZXdMaW5lKTtcbiAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbE9iamVjdHMoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChlc2NhcGVJZGVudGlmaWVyKGVudHJ5LmtleSwgX3RoaXMuX2VzY2FwZURvbGxhckluU3RyaW5ncywgZW50cnkucXVvdGVkKSArIFwiOiBcIik7XG4gICAgICAgICAgICAgIGVudHJ5LnZhbHVlLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTtcbiAgICAgICAgICB9LCBhc3QuZW50cmllcywgY3R4LCAnLCcsIHVzZU5ld0xpbmUpO1xuICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJ9XCIsIHVzZU5ld0xpbmUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uc1xuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEBwYXJhbSB7P30gc2VwYXJhdG9yXG4gICAgICAgKiBAcGFyYW0gez89fSBuZXdMaW5lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFsbEV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGV4cHJlc3Npb25zLCBjdHgsIHNlcGFyYXRvciwgbmV3TGluZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKG5ld0xpbmUgPT09IHZvaWQgMCkgeyBuZXdMaW5lID0gZmFsc2U7IH1cbiAgICAgICAgICB0aGlzLnZpc2l0QWxsT2JqZWN0cyhmdW5jdGlvbiAoZXhwcikgeyByZXR1cm4gZXhwci52aXNpdEV4cHJlc3Npb24oX3RoaXMsIGN0eCk7IH0sIGV4cHJlc3Npb25zLCBjdHgsIHNlcGFyYXRvciwgbmV3TGluZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbnNcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcGFyYW0gez99IHNlcGFyYXRvclxuICAgICAgICogQHBhcmFtIHs/PX0gbmV3TGluZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBbGxPYmplY3RzID0gZnVuY3Rpb24gKGhhbmRsZXIsIGV4cHJlc3Npb25zLCBjdHgsIHNlcGFyYXRvciwgbmV3TGluZSkge1xuICAgICAgICAgIGlmIChuZXdMaW5lID09PSB2b2lkIDApIHsgbmV3TGluZSA9IGZhbHNlOyB9XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgY3R4LnByaW50KHNlcGFyYXRvciwgbmV3TGluZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaGFuZGxlcihleHByZXNzaW9uc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdMaW5lKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludGxuKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZW1lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBbGxTdGF0ZW1lbnRzID0gZnVuY3Rpb24gKHN0YXRlbWVudHMsIGN0eCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgc3RhdGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzdG10KSB7IHJldHVybiBzdG10LnZpc2l0U3RhdGVtZW50KF90aGlzLCBjdHgpOyB9KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQWJzdHJhY3RFbWl0dGVyVmlzaXRvcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHBhcmFtIHs/fSBlc2NhcGVEb2xsYXJcbiAgICogQHBhcmFtIHs/PX0gYWx3YXlzUXVvdGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZUlkZW50aWZpZXIoaW5wdXQsIGVzY2FwZURvbGxhciwgYWx3YXlzUXVvdGUpIHtcbiAgICAgIGlmIChhbHdheXNRdW90ZSA9PT0gdm9pZCAwKSB7IGFsd2F5c1F1b3RlID0gdHJ1ZTsgfVxuICAgICAgaWYgKGlzQmxhbmsoaW5wdXQpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBib2R5ID0gaW5wdXQucmVwbGFjZShfU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBtYXRjaFtfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoWzBdID09ICckJykge1xuICAgICAgICAgICAgICByZXR1cm4gZXNjYXBlRG9sbGFyID8gJ1xcXFwkJyA6ICckJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAobWF0Y2hbMF0gPT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzBdID09ICdcXHInKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnXFxcXHInO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiXFxcXFwiICsgbWF0Y2hbMF07XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXF1aXJlc1F1b3RlcyA9IGFsd2F5c1F1b3RlIHx8ICFfTEVHQUxfSURFTlRJRklFUl9SRS50ZXN0KGJvZHkpO1xuICAgICAgcmV0dXJuIHJlcXVpcmVzUXVvdGVzID8gXCInXCIgKyBib2R5ICsgXCInXCIgOiBib2R5O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvdW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfY3JlYXRlSW5kZW50KGNvdW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSAnJztcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgcmVzICs9ICcgICc7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDE5ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfZGVidWdNb2R1bGVVcmwgPSAnL2RlYnVnL2xpYic7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFzdFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGVidWdPdXRwdXRBc3RBc1R5cGVTY3JpcHQoYXN0KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb252ZXJ0ZXIgPSBuZXcgX1RzRW1pdHRlclZpc2l0b3IoX2RlYnVnTW9kdWxlVXJsKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN0eCA9IEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5jcmVhdGVSb290KFtdKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFzdHMgPSBBcnJheS5pc0FycmF5KGFzdCkgPyBhc3QgOiBbYXN0XTtcbiAgICAgIGFzdHMuZm9yRWFjaChmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgICAgaWYgKGFzdCBpbnN0YW5jZW9mIFN0YXRlbWVudCkge1xuICAgICAgICAgICAgICBhc3QudmlzaXRTdGF0ZW1lbnQoY29udmVydGVyLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChhc3QgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgIGFzdC52aXNpdEV4cHJlc3Npb24oY29udmVydGVyLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChhc3QgaW5zdGFuY2VvZiBUeXBlJDEpIHtcbiAgICAgICAgICAgICAgYXN0LnZpc2l0VHlwZShjb252ZXJ0ZXIsIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb24ndCBrbm93IGhvdyB0byBwcmludCBkZWJ1ZyBpbmZvIGZvciBcIiArIGFzdCk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3R4LnRvU291cmNlKCk7XG4gIH1cbiAgdmFyIFR5cGVTY3JpcHRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfaW1wb3J0R2VuZXJhdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFR5cGVTY3JpcHRFbWl0dGVyKF9pbXBvcnRHZW5lcmF0b3IpIHtcbiAgICAgICAgICB0aGlzLl9pbXBvcnRHZW5lcmF0b3IgPSBfaW1wb3J0R2VuZXJhdG9yO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBzdG10c1xuICAgICAgICogQHBhcmFtIHs/fSBleHBvcnRlZFZhcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFR5cGVTY3JpcHRFbWl0dGVyLnByb3RvdHlwZS5lbWl0U3RhdGVtZW50cyA9IGZ1bmN0aW9uIChtb2R1bGVVcmwsIHN0bXRzLCBleHBvcnRlZFZhcnMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbnZlcnRlciA9IG5ldyBfVHNFbWl0dGVyVmlzaXRvcihtb2R1bGVVcmwpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN0eCA9IEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5jcmVhdGVSb290KGV4cG9ydGVkVmFycyk7XG4gICAgICAgICAgY29udmVydGVyLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10cywgY3R4KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzcmNQYXJ0cyA9IFtdO1xuICAgICAgICAgIGNvbnZlcnRlci5pbXBvcnRzV2l0aFByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCwgaW1wb3J0ZWRNb2R1bGVVcmwpIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogY2FuJ3Qgd3JpdGUgdGhlIHJlYWwgd29yZCBmb3IgaW1wb3J0IGFzIGl0IHNjcmV3cyB1cCBzeXN0ZW0uanMgYXV0byBkZXRlY3Rpb24uLi5cbiAgICAgICAgICAgICAgc3JjUGFydHMucHVzaChcImltcFwiICtcbiAgICAgICAgICAgICAgICAgIChcIm9ydCAqIGFzIFwiICsgcHJlZml4ICsgXCIgZnJvbSAnXCIgKyBfdGhpcy5faW1wb3J0R2VuZXJhdG9yLmZpbGVOYW1lVG9Nb2R1bGVOYW1lKGltcG9ydGVkTW9kdWxlVXJsLCBtb2R1bGVVcmwpICsgXCInO1wiKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3JjUGFydHMucHVzaChjdHgudG9Tb3VyY2UoKSk7XG4gICAgICAgICAgcmV0dXJuIHNyY1BhcnRzLmpvaW4oJ1xcbicpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBUeXBlU2NyaXB0RW1pdHRlcjtcbiAgfSgpKTtcbiAgdmFyIF9Uc0VtaXR0ZXJWaXNpdG9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxOShfVHNFbWl0dGVyVmlzaXRvciwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfbW9kdWxlVXJsXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9Uc0VtaXR0ZXJWaXNpdG9yKF9tb2R1bGVVcmwpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5fbW9kdWxlVXJsID0gX21vZHVsZVVybDtcbiAgICAgICAgICB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMgPSBuZXcgTWFwKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRUeXBlID0gZnVuY3Rpb24gKHQsIGN0eCwgZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdFR5cGUgPT09IHZvaWQgMCkgeyBkZWZhdWx0VHlwZSA9ICdhbnknOyB9XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0KSkge1xuICAgICAgICAgICAgICB0LnZpc2l0VHlwZSh0aGlzLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KGRlZmF1bHRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBhc3QudmFsdWU7XG4gICAgICAgICAgaWYgKGlzQmxhbmsodmFsdWUpICYmIGFzdC50eXBlICE9IE5VTExfVFlQRSkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoXCIoXCIgKyB2YWx1ZSArIFwiIGFzIGFueSlcIik7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByLmNhbGwodGhpcywgYXN0LCBjdHgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgaWYgKGFzdC5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJygnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gX3N1cGVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIuY2FsbCh0aGlzLCBhc3QsIGN0eCk7XG4gICAgICAgICAgaWYgKGFzdC5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJyBhcyBhbnlbXSknKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdGhpcy5fdmlzaXRJZGVudGlmaWVyKGFzdC52YWx1ZSwgYXN0LnR5cGVQYXJhbXMsIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlVmFyU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICBpZiAoY3R4LmlzRXhwb3J0ZWRWYXIoc3RtdC5uYW1lKSkge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoXCJleHBvcnQgXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RtdC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuRmluYWwpKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcImNvbnN0XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwidmFyXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHJpbnQoXCIgXCIgKyBzdG10Lm5hbWUgKyBcIjpcIik7XG4gICAgICAgICAgdGhpcy52aXNpdFR5cGUoc3RtdC50eXBlLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIiA9IFwiKTtcbiAgICAgICAgICBzdG10LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiO1wiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCIoPFwiKTtcbiAgICAgICAgICBhc3QudHlwZS52aXNpdFR5cGUodGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCI+XCIpO1xuICAgICAgICAgIGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCIpXCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGN0eC5wdXNoQ2xhc3Moc3RtdCk7XG4gICAgICAgICAgaWYgKGN0eC5pc0V4cG9ydGVkVmFyKHN0bXQubmFtZSkpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiZXhwb3J0IFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LnByaW50KFwiY2xhc3MgXCIgKyBzdG10Lm5hbWUpO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoc3RtdC5wYXJlbnQpKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcIiBleHRlbmRzIFwiKTtcbiAgICAgICAgICAgICAgc3RtdC5wYXJlbnQudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludGxuKFwiIHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIHN0bXQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7IHJldHVybiBfdGhpcy5fdmlzaXRDbGFzc0ZpZWxkKGZpZWxkLCBjdHgpOyB9KTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHN0bXQuY29uc3RydWN0b3JNZXRob2QpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Zpc2l0Q2xhc3NDb25zdHJ1Y3RvcihzdG10LCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdG10LmdldHRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZ2V0dGVyKSB7IHJldHVybiBfdGhpcy5fdmlzaXRDbGFzc0dldHRlcihnZXR0ZXIsIGN0eCk7IH0pO1xuICAgICAgICAgIHN0bXQubWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsgcmV0dXJuIF90aGlzLl92aXNpdENsYXNzTWV0aG9kKG1ldGhvZCwgY3R4KTsgfSk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifVwiKTtcbiAgICAgICAgICBjdHgucG9wQ2xhc3MoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZmllbGRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0Q2xhc3NGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCwgY3R4KSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5Qcml2YXRlKSkge1xuICAgICAgICAgICAgICAvLyBjb21tZW50IG91dCBhcyBhIHdvcmthcm91bmQgZm9yICMxMDk2N1xuICAgICAgICAgICAgICBjdHgucHJpbnQoXCIvKnByaXZhdGUqLyBcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludChmaWVsZC5uYW1lKTtcbiAgICAgICAgICBjdHgucHJpbnQoJzonKTtcbiAgICAgICAgICB0aGlzLnZpc2l0VHlwZShmaWVsZC50eXBlLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiO1wiKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZ2V0dGVyXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzR2V0dGVyID0gZnVuY3Rpb24gKGdldHRlciwgY3R4KSB7XG4gICAgICAgICAgaWYgKGdldHRlci5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuUHJpdmF0ZSkpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwicHJpdmF0ZSBcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludChcImdldCBcIiArIGdldHRlci5uYW1lICsgXCIoKVwiKTtcbiAgICAgICAgICBjdHgucHJpbnQoJzonKTtcbiAgICAgICAgICB0aGlzLnZpc2l0VHlwZShnZXR0ZXIudHlwZSwgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIiB7XCIpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhnZXR0ZXIuYm9keSwgY3R4KTtcbiAgICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCJ9XCIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50KFwiY29uc3RydWN0b3IoXCIpO1xuICAgICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKHN0bXQuY29uc3RydWN0b3JNZXRob2QucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiKSB7XCIpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNvbnN0cnVjdG9yTWV0aG9kLmJvZHksIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifVwiKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCwgY3R4KSB7XG4gICAgICAgICAgaWYgKG1ldGhvZC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuUHJpdmF0ZSkpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwicHJpdmF0ZSBcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludChtZXRob2QubmFtZSArIFwiKFwiKTtcbiAgICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhtZXRob2QucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIik6XCIpO1xuICAgICAgICAgIHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlLCBjdHgsICd2b2lkJyk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCIge1wiKTtcbiAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMobWV0aG9kLmJvZHksIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifVwiKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50KFwiKFwiKTtcbiAgICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhhc3QucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIik6XCIpO1xuICAgICAgICAgIHRoaXMudmlzaXRUeXBlKGFzdC50eXBlLCBjdHgsICd2b2lkJyk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCIgPT4ge1wiKTtcbiAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoYXN0LnN0YXRlbWVudHMsIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludChcIn1cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlRnVuY3Rpb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIGlmIChjdHguaXNFeHBvcnRlZFZhcihzdG10Lm5hbWUpKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcImV4cG9ydCBcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludChcImZ1bmN0aW9uIFwiICsgc3RtdC5uYW1lICsgXCIoXCIpO1xuICAgICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKHN0bXQucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIik6XCIpO1xuICAgICAgICAgIHRoaXMudmlzaXRUeXBlKHN0bXQudHlwZSwgY3R4LCAndm9pZCcpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiIHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuc3RhdGVtZW50cywgY3R4KTtcbiAgICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCJ9XCIpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHJ5Q2F0Y2hTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIGN0eC5wcmludGxuKFwidHJ5IHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuYm9keVN0bXRzLCBjdHgpO1xuICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIn0gY2F0Y2ggKFwiICsgQ0FUQ0hfRVJST1JfVkFSJDEubmFtZSArIFwiKSB7XCIpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYXRjaFN0bXRzID0gWyhDQVRDSF9TVEFDS19WQVIkMS5zZXQoQ0FUQ0hfRVJST1JfVkFSJDEucHJvcCgnc3RhY2snKSkudG9EZWNsU3RtdChudWxsLCBbXG4gICAgICAgICAgICAgICAgICBTdG10TW9kaWZpZXIuRmluYWxcbiAgICAgICAgICAgICAgXSkpXS5jb25jYXQoc3RtdC5jYXRjaFN0bXRzKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhjYXRjaFN0bXRzLCBjdHgpO1xuICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIn1cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRCdWlsdGludFR5cGUgPSBmdW5jdGlvbiAodHlwZSwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHlwZVN0cjtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5UeXBlTmFtZS5Cb29sOlxuICAgICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdib29sZWFuJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5UeXBlTmFtZS5EeW5hbWljOlxuICAgICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdhbnknO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQnVpbHRpblR5cGVOYW1lLkZ1bmN0aW9uOlxuICAgICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdGdW5jdGlvbic7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBCdWlsdGluVHlwZU5hbWUuTnVtYmVyOlxuICAgICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdudW1iZXInO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQnVpbHRpblR5cGVOYW1lLkludDpcbiAgICAgICAgICAgICAgICAgIHR5cGVTdHIgPSAnbnVtYmVyJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5UeXBlTmFtZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgICB0eXBlU3RyID0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGJ1aWx0aW4gdHlwZSBcIiArIHR5cGUubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5wcmludCh0eXBlU3RyKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvblR5cGUgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGFzdC50eXBlUGFyYW1zKSAmJiBhc3QudHlwZVBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcIjxcIik7XG4gICAgICAgICAgICAgIHRoaXMudmlzaXRBbGxPYmplY3RzKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlLnZpc2l0VHlwZShfdGhpcywgY3R4KTsgfSwgYXN0LnR5cGVQYXJhbXMsIGN0eCwgJywnKTtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiPlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBcnJheVR5cGUgPSBmdW5jdGlvbiAodHlwZSwgY3R4KSB7XG4gICAgICAgICAgdGhpcy52aXNpdFR5cGUodHlwZS5vZiwgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnQoXCJbXVwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1hcFR5cGUgPSBmdW5jdGlvbiAodHlwZSwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50KFwie1trZXk6IHN0cmluZ106XCIpO1xuICAgICAgICAgIHRoaXMudmlzaXRUeXBlKHR5cGUudmFsdWVUeXBlLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludChcIn1cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1ldGhvZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLmdldEJ1aWx0aW5NZXRob2ROYW1lID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWU7XG4gICAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLkNvbmNhdEFycmF5OlxuICAgICAgICAgICAgICAgICAgbmFtZSA9ICdjb25jYXQnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5TdWJzY3JpYmVPYnNlcnZhYmxlOlxuICAgICAgICAgICAgICAgICAgbmFtZSA9ICdzdWJzY3JpYmUnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5CaW5kOlxuICAgICAgICAgICAgICAgICAgbmFtZSA9ICdiaW5kJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBidWlsdGluIG1ldGhvZDogXCIgKyBtZXRob2QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGN0eCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbE9iamVjdHMoZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChwYXJhbS5uYW1lKTtcbiAgICAgICAgICAgICAgY3R4LnByaW50KCc6Jyk7XG4gICAgICAgICAgICAgIF90aGlzLnZpc2l0VHlwZShwYXJhbS50eXBlLCBjdHgpO1xuICAgICAgICAgIH0sIHBhcmFtcywgY3R4LCAnLCcpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlUGFyYW1zXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdElkZW50aWZpZXIgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGVQYXJhbXMsIGN0eCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZSA9IGlkZW50aWZpZXJOYW1lKHZhbHVlKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVVcmwgPSBpZGVudGlmaWVyTW9kdWxlVXJsKHZhbHVlKTtcbiAgICAgICAgICBpZiAoaXNCbGFuayhuYW1lKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBpZGVudGlmaWVyIFwiICsgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcmVzZW50KG1vZHVsZVVybCkgJiYgbW9kdWxlVXJsICE9IHRoaXMuX21vZHVsZVVybCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVmaXggPSB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMuZ2V0KG1vZHVsZVVybCk7XG4gICAgICAgICAgICAgIGlmIChpc0JsYW5rKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiaW1wb3J0XCIgKyB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMuc2l6ZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0c1dpdGhQcmVmaXhlcy5zZXQobW9kdWxlVXJsLCBwcmVmaXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGN0eC5wcmludChwcmVmaXggKyBcIi5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZS5yZWZlcmVuY2UgJiYgdmFsdWUucmVmZXJlbmNlLm1lbWJlcnMgJiYgdmFsdWUucmVmZXJlbmNlLm1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludCh2YWx1ZS5yZWZlcmVuY2UubmFtZSk7XG4gICAgICAgICAgICAgIGN0eC5wcmludCgnLicpO1xuICAgICAgICAgICAgICBjdHgucHJpbnQodmFsdWUucmVmZXJlbmNlLm1lbWJlcnMuam9pbignLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0eXBlUGFyYW1zKSAmJiB0eXBlUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiPFwiKTtcbiAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbE9iamVjdHMoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUudmlzaXRUeXBlKF90aGlzLCBjdHgpOyB9LCB0eXBlUGFyYW1zLCBjdHgsICcsJyk7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcIj5cIik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBfVHNFbWl0dGVyVmlzaXRvcjtcbiAgfShBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09IFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgPT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vXG4gIC8vICAgICAgICBETyBOT1QgRURJVCBUSElTIExJU1QgT0YgU0VDVVJJVFkgU0VOU0lUSVZFIFBST1BFUlRJRVMgV0lUSE9VVCBBIFNFQ1VSSVRZIFJFVklFVyFcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY2ggb3V0IHRvIG1wcm9ic3QgZm9yIGRldGFpbHMuXG4gIC8vXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqIE1hcCBmcm9tIHRhZ05hbWV8cHJvcGVydHlOYW1lIFNlY3VyaXR5Q29udGV4dC4gUHJvcGVydGllcyBhcHBseWluZyB0byBhbGwgdGFncyB1c2UgJyonLiAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTRUNVUklUWV9TQ0hFTUEgPSB7fTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY3R4XG4gICAqIEBwYXJhbSB7P30gc3BlY3NcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyQ29udGV4dChjdHgsIHNwZWNzKSB7XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIHNwZWNzXzEgPSBzcGVjczsgX2kgPCBzcGVjc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBzcGVjID0gc3BlY3NfMVtfaV07XG4gICAgICAgICAgU0VDVVJJVFlfU0NIRU1BW3NwZWMudG9Mb3dlckNhc2UoKV0gPSBjdHg7XG4gICAgICB9XG4gIH1cbiAgLy8gQ2FzZSBpcyBpbnNpZ25pZmljYW50IGJlbG93LCBhbGwgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIGFyZSBsb3dlci1jYXNlZCBmb3IgbG9va3VwLlxuICByZWdpc3RlckNvbnRleHQoX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuSFRNTCwgW1xuICAgICAgJ2lmcmFtZXxzcmNkb2MnLFxuICAgICAgJyp8aW5uZXJIVE1MJyxcbiAgICAgICcqfG91dGVySFRNTCcsXG4gIF0pO1xuICByZWdpc3RlckNvbnRleHQoX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuU1RZTEUsIFsnKnxzdHlsZSddKTtcbiAgLy8gTkI6IG5vIFNDUklQVCBjb250ZXh0cyBoZXJlLCB0aGV5IGFyZSBuZXZlciBhbGxvd2VkIGR1ZSB0byB0aGUgcGFyc2VyIHN0cmlwcGluZyB0aGVtLlxuICByZWdpc3RlckNvbnRleHQoX2FuZ3VsYXJfY29yZS5TZWN1cml0eUNvbnRleHQuVVJMLCBbXG4gICAgICAnKnxmb3JtQWN0aW9uJywgJ2FyZWF8aHJlZicsICdhcmVhfHBpbmcnLCAnYXVkaW98c3JjJywgJ2F8aHJlZicsXG4gICAgICAnYXxwaW5nJywgJ2Jsb2NrcXVvdGV8Y2l0ZScsICdib2R5fGJhY2tncm91bmQnLCAnZGVsfGNpdGUnLCAnZm9ybXxhY3Rpb24nLFxuICAgICAgJ2ltZ3xzcmMnLCAnaW1nfHNyY3NldCcsICdpbnB1dHxzcmMnLCAnaW5zfGNpdGUnLCAncXxjaXRlJyxcbiAgICAgICdzb3VyY2V8c3JjJywgJ3NvdXJjZXxzcmNzZXQnLCAndHJhY2t8c3JjJywgJ3ZpZGVvfHBvc3RlcicsICd2aWRlb3xzcmMnLFxuICBdKTtcbiAgcmVnaXN0ZXJDb250ZXh0KF9hbmd1bGFyX2NvcmUuU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgW1xuICAgICAgJ2FwcGxldHxjb2RlJyxcbiAgICAgICdhcHBsZXR8Y29kZWJhc2UnLFxuICAgICAgJ2Jhc2V8aHJlZicsXG4gICAgICAnZW1iZWR8c3JjJyxcbiAgICAgICdmcmFtZXxzcmMnLFxuICAgICAgJ2hlYWR8cHJvZmlsZScsXG4gICAgICAnaHRtbHxtYW5pZmVzdCcsXG4gICAgICAnaWZyYW1lfHNyYycsXG4gICAgICAnbGlua3xocmVmJyxcbiAgICAgICdtZWRpYXxzcmMnLFxuICAgICAgJ29iamVjdHxjb2RlYmFzZScsXG4gICAgICAnb2JqZWN0fGRhdGEnLFxuICAgICAgJ3NjcmlwdHxzcmMnLFxuICBdKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMjAgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciBfX2RlY29yYXRlJDE0ID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG4gIH07XG4gIHZhciBfX21ldGFkYXRhJDE0ID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBCT09MRUFOID0gJ2Jvb2xlYW4nO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOVU1CRVIgPSAnbnVtYmVyJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gU1RSSU5HID0gJ3N0cmluZyc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIE9CSkVDVCA9ICdvYmplY3QnO1xuICAvKipcbiAgICogVGhpcyBhcnJheSByZXByZXNlbnRzIHRoZSBET00gc2NoZW1hLiBJdCBlbmNvZGVzIGluaGVyaXRhbmNlLCBwcm9wZXJ0aWVzLCBhbmQgZXZlbnRzLlxuICAgKlxuICAgKiAjIyBPdmVydmlld1xuICAgKlxuICAgKiBFYWNoIGxpbmUgcmVwcmVzZW50cyBvbmUga2luZCBvZiBlbGVtZW50LiBUaGUgYGVsZW1lbnRfaW5oZXJpdGFuY2VgIGFuZCBwcm9wZXJ0aWVzIGFyZSBqb2luZWRcbiAgICogdXNpbmcgYGVsZW1lbnRfaW5oZXJpdGFuY2V8cHJvcGVydGllc2Agc3ludGF4LlxuICAgKlxuICAgKiAjIyBFbGVtZW50IEluaGVyaXRhbmNlXG4gICAqXG4gICAqIFRoZSBgZWxlbWVudF9pbmhlcml0YW5jZWAgY2FuIGJlIGZ1cnRoZXIgc3ViZGl2aWRlZCBhcyBgZWxlbWVudDEsZWxlbWVudDIsLi4uXnBhcmVudEVsZW1lbnRgLlxuICAgKiBIZXJlIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgYCxgIChjb21tYXMpLiBFdmVyeSBlbGVtZW50IGluIHRoZSBsaXN0XG4gICAqIGhhcyBpZGVudGljYWwgcHJvcGVydGllcy5cbiAgICpcbiAgICogQW4gYGVsZW1lbnRgIG1heSBpbmhlcml0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBmcm9tIGBwYXJlbnRFbGVtZW50YCBJZiBubyBgXnBhcmVudEVsZW1lbnRgIGlzXG4gICAqIHNwZWNpZmllZCB0aGVuIGBcIlwiYCAoYmxhbmspIGVsZW1lbnQgaXMgYXNzdW1lZC5cbiAgICpcbiAgICogTk9URTogVGhlIGJsYW5rIGVsZW1lbnQgaW5oZXJpdHMgZnJvbSByb290IGBbRWxlbWVudF1gIGVsZW1lbnQsIHRoZSBzdXBlciBlbGVtZW50IG9mIGFsbFxuICAgKiBlbGVtZW50cy5cbiAgICpcbiAgICogTk9URSBhbiBlbGVtZW50IHByZWZpeCBzdWNoIGFzIGA6c3ZnOmAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyB0byB0aGUgc2NoZW1hLlxuICAgKlxuICAgKiAjIyBQcm9wZXJ0aWVzXG4gICAqXG4gICAqIEVhY2ggZWxlbWVudCBoYXMgYSBzZXQgb2YgcHJvcGVydGllcyBzZXBhcmF0ZWQgYnkgYCxgIChjb21tYXMpLiBFYWNoIHByb3BlcnR5IGNhbiBiZSBwcmVmaXhlZFxuICAgKiBieSBhIHNwZWNpYWwgY2hhcmFjdGVyIGRlc2lnbmF0aW5nIGl0cyB0eXBlOlxuICAgKlxuICAgKiAtIChubyBwcmVmaXgpOiBwcm9wZXJ0eSBpcyBhIHN0cmluZy5cbiAgICogLSBgKmA6IHByb3BlcnR5IHJlcHJlc2VudHMgYW4gZXZlbnQuXG4gICAqIC0gYCFgOiBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4uXG4gICAqIC0gYCNgOiBwcm9wZXJ0eSBpcyBhIG51bWJlci5cbiAgICogLSBgJWA6IHByb3BlcnR5IGlzIGFuIG9iamVjdC5cbiAgICpcbiAgICogIyMgUXVlcnlcbiAgICpcbiAgICogVGhlIGNsYXNzIGNyZWF0ZXMgYW4gaW50ZXJuYWwgc3F1YXMgcmVwcmVzZW50YXRpb24gd2hpY2ggYWxsb3dzIHRvIGVhc2lseSBhbnN3ZXIgdGhlIHF1ZXJ5IG9mXG4gICAqIGlmIGEgZ2l2ZW4gcHJvcGVydHkgZXhpc3Qgb24gYSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBOT1RFOiBXZSBkb24ndCB5ZXQgc3VwcG9ydCBxdWVyeWluZyBmb3IgdHlwZXMgb3IgZXZlbnRzLlxuICAgKiBOT1RFOiBUaGlzIHNjaGVtYSBpcyBhdXRvIGV4dHJhY3RlZCBmcm9tIGBzY2hlbWFfZXh0cmFjdG9yLnRzYCBsb2NhdGVkIGluIHRoZSB0ZXN0IGZvbGRlcixcbiAgICogICAgICAgc2VlIGRvbV9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeV9zcGVjLnRzXG4gICAqL1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT0gUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICA9PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy9cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIERPIE5PVCBFRElUIFRISVMgRE9NIFNDSEVNQSBXSVRIT1VUIEEgU0VDVVJJVFkgUkVWSUVXIVxuICAvL1xuICAvLyBOZXdseSBhZGRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgc2VjdXJpdHkgcmV2aWV3ZWQgYW5kIGFzc2lnbmVkIGFuIGFwcHJvcHJpYXRlIFNlY3VyaXR5Q29udGV4dCBpblxuICAvLyBkb21fc2VjdXJpdHlfc2NoZW1hLnRzLiBSZWFjaCBvdXQgdG8gbXByb2JzdCAmIHJqYW1ldCBmb3IgZGV0YWlscy5cbiAgLy9cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTQ0hFTUEgPSBbXG4gICAgICAnW0VsZW1lbnRdfHRleHRDb250ZW50LCVjbGFzc0xpc3QsY2xhc3NOYW1lLGlkLGlubmVySFRNTCwqYmVmb3JlY29weSwqYmVmb3JlY3V0LCpiZWZvcmVwYXN0ZSwqY29weSwqY3V0LCpwYXN0ZSwqc2VhcmNoLCpzZWxlY3RzdGFydCwqd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSwqd2Via2l0ZnVsbHNjcmVlbmVycm9yLCp3aGVlbCxvdXRlckhUTUwsI3Njcm9sbExlZnQsI3Njcm9sbFRvcCcsXG4gICAgICAnW0hUTUxFbGVtZW50XV5bRWxlbWVudF18YWNjZXNzS2V5LGNvbnRlbnRFZGl0YWJsZSxkaXIsIWRyYWdnYWJsZSwhaGlkZGVuLGlubmVyVGV4dCxsYW5nLCphYm9ydCwqYmVmb3JlY29weSwqYmVmb3JlY3V0LCpiZWZvcmVwYXN0ZSwqYmx1ciwqY2FuY2VsLCpjYW5wbGF5LCpjYW5wbGF5dGhyb3VnaCwqY2hhbmdlLCpjbGljaywqY2xvc2UsKmNvbnRleHRtZW51LCpjb3B5LCpjdWVjaGFuZ2UsKmN1dCwqZGJsY2xpY2ssKmRyYWcsKmRyYWdlbmQsKmRyYWdlbnRlciwqZHJhZ2xlYXZlLCpkcmFnb3ZlciwqZHJhZ3N0YXJ0LCpkcm9wLCpkdXJhdGlvbmNoYW5nZSwqZW1wdGllZCwqZW5kZWQsKmVycm9yLCpmb2N1cywqaW5wdXQsKmludmFsaWQsKmtleWRvd24sKmtleXByZXNzLCprZXl1cCwqbG9hZCwqbG9hZGVkZGF0YSwqbG9hZGVkbWV0YWRhdGEsKmxvYWRzdGFydCwqbWVzc2FnZSwqbW91c2Vkb3duLCptb3VzZWVudGVyLCptb3VzZWxlYXZlLCptb3VzZW1vdmUsKm1vdXNlb3V0LCptb3VzZW92ZXIsKm1vdXNldXAsKm1vdXNld2hlZWwsKm1vemZ1bGxzY3JlZW5jaGFuZ2UsKm1vemZ1bGxzY3JlZW5lcnJvciwqbW96cG9pbnRlcmxvY2tjaGFuZ2UsKm1venBvaW50ZXJsb2NrZXJyb3IsKnBhc3RlLCpwYXVzZSwqcGxheSwqcGxheWluZywqcHJvZ3Jlc3MsKnJhdGVjaGFuZ2UsKnJlc2V0LCpyZXNpemUsKnNjcm9sbCwqc2VhcmNoLCpzZWVrZWQsKnNlZWtpbmcsKnNlbGVjdCwqc2VsZWN0c3RhcnQsKnNob3csKnN0YWxsZWQsKnN1Ym1pdCwqc3VzcGVuZCwqdGltZXVwZGF0ZSwqdG9nZ2xlLCp2b2x1bWVjaGFuZ2UsKndhaXRpbmcsKndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IsKndlYmdsY29udGV4dGxvc3QsKndlYmdsY29udGV4dHJlc3RvcmVkLCp3ZWJraXRmdWxsc2NyZWVuY2hhbmdlLCp3ZWJraXRmdWxsc2NyZWVuZXJyb3IsKndoZWVsLG91dGVyVGV4dCwhc3BlbGxjaGVjaywlc3R5bGUsI3RhYkluZGV4LHRpdGxlLCF0cmFuc2xhdGUnLFxuICAgICAgJ2FiYnIsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGIsYmRpLGJkbyxjaXRlLGNvZGUsZGQsZGZuLGR0LGVtLGZpZ2NhcHRpb24sZmlndXJlLGZvb3RlcixoZWFkZXIsaSxrYmQsbWFpbixtYXJrLG5hdixub3NjcmlwdCxyYixycCxydCxydGMscnVieSxzLHNhbXAsc2VjdGlvbixzbWFsbCxzdHJvbmcsc3ViLHN1cCx1LHZhcix3YnJeW0hUTUxFbGVtZW50XXxhY2Nlc3NLZXksY29udGVudEVkaXRhYmxlLGRpciwhZHJhZ2dhYmxlLCFoaWRkZW4saW5uZXJUZXh0LGxhbmcsKmFib3J0LCpiZWZvcmVjb3B5LCpiZWZvcmVjdXQsKmJlZm9yZXBhc3RlLCpibHVyLCpjYW5jZWwsKmNhbnBsYXksKmNhbnBsYXl0aHJvdWdoLCpjaGFuZ2UsKmNsaWNrLCpjbG9zZSwqY29udGV4dG1lbnUsKmNvcHksKmN1ZWNoYW5nZSwqY3V0LCpkYmxjbGljaywqZHJhZywqZHJhZ2VuZCwqZHJhZ2VudGVyLCpkcmFnbGVhdmUsKmRyYWdvdmVyLCpkcmFnc3RhcnQsKmRyb3AsKmR1cmF0aW9uY2hhbmdlLCplbXB0aWVkLCplbmRlZCwqZXJyb3IsKmZvY3VzLCppbnB1dCwqaW52YWxpZCwqa2V5ZG93biwqa2V5cHJlc3MsKmtleXVwLCpsb2FkLCpsb2FkZWRkYXRhLCpsb2FkZWRtZXRhZGF0YSwqbG9hZHN0YXJ0LCptZXNzYWdlLCptb3VzZWRvd24sKm1vdXNlZW50ZXIsKm1vdXNlbGVhdmUsKm1vdXNlbW92ZSwqbW91c2VvdXQsKm1vdXNlb3ZlciwqbW91c2V1cCwqbW91c2V3aGVlbCwqbW96ZnVsbHNjcmVlbmNoYW5nZSwqbW96ZnVsbHNjcmVlbmVycm9yLCptb3pwb2ludGVybG9ja2NoYW5nZSwqbW96cG9pbnRlcmxvY2tlcnJvciwqcGFzdGUsKnBhdXNlLCpwbGF5LCpwbGF5aW5nLCpwcm9ncmVzcywqcmF0ZWNoYW5nZSwqcmVzZXQsKnJlc2l6ZSwqc2Nyb2xsLCpzZWFyY2gsKnNlZWtlZCwqc2Vla2luZywqc2VsZWN0LCpzZWxlY3RzdGFydCwqc2hvdywqc3RhbGxlZCwqc3VibWl0LCpzdXNwZW5kLCp0aW1ldXBkYXRlLCp0b2dnbGUsKnZvbHVtZWNoYW5nZSwqd2FpdGluZywqd2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciwqd2ViZ2xjb250ZXh0bG9zdCwqd2ViZ2xjb250ZXh0cmVzdG9yZWQsKndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UsKndlYmtpdGZ1bGxzY3JlZW5lcnJvciwqd2hlZWwsb3V0ZXJUZXh0LCFzcGVsbGNoZWNrLCVzdHlsZSwjdGFiSW5kZXgsdGl0bGUsIXRyYW5zbGF0ZScsXG4gICAgICAnbWVkaWFeW0hUTUxFbGVtZW50XXwhYXV0b3BsYXksIWNvbnRyb2xzLCVjcm9zc09yaWdpbiwjY3VycmVudFRpbWUsIWRlZmF1bHRNdXRlZCwjZGVmYXVsdFBsYXliYWNrUmF0ZSwhZGlzYWJsZVJlbW90ZVBsYXliYWNrLCFsb29wLCFtdXRlZCwqZW5jcnlwdGVkLCNwbGF5YmFja1JhdGUscHJlbG9hZCxzcmMsJXNyY09iamVjdCwjdm9sdW1lJyxcbiAgICAgICc6c3ZnOl5bSFRNTEVsZW1lbnRdfCphYm9ydCwqYmx1ciwqY2FuY2VsLCpjYW5wbGF5LCpjYW5wbGF5dGhyb3VnaCwqY2hhbmdlLCpjbGljaywqY2xvc2UsKmNvbnRleHRtZW51LCpjdWVjaGFuZ2UsKmRibGNsaWNrLCpkcmFnLCpkcmFnZW5kLCpkcmFnZW50ZXIsKmRyYWdsZWF2ZSwqZHJhZ292ZXIsKmRyYWdzdGFydCwqZHJvcCwqZHVyYXRpb25jaGFuZ2UsKmVtcHRpZWQsKmVuZGVkLCplcnJvciwqZm9jdXMsKmlucHV0LCppbnZhbGlkLCprZXlkb3duLCprZXlwcmVzcywqa2V5dXAsKmxvYWQsKmxvYWRlZGRhdGEsKmxvYWRlZG1ldGFkYXRhLCpsb2Fkc3RhcnQsKm1vdXNlZG93biwqbW91c2VlbnRlciwqbW91c2VsZWF2ZSwqbW91c2Vtb3ZlLCptb3VzZW91dCwqbW91c2VvdmVyLCptb3VzZXVwLCptb3VzZXdoZWVsLCpwYXVzZSwqcGxheSwqcGxheWluZywqcHJvZ3Jlc3MsKnJhdGVjaGFuZ2UsKnJlc2V0LCpyZXNpemUsKnNjcm9sbCwqc2Vla2VkLCpzZWVraW5nLCpzZWxlY3QsKnNob3csKnN0YWxsZWQsKnN1Ym1pdCwqc3VzcGVuZCwqdGltZXVwZGF0ZSwqdG9nZ2xlLCp2b2x1bWVjaGFuZ2UsKndhaXRpbmcsJXN0eWxlLCN0YWJJbmRleCcsXG4gICAgICAnOnN2ZzpncmFwaGljc146c3ZnOnwnLFxuICAgICAgJzpzdmc6YW5pbWF0aW9uXjpzdmc6fCpiZWdpbiwqZW5kLCpyZXBlYXQnLFxuICAgICAgJzpzdmc6Z2VvbWV0cnleOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmNvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25eOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmdyYWRpZW50Xjpzdmc6fCcsXG4gICAgICAnOnN2Zzp0ZXh0Q29udGVudF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgICAnOnN2Zzp0ZXh0UG9zaXRpb25pbmdeOnN2Zzp0ZXh0Q29udGVudHwnLFxuICAgICAgJ2FeW0hUTUxFbGVtZW50XXxjaGFyc2V0LGNvb3Jkcyxkb3dubG9hZCxoYXNoLGhvc3QsaG9zdG5hbWUsaHJlZixocmVmbGFuZyxuYW1lLHBhc3N3b3JkLHBhdGhuYW1lLHBpbmcscG9ydCxwcm90b2NvbCxyZWZlcnJlclBvbGljeSxyZWwscmV2LHNlYXJjaCxzaGFwZSx0YXJnZXQsdGV4dCx0eXBlLHVzZXJuYW1lJyxcbiAgICAgICdhcmVhXltIVE1MRWxlbWVudF18YWx0LGNvb3JkcyxoYXNoLGhvc3QsaG9zdG5hbWUsaHJlZiwhbm9IcmVmLHBhc3N3b3JkLHBhdGhuYW1lLHBpbmcscG9ydCxwcm90b2NvbCxyZWZlcnJlclBvbGljeSxzZWFyY2gsc2hhcGUsdGFyZ2V0LHVzZXJuYW1lJyxcbiAgICAgICdhdWRpb15tZWRpYXwnLFxuICAgICAgJ2JyXltIVE1MRWxlbWVudF18Y2xlYXInLFxuICAgICAgJ2Jhc2VeW0hUTUxFbGVtZW50XXxocmVmLHRhcmdldCcsXG4gICAgICAnYm9keV5bSFRNTEVsZW1lbnRdfGFMaW5rLGJhY2tncm91bmQsYmdDb2xvcixsaW5rLCpiZWZvcmV1bmxvYWQsKmJsdXIsKmVycm9yLCpmb2N1cywqaGFzaGNoYW5nZSwqbGFuZ3VhZ2VjaGFuZ2UsKmxvYWQsKm1lc3NhZ2UsKm9mZmxpbmUsKm9ubGluZSwqcGFnZWhpZGUsKnBhZ2VzaG93LCpwb3BzdGF0ZSwqcmVqZWN0aW9uaGFuZGxlZCwqcmVzaXplLCpzY3JvbGwsKnN0b3JhZ2UsKnVuaGFuZGxlZHJlamVjdGlvbiwqdW5sb2FkLHRleHQsdkxpbmsnLFxuICAgICAgJ2J1dHRvbl5bSFRNTEVsZW1lbnRdfCFhdXRvZm9jdXMsIWRpc2FibGVkLGZvcm1BY3Rpb24sZm9ybUVuY3R5cGUsZm9ybU1ldGhvZCwhZm9ybU5vVmFsaWRhdGUsZm9ybVRhcmdldCxuYW1lLHR5cGUsdmFsdWUnLFxuICAgICAgJ2NhbnZhc15bSFRNTEVsZW1lbnRdfCNoZWlnaHQsI3dpZHRoJyxcbiAgICAgICdjb250ZW50XltIVE1MRWxlbWVudF18c2VsZWN0JyxcbiAgICAgICdkbF5bSFRNTEVsZW1lbnRdfCFjb21wYWN0JyxcbiAgICAgICdkYXRhbGlzdF5bSFRNTEVsZW1lbnRdfCcsXG4gICAgICAnZGV0YWlsc15bSFRNTEVsZW1lbnRdfCFvcGVuJyxcbiAgICAgICdkaWFsb2deW0hUTUxFbGVtZW50XXwhb3BlbixyZXR1cm5WYWx1ZScsXG4gICAgICAnZGlyXltIVE1MRWxlbWVudF18IWNvbXBhY3QnLFxuICAgICAgJ2Rpdl5bSFRNTEVsZW1lbnRdfGFsaWduJyxcbiAgICAgICdlbWJlZF5bSFRNTEVsZW1lbnRdfGFsaWduLGhlaWdodCxuYW1lLHNyYyx0eXBlLHdpZHRoJyxcbiAgICAgICdmaWVsZHNldF5bSFRNTEVsZW1lbnRdfCFkaXNhYmxlZCxuYW1lJyxcbiAgICAgICdmb250XltIVE1MRWxlbWVudF18Y29sb3IsZmFjZSxzaXplJyxcbiAgICAgICdmb3JtXltIVE1MRWxlbWVudF18YWNjZXB0Q2hhcnNldCxhY3Rpb24sYXV0b2NvbXBsZXRlLGVuY29kaW5nLGVuY3R5cGUsbWV0aG9kLG5hbWUsIW5vVmFsaWRhdGUsdGFyZ2V0JyxcbiAgICAgICdmcmFtZV5bSFRNTEVsZW1lbnRdfGZyYW1lQm9yZGVyLGxvbmdEZXNjLG1hcmdpbkhlaWdodCxtYXJnaW5XaWR0aCxuYW1lLCFub1Jlc2l6ZSxzY3JvbGxpbmcsc3JjJyxcbiAgICAgICdmcmFtZXNldF5bSFRNTEVsZW1lbnRdfGNvbHMsKmJlZm9yZXVubG9hZCwqYmx1ciwqZXJyb3IsKmZvY3VzLCpoYXNoY2hhbmdlLCpsYW5ndWFnZWNoYW5nZSwqbG9hZCwqbWVzc2FnZSwqb2ZmbGluZSwqb25saW5lLCpwYWdlaGlkZSwqcGFnZXNob3csKnBvcHN0YXRlLCpyZWplY3Rpb25oYW5kbGVkLCpyZXNpemUsKnNjcm9sbCwqc3RvcmFnZSwqdW5oYW5kbGVkcmVqZWN0aW9uLCp1bmxvYWQscm93cycsXG4gICAgICAnaHJeW0hUTUxFbGVtZW50XXxhbGlnbixjb2xvciwhbm9TaGFkZSxzaXplLHdpZHRoJyxcbiAgICAgICdoZWFkXltIVE1MRWxlbWVudF18JyxcbiAgICAgICdoMSxoMixoMyxoNCxoNSxoNl5bSFRNTEVsZW1lbnRdfGFsaWduJyxcbiAgICAgICdodG1sXltIVE1MRWxlbWVudF18dmVyc2lvbicsXG4gICAgICAnaWZyYW1lXltIVE1MRWxlbWVudF18YWxpZ24sIWFsbG93RnVsbHNjcmVlbixmcmFtZUJvcmRlcixoZWlnaHQsbG9uZ0Rlc2MsbWFyZ2luSGVpZ2h0LG1hcmdpbldpZHRoLG5hbWUscmVmZXJyZXJQb2xpY3ksJXNhbmRib3gsc2Nyb2xsaW5nLHNyYyxzcmNkb2Msd2lkdGgnLFxuICAgICAgJ2ltZ15bSFRNTEVsZW1lbnRdfGFsaWduLGFsdCxib3JkZXIsJWNyb3NzT3JpZ2luLCNoZWlnaHQsI2hzcGFjZSwhaXNNYXAsbG9uZ0Rlc2MsbG93c3JjLG5hbWUscmVmZXJyZXJQb2xpY3ksc2l6ZXMsc3JjLHNyY3NldCx1c2VNYXAsI3ZzcGFjZSwjd2lkdGgnLFxuICAgICAgJ2lucHV0XltIVE1MRWxlbWVudF18YWNjZXB0LGFsaWduLGFsdCxhdXRvY2FwaXRhbGl6ZSxhdXRvY29tcGxldGUsIWF1dG9mb2N1cywhY2hlY2tlZCwhZGVmYXVsdENoZWNrZWQsZGVmYXVsdFZhbHVlLGRpck5hbWUsIWRpc2FibGVkLCVmaWxlcyxmb3JtQWN0aW9uLGZvcm1FbmN0eXBlLGZvcm1NZXRob2QsIWZvcm1Ob1ZhbGlkYXRlLGZvcm1UYXJnZXQsI2hlaWdodCwhaW5jcmVtZW50YWwsIWluZGV0ZXJtaW5hdGUsbWF4LCNtYXhMZW5ndGgsbWluLCNtaW5MZW5ndGgsIW11bHRpcGxlLG5hbWUscGF0dGVybixwbGFjZWhvbGRlciwhcmVhZE9ubHksIXJlcXVpcmVkLHNlbGVjdGlvbkRpcmVjdGlvbiwjc2VsZWN0aW9uRW5kLCNzZWxlY3Rpb25TdGFydCwjc2l6ZSxzcmMsc3RlcCx0eXBlLHVzZU1hcCx2YWx1ZSwldmFsdWVBc0RhdGUsI3ZhbHVlQXNOdW1iZXIsI3dpZHRoJyxcbiAgICAgICdrZXlnZW5eW0hUTUxFbGVtZW50XXwhYXV0b2ZvY3VzLGNoYWxsZW5nZSwhZGlzYWJsZWQsa2V5dHlwZSxuYW1lJyxcbiAgICAgICdsaV5bSFRNTEVsZW1lbnRdfHR5cGUsI3ZhbHVlJyxcbiAgICAgICdsYWJlbF5bSFRNTEVsZW1lbnRdfGh0bWxGb3InLFxuICAgICAgJ2xlZ2VuZF5bSFRNTEVsZW1lbnRdfGFsaWduJyxcbiAgICAgICdsaW5rXltIVE1MRWxlbWVudF18YXMsY2hhcnNldCwlY3Jvc3NPcmlnaW4sIWRpc2FibGVkLGhyZWYsaHJlZmxhbmcsaW50ZWdyaXR5LG1lZGlhLHJlbCwlcmVsTGlzdCxyZXYsJXNpemVzLHRhcmdldCx0eXBlJyxcbiAgICAgICdtYXBeW0hUTUxFbGVtZW50XXxuYW1lJyxcbiAgICAgICdtYXJxdWVlXltIVE1MRWxlbWVudF18YmVoYXZpb3IsYmdDb2xvcixkaXJlY3Rpb24saGVpZ2h0LCNoc3BhY2UsI2xvb3AsI3Njcm9sbEFtb3VudCwjc2Nyb2xsRGVsYXksIXRydWVTcGVlZCwjdnNwYWNlLHdpZHRoJyxcbiAgICAgICdtZW51XltIVE1MRWxlbWVudF18IWNvbXBhY3QnLFxuICAgICAgJ21ldGFeW0hUTUxFbGVtZW50XXxjb250ZW50LGh0dHBFcXVpdixuYW1lLHNjaGVtZScsXG4gICAgICAnbWV0ZXJeW0hUTUxFbGVtZW50XXwjaGlnaCwjbG93LCNtYXgsI21pbiwjb3B0aW11bSwjdmFsdWUnLFxuICAgICAgJ2lucyxkZWxeW0hUTUxFbGVtZW50XXxjaXRlLGRhdGVUaW1lJyxcbiAgICAgICdvbF5bSFRNTEVsZW1lbnRdfCFjb21wYWN0LCFyZXZlcnNlZCwjc3RhcnQsdHlwZScsXG4gICAgICAnb2JqZWN0XltIVE1MRWxlbWVudF18YWxpZ24sYXJjaGl2ZSxib3JkZXIsY29kZSxjb2RlQmFzZSxjb2RlVHlwZSxkYXRhLCFkZWNsYXJlLGhlaWdodCwjaHNwYWNlLG5hbWUsc3RhbmRieSx0eXBlLHVzZU1hcCwjdnNwYWNlLHdpZHRoJyxcbiAgICAgICdvcHRncm91cF5bSFRNTEVsZW1lbnRdfCFkaXNhYmxlZCxsYWJlbCcsXG4gICAgICAnb3B0aW9uXltIVE1MRWxlbWVudF18IWRlZmF1bHRTZWxlY3RlZCwhZGlzYWJsZWQsbGFiZWwsIXNlbGVjdGVkLHRleHQsdmFsdWUnLFxuICAgICAgJ291dHB1dF5bSFRNTEVsZW1lbnRdfGRlZmF1bHRWYWx1ZSwlaHRtbEZvcixuYW1lLHZhbHVlJyxcbiAgICAgICdwXltIVE1MRWxlbWVudF18YWxpZ24nLFxuICAgICAgJ3BhcmFtXltIVE1MRWxlbWVudF18bmFtZSx0eXBlLHZhbHVlLHZhbHVlVHlwZScsXG4gICAgICAncGljdHVyZV5bSFRNTEVsZW1lbnRdfCcsXG4gICAgICAncHJlXltIVE1MRWxlbWVudF18I3dpZHRoJyxcbiAgICAgICdwcm9ncmVzc15bSFRNTEVsZW1lbnRdfCNtYXgsI3ZhbHVlJyxcbiAgICAgICdxLGJsb2NrcXVvdGUsY2l0ZV5bSFRNTEVsZW1lbnRdfCcsXG4gICAgICAnc2NyaXB0XltIVE1MRWxlbWVudF18IWFzeW5jLGNoYXJzZXQsJWNyb3NzT3JpZ2luLCFkZWZlcixldmVudCxodG1sRm9yLGludGVncml0eSxzcmMsdGV4dCx0eXBlJyxcbiAgICAgICdzZWxlY3ReW0hUTUxFbGVtZW50XXwhYXV0b2ZvY3VzLCFkaXNhYmxlZCwjbGVuZ3RoLCFtdWx0aXBsZSxuYW1lLCFyZXF1aXJlZCwjc2VsZWN0ZWRJbmRleCwjc2l6ZSx2YWx1ZScsXG4gICAgICAnc2hhZG93XltIVE1MRWxlbWVudF18JyxcbiAgICAgICdzb3VyY2VeW0hUTUxFbGVtZW50XXxtZWRpYSxzaXplcyxzcmMsc3Jjc2V0LHR5cGUnLFxuICAgICAgJ3NwYW5eW0hUTUxFbGVtZW50XXwnLFxuICAgICAgJ3N0eWxlXltIVE1MRWxlbWVudF18IWRpc2FibGVkLG1lZGlhLHR5cGUnLFxuICAgICAgJ2NhcHRpb25eW0hUTUxFbGVtZW50XXxhbGlnbicsXG4gICAgICAndGgsdGReW0hUTUxFbGVtZW50XXxhYmJyLGFsaWduLGF4aXMsYmdDb2xvcixjaCxjaE9mZiwjY29sU3BhbixoZWFkZXJzLGhlaWdodCwhbm9XcmFwLCNyb3dTcGFuLHNjb3BlLHZBbGlnbix3aWR0aCcsXG4gICAgICAnY29sLGNvbGdyb3VwXltIVE1MRWxlbWVudF18YWxpZ24sY2gsY2hPZmYsI3NwYW4sdkFsaWduLHdpZHRoJyxcbiAgICAgICd0YWJsZV5bSFRNTEVsZW1lbnRdfGFsaWduLGJnQ29sb3IsYm9yZGVyLCVjYXB0aW9uLGNlbGxQYWRkaW5nLGNlbGxTcGFjaW5nLGZyYW1lLHJ1bGVzLHN1bW1hcnksJXRGb290LCV0SGVhZCx3aWR0aCcsXG4gICAgICAndHJeW0hUTUxFbGVtZW50XXxhbGlnbixiZ0NvbG9yLGNoLGNoT2ZmLHZBbGlnbicsXG4gICAgICAndGZvb3QsdGhlYWQsdGJvZHleW0hUTUxFbGVtZW50XXxhbGlnbixjaCxjaE9mZix2QWxpZ24nLFxuICAgICAgJ3RlbXBsYXRlXltIVE1MRWxlbWVudF18JyxcbiAgICAgICd0ZXh0YXJlYV5bSFRNTEVsZW1lbnRdfGF1dG9jYXBpdGFsaXplLCFhdXRvZm9jdXMsI2NvbHMsZGVmYXVsdFZhbHVlLGRpck5hbWUsIWRpc2FibGVkLCNtYXhMZW5ndGgsI21pbkxlbmd0aCxuYW1lLHBsYWNlaG9sZGVyLCFyZWFkT25seSwhcmVxdWlyZWQsI3Jvd3Msc2VsZWN0aW9uRGlyZWN0aW9uLCNzZWxlY3Rpb25FbmQsI3NlbGVjdGlvblN0YXJ0LHZhbHVlLHdyYXAnLFxuICAgICAgJ3RpdGxlXltIVE1MRWxlbWVudF18dGV4dCcsXG4gICAgICAndHJhY2teW0hUTUxFbGVtZW50XXwhZGVmYXVsdCxraW5kLGxhYmVsLHNyYyxzcmNsYW5nJyxcbiAgICAgICd1bF5bSFRNTEVsZW1lbnRdfCFjb21wYWN0LHR5cGUnLFxuICAgICAgJ3Vua25vd25eW0hUTUxFbGVtZW50XXwnLFxuICAgICAgJ3ZpZGVvXm1lZGlhfCNoZWlnaHQscG9zdGVyLCN3aWR0aCcsXG4gICAgICAnOnN2ZzphXjpzdmc6Z3JhcGhpY3N8JyxcbiAgICAgICc6c3ZnOmFuaW1hdGVeOnN2ZzphbmltYXRpb258JyxcbiAgICAgICc6c3ZnOmFuaW1hdGVNb3Rpb25eOnN2ZzphbmltYXRpb258JyxcbiAgICAgICc6c3ZnOmFuaW1hdGVUcmFuc2Zvcm1eOnN2ZzphbmltYXRpb258JyxcbiAgICAgICc6c3ZnOmNpcmNsZV46c3ZnOmdlb21ldHJ5fCcsXG4gICAgICAnOnN2ZzpjbGlwUGF0aF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgICAnOnN2ZzpjdXJzb3JeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmRlZnNeOnN2ZzpncmFwaGljc3wnLFxuICAgICAgJzpzdmc6ZGVzY146c3ZnOnwnLFxuICAgICAgJzpzdmc6ZGlzY2FyZF46c3ZnOnwnLFxuICAgICAgJzpzdmc6ZWxsaXBzZV46c3ZnOmdlb21ldHJ5fCcsXG4gICAgICAnOnN2ZzpmZUJsZW5kXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZUNvbG9yTWF0cml4Xjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZUNvbXBvbmVudFRyYW5zZmVyXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZUNvbXBvc2l0ZV46c3ZnOnwnLFxuICAgICAgJzpzdmc6ZmVDb252b2x2ZU1hdHJpeF46c3ZnOnwnLFxuICAgICAgJzpzdmc6ZmVEaWZmdXNlTGlnaHRpbmdeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlRGlzcGxhY2VtZW50TWFwXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZURpc3RhbnRMaWdodF46c3ZnOnwnLFxuICAgICAgJzpzdmc6ZmVEcm9wU2hhZG93Xjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZUZsb29kXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZUZ1bmNBXjpzdmc6Y29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbnwnLFxuICAgICAgJzpzdmc6ZmVGdW5jQl46c3ZnOmNvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb258JyxcbiAgICAgICc6c3ZnOmZlRnVuY0deOnN2Zzpjb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9ufCcsXG4gICAgICAnOnN2ZzpmZUZ1bmNSXjpzdmc6Y29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbnwnLFxuICAgICAgJzpzdmc6ZmVHYXVzc2lhbkJsdXJeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlSW1hZ2VeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlTWVyZ2VeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlTWVyZ2VOb2RlXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZU1vcnBob2xvZ3leOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlT2Zmc2V0Xjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmZVBvaW50TGlnaHReOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlU3BlY3VsYXJMaWdodGluZ146c3ZnOnwnLFxuICAgICAgJzpzdmc6ZmVTcG90TGlnaHReOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZlVGlsZV46c3ZnOnwnLFxuICAgICAgJzpzdmc6ZmVUdXJidWxlbmNlXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpmaWx0ZXJeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOmZvcmVpZ25PYmplY3ReOnN2ZzpncmFwaGljc3wnLFxuICAgICAgJzpzdmc6Z146c3ZnOmdyYXBoaWNzfCcsXG4gICAgICAnOnN2ZzppbWFnZV46c3ZnOmdyYXBoaWNzfCcsXG4gICAgICAnOnN2ZzpsaW5lXjpzdmc6Z2VvbWV0cnl8JyxcbiAgICAgICc6c3ZnOmxpbmVhckdyYWRpZW50Xjpzdmc6Z3JhZGllbnR8JyxcbiAgICAgICc6c3ZnOm1wYXRoXjpzdmc6fCcsXG4gICAgICAnOnN2ZzptYXJrZXJeOnN2Zzp8JyxcbiAgICAgICc6c3ZnOm1hc2teOnN2Zzp8JyxcbiAgICAgICc6c3ZnOm1ldGFkYXRhXjpzdmc6fCcsXG4gICAgICAnOnN2ZzpwYXRoXjpzdmc6Z2VvbWV0cnl8JyxcbiAgICAgICc6c3ZnOnBhdHRlcm5eOnN2Zzp8JyxcbiAgICAgICc6c3ZnOnBvbHlnb25eOnN2ZzpnZW9tZXRyeXwnLFxuICAgICAgJzpzdmc6cG9seWxpbmVeOnN2ZzpnZW9tZXRyeXwnLFxuICAgICAgJzpzdmc6cmFkaWFsR3JhZGllbnReOnN2ZzpncmFkaWVudHwnLFxuICAgICAgJzpzdmc6cmVjdF46c3ZnOmdlb21ldHJ5fCcsXG4gICAgICAnOnN2ZzpzdmdeOnN2ZzpncmFwaGljc3wjY3VycmVudFNjYWxlLCN6b29tQW5kUGFuJyxcbiAgICAgICc6c3ZnOnNjcmlwdF46c3ZnOnx0eXBlJyxcbiAgICAgICc6c3ZnOnNldF46c3ZnOmFuaW1hdGlvbnwnLFxuICAgICAgJzpzdmc6c3RvcF46c3ZnOnwnLFxuICAgICAgJzpzdmc6c3R5bGVeOnN2Zzp8IWRpc2FibGVkLG1lZGlhLHRpdGxlLHR5cGUnLFxuICAgICAgJzpzdmc6c3dpdGNoXjpzdmc6Z3JhcGhpY3N8JyxcbiAgICAgICc6c3ZnOnN5bWJvbF46c3ZnOnwnLFxuICAgICAgJzpzdmc6dHNwYW5eOnN2Zzp0ZXh0UG9zaXRpb25pbmd8JyxcbiAgICAgICc6c3ZnOnRleHReOnN2Zzp0ZXh0UG9zaXRpb25pbmd8JyxcbiAgICAgICc6c3ZnOnRleHRQYXRoXjpzdmc6dGV4dENvbnRlbnR8JyxcbiAgICAgICc6c3ZnOnRpdGxlXjpzdmc6fCcsXG4gICAgICAnOnN2Zzp1c2VeOnN2ZzpncmFwaGljc3wnLFxuICAgICAgJzpzdmc6dmlld146c3ZnOnwjem9vbUFuZFBhbicsXG4gICAgICAnZGF0YV5bSFRNTEVsZW1lbnRdfHZhbHVlJyxcbiAgICAgICdtZW51aXRlbV5bSFRNTEVsZW1lbnRdfHR5cGUsbGFiZWwsaWNvbiwhZGlzYWJsZWQsIWNoZWNrZWQscmFkaW9ncm91cCwhZGVmYXVsdCcsXG4gICAgICAnc3VtbWFyeV5bSFRNTEVsZW1lbnRdfCcsXG4gICAgICAndGltZV5bSFRNTEVsZW1lbnRdfGRhdGVUaW1lJyxcbiAgXTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0FUVFJfVE9fUFJPUCA9IHtcbiAgICAgICdjbGFzcyc6ICdjbGFzc05hbWUnLFxuICAgICAgJ2Zvcic6ICdodG1sRm9yJyxcbiAgICAgICdmb3JtYWN0aW9uJzogJ2Zvcm1BY3Rpb24nLFxuICAgICAgJ2lubmVySHRtbCc6ICdpbm5lckhUTUwnLFxuICAgICAgJ3JlYWRvbmx5JzogJ3JlYWRPbmx5JyxcbiAgICAgICd0YWJpbmRleCc6ICd0YWJJbmRleCcsXG4gIH07XG4gIHZhciBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDIwKERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuX3NjaGVtYSA9IHt9O1xuICAgICAgICAgIFNDSEVNQS5mb3JFYWNoKGZ1bmN0aW9uIChlbmNvZGVkVHlwZSkge1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IHt9O1xuICAgICAgICAgICAgICB2YXIgX2EgPSBlbmNvZGVkVHlwZS5zcGxpdCgnfCcpLCBzdHJUeXBlID0gX2FbMF0sIHN0clByb3BlcnRpZXMgPSBfYVsxXTtcbiAgICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBzdHJQcm9wZXJ0aWVzLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgIHZhciBfYiA9IHN0clR5cGUuc3BsaXQoJ14nKSwgdHlwZU5hbWVzID0gX2JbMF0sIHN1cGVyTmFtZSA9IF9iWzFdO1xuICAgICAgICAgICAgICB0eXBlTmFtZXMuc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIF90aGlzLl9zY2hlbWFbdGFnLnRvTG93ZXJDYXNlKCldID0gdHlwZTsgfSk7XG4gICAgICAgICAgICAgIHZhciBzdXBlclR5cGUgPSBzdXBlck5hbWUgJiYgX3RoaXMuX3NjaGVtYVtzdXBlck5hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgIGlmIChzdXBlclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN1cGVyVHlwZSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeyB0eXBlW3Byb3BdID0gc3VwZXJUeXBlW3Byb3BdOyB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHlbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB5ZXQgc3VwcG9ydCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBldmVyIGFsbG93aW5nIHRvIGJpbmQgdG8gZXZlbnRzLCBHTyBUSFJPVUdIIEEgU0VDVVJJVFkgUkVWSUVXLCBhbGxvd2luZyBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbW9zdCBjZXJ0YWlubHkgaW50cm9kdWNlIGJhZCBYU1MgdnVsbmVyYWJpbGl0aWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZVtwcm9wZXJ0eS5zdWJzdHJpbmcoMSldID0gRVZFTlQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlW3Byb3BlcnR5LnN1YnN0cmluZygxKV0gPSBCT09MRUFOO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVtwcm9wZXJ0eS5zdWJzdHJpbmcoMSldID0gTlVNQkVSO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVtwcm9wZXJ0eS5zdWJzdHJpbmcoMSldID0gT0JKRUNUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlW3Byb3BlcnR5XSA9IFNUUklORztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRhZ05hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gc2NoZW1hTWV0YXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuaGFzUHJvcGVydHkgPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcE5hbWUsIHNjaGVtYU1ldGFzKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYU1ldGFzLnNvbWUoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hLm5hbWUgPT09IF9hbmd1bGFyX2NvcmUuTk9fRVJST1JTX1NDSEVNQS5uYW1lOyB9KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT09ICduZy1jb250YWluZXInIHx8IHRhZ05hbWUgPT09ICduZy1jb250ZW50Jykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBfYW5ndWxhcl9jb3JlLkNVU1RPTV9FTEVNRU5UU19TQ0hFTUEubmFtZTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENhbid0IHRlbGwgbm93IGFzIHdlIGRvbid0IGtub3cgd2hpY2ggcHJvcGVydGllcyBhIGN1c3RvbSBlbGVtZW50IHdpbGwgZ2V0XG4gICAgICAgICAgICAgICAgICAvLyBvbmNlIGl0IGlzIGluc3RhbnRpYXRlZFxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudFByb3BlcnRpZXMgPSB0aGlzLl9zY2hlbWFbdGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCB0aGlzLl9zY2hlbWFbJ3Vua25vd24nXTtcbiAgICAgICAgICByZXR1cm4gISFlbGVtZW50UHJvcGVydGllc1twcm9wTmFtZV07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRhZ05hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gc2NoZW1hTWV0YXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuaGFzRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lLCBzY2hlbWFNZXRhcykge1xuICAgICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBfYW5ndWxhcl9jb3JlLk5PX0VSUk9SU19TQ0hFTUEubmFtZTsgfSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGlmICh0YWdOYW1lID09PSAnbmctY29udGFpbmVyJyB8fCB0YWdOYW1lID09PSAnbmctY29udGVudCcpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBfYW5ndWxhcl9jb3JlLkNVU1RPTV9FTEVNRU5UU19TQ0hFTUEubmFtZTsgfSkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGFueSBjdXN0b20gZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAhIXRoaXMuX3NjaGVtYVt0YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIHNlY3VyaXR5Q29udGV4dCByZXR1cm5zIHRoZSBzZWN1cml0eSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgb24gdGhlIGdpdmVuIERPTSB0YWcuXG4gICAgICAgICogKlxuICAgICAgICAqIFRhZyBhbmQgcHJvcGVydHkgbmFtZSBhcmUgc3RhdGljYWxseSBrbm93biBhbmQgY2Fubm90IGNoYW5nZSBhdCBydW50aW1lLCBpLmUuIGl0IGlzIG5vdFxuICAgICAgICAqIHBvc3NpYmxlIHRvIGJpbmQgYSB2YWx1ZSBpbnRvIGEgY2hhbmdpbmcgYXR0cmlidXRlIG9yIHRhZyBuYW1lLlxuICAgICAgICAqICpcbiAgICAgICAgKiBUaGUgZmlsdGVyaW5nIGlzIHdoaXRlIGxpc3QgYmFzZWQuIEFsbCBhdHRyaWJ1dGVzIGluIHRoZSBzY2hlbWEgYWJvdmUgYXJlIGFzc3VtZWQgdG8gaGF2ZSB0aGVcbiAgICAgICAgKiAnTk9ORScgc2VjdXJpdHkgY29udGV4dCwgaS5lLiB0aGF0IHRoZXkgYXJlIHNhZmUgaW5lcnQgc3RyaW5nIHZhbHVlcy4gT25seSBzcGVjaWZpYyB3ZWxsIGtub3duXG4gICAgICAgICogYXR0YWNrIHZlY3RvcnMgYXJlIGFzc2lnbmVkIHRoZWlyIGFwcHJvcHJpYXRlIGNvbnRleHQuXG4gICAgICAgKiBAcGFyYW0gez99IHRhZ05hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gaXNBdHRyaWJ1dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuc2VjdXJpdHlDb250ZXh0ID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BOYW1lLCBpc0F0dHJpYnV0ZSkge1xuICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAvLyBOQjogRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCB1c2UgdGhlIG1hcHBlZCBwcm9wZXJ0eSBuYW1lLCBub3QgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAgICAgICAgICBwcm9wTmFtZSA9IHRoaXMuZ2V0TWFwcGVkUHJvcE5hbWUocHJvcE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNYWtlIHN1cmUgY29tcGFyaXNvbnMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIHNvIHRoYXQgY2FzZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGF0dHJpYnV0ZSBhbmRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBuYW1lcyBkbyBub3QgaGF2ZSBhIHNlY3VyaXR5IGltcGFjdC5cbiAgICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHByb3BOYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHggPSBTRUNVUklUWV9TQ0hFTUFbdGFnTmFtZSArICd8JyArIHByb3BOYW1lXTtcbiAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eCA9IFNFQ1VSSVRZX1NDSEVNQVsnKnwnICsgcHJvcE5hbWVdO1xuICAgICAgICAgIHJldHVybiBjdHggPyBjdHggOiBfYW5ndWxhcl9jb3JlLlNlY3VyaXR5Q29udGV4dC5OT05FO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRNYXBwZWRQcm9wTmFtZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSkgeyByZXR1cm4gX0FUVFJfVE9fUFJPUFtwcm9wTmFtZV0gfHwgcHJvcE5hbWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXBvbmVudEVsZW1lbnROYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ25nLWNvbXBvbmVudCc7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS52YWxpZGF0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbXNnID0gKFwiQmluZGluZyB0byBldmVudCBwcm9wZXJ0eSAnXCIgKyBuYW1lICsgXCInIGlzIGRpc2FsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIFwiKSArXG4gICAgICAgICAgICAgICAgICAoXCJwbGVhc2UgdXNlIChcIiArIG5hbWUuc2xpY2UoMikgKyBcIik9Li4uXCIpICtcbiAgICAgICAgICAgICAgICAgIChcIlxcbklmICdcIiArIG5hbWUgKyBcIicgaXMgYSBkaXJlY3RpdmUgaW5wdXQsIG1ha2Ugc3VyZSB0aGUgZGlyZWN0aXZlIGlzIGltcG9ydGVkIGJ5IHRoZVwiKSArXG4gICAgICAgICAgICAgICAgICBcIiBjdXJyZW50IG1vZHVsZS5cIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1zZzogbXNnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUudmFsaWRhdGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb24nKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtc2cgPSAoXCJCaW5kaW5nIHRvIGV2ZW50IGF0dHJpYnV0ZSAnXCIgKyBuYW1lICsgXCInIGlzIGRpc2FsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIFwiKSArXG4gICAgICAgICAgICAgICAgICAoXCJwbGVhc2UgdXNlIChcIiArIG5hbWUuc2xpY2UoMikgKyBcIik9Li4uXCIpO1xuICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbXNnOiBtc2cgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSB9O1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuYWxsS25vd25FbGVtZW50TmFtZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zY2hlbWEpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkucHJvdG90eXBlLm5vcm1hbGl6ZUFuaW1hdGlvblN0eWxlUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gZGFzaENhc2VUb0NhbWVsQ2FzZShwcm9wTmFtZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNhbWVsQ2FzZVByb3BcbiAgICAgICAqIEBwYXJhbSB7P30gdXNlclByb3ZpZGVkUHJvcFxuICAgICAgICogQHBhcmFtIHs/fSB2YWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUubm9ybWFsaXplQW5pbWF0aW9uU3R5bGVWYWx1ZSA9IGZ1bmN0aW9uIChjYW1lbENhc2VQcm9wLCB1c2VyUHJvdmlkZWRQcm9wLCB2YWwpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bml0ID0gJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RyVmFsID0gdmFsLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9yTXNnID0gbnVsbDtcbiAgICAgICAgICBpZiAoX2lzUGl4ZWxEaW1lbnNpb25TdHlsZShjYW1lbENhc2VQcm9wKSAmJiB2YWwgIT09IDAgJiYgdmFsICE9PSAnMCcpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbEFuZFN1ZmZpeE1hdGNoID0gdmFsLm1hdGNoKC9eWystXT9bXFxkXFwuXSsoW2Etel0qKSQvKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWxBbmRTdWZmaXhNYXRjaCAmJiB2YWxBbmRTdWZmaXhNYXRjaFsxXS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnID0gXCJQbGVhc2UgcHJvdmlkZSBhIENTUyB1bml0IHZhbHVlIGZvciBcIiArIHVzZXJQcm92aWRlZFByb3AgKyBcIjpcIiArIHZhbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBlcnJvcjogZXJyb3JNc2csIHZhbHVlOiBzdHJWYWwgKyB1bml0IH07XG4gICAgICB9O1xuICAgICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5ID0gX19kZWNvcmF0ZSQxNChbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTQoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW10pXG4gICAgICBdLCBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkpO1xuICAgICAgcmV0dXJuIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeTtcbiAgfShFbGVtZW50U2NoZW1hUmVnaXN0cnkpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcHJvcFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzUGl4ZWxEaW1lbnNpb25TdHlsZShwcm9wKSB7XG4gICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICBjYXNlICd3aWR0aCc6XG4gICAgICAgICAgY2FzZSAnaGVpZ2h0JzpcbiAgICAgICAgICBjYXNlICdtaW5XaWR0aCc6XG4gICAgICAgICAgY2FzZSAnbWluSGVpZ2h0JzpcbiAgICAgICAgICBjYXNlICdtYXhXaWR0aCc6XG4gICAgICAgICAgY2FzZSAnbWF4SGVpZ2h0JzpcbiAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ2ZvbnRTaXplJzpcbiAgICAgICAgICBjYXNlICdvdXRsaW5lV2lkdGgnOlxuICAgICAgICAgIGNhc2UgJ291dGxpbmVPZmZzZXQnOlxuICAgICAgICAgIGNhc2UgJ3BhZGRpbmdUb3AnOlxuICAgICAgICAgIGNhc2UgJ3BhZGRpbmdMZWZ0JzpcbiAgICAgICAgICBjYXNlICdwYWRkaW5nQm90dG9tJzpcbiAgICAgICAgICBjYXNlICdwYWRkaW5nUmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ21hcmdpblRvcCc6XG4gICAgICAgICAgY2FzZSAnbWFyZ2luTGVmdCc6XG4gICAgICAgICAgY2FzZSAnbWFyZ2luQm90dG9tJzpcbiAgICAgICAgICBjYXNlICdtYXJnaW5SaWdodCc6XG4gICAgICAgICAgY2FzZSAnYm9yZGVyUmFkaXVzJzpcbiAgICAgICAgICBjYXNlICdib3JkZXJXaWR0aCc6XG4gICAgICAgICAgY2FzZSAnYm9yZGVyVG9wV2lkdGgnOlxuICAgICAgICAgIGNhc2UgJ2JvcmRlckxlZnRXaWR0aCc6XG4gICAgICAgICAgY2FzZSAnYm9yZGVyUmlnaHRXaWR0aCc6XG4gICAgICAgICAgY2FzZSAnYm9yZGVyQm90dG9tV2lkdGgnOlxuICAgICAgICAgIGNhc2UgJ3RleHRJbmRlbnQnOlxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIC8qKlxuICAgKiBUaGlzIGZpbGUgaXMgYSBwb3J0IG9mIHNoYWRvd0NTUyBmcm9tIHdlYmNvbXBvbmVudHMuanMgdG8gVHlwZVNjcmlwdC5cbiAgICpcbiAgICogUGxlYXNlIG1ha2Ugc3VyZSB0byBrZWVwIHRvIGVkaXRzIGluIHN5bmMgd2l0aCB0aGUgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIFNvdXJjZTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvd2ViY29tcG9uZW50c2pzL2Jsb2IvNGVmZWNkN2UwZS9zcmMvU2hhZG93Q1NTL1NoYWRvd0NTUy5qc1xuICAgKlxuICAgKiBUaGUgb3JpZ2luYWwgZmlsZSBsZXZlbCBjb21tZW50IGlzIHJlcHJvZHVjZWQgYmVsb3dcbiAgICovXG4gIC8qXG4gICAgVGhpcyBpcyBhIGxpbWl0ZWQgc2hpbSBmb3IgU2hhZG93RE9NIGNzcyBzdHlsaW5nLlxuICAgIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvd2ViY29tcG9uZW50cy9yYXctZmlsZS90aXAvc3BlYy9zaGFkb3cvaW5kZXguaHRtbCNzdHlsZXNcblxuICAgIFRoZSBpbnRlbnRpb24gaGVyZSBpcyB0byBzdXBwb3J0IG9ubHkgdGhlIHN0eWxpbmcgZmVhdHVyZXMgd2hpY2ggY2FuIGJlXG4gICAgcmVsYXRpdmVseSBzaW1wbHkgaW1wbGVtZW50ZWQuIFRoZSBnb2FsIGlzIHRvIGFsbG93IHVzZXJzIHRvIGF2b2lkIHRoZVxuICAgIG1vc3Qgb2J2aW91cyBwaXRmYWxscyBhbmQgZG8gc28gd2l0aG91dCBjb21wcm9taXNpbmcgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS5cbiAgICBGb3IgU2hhZG93RE9NIHN0eWxpbmcgdGhhdCdzIG5vdCBjb3ZlcmVkIGhlcmUsIGEgc2V0IG9mIGJlc3QgcHJhY3RpY2VzXG4gICAgY2FuIGJlIHByb3ZpZGVkIHRoYXQgc2hvdWxkIGFsbG93IHVzZXJzIHRvIGFjY29tcGxpc2ggbW9yZSBjb21wbGV4IHN0eWxpbmcuXG5cbiAgICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzcGVjaWZpYyBTaGFkb3dET00gc3R5bGluZyBmZWF0dXJlcyBhbmQgYSBicmllZlxuICAgIGRpc2N1c3Npb24gb2YgdGhlIGFwcHJvYWNoIHVzZWQgdG8gc2hpbS5cblxuICAgIFNoaW1tZWQgZmVhdHVyZXM6XG5cbiAgICAqIDpob3N0LCA6aG9zdC1jb250ZXh0OiBTaGFkb3dET00gYWxsb3dzIHN0eWxpbmcgb2YgdGhlIHNoYWRvd1Jvb3QncyBob3N0XG4gICAgZWxlbWVudCB1c2luZyB0aGUgOmhvc3QgcnVsZS4gVG8gc2hpbSB0aGlzIGZlYXR1cmUsIHRoZSA6aG9zdCBzdHlsZXMgYXJlXG4gICAgcmVmb3JtYXR0ZWQgYW5kIHByZWZpeGVkIHdpdGggYSBnaXZlbiBzY29wZSBuYW1lIGFuZCBwcm9tb3RlZCB0byBhXG4gICAgZG9jdW1lbnQgbGV2ZWwgc3R5bGVzaGVldC5cbiAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBzY29wZSBuYW1lIG9mIC5mb28sIGEgcnVsZSBsaWtlIHRoaXM6XG5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGJlY29tZXM6XG5cbiAgICAgIC5mb28ge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG5cbiAgICAqIGVuY2Fwc3VsYXRpb246IFN0eWxlcyBkZWZpbmVkIHdpdGhpbiBTaGFkb3dET00sIGFwcGx5IG9ubHkgdG9cbiAgICBkb20gaW5zaWRlIHRoZSBTaGFkb3dET00uIFBvbHltZXIgdXNlcyBvbmUgb2YgdHdvIHRlY2huaXF1ZXMgdG8gaW1wbGVtZW50XG4gICAgdGhpcyBmZWF0dXJlLlxuXG4gICAgQnkgZGVmYXVsdCwgcnVsZXMgYXJlIHByZWZpeGVkIHdpdGggdGhlIGhvc3QgZWxlbWVudCB0YWcgbmFtZVxuICAgIGFzIGEgZGVzY2VuZGFudCBzZWxlY3Rvci4gVGhpcyBlbnN1cmVzIHN0eWxpbmcgZG9lcyBub3QgbGVhayBvdXQgb2YgdGhlICd0b3AnXG4gICAgb2YgdGhlIGVsZW1lbnQncyBTaGFkb3dET00uIEZvciBleGFtcGxlLFxuXG4gICAgZGl2IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICBiZWNvbWVzOlxuXG4gICAgeC1mb28gZGl2IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICBiZWNvbWVzOlxuXG5cbiAgICBBbHRlcm5hdGl2ZWx5LCBpZiBXZWJDb21wb25lbnRzLlNoYWRvd0NTUy5zdHJpY3RTdHlsaW5nIGlzIHNldCB0byB0cnVlIHRoZW5cbiAgICBzZWxlY3RvcnMgYXJlIHNjb3BlZCBieSBhZGRpbmcgYW4gYXR0cmlidXRlIHNlbGVjdG9yIHN1ZmZpeCB0byBlYWNoXG4gICAgc2ltcGxlIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdGhlIGhvc3QgZWxlbWVudCB0YWcgbmFtZS4gRWFjaCBlbGVtZW50XG4gICAgaW4gdGhlIGVsZW1lbnQncyBTaGFkb3dET00gdGVtcGxhdGUgaXMgYWxzbyBnaXZlbiB0aGUgc2NvcGUgYXR0cmlidXRlLlxuICAgIFRodXMsIHRoZXNlIHJ1bGVzIG1hdGNoIG9ubHkgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBzY29wZSBhdHRyaWJ1dGUuXG4gICAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2NvcGUgbmFtZSBvZiB4LWZvbywgYSBydWxlIGxpa2UgdGhpczpcblxuICAgICAgZGl2IHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICBiZWNvbWVzOlxuXG4gICAgICBkaXZbeC1mb29dIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICB9XG5cbiAgICBOb3RlIHRoYXQgZWxlbWVudHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgYWRkZWQgdG8gYSBzY29wZSBtdXN0IGhhdmUgdGhlIHNjb3BlXG4gICAgc2VsZWN0b3IgYWRkZWQgdG8gdGhlbSBtYW51YWxseS5cblxuICAgICogdXBwZXIvbG93ZXIgYm91bmQgZW5jYXBzdWxhdGlvbjogU3R5bGVzIHdoaWNoIGFyZSBkZWZpbmVkIG91dHNpZGUgYVxuICAgIHNoYWRvd1Jvb3Qgc2hvdWxkIG5vdCBjcm9zcyB0aGUgU2hhZG93RE9NIGJvdW5kYXJ5IGFuZCBzaG91bGQgbm90IGFwcGx5XG4gICAgaW5zaWRlIGEgc2hhZG93Um9vdC5cblxuICAgIFRoaXMgc3R5bGluZyBiZWhhdmlvciBpcyBub3QgZW11bGF0ZWQuIFNvbWUgcG9zc2libGUgd2F5cyB0byBkbyB0aGlzIHRoYXRcbiAgICB3ZXJlIHJlamVjdGVkIGR1ZSB0byBjb21wbGV4aXR5IGFuZC9vciBwZXJmb3JtYW5jZSBjb25jZXJucyBpbmNsdWRlOiAoMSkgcmVzZXRcbiAgICBldmVyeSBwb3NzaWJsZSBwcm9wZXJ0eSBmb3IgZXZlcnkgcG9zc2libGUgc2VsZWN0b3IgZm9yIGEgZ2l2ZW4gc2NvcGUgbmFtZTtcbiAgICAoMikgcmUtaW1wbGVtZW50IGNzcyBpbiBqYXZhc2NyaXB0LlxuXG4gICAgQXMgYW4gYWx0ZXJuYXRpdmUsIHVzZXJzIHNob3VsZCBtYWtlIHN1cmUgdG8gdXNlIHNlbGVjdG9yc1xuICAgIHNwZWNpZmljIHRvIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSB3b3JraW5nLlxuXG4gICAgKiA6OmRpc3RyaWJ1dGVkOiBUaGlzIGJlaGF2aW9yIGlzIG5vdCBlbXVsYXRlZC4gSXQncyBvZnRlbiBub3QgbmVjZXNzYXJ5XG4gICAgdG8gc3R5bGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgaW5zZXJ0aW9uIHBvaW50IGFuZCBpbnN0ZWFkLCBkZXNjZW5kYW50c1xuICAgIG9mIHRoZSBob3N0IGVsZW1lbnQgY2FuIGJlIHN0eWxlZCBzZWxlY3RpdmVseS4gVXNlcnMgY2FuIGFsc28gY3JlYXRlIGFuXG4gICAgZXh0cmEgbm9kZSBhcm91bmQgYW4gaW5zZXJ0aW9uIHBvaW50IGFuZCBzdHlsZSB0aGF0IG5vZGUncyBjb250ZW50c1xuICAgIHZpYSBkZXNjZW5kZW50IHNlbGVjdG9ycy4gRm9yIGV4YW1wbGUsIHdpdGggYSBzaGFkb3dSb290IGxpa2UgdGhpczpcblxuICAgICAgPHN0eWxlPlxuICAgICAgICA6OmNvbnRlbnQoZGl2KSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogcmVkO1xuICAgICAgICB9XG4gICAgICA8L3N0eWxlPlxuICAgICAgPGNvbnRlbnQ+PC9jb250ZW50PlxuXG4gICAgY291bGQgYmVjb21lOlxuXG4gICAgICA8c3R5bGU+XG4gICAgICAgIC8gKkBwb2x5ZmlsbCAuY29udGVudC1jb250YWluZXIgZGl2ICogL1xuICAgICAgICA6OmNvbnRlbnQoZGl2KSB7XG4gICAgICAgICAgYmFja2dyb3VuZDogcmVkO1xuICAgICAgICB9XG4gICAgICA8L3N0eWxlPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY29udGFpbmVyXCI+XG4gICAgICAgIDxjb250ZW50PjwvY29udGVudD5cbiAgICAgIDwvZGl2PlxuXG4gICAgTm90ZSB0aGUgdXNlIG9mIEBwb2x5ZmlsbCBpbiB0aGUgY29tbWVudCBhYm92ZSBhIFNoYWRvd0RPTSBzcGVjaWZpYyBzdHlsZVxuICAgIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBzdHlsaW5nIHNoaW0gdG8gdXNlIHRoZSBzZWxlY3RvclxuICAgIGluIGNvbW1lbnRzIGluIGxpZXUgb2YgdGhlIG5leHQgc2VsZWN0b3Igd2hlbiBydW5uaW5nIHVuZGVyIHBvbHlmaWxsLlxuICAqL1xuICB2YXIgU2hhZG93Q3NzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFNoYWRvd0NzcygpIHtcbiAgICAgICAgICB0aGlzLnN0cmljdFN0eWxpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNzc1RleHRcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7Pz19IGhvc3RTZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhZG93Q3NzLnByb3RvdHlwZS5zaGltQ3NzVGV4dCA9IGZ1bmN0aW9uIChjc3NUZXh0LCBzZWxlY3RvciwgaG9zdFNlbGVjdG9yKSB7XG4gICAgICAgICAgaWYgKGhvc3RTZWxlY3RvciA9PT0gdm9pZCAwKSB7IGhvc3RTZWxlY3RvciA9ICcnOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlTWFwcGluZ1VybCA9IGV4dHJhY3RTb3VyY2VNYXBwaW5nVXJsKGNzc1RleHQpO1xuICAgICAgICAgIGNzc1RleHQgPSBzdHJpcENvbW1lbnRzKGNzc1RleHQpO1xuICAgICAgICAgIGNzc1RleHQgPSB0aGlzLl9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zY29wZUNzc1RleHQoY3NzVGV4dCwgc2VsZWN0b3IsIGhvc3RTZWxlY3RvcikgKyBzb3VyY2VNYXBwaW5nVXJsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9pbnNlcnREaXJlY3RpdmVzID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5faW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0KGNzc1RleHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0KGNzc1RleHQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9pbnNlcnRQb2x5ZmlsbERpcmVjdGl2ZXNJbkNzc1RleHQgPSBmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICAgICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKF9jc3NDb250ZW50TmV4dFNlbGVjdG9yUmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIG0gPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgIG1bX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG1bMl0gKyAneyc7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNzc1RleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2luc2VydFBvbHlmaWxsUnVsZXNJbkNzc1RleHQgPSBmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICAgICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKF9jc3NDb250ZW50UnVsZVJlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICBtW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJ1bGUgPSBtWzBdLnJlcGxhY2UobVsxXSwgJycpLnJlcGxhY2UobVsyXSwgJycpO1xuICAgICAgICAgICAgICByZXR1cm4gbVs0XSArIHJ1bGU7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNzc1RleHRcbiAgICAgICAqIEBwYXJhbSB7P30gc2NvcGVTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBob3N0U2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX3Njb3BlQ3NzVGV4dCA9IGZ1bmN0aW9uIChjc3NUZXh0LCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1bnNjb3BlZFJ1bGVzID0gdGhpcy5fZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0KTtcbiAgICAgICAgICAvLyByZXBsYWNlIDpob3N0IGFuZCA6aG9zdC1jb250ZXh0IC1zaGFkb3djc3Nob3N0IGFuZCAtc2hhZG93Y3NzaG9zdCByZXNwZWN0aXZlbHlcbiAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0KGNzc1RleHQpO1xuICAgICAgICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0KGNzc1RleHQpO1xuICAgICAgICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0Q29udGV4dChjc3NUZXh0KTtcbiAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyhjc3NUZXh0KTtcbiAgICAgICAgICBpZiAoc2NvcGVTZWxlY3Rvcikge1xuICAgICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fc2NvcGVTZWxlY3RvcnMoY3NzVGV4dCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3NzVGV4dCA9IGNzc1RleHQgKyAnXFxuJyArIHVuc2NvcGVkUnVsZXM7XG4gICAgICAgICAgcmV0dXJuIGNzc1RleHQudHJpbSgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9leHRyYWN0VW5zY29wZWRSdWxlc0Zyb21Dc3NUZXh0ID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICAvLyBEaWZmZXJlbmNlIHdpdGggd2ViY29tcG9uZW50cy5qczogZG9lcyBub3QgaGFuZGxlIGNvbW1lbnRzXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gciA9ICcnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG07XG4gICAgICAgICAgX2Nzc0NvbnRlbnRVbnNjb3BlZFJ1bGVSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobSA9IF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUuZXhlYyhjc3NUZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcnVsZSA9IG1bMF0ucmVwbGFjZShtWzJdLCAnJykucmVwbGFjZShtWzFdLCBtWzRdKTtcbiAgICAgICAgICAgICAgciArPSBydWxlICsgJ1xcblxcbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb252ZXJ0Q29sb25Ib3N0ID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydENvbG9uUnVsZShjc3NUZXh0LCBfY3NzQ29sb25Ib3N0UmUsIHRoaXMuX2NvbG9uSG9zdFBhcnRSZXBsYWNlcik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNzc1RleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0ID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydENvbG9uUnVsZShjc3NUZXh0LCBfY3NzQ29sb25Ib3N0Q29udGV4dFJlLCB0aGlzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3NzVGV4dFxuICAgICAgICogQHBhcmFtIHs/fSByZWdFeHBcbiAgICAgICAqIEBwYXJhbSB7P30gcGFydFJlcGxhY2VyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb252ZXJ0Q29sb25SdWxlID0gZnVuY3Rpb24gKGNzc1RleHQsIHJlZ0V4cCwgcGFydFJlcGxhY2VyKSB7XG4gICAgICAgICAgLy8gbVsxXSA9IDpob3N0KC1jb250ZXh0KSwgbVsyXSA9IGNvbnRlbnRzIG9mICgpLCBtWzNdIHJlc3Qgb2YgcnVsZVxuICAgICAgICAgIHJldHVybiBjc3NUZXh0LnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICBtW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtWzJdKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IG1bMl0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHIgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHAgPSBwYXJ0c1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICByLnB1c2gocGFydFJlcGxhY2VyKF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IsIHAsIG1bM10pKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByLmpvaW4oJywnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yICsgbVszXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3VmZml4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyID0gZnVuY3Rpb24gKGhvc3QsIHBhcnQsIHN1ZmZpeCkge1xuICAgICAgICAgIGlmIChwYXJ0LmluZGV4T2YoX3BvbHlmaWxsSG9zdCkgPiAtMSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKGhvc3QsIHBhcnQsIHN1ZmZpeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaG9zdCArIHBhcnQgKyBzdWZmaXggKyAnLCAnICsgcGFydCArICcgJyArIGhvc3QgKyBzdWZmaXg7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3VmZml4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIgPSBmdW5jdGlvbiAoaG9zdCwgcGFydCwgc3VmZml4KSB7XG4gICAgICAgICAgcmV0dXJuIGhvc3QgKyBwYXJ0LnJlcGxhY2UoX3BvbHlmaWxsSG9zdCwgJycpICsgc3VmZml4O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjc3NUZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb252ZXJ0U2hhZG93RE9NU2VsZWN0b3JzID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICByZXR1cm4gX3NoYWRvd0RPTVNlbGVjdG9yc1JlLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBwYXR0ZXJuKSB7IHJldHVybiByZXN1bHQucmVwbGFjZShwYXR0ZXJuLCAnICcpOyB9LCBjc3NUZXh0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3NzVGV4dFxuICAgICAgICogQHBhcmFtIHs/fSBzY29wZVNlbGVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RTZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fc2NvcGVTZWxlY3RvcnMgPSBmdW5jdGlvbiAoY3NzVGV4dCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc1J1bGVzKGNzc1RleHQsIGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdG9yID0gcnVsZS5zZWxlY3RvcjtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGVudCA9IHJ1bGUuY29udGVudDtcbiAgICAgICAgICAgICAgaWYgKHJ1bGUuc2VsZWN0b3JbMF0gIT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RvciA9XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3Njb3BlU2VsZWN0b3IocnVsZS5zZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yLCBfdGhpcy5zdHJpY3RTdHlsaW5nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0BtZWRpYScpIHx8IHJ1bGUuc2VsZWN0b3Iuc3RhcnRzV2l0aCgnQHN1cHBvcnRzJykgfHxcbiAgICAgICAgICAgICAgICAgIHJ1bGUuc2VsZWN0b3Iuc3RhcnRzV2l0aCgnQHBhZ2UnKSB8fCBydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0Bkb2N1bWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50ID0gX3RoaXMuX3Njb3BlU2VsZWN0b3JzKHJ1bGUuY29udGVudCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbmV3IENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBzY29wZVNlbGVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBzdHJpY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX3Njb3BlU2VsZWN0b3IgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvciwgc3RyaWN0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gc2VsZWN0b3Iuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChwYXJ0KSB7IHJldHVybiBwYXJ0LnRyaW0oKS5zcGxpdChfc2hhZG93RGVlcFNlbGVjdG9ycyk7IH0pXG4gICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGRlZXBQYXJ0cykge1xuICAgICAgICAgICAgICB2YXIgc2hhbGxvd1BhcnQgPSBkZWVwUGFydHNbMF0sIG90aGVyUGFydHMgPSBkZWVwUGFydHMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFwcGx5U2NvcGUgPSBmdW5jdGlvbiAoc2hhbGxvd1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fc2VsZWN0b3JOZWVkc1Njb3Bpbmcoc2hhbGxvd1BhcnQsIHNjb3BlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmljdCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9hcHBseVN0cmljdFNlbGVjdG9yU2NvcGUoc2hhbGxvd1BhcnQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3RvcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYXBwbHlTZWxlY3RvclNjb3BlKHNoYWxsb3dQYXJ0LCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNoYWxsb3dQYXJ0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gW2FwcGx5U2NvcGUoc2hhbGxvd1BhcnQpXS5jb25jYXQob3RoZXJQYXJ0cykuam9pbignICcpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBzY29wZVNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9zZWxlY3Rvck5lZWRzU2NvcGluZyA9IGZ1bmN0aW9uIChzZWxlY3Rvciwgc2NvcGVTZWxlY3Rvcikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlID0gdGhpcy5fbWFrZVNjb3BlTWF0Y2hlcihzY29wZVNlbGVjdG9yKTtcbiAgICAgICAgICByZXR1cm4gIXJlLnRlc3Qoc2VsZWN0b3IpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzY29wZVNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9tYWtlU2NvcGVNYXRjaGVyID0gZnVuY3Rpb24gKHNjb3BlU2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBscmUgPSAvXFxbL2c7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcnJlID0gL1xcXS9nO1xuICAgICAgICAgIHNjb3BlU2VsZWN0b3IgPSBzY29wZVNlbGVjdG9yLnJlcGxhY2UobHJlLCAnXFxcXFsnKS5yZXBsYWNlKHJyZSwgJ1xcXFxdJyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoJ14oJyArIHNjb3BlU2VsZWN0b3IgKyAnKScgKyBfc2VsZWN0b3JSZVN1ZmZpeCwgJ20nKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gc2NvcGVTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBob3N0U2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2FwcGx5U2VsZWN0b3JTY29wZSA9IGZ1bmN0aW9uIChzZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKSB7XG4gICAgICAgICAgLy8gRGlmZmVyZW5jZSBmcm9tIHdlYmNvbXBvbmVudHMuanM6IHNjb3BlU2VsZWN0b3IgY291bGQgbm90IGJlIGFuIGFycmF5XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5U2ltcGxlU2VsZWN0b3JTY29wZShzZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gc2NvcGVTZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBob3N0U2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2FwcGx5U2ltcGxlU2VsZWN0b3JTY29wZSA9IGZ1bmN0aW9uIChzZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKSB7XG4gICAgICAgICAgLy8gSW4gQW5kcm9pZCBicm93c2VyLCB0aGUgbGFzdEluZGV4IGlzIG5vdCByZXNldCB3aGVuIHRoZSByZWdleCBpcyB1c2VkIGluIFN0cmluZy5yZXBsYWNlKClcbiAgICAgICAgICBfcG9seWZpbGxIb3N0UmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICBpZiAoX3BvbHlmaWxsSG9zdFJlLnRlc3Qoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcGxhY2VCeV8xID0gdGhpcy5zdHJpY3RTdHlsaW5nID8gXCJbXCIgKyBob3N0U2VsZWN0b3IgKyBcIl1cIiA6IHNjb3BlU2VsZWN0b3I7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvclJlLCBmdW5jdGlvbiAoaG5jLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoLyhbXjpdKikoOiopKC4qKS8sIGZ1bmN0aW9uIChfLCBiZWZvcmUsIGNvbG9uLCBhZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUgKyByZXBsYWNlQnlfMSArIGNvbG9uICsgYWZ0ZXI7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKF9wb2x5ZmlsbEhvc3RSZSwgcmVwbGFjZUJ5XzEgKyAnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2NvcGVTZWxlY3RvciArICcgJyArIHNlbGVjdG9yO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBzY29wZVNlbGVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RTZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzUmUgPSAvXFxbaXM9KFteXFxdXSopXFxdL2c7XG4gICAgICAgICAgc2NvcGVTZWxlY3RvciA9IHNjb3BlU2VsZWN0b3IucmVwbGFjZShpc1JlLCBmdW5jdGlvbiAoXykge1xuICAgICAgICAgICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgIHBhcnRzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwYXJ0c1swXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTmFtZSA9ICdbJyArIHNjb3BlU2VsZWN0b3IgKyAnXSc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3Njb3BlU2VsZWN0b3JQYXJ0ID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2NvcGVkUCA9IHAudHJpbSgpO1xuICAgICAgICAgICAgICBpZiAoIXNjb3BlZFApIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocC5pbmRleE9mKF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgIHNjb3BlZFAgPSBfdGhpcy5fYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlKHAsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyByZW1vdmUgOmhvc3Qgc2luY2UgaXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ID0gcC5yZXBsYWNlKF9wb2x5ZmlsbEhvc3RSZSwgJycpO1xuICAgICAgICAgICAgICAgICAgaWYgKHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoZXMgPSB0Lm1hdGNoKC8oW146XSopKDoqKSguKikvKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRQID0gbWF0Y2hlc1sxXSArIGF0dHJOYW1lICsgbWF0Y2hlc1syXSArIG1hdGNoZXNbM107XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzY29wZWRQO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2FmZUNvbnRlbnQgPSBuZXcgU2FmZVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICBzZWxlY3RvciA9IHNhZmVDb250ZW50LmNvbnRlbnQoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY29wZWRTZWxlY3RvciA9ICcnO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZXAgPSAvKCB8PnxcXCt8fig/IT0pKVxccyovZztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY29wZUFmdGVyID0gc2VsZWN0b3IuaW5kZXhPZihfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yKTtcbiAgICAgICAgICB3aGlsZSAoKHJlcyA9IHNlcC5leGVjKHNlbGVjdG9yKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VwYXJhdG9yID0gcmVzWzFdO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0ID0gc2VsZWN0b3Iuc2xpY2Uoc3RhcnRJbmRleCwgcmVzLmluZGV4KS50cmltKCk7XG4gICAgICAgICAgICAgIC8vIGlmIGEgc2VsZWN0b3IgYXBwZWFycyBiZWZvcmUgOmhvc3QtY29udGV4dCBpdCBzaG91bGQgbm90IGJlIHNoaW1tZWQgYXMgaXRcbiAgICAgICAgICAgICAgLy8gbWF0Y2hlcyBvbiBhbmNlc3RvciBlbGVtZW50cyBhbmQgbm90IG9uIGVsZW1lbnRzIGluIHRoZSBob3N0J3Mgc2hhZG93XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNjb3BlZFBhcnQgPSBzdGFydEluZGV4ID49IHNjb3BlQWZ0ZXIgPyBfc2NvcGVTZWxlY3RvclBhcnQocGFydCkgOiBwYXJ0O1xuICAgICAgICAgICAgICBzY29wZWRTZWxlY3RvciArPSBzY29wZWRQYXJ0ICsgXCIgXCIgKyBzZXBhcmF0b3IgKyBcIiBcIjtcbiAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHNlcC5sYXN0SW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNjb3BlZFNlbGVjdG9yICs9IF9zY29wZVNlbGVjdG9yUGFydChzZWxlY3Rvci5zdWJzdHJpbmcoc3RhcnRJbmRleCkpO1xuICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycyB3aXRoIHRoZWlyIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICAgIHJldHVybiBzYWZlQ29udGVudC5yZXN0b3JlKHNjb3BlZFNlbGVjdG9yKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2luc2VydFBvbHlmaWxsSG9zdEluQ3NzVGV4dCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5yZXBsYWNlKF9jb2xvbkhvc3RDb250ZXh0UmUsIF9wb2x5ZmlsbEhvc3RDb250ZXh0KVxuICAgICAgICAgICAgICAucmVwbGFjZShfY29sb25Ib3N0UmUsIF9wb2x5ZmlsbEhvc3QpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBTaGFkb3dDc3M7XG4gIH0oKSk7XG4gIHZhciBTYWZlU2VsZWN0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFNhZmVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy5wbGFjZWhvbGRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgICAvLyBSZXBsYWNlcyBhdHRyaWJ1dGUgc2VsZWN0b3JzIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAgICAgIC8vIFRoZSBXUyBpbiBbYXR0cj1cInZhIGx1ZVwiXSB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZWxlY3RvciBzZXBhcmF0b3IuXG4gICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC8oXFxbW15cXF1dKlxcXSkvZywgZnVuY3Rpb24gKF8sIGtlZXApIHtcbiAgICAgICAgICAgICAgdmFyIHJlcGxhY2VCeSA9IFwiX19waC1cIiArIF90aGlzLmluZGV4ICsgXCJfX1wiO1xuICAgICAgICAgICAgICBfdGhpcy5wbGFjZWhvbGRlcnMucHVzaChrZWVwKTtcbiAgICAgICAgICAgICAgX3RoaXMuaW5kZXgrKztcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VCeTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBSZXBsYWNlcyB0aGUgZXhwcmVzc2lvbiBpbiBgOm50aC1jaGlsZCgybiArIDEpYCB3aXRoIGEgcGxhY2Vob2xkZXIuXG4gICAgICAgICAgLy8gV1MgYW5kIFwiK1wiIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBzZWxlY3RvciBzZXBhcmF0b3JzLlxuICAgICAgICAgIHRoaXMuX2NvbnRlbnQgPSBzZWxlY3Rvci5yZXBsYWNlKC8oOm50aC1bLVxcd10rKShcXChbXildK1xcKSkvZywgZnVuY3Rpb24gKF8sIHBzZXVkbywgZXhwKSB7XG4gICAgICAgICAgICAgIHZhciByZXBsYWNlQnkgPSBcIl9fcGgtXCIgKyBfdGhpcy5pbmRleCArIFwiX19cIjtcbiAgICAgICAgICAgICAgX3RoaXMucGxhY2Vob2xkZXJzLnB1c2goZXhwKTtcbiAgICAgICAgICAgICAgX3RoaXMuaW5kZXgrKztcbiAgICAgICAgICAgICAgcmV0dXJuIHBzZXVkbyArIHJlcGxhY2VCeTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlU2VsZWN0b3IucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvX19waC0oXFxkKylfXy9nLCBmdW5jdGlvbiAocGgsIGluZGV4KSB7IHJldHVybiBfdGhpcy5wbGFjZWhvbGRlcnNbK2luZGV4XTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlU2VsZWN0b3IucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jb250ZW50OyB9O1xuICAgICAgcmV0dXJuIFNhZmVTZWxlY3RvcjtcbiAgfSgpKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX2Nzc0NvbnRlbnROZXh0U2VsZWN0b3JSZSA9IC9wb2x5ZmlsbC1uZXh0LXNlbGVjdG9yW159XSpjb250ZW50OltcXHNdKj8oWydcIl0pKC4qPylcXDFbO1xcc10qfShbXntdKj8pey9naW07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jc3NDb250ZW50UnVsZVJlID0gLyhwb2x5ZmlsbC1ydWxlKVtefV0qKGNvbnRlbnQ6W1xcc10qKFsnXCJdKSguKj8pXFwzKVs7XFxzXSpbXn1dKn0vZ2ltO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfY3NzQ29udGVudFVuc2NvcGVkUnVsZVJlID0gLyhwb2x5ZmlsbC11bnNjb3BlZC1ydWxlKVtefV0qKGNvbnRlbnQ6W1xcc10qKFsnXCJdKSguKj8pXFwzKVs7XFxzXSpbXn1dKn0vZ2ltO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfcG9seWZpbGxIb3N0ID0gJy1zaGFkb3djc3Nob3N0JztcbiAgLy8gbm90ZTogOmhvc3QtY29udGV4dCBwcmUtcHJvY2Vzc2VkIHRvIC1zaGFkb3djc3Nob3N0Y29udGV4dC5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3BvbHlmaWxsSG9zdENvbnRleHQgPSAnLXNoYWRvd2Nzc2NvbnRleHQnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfcGFyZW5TdWZmaXggPSAnKSg/OlxcXFwoKCcgK1xuICAgICAgJyg/OlxcXFwoW14pKF0qXFxcXCl8W14pKF0qKSs/JyArXG4gICAgICAnKVxcXFwpKT8oW14se10qKSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jc3NDb2xvbkhvc3RSZSA9IG5ldyBSZWdFeHAoJygnICsgX3BvbHlmaWxsSG9zdCArIF9wYXJlblN1ZmZpeCwgJ2dpbScpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfY3NzQ29sb25Ib3N0Q29udGV4dFJlID0gbmV3IFJlZ0V4cCgnKCcgKyBfcG9seWZpbGxIb3N0Q29udGV4dCArIF9wYXJlblN1ZmZpeCwgJ2dpbScpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yID0gX3BvbHlmaWxsSG9zdCArICctbm8tY29tYmluYXRvcic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3JSZSA9IC8tc2hhZG93Y3NzaG9zdC1uby1jb21iaW5hdG9yKFteXFxzXSopLztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3NoYWRvd0RPTVNlbGVjdG9yc1JlID0gW1xuICAgICAgLzo6c2hhZG93L2csXG4gICAgICAvOjpjb250ZW50L2csXG4gICAgICAvLyBEZXByZWNhdGVkIHNlbGVjdG9yc1xuICAgICAgL1xcL3NoYWRvdy1kZWVwXFwvL2csXG4gICAgICAvXFwvc2hhZG93XFwvL2csXG4gIF07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9zaGFkb3dEZWVwU2VsZWN0b3JzID0gLyg/Oj4+Pil8KD86XFwvZGVlcFxcLykvZztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3NlbGVjdG9yUmVTdWZmaXggPSAnKFs+XFxcXHN+K1xcWy4sezpdW1xcXFxzXFxcXFNdKik/JCc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9wb2x5ZmlsbEhvc3RSZSA9IC8tc2hhZG93Y3NzaG9zdC9naW07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jb2xvbkhvc3RSZSA9IC86aG9zdC9naW07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jb2xvbkhvc3RDb250ZXh0UmUgPSAvOmhvc3QtY29udGV4dC9naW07XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jb21tZW50UmUgPSAvXFwvXFwqXFxzKltcXHNcXFNdKj9cXCpcXC8vZztcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmlwQ29tbWVudHMoaW5wdXQpIHtcbiAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKF9jb21tZW50UmUsICcnKTtcbiAgfVxuICAvLyBhbGwgY29tbWVudHMgZXhjZXB0IGlubGluZSBzb3VyY2UgbWFwcGluZ1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfc291cmNlTWFwcGluZ1VybFJlID0gL1xcL1xcKlxccyojXFxzKnNvdXJjZU1hcHBpbmdVUkw9W1xcc1xcU10rP1xcKlxcLy87XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGlucHV0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBleHRyYWN0U291cmNlTWFwcGluZ1VybChpbnB1dCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlciA9IGlucHV0Lm1hdGNoKF9zb3VyY2VNYXBwaW5nVXJsUmUpO1xuICAgICAgcmV0dXJuIG1hdGNoZXIgPyBtYXRjaGVyWzBdIDogJyc7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3J1bGVSZSA9IC8oXFxzKikoW147XFx7XFx9XSs/KShcXHMqKSgoPzp7JUJMT0NLJX0/XFxzKjs/KXwoPzpcXHMqOykpL2c7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jdXJseVJlID0gLyhbe31dKS9nO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBPUEVOX0NVUkxZID0gJ3snO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDTE9TRV9DVVJMWSA9ICd9JztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQkxPQ0tfUExBQ0VIT0xERVIgPSAnJUJMT0NLJSc7XG4gIHZhciBDc3NSdWxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDc3NSdWxlO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgKiBAcGFyYW0gez99IHJ1bGVDYWxsYmFja1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1J1bGVzKGlucHV0LCBydWxlQ2FsbGJhY2spIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlucHV0V2l0aEVzY2FwZWRCbG9ja3MgPSBlc2NhcGVCbG9ja3MoaW5wdXQpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dEJsb2NrSW5kZXggPSAwO1xuICAgICAgcmV0dXJuIGlucHV0V2l0aEVzY2FwZWRCbG9ja3MuZXNjYXBlZFN0cmluZy5yZXBsYWNlKF9ydWxlUmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgbSA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIG1bX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdG9yID0gbVsyXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250ZW50ID0gJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VmZml4ID0gbVs0XTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250ZW50UHJlZml4ID0gJyc7XG4gICAgICAgICAgaWYgKHN1ZmZpeCAmJiBzdWZmaXguc3RhcnRzV2l0aCgneycgKyBCTE9DS19QTEFDRUhPTERFUikpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IGlucHV0V2l0aEVzY2FwZWRCbG9ja3MuYmxvY2tzW25leHRCbG9ja0luZGV4KytdO1xuICAgICAgICAgICAgICBzdWZmaXggPSBzdWZmaXguc3Vic3RyaW5nKEJMT0NLX1BMQUNFSE9MREVSLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICBjb250ZW50UHJlZml4ID0gJ3snO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBydWxlID0gcnVsZUNhbGxiYWNrKG5ldyBDc3NSdWxlKHNlbGVjdG9yLCBjb250ZW50KSk7XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyBtWzFdICsgcnVsZS5zZWxlY3RvciArIG1bM10gKyBjb250ZW50UHJlZml4ICsgcnVsZS5jb250ZW50ICsgc3VmZml4O1xuICAgICAgfSk7XG4gIH1cbiAgdmFyIFN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlc2NhcGVkU3RyaW5nXG4gICAgICAgKiBAcGFyYW0gez99IGJsb2Nrc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcyhlc2NhcGVkU3RyaW5nLCBibG9ja3MpIHtcbiAgICAgICAgICB0aGlzLmVzY2FwZWRTdHJpbmcgPSBlc2NhcGVkU3RyaW5nO1xuICAgICAgICAgIHRoaXMuYmxvY2tzID0gYmxvY2tzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXNjYXBlQmxvY2tzKGlucHV0KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnB1dFBhcnRzID0gaW5wdXQuc3BsaXQoX2N1cmx5UmUpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0UGFydHMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVzY2FwZWRCbG9ja3MgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJyYWNrZXRDb3VudCA9IDA7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50QmxvY2tQYXJ0cyA9IFtdO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0SW5kZXggPSAwOyBwYXJ0SW5kZXggPCBpbnB1dFBhcnRzLmxlbmd0aDsgcGFydEluZGV4KyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0ID0gaW5wdXRQYXJ0c1twYXJ0SW5kZXhdO1xuICAgICAgICAgIGlmIChwYXJ0ID09IENMT1NFX0NVUkxZKSB7XG4gICAgICAgICAgICAgIGJyYWNrZXRDb3VudC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50QmxvY2tQYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja1BhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGVzY2FwZWRCbG9ja3MucHVzaChjdXJyZW50QmxvY2tQYXJ0cy5qb2luKCcnKSk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKEJMT0NLX1BMQUNFSE9MREVSKTtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja1BhcnRzID0gW107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBhcnQgPT0gT1BFTl9DVVJMWSkge1xuICAgICAgICAgICAgICBicmFja2V0Q291bnQrKztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudEJsb2NrUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVzY2FwZWRCbG9ja3MucHVzaChjdXJyZW50QmxvY2tQYXJ0cy5qb2luKCcnKSk7XG4gICAgICAgICAgcmVzdWx0UGFydHMucHVzaChCTE9DS19QTEFDRUhPTERFUik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzKHJlc3VsdFBhcnRzLmpvaW4oJycpLCBlc2NhcGVkQmxvY2tzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkMTUgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMTUgPSAodGhpcyAmJiB0aGlzLl9fbWV0YWRhdGEpIHx8IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBIT1NUX0FUVFIgPSBcIl9uZ2hvc3QtXCIgKyBDT01QT05FTlRfVkFSSUFCTEU7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENPTlRFTlRfQVRUUiA9IFwiX25nY29udGVudC1cIiArIENPTVBPTkVOVF9WQVJJQUJMRTtcbiAgdmFyIFN0eWxlc0NvbXBpbGVEZXBlbmRlbmN5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBpc1NoaW1tZWRcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVQbGFjZWhvbGRlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdHlsZXNDb21waWxlRGVwZW5kZW5jeShuYW1lLCBtb2R1bGVVcmwsIGlzU2hpbW1lZCwgdmFsdWVQbGFjZWhvbGRlcikge1xuICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgdGhpcy5tb2R1bGVVcmwgPSBtb2R1bGVVcmw7XG4gICAgICAgICAgdGhpcy5pc1NoaW1tZWQgPSBpc1NoaW1tZWQ7XG4gICAgICAgICAgdGhpcy52YWx1ZVBsYWNlaG9sZGVyID0gdmFsdWVQbGFjZWhvbGRlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTdHlsZXNDb21waWxlRGVwZW5kZW5jeTtcbiAgfSgpKTtcbiAgdmFyIFN0eWxlc0NvbXBpbGVSZXN1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFN0eWxlc2hlZXRcbiAgICAgICAqIEBwYXJhbSB7P30gZXh0ZXJuYWxTdHlsZXNoZWV0c1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdHlsZXNDb21waWxlUmVzdWx0KGNvbXBvbmVudFN0eWxlc2hlZXQsIGV4dGVybmFsU3R5bGVzaGVldHMpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFN0eWxlc2hlZXQgPSBjb21wb25lbnRTdHlsZXNoZWV0O1xuICAgICAgICAgIHRoaXMuZXh0ZXJuYWxTdHlsZXNoZWV0cyA9IGV4dGVybmFsU3R5bGVzaGVldHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gU3R5bGVzQ29tcGlsZVJlc3VsdDtcbiAgfSgpKTtcbiAgdmFyIENvbXBpbGVkU3R5bGVzaGVldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXNWYXJcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwZW5kZW5jaWVzXG4gICAgICAgKiBAcGFyYW0gez99IGlzU2hpbW1lZFxuICAgICAgICogQHBhcmFtIHs/fSBtZXRhXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENvbXBpbGVkU3R5bGVzaGVldChzdGF0ZW1lbnRzLCBzdHlsZXNWYXIsIGRlcGVuZGVuY2llcywgaXNTaGltbWVkLCBtZXRhKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICAgICAgICB0aGlzLnN0eWxlc1ZhciA9IHN0eWxlc1ZhcjtcbiAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgICB0aGlzLmlzU2hpbW1lZCA9IGlzU2hpbW1lZDtcbiAgICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENvbXBpbGVkU3R5bGVzaGVldDtcbiAgfSgpKTtcbiAgdmFyIFN0eWxlQ29tcGlsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF91cmxSZXNvbHZlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdHlsZUNvbXBpbGVyKF91cmxSZXNvbHZlcikge1xuICAgICAgICAgIHRoaXMuX3VybFJlc29sdmVyID0gX3VybFJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX3NoYWRvd0NzcyA9IG5ldyBTaGFkb3dDc3MoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdHlsZUNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4dGVybmFsU3R5bGVzaGVldHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wb25lbnRTdHlsZXNoZWV0ID0gdGhpcy5fY29tcGlsZVN0eWxlcyhjb21wLCBuZXcgQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSh7XG4gICAgICAgICAgICAgIHN0eWxlczogY29tcC50ZW1wbGF0ZS5zdHlsZXMsXG4gICAgICAgICAgICAgIHN0eWxlVXJsczogY29tcC50ZW1wbGF0ZS5zdHlsZVVybHMsXG4gICAgICAgICAgICAgIG1vZHVsZVVybDogaWRlbnRpZmllck1vZHVsZVVybChjb21wLnR5cGUpXG4gICAgICAgICAgfSksIHRydWUpO1xuICAgICAgICAgIGNvbXAudGVtcGxhdGUuZXh0ZXJuYWxTdHlsZXNoZWV0cy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZXNoZWV0TWV0YSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21waWxlZFN0eWxlc2hlZXQgPSBfdGhpcy5fY29tcGlsZVN0eWxlcyhjb21wLCBzdHlsZXNoZWV0TWV0YSwgZmFsc2UpO1xuICAgICAgICAgICAgICBleHRlcm5hbFN0eWxlc2hlZXRzLnB1c2goY29tcGlsZWRTdHlsZXNoZWV0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFN0eWxlc0NvbXBpbGVSZXN1bHQoY29tcG9uZW50U3R5bGVzaGVldCwgZXh0ZXJuYWxTdHlsZXNoZWV0cyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzaGVldFxuICAgICAgICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudFN0eWxlc2hlZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0eWxlQ29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlU3R5bGVzID0gZnVuY3Rpb24gKGNvbXAsIHN0eWxlc2hlZXQsIGlzQ29tcG9uZW50U3R5bGVzaGVldCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2hpbSA9IGNvbXAudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiA9PT0gX2FuZ3VsYXJfY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZUV4cHJlc3Npb25zID0gc3R5bGVzaGVldC5zdHlsZXMubWFwKGZ1bmN0aW9uIChwbGFpblN0eWxlKSB7IHJldHVybiBsaXRlcmFsKF90aGlzLl9zaGltSWZOZWVkZWQocGxhaW5TdHlsZSwgc2hpbSkpOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBlbmRlbmNpZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgc3R5bGVzaGVldC5zdHlsZVVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaWRlbnRpZmllciA9IHsgcmVmZXJlbmNlOiBudWxsIH07XG4gICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKG5ldyBTdHlsZXNDb21waWxlRGVwZW5kZW5jeShnZXRTdHlsZXNWYXJOYW1lKG51bGwpLCBzdHlsZXNoZWV0LnN0eWxlVXJsc1tpXSwgc2hpbSwgaWRlbnRpZmllcikpO1xuICAgICAgICAgICAgICBzdHlsZUV4cHJlc3Npb25zLnB1c2gobmV3IEV4dGVybmFsRXhwcihpZGVudGlmaWVyKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN0eWxlcyB2YXJpYWJsZSBjb250YWlucyBwbGFpbiBzdHJpbmdzIGFuZCBhcnJheXMgb2Ygb3RoZXIgc3R5bGVzIGFycmF5cyAocmVjdXJzaXZlKSxcbiAgICAgICAgICAvLyBzbyB3ZSBzZXQgaXRzIHR5cGUgdG8gZHluYW1pYy5cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZXNWYXIgPSBnZXRTdHlsZXNWYXJOYW1lKGlzQ29tcG9uZW50U3R5bGVzaGVldCA/IGNvbXAgOiBudWxsKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdG10ID0gdmFyaWFibGUoc3R5bGVzVmFyKVxuICAgICAgICAgICAgICAuc2V0KGxpdGVyYWxBcnIoc3R5bGVFeHByZXNzaW9ucywgbmV3IEFycmF5VHlwZShEWU5BTUlDX1RZUEUsIFtUeXBlTW9kaWZpZXIuQ29uc3RdKSkpXG4gICAgICAgICAgICAgIC50b0RlY2xTdG10KG51bGwsIFtTdG10TW9kaWZpZXIuRmluYWxdKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVkU3R5bGVzaGVldChbc3RtdF0sIHN0eWxlc1ZhciwgZGVwZW5kZW5jaWVzLCBzaGltLCBzdHlsZXNoZWV0KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVcbiAgICAgICAqIEBwYXJhbSB7P30gc2hpbVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3R5bGVDb21waWxlci5wcm90b3R5cGUuX3NoaW1JZk5lZWRlZCA9IGZ1bmN0aW9uIChzdHlsZSwgc2hpbSkge1xuICAgICAgICAgIHJldHVybiBzaGltID8gdGhpcy5fc2hhZG93Q3NzLnNoaW1Dc3NUZXh0KHN0eWxlLCBDT05URU5UX0FUVFIsIEhPU1RfQVRUUikgOiBzdHlsZTtcbiAgICAgIH07XG4gICAgICBTdHlsZUNvbXBpbGVyID0gX19kZWNvcmF0ZSQxNShbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTUoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW1VybFJlc29sdmVyXSlcbiAgICAgIF0sIFN0eWxlQ29tcGlsZXIpO1xuICAgICAgcmV0dXJuIFN0eWxlQ29tcGlsZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3R5bGVzVmFyTmFtZShjb21wb25lbnQpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IFwic3R5bGVzXCI7XG4gICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFwiX1wiICsgaWRlbnRpZmllck5hbWUoY29tcG9uZW50LnR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBfRGVidWdTdGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZUluZGV4XG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZUFzdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfRGVidWdTdGF0ZShub2RlSW5kZXgsIHNvdXJjZUFzdCkge1xuICAgICAgICAgIHRoaXMubm9kZUluZGV4ID0gbm9kZUluZGV4O1xuICAgICAgICAgIHRoaXMuc291cmNlQXN0ID0gc291cmNlQXN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9EZWJ1Z1N0YXRlO1xuICB9KCkpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOVUxMX0RFQlVHX1NUQVRFID0gbmV3IF9EZWJ1Z1N0YXRlKG51bGwsIG51bGwpO1xuICB2YXIgQ29tcGlsZU1ldGhvZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZU1ldGhvZChfdmlldykge1xuICAgICAgICAgIHRoaXMuX3ZpZXcgPSBfdmlldztcbiAgICAgICAgICB0aGlzLl9uZXdTdGF0ZSA9IE5VTExfREVCVUdfU1RBVEU7XG4gICAgICAgICAgdGhpcy5fY3VyclN0YXRlID0gTlVMTF9ERUJVR19TVEFURTtcbiAgICAgICAgICB0aGlzLl9ib2R5U3RhdGVtZW50cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RlYnVnRW5hYmxlZCA9IHRoaXMuX3ZpZXcuZ2VuQ29uZmlnLmdlbkRlYnVnSW5mbztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGhvZC5wcm90b3R5cGUuX3VwZGF0ZURlYnVnQ29udGV4dElmTmVlZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLl9uZXdTdGF0ZS5ub2RlSW5kZXggIT09IHRoaXMuX2N1cnJTdGF0ZS5ub2RlSW5kZXggfHxcbiAgICAgICAgICAgICAgdGhpcy5fbmV3U3RhdGUuc291cmNlQXN0ICE9PSB0aGlzLl9jdXJyU3RhdGUuc291cmNlQXN0KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHIgPSB0aGlzLl91cGRhdGVEZWJ1Z0NvbnRleHQodGhpcy5fbmV3U3RhdGUpO1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGV4cHIpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9ib2R5U3RhdGVtZW50cy5wdXNoKGV4cHIudG9TdG10KCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuZXdTdGF0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGhvZC5wcm90b3R5cGUuX3VwZGF0ZURlYnVnQ29udGV4dCA9IGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJTdGF0ZSA9IHRoaXMuX25ld1N0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgICAgaWYgKHRoaXMuX2RlYnVnRW5hYmxlZCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VMb2NhdGlvbiA9IGlzUHJlc2VudChuZXdTdGF0ZS5zb3VyY2VBc3QpID8gbmV3U3RhdGUuc291cmNlQXN0LnNvdXJjZVNwYW4uc3RhcnQgOiBudWxsO1xuICAgICAgICAgICAgICByZXR1cm4gVEhJU19FWFBSLmNhbGxNZXRob2QoJ2RlYnVnJywgW1xuICAgICAgICAgICAgICAgICAgbGl0ZXJhbChuZXdTdGF0ZS5ub2RlSW5kZXgpLFxuICAgICAgICAgICAgICAgICAgaXNQcmVzZW50KHNvdXJjZUxvY2F0aW9uKSA/IGxpdGVyYWwoc291cmNlTG9jYXRpb24ubGluZSkgOiBOVUxMX0VYUFIsXG4gICAgICAgICAgICAgICAgICBpc1ByZXNlbnQoc291cmNlTG9jYXRpb24pID8gbGl0ZXJhbChzb3VyY2VMb2NhdGlvbi5jb2wpIDogTlVMTF9FWFBSXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVBc3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRob2QucHJvdG90eXBlLnJlc2V0RGVidWdJbmZvRXhwciA9IGZ1bmN0aW9uIChub2RlSW5kZXgsIHRlbXBsYXRlQXN0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gdGhpcy5fdXBkYXRlRGVidWdDb250ZXh0KG5ldyBfRGVidWdTdGF0ZShub2RlSW5kZXgsIHRlbXBsYXRlQXN0KSk7XG4gICAgICAgICAgcmV0dXJuIHJlcyB8fCBOVUxMX0VYUFI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZUFzdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGhvZC5wcm90b3R5cGUucmVzZXREZWJ1Z0luZm8gPSBmdW5jdGlvbiAobm9kZUluZGV4LCB0ZW1wbGF0ZUFzdCkge1xuICAgICAgICAgIHRoaXMuX25ld1N0YXRlID0gbmV3IF9EZWJ1Z1N0YXRlKG5vZGVJbmRleCwgdGVtcGxhdGVBc3QpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHsuLi4/fSBzdG10c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU1ldGhvZC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgc3RtdHMgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBzdG10c1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRTdG10cyhzdG10cyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRob2QucHJvdG90eXBlLmFkZFN0bXQgPSBmdW5jdGlvbiAoc3RtdCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZURlYnVnQ29udGV4dElmTmVlZGVkKCk7XG4gICAgICAgICAgdGhpcy5fYm9keVN0YXRlbWVudHMucHVzaChzdG10KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRob2QucHJvdG90eXBlLmFkZFN0bXRzID0gZnVuY3Rpb24gKHN0bXRzKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRGVidWdDb250ZXh0SWZOZWVkZWQoKTtcbiAgICAgICAgICAoX2EgPSB0aGlzLl9ib2R5U3RhdGVtZW50cykucHVzaC5hcHBseShfYSwgc3RtdHMpO1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVNZXRob2QucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2JvZHlTdGF0ZW1lbnRzOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTWV0aG9kLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fYm9keVN0YXRlbWVudHMubGVuZ3RoID09PSAwOyB9O1xuICAgICAgcmV0dXJuIENvbXBpbGVNZXRob2Q7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDIyID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0gez99IGNhbGxpbmdWaWV3XG4gICAqIEBwYXJhbSB7P30gZGVmaW5lZFZpZXdcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByb3BlcnR5SW5WaWV3KHByb3BlcnR5LCBjYWxsaW5nVmlldywgZGVmaW5lZFZpZXcpIHtcbiAgICAgIGlmIChjYWxsaW5nVmlldyA9PT0gZGVmaW5lZFZpZXcpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3UHJvcCA9IFRISVNfRVhQUjtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyVmlldyA9IGNhbGxpbmdWaWV3O1xuICAgICAgICAgIHdoaWxlIChjdXJyVmlldyAhPT0gZGVmaW5lZFZpZXcgJiYgaXNQcmVzZW50KGN1cnJWaWV3LmRlY2xhcmF0aW9uRWxlbWVudC52aWV3KSkge1xuICAgICAgICAgICAgICBjdXJyVmlldyA9IGN1cnJWaWV3LmRlY2xhcmF0aW9uRWxlbWVudC52aWV3O1xuICAgICAgICAgICAgICB2aWV3UHJvcCA9IHZpZXdQcm9wLnByb3AoJ3BhcmVudFZpZXcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJWaWV3ICE9PSBkZWZpbmVkVmlldykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogQ291bGQgbm90IGNhbGN1bGF0ZSBhIHByb3BlcnR5IGluIGEgcGFyZW50IHZpZXc6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHJvcGVydHkudmlzaXRFeHByZXNzaW9uKG5ldyBfUmVwbGFjZVZpZXdUcmFuc2Zvcm1lcih2aWV3UHJvcCwgZGVmaW5lZFZpZXcpLCBudWxsKTtcbiAgICAgIH1cbiAgfVxuICB2YXIgX1JlcGxhY2VWaWV3VHJhbnNmb3JtZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDIyKF9SZXBsYWNlVmlld1RyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF92aWV3RXhwclxuICAgICAgICogQHBhcmFtIHs/fSBfdmlld1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfUmVwbGFjZVZpZXdUcmFuc2Zvcm1lcihfdmlld0V4cHIsIF92aWV3KSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5fdmlld0V4cHIgPSBfdmlld0V4cHI7XG4gICAgICAgICAgdGhpcy5fdmlldyA9IF92aWV3O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV4cHJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9SZXBsYWNlVmlld1RyYW5zZm9ybWVyLnByb3RvdHlwZS5faXNUaGlzID0gZnVuY3Rpb24gKGV4cHIpIHtcbiAgICAgICAgICByZXR1cm4gZXhwciBpbnN0YW5jZW9mIFJlYWRWYXJFeHByICYmIGV4cHIuYnVpbHRpbiA9PT0gQnVpbHRpblZhci5UaGlzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX1JlcGxhY2VWaWV3VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVGhpcyhhc3QpID8gdGhpcy5fdmlld0V4cHIgOiBhc3Q7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfUmVwbGFjZVZpZXdUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzVGhpcyhhc3QucmVjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IERvbid0IGNhc3QgZm9yIG1lbWJlcnMgb2YgdGhlIEFwcFZpZXcgYmFzZSBjbGFzcy4uLlxuICAgICAgICAgICAgICBpZiAodGhpcy5fdmlldy5maWVsZHMuc29tZShmdW5jdGlvbiAoZmllbGQpIHsgcmV0dXJuIGZpZWxkLm5hbWUgPT0gYXN0Lm5hbWU7IH0pIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLl92aWV3LmdldHRlcnMuc29tZShmdW5jdGlvbiAoZmllbGQpIHsgcmV0dXJuIGZpZWxkLm5hbWUgPT0gYXN0Lm5hbWU7IH0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlld0V4cHIuY2FzdCh0aGlzLl92aWV3LmNsYXNzVHlwZSkucHJvcChhc3QubmFtZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIuY2FsbCh0aGlzLCBhc3QsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfUmVwbGFjZVZpZXdUcmFuc2Zvcm1lcjtcbiAgfShFeHByZXNzaW9uVHJhbnNmb3JtZXIpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAqIEBwYXJhbSB7P30gb3B0aW9uYWxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGluamVjdEZyb21WaWV3UGFyZW50SW5qZWN0b3IodmlldywgdG9rZW4sIG9wdGlvbmFsKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3RXhwcjtcbiAgICAgIGlmICh2aWV3LnZpZXdUeXBlID09PSBWaWV3VHlwZS5IT1NUKSB7XG4gICAgICAgICAgdmlld0V4cHIgPSBUSElTX0VYUFI7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICB2aWV3RXhwciA9IFRISVNfRVhQUi5wcm9wKCdwYXJlbnRWaWV3Jyk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcmdzID0gW2NyZWF0ZURpVG9rZW5FeHByZXNzaW9uKHRva2VuKSwgVEhJU19FWFBSLnByb3AoJ3BhcmVudEluZGV4JyldO1xuICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgYXJncy5wdXNoKE5VTExfRVhQUik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmlld0V4cHIuY2FsbE1ldGhvZCgnaW5qZWN0b3JHZXQnLCBhcmdzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21wb25lbnRcbiAgICogQHBhcmFtIHs/fSBlbWJlZGRlZFRlbXBsYXRlSW5kZXhcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFZpZXdDbGFzc05hbWUoY29tcG9uZW50LCBlbWJlZGRlZFRlbXBsYXRlSW5kZXgpIHtcbiAgICAgIHJldHVybiBcIlZpZXdfXCIgKyBpZGVudGlmaWVyTmFtZShjb21wb25lbnQudHlwZSkgKyBlbWJlZGRlZFRlbXBsYXRlSW5kZXg7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZWxlbWVudEluZGV4XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIYW5kbGVFdmVudE1ldGhvZE5hbWUoZWxlbWVudEluZGV4KSB7XG4gICAgICByZXR1cm4gXCJoYW5kbGVFdmVudF9cIiArIGVsZW1lbnRJbmRleDtcbiAgfVxuXG4gIHZhciBWaWV3UXVlcnlWYWx1ZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFZpZXdRdWVyeVZhbHVlcyh2aWV3LCB2YWx1ZXMpIHtcbiAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZpZXdRdWVyeVZhbHVlcztcbiAgfSgpKTtcbiAgdmFyIENvbXBpbGVRdWVyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0YVxuICAgICAgICogQHBhcmFtIHs/fSBxdWVyeUxpc3RcbiAgICAgICAqIEBwYXJhbSB7P30gb3duZXJEaXJlY3RpdmVFeHByZXNzaW9uXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZVF1ZXJ5KG1ldGEsIHF1ZXJ5TGlzdCwgb3duZXJEaXJlY3RpdmVFeHByZXNzaW9uLCB2aWV3KSB7XG4gICAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgICAgICAgICB0aGlzLnF1ZXJ5TGlzdCA9IHF1ZXJ5TGlzdDtcbiAgICAgICAgICB0aGlzLm93bmVyRGlyZWN0aXZlRXhwcmVzc2lvbiA9IG93bmVyRGlyZWN0aXZlRXhwcmVzc2lvbjtcbiAgICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBWaWV3UXVlcnlWYWx1ZXModmlldywgW10pO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVRdWVyeS5wcm90b3R5cGUuYWRkVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIHZpZXcpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50VmlldyA9IHZpZXc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxQYXRoID0gW107XG4gICAgICAgICAgd2hpbGUgKGlzUHJlc2VudChjdXJyZW50VmlldykgJiYgY3VycmVudFZpZXcgIT09IHRoaXMudmlldykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRFbCA9IGN1cnJlbnRWaWV3LmRlY2xhcmF0aW9uRWxlbWVudDtcbiAgICAgICAgICAgICAgZWxQYXRoLnVuc2hpZnQocGFyZW50RWwpO1xuICAgICAgICAgICAgICBjdXJyZW50VmlldyA9IHBhcmVudEVsLnZpZXc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJ5TGlzdEZvckRpcnR5RXhwciA9IGdldFByb3BlcnR5SW5WaWV3KHRoaXMucXVlcnlMaXN0LCB2aWV3LCB0aGlzLnZpZXcpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdWYWx1ZXMgPSB0aGlzLl92YWx1ZXM7XG4gICAgICAgICAgZWxQYXRoLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3QgPSB2aWV3VmFsdWVzLnZhbHVlcy5sZW5ndGggPiAwID8gdmlld1ZhbHVlcy52YWx1ZXNbdmlld1ZhbHVlcy52YWx1ZXMubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIFZpZXdRdWVyeVZhbHVlcyAmJiBsYXN0LnZpZXcgPT09IGVsLmVtYmVkZGVkVmlldykge1xuICAgICAgICAgICAgICAgICAgdmlld1ZhbHVlcyA9IGxhc3Q7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdWaWV3VmFsdWVzID0gbmV3IFZpZXdRdWVyeVZhbHVlcyhlbC5lbWJlZGRlZFZpZXcsIFtdKTtcbiAgICAgICAgICAgICAgICAgIHZpZXdWYWx1ZXMudmFsdWVzLnB1c2gobmV3Vmlld1ZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICB2aWV3VmFsdWVzID0gbmV3Vmlld1ZhbHVlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZpZXdWYWx1ZXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgIGlmIChlbFBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2aWV3LmRpcnR5UGFyZW50UXVlcmllc01ldGhvZC5hZGRTdG10KHF1ZXJ5TGlzdEZvckRpcnR5RXhwci5jYWxsTWV0aG9kKCdzZXREaXJ0eScsIFtdKS50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZVF1ZXJ5LnByb3RvdHlwZS5faXNTdGF0aWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICF0aGlzLl92YWx1ZXMudmFsdWVzLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFZpZXdRdWVyeVZhbHVlczsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFN0YXRpY01ldGhvZFxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXREeW5hbWljTWV0aG9kXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlUXVlcnkucHJvdG90eXBlLmFmdGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiAodGFyZ2V0U3RhdGljTWV0aG9kLCB0YXJnZXREeW5hbWljTWV0aG9kKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWVzID0gY3JlYXRlUXVlcnlWYWx1ZXModGhpcy5fdmFsdWVzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cGRhdGVTdG10cyA9IFt0aGlzLnF1ZXJ5TGlzdC5jYWxsTWV0aG9kKCdyZXNldCcsIFtsaXRlcmFsQXJyKHZhbHVlcyldKS50b1N0bXQoKV07XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLm93bmVyRGlyZWN0aXZlRXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWVFeHByID0gdGhpcy5tZXRhLmZpcnN0ID8gdGhpcy5xdWVyeUxpc3QucHJvcCgnZmlyc3QnKSA6IHRoaXMucXVlcnlMaXN0O1xuICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKHRoaXMub3duZXJEaXJlY3RpdmVFeHByZXNzaW9uLnByb3AodGhpcy5tZXRhLnByb3BlcnR5TmFtZSkuc2V0KHZhbHVlRXhwcikudG9TdG10KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMubWV0YS5maXJzdCkge1xuICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKHRoaXMucXVlcnlMaXN0LmNhbGxNZXRob2QoJ25vdGlmeU9uQ2hhbmdlcycsIFtdKS50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1ldGEuZmlyc3QgJiYgdGhpcy5faXNTdGF0aWMoKSkge1xuICAgICAgICAgICAgICAvLyBmb3IgcXVlcmllcyB0aGF0IGRvbid0IGNoYW5nZSBhbmQgdGhlIHVzZXIgYXNrZWQgZm9yIGEgc2luZ2xlIGVsZW1lbnQsXG4gICAgICAgICAgICAgIC8vIHNldCBpdCBpbW1lZGlhdGVseS4gVGhhdCBpcyBlLmcuIG5lZWRlZCBmb3IgcXVlcnlpbmcgZm9yIFZpZXdDb250YWluZXJSZWZzLCAuLi5cbiAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZG8gdGhpcyBmb3IgUXVlcnlMaXN0cyBmb3Igbm93IGFzIHRoaXMgd291bGQgYnJlYWsgdGhlIHRpbWluZyB3aGVuXG4gICAgICAgICAgICAgIC8vIHdlIGNhbGwgUXVlcnlMaXN0IGxpc3RlbmVycy4uLlxuICAgICAgICAgICAgICB0YXJnZXRTdGF0aWNNZXRob2QuYWRkU3RtdHModXBkYXRlU3RtdHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0RHluYW1pY01ldGhvZC5hZGRTdG10KG5ldyBJZlN0bXQodGhpcy5xdWVyeUxpc3QucHJvcCgnZGlydHknKSwgdXBkYXRlU3RtdHMpKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIENvbXBpbGVRdWVyeTtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1ZhbHVlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUXVlcnlWYWx1ZXModmlld1ZhbHVlcykge1xuICAgICAgcmV0dXJuIExpc3RXcmFwcGVyLmZsYXR0ZW4odmlld1ZhbHVlcy52YWx1ZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIFZpZXdRdWVyeVZhbHVlcykge1xuICAgICAgICAgICAgICByZXR1cm4gbWFwTmVzdGVkVmlld3MoZW50cnkudmlldy5kZWNsYXJhdGlvbkVsZW1lbnQudmlld0NvbnRhaW5lciwgZW50cnkudmlldywgY3JlYXRlUXVlcnlWYWx1ZXMoZW50cnkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcGFyYW0gez99IGV4cHJlc3Npb25zXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBtYXBOZXN0ZWRWaWV3cyh2aWV3Q29udGFpbmVyLCB2aWV3LCBleHByZXNzaW9ucykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWRqdXN0ZWRFeHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hcChmdW5jdGlvbiAoZXhwcikgeyByZXR1cm4gcmVwbGFjZVZhckluRXhwcmVzc2lvbihUSElTX0VYUFIubmFtZSwgdmFyaWFibGUoJ25lc3RlZFZpZXcnKSwgZXhwcik7IH0pO1xuICAgICAgcmV0dXJuIHZpZXdDb250YWluZXIuY2FsbE1ldGhvZCgnbWFwTmVzdGVkVmlld3MnLCBbXG4gICAgICAgICAgdmFyaWFibGUodmlldy5jbGFzc05hbWUpLFxuICAgICAgICAgIGZuKFtuZXcgRm5QYXJhbSgnbmVzdGVkVmlldycsIHZpZXcuY2xhc3NUeXBlKV0sIFtuZXcgUmV0dXJuU3RhdGVtZW50KGxpdGVyYWxBcnIoYWRqdXN0ZWRFeHByZXNzaW9ucykpXSwgRFlOQU1JQ19UWVBFKVxuICAgICAgXSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcXVlcnlcbiAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbnN0YW5jZVxuICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZVxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVWaWV3XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVRdWVyeUxpc3QocXVlcnksIGRpcmVjdGl2ZUluc3RhbmNlLCBwcm9wZXJ0eU5hbWUsIGNvbXBpbGVWaWV3KSB7XG4gICAgICBjb21waWxlVmlldy5maWVsZHMucHVzaChuZXcgQ2xhc3NGaWVsZChwcm9wZXJ0eU5hbWUsIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5RdWVyeUxpc3QpLCBbRFlOQU1JQ19UWVBFXSkpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cHIgPSBUSElTX0VYUFIucHJvcChwcm9wZXJ0eU5hbWUpO1xuICAgICAgY29tcGlsZVZpZXcuY3JlYXRlTWV0aG9kLmFkZFN0bXQoVEhJU19FWFBSLnByb3AocHJvcGVydHlOYW1lKVxuICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlF1ZXJ5TGlzdCksIFtEWU5BTUlDX1RZUEVdKS5pbnN0YW50aWF0ZShbXSkpXG4gICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgIHJldHVybiBleHByO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG1hcFxuICAgKiBAcGFyYW0gez99IHF1ZXJ5XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhZGRRdWVyeVRvVG9rZW5NYXAobWFwLCBxdWVyeSkge1xuICAgICAgcXVlcnkubWV0YS5zZWxlY3RvcnMuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbnRyeSA9IG1hcC5nZXQodG9rZW5SZWZlcmVuY2Uoc2VsZWN0b3IpKTtcbiAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgIGVudHJ5ID0gW107XG4gICAgICAgICAgICAgIG1hcC5zZXQodG9rZW5SZWZlcmVuY2Uoc2VsZWN0b3IpLCBlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVudHJ5LnB1c2gocXVlcnkpO1xuICAgICAgfSk7XG4gIH1cblxuICB2YXIgVmlld1R5cGVFbnVtID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFZpZXdUeXBlRW51bSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld1R5cGVFbnVtLmZyb21WYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVFbnVtRXhwcmVzc2lvbihJZGVudGlmaWVycy5WaWV3VHlwZSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBWaWV3VHlwZUVudW07XG4gIH0oKSk7XG4gIHZhciBWaWV3RW5jYXBzdWxhdGlvbkVudW0gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVmlld0VuY2Fwc3VsYXRpb25FbnVtKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3RW5jYXBzdWxhdGlvbkVudW0uZnJvbVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUVudW1FeHByZXNzaW9uKElkZW50aWZpZXJzLlZpZXdFbmNhcHN1bGF0aW9uLCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFZpZXdFbmNhcHN1bGF0aW9uRW51bTtcbiAgfSgpKTtcbiAgdmFyIENoYW5nZURldGVjdG9yU3RhdHVzRW51bSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBDaGFuZ2VEZXRlY3RvclN0YXR1c0VudW0oKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENoYW5nZURldGVjdG9yU3RhdHVzRW51bS5mcm9tVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlRW51bUV4cHJlc3Npb24oSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JTdGF0dXMsIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0b3JTdGF0dXNFbnVtO1xuICB9KCkpO1xuICB2YXIgVmlld0NvbnN0cnVjdG9yVmFycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBWaWV3Q29uc3RydWN0b3JWYXJzKCkge1xuICAgICAgfVxuICAgICAgVmlld0NvbnN0cnVjdG9yVmFycy52aWV3VXRpbHMgPSB2YXJpYWJsZSgndmlld1V0aWxzJyk7XG4gICAgICBWaWV3Q29uc3RydWN0b3JWYXJzLnBhcmVudFZpZXcgPSB2YXJpYWJsZSgncGFyZW50VmlldycpO1xuICAgICAgVmlld0NvbnN0cnVjdG9yVmFycy5wYXJlbnRJbmRleCA9IHZhcmlhYmxlKCdwYXJlbnRJbmRleCcpO1xuICAgICAgVmlld0NvbnN0cnVjdG9yVmFycy5wYXJlbnRFbGVtZW50ID0gdmFyaWFibGUoJ3BhcmVudEVsZW1lbnQnKTtcbiAgICAgIHJldHVybiBWaWV3Q29uc3RydWN0b3JWYXJzO1xuICB9KCkpO1xuICB2YXIgVmlld1Byb3BlcnRpZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVmlld1Byb3BlcnRpZXMoKSB7XG4gICAgICB9XG4gICAgICBWaWV3UHJvcGVydGllcy5yZW5kZXJlciA9IFRISVNfRVhQUi5wcm9wKCdyZW5kZXJlcicpO1xuICAgICAgVmlld1Byb3BlcnRpZXMudmlld1V0aWxzID0gVEhJU19FWFBSLnByb3AoJ3ZpZXdVdGlscycpO1xuICAgICAgcmV0dXJuIFZpZXdQcm9wZXJ0aWVzO1xuICB9KCkpO1xuICB2YXIgSW5qZWN0TWV0aG9kVmFycyQxID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEluamVjdE1ldGhvZFZhcnMoKSB7XG4gICAgICB9XG4gICAgICBJbmplY3RNZXRob2RWYXJzLnRva2VuID0gdmFyaWFibGUoJ3Rva2VuJyk7XG4gICAgICBJbmplY3RNZXRob2RWYXJzLnJlcXVlc3ROb2RlSW5kZXggPSB2YXJpYWJsZSgncmVxdWVzdE5vZGVJbmRleCcpO1xuICAgICAgSW5qZWN0TWV0aG9kVmFycy5ub3RGb3VuZFJlc3VsdCA9IHZhcmlhYmxlKCdub3RGb3VuZFJlc3VsdCcpO1xuICAgICAgcmV0dXJuIEluamVjdE1ldGhvZFZhcnM7XG4gIH0oKSk7XG4gIHZhciBEZXRlY3RDaGFuZ2VzVmFycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBEZXRlY3RDaGFuZ2VzVmFycygpIHtcbiAgICAgIH1cbiAgICAgIERldGVjdENoYW5nZXNWYXJzLnRocm93T25DaGFuZ2UgPSB2YXJpYWJsZShcInRocm93T25DaGFuZ2VcIik7XG4gICAgICBEZXRlY3RDaGFuZ2VzVmFycy5jaGFuZ2VzID0gdmFyaWFibGUoXCJjaGFuZ2VzXCIpO1xuICAgICAgRGV0ZWN0Q2hhbmdlc1ZhcnMuY2hhbmdlZCA9IHZhcmlhYmxlKFwiY2hhbmdlZFwiKTtcbiAgICAgIHJldHVybiBEZXRlY3RDaGFuZ2VzVmFycztcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBWaWV3Q2xhc3NEZXBlbmRlbmN5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcGxhY2Vob2xkZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVmlld0NsYXNzRGVwZW5kZW5jeShjb21wLCBuYW1lLCBwbGFjZWhvbGRlcikge1xuICAgICAgICAgIHRoaXMuY29tcCA9IGNvbXA7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gVmlld0NsYXNzRGVwZW5kZW5jeTtcbiAgfSgpKTtcbiAgdmFyIENvbXBvbmVudEZhY3RvcnlEZXBlbmRlbmN5JDEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBcbiAgICAgICAqIEBwYXJhbSB7P30gcGxhY2Vob2xkZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcG9uZW50RmFjdG9yeURlcGVuZGVuY3koY29tcCwgcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmNvbXAgPSBjb21wO1xuICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5RGVwZW5kZW5jeTtcbiAgfSgpKTtcbiAgdmFyIERpcmVjdGl2ZVdyYXBwZXJEZXBlbmRlbmN5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBwbGFjZWhvbGRlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBEaXJlY3RpdmVXcmFwcGVyRGVwZW5kZW5jeShkaXIsIG5hbWUsIHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5kaXIgPSBkaXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGlyZWN0aXZlV3JhcHBlckRlcGVuZGVuY3k7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDIxID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgQ29tcGlsZU5vZGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IHNvdXJjZUFzdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlTm9kZShwYXJlbnQsIHZpZXcsIG5vZGVJbmRleCwgcmVuZGVyTm9kZSwgc291cmNlQXN0KSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICB0aGlzLm5vZGVJbmRleCA9IG5vZGVJbmRleDtcbiAgICAgICAgICB0aGlzLnJlbmRlck5vZGUgPSByZW5kZXJOb2RlO1xuICAgICAgICAgIHRoaXMuc291cmNlQXN0ID0gc291cmNlQXN0O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlTm9kZS5wcm90b3R5cGUuaXNOdWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMucmVuZGVyTm9kZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZU5vZGUucHJvdG90eXBlLmlzUm9vdEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZpZXcgIT0gdGhpcy5wYXJlbnQudmlldzsgfTtcbiAgICAgIHJldHVybiBDb21waWxlTm9kZTtcbiAgfSgpKTtcbiAgdmFyIENvbXBpbGVFbGVtZW50ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQyMShDb21waWxlRWxlbWVudCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyTm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VBc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcGFyYW0gez99IF9kaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IF9yZXNvbHZlZFByb3ZpZGVyc0FycmF5XG4gICAgICAgKiBAcGFyYW0gez99IGhhc1ZpZXdDb250YWluZXJcbiAgICAgICAqIEBwYXJhbSB7P30gaGFzRW1iZWRkZWRWaWV3XG4gICAgICAgKiBAcGFyYW0gez99IHJlZmVyZW5jZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZUVsZW1lbnQocGFyZW50LCB2aWV3LCBub2RlSW5kZXgsIHJlbmRlck5vZGUsIHNvdXJjZUFzdCwgY29tcG9uZW50LCBfZGlyZWN0aXZlcywgX3Jlc29sdmVkUHJvdmlkZXJzQXJyYXksIGhhc1ZpZXdDb250YWluZXIsIGhhc0VtYmVkZGVkVmlldywgcmVmZXJlbmNlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgcGFyZW50LCB2aWV3LCBub2RlSW5kZXgsIHJlbmRlck5vZGUsIHNvdXJjZUFzdCk7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgdGhpcy5fZGlyZWN0aXZlcyA9IF9kaXJlY3RpdmVzO1xuICAgICAgICAgIHRoaXMuX3Jlc29sdmVkUHJvdmlkZXJzQXJyYXkgPSBfcmVzb2x2ZWRQcm92aWRlcnNBcnJheTtcbiAgICAgICAgICB0aGlzLmhhc1ZpZXdDb250YWluZXIgPSBoYXNWaWV3Q29udGFpbmVyO1xuICAgICAgICAgIHRoaXMuaGFzRW1iZWRkZWRWaWV3ID0gaGFzRW1iZWRkZWRWaWV3O1xuICAgICAgICAgIHRoaXMuY29tcFZpZXdFeHByID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9xdWVyeUNvdW50ID0gMDtcbiAgICAgICAgICB0aGlzLl9xdWVyaWVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2VUb2tlbnMgPSB7fTtcbiAgICAgICAgICByZWZlcmVuY2VzLmZvckVhY2goZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gX3RoaXMucmVmZXJlbmNlVG9rZW5zW3JlZi5uYW1lXSA9IHJlZi52YWx1ZTsgfSk7XG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmID1cbiAgICAgICAgICAgICAgaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkVsZW1lbnRSZWYpKS5pbnN0YW50aWF0ZShbdGhpcy5yZW5kZXJOb2RlXSk7XG4gICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLkVsZW1lbnRSZWYpLCB0aGlzLmVsZW1lbnRSZWYpO1xuICAgICAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChyZXNvbHZlSWRlbnRpZmllcihJZGVudGlmaWVycy5JbmplY3RvciksIFRISVNfRVhQUi5jYWxsTWV0aG9kKCdpbmplY3RvcicsIFtsaXRlcmFsKHRoaXMubm9kZUluZGV4KV0pKTtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlcy5zZXQocmVzb2x2ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuUmVuZGVyZXIpLCBUSElTX0VYUFIucHJvcCgncmVuZGVyZXInKSk7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzVmlld0NvbnRhaW5lciB8fCB0aGlzLmhhc0VtYmVkZGVkVmlldykge1xuICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVWaWV3Q29udGFpbmVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIoKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LmNyZWF0ZU51bGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlRWxlbWVudChudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBbXSwgW10sIGZhbHNlLCBmYWxzZSwgW10pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZUVsZW1lbnQucHJvdG90eXBlLl9jcmVhdGVWaWV3Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpZWxkTmFtZSA9IFwiX3ZjX1wiICsgdGhpcy5ub2RlSW5kZXg7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50Tm9kZUluZGV4ID0gdGhpcy5pc1Jvb3RFbGVtZW50KCkgPyBudWxsIDogdGhpcy5wYXJlbnQubm9kZUluZGV4O1xuICAgICAgICAgIC8vIHByaXZhdGUgaXMgZmluZSBoZXJlIGFzIG5vIGNoaWxkIHZpZXcgd2lsbCByZWZlcmVuY2UgYSBWaWV3Q29udGFpbmVyXG4gICAgICAgICAgdGhpcy52aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGZpZWxkTmFtZSwgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlZpZXdDb250YWluZXIpKSwgW1N0bXRNb2RpZmllci5Qcml2YXRlXSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRlbWVudCA9IFRISVNfRVhQUi5wcm9wKGZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgLnNldChpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuVmlld0NvbnRhaW5lcikpLmluc3RhbnRpYXRlKFtcbiAgICAgICAgICAgICAgbGl0ZXJhbCh0aGlzLm5vZGVJbmRleCksIGxpdGVyYWwocGFyZW50Tm9kZUluZGV4KSwgVEhJU19FWFBSLCB0aGlzLnJlbmRlck5vZGVcbiAgICAgICAgICBdKSlcbiAgICAgICAgICAgICAgLnRvU3RtdCgpO1xuICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QuYWRkU3RtdChzdGF0ZW1lbnQpO1xuICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IFRISVNfRVhQUi5wcm9wKGZpZWxkTmFtZSk7XG4gICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLlZpZXdDb250YWluZXIpLCB0aGlzLnZpZXdDb250YWluZXIpO1xuICAgICAgICAgIHRoaXMudmlldy52aWV3Q29udGFpbmVycy5wdXNoKHRoaXMudmlld0NvbnRhaW5lcik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlRWxlbWVudC5wcm90b3R5cGUuX2NyZWF0ZUNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJ5Q29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50LmVudHJ5Q29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGVudHJ5Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0geyByZWZlcmVuY2U6IG51bGwgfTtcbiAgICAgICAgICAgICAgX3RoaXMudmlldy50YXJnZXREZXBlbmRlbmNpZXMucHVzaChuZXcgQ29tcG9uZW50RmFjdG9yeURlcGVuZGVuY3kkMShlbnRyeUNvbXBvbmVudCwgaWQpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghZW50cnlDb21wb25lbnRzIHx8IGVudHJ5Q29tcG9uZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjcmVhdGVDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJFeHByID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIoZW50cnlDb21wb25lbnRzLm1hcChmdW5jdGlvbiAoZW50cnlDb21wb25lbnQpIHsgcmV0dXJuIGltcG9ydEV4cHIoZW50cnlDb21wb25lbnQpOyB9KSksXG4gICAgICAgICAgICAgIGluamVjdEZyb21WaWV3UGFyZW50SW5qZWN0b3IodGhpcy52aWV3LCBjcmVhdGVJZGVudGlmaWVyVG9rZW4oSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSwgZmFsc2UpXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgIHRva2VuOiBjcmVhdGVJZGVudGlmaWVyVG9rZW4oSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSxcbiAgICAgICAgICAgICAgdXNlVmFsdWU6IGNyZWF0ZUNvbXBvbmVudEZhY3RvcnlSZXNvbHZlckV4cHJcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEFkZCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgYXMgZmlyc3QgcHJvdmlkZXIgYXMgaXQgZG9lcyBub3QgaGF2ZSBkZXBzIG9uIG90aGVyIHByb3ZpZGVyc1xuICAgICAgICAgIC8vIFByb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZSBhcyBvbmx5IHRoZSBjb21wb25lbnQgYW5kIGl0cyB2aWV3IGNhbiBzZWUgaXQsXG4gICAgICAgICAgLy8gYnV0IG5vYm9keSBlbHNlXG4gICAgICAgICAgdGhpcy5fcmVzb2x2ZWRQcm92aWRlcnNBcnJheS51bnNoaWZ0KG5ldyBQcm92aWRlckFzdChwcm92aWRlci50b2tlbiwgZmFsc2UsIHRydWUsIFtwcm92aWRlcl0sIFByb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZSwgW10sIHRoaXMuc291cmNlQXN0LnNvdXJjZVNwYW4pKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcFZpZXdFeHByXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlRWxlbWVudC5wcm90b3R5cGUuc2V0Q29tcG9uZW50VmlldyA9IGZ1bmN0aW9uIChjb21wVmlld0V4cHIpIHtcbiAgICAgICAgICB0aGlzLmNvbXBWaWV3RXhwciA9IGNvbXBWaWV3RXhwcjtcbiAgICAgICAgICB0aGlzLmNvbnRlbnROb2Rlc0J5TmdDb250ZW50SW5kZXggPVxuICAgICAgICAgICAgICBuZXcgQXJyYXkodGhpcy5jb21wb25lbnQudGVtcGxhdGUubmdDb250ZW50U2VsZWN0b3JzLmxlbmd0aCk7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnROb2Rlc0J5TmdDb250ZW50SW5kZXhbaV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVtYmVkZGVkVmlld1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZUVsZW1lbnQucHJvdG90eXBlLnNldEVtYmVkZGVkVmlldyA9IGZ1bmN0aW9uIChlbWJlZGRlZFZpZXcpIHtcbiAgICAgICAgICB0aGlzLmVtYmVkZGVkVmlldyA9IGVtYmVkZGVkVmlldztcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGVtYmVkZGVkVmlldykpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3JlYXRlVGVtcGxhdGVSZWZFeHByID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLlRlbXBsYXRlUmVmXykpLmluc3RhbnRpYXRlKFtcbiAgICAgICAgICAgICAgICAgIFRISVNfRVhQUiwgbGl0ZXJhbCh0aGlzLm5vZGVJbmRleCksIHRoaXMucmVuZGVyTm9kZVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogY3JlYXRlSWRlbnRpZmllclRva2VuKElkZW50aWZpZXJzLlRlbXBsYXRlUmVmKSxcbiAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBjcmVhdGVUZW1wbGF0ZVJlZkV4cHJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgLy8gQWRkIFRlbXBsYXRlUmVmIGFzIGZpcnN0IHByb3ZpZGVyIGFzIGl0IGRvZXMgbm90IGhhdmUgZGVwcyBvbiBvdGhlciBwcm92aWRlcnNcbiAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZWRQcm92aWRlcnNBcnJheS51bnNoaWZ0KG5ldyBQcm92aWRlckFzdChwcm92aWRlci50b2tlbiwgZmFsc2UsIHRydWUsIFtwcm92aWRlcl0sIFByb3ZpZGVyQXN0VHlwZS5CdWlsdGluLCBbXSwgdGhpcy5zb3VyY2VBc3Quc291cmNlU3BhbikpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LnByb3RvdHlwZS5iZWZvcmVDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KHJlc29sdmVJZGVudGlmaWVyKElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYpLCB0aGlzLnZpZXdDb250YWluZXIucHJvcCgndmNSZWYnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3Jlc29sdmVkUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX3Jlc29sdmVkUHJvdmlkZXJzQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHsgcmV0dXJuIF90aGlzLl9yZXNvbHZlZFByb3ZpZGVycy5zZXQodG9rZW5SZWZlcmVuY2UocHJvdmlkZXIudG9rZW4pLCBwcm92aWRlcik7IH0pO1xuICAgICAgICAgIC8vIGNyZWF0ZSBhbGwgdGhlIHByb3ZpZGVyIGluc3RhbmNlcywgc29tZSBpbiB0aGUgdmlldyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAvLyBzb21lIGFzIGdldHRlcnMuIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGV5IGFyZSBhbHJlYWR5IHNvcnRlZCB0b3BvbG9naWNhbGx5LlxuICAgICAgICAgIEFycmF5LmZyb20odGhpcy5fcmVzb2x2ZWRQcm92aWRlcnMudmFsdWVzKCkpLmZvckVhY2goZnVuY3Rpb24gKHJlc29sdmVkUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNEaXJlY3RpdmVXcmFwcGVyID0gcmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5Db21wb25lbnQgfHxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnMgPSByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2dldERlcGVuZGVuY3kocmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUsIHsgdG9rZW46IHByb3ZpZGVyLnVzZUV4aXN0aW5nIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUZhY3RvcnkuZGlEZXBzO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHNFeHByID0gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gX3RoaXMuX2dldERlcGVuZGVuY3kocmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUsIGRlcCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKHByb3ZpZGVyLnVzZUZhY3RvcnkpLmNhbGxGbihkZXBzRXhwcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUNsYXNzLmRpRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBzRXhwciA9IGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJUeXBlLCBkZXApOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEaXJlY3RpdmVXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZVdyYXBwZXJJZGVudGlmaWVyID0geyByZWZlcmVuY2U6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmlldy50YXJnZXREZXBlbmRlbmNpZXMucHVzaChuZXcgRGlyZWN0aXZlV3JhcHBlckRlcGVuZGVuY3kocHJvdmlkZXIudXNlQ2xhc3MsIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlci5kaXJXcmFwcGVyQ2xhc3NOYW1lKHByb3ZpZGVyLnVzZUNsYXNzKSwgZGlyZWN0aXZlV3JhcHBlcklkZW50aWZpZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5jcmVhdGUoZGlyZWN0aXZlV3JhcHBlcklkZW50aWZpZXIsIGRlcHNFeHByKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKHByb3ZpZGVyLnVzZUNsYXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluc3RhbnRpYXRlKGRlcHNFeHByLCBpbXBvcnRUeXBlKHByb3ZpZGVyLnVzZUNsYXNzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0KHByb3ZpZGVyLnVzZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3BOYW1lID0gXCJfXCIgKyB0b2tlbk5hbWUocmVzb2x2ZWRQcm92aWRlci50b2tlbikgKyBcIl9cIiArIF90aGlzLm5vZGVJbmRleCArIFwiX1wiICsgX3RoaXMuaW5zdGFuY2VzLnNpemU7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluc3RhbmNlID0gY3JlYXRlUHJvdmlkZXJQcm9wZXJ0eShwcm9wTmFtZSwgcmVzb2x2ZWRQcm92aWRlciwgcHJvdmlkZXJWYWx1ZUV4cHJlc3Npb25zLCByZXNvbHZlZFByb3ZpZGVyLm11bHRpUHJvdmlkZXIsIHJlc29sdmVkUHJvdmlkZXIuZWFnZXIsIF90aGlzKTtcbiAgICAgICAgICAgICAgaWYgKGlzRGlyZWN0aXZlV3JhcHBlcikge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLnNldCh0b2tlblJlZmVyZW5jZShyZXNvbHZlZFByb3ZpZGVyLnRva2VuKSwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgX3RoaXMuaW5zdGFuY2VzLnNldCh0b2tlblJlZmVyZW5jZShyZXNvbHZlZFByb3ZpZGVyLnRva2VuKSwgRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLmNvbnRleHQoaW5zdGFuY2UpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmluc3RhbmNlcy5zZXQodG9rZW5SZWZlcmVuY2UocmVzb2x2ZWRQcm92aWRlci50b2tlbiksIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oaSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmUgPSB0aGlzXzEuX2RpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZUluc3RhbmNlID0gdGhpc18xLmluc3RhbmNlcy5nZXQodG9rZW5SZWZlcmVuY2UoaWRlbnRpZmllclRva2VuKGRpcmVjdGl2ZS50eXBlKSkpO1xuICAgICAgICAgICAgICBkaXJlY3RpdmUucXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeU1ldGEpIHsgX3RoaXMuX2FkZFF1ZXJ5KHF1ZXJ5TWV0YSwgZGlyZWN0aXZlSW5zdGFuY2UpOyB9KTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciB0aGlzXzEgPSB0aGlzO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB0aGlzLl9kaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJpZXNXaXRoUmVhZHMgPSBbXTtcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuX3Jlc29sdmVkUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJpZXNGb3JQcm92aWRlciA9IF90aGlzLl9nZXRRdWVyaWVzRm9yKHJlc29sdmVkUHJvdmlkZXIudG9rZW4pO1xuICAgICAgICAgICAgICBxdWVyaWVzV2l0aFJlYWRzLnB1c2guYXBwbHkocXVlcmllc1dpdGhSZWFkcywgcXVlcmllc0ZvclByb3ZpZGVyLm1hcChmdW5jdGlvbiAocXVlcnkpIHsgcmV0dXJuIG5ldyBfUXVlcnlXaXRoUmVhZChxdWVyeSwgcmVzb2x2ZWRQcm92aWRlci50b2tlbik7IH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnJlZmVyZW5jZVRva2VucykuZm9yRWFjaChmdW5jdGlvbiAodmFyTmFtZSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlbiA9IF90aGlzLnJlZmVyZW5jZVRva2Vuc1t2YXJOYW1lXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFyVmFsdWU7XG4gICAgICAgICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgdmFyVmFsdWUgPSBfdGhpcy5pbnN0YW5jZXMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXJWYWx1ZSA9IF90aGlzLnJlbmRlck5vZGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX3RoaXMudmlldy5sb2NhbHMuc2V0KHZhck5hbWUsIHZhclZhbHVlKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFyVG9rZW4gPSB7IHZhbHVlOiB2YXJOYW1lIH07XG4gICAgICAgICAgICAgIHF1ZXJpZXNXaXRoUmVhZHMucHVzaC5hcHBseShxdWVyaWVzV2l0aFJlYWRzLCBfdGhpcy5fZ2V0UXVlcmllc0Zvcih2YXJUb2tlbikubWFwKGZ1bmN0aW9uIChxdWVyeSkgeyByZXR1cm4gbmV3IF9RdWVyeVdpdGhSZWFkKHF1ZXJ5LCB2YXJUb2tlbik7IH0pKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBxdWVyaWVzV2l0aFJlYWRzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5V2l0aFJlYWQpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWU7XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocXVlcnlXaXRoUmVhZC5yZWFkLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBxdWVyeSBmb3IgYW4gaWRlbnRpZmllclxuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfdGhpcy5pbnN0YW5jZXMuZ2V0KHRva2VuUmVmZXJlbmNlKHF1ZXJ5V2l0aFJlYWQucmVhZCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gcXVlcnkgZm9yIGEgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlbiA9IF90aGlzLnJlZmVyZW5jZVRva2Vuc1txdWVyeVdpdGhSZWFkLnJlYWQudmFsdWVdO1xuICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh0b2tlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF90aGlzLmluc3RhbmNlcy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX3RoaXMuZWxlbWVudFJlZjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgcXVlcnlXaXRoUmVhZC5xdWVyeS5hZGRWYWx1ZSh2YWx1ZSwgX3RoaXMudmlldyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY2hpbGROb2RlQ291bnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LnByb3RvdHlwZS5hZnRlckNoaWxkcmVuID0gZnVuY3Rpb24gKGNoaWxkTm9kZUNvdW50KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuX3Jlc29sdmVkUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgIC8vIE5vdGU6IGFmdGVyQ2hpbGRyZW4gaXMgY2FsbGVkIGFmdGVyIHJlY3Vyc2luZyBpbnRvIGNoaWxkcmVuLlxuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGdvb2Qgc28gdGhhdCBhbiBpbmplY3RvciBtYXRjaCBpbiBhbiBlbGVtZW50IHRoYXQgaXMgY2xvc2VyIHRvIGEgcmVxdWVzdGluZyBlbGVtZW50XG4gICAgICAgICAgICAgIC8vIG1hdGNoZXMgZmlyc3QuXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3ZpZGVyRXhwciA9IF90aGlzLmluc3RhbmNlcy5nZXQodG9rZW5SZWZlcmVuY2UocmVzb2x2ZWRQcm92aWRlci50b2tlbikpO1xuICAgICAgICAgICAgICAvLyBOb3RlOiB2aWV3IHByb3ZpZGVycyBhcmUgb25seSB2aXNpYmxlIG9uIHRoZSBpbmplY3RvciBvZiB0aGF0IGVsZW1lbnQuXG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QgYXMgdGhlIHJ1bGVzIGR1cmluZyBjb2RlZ2VuIGRvbid0IGFsbG93IGEgZGlyZWN0aXZlXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBob2xkIG9mIGEgdmlldyBwcm92ZGllciBvbiB0aGUgc2FtZSBlbGVtZW50LiBXZSBzdGlsbCBkbyB0aGlzIHNlbWFudGljXG4gICAgICAgICAgICAgIC8vIGFzIGl0IHNpbXBsaWZpZXMgb3VyIG1vZGVsIHRvIGhhdmluZyBvbmx5IG9uZSBydW50aW1lIGluamVjdG9yIHBlciBlbGVtZW50LlxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlckNoaWxkTm9kZUNvdW50ID0gcmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZSA/IDAgOiBjaGlsZE5vZGVDb3VudDtcbiAgICAgICAgICAgICAgX3RoaXMudmlldy5pbmplY3RvckdldE1ldGhvZC5hZGRTdG10KGNyZWF0ZUluamVjdEludGVybmFsQ29uZGl0aW9uKF90aGlzLm5vZGVJbmRleCwgcHJvdmlkZXJDaGlsZE5vZGVDb3VudCwgcmVzb2x2ZWRQcm92aWRlciwgcHJvdmlkZXJFeHByKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9xdWVyaWVzLnZhbHVlcygpKVxuICAgICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocXVlcmllcykgeyByZXR1cm4gcXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBxLmFmdGVyQ2hpbGRyZW4oX3RoaXMudmlldy5jcmVhdGVNZXRob2QsIF90aGlzLnZpZXcudXBkYXRlQ29udGVudFF1ZXJpZXNNZXRob2QpO1xuICAgICAgICAgIH0pOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmdDb250ZW50SW5kZXhcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZUV4cHJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LnByb3RvdHlwZS5hZGRDb250ZW50Tm9kZSA9IGZ1bmN0aW9uIChuZ0NvbnRlbnRJbmRleCwgbm9kZUV4cHIpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnROb2Rlc0J5TmdDb250ZW50SW5kZXhbbmdDb250ZW50SW5kZXhdLnB1c2gobm9kZUV4cHIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZUVsZW1lbnQucHJvdG90eXBlLmdldENvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29tcG9uZW50KSA/XG4gICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2VzLmdldCh0b2tlblJlZmVyZW5jZShpZGVudGlmaWVyVG9rZW4odGhpcy5jb21wb25lbnQudHlwZSkpKSA6XG4gICAgICAgICAgICAgIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlRWxlbWVudC5wcm90b3R5cGUuZ2V0UHJvdmlkZXJUb2tlbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fcmVzb2x2ZWRQcm92aWRlcnMudmFsdWVzKCkpXG4gICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHJlc29sdmVkUHJvdmlkZXIpIHsgcmV0dXJuIGNyZWF0ZURpVG9rZW5FeHByZXNzaW9uKHJlc29sdmVkUHJvdmlkZXIudG9rZW4pOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LnByb3RvdHlwZS5fZ2V0UXVlcmllc0ZvciA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnRFbCA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlzdGFuY2UgPSAwO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJpZXM7XG4gICAgICAgICAgd2hpbGUgKCFjdXJyZW50RWwuaXNOdWxsKCkpIHtcbiAgICAgICAgICAgICAgcXVlcmllcyA9IGN1cnJlbnRFbC5fcXVlcmllcy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChxdWVyaWVzKSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBxdWVyaWVzLmZpbHRlcihmdW5jdGlvbiAocXVlcnkpIHsgcmV0dXJuIHF1ZXJ5Lm1ldGEuZGVzY2VuZGFudHMgfHwgZGlzdGFuY2UgPD0gMTsgfSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50RWwuX2RpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2UrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXJyZW50RWwgPSBjdXJyZW50RWwucGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBxdWVyaWVzID0gdGhpcy52aWV3LmNvbXBvbmVudFZpZXcudmlld1F1ZXJpZXMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChxdWVyaWVzKSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIHF1ZXJpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBxdWVyeU1ldGFcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5zdGFuY2VcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVFbGVtZW50LnByb3RvdHlwZS5fYWRkUXVlcnkgPSBmdW5jdGlvbiAocXVlcnlNZXRhLCBkaXJlY3RpdmVJbnN0YW5jZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3BOYW1lID0gXCJfcXVlcnlfXCIgKyB0b2tlbk5hbWUocXVlcnlNZXRhLnNlbGVjdG9yc1swXSkgKyBcIl9cIiArIHRoaXMubm9kZUluZGV4ICsgXCJfXCIgKyB0aGlzLl9xdWVyeUNvdW50Kys7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcnlMaXN0ID0gY3JlYXRlUXVlcnlMaXN0KHF1ZXJ5TWV0YSwgZGlyZWN0aXZlSW5zdGFuY2UsIHByb3BOYW1lLCB0aGlzLnZpZXcpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHF1ZXJ5ID0gbmV3IENvbXBpbGVRdWVyeShxdWVyeU1ldGEsIHF1ZXJ5TGlzdCwgZGlyZWN0aXZlSW5zdGFuY2UsIHRoaXMudmlldyk7XG4gICAgICAgICAgYWRkUXVlcnlUb1Rva2VuTWFwKHRoaXMuX3F1ZXJpZXMsIHF1ZXJ5KTtcbiAgICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RpbmdQcm92aWRlclR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gZGVwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlRWxlbWVudC5wcm90b3R5cGUuX2dldExvY2FsRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlLCBkZXApIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGVwLnRva2VuKSkge1xuICAgICAgICAgICAgICAvLyBhY2Nlc3MgYnVpbHRpbnMgd2l0aCBzcGVjaWFsIHZpc2liaWxpdHlcbiAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pID09PSByZXNvbHZlSWRlbnRpZmllcihJZGVudGlmaWVycy5DaGFuZ2VEZXRlY3RvclJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wVmlld0V4cHIucHJvcCgncmVmJyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlJblZpZXcoVEhJU19FWFBSLnByb3AoJ3JlZicpLCB0aGlzLnZpZXcsIHRoaXMudmlldy5jb21wb25lbnRWaWV3KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gYWNjZXNzIHJlZ3VsYXIgcHJvdmlkZXJzIG9uIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZFByb3ZpZGVyID0gdGhpcy5fcmVzb2x2ZWRQcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikpO1xuICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZGlyZWN0aXZlcyAvIHB1YmxpYyBzZXJ2aWNlcyB0byBhY2Nlc3MgcHJpdmF0ZSBzZXJ2aWNlcy5cbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgY29tcG9uZW50cyBhbmQgcHJpdmF0ZSBzZXJ2aWNlcyBjYW4gYWNjZXNzIHByaXZhdGUgc2VydmljZXMuXG4gICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRQcm92aWRlciAmJiAocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkRpcmVjdGl2ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RpbmdQcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5QdWJsaWNTZXJ2aWNlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuUHJpdmF0ZVNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuaW5zdGFuY2VzLmdldCh0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZXF1ZXN0aW5nUHJvdmlkZXJUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGRlcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZUVsZW1lbnQucHJvdG90eXBlLl9nZXREZXBlbmRlbmN5ID0gZnVuY3Rpb24gKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIGRlcCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJFbGVtZW50ID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBudWxsO1xuICAgICAgICAgIGlmIChkZXAuaXNWYWx1ZSkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBsaXRlcmFsKGRlcC52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVzdWx0ICYmICFkZXAuaXNTa2lwU2VsZikge1xuICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRMb2NhbERlcGVuZGVuY3kocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSwgZGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY2hlY2sgcGFyZW50IGVsZW1lbnRzXG4gICAgICAgICAgd2hpbGUgKCFyZXN1bHQgJiYgIWN1cnJFbGVtZW50LnBhcmVudC5pc051bGwoKSkge1xuICAgICAgICAgICAgICBjdXJyRWxlbWVudCA9IGN1cnJFbGVtZW50LnBhcmVudDtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gY3VyckVsZW1lbnQuX2dldExvY2FsRGVwZW5kZW5jeShQcm92aWRlckFzdFR5cGUuUHVibGljU2VydmljZSwgeyB0b2tlbjogZGVwLnRva2VuIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBpbmplY3RGcm9tVmlld1BhcmVudEluamVjdG9yKHRoaXMudmlldywgZGVwLnRva2VuLCBkZXAuaXNPcHRpb25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IE5VTExfRVhQUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5SW5WaWV3KHJlc3VsdCwgdGhpcy52aWV3LCBjdXJyRWxlbWVudC52aWV3KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQ29tcGlsZUVsZW1lbnQ7XG4gIH0oQ29tcGlsZU5vZGUpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbm9kZUluZGV4XG4gICAqIEBwYXJhbSB7P30gY2hpbGROb2RlQ291bnRcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgKiBAcGFyYW0gez99IHByb3ZpZGVyRXhwclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlSW5qZWN0SW50ZXJuYWxDb25kaXRpb24obm9kZUluZGV4LCBjaGlsZE5vZGVDb3VudCwgcHJvdmlkZXIsIHByb3ZpZGVyRXhwcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXhDb25kaXRpb247XG4gICAgICBpZiAoY2hpbGROb2RlQ291bnQgPiAwKSB7XG4gICAgICAgICAgaW5kZXhDb25kaXRpb24gPSBsaXRlcmFsKG5vZGVJbmRleClcbiAgICAgICAgICAgICAgLmxvd2VyRXF1YWxzKEluamVjdE1ldGhvZFZhcnMkMS5yZXF1ZXN0Tm9kZUluZGV4KVxuICAgICAgICAgICAgICAuYW5kKEluamVjdE1ldGhvZFZhcnMkMS5yZXF1ZXN0Tm9kZUluZGV4Lmxvd2VyRXF1YWxzKGxpdGVyYWwobm9kZUluZGV4ICsgY2hpbGROb2RlQ291bnQpKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICBpbmRleENvbmRpdGlvbiA9IGxpdGVyYWwobm9kZUluZGV4KS5pZGVudGljYWwoSW5qZWN0TWV0aG9kVmFycyQxLnJlcXVlc3ROb2RlSW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBJZlN0bXQoSW5qZWN0TWV0aG9kVmFycyQxLnRva2VuLmlkZW50aWNhbChjcmVhdGVEaVRva2VuRXhwcmVzc2lvbihwcm92aWRlci50b2tlbikpLmFuZChpbmRleENvbmRpdGlvbiksIFtuZXcgUmV0dXJuU3RhdGVtZW50KHByb3ZpZGVyRXhwcildKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwcm9wTmFtZVxuICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAqIEBwYXJhbSB7P30gcHJvdmlkZXJWYWx1ZUV4cHJlc3Npb25zXG4gICAqIEBwYXJhbSB7P30gaXNNdWx0aVxuICAgKiBAcGFyYW0gez99IGlzRWFnZXJcbiAgICogQHBhcmFtIHs/fSBjb21waWxlRWxlbWVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUHJvdmlkZXJQcm9wZXJ0eShwcm9wTmFtZSwgcHJvdmlkZXIsIHByb3ZpZGVyVmFsdWVFeHByZXNzaW9ucywgaXNNdWx0aSwgaXNFYWdlciwgY29tcGlsZUVsZW1lbnQpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXcgPSBjb21waWxlRWxlbWVudC52aWV3O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRQcm92aWRlclZhbHVlRXhwcjtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGU7XG4gICAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXJWYWx1ZUV4cHIgPSBsaXRlcmFsQXJyKHByb3ZpZGVyVmFsdWVFeHByZXNzaW9ucyk7XG4gICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUoRFlOQU1JQ19UWVBFKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXJWYWx1ZUV4cHIgPSBwcm92aWRlclZhbHVlRXhwcmVzc2lvbnNbMF07XG4gICAgICAgICAgdHlwZSA9IHByb3ZpZGVyVmFsdWVFeHByZXNzaW9uc1swXS50eXBlO1xuICAgICAgfVxuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdHlwZSA9IERZTkFNSUNfVFlQRTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VhZ2VyKSB7XG4gICAgICAgICAgdmlldy5maWVsZHMucHVzaChuZXcgQ2xhc3NGaWVsZChwcm9wTmFtZSwgdHlwZSkpO1xuICAgICAgICAgIHZpZXcuY3JlYXRlTWV0aG9kLmFkZFN0bXQoVEhJU19FWFBSLnByb3AocHJvcE5hbWUpLnNldChyZXNvbHZlZFByb3ZpZGVyVmFsdWVFeHByKS50b1N0bXQoKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnRlcm5hbEZpZWxkID0gXCJfXCIgKyBwcm9wTmFtZTtcbiAgICAgICAgICB2aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGludGVybmFsRmllbGQsIHR5cGUpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBnZXR0ZXIgPSBuZXcgQ29tcGlsZU1ldGhvZCh2aWV3KTtcbiAgICAgICAgICBnZXR0ZXIucmVzZXREZWJ1Z0luZm8oY29tcGlsZUVsZW1lbnQubm9kZUluZGV4LCBjb21waWxlRWxlbWVudC5zb3VyY2VBc3QpO1xuICAgICAgICAgIC8vIE5vdGU6IEVxdWFscyBpcyBpbXBvcnRhbnQgZm9yIEpTIHNvIHRoYXQgaXQgYWxzbyBjaGVja3MgdGhlIHVuZGVmaW5lZCBjYXNlIVxuICAgICAgICAgIGdldHRlci5hZGRTdG10KG5ldyBJZlN0bXQoVEhJU19FWFBSLnByb3AoaW50ZXJuYWxGaWVsZCkuaXNCbGFuaygpLCBbVEhJU19FWFBSLnByb3AoaW50ZXJuYWxGaWVsZCkuc2V0KHJlc29sdmVkUHJvdmlkZXJWYWx1ZUV4cHIpLnRvU3RtdCgpXSkpO1xuICAgICAgICAgIGdldHRlci5hZGRTdG10KG5ldyBSZXR1cm5TdGF0ZW1lbnQoVEhJU19FWFBSLnByb3AoaW50ZXJuYWxGaWVsZCkpKTtcbiAgICAgICAgICB2aWV3LmdldHRlcnMucHVzaChuZXcgQ2xhc3NHZXR0ZXIocHJvcE5hbWUsIGdldHRlci5maW5pc2goKSwgdHlwZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFRISVNfRVhQUi5wcm9wKHByb3BOYW1lKTtcbiAgfVxuICB2YXIgX1F1ZXJ5V2l0aFJlYWQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5XG4gICAgICAgKiBAcGFyYW0gez99IG1hdGNoXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9RdWVyeVdpdGhSZWFkKHF1ZXJ5LCBtYXRjaCkge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgICB0aGlzLnJlYWQgPSBxdWVyeS5tZXRhLnJlYWQgfHwgbWF0Y2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gX1F1ZXJ5V2l0aFJlYWQ7XG4gIH0oKSk7XG5cbiAgdmFyIENvbXBpbGVQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAgICAgKiBAcGFyYW0gez99IG1ldGFcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZVBpcGUodmlldywgbWV0YSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICAgIHRoaXMuX3B1cmVQaXBlUHJveHlDb3VudCA9IDA7XG4gICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IFRISVNfRVhQUi5wcm9wKFwiX3BpcGVfXCIgKyBtZXRhLm5hbWUgKyBcIl9cIiArIHZpZXcucGlwZUNvdW50KyspO1xuICAgICAgICAgIHZhciBkZXBzID0gdGhpcy5tZXRhLnR5cGUuZGlEZXBzLm1hcChmdW5jdGlvbiAoZGlEZXApIHtcbiAgICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRpRGVwLnRva2VuKSA9PT0gcmVzb2x2ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JSZWYpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlJblZpZXcoVEhJU19FWFBSLnByb3AoJ3JlZicpLCBfdGhpcy52aWV3LCBfdGhpcy52aWV3LmNvbXBvbmVudFZpZXcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpbmplY3RGcm9tVmlld1BhcmVudEluamVjdG9yKHZpZXcsIGRpRGVwLnRva2VuLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKHRoaXMuaW5zdGFuY2UubmFtZSwgaW1wb3J0VHlwZSh0aGlzLm1ldGEudHlwZSkpKTtcbiAgICAgICAgICB0aGlzLnZpZXcuY3JlYXRlTWV0aG9kLnJlc2V0RGVidWdJbmZvKG51bGwsIG51bGwpO1xuICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QuYWRkU3RtdChUSElTX0VYUFIucHJvcCh0aGlzLmluc3RhbmNlLm5hbWUpXG4gICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcih0aGlzLm1ldGEudHlwZSkuaW5zdGFudGlhdGUoZGVwcykpXG4gICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVQaXBlLmNhbGwgPSBmdW5jdGlvbiAodmlldywgbmFtZSwgYXJncykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBWaWV3ID0gdmlldy5jb21wb25lbnRWaWV3O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1ldGEgPSBfZmluZFBpcGVNZXRhKGNvbXBWaWV3LCBuYW1lKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaXBlO1xuICAgICAgICAgIGlmIChtZXRhLnB1cmUpIHtcbiAgICAgICAgICAgICAgLy8gcHVyZSBwaXBlcyBsaXZlIG9uIHRoZSBjb21wb25lbnQgdmlld1xuICAgICAgICAgICAgICBwaXBlID0gY29tcFZpZXcucHVyZVBpcGVzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgaWYgKCFwaXBlKSB7XG4gICAgICAgICAgICAgICAgICBwaXBlID0gbmV3IENvbXBpbGVQaXBlKGNvbXBWaWV3LCBtZXRhKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBWaWV3LnB1cmVQaXBlcy5zZXQobmFtZSwgcGlwZSk7XG4gICAgICAgICAgICAgICAgICBjb21wVmlldy5waXBlcy5wdXNoKHBpcGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOb24gcHVyZSBwaXBlcyBsaXZlIG9uIHRoZSB2aWV3IHRoYXQgY2FsbGVkIGl0XG4gICAgICAgICAgICAgIHBpcGUgPSBuZXcgQ29tcGlsZVBpcGUodmlldywgbWV0YSk7XG4gICAgICAgICAgICAgIHZpZXcucGlwZXMucHVzaChwaXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBpcGUuX2NhbGwodmlldywgYXJncyk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBpbGVQaXBlLnByb3RvdHlwZSwgXCJwdXJlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5tZXRhLnB1cmU7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNhbGxpbmdWaWV3XG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIENvbXBpbGVQaXBlLnByb3RvdHlwZS5fY2FsbCA9IGZ1bmN0aW9uIChjYWxsaW5nVmlldywgYXJncykge1xuICAgICAgICAgIGlmICh0aGlzLm1ldGEucHVyZSkge1xuICAgICAgICAgICAgICAvLyBQdXJlUGlwZVByb3hpZXMgbGl2ZSBvbiB0aGUgdmlldyB0aGF0IGNhbGxlZCB0aGVtLlxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwdXJlUGlwZVByb3h5SW5zdGFuY2UgPSBUSElTX0VYUFIucHJvcCh0aGlzLmluc3RhbmNlLm5hbWUgKyBcIl9cIiArIHRoaXMuX3B1cmVQaXBlUHJveHlDb3VudCsrKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGlwZUluc3RhbmNlU2VlbkZyb21QdXJlUHJveHkgPSBnZXRQcm9wZXJ0eUluVmlldyh0aGlzLmluc3RhbmNlLCBjYWxsaW5nVmlldywgdGhpcy52aWV3KTtcbiAgICAgICAgICAgICAgY3JlYXRlUHVyZVByb3h5KHBpcGVJbnN0YW5jZVNlZW5Gcm9tUHVyZVByb3h5LnByb3AoJ3RyYW5zZm9ybScpXG4gICAgICAgICAgICAgICAgICAuY2FsbE1ldGhvZChCdWlsdGluTWV0aG9kLkJpbmQsIFtwaXBlSW5zdGFuY2VTZWVuRnJvbVB1cmVQcm94eV0pLCBhcmdzLmxlbmd0aCwgcHVyZVBpcGVQcm94eUluc3RhbmNlLCB7IGZpZWxkczogY2FsbGluZ1ZpZXcuZmllbGRzLCBjdG9yU3RtdHM6IGNhbGxpbmdWaWV3LmNyZWF0ZU1ldGhvZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5jYXN0QnlWYWx1ZSkpXG4gICAgICAgICAgICAgICAgICAuY2FsbEZuKFtwdXJlUGlwZVByb3h5SW5zdGFuY2UsIHBpcGVJbnN0YW5jZVNlZW5Gcm9tUHVyZVByb3h5LnByb3AoJ3RyYW5zZm9ybScpXSlcbiAgICAgICAgICAgICAgICAgIC5jYWxsRm4oYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlJblZpZXcodGhpcy5pbnN0YW5jZSwgY2FsbGluZ1ZpZXcsIHRoaXMudmlldykuY2FsbE1ldGhvZCgndHJhbnNmb3JtJywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlUGlwZTtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9maW5kUGlwZU1ldGEodmlldywgbmFtZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGlwZU1ldGEgPSBudWxsO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gdmlldy5waXBlTWV0YXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb2NhbFBpcGVNZXRhID0gdmlldy5waXBlTWV0YXNbaV07XG4gICAgICAgICAgaWYgKGxvY2FsUGlwZU1ldGEubmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgICAgIHBpcGVNZXRhID0gbG9jYWxQaXBlTWV0YTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFwaXBlTWV0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgc3RhdGU6IENvdWxkIG5vdCBmaW5kIHBpcGUgXCIgKyBuYW1lICsgXCIgYWx0aG91Z2ggdGhlIHBhcnNlciBzaG91bGQgaGF2ZSBkZXRlY3RlZCB0aGlzIGVycm9yIVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwaXBlTWV0YTtcbiAgfVxuXG4gIHZhciBDb21waWxlVmlld1Jvb3ROb2RlVHlwZSA9IHt9O1xuICBDb21waWxlVmlld1Jvb3ROb2RlVHlwZS5Ob2RlID0gMDtcbiAgQ29tcGlsZVZpZXdSb290Tm9kZVR5cGUuVmlld0NvbnRhaW5lciA9IDE7XG4gIENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5nQ29udGVudCA9IDI7XG4gIENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlW0NvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5vZGVdID0gXCJOb2RlXCI7XG4gIENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlW0NvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLlZpZXdDb250YWluZXJdID0gXCJWaWV3Q29udGFpbmVyXCI7XG4gIENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlW0NvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5nQ29udGVudF0gPSBcIk5nQ29udGVudFwiO1xuICB2YXIgQ29tcGlsZVZpZXdSb290Tm9kZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBleHByXG4gICAgICAgKiBAcGFyYW0gez89fSBuZ0NvbnRlbnRJbmRleFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlVmlld1Jvb3ROb2RlKHR5cGUsIGV4cHIsIG5nQ29udGVudEluZGV4KSB7XG4gICAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgICB0aGlzLmV4cHIgPSBleHByO1xuICAgICAgICAgIHRoaXMubmdDb250ZW50SW5kZXggPSBuZ0NvbnRlbnRJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDb21waWxlVmlld1Jvb3ROb2RlO1xuICB9KCkpO1xuICB2YXIgQ29tcGlsZVZpZXcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICogQHBhcmFtIHs/fSBnZW5Db25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZU1ldGFzXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25zXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdJbmRleFxuICAgICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbkVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVWYXJpYWJsZUJpbmRpbmdzXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldERlcGVuZGVuY2llc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBDb21waWxlVmlldyhjb21wb25lbnQsIGdlbkNvbmZpZywgcGlwZU1ldGFzLCBzdHlsZXMsIGFuaW1hdGlvbnMsIHZpZXdJbmRleCwgZGVjbGFyYXRpb25FbGVtZW50LCB0ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3MsIHRhcmdldERlcGVuZGVuY2llcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgdGhpcy5nZW5Db25maWcgPSBnZW5Db25maWc7XG4gICAgICAgICAgdGhpcy5waXBlTWV0YXMgPSBwaXBlTWV0YXM7XG4gICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb25zID0gYW5pbWF0aW9ucztcbiAgICAgICAgICB0aGlzLnZpZXdJbmRleCA9IHZpZXdJbmRleDtcbiAgICAgICAgICB0aGlzLmRlY2xhcmF0aW9uRWxlbWVudCA9IGRlY2xhcmF0aW9uRWxlbWVudDtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncyA9IHRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncztcbiAgICAgICAgICB0aGlzLnRhcmdldERlcGVuZGVuY2llcyA9IHRhcmdldERlcGVuZGVuY2llcztcbiAgICAgICAgICB0aGlzLnZpZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlcyA9IFtdO1xuICAgICAgICAgIHRoaXMubGFzdFJlbmRlck5vZGUgPSBOVUxMX0VYUFI7XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVycyA9IFtdO1xuICAgICAgICAgIHRoaXMubWV0aG9kcyA9IFtdO1xuICAgICAgICAgIHRoaXMuY3RvclN0bXRzID0gW107XG4gICAgICAgICAgdGhpcy5maWVsZHMgPSBbXTtcbiAgICAgICAgICB0aGlzLmdldHRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzID0gW107XG4gICAgICAgICAgdGhpcy5wdXJlUGlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5waXBlcyA9IFtdO1xuICAgICAgICAgIHRoaXMubG9jYWxzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMubGl0ZXJhbEFycmF5Q291bnQgPSAwO1xuICAgICAgICAgIHRoaXMubGl0ZXJhbE1hcENvdW50ID0gMDtcbiAgICAgICAgICB0aGlzLnBpcGVDb3VudCA9IDA7XG4gICAgICAgICAgdGhpcy5jcmVhdGVNZXRob2QgPSBuZXcgQ29tcGlsZU1ldGhvZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmFuaW1hdGlvbkJpbmRpbmdzTWV0aG9kID0gbmV3IENvbXBpbGVNZXRob2QodGhpcyk7XG4gICAgICAgICAgdGhpcy5pbmplY3RvckdldE1ldGhvZCA9IG5ldyBDb21waWxlTWV0aG9kKHRoaXMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudFF1ZXJpZXNNZXRob2QgPSBuZXcgQ29tcGlsZU1ldGhvZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmRpcnR5UGFyZW50UXVlcmllc01ldGhvZCA9IG5ldyBDb21waWxlTWV0aG9kKHRoaXMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVmlld1F1ZXJpZXNNZXRob2QgPSBuZXcgQ29tcGlsZU1ldGhvZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXNJbklucHV0c01ldGhvZCA9IG5ldyBDb21waWxlTWV0aG9kKHRoaXMpO1xuICAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc1JlbmRlclByb3BlcnRpZXNNZXRob2QgPSBuZXcgQ29tcGlsZU1ldGhvZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc01ldGhvZCA9IG5ldyBDb21waWxlTWV0aG9kKHRoaXMpO1xuICAgICAgICAgIHRoaXMuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kID0gbmV3IENvbXBpbGVNZXRob2QodGhpcyk7XG4gICAgICAgICAgdGhpcy5kZXN0cm95TWV0aG9kID0gbmV3IENvbXBpbGVNZXRob2QodGhpcyk7XG4gICAgICAgICAgdGhpcy5kZXRhY2hNZXRob2QgPSBuZXcgQ29tcGlsZU1ldGhvZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnZpZXdUeXBlID0gZ2V0Vmlld1R5cGUoY29tcG9uZW50LCB2aWV3SW5kZXgpO1xuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gZ2V0Vmlld0NsYXNzTmFtZShjb21wb25lbnQsIHZpZXdJbmRleCk7XG4gICAgICAgICAgdGhpcy5jbGFzc1R5cGUgPSBleHByZXNzaW9uVHlwZSh2YXJpYWJsZSh0aGlzLmNsYXNzTmFtZSkpO1xuICAgICAgICAgIHRoaXMuY2xhc3NFeHByID0gdmFyaWFibGUodGhpcy5jbGFzc05hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLnZpZXdUeXBlID09PSBWaWV3VHlwZS5DT01QT05FTlQgfHwgdGhpcy52aWV3VHlwZSA9PT0gVmlld1R5cGUuSE9TVCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFZpZXcgPSB0aGlzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3ID0gdGhpcy5kZWNsYXJhdGlvbkVsZW1lbnQudmlldy5jb21wb25lbnRWaWV3O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvbmVudENvbnRleHQgPVxuICAgICAgICAgICAgICBnZXRQcm9wZXJ0eUluVmlldyhUSElTX0VYUFIucHJvcCgnY29udGV4dCcpLCB0aGlzLCB0aGlzLmNvbXBvbmVudFZpZXcpO1xuICAgICAgICAgIHZhciB2aWV3UXVlcmllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBpZiAodGhpcy52aWV3VHlwZSA9PT0gVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgIHZhciBkaXJlY3RpdmVJbnN0YW5jZV8xID0gVEhJU19FWFBSLnByb3AoJ2NvbnRleHQnKTtcbiAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnQudmlld1F1ZXJpZXMuZm9yRWFjaChmdW5jdGlvbiAocXVlcnlNZXRhLCBxdWVyeUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcHJvcE5hbWUgPSBcIl92aWV3UXVlcnlfXCIgKyB0b2tlbk5hbWUocXVlcnlNZXRhLnNlbGVjdG9yc1swXSkgKyBcIl9cIiArIHF1ZXJ5SW5kZXg7XG4gICAgICAgICAgICAgICAgICB2YXIgcXVlcnlMaXN0ID0gY3JlYXRlUXVlcnlMaXN0KHF1ZXJ5TWV0YSwgZGlyZWN0aXZlSW5zdGFuY2VfMSwgcHJvcE5hbWUsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgIHZhciBxdWVyeSA9IG5ldyBDb21waWxlUXVlcnkocXVlcnlNZXRhLCBxdWVyeUxpc3QsIGRpcmVjdGl2ZUluc3RhbmNlXzEsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgIGFkZFF1ZXJ5VG9Ub2tlbk1hcCh2aWV3UXVlcmllcywgcXVlcnkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy52aWV3UXVlcmllcyA9IHZpZXdRdWVyaWVzO1xuICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyBfdGhpcy5sb2NhbHMuc2V0KGVudHJ5WzFdLCBUSElTX0VYUFIucHJvcCgnY29udGV4dCcpLnByb3AoZW50cnlbMF0pKTsgfSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmRlY2xhcmF0aW9uRWxlbWVudC5pc051bGwoKSkge1xuICAgICAgICAgICAgICB0aGlzLmRlY2xhcmF0aW9uRWxlbWVudC5zZXRFbWJlZGRlZFZpZXcodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgICAqIEBwYXJhbSB7P30gYXJnc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZVZpZXcucHJvdG90eXBlLmNhbGxQaXBlID0gZnVuY3Rpb24gKG5hbWUsIGlucHV0LCBhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIENvbXBpbGVQaXBlLmNhbGwodGhpcywgbmFtZSwgW2lucHV0XS5jb25jYXQoYXJncykpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBDb21waWxlVmlldy5wcm90b3R5cGUuZ2V0TG9jYWwgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIGlmIChuYW1lID09IEV2ZW50SGFuZGxlclZhcnMuZXZlbnQubmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVyVmFycy5ldmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyclZpZXcgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IGN1cnJWaWV3LmxvY2Fscy5nZXQobmFtZSk7XG4gICAgICAgICAgd2hpbGUgKCFyZXN1bHQgJiYgaXNQcmVzZW50KGN1cnJWaWV3LmRlY2xhcmF0aW9uRWxlbWVudC52aWV3KSkge1xuICAgICAgICAgICAgICBjdXJyVmlldyA9IGN1cnJWaWV3LmRlY2xhcmF0aW9uRWxlbWVudC52aWV3O1xuICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyVmlldy5sb2NhbHMuZ2V0KG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5SW5WaWV3KHJlc3VsdCwgdGhpcywgY3VyclZpZXcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZVZpZXcucHJvdG90eXBlLmFmdGVyTm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMudmlld1F1ZXJpZXMudmFsdWVzKCkpXG4gICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyaWVzKSB7IHJldHVybiBxdWVyaWVzLmZvckVhY2goZnVuY3Rpb24gKHEpIHsgcmV0dXJuIHEuYWZ0ZXJDaGlsZHJlbihfdGhpcy5jcmVhdGVNZXRob2QsIF90aGlzLnVwZGF0ZVZpZXdRdWVyaWVzTWV0aG9kKTsgfSk7IH0pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlVmlldztcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7P30gZW1iZWRkZWRUZW1wbGF0ZUluZGV4XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRWaWV3VHlwZShjb21wb25lbnQsIGVtYmVkZGVkVGVtcGxhdGVJbmRleCkge1xuICAgICAgaWYgKGVtYmVkZGVkVGVtcGxhdGVJbmRleCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gVmlld1R5cGUuRU1CRURERUQ7XG4gICAgICB9XG4gICAgICBpZiAoY29tcG9uZW50LmlzSG9zdCkge1xuICAgICAgICAgIHJldHVybiBWaWV3VHlwZS5IT1NUO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZpZXdUeXBlLkNPTVBPTkVOVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGJvdW5kRXZlbnRzXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgKiBAcGFyYW0gez99IGNvbXBpbGVFbGVtZW50XG4gICAqIEBwYXJhbSB7P30gYmluZFRvUmVuZGVyZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGJpbmRPdXRwdXRzKGJvdW5kRXZlbnRzLCBkaXJlY3RpdmVzLCBjb21waWxlRWxlbWVudCwgYmluZFRvUmVuZGVyZXIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVzZWRFdmVudHMgPSBjb2xsZWN0RXZlbnRzKGJvdW5kRXZlbnRzLCBkaXJlY3RpdmVzKTtcbiAgICAgIGlmICghdXNlZEV2ZW50cy5zaXplKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGJpbmRUb1JlbmRlcmVyKSB7XG4gICAgICAgICAgc3Vic2NyaWJlVG9SZW5kZXJFdmVudHModXNlZEV2ZW50cywgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlVG9EaXJlY3RpdmVFdmVudHModXNlZEV2ZW50cywgZGlyZWN0aXZlcywgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgZ2VuZXJhdGVIYW5kbGVFdmVudE1ldGhvZChib3VuZEV2ZW50cywgZGlyZWN0aXZlcywgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYm91bmRFdmVudHNcbiAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb2xsZWN0RXZlbnRzKGJvdW5kRXZlbnRzLCBkaXJlY3RpdmVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1c2VkRXZlbnRzID0gbmV3IE1hcCgpO1xuICAgICAgYm91bmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHsgdXNlZEV2ZW50cy5zZXQoZXZlbnQuZnVsbE5hbWUsIGV2ZW50KTsgfSk7XG4gICAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpckFzdCkge1xuICAgICAgICAgIGRpckFzdC5ob3N0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7IHVzZWRFdmVudHMuc2V0KGV2ZW50LmZ1bGxOYW1lLCBldmVudCk7IH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdXNlZEV2ZW50cztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB1c2VkRXZlbnRzXG4gICAqIEBwYXJhbSB7P30gY29tcGlsZUVsZW1lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVRvUmVuZGVyRXZlbnRzKHVzZWRFdmVudHMsIGNvbXBpbGVFbGVtZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBldmVudEFuZFRhcmdldEV4cHJzID0gW107XG4gICAgICB1c2VkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCFldmVudC5waGFzZSkge1xuICAgICAgICAgICAgICBldmVudEFuZFRhcmdldEV4cHJzLnB1c2gobGl0ZXJhbChldmVudC5uYW1lKSwgbGl0ZXJhbChldmVudC50YXJnZXQpKTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChldmVudEFuZFRhcmdldEV4cHJzLmxlbmd0aCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpc3Bvc2FibGVWYXIgPSB2YXJpYWJsZShcImRpc3Bvc2FibGVfXCIgKyBjb21waWxlRWxlbWVudC52aWV3LmRpc3Bvc2FibGVzLmxlbmd0aCk7XG4gICAgICAgICAgY29tcGlsZUVsZW1lbnQudmlldy5kaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGVWYXIpO1xuICAgICAgICAgIGNvbXBpbGVFbGVtZW50LnZpZXcuY3JlYXRlTWV0aG9kLmFkZFN0bXQoZGlzcG9zYWJsZVZhclxuICAgICAgICAgICAgICAuc2V0KGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5zdWJzY3JpYmVUb1JlbmRlckVsZW1lbnQpKS5jYWxsRm4oW1xuICAgICAgICAgICAgICBUSElTX0VYUFIsIGNvbXBpbGVFbGVtZW50LnJlbmRlck5vZGUsIGNyZWF0ZUlubGluZUFycmF5KGV2ZW50QW5kVGFyZ2V0RXhwcnMpLFxuICAgICAgICAgICAgICBoYW5kbGVFdmVudEV4cHIoY29tcGlsZUVsZW1lbnQpXG4gICAgICAgICAgXSkpXG4gICAgICAgICAgICAgIC50b0RlY2xTdG10KEZVTkNUSU9OX1RZUEUsIFtTdG10TW9kaWZpZXIuUHJpdmF0ZV0pKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB1c2VkRXZlbnRzXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgKiBAcGFyYW0gez99IGNvbXBpbGVFbGVtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVUb0RpcmVjdGl2ZUV2ZW50cyh1c2VkRXZlbnRzLCBkaXJlY3RpdmVzLCBjb21waWxlRWxlbWVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXNlZEV2ZW50TmFtZXMgPSBBcnJheS5mcm9tKHVzZWRFdmVudHMua2V5cygpKTtcbiAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyQXN0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyV3JhcHBlciA9IGNvbXBpbGVFbGVtZW50LmRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZS5nZXQoZGlyQXN0LmRpcmVjdGl2ZS50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgICAgY29tcGlsZUVsZW1lbnQudmlldy5jcmVhdGVNZXRob2QuYWRkU3RtdHMoRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLnN1YnNjcmliZShkaXJBc3QuZGlyZWN0aXZlLCBkaXJBc3QuaG9zdFByb3BlcnRpZXMsIHVzZWRFdmVudE5hbWVzLCBkaXJXcmFwcGVyLCBUSElTX0VYUFIsIGhhbmRsZUV2ZW50RXhwcihjb21waWxlRWxlbWVudCkpKTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGJvdW5kRXZlbnRzXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgKiBAcGFyYW0gez99IGNvbXBpbGVFbGVtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZW5lcmF0ZUhhbmRsZUV2ZW50TWV0aG9kKGJvdW5kRXZlbnRzLCBkaXJlY3RpdmVzLCBjb21waWxlRWxlbWVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGFzQ29tcG9uZW50SG9zdExpc3RlbmVyID0gZGlyZWN0aXZlcy5zb21lKGZ1bmN0aW9uIChkaXJBc3QpIHsgcmV0dXJuIGRpckFzdC5ob3N0RXZlbnRzLnNvbWUoZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBkaXJBc3QuZGlyZWN0aXZlLmlzQ29tcG9uZW50OyB9KTsgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXJrUGF0aFRvUm9vdFN0YXJ0ID0gaGFzQ29tcG9uZW50SG9zdExpc3RlbmVyID8gY29tcGlsZUVsZW1lbnQuY29tcFZpZXdFeHByIDogVEhJU19FWFBSO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGFuZGxlRXZlbnRTdG10cyA9IG5ldyBDb21waWxlTWV0aG9kKGNvbXBpbGVFbGVtZW50LnZpZXcpO1xuICAgICAgaGFuZGxlRXZlbnRTdG10cy5yZXNldERlYnVnSW5mbyhjb21waWxlRWxlbWVudC5ub2RlSW5kZXgsIGNvbXBpbGVFbGVtZW50LnNvdXJjZUFzdCk7XG4gICAgICBoYW5kbGVFdmVudFN0bXRzLnB1c2gobWFya1BhdGhUb1Jvb3RTdGFydC5jYWxsTWV0aG9kKCdtYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlJywgW10pLnRvU3RtdCgpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50TmFtZVZhciA9IHZhcmlhYmxlKCdldmVudE5hbWUnKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdFZhciA9IHZhcmlhYmxlKCdyZXN1bHQnKTtcbiAgICAgIGhhbmRsZUV2ZW50U3RtdHMucHVzaChyZXN1bHRWYXIuc2V0KGxpdGVyYWwodHJ1ZSkpLnRvRGVjbFN0bXQoQk9PTF9UWVBFKSk7XG4gICAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpckFzdCwgZGlySWR4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyV3JhcHBlciA9IGNvbXBpbGVFbGVtZW50LmRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZS5nZXQoZGlyQXN0LmRpcmVjdGl2ZS50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgICAgaWYgKGRpckFzdC5ob3N0RXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaGFuZGxlRXZlbnRTdG10cy5wdXNoKHJlc3VsdFZhclxuICAgICAgICAgICAgICAgICAgLnNldChEaXJlY3RpdmVXcmFwcGVyRXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgICAgIC5oYW5kbGVFdmVudChkaXJBc3QuaG9zdEV2ZW50cywgZGlyV3JhcHBlciwgZXZlbnROYW1lVmFyLCBFdmVudEhhbmRsZXJWYXJzLmV2ZW50KVxuICAgICAgICAgICAgICAgICAgLmFuZChyZXN1bHRWYXIpKVxuICAgICAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGJvdW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlbmRlckV2ZW50LCByZW5kZXJFdmVudElkeCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2YWxSZXN1bHQgPSBjb252ZXJ0QWN0aW9uQmluZGluZyhjb21waWxlRWxlbWVudC52aWV3LCBjb21waWxlRWxlbWVudC52aWV3LCBjb21waWxlRWxlbWVudC52aWV3LmNvbXBvbmVudENvbnRleHQsIHJlbmRlckV2ZW50LmhhbmRsZXIsIFwic3ViX1wiICsgcmVuZGVyRXZlbnRJZHgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRydWVTdG10cyA9IGV2YWxSZXN1bHQuc3RtdHM7XG4gICAgICAgICAgaWYgKGV2YWxSZXN1bHQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICAgICAgdHJ1ZVN0bXRzLnB1c2gocmVzdWx0VmFyLnNldChldmFsUmVzdWx0LnByZXZlbnREZWZhdWx0LmFuZChyZXN1bHRWYXIpKS50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRPRE8odGJvc2NoKTogY29udmVydCB0aGlzIGludG8gYSBgc3dpdGNoYCBvbmNlIG91ciBPdXRwdXRBc3Qgc3VwcG9ydHMgaXQuXG4gICAgICAgICAgaGFuZGxlRXZlbnRTdG10cy5wdXNoKG5ldyBJZlN0bXQoZXZlbnROYW1lVmFyLmVxdWFscyhsaXRlcmFsKHJlbmRlckV2ZW50LmZ1bGxOYW1lKSksIHRydWVTdG10cykpO1xuICAgICAgfSk7XG4gICAgICBoYW5kbGVFdmVudFN0bXRzLnB1c2gobmV3IFJldHVyblN0YXRlbWVudChyZXN1bHRWYXIpKTtcbiAgICAgIGNvbXBpbGVFbGVtZW50LnZpZXcubWV0aG9kcy5wdXNoKG5ldyBDbGFzc01ldGhvZChnZXRIYW5kbGVFdmVudE1ldGhvZE5hbWUoY29tcGlsZUVsZW1lbnQubm9kZUluZGV4KSwgW1xuICAgICAgICAgIG5ldyBGblBhcmFtKGV2ZW50TmFtZVZhci5uYW1lLCBTVFJJTkdfVFlQRSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oRXZlbnRIYW5kbGVyVmFycy5ldmVudC5uYW1lLCBEWU5BTUlDX1RZUEUpXG4gICAgICBdLCBoYW5kbGVFdmVudFN0bXRzLmZpbmlzaCgpLCBCT09MX1RZUEUpKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21waWxlRWxlbWVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlRXZlbnRFeHByKGNvbXBpbGVFbGVtZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoYW5kbGVFdmVudE1ldGhvZE5hbWUgPSBnZXRIYW5kbGVFdmVudE1ldGhvZE5hbWUoY29tcGlsZUVsZW1lbnQubm9kZUluZGV4KTtcbiAgICAgIHJldHVybiBUSElTX0VYUFIuY2FsbE1ldGhvZCgnZXZlbnRIYW5kbGVyJywgW1RISVNfRVhQUi5wcm9wKGhhbmRsZUV2ZW50TWV0aG9kTmFtZSldKTtcbiAgfVxuXG4gIHZhciAvKiogQHR5cGUgez99ICovIFNUQVRFX0lTX05FVkVSX0NIRUNLRUQgPSBUSElTX0VYUFIucHJvcCgnbnVtYmVyT2ZDaGVja3MnKS5pZGVudGljYWwobmV3IExpdGVyYWxFeHByKDApKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTk9UX1RIUk9XX09OX0NIQU5HRVMgPSBub3QoRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZU1ldGFcbiAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbnN0YW5jZVxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVFbGVtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBiaW5kRGlyZWN0aXZlQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZU1ldGEsIGRpcmVjdGl2ZUluc3RhbmNlLCBjb21waWxlRWxlbWVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9IGNvbXBpbGVFbGVtZW50LnZpZXc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaWZlY3ljbGVIb29rcyA9IGRpcmVjdGl2ZU1ldGEudHlwZS5saWZlY3ljbGVIb29rcztcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc01ldGhvZCA9IHZpZXcuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kO1xuICAgICAgYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kLnJlc2V0RGVidWdJbmZvKGNvbXBpbGVFbGVtZW50Lm5vZGVJbmRleCwgY29tcGlsZUVsZW1lbnQuc291cmNlQXN0KTtcbiAgICAgIGlmIChsaWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQpICE9PSAtMSkge1xuICAgICAgICAgIGFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc01ldGhvZC5hZGRTdG10KG5ldyBJZlN0bXQoU1RBVEVfSVNfTkVWRVJfQ0hFQ0tFRCwgW2RpcmVjdGl2ZUluc3RhbmNlLmNhbGxNZXRob2QoJ25nQWZ0ZXJDb250ZW50SW5pdCcsIFtdKS50b1N0bXQoKV0pKTtcbiAgICAgIH1cbiAgICAgIGlmIChsaWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQpICE9PSAtMSkge1xuICAgICAgICAgIGFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc01ldGhvZC5hZGRTdG10KGRpcmVjdGl2ZUluc3RhbmNlLmNhbGxNZXRob2QoJ25nQWZ0ZXJDb250ZW50Q2hlY2tlZCcsIFtdKS50b1N0bXQoKSk7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlTWV0YVxuICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluc3RhbmNlXG4gICAqIEBwYXJhbSB7P30gY29tcGlsZUVsZW1lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGJpbmREaXJlY3RpdmVBZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MoZGlyZWN0aXZlTWV0YSwgZGlyZWN0aXZlSW5zdGFuY2UsIGNvbXBpbGVFbGVtZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gY29tcGlsZUVsZW1lbnQudmlldztcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxpZmVjeWNsZUhvb2tzID0gZGlyZWN0aXZlTWV0YS50eXBlLmxpZmVjeWNsZUhvb2tzO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kID0gdmlldy5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3NNZXRob2Q7XG4gICAgICBhZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3NNZXRob2QucmVzZXREZWJ1Z0luZm8oY29tcGlsZUVsZW1lbnQubm9kZUluZGV4LCBjb21waWxlRWxlbWVudC5zb3VyY2VBc3QpO1xuICAgICAgaWYgKGxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdCkgIT09IC0xKSB7XG4gICAgICAgICAgYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kLmFkZFN0bXQobmV3IElmU3RtdChTVEFURV9JU19ORVZFUl9DSEVDS0VELCBbZGlyZWN0aXZlSW5zdGFuY2UuY2FsbE1ldGhvZCgnbmdBZnRlclZpZXdJbml0JywgW10pLnRvU3RtdCgpXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3Q2hlY2tlZCkgIT09IC0xKSB7XG4gICAgICAgICAgYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kLmFkZFN0bXQoZGlyZWN0aXZlSW5zdGFuY2UuY2FsbE1ldGhvZCgnbmdBZnRlclZpZXdDaGVja2VkJywgW10pLnRvU3RtdCgpKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBkaXJcbiAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVXcmFwcGVySW50YW5jZVxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVFbGVtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBiaW5kRGlyZWN0aXZlV3JhcHBlckxpZmVjeWNsZUNhbGxiYWNrcyhkaXIsIGRpcmVjdGl2ZVdyYXBwZXJJbnRhbmNlLCBjb21waWxlRWxlbWVudCkge1xuICAgICAgY29tcGlsZUVsZW1lbnQudmlldy5kZXN0cm95TWV0aG9kLmFkZFN0bXRzKERpcmVjdGl2ZVdyYXBwZXJFeHByZXNzaW9ucy5uZ09uRGVzdHJveShkaXIuZGlyZWN0aXZlLCBkaXJlY3RpdmVXcmFwcGVySW50YW5jZSkpO1xuICAgICAgY29tcGlsZUVsZW1lbnQudmlldy5kZXRhY2hNZXRob2QuYWRkU3RtdHMoRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLm5nT25EZXRhY2goZGlyLmhvc3RQcm9wZXJ0aWVzLCBkaXJlY3RpdmVXcmFwcGVySW50YW5jZSwgVEhJU19FWFBSLCBjb21waWxlRWxlbWVudC5jb21wVmlld0V4cHIgfHwgVEhJU19FWFBSLCBjb21waWxlRWxlbWVudC5yZW5kZXJOb2RlKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICogQHBhcmFtIHs/fSBwcm92aWRlckluc3RhbmNlXG4gICAqIEBwYXJhbSB7P30gY29tcGlsZUVsZW1lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGJpbmRJbmplY3RhYmxlRGVzdHJveUxpZmVjeWNsZUNhbGxiYWNrcyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZSwgY29tcGlsZUVsZW1lbnQpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9uRGVzdHJveU1ldGhvZCA9IGNvbXBpbGVFbGVtZW50LnZpZXcuZGVzdHJveU1ldGhvZDtcbiAgICAgIG9uRGVzdHJveU1ldGhvZC5yZXNldERlYnVnSW5mbyhjb21waWxlRWxlbWVudC5ub2RlSW5kZXgsIGNvbXBpbGVFbGVtZW50LnNvdXJjZUFzdCk7XG4gICAgICBpZiAocHJvdmlkZXIucHJvdmlkZXJUeXBlICE9PSBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlICYmXG4gICAgICAgICAgcHJvdmlkZXIucHJvdmlkZXJUeXBlICE9PSBQcm92aWRlckFzdFR5cGUuQ29tcG9uZW50ICYmXG4gICAgICAgICAgcHJvdmlkZXIubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3kpICE9PSAtMSkge1xuICAgICAgICAgIG9uRGVzdHJveU1ldGhvZC5hZGRTdG10KHByb3ZpZGVySW5zdGFuY2UuY2FsbE1ldGhvZCgnbmdPbkRlc3Ryb3knLCBbXSkudG9TdG10KCkpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBpcGVNZXRhXG4gICAqIEBwYXJhbSB7P30gcGlwZUluc3RhbmNlXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYmluZFBpcGVEZXN0cm95TGlmZWN5Y2xlQ2FsbGJhY2tzKHBpcGVNZXRhLCBwaXBlSW5zdGFuY2UsIHZpZXcpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9uRGVzdHJveU1ldGhvZCA9IHZpZXcuZGVzdHJveU1ldGhvZDtcbiAgICAgIGlmIChwaXBlTWV0YS50eXBlLmxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95KSAhPT0gLTEpIHtcbiAgICAgICAgICBvbkRlc3Ryb3lNZXRob2QuYWRkU3RtdChwaXBlSW5zdGFuY2UuY2FsbE1ldGhvZCgnbmdPbkRlc3Ryb3knLCBbXSkudG9TdG10KCkpO1xuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYm91bmRUZXh0XG4gICAqIEBwYXJhbSB7P30gY29tcGlsZU5vZGVcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBiaW5kUmVuZGVyVGV4dChib3VuZFRleHQsIGNvbXBpbGVOb2RlLCB2aWV3KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZUZpZWxkID0gY3JlYXRlQ2hlY2tCaW5kaW5nRmllbGQodmlldyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBldmFsUmVzdWx0ID0gY29udmVydFByb3BlcnR5QmluZGluZyh2aWV3LCB2aWV3LCB2aWV3LmNvbXBvbmVudENvbnRleHQsIGJvdW5kVGV4dC52YWx1ZSwgdmFsdWVGaWVsZC5iaW5kaW5nSWQpO1xuICAgICAgaWYgKCFldmFsUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2aWV3LmRldGVjdENoYW5nZXNSZW5kZXJQcm9wZXJ0aWVzTWV0aG9kLnJlc2V0RGVidWdJbmZvKGNvbXBpbGVOb2RlLm5vZGVJbmRleCwgYm91bmRUZXh0KTtcbiAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlc1JlbmRlclByb3BlcnRpZXNNZXRob2QuYWRkU3RtdHMoY3JlYXRlQ2hlY2tCaW5kaW5nU3RtdChldmFsUmVzdWx0LCB2YWx1ZUZpZWxkLmV4cHJlc3Npb24sIERldGVjdENoYW5nZXNWYXJzLnRocm93T25DaGFuZ2UsIFtUSElTX0VYUFIucHJvcCgncmVuZGVyZXInKVxuICAgICAgICAgICAgICAuY2FsbE1ldGhvZCgnc2V0VGV4dCcsIFtjb21waWxlTm9kZS5yZW5kZXJOb2RlLCBldmFsUmVzdWx0LmN1cnJWYWxFeHByXSlcbiAgICAgICAgICAgICAgLnRvU3RtdCgpXSkpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGJvdW5kUHJvcHNcbiAgICogQHBhcmFtIHs/fSBib3VuZE91dHB1dHNcbiAgICogQHBhcmFtIHs/fSBoYXNFdmVudHNcbiAgICogQHBhcmFtIHs/fSBjb21waWxlRWxlbWVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYmluZFJlbmRlcklucHV0cyhib3VuZFByb3BzLCBib3VuZE91dHB1dHMsIGhhc0V2ZW50cywgY29tcGlsZUVsZW1lbnQpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXcgPSBjb21waWxlRWxlbWVudC52aWV3O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVuZGVyTm9kZSA9IGNvbXBpbGVFbGVtZW50LnJlbmRlck5vZGU7XG4gICAgICBib3VuZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGJvdW5kUHJvcCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJpbmRpbmdGaWVsZCA9IGNyZWF0ZUNoZWNrQmluZGluZ0ZpZWxkKHZpZXcpO1xuICAgICAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlc1JlbmRlclByb3BlcnRpZXNNZXRob2QucmVzZXREZWJ1Z0luZm8oY29tcGlsZUVsZW1lbnQubm9kZUluZGV4LCBib3VuZFByb3ApO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2YWxSZXN1bHQgPSBjb252ZXJ0UHJvcGVydHlCaW5kaW5nKHZpZXcsIHZpZXcsIGNvbXBpbGVFbGVtZW50LnZpZXcuY29tcG9uZW50Q29udGV4dCwgYm91bmRQcm9wLnZhbHVlLCBiaW5kaW5nRmllbGQuYmluZGluZ0lkKTtcbiAgICAgICAgICBpZiAoIWV2YWxSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGVja0JpbmRpbmdTdG10cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVNZXRob2QgPSB2aWV3LmRldGVjdENoYW5nZXNSZW5kZXJQcm9wZXJ0aWVzTWV0aG9kO1xuICAgICAgICAgIHN3aXRjaCAoYm91bmRQcm9wLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5OlxuICAgICAgICAgICAgICBjYXNlIFByb3BlcnR5QmluZGluZ1R5cGUuQXR0cmlidXRlOlxuICAgICAgICAgICAgICBjYXNlIFByb3BlcnR5QmluZGluZ1R5cGUuQ2xhc3M6XG4gICAgICAgICAgICAgIGNhc2UgUHJvcGVydHlCaW5kaW5nVHlwZS5TdHlsZTpcbiAgICAgICAgICAgICAgICAgIGNoZWNrQmluZGluZ1N0bXRzLnB1c2guYXBwbHkoY2hlY2tCaW5kaW5nU3RtdHMsIHdyaXRlVG9SZW5kZXJlcihUSElTX0VYUFIsIGJvdW5kUHJvcCwgcmVuZGVyTm9kZSwgZXZhbFJlc3VsdC5jdXJyVmFsRXhwciwgdmlldy5nZW5Db25maWcubG9nQmluZGluZ1VwZGF0ZSkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgUHJvcGVydHlCaW5kaW5nVHlwZS5BbmltYXRpb246XG4gICAgICAgICAgICAgICAgICBjb21waWxlTWV0aG9kID0gdmlldy5hbmltYXRpb25CaW5kaW5nc01ldGhvZDtcbiAgICAgICAgICAgICAgICAgIHZhciBfYSA9IHRyaWdnZXJBbmltYXRpb24oVEhJU19FWFBSLCBUSElTX0VYUFIsIGJvdW5kUHJvcCwgYm91bmRPdXRwdXRzLCAoaGFzRXZlbnRzID8gVEhJU19FWFBSLnByb3AoZ2V0SGFuZGxlRXZlbnRNZXRob2ROYW1lKGNvbXBpbGVFbGVtZW50Lm5vZGVJbmRleCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMubm9vcCkpKVxuICAgICAgICAgICAgICAgICAgICAgIC5jYWxsTWV0aG9kKEJ1aWx0aW5NZXRob2QuQmluZCwgW1RISVNfRVhQUl0pLCBjb21waWxlRWxlbWVudC5yZW5kZXJOb2RlLCBldmFsUmVzdWx0LmN1cnJWYWxFeHByLCBiaW5kaW5nRmllbGQuZXhwcmVzc2lvbiksIHVwZGF0ZVN0bXRzID0gX2EudXBkYXRlU3RtdHMsIGRldGFjaFN0bXRzID0gX2EuZGV0YWNoU3RtdHM7XG4gICAgICAgICAgICAgICAgICBjaGVja0JpbmRpbmdTdG10cy5wdXNoLmFwcGx5KGNoZWNrQmluZGluZ1N0bXRzLCB1cGRhdGVTdG10cyk7XG4gICAgICAgICAgICAgICAgICB2aWV3LmRldGFjaE1ldGhvZC5hZGRTdG10cyhkZXRhY2hTdG10cyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGlsZU1ldGhvZC5hZGRTdG10cyhjcmVhdGVDaGVja0JpbmRpbmdTdG10KGV2YWxSZXN1bHQsIGJpbmRpbmdGaWVsZC5leHByZXNzaW9uLCBEZXRlY3RDaGFuZ2VzVmFycy50aHJvd09uQ2hhbmdlLCBjaGVja0JpbmRpbmdTdG10cykpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlQXN0XG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlXG4gICAqIEBwYXJhbSB7P30gY29tcGlsZUVsZW1lbnRcbiAgICogQHBhcmFtIHs/fSBlbGVtZW50TmFtZVxuICAgKiBAcGFyYW0gez99IHNjaGVtYVJlZ2lzdHJ5XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBiaW5kRGlyZWN0aXZlSG9zdFByb3BzKGRpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLCBjb21waWxlRWxlbWVudCwgZWxlbWVudE5hbWUsIHNjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgdGhlIFNlY3VyaXR5Q29udGV4dCBmb3IgcHJvcGVydGllcyB0aGF0IGNvdWxkIG5lZWQgc2FuaXRpemF0aW9uLlxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcnVudGltZVNlY3VyaXR5Q3R4RXhwcnMgPSBkaXJlY3RpdmVBc3QuaG9zdFByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChib3VuZFByb3ApIHsgcmV0dXJuIGJvdW5kUHJvcC5uZWVkc1J1bnRpbWVTZWN1cml0eUNvbnRleHQ7IH0pXG4gICAgICAgICAgLm1hcChmdW5jdGlvbiAoYm91bmRQcm9wKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3R4O1xuICAgICAgICAgIHN3aXRjaCAoYm91bmRQcm9wLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5OlxuICAgICAgICAgICAgICAgICAgY3R4ID0gc2NoZW1hUmVnaXN0cnkuc2VjdXJpdHlDb250ZXh0KGVsZW1lbnROYW1lLCBib3VuZFByb3AubmFtZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgUHJvcGVydHlCaW5kaW5nVHlwZS5BdHRyaWJ1dGU6XG4gICAgICAgICAgICAgICAgICBjdHggPSBzY2hlbWFSZWdpc3RyeS5zZWN1cml0eUNvbnRleHQoZWxlbWVudE5hbWUsIGJvdW5kUHJvcC5uYW1lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogT25seSBwcm9wZXJ0eSAvIGF0dHJpYnV0ZSBiaW5kaW5ncyBjYW4gaGF2ZSBhbiB1bmtub3duIHNlY3VyaXR5IGNvbnRleHQhIEJpbmRpbmcgXCIgKyBib3VuZFByb3AubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjcmVhdGVFbnVtRXhwcmVzc2lvbihJZGVudGlmaWVycy5TZWN1cml0eUNvbnRleHQsIGN0eCk7XG4gICAgICB9KTtcbiAgICAgIGNvbXBpbGVFbGVtZW50LnZpZXcuZGV0ZWN0Q2hhbmdlc1JlbmRlclByb3BlcnRpZXNNZXRob2QuYWRkU3RtdHMoRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLmNoZWNrSG9zdChkaXJlY3RpdmVBc3QuaG9zdFByb3BlcnRpZXMsIGRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZSwgVEhJU19FWFBSLCBjb21waWxlRWxlbWVudC5jb21wVmlld0V4cHIgfHwgVEhJU19FWFBSLCBjb21waWxlRWxlbWVudC5yZW5kZXJOb2RlLCBEZXRlY3RDaGFuZ2VzVmFycy50aHJvd09uQ2hhbmdlLCBydW50aW1lU2VjdXJpdHlDdHhFeHBycykpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUFzdFxuICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZVxuICAgKiBAcGFyYW0gez99IGRpckluZGV4XG4gICAqIEBwYXJhbSB7P30gY29tcGlsZUVsZW1lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGJpbmREaXJlY3RpdmVJbnB1dHMoZGlyZWN0aXZlQXN0LCBkaXJlY3RpdmVXcmFwcGVySW5zdGFuY2UsIGRpckluZGV4LCBjb21waWxlRWxlbWVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9IGNvbXBpbGVFbGVtZW50LnZpZXc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXRlY3RDaGFuZ2VzSW5JbnB1dHNNZXRob2QgPSB2aWV3LmRldGVjdENoYW5nZXNJbklucHV0c01ldGhvZDtcbiAgICAgIGRldGVjdENoYW5nZXNJbklucHV0c01ldGhvZC5yZXNldERlYnVnSW5mbyhjb21waWxlRWxlbWVudC5ub2RlSW5kZXgsIGNvbXBpbGVFbGVtZW50LnNvdXJjZUFzdCk7XG4gICAgICBkaXJlY3RpdmVBc3QuaW5wdXRzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0LCBpbnB1dElkeCkge1xuICAgICAgICAgIC8vIE5vdGU6IFdlIGNhbid0IHVzZSBgZmllbGRzLmxlbmd0aGAgaGVyZSwgYXMgd2UgYXJlIG5vdCBhZGRpbmcgYSBmaWVsZCFcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiaW5kaW5nSWQgPSBjb21waWxlRWxlbWVudC5ub2RlSW5kZXggKyBcIl9cIiArIGRpckluZGV4ICsgXCJfXCIgKyBpbnB1dElkeDtcbiAgICAgICAgICBkZXRlY3RDaGFuZ2VzSW5JbnB1dHNNZXRob2QucmVzZXREZWJ1Z0luZm8oY29tcGlsZUVsZW1lbnQubm9kZUluZGV4LCBpbnB1dCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZhbFJlc3VsdCA9IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcodmlldywgdmlldywgdmlldy5jb21wb25lbnRDb250ZXh0LCBpbnB1dC52YWx1ZSwgYmluZGluZ0lkKTtcbiAgICAgICAgICBpZiAoIWV2YWxSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXRlY3RDaGFuZ2VzSW5JbnB1dHNNZXRob2QuYWRkU3RtdHMoZXZhbFJlc3VsdC5zdG10cyk7XG4gICAgICAgICAgZGV0ZWN0Q2hhbmdlc0luSW5wdXRzTWV0aG9kLmFkZFN0bXQoZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlXG4gICAgICAgICAgICAgIC5jYWxsTWV0aG9kKFwiY2hlY2tfXCIgKyBpbnB1dC5kaXJlY3RpdmVOYW1lLCBbXG4gICAgICAgICAgICAgIGV2YWxSZXN1bHQuY3VyclZhbEV4cHIsIERldGVjdENoYW5nZXNWYXJzLnRocm93T25DaGFuZ2UsXG4gICAgICAgICAgICAgIGV2YWxSZXN1bHQuZm9yY2VVcGRhdGUgfHwgbGl0ZXJhbChmYWxzZSlcbiAgICAgICAgICBdKVxuICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc09uUHVzaENvbXAgPSBkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLmlzQ29tcG9uZW50ICYmXG4gICAgICAgICAgIWlzRGVmYXVsdENoYW5nZURldGVjdGlvblN0cmF0ZWd5KGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmUuY2hhbmdlRGV0ZWN0aW9uKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZURldGVjdENoYW5nZXNFeHByID0gRGlyZWN0aXZlV3JhcHBlckV4cHJlc3Npb25zLm5nRG9DaGVjayhkaXJlY3RpdmVXcmFwcGVySW5zdGFuY2UsIFRISVNfRVhQUiwgY29tcGlsZUVsZW1lbnQucmVuZGVyTm9kZSwgRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVEZXRlY3RDaGFuZ2VzU3RtdCA9IGlzT25QdXNoQ29tcCA/XG4gICAgICAgICAgbmV3IElmU3RtdChkaXJlY3RpdmVEZXRlY3RDaGFuZ2VzRXhwciwgW2NvbXBpbGVFbGVtZW50LmNvbXBWaWV3RXhwci5jYWxsTWV0aG9kKCdtYXJrQXNDaGVja09uY2UnLCBbXSkudG9TdG10KCldKSA6XG4gICAgICAgICAgZGlyZWN0aXZlRGV0ZWN0Q2hhbmdlc0V4cHIudG9TdG10KCk7XG4gICAgICBkZXRlY3RDaGFuZ2VzSW5JbnB1dHNNZXRob2QuYWRkU3RtdChkaXJlY3RpdmVEZXRlY3RDaGFuZ2VzU3RtdCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEBwYXJhbSB7P30gcGFyc2VkVGVtcGxhdGVcbiAgICogQHBhcmFtIHs/fSBzY2hlbWFSZWdpc3RyeVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYmluZFZpZXcodmlldywgcGFyc2VkVGVtcGxhdGUsIHNjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aXNpdG9yID0gbmV3IFZpZXdCaW5kZXJWaXNpdG9yKHZpZXcsIHNjaGVtYVJlZ2lzdHJ5KTtcbiAgICAgIHRlbXBsYXRlVmlzaXRBbGwodmlzaXRvciwgcGFyc2VkVGVtcGxhdGUpO1xuICAgICAgdmlldy5waXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChwaXBlKSB7IGJpbmRQaXBlRGVzdHJveUxpZmVjeWNsZUNhbGxiYWNrcyhwaXBlLm1ldGEsIHBpcGUuaW5zdGFuY2UsIHBpcGUudmlldyk7IH0pO1xuICB9XG4gIHZhciBWaWV3QmluZGVyVmlzaXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSBfc2NoZW1hUmVnaXN0cnlcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVmlld0JpbmRlclZpc2l0b3IodmlldywgX3NjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgICB0aGlzLl9ub2RlSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCaW5kZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJvdW5kVGV4dCA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGUgPSB0aGlzLnZpZXcubm9kZXNbdGhpcy5fbm9kZUluZGV4KytdO1xuICAgICAgICAgIGJpbmRSZW5kZXJUZXh0KGFzdCwgbm9kZSwgdGhpcy52aWV3KTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0JpbmRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICAgIHRoaXMuX25vZGVJbmRleCsrO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXROZ0NvbnRlbnQgPSBmdW5jdGlvbiAoYXN0LCBwYXJlbnQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0JpbmRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZUVsZW1lbnQgPSAodGhpcy52aWV3Lm5vZGVzW3RoaXMuX25vZGVJbmRleCsrXSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGFzRXZlbnRzID0gYmluZE91dHB1dHMoYXN0Lm91dHB1dHMsIGFzdC5kaXJlY3RpdmVzLCBjb21waWxlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgYmluZFJlbmRlcklucHV0cyhhc3QuaW5wdXRzLCBhc3Qub3V0cHV0cywgaGFzRXZlbnRzLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgYXN0LmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlQXN0LCBkaXJJbmRleCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVXcmFwcGVySW5zdGFuY2UgPSBjb21waWxlRWxlbWVudC5kaXJlY3RpdmVXcmFwcGVySW5zdGFuY2UuZ2V0KGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmUudHlwZS5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICBiaW5kRGlyZWN0aXZlSW5wdXRzKGRpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLCBkaXJJbmRleCwgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICBiaW5kRGlyZWN0aXZlSG9zdFByb3BzKGRpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLCBjb21waWxlRWxlbWVudCwgYXN0Lm5hbWUsIF90aGlzLl9zY2hlbWFSZWdpc3RyeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4sIGNvbXBpbGVFbGVtZW50KTtcbiAgICAgICAgICAvLyBhZnRlckNvbnRlbnQgYW5kIGFmdGVyVmlldyBsaWZlY3ljbGVzIG5lZWQgdG8gYmUgY2FsbGVkIGJvdHRvbSB1cFxuICAgICAgICAgIC8vIHNvIHRoYXQgY2hpbGRyZW4gYXJlIG5vdGlmaWVkIGJlZm9yZSBwYXJlbnRzXG4gICAgICAgICAgYXN0LmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlQXN0KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZUluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuaW5zdGFuY2VzLmdldChkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLmdldChkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgYmluZERpcmVjdGl2ZUFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcyhkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLCBkaXJlY3RpdmVJbnN0YW5jZSwgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICBiaW5kRGlyZWN0aXZlQWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmUsIGRpcmVjdGl2ZUluc3RhbmNlLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgICAgIGJpbmREaXJlY3RpdmVXcmFwcGVyTGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXN0LnByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlckFzdCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlckluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuaW5zdGFuY2VzLmdldCh0b2tlblJlZmVyZW5jZShwcm92aWRlckFzdC50b2tlbikpO1xuICAgICAgICAgICAgICBiaW5kSW5qZWN0YWJsZURlc3Ryb3lMaWZlY3ljbGVDYWxsYmFja3MocHJvdmlkZXJBc3QsIHByb3ZpZGVySW5zdGFuY2UsIGNvbXBpbGVFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0JpbmRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVFbGVtZW50ID0gKHRoaXMudmlldy5ub2Rlc1t0aGlzLl9ub2RlSW5kZXgrK10pO1xuICAgICAgICAgIGJpbmRPdXRwdXRzKGFzdC5vdXRwdXRzLCBhc3QuZGlyZWN0aXZlcywgY29tcGlsZUVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgICBhc3QuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmVBc3QsIGRpckluZGV4KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZUluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuaW5zdGFuY2VzLmdldChkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLmdldChkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgYmluZERpcmVjdGl2ZUlucHV0cyhkaXJlY3RpdmVBc3QsIGRpcmVjdGl2ZVdyYXBwZXJJbnN0YW5jZSwgZGlySW5kZXgsIGNvbXBpbGVFbGVtZW50KTtcbiAgICAgICAgICAgICAgYmluZERpcmVjdGl2ZUFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcyhkaXJlY3RpdmVBc3QuZGlyZWN0aXZlLCBkaXJlY3RpdmVJbnN0YW5jZSwgY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgICAgICBiaW5kRGlyZWN0aXZlQWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmUsIGRpcmVjdGl2ZUluc3RhbmNlLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgICAgIGJpbmREaXJlY3RpdmVXcmFwcGVyTGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlV3JhcHBlckluc3RhbmNlLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXN0LnByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlckFzdCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlckluc3RhbmNlID0gY29tcGlsZUVsZW1lbnQuaW5zdGFuY2VzLmdldCh0b2tlblJlZmVyZW5jZShwcm92aWRlckFzdC50b2tlbikpO1xuICAgICAgICAgICAgICBiaW5kSW5qZWN0YWJsZURlc3Ryb3lMaWZlY3ljbGVDYWxsYmFja3MocHJvdmlkZXJBc3QsIHByb3ZpZGVySW5zdGFuY2UsIGNvbXBpbGVFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBiaW5kVmlldyhjb21waWxlRWxlbWVudC5lbWJlZGRlZFZpZXcsIGFzdC5jaGlsZHJlbiwgdGhpcy5fc2NoZW1hUmVnaXN0cnkpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdHRyID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCaW5kZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChhc3QsIGN0eCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRUYXJnZXRBbmROYW1lc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0JpbmRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXZlbnQgPSBmdW5jdGlvbiAoYXN0LCBldmVudFRhcmdldEFuZE5hbWVzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCaW5kZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlZmVyZW5jZSA9IGZ1bmN0aW9uIChhc3QsIGN0eCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRWYXJpYWJsZSA9IGZ1bmN0aW9uIChhc3QsIGN0eCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0JpbmRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QmluZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgcmV0dXJuIFZpZXdCaW5kZXJWaXNpdG9yO1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIElNUExJQ0lUX1RFTVBMQVRFX1ZBUiA9ICdcXCRpbXBsaWNpdCc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIENMQVNTX0FUVFIkMSA9ICdjbGFzcyc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFNUWUxFX0FUVFIgPSAnc3R5bGUnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOR19DT05UQUlORVJfVEFHID0gJ25nLWNvbnRhaW5lcic7XG4gIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudFJlbmRlck5vZGVWYXIgPSB2YXJpYWJsZSgncGFyZW50UmVuZGVyTm9kZScpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb290U2VsZWN0b3JWYXIgPSB2YXJpYWJsZSgncm9vdFNlbGVjdG9yJyk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVxuICAgKiBAcGFyYW0gez99IHRhcmdldERlcGVuZGVuY2llc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYnVpbGRWaWV3KHZpZXcsIHRlbXBsYXRlLCB0YXJnZXREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGJ1aWxkZXJWaXNpdG9yID0gbmV3IFZpZXdCdWlsZGVyVmlzaXRvcih2aWV3LCB0YXJnZXREZXBlbmRlbmNpZXMpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50RWwgPSB2aWV3LmRlY2xhcmF0aW9uRWxlbWVudC5pc051bGwoKSA/IHZpZXcuZGVjbGFyYXRpb25FbGVtZW50IDogdmlldy5kZWNsYXJhdGlvbkVsZW1lbnQucGFyZW50O1xuICAgICAgdGVtcGxhdGVWaXNpdEFsbChidWlsZGVyVmlzaXRvciwgdGVtcGxhdGUsIHBhcmVudEVsKTtcbiAgICAgIGlmICh2aWV3LnZpZXdUeXBlID09PSBWaWV3VHlwZS5FTUJFRERFRCB8fCB2aWV3LnZpZXdUeXBlID09PSBWaWV3VHlwZS5IT1NUKSB7XG4gICAgICAgICAgdmlldy5sYXN0UmVuZGVyTm9kZSA9IGJ1aWxkZXJWaXNpdG9yLmdldE9yQ3JlYXRlTGFzdFJlbmRlck5vZGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWlsZGVyVmlzaXRvci5uZXN0ZWRWaWV3Q291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcGFyYW0gez99IHRhcmdldFN0YXRlbWVudHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmlzaFZpZXcodmlldywgdGFyZ2V0U3RhdGVtZW50cykge1xuICAgICAgdmlldy5hZnRlck5vZGVzKCk7XG4gICAgICBjcmVhdGVWaWV3VG9wTGV2ZWxTdG10cyh2aWV3LCB0YXJnZXRTdGF0ZW1lbnRzKTtcbiAgICAgIHZpZXcubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcGlsZUVsZW1lbnQgJiYgbm9kZS5oYXNFbWJlZGRlZFZpZXcpIHtcbiAgICAgICAgICAgICAgZmluaXNoVmlldyhub2RlLmVtYmVkZGVkVmlldywgdGFyZ2V0U3RhdGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbiAgdmFyIFZpZXdCdWlsZGVyVmlzaXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXREZXBlbmRlbmNpZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVmlld0J1aWxkZXJWaXNpdG9yKHZpZXcsIHRhcmdldERlcGVuZGVuY2llcykge1xuICAgICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgICAgdGhpcy50YXJnZXREZXBlbmRlbmNpZXMgPSB0YXJnZXREZXBlbmRlbmNpZXM7XG4gICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3Q291bnQgPSAwO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS5faXNSb290Tm9kZSA9IGZ1bmN0aW9uIChwYXJlbnQpIHsgcmV0dXJuIHBhcmVudC52aWV3ICE9PSB0aGlzLnZpZXc7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS5fYWRkUm9vdE5vZGVBbmRQcm9qZWN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9qZWN0ZWROb2RlID0gX2dldE91dGVyQ29udGFpbmVyT3JTZWxmKG5vZGUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudCA9IHByb2plY3RlZE5vZGUucGFyZW50O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nQ29udGVudEluZGV4ID0gKChwcm9qZWN0ZWROb2RlLnNvdXJjZUFzdCkpLm5nQ29udGVudEluZGV4O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdDb250YWluZXIgPSAobm9kZSBpbnN0YW5jZW9mIENvbXBpbGVFbGVtZW50ICYmIG5vZGUuaGFzVmlld0NvbnRhaW5lcikgPyBub2RlLnZpZXdDb250YWluZXIgOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1Jvb3ROb2RlKHBhcmVudCkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy52aWV3VHlwZSAhPT0gVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpZXcucm9vdE5vZGVzLnB1c2gobmV3IENvbXBpbGVWaWV3Um9vdE5vZGUodmlld0NvbnRhaW5lciA/IENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLlZpZXdDb250YWluZXIgOiBDb21waWxlVmlld1Jvb3ROb2RlVHlwZS5Ob2RlLCB2aWV3Q29udGFpbmVyIHx8IG5vZGUucmVuZGVyTm9kZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzUHJlc2VudChwYXJlbnQuY29tcG9uZW50KSAmJiBpc1ByZXNlbnQobmdDb250ZW50SW5kZXgpKSB7XG4gICAgICAgICAgICAgIHBhcmVudC5hZGRDb250ZW50Tm9kZShuZ0NvbnRlbnRJbmRleCwgbmV3IENvbXBpbGVWaWV3Um9vdE5vZGUodmlld0NvbnRhaW5lciA/IENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLlZpZXdDb250YWluZXIgOiBDb21waWxlVmlld1Jvb3ROb2RlVHlwZS5Ob2RlLCB2aWV3Q29udGFpbmVyIHx8IG5vZGUucmVuZGVyTm9kZSkpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QnVpbGRlclZpc2l0b3IucHJvdG90eXBlLl9nZXRQYXJlbnRSZW5kZXJOb2RlID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudCA9IF9nZXRPdXRlckNvbnRhaW5lclBhcmVudE9yU2VsZihwYXJlbnQpO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1Jvb3ROb2RlKHBhcmVudCkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy52aWV3VHlwZSA9PT0gVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50UmVuZGVyTm9kZVZhcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIHJvb3Qgbm9kZSBvZiBhbiBlbWJlZGRlZC9ob3N0IHZpZXdcbiAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMX0VYUFI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQocGFyZW50LmNvbXBvbmVudCkgJiZcbiAgICAgICAgICAgICAgICAgIHBhcmVudC5jb21wb25lbnQudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiAhPT0gX2FuZ3VsYXJfY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5OYXRpdmUgP1xuICAgICAgICAgICAgICAgICAgTlVMTF9FWFBSIDpcbiAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW5kZXJOb2RlO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUuZ2V0T3JDcmVhdGVMYXN0UmVuZGVyTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gdGhpcy52aWV3O1xuICAgICAgICAgIGlmICh2aWV3LnJvb3ROb2Rlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgdmlldy5yb290Tm9kZXNbdmlldy5yb290Tm9kZXMubGVuZ3RoIC0gMV0udHlwZSAhPT0gQ29tcGlsZVZpZXdSb290Tm9kZVR5cGUuTm9kZSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaWVsZE5hbWUgPSBcIl9lbF9cIiArIHZpZXcubm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICB2aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGZpZWxkTmFtZSwgaW1wb3J0VHlwZSh2aWV3LmdlbkNvbmZpZy5yZW5kZXJUeXBlcy5yZW5kZXJFbGVtZW50KSkpO1xuICAgICAgICAgICAgICB2aWV3LmNyZWF0ZU1ldGhvZC5hZGRTdG10KFRISVNfRVhQUi5wcm9wKGZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgICAgIC5zZXQoVmlld1Byb3BlcnRpZXMucmVuZGVyZXIuY2FsbE1ldGhvZCgnY3JlYXRlVGVtcGxhdGVBbmNob3InLCBbTlVMTF9FWFBSLCBOVUxMX0VYUFJdKSlcbiAgICAgICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgICAgIHZpZXcucm9vdE5vZGVzLnB1c2gobmV3IENvbXBpbGVWaWV3Um9vdE5vZGUoQ29tcGlsZVZpZXdSb290Tm9kZVR5cGUuTm9kZSwgVEhJU19FWFBSLnByb3AoZmllbGROYW1lKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmlldy5yb290Tm9kZXNbdmlldy5yb290Tm9kZXMubGVuZ3RoIC0gMV0uZXhwcjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJvdW5kVGV4dCA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl92aXNpdFRleHQoYXN0LCAnJywgcGFyZW50KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAoYXN0LCBwYXJlbnQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRUZXh0KGFzdCwgYXN0LnZhbHVlLCBwYXJlbnQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QnVpbGRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdFRleHQgPSBmdW5jdGlvbiAoYXN0LCB2YWx1ZSwgcGFyZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmllbGROYW1lID0gXCJfdGV4dF9cIiArIHRoaXMudmlldy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgICAgdGhpcy52aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGZpZWxkTmFtZSwgaW1wb3J0VHlwZSh0aGlzLnZpZXcuZ2VuQ29uZmlnLnJlbmRlclR5cGVzLnJlbmRlclRleHQpKSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVuZGVyTm9kZSA9IFRISVNfRVhQUi5wcm9wKGZpZWxkTmFtZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZU5vZGUgPSBuZXcgQ29tcGlsZU5vZGUocGFyZW50LCB0aGlzLnZpZXcsIHRoaXMudmlldy5ub2Rlcy5sZW5ndGgsIHJlbmRlck5vZGUsIGFzdCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3JlYXRlUmVuZGVyTm9kZSA9IFRISVNfRVhQUi5wcm9wKGZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgLnNldChWaWV3UHJvcGVydGllcy5yZW5kZXJlci5jYWxsTWV0aG9kKCdjcmVhdGVUZXh0JywgW1xuICAgICAgICAgICAgICB0aGlzLl9nZXRQYXJlbnRSZW5kZXJOb2RlKHBhcmVudCksIGxpdGVyYWwodmFsdWUpLFxuICAgICAgICAgICAgICB0aGlzLnZpZXcuY3JlYXRlTWV0aG9kLnJlc2V0RGVidWdJbmZvRXhwcih0aGlzLnZpZXcubm9kZXMubGVuZ3RoLCBhc3QpXG4gICAgICAgICAgXSkpXG4gICAgICAgICAgICAgIC50b1N0bXQoKTtcbiAgICAgICAgICB0aGlzLnZpZXcubm9kZXMucHVzaChjb21waWxlTm9kZSk7XG4gICAgICAgICAgdGhpcy52aWV3LmNyZWF0ZU1ldGhvZC5hZGRTdG10KGNyZWF0ZVJlbmRlck5vZGUpO1xuICAgICAgICAgIHRoaXMuX2FkZFJvb3ROb2RlQW5kUHJvamVjdChjb21waWxlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlck5vZGU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXROZ0NvbnRlbnQgPSBmdW5jdGlvbiAoYXN0LCBwYXJlbnQpIHtcbiAgICAgICAgICAvLyB0aGUgcHJvamVjdGVkIG5vZGVzIG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IHZpZXcsIHNvIHdlIGRvbid0XG4gICAgICAgICAgLy8gaGF2ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgdGhlbS4uLlxuICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QucmVzZXREZWJ1Z0luZm8obnVsbCwgYXN0KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRSZW5kZXJOb2RlID0gdGhpcy5fZ2V0UGFyZW50UmVuZGVyTm9kZShwYXJlbnQpO1xuICAgICAgICAgIGlmIChwYXJlbnRSZW5kZXJOb2RlICE9PSBOVUxMX0VYUFIpIHtcbiAgICAgICAgICAgICAgdGhpcy52aWV3LmNyZWF0ZU1ldGhvZC5hZGRTdG10KFRISVNfRVhQUi5jYWxsTWV0aG9kKCdwcm9qZWN0Tm9kZXMnLCBbcGFyZW50UmVuZGVyTm9kZSwgbGl0ZXJhbChhc3QuaW5kZXgpXSlcbiAgICAgICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2lzUm9vdE5vZGUocGFyZW50KSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy52aWV3LnZpZXdUeXBlICE9PSBWaWV3VHlwZS5DT01QT05FTlQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIHJvb3Qgbm9kZXMgb25seSBmb3IgZW1iZWRkZWQvaG9zdCB2aWV3c1xuICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LnJvb3ROb2Rlcy5wdXNoKG5ldyBDb21waWxlVmlld1Jvb3ROb2RlKENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5nQ29udGVudCwgbnVsbCwgYXN0LmluZGV4KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50LmNvbXBvbmVudCkgJiYgaXNQcmVzZW50KGFzdC5uZ0NvbnRlbnRJbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDb250ZW50Tm9kZShhc3QubmdDb250ZW50SW5kZXgsIG5ldyBDb21waWxlVmlld1Jvb3ROb2RlKENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5nQ29udGVudCwgbnVsbCwgYXN0LmluZGV4KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgcGFyZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZUluZGV4ID0gdGhpcy52aWV3Lm5vZGVzLmxlbmd0aDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjcmVhdGVSZW5kZXJOb2RlRXhwcjtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z0NvbnRleHRFeHByID0gdGhpcy52aWV3LmNyZWF0ZU1ldGhvZC5yZXNldERlYnVnSW5mb0V4cHIobm9kZUluZGV4LCBhc3QpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZXMgPSBhc3QuZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24gKGRpcmVjdGl2ZUFzdCkgeyByZXR1cm4gZGlyZWN0aXZlQXN0LmRpcmVjdGl2ZTsgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50ID0gZGlyZWN0aXZlcy5maW5kKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHsgcmV0dXJuIGRpcmVjdGl2ZS5pc0NvbXBvbmVudDsgfSk7XG4gICAgICAgICAgaWYgKGFzdC5uYW1lID09PSBOR19DT05UQUlORVJfVEFHKSB7XG4gICAgICAgICAgICAgIGNyZWF0ZVJlbmRlck5vZGVFeHByID0gVmlld1Byb3BlcnRpZXMucmVuZGVyZXIuY2FsbE1ldGhvZCgnY3JlYXRlVGVtcGxhdGVBbmNob3InLCBbdGhpcy5fZ2V0UGFyZW50UmVuZGVyTm9kZShwYXJlbnQpLCBkZWJ1Z0NvbnRleHRFeHByXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBodG1sQXR0cnMgPSBfcmVhZEh0bWxBdHRycyhhc3QuYXR0cnMpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTmFtZUFuZFZhbHVlcyA9IGNyZWF0ZUlubGluZUFycmF5KF9tZXJnZUh0bWxBbmREaXJlY3RpdmVBdHRycyhodG1sQXR0cnMsIGRpcmVjdGl2ZXMpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gbGl0ZXJhbCh2KTsgfSkpO1xuICAgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09PSAwICYmIHRoaXMudmlldy52aWV3VHlwZSA9PT0gVmlld1R5cGUuSE9TVCkge1xuICAgICAgICAgICAgICAgICAgY3JlYXRlUmVuZGVyTm9kZUV4cHIgPVxuICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5zZWxlY3RPckNyZWF0ZVJlbmRlckhvc3RFbGVtZW50KSkuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld1Byb3BlcnRpZXMucmVuZGVyZXIsIGxpdGVyYWwoYXN0Lm5hbWUpLCBhdHRyTmFtZUFuZFZhbHVlcywgcm9vdFNlbGVjdG9yVmFyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0NvbnRleHRFeHByXG4gICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjcmVhdGVSZW5kZXJOb2RlRXhwciA9XG4gICAgICAgICAgICAgICAgICAgICAgaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLmNyZWF0ZVJlbmRlckVsZW1lbnQpKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3UHJvcGVydGllcy5yZW5kZXJlciwgdGhpcy5fZ2V0UGFyZW50UmVuZGVyTm9kZShwYXJlbnQpLCBsaXRlcmFsKGFzdC5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBbmRWYWx1ZXMsIGRlYnVnQ29udGV4dEV4cHJcbiAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaWVsZE5hbWUgPSBcIl9lbF9cIiArIG5vZGVJbmRleDtcbiAgICAgICAgICB0aGlzLnZpZXcuZmllbGRzLnB1c2gobmV3IENsYXNzRmllbGQoZmllbGROYW1lLCBpbXBvcnRUeXBlKHRoaXMudmlldy5nZW5Db25maWcucmVuZGVyVHlwZXMucmVuZGVyRWxlbWVudCkpKTtcbiAgICAgICAgICB0aGlzLnZpZXcuY3JlYXRlTWV0aG9kLmFkZFN0bXQoVEhJU19FWFBSLnByb3AoZmllbGROYW1lKS5zZXQoY3JlYXRlUmVuZGVyTm9kZUV4cHIpLnRvU3RtdCgpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZW5kZXJOb2RlID0gVEhJU19FWFBSLnByb3AoZmllbGROYW1lKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21waWxlRWxlbWVudCA9IG5ldyBDb21waWxlRWxlbWVudChwYXJlbnQsIHRoaXMudmlldywgbm9kZUluZGV4LCByZW5kZXJOb2RlLCBhc3QsIGNvbXBvbmVudCwgZGlyZWN0aXZlcywgYXN0LnByb3ZpZGVycywgYXN0Lmhhc1ZpZXdDb250YWluZXIsIGZhbHNlLCBhc3QucmVmZXJlbmNlcyk7XG4gICAgICAgICAgdGhpcy52aWV3Lm5vZGVzLnB1c2goY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBWaWV3RXhwciA9IG51bGw7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5lc3RlZENvbXBvbmVudElkZW50aWZpZXIgPSB7IHJlZmVyZW5jZTogbnVsbCB9O1xuICAgICAgICAgICAgICB0aGlzLnRhcmdldERlcGVuZGVuY2llcy5wdXNoKG5ldyBWaWV3Q2xhc3NEZXBlbmRlbmN5KGNvbXBvbmVudC50eXBlLCBnZXRWaWV3Q2xhc3NOYW1lKGNvbXBvbmVudCwgMCksIG5lc3RlZENvbXBvbmVudElkZW50aWZpZXIpKTtcbiAgICAgICAgICAgICAgY29tcFZpZXdFeHByID0gVEhJU19FWFBSLnByb3AoXCJjb21wVmlld19cIiArIG5vZGVJbmRleCk7IC8vIGZpeCBoaWdobGlnaHRpbmc6IGBcbiAgICAgICAgICAgICAgdGhpcy52aWV3LmZpZWxkcy5wdXNoKG5ldyBDbGFzc0ZpZWxkKGNvbXBWaWV3RXhwci5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQXBwVmlldyksIFtpbXBvcnRUeXBlKGNvbXBvbmVudC50eXBlKV0pKSk7XG4gICAgICAgICAgICAgIHRoaXMudmlldy52aWV3Q2hpbGRyZW4ucHVzaChjb21wVmlld0V4cHIpO1xuICAgICAgICAgICAgICBjb21waWxlRWxlbWVudC5zZXRDb21wb25lbnRWaWV3KGNvbXBWaWV3RXhwcik7XG4gICAgICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QuYWRkU3RtdChjb21wVmlld0V4cHJcbiAgICAgICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihuZXN0ZWRDb21wb25lbnRJZGVudGlmaWVyKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgICAgICBWaWV3UHJvcGVydGllcy52aWV3VXRpbHMsIFRISVNfRVhQUiwgbGl0ZXJhbChub2RlSW5kZXgpLCByZW5kZXJOb2RlXG4gICAgICAgICAgICAgIF0pKVxuICAgICAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGlsZUVsZW1lbnQuYmVmb3JlQ2hpbGRyZW4oKTtcbiAgICAgICAgICB0aGlzLl9hZGRSb290Tm9kZUFuZFByb2plY3QoY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmNoaWxkcmVuLCBjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgY29tcGlsZUVsZW1lbnQuYWZ0ZXJDaGlsZHJlbih0aGlzLnZpZXcubm9kZXMubGVuZ3RoIC0gbm9kZUluZGV4IC0gMSk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChjb21wVmlld0V4cHIpKSB7XG4gICAgICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QuYWRkU3RtdChjb21wVmlld0V4cHIuY2FsbE1ldGhvZCgnY3JlYXRlJywgW2NvbXBpbGVFbGVtZW50LmdldENvbXBvbmVudCgpXSkudG9TdG10KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVtYmVkZGVkVGVtcGxhdGUgPSBmdW5jdGlvbiAoYXN0LCBwYXJlbnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlSW5kZXggPSB0aGlzLnZpZXcubm9kZXMubGVuZ3RoO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpZWxkTmFtZSA9IFwiX2FuY2hvcl9cIiArIG5vZGVJbmRleDtcbiAgICAgICAgICB0aGlzLnZpZXcuZmllbGRzLnB1c2gobmV3IENsYXNzRmllbGQoZmllbGROYW1lLCBpbXBvcnRUeXBlKHRoaXMudmlldy5nZW5Db25maWcucmVuZGVyVHlwZXMucmVuZGVyQ29tbWVudCkpKTtcbiAgICAgICAgICB0aGlzLnZpZXcuY3JlYXRlTWV0aG9kLmFkZFN0bXQoVEhJU19FWFBSLnByb3AoZmllbGROYW1lKVxuICAgICAgICAgICAgICAuc2V0KFZpZXdQcm9wZXJ0aWVzLnJlbmRlcmVyLmNhbGxNZXRob2QoJ2NyZWF0ZVRlbXBsYXRlQW5jaG9yJywgW1xuICAgICAgICAgICAgICB0aGlzLl9nZXRQYXJlbnRSZW5kZXJOb2RlKHBhcmVudCksXG4gICAgICAgICAgICAgIHRoaXMudmlldy5jcmVhdGVNZXRob2QucmVzZXREZWJ1Z0luZm9FeHByKG5vZGVJbmRleCwgYXN0KVxuICAgICAgICAgIF0pKVxuICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlbmRlck5vZGUgPSBUSElTX0VYUFIucHJvcChmaWVsZE5hbWUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncyA9IGFzdC52YXJpYWJsZXMubWFwKGZ1bmN0aW9uICh2YXJBc3QpIHsgcmV0dXJuIFt2YXJBc3QudmFsdWUubGVuZ3RoID4gMCA/IHZhckFzdC52YWx1ZSA6IElNUExJQ0lUX1RFTVBMQVRFX1ZBUiwgdmFyQXN0Lm5hbWVdOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVzID0gYXN0LmRpcmVjdGl2ZXMubWFwKGZ1bmN0aW9uIChkaXJlY3RpdmVBc3QpIHsgcmV0dXJuIGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmU7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVFbGVtZW50ID0gbmV3IENvbXBpbGVFbGVtZW50KHBhcmVudCwgdGhpcy52aWV3LCBub2RlSW5kZXgsIHJlbmRlck5vZGUsIGFzdCwgbnVsbCwgZGlyZWN0aXZlcywgYXN0LnByb3ZpZGVycywgYXN0Lmhhc1ZpZXdDb250YWluZXIsIHRydWUsIGFzdC5yZWZlcmVuY2VzKTtcbiAgICAgICAgICB0aGlzLnZpZXcubm9kZXMucHVzaChjb21waWxlRWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3Q291bnQrKztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbWJlZGRlZFZpZXcgPSBuZXcgQ29tcGlsZVZpZXcodGhpcy52aWV3LmNvbXBvbmVudCwgdGhpcy52aWV3LmdlbkNvbmZpZywgdGhpcy52aWV3LnBpcGVNZXRhcywgTlVMTF9FWFBSLCB0aGlzLnZpZXcuYW5pbWF0aW9ucywgdGhpcy52aWV3LnZpZXdJbmRleCArIHRoaXMubmVzdGVkVmlld0NvdW50LCBjb21waWxlRWxlbWVudCwgdGVtcGxhdGVWYXJpYWJsZUJpbmRpbmdzLCB0aGlzLnRhcmdldERlcGVuZGVuY2llcyk7XG4gICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3Q291bnQgKz0gYnVpbGRWaWV3KGVtYmVkZGVkVmlldywgYXN0LmNoaWxkcmVuLCB0aGlzLnRhcmdldERlcGVuZGVuY2llcyk7XG4gICAgICAgICAgY29tcGlsZUVsZW1lbnQuYmVmb3JlQ2hpbGRyZW4oKTtcbiAgICAgICAgICB0aGlzLl9hZGRSb290Tm9kZUFuZFByb2plY3QoY29tcGlsZUVsZW1lbnQpO1xuICAgICAgICAgIGNvbXBpbGVFbGVtZW50LmFmdGVyQ2hpbGRyZW4oMCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdHRyID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREaXJlY3RpdmUgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50VGFyZ2V0QW5kTmFtZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRFdmVudCA9IGZ1bmN0aW9uIChhc3QsIGV2ZW50VGFyZ2V0QW5kTmFtZXMpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0J1aWxkZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlZmVyZW5jZSA9IGZ1bmN0aW9uIChhc3QsIGN0eCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBWaWV3QnVpbGRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFZpZXdCdWlsZGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgcmV0dXJuIFZpZXdCdWlsZGVyVmlzaXRvcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBXYWxrcyB1cCB0aGUgbm9kZXMgd2hpbGUgdGhlIGRpcmVjdCBwYXJlbnQgaXMgYSBjb250YWluZXIuXG4gICAgKiAqXG4gICAgKiBSZXR1cm5zIHRoZSBvdXRlciBjb250YWluZXIgb3IgdGhlIG5vZGUgaXRzZWxmIHdoZW4gaXQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIGEgY29udGFpbmVyLlxuICAgICogKlxuICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9nZXRPdXRlckNvbnRhaW5lck9yU2VsZihub2RlKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gbm9kZS52aWV3O1xuICAgICAgd2hpbGUgKF9pc05nQ29udGFpbmVyKG5vZGUucGFyZW50LCB2aWV3KSkge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICB9XG4gIC8qKlxuICAgKiAgV2Fsa3MgdXAgdGhlIG5vZGVzIHdoaWxlIHRoZXkgYXJlIGNvbnRhaW5lciBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcGFyZW50IHdoaWNoIGlzIG5vdC5cbiAgICAqICpcbiAgICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgb3V0ZXIgY29udGFpbmVyIG9yIHRoZSBub2RlIGl0c2VsZiB3aGVuIGl0IGlzIG5vdCBhIGNvbnRhaW5lci5cbiAgICAqICpcbiAgICogQHBhcmFtIHs/fSBlbFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2dldE91dGVyQ29udGFpbmVyUGFyZW50T3JTZWxmKGVsKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gZWwudmlldztcbiAgICAgIHdoaWxlIChfaXNOZ0NvbnRhaW5lcihlbCwgdmlldykpIHtcbiAgICAgICAgICBlbCA9IGVsLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBub2RlXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2lzTmdDb250YWluZXIobm9kZSwgdmlldykge1xuICAgICAgcmV0dXJuICFub2RlLmlzTnVsbCgpICYmICgobm9kZS5zb3VyY2VBc3QpKS5uYW1lID09PSBOR19DT05UQUlORVJfVEFHICYmXG4gICAgICAgICAgbm9kZS52aWV3ID09PSB2aWV3O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGRlY2xhcmVkSHRtbEF0dHJzXG4gICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX21lcmdlSHRtbEFuZERpcmVjdGl2ZUF0dHJzKGRlY2xhcmVkSHRtbEF0dHJzLCBkaXJlY3RpdmVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXBSZXN1bHQgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGRlY2xhcmVkSHRtbEF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgbWFwUmVzdWx0W2tleV0gPSBkZWNsYXJlZEh0bWxBdHRyc1trZXldOyB9KTtcbiAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlTWV0YSkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKGRpcmVjdGl2ZU1ldGEuaG9zdEF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBkaXJlY3RpdmVNZXRhLmhvc3RBdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2VmFsdWUgPSBtYXBSZXN1bHRbbmFtZV07XG4gICAgICAgICAgICAgIG1hcFJlc3VsdFtuYW1lXSA9IGlzUHJlc2VudChwcmV2VmFsdWUpID8gbWVyZ2VBdHRyaWJ1dGVWYWx1ZShuYW1lLCBwcmV2VmFsdWUsIHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcnJSZXN1bHQgPSBbXTtcbiAgICAgIC8vIE5vdGU6IFdlIG5lZWQgdG8gc29ydCB0byBnZXQgYSBkZWZpbmVkIG91dHB1dCBvcmRlclxuICAgICAgLy8gZm9yIHRlc3RzIGFuZCBmb3IgY2FjaGluZyBnZW5lcmF0ZWQgYXJ0aWZhY3RzLi4uXG4gICAgICBPYmplY3Qua2V5cyhtYXBSZXN1bHQpLnNvcnQoKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyTmFtZSkgeyBhcnJSZXN1bHQucHVzaChhdHRyTmFtZSwgbWFwUmVzdWx0W2F0dHJOYW1lXSk7IH0pO1xuICAgICAgcmV0dXJuIGFyclJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhdHRyc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3JlYWRIdG1sQXR0cnMoYXR0cnMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGh0bWxBdHRycyA9IHt9O1xuICAgICAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXN0KSB7IGh0bWxBdHRyc1thc3QubmFtZV0gPSBhc3QudmFsdWU7IH0pO1xuICAgICAgcmV0dXJuIGh0bWxBdHRycztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhdHRyTmFtZVxuICAgKiBAcGFyYW0gez99IGF0dHJWYWx1ZTFcbiAgICogQHBhcmFtIHs/fSBhdHRyVmFsdWUyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZUF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUxLCBhdHRyVmFsdWUyKSB7XG4gICAgICBpZiAoYXR0ck5hbWUgPT0gQ0xBU1NfQVRUUiQxIHx8IGF0dHJOYW1lID09IFNUWUxFX0FUVFIpIHtcbiAgICAgICAgICByZXR1cm4gYXR0clZhbHVlMSArIFwiIFwiICsgYXR0clZhbHVlMjtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiBhdHRyVmFsdWUyO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHBhcmFtIHs/fSB0YXJnZXRTdGF0ZW1lbnRzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVWaWV3VG9wTGV2ZWxTdG10cyh2aWV3LCB0YXJnZXRTdGF0ZW1lbnRzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlRGVidWdJbmZvc1ZhciA9IE5VTExfRVhQUjtcbiAgICAgIGlmICh2aWV3LmdlbkNvbmZpZy5nZW5EZWJ1Z0luZm8pIHtcbiAgICAgICAgICBub2RlRGVidWdJbmZvc1ZhciA9IHZhcmlhYmxlKFwibm9kZURlYnVnSW5mb3NfXCIgKyBpZGVudGlmaWVyTmFtZSh2aWV3LmNvbXBvbmVudC50eXBlKSArIHZpZXcudmlld0luZGV4KTsgLy8gZml4XG4gICAgICAgICAgLy8gaGlnaGxpZ2h0aW5nOlxuICAgICAgICAgIC8vIGBcbiAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnRzLnB1c2goKChub2RlRGVidWdJbmZvc1ZhcikpXG4gICAgICAgICAgICAgIC5zZXQobGl0ZXJhbEFycih2aWV3Lm5vZGVzLm1hcChjcmVhdGVTdGF0aWNOb2RlRGVidWdJbmZvKSwgbmV3IEFycmF5VHlwZShpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuU3RhdGljTm9kZURlYnVnSW5mbykpLCBbVHlwZU1vZGlmaWVyLkNvbnN0XSkpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdChudWxsLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSkpO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVuZGVyQ29tcFR5cGVWYXIgPSB2YXJpYWJsZShcInJlbmRlclR5cGVfXCIgKyBpZGVudGlmaWVyTmFtZSh2aWV3LmNvbXBvbmVudC50eXBlKSk7IC8vIGZpeCBoaWdobGlnaHRpbmc6IGBcbiAgICAgIGlmICh2aWV3LnZpZXdJbmRleCA9PT0gMCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlVXJsSW5mbyA9IHZvaWQgMDtcbiAgICAgICAgICBpZiAodmlldy5jb21wb25lbnQudGVtcGxhdGUudGVtcGxhdGVVcmwgPT0gaWRlbnRpZmllck1vZHVsZVVybCh2aWV3LmNvbXBvbmVudC50eXBlKSkge1xuICAgICAgICAgICAgICB0ZW1wbGF0ZVVybEluZm8gPVxuICAgICAgICAgICAgICAgICAgaWRlbnRpZmllck1vZHVsZVVybCh2aWV3LmNvbXBvbmVudC50eXBlKSArIFwiIGNsYXNzIFwiICsgaWRlbnRpZmllck5hbWUodmlldy5jb21wb25lbnQudHlwZSkgKyBcIiAtIGlubGluZSB0ZW1wbGF0ZVwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGVtcGxhdGVVcmxJbmZvID0gdmlldy5jb21wb25lbnQudGVtcGxhdGUudGVtcGxhdGVVcmw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhcmdldFN0YXRlbWVudHMucHVzaChyZW5kZXJDb21wVHlwZVZhclxuICAgICAgICAgICAgICAuc2V0KGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5jcmVhdGVSZW5kZXJDb21wb25lbnRUeXBlKSkuY2FsbEZuKFtcbiAgICAgICAgICAgICAgdmlldy5nZW5Db25maWcuZ2VuRGVidWdJbmZvID8gbGl0ZXJhbCh0ZW1wbGF0ZVVybEluZm8pIDogbGl0ZXJhbCgnJyksXG4gICAgICAgICAgICAgIGxpdGVyYWwodmlldy5jb21wb25lbnQudGVtcGxhdGUubmdDb250ZW50U2VsZWN0b3JzLmxlbmd0aCksXG4gICAgICAgICAgICAgIFZpZXdFbmNhcHN1bGF0aW9uRW51bS5mcm9tVmFsdWUodmlldy5jb21wb25lbnQudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiksXG4gICAgICAgICAgICAgIHZpZXcuc3R5bGVzLFxuICAgICAgICAgICAgICBsaXRlcmFsTWFwKHZpZXcuYW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBbZW50cnkubmFtZSwgZW50cnkuZm5FeHBdOyB9KSksXG4gICAgICAgICAgXSkpXG4gICAgICAgICAgICAgIC50b0RlY2xTdG10KGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5SZW5kZXJDb21wb25lbnRUeXBlKSkpKTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdDbGFzcyA9IGNyZWF0ZVZpZXdDbGFzcyh2aWV3LCByZW5kZXJDb21wVHlwZVZhciwgbm9kZURlYnVnSW5mb3NWYXIpO1xuICAgICAgdGFyZ2V0U3RhdGVtZW50cy5wdXNoKHZpZXdDbGFzcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbm9kZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljTm9kZURlYnVnSW5mbyhub2RlKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21waWxlRWxlbWVudCA9IG5vZGUgaW5zdGFuY2VvZiBDb21waWxlRWxlbWVudCA/IG5vZGUgOiBudWxsO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJUb2tlbnMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBvbmVudFRva2VuID0gTlVMTF9FWFBSO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFyVG9rZW5FbnRyaWVzID0gW107XG4gICAgICBpZiAoaXNQcmVzZW50KGNvbXBpbGVFbGVtZW50KSkge1xuICAgICAgICAgIHByb3ZpZGVyVG9rZW5zID0gY29tcGlsZUVsZW1lbnQuZ2V0UHJvdmlkZXJUb2tlbnMoKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGNvbXBpbGVFbGVtZW50LmNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50VG9rZW4gPSBjcmVhdGVEaVRva2VuRXhwcmVzc2lvbihpZGVudGlmaWVyVG9rZW4oY29tcGlsZUVsZW1lbnQuY29tcG9uZW50LnR5cGUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgT2JqZWN0LmtleXMoY29tcGlsZUVsZW1lbnQucmVmZXJlbmNlVG9rZW5zKS5mb3JFYWNoKGZ1bmN0aW9uICh2YXJOYW1lKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRva2VuID0gY29tcGlsZUVsZW1lbnQucmVmZXJlbmNlVG9rZW5zW3Zhck5hbWVdO1xuICAgICAgICAgICAgICB2YXJUb2tlbkVudHJpZXMucHVzaChbdmFyTmFtZSwgaXNQcmVzZW50KHRva2VuKSA/IGNyZWF0ZURpVG9rZW5FeHByZXNzaW9uKHRva2VuKSA6IE5VTExfRVhQUl0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5TdGF0aWNOb2RlRGVidWdJbmZvKSlcbiAgICAgICAgICAuaW5zdGFudGlhdGUoW1xuICAgICAgICAgIGxpdGVyYWxBcnIocHJvdmlkZXJUb2tlbnMsIG5ldyBBcnJheVR5cGUoRFlOQU1JQ19UWVBFLCBbVHlwZU1vZGlmaWVyLkNvbnN0XSkpLFxuICAgICAgICAgIGNvbXBvbmVudFRva2VuLFxuICAgICAgICAgIGxpdGVyYWxNYXAodmFyVG9rZW5FbnRyaWVzLCBuZXcgTWFwVHlwZShEWU5BTUlDX1RZUEUsIFtUeXBlTW9kaWZpZXIuQ29uc3RdKSlcbiAgICAgIF0sIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5TdGF0aWNOb2RlRGVidWdJbmZvKSwgbnVsbCwgW1R5cGVNb2RpZmllci5Db25zdF0pKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEBwYXJhbSB7P30gcmVuZGVyQ29tcFR5cGVWYXJcbiAgICogQHBhcmFtIHs/fSBub2RlRGVidWdJbmZvc1ZhclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlVmlld0NsYXNzKHZpZXcsIHJlbmRlckNvbXBUeXBlVmFyLCBub2RlRGVidWdJbmZvc1Zhcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlld0NvbnN0cnVjdG9yQXJncyA9IFtcbiAgICAgICAgICBuZXcgRm5QYXJhbShWaWV3Q29uc3RydWN0b3JWYXJzLnZpZXdVdGlscy5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuVmlld1V0aWxzKSkpLFxuICAgICAgICAgIG5ldyBGblBhcmFtKFZpZXdDb25zdHJ1Y3RvclZhcnMucGFyZW50Vmlldy5uYW1lLCBpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQXBwVmlldyksIFtEWU5BTUlDX1RZUEVdKSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oVmlld0NvbnN0cnVjdG9yVmFycy5wYXJlbnRJbmRleC5uYW1lLCBOVU1CRVJfVFlQRSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oVmlld0NvbnN0cnVjdG9yVmFycy5wYXJlbnRFbGVtZW50Lm5hbWUsIERZTkFNSUNfVFlQRSlcbiAgICAgIF07XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdXBlckNvbnN0cnVjdG9yQXJncyA9IFtcbiAgICAgICAgICB2YXJpYWJsZSh2aWV3LmNsYXNzTmFtZSksIHJlbmRlckNvbXBUeXBlVmFyLCBWaWV3VHlwZUVudW0uZnJvbVZhbHVlKHZpZXcudmlld1R5cGUpLFxuICAgICAgICAgIFZpZXdDb25zdHJ1Y3RvclZhcnMudmlld1V0aWxzLCBWaWV3Q29uc3RydWN0b3JWYXJzLnBhcmVudFZpZXcsIFZpZXdDb25zdHJ1Y3RvclZhcnMucGFyZW50SW5kZXgsXG4gICAgICAgICAgVmlld0NvbnN0cnVjdG9yVmFycy5wYXJlbnRFbGVtZW50LFxuICAgICAgICAgIENoYW5nZURldGVjdG9yU3RhdHVzRW51bS5mcm9tVmFsdWUoZ2V0Q2hhbmdlRGV0ZWN0aW9uTW9kZSh2aWV3KSlcbiAgICAgIF07XG4gICAgICBpZiAodmlldy5nZW5Db25maWcuZ2VuRGVidWdJbmZvKSB7XG4gICAgICAgICAgc3VwZXJDb25zdHJ1Y3RvckFyZ3MucHVzaChub2RlRGVidWdJbmZvc1Zhcik7XG4gICAgICB9XG4gICAgICBpZiAodmlldy52aWV3VHlwZSA9PT0gVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgICAgICB2aWV3Q29uc3RydWN0b3JBcmdzLnB1c2gobmV3IEZuUGFyYW0oJ2RlY2xhcmVkVmlld0NvbnRhaW5lcicsIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5WaWV3Q29udGFpbmVyKSkpKTtcbiAgICAgICAgICBzdXBlckNvbnN0cnVjdG9yQXJncy5wdXNoKHZhcmlhYmxlKCdkZWNsYXJlZFZpZXdDb250YWluZXInKSk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3TWV0aG9kcyA9IFtcbiAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ2NyZWF0ZUludGVybmFsJywgW25ldyBGblBhcmFtKHJvb3RTZWxlY3RvclZhci5uYW1lLCBTVFJJTkdfVFlQRSldLCBnZW5lcmF0ZUNyZWF0ZU1ldGhvZCh2aWV3KSwgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvbXBvbmVudFJlZiksIFtEWU5BTUlDX1RZUEVdKSksXG4gICAgICAgICAgbmV3IENsYXNzTWV0aG9kKCdpbmplY3RvckdldEludGVybmFsJywgW1xuICAgICAgICAgICAgICBuZXcgRm5QYXJhbShJbmplY3RNZXRob2RWYXJzJDEudG9rZW4ubmFtZSwgRFlOQU1JQ19UWVBFKSxcbiAgICAgICAgICAgICAgLy8gTm90ZTogQ2FuJ3QgdXNlIG8uSU5UX1RZUEUgaGVyZSBhcyB0aGUgbWV0aG9kIGluIEFwcFZpZXcgdXNlcyBudW1iZXJcbiAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oSW5qZWN0TWV0aG9kVmFycyQxLnJlcXVlc3ROb2RlSW5kZXgubmFtZSwgTlVNQkVSX1RZUEUpLFxuICAgICAgICAgICAgICBuZXcgRm5QYXJhbShJbmplY3RNZXRob2RWYXJzJDEubm90Rm91bmRSZXN1bHQubmFtZSwgRFlOQU1JQ19UWVBFKVxuICAgICAgICAgIF0sIGFkZFJldHVyblZhbHVlZk5vdEVtcHR5KHZpZXcuaW5qZWN0b3JHZXRNZXRob2QuZmluaXNoKCksIEluamVjdE1ldGhvZFZhcnMkMS5ub3RGb3VuZFJlc3VsdCksIERZTkFNSUNfVFlQRSksXG4gICAgICAgICAgbmV3IENsYXNzTWV0aG9kKCdkZXRlY3RDaGFuZ2VzSW50ZXJuYWwnLCBbbmV3IEZuUGFyYW0oRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZS5uYW1lLCBCT09MX1RZUEUpXSwgZ2VuZXJhdGVEZXRlY3RDaGFuZ2VzTWV0aG9kKHZpZXcpKSxcbiAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ2RpcnR5UGFyZW50UXVlcmllc0ludGVybmFsJywgW10sIHZpZXcuZGlydHlQYXJlbnRRdWVyaWVzTWV0aG9kLmZpbmlzaCgpKSxcbiAgICAgICAgICBuZXcgQ2xhc3NNZXRob2QoJ2Rlc3Ryb3lJbnRlcm5hbCcsIFtdLCBnZW5lcmF0ZURlc3Ryb3lNZXRob2QodmlldykpLFxuICAgICAgICAgIG5ldyBDbGFzc01ldGhvZCgnZGV0YWNoSW50ZXJuYWwnLCBbXSwgdmlldy5kZXRhY2hNZXRob2QuZmluaXNoKCkpLFxuICAgICAgICAgIGdlbmVyYXRlVmlzaXRSb290Tm9kZXNNZXRob2QodmlldyksIGdlbmVyYXRlVmlzaXRQcm9qZWN0YWJsZU5vZGVzTWV0aG9kKHZpZXcpLFxuICAgICAgICAgIGdlbmVyYXRlQ3JlYXRlRW1iZWRkZWRWaWV3c01ldGhvZCh2aWV3KVxuICAgICAgXS5maWx0ZXIoZnVuY3Rpb24gKG1ldGhvZCkgeyByZXR1cm4gbWV0aG9kLmJvZHkubGVuZ3RoID4gMDsgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdXBlckNsYXNzID0gdmlldy5nZW5Db25maWcuZ2VuRGVidWdJbmZvID8gSWRlbnRpZmllcnMuRGVidWdBcHBWaWV3IDogSWRlbnRpZmllcnMuQXBwVmlldztcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdDbGFzcyA9IGNyZWF0ZUNsYXNzU3RtdCh7XG4gICAgICAgICAgbmFtZTogdmlldy5jbGFzc05hbWUsXG4gICAgICAgICAgcGFyZW50OiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoc3VwZXJDbGFzcyksIFtnZXRDb250ZXh0VHlwZSh2aWV3KV0pLFxuICAgICAgICAgIHBhcmVudEFyZ3M6IHN1cGVyQ29uc3RydWN0b3JBcmdzLFxuICAgICAgICAgIGN0b3JQYXJhbXM6IHZpZXdDb25zdHJ1Y3RvckFyZ3MsXG4gICAgICAgICAgYnVpbGRlcnM6IFt7IG1ldGhvZHM6IHZpZXdNZXRob2RzIH0sIHZpZXddXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2aWV3Q2xhc3M7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVEZXN0cm95TWV0aG9kKHZpZXcpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0bXRzID0gW107XG4gICAgICB2aWV3LnZpZXdDb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKHZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICBzdG10cy5wdXNoKHZpZXdDb250YWluZXIuY2FsbE1ldGhvZCgnZGVzdHJveU5lc3RlZFZpZXdzJywgW10pLnRvU3RtdCgpKTtcbiAgICAgIH0pO1xuICAgICAgdmlldy52aWV3Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAodmlld0NoaWxkKSB7IHN0bXRzLnB1c2godmlld0NoaWxkLmNhbGxNZXRob2QoJ2Rlc3Ryb3knLCBbXSkudG9TdG10KCkpOyB9KTtcbiAgICAgIHN0bXRzLnB1c2guYXBwbHkoc3RtdHMsIHZpZXcuZGVzdHJveU1ldGhvZC5maW5pc2goKSk7XG4gICAgICByZXR1cm4gc3RtdHM7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVNZXRob2Qodmlldykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50UmVuZGVyTm9kZUV4cHIgPSBOVUxMX0VYUFI7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRSZW5kZXJOb2RlU3RtdHMgPSBbXTtcbiAgICAgIGlmICh2aWV3LnZpZXdUeXBlID09PSBWaWV3VHlwZS5DT01QT05FTlQpIHtcbiAgICAgICAgICBwYXJlbnRSZW5kZXJOb2RlRXhwciA9XG4gICAgICAgICAgICAgIFZpZXdQcm9wZXJ0aWVzLnJlbmRlcmVyLmNhbGxNZXRob2QoJ2NyZWF0ZVZpZXdSb290JywgW1RISVNfRVhQUi5wcm9wKCdwYXJlbnRFbGVtZW50JyldKTtcbiAgICAgICAgICBwYXJlbnRSZW5kZXJOb2RlU3RtdHMgPVxuICAgICAgICAgICAgICBbcGFyZW50UmVuZGVyTm9kZVZhci5zZXQocGFyZW50UmVuZGVyTm9kZUV4cHIpXG4gICAgICAgICAgICAgICAgICAgICAgLnRvRGVjbFN0bXQoaW1wb3J0VHlwZSh2aWV3LmdlbkNvbmZpZy5yZW5kZXJUeXBlcy5yZW5kZXJOb2RlKSwgW1N0bXRNb2RpZmllci5GaW5hbF0pXTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdEV4cHI7XG4gICAgICBpZiAodmlldy52aWV3VHlwZSA9PT0gVmlld1R5cGUuSE9TVCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RFbCA9ICh2aWV3Lm5vZGVzWzBdKTtcbiAgICAgICAgICByZXN1bHRFeHByID1cbiAgICAgICAgICAgICAgaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvbXBvbmVudFJlZl8pLCBbRFlOQU1JQ19UWVBFXSkuaW5zdGFudGlhdGUoW1xuICAgICAgICAgICAgICAgICAgbGl0ZXJhbChob3N0RWwubm9kZUluZGV4KSwgVEhJU19FWFBSLCBob3N0RWwucmVuZGVyTm9kZSwgaG9zdEVsLmdldENvbXBvbmVudCgpXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVzdWx0RXhwciA9IE5VTExfRVhQUjtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFsbE5vZGVzRXhwciA9IFZpZXdQcm9wZXJ0aWVzLnJlbmRlcmVyLmNhc3QoRFlOQU1JQ19UWVBFKVxuICAgICAgICAgIC5wcm9wKCdkaXJlY3RSZW5kZXJlcicpXG4gICAgICAgICAgLmNvbmRpdGlvbmFsKE5VTExfRVhQUiwgbGl0ZXJhbEFycih2aWV3Lm5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5yZW5kZXJOb2RlOyB9KSkpO1xuICAgICAgcmV0dXJuIHBhcmVudFJlbmRlck5vZGVTdG10cy5jb25jYXQodmlldy5jcmVhdGVNZXRob2QuZmluaXNoKCksIFtcbiAgICAgICAgICBUSElTX0VYUFJcbiAgICAgICAgICAgICAgLmNhbGxNZXRob2QoJ2luaXQnLCBbXG4gICAgICAgICAgICAgIHZpZXcubGFzdFJlbmRlck5vZGUsXG4gICAgICAgICAgICAgIGFsbE5vZGVzRXhwcixcbiAgICAgICAgICAgICAgdmlldy5kaXNwb3NhYmxlcy5sZW5ndGggPyBsaXRlcmFsQXJyKHZpZXcuZGlzcG9zYWJsZXMpIDogTlVMTF9FWFBSLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIC50b1N0bXQoKSxcbiAgICAgICAgICBuZXcgUmV0dXJuU3RhdGVtZW50KHJlc3VsdEV4cHIpXG4gICAgICBdKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZW5lcmF0ZURldGVjdENoYW5nZXNNZXRob2Qodmlldykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBbXTtcbiAgICAgIGlmICh2aWV3LmFuaW1hdGlvbkJpbmRpbmdzTWV0aG9kLmlzRW1wdHkoKSAmJiB2aWV3LmRldGVjdENoYW5nZXNJbklucHV0c01ldGhvZC5pc0VtcHR5KCkgJiZcbiAgICAgICAgICB2aWV3LnVwZGF0ZUNvbnRlbnRRdWVyaWVzTWV0aG9kLmlzRW1wdHkoKSAmJlxuICAgICAgICAgIHZpZXcuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzTWV0aG9kLmlzRW1wdHkoKSAmJlxuICAgICAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlc1JlbmRlclByb3BlcnRpZXNNZXRob2QuaXNFbXB0eSgpICYmXG4gICAgICAgICAgdmlldy51cGRhdGVWaWV3UXVlcmllc01ldGhvZC5pc0VtcHR5KCkgJiYgdmlldy5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3NNZXRob2QuaXNFbXB0eSgpICYmXG4gICAgICAgICAgdmlldy52aWV3Q29udGFpbmVycy5sZW5ndGggPT09IDAgJiYgdmlldy52aWV3Q2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHN0bXRzO1xuICAgICAgfVxuICAgICAgc3RtdHMucHVzaC5hcHBseShzdG10cywgdmlldy5hbmltYXRpb25CaW5kaW5nc01ldGhvZC5maW5pc2goKSk7XG4gICAgICBzdG10cy5wdXNoLmFwcGx5KHN0bXRzLCB2aWV3LmRldGVjdENoYW5nZXNJbklucHV0c01ldGhvZC5maW5pc2goKSk7XG4gICAgICB2aWV3LnZpZXdDb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKHZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICBzdG10cy5wdXNoKHZpZXdDb250YWluZXIuY2FsbE1ldGhvZCgnZGV0ZWN0Q2hhbmdlc0luTmVzdGVkVmlld3MnLCBbRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZV0pXG4gICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICB9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFmdGVyQ29udGVudFN0bXRzID0gdmlldy51cGRhdGVDb250ZW50UXVlcmllc01ldGhvZC5maW5pc2goKS5jb25jYXQodmlldy5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3NNZXRob2QuZmluaXNoKCkpO1xuICAgICAgaWYgKGFmdGVyQ29udGVudFN0bXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzdG10cy5wdXNoKG5ldyBJZlN0bXQobm90KERldGVjdENoYW5nZXNWYXJzLnRocm93T25DaGFuZ2UpLCBhZnRlckNvbnRlbnRTdG10cykpO1xuICAgICAgfVxuICAgICAgc3RtdHMucHVzaC5hcHBseShzdG10cywgdmlldy5kZXRlY3RDaGFuZ2VzUmVuZGVyUHJvcGVydGllc01ldGhvZC5maW5pc2goKSk7XG4gICAgICB2aWV3LnZpZXdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uICh2aWV3Q2hpbGQpIHtcbiAgICAgICAgICBzdG10cy5wdXNoKHZpZXdDaGlsZC5jYWxsTWV0aG9kKCdpbnRlcm5hbERldGVjdENoYW5nZXMnLCBbRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZV0pLnRvU3RtdCgpKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWZ0ZXJWaWV3U3RtdHMgPSB2aWV3LnVwZGF0ZVZpZXdRdWVyaWVzTWV0aG9kLmZpbmlzaCgpLmNvbmNhdCh2aWV3LmFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc01ldGhvZC5maW5pc2goKSk7XG4gICAgICBpZiAoYWZ0ZXJWaWV3U3RtdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHN0bXRzLnB1c2gobmV3IElmU3RtdChub3QoRGV0ZWN0Q2hhbmdlc1ZhcnMudGhyb3dPbkNoYW5nZSksIGFmdGVyVmlld1N0bXRzKSk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YXJTdG10cyA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVhZFZhcnMgPSBmaW5kUmVhZFZhck5hbWVzKHN0bXRzKTtcbiAgICAgIGlmIChyZWFkVmFycy5oYXMoRGV0ZWN0Q2hhbmdlc1ZhcnMuY2hhbmdlZC5uYW1lKSkge1xuICAgICAgICAgIHZhclN0bXRzLnB1c2goRGV0ZWN0Q2hhbmdlc1ZhcnMuY2hhbmdlZC5zZXQobGl0ZXJhbCh0cnVlKSkudG9EZWNsU3RtdChCT09MX1RZUEUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFkVmFycy5oYXMoRGV0ZWN0Q2hhbmdlc1ZhcnMuY2hhbmdlcy5uYW1lKSkge1xuICAgICAgICAgIHZhclN0bXRzLnB1c2goRGV0ZWN0Q2hhbmdlc1ZhcnMuY2hhbmdlcy5zZXQoTlVMTF9FWFBSKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdChuZXcgTWFwVHlwZShpbXBvcnRUeXBlKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuU2ltcGxlQ2hhbmdlKSkpKSk7XG4gICAgICB9XG4gICAgICB2YXJTdG10cy5wdXNoLmFwcGx5KHZhclN0bXRzLCBjcmVhdGVTaGFyZWRCaW5kaW5nVmFyaWFibGVzSWZOZWVkZWQoc3RtdHMpKTtcbiAgICAgIHJldHVybiB2YXJTdG10cy5jb25jYXQoc3RtdHMpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0YXRlbWVudHNcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmV0dXJuVmFsdWVmTm90RW1wdHkoc3RhdGVtZW50cywgdmFsdWUpIHtcbiAgICAgIGlmIChzdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGVtZW50cy5jb25jYXQoW25ldyBSZXR1cm5TdGF0ZW1lbnQodmFsdWUpXSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDb250ZXh0VHlwZSh2aWV3KSB7XG4gICAgICBpZiAodmlldy52aWV3VHlwZSA9PT0gVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgcmV0dXJuIGltcG9ydFR5cGUodmlldy5jb21wb25lbnQudHlwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRFlOQU1JQ19UWVBFO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldENoYW5nZURldGVjdGlvbk1vZGUodmlldykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kZTtcbiAgICAgIGlmICh2aWV3LnZpZXdUeXBlID09PSBWaWV3VHlwZS5DT01QT05FTlQpIHtcbiAgICAgICAgICBtb2RlID0gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kodmlldy5jb21wb25lbnQuY2hhbmdlRGV0ZWN0aW9uKSA/XG4gICAgICAgICAgICAgIENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrQWx3YXlzIDpcbiAgICAgICAgICAgICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuQ2hlY2tPbmNlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgbW9kZSA9IENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrQWx3YXlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVWaXNpdFJvb3ROb2Rlc01ldGhvZCh2aWV3KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYlZhciA9IHZhcmlhYmxlKCdjYicpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3R4VmFyID0gdmFyaWFibGUoJ2N0eCcpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBnZW5lcmF0ZVZpc2l0Tm9kZXNTdG10cyh2aWV3LnJvb3ROb2RlcywgY2JWYXIsIGN0eFZhcik7XG4gICAgICByZXR1cm4gbmV3IENsYXNzTWV0aG9kKCd2aXNpdFJvb3ROb2Rlc0ludGVybmFsJywgW25ldyBGblBhcmFtKGNiVmFyLm5hbWUsIERZTkFNSUNfVFlQRSksIG5ldyBGblBhcmFtKGN0eFZhci5uYW1lLCBEWU5BTUlDX1RZUEUpXSwgc3RtdHMpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdlbmVyYXRlVmlzaXRQcm9qZWN0YWJsZU5vZGVzTWV0aG9kKHZpZXcpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVJbmRleFZhciA9IHZhcmlhYmxlKCdub2RlSW5kZXgnKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nQ29udGVudEluZGV4VmFyID0gdmFyaWFibGUoJ25nQ29udGVudEluZGV4Jyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYlZhciA9IHZhcmlhYmxlKCdjYicpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3R4VmFyID0gdmFyaWFibGUoJ2N0eCcpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBbXTtcbiAgICAgIHZpZXcubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcGlsZUVsZW1lbnQgJiYgbm9kZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgbm9kZS5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4LmZvckVhY2goZnVuY3Rpb24gKHByb2plY3RlZE5vZGVzLCBuZ0NvbnRlbnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgc3RtdHMucHVzaChuZXcgSWZTdG10KG5vZGVJbmRleFZhci5lcXVhbHMobGl0ZXJhbChub2RlLm5vZGVJbmRleCkpXG4gICAgICAgICAgICAgICAgICAgICAgLmFuZChuZ0NvbnRlbnRJbmRleFZhci5lcXVhbHMobGl0ZXJhbChuZ0NvbnRlbnRJbmRleCkpKSwgZ2VuZXJhdGVWaXNpdE5vZGVzU3RtdHMocHJvamVjdGVkTm9kZXMsIGNiVmFyLCBjdHhWYXIpKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDbGFzc01ldGhvZCgndmlzaXRQcm9qZWN0YWJsZU5vZGVzSW50ZXJuYWwnLCBbXG4gICAgICAgICAgbmV3IEZuUGFyYW0obm9kZUluZGV4VmFyLm5hbWUsIE5VTUJFUl9UWVBFKSxcbiAgICAgICAgICBuZXcgRm5QYXJhbShuZ0NvbnRlbnRJbmRleFZhci5uYW1lLCBOVU1CRVJfVFlQRSksXG4gICAgICAgICAgbmV3IEZuUGFyYW0oY2JWYXIubmFtZSwgRFlOQU1JQ19UWVBFKSwgbmV3IEZuUGFyYW0oY3R4VmFyLm5hbWUsIERZTkFNSUNfVFlQRSlcbiAgICAgIF0sIHN0bXRzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgKiBAcGFyYW0gez99IGNiXG4gICAqIEBwYXJhbSB7P30gY3R4XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZW5lcmF0ZVZpc2l0Tm9kZXNTdG10cyhub2RlcywgY2IsIGN0eCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RtdHMgPSBbXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIENvbXBpbGVWaWV3Um9vdE5vZGVUeXBlLk5vZGU6XG4gICAgICAgICAgICAgICAgICBzdG10cy5wdXNoKGNiLmNhbGxGbihbbm9kZS5leHByLCBjdHhdKS50b1N0bXQoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBDb21waWxlVmlld1Jvb3ROb2RlVHlwZS5WaWV3Q29udGFpbmVyOlxuICAgICAgICAgICAgICAgICAgc3RtdHMucHVzaChjYi5jYWxsRm4oW25vZGUuZXhwci5wcm9wKCduYXRpdmVFbGVtZW50JyksIGN0eF0pLnRvU3RtdCgpKTtcbiAgICAgICAgICAgICAgICAgIHN0bXRzLnB1c2gobm9kZS5leHByLmNhbGxNZXRob2QoJ3Zpc2l0TmVzdGVkVmlld1Jvb3ROb2RlcycsIFtjYiwgY3R4XSkudG9TdG10KCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQ29tcGlsZVZpZXdSb290Tm9kZVR5cGUuTmdDb250ZW50OlxuICAgICAgICAgICAgICAgICAgc3RtdHMucHVzaChUSElTX0VYUFIuY2FsbE1ldGhvZCgndmlzaXRQcm9qZWN0ZWROb2RlcycsIFtsaXRlcmFsKG5vZGUubmdDb250ZW50SW5kZXgpLCBjYiwgY3R4XSlcbiAgICAgICAgICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RtdHM7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmlld1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2VuZXJhdGVDcmVhdGVFbWJlZGRlZFZpZXdzTWV0aG9kKHZpZXcpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVJbmRleFZhciA9IHZhcmlhYmxlKCdub2RlSW5kZXgnKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0bXRzID0gW107XG4gICAgICB2aWV3Lm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbXBpbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGlmIChub2RlLmVtYmVkZGVkVmlldykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50Tm9kZUluZGV4ID0gbm9kZS5pc1Jvb3RFbGVtZW50KCkgPyBudWxsIDogbm9kZS5wYXJlbnQubm9kZUluZGV4O1xuICAgICAgICAgICAgICAgICAgc3RtdHMucHVzaChuZXcgSWZTdG10KG5vZGVJbmRleFZhci5lcXVhbHMobGl0ZXJhbChub2RlLm5vZGVJbmRleCkpLCBbbmV3IFJldHVyblN0YXRlbWVudChub2RlLmVtYmVkZGVkVmlldy5jbGFzc0V4cHIuaW5zdGFudGlhdGUoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3UHJvcGVydGllcy52aWV3VXRpbHMsIFRISVNfRVhQUiwgbGl0ZXJhbChub2RlLm5vZGVJbmRleCksIG5vZGUucmVuZGVyTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS52aWV3Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgXSkpXSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoc3RtdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHN0bXRzLnB1c2gobmV3IFJldHVyblN0YXRlbWVudChOVUxMX0VYUFIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ2xhc3NNZXRob2QoJ2NyZWF0ZUVtYmVkZGVkVmlld0ludGVybmFsJywgW25ldyBGblBhcmFtKG5vZGVJbmRleFZhci5uYW1lLCBOVU1CRVJfVFlQRSldLCBzdG10cywgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFwcFZpZXcpLCBbRFlOQU1JQ19UWVBFXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19kZWNvcmF0ZSQxNiA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xuICB9O1xuICB2YXIgX19tZXRhZGF0YSQxNiA9ICh0aGlzICYmIHRoaXMuX19tZXRhZGF0YSkgfHwgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShrLCB2KTtcbiAgfTtcbiAgdmFyIFZpZXdDb21waWxlUmVzdWx0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZW1lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdDbGFzc1ZhclxuICAgICAgICogQHBhcmFtIHs/fSBkZXBlbmRlbmNpZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVmlld0NvbXBpbGVSZXN1bHQoc3RhdGVtZW50cywgdmlld0NsYXNzVmFyLCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgICAgICAgIHRoaXMudmlld0NsYXNzVmFyID0gdmlld0NsYXNzVmFyO1xuICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZpZXdDb21waWxlUmVzdWx0O1xuICB9KCkpO1xuICB2YXIgVmlld0NvbXBpbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfZ2VuQ29uZmlnXG4gICAgICAgKiBAcGFyYW0gez99IF9zY2hlbWFSZWdpc3RyeVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBWaWV3Q29tcGlsZXIoX2dlbkNvbmZpZywgX3NjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgICAgICAgdGhpcy5fZ2VuQ29uZmlnID0gX2dlbkNvbmZpZztcbiAgICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IHBpcGVzXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBpbGVkQW5pbWF0aW9uc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVmlld0NvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgdGVtcGxhdGUsIHN0eWxlcywgcGlwZXMsIGNvbXBpbGVkQW5pbWF0aW9ucykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlcGVuZGVuY2llcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXcgPSBuZXcgQ29tcGlsZVZpZXcoY29tcG9uZW50LCB0aGlzLl9nZW5Db25maWcsIHBpcGVzLCBzdHlsZXMsIGNvbXBpbGVkQW5pbWF0aW9ucywgMCwgQ29tcGlsZUVsZW1lbnQuY3JlYXRlTnVsbCgpLCBbXSwgZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZW1lbnRzID0gW107XG4gICAgICAgICAgYnVpbGRWaWV3KHZpZXcsIHRlbXBsYXRlLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgICAgIC8vIE5lZWQgdG8gc2VwYXJhdGUgYmluZGluZyBmcm9tIGNyZWF0aW9uIHRvIGJlIGFibGUgdG8gcmVmZXIgdG9cbiAgICAgICAgICAvLyB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gZGVjbGFyZWQgYWZ0ZXIgdXNhZ2UuXG4gICAgICAgICAgYmluZFZpZXcodmlldywgdGVtcGxhdGUsIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5KTtcbiAgICAgICAgICBmaW5pc2hWaWV3KHZpZXcsIHN0YXRlbWVudHMpO1xuICAgICAgICAgIHJldHVybiBuZXcgVmlld0NvbXBpbGVSZXN1bHQoc3RhdGVtZW50cywgdmlldy5jbGFzc0V4cHIubmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgICAgIH07XG4gICAgICBWaWV3Q29tcGlsZXIgPSBfX2RlY29yYXRlJDE2KFtcbiAgICAgICAgICBDb21waWxlckluamVjdGFibGUoKSwgXG4gICAgICAgICAgX19tZXRhZGF0YSQxNignZGVzaWduOnBhcmFtdHlwZXMnLCBbQ29tcGlsZXJDb25maWcsIEVsZW1lbnRTY2hlbWFSZWdpc3RyeV0pXG4gICAgICBdLCBWaWV3Q29tcGlsZXIpO1xuICAgICAgcmV0dXJuIFZpZXdDb21waWxlcjtcbiAgfSgpKTtcblxuICB2YXIgQW5pbWF0aW9uRW50cnlDb21waWxlUmVzdWx0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gZm5FeHBcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uRW50cnlDb21waWxlUmVzdWx0KG5hbWUsIHN0YXRlbWVudHMsIGZuRXhwKSB7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgICAgICAgIHRoaXMuZm5FeHAgPSBmbkV4cDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBbmltYXRpb25FbnRyeUNvbXBpbGVSZXN1bHQ7XG4gIH0oKSk7XG4gIHZhciBBbmltYXRpb25Db21waWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25Db21waWxlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3J5TmFtZVByZWZpeFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJzZWRBbmltYXRpb25zXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBbmltYXRpb25Db21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uIChmYWN0b3J5TmFtZVByZWZpeCwgcGFyc2VkQW5pbWF0aW9ucykge1xuICAgICAgICAgIHJldHVybiBwYXJzZWRBbmltYXRpb25zLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmFjdG9yeU5hbWUgPSBmYWN0b3J5TmFtZVByZWZpeCArIFwiX1wiICsgZW50cnkubmFtZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlzaXRvciA9IG5ldyBfQW5pbWF0aW9uQnVpbGRlcihlbnRyeS5uYW1lLCBmYWN0b3J5TmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLmJ1aWxkKGVudHJ5KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQW5pbWF0aW9uQ29tcGlsZXI7XG4gIH0oKSk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fRkFDVE9SWV9FTEVNRU5UX1ZBUiA9IHZhcmlhYmxlKCdlbGVtZW50Jyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fREVGQVVMVF9TVEFURV9WQVIgPSB2YXJpYWJsZSgnZGVmYXVsdFN0YXRlU3R5bGVzJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fRkFDVE9SWV9WSUVXX1ZBUiA9IHZhcmlhYmxlKCd2aWV3Jyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fRkFDVE9SWV9WSUVXX0NPTlRFWFQgPSBfQU5JTUFUSU9OX0ZBQ1RPUllfVklFV19WQVIucHJvcCgnYW5pbWF0aW9uQ29udGV4dCcpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfQU5JTUFUSU9OX0ZBQ1RPUllfUkVOREVSRVJfVkFSID0gX0FOSU1BVElPTl9GQUNUT1JZX1ZJRVdfVkFSLnByb3AoJ3JlbmRlcmVyJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fQ1VSUkVOVF9TVEFURV9WQVIgPSB2YXJpYWJsZSgnY3VycmVudFN0YXRlJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fTkVYVF9TVEFURV9WQVIgPSB2YXJpYWJsZSgnbmV4dFN0YXRlJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9BTklNQVRJT05fUExBWUVSX1ZBUiA9IHZhcmlhYmxlKCdwbGF5ZXInKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0FOSU1BVElPTl9USU1FX1ZBUiA9IHZhcmlhYmxlKCd0b3RhbFRpbWUnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0FOSU1BVElPTl9TVEFSVF9TVEFURV9TVFlMRVNfVkFSID0gdmFyaWFibGUoJ3N0YXJ0U3RhdGVTdHlsZXMnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0FOSU1BVElPTl9FTkRfU1RBVEVfU1RZTEVTX1ZBUiA9IHZhcmlhYmxlKCdlbmRTdGF0ZVN0eWxlcycpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfQU5JTUFUSU9OX0NPTExFQ1RFRF9TVFlMRVMgPSB2YXJpYWJsZSgnY29sbGVjdGVkU3R5bGVzJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIF9QUkVWSU9VU19BTklNQVRJT05fUExBWUVSUyA9IHZhcmlhYmxlKCdwcmV2aW91c1BsYXllcnMnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0VNUFRZX01BUCA9IGxpdGVyYWxNYXAoW10pO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfRU1QVFlfQVJSQVkgPSBsaXRlcmFsQXJyKFtdKTtcbiAgdmFyIF9BbmltYXRpb25CdWlsZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25OYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnlOYW1lXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIF9BbmltYXRpb25CdWlsZGVyKGFuaW1hdGlvbk5hbWUsIGZhY3RvcnlOYW1lKSB7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb25OYW1lID0gYW5pbWF0aW9uTmFtZTtcbiAgICAgICAgICB0aGlzLl9mblZhck5hbWUgPSBmYWN0b3J5TmFtZSArICdfZmFjdG9yeSc7XG4gICAgICAgICAgdGhpcy5fc3RhdGVzTWFwVmFyTmFtZSA9IGZhY3RvcnlOYW1lICsgJ19zdGF0ZXMnO1xuICAgICAgICAgIHRoaXMuX3N0YXRlc01hcFZhciA9IHZhcmlhYmxlKHRoaXMuX3N0YXRlc01hcFZhck5hbWUpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25TdHlsZXMgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzQXJyID0gW107XG4gICAgICAgICAgaWYgKGNvbnRleHQuaXNFeHBlY3RpbmdGaXJzdFN0eWxlU3RlcCkge1xuICAgICAgICAgICAgICBzdHlsZXNBcnIucHVzaChfQU5JTUFUSU9OX1NUQVJUX1NUQVRFX1NUWUxFU19WQVIpO1xuICAgICAgICAgICAgICBjb250ZXh0LmlzRXhwZWN0aW5nRmlyc3RTdHlsZVN0ZXAgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXN0LnN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbnRyaWVzID0gT2JqZWN0LmtleXMoZW50cnkpLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBba2V5LCBsaXRlcmFsKGVudHJ5W2tleV0pXTsgfSk7XG4gICAgICAgICAgICAgIHN0eWxlc0Fyci5wdXNoKGxpdGVyYWxNYXAoZW50cmllcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQW5pbWF0aW9uU3R5bGVzKSkuaW5zdGFudGlhdGUoW1xuICAgICAgICAgICAgICBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuY29sbGVjdEFuZFJlc29sdmVTdHlsZXMpKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgICAgX0FOSU1BVElPTl9DT0xMRUNURURfU1RZTEVTLCBsaXRlcmFsQXJyKHN0eWxlc0FycilcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICBdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9BbmltYXRpb25CdWlsZGVyLnByb3RvdHlwZS52aXNpdEFuaW1hdGlvbktleWZyYW1lID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQW5pbWF0aW9uS2V5ZnJhbWUpKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIGxpdGVyYWwoYXN0Lm9mZnNldCksIGFzdC5zdHlsZXMudmlzaXQodGhpcywgY29udGV4dClcbiAgICAgICAgICBdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIF9BbmltYXRpb25CdWlsZGVyLnByb3RvdHlwZS52aXNpdEFuaW1hdGlvblN0ZXAgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBpZiAoY29udGV4dC5lbmRTdGF0ZUFuaW1hdGVTdGVwID09PSBhc3QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0RW5kU3RhdGVBbmltYXRpb24oYXN0LCBjb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhcnRpbmdTdHlsZXNFeHByID0gYXN0LnN0YXJ0aW5nU3R5bGVzLnZpc2l0KHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleWZyYW1lRXhwcmVzc2lvbnMgPSBhc3Qua2V5ZnJhbWVzLm1hcChmdW5jdGlvbiAoa2V5ZnJhbWVFbnRyeSkgeyByZXR1cm4ga2V5ZnJhbWVFbnRyeS52aXNpdChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsQW5pbWF0ZU1ldGhvZChhc3QsIHN0YXJ0aW5nU3R5bGVzRXhwciwgbGl0ZXJhbEFycihrZXlmcmFtZUV4cHJlc3Npb25zKSwgY29udGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUuX3Zpc2l0RW5kU3RhdGVBbmltYXRpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydGluZ1N0eWxlc0V4cHIgPSBhc3Quc3RhcnRpbmdTdHlsZXMudmlzaXQodGhpcywgY29udGV4dCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ZnJhbWVFeHByZXNzaW9ucyA9IGFzdC5rZXlmcmFtZXMubWFwKGZ1bmN0aW9uIChrZXlmcmFtZSkgeyByZXR1cm4ga2V5ZnJhbWUudmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlmcmFtZXNFeHByID0gaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLmJhbGFuY2VBbmltYXRpb25LZXlmcmFtZXMpKS5jYWxsRm4oW1xuICAgICAgICAgICAgICBfQU5JTUFUSU9OX0NPTExFQ1RFRF9TVFlMRVMsIF9BTklNQVRJT05fRU5EX1NUQVRFX1NUWUxFU19WQVIsXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIoa2V5ZnJhbWVFeHByZXNzaW9ucylcbiAgICAgICAgICBdKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsbEFuaW1hdGVNZXRob2QoYXN0LCBzdGFydGluZ1N0eWxlc0V4cHIsIGtleWZyYW1lc0V4cHIsIGNvbnRleHQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRpbmdTdHlsZXNFeHByXG4gICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc0V4cHJcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FuaW1hdGlvbkJ1aWxkZXIucHJvdG90eXBlLl9jYWxsQW5pbWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChhc3QsIHN0YXJ0aW5nU3R5bGVzRXhwciwga2V5ZnJhbWVzRXhwciwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZpb3VzU3R5bGVzVmFsdWUgPSBfRU1QVFlfQVJSQVk7XG4gICAgICAgICAgaWYgKGNvbnRleHQuaXNFeHBlY3RpbmdGaXJzdEFuaW1hdGVTdGVwKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU3R5bGVzVmFsdWUgPSBfUFJFVklPVVNfQU5JTUFUSU9OX1BMQVlFUlM7XG4gICAgICAgICAgICAgIGNvbnRleHQuaXNFeHBlY3RpbmdGaXJzdEFuaW1hdGVTdGVwID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQudG90YWxUcmFuc2l0aW9uVGltZSArPSBhc3QuZHVyYXRpb24gKyBhc3QuZGVsYXk7XG4gICAgICAgICAgcmV0dXJuIF9BTklNQVRJT05fRkFDVE9SWV9SRU5ERVJFUl9WQVIuY2FsbE1ldGhvZCgnYW5pbWF0ZScsIFtcbiAgICAgICAgICAgICAgX0FOSU1BVElPTl9GQUNUT1JZX0VMRU1FTlRfVkFSLCBzdGFydGluZ1N0eWxlc0V4cHIsIGtleWZyYW1lc0V4cHIsIGxpdGVyYWwoYXN0LmR1cmF0aW9uKSxcbiAgICAgICAgICAgICAgbGl0ZXJhbChhc3QuZGVsYXkpLCBsaXRlcmFsKGFzdC5lYXNpbmcpLCBwcmV2aW91c1N0eWxlc1ZhbHVlXG4gICAgICAgICAgXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25TZXF1ZW5jZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllckV4cHJzID0gYXN0LnN0ZXBzLm1hcChmdW5jdGlvbiAoc3RlcCkgeyByZXR1cm4gc3RlcC52aXNpdChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIpKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIocGxheWVyRXhwcnMpXG4gICAgICAgICAgXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25Hcm91cCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllckV4cHJzID0gYXN0LnN0ZXBzLm1hcChmdW5jdGlvbiAoc3RlcCkgeyByZXR1cm4gc3RlcC52aXNpdChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuQW5pbWF0aW9uR3JvdXBQbGF5ZXIpKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIGxpdGVyYWxBcnIocGxheWVyRXhwcnMpXG4gICAgICAgICAgXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZsYXRTdHlsZXMgPSB7fTtcbiAgICAgICAgICBfZ2V0U3R5bGVzQXJyYXkoYXN0KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyBPYmplY3Qua2V5cyhlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGZsYXRTdHlsZXNba2V5XSA9IGVudHJ5W2tleV07IH0pOyB9KTtcbiAgICAgICAgICBjb250ZXh0LnN0YXRlTWFwLnJlZ2lzdGVyU3RhdGUoYXN0LnN0YXRlTmFtZSwgZmxhdFN0eWxlcyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25TdGF0ZVRyYW5zaXRpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RlcHMgPSBhc3QuYW5pbWF0aW9uLnN0ZXBzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3RTdGVwID0gc3RlcHNbc3RlcHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKF9pc0VuZFN0YXRlQW5pbWF0ZVN0ZXAobGFzdFN0ZXApKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuZW5kU3RhdGVBbmltYXRlU3RlcCA9IChsYXN0U3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHQudG90YWxUcmFuc2l0aW9uVGltZSA9IDA7XG4gICAgICAgICAgY29udGV4dC5pc0V4cGVjdGluZ0ZpcnN0U3R5bGVTdGVwID0gdHJ1ZTtcbiAgICAgICAgICBjb250ZXh0LmlzRXhwZWN0aW5nRmlyc3RBbmltYXRlU3RlcCA9IHRydWU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGVDaGFuZ2VQcmVjb25kaXRpb25zID0gW107XG4gICAgICAgICAgYXN0LnN0YXRlQ2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZUNoYW5nZSkge1xuICAgICAgICAgICAgICBzdGF0ZUNoYW5nZVByZWNvbmRpdGlvbnMucHVzaChfY29tcGFyZVRvQW5pbWF0aW9uU3RhdGVFeHByKF9BTklNQVRJT05fQ1VSUkVOVF9TVEFURV9WQVIsIHN0YXRlQ2hhbmdlLmZyb21TdGF0ZSlcbiAgICAgICAgICAgICAgICAgIC5hbmQoX2NvbXBhcmVUb0FuaW1hdGlvblN0YXRlRXhwcihfQU5JTUFUSU9OX05FWFRfU1RBVEVfVkFSLCBzdGF0ZUNoYW5nZS50b1N0YXRlKSkpO1xuICAgICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UuZnJvbVN0YXRlICE9IEFOWV9TVEFURSkge1xuICAgICAgICAgICAgICAgICAgY29udGV4dC5zdGF0ZU1hcC5yZWdpc3RlclN0YXRlKHN0YXRlQ2hhbmdlLmZyb21TdGF0ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlLnRvU3RhdGUgIT0gQU5ZX1NUQVRFKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXRlTWFwLnJlZ2lzdGVyU3RhdGUoc3RhdGVDaGFuZ2UudG9TdGF0ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25QbGF5ZXJFeHByID0gYXN0LmFuaW1hdGlvbi52aXNpdCh0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWR1Y2VkU3RhdGVDaGFuZ2VzUHJlY29uZGl0aW9uID0gc3RhdGVDaGFuZ2VQcmVjb25kaXRpb25zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5vcihiKTsgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlY29uZGl0aW9uID0gX0FOSU1BVElPTl9QTEFZRVJfVkFSLmVxdWFscyhOVUxMX0VYUFIpLmFuZChyZWR1Y2VkU3RhdGVDaGFuZ2VzUHJlY29uZGl0aW9uKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25TdG10ID0gX0FOSU1BVElPTl9QTEFZRVJfVkFSLnNldChhbmltYXRpb25QbGF5ZXJFeHByKS50b1N0bXQoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b3RhbFRpbWVTdG10ID0gX0FOSU1BVElPTl9USU1FX1ZBUi5zZXQobGl0ZXJhbChjb250ZXh0LnRvdGFsVHJhbnNpdGlvblRpbWUpKS50b1N0bXQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3IElmU3RtdChwcmVjb25kaXRpb24sIFthbmltYXRpb25TdG10LCB0b3RhbFRpbWVTdG10XSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBfQW5pbWF0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRBbmltYXRpb25FbnRyeSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIC8vIHZpc2l0IGVhY2ggb2YgdGhlIGRlY2xhcmF0aW9ucyBmaXJzdCB0byBidWlsZCB0aGUgY29udGV4dCBzdGF0ZSBtYXBcbiAgICAgICAgICBhc3Quc3RhdGVEZWNsYXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZGVmKSB7IHJldHVybiBkZWYudmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgICAvLyB0aGlzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZCBldmVuIGlmIHRoZSB1c2VyIG92ZXJyaWRlcyBpdFxuICAgICAgICAgIGNvbnRleHQuc3RhdGVNYXAucmVnaXN0ZXJTdGF0ZShERUZBVUxUX1NUQVRFLCB7fSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGVtZW50cyA9IFtdO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfUFJFVklPVVNfQU5JTUFUSU9OX1BMQVlFUlNcbiAgICAgICAgICAgICAgLnNldChfQU5JTUFUSU9OX0ZBQ1RPUllfVklFV19DT05URVhULmNhbGxNZXRob2QoJ2dldEFuaW1hdGlvblBsYXllcnMnLCBbXG4gICAgICAgICAgICAgIF9BTklNQVRJT05fRkFDVE9SWV9FTEVNRU5UX1ZBUixcbiAgICAgICAgICAgICAgX0FOSU1BVElPTl9ORVhUX1NUQVRFX1ZBUi5lcXVhbHMobGl0ZXJhbChFTVBUWV9TVEFURSkpXG4gICAgICAgICAgICAgICAgICAuY29uZGl0aW9uYWwoTlVMTF9FWFBSLCBsaXRlcmFsKHRoaXMuYW5pbWF0aW9uTmFtZSkpXG4gICAgICAgICAgXSkpXG4gICAgICAgICAgICAgIC50b0RlY2xTdG10KCkpO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfQU5JTUFUSU9OX0NPTExFQ1RFRF9TVFlMRVMuc2V0KF9FTVBUWV9NQVApLnRvRGVjbFN0bXQoKSk7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKF9BTklNQVRJT05fUExBWUVSX1ZBUi5zZXQoTlVMTF9FWFBSKS50b0RlY2xTdG10KCkpO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfQU5JTUFUSU9OX1RJTUVfVkFSLnNldChsaXRlcmFsKDApKS50b0RlY2xTdG10KCkpO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfQU5JTUFUSU9OX0RFRkFVTFRfU1RBVEVfVkFSLnNldCh0aGlzLl9zdGF0ZXNNYXBWYXIua2V5KGxpdGVyYWwoREVGQVVMVF9TVEFURSkpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdCgpKTtcbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goX0FOSU1BVElPTl9TVEFSVF9TVEFURV9TVFlMRVNfVkFSLnNldCh0aGlzLl9zdGF0ZXNNYXBWYXIua2V5KF9BTklNQVRJT05fQ1VSUkVOVF9TVEFURV9WQVIpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdCgpKTtcbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IElmU3RtdChfQU5JTUFUSU9OX1NUQVJUX1NUQVRFX1NUWUxFU19WQVIuZXF1YWxzKE5VTExfRVhQUiksIFtfQU5JTUFUSU9OX1NUQVJUX1NUQVRFX1NUWUxFU19WQVIuc2V0KF9BTklNQVRJT05fREVGQVVMVF9TVEFURV9WQVIpLnRvU3RtdCgpXSkpO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfQU5JTUFUSU9OX0VORF9TVEFURV9TVFlMRVNfVkFSLnNldCh0aGlzLl9zdGF0ZXNNYXBWYXIua2V5KF9BTklNQVRJT05fTkVYVF9TVEFURV9WQVIpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdCgpKTtcbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IElmU3RtdChfQU5JTUFUSU9OX0VORF9TVEFURV9TVFlMRVNfVkFSLmVxdWFscyhOVUxMX0VYUFIpLCBbX0FOSU1BVElPTl9FTkRfU1RBVEVfU1RZTEVTX1ZBUi5zZXQoX0FOSU1BVElPTl9ERUZBVUxUX1NUQVRFX1ZBUikudG9TdG10KCldKSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUkVOREVSX1NUWUxFU19GTiA9IGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5yZW5kZXJTdHlsZXMpKTtcbiAgICAgICAgICBhc3Quc3RhdGVUcmFuc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh0cmFuc0FzdCkgeyByZXR1cm4gc3RhdGVtZW50cy5wdXNoKHRyYW5zQXN0LnZpc2l0KF90aGlzLCBjb250ZXh0KSk7IH0pO1xuICAgICAgICAgIC8vIHRoaXMgY2hlY2sgZW5zdXJlcyB0aGF0IHRoZSBhbmltYXRpb24gZmFjdG9yeSBhbHdheXMgcmV0dXJucyBhIHBsYXllclxuICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIG9uRG9uZSBjYWxsYmFjayBjYW4gYmUgdXNlZCBmb3IgdHJhY2tpbmdcbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IElmU3RtdChfQU5JTUFUSU9OX1BMQVlFUl9WQVIuZXF1YWxzKE5VTExfRVhQUiksIFtfQU5JTUFUSU9OX1BMQVlFUl9WQVJcbiAgICAgICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLk5vT3BBbmltYXRpb25QbGF5ZXIpKS5pbnN0YW50aWF0ZShbXSkpXG4gICAgICAgICAgICAgICAgICAudG9TdG10KCldKSk7XG4gICAgICAgICAgLy8gb25jZSBjb21wbGV0ZSB3ZSB3YW50IHRvIGFwcGx5IHRoZSBzdHlsZXMgb24gdGhlIGVsZW1lbnRcbiAgICAgICAgICAvLyBzaW5jZSB0aGUgZGVzdGluYXRpb24gc3RhdGUncyB2YWx1ZXMgc2hvdWxkIHBlcnNpc3Qgb25jZVxuICAgICAgICAgIC8vIHRoZSBhbmltYXRpb24gc2VxdWVuY2UgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goX0FOSU1BVElPTl9QTEFZRVJfVkFSXG4gICAgICAgICAgICAgIC5jYWxsTWV0aG9kKCdvbkRvbmUnLCBbZm4oW10sIFtcbiAgICAgICAgICAgICAgICAgIF9BTklNQVRJT05fUExBWUVSX1ZBUi5jYWxsTWV0aG9kKCdkZXN0cm95JywgW10pLnRvU3RtdCgpLFxuICAgICAgICAgICAgICAgICAgUkVOREVSX1NUWUxFU19GTlxuICAgICAgICAgICAgICAgICAgICAgIC5jYWxsRm4oW1xuICAgICAgICAgICAgICAgICAgICAgIF9BTklNQVRJT05fRkFDVE9SWV9FTEVNRU5UX1ZBUiwgX0FOSU1BVElPTl9GQUNUT1JZX1JFTkRFUkVSX1ZBUixcbiAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMucHJlcGFyZUZpbmFsQW5pbWF0aW9uU3R5bGVzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGxGbihbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9BTklNQVRJT05fU1RBUlRfU1RBVEVfU1RZTEVTX1ZBUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX0FOSU1BVElPTl9FTkRfU1RBVEVfU1RZTEVTX1ZBUlxuICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAgIC50b1N0bXQoKVxuICAgICAgICAgICAgICBdKV0pXG4gICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGltcG9ydEV4cHIoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5BbmltYXRpb25TZXF1ZW5jZVBsYXllcikpXG4gICAgICAgICAgICAgIC5pbnN0YW50aWF0ZShbX1BSRVZJT1VTX0FOSU1BVElPTl9QTEFZRVJTXSlcbiAgICAgICAgICAgICAgLmNhbGxNZXRob2QoJ2Rlc3Ryb3knLCBbXSlcbiAgICAgICAgICAgICAgLnRvU3RtdCgpKTtcbiAgICAgICAgICAvLyBiZWZvcmUgd2Ugc3RhcnQgYW55IGFuaW1hdGlvbiB3ZSB3YW50IHRvIGNsZWFyIG91dCB0aGUgc3RhcnRpbmdcbiAgICAgICAgICAvLyBzdHlsZXMgZnJvbSB0aGUgZWxlbWVudCdzIHN0eWxlIHByb3BlcnR5IChzaW5jZSB0aGV5IHdlcmUgcGxhY2VkXG4gICAgICAgICAgLy8gdGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBhbmltYXRpb25cbiAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goUkVOREVSX1NUWUxFU19GTlxuICAgICAgICAgICAgICAuY2FsbEZuKFtcbiAgICAgICAgICAgICAgX0FOSU1BVElPTl9GQUNUT1JZX0VMRU1FTlRfVkFSLCBfQU5JTUFUSU9OX0ZBQ1RPUllfUkVOREVSRVJfVkFSLFxuICAgICAgICAgICAgICBpbXBvcnRFeHByKGNyZWF0ZUlkZW50aWZpZXIoSWRlbnRpZmllcnMuY2xlYXJTdHlsZXMpKVxuICAgICAgICAgICAgICAgICAgLmNhbGxGbihbX0FOSU1BVElPTl9TVEFSVF9TVEFURV9TVFlMRVNfVkFSXSlcbiAgICAgICAgICBdKVxuICAgICAgICAgICAgICAudG9TdG10KCkpO1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChfQU5JTUFUSU9OX0ZBQ1RPUllfVklFV19DT05URVhUXG4gICAgICAgICAgICAgIC5jYWxsTWV0aG9kKCdxdWV1ZUFuaW1hdGlvbicsIFtcbiAgICAgICAgICAgICAgX0FOSU1BVElPTl9GQUNUT1JZX0VMRU1FTlRfVkFSLCBsaXRlcmFsKHRoaXMuYW5pbWF0aW9uTmFtZSksXG4gICAgICAgICAgICAgIF9BTklNQVRJT05fUExBWUVSX1ZBUlxuICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIC50b1N0bXQoKSk7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKG5ldyBSZXR1cm5TdGF0ZW1lbnQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFuaW1hdGlvblRyYW5zaXRpb24pKS5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIF9BTklNQVRJT05fUExBWUVSX1ZBUiwgX0FOSU1BVElPTl9DVVJSRU5UX1NUQVRFX1ZBUiwgX0FOSU1BVElPTl9ORVhUX1NUQVRFX1ZBUixcbiAgICAgICAgICAgICAgX0FOSU1BVElPTl9USU1FX1ZBUlxuICAgICAgICAgIF0pKSk7XG4gICAgICAgICAgcmV0dXJuIGZuKFtcbiAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oX0FOSU1BVElPTl9GQUNUT1JZX1ZJRVdfVkFSLm5hbWUsIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5BcHBWaWV3KSwgW0RZTkFNSUNfVFlQRV0pKSxcbiAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oX0FOSU1BVElPTl9GQUNUT1JZX0VMRU1FTlRfVkFSLm5hbWUsIERZTkFNSUNfVFlQRSksXG4gICAgICAgICAgICAgIG5ldyBGblBhcmFtKF9BTklNQVRJT05fQ1VSUkVOVF9TVEFURV9WQVIubmFtZSwgRFlOQU1JQ19UWVBFKSxcbiAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oX0FOSU1BVElPTl9ORVhUX1NUQVRFX1ZBUi5uYW1lLCBEWU5BTUlDX1RZUEUpXG4gICAgICAgICAgXSwgc3RhdGVtZW50cywgaW1wb3J0VHlwZShjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkFuaW1hdGlvblRyYW5zaXRpb24pKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FuaW1hdGlvbkJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbnRleHQgPSBuZXcgX0FuaW1hdGlvbkJ1aWxkZXJDb250ZXh0KCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm5TdGF0ZW1lbnQgPSBhc3QudmlzaXQodGhpcywgY29udGV4dCkudG9EZWNsU3RtdCh0aGlzLl9mblZhck5hbWUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuVmFyaWFibGUgPSB2YXJpYWJsZSh0aGlzLl9mblZhck5hbWUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvb2t1cE1hcCA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGNvbnRleHQuc3RhdGVNYXAuc3RhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBjb250ZXh0LnN0YXRlTWFwLnN0YXRlc1tzdGF0ZU5hbWVdO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YXJpYWJsZVZhbHVlID0gX0VNUFRZX01BUDtcbiAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlTWFwXzEgPSBbXTtcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgc3R5bGVNYXBfMS5wdXNoKFtrZXksIGxpdGVyYWwodmFsdWVba2V5XSldKTsgfSk7XG4gICAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gbGl0ZXJhbE1hcChzdHlsZU1hcF8xKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb29rdXBNYXAucHVzaChbc3RhdGVOYW1lLCB2YXJpYWJsZVZhbHVlXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZWRTdGF0ZXNNYXBTdG10ID0gdGhpcy5fc3RhdGVzTWFwVmFyLnNldChsaXRlcmFsTWFwKGxvb2t1cE1hcCkpLnRvRGVjbFN0bXQoKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZW1lbnRzID0gW2NvbXBpbGVkU3RhdGVzTWFwU3RtdCwgZm5TdGF0ZW1lbnRdO1xuICAgICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uRW50cnlDb21waWxlUmVzdWx0KHRoaXMuYW5pbWF0aW9uTmFtZSwgc3RhdGVtZW50cywgZm5WYXJpYWJsZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIF9BbmltYXRpb25CdWlsZGVyO1xuICB9KCkpO1xuICB2YXIgX0FuaW1hdGlvbkJ1aWxkZXJDb250ZXh0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIF9BbmltYXRpb25CdWlsZGVyQ29udGV4dCgpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlTWFwID0gbmV3IF9BbmltYXRpb25CdWlsZGVyU3RhdGVNYXAoKTtcbiAgICAgICAgICB0aGlzLmVuZFN0YXRlQW5pbWF0ZVN0ZXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMuaXNFeHBlY3RpbmdGaXJzdFN0eWxlU3RlcCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNFeHBlY3RpbmdGaXJzdEFuaW1hdGVTdGVwID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy50b3RhbFRyYW5zaXRpb25UaW1lID0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfQW5pbWF0aW9uQnVpbGRlckNvbnRleHQ7XG4gIH0oKSk7XG4gIHZhciBfQW5pbWF0aW9uQnVpbGRlclN0YXRlTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIF9BbmltYXRpb25CdWlsZGVyU3RhdGVNYXAoKSB7XG4gICAgICAgICAgdGhpcy5fc3RhdGVzID0ge307XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX0FuaW1hdGlvbkJ1aWxkZXJTdGF0ZU1hcC5wcm90b3R5cGUsIFwic3RhdGVzXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVzOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0FuaW1hdGlvbkJ1aWxkZXJTdGF0ZU1hcC5wcm90b3R5cGUucmVnaXN0ZXJTdGF0ZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7IHZhbHVlID0gbnVsbDsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4aXN0aW5nRW50cnkgPSB0aGlzLl9zdGF0ZXNbbmFtZV07XG4gICAgICAgICAgaWYgKCFleGlzdGluZ0VudHJ5KSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0YXRlc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gX0FuaW1hdGlvbkJ1aWxkZXJTdGF0ZU1hcDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICogQHBhcmFtIHs/fSBhbmltYXRpb25TdGF0ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2NvbXBhcmVUb0FuaW1hdGlvblN0YXRlRXhwcih2YWx1ZSwgYW5pbWF0aW9uU3RhdGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVtcHR5U3RhdGVMaXRlcmFsID0gbGl0ZXJhbChFTVBUWV9TVEFURSk7XG4gICAgICBzd2l0Y2ggKGFuaW1hdGlvblN0YXRlKSB7XG4gICAgICAgICAgY2FzZSBFTVBUWV9TVEFURTpcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhlbXB0eVN0YXRlTGl0ZXJhbCk7XG4gICAgICAgICAgY2FzZSBBTllfU1RBVEU6XG4gICAgICAgICAgICAgIHJldHVybiBsaXRlcmFsKHRydWUpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5lcXVhbHMobGl0ZXJhbChhbmltYXRpb25TdGF0ZSkpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0ZXBcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9pc0VuZFN0YXRlQW5pbWF0ZVN0ZXAoc3RlcCkge1xuICAgICAgLy8gdGhlIGZpbmFsIGFuaW1hdGlvbiBzdGVwIGlzIGNoYXJhY3Rlcml6ZWQgYnkgaGF2aW5nIG9ubHkgVFdPXG4gICAgICAvLyBrZXlmcmFtZSB2YWx1ZXMgYW5kIGl0IG11c3QgaGF2ZSB6ZXJvIHN0eWxlcyBmb3IgYm90aCBrZXlmcmFtZXNcbiAgICAgIGlmIChzdGVwIGluc3RhbmNlb2YgQW5pbWF0aW9uU3RlcEFzdCAmJiBzdGVwLmR1cmF0aW9uID4gMCAmJiBzdGVwLmtleWZyYW1lcy5sZW5ndGggPT0gMikge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlczEgPSBfZ2V0U3R5bGVzQXJyYXkoc3RlcC5rZXlmcmFtZXNbMF0pWzBdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlczIgPSBfZ2V0U3R5bGVzQXJyYXkoc3RlcC5rZXlmcmFtZXNbMV0pWzBdO1xuICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzdHlsZXMxKS5sZW5ndGggPT09IDAgJiYgT2JqZWN0LmtleXMoc3R5bGVzMikubGVuZ3RoID09PSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG9ialxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2dldFN0eWxlc0FycmF5KG9iaikge1xuICAgICAgcmV0dXJuIG9iai5zdHlsZXMuc3R5bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlIHVuZGVmaW5lZFxuICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgKiAqXG4gICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIEdlbmVyYXRlZEZpbGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNyY0ZpbGVVcmxcbiAgICAgICAqIEBwYXJhbSB7P30gZ2VuRmlsZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gR2VuZXJhdGVkRmlsZShzcmNGaWxlVXJsLCBnZW5GaWxlVXJsLCBzb3VyY2UpIHtcbiAgICAgICAgICB0aGlzLnNyY0ZpbGVVcmwgPSBzcmNGaWxlVXJsO1xuICAgICAgICAgIHRoaXMuZ2VuRmlsZVVybCA9IGdlbkZpbGVVcmw7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gR2VuZXJhdGVkRmlsZTtcbiAgfSgpKTtcblxuICB2YXIgX19leHRlbmRzJDIzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTVFJJUF9TUkNfRklMRV9TVUZGSVhFUyA9IC8oXFwudHN8XFwuZFxcLnRzfFxcLmpzfFxcLmpzeHxcXC50c3gpJC87XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGhvc3RcbiAgICogQHBhcmFtIHs/fSBzdW1tYXJ5UmVzb2x2ZXJcbiAgICogQHBhcmFtIHs/fSBzeW1ib2xSZXNvbHZlclxuICAgKiBAcGFyYW0gez99IHN5bWJvbHNcbiAgICogQHBhcmFtIHs/fSB0eXBlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2VyaWFsaXplU3VtbWFyaWVzKGhvc3QsIHN1bW1hcnlSZXNvbHZlciwgc3ltYm9sUmVzb2x2ZXIsIHN5bWJvbHMsIHR5cGVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoaG9zdCk7XG4gICAgICAvLyBmb3Igc3ltYm9scywgd2UgdXNlIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciB0aGUgY2xhc3MgbWV0YWRhdGEgaXRzZWxmXG4gICAgICAvLyAod2Uga2VlcCB0aGUgc3RhdGljcyB0aG91Z2gpLCBhcyB0aGUgY2xhc3MgbWV0YWRhdGEgaXMgY29udGFpbmVkIGluIHRoZVxuICAgICAgLy8gQ29tcGlsZVR5cGVTdW1tYXJ5LlxuICAgICAgc3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFN5bWJvbCkgeyByZXR1cm4gc2VyaWFsaXplci5hZGRPck1lcmdlU3VtbWFyeSh7IHN5bWJvbDogcmVzb2x2ZWRTeW1ib2wuc3ltYm9sLCBtZXRhZGF0YTogcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEgfSk7IH0pO1xuICAgICAgLy8gQWRkIHN1bW1hcmllcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBzeW1ib2xzICh0cmFuc2l0aXZlbHkpXG4gICAgICAvLyBOb3RlOiB0aGUgc2VyaWFsaXplci5zeW1ib2xzIGFycmF5IG1pZ2h0IGJlIGdyb3dpbmcgd2hpbGVcbiAgICAgIC8vIHdlIGV4ZWN1dGUgdGhlIGxvb3AhXG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIHByb2Nlc3NlZEluZGV4ID0gMDsgcHJvY2Vzc2VkSW5kZXggPCBzZXJpYWxpemVyLnN5bWJvbHMubGVuZ3RoOyBwcm9jZXNzZWRJbmRleCsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltYm9sID0gc2VyaWFsaXplci5zeW1ib2xzW3Byb2Nlc3NlZEluZGV4XTtcbiAgICAgICAgICBpZiAoIWhvc3QuaXNTb3VyY2VGaWxlKHN5bWJvbC5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VtbWFyeSA9IHN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeShzeW1ib2wpO1xuICAgICAgICAgICAgICBpZiAoIXN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHNvbWUgc3ltYm9scyBtaWdodCBvcmlnaW5hdGUgZnJvbSBhIHBsYWluIHR5cGVzY3JpcHQgbGlicmFyeVxuICAgICAgICAgICAgICAgICAgLy8gdGhhdCBqdXN0IGV4cG9ydGVkIC5kLnRzIGFuZCAubWV0YWRhdGEuanNvbiBmaWxlcywgaS5lLiB3aGVyZSBubyBzdW1tYXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaWxlcyB3ZXJlIGNyZWF0ZWQuXG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZFN5bWJvbCA9IHN5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2woc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkgPSB7IHN5bWJvbDogcmVzb2x2ZWRTeW1ib2wuc3ltYm9sLCBtZXRhZGF0YTogcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hZGRPck1lcmdlU3VtbWFyeShzdW1tYXJ5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0eXBlIHN1bW1hcmllcy5cbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IGFkZCB0aGUgc3VtbWFyaWVzIG9mIGFsbCByZWZlcmVuY2VkIHN5bWJvbHMgYXMgZm9yIHRoZSBSZXNvbHZlZFN5bWJvbHMsXG4gICAgICAvLyBhcyB0aGUgdHlwZSBzdW1tYXJpZXMgYWxyZWFkeSBjb250YWluIHRoZSB0cmFuc2l0aXZlIGRhdGEgdGhhdCB0aGV5IHJlcXVpcmVcbiAgICAgIC8vIChpbiBhIG1pbmltYWwgd2F5KS5cbiAgICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGVTdW1tYXJ5KSB7XG4gICAgICAgICAgc2VyaWFsaXplci5hZGRPck1lcmdlU3VtbWFyeSh7IHN5bWJvbDogdHlwZVN1bW1hcnkudHlwZS5yZWZlcmVuY2UsIG1ldGFkYXRhOiB7IF9fc3ltYm9saWM6ICdjbGFzcycgfSwgdHlwZTogdHlwZVN1bW1hcnkgfSk7XG4gICAgICAgICAgaWYgKHR5cGVTdW1tYXJ5LnN1bW1hcnlLaW5kID09PSBDb21waWxlU3VtbWFyeUtpbmQuTmdNb2R1bGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGVTdW1tYXJ5ID0gKHR5cGVTdW1tYXJ5KTtcbiAgICAgICAgICAgICAgbmdNb2R1bGVTdW1tYXJ5LmV4cG9ydGVkRGlyZWN0aXZlcy5jb25jYXQobmdNb2R1bGVTdW1tYXJ5LmV4cG9ydGVkUGlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzeW1ib2wgPSBpZC5yZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICBpZiAoIWhvc3QuaXNTb3VyY2VGaWxlKHN5bWJvbC5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmFkZE9yTWVyZ2VTdW1tYXJ5KHN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeShzeW1ib2wpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzeW1ib2xDYWNoZVxuICAgKiBAcGFyYW0gez99IGpzb25cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGRlc2VyaWFsaXplU3VtbWFyaWVzKHN5bWJvbENhY2hlLCBqc29uKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXNlcmlhbGl6ZXIgPSBuZXcgRGVzZXJpYWxpemVyKHN5bWJvbENhY2hlKTtcbiAgICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoanNvbik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZmlsZU5hbWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN1bW1hcnlGaWxlTmFtZShmaWxlTmFtZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZU5hbWVXaXRob3V0U3VmZml4ID0gZmlsZU5hbWUucmVwbGFjZShTVFJJUF9TUkNfRklMRV9TVUZGSVhFUywgJycpO1xuICAgICAgcmV0dXJuIGZpbGVOYW1lV2l0aG91dFN1ZmZpeCArIFwiLm5nc3VtbWFyeS5qc29uXCI7XG4gIH1cbiAgdmFyIFNlcmlhbGl6ZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDIzKFNlcmlhbGl6ZXIsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTZXJpYWxpemVyKGhvc3QpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICAgIHRoaXMuc3ltYm9scyA9IFtdO1xuICAgICAgICAgIHRoaXMuaW5kZXhCeVN5bWJvbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1bW1hcnlCeVN5bWJvbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1bW1hcmllcyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN1bW1hcnlcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLmFkZE9yTWVyZ2VTdW1tYXJ5ID0gZnVuY3Rpb24gKHN1bW1hcnkpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzeW1ib2xNZXRhID0gc3VtbWFyeS5tZXRhZGF0YTtcbiAgICAgICAgICBpZiAoc3ltYm9sTWV0YSAmJiBzeW1ib2xNZXRhLl9fc3ltYm9saWMgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgLy8gRm9yIGNsYXNzZXMsIHdlIG9ubHkga2VlcCB0aGVpciBzdGF0aWNzLCBidXQgbm90IHRoZSBtZXRhZGF0YVxuICAgICAgICAgICAgICAvLyBvZiB0aGUgY2xhc3MgaXRzZWxmIGFzIHRoYXQgaGFzIGJlZW4gY2FwdHVyZWQgYWxyZWFkeSB2aWEgb3RoZXIgc3VtbWFyaWVzXG4gICAgICAgICAgICAgIC8vIChlLmcuIERpcmVjdGl2ZVN1bW1hcnksIC4uLikuXG4gICAgICAgICAgICAgIHN5bWJvbE1ldGEgPSB7IF9fc3ltYm9saWM6ICdjbGFzcycsIHN0YXRpY3M6IHN5bWJvbE1ldGEuc3RhdGljcyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9jZXNzZWRTdW1tYXJ5ID0gdGhpcy5wcm9jZXNzZWRTdW1tYXJ5QnlTeW1ib2wuZ2V0KHN1bW1hcnkuc3ltYm9sKTtcbiAgICAgICAgICBpZiAoIXByb2Nlc3NlZFN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkU3VtbWFyeSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHsgc3ltYm9sOiBzdW1tYXJ5LnN5bWJvbCB9KTtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdW1tYXJpZXMucHVzaChwcm9jZXNzZWRTdW1tYXJ5KTtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRTdW1tYXJ5QnlTeW1ib2wuc2V0KHN1bW1hcnkuc3ltYm9sLCBwcm9jZXNzZWRTdW1tYXJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90ZTogPT0gYnkgcHVycG9zZSB0byBjb21wYXJlIHdpdGggdW5kZWZpbmVkIVxuICAgICAgICAgIGlmIChwcm9jZXNzZWRTdW1tYXJ5Lm1ldGFkYXRhID09IG51bGwgJiYgc3ltYm9sTWV0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3NlZFN1bW1hcnkubWV0YWRhdGEgPSB0aGlzLnByb2Nlc3NWYWx1ZShzeW1ib2xNZXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90ZTogPT0gYnkgcHVycG9zZSB0byBjb21wYXJlIHdpdGggdW5kZWZpbmVkIVxuICAgICAgICAgIGlmIChwcm9jZXNzZWRTdW1tYXJ5LnR5cGUgPT0gbnVsbCAmJiBzdW1tYXJ5LnR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcm9jZXNzZWRTdW1tYXJ5LnR5cGUgPSB0aGlzLnByb2Nlc3NWYWx1ZShzdW1tYXJ5LnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHN1bW1hcmllczogdGhpcy5wcm9jZXNzZWRTdW1tYXJpZXMsXG4gICAgICAgICAgICAgIHN5bWJvbHM6IHRoaXMuc3ltYm9scy5tYXAoZnVuY3Rpb24gKHN5bWJvbCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgX19zeW1ib2w6IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN5bWJvbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvbnZlcnQgdGhlIHNvdXJjZSBmaWxlbmFtZXMgdGludG8gb3V0cHV0IGZpbGVuYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgZ2VuZXJhdGVkIHN1bW1hcnkgZmlsZSB3aWxsIGJlIHVzZWQgd2hlbiB0ZWggY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBpbGF0aW9uIHVuaXQgaXMgdXNlZCBhcyBhIGxpYnJhcnlcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogX3RoaXMuaG9zdC5nZXRPdXRwdXRGaWxlTmFtZShzeW1ib2wuZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUucHJvY2Vzc1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2aXNpdFZhbHVlKHZhbHVlLCB0aGlzLCBudWxsKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gdGhpcy5pbmRleEJ5U3ltYm9sLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgIC8vIE5vdGU6ID09IGJ5IHB1cnBvc2UgdG8gY29tcGFyZSB3aXRoIHVuZGVmaW5lZCFcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleEJ5U3ltYm9sLnNpemU7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QnlTeW1ib2wuc2V0KHZhbHVlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN5bWJvbHMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHsgX19zeW1ib2w6IGluZGV4IH07XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBTZXJpYWxpemVyO1xuICB9KFZhbHVlVHJhbnNmb3JtZXIpKTtcbiAgdmFyIERlc2VyaWFsaXplciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMjMoRGVzZXJpYWxpemVyLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN5bWJvbENhY2hlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIERlc2VyaWFsaXplcihzeW1ib2xDYWNoZSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuc3ltYm9sQ2FjaGUgPSBzeW1ib2xDYWNoZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBqc29uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZXNlcmlhbGl6ZXIucHJvdG90eXBlLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICAgIHRoaXMuc3ltYm9scyA9IGRhdGEuc3ltYm9scy5tYXAoZnVuY3Rpb24gKHNlcmlhbGl6ZWRTeW1ib2wpIHsgcmV0dXJuIF90aGlzLnN5bWJvbENhY2hlLmdldChzZXJpYWxpemVkU3ltYm9sLmZpbGVQYXRoLCBzZXJpYWxpemVkU3ltYm9sLm5hbWUpOyB9KTtcbiAgICAgICAgICByZXR1cm4gdmlzaXRWYWx1ZShkYXRhLnN1bW1hcmllcywgdGhpcywgbnVsbCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1hcFxuICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZXNlcmlhbGl6ZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICAgIGlmICgnX19zeW1ib2wnIGluIG1hcCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xzW21hcFsnX19zeW1ib2wnXV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS52aXNpdFN0cmluZ01hcC5jYWxsKHRoaXMsIG1hcCwgY29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBEZXNlcmlhbGl6ZXI7XG4gIH0oVmFsdWVUcmFuc2Zvcm1lcikpO1xuXG4gIHZhciBBb3RDb21waWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX2hvc3RcbiAgICAgICAqIEBwYXJhbSB7P30gX21ldGFkYXRhUmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3RlbXBsYXRlUGFyc2VyXG4gICAgICAgKiBAcGFyYW0gez99IF9zdHlsZUNvbXBpbGVyXG4gICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29tcGlsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX2RpcldyYXBwZXJDb21waWxlclxuICAgICAgICogQHBhcmFtIHs/fSBfbmdNb2R1bGVDb21waWxlclxuICAgICAgICogQHBhcmFtIHs/fSBfb3V0cHV0RW1pdHRlclxuICAgICAgICogQHBhcmFtIHs/fSBfc3VtbWFyeVJlc29sdmVyXG4gICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGVJZFxuICAgICAgICogQHBhcmFtIHs/fSBfdHJhbnNsYXRpb25Gb3JtYXRcbiAgICAgICAqIEBwYXJhbSB7P30gX2FuaW1hdGlvblBhcnNlclxuICAgICAgICogQHBhcmFtIHs/fSBfc3ltYm9sUmVzb2x2ZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW90Q29tcGlsZXIoX2hvc3QsIF9tZXRhZGF0YVJlc29sdmVyLCBfdGVtcGxhdGVQYXJzZXIsIF9zdHlsZUNvbXBpbGVyLCBfdmlld0NvbXBpbGVyLCBfZGlyV3JhcHBlckNvbXBpbGVyLCBfbmdNb2R1bGVDb21waWxlciwgX291dHB1dEVtaXR0ZXIsIF9zdW1tYXJ5UmVzb2x2ZXIsIF9sb2NhbGVJZCwgX3RyYW5zbGF0aW9uRm9ybWF0LCBfYW5pbWF0aW9uUGFyc2VyLCBfc3ltYm9sUmVzb2x2ZXIpIHtcbiAgICAgICAgICB0aGlzLl9ob3N0ID0gX2hvc3Q7XG4gICAgICAgICAgdGhpcy5fbWV0YWRhdGFSZXNvbHZlciA9IF9tZXRhZGF0YVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX3RlbXBsYXRlUGFyc2VyID0gX3RlbXBsYXRlUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX3N0eWxlQ29tcGlsZXIgPSBfc3R5bGVDb21waWxlcjtcbiAgICAgICAgICB0aGlzLl92aWV3Q29tcGlsZXIgPSBfdmlld0NvbXBpbGVyO1xuICAgICAgICAgIHRoaXMuX2RpcldyYXBwZXJDb21waWxlciA9IF9kaXJXcmFwcGVyQ29tcGlsZXI7XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGVDb21waWxlciA9IF9uZ01vZHVsZUNvbXBpbGVyO1xuICAgICAgICAgIHRoaXMuX291dHB1dEVtaXR0ZXIgPSBfb3V0cHV0RW1pdHRlcjtcbiAgICAgICAgICB0aGlzLl9zdW1tYXJ5UmVzb2x2ZXIgPSBfc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX2xvY2FsZUlkID0gX2xvY2FsZUlkO1xuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0aW9uRm9ybWF0ID0gX3RyYW5zbGF0aW9uRm9ybWF0O1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblBhcnNlciA9IF9hbmltYXRpb25QYXJzZXI7XG4gICAgICAgICAgdGhpcy5fc3ltYm9sUmVzb2x2ZXIgPSBfc3ltYm9sUmVzb2x2ZXI7XG4gICAgICAgICAgdGhpcy5fYW5pbWF0aW9uQ29tcGlsZXIgPSBuZXcgQW5pbWF0aW9uQ29tcGlsZXIoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuY2xlYXJDYWNoZSgpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvb3RGaWxlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVBbGwgPSBmdW5jdGlvbiAocm9vdEZpbGVzKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9ncmFtU3ltYm9scyA9IGV4dHJhY3RQcm9ncmFtU3ltYm9scyh0aGlzLl9zeW1ib2xSZXNvbHZlciwgcm9vdEZpbGVzLCB0aGlzLl9ob3N0KTtcbiAgICAgICAgICB2YXIgX2EgPSBhbmFseXplQW5kVmFsaWRhdGVOZ01vZHVsZXMocHJvZ3JhbVN5bWJvbHMsIHRoaXMuX2hvc3QsIHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIpLCBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlID0gX2EubmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZSwgZmlsZXMgPSBfYS5maWxlcywgbmdNb2R1bGVzID0gX2EubmdNb2R1bGVzO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlXG4gICAgICAgICAgICAgIC5hbGwobmdNb2R1bGVzLm1hcChmdW5jdGlvbiAobmdNb2R1bGUpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmxvYWROZ01vZHVsZURpcmVjdGl2ZUFuZFBpcGVNZXRhZGF0YShuZ01vZHVsZS50eXBlLnJlZmVyZW5jZSwgZmFsc2UpOyB9KSlcbiAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VNb2R1bGVzID0gZmlsZXMubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiBfdGhpcy5fY29tcGlsZVNyY0ZpbGUoZmlsZS5zcmNVcmwsIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUsIGZpbGUuZGlyZWN0aXZlcywgZmlsZS5waXBlcywgZmlsZS5uZ01vZHVsZXMsIGZpbGUuaW5qZWN0YWJsZXMpOyB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIExpc3RXcmFwcGVyLmZsYXR0ZW4oc291cmNlTW9kdWxlcyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNyY0ZpbGVVcmxcbiAgICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZVxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzXG4gICAgICAgKiBAcGFyYW0gez99IHBpcGVzXG4gICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlc1xuICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RhYmxlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlU3JjRmlsZSA9IGZ1bmN0aW9uIChzcmNGaWxlVXJsLCBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLCBkaXJlY3RpdmVzLCBwaXBlcywgbmdNb2R1bGVzLCBpbmplY3RhYmxlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZVN1ZmZpeCA9IF9zcGxpdFR5cGVzY3JpcHRTdWZmaXgoc3JjRmlsZVVybClbMV07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGVtZW50cyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cG9ydGVkVmFycyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGdlbmVyYXRlZEZpbGVzID0gW107XG4gICAgICAgICAgZ2VuZXJhdGVkRmlsZXMucHVzaCh0aGlzLl9jcmVhdGVTdW1tYXJ5KHNyY0ZpbGVVcmwsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZXMsIGluamVjdGFibGVzKSk7XG4gICAgICAgICAgLy8gY29tcGlsZSBhbGwgbmcgbW9kdWxlc1xuICAgICAgICAgIGV4cG9ydGVkVmFycy5wdXNoLmFwcGx5KGV4cG9ydGVkVmFycywgbmdNb2R1bGVzLm1hcChmdW5jdGlvbiAobmdNb2R1bGVUeXBlKSB7IHJldHVybiBfdGhpcy5fY29tcGlsZU1vZHVsZShuZ01vZHVsZVR5cGUsIHN0YXRlbWVudHMpOyB9KSk7XG4gICAgICAgICAgLy8gY29tcGlsZSBkaXJlY3RpdmUgd3JhcHBlcnNcbiAgICAgICAgICBleHBvcnRlZFZhcnMucHVzaC5hcHBseShleHBvcnRlZFZhcnMsIGRpcmVjdGl2ZXMubWFwKGZ1bmN0aW9uIChkaXJlY3RpdmVUeXBlKSB7IHJldHVybiBfdGhpcy5fY29tcGlsZURpcmVjdGl2ZVdyYXBwZXIoZGlyZWN0aXZlVHlwZSwgc3RhdGVtZW50cyk7IH0pKTtcbiAgICAgICAgICAvLyBjb21waWxlIGNvbXBvbmVudHNcbiAgICAgICAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpclR5cGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcE1ldGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVNZXRhZGF0YSgvKiogQHR5cGUgez99ICovIChkaXJUeXBlKSk7XG4gICAgICAgICAgICAgIGlmICghY29tcE1ldGEuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGUgPSBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLmdldChkaXJUeXBlKTtcbiAgICAgICAgICAgICAgaWYgKCFuZ01vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgRXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgdGhlIG1vZHVsZSBmb3IgY29tcG9uZW50IFwiICsgaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkgKyBcIiFcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgX2Fzc2VydENvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICAgICAgICAgIC8vIGNvbXBpbGUgc3R5bGVzXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlc0NvbXBpbGVSZXN1bHRzID0gX3RoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICAgICAgICAgIHN0eWxlc0NvbXBpbGVSZXN1bHRzLmV4dGVybmFsU3R5bGVzaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoY29tcGlsZWRTdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKF90aGlzLl9jb2RnZW5TdHlsZXMoc3JjRmlsZVVybCwgY29tcGlsZWRTdHlsZVNoZWV0LCBmaWxlU3VmZml4KSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBjb21waWxlIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAgZXhwb3J0ZWRWYXJzLnB1c2goX3RoaXMuX2NvbXBpbGVDb21wb25lbnRGYWN0b3J5KGNvbXBNZXRhLCBuZ01vZHVsZSwgZmlsZVN1ZmZpeCwgc3RhdGVtZW50cyksIF90aGlzLl9jb21waWxlQ29tcG9uZW50KGNvbXBNZXRhLCBuZ01vZHVsZSwgbmdNb2R1bGUudHJhbnNpdGl2ZU1vZHVsZS5kaXJlY3RpdmVzLCBzdHlsZXNDb21waWxlUmVzdWx0cy5jb21wb25lbnRTdHlsZXNoZWV0LCBmaWxlU3VmZml4LCBzdGF0ZW1lbnRzKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzcmNNb2R1bGUgPSB0aGlzLl9jb2RlZ2VuU291cmNlTW9kdWxlKHNyY0ZpbGVVcmwsIF9uZ2ZhY3RvcnlNb2R1bGVVcmwoc3JjRmlsZVVybCksIHN0YXRlbWVudHMsIGV4cG9ydGVkVmFycyk7XG4gICAgICAgICAgICAgIGdlbmVyYXRlZEZpbGVzLnVuc2hpZnQoc3JjTW9kdWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZEZpbGVzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzcmNGaWxlVXJsXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gcGlwZXNcbiAgICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGluamVjdGFibGVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZVN1bW1hcnkgPSBmdW5jdGlvbiAoc3JjRmlsZVVybCwgZGlyZWN0aXZlcywgcGlwZXMsIG5nTW9kdWxlcywgaW5qZWN0YWJsZXMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN5bWJvbFN1bW1hcmllcyA9IHRoaXMuX3N5bWJvbFJlc29sdmVyLmdldFN5bWJvbHNPZihzcmNGaWxlVXJsKVxuICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChzeW1ib2wpIHsgcmV0dXJuIF90aGlzLl9zeW1ib2xSZXNvbHZlci5yZXNvbHZlU3ltYm9sKHN5bWJvbCk7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR5cGVTdW1tYXJpZXMgPSBuZ01vZHVsZXMubWFwKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlU3VtbWFyeShyZWYpOyB9KS5jb25jYXQoZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlU3VtbWFyeShyZWYpOyB9KSwgcGlwZXMubWFwKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldFBpcGVTdW1tYXJ5KHJlZik7IH0pLCBpbmplY3RhYmxlcy5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0SW5qZWN0YWJsZVN1bW1hcnkocmVmKTsgfSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGpzb24gPSBzZXJpYWxpemVTdW1tYXJpZXModGhpcy5faG9zdCwgdGhpcy5fc3VtbWFyeVJlc29sdmVyLCB0aGlzLl9zeW1ib2xSZXNvbHZlciwgc3ltYm9sU3VtbWFyaWVzLCB0eXBlU3VtbWFyaWVzKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEZpbGUoc3JjRmlsZVVybCwgc3VtbWFyeUZpbGVOYW1lKHNyY0ZpbGVVcmwpLCBqc29uKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFN0YXRlbWVudHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZU1vZHVsZSA9IGZ1bmN0aW9uIChuZ01vZHVsZVR5cGUsIHRhcmdldFN0YXRlbWVudHMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlID0gdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXROZ01vZHVsZU1ldGFkYXRhKG5nTW9kdWxlVHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdmlkZXJzID0gW107XG4gICAgICAgICAgaWYgKHRoaXMuX2xvY2FsZUlkKSB7XG4gICAgICAgICAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBjcmVhdGVJZGVudGlmaWVyVG9rZW4oSWRlbnRpZmllcnMuTE9DQUxFX0lEKSxcbiAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLl9sb2NhbGVJZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl90cmFuc2xhdGlvbkZvcm1hdCkge1xuICAgICAgICAgICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogY3JlYXRlSWRlbnRpZmllclRva2VuKElkZW50aWZpZXJzLlRSQU5TTEFUSU9OU19GT1JNQVQpLFxuICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuX3RyYW5zbGF0aW9uRm9ybWF0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcHBDb21waWxlUmVzdWx0ID0gdGhpcy5fbmdNb2R1bGVDb21waWxlci5jb21waWxlKG5nTW9kdWxlLCBwcm92aWRlcnMpO1xuICAgICAgICAgIGFwcENvbXBpbGVSZXN1bHQuZGVwZW5kZW5jaWVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgICAgICAgICBkZXAucGxhY2Vob2xkZXIucmVmZXJlbmNlID0gX3RoaXMuX3N5bWJvbFJlc29sdmVyLmdldFN0YXRpY1N5bWJvbChfbmdmYWN0b3J5TW9kdWxlVXJsKGlkZW50aWZpZXJNb2R1bGVVcmwoZGVwLmNvbXApKSwgX2NvbXBvbmVudEZhY3RvcnlOYW1lKGRlcC5jb21wKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0U3RhdGVtZW50cy5wdXNoLmFwcGx5KHRhcmdldFN0YXRlbWVudHMsIGFwcENvbXBpbGVSZXN1bHQuc3RhdGVtZW50cyk7XG4gICAgICAgICAgcmV0dXJuIGFwcENvbXBpbGVSZXN1bHQubmdNb2R1bGVGYWN0b3J5VmFyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFN0YXRlbWVudHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZURpcmVjdGl2ZVdyYXBwZXIgPSBmdW5jdGlvbiAoZGlyZWN0aXZlVHlwZSwgdGFyZ2V0U3RhdGVtZW50cykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpck1ldGEgPSB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldERpcmVjdGl2ZU1ldGFkYXRhKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpckNvbXBpbGVSZXN1bHQgPSB0aGlzLl9kaXJXcmFwcGVyQ29tcGlsZXIuY29tcGlsZShkaXJNZXRhKTtcbiAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnRzLnB1c2guYXBwbHkodGFyZ2V0U3RhdGVtZW50cywgZGlyQ29tcGlsZVJlc3VsdC5zdGF0ZW1lbnRzKTtcbiAgICAgICAgICByZXR1cm4gZGlyQ29tcGlsZVJlc3VsdC5kaXJXcmFwcGVyQ2xhc3NWYXI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBNZXRhXG4gICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlXG4gICAgICAgKiBAcGFyYW0gez99IGZpbGVTdWZmaXhcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0U3RhdGVtZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlQ29tcG9uZW50RmFjdG9yeSA9IGZ1bmN0aW9uIChjb21wTWV0YSwgbmdNb2R1bGUsIGZpbGVTdWZmaXgsIHRhcmdldFN0YXRlbWVudHMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0TWV0YSA9IGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhKHRoaXMuX3N5bWJvbFJlc29sdmVyLmdldFN0YXRpY1N5bWJvbChpZGVudGlmaWVyTW9kdWxlVXJsKGNvbXBNZXRhLnR5cGUpLCBpZGVudGlmaWVyTmFtZShjb21wTWV0YS50eXBlKSArIFwiX0hvc3RcIiksIGNvbXBNZXRhKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBob3N0Vmlld0ZhY3RvcnlWYXIgPSB0aGlzLl9jb21waWxlQ29tcG9uZW50KGhvc3RNZXRhLCBuZ01vZHVsZSwgW2NvbXBNZXRhLnR5cGVdLCBudWxsLCBmaWxlU3VmZml4LCB0YXJnZXRTdGF0ZW1lbnRzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wRmFjdG9yeVZhciA9IF9jb21wb25lbnRGYWN0b3J5TmFtZShjb21wTWV0YS50eXBlKTtcbiAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnRzLnB1c2godmFyaWFibGUoY29tcEZhY3RvcnlWYXIpXG4gICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihjcmVhdGVJZGVudGlmaWVyKElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnkpLCBbaW1wb3J0VHlwZShjb21wTWV0YS50eXBlKV0pXG4gICAgICAgICAgICAgIC5pbnN0YW50aWF0ZShbXG4gICAgICAgICAgICAgIGxpdGVyYWwoY29tcE1ldGEuc2VsZWN0b3IpLFxuICAgICAgICAgICAgICB2YXJpYWJsZShob3N0Vmlld0ZhY3RvcnlWYXIpLFxuICAgICAgICAgICAgICBpbXBvcnRFeHByKGNvbXBNZXRhLnR5cGUpLFxuICAgICAgICAgIF0sIGltcG9ydFR5cGUoY3JlYXRlSWRlbnRpZmllcihJZGVudGlmaWVycy5Db21wb25lbnRGYWN0b3J5KSwgW2ltcG9ydFR5cGUoY29tcE1ldGEudHlwZSldLCBbVHlwZU1vZGlmaWVyLkNvbnN0XSkpKVxuICAgICAgICAgICAgICAudG9EZWNsU3RtdChudWxsLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSkpO1xuICAgICAgICAgIHJldHVybiBjb21wRmFjdG9yeVZhcjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcE1ldGFcbiAgICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVcbiAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSWRlbnRpZmllcnNcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50U3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGZpbGVTdWZmaXhcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0U3RhdGVtZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBNZXRhLCBuZ01vZHVsZSwgZGlyZWN0aXZlSWRlbnRpZmllcnMsIGNvbXBvbmVudFN0eWxlcywgZmlsZVN1ZmZpeCwgdGFyZ2V0U3RhdGVtZW50cykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyc2VkQW5pbWF0aW9ucyA9IHRoaXMuX2FuaW1hdGlvblBhcnNlci5wYXJzZUNvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZUlkZW50aWZpZXJzLm1hcChmdW5jdGlvbiAoZGlyKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVTdW1tYXJ5KGRpci5yZWZlcmVuY2UpOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaXBlcyA9IG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUucGlwZXMubWFwKGZ1bmN0aW9uIChwaXBlKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRQaXBlU3VtbWFyeShwaXBlLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlZFRlbXBsYXRlID0gdGhpcy5fdGVtcGxhdGVQYXJzZXIucGFyc2UoY29tcE1ldGEsIGNvbXBNZXRhLnRlbXBsYXRlLnRlbXBsYXRlLCBkaXJlY3RpdmVzLCBwaXBlcywgbmdNb2R1bGUuc2NoZW1hcywgaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlc0V4cHIgPSBjb21wb25lbnRTdHlsZXMgPyB2YXJpYWJsZShjb21wb25lbnRTdHlsZXMuc3R5bGVzVmFyKSA6IGxpdGVyYWxBcnIoW10pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVkQW5pbWF0aW9ucyA9IHRoaXMuX2FuaW1hdGlvbkNvbXBpbGVyLmNvbXBpbGUoaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSksIHBhcnNlZEFuaW1hdGlvbnMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdSZXN1bHQgPSB0aGlzLl92aWV3Q29tcGlsZXIuY29tcGlsZUNvbXBvbmVudChjb21wTWV0YSwgcGFyc2VkVGVtcGxhdGUsIHN0eWxlc0V4cHIsIHBpcGVzLCBjb21waWxlZEFuaW1hdGlvbnMpO1xuICAgICAgICAgIGlmIChjb21wb25lbnRTdHlsZXMpIHtcbiAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVtZW50cy5wdXNoLmFwcGx5KHRhcmdldFN0YXRlbWVudHMsIF9yZXNvbHZlU3R5bGVTdGF0ZW1lbnRzKHRoaXMuX3N5bWJvbFJlc29sdmVyLCBjb21wb25lbnRTdHlsZXMsIGZpbGVTdWZmaXgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGlsZWRBbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiB0YXJnZXRTdGF0ZW1lbnRzLnB1c2guYXBwbHkodGFyZ2V0U3RhdGVtZW50cywgZW50cnkuc3RhdGVtZW50cyk7IH0pO1xuICAgICAgICAgIHRhcmdldFN0YXRlbWVudHMucHVzaC5hcHBseSh0YXJnZXRTdGF0ZW1lbnRzLCBfcmVzb2x2ZVZpZXdTdGF0ZW1lbnRzKHRoaXMuX3N5bWJvbFJlc29sdmVyLCB2aWV3UmVzdWx0KSk7XG4gICAgICAgICAgcmV0dXJuIHZpZXdSZXN1bHQudmlld0NsYXNzVmFyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmaWxlVXJsXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc0NvbXBpbGVSZXN1bHRcbiAgICAgICAqIEBwYXJhbSB7P30gZmlsZVN1ZmZpeFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb2RnZW5TdHlsZXMgPSBmdW5jdGlvbiAoZmlsZVVybCwgc3R5bGVzQ29tcGlsZVJlc3VsdCwgZmlsZVN1ZmZpeCkge1xuICAgICAgICAgIF9yZXNvbHZlU3R5bGVTdGF0ZW1lbnRzKHRoaXMuX3N5bWJvbFJlc29sdmVyLCBzdHlsZXNDb21waWxlUmVzdWx0LCBmaWxlU3VmZml4KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29kZWdlblNvdXJjZU1vZHVsZShmaWxlVXJsLCBfc3R5bGVzTW9kdWxlVXJsKHN0eWxlc0NvbXBpbGVSZXN1bHQubWV0YS5tb2R1bGVVcmwsIHN0eWxlc0NvbXBpbGVSZXN1bHQuaXNTaGltbWVkLCBmaWxlU3VmZml4KSwgc3R5bGVzQ29tcGlsZVJlc3VsdC5zdGF0ZW1lbnRzLCBbc3R5bGVzQ29tcGlsZVJlc3VsdC5zdHlsZXNWYXJdKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3JjRmlsZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBnZW5GaWxlVXJsXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwb3J0ZWRWYXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NvZGVnZW5Tb3VyY2VNb2R1bGUgPSBmdW5jdGlvbiAoc3JjRmlsZVVybCwgZ2VuRmlsZVVybCwgc3RhdGVtZW50cywgZXhwb3J0ZWRWYXJzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRGaWxlKHNyY0ZpbGVVcmwsIGdlbkZpbGVVcmwsIHRoaXMuX291dHB1dEVtaXR0ZXIuZW1pdFN0YXRlbWVudHMoZ2VuRmlsZVVybCwgc3RhdGVtZW50cywgZXhwb3J0ZWRWYXJzKSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFvdENvbXBpbGVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSByZWZsZWN0b3JcbiAgICogQHBhcmFtIHs/fSBjb21waWxlUmVzdWx0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcmVzb2x2ZVZpZXdTdGF0ZW1lbnRzKHJlZmxlY3RvciwgY29tcGlsZVJlc3VsdCkge1xuICAgICAgY29tcGlsZVJlc3VsdC5kZXBlbmRlbmNpZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICAgICAgaWYgKGRlcCBpbnN0YW5jZW9mIFZpZXdDbGFzc0RlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmZkID0gKGRlcCk7XG4gICAgICAgICAgICAgIHZmZC5wbGFjZWhvbGRlci5yZWZlcmVuY2UgPVxuICAgICAgICAgICAgICAgICAgcmVmbGVjdG9yLmdldFN0YXRpY1N5bWJvbChfbmdmYWN0b3J5TW9kdWxlVXJsKGlkZW50aWZpZXJNb2R1bGVVcmwodmZkLmNvbXApKSwgZGVwLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChkZXAgaW5zdGFuY2VvZiBDb21wb25lbnRGYWN0b3J5RGVwZW5kZW5jeSQxKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNmZCA9IChkZXApO1xuICAgICAgICAgICAgICBjZmQucGxhY2Vob2xkZXIucmVmZXJlbmNlID0gcmVmbGVjdG9yLmdldFN0YXRpY1N5bWJvbChfbmdmYWN0b3J5TW9kdWxlVXJsKGlkZW50aWZpZXJNb2R1bGVVcmwoY2ZkLmNvbXApKSwgX2NvbXBvbmVudEZhY3RvcnlOYW1lKGNmZC5jb21wKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGRlcCBpbnN0YW5jZW9mIERpcmVjdGl2ZVdyYXBwZXJEZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGR3ZCA9IChkZXApO1xuICAgICAgICAgICAgICBkd2QucGxhY2Vob2xkZXIucmVmZXJlbmNlID1cbiAgICAgICAgICAgICAgICAgIHJlZmxlY3Rvci5nZXRTdGF0aWNTeW1ib2woX25nZmFjdG9yeU1vZHVsZVVybChpZGVudGlmaWVyTW9kdWxlVXJsKGR3ZC5kaXIpKSwgZHdkLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuc3RhdGVtZW50cztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByZWZsZWN0b3JcbiAgICogQHBhcmFtIHs/fSBjb21waWxlUmVzdWx0XG4gICAqIEBwYXJhbSB7P30gZmlsZVN1ZmZpeFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3Jlc29sdmVTdHlsZVN0YXRlbWVudHMocmVmbGVjdG9yLCBjb21waWxlUmVzdWx0LCBmaWxlU3VmZml4KSB7XG4gICAgICBjb21waWxlUmVzdWx0LmRlcGVuZGVuY2llcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgICAgICBkZXAudmFsdWVQbGFjZWhvbGRlci5yZWZlcmVuY2UgPSByZWZsZWN0b3IuZ2V0U3RhdGljU3ltYm9sKF9zdHlsZXNNb2R1bGVVcmwoZGVwLm1vZHVsZVVybCwgZGVwLmlzU2hpbW1lZCwgZmlsZVN1ZmZpeCksIGRlcC5uYW1lKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuc3RhdGVtZW50cztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBkaXJVcmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9uZ2ZhY3RvcnlNb2R1bGVVcmwoZGlyVXJsKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cmxXaXRoU3VmZml4ID0gX3NwbGl0VHlwZXNjcmlwdFN1ZmZpeChkaXJVcmwpO1xuICAgICAgcmV0dXJuIHVybFdpdGhTdWZmaXhbMF0gKyBcIi5uZ2ZhY3RvcnlcIiArIHVybFdpdGhTdWZmaXhbMV07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29tcFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2NvbXBvbmVudEZhY3RvcnlOYW1lKGNvbXApIHtcbiAgICAgIHJldHVybiBpZGVudGlmaWVyTmFtZShjb21wKSArIFwiTmdGYWN0b3J5XCI7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3R5bGVzaGVldFVybFxuICAgKiBAcGFyYW0gez99IHNoaW1cbiAgICogQHBhcmFtIHs/fSBzdWZmaXhcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9zdHlsZXNNb2R1bGVVcmwoc3R5bGVzaGVldFVybCwgc2hpbSwgc3VmZml4KSB7XG4gICAgICByZXR1cm4gXCJcIiArIHN0eWxlc2hlZXRVcmwgKyAoc2hpbSA/ICcuc2hpbScgOiAnJykgKyBcIi5uZ3N0eWxlXCIgKyBzdWZmaXg7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbWV0YVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2Fzc2VydENvbXBvbmVudChtZXRhKSB7XG4gICAgICBpZiAoIW1ldGEuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgY29tcGlsZSAnXCIgKyBpZGVudGlmaWVyTmFtZShtZXRhLnR5cGUpICsgXCInIGJlY2F1c2UgaXQgaXMgbm90IGEgY29tcG9uZW50LlwiKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfc3BsaXRUeXBlc2NyaXB0U3VmZml4KHBhdGgpIHtcbiAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuZC50cycpKSB7XG4gICAgICAgICAgcmV0dXJuIFtwYXRoLnNsaWNlKDAsIC01KSwgJy50cyddO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGFzdERvdCA9IHBhdGgubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgIGlmIChsYXN0RG90ICE9PSAtMSkge1xuICAgICAgICAgIHJldHVybiBbcGF0aC5zdWJzdHJpbmcoMCwgbGFzdERvdCksIHBhdGguc3Vic3RyaW5nKGxhc3REb3QpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbcGF0aCwgJyddO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHByb2dyYW1TdGF0aWNTeW1ib2xzXG4gICAqIEBwYXJhbSB7P30gaG9zdFxuICAgKiBAcGFyYW0gez99IG1ldGFkYXRhUmVzb2x2ZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFuYWx5emVOZ01vZHVsZXMocHJvZ3JhbVN0YXRpY1N5bWJvbHMsIGhvc3QsIG1ldGFkYXRhUmVzb2x2ZXIpIHtcbiAgICAgIHZhciBfYSA9IF9jcmVhdGVOZ01vZHVsZXMocHJvZ3JhbVN0YXRpY1N5bWJvbHMsIGhvc3QsIG1ldGFkYXRhUmVzb2x2ZXIpLCBuZ01vZHVsZXMgPSBfYS5uZ01vZHVsZXMsIHN5bWJvbHNNaXNzaW5nTW9kdWxlID0gX2Euc3ltYm9sc01pc3NpbmdNb2R1bGU7XG4gICAgICByZXR1cm4gX2FuYWx5emVOZ01vZHVsZXMocHJvZ3JhbVN0YXRpY1N5bWJvbHMsIG5nTW9kdWxlcywgc3ltYm9sc01pc3NpbmdNb2R1bGUsIG1ldGFkYXRhUmVzb2x2ZXIpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHByb2dyYW1TdGF0aWNTeW1ib2xzXG4gICAqIEBwYXJhbSB7P30gaG9zdFxuICAgKiBAcGFyYW0gez99IG1ldGFkYXRhUmVzb2x2ZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFuYWx5emVBbmRWYWxpZGF0ZU5nTW9kdWxlcyhwcm9ncmFtU3RhdGljU3ltYm9scywgaG9zdCwgbWV0YWRhdGFSZXNvbHZlcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gYW5hbHl6ZU5nTW9kdWxlcyhwcm9ncmFtU3RhdGljU3ltYm9scywgaG9zdCwgbWV0YWRhdGFSZXNvbHZlcik7XG4gICAgICBpZiAocmVzdWx0LnN5bWJvbHNNaXNzaW5nTW9kdWxlICYmIHJlc3VsdC5zeW1ib2xzTWlzc2luZ01vZHVsZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXNzYWdlcyA9IHJlc3VsdC5zeW1ib2xzTWlzc2luZ01vZHVsZS5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIChcIkNhbm5vdCBkZXRlcm1pbmUgdGhlIG1vZHVsZSBmb3IgY2xhc3MgXCIgKyBzLm5hbWUgKyBcIiBpbiBcIiArIHMuZmlsZVBhdGggKyBcIiFcIik7IH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlcy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHByb2dyYW1TeW1ib2xzXG4gICAqIEBwYXJhbSB7P30gbmdNb2R1bGVNZXRhc1xuICAgKiBAcGFyYW0gez99IHN5bWJvbHNNaXNzaW5nTW9kdWxlXG4gICAqIEBwYXJhbSB7P30gbWV0YWRhdGFSZXNvbHZlclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2FuYWx5emVOZ01vZHVsZXMocHJvZ3JhbVN5bWJvbHMsIG5nTW9kdWxlTWV0YXMsIHN5bWJvbHNNaXNzaW5nTW9kdWxlLCBtZXRhZGF0YVJlc29sdmVyKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVNZXRhc0J5UmVmID0gbmV3IE1hcCgpO1xuICAgICAgbmdNb2R1bGVNZXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZSkgeyByZXR1cm4gbW9kdWxlTWV0YXNCeVJlZi5zZXQobmdNb2R1bGUudHlwZS5yZWZlcmVuY2UsIG5nTW9kdWxlKTsgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlID0gbmV3IE1hcCgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGVzQnlGaWxlID0gbmV3IE1hcCgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdEaXJlY3RpdmVzQnlGaWxlID0gbmV3IE1hcCgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdQaXBlc0J5RmlsZSA9IG5ldyBNYXAoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nSW5qZWN0YWJsZXNCeUZpbGUgPSBuZXcgTWFwKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaWxlUGF0aHMgPSBuZXcgU2V0KCk7XG4gICAgICAvLyBNYWtlIHN1cmUgd2UgcHJvZHVjZSBhbiBhbmFseXplZCBmaWxlIGZvciBlYWNoIGlucHV0IGZpbGVcbiAgICAgIHByb2dyYW1TeW1ib2xzLmZvckVhY2goZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpbGVQYXRoID0gc3ltYm9sLmZpbGVQYXRoO1xuICAgICAgICAgIGZpbGVQYXRocy5hZGQoZmlsZVBhdGgpO1xuICAgICAgICAgIGlmIChtZXRhZGF0YVJlc29sdmVyLmlzSW5qZWN0YWJsZShzeW1ib2wpKSB7XG4gICAgICAgICAgICAgIG5nSW5qZWN0YWJsZXNCeUZpbGUuc2V0KGZpbGVQYXRoLCAobmdJbmplY3RhYmxlc0J5RmlsZS5nZXQoZmlsZVBhdGgpIHx8IFtdKS5jb25jYXQoc3ltYm9sKSk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBMb29waW5nIG92ZXIgYWxsIG1vZHVsZXMgdG8gY29uc3RydWN0OlxuICAgICAgLy8gLSBhIG1hcCBmcm9tIGZpbGUgdG8gbW9kdWxlcyBgbmdNb2R1bGVzQnlGaWxlYCxcbiAgICAgIC8vIC0gYSBtYXAgZnJvbSBmaWxlIHRvIGRpcmVjdGl2ZXMgYG5nRGlyZWN0aXZlc0J5RmlsZWAsXG4gICAgICAvLyAtIGEgbWFwIGZyb20gZmlsZSB0byBwaXBlcyBgbmdQaXBlc0J5RmlsZWAsXG4gICAgICAvLyAtIGEgbWFwIGZyb20gZGlyZWN0aXZlL3BpcGUgdG8gbW9kdWxlIGBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlYC5cbiAgICAgIG5nTW9kdWxlTWV0YXMuZm9yRWFjaChmdW5jdGlvbiAobmdNb2R1bGVNZXRhKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3JjRmlsZVVybCA9IG5nTW9kdWxlTWV0YS50eXBlLnJlZmVyZW5jZS5maWxlUGF0aDtcbiAgICAgICAgICBmaWxlUGF0aHMuYWRkKHNyY0ZpbGVVcmwpO1xuICAgICAgICAgIG5nTW9kdWxlc0J5RmlsZS5zZXQoc3JjRmlsZVVybCwgKG5nTW9kdWxlc0J5RmlsZS5nZXQoc3JjRmlsZVVybCkgfHwgW10pLmNvbmNhdChuZ01vZHVsZU1ldGEudHlwZS5yZWZlcmVuY2UpKTtcbiAgICAgICAgICBuZ01vZHVsZU1ldGEuZGVjbGFyZWREaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZVVybCA9IGRpcklkZW50aWZpZXIucmVmZXJlbmNlLmZpbGVQYXRoO1xuICAgICAgICAgICAgICBmaWxlUGF0aHMuYWRkKGZpbGVVcmwpO1xuICAgICAgICAgICAgICBuZ0RpcmVjdGl2ZXNCeUZpbGUuc2V0KGZpbGVVcmwsIChuZ0RpcmVjdGl2ZXNCeUZpbGUuZ2V0KGZpbGVVcmwpIHx8IFtdKS5jb25jYXQoZGlySWRlbnRpZmllci5yZWZlcmVuY2UpKTtcbiAgICAgICAgICAgICAgbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZS5zZXQoZGlySWRlbnRpZmllci5yZWZlcmVuY2UsIG5nTW9kdWxlTWV0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbmdNb2R1bGVNZXRhLmRlY2xhcmVkUGlwZXMuZm9yRWFjaChmdW5jdGlvbiAocGlwZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZVVybCA9IHBpcGVJZGVudGlmaWVyLnJlZmVyZW5jZS5maWxlUGF0aDtcbiAgICAgICAgICAgICAgZmlsZVBhdGhzLmFkZChmaWxlVXJsKTtcbiAgICAgICAgICAgICAgbmdQaXBlc0J5RmlsZS5zZXQoZmlsZVVybCwgKG5nUGlwZXNCeUZpbGUuZ2V0KGZpbGVVcmwpIHx8IFtdKS5jb25jYXQocGlwZUlkZW50aWZpZXIucmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUuc2V0KHBpcGVJZGVudGlmaWVyLnJlZmVyZW5jZSwgbmdNb2R1bGVNZXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZXMgPSBbXTtcbiAgICAgIGZpbGVQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzcmNVcmwpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJlY3RpdmVzID0gbmdEaXJlY3RpdmVzQnlGaWxlLmdldChzcmNVcmwpIHx8IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBpcGVzID0gbmdQaXBlc0J5RmlsZS5nZXQoc3JjVXJsKSB8fCBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZ01vZHVsZXMgPSBuZ01vZHVsZXNCeUZpbGUuZ2V0KHNyY1VybCkgfHwgW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5qZWN0YWJsZXMgPSBuZ0luamVjdGFibGVzQnlGaWxlLmdldChzcmNVcmwpIHx8IFtdO1xuICAgICAgICAgIGZpbGVzLnB1c2goeyBzcmNVcmw6IHNyY1VybCwgZGlyZWN0aXZlczogZGlyZWN0aXZlcywgcGlwZXM6IHBpcGVzLCBuZ01vZHVsZXM6IG5nTW9kdWxlcywgaW5qZWN0YWJsZXM6IGluamVjdGFibGVzIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAgIC8vIG1hcCBkaXJlY3RpdmUvcGlwZSB0byBtb2R1bGVcbiAgICAgICAgICBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlOiBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLFxuICAgICAgICAgIC8vIGxpc3QgbW9kdWxlcyBhbmQgZGlyZWN0aXZlcyBmb3IgZXZlcnkgc291cmNlIGZpbGVcbiAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgbmdNb2R1bGVzOiBuZ01vZHVsZU1ldGFzLCBzeW1ib2xzTWlzc2luZ01vZHVsZTogc3ltYm9sc01pc3NpbmdNb2R1bGVcbiAgICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RhdGljU3ltYm9sUmVzb2x2ZXJcbiAgICogQHBhcmFtIHs/fSBmaWxlc1xuICAgKiBAcGFyYW0gez99IGhvc3RcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGV4dHJhY3RQcm9ncmFtU3ltYm9scyhzdGF0aWNTeW1ib2xSZXNvbHZlciwgZmlsZXMsIGhvc3QpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRpY1N5bWJvbHMgPSBbXTtcbiAgICAgIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZU5hbWUpIHsgcmV0dXJuIGhvc3QuaXNTb3VyY2VGaWxlKGZpbGVOYW1lKTsgfSkuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgICAgIHN0YXRpY1N5bWJvbFJlc29sdmVyLmdldFN5bWJvbHNPZihzb3VyY2VGaWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRTeW1ib2wgPSBzdGF0aWNTeW1ib2xSZXNvbHZlci5yZXNvbHZlU3ltYm9sKHN5bWJvbCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN5bWJvbE1ldGEgPSByZXNvbHZlZFN5bWJvbC5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgaWYgKHN5bWJvbE1ldGEpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xNZXRhLl9fc3ltYm9saWMgIT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBzeW1ib2xzIHRoYXQgYXJlIG9ubHkgaW5jbHVkZWQgdG8gcmVjb3JkIGVycm9yIGluZm9ybWF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1N5bWJvbHMucHVzaChyZXNvbHZlZFN5bWJvbC5zeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdGF0aWNTeW1ib2xzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHByb2dyYW1TdGF0aWNTeW1ib2xzXG4gICAqIEBwYXJhbSB7P30gaG9zdFxuICAgKiBAcGFyYW0gez99IG1ldGFkYXRhUmVzb2x2ZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9jcmVhdGVOZ01vZHVsZXMocHJvZ3JhbVN0YXRpY1N5bWJvbHMsIGhvc3QsIG1ldGFkYXRhUmVzb2x2ZXIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlcyA9IG5ldyBNYXAoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb2dyYW1QaXBlc0FuZERpcmVjdGl2ZXMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlUGlwZXNBbmREaXJlY3RpdmUgPSBuZXcgU2V0KCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhZGROZ01vZHVsZSA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICBpZiAobmdNb2R1bGVzLmhhcyhzdGF0aWNTeW1ib2wpIHx8ICFob3N0LmlzU291cmNlRmlsZShzdGF0aWNTeW1ib2wuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGUgPSBtZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEoc3RhdGljU3ltYm9sLCBmYWxzZSk7XG4gICAgICAgICAgaWYgKG5nTW9kdWxlKSB7XG4gICAgICAgICAgICAgIG5nTW9kdWxlcy5zZXQobmdNb2R1bGUudHlwZS5yZWZlcmVuY2UsIG5nTW9kdWxlKTtcbiAgICAgICAgICAgICAgbmdNb2R1bGUuZGVjbGFyZWREaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gbmdNb2R1bGVQaXBlc0FuZERpcmVjdGl2ZS5hZGQoZGlyLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKHBpcGUpIHsgcmV0dXJuIG5nTW9kdWxlUGlwZXNBbmREaXJlY3RpdmUuYWRkKHBpcGUucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgICAgICAgIC8vIEZvciBldmVyeSBpbnB1dCBtb2R1bGUgYWRkIHRoZSBsaXN0IG9mIHRyYW5zaXRpdmVseSBpbmNsdWRlZCBtb2R1bGVzXG4gICAgICAgICAgICAgIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RNZXRhKSB7IHJldHVybiBhZGROZ01vZHVsZShtb2RNZXRhLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gISFuZ01vZHVsZTtcbiAgICAgIH07XG4gICAgICBwcm9ncmFtU3RhdGljU3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICBpZiAoIWFkZE5nTW9kdWxlKHN0YXRpY1N5bWJvbCkgJiZcbiAgICAgICAgICAgICAgKG1ldGFkYXRhUmVzb2x2ZXIuaXNEaXJlY3RpdmUoc3RhdGljU3ltYm9sKSB8fCBtZXRhZGF0YVJlc29sdmVyLmlzUGlwZShzdGF0aWNTeW1ib2wpKSkge1xuICAgICAgICAgICAgICBwcm9ncmFtUGlwZXNBbmREaXJlY3RpdmVzLnB1c2goc3RhdGljU3ltYm9sKTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGFueSBvZiB0aGUgcHJvZ3JhbSBwaXBlIG9yIGRpcmVjdGl2ZXMgaXMgbm90IGRlY2xhcmVkIGJ5IGEgbW9kdWxlXG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzeW1ib2xzTWlzc2luZ01vZHVsZSA9IHByb2dyYW1QaXBlc0FuZERpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7IHJldHVybiAhbmdNb2R1bGVQaXBlc0FuZERpcmVjdGl2ZS5oYXMocyk7IH0pO1xuICAgICAgcmV0dXJuIHsgbmdNb2R1bGVzOiBBcnJheS5mcm9tKG5nTW9kdWxlcy52YWx1ZXMoKSksIHN5bWJvbHNNaXNzaW5nTW9kdWxlOiBzeW1ib2xzTWlzc2luZ01vZHVsZSB9O1xuICB9XG5cbiAgdmFyIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNEZWxlZ2F0ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBTdGF0aWNBbmREeW5hbWljUmVmbGVjdGlvbkNhcGFiaWxpdGllcyhzdGF0aWNEZWxlZ2F0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGljRGVsZWdhdGUgPSBzdGF0aWNEZWxlZ2F0ZTtcbiAgICAgICAgICB0aGlzLmR5bmFtaWNEZWxlZ2F0ZSA9IG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGljRGVsZWdhdGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmluc3RhbGwgPSBmdW5jdGlvbiAoc3RhdGljRGVsZWdhdGUpIHtcbiAgICAgICAgICByZWZsZWN0b3IudXBkYXRlQ2FwYWJpbGl0aWVzKG5ldyBTdGF0aWNBbmREeW5hbWljUmVmbGVjdGlvbkNhcGFiaWxpdGllcyhzdGF0aWNEZWxlZ2F0ZSkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmlzUmVmbGVjdGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5mYWN0b3J5ID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMuZHluYW1pY0RlbGVnYXRlLmZhY3RvcnkodHlwZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBsY1Byb3BlcnR5XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNBbmREeW5hbWljUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7XG4gICAgICAgICAgcmV0dXJuIGlzU3RhdGljVHlwZSh0eXBlKSA/IHRoaXMuc3RhdGljRGVsZWdhdGUuaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBsY1Byb3BlcnR5KSA6XG4gICAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlbGVnYXRlLmhhc0xpZmVjeWNsZUhvb2sodHlwZSwgbGNQcm9wZXJ0eSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gaXNTdGF0aWNUeXBlKHR5cGUpID8gdGhpcy5zdGF0aWNEZWxlZ2F0ZS5wYXJhbWV0ZXJzKHR5cGUpIDpcbiAgICAgICAgICAgICAgdGhpcy5keW5hbWljRGVsZWdhdGUucGFyYW1ldGVycyh0eXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gaXNTdGF0aWNUeXBlKHR5cGUpID8gdGhpcy5zdGF0aWNEZWxlZ2F0ZS5hbm5vdGF0aW9ucyh0eXBlKSA6XG4gICAgICAgICAgICAgIHRoaXMuZHluYW1pY0RlbGVnYXRlLmFubm90YXRpb25zKHR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNBbmREeW5hbWljUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUucHJvcE1ldGFkYXRhID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gaXNTdGF0aWNUeXBlKHR5cGVPckZ1bmMpID8gdGhpcy5zdGF0aWNEZWxlZ2F0ZS5wcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgOlxuICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNEZWxlZ2F0ZS5wcm9wTWV0YWRhdGEodHlwZU9yRnVuYyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5nZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gdGhpcy5keW5hbWljRGVsZWdhdGUuZ2V0dGVyKG5hbWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5zZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gdGhpcy5keW5hbWljRGVsZWdhdGUuc2V0dGVyKG5hbWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5tZXRob2QgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gdGhpcy5keW5hbWljRGVsZWdhdGUubWV0aG9kKG5hbWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5pbXBvcnRVcmkgPSBmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdGhpcy5zdGF0aWNEZWxlZ2F0ZS5pbXBvcnRVcmkodHlwZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVVcmxcbiAgICAgICAqIEBwYXJhbSB7P30gcnVudGltZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnJlc29sdmVJZGVudGlmaWVyID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZVVybCwgcnVudGltZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0RlbGVnYXRlLnJlc29sdmVJZGVudGlmaWVyKG5hbWUsIG1vZHVsZVVybCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVudW1JZGVudGlmaWVyXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY0FuZER5bmFtaWNSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5yZXNvbHZlRW51bSA9IGZ1bmN0aW9uIChlbnVtSWRlbnRpZmllciwgbmFtZSkge1xuICAgICAgICAgIGlmIChpc1N0YXRpY1R5cGUoZW51bUlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0RlbGVnYXRlLnJlc29sdmVFbnVtKGVudW1JZGVudGlmaWVyLCBuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXM7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzU3RhdGljVHlwZSh0eXBlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUubmFtZSAmJiB0eXBlLmZpbGVQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDI0ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBTkdVTEFSX0lNUE9SVF9MT0NBVElPTlMgPSB7XG4gICAgICBjb3JlRGVjb3JhdG9yczogJ0Bhbmd1bGFyL2NvcmUvc3JjL21ldGFkYXRhJyxcbiAgICAgIGRpRGVjb3JhdG9yczogJ0Bhbmd1bGFyL2NvcmUvc3JjL2RpL21ldGFkYXRhJyxcbiAgICAgIGRpTWV0YWRhdGE6ICdAYW5ndWxhci9jb3JlL3NyYy9kaS9tZXRhZGF0YScsXG4gICAgICBkaU9wYXF1ZVRva2VuOiAnQGFuZ3VsYXIvY29yZS9zcmMvZGkvb3BhcXVlX3Rva2VuJyxcbiAgICAgIGFuaW1hdGlvbk1ldGFkYXRhOiAnQGFuZ3VsYXIvY29yZS9zcmMvYW5pbWF0aW9uL21ldGFkYXRhJyxcbiAgICAgIHByb3ZpZGVyOiAnQGFuZ3VsYXIvY29yZS9zcmMvZGkvcHJvdmlkZXInXG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIEhJRERFTl9LRVkgPSAvXlxcJC4qXFwkJC87XG4gIC8qKlxuICAgKiAgQSBzdGF0aWMgcmVmbGVjdG9yIGltcGxlbWVudHMgZW5vdWdoIG9mIHRoZSBSZWZsZWN0b3IgQVBJIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXBpbGVcbiAgICAqIHRlbXBsYXRlcyBzdGF0aWNhbGx5LlxuICAgKi9cbiAgdmFyIFN0YXRpY1JlZmxlY3RvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3ltYm9sUmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7Pz19IGtub3duTWV0YWRhdGFDbGFzc2VzXG4gICAgICAgKiBAcGFyYW0gez89fSBrbm93bk1ldGFkYXRhRnVuY3Rpb25zXG4gICAgICAgKiBAcGFyYW0gez89fSBlcnJvclJlY29yZGVyXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFN0YXRpY1JlZmxlY3RvcihzeW1ib2xSZXNvbHZlciwga25vd25NZXRhZGF0YUNsYXNzZXMsIGtub3duTWV0YWRhdGFGdW5jdGlvbnMsIGVycm9yUmVjb3JkZXIpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmIChrbm93bk1ldGFkYXRhQ2xhc3NlcyA9PT0gdm9pZCAwKSB7IGtub3duTWV0YWRhdGFDbGFzc2VzID0gW107IH1cbiAgICAgICAgICBpZiAoa25vd25NZXRhZGF0YUZ1bmN0aW9ucyA9PT0gdm9pZCAwKSB7IGtub3duTWV0YWRhdGFGdW5jdGlvbnMgPSBbXTsgfVxuICAgICAgICAgIHRoaXMuc3ltYm9sUmVzb2x2ZXIgPSBzeW1ib2xSZXNvbHZlcjtcbiAgICAgICAgICB0aGlzLmVycm9yUmVjb3JkZXIgPSBlcnJvclJlY29yZGVyO1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMucHJvcGVydHlDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLnBhcmFtZXRlckNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMubWV0aG9kQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5jb252ZXJzaW9uTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnZlcnNpb25NYXAoKTtcbiAgICAgICAgICBrbm93bk1ldGFkYXRhQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChrYykgeyByZXR1cm4gX3RoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3RvcihfdGhpcy5nZXRTdGF0aWNTeW1ib2woa2MuZmlsZVBhdGgsIGtjLm5hbWUpLCBrYy5jdG9yKTsgfSk7XG4gICAgICAgICAga25vd25NZXRhZGF0YUZ1bmN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChrZikgeyByZXR1cm4gX3RoaXMuX3JlZ2lzdGVyRnVuY3Rpb24oX3RoaXMuZ2V0U3RhdGljU3ltYm9sKGtmLmZpbGVQYXRoLCBrZi5uYW1lKSwga2YuZm4pOyB9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLmltcG9ydFVyaSA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGljU3ltYm9sID0gdGhpcy5maW5kU3ltYm9sRGVjbGFyYXRpb24odHlwZU9yRnVuYyk7XG4gICAgICAgICAgcmV0dXJuIHN0YXRpY1N5bWJvbCA/IHN0YXRpY1N5bWJvbC5maWxlUGF0aCA6IG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLnJlc29sdmVJZGVudGlmaWVyID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZVVybCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmREZWNsYXJhdGlvbihtb2R1bGVVcmwsIG5hbWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVVcmxcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGFpbmluZ0ZpbGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuZmluZERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG1vZHVsZVVybCwgbmFtZSwgY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5kU3ltYm9sRGVjbGFyYXRpb24odGhpcy5zeW1ib2xSZXNvbHZlci5nZXRTeW1ib2xCeU1vZHVsZShtb2R1bGVVcmwsIG5hbWUsIGNvbnRhaW5pbmdGaWxlKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN5bWJvbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5maW5kU3ltYm9sRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRTeW1ib2wgPSB0aGlzLnN5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2woc3ltYm9sKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWRTeW1ib2wgJiYgcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZFN5bWJvbERlY2xhcmF0aW9uKHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbnVtSWRlbnRpZmllclxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLnJlc29sdmVFbnVtID0gZnVuY3Rpb24gKGVudW1JZGVudGlmaWVyLCBuYW1lKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGljU3ltYm9sID0gZW51bUlkZW50aWZpZXI7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGljU3ltYm9sKHN0YXRpY1N5bWJvbC5maWxlUGF0aCwgc3RhdGljU3ltYm9sLm5hbWUsIFtuYW1lXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuYW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb25zID0gdGhpcy5hbm5vdGF0aW9uQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICAgIGlmICghYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xhc3NNZXRhZGF0YSA9IHRoaXMuZ2V0VHlwZU1ldGFkYXRhKHR5cGUpO1xuICAgICAgICAgICAgICBpZiAoY2xhc3NNZXRhZGF0YVsnZXh0ZW5kcyddKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRBbm5vdGF0aW9ucyA9IHRoaXMuYW5ub3RhdGlvbnModGhpcy5zaW1wbGlmeSh0eXBlLCBjbGFzc01ldGFkYXRhWydleHRlbmRzJ10pKTtcbiAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnB1c2guYXBwbHkoYW5ub3RhdGlvbnMsIHBhcmVudEFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY2xhc3NNZXRhZGF0YVsnZGVjb3JhdG9ycyddKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvd25Bbm5vdGF0aW9ucyA9IHRoaXMuc2ltcGxpZnkodHlwZSwgY2xhc3NNZXRhZGF0YVsnZGVjb3JhdG9ycyddKTtcbiAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnB1c2guYXBwbHkoYW5ub3RhdGlvbnMsIG93bkFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DYWNoZS5zZXQodHlwZSwgYW5ub3RhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChhbm4pIHsgcmV0dXJuICEhYW5uOyB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9ucztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvcE1ldGFkYXRhID0gdGhpcy5wcm9wZXJ0eUNhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgICBpZiAoIXByb3BNZXRhZGF0YSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbGFzc01ldGFkYXRhID0gdGhpcy5nZXRUeXBlTWV0YWRhdGEodHlwZSk7XG4gICAgICAgICAgICAgIHByb3BNZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgICBpZiAoY2xhc3NNZXRhZGF0YVsnZXh0ZW5kcyddKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRQcm9wTWV0YWRhdGFfMSA9IHRoaXMucHJvcE1ldGFkYXRhKHRoaXMuc2ltcGxpZnkodHlwZSwgY2xhc3NNZXRhZGF0YVsnZXh0ZW5kcyddKSk7XG4gICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJlbnRQcm9wTWV0YWRhdGFfMSkuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50UHJvcCkge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwYXJlbnRQcm9wXSA9IHBhcmVudFByb3BNZXRhZGF0YV8xW3BhcmVudFByb3BdO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVtYmVyc18xID0gY2xhc3NNZXRhZGF0YVsnbWVtYmVycyddIHx8IHt9O1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtZW1iZXJzXzEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wRGF0YSA9IG1lbWJlcnNfMVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wID0gKChwcm9wRGF0YSkpXG4gICAgICAgICAgICAgICAgICAgICAgLmZpbmQoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGFbJ19fc3ltYm9saWMnXSA9PSAncHJvcGVydHknIHx8IGFbJ19fc3ltYm9saWMnXSA9PSAnbWV0aG9kJzsgfSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNvcmF0b3JzID0gW107XG4gICAgICAgICAgICAgICAgICBpZiAocHJvcE1ldGFkYXRhW3Byb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvcnMucHVzaC5hcHBseShkZWNvcmF0b3JzLCBwcm9wTWV0YWRhdGFbcHJvcE5hbWVdKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBkZWNvcmF0b3JzO1xuICAgICAgICAgICAgICAgICAgaWYgKHByb3AgJiYgcHJvcFsnZGVjb3JhdG9ycyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9ycy5wdXNoLmFwcGx5KGRlY29yYXRvcnMsIF90aGlzLnNpbXBsaWZ5KHR5cGUsIHByb3BbJ2RlY29yYXRvcnMnXSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eUNhY2hlLnNldCh0eXBlLCBwcm9wTWV0YWRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLnBhcmFtZXRlcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IobmV3IEVycm9yKFwicGFyYW1ldGVycyByZWNlaXZlZCBcIiArIEpTT04uc3RyaW5naWZ5KHR5cGUpICsgXCIgd2hpY2ggaXMgbm90IGEgU3RhdGljU3ltYm9sXCIpLCB0eXBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbWV0ZXJzXzEgPSB0aGlzLnBhcmFtZXRlckNhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzXzEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsYXNzTWV0YWRhdGEgPSB0aGlzLmdldFR5cGVNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lbWJlcnMgPSBjbGFzc01ldGFkYXRhID8gY2xhc3NNZXRhZGF0YVsnbWVtYmVycyddIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN0b3JEYXRhID0gbWVtYmVycyA/IG1lbWJlcnNbJ19fY3Rvcl9fJ10gOiBudWxsO1xuICAgICAgICAgICAgICAgICAgaWYgKGN0b3JEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3RvciA9ICgoY3RvckRhdGEpKS5maW5kKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhWydfX3N5bWJvbGljJ10gPT0gJ2NvbnN0cnVjdG9yJzsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1ldGVyVHlwZXMgPSAodGhpcy5zaW1wbGlmeSh0eXBlLCBjdG9yWydwYXJhbWV0ZXJzJ10gfHwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbWV0ZXJEZWNvcmF0b3JzXzEgPSAodGhpcy5zaW1wbGlmeSh0eXBlLCBjdG9yWydwYXJhbWV0ZXJEZWNvcmF0b3JzJ10gfHwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbVR5cGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5lc3RlZFJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZXN1bHQucHVzaChwYXJhbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlY29yYXRvcnMgPSBwYXJhbWV0ZXJEZWNvcmF0b3JzXzEgPyBwYXJhbWV0ZXJEZWNvcmF0b3JzXzFbaW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlc3VsdC5wdXNoLmFwcGx5KG5lc3RlZFJlc3VsdCwgZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xLnB1c2gobmVzdGVkUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsYXNzTWV0YWRhdGFbJ2V4dGVuZHMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMSA9IHRoaXMucGFyYW1ldGVycyh0aGlzLnNpbXBsaWZ5KHR5cGUsIGNsYXNzTWV0YWRhdGFbJ2V4dGVuZHMnXSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSBbXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyQ2FjaGUuc2V0KHR5cGUsIHBhcmFtZXRlcnNfMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnNfMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCBvbiB0eXBlIFwiICsgSlNPTi5zdHJpbmdpZnkodHlwZSkgKyBcIiB3aXRoIGVycm9yIFwiICsgZSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLl9tZXRob2ROYW1lcyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWV0aG9kTmFtZXMgPSB0aGlzLm1ldGhvZENhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgICBpZiAoIW1ldGhvZE5hbWVzKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNsYXNzTWV0YWRhdGEgPSB0aGlzLmdldFR5cGVNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgICAgICAgbWV0aG9kTmFtZXMgPSB7fTtcbiAgICAgICAgICAgICAgaWYgKGNsYXNzTWV0YWRhdGFbJ2V4dGVuZHMnXSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50TWV0aG9kTmFtZXNfMSA9IHRoaXMuX21ldGhvZE5hbWVzKHRoaXMuc2ltcGxpZnkodHlwZSwgY2xhc3NNZXRhZGF0YVsnZXh0ZW5kcyddKSk7XG4gICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJlbnRNZXRob2ROYW1lc18xKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJlbnRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZXNbcGFyZW50UHJvcF0gPSBwYXJlbnRNZXRob2ROYW1lc18xW3BhcmVudFByb3BdO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVtYmVyc18yID0gY2xhc3NNZXRhZGF0YVsnbWVtYmVycyddIHx8IHt9O1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtZW1iZXJzXzIpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wRGF0YSA9IG1lbWJlcnNfMltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc01ldGhvZCA9ICgocHJvcERhdGEpKS5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhWydfX3N5bWJvbGljJ10gPT0gJ21ldGhvZCc7IH0pO1xuICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZXNbcHJvcE5hbWVdID0gbWV0aG9kTmFtZXNbcHJvcE5hbWVdIHx8IGlzTWV0aG9kO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5tZXRob2RDYWNoZS5zZXQodHlwZSwgbWV0aG9kTmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWV0aG9kTmFtZXM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gbGNQcm9wZXJ0eVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5oYXNMaWZlY3ljbGVIb29rID0gZnVuY3Rpb24gKHR5cGUsIGxjUHJvcGVydHkpIHtcbiAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSkge1xuICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihcImhhc0xpZmVjeWNsZUhvb2sgcmVjZWl2ZWQgXCIgKyBKU09OLnN0cmluZ2lmeSh0eXBlKSArIFwiIHdoaWNoIGlzIG5vdCBhIFN0YXRpY1N5bWJvbFwiKSwgdHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX21ldGhvZE5hbWVzKHR5cGUpW2xjUHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIG9uIHR5cGUgXCIgKyBKU09OLnN0cmluZ2lmeSh0eXBlKSArIFwiIHdpdGggZXJyb3IgXCIgKyBlKTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKHR5cGUsIGN0b3IpIHtcbiAgICAgICAgICB0aGlzLmNvbnZlcnNpb25NYXAuc2V0KHR5cGUsIGZ1bmN0aW9uIChjb250ZXh0LCBhcmdzKSB7IHJldHVybiBuZXcgKGN0b3IuYmluZC5hcHBseShjdG9yLCBbdm9pZCAwXS5jb25jYXQoYXJncykpKSgpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5fcmVnaXN0ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAgICAgICAgIHRoaXMuY29udmVyc2lvbk1hcC5zZXQodHlwZSwgZnVuY3Rpb24gKGNvbnRleHQsIGFyZ3MpIHsgcmV0dXJuIGZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5pbml0aWFsaXplQ29udmVyc2lvbk1hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgY29yZURlY29yYXRvcnMgPSBBTkdVTEFSX0lNUE9SVF9MT0NBVElPTlMuY29yZURlY29yYXRvcnMsIGRpRGVjb3JhdG9ycyA9IEFOR1VMQVJfSU1QT1JUX0xPQ0FUSU9OUy5kaURlY29yYXRvcnMsIGRpTWV0YWRhdGEgPSBBTkdVTEFSX0lNUE9SVF9MT0NBVElPTlMuZGlNZXRhZGF0YSwgZGlPcGFxdWVUb2tlbiA9IEFOR1VMQVJfSU1QT1JUX0xPQ0FUSU9OUy5kaU9wYXF1ZVRva2VuLCBhbmltYXRpb25NZXRhZGF0YSA9IEFOR1VMQVJfSU1QT1JUX0xPQ0FUSU9OUy5hbmltYXRpb25NZXRhZGF0YSwgcHJvdmlkZXIgPSBBTkdVTEFSX0lNUE9SVF9MT0NBVElPTlMucHJvdmlkZXI7XG4gICAgICAgICAgdGhpcy5vcGFxdWVUb2tlbiA9IHRoaXMuZmluZERlY2xhcmF0aW9uKGRpT3BhcXVlVG9rZW4sICdPcGFxdWVUb2tlbicpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihkaURlY29yYXRvcnMsICdIb3N0JyksIF9hbmd1bGFyX2NvcmUuSG9zdCk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGRpRGVjb3JhdG9ycywgJ0luamVjdGFibGUnKSwgX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oZGlEZWNvcmF0b3JzLCAnU2VsZicpLCBfYW5ndWxhcl9jb3JlLlNlbGYpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihkaURlY29yYXRvcnMsICdTa2lwU2VsZicpLCBfYW5ndWxhcl9jb3JlLlNraXBTZWxmKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oZGlEZWNvcmF0b3JzLCAnSW5qZWN0JyksIF9hbmd1bGFyX2NvcmUuSW5qZWN0KTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oZGlEZWNvcmF0b3JzLCAnT3B0aW9uYWwnKSwgX2FuZ3VsYXJfY29yZS5PcHRpb25hbCk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGNvcmVEZWNvcmF0b3JzLCAnQXR0cmlidXRlJyksIF9hbmd1bGFyX2NvcmUuQXR0cmlidXRlKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oY29yZURlY29yYXRvcnMsICdDb250ZW50Q2hpbGQnKSwgX2FuZ3VsYXJfY29yZS5Db250ZW50Q2hpbGQpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ0NvbnRlbnRDaGlsZHJlbicpLCBfYW5ndWxhcl9jb3JlLkNvbnRlbnRDaGlsZHJlbik7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGNvcmVEZWNvcmF0b3JzLCAnVmlld0NoaWxkJyksIF9hbmd1bGFyX2NvcmUuVmlld0NoaWxkKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oY29yZURlY29yYXRvcnMsICdWaWV3Q2hpbGRyZW4nKSwgX2FuZ3VsYXJfY29yZS5WaWV3Q2hpbGRyZW4pO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ0lucHV0JyksIF9hbmd1bGFyX2NvcmUuSW5wdXQpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ091dHB1dCcpLCBfYW5ndWxhcl9jb3JlLk91dHB1dCk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGNvcmVEZWNvcmF0b3JzLCAnUGlwZScpLCBfYW5ndWxhcl9jb3JlLlBpcGUpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ0hvc3RCaW5kaW5nJyksIF9hbmd1bGFyX2NvcmUuSG9zdEJpbmRpbmcpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ0hvc3RMaXN0ZW5lcicpLCBfYW5ndWxhcl9jb3JlLkhvc3RMaXN0ZW5lcik7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGNvcmVEZWNvcmF0b3JzLCAnRGlyZWN0aXZlJyksIF9hbmd1bGFyX2NvcmUuRGlyZWN0aXZlKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oY29yZURlY29yYXRvcnMsICdDb21wb25lbnQnKSwgX2FuZ3VsYXJfY29yZS5Db21wb25lbnQpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihjb3JlRGVjb3JhdG9ycywgJ05nTW9kdWxlJyksIF9hbmd1bGFyX2NvcmUuTmdNb2R1bGUpO1xuICAgICAgICAgIC8vIE5vdGU6IFNvbWUgbWV0YWRhdGEgY2xhc3NlcyBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aXRoIFByb3ZpZGVyLmRlcHMuXG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGRpTWV0YWRhdGEsICdIb3N0JyksIF9hbmd1bGFyX2NvcmUuSG9zdCk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGRpTWV0YWRhdGEsICdTZWxmJyksIF9hbmd1bGFyX2NvcmUuU2VsZik7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKGRpTWV0YWRhdGEsICdTa2lwU2VsZicpLCBfYW5ndWxhcl9jb3JlLlNraXBTZWxmKTtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oZGlNZXRhZGF0YSwgJ09wdGlvbmFsJyksIF9hbmd1bGFyX2NvcmUuT3B0aW9uYWwpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRnVuY3Rpb24odGhpcy5maW5kRGVjbGFyYXRpb24oYW5pbWF0aW9uTWV0YWRhdGEsICd0cmlnZ2VyJyksIF9hbmd1bGFyX2NvcmUudHJpZ2dlcik7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJGdW5jdGlvbih0aGlzLmZpbmREZWNsYXJhdGlvbihhbmltYXRpb25NZXRhZGF0YSwgJ3N0YXRlJyksIF9hbmd1bGFyX2NvcmUuc3RhdGUpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRnVuY3Rpb24odGhpcy5maW5kRGVjbGFyYXRpb24oYW5pbWF0aW9uTWV0YWRhdGEsICd0cmFuc2l0aW9uJyksIF9hbmd1bGFyX2NvcmUudHJhbnNpdGlvbik7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJGdW5jdGlvbih0aGlzLmZpbmREZWNsYXJhdGlvbihhbmltYXRpb25NZXRhZGF0YSwgJ3N0eWxlJyksIF9hbmd1bGFyX2NvcmUuc3R5bGUpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRnVuY3Rpb24odGhpcy5maW5kRGVjbGFyYXRpb24oYW5pbWF0aW9uTWV0YWRhdGEsICdhbmltYXRlJyksIF9hbmd1bGFyX2NvcmUuYW5pbWF0ZSk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJGdW5jdGlvbih0aGlzLmZpbmREZWNsYXJhdGlvbihhbmltYXRpb25NZXRhZGF0YSwgJ2tleWZyYW1lcycpLCBfYW5ndWxhcl9jb3JlLmtleWZyYW1lcyk7XG4gICAgICAgICAgdGhpcy5fcmVnaXN0ZXJGdW5jdGlvbih0aGlzLmZpbmREZWNsYXJhdGlvbihhbmltYXRpb25NZXRhZGF0YSwgJ3NlcXVlbmNlJyksIF9hbmd1bGFyX2NvcmUuc2VxdWVuY2UpO1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRnVuY3Rpb24odGhpcy5maW5kRGVjbGFyYXRpb24oYW5pbWF0aW9uTWV0YWRhdGEsICdncm91cCcpLCBfYW5ndWxhcl9jb3JlLmdyb3VwKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBnZXRTdGF0aWNTeW1ib2wgcHJvZHVjZXMgYSBUeXBlIHdob3NlIG1ldGFkYXRhIGlzIGtub3duIGJ1dCB3aG9zZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbG9hZGVkLlxuICAgICAgICAqIEFsbCB0eXBlcyBwYXNzZWQgdG8gdGhlIFN0YXRpY1Jlc29sdmVyIHNob3VsZCBiZSBwc2V1ZG8tdHlwZXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICAgICogKlxuICAgICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbkZpbGUgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWNsYXJlZFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlLlxuICAgICAgICogQHBhcmFtIHs/PX0gbWVtYmVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5nZXRTdGF0aWNTeW1ib2wgPSBmdW5jdGlvbiAoZGVjbGFyYXRpb25GaWxlLCBuYW1lLCBtZW1iZXJzKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sUmVzb2x2ZXIuZ2V0U3RhdGljU3ltYm9sKGRlY2xhcmF0aW9uRmlsZSwgbmFtZSwgbWVtYmVycyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEBwYXJhbSB7Pz19IHBhdGhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUucmVwb3J0RXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IsIGNvbnRleHQsIHBhdGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5lcnJvclJlY29yZGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlcihlcnJvciwgKGNvbnRleHQgJiYgY29udGV4dC5maWxlUGF0aCkgfHwgcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuc2ltcGxpZnkgPSBmdW5jdGlvbiAoY29udGV4dCwgdmFsdWUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGYgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNjb3BlID0gQmluZGluZ1Njb3BlLmVtcHR5O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhbGxpbmcgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVwdGhcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5SW5Db250ZXh0KGNvbnRleHQsIHZhbHVlLCBkZXB0aCkge1xuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVSZWZlcmVuY2VWYWx1ZShzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVkU3ltYm9sID0gc2VsZi5zeW1ib2xSZXNvbHZlci5yZXNvbHZlU3ltYm9sKHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRTeW1ib2wgPyByZXNvbHZlZFN5bWJvbC5tZXRhZGF0YSA6IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZnVuY3Rpb25TeW1ib2xcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRGdW5jdGlvblxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Q2FsbChmdW5jdGlvblN5bWJvbCwgdGFyZ2V0RnVuY3Rpb24sIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGdW5jdGlvbiAmJiB0YXJnZXRGdW5jdGlvblsnX19zeW1ib2xpYyddID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGluZy5nZXQoZnVuY3Rpb25TeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjdXJzaW9uIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2FsbGluZy5zZXQoZnVuY3Rpb25TeW1ib2wsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlXzEgPSB0YXJnZXRGdW5jdGlvblsndmFsdWUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlXzEgJiYgKGRlcHRoICE9IDAgfHwgdmFsdWVfMS5fX3N5bWJvbGljICE9ICdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbWV0ZXJzID0gdGFyZ2V0RnVuY3Rpb25bJ3BhcmFtZXRlcnMnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlZmF1bHRzID0gdGFyZ2V0RnVuY3Rpb24uZGVmYXVsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMgJiYgZGVmYXVsdHMubGVuZ3RoID4gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgZGVmYXVsdHMuc2xpY2UoYXJncy5sZW5ndGgpLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHNpbXBsaWZ5KHZhbHVlKTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZnVuY3Rpb25TY29wZSA9IEJpbmRpbmdTY29wZS5idWlsZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblNjb3BlLmRlZmluZShwYXJhbWV0ZXJzW2ldLCBhcmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9sZFNjb3BlID0gc2NvcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHRfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBmdW5jdGlvblNjb3BlLmRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMSA9IHNpbXBsaWZ5SW5Db250ZXh0KGZ1bmN0aW9uU3ltYm9sLCB2YWx1ZV8xLCBkZXB0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBvbGRTY29wZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZy5kZWxldGUoZnVuY3Rpb25TeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGRlcHRoIGlzIDAgd2UgYXJlIGV2YWx1YXRpbmcgdGhlIHRvcCBsZXZlbCBleHByZXNzaW9uIHRoYXQgaXMgZGVzY3JpYmluZyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVjb3JhdG9yLiBJbiB0aGlzIGNhc2UsIGl0IGlzIGEgZGVjb3JhdG9yIHdlIGRvbid0IHVuZGVyc3RhbmQsIHN1Y2ggYXMgYSBjdXN0b21cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tYW5ndWxhciBkZWNvcmF0b3IsIGFuZCB3ZSBzaG91bGQganVzdCBpZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19zeW1ib2xpYzogJ2lnbm9yZScgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeSh7IF9fc3ltYm9saWM6ICdlcnJvcicsIG1lc3NhZ2U6ICdGdW5jdGlvbiBjYWxsIG5vdCBzdXBwb3J0ZWQnLCBjb250ZXh0OiBmdW5jdGlvblN5bWJvbCB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICBmdW5jdGlvbiBzaW1wbGlmeShleHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUkMShleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdF8yID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9ICgoZXhwcmVzc2lvbikpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3ByZWFkIGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5fX3N5bWJvbGljID09PSAnc3ByZWFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ByZWFkQXJyYXkgPSBzaW1wbGlmeShpdGVtLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3ByZWFkQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBzcHJlYWRBcnJheV8xID0gc3ByZWFkQXJyYXk7IF9iIDwgc3ByZWFkQXJyYXlfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwcmVhZEl0ZW0gPSBzcHJlYWRBcnJheV8xW19iXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzIucHVzaChzcHJlYWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWVfMiA9IHNpbXBsaWZ5KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKHZhbHVlXzIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMi5wdXNoKHZhbHVlXzIpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3Agc2ltcGxpZmljYXRpb24gYXQgYnVpbHRpbiBzeW1ib2xzXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT09IHNlbGYub3BhcXVlVG9rZW4gfHwgc2VsZi5jb252ZXJzaW9uTWFwLmhhcyhleHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRpY1N5bWJvbCA9IGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlY2xhcmF0aW9uVmFsdWUgPSByZXNvbHZlUmVmZXJlbmNlVmFsdWUoc3RhdGljU3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeUluQ29udGV4dChzdGF0aWNTeW1ib2wsIGRlY2xhcmF0aW9uVmFsdWUsIGRlcHRoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljU3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvblsnX19zeW1ib2xpYyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRpY1N5bWJvbCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uWydfX3N5bWJvbGljJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jpbm9wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsZWZ0ID0gc2ltcGxpZnkoZXhwcmVzc2lvblsnbGVmdCddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKGxlZnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByaWdodCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ3JpZ2h0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUocmlnaHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uWydvcGVyYXRvciddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICYmIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCB8fCByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCB8IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdeJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0IF4gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgJiByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPT0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICE9IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT09IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0IDwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ID49IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8PCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCA8PCByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPj4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj4gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICogcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLyByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAlIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2lmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb25kaXRpb24gPSBzaW1wbGlmeShleHByZXNzaW9uWydjb25kaXRpb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbiA/IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ3RoZW5FeHByZXNzaW9uJ10pIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxpZnkoZXhwcmVzc2lvblsnZWxzZUV4cHJlc3Npb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9wZXJhbmQgPSBzaW1wbGlmeShleHByZXNzaW9uWydvcGVyYW5kJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUob3BlcmFuZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXhwcmVzc2lvblsnb3BlcmF0b3InXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtb3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW9wZXJhbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIH5vcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luZGV4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleFRhcmdldCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ2V4cHJlc3Npb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSBzaW1wbGlmeShleHByZXNzaW9uWydpbmRleCddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhUYXJnZXQgJiYgaXNQcmltaXRpdmUkMShpbmRleCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleFRhcmdldFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lbWJlciA9IGV4cHJlc3Npb25bJ21lbWJlciddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlbGVjdFRhcmdldCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ2V4cHJlc3Npb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdFRhcmdldCBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZW1iZXJzID0gc2VsZWN0VGFyZ2V0Lm1lbWJlcnMuY29uY2F0KG1lbWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdENvbnRleHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRTdGF0aWNTeW1ib2woc2VsZWN0VGFyZ2V0LmZpbGVQYXRoLCBzZWxlY3RUYXJnZXQubmFtZSwgbWVtYmVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlY2xhcmF0aW9uVmFsdWUgPSByZXNvbHZlUmVmZXJlbmNlVmFsdWUoc2VsZWN0Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlJbkNvbnRleHQoc2VsZWN0Q29udGV4dCwgZGVjbGFyYXRpb25WYWx1ZSwgZGVwdGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RUYXJnZXQgJiYgaXNQcmltaXRpdmUkMShtZW1iZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlJbkNvbnRleHQoc2VsZWN0Q29udGV4dCwgc2VsZWN0VGFyZ2V0W21lbWJlcl0sIGRlcHRoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZWZlcmVuY2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgb25seSBoYXMgdG8gZGVhbCB3aXRoIHZhcmlhYmxlIHJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgc3ltYm9sIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbnRvIFN0YXRpY1N5bWJvbHMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBTdGF0aWNTeW1ib2xSZXNvbHZlciFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lXzEgPSBleHByZXNzaW9uWyduYW1lJ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG9jYWxWYWx1ZSA9IHNjb3BlLnJlc29sdmUobmFtZV8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxWYWx1ZSAhPSBCaW5kaW5nU2NvcGUubWlzc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2FsbCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBpcyBhIGJ1aWx0LWluIGNvbnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNTeW1ib2wgPSBzaW1wbGlmeUluQ29udGV4dChjb250ZXh0LCBleHByZXNzaW9uWydleHByZXNzaW9uJ10sIGRlcHRoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY1N5bWJvbCBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGljU3ltYm9sID09PSBzZWxmLm9wYXF1ZVRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzb21lYm9keSBjYWxscyBuZXcgT3BhcXVlVG9rZW4sIGRvbid0IGNyZWF0ZSBhbiBPcGFxdWVUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhlIE9wYXF1ZVRva2VuIGlzIGFzc2lnbmVkIHRvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJnRXhwcmVzc2lvbnMgPSBleHByZXNzaW9uWydhcmd1bWVudHMnXSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IGFyZ0V4cHJlc3Npb25zLm1hcChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBzaW1wbGlmeUluQ29udGV4dChjb250ZXh0LCBhcmcsIGRlcHRoICsgMSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb252ZXJ0ZXIgPSBzZWxmLmNvbnZlcnNpb25NYXAuZ2V0KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIGlzIG9uZSB3ZSBjYW4gc2ltcGxpZnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YXJnZXRGdW5jdGlvbiA9IHJlc29sdmVSZWZlcmVuY2VWYWx1ZShzdGF0aWNTeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsaWZ5Q2FsbChzdGF0aWNTeW1ib2wsIHRhcmdldEZ1bmN0aW9uLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXNzYWdlID0gcHJvZHVjZUVycm9yTWVzc2FnZShleHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvblsnbGluZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArIFwiIChwb3NpdGlvbiBcIiArIChleHByZXNzaW9uWydsaW5lJ10gKyAxKSArIFwiOlwiICsgKGV4cHJlc3Npb25bJ2NoYXJhY3RlciddICsgMSkgKyBcIiBpbiB0aGUgb3JpZ2luYWwgLnRzIGZpbGUpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHBvc2l0aW9uYWxFcnJvcihtZXNzYWdlLCBjb250ZXh0LmZpbGVQYXRoLCBleHByZXNzaW9uWydsaW5lJ10sIGV4cHJlc3Npb25bJ2NoYXJhY3RlciddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RyaW5nTWFwKGV4cHJlc3Npb24sIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkgeyByZXR1cm4gc2ltcGxpZnkodmFsdWUpOyB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnkodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZW1iZXJzID0gY29udGV4dC5tZW1iZXJzLmxlbmd0aCA/IFwiLlwiICsgY29udGV4dC5tZW1iZXJzLmpvaW4oJy4nKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWVzc2FnZSA9IGUubWVzc2FnZSArIFwiLCByZXNvbHZpbmcgc3ltYm9sIFwiICsgY29udGV4dC5uYW1lICsgbWVtYmVycyArIFwiIGluIFwiICsgY29udGV4dC5maWxlUGF0aDtcbiAgICAgICAgICAgICAgICAgIGlmIChlLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcG9zaXRpb25hbEVycm9yKG1lc3NhZ2UsIGUuZmlsZU5hbWUsIGUubGluZSwgZS5jb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZGVkU2ltcGxpZnlJbkNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgdmFsdWUsIGRlcHRoKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlJbkNvbnRleHQoY29udGV4dCwgdmFsdWUsIGRlcHRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMucmVwb3J0RXJyb3IoZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHRoaXMuZXJyb3JSZWNvcmRlciA/IHJlY29yZGVkU2ltcGxpZnlJbkNvbnRleHQoY29udGV4dCwgdmFsdWUsIDApIDpcbiAgICAgICAgICAgICAgc2ltcGxpZnlJbkNvbnRleHQoY29udGV4dCwgdmFsdWUsIDApO1xuICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUocmVzdWx0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLmdldFR5cGVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRTeW1ib2wgPSB0aGlzLnN5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2wodHlwZSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkU3ltYm9sICYmIHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhID8gcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEgOlxuICAgICAgICAgICAgICB7IF9fc3ltYm9saWM6ICdjbGFzcycgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RhdGljUmVmbGVjdG9yO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXhwYW5kZWRNZXNzYWdlKGVycm9yKSB7XG4gICAgICBzd2l0Y2ggKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICBjYXNlICdSZWZlcmVuY2UgdG8gbm9uLWV4cG9ydGVkIGNsYXNzJzpcbiAgICAgICAgICAgICAgaWYgKGVycm9yLmNvbnRleHQgJiYgZXJyb3IuY29udGV4dC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIlJlZmVyZW5jZSB0byBhIG5vbi1leHBvcnRlZCBjbGFzcyBcIiArIGVycm9yLmNvbnRleHQuY2xhc3NOYW1lICsgXCIuIENvbnNpZGVyIGV4cG9ydGluZyB0aGUgY2xhc3NcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdWYXJpYWJsZSBub3QgaW5pdGlhbGl6ZWQnOlxuICAgICAgICAgICAgICByZXR1cm4gJ09ubHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgY2FuIGJlIHJlZmVyZW5jZWQgYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyBuZWVkZWQgYnkgdGhlIHRlbXBsYXRlIGNvbXBpbGVyJztcbiAgICAgICAgICBjYXNlICdEZXN0cnVjdHVyaW5nIG5vdCBzdXBwb3J0ZWQnOlxuICAgICAgICAgICAgICByZXR1cm4gJ1JlZmVyZW5jaW5nIGFuIGV4cG9ydGVkIGRlc3RydWN0dXJlZCB2YXJpYWJsZSBvciBjb25zdGFudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZW1wbGF0ZSBjb21waWxlci4gQ29uc2lkZXIgc2ltcGxpZnlpbmcgdGhpcyB0byBhdm9pZCBkZXN0cnVjdHVyaW5nJztcbiAgICAgICAgICBjYXNlICdDb3VsZCBub3QgcmVzb2x2ZSB0eXBlJzpcbiAgICAgICAgICAgICAgaWYgKGVycm9yLmNvbnRleHQgJiYgZXJyb3IuY29udGV4dC50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiQ291bGQgbm90IHJlc29sdmUgdHlwZSBcIiArIGVycm9yLmNvbnRleHQudHlwZU5hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRnVuY3Rpb24gY2FsbCBub3Qgc3VwcG9ydGVkJzpcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlZml4ID0gZXJyb3IuY29udGV4dCAmJiBlcnJvci5jb250ZXh0Lm5hbWUgPyBcIkNhbGxpbmcgZnVuY3Rpb24gJ1wiICsgZXJyb3IuY29udGV4dC5uYW1lICsgXCInLCBmXCIgOiAnRic7XG4gICAgICAgICAgICAgIHJldHVybiBwcmVmaXggK1xuICAgICAgICAgICAgICAgICAgJ3VuY3Rpb24gY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQuIENvbnNpZGVyIHJlcGxhY2luZyB0aGUgZnVuY3Rpb24gb3IgbGFtYmRhIHdpdGggYSByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQgZnVuY3Rpb24nO1xuICAgICAgICAgIGNhc2UgJ1JlZmVyZW5jZSB0byBhIGxvY2FsIHN5bWJvbCc6XG4gICAgICAgICAgICAgIGlmIChlcnJvci5jb250ZXh0ICYmIGVycm9yLmNvbnRleHQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiUmVmZXJlbmNlIHRvIGEgbG9jYWwgKG5vbi1leHBvcnRlZCkgc3ltYm9sICdcIiArIGVycm9yLmNvbnRleHQubmFtZSArIFwiJy4gQ29uc2lkZXIgZXhwb3J0aW5nIHRoZSBzeW1ib2xcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBwcm9kdWNlRXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gICAgICByZXR1cm4gXCJFcnJvciBlbmNvdW50ZXJlZCByZXNvbHZpbmcgc3ltYm9sIHZhbHVlcyBzdGF0aWNhbGx5LiBcIiArIGV4cGFuZGVkTWVzc2FnZShlcnJvcik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICogQHBhcmFtIHs/fSB0cmFuc2Zvcm1cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFN0cmluZ01hcChpbnB1dCwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAoIWlucHV0KVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoaW5wdXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gdHJhbnNmb3JtKGlucHV0W2tleV0sIGtleSk7XG4gICAgICAgICAgaWYgKCFzaG91bGRJZ25vcmUodmFsdWUpKSB7XG4gICAgICAgICAgICAgIGlmIChISURERU5fS0VZLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwga2V5LCB7IGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQcmltaXRpdmUkMShvKSB7XG4gICAgICByZXR1cm4gbyA9PT0gbnVsbCB8fCAodHlwZW9mIG8gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG8gIT09ICdvYmplY3QnKTtcbiAgfVxuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgQmluZGluZ1Njb3BlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJpbmRpbmdTY29wZSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uIChuYW1lKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJpbmRpbmdTY29wZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmluZTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50LnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuc2l6ZSA+IDAgPyBuZXcgUG9wdWxhdGVkU2NvcGUoY3VycmVudCkgOiBCaW5kaW5nU2NvcGUuZW1wdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIEJpbmRpbmdTY29wZS5taXNzaW5nID0ge307XG4gICAgICBCaW5kaW5nU2NvcGUuZW1wdHkgPSB7IHJlc29sdmU6IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBCaW5kaW5nU2NvcGUubWlzc2luZzsgfSB9O1xuICAgICAgcmV0dXJuIEJpbmRpbmdTY29wZTtcbiAgfSgpKTtcbiAgdmFyIFBvcHVsYXRlZFNjb3BlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQyNChQb3B1bGF0ZWRTY29wZSwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBiaW5kaW5nc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQb3B1bGF0ZWRTY29wZShiaW5kaW5ncykge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuYmluZGluZ3MgPSBiaW5kaW5ncztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQb3B1bGF0ZWRTY29wZS5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3MuaGFzKG5hbWUpID8gdGhpcy5iaW5kaW5ncy5nZXQobmFtZSkgOiBCaW5kaW5nU2NvcGUubWlzc2luZztcbiAgICAgIH07XG4gICAgICByZXR1cm4gUG9wdWxhdGVkU2NvcGU7XG4gIH0oQmluZGluZ1Njb3BlKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJZ25vcmUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5fX3N5bWJvbGljID09ICdpZ25vcmUnO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICogQHBhcmFtIHs/fSBmaWxlTmFtZVxuICAgKiBAcGFyYW0gez99IGxpbmVcbiAgICogQHBhcmFtIHs/fSBjb2x1bW5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHBvc2l0aW9uYWxFcnJvcihtZXNzYWdlLCBmaWxlTmFtZSwgbGluZSwgY29sdW1uKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAoKHJlc3VsdCkpLmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAoKHJlc3VsdCkpLmxpbmUgPSBsaW5lO1xuICAgICAgKChyZXN1bHQpKS5jb2x1bW4gPSBjb2x1bW47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDI1ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgUmVzb2x2ZWRTdGF0aWNTeW1ib2wgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN5bWJvbFxuICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSZXNvbHZlZFN0YXRpY1N5bWJvbChzeW1ib2wsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7XG4gICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFJlc29sdmVkU3RhdGljU3ltYm9sO1xuICB9KCkpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTVVBQT1JURURfU0NIRU1BX1ZFUlNJT04gPSAzO1xuICAvKipcbiAgICogIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgbWV0YWRhdGEgcGVyIHN5bWJvbCxcbiAgICAqIGFuZCBub3JtYWxpemluZyByZWZlcmVuY2VzIGJldHdlZW4gc3ltYm9scy5cbiAgICovXG4gIHZhciBTdGF0aWNTeW1ib2xSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xDYWNoZVxuICAgICAgICogQHBhcmFtIHs/fSBzdW1tYXJ5UmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7Pz19IGVycm9yUmVjb3JkZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gU3RhdGljU3ltYm9sUmVzb2x2ZXIoaG9zdCwgc3RhdGljU3ltYm9sQ2FjaGUsIHN1bW1hcnlSZXNvbHZlciwgZXJyb3JSZWNvcmRlcikge1xuICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgICAgdGhpcy5zdGF0aWNTeW1ib2xDYWNoZSA9IHN0YXRpY1N5bWJvbENhY2hlO1xuICAgICAgICAgIHRoaXMuc3VtbWFyeVJlc29sdmVyID0gc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlciA9IGVycm9yUmVjb3JkZXI7XG4gICAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWRTeW1ib2xzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWRGaWxlUGF0aHMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhdGljU3ltYm9sXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZVN5bWJvbCA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICBpZiAoc3RhdGljU3ltYm9sLm1lbWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVN5bWJvbE1lbWJlcnMoc3RhdGljU3ltYm9sKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdGhpcy5fcmVzb2x2ZVN5bWJvbEZyb21TdW1tYXJ5KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogU29tZSB1c2VycyB1c2UgbGlicmFyaWVzIHRoYXQgd2VyZSBub3QgY29tcGlsZWQgd2l0aCBuZ2MsIGkuZS4gdGhleSBkb24ndFxuICAgICAgICAgICAgICAvLyBoYXZlIHN1bW1hcmllcywgb25seSAuZC50cyBmaWxlcy4gU28gd2UgYWx3YXlzIG5lZWQgdG8gY2hlY2sgYm90aCwgdGhlIHN1bW1hcnlcbiAgICAgICAgICAgICAgLy8gYW5kIG1ldGFkYXRhLlxuICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVTeW1ib2xzT2Yoc3RhdGljU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5yZXNvbHZlZFN5bWJvbHMuZ2V0KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRpY1N5bWJvbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLl9yZXNvbHZlU3ltYm9sTWVtYmVycyA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZW1iZXJzID0gc3RhdGljU3ltYm9sLm1lbWJlcnM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmFzZVJlc29sdmVkU3ltYm9sID0gdGhpcy5yZXNvbHZlU3ltYm9sKHRoaXMuZ2V0U3RhdGljU3ltYm9sKHN0YXRpY1N5bWJvbC5maWxlUGF0aCwgc3RhdGljU3ltYm9sLm5hbWUpKTtcbiAgICAgICAgICBpZiAoIWJhc2VSZXNvbHZlZFN5bWJvbCkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYmFzZU1ldGFkYXRhID0gYmFzZVJlc29sdmVkU3ltYm9sLm1ldGFkYXRhO1xuICAgICAgICAgIGlmIChiYXNlTWV0YWRhdGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzdGF0aWNTeW1ib2wsIHRoaXMuZ2V0U3RhdGljU3ltYm9sKGJhc2VNZXRhZGF0YS5maWxlUGF0aCwgYmFzZU1ldGFkYXRhLm5hbWUsIG1lbWJlcnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoYmFzZU1ldGFkYXRhICYmIGJhc2VNZXRhZGF0YS5fX3N5bWJvbGljID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgIGlmIChiYXNlTWV0YWRhdGEuc3RhdGljcyAmJiBtZW1iZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzdGF0aWNTeW1ib2wsIGJhc2VNZXRhZGF0YS5zdGF0aWNzW21lbWJlcnNbMF1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBiYXNlTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aCAmJiB2YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlW21lbWJlcnNbaV1dO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRTdGF0aWNTeW1ib2woc3RhdGljU3ltYm9sLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5fcmVzb2x2ZVN5bWJvbEZyb21TdW1tYXJ5ID0gZnVuY3Rpb24gKHN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN1bW1hcnkgPSB0aGlzLnN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeShzdGF0aWNTeW1ib2wpO1xuICAgICAgICAgIHJldHVybiBzdW1tYXJ5ID8gbmV3IFJlc29sdmVkU3RhdGljU3ltYm9sKHN0YXRpY1N5bWJvbCwgc3VtbWFyeS5tZXRhZGF0YSkgOiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIGdldFN0YXRpY1N5bWJvbCBwcm9kdWNlcyBhIFR5cGUgd2hvc2UgbWV0YWRhdGEgaXMga25vd24gYnV0IHdob3NlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBsb2FkZWQuXG4gICAgICAgICogQWxsIHR5cGVzIHBhc3NlZCB0byB0aGUgU3RhdGljUmVzb2x2ZXIgc2hvdWxkIGJlIHBzZXVkby10eXBlcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgICAgKiAqXG4gICAgICAgKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uRmlsZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlY2xhcmVkXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUuXG4gICAgICAgKiBAcGFyYW0gez89fSBtZW1iZXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuZ2V0U3RhdGljU3ltYm9sID0gZnVuY3Rpb24gKGRlY2xhcmF0aW9uRmlsZSwgbmFtZSwgbWVtYmVycykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRpY1N5bWJvbENhY2hlLmdldChkZWNsYXJhdGlvbkZpbGUsIG5hbWUsIG1lbWJlcnMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmaWxlUGF0aFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldFN5bWJvbHNPZiA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICAgIC8vIE5vdGU6IFNvbWUgdXNlcnMgdXNlIGxpYnJhcmllcyB0aGF0IHdlcmUgbm90IGNvbXBpbGVkIHdpdGggbmdjLCBpLmUuIHRoZXkgZG9uJ3RcbiAgICAgICAgICAvLyBoYXZlIHN1bW1hcmllcywgb25seSAuZC50cyBmaWxlcy4gU28gd2UgYWx3YXlzIG5lZWQgdG8gY2hlY2sgYm90aCwgdGhlIHN1bW1hcnlcbiAgICAgICAgICAvLyBhbmQgbWV0YWRhdGEuXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltYm9scyA9IG5ldyBTZXQodGhpcy5zdW1tYXJ5UmVzb2x2ZXIuZ2V0U3ltYm9sc09mKGZpbGVQYXRoKSk7XG4gICAgICAgICAgdGhpcy5fY3JlYXRlU3ltYm9sc09mKGZpbGVQYXRoKTtcbiAgICAgICAgICB0aGlzLnJlc29sdmVkU3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFN5bWJvbCkge1xuICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTeW1ib2wuc3ltYm9sLmZpbGVQYXRoID09PSBmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgc3ltYm9scy5hZGQocmVzb2x2ZWRTeW1ib2wuc3ltYm9sKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHN5bWJvbHMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmaWxlUGF0aFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLl9jcmVhdGVTeW1ib2xzT2YgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVkRmlsZVBhdGhzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlc29sdmVkRmlsZVBhdGhzLmFkZChmaWxlUGF0aCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWRTeW1ib2xzID0gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWV0YWRhdGEgPSB0aGlzLmdldE1vZHVsZU1ldGFkYXRhKGZpbGVQYXRoKTtcbiAgICAgICAgICBpZiAobWV0YWRhdGFbJ21ldGFkYXRhJ10pIHtcbiAgICAgICAgICAgICAgLy8gaGFuZGxlIGRpcmVjdCBkZWNsYXJhdGlvbnMgb2YgdGhlIHN5bWJvbFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtZXRhZGF0YVsnbWV0YWRhdGEnXSkuZm9yRWFjaChmdW5jdGlvbiAoc3ltYm9sTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltYm9sTWV0YSA9IG1ldGFkYXRhWydtZXRhZGF0YSddW3N5bWJvbE5hbWVdO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRTeW1ib2xzLnB1c2goX3RoaXMuY3JlYXRlUmVzb2x2ZWRTeW1ib2woX3RoaXMuZ2V0U3RhdGljU3ltYm9sKGZpbGVQYXRoLCBzeW1ib2xOYW1lKSwgc3ltYm9sTWV0YSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaGFuZGxlIHRoZSBzeW1ib2xzIGluIG9uZSBvZiB0aGUgcmUtZXhwb3J0IGxvY2F0aW9uXG4gICAgICAgICAgaWYgKG1ldGFkYXRhWydleHBvcnRzJ10pIHtcbiAgICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihtb2R1bGVFeHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgc3ltYm9scyBpbiB0aGUgbGlzdCBvZiBleHBsaWNpdGx5IHJlLWV4cG9ydGVkIHN5bWJvbHMuXG4gICAgICAgICAgICAgICAgICBpZiAobW9kdWxlRXhwb3J0LmV4cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUV4cG9ydC5leHBvcnQuZm9yRWFjaChmdW5jdGlvbiAoZXhwb3J0U3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN5bWJvbE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3ltYm9sID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sTmFtZSA9IGV4cG9ydFN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbE5hbWUgPSBleHBvcnRTeW1ib2wuYXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltTmFtZSA9IHN5bWJvbE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3ltYm9sICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltTmFtZSA9IGV4cG9ydFN5bWJvbC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVkTW9kdWxlID0gX3RoaXMucmVzb2x2ZU1vZHVsZShtb2R1bGVFeHBvcnQuZnJvbSwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRhcmdldFN5bWJvbCA9IF90aGlzLmdldFN0YXRpY1N5bWJvbChyZXNvbHZlZE1vZHVsZSwgc3ltTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzb3VyY2VTeW1ib2wgPSBfdGhpcy5nZXRTdGF0aWNTeW1ib2woZmlsZVBhdGgsIHN5bWJvbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRTeW1ib2xzLnB1c2gobmV3IFJlc29sdmVkU3RhdGljU3ltYm9sKHNvdXJjZVN5bWJvbCwgdGFyZ2V0U3ltYm9sKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgc3ltYm9scyB2aWEgZXhwb3J0ICogZGlyZWN0aXZlcy5cbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZE1vZHVsZSA9IHRoaXNfMS5yZXNvbHZlTW9kdWxlKG1vZHVsZUV4cG9ydC5mcm9tLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5lc3RlZEV4cG9ydHMgPSB0aGlzXzEuZ2V0U3ltYm9sc09mKHJlc29sdmVkTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkRXhwb3J0cy5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXRTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNvdXJjZVN5bWJvbCA9IF90aGlzLmdldFN0YXRpY1N5bWJvbChmaWxlUGF0aCwgdGFyZ2V0U3ltYm9sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRTeW1ib2xzLnB1c2gobmV3IFJlc29sdmVkU3RhdGljU3ltYm9sKHNvdXJjZVN5bWJvbCwgdGFyZ2V0U3ltYm9sKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBtZXRhZGF0YVsnZXhwb3J0cyddOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUV4cG9ydCA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICAgIF9sb29wXzEobW9kdWxlRXhwb3J0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlZFN5bWJvbHMuZm9yRWFjaChmdW5jdGlvbiAocmVzb2x2ZWRTeW1ib2wpIHsgcmV0dXJuIF90aGlzLnJlc29sdmVkU3ltYm9scy5zZXQocmVzb2x2ZWRTeW1ib2wuc3ltYm9sLCByZXNvbHZlZFN5bWJvbCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VTeW1ib2xcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGFcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5jcmVhdGVSZXNvbHZlZFN5bWJvbCA9IGZ1bmN0aW9uIChzb3VyY2VTeW1ib2wsIG1ldGFkYXRhKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VsZiA9IHRoaXM7XG4gICAgICAgICAgdmFyIFJlZmVyZW5jZVRyYW5zZm9ybWVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgICAgICAgX19leHRlbmRzJDI1KFJlZmVyZW5jZVRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgICAgICAgICAgICBmdW5jdGlvbiBSZWZlcmVuY2VUcmFuc2Zvcm1lcigpIHtcbiAgICAgICAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG1hcFxuICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZ1bmN0aW9uUGFyYW1zXG4gICAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICBSZWZlcmVuY2VUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRTdHJpbmdNYXAgPSBmdW5jdGlvbiAobWFwLCBmdW5jdGlvblBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltYm9saWMgPSBtYXBbJ19fc3ltYm9saWMnXTtcbiAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xpYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9sZExlbiA9IGZ1bmN0aW9uUGFyYW1zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblBhcmFtcy5wdXNoLmFwcGx5KGZ1bmN0aW9uUGFyYW1zLCAobWFwWydwYXJhbWV0ZXJzJ10gfHwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBfc3VwZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwLmNhbGwodGhpcywgbWFwLCBmdW5jdGlvblBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25QYXJhbXMubGVuZ3RoID0gb2xkTGVuO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChzeW1ib2xpYyA9PT0gJ3JlZmVyZW5jZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVfMSA9IG1hcFsnbW9kdWxlJ107XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZV8xID0gbWFwWyduYW1lJ107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZpbGVQYXRoID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IHNlbGYucmVzb2x2ZU1vZHVsZShtb2R1bGVfMSwgc291cmNlU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N5bWJvbGljOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQ291bGQgbm90IHJlc29sdmUgXCIgKyBtb2R1bGVfMSArIFwiIHJlbGF0aXZlIHRvIFwiICsgc291cmNlU3ltYm9sLmZpbGVQYXRoICsgXCIuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzRnVuY3Rpb25QYXJhbSA9IGZ1bmN0aW9uUGFyYW1zLmluZGV4T2YobmFtZV8xKSA+PSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRnVuY3Rpb25QYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBzb3VyY2VTeW1ib2wuZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldFN0YXRpY1N5bWJvbChmaWxlUGF0aCwgbmFtZV8xKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBfX3N5bWJvbGljOiAncmVmZXJlbmNlJywgbmFtZTogbmFtZV8xIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXRTdHJpbmdNYXAuY2FsbCh0aGlzLCBtYXAsIGZ1bmN0aW9uUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIFJlZmVyZW5jZVRyYW5zZm9ybWVyO1xuICAgICAgICAgIH0oVmFsdWVUcmFuc2Zvcm1lcikpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYW5zZm9ybWVkTWV0YSA9IHZpc2l0VmFsdWUobWV0YWRhdGEsIG5ldyBSZWZlcmVuY2VUcmFuc2Zvcm1lcigpLCBbXSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzb3VyY2VTeW1ib2wsIHRyYW5zZm9ybWVkTWV0YSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAqIEBwYXJhbSB7Pz19IHBhdGhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgY29udGV4dCwgcGF0aCkge1xuICAgICAgICAgIGlmICh0aGlzLmVycm9yUmVjb3JkZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5lcnJvclJlY29yZGVyKGVycm9yLCAoY29udGV4dCAmJiBjb250ZXh0LmZpbGVQYXRoKSB8fCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlIGFuIGFic29sdXRlIHBhdGggdG8gYSBtb2R1bGUgZmlsZS5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5nZXRNb2R1bGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVNZXRhZGF0YSA9IHRoaXMubWV0YWRhdGFDYWNoZS5nZXQobW9kdWxlKTtcbiAgICAgICAgICBpZiAoIW1vZHVsZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZU1ldGFkYXRhcyA9IHRoaXMuaG9zdC5nZXRNZXRhZGF0YUZvcihtb2R1bGUpO1xuICAgICAgICAgICAgICBpZiAobW9kdWxlTWV0YWRhdGFzKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXhWZXJzaW9uXzEgPSAtMTtcbiAgICAgICAgICAgICAgICAgIG1vZHVsZU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChtZFsndmVyc2lvbiddID4gbWF4VmVyc2lvbl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZlcnNpb25fMSA9IG1kWyd2ZXJzaW9uJ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1ldGFkYXRhID0gbWQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFtb2R1bGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgbW9kdWxlTWV0YWRhdGEgPVxuICAgICAgICAgICAgICAgICAgICAgIHsgX19zeW1ib2xpYzogJ21vZHVsZScsIHZlcnNpb246IFNVUFBPUlRFRF9TQ0hFTUFfVkVSU0lPTiwgbW9kdWxlOiBtb2R1bGUsIG1ldGFkYXRhOiB7fSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChtb2R1bGVNZXRhZGF0YVsndmVyc2lvbiddICE9IFNVUFBPUlRFRF9TQ0hFTUFfVkVSU0lPTikge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXJyb3JNZXNzYWdlID0gbW9kdWxlTWV0YWRhdGFbJ3ZlcnNpb24nXSA9PSAyID9cbiAgICAgICAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb24gXCIgKyBtb2R1bGVNZXRhZGF0YVsndmVyc2lvbiddICsgXCIgZm9yIG1vZHVsZSBcIiArIG1vZHVsZSArIFwiLiBUaGlzIG1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgbmdjXCIgOlxuICAgICAgICAgICAgICAgICAgICAgIFwiTWV0YWRhdGEgdmVyc2lvbiBtaXNtYXRjaCBmb3IgbW9kdWxlIFwiICsgbW9kdWxlICsgXCIsIGZvdW5kIHZlcnNpb24gXCIgKyBtb2R1bGVNZXRhZGF0YVsndmVyc2lvbiddICsgXCIsIGV4cGVjdGVkIFwiICsgU1VQUE9SVEVEX1NDSEVNQV9WRVJTSU9OO1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSwgbnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUNhY2hlLnNldChtb2R1bGUsIG1vZHVsZU1ldGFkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vZHVsZU1ldGFkYXRhO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVcbiAgICAgICAqIEBwYXJhbSB7P30gc3ltYm9sTmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gY29udGFpbmluZ0ZpbGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5nZXRTeW1ib2xCeU1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGUsIHN5bWJvbE5hbWUsIGNvbnRhaW5pbmdGaWxlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlsZVBhdGggPSB0aGlzLnJlc29sdmVNb2R1bGUobW9kdWxlLCBjb250YWluaW5nRmlsZSk7XG4gICAgICAgICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmVzb2x2ZSBtb2R1bGUgXCIgKyBtb2R1bGUgKyBcIiByZWxhdGl2ZSB0byBcIiArIGNvbnRhaW5pbmdGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGljU3ltYm9sKGZpbGVQYXRoLCBzeW1ib2xOYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5pbmdGaWxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZU1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGUsIGNvbnRhaW5pbmdGaWxlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9zdC5tb2R1bGVOYW1lVG9GaWxlTmFtZShtb2R1bGUsIGNvbnRhaW5pbmdGaWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCByZXNvbHZlIG1vZHVsZSAnXCIgKyBtb2R1bGUgKyBcIicgcmVsYXRpdmUgdG8gZmlsZSBcIiArIGNvbnRhaW5pbmdGaWxlKTtcbiAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihuZXcgZSwgbnVsbCwgY29udGFpbmluZ0ZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RhdGljU3ltYm9sUmVzb2x2ZXI7XG4gIH0oKSk7XG5cbiAgdmFyIEFvdFN1bW1hcnlSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xDYWNoZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBBb3RTdW1tYXJ5UmVzb2x2ZXIoaG9zdCwgc3RhdGljU3ltYm9sQ2FjaGUpIHtcbiAgICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICAgIHRoaXMuc3RhdGljU3ltYm9sQ2FjaGUgPSBzdGF0aWNTeW1ib2xDYWNoZTtcbiAgICAgICAgICB0aGlzLnN1bW1hcnlDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmxvYWRlZEZpbGVQYXRocyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzeW1ib2xcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUuX2Fzc2VydE5vTWVtYmVycyA9IGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICAgICAgICBpZiAoc3ltYm9sLm1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVybmFsIHN0YXRlOiBTdGF0aWNTeW1ib2xzIGluIHN1bW1hcmllcyBjYW4ndCBoYXZlIG1lbWJlcnMhIFwiICsgSlNPTi5zdHJpbmdpZnkoc3ltYm9sKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZVN1bW1hcnkgPSBmdW5jdGlvbiAoc3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgdGhpcy5fYXNzZXJ0Tm9NZW1iZXJzKHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VtbWFyeSA9IHRoaXMuc3VtbWFyeUNhY2hlLmdldChzdGF0aWNTeW1ib2wpO1xuICAgICAgICAgIGlmICghc3VtbWFyeSkge1xuICAgICAgICAgICAgICB0aGlzLl9sb2FkU3VtbWFyeUZpbGUoc3RhdGljU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgc3VtbWFyeSA9IHRoaXMuc3VtbWFyeUNhY2hlLmdldChzdGF0aWNTeW1ib2wpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc3VtbWFyeTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZmlsZVBhdGhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUuZ2V0U3ltYm9sc09mID0gZnVuY3Rpb24gKGZpbGVQYXRoKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFN1bW1hcnlGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnN1bW1hcnlDYWNoZS5rZXlzKCkpLmZpbHRlcihmdW5jdGlvbiAoc3ltYm9sKSB7IHJldHVybiBzeW1ib2wuZmlsZVBhdGggPT09IGZpbGVQYXRoOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZmlsZVBhdGhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFvdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUuX2xvYWRTdW1tYXJ5RmlsZSA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKHRoaXMubG9hZGVkRmlsZVBhdGhzLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvYWRlZEZpbGVQYXRocy5hZGQoZmlsZVBhdGgpO1xuICAgICAgICAgIGlmICghdGhpcy5ob3N0LmlzU291cmNlRmlsZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VtbWFyeUZpbGVQYXRoID0gc3VtbWFyeUZpbGVOYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ganNvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGpzb24gPSB0aGlzLmhvc3QubG9hZFN1bW1hcnkoc3VtbWFyeUZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgc3VtbWFyeSBmaWxlIFwiICsgc3VtbWFyeUZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGpzb24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlYWRTdW1tYXJpZXMgPSBkZXNlcmlhbGl6ZVN1bW1hcmllcyh0aGlzLnN0YXRpY1N5bWJvbENhY2hlLCBqc29uKTtcbiAgICAgICAgICAgICAgICAgIHJlYWRTdW1tYXJpZXMuZm9yRWFjaChmdW5jdGlvbiAoc3VtbWFyeSkgeyBfdGhpcy5zdW1tYXJ5Q2FjaGUuc2V0KHN1bW1hcnkuc3ltYm9sLCBzdW1tYXJ5KTsgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFvdFN1bW1hcnlSZXNvbHZlcjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogIENyZWF0ZXMgYSBuZXcgQW90Q29tcGlsZXIgYmFzZWQgb24gb3B0aW9ucyBhbmQgYSBob3N0LlxuICAgKiBAcGFyYW0gez99IGNvbXBpbGVySG9zdFxuICAgKiBAcGFyYW0gez99IG9wdGlvbnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUFvdENvbXBpbGVyKGNvbXBpbGVySG9zdCwgb3B0aW9ucykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdHJhbnNsYXRpb25zID0gb3B0aW9ucy50cmFuc2xhdGlvbnMgfHwgJyc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cmxSZXNvbHZlciA9IGNyZWF0ZU9mZmxpbmVDb21waWxlVXJsUmVzb2x2ZXIoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN5bWJvbENhY2hlID0gbmV3IFN0YXRpY1N5bWJvbENhY2hlKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdW1tYXJ5UmVzb2x2ZXIgPSBuZXcgQW90U3VtbWFyeVJlc29sdmVyKGNvbXBpbGVySG9zdCwgc3ltYm9sQ2FjaGUpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3ltYm9sUmVzb2x2ZXIgPSBuZXcgU3RhdGljU3ltYm9sUmVzb2x2ZXIoY29tcGlsZXJIb3N0LCBzeW1ib2xDYWNoZSwgc3VtbWFyeVJlc29sdmVyKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRpY1JlZmxlY3RvciA9IG5ldyBTdGF0aWNSZWZsZWN0b3Ioc3ltYm9sUmVzb2x2ZXIpO1xuICAgICAgU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaW5zdGFsbChzdGF0aWNSZWZsZWN0b3IpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaHRtbFBhcnNlciA9IG5ldyBJMThOSHRtbFBhcnNlcihuZXcgSHRtbFBhcnNlcigpLCB0cmFuc2xhdGlvbnMsIG9wdGlvbnMuaTE4bkZvcm1hdCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWcoe1xuICAgICAgICAgIGdlbkRlYnVnSW5mbzogb3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSxcbiAgICAgICAgICBkZWZhdWx0RW5jYXBzdWxhdGlvbjogX2FuZ3VsYXJfY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgICAgICAgICBsb2dCaW5kaW5nVXBkYXRlOiBmYWxzZSxcbiAgICAgICAgICB1c2VKaXQ6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZXIgPSBuZXcgRGlyZWN0aXZlTm9ybWFsaXplcih7IGdldDogZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gY29tcGlsZXJIb3N0LmxvYWRSZXNvdXJjZSh1cmwpOyB9IH0sIHVybFJlc29sdmVyLCBodG1sUGFyc2VyLCBjb25maWcpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwcmVzc2lvblBhcnNlciA9IG5ldyBQYXJzZXIobmV3IExleGVyKCkpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWxlbWVudFNjaGVtYVJlZ2lzdHJ5ID0gbmV3IERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uc29sZSA9IG5ldyBDb25zb2xlKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0bXBsUGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKGV4cHJlc3Npb25QYXJzZXIsIGVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgaHRtbFBhcnNlciwgY29uc29sZSwgW10pO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZXIgPSBuZXcgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIobmV3IE5nTW9kdWxlUmVzb2x2ZXIoc3RhdGljUmVmbGVjdG9yKSwgbmV3IERpcmVjdGl2ZVJlc29sdmVyKHN0YXRpY1JlZmxlY3RvciksIG5ldyBQaXBlUmVzb2x2ZXIoc3RhdGljUmVmbGVjdG9yKSwgc3VtbWFyeVJlc29sdmVyLCBlbGVtZW50U2NoZW1hUmVnaXN0cnksIG5vcm1hbGl6ZXIsIHN0YXRpY1JlZmxlY3Rvcik7XG4gICAgICAvLyBUT0RPKHZpY2IpOiBkbyBub3QgcGFzcyBvcHRpb25zLmkxOG5Gb3JtYXQgaGVyZVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZXIgPSBuZXcgQW90Q29tcGlsZXIoY29tcGlsZXJIb3N0LCByZXNvbHZlciwgdG1wbFBhcnNlciwgbmV3IFN0eWxlQ29tcGlsZXIodXJsUmVzb2x2ZXIpLCBuZXcgVmlld0NvbXBpbGVyKGNvbmZpZywgZWxlbWVudFNjaGVtYVJlZ2lzdHJ5KSwgbmV3IERpcmVjdGl2ZVdyYXBwZXJDb21waWxlcihjb25maWcsIGV4cHJlc3Npb25QYXJzZXIsIGVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgY29uc29sZSksIG5ldyBOZ01vZHVsZUNvbXBpbGVyKCksIG5ldyBUeXBlU2NyaXB0RW1pdHRlcihjb21waWxlckhvc3QpLCBzdW1tYXJ5UmVzb2x2ZXIsIG9wdGlvbnMubG9jYWxlLCBvcHRpb25zLmkxOG5Gb3JtYXQsIG5ldyBBbmltYXRpb25QYXJzZXIoZWxlbWVudFNjaGVtYVJlZ2lzdHJ5KSwgc3ltYm9sUmVzb2x2ZXIpO1xuICAgICAgcmV0dXJuIHsgY29tcGlsZXI6IGNvbXBpbGVyLCByZWZsZWN0b3I6IHN0YXRpY1JlZmxlY3RvciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgKiBAcGFyYW0gez99IHJlc3VsdFZhclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJwcmV0U3RhdGVtZW50cyhzdGF0ZW1lbnRzLCByZXN1bHRWYXIpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0bXRzV2l0aFJldHVybiA9IHN0YXRlbWVudHMuY29uY2F0KFtuZXcgUmV0dXJuU3RhdGVtZW50KHZhcmlhYmxlKHJlc3VsdFZhcikpXSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHggPSBuZXcgX0V4ZWN1dGlvbkNvbnRleHQobnVsbCwgbnVsbCwgbnVsbCwgbmV3IE1hcCgpKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpc2l0b3IgPSBuZXcgU3RhdGVtZW50SW50ZXJwcmV0ZXIoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHZpc2l0b3IudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXRzV2l0aFJldHVybiwgY3R4KTtcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzdWx0KSA/IHJlc3VsdC52YWx1ZSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdmFyTmFtZXNcbiAgICogQHBhcmFtIHs/fSB2YXJWYWx1ZXNcbiAgICogQHBhcmFtIHs/fSBzdGF0ZW1lbnRzXG4gICAqIEBwYXJhbSB7P30gY3R4XG4gICAqIEBwYXJhbSB7P30gdmlzaXRvclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2V4ZWN1dGVGdW5jdGlvblN0YXRlbWVudHModmFyTmFtZXMsIHZhclZhbHVlcywgc3RhdGVtZW50cywgY3R4LCB2aXNpdG9yKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZEN0eCA9IGN0eC5jcmVhdGVDaGlsZFdpaHRMb2NhbFZhcnMoKTtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB2YXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkQ3R4LnZhcnMuc2V0KHZhck5hbWVzW2ldLCB2YXJWYWx1ZXNbaV0pO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gdmlzaXRvci52aXNpdEFsbFN0YXRlbWVudHMoc3RhdGVtZW50cywgY2hpbGRDdHgpO1xuICAgICAgcmV0dXJuIGlzUHJlc2VudChyZXN1bHQpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgfVxuICB2YXIgX0V4ZWN1dGlvbkNvbnRleHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZVxuICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBfRXhlY3V0aW9uQ29udGV4dChwYXJlbnQsIGluc3RhbmNlLCBjbGFzc05hbWUsIHZhcnMpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgICAgdGhpcy52YXJzID0gdmFycztcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgX0V4ZWN1dGlvbkNvbnRleHQucHJvdG90eXBlLmNyZWF0ZUNoaWxkV2lodExvY2FsVmFycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IF9FeGVjdXRpb25Db250ZXh0KHRoaXMsIHRoaXMuaW5zdGFuY2UsIHRoaXMuY2xhc3NOYW1lLCBuZXcgTWFwKCkpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBfRXhlY3V0aW9uQ29udGV4dDtcbiAgfSgpKTtcbiAgdmFyIFJldHVyblZhbHVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSZXR1cm5WYWx1ZSh2YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZXR1cm5WYWx1ZTtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gX2NsYXNzU3RtdFxuICAgKiBAcGFyYW0gez99IF9jdHhcbiAgICogQHBhcmFtIHs/fSBfdmlzaXRvclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlRHluYW1pY0NsYXNzKF9jbGFzc1N0bXQsIF9jdHgsIF92aXNpdG9yKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wZXJ0eURlc2NyaXB0b3JzID0ge307XG4gICAgICBfY2xhc3NTdG10LmdldHRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZ2V0dGVyKSB7XG4gICAgICAgICAgLy8gTm90ZTogdXNlIGBmdW5jdGlvbmAgaW5zdGVhZCBvZiBhcnJvdyBmdW5jdGlvbiB0byBjYXB0dXJlIGB0aGlzYFxuICAgICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNbZ2V0dGVyLm5hbWVdID0ge1xuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluc3RhbmNlQ3R4ID0gbmV3IF9FeGVjdXRpb25Db250ZXh0KF9jdHgsIHRoaXMsIF9jbGFzc1N0bXQubmFtZSwgX2N0eC52YXJzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uU3RhdGVtZW50cyhbXSwgW10sIGdldHRlci5ib2R5LCBpbnN0YW5jZUN0eCwgX3Zpc2l0b3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgX2NsYXNzU3RtdC5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtTmFtZXMgPSBtZXRob2QucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0pIHsgcmV0dXJuIHBhcmFtLm5hbWU7IH0pO1xuICAgICAgICAgIC8vIE5vdGU6IHVzZSBgZnVuY3Rpb25gIGluc3RlYWQgb2YgYXJyb3cgZnVuY3Rpb24gdG8gY2FwdHVyZSBgdGhpc2BcbiAgICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzW21ldGhvZC5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluc3RhbmNlQ3R4ID0gbmV3IF9FeGVjdXRpb25Db250ZXh0KF9jdHgsIHRoaXMsIF9jbGFzc1N0bXQubmFtZSwgX2N0eC52YXJzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uU3RhdGVtZW50cyhwYXJhbU5hbWVzLCBhcmdzLCBtZXRob2QuYm9keSwgaW5zdGFuY2VDdHgsIF92aXNpdG9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN0b3JQYXJhbU5hbWVzID0gX2NsYXNzU3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gcGFyYW0ubmFtZTsgfSk7XG4gICAgICAvLyBOb3RlOiB1c2UgYGZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGFycm93IGZ1bmN0aW9uIHRvIGNhcHR1cmUgYHRoaXNgXG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICBhcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnN0YW5jZUN0eCA9IG5ldyBfRXhlY3V0aW9uQ29udGV4dChfY3R4LCB0aGlzLCBfY2xhc3NTdG10Lm5hbWUsIF9jdHgudmFycyk7XG4gICAgICAgICAgX2NsYXNzU3RtdC5maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHsgX3RoaXNbZmllbGQubmFtZV0gPSB1bmRlZmluZWQ7IH0pO1xuICAgICAgICAgIF9leGVjdXRlRnVuY3Rpb25TdGF0ZW1lbnRzKGN0b3JQYXJhbU5hbWVzLCBhcmdzLCBfY2xhc3NTdG10LmNvbnN0cnVjdG9yTWV0aG9kLmJvZHksIGluc3RhbmNlQ3R4LCBfdmlzaXRvcik7XG4gICAgICB9O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VwZXJDbGFzcyA9IF9jbGFzc1N0bXQucGFyZW50ID8gX2NsYXNzU3RtdC5wYXJlbnQudmlzaXRFeHByZXNzaW9uKF92aXNpdG9yLCBfY3R4KSA6IE9iamVjdDtcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSwgcHJvcGVydHlEZXNjcmlwdG9ycyk7XG4gICAgICByZXR1cm4gY3RvcjtcbiAgfVxuICB2YXIgU3RhdGVtZW50SW50ZXJwcmV0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU3RhdGVtZW50SW50ZXJwcmV0ZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUuZGVidWdBc3QgPSBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBkZWJ1Z091dHB1dEFzdEFzVHlwZVNjcmlwdChhc3QpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXREZWNsYXJlVmFyU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICBjdHgudmFycy5zZXQoc3RtdC5uYW1lLCBzdG10LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFdyaXRlVmFyRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyckN0eCA9IGN0eDtcbiAgICAgICAgICB3aGlsZSAoY3VyckN0eCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyQ3R4LnZhcnMuaGFzKGV4cHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIGN1cnJDdHgudmFycy5zZXQoZXhwci5uYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3VyckN0eCA9IGN1cnJDdHgucGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgZGVjbGFyZWQgdmFyaWFibGUgXCIgKyBleHByLm5hbWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRSZWFkVmFyRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhck5hbWUgPSBhc3QubmFtZTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGFzdC5idWlsdGluKSkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGFzdC5idWlsdGluKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuU3VwZXI6XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5pbnN0YW5jZS5fX3Byb3RvX187XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuVGhpczpcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4Lmluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluVmFyLkNhdGNoRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9IENBVENIX0VSUk9SX1ZBUiQyO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluVmFyLkNhdGNoU3RhY2s6XG4gICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9IENBVENIX1NUQUNLX1ZBUiQyO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGJ1aWx0aW4gdmFyaWFibGUgXCIgKyBhc3QuYnVpbHRpbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyckN0eCA9IGN0eDtcbiAgICAgICAgICB3aGlsZSAoY3VyckN0eCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyQ3R4LnZhcnMuaGFzKHZhck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY3VyckN0eC52YXJzLmdldCh2YXJOYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjdXJyQ3R4ID0gY3VyckN0eC5wYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBkZWNsYXJlZCB2YXJpYWJsZSBcIiArIHZhck5hbWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHByXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0V3JpdGVLZXlFeHByID0gZnVuY3Rpb24gKGV4cHIsIGN0eCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY2VpdmVyID0gZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleCA9IGV4cHIuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIHJlY2VpdmVyW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFdyaXRlUHJvcEV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjZWl2ZXIgPSBleHByLnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICByZWNlaXZlcltleHByLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBleHByXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0SW52b2tlTWV0aG9kRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNlaXZlciA9IGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhleHByLmFyZ3MsIGN0eCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0O1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZXhwci5idWlsdGluKSkge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGV4cHIuYnVpbHRpbikge1xuICAgICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLkNvbmNhdEFycmF5OlxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlY2VpdmVyLmNvbmNhdC5hcHBseShyZWNlaXZlciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5NZXRob2QuU3Vic2NyaWJlT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5zdWJzY3JpYmUoeyBuZXh0OiBhcmdzWzBdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLkJpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZXIuYmluZC5hcHBseShyZWNlaXZlciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiBtZXRob2QgXCIgKyBleHByLmJ1aWx0aW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlcltleHByLm5hbWVdLmFwcGx5KHJlY2VpdmVyLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEludm9rZUZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcmdzID0gdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKHN0bXQuYXJncywgY3R4KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmbkV4cHIgPSBzdG10LmZuO1xuICAgICAgICAgIGlmIChmbkV4cHIgaW5zdGFuY2VvZiBSZWFkVmFyRXhwciAmJiBmbkV4cHIuYnVpbHRpbiA9PT0gQnVpbHRpblZhci5TdXBlcikge1xuICAgICAgICAgICAgICBjdHguaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmFwcGx5KGN0eC5pbnN0YW5jZSwgYXJncyk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm4gPSBzdG10LmZuLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0UmV0dXJuU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJldHVyblZhbHVlKHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCkpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbGF6eiA9IGNyZWF0ZUR5bmFtaWNDbGFzcyhzdG10LCBjdHgsIHRoaXMpO1xuICAgICAgICAgIGN0eC52YXJzLnNldChzdG10Lm5hbWUsIGNsYXp6KTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIHJldHVybiBzdG10LmV4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRJZlN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uZGl0aW9uID0gc3RtdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KHN0bXQuZmFsc2VDYXNlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5mYWxzZUNhc2UsIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0VHJ5Q2F0Y2hTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmJvZHlTdG10cywgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRDdHggPSBjdHguY3JlYXRlQ2hpbGRXaWh0TG9jYWxWYXJzKCk7XG4gICAgICAgICAgICAgIGNoaWxkQ3R4LnZhcnMuc2V0KENBVENIX0VSUk9SX1ZBUiQyLCBlKTtcbiAgICAgICAgICAgICAgY2hpbGRDdHgudmFycy5zZXQoQ0FUQ0hfU1RBQ0tfVkFSJDIsIGUuc3RhY2spO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5jYXRjaFN0bXRzLCBjaGlsZEN0eCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0VGhyb3dTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIHRocm93IHN0bXQuZXJyb3IudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdENvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0SW5zdGFudGlhdGVFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXJncyA9IHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY3R4KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjbGF6eiA9IGFzdC5jbGFzc0V4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIG5ldyAoY2xhenouYmluZC5hcHBseShjbGF6eiwgW3ZvaWQgMF0uY29uY2F0KGFyZ3MpKSkoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHsgcmV0dXJuIGFzdC52YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRFeHRlcm5hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICByZXR1cm4gYXN0LnZhbHVlLnJlZmVyZW5jZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgaWYgKGFzdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzdC50cnVlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNQcmVzZW50KGFzdC5mYWxzZUNhc2UpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhc3QuZmFsc2VDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Tm90RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIHJldHVybiAhYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICByZXR1cm4gYXN0LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbU5hbWVzID0gYXN0LnBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtKSB7IHJldHVybiBwYXJhbS5uYW1lOyB9KTtcbiAgICAgICAgICByZXR1cm4gX2RlY2xhcmVGbihwYXJhbU5hbWVzLCBhc3Quc3RhdGVtZW50cywgY3R4LCB0aGlzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdERlY2xhcmVGdW5jdGlvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1OYW1lcyA9IHN0bXQucGFyYW1zLm1hcChmdW5jdGlvbiAocGFyYW0pIHsgcmV0dXJuIHBhcmFtLm5hbWU7IH0pO1xuICAgICAgICAgIGN0eC52YXJzLnNldChzdG10Lm5hbWUsIF9kZWNsYXJlRm4ocGFyYW1OYW1lcywgc3RtdC5zdGF0ZW1lbnRzLCBjdHgsIHRoaXMpKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0QmluYXJ5T3BlcmF0b3JFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhc3QubGhzLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByaHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBhc3QucmhzLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfTtcbiAgICAgICAgICBzd2l0Y2ggKGFzdC5vcGVyYXRvcikge1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkVxdWFsczpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSA9PSByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5JZGVudGljYWw6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPT09IHJocygpO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLk5vdEVxdWFsczpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAhPSByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Ob3RJZGVudGljYWw6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgIT09IHJocygpO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkFuZDpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAmJiByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5PcjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSB8fCByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5QbHVzOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocygpICsgcmhzKCk7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTWludXM6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgLSByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5EaXZpZGU6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgLyByaHMoKTtcbiAgICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5NdWx0aXBseTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAqIHJocygpO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLk1vZHVsbzpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAlIHJocygpO1xuICAgICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkxvd2VyOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocygpIDwgcmhzKCk7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTG93ZXJFcXVhbHM6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPD0gcmhzKCk7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuQmlnZ2VyOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocygpID4gcmhzKCk7XG4gICAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuQmlnZ2VyRXF1YWxzOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxocygpID49IHJocygpO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcGVyYXRvciBcIiArIGFzdC5vcGVyYXRvcik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZXJbYXN0Lm5hbWVdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFJlYWRLZXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvcCA9IGFzdC5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcmVjZWl2ZXJbcHJvcF07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5lbnRyaWVzLCBjdHgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0ge307XG4gICAgICAgICAgYXN0LmVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuICgocmVzdWx0KSlbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbnNcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRBbGxFeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChleHByZXNzaW9ucywgY3R4KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnMubWFwKGZ1bmN0aW9uIChleHByKSB7IHJldHVybiBleHByLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRBbGxTdGF0ZW1lbnRzID0gZnVuY3Rpb24gKHN0YXRlbWVudHMsIGN0eCkge1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0bXQgPSBzdGF0ZW1lbnRzW2ldO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWwgPSBzdG10LnZpc2l0U3RhdGVtZW50KHRoaXMsIGN0eCk7XG4gICAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBSZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gU3RhdGVtZW50SW50ZXJwcmV0ZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhck5hbWVzXG4gICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgKiBAcGFyYW0gez99IGN0eFxuICAgKiBAcGFyYW0gez99IHZpc2l0b3JcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9kZWNsYXJlRm4odmFyTmFtZXMsIHN0YXRlbWVudHMsIGN0eCwgdmlzaXRvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIGFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfZXhlY3V0ZUZ1bmN0aW9uU3RhdGVtZW50cyh2YXJOYW1lcywgYXJncywgc3RhdGVtZW50cywgY3R4LCB2aXNpdG9yKTtcbiAgICAgIH07XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ0FUQ0hfRVJST1JfVkFSJDIgPSAnZXJyb3InO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDQVRDSF9TVEFDS19WQVIkMiA9ICdzdGFjayc7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDI3ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQyNyhBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IoKSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGN0eC5wdXNoQ2xhc3Moc3RtdCk7XG4gICAgICAgICAgdGhpcy5fdmlzaXRDbGFzc0NvbnN0cnVjdG9yKHN0bXQsIGN0eCk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChzdG10LnBhcmVudCkpIHtcbiAgICAgICAgICAgICAgY3R4LnByaW50KHN0bXQubmFtZSArIFwiLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXCIpO1xuICAgICAgICAgICAgICBzdG10LnBhcmVudC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICAgICAgY3R4LnByaW50bG4oXCIucHJvdG90eXBlKTtcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0bXQuZ2V0dGVycy5mb3JFYWNoKGZ1bmN0aW9uIChnZXR0ZXIpIHsgcmV0dXJuIF90aGlzLl92aXNpdENsYXNzR2V0dGVyKHN0bXQsIGdldHRlciwgY3R4KTsgfSk7XG4gICAgICAgICAgc3RtdC5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgeyByZXR1cm4gX3RoaXMuX3Zpc2l0Q2xhc3NNZXRob2Qoc3RtdCwgbWV0aG9kLCBjdHgpOyB9KTtcbiAgICAgICAgICBjdHgucG9wQ2xhc3MoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0Q2xhc3NDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnQoXCJmdW5jdGlvbiBcIiArIHN0bXQubmFtZSArIFwiKFwiKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHN0bXQuY29uc3RydWN0b3JNZXRob2QpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKHN0bXQuY29uc3RydWN0b3JNZXRob2QucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHJpbnRsbihcIikge1wiKTtcbiAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChzdG10LmNvbnN0cnVjdG9yTWV0aG9kKSkge1xuICAgICAgICAgICAgICBpZiAoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGN0eC5wcmludGxuKFwidmFyIHNlbGYgPSB0aGlzO1wiKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuY29uc3RydWN0b3JNZXRob2QuYm9keSwgY3R4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCJ9XCIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdG10XG4gICAgICAgKiBAcGFyYW0gez99IGdldHRlclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0Q2xhc3NHZXR0ZXIgPSBmdW5jdGlvbiAoc3RtdCwgZ2V0dGVyLCBjdHgpIHtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eShcIiArIHN0bXQubmFtZSArIFwiLnByb3RvdHlwZSwgJ1wiICsgZ2V0dGVyLm5hbWUgKyBcIicsIHsgZ2V0OiBmdW5jdGlvbigpIHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIGlmIChnZXR0ZXIuYm9keS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludGxuKFwidmFyIHNlbGYgPSB0aGlzO1wiKTtcbiAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoZ2V0dGVyLmJvZHksIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIn19KTtcIik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRDbGFzc01ldGhvZCA9IGZ1bmN0aW9uIChzdG10LCBtZXRob2QsIGN0eCkge1xuICAgICAgICAgIGN0eC5wcmludChzdG10Lm5hbWUgKyBcIi5wcm90b3R5cGUuXCIgKyBtZXRob2QubmFtZSArIFwiID0gZnVuY3Rpb24oXCIpO1xuICAgICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKG1ldGhvZC5wYXJhbXMsIGN0eCk7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCIpIHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIGlmIChtZXRob2QuYm9keS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGN0eC5wcmludGxuKFwidmFyIHNlbGYgPSB0aGlzO1wiKTtcbiAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMobWV0aG9kLmJvZHksIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIn07XCIpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhc3RcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgICBpZiAoYXN0LmJ1aWx0aW4gPT09IEJ1aWx0aW5WYXIuVGhpcykge1xuICAgICAgICAgICAgICBjdHgucHJpbnQoJ3NlbGYnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoYXN0LmJ1aWx0aW4gPT09IEJ1aWx0aW5WYXIuU3VwZXIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3N1cGVyJyBuZWVkcyB0byBiZSBoYW5kbGVkIGF0IGEgcGFyZW50IGFzdCBub2RlLCBub3QgYXQgdGhlIHZhcmlhYmxlIGxldmVsIVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudmlzaXRSZWFkVmFyRXhwci5jYWxsKHRoaXMsIGFzdCwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0bXRcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50KFwidmFyIFwiICsgc3RtdC5uYW1lICsgXCIgPSBcIik7XG4gICAgICAgICAgc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICBjdHgucHJpbnRsbihcIjtcIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFzdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDYXN0RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXhwclxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm5FeHByID0gZXhwci5mbjtcbiAgICAgICAgICBpZiAoZm5FeHByIGluc3RhbmNlb2YgUmVhZFZhckV4cHIgJiYgZm5FeHByLmJ1aWx0aW4gPT09IEJ1aWx0aW5WYXIuU3VwZXIpIHtcbiAgICAgICAgICAgICAgY3R4LmN1cnJlbnRDbGFzcy5wYXJlbnQudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgICAgIGN0eC5wcmludChcIi5jYWxsKHRoaXNcIik7XG4gICAgICAgICAgICAgIGlmIChleHByLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY3R4LnByaW50KFwiLCBcIik7XG4gICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoZXhwci5hcmdzLCBjdHgsICcsJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3R4LnByaW50KFwiKVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIuY2FsbCh0aGlzLCBleHByLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICAgIGN0eC5wcmludChcImZ1bmN0aW9uKFwiKTtcbiAgICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhhc3QucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiKSB7XCIpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhhc3Quc3RhdGVtZW50cywgY3R4KTtcbiAgICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgICAgY3R4LnByaW50KFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlRnVuY3Rpb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICAgIGN0eC5wcmludChcImZ1bmN0aW9uIFwiICsgc3RtdC5uYW1lICsgXCIoXCIpO1xuICAgICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKHN0bXQucGFyYW1zLCBjdHgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwiKSB7XCIpO1xuICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LnN0YXRlbWVudHMsIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3RtdFxuICAgICAgICogQHBhcmFtIHs/fSBjdHhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRUcnlDYXRjaFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgICAgY3R4LnByaW50bG4oXCJ0cnkge1wiKTtcbiAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5ib2R5U3RtdHMsIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifSBjYXRjaCAoXCIgKyBDQVRDSF9FUlJPUl9WQVIkMS5uYW1lICsgXCIpIHtcIik7XG4gICAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhdGNoU3RtdHMgPSBbKENBVENIX1NUQUNLX1ZBUiQxLnNldChDQVRDSF9FUlJPUl9WQVIkMS5wcm9wKCdzdGFjaycpKS50b0RlY2xTdG10KG51bGwsIFtcbiAgICAgICAgICAgICAgICAgIFN0bXRNb2RpZmllci5GaW5hbFxuICAgICAgICAgICAgICBdKSldLmNvbmNhdChzdG10LmNhdGNoU3RtdHMpO1xuICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKGNhdGNoU3RtdHMsIGN0eCk7XG4gICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgIGN0eC5wcmludGxuKFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zXG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjdHgpIHtcbiAgICAgICAgICB0aGlzLnZpc2l0QWxsT2JqZWN0cyhmdW5jdGlvbiAocGFyYW0pIHsgcmV0dXJuIGN0eC5wcmludChwYXJhbS5uYW1lKTsgfSwgcGFyYW1zLCBjdHgsICcsJyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1ldGhvZFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5nZXRCdWlsdGluTWV0aG9kTmFtZSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5Db25jYXRBcnJheTpcbiAgICAgICAgICAgICAgICAgIG5hbWUgPSAnY29uY2F0JztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5NZXRob2QuU3Vic2NyaWJlT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICAgIG5hbWUgPSAnc3Vic2NyaWJlJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5NZXRob2QuQmluZDpcbiAgICAgICAgICAgICAgICAgIG5hbWUgPSAnYmluZCc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiBtZXRob2Q6IFwiICsgbWV0aG9kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvcjtcbiAgfShBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDI2ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzb3VyY2VVcmxcbiAgICogQHBhcmFtIHs/fSBleHByXG4gICAqIEBwYXJhbSB7P30gZGVjbGFyYXRpb25zXG4gICAqIEBwYXJhbSB7P30gdmFyc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXZhbEV4cHJlc3Npb24oc291cmNlVXJsLCBleHByLCBkZWNsYXJhdGlvbnMsIHZhcnMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuQm9keSA9IGRlY2xhcmF0aW9ucyArIFwiXFxucmV0dXJuIFwiICsgZXhwciArIFwiXFxuLy8jIHNvdXJjZVVSTD1cIiArIHNvdXJjZVVybDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuQXJnTmFtZXMgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuQXJnVmFsdWVzID0gW107XG4gICAgICBmb3IgKHZhciBhcmdOYW1lIGluIHZhcnMpIHtcbiAgICAgICAgICBmbkFyZ05hbWVzLnB1c2goYXJnTmFtZSk7XG4gICAgICAgICAgZm5BcmdWYWx1ZXMucHVzaCh2YXJzW2FyZ05hbWVdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoRnVuY3Rpb24sIFt2b2lkIDBdLmNvbmNhdChmbkFyZ05hbWVzLmNvbmNhdChmbkJvZHkpKSkpKCkuYXBwbHkodm9pZCAwLCBmbkFyZ1ZhbHVlcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc291cmNlVXJsXG4gICAqIEBwYXJhbSB7P30gc3RhdGVtZW50c1xuICAgKiBAcGFyYW0gez99IHJlc3VsdFZhclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaml0U3RhdGVtZW50cyhzb3VyY2VVcmwsIHN0YXRlbWVudHMsIHJlc3VsdFZhcikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udmVydGVyID0gbmV3IEppdEVtaXR0ZXJWaXNpdG9yKCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdHggPSBFbWl0dGVyVmlzaXRvckNvbnRleHQuY3JlYXRlUm9vdChbcmVzdWx0VmFyXSk7XG4gICAgICBjb252ZXJ0ZXIudmlzaXRBbGxTdGF0ZW1lbnRzKHN0YXRlbWVudHMsIGN0eCk7XG4gICAgICByZXR1cm4gZXZhbEV4cHJlc3Npb24oc291cmNlVXJsLCByZXN1bHRWYXIsIGN0eC50b1NvdXJjZSgpLCBjb252ZXJ0ZXIuZ2V0QXJncygpKTtcbiAgfVxuICB2YXIgSml0RW1pdHRlclZpc2l0b3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDI2KEppdEVtaXR0ZXJWaXNpdG9yLCBfc3VwZXIpO1xuICAgICAgZnVuY3Rpb24gSml0RW1pdHRlclZpc2l0b3IoKSB7XG4gICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhpcy5fZXZhbEFyZ05hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5fZXZhbEFyZ1ZhbHVlcyA9IFtdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuZ2V0QXJncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB7fTtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdGhpcy5fZXZhbEFyZ05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFt0aGlzLl9ldmFsQXJnTmFtZXNbaV1dID0gdGhpcy5fZXZhbEFyZ1ZhbHVlc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYXN0XG4gICAgICAgKiBAcGFyYW0gez99IGN0eFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBhc3QudmFsdWUucmVmZXJlbmNlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlkID0gdGhpcy5fZXZhbEFyZ1ZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGlkID0gdGhpcy5fZXZhbEFyZ1ZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgIHRoaXMuX2V2YWxBcmdWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMSA9IGlkZW50aWZpZXJOYW1lKGFzdC52YWx1ZSkgfHwgJ3ZhbCc7XG4gICAgICAgICAgICAgIHRoaXMuX2V2YWxBcmdOYW1lcy5wdXNoKFwiaml0X1wiICsgbmFtZV8xICsgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHgucHJpbnQodGhpcy5fZXZhbEFyZ05hbWVzW2lkXSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEppdEVtaXR0ZXJWaXNpdG9yO1xuICB9KEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvcikpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZGVjb3JhdGUkMTcgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbiAgfTtcbiAgdmFyIF9fbWV0YWRhdGEkMTcgPSAodGhpcyAmJiB0aGlzLl9fbWV0YWRhdGEpIHx8IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEoaywgdik7XG4gIH07XG4gIC8qKlxuICAgKiAgQW4gaW50ZXJuYWwgbW9kdWxlIG9mIHRoZSBBbmd1bGFyIGNvbXBpbGVyIHRoYXQgYmVnaW5zIHdpdGggY29tcG9uZW50IHR5cGVzLFxuICAgICogZXh0cmFjdHMgdGVtcGxhdGVzLCBhbmQgZXZlbnR1YWxseSBwcm9kdWNlcyBhIGNvbXBpbGVkIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudFxuICAgICogcmVhZHkgZm9yIGxpbmtpbmcgaW50byBhbiBhcHBsaWNhdGlvbi5cbiAgICAqICpcbiAgICAqIGZyb20gYSB0cnVzdGVkIHNvdXJjZS4gQXR0YWNrZXItY29udHJvbGxlZCBkYXRhIGludHJvZHVjZWQgYnkgYSB0ZW1wbGF0ZSBjb3VsZCBleHBvc2UgeW91clxuICAgICogYXBwbGljYXRpb24gdG8gWFNTIHJpc2tzLiAgRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlIFtTZWN1cml0eSBHdWlkZV0oaHR0cDovL2cuY28vbmcvc2VjdXJpdHkpLlxuICAgKi9cbiAgdmFyIEppdENvbXBpbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gX21ldGFkYXRhUmVzb2x2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX3RlbXBsYXRlUGFyc2VyXG4gICAgICAgKiBAcGFyYW0gez99IF9zdHlsZUNvbXBpbGVyXG4gICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29tcGlsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX25nTW9kdWxlQ29tcGlsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gX2RpcmVjdGl2ZVdyYXBwZXJDb21waWxlclxuICAgICAgICogQHBhcmFtIHs/fSBfY29tcGlsZXJDb25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gX2FuaW1hdGlvblBhcnNlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBKaXRDb21waWxlcihfaW5qZWN0b3IsIF9tZXRhZGF0YVJlc29sdmVyLCBfdGVtcGxhdGVQYXJzZXIsIF9zdHlsZUNvbXBpbGVyLCBfdmlld0NvbXBpbGVyLCBfbmdNb2R1bGVDb21waWxlciwgX2RpcmVjdGl2ZVdyYXBwZXJDb21waWxlciwgX2NvbXBpbGVyQ29uZmlnLCBfYW5pbWF0aW9uUGFyc2VyKSB7XG4gICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7XG4gICAgICAgICAgdGhpcy5fbWV0YWRhdGFSZXNvbHZlciA9IF9tZXRhZGF0YVJlc29sdmVyO1xuICAgICAgICAgIHRoaXMuX3RlbXBsYXRlUGFyc2VyID0gX3RlbXBsYXRlUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX3N0eWxlQ29tcGlsZXIgPSBfc3R5bGVDb21waWxlcjtcbiAgICAgICAgICB0aGlzLl92aWV3Q29tcGlsZXIgPSBfdmlld0NvbXBpbGVyO1xuICAgICAgICAgIHRoaXMuX25nTW9kdWxlQ29tcGlsZXIgPSBfbmdNb2R1bGVDb21waWxlcjtcbiAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVXcmFwcGVyQ29tcGlsZXIgPSBfZGlyZWN0aXZlV3JhcHBlckNvbXBpbGVyO1xuICAgICAgICAgIHRoaXMuX2NvbXBpbGVyQ29uZmlnID0gX2NvbXBpbGVyQ29uZmlnO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblBhcnNlciA9IF9hbmltYXRpb25QYXJzZXI7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX2NvbXBpbGVkSG9zdFRlbXBsYXRlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWREaXJlY3RpdmVXcmFwcGVyQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkNvbXBpbGVyID0gbmV3IEFuaW1hdGlvbkNvbXBpbGVyKCk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSml0Q29tcGlsZXIucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlU3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVNb2R1bGVBbmRDb21wb25lbnRzKG1vZHVsZVR5cGUsIHRydWUpLnN5bmNSZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQXN5bmMgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb21waWxlTW9kdWxlQW5kQ29tcG9uZW50cyhtb2R1bGVUeXBlLCBmYWxzZSkuYXN5bmNSZXN1bHQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50cyhtb2R1bGVUeXBlLCB0cnVlKS5zeW5jUmVzdWx0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzKG1vZHVsZVR5cGUsIGZhbHNlKS5hc3luY1Jlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuZ2V0TmdDb250ZW50U2VsZWN0b3JzID0gZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlID0gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmdldChjb21wb25lbnQpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNvbXBvbmVudCBcIiArIHN0cmluZ2lmeShjb21wb25lbnQpICsgXCIgaXMgbm90IHlldCBjb21waWxlZCFcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5jb21wTWV0YS50ZW1wbGF0ZS5uZ0NvbnRlbnRTZWxlY3RvcnM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gaXNTeW5jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVNb2R1bGVBbmRDb21wb25lbnRzID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGlzU3luYykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG9hZGluZ1Byb21pc2UgPSB0aGlzLl9sb2FkTW9kdWxlcyhtb2R1bGVUeXBlLCBpc1N5bmMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNyZWF0ZVJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2NvbXBpbGVDb21wb25lbnRzKG1vZHVsZVR5cGUsIG51bGwpO1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NvbXBpbGVNb2R1bGUobW9kdWxlVHlwZSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY0FzeW5jUmVzdWx0KGNyZWF0ZVJlc3VsdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY0FzeW5jUmVzdWx0KG51bGwsIGxvYWRpbmdQcm9taXNlLnRoZW4oY3JlYXRlUmVzdWx0KSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGlzU3luY1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlLCBpc1N5bmMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvYWRpbmdQcm9taXNlID0gdGhpcy5fbG9hZE1vZHVsZXMobW9kdWxlVHlwZSwgaXNTeW5jKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjcmVhdGVSZXN1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBvbmVudEZhY3RvcmllcyA9IFtdO1xuICAgICAgICAgICAgICBfdGhpcy5fY29tcGlsZUNvbXBvbmVudHMobW9kdWxlVHlwZSwgY29tcG9uZW50RmFjdG9yaWVzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfYW5ndWxhcl9jb3JlLk1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXMoX3RoaXMuX2NvbXBpbGVNb2R1bGUobW9kdWxlVHlwZSksIGNvbXBvbmVudEZhY3Rvcmllcyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY0FzeW5jUmVzdWx0KGNyZWF0ZVJlc3VsdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU3luY0FzeW5jUmVzdWx0KG51bGwsIGxvYWRpbmdQcm9taXNlLnRoZW4oY3JlYXRlUmVzdWx0KSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtYWluTW9kdWxlXG4gICAgICAgKiBAcGFyYW0gez99IGlzU3luY1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9sb2FkTW9kdWxlcyA9IGZ1bmN0aW9uIChtYWluTW9kdWxlLCBpc1N5bmMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvYWRpbmdQcm9taXNlcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlID0gdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXROZ01vZHVsZU1ldGFkYXRhKG1haW5Nb2R1bGUpO1xuICAgICAgICAgIC8vIE5vdGU6IHRoZSBsb2FkaW5nUHJvbWlzZSBmb3IgYSBtb2R1bGUgb25seSBpbmNsdWRlcyB0aGUgbG9hZGluZyBvZiB0aGUgZXhwb3J0ZWQgZGlyZWN0aXZlc1xuICAgICAgICAgIC8vIG9mIGltcG9ydGVkIG1vZHVsZXMuXG4gICAgICAgICAgLy8gSG93ZXZlciwgZm9yIHJ1bnRpbWUgY29tcGlsYXRpb24sIHdlIHdhbnQgdG8gdHJhbnNpdGl2ZWx5IGNvbXBpbGUgYWxsIG1vZHVsZXMsXG4gICAgICAgICAgLy8gc28gd2UgYWxzbyBuZWVkIHRvIGNhbGwgbG9hZE5nTW9kdWxlTWV0YWRhdGEgZm9yIGFsbCBuZXN0ZWQgbW9kdWxlcy5cbiAgICAgICAgICBuZ01vZHVsZS50cmFuc2l0aXZlTW9kdWxlLm1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxNb2R1bGVNZXRhKSB7XG4gICAgICAgICAgICAgIGxvYWRpbmdQcm9taXNlcy5wdXNoKF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmxvYWROZ01vZHVsZURpcmVjdGl2ZUFuZFBpcGVNZXRhZGF0YShsb2NhbE1vZHVsZU1ldGEucmVmZXJlbmNlLCBpc1N5bmMpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZ1Byb21pc2VzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nTW9kdWxlRmFjdG9yeSA9IHRoaXMuX2NvbXBpbGVkTmdNb2R1bGVDYWNoZS5nZXQobW9kdWxlVHlwZSk7XG4gICAgICAgICAgaWYgKCFuZ01vZHVsZUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlTWV0YV8xID0gdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXROZ01vZHVsZU1ldGFkYXRhKG1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAvLyBBbHdheXMgcHJvdmlkZSBhIGJvdW5kIENvbXBpbGVyXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4dHJhUHJvdmlkZXJzID0gW3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0UHJvdmlkZXJNZXRhZGF0YShuZXcgUHJvdmlkZXJNZXRhKF9hbmd1bGFyX2NvcmUuQ29tcGlsZXIsIHsgdXNlRmFjdG9yeTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1vZHVsZUJvdW5kQ29tcGlsZXIoX3RoaXMsIG1vZHVsZU1ldGFfMS50eXBlLnJlZmVyZW5jZSk7IH0gfSkpXTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZVJlc3VsdCA9IHRoaXMuX25nTW9kdWxlQ29tcGlsZXIuY29tcGlsZShtb2R1bGVNZXRhXzEsIGV4dHJhUHJvdmlkZXJzKTtcbiAgICAgICAgICAgICAgY29tcGlsZVJlc3VsdC5kZXBlbmRlbmNpZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICAgICAgICAgICAgICBkZXAucGxhY2Vob2xkZXIucmVmZXJlbmNlID1cbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYXNzZXJ0Q29tcG9uZW50S25vd24oZGVwLmNvbXAucmVmZXJlbmNlLCB0cnVlKS5wcm94eUNvbXBvbmVudEZhY3Rvcnk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NvbXBpbGVyQ29uZmlnLnVzZUppdCkge1xuICAgICAgICAgICAgICAgICAgbmdNb2R1bGVGYWN0b3J5ID1cbiAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRTdGF0ZW1lbnRzKGNvbXBpbGVSZXN1bHQuc3RhdGVtZW50cywgY29tcGlsZVJlc3VsdC5uZ01vZHVsZUZhY3RvcnlWYXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbmdNb2R1bGVGYWN0b3J5ID0gaml0U3RhdGVtZW50cyhcIi9cIiArIGlkZW50aWZpZXJOYW1lKG1vZHVsZU1ldGFfMS50eXBlKSArIFwiL21vZHVsZS5uZ2ZhY3RvcnkuanNcIiwgY29tcGlsZVJlc3VsdC5zdGF0ZW1lbnRzLCBjb21waWxlUmVzdWx0Lm5nTW9kdWxlRmFjdG9yeVZhcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLnNldChtb2R1bGVNZXRhXzEudHlwZS5yZWZlcmVuY2UsIG5nTW9kdWxlRmFjdG9yeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZ01vZHVsZUZhY3Rvcnk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1haW5Nb2R1bGVcbiAgICAgICAqIEBwYXJhbSB7P30gYWxsQ29tcG9uZW50RmFjdG9yaWVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVDb21wb25lbnRzID0gZnVuY3Rpb24gKG1haW5Nb2R1bGUsIGFsbENvbXBvbmVudEZhY3Rvcmllcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmdNb2R1bGUgPSB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEobWFpbk1vZHVsZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlQnlEaXJlY3RpdmUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVtcGxhdGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbE1vZHVsZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG9jYWxNb2R1bGVNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShsb2NhbE1vZHVsZVN1bW1hcnkucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgbG9jYWxNb2R1bGVNZXRhLmRlY2xhcmVkRGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICBtb2R1bGVCeURpcmVjdGl2ZS5zZXQoZGlySWRlbnRpZmllci5yZWZlcmVuY2UsIGxvY2FsTW9kdWxlTWV0YSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoZGlySWRlbnRpZmllci5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgX3RoaXMuX2NvbXBpbGVEaXJlY3RpdmVXcmFwcGVyKGRpck1ldGEsIGxvY2FsTW9kdWxlTWV0YSk7XG4gICAgICAgICAgICAgICAgICBpZiAoZGlyTWV0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQoX3RoaXMuX2NyZWF0ZUNvbXBpbGVkVGVtcGxhdGUoZGlyTWV0YSwgbG9jYWxNb2R1bGVNZXRhKSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbENvbXBvbmVudEZhY3Rvcmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZW1wbGF0ZSA9IF90aGlzLl9jcmVhdGVDb21waWxlZEhvc3RUZW1wbGF0ZShkaXJNZXRhLnR5cGUucmVmZXJlbmNlLCBsb2NhbE1vZHVsZU1ldGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuYWRkKHRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsQ29tcG9uZW50RmFjdG9yaWVzLnB1c2godGVtcGxhdGUucHJveHlDb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbE1vZHVsZVN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG9jYWxNb2R1bGVNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShsb2NhbE1vZHVsZVN1bW1hcnkucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgbG9jYWxNb2R1bGVNZXRhLmRlY2xhcmVkRGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkaXJNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoZGlySWRlbnRpZmllci5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgaWYgKGRpck1ldGEuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaXJNZXRhLmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeUNvbXBvbmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlTWV0YSA9IG1vZHVsZUJ5RGlyZWN0aXZlLmdldChlbnRyeUNvbXBvbmVudFR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzLmFkZChfdGhpcy5fY3JlYXRlQ29tcGlsZWRIb3N0VGVtcGxhdGUoZW50cnlDb21wb25lbnRUeXBlLnJlZmVyZW5jZSwgbW9kdWxlTWV0YSkpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbG9jYWxNb2R1bGVNZXRhLmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeUNvbXBvbmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZHVsZU1ldGEgPSBtb2R1bGVCeURpcmVjdGl2ZS5nZXQoZW50cnlDb21wb25lbnRUeXBlLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuYWRkKF90aGlzLl9jcmVhdGVDb21waWxlZEhvc3RUZW1wbGF0ZShlbnRyeUNvbXBvbmVudFR5cGUucmVmZXJlbmNlLCBtb2R1bGVNZXRhKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRlbXBsYXRlcy5mb3JFYWNoKGZ1bmN0aW9uICh0ZW1wbGF0ZSkgeyByZXR1cm4gX3RoaXMuX2NvbXBpbGVUZW1wbGF0ZSh0ZW1wbGF0ZSk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuY2xlYXJDYWNoZUZvciA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgICB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmNsZWFyQ2FjaGVGb3IodHlwZSk7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWRIb3N0VGVtcGxhdGVDYWNoZS5kZWxldGUodHlwZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZWRUZW1wbGF0ZSA9IHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQodHlwZSk7XG4gICAgICAgICAgaWYgKGNvbXBpbGVkVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLl9jb21waWxlZEhvc3RUZW1wbGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZUNvbXBpbGVkSG9zdFRlbXBsYXRlID0gZnVuY3Rpb24gKGNvbXBUeXBlLCBuZ01vZHVsZSkge1xuICAgICAgICAgIGlmICghbmdNb2R1bGUpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcG9uZW50IFwiICsgc3RyaW5naWZ5KGNvbXBUeXBlKSArIFwiIGlzIG5vdCBwYXJ0IG9mIGFueSBOZ01vZHVsZSBvciB0aGUgbW9kdWxlIGhhcyBub3QgYmVlbiBpbXBvcnRlZCBpbnRvIHlvdXIgbW9kdWxlLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZWRUZW1wbGF0ZSA9IHRoaXMuX2NvbXBpbGVkSG9zdFRlbXBsYXRlQ2FjaGUuZ2V0KGNvbXBUeXBlKTtcbiAgICAgICAgICBpZiAoIWNvbXBpbGVkVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcE1ldGEgPSB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldERpcmVjdGl2ZU1ldGFkYXRhKGNvbXBUeXBlKTtcbiAgICAgICAgICAgICAgYXNzZXJ0Q29tcG9uZW50KGNvbXBNZXRhKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSG9zdENsYXNzID0gZnVuY3Rpb24gSG9zdENsYXNzKCkgeyB9O1xuICAgICAgICAgICAgICAoKEhvc3RDbGFzcykpLm92ZXJyaWRkZW5OYW1lID0gaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkgKyBcIl9Ib3N0XCI7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RNZXRhID0gY3JlYXRlSG9zdENvbXBvbmVudE1ldGEoSG9zdENsYXNzLCBjb21wTWV0YSk7XG4gICAgICAgICAgICAgIGNvbXBpbGVkVGVtcGxhdGUgPSBuZXcgQ29tcGlsZWRUZW1wbGF0ZSh0cnVlLCBjb21wTWV0YS5zZWxlY3RvciwgY29tcE1ldGEudHlwZSwgaG9zdE1ldGEsIG5nTW9kdWxlLCBbY29tcE1ldGEudHlwZV0pO1xuICAgICAgICAgICAgICB0aGlzLl9jb21waWxlZEhvc3RUZW1wbGF0ZUNhY2hlLnNldChjb21wVHlwZSwgY29tcGlsZWRUZW1wbGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21waWxlZFRlbXBsYXRlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wTWV0YVxuICAgICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jcmVhdGVDb21waWxlZFRlbXBsYXRlID0gZnVuY3Rpb24gKGNvbXBNZXRhLCBuZ01vZHVsZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVkVGVtcGxhdGUgPSB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuZ2V0KGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICBpZiAoIWNvbXBpbGVkVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgYXNzZXJ0Q29tcG9uZW50KGNvbXBNZXRhKTtcbiAgICAgICAgICAgICAgY29tcGlsZWRUZW1wbGF0ZSA9IG5ldyBDb21waWxlZFRlbXBsYXRlKGZhbHNlLCBjb21wTWV0YS5zZWxlY3RvciwgY29tcE1ldGEudHlwZSwgY29tcE1ldGEsIG5nTW9kdWxlLCBuZ01vZHVsZS50cmFuc2l0aXZlTW9kdWxlLmRpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuc2V0KGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlLCBjb21waWxlZFRlbXBsYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbXBpbGVkVGVtcGxhdGU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGlzSG9zdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9hc3NlcnRDb21wb25lbnRLbm93biA9IGZ1bmN0aW9uIChjb21wVHlwZSwgaXNIb3N0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZWRUZW1wbGF0ZSA9IGlzSG9zdCA/IHRoaXMuX2NvbXBpbGVkSG9zdFRlbXBsYXRlQ2FjaGUuZ2V0KGNvbXBUeXBlKSA6XG4gICAgICAgICAgICAgIHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQoY29tcFR5cGUpO1xuICAgICAgICAgIGlmICghY29tcGlsZWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBDb21waWxlZCB2aWV3IGZvciBjb21wb25lbnQgXCIgKyBzdHJpbmdpZnkoY29tcFR5cGUpICsgXCIgKGhvc3Q6IFwiICsgaXNIb3N0ICsgXCIpIGRvZXMgbm90IGV4aXN0IVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbXBpbGVkVGVtcGxhdGU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpclR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fYXNzZXJ0RGlyZWN0aXZlV3JhcHBlciA9IGZ1bmN0aW9uIChkaXJUeXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyV3JhcHBlciA9IHRoaXMuX2NvbXBpbGVkRGlyZWN0aXZlV3JhcHBlckNhY2hlLmdldChkaXJUeXBlKTtcbiAgICAgICAgICBpZiAoIWRpcldyYXBwZXIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogRGlyZWN0aXZlIHdyYXBwZXIgZm9yIFwiICsgc3RyaW5naWZ5KGRpclR5cGUpICsgXCIgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRpcldyYXBwZXI7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRpck1ldGFcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlTWV0YVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlRGlyZWN0aXZlV3JhcHBlciA9IGZ1bmN0aW9uIChkaXJNZXRhLCBtb2R1bGVNZXRhKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZVJlc3VsdCA9IHRoaXMuX2RpcmVjdGl2ZVdyYXBwZXJDb21waWxlci5jb21waWxlKGRpck1ldGEpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRlbWVudHMgPSBjb21waWxlUmVzdWx0LnN0YXRlbWVudHM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyZWN0aXZlV3JhcHBlckNsYXNzO1xuICAgICAgICAgIGlmICghdGhpcy5fY29tcGlsZXJDb25maWcudXNlSml0KSB7XG4gICAgICAgICAgICAgIGRpcmVjdGl2ZVdyYXBwZXJDbGFzcyA9IGludGVycHJldFN0YXRlbWVudHMoc3RhdGVtZW50cywgY29tcGlsZVJlc3VsdC5kaXJXcmFwcGVyQ2xhc3NWYXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZGlyZWN0aXZlV3JhcHBlckNsYXNzID0gaml0U3RhdGVtZW50cyhcIi9cIiArIGlkZW50aWZpZXJOYW1lKG1vZHVsZU1ldGEudHlwZSkgKyBcIi9cIiArIGlkZW50aWZpZXJOYW1lKGRpck1ldGEudHlwZSkgKyBcIi93cmFwcGVyLm5nZmFjdG9yeS5qc1wiLCBzdGF0ZW1lbnRzLCBjb21waWxlUmVzdWx0LmRpcldyYXBwZXJDbGFzc1Zhcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX2NvbXBpbGVkRGlyZWN0aXZlV3JhcHBlckNhY2hlLnNldChkaXJNZXRhLnR5cGUucmVmZXJlbmNlLCBkaXJlY3RpdmVXcmFwcGVyQ2xhc3MpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlVGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0ZW1wbGF0ZS5pc0NvbXBpbGVkKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcE1ldGEgPSB0ZW1wbGF0ZS5jb21wTWV0YTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVzQ29tcGlsZVJlc3VsdCA9IHRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICAgICAgc3R5bGVzQ29tcGlsZVJlc3VsdC5leHRlcm5hbFN0eWxlc2hlZXRzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsLnNldChyLm1ldGEubW9kdWxlVXJsLCByKTsgfSk7XG4gICAgICAgICAgdGhpcy5fcmVzb2x2ZVN0eWxlc0NvbXBpbGVSZXN1bHQoc3R5bGVzQ29tcGlsZVJlc3VsdC5jb21wb25lbnRTdHlsZXNoZWV0LCBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlZEFuaW1hdGlvbnMgPSB0aGlzLl9hbmltYXRpb25QYXJzZXIucGFyc2VDb21wb25lbnQoY29tcE1ldGEpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpcmVjdGl2ZXMgPSB0ZW1wbGF0ZS5kaXJlY3RpdmVzLm1hcChmdW5jdGlvbiAoZGlyKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVTdW1tYXJ5KGRpci5yZWZlcmVuY2UpOyB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwaXBlcyA9IHRlbXBsYXRlLm5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUucGlwZXMubWFwKGZ1bmN0aW9uIChwaXBlKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRQaXBlU3VtbWFyeShwaXBlLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlZFRlbXBsYXRlID0gdGhpcy5fdGVtcGxhdGVQYXJzZXIucGFyc2UoY29tcE1ldGEsIGNvbXBNZXRhLnRlbXBsYXRlLnRlbXBsYXRlLCBkaXJlY3RpdmVzLCBwaXBlcywgdGVtcGxhdGUubmdNb2R1bGUuc2NoZW1hcywgaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVkQW5pbWF0aW9ucyA9IHRoaXMuX2FuaW1hdGlvbkNvbXBpbGVyLmNvbXBpbGUoaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSksIHBhcnNlZEFuaW1hdGlvbnMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBpbGVSZXN1bHQgPSB0aGlzLl92aWV3Q29tcGlsZXIuY29tcGlsZUNvbXBvbmVudChjb21wTWV0YSwgcGFyc2VkVGVtcGxhdGUsIHZhcmlhYmxlKHN0eWxlc0NvbXBpbGVSZXN1bHQuY29tcG9uZW50U3R5bGVzaGVldC5zdHlsZXNWYXIpLCBwaXBlcywgY29tcGlsZWRBbmltYXRpb25zKTtcbiAgICAgICAgICBjb21waWxlUmVzdWx0LmRlcGVuZGVuY2llcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwVGVtcGxhdGU7XG4gICAgICAgICAgICAgIGlmIChkZXAgaW5zdGFuY2VvZiBWaWV3Q2xhc3NEZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2ZmQgPSAoZGVwKTtcbiAgICAgICAgICAgICAgICAgIGRlcFRlbXBsYXRlID0gX3RoaXMuX2Fzc2VydENvbXBvbmVudEtub3duKHZmZC5jb21wLnJlZmVyZW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgdmZkLnBsYWNlaG9sZGVyLnJlZmVyZW5jZSA9IGRlcFRlbXBsYXRlLnByb3h5Vmlld0NsYXNzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGRlcCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY3RvcnlEZXBlbmRlbmN5JDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNmZCA9IChkZXApO1xuICAgICAgICAgICAgICAgICAgZGVwVGVtcGxhdGUgPSBfdGhpcy5fYXNzZXJ0Q29tcG9uZW50S25vd24oY2ZkLmNvbXAucmVmZXJlbmNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIGNmZC5wbGFjZWhvbGRlci5yZWZlcmVuY2UgPSBkZXBUZW1wbGF0ZS5wcm94eUNvbXBvbmVudEZhY3Rvcnk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoZGVwIGluc3RhbmNlb2YgRGlyZWN0aXZlV3JhcHBlckRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGR3ZCA9IChkZXApO1xuICAgICAgICAgICAgICAgICAgZHdkLnBsYWNlaG9sZGVyLnJlZmVyZW5jZSA9IF90aGlzLl9hc3NlcnREaXJlY3RpdmVXcmFwcGVyKGR3ZC5kaXIucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXRlbWVudHMgPSAoX2EgPSBzdHlsZXNDb21waWxlUmVzdWx0LmNvbXBvbmVudFN0eWxlc2hlZXQuc3RhdGVtZW50cykuY29uY2F0LmFwcGx5KF9hLCBjb21waWxlZEFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uIChjYSkgeyByZXR1cm4gY2Euc3RhdGVtZW50czsgfSkpXG4gICAgICAgICAgICAgIC5jb25jYXQoY29tcGlsZVJlc3VsdC5zdGF0ZW1lbnRzKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3Q2xhc3M7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jb21waWxlckNvbmZpZy51c2VKaXQpIHtcbiAgICAgICAgICAgICAgdmlld0NsYXNzID0gaW50ZXJwcmV0U3RhdGVtZW50cyhzdGF0ZW1lbnRzLCBjb21waWxlUmVzdWx0LnZpZXdDbGFzc1Zhcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2aWV3Q2xhc3MgPSBqaXRTdGF0ZW1lbnRzKFwiL1wiICsgaWRlbnRpZmllck5hbWUodGVtcGxhdGUubmdNb2R1bGUudHlwZSkgKyBcIi9cIiArIGlkZW50aWZpZXJOYW1lKHRlbXBsYXRlLmNvbXBUeXBlKSArIFwiL1wiICsgKHRlbXBsYXRlLmlzSG9zdCA/ICdob3N0JyA6ICdjb21wb25lbnQnKSArIFwiLm5nZmFjdG9yeS5qc1wiLCBzdGF0ZW1lbnRzLCBjb21waWxlUmVzdWx0LnZpZXdDbGFzc1Zhcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRlbXBsYXRlLmNvbXBpbGVkKHZpZXdDbGFzcyk7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZXN1bHRcbiAgICAgICAqIEBwYXJhbSB7P30gZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX3Jlc29sdmVTdHlsZXNDb21waWxlUmVzdWx0ID0gZnVuY3Rpb24gKHJlc3VsdCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCwgaSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXN0ZWRDb21waWxlUmVzdWx0ID0gZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsLmdldChkZXAubW9kdWxlVXJsKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmVzdGVkU3R5bGVzQXJyID0gX3RoaXMuX3Jlc29sdmVBbmRFdmFsU3R5bGVzQ29tcGlsZVJlc3VsdChuZXN0ZWRDb21waWxlUmVzdWx0LCBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwpO1xuICAgICAgICAgICAgICBkZXAudmFsdWVQbGFjZWhvbGRlci5yZWZlcmVuY2UgPSBuZXN0ZWRTdHlsZXNBcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlc3VsdFxuICAgICAgICogQHBhcmFtIHs/fSBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fcmVzb2x2ZUFuZEV2YWxTdHlsZXNDb21waWxlUmVzdWx0ID0gZnVuY3Rpb24gKHJlc3VsdCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKSB7XG4gICAgICAgICAgdGhpcy5fcmVzb2x2ZVN0eWxlc0NvbXBpbGVSZXN1bHQocmVzdWx0LCBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwpO1xuICAgICAgICAgIGlmICghdGhpcy5fY29tcGlsZXJDb25maWcudXNlSml0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRTdGF0ZW1lbnRzKHJlc3VsdC5zdGF0ZW1lbnRzLCByZXN1bHQuc3R5bGVzVmFyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBqaXRTdGF0ZW1lbnRzKFwiL1wiICsgcmVzdWx0Lm1ldGEubW9kdWxlVXJsICsgXCIubmdzdHlsZS5qc1wiLCByZXN1bHQuc3RhdGVtZW50cywgcmVzdWx0LnN0eWxlc1Zhcik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIEppdENvbXBpbGVyID0gX19kZWNvcmF0ZSQxNyhbXG4gICAgICAgICAgQ29tcGlsZXJJbmplY3RhYmxlKCksIFxuICAgICAgICAgIF9fbWV0YWRhdGEkMTcoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgW19hbmd1bGFyX2NvcmUuSW5qZWN0b3IsIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLCBUZW1wbGF0ZVBhcnNlciwgU3R5bGVDb21waWxlciwgVmlld0NvbXBpbGVyLCBOZ01vZHVsZUNvbXBpbGVyLCBEaXJlY3RpdmVXcmFwcGVyQ29tcGlsZXIsIENvbXBpbGVyQ29uZmlnLCBBbmltYXRpb25QYXJzZXJdKVxuICAgICAgXSwgSml0Q29tcGlsZXIpO1xuICAgICAgcmV0dXJuIEppdENvbXBpbGVyO1xuICB9KCkpO1xuICB2YXIgQ29tcGlsZWRUZW1wbGF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaXNIb3N0XG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBUeXBlXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBNZXRhXG4gICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlXG4gICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ29tcGlsZWRUZW1wbGF0ZShpc0hvc3QsIHNlbGVjdG9yLCBjb21wVHlwZSwgY29tcE1ldGEsIG5nTW9kdWxlLCBkaXJlY3RpdmVzKSB7XG4gICAgICAgICAgdGhpcy5pc0hvc3QgPSBpc0hvc3Q7XG4gICAgICAgICAgdGhpcy5jb21wVHlwZSA9IGNvbXBUeXBlO1xuICAgICAgICAgIHRoaXMuY29tcE1ldGEgPSBjb21wTWV0YTtcbiAgICAgICAgICB0aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7XG4gICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbiAgICAgICAgICB0aGlzLl92aWV3Q2xhc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMuaXNDb21waWxlZCA9IGZhbHNlO1xuICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICB0aGlzLnByb3h5Vmlld0NsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXNlbGYuX3ZpZXdDbGFzcykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogQ29tcGlsZWRUZW1wbGF0ZSBmb3IgXCIgKyBzdHJpbmdpZnkoc2VsZi5jb21wVHlwZSkgKyBcIiBpcyBub3QgY29tcGlsZWQgeWV0IVwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmlld0NsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnByb3h5Q29tcG9uZW50RmFjdG9yeSA9IGlzSG9zdCA/XG4gICAgICAgICAgICAgIG5ldyBfYW5ndWxhcl9jb3JlLkNvbXBvbmVudEZhY3Rvcnkoc2VsZWN0b3IsIHRoaXMucHJveHlWaWV3Q2xhc3MsIGNvbXBUeXBlLnJlZmVyZW5jZSkgOlxuICAgICAgICAgICAgICBudWxsO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdDbGFzc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQ29tcGlsZWRUZW1wbGF0ZS5wcm90b3R5cGUuY29tcGlsZWQgPSBmdW5jdGlvbiAodmlld0NsYXNzKSB7XG4gICAgICAgICAgdGhpcy5fdmlld0NsYXNzID0gdmlld0NsYXNzO1xuICAgICAgICAgIHRoaXMucHJveHlWaWV3Q2xhc3MucHJvdG90eXBlID0gdmlld0NsYXNzLnByb3RvdHlwZTtcbiAgICAgICAgICB0aGlzLmlzQ29tcGlsZWQgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBDb21waWxlZFRlbXBsYXRlO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBtZXRhXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhc3NlcnRDb21wb25lbnQobWV0YSkge1xuICAgICAgaWYgKCFtZXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGNvbXBpbGUgJ1wiICsgaWRlbnRpZmllck5hbWUobWV0YS50eXBlKSArIFwiJyBiZWNhdXNlIGl0IGlzIG5vdCBhIGNvbXBvbmVudC5cIik7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqICBJbXBsZW1lbnRzIGBDb21waWxlcmAgYnkgZGVsZWdhdGluZyB0byB0aGUgSml0Q29tcGlsZXIgdXNpbmcgYSBrbm93biBtb2R1bGUuXG4gICAqL1xuICB2YXIgTW9kdWxlQm91bmRDb21waWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gX2RlbGVnYXRlXG4gICAgICAgKiBAcGFyYW0gez99IF9uZ01vZHVsZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBNb2R1bGVCb3VuZENvbXBpbGVyKF9kZWxlZ2F0ZSwgX25nTW9kdWxlKSB7XG4gICAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBfZGVsZWdhdGU7XG4gICAgICAgICAgdGhpcy5fbmdNb2R1bGUgPSBfbmdNb2R1bGU7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTW9kdWxlQm91bmRDb21waWxlci5wcm90b3R5cGUsIFwiX2luamVjdG9yXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaW5qZWN0b3I7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE1vZHVsZUJvdW5kQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVTeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tcGlsZU1vZHVsZVN5bmMobW9kdWxlVHlwZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE1vZHVsZUJvdW5kQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVBc3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmNvbXBpbGVNb2R1bGVBc3luYyhtb2R1bGVUeXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTW9kdWxlQm91bmRDb21waWxlci5wcm90b3R5cGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jKG1vZHVsZVR5cGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNb2R1bGVCb3VuZENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyhtb2R1bGVUeXBlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNb2R1bGVCb3VuZENvbXBpbGVyLnByb3RvdHlwZS5nZXROZ0NvbnRlbnRTZWxlY3RvcnMgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldE5nQ29udGVudFNlbGVjdG9ycyhjb21wb25lbnQpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIENsZWFycyBhbGwgY2FjaGVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNb2R1bGVCb3VuZENvbXBpbGVyLnByb3RvdHlwZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9kZWxlZ2F0ZS5jbGVhckNhY2hlKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqICBDbGVhcnMgdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50L25nTW9kdWxlLlxuICAgICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNb2R1bGVCb3VuZENvbXBpbGVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKHR5cGUpIHsgdGhpcy5fZGVsZWdhdGUuY2xlYXJDYWNoZUZvcih0eXBlKTsgfTtcbiAgICAgIHJldHVybiBNb2R1bGVCb3VuZENvbXBpbGVyO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiAgQSBjb250YWluZXIgZm9yIG1lc3NhZ2UgZXh0cmFjdGVkIGZyb20gdGhlIHRlbXBsYXRlcy5cbiAgICovXG4gIHZhciBNZXNzYWdlQnVuZGxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfaHRtbFBhcnNlclxuICAgICAgICogQHBhcmFtIHs/fSBfaW1wbGljaXRUYWdzXG4gICAgICAgKiBAcGFyYW0gez99IF9pbXBsaWNpdEF0dHJzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE1lc3NhZ2VCdW5kbGUoX2h0bWxQYXJzZXIsIF9pbXBsaWNpdFRhZ3MsIF9pbXBsaWNpdEF0dHJzKSB7XG4gICAgICAgICAgdGhpcy5faHRtbFBhcnNlciA9IF9odG1sUGFyc2VyO1xuICAgICAgICAgIHRoaXMuX2ltcGxpY2l0VGFncyA9IF9pbXBsaWNpdFRhZ3M7XG4gICAgICAgICAgdGhpcy5faW1wbGljaXRBdHRycyA9IF9pbXBsaWNpdEF0dHJzO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2VzID0gW107XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaHRtbFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJwb2xhdGlvbkNvbmZpZ1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTWVzc2FnZUJ1bmRsZS5wcm90b3R5cGUudXBkYXRlRnJvbVRlbXBsYXRlID0gZnVuY3Rpb24gKGh0bWwsIHVybCwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGh0bWxQYXJzZXJSZXN1bHQgPSB0aGlzLl9odG1sUGFyc2VyLnBhcnNlKGh0bWwsIHVybCwgdHJ1ZSwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgaWYgKGh0bWxQYXJzZXJSZXN1bHQuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaHRtbFBhcnNlclJlc3VsdC5lcnJvcnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGkxOG5QYXJzZXJSZXN1bHQgPSBleHRyYWN0TWVzc2FnZXMoaHRtbFBhcnNlclJlc3VsdC5yb290Tm9kZXMsIGludGVycG9sYXRpb25Db25maWcsIHRoaXMuX2ltcGxpY2l0VGFncywgdGhpcy5faW1wbGljaXRBdHRycyk7XG4gICAgICAgICAgaWYgKGkxOG5QYXJzZXJSZXN1bHQuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gaTE4blBhcnNlclJlc3VsdC5lcnJvcnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIChfYSA9IHRoaXMuX21lc3NhZ2VzKS5wdXNoLmFwcGx5KF9hLCBpMThuUGFyc2VyUmVzdWx0Lm1lc3NhZ2VzKTtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBNZXNzYWdlQnVuZGxlLnByb3RvdHlwZS5nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VzOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlcmlhbGl6ZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE1lc3NhZ2VCdW5kbGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHNlcmlhbGl6ZXIpIHsgcmV0dXJuIHNlcmlhbGl6ZXIud3JpdGUodGhpcy5fbWVzc2FnZXMpOyB9O1xuICAgICAgcmV0dXJuIE1lc3NhZ2VCdW5kbGU7XG4gIH0oKSk7XG5cbiAgdmFyIEV4dHJhY3RvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaG9zdFxuICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNTeW1ib2xSZXNvbHZlclxuICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlQnVuZGxlXG4gICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhUmVzb2x2ZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRXh0cmFjdG9yKGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXNzYWdlQnVuZGxlLCBtZXRhZGF0YVJlc29sdmVyKSB7XG4gICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICAgICAgICB0aGlzLnN0YXRpY1N5bWJvbFJlc29sdmVyID0gc3RhdGljU3ltYm9sUmVzb2x2ZXI7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQnVuZGxlID0gbWVzc2FnZUJ1bmRsZTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhUmVzb2x2ZXIgPSBtZXRhZGF0YVJlc29sdmVyO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvb3RGaWxlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXh0cmFjdG9yLnByb3RvdHlwZS5leHRyYWN0ID0gZnVuY3Rpb24gKHJvb3RGaWxlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvZ3JhbVN5bWJvbHMgPSBleHRyYWN0UHJvZ3JhbVN5bWJvbHModGhpcy5zdGF0aWNTeW1ib2xSZXNvbHZlciwgcm9vdEZpbGVzLCB0aGlzLmhvc3QpO1xuICAgICAgICAgIHZhciBfYSA9IGFuYWx5emVBbmRWYWxpZGF0ZU5nTW9kdWxlcyhwcm9ncmFtU3ltYm9scywgdGhpcy5ob3N0LCB0aGlzLm1ldGFkYXRhUmVzb2x2ZXIpLCBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlID0gX2EubmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZSwgZmlsZXMgPSBfYS5maWxlcywgbmdNb2R1bGVzID0gX2EubmdNb2R1bGVzO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlXG4gICAgICAgICAgICAgIC5hbGwobmdNb2R1bGVzLm1hcChmdW5jdGlvbiAobmdNb2R1bGUpIHsgcmV0dXJuIF90aGlzLm1ldGFkYXRhUmVzb2x2ZXIubG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhKG5nTW9kdWxlLnR5cGUucmVmZXJlbmNlLCBmYWxzZSk7IH0pKVxuICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9ycyA9IFtdO1xuICAgICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wTWV0YXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZpbGUuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlyTWV0YSA9IF90aGlzLm1ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRpck1ldGEgJiYgZGlyTWV0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YXMucHVzaChkaXJNZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGNvbXBNZXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGh0bWwgPSBjb21wTWV0YS50ZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gSW50ZXJwb2xhdGlvbkNvbmZpZy5mcm9tQXJyYXkoY29tcE1ldGEudGVtcGxhdGUuaW50ZXJwb2xhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBfdGhpcy5tZXNzYWdlQnVuZGxlLnVwZGF0ZUZyb21UZW1wbGF0ZShodG1sLCBmaWxlLnNyY1VybCwgaW50ZXJwb2xhdGlvbkNvbmZpZykpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUudG9TdHJpbmcoKTsgfSkuam9pbignXFxuJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpcy5tZXNzYWdlQnVuZGxlO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFeHRyYWN0b3IuY3JlYXRlID0gZnVuY3Rpb24gKGhvc3QpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBodG1sUGFyc2VyID0gbmV3IEkxOE5IdG1sUGFyc2VyKG5ldyBIdG1sUGFyc2VyKCkpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVybFJlc29sdmVyID0gY3JlYXRlT2ZmbGluZUNvbXBpbGVVcmxSZXNvbHZlcigpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN5bWJvbENhY2hlID0gbmV3IFN0YXRpY1N5bWJvbENhY2hlKCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VtbWFyeVJlc29sdmVyID0gbmV3IEFvdFN1bW1hcnlSZXNvbHZlcihob3N0LCBzeW1ib2xDYWNoZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGljU3ltYm9sUmVzb2x2ZXIgPSBuZXcgU3RhdGljU3ltYm9sUmVzb2x2ZXIoaG9zdCwgc3ltYm9sQ2FjaGUsIHN1bW1hcnlSZXNvbHZlcik7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGljUmVmbGVjdG9yID0gbmV3IFN0YXRpY1JlZmxlY3RvcihzdGF0aWNTeW1ib2xSZXNvbHZlcik7XG4gICAgICAgICAgU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaW5zdGFsbChzdGF0aWNSZWZsZWN0b3IpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbmZpZyA9IG5ldyBDb21waWxlckNvbmZpZyh7XG4gICAgICAgICAgICAgIGdlbkRlYnVnSW5mbzogZmFsc2UsXG4gICAgICAgICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBfYW5ndWxhcl9jb3JlLlZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICAgICAgICAgICAgICBsb2dCaW5kaW5nVXBkYXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgdXNlSml0OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZXIgPSBuZXcgRGlyZWN0aXZlTm9ybWFsaXplcih7IGdldDogZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gaG9zdC5sb2FkUmVzb3VyY2UodXJsKTsgfSB9LCB1cmxSZXNvbHZlciwgaHRtbFBhcnNlciwgY29uZmlnKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbGVtZW50U2NoZW1hUmVnaXN0cnkgPSBuZXcgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZXIgPSBuZXcgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIobmV3IE5nTW9kdWxlUmVzb2x2ZXIoc3RhdGljUmVmbGVjdG9yKSwgbmV3IERpcmVjdGl2ZVJlc29sdmVyKHN0YXRpY1JlZmxlY3RvciksIG5ldyBQaXBlUmVzb2x2ZXIoc3RhdGljUmVmbGVjdG9yKSwgc3VtbWFyeVJlc29sdmVyLCBlbGVtZW50U2NoZW1hUmVnaXN0cnksIG5vcm1hbGl6ZXIsIHN0YXRpY1JlZmxlY3Rvcik7XG4gICAgICAgICAgLy8gVE9ETyh2aWNiKTogaW1wbGljaXQgdGFncyAmIGF0dHJpYnV0ZXNcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXNzYWdlQnVuZGxlID0gbmV3IE1lc3NhZ2VCdW5kbGUoaHRtbFBhcnNlciwgW10sIHt9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXNzYWdlQnVuZGxlLCByZXNvbHZlcik7XG4gICAgICAgICAgcmV0dXJuIHsgZXh0cmFjdG9yOiBleHRyYWN0b3IsIHN0YXRpY1JlZmxlY3Rvcjogc3RhdGljUmVmbGVjdG9yIH07XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEV4dHJhY3RvcjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2RlY29yYXRlJDE4ID0gKHRoaXMgJiYgdGhpcy5fX2RlY29yYXRlKSB8fCBmdW5jdGlvbiAoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG4gIH07XG4gIHZhciBfX21ldGFkYXRhJDE4ID0gKHRoaXMgJiYgdGhpcy5fX21ldGFkYXRhKSB8fCBmdW5jdGlvbiAoaywgdikge1xuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfTk9fUkVTT1VSQ0VfTE9BREVSID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgZ2V0OiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gcHJvdmlkZWQuIENhbid0IHJlYWQgdGhlIHVybCBcXFwiXCIgKyB1cmwgKyBcIlxcXCJcIik7XG4gICAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBBIHNldCBvZiBwcm92aWRlcnMgdGhhdCBwcm92aWRlIGBKaXRDb21waWxlcmAgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdXNlIGZvclxuICAgKiB0ZW1wbGF0ZSBjb21waWxhdGlvbi5cbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIENPTVBJTEVSX1BST1ZJREVSUyA9IFtcbiAgICAgIHsgcHJvdmlkZTogUmVmbGVjdG9yLCB1c2VWYWx1ZTogcmVmbGVjdG9yIH0sXG4gICAgICB7IHByb3ZpZGU6IFJlZmxlY3RvclJlYWRlciwgdXNlRXhpc3Rpbmc6IFJlZmxlY3RvciB9LFxuICAgICAgeyBwcm92aWRlOiBSZXNvdXJjZUxvYWRlciwgdXNlVmFsdWU6IF9OT19SRVNPVVJDRV9MT0FERVIgfSxcbiAgICAgIFN1bW1hcnlSZXNvbHZlcixcbiAgICAgIENvbnNvbGUsXG4gICAgICBMZXhlcixcbiAgICAgIFBhcnNlcixcbiAgICAgIEh0bWxQYXJzZXIsXG4gICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogSTE4Tkh0bWxQYXJzZXIsXG4gICAgICAgICAgdXNlRmFjdG9yeTogZnVuY3Rpb24gKHBhcnNlciwgdHJhbnNsYXRpb25zLCBmb3JtYXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJMThOSHRtbFBhcnNlcihwYXJzZXIsIHRyYW5zbGF0aW9ucywgZm9ybWF0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlcHM6IFtcbiAgICAgICAgICAgICAgSHRtbFBhcnNlcixcbiAgICAgICAgICAgICAgW25ldyBfYW5ndWxhcl9jb3JlLk9wdGlvbmFsKCksIG5ldyBfYW5ndWxhcl9jb3JlLkluamVjdChfYW5ndWxhcl9jb3JlLlRSQU5TTEFUSU9OUyldLFxuICAgICAgICAgICAgICBbbmV3IF9hbmd1bGFyX2NvcmUuT3B0aW9uYWwoKSwgbmV3IF9hbmd1bGFyX2NvcmUuSW5qZWN0KF9hbmd1bGFyX2NvcmUuVFJBTlNMQVRJT05TX0ZPUk1BVCldLFxuICAgICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBUZW1wbGF0ZVBhcnNlcixcbiAgICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIsXG4gICAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlcixcbiAgICAgIERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVIsXG4gICAgICBTdHlsZUNvbXBpbGVyLFxuICAgICAgVmlld0NvbXBpbGVyLFxuICAgICAgTmdNb2R1bGVDb21waWxlcixcbiAgICAgIERpcmVjdGl2ZVdyYXBwZXJDb21waWxlcixcbiAgICAgIHsgcHJvdmlkZTogQ29tcGlsZXJDb25maWcsIHVzZVZhbHVlOiBuZXcgQ29tcGlsZXJDb25maWcoKSB9LFxuICAgICAgSml0Q29tcGlsZXIsXG4gICAgICB7IHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuQ29tcGlsZXIsIHVzZUV4aXN0aW5nOiBKaXRDb21waWxlciB9LFxuICAgICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LFxuICAgICAgeyBwcm92aWRlOiBFbGVtZW50U2NoZW1hUmVnaXN0cnksIHVzZUV4aXN0aW5nOiBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkgfSxcbiAgICAgIFVybFJlc29sdmVyLFxuICAgICAgRGlyZWN0aXZlUmVzb2x2ZXIsXG4gICAgICBQaXBlUmVzb2x2ZXIsXG4gICAgICBOZ01vZHVsZVJlc29sdmVyLFxuICAgICAgQW5pbWF0aW9uUGFyc2VyXG4gIF07XG4gIHZhciBKaXRDb21waWxlckZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGRlZmF1bHRPcHRpb25zXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEppdENvbXBpbGVyRmFjdG9yeShkZWZhdWx0T3B0aW9ucykge1xuICAgICAgICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zID0gW3tcbiAgICAgICAgICAgICAgICAgIHVzZURlYnVnOiBfYW5ndWxhcl9jb3JlLmlzRGV2TW9kZSgpLFxuICAgICAgICAgICAgICAgICAgdXNlSml0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdEVuY2Fwc3VsYXRpb246IF9hbmd1bGFyX2NvcmUuVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbiAgICAgICAgICAgICAgfV0uY29uY2F0KGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSml0Q29tcGlsZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGVDb21waWxlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0gW107IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXJnZWRPcHRpb25zID0gX21lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucy5jb25jYXQob3B0aW9ucykpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluamVjdG9yID0gX2FuZ3VsYXJfY29yZS5SZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAgICAgICAgICAgIENPTVBJTEVSX1BST1ZJREVSUywge1xuICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ29tcGlsZXJDb25maWcsXG4gICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlckNvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBleHBsaWNpdCB2YWx1ZXMgZnJvbSB0aGUgY29tcGlsZXIgb3B0aW9ucyBvdmVyd3JpdGUgb3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBhcHAgcHJvdmlkZXJzLiBFLmcuIGltcG9ydGFudCBmb3IgdGhlIHRlc3RpbmcgcGxhdGZvcm0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdlbkRlYnVnSW5mbzogbWVyZ2VkT3B0aW9ucy51c2VEZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGV4cGxpY2l0IHZhbHVlcyBmcm9tIHRoZSBjb21waWxlciBvcHRpb25zIG92ZXJ3cml0ZSBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGFwcCBwcm92aWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSml0OiBtZXJnZWRPcHRpb25zLnVzZUppdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGV4cGxpY2l0IHZhbHVlcyBmcm9tIHRoZSBjb21waWxlciBvcHRpb25zIG92ZXJ3cml0ZSBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGFwcCBwcm92aWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEVuY2Fwc3VsYXRpb246IG1lcmdlZE9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0JpbmRpbmdVcGRhdGU6IG1lcmdlZE9wdGlvbnMudXNlRGVidWdcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBkZXBzOiBbXVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXJnZWRPcHRpb25zLnByb3ZpZGVyc1xuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiBpbmplY3Rvci5nZXQoX2FuZ3VsYXJfY29yZS5Db21waWxlcik7XG4gICAgICB9O1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBKaXRDb21waWxlckZhY3RvcnkuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3QsIGFyZ3M6IFtfYW5ndWxhcl9jb3JlLkNPTVBJTEVSX09QVElPTlMsXSB9LF0gfSxcbiAgICAgIF07IH07XG4gICAgICBKaXRDb21waWxlckZhY3RvcnkgPSBfX2RlY29yYXRlJDE4KFtcbiAgICAgICAgICBDb21waWxlckluamVjdGFibGUoKSwgXG4gICAgICAgICAgX19tZXRhZGF0YSQxOCgnZGVzaWduOnBhcmFtdHlwZXMnLCBbQXJyYXldKVxuICAgICAgXSwgSml0Q29tcGlsZXJGYWN0b3J5KTtcbiAgICAgIHJldHVybiBKaXRDb21waWxlckZhY3Rvcnk7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2luaXRSZWZsZWN0b3IoKSB7XG4gICAgICByZWZsZWN0b3IucmVmbGVjdGlvbkNhcGFiaWxpdGllcyA9IG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEEgcGxhdGZvcm0gdGhhdCBpbmNsdWRlZCBjb3JlUGxhdGZvcm0gYW5kIHRoZSBjb21waWxlci5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGxhdGZvcm1Db3JlRHluYW1pYyA9IF9hbmd1bGFyX2NvcmUuY3JlYXRlUGxhdGZvcm1GYWN0b3J5KF9hbmd1bGFyX2NvcmUucGxhdGZvcm1Db3JlLCAnY29yZUR5bmFtaWMnLCBbXG4gICAgICB7IHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuQ09NUElMRVJfT1BUSU9OUywgdXNlVmFsdWU6IHt9LCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgeyBwcm92aWRlOiBfYW5ndWxhcl9jb3JlLkNvbXBpbGVyRmFjdG9yeSwgdXNlQ2xhc3M6IEppdENvbXBpbGVyRmFjdG9yeSB9LFxuICAgICAgeyBwcm92aWRlOiBfYW5ndWxhcl9jb3JlLlBMQVRGT1JNX0lOSVRJQUxJWkVSLCB1c2VWYWx1ZTogX2luaXRSZWZsZWN0b3IsIG11bHRpOiB0cnVlIH0sXG4gIF0pO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBvcHRpb25zQXJyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfbWVyZ2VPcHRpb25zKG9wdGlvbnNBcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICAgdXNlRGVidWc6IF9sYXN0RGVmaW5lZChvcHRpb25zQXJyLm1hcChmdW5jdGlvbiAob3B0aW9ucykgeyByZXR1cm4gb3B0aW9ucy51c2VEZWJ1ZzsgfSkpLFxuICAgICAgICAgIHVzZUppdDogX2xhc3REZWZpbmVkKG9wdGlvbnNBcnIubWFwKGZ1bmN0aW9uIChvcHRpb25zKSB7IHJldHVybiBvcHRpb25zLnVzZUppdDsgfSkpLFxuICAgICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBfbGFzdERlZmluZWQob3B0aW9uc0Fyci5tYXAoZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb247IH0pKSxcbiAgICAgICAgICBwcm92aWRlcnM6IF9tZXJnZUFycmF5cyhvcHRpb25zQXJyLm1hcChmdW5jdGlvbiAob3B0aW9ucykgeyByZXR1cm4gb3B0aW9ucy5wcm92aWRlcnM7IH0pKVxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhcmdzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfbGFzdERlZmluZWQoYXJncykge1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChhcmdzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaV07XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwYXJ0c1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX21lcmdlQXJyYXlzKHBhcnRzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBbXTtcbiAgICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHsgcmV0dXJuIHBhcnQgJiYgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBwYXJ0KTsgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqICBJbnRlcmZhY2UgdGhhdCBkZWZpbmVzIGhvdyBpbXBvcnQgc3RhdGVtZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBJbXBvcnRSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBJbXBvcnRSZXNvbHZlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIENvbnZlcnRzIGEgZmlsZSBwYXRoIHRvIGEgbW9kdWxlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBgaW1wb3J0LlxuICAgICAgICAqIEkuZS4gYHBhdGgvdG8vaW1wb3J0ZWRGaWxlLnRzYCBzaG91bGQgYmUgaW1wb3J0ZWQgYnkgYHBhdGgvdG8vY29udGFpbmluZ0ZpbGUudHNgLlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGltcG9ydGVkRmlsZVBhdGhcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGFpbmluZ0ZpbGVQYXRoXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBJbXBvcnRSZXNvbHZlci5wcm90b3R5cGUuZmlsZU5hbWVUb01vZHVsZU5hbWUgPSBmdW5jdGlvbiAoaW1wb3J0ZWRGaWxlUGF0aCwgY29udGFpbmluZ0ZpbGVQYXRoKSB7IH07XG4gICAgICByZXR1cm4gSW1wb3J0UmVzb2x2ZXI7XG4gIH0oKSk7XG5cbiAgZXhwb3J0cy5WRVJTSU9OID0gVkVSU0lPTjtcbiAgZXhwb3J0cy5UZXh0QXN0ID0gVGV4dEFzdDtcbiAgZXhwb3J0cy5Cb3VuZFRleHRBc3QgPSBCb3VuZFRleHRBc3Q7XG4gIGV4cG9ydHMuQXR0ckFzdCA9IEF0dHJBc3Q7XG4gIGV4cG9ydHMuQm91bmRFbGVtZW50UHJvcGVydHlBc3QgPSBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdDtcbiAgZXhwb3J0cy5Cb3VuZEV2ZW50QXN0ID0gQm91bmRFdmVudEFzdDtcbiAgZXhwb3J0cy5SZWZlcmVuY2VBc3QgPSBSZWZlcmVuY2VBc3Q7XG4gIGV4cG9ydHMuVmFyaWFibGVBc3QgPSBWYXJpYWJsZUFzdDtcbiAgZXhwb3J0cy5FbGVtZW50QXN0ID0gRWxlbWVudEFzdDtcbiAgZXhwb3J0cy5FbWJlZGRlZFRlbXBsYXRlQXN0ID0gRW1iZWRkZWRUZW1wbGF0ZUFzdDtcbiAgZXhwb3J0cy5Cb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0ID0gQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdDtcbiAgZXhwb3J0cy5EaXJlY3RpdmVBc3QgPSBEaXJlY3RpdmVBc3Q7XG4gIGV4cG9ydHMuUHJvdmlkZXJBc3QgPSBQcm92aWRlckFzdDtcbiAgZXhwb3J0cy5Qcm92aWRlckFzdFR5cGUgPSBQcm92aWRlckFzdFR5cGU7XG4gIGV4cG9ydHMuTmdDb250ZW50QXN0ID0gTmdDb250ZW50QXN0O1xuICBleHBvcnRzLlByb3BlcnR5QmluZGluZ1R5cGUgPSBQcm9wZXJ0eUJpbmRpbmdUeXBlO1xuICBleHBvcnRzLnRlbXBsYXRlVmlzaXRBbGwgPSB0ZW1wbGF0ZVZpc2l0QWxsO1xuICBleHBvcnRzLlRFTVBMQVRFX1RSQU5TRk9STVMgPSBURU1QTEFURV9UUkFOU0ZPUk1TO1xuICBleHBvcnRzLkNvbXBpbGVyQ29uZmlnID0gQ29tcGlsZXJDb25maWc7XG4gIGV4cG9ydHMuUmVuZGVyVHlwZXMgPSBSZW5kZXJUeXBlcztcbiAgZXhwb3J0cy5Db21waWxlQW5pbWF0aW9uRW50cnlNZXRhZGF0YSA9IENvbXBpbGVBbmltYXRpb25FbnRyeU1ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVBbmltYXRpb25TdGF0ZU1ldGFkYXRhID0gQ29tcGlsZUFuaW1hdGlvblN0YXRlTWV0YWRhdGE7XG4gIGV4cG9ydHMuQ29tcGlsZUFuaW1hdGlvblN0YXRlRGVjbGFyYXRpb25NZXRhZGF0YSA9IENvbXBpbGVBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGE7XG4gIGV4cG9ydHMuQ29tcGlsZUFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhID0gQ29tcGlsZUFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVBbmltYXRpb25NZXRhZGF0YSA9IENvbXBpbGVBbmltYXRpb25NZXRhZGF0YTtcbiAgZXhwb3J0cy5Db21waWxlQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YSA9IENvbXBpbGVBbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVBbmltYXRpb25TdHlsZU1ldGFkYXRhID0gQ29tcGlsZUFuaW1hdGlvblN0eWxlTWV0YWRhdGE7XG4gIGV4cG9ydHMuQ29tcGlsZUFuaW1hdGlvbkFuaW1hdGVNZXRhZGF0YSA9IENvbXBpbGVBbmltYXRpb25BbmltYXRlTWV0YWRhdGE7XG4gIGV4cG9ydHMuQ29tcGlsZUFuaW1hdGlvbldpdGhTdGVwc01ldGFkYXRhID0gQ29tcGlsZUFuaW1hdGlvbldpdGhTdGVwc01ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhID0gQ29tcGlsZUFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGE7XG4gIGV4cG9ydHMuQ29tcGlsZUFuaW1hdGlvbkdyb3VwTWV0YWRhdGEgPSBDb21waWxlQW5pbWF0aW9uR3JvdXBNZXRhZGF0YTtcbiAgZXhwb3J0cy5pZGVudGlmaWVyTmFtZSA9IGlkZW50aWZpZXJOYW1lO1xuICBleHBvcnRzLmlkZW50aWZpZXJNb2R1bGVVcmwgPSBpZGVudGlmaWVyTW9kdWxlVXJsO1xuICBleHBvcnRzLkNvbXBpbGVTdW1tYXJ5S2luZCA9IENvbXBpbGVTdW1tYXJ5S2luZDtcbiAgZXhwb3J0cy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gIGV4cG9ydHMudG9rZW5SZWZlcmVuY2UgPSB0b2tlblJlZmVyZW5jZTtcbiAgZXhwb3J0cy5Db21waWxlU3R5bGVzaGVldE1ldGFkYXRhID0gQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YTtcbiAgZXhwb3J0cy5Db21waWxlVGVtcGxhdGVNZXRhZGF0YSA9IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSA9IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YTtcbiAgZXhwb3J0cy5jcmVhdGVIb3N0Q29tcG9uZW50TWV0YSA9IGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhO1xuICBleHBvcnRzLkNvbXBpbGVQaXBlTWV0YWRhdGEgPSBDb21waWxlUGlwZU1ldGFkYXRhO1xuICBleHBvcnRzLkNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhID0gQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGE7XG4gIGV4cG9ydHMuVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhID0gVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhO1xuICBleHBvcnRzLlByb3ZpZGVyTWV0YSA9IFByb3ZpZGVyTWV0YTtcbiAgZXhwb3J0cy5jcmVhdGVBb3RDb21waWxlciA9IGNyZWF0ZUFvdENvbXBpbGVyO1xuICBleHBvcnRzLkFvdENvbXBpbGVyID0gQW90Q29tcGlsZXI7XG4gIGV4cG9ydHMuYW5hbHl6ZU5nTW9kdWxlcyA9IGFuYWx5emVOZ01vZHVsZXM7XG4gIGV4cG9ydHMuYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzID0gYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzO1xuICBleHBvcnRzLmV4dHJhY3RQcm9ncmFtU3ltYm9scyA9IGV4dHJhY3RQcm9ncmFtU3ltYm9scztcbiAgZXhwb3J0cy5TdGF0aWNSZWZsZWN0b3IgPSBTdGF0aWNSZWZsZWN0b3I7XG4gIGV4cG9ydHMuU3RhdGljQW5kRHluYW1pY1JlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBTdGF0aWNBbmREeW5hbWljUmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbiAgZXhwb3J0cy5TdGF0aWNTeW1ib2wgPSBTdGF0aWNTeW1ib2w7XG4gIGV4cG9ydHMuU3RhdGljU3ltYm9sQ2FjaGUgPSBTdGF0aWNTeW1ib2xDYWNoZTtcbiAgZXhwb3J0cy5SZXNvbHZlZFN0YXRpY1N5bWJvbCA9IFJlc29sdmVkU3RhdGljU3ltYm9sO1xuICBleHBvcnRzLlN0YXRpY1N5bWJvbFJlc29sdmVyID0gU3RhdGljU3ltYm9sUmVzb2x2ZXI7XG4gIGV4cG9ydHMuQW90U3VtbWFyeVJlc29sdmVyID0gQW90U3VtbWFyeVJlc29sdmVyO1xuICBleHBvcnRzLlN1bW1hcnlSZXNvbHZlciA9IFN1bW1hcnlSZXNvbHZlcjtcbiAgZXhwb3J0cy5KaXRDb21waWxlciA9IEppdENvbXBpbGVyO1xuICBleHBvcnRzLkNPTVBJTEVSX1BST1ZJREVSUyA9IENPTVBJTEVSX1BST1ZJREVSUztcbiAgZXhwb3J0cy5KaXRDb21waWxlckZhY3RvcnkgPSBKaXRDb21waWxlckZhY3Rvcnk7XG4gIGV4cG9ydHMucGxhdGZvcm1Db3JlRHluYW1pYyA9IHBsYXRmb3JtQ29yZUR5bmFtaWM7XG4gIGV4cG9ydHMuY3JlYXRlVXJsUmVzb2x2ZXJXaXRob3V0UGFja2FnZVByZWZpeCA9IGNyZWF0ZVVybFJlc29sdmVyV2l0aG91dFBhY2thZ2VQcmVmaXg7XG4gIGV4cG9ydHMuY3JlYXRlT2ZmbGluZUNvbXBpbGVVcmxSZXNvbHZlciA9IGNyZWF0ZU9mZmxpbmVDb21waWxlVXJsUmVzb2x2ZXI7XG4gIGV4cG9ydHMuREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUiA9IERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVI7XG4gIGV4cG9ydHMuVXJsUmVzb2x2ZXIgPSBVcmxSZXNvbHZlcjtcbiAgZXhwb3J0cy5nZXRVcmxTY2hlbWUgPSBnZXRVcmxTY2hlbWU7XG4gIGV4cG9ydHMuUmVzb3VyY2VMb2FkZXIgPSBSZXNvdXJjZUxvYWRlcjtcbiAgZXhwb3J0cy5EaXJlY3RpdmVSZXNvbHZlciA9IERpcmVjdGl2ZVJlc29sdmVyO1xuICBleHBvcnRzLlBpcGVSZXNvbHZlciA9IFBpcGVSZXNvbHZlcjtcbiAgZXhwb3J0cy5OZ01vZHVsZVJlc29sdmVyID0gTmdNb2R1bGVSZXNvbHZlcjtcbiAgZXhwb3J0cy5ERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHID0gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRztcbiAgZXhwb3J0cy5JbnRlcnBvbGF0aW9uQ29uZmlnID0gSW50ZXJwb2xhdGlvbkNvbmZpZztcbiAgZXhwb3J0cy5FbGVtZW50U2NoZW1hUmVnaXN0cnkgPSBFbGVtZW50U2NoZW1hUmVnaXN0cnk7XG4gIGV4cG9ydHMuRXh0cmFjdG9yID0gRXh0cmFjdG9yO1xuICBleHBvcnRzLkkxOE5IdG1sUGFyc2VyID0gSTE4Tkh0bWxQYXJzZXI7XG4gIGV4cG9ydHMuTWVzc2FnZUJ1bmRsZSA9IE1lc3NhZ2VCdW5kbGU7XG4gIGV4cG9ydHMuWGxpZmYgPSBYbGlmZjtcbiAgZXhwb3J0cy5YbWIgPSBYbWI7XG4gIGV4cG9ydHMuWHRiID0gWHRiO1xuICBleHBvcnRzLkRpcmVjdGl2ZU5vcm1hbGl6ZXIgPSBEaXJlY3RpdmVOb3JtYWxpemVyO1xuICBleHBvcnRzLlRva2VuVHlwZSA9IFRva2VuVHlwZTtcbiAgZXhwb3J0cy5MZXhlciA9IExleGVyO1xuICBleHBvcnRzLlRva2VuID0gVG9rZW47XG4gIGV4cG9ydHMuRU9GID0gRU9GO1xuICBleHBvcnRzLmlzSWRlbnRpZmllciA9IGlzSWRlbnRpZmllcjtcbiAgZXhwb3J0cy5pc1F1b3RlID0gaXNRdW90ZTtcbiAgZXhwb3J0cy5TcGxpdEludGVycG9sYXRpb24gPSBTcGxpdEludGVycG9sYXRpb247XG4gIGV4cG9ydHMuVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQgPSBUZW1wbGF0ZUJpbmRpbmdQYXJzZVJlc3VsdDtcbiAgZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG4gIGV4cG9ydHMuX1BhcnNlQVNUID0gX1BhcnNlQVNUO1xuICBleHBvcnRzLkVSUk9SX0NPTExFQ1RPUl9UT0tFTiA9IEVSUk9SX0NPTExFQ1RPUl9UT0tFTjtcbiAgZXhwb3J0cy5Db21waWxlTWV0YWRhdGFSZXNvbHZlciA9IENvbXBpbGVNZXRhZGF0YVJlc29sdmVyO1xuICBleHBvcnRzLmNvbXBvbmVudE1vZHVsZVVybCA9IGNvbXBvbmVudE1vZHVsZVVybDtcbiAgZXhwb3J0cy5QYXJzZVRyZWVSZXN1bHQgPSBQYXJzZVRyZWVSZXN1bHQ7XG4gIGV4cG9ydHMuVHJlZUVycm9yID0gVHJlZUVycm9yO1xuICBleHBvcnRzLkh0bWxQYXJzZXIgPSBIdG1sUGFyc2VyO1xuICBleHBvcnRzLk5nTW9kdWxlQ29tcGlsZXIgPSBOZ01vZHVsZUNvbXBpbGVyO1xuICBleHBvcnRzLkRpcmVjdGl2ZVdyYXBwZXJDb21waWxlciA9IERpcmVjdGl2ZVdyYXBwZXJDb21waWxlcjtcbiAgZXhwb3J0cy5JbXBvcnRSZXNvbHZlciA9IEltcG9ydFJlc29sdmVyO1xuICBleHBvcnRzLmRlYnVnT3V0cHV0QXN0QXNUeXBlU2NyaXB0ID0gZGVidWdPdXRwdXRBc3RBc1R5cGVTY3JpcHQ7XG4gIGV4cG9ydHMuVHlwZVNjcmlwdEVtaXR0ZXIgPSBUeXBlU2NyaXB0RW1pdHRlcjtcbiAgZXhwb3J0cy5QYXJzZUxvY2F0aW9uID0gUGFyc2VMb2NhdGlvbjtcbiAgZXhwb3J0cy5QYXJzZVNvdXJjZUZpbGUgPSBQYXJzZVNvdXJjZUZpbGU7XG4gIGV4cG9ydHMuUGFyc2VTb3VyY2VTcGFuID0gUGFyc2VTb3VyY2VTcGFuO1xuICBleHBvcnRzLlBhcnNlRXJyb3JMZXZlbCA9IFBhcnNlRXJyb3JMZXZlbDtcbiAgZXhwb3J0cy5QYXJzZUVycm9yID0gUGFyc2VFcnJvcjtcbiAgZXhwb3J0cy5Eb21FbGVtZW50U2NoZW1hUmVnaXN0cnkgPSBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnk7XG4gIGV4cG9ydHMuQ3NzU2VsZWN0b3IgPSBDc3NTZWxlY3RvcjtcbiAgZXhwb3J0cy5TZWxlY3Rvck1hdGNoZXIgPSBTZWxlY3Rvck1hdGNoZXI7XG4gIGV4cG9ydHMuU2VsZWN0b3JMaXN0Q29udGV4dCA9IFNlbGVjdG9yTGlzdENvbnRleHQ7XG4gIGV4cG9ydHMuU2VsZWN0b3JDb250ZXh0ID0gU2VsZWN0b3JDb250ZXh0O1xuICBleHBvcnRzLlN0eWxlc0NvbXBpbGVEZXBlbmRlbmN5ID0gU3R5bGVzQ29tcGlsZURlcGVuZGVuY3k7XG4gIGV4cG9ydHMuU3R5bGVzQ29tcGlsZVJlc3VsdCA9IFN0eWxlc0NvbXBpbGVSZXN1bHQ7XG4gIGV4cG9ydHMuQ29tcGlsZWRTdHlsZXNoZWV0ID0gQ29tcGlsZWRTdHlsZXNoZWV0O1xuICBleHBvcnRzLlN0eWxlQ29tcGlsZXIgPSBTdHlsZUNvbXBpbGVyO1xuICBleHBvcnRzLlRlbXBsYXRlUGFyc2VFcnJvciA9IFRlbXBsYXRlUGFyc2VFcnJvcjtcbiAgZXhwb3J0cy5UZW1wbGF0ZVBhcnNlUmVzdWx0ID0gVGVtcGxhdGVQYXJzZVJlc3VsdDtcbiAgZXhwb3J0cy5UZW1wbGF0ZVBhcnNlciA9IFRlbXBsYXRlUGFyc2VyO1xuICBleHBvcnRzLnNwbGl0Q2xhc3NlcyA9IHNwbGl0Q2xhc3NlcztcbiAgZXhwb3J0cy5jcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IgPSBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3I7XG4gIGV4cG9ydHMucmVtb3ZlU3VtbWFyeUR1cGxpY2F0ZXMgPSByZW1vdmVTdW1tYXJ5RHVwbGljYXRlcztcbiAgZXhwb3J0cy5WaWV3Q29tcGlsZXIgPSBWaWV3Q29tcGlsZXI7XG4gIGV4cG9ydHMuQW5pbWF0aW9uUGFyc2VyID0gQW5pbWF0aW9uUGFyc2VyO1xuICBleHBvcnRzLlN5bnRheEVycm9yID0gU3ludGF4RXJyb3I7XG5cbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vQGFuZ3VsYXIvY29tcGlsZXIvYnVuZGxlcy9jb21waWxlci51bWQuanNcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  14. /***/ },
  15. /* 4 */
  16. /***/ function(module, exports, __webpack_require__) {
  17. eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * @license Angular v2.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(5), __webpack_require__(6)) :\n typeof define === 'function' && define.amd ? define(['exports', 'rxjs/Subject', 'rxjs/Observable'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.core = global.ng.core || {}),global.Rx,global.Rx));\n}(this, function (exports,rxjs_Subject,rxjs_Observable) { 'use strict';\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ globalScope;\n if (typeof window === 'undefined') {\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n globalScope = (self);\n }\n else {\n globalScope = (global);\n }\n }\n else {\n globalScope = (window);\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function scheduleMicroTask(fn) {\n Zone.current.scheduleMicroTask('scheduleMicrotask', fn);\n }\n // Need to declare a new variable for global here since TypeScript\n // exports the original value of the symbol.\n var /** @type {?} */ global$1 = globalScope;\n /**\n * @param {?} type\n * @return {?}\n */\n function getTypeNameForDebugging(type) {\n return type['name'] || typeof type;\n }\n // TODO: remove calls to assert in production environment\n // Note: Can't just export this and import in in other files\n // as `assert` is a reserved keyword in Dart\n global$1.assert = function assert(condition) {\n // TODO: to be fixed properly via #2830, noop for now\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPresent(obj) {\n return obj != null;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isBlank(obj) {\n return obj == null;\n }\n /**\n * @param {?} token\n * @return {?}\n */\n function stringify(token) {\n if (typeof token === 'string') {\n return token;\n }\n if (token == null) {\n return '' + token;\n }\n if (token.overriddenName) {\n return \"\" + token.overriddenName;\n }\n if (token.name) {\n return \"\" + token.name;\n }\n var /** @type {?} */ res = token.toString();\n var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function looseIdentical(a, b) {\n return a === b || typeof a === 'number' && typeof b === 'number' && isNaN(a) && isNaN(b);\n }\n /**\n * @param {?} o\n * @return {?}\n */\n function isJsObject(o) {\n return o !== null && (typeof o === 'function' || typeof o === 'object');\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function print(obj) {\n // tslint:disable-next-line:no-console\n console.log(obj);\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function warn(obj) {\n console.warn(obj);\n }\n var /** @type {?} */ _symbolIterator = null;\n /**\n * @return {?}\n */\n function getSymbolIterator() {\n if (!_symbolIterator) {\n if (((globalScope)).Symbol && Symbol.iterator) {\n _symbolIterator = Symbol.iterator;\n }\n else {\n // es6-shim specific logic\n var /** @type {?} */ keys = Object.getOwnPropertyNames(Map.prototype);\n for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n var /** @type {?} */ key = keys[i];\n if (key !== 'entries' && key !== 'size' &&\n ((Map)).prototype[key] === Map.prototype['entries']) {\n _symbolIterator = key;\n }\n }\n }\n }\n return _symbolIterator;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPrimitive(obj) {\n return !isJsObject(obj);\n }\n\n var /** @type {?} */ _nextClassId = 0;\n var /** @type {?} */ Reflect = global$1.Reflect;\n /**\n * @param {?} annotation\n * @return {?}\n */\n function extractAnnotation(annotation) {\n if (typeof annotation === 'function' && annotation.hasOwnProperty('annotation')) {\n // it is a decorator, extract annotation\n annotation = annotation.annotation;\n }\n return annotation;\n }\n /**\n * @param {?} fnOrArray\n * @param {?} key\n * @return {?}\n */\n function applyParams(fnOrArray, key) {\n if (fnOrArray === Object || fnOrArray === String || fnOrArray === Function ||\n fnOrArray === Number || fnOrArray === Array) {\n throw new Error(\"Can not use native \" + stringify(fnOrArray) + \" as constructor\");\n }\n if (typeof fnOrArray === 'function') {\n return fnOrArray;\n }\n if (Array.isArray(fnOrArray)) {\n var /** @type {?} */ annotations = fnOrArray;\n var /** @type {?} */ annoLength = annotations.length - 1;\n var /** @type {?} */ fn = fnOrArray[annoLength];\n if (typeof fn !== 'function') {\n throw new Error(\"Last position of Class method array must be Function in key \" + key + \" was '\" + stringify(fn) + \"'\");\n }\n if (annoLength != fn.length) {\n throw new Error(\"Number of annotations (\" + annoLength + \") does not match number of arguments (\" + fn.length + \") in the function: \" + stringify(fn));\n }\n var /** @type {?} */ paramsAnnotations = [];\n for (var /** @type {?} */ i = 0, /** @type {?} */ ii = annotations.length - 1; i < ii; i++) {\n var /** @type {?} */ paramAnnotations = [];\n paramsAnnotations.push(paramAnnotations);\n var /** @type {?} */ annotation = annotations[i];\n if (Array.isArray(annotation)) {\n for (var /** @type {?} */ j = 0; j < annotation.length; j++) {\n paramAnnotations.push(extractAnnotation(annotation[j]));\n }\n }\n else if (typeof annotation === 'function') {\n paramAnnotations.push(extractAnnotation(annotation));\n }\n else {\n paramAnnotations.push(annotation);\n }\n }\n Reflect.defineMetadata('parameters', paramsAnnotations, fn);\n return fn;\n }\n throw new Error(\"Only Function or Array is supported in Class definition for key '\" + key + \"' is '\" + stringify(fnOrArray) + \"'\");\n }\n /**\n * Provides a way for expressing ES6 classes with parameter annotations in ES5.\n * *\n * ## Basic Example\n * *\n * ```\n * var Greeter = ng.Class({\n * constructor: function(name) {\n * this.name = name;\n * },\n * *\n * greet: function() {\n * alert('Hello ' + this.name + '!');\n * }\n * });\n * ```\n * *\n * is equivalent to ES6:\n * *\n * ```\n * class Greeter {\n * constructor(name) {\n * this.name = name;\n * }\n * *\n * greet() {\n * alert('Hello ' + this.name + '!');\n * }\n * }\n * ```\n * *\n * or equivalent to ES5:\n * *\n * ```\n * var Greeter = function (name) {\n * this.name = name;\n * }\n * *\n * Greeter.prototype.greet = function () {\n * alert('Hello ' + this.name + '!');\n * }\n * ```\n * *\n * ### Example with parameter annotations\n * *\n * ```\n * var MyService = ng.Class({\n * constructor: [String, [new Optional(), Service], function(name, myService) {\n * ...\n * }]\n * });\n * ```\n * *\n * is equivalent to ES6:\n * *\n * ```\n * class MyService {\n * constructor(name: string, @Optional() myService: Service) {\n * ...\n * }\n * }\n * ```\n * *\n * ### Example with inheritance\n * *\n * ```\n * var Shape = ng.Class({\n * constructor: (color) {\n * this.color = color;\n * }\n * });\n * *\n * var Square = ng.Class({\n * extends: Shape,\n * constructor: function(color, size) {\n * Shape.call(this, color);\n * this.size = size;\n * }\n * });\n * ```\n * @param {?} clsDef\n * @return {?}\n */\n function Class(clsDef) {\n var /** @type {?} */ constructor = applyParams(clsDef.hasOwnProperty('constructor') ? clsDef.constructor : undefined, 'constructor');\n var /** @type {?} */ proto = constructor.prototype;\n if (clsDef.hasOwnProperty('extends')) {\n if (typeof clsDef.extends === 'function') {\n ((constructor)).prototype = proto =\n Object.create(((clsDef.extends)).prototype);\n }\n else {\n throw new Error(\"Class definition 'extends' property must be a constructor function was: \" + stringify(clsDef.extends));\n }\n }\n for (var key in clsDef) {\n if (key !== 'extends' && key !== 'prototype' && clsDef.hasOwnProperty(key)) {\n proto[key] = applyParams(clsDef[key], key);\n }\n }\n if (this && this.annotations instanceof Array) {\n Reflect.defineMetadata('annotations', this.annotations, constructor);\n }\n var /** @type {?} */ constructorName = constructor['name'];\n if (!constructorName || constructorName === 'constructor') {\n ((constructor))['overriddenName'] = \"class\" + _nextClassId++;\n }\n return (constructor);\n }\n /**\n * @param {?} name\n * @param {?} props\n * @param {?=} parentClass\n * @param {?=} chainFn\n * @return {?}\n */\n function makeDecorator(name, props, parentClass, chainFn) {\n if (chainFn === void 0) { chainFn = null; }\n var /** @type {?} */ metaCtor = makeMetadataCtor([props]);\n /**\n * @param {?} objOrType\n * @return {?}\n */\n function DecoratorFactory(objOrType) {\n if (!(Reflect && Reflect.getOwnMetadata)) {\n throw 'reflect-metadata shim is required when using class decorators';\n }\n if (this instanceof DecoratorFactory) {\n metaCtor.call(this, objOrType);\n return this;\n }\n var /** @type {?} */ annotationInstance = new ((DecoratorFactory))(objOrType);\n var /** @type {?} */ chainAnnotation = typeof this === 'function' && Array.isArray(this.annotations) ? this.annotations : [];\n chainAnnotation.push(annotationInstance);\n var /** @type {?} */ TypeDecorator = (function TypeDecorator(cls) {\n var /** @type {?} */ annotations = Reflect.getOwnMetadata('annotations', cls) || [];\n annotations.push(annotationInstance);\n Reflect.defineMetadata('annotations', annotations, cls);\n return cls;\n });\n TypeDecorator.annotations = chainAnnotation;\n TypeDecorator.Class = Class;\n if (chainFn)\n chainFn(TypeDecorator);\n return TypeDecorator;\n }\n if (parentClass) {\n DecoratorFactory.prototype = Object.create(parentClass.prototype);\n }\n DecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n ((DecoratorFactory)).annotationCls = DecoratorFactory;\n return DecoratorFactory;\n }\n /**\n * @param {?} props\n * @return {?}\n */\n function makeMetadataCtor(props) {\n return function ctor() {\n var _this = this;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n props.forEach(function (prop, i) {\n var /** @type {?} */ argVal = args[i];\n if (Array.isArray(prop)) {\n // plain parameter\n _this[prop[0]] = argVal === undefined ? prop[1] : argVal;\n }\n else {\n for (var propName in prop) {\n _this[propName] =\n argVal && argVal.hasOwnProperty(propName) ? argVal[propName] : prop[propName];\n }\n }\n });\n };\n }\n /**\n * @param {?} name\n * @param {?} props\n * @param {?=} parentClass\n * @return {?}\n */\n function makeParamDecorator(name, props, parentClass) {\n var /** @type {?} */ metaCtor = makeMetadataCtor(props);\n /**\n * @param {...?} args\n * @return {?}\n */\n function ParamDecoratorFactory() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this instanceof ParamDecoratorFactory) {\n metaCtor.apply(this, args);\n return this;\n }\n var /** @type {?} */ annotationInstance = new ((_a = ((ParamDecoratorFactory))).bind.apply(_a, [void 0].concat(args)))();\n ((ParamDecorator)).annotation = annotationInstance;\n return ParamDecorator;\n /**\n * @param {?} cls\n * @param {?} unusedKey\n * @param {?} index\n * @return {?}\n */\n function ParamDecorator(cls, unusedKey, index) {\n var /** @type {?} */ parameters = Reflect.getOwnMetadata('parameters', cls) || [];\n // there might be gaps if some in between parameters do not have annotations.\n // we pad with nulls.\n while (parameters.length <= index) {\n parameters.push(null);\n }\n parameters[index] = parameters[index] || [];\n parameters[index].push(annotationInstance);\n Reflect.defineMetadata('parameters', parameters, cls);\n return cls;\n }\n var _a;\n }\n if (parentClass) {\n ParamDecoratorFactory.prototype = Object.create(parentClass.prototype);\n }\n ParamDecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n ((ParamDecoratorFactory)).annotationCls = ParamDecoratorFactory;\n return ParamDecoratorFactory;\n }\n /**\n * @param {?} name\n * @param {?} props\n * @param {?=} parentClass\n * @return {?}\n */\n function makePropDecorator(name, props, parentClass) {\n var /** @type {?} */ metaCtor = makeMetadataCtor(props);\n /**\n * @param {...?} args\n * @return {?}\n */\n function PropDecoratorFactory() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n if (this instanceof PropDecoratorFactory) {\n metaCtor.apply(this, args);\n return this;\n }\n var /** @type {?} */ decoratorInstance = new ((_a = ((PropDecoratorFactory))).bind.apply(_a, [void 0].concat(args)))();\n return function PropDecorator(target, name) {\n var /** @type {?} */ meta = Reflect.getOwnMetadata('propMetadata', target.constructor) || {};\n meta[name] = meta.hasOwnProperty(name) && meta[name] || [];\n meta[name].unshift(decoratorInstance);\n Reflect.defineMetadata('propMetadata', meta, target.constructor);\n };\n var _a;\n }\n if (parentClass) {\n PropDecoratorFactory.prototype = Object.create(parentClass.prototype);\n }\n PropDecoratorFactory.prototype.toString = function () { return (\"@\" + name); };\n ((PropDecoratorFactory)).annotationCls = PropDecoratorFactory;\n return PropDecoratorFactory;\n }\n\n /**\n * Inject decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Inject = makeParamDecorator('Inject', [['token', undefined]]);\n /**\n * Optional decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Optional = makeParamDecorator('Optional', []);\n /**\n * Injectable decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Injectable = (makeDecorator('Injectable', []));\n /**\n * Self decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Self = makeParamDecorator('Self', []);\n /**\n * SkipSelf decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ SkipSelf = makeParamDecorator('SkipSelf', []);\n /**\n * Host decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Host = makeParamDecorator('Host', []);\n\n /**\n * Creates a token that can be used in a DI Provider.\n *\n * ### Example ([live demo](http://plnkr.co/edit/Ys9ezXpj2Mnoy3Uc8KBp?p=preview))\n *\n * ```typescript\n * var t = new OpaqueToken(\"value\");\n *\n * var injector = Injector.resolveAndCreate([\n * {provide: t, useValue: \"bindingValue\"}\n * ]);\n *\n * expect(injector.get(t)).toEqual(\"bindingValue\");\n * ```\n *\n * Using an `OpaqueToken` is preferable to using strings as tokens because of possible collisions\n * caused by multiple providers using the same string as two different tokens.\n *\n * Using an `OpaqueToken` is preferable to using an `Object` as tokens because it provides better\n * error messages.\n * @stable\n */\n // so that metadata is gathered for this class\n var OpaqueToken = (function () {\n /**\n * @param {?} _desc\n */\n function OpaqueToken(_desc) {\n this._desc = _desc;\n }\n /**\n * @return {?}\n */\n OpaqueToken.prototype.toString = function () { return \"Token \" + this._desc; };\n OpaqueToken.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n OpaqueToken.ctorParameters = function () { return [\n null,\n ]; };\n return OpaqueToken;\n }());\n\n /**\n * This token can be used to create a virtual provider that will populate the\n * `entryComponents` fields of components and ng modules based on its `useValue`.\n * All components that are referenced in the `useValue` value (either directly\n * or in a nested array or map) will be added to the `entryComponents` property.\n *\n * ### Example\n * The following example shows how the router can populate the `entryComponents`\n * field of an NgModule based on the router configuration which refers\n * to components.\n *\n * ```typescript\n * // helper function inside the router\n * function provideRoutes(routes) {\n * return [\n * {provide: ROUTES, useValue: routes},\n * {provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: routes, multi: true}\n * ];\n * }\n *\n * // user code\n * let routes = [\n * {path: '/root', component: RootComp},\n * {path: '/teams', component: TeamsComp}\n * ];\n *\n * @NgModule({\n * providers: [provideRoutes(routes)]\n * })\n * class ModuleWithRoutes {}\n * ```\n *\n * @experimental\n */\n var /** @type {?} */ ANALYZE_FOR_ENTRY_COMPONENTS = new OpaqueToken('AnalyzeForEntryComponents');\n /**\n * Attribute decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Attribute = makeParamDecorator('Attribute', [['attributeName', undefined]]);\n /**\n * Base class for query metadata.\n * *\n * See {@link ContentChildren}, {@link ContentChild}, {@link ViewChildren}, {@link ViewChild} for\n * more information.\n * *\n * @abstract\n */\n var Query = (function () {\n function Query() {\n }\n return Query;\n }());\n /**\n * ContentChildren decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ ContentChildren = (makePropDecorator('ContentChildren', [\n ['selector', undefined], {\n first: false,\n isViewQuery: false,\n descendants: false,\n read: undefined,\n }\n ], Query));\n /**\n * @whatItDoes Configures a content query.\n *\n * @howToUse\n *\n * {@example core/di/ts/contentChild/content_child_howto.ts region='HowTo'}\n *\n * @description\n *\n * You can use ContentChild to get the first element or the directive matching the selector from the\n * content DOM. If the content DOM changes, and a new child matches the selector,\n * the property will be updated.\n *\n * Content queries are set before the `ngAfterContentInit` callback is called.\n *\n * **Metadata Properties**:\n *\n * * **selector** - the directive type or the name used for querying.\n * * **read** - read a different token from the queried element.\n *\n * Let's look at an example:\n *\n * {@example core/di/ts/contentChild/content_child_example.ts region='Component'}\n *\n * **npm package**: `@angular/core`\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ ContentChild = makePropDecorator('ContentChild', [\n ['selector', undefined], {\n first: true,\n isViewQuery: false,\n descendants: true,\n read: undefined,\n }\n ], Query);\n /**\n * @whatItDoes Configures a view query.\n *\n * @howToUse\n *\n * {@example core/di/ts/viewChildren/view_children_howto.ts region='HowTo'}\n *\n * @description\n *\n * You can use ViewChildren to get the {@link QueryList} of elements or directives from the\n * view DOM. Any time a child element is added, removed, or moved, the query list will be updated,\n * and the changes observable of the query list will emit a new value.\n *\n * View queries are set before the `ngAfterViewInit` callback is called.\n *\n * **Metadata Properties**:\n *\n * * **selector** - the directive type or the name used for querying.\n * * **read** - read a different token from the queried elements.\n *\n * Let's look at an example:\n *\n * {@example core/di/ts/viewChildren/view_children_example.ts region='Component'}\n *\n * **npm package**: `@angular/core`\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ ViewChildren = makePropDecorator('ViewChildren', [\n ['selector', undefined], {\n first: false,\n isViewQuery: true,\n descendants: true,\n read: undefined,\n }\n ], Query);\n /**\n * ViewChild decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ ViewChild = makePropDecorator('ViewChild', [\n ['selector', undefined], {\n first: true,\n isViewQuery: true,\n descendants: true,\n read: undefined,\n }\n ], Query);\n\n var ChangeDetectionStrategy = {};\n ChangeDetectionStrategy.OnPush = 0;\n ChangeDetectionStrategy.Default = 1;\n ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush] = \"OnPush\";\n ChangeDetectionStrategy[ChangeDetectionStrategy.Default] = \"Default\";\n var ChangeDetectorStatus = {};\n ChangeDetectorStatus.CheckOnce = 0;\n ChangeDetectorStatus.Checked = 1;\n ChangeDetectorStatus.CheckAlways = 2;\n ChangeDetectorStatus.Detached = 3;\n ChangeDetectorStatus.Errored = 4;\n ChangeDetectorStatus.Destroyed = 5;\n ChangeDetectorStatus[ChangeDetectorStatus.CheckOnce] = \"CheckOnce\";\n ChangeDetectorStatus[ChangeDetectorStatus.Checked] = \"Checked\";\n ChangeDetectorStatus[ChangeDetectorStatus.CheckAlways] = \"CheckAlways\";\n ChangeDetectorStatus[ChangeDetectorStatus.Detached] = \"Detached\";\n ChangeDetectorStatus[ChangeDetectorStatus.Errored] = \"Errored\";\n ChangeDetectorStatus[ChangeDetectorStatus.Destroyed] = \"Destroyed\";\n /**\n * @param {?} changeDetectionStrategy\n * @return {?}\n */\n function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {\n return isBlank(changeDetectionStrategy) ||\n changeDetectionStrategy === ChangeDetectionStrategy.Default;\n }\n\n /**\n * Directive decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Directive = (makeDecorator('Directive', {\n selector: undefined,\n inputs: undefined,\n outputs: undefined,\n host: undefined,\n providers: undefined,\n exportAs: undefined,\n queries: undefined\n }));\n /**\n * Component decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Component = (makeDecorator('Component', {\n selector: undefined,\n inputs: undefined,\n outputs: undefined,\n host: undefined,\n exportAs: undefined,\n moduleId: undefined,\n providers: undefined,\n viewProviders: undefined,\n changeDetection: ChangeDetectionStrategy.Default,\n queries: undefined,\n templateUrl: undefined,\n template: undefined,\n styleUrls: undefined,\n styles: undefined,\n animations: undefined,\n encapsulation: undefined,\n interpolation: undefined,\n entryComponents: undefined\n }, Directive));\n /**\n * Pipe decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Pipe = (makeDecorator('Pipe', {\n name: undefined,\n pure: true,\n }));\n /**\n * Input decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Input = makePropDecorator('Input', [['bindingPropertyName', undefined]]);\n /**\n * Output decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ Output = makePropDecorator('Output', [['bindingPropertyName', undefined]]);\n /**\n * HostBinding decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ HostBinding = makePropDecorator('HostBinding', [['hostPropertyName', undefined]]);\n /**\n * HostListener decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ HostListener = makePropDecorator('HostListener', [['eventName', undefined], ['args', []]]);\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var LifecycleHooks = {};\n LifecycleHooks.OnInit = 0;\n LifecycleHooks.OnDestroy = 1;\n LifecycleHooks.DoCheck = 2;\n LifecycleHooks.OnChanges = 3;\n LifecycleHooks.AfterContentInit = 4;\n LifecycleHooks.AfterContentChecked = 5;\n LifecycleHooks.AfterViewInit = 6;\n LifecycleHooks.AfterViewChecked = 7;\n LifecycleHooks[LifecycleHooks.OnInit] = \"OnInit\";\n LifecycleHooks[LifecycleHooks.OnDestroy] = \"OnDestroy\";\n LifecycleHooks[LifecycleHooks.DoCheck] = \"DoCheck\";\n LifecycleHooks[LifecycleHooks.OnChanges] = \"OnChanges\";\n LifecycleHooks[LifecycleHooks.AfterContentInit] = \"AfterContentInit\";\n LifecycleHooks[LifecycleHooks.AfterContentChecked] = \"AfterContentChecked\";\n LifecycleHooks[LifecycleHooks.AfterViewInit] = \"AfterViewInit\";\n LifecycleHooks[LifecycleHooks.AfterViewChecked] = \"AfterViewChecked\";\n var /** @type {?} */ LIFECYCLE_HOOKS_VALUES = [\n LifecycleHooks.OnInit, LifecycleHooks.OnDestroy, LifecycleHooks.DoCheck, LifecycleHooks.OnChanges,\n LifecycleHooks.AfterContentInit, LifecycleHooks.AfterContentChecked, LifecycleHooks.AfterViewInit,\n LifecycleHooks.AfterViewChecked\n ];\n /**\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnChanges'}\n * *\n * `ngOnChanges` is called right after the data-bound properties have been checked and before view\n * and content children are checked if at least one of them has changed.\n * The `changes` parameter contains the changed properties.\n * *\n * See {@linkDocs guide/lifecycle-hooks#onchanges \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var OnChanges = (function () {\n function OnChanges() {\n }\n /**\n * @abstract\n * @param {?} changes\n * @return {?}\n */\n OnChanges.prototype.ngOnChanges = function (changes) { };\n return OnChanges;\n }());\n /**\n * initialized.\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnInit'}\n * *\n * `ngOnInit` is called right after the directive's data-bound properties have been checked for the\n * first time, and before any of its children have been checked. It is invoked only once when the\n * directive is instantiated.\n * *\n * See {@linkDocs guide/lifecycle-hooks \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var OnInit = (function () {\n function OnInit() {\n }\n /**\n * @abstract\n * @return {?}\n */\n OnInit.prototype.ngOnInit = function () { };\n return OnInit;\n }());\n /**\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='DoCheck'}\n * *\n * `ngDoCheck` gets called to check the changes in the directives in addition to the default\n * algorithm. The default change detection algorithm looks for differences by comparing\n * bound-property values by reference across change detection runs.\n * *\n * Note that a directive typically should not use both `DoCheck` and {@link OnChanges} to respond to\n * changes on the same input, as `ngOnChanges` will continue to be called when the default change\n * detector detects changes.\n * *\n * See {@link KeyValueDiffers} and {@link IterableDiffers} for implementing custom dirty checking\n * for collections.\n * *\n * See {@linkDocs guide/lifecycle-hooks#docheck \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var DoCheck = (function () {\n function DoCheck() {\n }\n /**\n * @abstract\n * @return {?}\n */\n DoCheck.prototype.ngDoCheck = function () { };\n return DoCheck;\n }());\n /**\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='OnDestroy'}\n * *\n * `ngOnDestroy` callback is typically used for any custom cleanup that needs to occur when the\n * instance is destroyed.\n * *\n * See {@linkDocs guide/lifecycle-hooks \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var OnDestroy = (function () {\n function OnDestroy() {\n }\n /**\n * @abstract\n * @return {?}\n */\n OnDestroy.prototype.ngOnDestroy = function () { };\n return OnDestroy;\n }());\n /**\n * *\n * initialized.\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentInit'}\n * *\n * See {@linkDocs guide/lifecycle-hooks#aftercontent \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var AfterContentInit = (function () {\n function AfterContentInit() {\n }\n /**\n * @abstract\n * @return {?}\n */\n AfterContentInit.prototype.ngAfterContentInit = function () { };\n return AfterContentInit;\n }());\n /**\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterContentChecked'}\n * *\n * See {@linkDocs guide/lifecycle-hooks#aftercontent \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var AfterContentChecked = (function () {\n function AfterContentChecked() {\n }\n /**\n * @abstract\n * @return {?}\n */\n AfterContentChecked.prototype.ngAfterContentChecked = function () { };\n return AfterContentChecked;\n }());\n /**\n * initialized.\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewInit'}\n * *\n * See {@linkDocs guide/lifecycle-hooks#afterview \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var AfterViewInit = (function () {\n function AfterViewInit() {\n }\n /**\n * @abstract\n * @return {?}\n */\n AfterViewInit.prototype.ngAfterViewInit = function () { };\n return AfterViewInit;\n }());\n /**\n * {@example core/ts/metadata/lifecycle_hooks_spec.ts region='AfterViewChecked'}\n * *\n * See {@linkDocs guide/lifecycle-hooks#afterview \"Lifecycle Hooks Guide\"}.\n * *\n * @abstract\n */\n var AfterViewChecked = (function () {\n function AfterViewChecked() {\n }\n /**\n * @abstract\n * @return {?}\n */\n AfterViewChecked.prototype.ngAfterViewChecked = function () { };\n return AfterViewChecked;\n }());\n\n /**\n * Defines a schema that will allow:\n * - any non-Angular elements with a `-` in their name,\n * - any properties on elements with a `-` in their name which is the common rule for custom\n * elements.\n *\n * @stable\n */\n var /** @type {?} */ CUSTOM_ELEMENTS_SCHEMA = {\n name: 'custom-elements'\n };\n /**\n * Defines a schema that will allow any property on any element.\n *\n * @experimental\n */\n var /** @type {?} */ NO_ERRORS_SCHEMA = {\n name: 'no-errors-schema'\n };\n /**\n * NgModule decorator and metadata.\n *\n * @stable\n * @Annotation\n */\n var /** @type {?} */ NgModule = (makeDecorator('NgModule', {\n providers: undefined,\n declarations: undefined,\n imports: undefined,\n exports: undefined,\n entryComponents: undefined,\n bootstrap: undefined,\n schemas: undefined,\n id: undefined,\n }));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var ViewEncapsulation = {};\n ViewEncapsulation.Emulated = 0;\n ViewEncapsulation.Native = 1;\n ViewEncapsulation.None = 2;\n ViewEncapsulation[ViewEncapsulation.Emulated] = \"Emulated\";\n ViewEncapsulation[ViewEncapsulation.Native] = \"Native\";\n ViewEncapsulation[ViewEncapsulation.None] = \"None\";\n /**\n * Metadata properties available for configuring Views.\n * *\n * For details on the `@Component` annotation, see {@link Component}.\n * *\n * ### Example\n * *\n * ```\n * selector: 'greet',\n * template: 'Hello {{name}}!',\n * })\n * class Greet {\n * name: string;\n * *\n * constructor() {\n * this.name = 'World';\n * }\n * }\n * ```\n * *\n * @deprecated Use Component instead.\n * *\n * {@link Component}\n */\n var ViewMetadata = (function () {\n /**\n * @param {?=} __0\n */\n function ViewMetadata(_a) {\n var _b = _a === void 0 ? {} : _a, templateUrl = _b.templateUrl, template = _b.template, encapsulation = _b.encapsulation, styles = _b.styles, styleUrls = _b.styleUrls, animations = _b.animations, interpolation = _b.interpolation;\n this.templateUrl = templateUrl;\n this.template = template;\n this.styleUrls = styleUrls;\n this.styles = styles;\n this.encapsulation = encapsulation;\n this.animations = animations;\n this.interpolation = interpolation;\n }\n return ViewMetadata;\n }());\n\n /**\n * *\n */\n var Version = (function () {\n /**\n * @param {?} full\n */\n function Version(full) {\n this.full = full;\n }\n Object.defineProperty(Version.prototype, \"major\", {\n /**\n * @return {?}\n */\n get: function () { return this.full.split('.')[0]; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Version.prototype, \"minor\", {\n /**\n * @return {?}\n */\n get: function () { return this.full.split('.')[1]; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Version.prototype, \"patch\", {\n /**\n * @return {?}\n */\n get: function () { return this.full.split('.').slice(2).join('.'); },\n enumerable: true,\n configurable: true\n });\n return Version;\n }());\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new Version('2.4.1');\n\n /**\n * Allows to refer to references which are not yet defined.\n * *\n * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of\n * DI is declared,\n * but not yet defined. It is also used when the `token` which we use when creating a query is not\n * yet defined.\n * *\n * ### Example\n * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='forward_ref'}\n * @param {?} forwardRefFn\n * @return {?}\n */\n function forwardRef(forwardRefFn) {\n ((forwardRefFn)).__forward_ref__ = forwardRef;\n ((forwardRefFn)).toString = function () { return stringify(this()); };\n return (((forwardRefFn)));\n }\n /**\n * Lazily retrieves the reference value from a forwardRef.\n * *\n * Acts as the identity function when given a non-forward-ref value.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/GU72mJrk1fiodChcmiDR?p=preview))\n * *\n * {@example core/di/ts/forward_ref/forward_ref_spec.ts region='resolve_forward_ref'}\n * *\n * See: {@link forwardRef}\n * @param {?} type\n * @return {?}\n */\n function resolveForwardRef(type) {\n if (typeof type === 'function' && type.hasOwnProperty('__forward_ref__') &&\n type.__forward_ref__ === forwardRef) {\n return ((type))();\n }\n else {\n return type;\n }\n }\n\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @return {?}\n */\n function unimplemented() {\n throw new Error('unimplemented');\n }\n /**\n * @stable\n */\n var BaseError = (function (_super) {\n __extends(BaseError, _super);\n /**\n * @param {?} message\n */\n function BaseError(message) {\n _super.call(this, message);\n // Errors don't use current this, instead they create a new instance.\n // We have to do forward all of our api to the nativeInstance.\n // TODO(bradfordcsmith): Remove this hack when\n // google/closure-compiler/issues/2102 is fixed.\n var nativeError = new Error(message);\n this._nativeError = nativeError;\n }\n Object.defineProperty(BaseError.prototype, \"message\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.message; },\n /**\n * @param {?} message\n * @return {?}\n */\n set: function (message) { this._nativeError.message = message; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"name\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.name; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () { return ((this._nativeError)).stack; },\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) { ((this._nativeError)).stack = value; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n return BaseError;\n }(Error));\n /**\n * @stable\n */\n var WrappedError = (function (_super) {\n __extends(WrappedError, _super);\n /**\n * @param {?} message\n * @param {?} error\n */\n function WrappedError(message, error) {\n _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n this.originalError = error;\n }\n Object.defineProperty(WrappedError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () {\n return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n .stack;\n },\n enumerable: true,\n configurable: true\n });\n return WrappedError;\n }(BaseError));\n\n var /** @type {?} */ _THROW_IF_NOT_FOUND = new Object();\n var /** @type {?} */ THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;\n var _NullInjector = (function () {\n function _NullInjector() {\n }\n /**\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n _NullInjector.prototype.get = function (token, notFoundValue) {\n if (notFoundValue === void 0) { notFoundValue = _THROW_IF_NOT_FOUND; }\n if (notFoundValue === _THROW_IF_NOT_FOUND) {\n throw new Error(\"No provider for \" + stringify(token) + \"!\");\n }\n return notFoundValue;\n };\n return _NullInjector;\n }());\n /**\n * ```\n * const injector: Injector = ...;\n * injector.get(...);\n * ```\n * *\n * For more details, see the {@linkDocs guide/dependency-injection \"Dependency Injection Guide\"}.\n * *\n * ### Example\n * *\n * {@example core/di/ts/injector_spec.ts region='Injector'}\n * *\n * `Injector` returns itself when given `Injector` as a token:\n * {@example core/di/ts/injector_spec.ts region='injectInjector'}\n * *\n * @abstract\n */\n var Injector = (function () {\n function Injector() {\n }\n /**\n * Retrieves an instance from the injector based on the provided token.\n * If not found:\n * - Throws {@link NoProviderError} if no `notFoundValue` that is not equal to\n * Injector.THROW_IF_NOT_FOUND is given\n * - Returns the `notFoundValue` otherwise\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n Injector.prototype.get = function (token, notFoundValue) { return unimplemented(); };\n Injector.THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;\n Injector.NULL = new _NullInjector();\n return Injector;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @param {?} keys\n * @return {?}\n */\n function findFirstClosedCycle(keys) {\n var /** @type {?} */ res = [];\n for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n if (res.indexOf(keys[i]) > -1) {\n res.push(keys[i]);\n return res;\n }\n res.push(keys[i]);\n }\n return res;\n }\n /**\n * @param {?} keys\n * @return {?}\n */\n function constructResolvingPath(keys) {\n if (keys.length > 1) {\n var /** @type {?} */ reversed = findFirstClosedCycle(keys.slice().reverse());\n var /** @type {?} */ tokenStrs = reversed.map(function (k) { return stringify(k.token); });\n return ' (' + tokenStrs.join(' -> ') + ')';\n }\n return '';\n }\n /**\n * Base class for all errors arising from misconfigured providers.\n */\n var AbstractProviderError = (function (_super) {\n __extends$1(AbstractProviderError, _super);\n /**\n * @param {?} injector\n * @param {?} key\n * @param {?} constructResolvingMessage\n */\n function AbstractProviderError(injector, key, constructResolvingMessage) {\n _super.call(this, 'DI Error');\n this.keys = [key];\n this.injectors = [injector];\n this.constructResolvingMessage = constructResolvingMessage;\n this.message = this.constructResolvingMessage(this.keys);\n }\n /**\n * @param {?} injector\n * @param {?} key\n * @return {?}\n */\n AbstractProviderError.prototype.addKey = function (injector, key) {\n this.injectors.push(injector);\n this.keys.push(key);\n this.message = this.constructResolvingMessage(this.keys);\n };\n return AbstractProviderError;\n }(BaseError));\n /**\n * Thrown when trying to retrieve a dependency by key from {@link Injector}, but the\n * {@link Injector} does not have a {@link Provider} for the given key.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview))\n * *\n * ```typescript\n * class A {\n * constructor(b:B) {}\n * }\n * *\n * expect(() => Injector.resolveAndCreate([A])).toThrowError();\n * ```\n */\n var NoProviderError = (function (_super) {\n __extends$1(NoProviderError, _super);\n /**\n * @param {?} injector\n * @param {?} key\n */\n function NoProviderError(injector, key) {\n _super.call(this, injector, key, function (keys) {\n var first = stringify(keys[0].token);\n return \"No provider for \" + first + \"!\" + constructResolvingPath(keys);\n });\n }\n return NoProviderError;\n }(AbstractProviderError));\n /**\n * Thrown when dependencies form a cycle.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info))\n * *\n * ```typescript\n * var injector = Injector.resolveAndCreate([\n * {provide: \"one\", useFactory: (two) => \"two\", deps: [[new Inject(\"two\")]]},\n * {provide: \"two\", useFactory: (one) => \"one\", deps: [[new Inject(\"one\")]]}\n * ]);\n * *\n * expect(() => injector.get(\"one\")).toThrowError();\n * ```\n * *\n * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.\n */\n var CyclicDependencyError = (function (_super) {\n __extends$1(CyclicDependencyError, _super);\n /**\n * @param {?} injector\n * @param {?} key\n */\n function CyclicDependencyError(injector, key) {\n _super.call(this, injector, key, function (keys) {\n return \"Cannot instantiate cyclic dependency!\" + constructResolvingPath(keys);\n });\n }\n return CyclicDependencyError;\n }(AbstractProviderError));\n /**\n * Thrown when a constructing type returns with an Error.\n * *\n * The `InstantiationError` class contains the original error plus the dependency graph which caused\n * this object to be instantiated.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview))\n * *\n * ```typescript\n * class A {\n * constructor() {\n * throw new Error('message');\n * }\n * }\n * *\n * var injector = Injector.resolveAndCreate([A]);\n * try {\n * injector.get(A);\n * } catch (e) {\n * expect(e instanceof InstantiationError).toBe(true);\n * expect(e.originalException.message).toEqual(\"message\");\n * expect(e.originalStack).toBeDefined();\n * }\n * ```\n */\n var InstantiationError = (function (_super) {\n __extends$1(InstantiationError, _super);\n /**\n * @param {?} injector\n * @param {?} originalException\n * @param {?} originalStack\n * @param {?} key\n */\n function InstantiationError(injector, originalException, originalStack, key) {\n _super.call(this, 'DI Error', originalException);\n this.keys = [key];\n this.injectors = [injector];\n }\n /**\n * @param {?} injector\n * @param {?} key\n * @return {?}\n */\n InstantiationError.prototype.addKey = function (injector, key) {\n this.injectors.push(injector);\n this.keys.push(key);\n };\n Object.defineProperty(InstantiationError.prototype, \"message\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ first = stringify(this.keys[0].token);\n return this.originalError.message + \": Error during instantiation of \" + first + \"!\" + constructResolvingPath(this.keys) + \".\";\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(InstantiationError.prototype, \"causeKey\", {\n /**\n * @return {?}\n */\n get: function () { return this.keys[0]; },\n enumerable: true,\n configurable: true\n });\n return InstantiationError;\n }(WrappedError));\n /**\n * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}\n * creation.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview))\n * *\n * ```typescript\n * expect(() => Injector.resolveAndCreate([\"not a type\"])).toThrowError();\n * ```\n */\n var InvalidProviderError = (function (_super) {\n __extends$1(InvalidProviderError, _super);\n /**\n * @param {?} provider\n */\n function InvalidProviderError(provider) {\n _super.call(this, \"Invalid provider - only instances of Provider and Type are allowed, got: \" + provider);\n }\n return InvalidProviderError;\n }(BaseError));\n /**\n * Thrown when the class has no annotation information.\n * *\n * Lack of annotation information prevents the {@link Injector} from determining which dependencies\n * need to be injected into the constructor.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview))\n * *\n * ```typescript\n * class A {\n * constructor(b) {}\n * }\n * *\n * expect(() => Injector.resolveAndCreate([A])).toThrowError();\n * ```\n * *\n * This error is also thrown when the class not marked with {@link Injectable} has parameter types.\n * *\n * ```typescript\n * class B {}\n * *\n * class A {\n * constructor(b:B) {} // no information about the parameter types of A is available at runtime.\n * }\n * *\n * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();\n * ```\n */\n var NoAnnotationError = (function (_super) {\n __extends$1(NoAnnotationError, _super);\n /**\n * @param {?} typeOrFunc\n * @param {?} params\n */\n function NoAnnotationError(typeOrFunc, params) {\n _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params));\n }\n /**\n * @param {?} typeOrFunc\n * @param {?} params\n * @return {?}\n */\n NoAnnotationError._genMessage = function (typeOrFunc, params) {\n var /** @type {?} */ signature = [];\n for (var /** @type {?} */ i = 0, /** @type {?} */ ii = params.length; i < ii; i++) {\n var /** @type {?} */ parameter = params[i];\n if (!parameter || parameter.length == 0) {\n signature.push('?');\n }\n else {\n signature.push(parameter.map(stringify).join(' '));\n }\n }\n return 'Cannot resolve all parameters for \\'' + stringify(typeOrFunc) + '\\'(' +\n signature.join(', ') + '). ' +\n 'Make sure that all the parameters are decorated with Inject or have valid type annotations and that \\'' +\n stringify(typeOrFunc) + '\\' is decorated with Injectable.';\n };\n return NoAnnotationError;\n }(BaseError));\n /**\n * Thrown when getting an object by index.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview))\n * *\n * ```typescript\n * class A {}\n * *\n * var injector = Injector.resolveAndCreate([A]);\n * *\n * expect(() => injector.getAt(100)).toThrowError();\n * ```\n */\n var OutOfBoundsError = (function (_super) {\n __extends$1(OutOfBoundsError, _super);\n /**\n * @param {?} index\n */\n function OutOfBoundsError(index) {\n _super.call(this, \"Index \" + index + \" is out-of-bounds.\");\n }\n return OutOfBoundsError;\n }(BaseError));\n /**\n * Thrown when a multi provider and a regular provider are bound to the same token.\n * *\n * ### Example\n * *\n * ```typescript\n * expect(() => Injector.resolveAndCreate([\n * { provide: \"Strings\", useValue: \"string1\", multi: true},\n * { provide: \"Strings\", useValue: \"string2\", multi: false}\n * ])).toThrowError();\n * ```\n */\n var MixingMultiProvidersWithRegularProvidersError = (function (_super) {\n __extends$1(MixingMultiProvidersWithRegularProvidersError, _super);\n /**\n * @param {?} provider1\n * @param {?} provider2\n */\n function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) {\n _super.call(this, 'Cannot mix multi providers and regular providers, got: ' + provider1.toString() + ' ' +\n provider2.toString());\n }\n return MixingMultiProvidersWithRegularProvidersError;\n }(BaseError));\n\n /**\n * A unique object used for retrieving items from the {@link ReflectiveInjector}.\n * *\n * Keys have:\n * - a system-wide unique `id`.\n * - a `token`.\n * *\n * `Key` is used internally by {@link ReflectiveInjector} because its system-wide unique `id` allows\n * the\n * injector to store created objects in a more efficient way.\n * *\n * `Key` should not be created directly. {@link ReflectiveInjector} creates keys automatically when\n * resolving\n * providers.\n */\n var ReflectiveKey = (function () {\n /**\n * Private\n * @param {?} token\n * @param {?} id\n */\n function ReflectiveKey(token, id) {\n this.token = token;\n this.id = id;\n if (!token) {\n throw new Error('Token must be defined!');\n }\n }\n Object.defineProperty(ReflectiveKey.prototype, \"displayName\", {\n /**\n * Returns a stringified token.\n * @return {?}\n */\n get: function () { return stringify(this.token); },\n enumerable: true,\n configurable: true\n });\n /**\n * Retrieves a `Key` for a token.\n * @param {?} token\n * @return {?}\n */\n ReflectiveKey.get = function (token) {\n return _globalKeyRegistry.get(resolveForwardRef(token));\n };\n Object.defineProperty(ReflectiveKey, \"numberOfKeys\", {\n /**\n * @return {?} the number of keys registered in the system.\n */\n get: function () { return _globalKeyRegistry.numberOfKeys; },\n enumerable: true,\n configurable: true\n });\n return ReflectiveKey;\n }());\n /**\n * @internal\n */\n var KeyRegistry = (function () {\n function KeyRegistry() {\n this._allKeys = new Map();\n }\n /**\n * @param {?} token\n * @return {?}\n */\n KeyRegistry.prototype.get = function (token) {\n if (token instanceof ReflectiveKey)\n return token;\n if (this._allKeys.has(token)) {\n return this._allKeys.get(token);\n }\n var /** @type {?} */ newKey = new ReflectiveKey(token, ReflectiveKey.numberOfKeys);\n this._allKeys.set(token, newKey);\n return newKey;\n };\n Object.defineProperty(KeyRegistry.prototype, \"numberOfKeys\", {\n /**\n * @return {?}\n */\n get: function () { return this._allKeys.size; },\n enumerable: true,\n configurable: true\n });\n return KeyRegistry;\n }());\n var /** @type {?} */ _globalKeyRegistry = new KeyRegistry();\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * @whatItDoes Represents a type that a Component or other object is instances of.\n *\n * @description\n *\n * An example of a `Type` is `MyCustomComponent` class, which in JavaScript is be represented by\n * the `MyCustomComponent` constructor function.\n *\n * @stable\n */\n var /** @type {?} */ Type = Function;\n\n /**\n * Attention: This regex has to hold even if the code is minified!\n */\n var /** @type {?} */ DELEGATE_CTOR = /^function\\s+\\S+\\(\\)\\s*{\\s*(\"use strict\";)?\\s*(return\\s+)?\\S+\\.apply\\(this,\\s*arguments\\)/;\n var ReflectionCapabilities = (function () {\n /**\n * @param {?=} reflect\n */\n function ReflectionCapabilities(reflect) {\n this._reflect = reflect || global$1.Reflect;\n }\n /**\n * @return {?}\n */\n ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };\n /**\n * @param {?} t\n * @return {?}\n */\n ReflectionCapabilities.prototype.factory = function (t) { return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return new (t.bind.apply(t, [void 0].concat(args)))();\n }; };\n /**\n * @param {?} paramTypes\n * @param {?} paramAnnotations\n * @return {?}\n */\n ReflectionCapabilities.prototype._zipTypesAndAnnotations = function (paramTypes, paramAnnotations) {\n var /** @type {?} */ result;\n if (typeof paramTypes === 'undefined') {\n result = new Array(paramAnnotations.length);\n }\n else {\n result = new Array(paramTypes.length);\n }\n for (var /** @type {?} */ i = 0; i < result.length; i++) {\n // TS outputs Object for parameters without types, while Traceur omits\n // the annotations. For now we preserve the Traceur behavior to aid\n // migration, but this can be revisited.\n if (typeof paramTypes === 'undefined') {\n result[i] = [];\n }\n else if (paramTypes[i] != Object) {\n result[i] = [paramTypes[i]];\n }\n else {\n result[i] = [];\n }\n if (paramAnnotations && isPresent(paramAnnotations[i])) {\n result[i] = result[i].concat(paramAnnotations[i]);\n }\n }\n return result;\n };\n /**\n * @param {?} type\n * @param {?} parentCtor\n * @return {?}\n */\n ReflectionCapabilities.prototype._ownParameters = function (type, parentCtor) {\n // If we have no decorators, we only have function.length as metadata.\n // In that case, to detect whether a child class declared an own constructor or not,\n // we need to look inside of that constructor to check whether it is\n // just calling the parent.\n // This also helps to work around for https://github.com/Microsoft/TypeScript/issues/12439\n // that sets 'design:paramtypes' to []\n // if a class inherits from another class but has no ctor declared itself.\n if (DELEGATE_CTOR.exec(type.toString())) {\n return null;\n }\n // Prefer the direct API.\n if (((type)).parameters && ((type)).parameters !== parentCtor.parameters) {\n return ((type)).parameters;\n }\n // API of tsickle for lowering decorators to properties on the class.\n var /** @type {?} */ tsickleCtorParams = ((type)).ctorParameters;\n if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {\n // Newer tsickle uses a function closure\n // Retain the non-function case for compatibility with older tsickle\n var /** @type {?} */ ctorParameters = typeof tsickleCtorParams === 'function' ? tsickleCtorParams() : tsickleCtorParams;\n var /** @type {?} */ paramTypes = ctorParameters.map(function (ctorParam) { return ctorParam && ctorParam.type; });\n var /** @type {?} */ paramAnnotations = ctorParameters.map(function (ctorParam) {\n return ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators);\n });\n return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n }\n // API for metadata created by invoking the decorators.\n if (isPresent(this._reflect) && isPresent(this._reflect.getOwnMetadata)) {\n var /** @type {?} */ paramAnnotations = this._reflect.getOwnMetadata('parameters', type);\n var /** @type {?} */ paramTypes = this._reflect.getOwnMetadata('design:paramtypes', type);\n if (paramTypes || paramAnnotations) {\n return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);\n }\n }\n // If a class has no decorators, at least create metadata\n // based on function.length.\n // Note: We know that this is a real constructor as we checked\n // the content of the constructor above.\n return new Array(((type.length))).fill(undefined);\n };\n /**\n * @param {?} type\n * @return {?}\n */\n ReflectionCapabilities.prototype.parameters = function (type) {\n // Note: only report metadata if we have at least one class decorator\n // to stay in sync with the static reflector.\n var /** @type {?} */ parentCtor = Object.getPrototypeOf(type.prototype).constructor;\n var /** @type {?} */ parameters = this._ownParameters(type, parentCtor);\n if (!parameters && parentCtor !== Object) {\n parameters = this.parameters(parentCtor);\n }\n return parameters || [];\n };\n /**\n * @param {?} typeOrFunc\n * @param {?} parentCtor\n * @return {?}\n */\n ReflectionCapabilities.prototype._ownAnnotations = function (typeOrFunc, parentCtor) {\n // Prefer the direct API.\n if (((typeOrFunc)).annotations && ((typeOrFunc)).annotations !== parentCtor.annotations) {\n var /** @type {?} */ annotations = ((typeOrFunc)).annotations;\n if (typeof annotations === 'function' && annotations.annotations) {\n annotations = annotations.annotations;\n }\n return annotations;\n }\n // API of tsickle for lowering decorators to properties on the class.\n if (((typeOrFunc)).decorators && ((typeOrFunc)).decorators !== parentCtor.decorators) {\n return convertTsickleDecoratorIntoMetadata(((typeOrFunc)).decorators);\n }\n // API for metadata created by invoking the decorators.\n if (this._reflect && this._reflect.getOwnMetadata) {\n return this._reflect.getOwnMetadata('annotations', typeOrFunc);\n }\n };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {\n var /** @type {?} */ parentCtor = Object.getPrototypeOf(typeOrFunc.prototype).constructor;\n var /** @type {?} */ ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];\n var /** @type {?} */ parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];\n return parentAnnotations.concat(ownAnnotations);\n };\n /**\n * @param {?} typeOrFunc\n * @param {?} parentCtor\n * @return {?}\n */\n ReflectionCapabilities.prototype._ownPropMetadata = function (typeOrFunc, parentCtor) {\n // Prefer the direct API.\n if (((typeOrFunc)).propMetadata &&\n ((typeOrFunc)).propMetadata !== parentCtor.propMetadata) {\n var /** @type {?} */ propMetadata = ((typeOrFunc)).propMetadata;\n if (typeof propMetadata === 'function' && propMetadata.propMetadata) {\n propMetadata = propMetadata.propMetadata;\n }\n return propMetadata;\n }\n // API of tsickle for lowering decorators to properties on the class.\n if (((typeOrFunc)).propDecorators &&\n ((typeOrFunc)).propDecorators !== parentCtor.propDecorators) {\n var /** @type {?} */ propDecorators_1 = ((typeOrFunc)).propDecorators;\n var /** @type {?} */ propMetadata_1 = ({});\n Object.keys(propDecorators_1).forEach(function (prop) {\n propMetadata_1[prop] = convertTsickleDecoratorIntoMetadata(propDecorators_1[prop]);\n });\n return propMetadata_1;\n }\n // API for metadata created by invoking the decorators.\n if (this._reflect && this._reflect.getOwnMetadata) {\n return this._reflect.getOwnMetadata('propMetadata', typeOrFunc);\n }\n };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {\n var /** @type {?} */ parentCtor = Object.getPrototypeOf(typeOrFunc.prototype).constructor;\n var /** @type {?} */ propMetadata = {};\n if (parentCtor !== Object) {\n var /** @type {?} */ parentPropMetadata_1 = this.propMetadata(parentCtor);\n Object.keys(parentPropMetadata_1).forEach(function (propName) {\n propMetadata[propName] = parentPropMetadata_1[propName];\n });\n }\n var /** @type {?} */ ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);\n if (ownPropMetadata) {\n Object.keys(ownPropMetadata).forEach(function (propName) {\n var /** @type {?} */ decorators = [];\n if (propMetadata.hasOwnProperty(propName)) {\n decorators.push.apply(decorators, propMetadata[propName]);\n }\n decorators.push.apply(decorators, ownPropMetadata[propName]);\n propMetadata[propName] = decorators;\n });\n }\n return propMetadata;\n };\n /**\n * @param {?} type\n * @param {?} lcProperty\n * @return {?}\n */\n ReflectionCapabilities.prototype.hasLifecycleHook = function (type, lcProperty) {\n return type instanceof Type && lcProperty in type.prototype;\n };\n /**\n * @param {?} name\n * @return {?}\n */\n ReflectionCapabilities.prototype.getter = function (name) { return ((new Function('o', 'return o.' + name + ';'))); };\n /**\n * @param {?} name\n * @return {?}\n */\n ReflectionCapabilities.prototype.setter = function (name) {\n return ((new Function('o', 'v', 'return o.' + name + ' = v;')));\n };\n /**\n * @param {?} name\n * @return {?}\n */\n ReflectionCapabilities.prototype.method = function (name) {\n var /** @type {?} */ functionBody = \"if (!o.\" + name + \") throw new Error('\\\"\" + name + \"\\\" is undefined');\\n return o.\" + name + \".apply(o, args);\";\n return ((new Function('o', 'args', functionBody)));\n };\n /**\n * @param {?} type\n * @return {?}\n */\n ReflectionCapabilities.prototype.importUri = function (type) {\n // StaticSymbol\n if (typeof type === 'object' && type['filePath']) {\n return type['filePath'];\n }\n // Runtime type\n return \"./\" + stringify(type);\n };\n /**\n * @param {?} name\n * @param {?} moduleUrl\n * @param {?} runtime\n * @return {?}\n */\n ReflectionCapabilities.prototype.resolveIdentifier = function (name, moduleUrl, runtime) { return runtime; };\n /**\n * @param {?} enumIdentifier\n * @param {?} name\n * @return {?}\n */\n ReflectionCapabilities.prototype.resolveEnum = function (enumIdentifier, name) { return enumIdentifier[name]; };\n return ReflectionCapabilities;\n }());\n /**\n * @param {?} decoratorInvocations\n * @return {?}\n */\n function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {\n if (!decoratorInvocations) {\n return [];\n }\n return decoratorInvocations.map(function (decoratorInvocation) {\n var /** @type {?} */ decoratorType = decoratorInvocation.type;\n var /** @type {?} */ annotationCls = decoratorType.annotationCls;\n var /** @type {?} */ annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];\n return new (annotationCls.bind.apply(annotationCls, [void 0].concat(annotationArgs)))();\n });\n }\n\n /**\n * Provides read-only access to reflection data about symbols. Used internally by Angular\n * to power dependency injection and compilation.\n * @abstract\n */\n var ReflectorReader = (function () {\n function ReflectorReader() {\n }\n /**\n * @abstract\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectorReader.prototype.parameters = function (typeOrFunc) { };\n /**\n * @abstract\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectorReader.prototype.annotations = function (typeOrFunc) { };\n /**\n * @abstract\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectorReader.prototype.propMetadata = function (typeOrFunc) { };\n /**\n * @abstract\n * @param {?} typeOrFunc\n * @return {?}\n */\n ReflectorReader.prototype.importUri = function (typeOrFunc) { };\n /**\n * @abstract\n * @param {?} name\n * @param {?} moduleUrl\n * @param {?} runtime\n * @return {?}\n */\n ReflectorReader.prototype.resolveIdentifier = function (name, moduleUrl, runtime) { };\n /**\n * @abstract\n * @param {?} identifier\n * @param {?} name\n * @return {?}\n */\n ReflectorReader.prototype.resolveEnum = function (identifier, name) { };\n return ReflectorReader;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$2 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Provides access to reflection data about symbols. Used internally by Angular\n * to power dependency injection and compilation.\n */\n var Reflector = (function (_super) {\n __extends$2(Reflector, _super);\n /**\n * @param {?} reflectionCapabilities\n */\n function Reflector(reflectionCapabilities) {\n _super.call(this);\n this.reflectionCapabilities = reflectionCapabilities;\n }\n /**\n * @param {?} caps\n * @return {?}\n */\n Reflector.prototype.updateCapabilities = function (caps) { this.reflectionCapabilities = caps; };\n /**\n * @param {?} type\n * @return {?}\n */\n Reflector.prototype.factory = function (type) { return this.reflectionCapabilities.factory(type); };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n Reflector.prototype.parameters = function (typeOrFunc) {\n return this.reflectionCapabilities.parameters(typeOrFunc);\n };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n Reflector.prototype.annotations = function (typeOrFunc) {\n return this.reflectionCapabilities.annotations(typeOrFunc);\n };\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n Reflector.prototype.propMetadata = function (typeOrFunc) {\n return this.reflectionCapabilities.propMetadata(typeOrFunc);\n };\n /**\n * @param {?} type\n * @param {?} lcProperty\n * @return {?}\n */\n Reflector.prototype.hasLifecycleHook = function (type, lcProperty) {\n return this.reflectionCapabilities.hasLifecycleHook(type, lcProperty);\n };\n /**\n * @param {?} name\n * @return {?}\n */\n Reflector.prototype.getter = function (name) { return this.reflectionCapabilities.getter(name); };\n /**\n * @param {?} name\n * @return {?}\n */\n Reflector.prototype.setter = function (name) { return this.reflectionCapabilities.setter(name); };\n /**\n * @param {?} name\n * @return {?}\n */\n Reflector.prototype.method = function (name) { return this.reflectionCapabilities.method(name); };\n /**\n * @param {?} type\n * @return {?}\n */\n Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };\n /**\n * @param {?} name\n * @param {?} moduleUrl\n * @param {?} runtime\n * @return {?}\n */\n Reflector.prototype.resolveIdentifier = function (name, moduleUrl, runtime) {\n return this.reflectionCapabilities.resolveIdentifier(name, moduleUrl, runtime);\n };\n /**\n * @param {?} identifier\n * @param {?} name\n * @return {?}\n */\n Reflector.prototype.resolveEnum = function (identifier, name) {\n return this.reflectionCapabilities.resolveEnum(identifier, name);\n };\n return Reflector;\n }(ReflectorReader));\n\n /**\n * The {@link Reflector} used internally in Angular to access metadata\n * about symbols.\n */\n var /** @type {?} */ reflector = new Reflector(new ReflectionCapabilities());\n\n /**\n * `Dependency` is used by the framework to extend DI.\n * This is internal to Angular and should not be used directly.\n */\n var ReflectiveDependency = (function () {\n /**\n * @param {?} key\n * @param {?} optional\n * @param {?} lowerBoundVisibility\n * @param {?} upperBoundVisibility\n * @param {?} properties\n */\n function ReflectiveDependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties) {\n this.key = key;\n this.optional = optional;\n this.lowerBoundVisibility = lowerBoundVisibility;\n this.upperBoundVisibility = upperBoundVisibility;\n this.properties = properties;\n }\n /**\n * @param {?} key\n * @return {?}\n */\n ReflectiveDependency.fromKey = function (key) {\n return new ReflectiveDependency(key, false, null, null, []);\n };\n return ReflectiveDependency;\n }());\n var /** @type {?} */ _EMPTY_LIST = [];\n var ResolvedReflectiveProvider_ = (function () {\n /**\n * @param {?} key\n * @param {?} resolvedFactories\n * @param {?} multiProvider\n */\n function ResolvedReflectiveProvider_(key, resolvedFactories, multiProvider) {\n this.key = key;\n this.resolvedFactories = resolvedFactories;\n this.multiProvider = multiProvider;\n }\n Object.defineProperty(ResolvedReflectiveProvider_.prototype, \"resolvedFactory\", {\n /**\n * @return {?}\n */\n get: function () { return this.resolvedFactories[0]; },\n enumerable: true,\n configurable: true\n });\n return ResolvedReflectiveProvider_;\n }());\n /**\n * An internal resolved representation of a factory function created by resolving {@link\n * Provider}.\n */\n var ResolvedReflectiveFactory = (function () {\n /**\n * @param {?} factory\n * @param {?} dependencies\n */\n function ResolvedReflectiveFactory(factory, dependencies) {\n this.factory = factory;\n this.dependencies = dependencies;\n }\n return ResolvedReflectiveFactory;\n }());\n /**\n * Resolve a single provider.\n * @param {?} provider\n * @return {?}\n */\n function resolveReflectiveFactory(provider) {\n var /** @type {?} */ factoryFn;\n var /** @type {?} */ resolvedDeps;\n if (provider.useClass) {\n var /** @type {?} */ useClass = resolveForwardRef(provider.useClass);\n factoryFn = reflector.factory(useClass);\n resolvedDeps = _dependenciesFor(useClass);\n }\n else if (provider.useExisting) {\n factoryFn = function (aliasInstance) { return aliasInstance; };\n resolvedDeps = [ReflectiveDependency.fromKey(ReflectiveKey.get(provider.useExisting))];\n }\n else if (provider.useFactory) {\n factoryFn = provider.useFactory;\n resolvedDeps = constructDependencies(provider.useFactory, provider.deps);\n }\n else {\n factoryFn = function () { return provider.useValue; };\n resolvedDeps = _EMPTY_LIST;\n }\n return new ResolvedReflectiveFactory(factoryFn, resolvedDeps);\n }\n /**\n * Converts the {@link Provider} into {@link ResolvedProvider}.\n * *\n * {@link Injector} internally only uses {@link ResolvedProvider}, {@link Provider} contains\n * convenience provider syntax.\n * @param {?} provider\n * @return {?}\n */\n function resolveReflectiveProvider(provider) {\n return new ResolvedReflectiveProvider_(ReflectiveKey.get(provider.provide), [resolveReflectiveFactory(provider)], provider.multi);\n }\n /**\n * Resolve a list of Providers.\n * @param {?} providers\n * @return {?}\n */\n function resolveReflectiveProviders(providers) {\n var /** @type {?} */ normalized = _normalizeProviders(providers, []);\n var /** @type {?} */ resolved = normalized.map(resolveReflectiveProvider);\n var /** @type {?} */ resolvedProviderMap = mergeResolvedReflectiveProviders(resolved, new Map());\n return Array.from(resolvedProviderMap.values());\n }\n /**\n * Merges a list of ResolvedProviders into a list where\n * each key is contained exactly once and multi providers\n * have been merged.\n * @param {?} providers\n * @param {?} normalizedProvidersMap\n * @return {?}\n */\n function mergeResolvedReflectiveProviders(providers, normalizedProvidersMap) {\n for (var /** @type {?} */ i = 0; i < providers.length; i++) {\n var /** @type {?} */ provider = providers[i];\n var /** @type {?} */ existing = normalizedProvidersMap.get(provider.key.id);\n if (existing) {\n if (provider.multiProvider !== existing.multiProvider) {\n throw new MixingMultiProvidersWithRegularProvidersError(existing, provider);\n }\n if (provider.multiProvider) {\n for (var /** @type {?} */ j = 0; j < provider.resolvedFactories.length; j++) {\n existing.resolvedFactories.push(provider.resolvedFactories[j]);\n }\n }\n else {\n normalizedProvidersMap.set(provider.key.id, provider);\n }\n }\n else {\n var /** @type {?} */ resolvedProvider = void 0;\n if (provider.multiProvider) {\n resolvedProvider = new ResolvedReflectiveProvider_(provider.key, provider.resolvedFactories.slice(), provider.multiProvider);\n }\n else {\n resolvedProvider = provider;\n }\n normalizedProvidersMap.set(provider.key.id, resolvedProvider);\n }\n }\n return normalizedProvidersMap;\n }\n /**\n * @param {?} providers\n * @param {?} res\n * @return {?}\n */\n function _normalizeProviders(providers, res) {\n providers.forEach(function (b) {\n if (b instanceof Type) {\n res.push({ provide: b, useClass: b });\n }\n else if (b && typeof b == 'object' && ((b)).provide !== undefined) {\n res.push(/** @type {?} */ (b));\n }\n else if (b instanceof Array) {\n _normalizeProviders(b, res);\n }\n else {\n throw new InvalidProviderError(b);\n }\n });\n return res;\n }\n /**\n * @param {?} typeOrFunc\n * @param {?} dependencies\n * @return {?}\n */\n function constructDependencies(typeOrFunc, dependencies) {\n if (!dependencies) {\n return _dependenciesFor(typeOrFunc);\n }\n else {\n var /** @type {?} */ params_1 = dependencies.map(function (t) { return [t]; });\n return dependencies.map(function (t) { return _extractToken(typeOrFunc, t, params_1); });\n }\n }\n /**\n * @param {?} typeOrFunc\n * @return {?}\n */\n function _dependenciesFor(typeOrFunc) {\n var /** @type {?} */ params = reflector.parameters(typeOrFunc);\n if (!params)\n return [];\n if (params.some(function (p) { return p == null; })) {\n throw new NoAnnotationError(typeOrFunc, params);\n }\n return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });\n }\n /**\n * @param {?} typeOrFunc\n * @param {?} metadata\n * @param {?} params\n * @return {?}\n */\n function _extractToken(typeOrFunc, metadata, params) {\n var /** @type {?} */ depProps = [];\n var /** @type {?} */ token = null;\n var /** @type {?} */ optional = false;\n if (!Array.isArray(metadata)) {\n if (metadata instanceof Inject) {\n return _createDependency(metadata.token, optional, null, null, depProps);\n }\n else {\n return _createDependency(metadata, optional, null, null, depProps);\n }\n }\n var /** @type {?} */ lowerBoundVisibility = null;\n var /** @type {?} */ upperBoundVisibility = null;\n for (var /** @type {?} */ i = 0; i < metadata.length; ++i) {\n var /** @type {?} */ paramMetadata = metadata[i];\n if (paramMetadata instanceof Type) {\n token = paramMetadata;\n }\n else if (paramMetadata instanceof Inject) {\n token = paramMetadata.token;\n }\n else if (paramMetadata instanceof Optional) {\n optional = true;\n }\n else if (paramMetadata instanceof Self) {\n upperBoundVisibility = paramMetadata;\n }\n else if (paramMetadata instanceof Host) {\n upperBoundVisibility = paramMetadata;\n }\n else if (paramMetadata instanceof SkipSelf) {\n lowerBoundVisibility = paramMetadata;\n }\n }\n token = resolveForwardRef(token);\n if (token != null) {\n return _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps);\n }\n else {\n throw new NoAnnotationError(typeOrFunc, params);\n }\n }\n /**\n * @param {?} token\n * @param {?} optional\n * @param {?} lowerBoundVisibility\n * @param {?} upperBoundVisibility\n * @param {?} depProps\n * @return {?}\n */\n function _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps) {\n return new ReflectiveDependency(ReflectiveKey.get(token), optional, lowerBoundVisibility, upperBoundVisibility, depProps);\n }\n\n // Threshold for the dynamic version\n var /** @type {?} */ _MAX_CONSTRUCTION_COUNTER = 10;\n var /** @type {?} */ UNDEFINED = new Object();\n var ReflectiveProtoInjectorInlineStrategy = (function () {\n /**\n * @param {?} protoEI\n * @param {?} providers\n */\n function ReflectiveProtoInjectorInlineStrategy(protoEI, providers) {\n this.provider0 = null;\n this.provider1 = null;\n this.provider2 = null;\n this.provider3 = null;\n this.provider4 = null;\n this.provider5 = null;\n this.provider6 = null;\n this.provider7 = null;\n this.provider8 = null;\n this.provider9 = null;\n this.keyId0 = null;\n this.keyId1 = null;\n this.keyId2 = null;\n this.keyId3 = null;\n this.keyId4 = null;\n this.keyId5 = null;\n this.keyId6 = null;\n this.keyId7 = null;\n this.keyId8 = null;\n this.keyId9 = null;\n var length = providers.length;\n if (length > 0) {\n this.provider0 = providers[0];\n this.keyId0 = providers[0].key.id;\n }\n if (length > 1) {\n this.provider1 = providers[1];\n this.keyId1 = providers[1].key.id;\n }\n if (length > 2) {\n this.provider2 = providers[2];\n this.keyId2 = providers[2].key.id;\n }\n if (length > 3) {\n this.provider3 = providers[3];\n this.keyId3 = providers[3].key.id;\n }\n if (length > 4) {\n this.provider4 = providers[4];\n this.keyId4 = providers[4].key.id;\n }\n if (length > 5) {\n this.provider5 = providers[5];\n this.keyId5 = providers[5].key.id;\n }\n if (length > 6) {\n this.provider6 = providers[6];\n this.keyId6 = providers[6].key.id;\n }\n if (length > 7) {\n this.provider7 = providers[7];\n this.keyId7 = providers[7].key.id;\n }\n if (length > 8) {\n this.provider8 = providers[8];\n this.keyId8 = providers[8].key.id;\n }\n if (length > 9) {\n this.provider9 = providers[9];\n this.keyId9 = providers[9].key.id;\n }\n }\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveProtoInjectorInlineStrategy.prototype.getProviderAtIndex = function (index) {\n if (index == 0)\n return this.provider0;\n if (index == 1)\n return this.provider1;\n if (index == 2)\n return this.provider2;\n if (index == 3)\n return this.provider3;\n if (index == 4)\n return this.provider4;\n if (index == 5)\n return this.provider5;\n if (index == 6)\n return this.provider6;\n if (index == 7)\n return this.provider7;\n if (index == 8)\n return this.provider8;\n if (index == 9)\n return this.provider9;\n throw new OutOfBoundsError(index);\n };\n /**\n * @param {?} injector\n * @return {?}\n */\n ReflectiveProtoInjectorInlineStrategy.prototype.createInjectorStrategy = function (injector) {\n return new ReflectiveInjectorInlineStrategy(injector, this);\n };\n return ReflectiveProtoInjectorInlineStrategy;\n }());\n var ReflectiveProtoInjectorDynamicStrategy = (function () {\n /**\n * @param {?} protoInj\n * @param {?} providers\n */\n function ReflectiveProtoInjectorDynamicStrategy(protoInj, providers) {\n this.providers = providers;\n var len = providers.length;\n this.keyIds = new Array(len);\n for (var i = 0; i < len; i++) {\n this.keyIds[i] = providers[i].key.id;\n }\n }\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveProtoInjectorDynamicStrategy.prototype.getProviderAtIndex = function (index) {\n if (index < 0 || index >= this.providers.length) {\n throw new OutOfBoundsError(index);\n }\n return this.providers[index];\n };\n /**\n * @param {?} ei\n * @return {?}\n */\n ReflectiveProtoInjectorDynamicStrategy.prototype.createInjectorStrategy = function (ei) {\n return new ReflectiveInjectorDynamicStrategy(this, ei);\n };\n return ReflectiveProtoInjectorDynamicStrategy;\n }());\n var ReflectiveProtoInjector = (function () {\n /**\n * @param {?} providers\n */\n function ReflectiveProtoInjector(providers) {\n this.numberOfProviders = providers.length;\n this._strategy = providers.length > _MAX_CONSTRUCTION_COUNTER ?\n new ReflectiveProtoInjectorDynamicStrategy(this, providers) :\n new ReflectiveProtoInjectorInlineStrategy(this, providers);\n }\n /**\n * @param {?} providers\n * @return {?}\n */\n ReflectiveProtoInjector.fromResolvedProviders = function (providers) {\n return new ReflectiveProtoInjector(providers);\n };\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveProtoInjector.prototype.getProviderAtIndex = function (index) {\n return this._strategy.getProviderAtIndex(index);\n };\n return ReflectiveProtoInjector;\n }());\n var ReflectiveInjectorInlineStrategy = (function () {\n /**\n * @param {?} injector\n * @param {?} protoStrategy\n */\n function ReflectiveInjectorInlineStrategy(injector, protoStrategy) {\n this.injector = injector;\n this.protoStrategy = protoStrategy;\n this.obj0 = UNDEFINED;\n this.obj1 = UNDEFINED;\n this.obj2 = UNDEFINED;\n this.obj3 = UNDEFINED;\n this.obj4 = UNDEFINED;\n this.obj5 = UNDEFINED;\n this.obj6 = UNDEFINED;\n this.obj7 = UNDEFINED;\n this.obj8 = UNDEFINED;\n this.obj9 = UNDEFINED;\n }\n /**\n * @return {?}\n */\n ReflectiveInjectorInlineStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjectorInlineStrategy.prototype.instantiateProvider = function (provider) {\n return this.injector._new(provider);\n };\n /**\n * @param {?} keyId\n * @return {?}\n */\n ReflectiveInjectorInlineStrategy.prototype.getObjByKeyId = function (keyId) {\n var /** @type {?} */ p = this.protoStrategy;\n var /** @type {?} */ inj = this.injector;\n if (p.keyId0 === keyId) {\n if (this.obj0 === UNDEFINED) {\n this.obj0 = inj._new(p.provider0);\n }\n return this.obj0;\n }\n if (p.keyId1 === keyId) {\n if (this.obj1 === UNDEFINED) {\n this.obj1 = inj._new(p.provider1);\n }\n return this.obj1;\n }\n if (p.keyId2 === keyId) {\n if (this.obj2 === UNDEFINED) {\n this.obj2 = inj._new(p.provider2);\n }\n return this.obj2;\n }\n if (p.keyId3 === keyId) {\n if (this.obj3 === UNDEFINED) {\n this.obj3 = inj._new(p.provider3);\n }\n return this.obj3;\n }\n if (p.keyId4 === keyId) {\n if (this.obj4 === UNDEFINED) {\n this.obj4 = inj._new(p.provider4);\n }\n return this.obj4;\n }\n if (p.keyId5 === keyId) {\n if (this.obj5 === UNDEFINED) {\n this.obj5 = inj._new(p.provider5);\n }\n return this.obj5;\n }\n if (p.keyId6 === keyId) {\n if (this.obj6 === UNDEFINED) {\n this.obj6 = inj._new(p.provider6);\n }\n return this.obj6;\n }\n if (p.keyId7 === keyId) {\n if (this.obj7 === UNDEFINED) {\n this.obj7 = inj._new(p.provider7);\n }\n return this.obj7;\n }\n if (p.keyId8 === keyId) {\n if (this.obj8 === UNDEFINED) {\n this.obj8 = inj._new(p.provider8);\n }\n return this.obj8;\n }\n if (p.keyId9 === keyId) {\n if (this.obj9 === UNDEFINED) {\n this.obj9 = inj._new(p.provider9);\n }\n return this.obj9;\n }\n return UNDEFINED;\n };\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveInjectorInlineStrategy.prototype.getObjAtIndex = function (index) {\n if (index == 0)\n return this.obj0;\n if (index == 1)\n return this.obj1;\n if (index == 2)\n return this.obj2;\n if (index == 3)\n return this.obj3;\n if (index == 4)\n return this.obj4;\n if (index == 5)\n return this.obj5;\n if (index == 6)\n return this.obj6;\n if (index == 7)\n return this.obj7;\n if (index == 8)\n return this.obj8;\n if (index == 9)\n return this.obj9;\n throw new OutOfBoundsError(index);\n };\n /**\n * @return {?}\n */\n ReflectiveInjectorInlineStrategy.prototype.getMaxNumberOfObjects = function () { return _MAX_CONSTRUCTION_COUNTER; };\n return ReflectiveInjectorInlineStrategy;\n }());\n var ReflectiveInjectorDynamicStrategy = (function () {\n /**\n * @param {?} protoStrategy\n * @param {?} injector\n */\n function ReflectiveInjectorDynamicStrategy(protoStrategy, injector) {\n this.protoStrategy = protoStrategy;\n this.injector = injector;\n this.objs = new Array(protoStrategy.providers.length).fill(UNDEFINED);\n }\n /**\n * @return {?}\n */\n ReflectiveInjectorDynamicStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjectorDynamicStrategy.prototype.instantiateProvider = function (provider) {\n return this.injector._new(provider);\n };\n /**\n * @param {?} keyId\n * @return {?}\n */\n ReflectiveInjectorDynamicStrategy.prototype.getObjByKeyId = function (keyId) {\n var /** @type {?} */ p = this.protoStrategy;\n for (var /** @type {?} */ i = 0; i < p.keyIds.length; i++) {\n if (p.keyIds[i] === keyId) {\n if (this.objs[i] === UNDEFINED) {\n this.objs[i] = this.injector._new(p.providers[i]);\n }\n return this.objs[i];\n }\n }\n return UNDEFINED;\n };\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveInjectorDynamicStrategy.prototype.getObjAtIndex = function (index) {\n if (index < 0 || index >= this.objs.length) {\n throw new OutOfBoundsError(index);\n }\n return this.objs[index];\n };\n /**\n * @return {?}\n */\n ReflectiveInjectorDynamicStrategy.prototype.getMaxNumberOfObjects = function () { return this.objs.length; };\n return ReflectiveInjectorDynamicStrategy;\n }());\n /**\n * A ReflectiveDependency injection container used for instantiating objects and resolving\n * dependencies.\n * *\n * An `Injector` is a replacement for a `new` operator, which can automatically resolve the\n * constructor dependencies.\n * *\n * In typical use, application code asks for the dependencies in the constructor and they are\n * resolved by the `Injector`.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))\n * *\n * The following example creates an `Injector` configured to create `Engine` and `Car`.\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);\n * var car = injector.get(Car);\n * expect(car instanceof Car).toBe(true);\n * expect(car.engine instanceof Engine).toBe(true);\n * ```\n * *\n * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`\n * resolve all of the object's dependencies automatically.\n * *\n * @abstract\n */\n var ReflectiveInjector = (function () {\n function ReflectiveInjector() {\n }\n /**\n * Turns an array of provider definitions into an array of resolved providers.\n * *\n * A resolution is a process of flattening multiple nested arrays and converting individual\n * providers into an array of {@link ResolvedReflectiveProvider}s.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var providers = ReflectiveInjector.resolve([Car, [[Engine]]]);\n * *\n * expect(providers.length).toEqual(2);\n * *\n * expect(providers[0] instanceof ResolvedReflectiveProvider).toBe(true);\n * expect(providers[0].key.displayName).toBe(\"Car\");\n * expect(providers[0].dependencies.length).toEqual(1);\n * expect(providers[0].factory).toBeDefined();\n * *\n * expect(providers[1].key.displayName).toBe(\"Engine\");\n * });\n * ```\n * *\n * See {@link ReflectiveInjector#fromResolvedProviders} for more info.\n * @param {?} providers\n * @return {?}\n */\n ReflectiveInjector.resolve = function (providers) {\n return resolveReflectiveProviders(providers);\n };\n /**\n * Resolves an array of providers and creates an injector from those providers.\n * *\n * The passed-in providers can be an array of `Type`, {@link Provider},\n * or a recursive array of more providers.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);\n * expect(injector.get(Car) instanceof Car).toBe(true);\n * ```\n * *\n * This function is slower than the corresponding `fromResolvedProviders`\n * because it needs to resolve the passed-in providers first.\n * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.\n * @param {?} providers\n * @param {?=} parent\n * @return {?}\n */\n ReflectiveInjector.resolveAndCreate = function (providers, parent) {\n if (parent === void 0) { parent = null; }\n var /** @type {?} */ ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);\n return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders, parent);\n };\n /**\n * Creates an injector from previously resolved providers.\n * *\n * This API is the recommended way to construct injectors in performance-sensitive parts.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var providers = ReflectiveInjector.resolve([Car, Engine]);\n * var injector = ReflectiveInjector.fromResolvedProviders(providers);\n * expect(injector.get(Car) instanceof Car).toBe(true);\n * ```\n * @param {?} providers\n * @param {?=} parent\n * @return {?}\n */\n ReflectiveInjector.fromResolvedProviders = function (providers, parent) {\n if (parent === void 0) { parent = null; }\n return new ReflectiveInjector_(ReflectiveProtoInjector.fromResolvedProviders(providers), parent);\n };\n Object.defineProperty(ReflectiveInjector.prototype, \"parent\", {\n /**\n * Parent of this injector.\n * *\n * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n * -->\n * *\n * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))\n * *\n * ```typescript\n * var parent = ReflectiveInjector.resolveAndCreate([]);\n * var child = parent.resolveAndCreateChild([]);\n * expect(child.parent).toBe(parent);\n * ```\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n /**\n * Resolves an array of providers and creates a child injector from those providers.\n * *\n * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n * -->\n * *\n * The passed-in providers can be an array of `Type`, {@link Provider},\n * or a recursive array of more providers.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))\n * *\n * ```typescript\n * class ParentProvider {}\n * class ChildProvider {}\n * *\n * var parent = ReflectiveInjector.resolveAndCreate([ParentProvider]);\n * var child = parent.resolveAndCreateChild([ChildProvider]);\n * *\n * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);\n * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);\n * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));\n * ```\n * *\n * This function is slower than the corresponding `createChildFromResolved`\n * because it needs to resolve the passed-in providers first.\n * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.\n * @param {?} providers\n * @return {?}\n */\n ReflectiveInjector.prototype.resolveAndCreateChild = function (providers) { return unimplemented(); };\n /**\n * Creates a child injector from previously resolved providers.\n * *\n * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.\n * -->\n * *\n * This API is the recommended way to construct injectors in performance-sensitive parts.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))\n * *\n * ```typescript\n * class ParentProvider {}\n * class ChildProvider {}\n * *\n * var parentProviders = ReflectiveInjector.resolve([ParentProvider]);\n * var childProviders = ReflectiveInjector.resolve([ChildProvider]);\n * *\n * var parent = ReflectiveInjector.fromResolvedProviders(parentProviders);\n * var child = parent.createChildFromResolved(childProviders);\n * *\n * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);\n * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);\n * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));\n * ```\n * @param {?} providers\n * @return {?}\n */\n ReflectiveInjector.prototype.createChildFromResolved = function (providers) {\n return unimplemented();\n };\n /**\n * Resolves a provider and instantiates an object in the context of the injector.\n * *\n * The created object does not get cached by the injector.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var injector = ReflectiveInjector.resolveAndCreate([Engine]);\n * *\n * var car = injector.resolveAndInstantiate(Car);\n * expect(car.engine).toBe(injector.get(Engine));\n * expect(car).not.toBe(injector.resolveAndInstantiate(Car));\n * ```\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector.prototype.resolveAndInstantiate = function (provider) { return unimplemented(); };\n /**\n * Instantiates an object using a resolved provider in the context of the injector.\n * *\n * The created object does not get cached by the injector.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))\n * *\n * ```typescript\n * class Engine {\n * }\n * *\n * class Car {\n * constructor(public engine:Engine) {}\n * }\n * *\n * var injector = ReflectiveInjector.resolveAndCreate([Engine]);\n * var carProvider = ReflectiveInjector.resolve([Car])[0];\n * var car = injector.instantiateResolved(carProvider);\n * expect(car.engine).toBe(injector.get(Engine));\n * expect(car).not.toBe(injector.instantiateResolved(carProvider));\n * ```\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector.prototype.instantiateResolved = function (provider) { return unimplemented(); };\n /**\n * @abstract\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n ReflectiveInjector.prototype.get = function (token, notFoundValue) { };\n return ReflectiveInjector;\n }());\n var ReflectiveInjector_ = (function () {\n /**\n * Private\n * @param {?} _proto\n * @param {?=} _parent\n */\n function ReflectiveInjector_(_proto /* ProtoInjector */, _parent) {\n if (_parent === void 0) { _parent = null; }\n /** @internal */\n this._constructionCounter = 0;\n this._proto = _proto;\n this._parent = _parent;\n this._strategy = _proto._strategy.createInjectorStrategy(this);\n }\n /**\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n ReflectiveInjector_.prototype.get = function (token, notFoundValue) {\n if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n return this._getByKey(ReflectiveKey.get(token), null, null, notFoundValue);\n };\n /**\n * @param {?} index\n * @return {?}\n */\n ReflectiveInjector_.prototype.getAt = function (index) { return this._strategy.getObjAtIndex(index); };\n Object.defineProperty(ReflectiveInjector_.prototype, \"parent\", {\n /**\n * @return {?}\n */\n get: function () { return this._parent; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ReflectiveInjector_.prototype, \"internalStrategy\", {\n /**\n * Internal. Do not use.\n * We return `any` not to export the InjectorStrategy type.\n * @return {?}\n */\n get: function () { return this._strategy; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} providers\n * @return {?}\n */\n ReflectiveInjector_.prototype.resolveAndCreateChild = function (providers) {\n var /** @type {?} */ ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);\n return this.createChildFromResolved(ResolvedReflectiveProviders);\n };\n /**\n * @param {?} providers\n * @return {?}\n */\n ReflectiveInjector_.prototype.createChildFromResolved = function (providers) {\n var /** @type {?} */ proto = new ReflectiveProtoInjector(providers);\n var /** @type {?} */ inj = new ReflectiveInjector_(proto);\n inj._parent = this;\n return inj;\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector_.prototype.resolveAndInstantiate = function (provider) {\n return this.instantiateResolved(ReflectiveInjector.resolve([provider])[0]);\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector_.prototype.instantiateResolved = function (provider) {\n return this._instantiateProvider(provider);\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector_.prototype._new = function (provider) {\n if (this._constructionCounter++ > this._strategy.getMaxNumberOfObjects()) {\n throw new CyclicDependencyError(this, provider.key);\n }\n return this._instantiateProvider(provider);\n };\n /**\n * @param {?} provider\n * @return {?}\n */\n ReflectiveInjector_.prototype._instantiateProvider = function (provider) {\n if (provider.multiProvider) {\n var /** @type {?} */ res = new Array(provider.resolvedFactories.length);\n for (var /** @type {?} */ i = 0; i < provider.resolvedFactories.length; ++i) {\n res[i] = this._instantiate(provider, provider.resolvedFactories[i]);\n }\n return res;\n }\n else {\n return this._instantiate(provider, provider.resolvedFactories[0]);\n }\n };\n /**\n * @param {?} provider\n * @param {?} ResolvedReflectiveFactory\n * @return {?}\n */\n ReflectiveInjector_.prototype._instantiate = function (provider, ResolvedReflectiveFactory) {\n var /** @type {?} */ factory = ResolvedReflectiveFactory.factory;\n var /** @type {?} */ deps = ResolvedReflectiveFactory.dependencies;\n var /** @type {?} */ length = deps.length;\n var /** @type {?} */ d0;\n var /** @type {?} */ d1;\n var /** @type {?} */ d2;\n var /** @type {?} */ d3;\n var /** @type {?} */ d4;\n var /** @type {?} */ d5;\n var /** @type {?} */ d6;\n var /** @type {?} */ d7;\n var /** @type {?} */ d8;\n var /** @type {?} */ d9;\n var /** @type {?} */ d10;\n var /** @type {?} */ d11;\n var /** @type {?} */ d12;\n var /** @type {?} */ d13;\n var /** @type {?} */ d14;\n var /** @type {?} */ d15;\n var /** @type {?} */ d16;\n var /** @type {?} */ d17;\n var /** @type {?} */ d18;\n var /** @type {?} */ d19;\n try {\n d0 = length > 0 ? this._getByReflectiveDependency(provider, deps[0]) : null;\n d1 = length > 1 ? this._getByReflectiveDependency(provider, deps[1]) : null;\n d2 = length > 2 ? this._getByReflectiveDependency(provider, deps[2]) : null;\n d3 = length > 3 ? this._getByReflectiveDependency(provider, deps[3]) : null;\n d4 = length > 4 ? this._getByReflectiveDependency(provider, deps[4]) : null;\n d5 = length > 5 ? this._getByReflectiveDependency(provider, deps[5]) : null;\n d6 = length > 6 ? this._getByReflectiveDependency(provider, deps[6]) : null;\n d7 = length > 7 ? this._getByReflectiveDependency(provider, deps[7]) : null;\n d8 = length > 8 ? this._getByReflectiveDependency(provider, deps[8]) : null;\n d9 = length > 9 ? this._getByReflectiveDependency(provider, deps[9]) : null;\n d10 = length > 10 ? this._getByReflectiveDependency(provider, deps[10]) : null;\n d11 = length > 11 ? this._getByReflectiveDependency(provider, deps[11]) : null;\n d12 = length > 12 ? this._getByReflectiveDependency(provider, deps[12]) : null;\n d13 = length > 13 ? this._getByReflectiveDependency(provider, deps[13]) : null;\n d14 = length > 14 ? this._getByReflectiveDependency(provider, deps[14]) : null;\n d15 = length > 15 ? this._getByReflectiveDependency(provider, deps[15]) : null;\n d16 = length > 16 ? this._getByReflectiveDependency(provider, deps[16]) : null;\n d17 = length > 17 ? this._getByReflectiveDependency(provider, deps[17]) : null;\n d18 = length > 18 ? this._getByReflectiveDependency(provider, deps[18]) : null;\n d19 = length > 19 ? this._getByReflectiveDependency(provider, deps[19]) : null;\n }\n catch (e) {\n if (e instanceof AbstractProviderError || e instanceof InstantiationError) {\n e.addKey(this, provider.key);\n }\n throw e;\n }\n var /** @type {?} */ obj;\n try {\n switch (length) {\n case 0:\n obj = factory();\n break;\n case 1:\n obj = factory(d0);\n break;\n case 2:\n obj = factory(d0, d1);\n break;\n case 3:\n obj = factory(d0, d1, d2);\n break;\n case 4:\n obj = factory(d0, d1, d2, d3);\n break;\n case 5:\n obj = factory(d0, d1, d2, d3, d4);\n break;\n case 6:\n obj = factory(d0, d1, d2, d3, d4, d5);\n break;\n case 7:\n obj = factory(d0, d1, d2, d3, d4, d5, d6);\n break;\n case 8:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7);\n break;\n case 9:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8);\n break;\n case 10:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9);\n break;\n case 11:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);\n break;\n case 12:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11);\n break;\n case 13:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12);\n break;\n case 14:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13);\n break;\n case 15:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14);\n break;\n case 16:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15);\n break;\n case 17:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16);\n break;\n case 18:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17);\n break;\n case 19:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18);\n break;\n case 20:\n obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19);\n break;\n default:\n throw new Error(\"Cannot instantiate '\" + provider.key.displayName + \"' because it has more than 20 dependencies\");\n }\n }\n catch (e) {\n throw new InstantiationError(this, e, e.stack, provider.key);\n }\n return obj;\n };\n /**\n * @param {?} provider\n * @param {?} dep\n * @return {?}\n */\n ReflectiveInjector_.prototype._getByReflectiveDependency = function (provider, dep) {\n return this._getByKey(dep.key, dep.lowerBoundVisibility, dep.upperBoundVisibility, dep.optional ? null : THROW_IF_NOT_FOUND);\n };\n /**\n * @param {?} key\n * @param {?} lowerBoundVisibility\n * @param {?} upperBoundVisibility\n * @param {?} notFoundValue\n * @return {?}\n */\n ReflectiveInjector_.prototype._getByKey = function (key, lowerBoundVisibility, upperBoundVisibility, notFoundValue) {\n if (key === INJECTOR_KEY) {\n return this;\n }\n if (upperBoundVisibility instanceof Self) {\n return this._getByKeySelf(key, notFoundValue);\n }\n else {\n return this._getByKeyDefault(key, notFoundValue, lowerBoundVisibility);\n }\n };\n /**\n * @param {?} key\n * @param {?} notFoundValue\n * @return {?}\n */\n ReflectiveInjector_.prototype._throwOrNull = function (key, notFoundValue) {\n if (notFoundValue !== THROW_IF_NOT_FOUND) {\n return notFoundValue;\n }\n else {\n throw new NoProviderError(this, key);\n }\n };\n /**\n * @param {?} key\n * @param {?} notFoundValue\n * @return {?}\n */\n ReflectiveInjector_.prototype._getByKeySelf = function (key, notFoundValue) {\n var /** @type {?} */ obj = this._strategy.getObjByKeyId(key.id);\n return (obj !== UNDEFINED) ? obj : this._throwOrNull(key, notFoundValue);\n };\n /**\n * @param {?} key\n * @param {?} notFoundValue\n * @param {?} lowerBoundVisibility\n * @return {?}\n */\n ReflectiveInjector_.prototype._getByKeyDefault = function (key, notFoundValue, lowerBoundVisibility) {\n var /** @type {?} */ inj;\n if (lowerBoundVisibility instanceof SkipSelf) {\n inj = this._parent;\n }\n else {\n inj = this;\n }\n while (inj instanceof ReflectiveInjector_) {\n var /** @type {?} */ inj_ = (inj);\n var /** @type {?} */ obj = inj_._strategy.getObjByKeyId(key.id);\n if (obj !== UNDEFINED)\n return obj;\n inj = inj_._parent;\n }\n if (inj !== null) {\n return inj.get(key.token, notFoundValue);\n }\n else {\n return this._throwOrNull(key, notFoundValue);\n }\n };\n Object.defineProperty(ReflectiveInjector_.prototype, \"displayName\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ providers = _mapProviders(this, function (b) { return ' \"' + b.key.displayName + '\" '; })\n .join(', ');\n return \"ReflectiveInjector(providers: [\" + providers + \"])\";\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n ReflectiveInjector_.prototype.toString = function () { return this.displayName; };\n return ReflectiveInjector_;\n }());\n var /** @type {?} */ INJECTOR_KEY = ReflectiveKey.get(Injector);\n /**\n * @param {?} injector\n * @param {?} fn\n * @return {?}\n */\n function _mapProviders(injector, fn) {\n var /** @type {?} */ res = new Array(injector._proto.numberOfProviders);\n for (var /** @type {?} */ i = 0; i < injector._proto.numberOfProviders; ++i) {\n res[i] = fn(injector._proto.getProviderAtIndex(i));\n }\n return res;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * *\n * *\n * The default implementation of `ErrorHandler` prints error messages to the `console`. To\n * intercept error handling, write a custom exception handler that replaces this default as\n * appropriate for your app.\n * *\n * ### Example\n * *\n * ```\n * class MyErrorHandler implements ErrorHandler {\n * handleError(error) {\n * // do something with the exception\n * }\n * }\n * *\n * providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]\n * })\n * class MyModule {}\n * ```\n * *\n */\n var ErrorHandler = (function () {\n /**\n * @param {?=} rethrowError\n */\n function ErrorHandler(rethrowError) {\n if (rethrowError === void 0) { rethrowError = true; }\n /**\n * @internal\n */\n this._console = console;\n this.rethrowError = rethrowError;\n }\n /**\n * @param {?} error\n * @return {?}\n */\n ErrorHandler.prototype.handleError = function (error) {\n var /** @type {?} */ originalError = this._findOriginalError(error);\n var /** @type {?} */ originalStack = this._findOriginalStack(error);\n var /** @type {?} */ context = this._findContext(error);\n this._console.error(\"EXCEPTION: \" + this._extractMessage(error));\n if (originalError) {\n this._console.error(\"ORIGINAL EXCEPTION: \" + this._extractMessage(originalError));\n }\n if (originalStack) {\n this._console.error('ORIGINAL STACKTRACE:');\n this._console.error(originalStack);\n }\n if (context) {\n this._console.error('ERROR CONTEXT:');\n this._console.error(context);\n }\n // We rethrow exceptions, so operations like 'bootstrap' will result in an error\n // when an error happens. If we do not rethrow, bootstrap will always succeed.\n if (this.rethrowError)\n throw error;\n };\n /**\n * @param {?} error\n * @return {?}\n */\n ErrorHandler.prototype._extractMessage = function (error) {\n return error instanceof Error ? error.message : error.toString();\n };\n /**\n * @param {?} error\n * @return {?}\n */\n ErrorHandler.prototype._findContext = function (error) {\n if (error) {\n return error.context ? error.context :\n this._findContext(((error)).originalError);\n }\n return null;\n };\n /**\n * @param {?} error\n * @return {?}\n */\n ErrorHandler.prototype._findOriginalError = function (error) {\n var /** @type {?} */ e = ((error)).originalError;\n while (e && ((e)).originalError) {\n e = ((e)).originalError;\n }\n return e;\n };\n /**\n * @param {?} error\n * @return {?}\n */\n ErrorHandler.prototype._findOriginalStack = function (error) {\n if (!(error instanceof Error))\n return null;\n var /** @type {?} */ e = error;\n var /** @type {?} */ stack = e.stack;\n while (e instanceof Error && ((e)).originalError) {\n e = ((e)).originalError;\n if (e instanceof Error && e.stack) {\n stack = e.stack;\n }\n }\n return stack;\n };\n return ErrorHandler;\n }());\n\n /**\n * Wraps Javascript Objects\n */\n var StringMapWrapper = (function () {\n function StringMapWrapper() {\n }\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.merge = function (m1, m2) {\n var /** @type {?} */ m = {};\n for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n var k = _a[_i];\n m[k] = m1[k];\n }\n for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n var k = _c[_b];\n m[k] = m2[k];\n }\n return m;\n };\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.equals = function (m1, m2) {\n var /** @type {?} */ k1 = Object.keys(m1);\n var /** @type {?} */ k2 = Object.keys(m2);\n if (k1.length != k2.length) {\n return false;\n }\n for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n var /** @type {?} */ key = k1[i];\n if (m1[key] !== m2[key]) {\n return false;\n }\n }\n return true;\n };\n return StringMapWrapper;\n }());\n var ListWrapper = (function () {\n function ListWrapper() {\n }\n /**\n * @param {?} arr\n * @param {?} condition\n * @return {?}\n */\n ListWrapper.findLast = function (arr, condition) {\n for (var /** @type {?} */ i = arr.length - 1; i >= 0; i--) {\n if (condition(arr[i])) {\n return arr[i];\n }\n }\n return null;\n };\n /**\n * @param {?} list\n * @param {?} items\n * @return {?}\n */\n ListWrapper.removeAll = function (list, items) {\n for (var /** @type {?} */ i = 0; i < items.length; ++i) {\n var /** @type {?} */ index = list.indexOf(items[i]);\n if (index > -1) {\n list.splice(index, 1);\n }\n }\n };\n /**\n * @param {?} list\n * @param {?} el\n * @return {?}\n */\n ListWrapper.remove = function (list, el) {\n var /** @type {?} */ index = list.indexOf(el);\n if (index > -1) {\n list.splice(index, 1);\n return true;\n }\n return false;\n };\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n ListWrapper.equals = function (a, b) {\n if (a.length != b.length)\n return false;\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n };\n /**\n * @param {?} list\n * @return {?}\n */\n ListWrapper.flatten = function (list) {\n return list.reduce(function (flat, item) {\n var /** @type {?} */ flatItem = Array.isArray(item) ? ListWrapper.flatten(item) : item;\n return ((flat)).concat(flatItem);\n }, []);\n };\n return ListWrapper;\n }());\n /**\n * @param {?} obj\n * @return {?}\n */\n function isListLikeIterable(obj) {\n if (!isJsObject(obj))\n return false;\n return Array.isArray(obj) ||\n (!(obj instanceof Map) &&\n getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop\n }\n /**\n * @param {?} a\n * @param {?} b\n * @param {?} comparator\n * @return {?}\n */\n function areIterablesEqual(a, b, comparator) {\n var /** @type {?} */ iterator1 = a[getSymbolIterator()]();\n var /** @type {?} */ iterator2 = b[getSymbolIterator()]();\n while (true) {\n var /** @type {?} */ item1 = iterator1.next();\n var /** @type {?} */ item2 = iterator2.next();\n if (item1.done && item2.done)\n return true;\n if (item1.done || item2.done)\n return false;\n if (!comparator(item1.value, item2.value))\n return false;\n }\n }\n /**\n * @param {?} obj\n * @param {?} fn\n * @return {?}\n */\n function iterateListLike(obj, fn) {\n if (Array.isArray(obj)) {\n for (var /** @type {?} */ i = 0; i < obj.length; i++) {\n fn(obj[i]);\n }\n }\n else {\n var /** @type {?} */ iterator = obj[getSymbolIterator()]();\n var /** @type {?} */ item = void 0;\n while (!((item = iterator.next()).done)) {\n fn(item.value);\n }\n }\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @param {?} obj\n * @return {?}\n */\n function isPromise(obj) {\n // allow any Promise/A+ compliant thenable.\n // It's up to the caller to ensure that obj.then conforms to the spec\n return !!obj && typeof obj.then === 'function';\n }\n\n /**\n * A function that will be executed when an application is initialized.\n * @experimental\n */\n var /** @type {?} */ APP_INITIALIZER = new OpaqueToken('Application Initializer');\n /**\n * A class that reflects the state of running {@link APP_INITIALIZER}s.\n * *\n */\n var ApplicationInitStatus = (function () {\n /**\n * @param {?} appInits\n */\n function ApplicationInitStatus(appInits) {\n var _this = this;\n this._done = false;\n var asyncInitPromises = [];\n if (appInits) {\n for (var i = 0; i < appInits.length; i++) {\n var initResult = appInits[i]();\n if (isPromise(initResult)) {\n asyncInitPromises.push(initResult);\n }\n }\n }\n this._donePromise = Promise.all(asyncInitPromises).then(function () { _this._done = true; });\n if (asyncInitPromises.length === 0) {\n this._done = true;\n }\n }\n Object.defineProperty(ApplicationInitStatus.prototype, \"done\", {\n /**\n * @return {?}\n */\n get: function () { return this._done; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ApplicationInitStatus.prototype, \"donePromise\", {\n /**\n * @return {?}\n */\n get: function () { return this._donePromise; },\n enumerable: true,\n configurable: true\n });\n ApplicationInitStatus.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n ApplicationInitStatus.ctorParameters = function () { return [\n { type: Array, decorators: [{ type: Inject, args: [APP_INITIALIZER,] }, { type: Optional },] },\n ]; };\n return ApplicationInitStatus;\n }());\n\n /**\n * A DI Token representing a unique string id assigned to the application by Angular and used\n * primarily for prefixing application attributes and CSS styles when\n * {@link ViewEncapsulation#Emulated} is being used.\n *\n * If you need to avoid randomly generated value to be used as an application id, you can provide\n * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}\n * using this token.\n * @experimental\n */\n var /** @type {?} */ APP_ID = new OpaqueToken('AppId');\n /**\n * @return {?}\n */\n function _appIdRandomProviderFactory() {\n return \"\" + _randomChar() + _randomChar() + _randomChar();\n }\n /**\n * Providers that will generate a random APP_ID_TOKEN.\n * @experimental\n */\n var /** @type {?} */ APP_ID_RANDOM_PROVIDER = {\n provide: APP_ID,\n useFactory: _appIdRandomProviderFactory,\n deps: /** @type {?} */ ([]),\n };\n /**\n * @return {?}\n */\n function _randomChar() {\n return String.fromCharCode(97 + Math.floor(Math.random() * 25));\n }\n /**\n * A function that will be executed when a platform is initialized.\n * @experimental\n */\n var /** @type {?} */ PLATFORM_INITIALIZER = new OpaqueToken('Platform Initializer');\n /**\n * All callbacks provided via this token will be called for every component that is bootstrapped.\n * Signature of the callback:\n *\n * `(componentRef: ComponentRef) => void`.\n *\n * @experimental\n */\n var /** @type {?} */ APP_BOOTSTRAP_LISTENER = new OpaqueToken('appBootstrapListener');\n /**\n * A token which indicates the root directory of the application\n * @experimental\n */\n var /** @type {?} */ PACKAGE_ROOT_URL = new OpaqueToken('Application Packages Root URL');\n\n var Console = (function () {\n function Console() {\n }\n /**\n * @param {?} message\n * @return {?}\n */\n Console.prototype.log = function (message) { print(message); };\n /**\n * @param {?} message\n * @return {?}\n */\n Console.prototype.warn = function (message) { warn(message); };\n Console.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n Console.ctorParameters = function () { return []; };\n return Console;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$4 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Indicates that a component is still being loaded in a synchronous compile.\n * *\n */\n var ComponentStillLoadingError = (function (_super) {\n __extends$4(ComponentStillLoadingError, _super);\n /**\n * @param {?} compType\n */\n function ComponentStillLoadingError(compType) {\n _super.call(this, \"Can't compile synchronously as \" + stringify(compType) + \" is still being loaded!\");\n this.compType = compType;\n }\n return ComponentStillLoadingError;\n }(BaseError));\n /**\n * Combination of NgModuleFactory and ComponentFactorys.\n * *\n */\n var ModuleWithComponentFactories = (function () {\n /**\n * @param {?} ngModuleFactory\n * @param {?} componentFactories\n */\n function ModuleWithComponentFactories(ngModuleFactory, componentFactories) {\n this.ngModuleFactory = ngModuleFactory;\n this.componentFactories = componentFactories;\n }\n return ModuleWithComponentFactories;\n }());\n /**\n * @return {?}\n */\n function _throwError() {\n throw new Error(\"Runtime compiler is not loaded\");\n }\n /**\n * Low-level service for running the angular compiler during runtime\n * to create {@link ComponentFactory}s, which\n * can later be used to create and render a Component instance.\n * *\n * Each `@NgModule` provides an own `Compiler` to its injector,\n * that will use the directives/pipes of the ng module for compilation\n * of components.\n */\n var Compiler = (function () {\n function Compiler() {\n }\n /**\n * Compiles the given NgModule and all of its components. All templates of the components listed\n * in `entryComponents`\n * have to be inlined. Otherwise throws a {@link ComponentStillLoadingError}.\n * @param {?} moduleType\n * @return {?}\n */\n Compiler.prototype.compileModuleSync = function (moduleType) { throw _throwError(); };\n /**\n * Compiles the given NgModule and all of its components\n * @param {?} moduleType\n * @return {?}\n */\n Compiler.prototype.compileModuleAsync = function (moduleType) { throw _throwError(); };\n /**\n * Same as {@link compileModuleSync} but also creates ComponentFactories for all components.\n * @param {?} moduleType\n * @return {?}\n */\n Compiler.prototype.compileModuleAndAllComponentsSync = function (moduleType) {\n throw _throwError();\n };\n /**\n * Same as {@link compileModuleAsync} but also creates ComponentFactories for all components.\n * @param {?} moduleType\n * @return {?}\n */\n Compiler.prototype.compileModuleAndAllComponentsAsync = function (moduleType) {\n throw _throwError();\n };\n /**\n * Exposes the CSS-style selectors that have been used in `ngContent` directives within\n * the template of the given component.\n * This is used by the `upgrade` library to compile the appropriate transclude content\n * in the Angular 1 wrapper component.\n * @param {?} component\n * @return {?}\n */\n Compiler.prototype.getNgContentSelectors = function (component) { throw _throwError(); };\n /**\n * Clears all caches.\n * @return {?}\n */\n Compiler.prototype.clearCache = function () { };\n /**\n * Clears the cache for the given component/ngModule.\n * @param {?} type\n * @return {?}\n */\n Compiler.prototype.clearCacheFor = function (type) { };\n Compiler.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n Compiler.ctorParameters = function () { return []; };\n return Compiler;\n }());\n /**\n * Token to provide CompilerOptions in the platform injector.\n *\n * @experimental\n */\n var /** @type {?} */ COMPILER_OPTIONS = new OpaqueToken('compilerOptions');\n /**\n * A factory for creating a Compiler\n * *\n * @abstract\n */\n var CompilerFactory = (function () {\n function CompilerFactory() {\n }\n /**\n * @abstract\n * @param {?=} options\n * @return {?}\n */\n CompilerFactory.prototype.createCompiler = function (options) { };\n return CompilerFactory;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * A wrapper around a native element inside of a View.\n *\n * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM\n * element.\n *\n * @security Permitting direct access to the DOM can make your application more vulnerable to\n * XSS attacks. Carefully review any use of `ElementRef` in your code. For more detail, see the\n * [Security Guide](http://g.co/ng/security).\n *\n * @stable\n */\n // Note: We don't expose things like `Injector`, `ViewContainer`, ... here,\n // i.e. users have to ask for what they need. With that, we can build better analysis tools\n // and could do better codegen in the future.\n var ElementRef = (function () {\n /**\n * @param {?} nativeElement\n */\n function ElementRef(nativeElement) {\n this.nativeElement = nativeElement;\n }\n return ElementRef;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$6 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Use by directives and components to emit custom Events.\n * *\n * ### Examples\n * *\n * In the following example, `Zippy` alternatively emits `open` and `close` events when its\n * title gets clicked:\n * *\n * ```\n * selector: 'zippy',\n * template: `\n * <div class=\"zippy\">\n * <div (click)=\"toggle()\">Toggle</div>\n * <div [hidden]=\"!visible\">\n * <ng-content></ng-content>\n * </div>\n * </div>`})\n * export class Zippy {\n * visible: boolean = true;\n * @Output() open: EventEmitter<any> = new EventEmitter();\n * @Output() close: EventEmitter<any> = new EventEmitter();\n * *\n * toggle() {\n * this.visible = !this.visible;\n * if (this.visible) {\n * this.open.emit(null);\n * } else {\n * this.close.emit(null);\n * }\n * }\n * }\n * ```\n * *\n * The events payload can be accessed by the parameter `$event` on the components output event\n * handler:\n * *\n * ```\n * <zippy (open)=\"onOpen($event)\" (close)=\"onClose($event)\"></zippy>\n * ```\n * *\n * Uses Rx.Observable but provides an adapter to make it work as specified here:\n * https://github.com/jhusain/observable-spec\n * *\n * Once a reference implementation of the spec is available, switch to it.\n */\n var EventEmitter = (function (_super) {\n __extends$6(EventEmitter, _super);\n /**\n * Creates an instance of [EventEmitter], which depending on [isAsync],\n * delivers events synchronously or asynchronously.\n * @param {?=} isAsync\n */\n function EventEmitter(isAsync) {\n if (isAsync === void 0) { isAsync = false; }\n _super.call(this);\n this.__isAsync = isAsync;\n }\n /**\n * @param {?=} value\n * @return {?}\n */\n EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };\n /**\n * @param {?=} generatorOrNext\n * @param {?=} error\n * @param {?=} complete\n * @return {?}\n */\n EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {\n var /** @type {?} */ schedulerFn;\n var /** @type {?} */ errorFn = function (err) { return null; };\n var /** @type {?} */ completeFn = function () { return null; };\n if (generatorOrNext && typeof generatorOrNext === 'object') {\n schedulerFn = this.__isAsync ? function (value) {\n setTimeout(function () { return generatorOrNext.next(value); });\n } : function (value) { generatorOrNext.next(value); };\n if (generatorOrNext.error) {\n errorFn = this.__isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :\n function (err) { generatorOrNext.error(err); };\n }\n if (generatorOrNext.complete) {\n completeFn = this.__isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :\n function () { generatorOrNext.complete(); };\n }\n }\n else {\n schedulerFn = this.__isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :\n function (value) { generatorOrNext(value); };\n if (error) {\n errorFn =\n this.__isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };\n }\n if (complete) {\n completeFn =\n this.__isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };\n }\n }\n return _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);\n };\n return EventEmitter;\n }(rxjs_Subject.Subject));\n\n /**\n * An injectable service for executing work inside or outside of the Angular zone.\n * *\n * The most common use of this service is to optimize performance when starting a work consisting of\n * one or more asynchronous tasks that don't require UI updates or error handling to be handled by\n * Angular. Such tasks can be kicked off via {@link runOutsideAngular} and if needed, these tasks\n * can reenter the Angular zone via {@link run}.\n * *\n * <!-- TODO: add/fix links to:\n * - docs explaining zones and the use of zones in Angular and change-detection\n * - link to runOutsideAngular/run (throughout this file!)\n * -->\n * *\n * ### Example\n * ```\n * import {Component, NgZone} from '@angular/core';\n * import {NgIf} from '@angular/common';\n * *\n * selector: 'ng-zone-demo'.\n * template: `\n * <h2>Demo: NgZone</h2>\n * *\n * <p>Progress: {{progress}}%</p>\n * <p *ngIf=\"progress >= 100\">Done processing {{label}} of Angular zone!</p>\n * *\n * <button (click)=\"processWithinAngularZone()\">Process within Angular zone</button>\n * <button (click)=\"processOutsideOfAngularZone()\">Process outside of Angular zone</button>\n * `,\n * })\n * export class NgZoneDemo {\n * progress: number = 0;\n * label: string;\n * *\n * constructor(private _ngZone: NgZone) {}\n * *\n * // Loop inside the Angular zone\n * // so the UI DOES refresh after each setTimeout cycle\n * processWithinAngularZone() {\n * this.label = 'inside';\n * this.progress = 0;\n * this._increaseProgress(() => console.log('Inside Done!'));\n * }\n * *\n * // Loop outside of the Angular zone\n * // so the UI DOES NOT refresh after each setTimeout cycle\n * processOutsideOfAngularZone() {\n * this.label = 'outside';\n * this.progress = 0;\n * this._ngZone.runOutsideAngular(() => {\n * this._increaseProgress(() => {\n * // reenter the Angular zone and display done\n * this._ngZone.run(() => {console.log('Outside Done!') });\n * }}));\n * }\n * *\n * _increaseProgress(doneCallback: () => void) {\n * this.progress += 1;\n * console.log(`Current progress: ${this.progress}%`);\n * *\n * if (this.progress < 100) {\n * window.setTimeout(() => this._increaseProgress(doneCallback)), 10)\n * } else {\n * doneCallback();\n * }\n * }\n * }\n * ```\n */\n var NgZone = (function () {\n /**\n * @param {?} __0\n */\n function NgZone(_a) {\n var _b = _a.enableLongStackTrace, enableLongStackTrace = _b === void 0 ? false : _b;\n this._hasPendingMicrotasks = false;\n this._hasPendingMacrotasks = false;\n this._isStable = true;\n this._nesting = 0;\n this._onUnstable = new EventEmitter(false);\n this._onMicrotaskEmpty = new EventEmitter(false);\n this._onStable = new EventEmitter(false);\n this._onErrorEvents = new EventEmitter(false);\n if (typeof Zone == 'undefined') {\n throw new Error('Angular requires Zone.js prolyfill.');\n }\n Zone.assertZonePatched();\n this.outer = this.inner = Zone.current;\n if (Zone['wtfZoneSpec']) {\n this.inner = this.inner.fork(Zone['wtfZoneSpec']);\n }\n if (enableLongStackTrace && Zone['longStackTraceZoneSpec']) {\n this.inner = this.inner.fork(Zone['longStackTraceZoneSpec']);\n }\n this.forkInnerZoneWithAngularBehavior();\n }\n /**\n * @return {?}\n */\n NgZone.isInAngularZone = function () { return Zone.current.get('isAngularZone') === true; };\n /**\n * @return {?}\n */\n NgZone.assertInAngularZone = function () {\n if (!NgZone.isInAngularZone()) {\n throw new Error('Expected to be in Angular Zone, but it is not!');\n }\n };\n /**\n * @return {?}\n */\n NgZone.assertNotInAngularZone = function () {\n if (NgZone.isInAngularZone()) {\n throw new Error('Expected to not be in Angular Zone, but it is!');\n }\n };\n /**\n * Executes the `fn` function synchronously within the Angular zone and returns value returned by\n * the function.\n * *\n * Running functions via `run` allows you to reenter Angular zone from a task that was executed\n * outside of the Angular zone (typically started via {@link runOutsideAngular}).\n * *\n * Any future tasks or microtasks scheduled from within this function will continue executing from\n * within the Angular zone.\n * *\n * If a synchronous error happens it will be rethrown and not reported via `onError`.\n * @param {?} fn\n * @return {?}\n */\n NgZone.prototype.run = function (fn) { return this.inner.run(fn); };\n /**\n * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not\n * rethrown.\n * @param {?} fn\n * @return {?}\n */\n NgZone.prototype.runGuarded = function (fn) { return this.inner.runGuarded(fn); };\n /**\n * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by\n * the function.\n * *\n * Running functions via `runOutsideAngular` allows you to escape Angular's zone and do work that\n * doesn't trigger Angular change-detection or is subject to Angular's error handling.\n * *\n * Any future tasks or microtasks scheduled from within this function will continue executing from\n * outside of the Angular zone.\n * *\n * Use {@link run} to reenter the Angular zone and do work that updates the application model.\n * @param {?} fn\n * @return {?}\n */\n NgZone.prototype.runOutsideAngular = function (fn) { return this.outer.run(fn); };\n Object.defineProperty(NgZone.prototype, \"onUnstable\", {\n /**\n * Notifies when code enters Angular Zone. This gets fired first on VM Turn.\n * @return {?}\n */\n get: function () { return this._onUnstable; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"onMicrotaskEmpty\", {\n /**\n * Notifies when there is no more microtasks enqueue in the current VM Turn.\n * This is a hint for Angular to do change detection, which may enqueue more microtasks.\n * For this reason this event can fire multiple times per VM Turn.\n * @return {?}\n */\n get: function () { return this._onMicrotaskEmpty; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"onStable\", {\n /**\n * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which\n * implies we are about to relinquish VM turn.\n * This event gets called just once.\n * @return {?}\n */\n get: function () { return this._onStable; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"onError\", {\n /**\n * Notify that an error has been delivered.\n * @return {?}\n */\n get: function () { return this._onErrorEvents; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"isStable\", {\n /**\n * Whether there are no outstanding microtasks or macrotasks.\n * @return {?}\n */\n get: function () { return this._isStable; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"hasPendingMicrotasks\", {\n /**\n * @return {?}\n */\n get: function () { return this._hasPendingMicrotasks; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgZone.prototype, \"hasPendingMacrotasks\", {\n /**\n * @return {?}\n */\n get: function () { return this._hasPendingMacrotasks; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n NgZone.prototype.checkStable = function () {\n var _this = this;\n if (this._nesting == 0 && !this._hasPendingMicrotasks && !this._isStable) {\n try {\n this._nesting++;\n this._onMicrotaskEmpty.emit(null);\n }\n finally {\n this._nesting--;\n if (!this._hasPendingMicrotasks) {\n try {\n this.runOutsideAngular(function () { return _this._onStable.emit(null); });\n }\n finally {\n this._isStable = true;\n }\n }\n }\n }\n };\n /**\n * @return {?}\n */\n NgZone.prototype.forkInnerZoneWithAngularBehavior = function () {\n var _this = this;\n this.inner = this.inner.fork({\n name: 'angular',\n properties: /** @type {?} */ ({ 'isAngularZone': true }),\n onInvokeTask: function (delegate, current, target, task, applyThis, applyArgs) {\n try {\n _this.onEnter();\n return delegate.invokeTask(target, task, applyThis, applyArgs);\n }\n finally {\n _this.onLeave();\n }\n },\n onInvoke: function (delegate, current, target, callback, applyThis, applyArgs, source) {\n try {\n _this.onEnter();\n return delegate.invoke(target, callback, applyThis, applyArgs, source);\n }\n finally {\n _this.onLeave();\n }\n },\n onHasTask: function (delegate, current, target, hasTaskState) {\n delegate.hasTask(target, hasTaskState);\n if (current === target) {\n // We are only interested in hasTask events which originate from our zone\n // (A child hasTask event is not interesting to us)\n if (hasTaskState.change == 'microTask') {\n _this.setHasMicrotask(hasTaskState.microTask);\n }\n else if (hasTaskState.change == 'macroTask') {\n _this.setHasMacrotask(hasTaskState.macroTask);\n }\n }\n },\n onHandleError: function (delegate, current, target, error) {\n delegate.handleError(target, error);\n _this.triggerError(error);\n return false;\n }\n });\n };\n /**\n * @return {?}\n */\n NgZone.prototype.onEnter = function () {\n this._nesting++;\n if (this._isStable) {\n this._isStable = false;\n this._onUnstable.emit(null);\n }\n };\n /**\n * @return {?}\n */\n NgZone.prototype.onLeave = function () {\n this._nesting--;\n this.checkStable();\n };\n /**\n * @param {?} hasMicrotasks\n * @return {?}\n */\n NgZone.prototype.setHasMicrotask = function (hasMicrotasks) {\n this._hasPendingMicrotasks = hasMicrotasks;\n this.checkStable();\n };\n /**\n * @param {?} hasMacrotasks\n * @return {?}\n */\n NgZone.prototype.setHasMacrotask = function (hasMacrotasks) { this._hasPendingMacrotasks = hasMacrotasks; };\n /**\n * @param {?} error\n * @return {?}\n */\n NgZone.prototype.triggerError = function (error) { this._onErrorEvents.emit(error); };\n return NgZone;\n }());\n\n var AnimationQueue = (function () {\n /**\n * @param {?} _zone\n */\n function AnimationQueue(_zone) {\n this._zone = _zone;\n this.entries = [];\n }\n /**\n * @param {?} player\n * @return {?}\n */\n AnimationQueue.prototype.enqueue = function (player) { this.entries.push(player); };\n /**\n * @return {?}\n */\n AnimationQueue.prototype.flush = function () {\n var _this = this;\n // given that each animation player may set aside\n // microtasks and rely on DOM-based events, this\n // will cause Angular to run change detection after\n // each request. This sidesteps the issue. If a user\n // hooks into an animation via (@anim.start) or (@anim.done)\n // then those methods will automatically trigger change\n // detection by wrapping themselves inside of a zone\n if (this.entries.length) {\n this._zone.runOutsideAngular(function () {\n // this code is wrapped into a single promise such that the\n // onStart and onDone player callbacks are triggered outside\n // of the digest cycle of animations\n Promise.resolve(null).then(function () { return _this._triggerAnimations(); });\n });\n }\n };\n /**\n * @return {?}\n */\n AnimationQueue.prototype._triggerAnimations = function () {\n NgZone.assertNotInAngularZone();\n while (this.entries.length) {\n var /** @type {?} */ player = this.entries.shift();\n // in the event that an animation throws an error then we do\n // not want to re-run animations on any previous animations\n // if they have already been kicked off beforehand\n if (!player.hasStarted()) {\n player.play();\n }\n }\n };\n AnimationQueue.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n AnimationQueue.ctorParameters = function () { return [\n { type: NgZone, },\n ]; };\n return AnimationQueue;\n }());\n\n var DefaultIterableDifferFactory = (function () {\n function DefaultIterableDifferFactory() {\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n DefaultIterableDifferFactory.prototype.supports = function (obj) { return isListLikeIterable(obj); };\n /**\n * @param {?} cdRef\n * @param {?=} trackByFn\n * @return {?}\n */\n DefaultIterableDifferFactory.prototype.create = function (cdRef, trackByFn) {\n return new DefaultIterableDiffer(trackByFn);\n };\n return DefaultIterableDifferFactory;\n }());\n var /** @type {?} */ trackByIdentity = function (index, item) { return item; };\n /**\n * @stable\n */\n var DefaultIterableDiffer = (function () {\n /**\n * @param {?=} _trackByFn\n */\n function DefaultIterableDiffer(_trackByFn) {\n this._trackByFn = _trackByFn;\n this._length = null;\n this._collection = null;\n this._linkedRecords = null;\n this._unlinkedRecords = null;\n this._previousItHead = null;\n this._itHead = null;\n this._itTail = null;\n this._additionsHead = null;\n this._additionsTail = null;\n this._movesHead = null;\n this._movesTail = null;\n this._removalsHead = null;\n this._removalsTail = null;\n this._identityChangesHead = null;\n this._identityChangesTail = null;\n this._trackByFn = this._trackByFn || trackByIdentity;\n }\n Object.defineProperty(DefaultIterableDiffer.prototype, \"collection\", {\n /**\n * @return {?}\n */\n get: function () { return this._collection; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DefaultIterableDiffer.prototype, \"length\", {\n /**\n * @return {?}\n */\n get: function () { return this._length; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._itHead; record !== null; record = record._next) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachOperation = function (fn) {\n var /** @type {?} */ nextIt = this._itHead;\n var /** @type {?} */ nextRemove = this._removalsHead;\n var /** @type {?} */ addRemoveOffset = 0;\n var /** @type {?} */ moveOffsets = null;\n while (nextIt || nextRemove) {\n // Figure out which is the next record to process\n // Order: remove, add, move\n var /** @type {?} */ record = !nextRemove ||\n nextIt &&\n nextIt.currentIndex < getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets) ?\n nextIt :\n nextRemove;\n var /** @type {?} */ adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);\n var /** @type {?} */ currentIndex = record.currentIndex;\n // consume the item, and adjust the addRemoveOffset and update moveDistance if necessary\n if (record === nextRemove) {\n addRemoveOffset--;\n nextRemove = nextRemove._nextRemoved;\n }\n else {\n nextIt = nextIt._next;\n if (record.previousIndex == null) {\n addRemoveOffset++;\n }\n else {\n // INVARIANT: currentIndex < previousIndex\n if (!moveOffsets)\n moveOffsets = [];\n var /** @type {?} */ localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;\n var /** @type {?} */ localCurrentIndex = currentIndex - addRemoveOffset;\n if (localMovePreviousIndex != localCurrentIndex) {\n for (var /** @type {?} */ i = 0; i < localMovePreviousIndex; i++) {\n var /** @type {?} */ offset = i < moveOffsets.length ? moveOffsets[i] : (moveOffsets[i] = 0);\n var /** @type {?} */ index = offset + i;\n if (localCurrentIndex <= index && index < localMovePreviousIndex) {\n moveOffsets[i] = offset + 1;\n }\n }\n var /** @type {?} */ previousIndex = record.previousIndex;\n moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;\n }\n }\n }\n if (adjPreviousIndex !== currentIndex) {\n fn(record, adjPreviousIndex, currentIndex);\n }\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._previousItHead; record !== null; record = record._nextPrevious) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._movesHead; record !== null; record = record._nextMoved) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultIterableDiffer.prototype.forEachIdentityChange = function (fn) {\n var /** @type {?} */ record;\n for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {\n fn(record);\n }\n };\n /**\n * @param {?} collection\n * @return {?}\n */\n DefaultIterableDiffer.prototype.diff = function (collection) {\n if (isBlank(collection))\n collection = [];\n if (!isListLikeIterable(collection)) {\n throw new Error(\"Error trying to diff '\" + collection + \"'\");\n }\n if (this.check(collection)) {\n return this;\n }\n else {\n return null;\n }\n };\n /**\n * @return {?}\n */\n DefaultIterableDiffer.prototype.onDestroy = function () { };\n /**\n * @param {?} collection\n * @return {?}\n */\n DefaultIterableDiffer.prototype.check = function (collection) {\n var _this = this;\n this._reset();\n var /** @type {?} */ record = this._itHead;\n var /** @type {?} */ mayBeDirty = false;\n var /** @type {?} */ index;\n var /** @type {?} */ item;\n var /** @type {?} */ itemTrackBy;\n if (Array.isArray(collection)) {\n var /** @type {?} */ list = collection;\n this._length = collection.length;\n for (var /** @type {?} */ index_1 = 0; index_1 < this._length; index_1++) {\n item = list[index_1];\n itemTrackBy = this._trackByFn(index_1, item);\n if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {\n record = this._mismatch(record, item, itemTrackBy, index_1);\n mayBeDirty = true;\n }\n else {\n if (mayBeDirty) {\n // TODO(misko): can we limit this to duplicates only?\n record = this._verifyReinsertion(record, item, itemTrackBy, index_1);\n }\n if (!looseIdentical(record.item, item))\n this._addIdentityChange(record, item);\n }\n record = record._next;\n }\n }\n else {\n index = 0;\n iterateListLike(collection, function (item /** TODO #9100 */) {\n itemTrackBy = _this._trackByFn(index, item);\n if (record === null || !looseIdentical(record.trackById, itemTrackBy)) {\n record = _this._mismatch(record, item, itemTrackBy, index);\n mayBeDirty = true;\n }\n else {\n if (mayBeDirty) {\n // TODO(misko): can we limit this to duplicates only?\n record = _this._verifyReinsertion(record, item, itemTrackBy, index);\n }\n if (!looseIdentical(record.item, item))\n _this._addIdentityChange(record, item);\n }\n record = record._next;\n index++;\n });\n this._length = index;\n }\n this._truncate(record);\n this._collection = collection;\n return this.isDirty;\n };\n Object.defineProperty(DefaultIterableDiffer.prototype, \"isDirty\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._additionsHead !== null || this._movesHead !== null ||\n this._removalsHead !== null || this._identityChangesHead !== null;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Reset the state of the change objects to show no changes. This means set previousKey to\n * currentKey, and clear all of the queues (additions, moves, removals).\n * Set the previousIndexes of moved and added items to their currentIndexes\n * Reset the list of additions, moves and removals\n * *\n * @return {?}\n */\n DefaultIterableDiffer.prototype._reset = function () {\n if (this.isDirty) {\n var /** @type {?} */ record = void 0;\n var /** @type {?} */ nextRecord = void 0;\n for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {\n record._nextPrevious = record._next;\n }\n for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n record.previousIndex = record.currentIndex;\n }\n this._additionsHead = this._additionsTail = null;\n for (record = this._movesHead; record !== null; record = nextRecord) {\n record.previousIndex = record.currentIndex;\n nextRecord = record._nextMoved;\n }\n this._movesHead = this._movesTail = null;\n this._removalsHead = this._removalsTail = null;\n this._identityChangesHead = this._identityChangesTail = null;\n }\n };\n /**\n * This is the core function which handles differences between collections.\n * *\n * - `record` is the record which we saw at this position last time. If null then it is a new\n * item.\n * - `item` is the current item in the collection\n * - `index` is the position of the item in the collection\n * *\n * @param {?} record\n * @param {?} item\n * @param {?} itemTrackBy\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._mismatch = function (record, item, itemTrackBy, index) {\n // The previous record after which we will append the current one.\n var /** @type {?} */ previousRecord;\n if (record === null) {\n previousRecord = this._itTail;\n }\n else {\n previousRecord = record._prev;\n // Remove the record from the collection since we know it does not match the item.\n this._remove(record);\n }\n // Attempt to see if we have seen the item before.\n record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);\n if (record !== null) {\n // We have seen this before, we need to move it forward in the collection.\n // But first we need to check if identity changed, so we can update in view if necessary\n if (!looseIdentical(record.item, item))\n this._addIdentityChange(record, item);\n this._moveAfter(record, previousRecord, index);\n }\n else {\n // Never seen it, check evicted list.\n record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy);\n if (record !== null) {\n // It is an item which we have evicted earlier: reinsert it back into the list.\n // But first we need to check if identity changed, so we can update in view if necessary\n if (!looseIdentical(record.item, item))\n this._addIdentityChange(record, item);\n this._reinsertAfter(record, previousRecord, index);\n }\n else {\n // It is a new item: add it.\n record =\n this._addAfter(new CollectionChangeRecord(item, itemTrackBy), previousRecord, index);\n }\n }\n return record;\n };\n /**\n * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)\n * *\n * Use case: `[a, a]` => `[b, a, a]`\n * *\n * If we did not have this check then the insertion of `b` would:\n * 1) evict first `a`\n * 2) insert `b` at `0` index.\n * 3) leave `a` at index `1` as is. <-- this is wrong!\n * 3) reinsert `a` at index 2. <-- this is wrong!\n * *\n * The correct behavior is:\n * 1) evict first `a`\n * 2) insert `b` at `0` index.\n * 3) reinsert `a` at index 1.\n * 3) move `a` at from `1` to `2`.\n * *\n * *\n * Double check that we have not evicted a duplicate item. We need to check if the item type may\n * have already been removed:\n * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted\n * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a\n * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'\n * at the end.\n * *\n * @param {?} record\n * @param {?} item\n * @param {?} itemTrackBy\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, itemTrackBy, index) {\n var /** @type {?} */ reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy);\n if (reinsertRecord !== null) {\n record = this._reinsertAfter(reinsertRecord, record._prev, index);\n }\n else if (record.currentIndex != index) {\n record.currentIndex = index;\n this._addToMoves(record, index);\n }\n return record;\n };\n /**\n * Get rid of any excess {@link CollectionChangeRecord}s from the previous collection\n * *\n * - `record` The first excess {@link CollectionChangeRecord}.\n * *\n * @param {?} record\n * @return {?}\n */\n DefaultIterableDiffer.prototype._truncate = function (record) {\n // Anything after that needs to be removed;\n while (record !== null) {\n var /** @type {?} */ nextRecord = record._next;\n this._addToRemovals(this._unlink(record));\n record = nextRecord;\n }\n if (this._unlinkedRecords !== null) {\n this._unlinkedRecords.clear();\n }\n if (this._additionsTail !== null) {\n this._additionsTail._nextAdded = null;\n }\n if (this._movesTail !== null) {\n this._movesTail._nextMoved = null;\n }\n if (this._itTail !== null) {\n this._itTail._next = null;\n }\n if (this._removalsTail !== null) {\n this._removalsTail._nextRemoved = null;\n }\n if (this._identityChangesTail !== null) {\n this._identityChangesTail._nextIdentityChange = null;\n }\n };\n /**\n * @param {?} record\n * @param {?} prevRecord\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {\n if (this._unlinkedRecords !== null) {\n this._unlinkedRecords.remove(record);\n }\n var /** @type {?} */ prev = record._prevRemoved;\n var /** @type {?} */ next = record._nextRemoved;\n if (prev === null) {\n this._removalsHead = next;\n }\n else {\n prev._nextRemoved = next;\n }\n if (next === null) {\n this._removalsTail = prev;\n }\n else {\n next._prevRemoved = prev;\n }\n this._insertAfter(record, prevRecord, index);\n this._addToMoves(record, index);\n return record;\n };\n /**\n * @param {?} record\n * @param {?} prevRecord\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {\n this._unlink(record);\n this._insertAfter(record, prevRecord, index);\n this._addToMoves(record, index);\n return record;\n };\n /**\n * @param {?} record\n * @param {?} prevRecord\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {\n this._insertAfter(record, prevRecord, index);\n if (this._additionsTail === null) {\n // todo(vicb)\n // assert(this._additionsHead === null);\n this._additionsTail = this._additionsHead = record;\n }\n else {\n // todo(vicb)\n // assert(_additionsTail._nextAdded === null);\n // assert(record._nextAdded === null);\n this._additionsTail = this._additionsTail._nextAdded = record;\n }\n return record;\n };\n /**\n * @param {?} record\n * @param {?} prevRecord\n * @param {?} index\n * @return {?}\n */\n DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {\n // todo(vicb)\n // assert(record != prevRecord);\n // assert(record._next === null);\n // assert(record._prev === null);\n var /** @type {?} */ next = prevRecord === null ? this._itHead : prevRecord._next;\n // todo(vicb)\n // assert(next != record);\n // assert(prevRecord != record);\n record._next = next;\n record._prev = prevRecord;\n if (next === null) {\n this._itTail = record;\n }\n else {\n next._prev = record;\n }\n if (prevRecord === null) {\n this._itHead = record;\n }\n else {\n prevRecord._next = record;\n }\n if (this._linkedRecords === null) {\n this._linkedRecords = new _DuplicateMap();\n }\n this._linkedRecords.put(record);\n record.currentIndex = index;\n return record;\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultIterableDiffer.prototype._remove = function (record) {\n return this._addToRemovals(this._unlink(record));\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultIterableDiffer.prototype._unlink = function (record) {\n if (this._linkedRecords !== null) {\n this._linkedRecords.remove(record);\n }\n var /** @type {?} */ prev = record._prev;\n var /** @type {?} */ next = record._next;\n // todo(vicb)\n // assert((record._prev = null) === null);\n // assert((record._next = null) === null);\n if (prev === null) {\n this._itHead = next;\n }\n else {\n prev._next = next;\n }\n if (next === null) {\n this._itTail = prev;\n }\n else {\n next._prev = prev;\n }\n return record;\n };\n /**\n * @param {?} record\n * @param {?} toIndex\n * @return {?}\n */\n DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {\n // todo(vicb)\n // assert(record._nextMoved === null);\n if (record.previousIndex === toIndex) {\n return record;\n }\n if (this._movesTail === null) {\n // todo(vicb)\n // assert(_movesHead === null);\n this._movesTail = this._movesHead = record;\n }\n else {\n // todo(vicb)\n // assert(_movesTail._nextMoved === null);\n this._movesTail = this._movesTail._nextMoved = record;\n }\n return record;\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultIterableDiffer.prototype._addToRemovals = function (record) {\n if (this._unlinkedRecords === null) {\n this._unlinkedRecords = new _DuplicateMap();\n }\n this._unlinkedRecords.put(record);\n record.currentIndex = null;\n record._nextRemoved = null;\n if (this._removalsTail === null) {\n // todo(vicb)\n // assert(_removalsHead === null);\n this._removalsTail = this._removalsHead = record;\n record._prevRemoved = null;\n }\n else {\n // todo(vicb)\n // assert(_removalsTail._nextRemoved === null);\n // assert(record._nextRemoved === null);\n record._prevRemoved = this._removalsTail;\n this._removalsTail = this._removalsTail._nextRemoved = record;\n }\n return record;\n };\n /**\n * @param {?} record\n * @param {?} item\n * @return {?}\n */\n DefaultIterableDiffer.prototype._addIdentityChange = function (record, item) {\n record.item = item;\n if (this._identityChangesTail === null) {\n this._identityChangesTail = this._identityChangesHead = record;\n }\n else {\n this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;\n }\n return record;\n };\n /**\n * @return {?}\n */\n DefaultIterableDiffer.prototype.toString = function () {\n var /** @type {?} */ list = [];\n this.forEachItem(function (record /** TODO #9100 */) { return list.push(record); });\n var /** @type {?} */ previous = [];\n this.forEachPreviousItem(function (record /** TODO #9100 */) { return previous.push(record); });\n var /** @type {?} */ additions = [];\n this.forEachAddedItem(function (record /** TODO #9100 */) { return additions.push(record); });\n var /** @type {?} */ moves = [];\n this.forEachMovedItem(function (record /** TODO #9100 */) { return moves.push(record); });\n var /** @type {?} */ removals = [];\n this.forEachRemovedItem(function (record /** TODO #9100 */) { return removals.push(record); });\n var /** @type {?} */ identityChanges = [];\n this.forEachIdentityChange(function (record /** TODO #9100 */) { return identityChanges.push(record); });\n return 'collection: ' + list.join(', ') + '\\n' +\n 'previous: ' + previous.join(', ') + '\\n' +\n 'additions: ' + additions.join(', ') + '\\n' +\n 'moves: ' + moves.join(', ') + '\\n' +\n 'removals: ' + removals.join(', ') + '\\n' +\n 'identityChanges: ' + identityChanges.join(', ') + '\\n';\n };\n return DefaultIterableDiffer;\n }());\n /**\n * @stable\n */\n var CollectionChangeRecord = (function () {\n /**\n * @param {?} item\n * @param {?} trackById\n */\n function CollectionChangeRecord(item, trackById) {\n this.item = item;\n this.trackById = trackById;\n this.currentIndex = null;\n this.previousIndex = null;\n /** @internal */\n this._nextPrevious = null;\n /** @internal */\n this._prev = null;\n /** @internal */\n this._next = null;\n /** @internal */\n this._prevDup = null;\n /** @internal */\n this._nextDup = null;\n /** @internal */\n this._prevRemoved = null;\n /** @internal */\n this._nextRemoved = null;\n /** @internal */\n this._nextAdded = null;\n /** @internal */\n this._nextMoved = null;\n /** @internal */\n this._nextIdentityChange = null;\n }\n /**\n * @return {?}\n */\n CollectionChangeRecord.prototype.toString = function () {\n return this.previousIndex === this.currentIndex ? stringify(this.item) :\n stringify(this.item) + '[' +\n stringify(this.previousIndex) + '->' + stringify(this.currentIndex) + ']';\n };\n return CollectionChangeRecord;\n }());\n // A linked list of CollectionChangeRecords with the same CollectionChangeRecord.item\n var _DuplicateItemRecordList = (function () {\n function _DuplicateItemRecordList() {\n /** @internal */\n this._head = null;\n /** @internal */\n this._tail = null;\n }\n /**\n * Append the record to the list of duplicates.\n * *\n * Note: by design all records in the list of duplicates hold the same value in record.item.\n * @param {?} record\n * @return {?}\n */\n _DuplicateItemRecordList.prototype.add = function (record) {\n if (this._head === null) {\n this._head = this._tail = record;\n record._nextDup = null;\n record._prevDup = null;\n }\n else {\n // todo(vicb)\n // assert(record.item == _head.item ||\n // record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);\n this._tail._nextDup = record;\n record._prevDup = this._tail;\n record._nextDup = null;\n this._tail = record;\n }\n };\n /**\n * @param {?} trackById\n * @param {?} afterIndex\n * @return {?}\n */\n _DuplicateItemRecordList.prototype.get = function (trackById, afterIndex) {\n var /** @type {?} */ record;\n for (record = this._head; record !== null; record = record._nextDup) {\n if ((afterIndex === null || afterIndex < record.currentIndex) &&\n looseIdentical(record.trackById, trackById)) {\n return record;\n }\n }\n return null;\n };\n /**\n * Remove one {@link CollectionChangeRecord} from the list of duplicates.\n * *\n * Returns whether the list of duplicates is empty.\n * @param {?} record\n * @return {?}\n */\n _DuplicateItemRecordList.prototype.remove = function (record) {\n // todo(vicb)\n // assert(() {\n // // verify that the record being removed is in the list.\n // for (CollectionChangeRecord cursor = _head; cursor != null; cursor = cursor._nextDup) {\n // if (identical(cursor, record)) return true;\n // }\n // return false;\n //});\n var /** @type {?} */ prev = record._prevDup;\n var /** @type {?} */ next = record._nextDup;\n if (prev === null) {\n this._head = next;\n }\n else {\n prev._nextDup = next;\n }\n if (next === null) {\n this._tail = prev;\n }\n else {\n next._prevDup = prev;\n }\n return this._head === null;\n };\n return _DuplicateItemRecordList;\n }());\n var _DuplicateMap = (function () {\n function _DuplicateMap() {\n this.map = new Map();\n }\n /**\n * @param {?} record\n * @return {?}\n */\n _DuplicateMap.prototype.put = function (record) {\n var /** @type {?} */ key = record.trackById;\n var /** @type {?} */ duplicates = this.map.get(key);\n if (!duplicates) {\n duplicates = new _DuplicateItemRecordList();\n this.map.set(key, duplicates);\n }\n duplicates.add(record);\n };\n /**\n * Retrieve the `value` using key. Because the CollectionChangeRecord value may be one which we\n * have already iterated over, we use the afterIndex to pretend it is not there.\n * *\n * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we\n * have any more `a`s needs to return the last `a` not the first or second.\n * @param {?} trackById\n * @param {?=} afterIndex\n * @return {?}\n */\n _DuplicateMap.prototype.get = function (trackById, afterIndex) {\n if (afterIndex === void 0) { afterIndex = null; }\n var /** @type {?} */ key = trackById;\n var /** @type {?} */ recordList = this.map.get(key);\n return recordList ? recordList.get(trackById, afterIndex) : null;\n };\n /**\n * Removes a {@link CollectionChangeRecord} from the list of duplicates.\n * *\n * The list of duplicates also is removed from the map if it gets empty.\n * @param {?} record\n * @return {?}\n */\n _DuplicateMap.prototype.remove = function (record) {\n var /** @type {?} */ key = record.trackById;\n var /** @type {?} */ recordList = this.map.get(key);\n // Remove the list of duplicates when it gets empty\n if (recordList.remove(record)) {\n this.map.delete(key);\n }\n return record;\n };\n Object.defineProperty(_DuplicateMap.prototype, \"isEmpty\", {\n /**\n * @return {?}\n */\n get: function () { return this.map.size === 0; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n _DuplicateMap.prototype.clear = function () { this.map.clear(); };\n /**\n * @return {?}\n */\n _DuplicateMap.prototype.toString = function () { return '_DuplicateMap(' + stringify(this.map) + ')'; };\n return _DuplicateMap;\n }());\n /**\n * @param {?} item\n * @param {?} addRemoveOffset\n * @param {?} moveOffsets\n * @return {?}\n */\n function getPreviousIndex(item, addRemoveOffset, moveOffsets) {\n var /** @type {?} */ previousIndex = item.previousIndex;\n if (previousIndex === null)\n return previousIndex;\n var /** @type {?} */ moveOffset = 0;\n if (moveOffsets && previousIndex < moveOffsets.length) {\n moveOffset = moveOffsets[previousIndex];\n }\n return previousIndex + addRemoveOffset + moveOffset;\n }\n\n var DefaultKeyValueDifferFactory = (function () {\n function DefaultKeyValueDifferFactory() {\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || isJsObject(obj); };\n /**\n * @param {?} cdRef\n * @return {?}\n */\n DefaultKeyValueDifferFactory.prototype.create = function (cdRef) { return new DefaultKeyValueDiffer(); };\n return DefaultKeyValueDifferFactory;\n }());\n var DefaultKeyValueDiffer = (function () {\n function DefaultKeyValueDiffer() {\n this._records = new Map();\n this._mapHead = null;\n this._previousMapHead = null;\n this._changesHead = null;\n this._changesTail = null;\n this._additionsHead = null;\n this._additionsTail = null;\n this._removalsHead = null;\n this._removalsTail = null;\n }\n Object.defineProperty(DefaultKeyValueDiffer.prototype, \"isDirty\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._additionsHead !== null || this._changesHead !== null ||\n this._removalsHead !== null;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._mapHead; record !== null; record = record._next) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._changesHead; record !== null; record = record._nextChanged) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n fn(record);\n }\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {\n var /** @type {?} */ record;\n for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n fn(record);\n }\n };\n /**\n * @param {?} map\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.diff = function (map) {\n if (!map) {\n map = new Map();\n }\n else if (!(map instanceof Map || isJsObject(map))) {\n throw new Error(\"Error trying to diff '\" + map + \"'\");\n }\n return this.check(map) ? this : null;\n };\n /**\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.onDestroy = function () { };\n /**\n * @param {?} map\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.check = function (map) {\n var _this = this;\n this._reset();\n var /** @type {?} */ records = this._records;\n var /** @type {?} */ oldSeqRecord = this._mapHead;\n var /** @type {?} */ lastOldSeqRecord = null;\n var /** @type {?} */ lastNewSeqRecord = null;\n var /** @type {?} */ seqChanged = false;\n this._forEach(map, function (value, key) {\n var /** @type {?} */ newSeqRecord;\n if (oldSeqRecord && key === oldSeqRecord.key) {\n newSeqRecord = oldSeqRecord;\n _this._maybeAddToChanges(newSeqRecord, value);\n }\n else {\n seqChanged = true;\n if (oldSeqRecord !== null) {\n _this._removeFromSeq(lastOldSeqRecord, oldSeqRecord);\n _this._addToRemovals(oldSeqRecord);\n }\n if (records.has(key)) {\n newSeqRecord = records.get(key);\n _this._maybeAddToChanges(newSeqRecord, value);\n }\n else {\n newSeqRecord = new KeyValueChangeRecord(key);\n records.set(key, newSeqRecord);\n newSeqRecord.currentValue = value;\n _this._addToAdditions(newSeqRecord);\n }\n }\n if (seqChanged) {\n if (_this._isInRemovals(newSeqRecord)) {\n _this._removeFromRemovals(newSeqRecord);\n }\n if (lastNewSeqRecord == null) {\n _this._mapHead = newSeqRecord;\n }\n else {\n lastNewSeqRecord._next = newSeqRecord;\n }\n }\n lastOldSeqRecord = oldSeqRecord;\n lastNewSeqRecord = newSeqRecord;\n oldSeqRecord = oldSeqRecord && oldSeqRecord._next;\n });\n this._truncate(lastOldSeqRecord, oldSeqRecord);\n return this.isDirty;\n };\n /**\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._reset = function () {\n if (this.isDirty) {\n var /** @type {?} */ record = void 0;\n // Record the state of the mapping\n for (record = this._previousMapHead = this._mapHead; record !== null; record = record._next) {\n record._nextPrevious = record._next;\n }\n for (record = this._changesHead; record !== null; record = record._nextChanged) {\n record.previousValue = record.currentValue;\n }\n for (record = this._additionsHead; record != null; record = record._nextAdded) {\n record.previousValue = record.currentValue;\n }\n this._changesHead = this._changesTail = null;\n this._additionsHead = this._additionsTail = null;\n this._removalsHead = this._removalsTail = null;\n }\n };\n /**\n * @param {?} lastRecord\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._truncate = function (lastRecord, record) {\n while (record !== null) {\n if (lastRecord === null) {\n this._mapHead = null;\n }\n else {\n lastRecord._next = null;\n }\n var /** @type {?} */ nextRecord = record._next;\n this._addToRemovals(record);\n lastRecord = record;\n record = nextRecord;\n }\n for (var /** @type {?} */ rec = this._removalsHead; rec !== null; rec = rec._nextRemoved) {\n rec.previousValue = rec.currentValue;\n rec.currentValue = null;\n this._records.delete(rec.key);\n }\n };\n /**\n * @param {?} record\n * @param {?} newValue\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._maybeAddToChanges = function (record, newValue) {\n if (!looseIdentical(newValue, record.currentValue)) {\n record.previousValue = record.currentValue;\n record.currentValue = newValue;\n this._addToChanges(record);\n }\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._isInRemovals = function (record) {\n return record === this._removalsHead || record._nextRemoved !== null ||\n record._prevRemoved !== null;\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._addToRemovals = function (record) {\n if (this._removalsHead === null) {\n this._removalsHead = this._removalsTail = record;\n }\n else {\n this._removalsTail._nextRemoved = record;\n record._prevRemoved = this._removalsTail;\n this._removalsTail = record;\n }\n };\n /**\n * @param {?} prev\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._removeFromSeq = function (prev, record) {\n var /** @type {?} */ next = record._next;\n if (prev === null) {\n this._mapHead = next;\n }\n else {\n prev._next = next;\n }\n record._next = null;\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._removeFromRemovals = function (record) {\n var /** @type {?} */ prev = record._prevRemoved;\n var /** @type {?} */ next = record._nextRemoved;\n if (prev === null) {\n this._removalsHead = next;\n }\n else {\n prev._nextRemoved = next;\n }\n if (next === null) {\n this._removalsTail = prev;\n }\n else {\n next._prevRemoved = prev;\n }\n record._prevRemoved = record._nextRemoved = null;\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {\n if (this._additionsHead === null) {\n this._additionsHead = this._additionsTail = record;\n }\n else {\n this._additionsTail._nextAdded = record;\n this._additionsTail = record;\n }\n };\n /**\n * @param {?} record\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._addToChanges = function (record) {\n if (this._changesHead === null) {\n this._changesHead = this._changesTail = record;\n }\n else {\n this._changesTail._nextChanged = record;\n this._changesTail = record;\n }\n };\n /**\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype.toString = function () {\n var /** @type {?} */ items = [];\n var /** @type {?} */ previous = [];\n var /** @type {?} */ changes = [];\n var /** @type {?} */ additions = [];\n var /** @type {?} */ removals = [];\n var /** @type {?} */ record;\n for (record = this._mapHead; record !== null; record = record._next) {\n items.push(stringify(record));\n }\n for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {\n previous.push(stringify(record));\n }\n for (record = this._changesHead; record !== null; record = record._nextChanged) {\n changes.push(stringify(record));\n }\n for (record = this._additionsHead; record !== null; record = record._nextAdded) {\n additions.push(stringify(record));\n }\n for (record = this._removalsHead; record !== null; record = record._nextRemoved) {\n removals.push(stringify(record));\n }\n return 'map: ' + items.join(', ') + '\\n' +\n 'previous: ' + previous.join(', ') + '\\n' +\n 'additions: ' + additions.join(', ') + '\\n' +\n 'changes: ' + changes.join(', ') + '\\n' +\n 'removals: ' + removals.join(', ') + '\\n';\n };\n /**\n * @param {?} obj\n * @param {?} fn\n * @return {?}\n */\n DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {\n if (obj instanceof Map) {\n obj.forEach(fn);\n }\n else {\n Object.keys(obj).forEach(function (k) { return fn(obj[k], k); });\n }\n };\n return DefaultKeyValueDiffer;\n }());\n /**\n * @stable\n */\n var KeyValueChangeRecord = (function () {\n /**\n * @param {?} key\n */\n function KeyValueChangeRecord(key) {\n this.key = key;\n this.previousValue = null;\n this.currentValue = null;\n /** @internal */\n this._nextPrevious = null;\n /** @internal */\n this._next = null;\n /** @internal */\n this._nextAdded = null;\n /** @internal */\n this._nextRemoved = null;\n /** @internal */\n this._prevRemoved = null;\n /** @internal */\n this._nextChanged = null;\n }\n /**\n * @return {?}\n */\n KeyValueChangeRecord.prototype.toString = function () {\n return looseIdentical(this.previousValue, this.currentValue) ?\n stringify(this.key) :\n (stringify(this.key) + '[' + stringify(this.previousValue) + '->' +\n stringify(this.currentValue) + ']');\n };\n return KeyValueChangeRecord;\n }());\n\n /**\n * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.\n */\n var IterableDiffers = (function () {\n /**\n * @param {?} factories\n */\n function IterableDiffers(factories) {\n this.factories = factories;\n }\n /**\n * @param {?} factories\n * @param {?=} parent\n * @return {?}\n */\n IterableDiffers.create = function (factories, parent) {\n if (isPresent(parent)) {\n var /** @type {?} */ copied = parent.factories.slice();\n factories = factories.concat(copied);\n return new IterableDiffers(factories);\n }\n else {\n return new IterableDiffers(factories);\n }\n };\n /**\n * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the\n * inherited {@link IterableDiffers} instance with the provided factories and return a new\n * {@link IterableDiffers} instance.\n * *\n * The following example shows how to extend an existing list of factories,\n * which will only be applied to the injector for this component and its children.\n * This step is all that's required to make a new {@link IterableDiffer} available.\n * *\n * ### Example\n * *\n * ```\n * viewProviders: [\n * IterableDiffers.extend([new ImmutableListDiffer()])\n * ]\n * })\n * ```\n * @param {?} factories\n * @return {?}\n */\n IterableDiffers.extend = function (factories) {\n return {\n provide: IterableDiffers,\n useFactory: function (parent) {\n if (!parent) {\n // Typically would occur when calling IterableDiffers.extend inside of dependencies passed\n // to\n // bootstrap(), which would override default pipes instead of extending them.\n throw new Error('Cannot extend IterableDiffers without a parent injector');\n }\n return IterableDiffers.create(factories, parent);\n },\n // Dependency technically isn't optional, but we can provide a better error message this way.\n deps: [[IterableDiffers, new SkipSelf(), new Optional()]]\n };\n };\n /**\n * @param {?} iterable\n * @return {?}\n */\n IterableDiffers.prototype.find = function (iterable) {\n var /** @type {?} */ factory = this.factories.find(function (f) { return f.supports(iterable); });\n if (isPresent(factory)) {\n return factory;\n }\n else {\n throw new Error(\"Cannot find a differ supporting object '\" + iterable + \"' of type '\" + getTypeNameForDebugging(iterable) + \"'\");\n }\n };\n return IterableDiffers;\n }());\n\n /**\n * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.\n */\n var KeyValueDiffers = (function () {\n /**\n * @param {?} factories\n */\n function KeyValueDiffers(factories) {\n this.factories = factories;\n }\n /**\n * @param {?} factories\n * @param {?=} parent\n * @return {?}\n */\n KeyValueDiffers.create = function (factories, parent) {\n if (isPresent(parent)) {\n var /** @type {?} */ copied = parent.factories.slice();\n factories = factories.concat(copied);\n return new KeyValueDiffers(factories);\n }\n else {\n return new KeyValueDiffers(factories);\n }\n };\n /**\n * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the\n * inherited {@link KeyValueDiffers} instance with the provided factories and return a new\n * {@link KeyValueDiffers} instance.\n * *\n * The following example shows how to extend an existing list of factories,\n * which will only be applied to the injector for this component and its children.\n * This step is all that's required to make a new {@link KeyValueDiffer} available.\n * *\n * ### Example\n * *\n * ```\n * viewProviders: [\n * KeyValueDiffers.extend([new ImmutableMapDiffer()])\n * ]\n * })\n * ```\n * @param {?} factories\n * @return {?}\n */\n KeyValueDiffers.extend = function (factories) {\n return {\n provide: KeyValueDiffers,\n useFactory: function (parent) {\n if (!parent) {\n // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed\n // to\n // bootstrap(), which would override default pipes instead of extending them.\n throw new Error('Cannot extend KeyValueDiffers without a parent injector');\n }\n return KeyValueDiffers.create(factories, parent);\n },\n // Dependency technically isn't optional, but we can provide a better error message this way.\n deps: [[KeyValueDiffers, new SkipSelf(), new Optional()]]\n };\n };\n /**\n * @param {?} kv\n * @return {?}\n */\n KeyValueDiffers.prototype.find = function (kv) {\n var /** @type {?} */ factory = this.factories.find(function (f) { return f.supports(kv); });\n if (isPresent(factory)) {\n return factory;\n }\n else {\n throw new Error(\"Cannot find a differ supporting object '\" + kv + \"'\");\n }\n };\n return KeyValueDiffers;\n }());\n\n var /** @type {?} */ UNINITIALIZED = {\n toString: function () { return 'CD_INIT_VALUE'; }\n };\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function devModeEqual(a, b) {\n if (isListLikeIterable(a) && isListLikeIterable(b)) {\n return areIterablesEqual(a, b, devModeEqual);\n }\n else if (!isListLikeIterable(a) && !isPrimitive(a) && !isListLikeIterable(b) && !isPrimitive(b)) {\n return true;\n }\n else {\n return looseIdentical(a, b);\n }\n }\n /**\n * Indicates that the result of a {@link Pipe} transformation has changed even though the\n * reference\n * has not changed.\n * *\n * The wrapped value will be unwrapped by change detection, and the unwrapped value will be stored.\n * *\n * Example:\n * *\n * ```\n * if (this._latestValue === this._latestReturnedValue) {\n * return this._latestReturnedValue;\n * } else {\n * this._latestReturnedValue = this._latestValue;\n * return WrappedValue.wrap(this._latestValue); // this will force update\n * }\n * ```\n */\n var WrappedValue = (function () {\n /**\n * @param {?} wrapped\n */\n function WrappedValue(wrapped) {\n this.wrapped = wrapped;\n }\n /**\n * @param {?} value\n * @return {?}\n */\n WrappedValue.wrap = function (value) { return new WrappedValue(value); };\n return WrappedValue;\n }());\n /**\n * Helper class for unwrapping WrappedValue s\n */\n var ValueUnwrapper = (function () {\n function ValueUnwrapper() {\n this.hasWrappedValue = false;\n }\n /**\n * @param {?} value\n * @return {?}\n */\n ValueUnwrapper.prototype.unwrap = function (value) {\n if (value instanceof WrappedValue) {\n this.hasWrappedValue = true;\n return value.wrapped;\n }\n return value;\n };\n /**\n * @return {?}\n */\n ValueUnwrapper.prototype.reset = function () { this.hasWrappedValue = false; };\n return ValueUnwrapper;\n }());\n /**\n * Represents a basic change from a previous to a new value.\n */\n var SimpleChange = (function () {\n /**\n * @param {?} previousValue\n * @param {?} currentValue\n */\n function SimpleChange(previousValue, currentValue) {\n this.previousValue = previousValue;\n this.currentValue = currentValue;\n }\n /**\n * Check whether the new value is the first value assigned.\n * @return {?}\n */\n SimpleChange.prototype.isFirstChange = function () { return this.previousValue === UNINITIALIZED; };\n return SimpleChange;\n }());\n\n /**\n * @abstract\n */\n var ChangeDetectorRef = (function () {\n function ChangeDetectorRef() {\n }\n /**\n * Marks all {@link ChangeDetectionStrategy#OnPush} ancestors as to be checked.\n * *\n * <!-- TODO: Add a link to a chapter on OnPush components -->\n * *\n * ### Example ([live demo](http://plnkr.co/edit/GC512b?p=preview))\n * *\n * ```typescript\n * selector: 'cmp',\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * template: `Number of ticks: {{numberOfTicks}}`\n * })\n * class Cmp {\n * numberOfTicks = 0;\n * *\n * constructor(ref: ChangeDetectorRef) {\n * setInterval(() => {\n * this.numberOfTicks ++\n * // the following is required, otherwise the view will not be updated\n * this.ref.markForCheck();\n * }, 1000);\n * }\n * }\n * *\n * selector: 'app',\n * changeDetection: ChangeDetectionStrategy.OnPush,\n * template: `\n * <cmp><cmp>\n * `,\n * })\n * class App {\n * }\n * ```\n * @abstract\n * @return {?}\n */\n ChangeDetectorRef.prototype.markForCheck = function () { };\n /**\n * Detaches the change detector from the change detector tree.\n * *\n * The detached change detector will not be checked until it is reattached.\n * *\n * This can also be used in combination with {@link ChangeDetectorRef#detectChanges} to implement\n * local change\n * detection checks.\n * *\n * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n * *\n * ### Example\n * *\n * The following example defines a component with a large list of readonly data.\n * Imagine the data changes constantly, many times per second. For performance reasons,\n * we want to check and update the list every five seconds. We can do that by detaching\n * the component's change detector and doing a local check every five seconds.\n * *\n * ```typescript\n * class DataProvider {\n * // in a real application the returned data will be different every time\n * get data() {\n * return [1,2,3,4,5];\n * }\n * }\n * *\n * selector: 'giant-list',\n * template: `\n * <li *ngFor=\"let d of dataProvider.data\">Data {{d}}</lig>\n * `,\n * })\n * class GiantList {\n * constructor(private ref: ChangeDetectorRef, private dataProvider:DataProvider) {\n * ref.detach();\n * setInterval(() => {\n * this.ref.detectChanges();\n * }, 5000);\n * }\n * }\n * *\n * selector: 'app',\n * providers: [DataProvider],\n * template: `\n * <giant-list><giant-list>\n * `,\n * })\n * class App {\n * }\n * ```\n * @abstract\n * @return {?}\n */\n ChangeDetectorRef.prototype.detach = function () { };\n /**\n * Checks the change detector and its children.\n * *\n * This can also be used in combination with {@link ChangeDetectorRef#detach} to implement local\n * change detection\n * checks.\n * *\n * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->\n * *\n * ### Example\n * *\n * The following example defines a component with a large list of readonly data.\n * Imagine, the data changes constantly, many times per second. For performance reasons,\n * we want to check and update the list every five seconds.\n * *\n * We can do that by detaching the component's change detector and doing a local change detection\n * check\n * every five seconds.\n * *\n * See {@link ChangeDetectorRef#detach} for more information.\n * @abstract\n * @return {?}\n */\n ChangeDetectorRef.prototype.detectChanges = function () { };\n /**\n * Checks the change detector and its children, and throws if any changes are detected.\n * *\n * This is used in development mode to verify that running change detection doesn't introduce\n * other changes.\n * @abstract\n * @return {?}\n */\n ChangeDetectorRef.prototype.checkNoChanges = function () { };\n /**\n * Reattach the change detector to the change detector tree.\n * *\n * This also marks OnPush ancestors as to be checked. This reattached change detector will be\n * checked during the next change detection run.\n * *\n * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->\n * *\n * ### Example ([live demo](http://plnkr.co/edit/aUhZha?p=preview))\n * *\n * The following example creates a component displaying `live` data. The component will detach\n * its change detector from the main change detector tree when the component's live property\n * is set to false.\n * *\n * ```typescript\n * class DataProvider {\n * data = 1;\n * *\n * constructor() {\n * setInterval(() => {\n * this.data = this.data * 2;\n * }, 500);\n * }\n * }\n * *\n * selector: 'live-data',\n * inputs: ['live'],\n * template: 'Data: {{dataProvider.data}}'\n * })\n * class LiveData {\n * constructor(private ref: ChangeDetectorRef, private dataProvider:DataProvider) {}\n * *\n * set live(value) {\n * if (value)\n * this.ref.reattach();\n * else\n * this.ref.detach();\n * }\n * }\n * *\n * selector: 'app',\n * providers: [DataProvider],\n * template: `\n * Live Update: <input type=\"checkbox\" [(ngModel)]=\"live\">\n * <live-data [live]=\"live\"><live-data>\n * `,\n * })\n * class App {\n * live = true;\n * }\n * ```\n * @abstract\n * @return {?}\n */\n ChangeDetectorRef.prototype.reattach = function () { };\n return ChangeDetectorRef;\n }());\n\n /**\n * Structural diffing for `Object`s and `Map`s.\n */\n var /** @type {?} */ keyValDiff = [new DefaultKeyValueDifferFactory()];\n /**\n * Structural diffing for `Iterable` types such as `Array`s.\n */\n var /** @type {?} */ iterableDiff = [new DefaultIterableDifferFactory()];\n var /** @type {?} */ defaultIterableDiffers = new IterableDiffers(iterableDiff);\n var /** @type {?} */ defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);\n\n /**\n * @experimental\n */\n // TODO (matsko): add typing for the animation function\n var RenderComponentType = (function () {\n /**\n * @param {?} id\n * @param {?} templateUrl\n * @param {?} slotCount\n * @param {?} encapsulation\n * @param {?} styles\n * @param {?} animations\n */\n function RenderComponentType(id, templateUrl, slotCount, encapsulation, styles, animations) {\n this.id = id;\n this.templateUrl = templateUrl;\n this.slotCount = slotCount;\n this.encapsulation = encapsulation;\n this.styles = styles;\n this.animations = animations;\n }\n return RenderComponentType;\n }());\n /**\n * @abstract\n */\n var RenderDebugInfo = (function () {\n function RenderDebugInfo() {\n }\n Object.defineProperty(RenderDebugInfo.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderDebugInfo.prototype, \"component\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderDebugInfo.prototype, \"providerTokens\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderDebugInfo.prototype, \"references\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderDebugInfo.prototype, \"context\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RenderDebugInfo.prototype, \"source\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n return RenderDebugInfo;\n }());\n /**\n * @abstract\n */\n var Renderer = (function () {\n function Renderer() {\n }\n /**\n * @abstract\n * @param {?} selectorOrNode\n * @param {?=} debugInfo\n * @return {?}\n */\n Renderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) { };\n /**\n * @abstract\n * @param {?} parentElement\n * @param {?} name\n * @param {?=} debugInfo\n * @return {?}\n */\n Renderer.prototype.createElement = function (parentElement, name, debugInfo) { };\n /**\n * @abstract\n * @param {?} hostElement\n * @return {?}\n */\n Renderer.prototype.createViewRoot = function (hostElement) { };\n /**\n * @abstract\n * @param {?} parentElement\n * @param {?=} debugInfo\n * @return {?}\n */\n Renderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) { };\n /**\n * @abstract\n * @param {?} parentElement\n * @param {?} value\n * @param {?=} debugInfo\n * @return {?}\n */\n Renderer.prototype.createText = function (parentElement, value, debugInfo) { };\n /**\n * @abstract\n * @param {?} parentElement\n * @param {?} nodes\n * @return {?}\n */\n Renderer.prototype.projectNodes = function (parentElement, nodes) { };\n /**\n * @abstract\n * @param {?} node\n * @param {?} viewRootNodes\n * @return {?}\n */\n Renderer.prototype.attachViewAfter = function (node, viewRootNodes) { };\n /**\n * @abstract\n * @param {?} viewRootNodes\n * @return {?}\n */\n Renderer.prototype.detachView = function (viewRootNodes) { };\n /**\n * @abstract\n * @param {?} hostElement\n * @param {?} viewAllNodes\n * @return {?}\n */\n Renderer.prototype.destroyView = function (hostElement, viewAllNodes) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n Renderer.prototype.listen = function (renderElement, name, callback) { };\n /**\n * @abstract\n * @param {?} target\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n Renderer.prototype.listenGlobal = function (target, name, callback) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n Renderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} attributeName\n * @param {?} attributeValue\n * @return {?}\n */\n Renderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) { };\n /**\n * Used only in debug mode to serialize property changes to dom nodes as attributes.\n * @abstract\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n Renderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} className\n * @param {?} isAdd\n * @return {?}\n */\n Renderer.prototype.setElementClass = function (renderElement, className, isAdd) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} styleName\n * @param {?} styleValue\n * @return {?}\n */\n Renderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) { };\n /**\n * @abstract\n * @param {?} renderElement\n * @param {?} methodName\n * @param {?=} args\n * @return {?}\n */\n Renderer.prototype.invokeElementMethod = function (renderElement, methodName, args) { };\n /**\n * @abstract\n * @param {?} renderNode\n * @param {?} text\n * @return {?}\n */\n Renderer.prototype.setText = function (renderNode, text) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n Renderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) { };\n return Renderer;\n }());\n /**\n * Injectable service that provides a low-level interface for modifying the UI.\n * *\n * Use this service to bypass Angular's templating and make custom UI changes that can't be\n * expressed declaratively. For example if you need to set a property or an attribute whose name is\n * not statically known, use {@link #setElementProperty} or {@link #setElementAttribute}\n * respectively.\n * *\n * If you are implementing a custom renderer, you must implement this interface.\n * *\n * The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.\n * @abstract\n */\n var RootRenderer = (function () {\n function RootRenderer() {\n }\n /**\n * @abstract\n * @param {?} componentType\n * @return {?}\n */\n RootRenderer.prototype.renderComponent = function (componentType) { };\n return RootRenderer;\n }());\n\n var SecurityContext = {};\n SecurityContext.NONE = 0;\n SecurityContext.HTML = 1;\n SecurityContext.STYLE = 2;\n SecurityContext.SCRIPT = 3;\n SecurityContext.URL = 4;\n SecurityContext.RESOURCE_URL = 5;\n SecurityContext[SecurityContext.NONE] = \"NONE\";\n SecurityContext[SecurityContext.HTML] = \"HTML\";\n SecurityContext[SecurityContext.STYLE] = \"STYLE\";\n SecurityContext[SecurityContext.SCRIPT] = \"SCRIPT\";\n SecurityContext[SecurityContext.URL] = \"URL\";\n SecurityContext[SecurityContext.RESOURCE_URL] = \"RESOURCE_URL\";\n /**\n * Sanitizer is used by the views to sanitize potentially dangerous values.\n * *\n * @abstract\n */\n var Sanitizer = (function () {\n function Sanitizer() {\n }\n /**\n * @abstract\n * @param {?} context\n * @param {?} value\n * @return {?}\n */\n Sanitizer.prototype.sanitize = function (context, value) { };\n return Sanitizer;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$7 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * An error thrown if application changes model breaking the top-down data flow.\n * *\n * This exception is only thrown in dev mode.\n * *\n * <!-- TODO: Add a link once the dev mode option is configurable -->\n * *\n * ### Example\n * *\n * ```typescript\n * selector: 'parent',\n * template: '<child [prop]=\"parentProp\"></child>',\n * })\n * class Parent {\n * parentProp = 'init';\n * }\n * *\n * class Child {\n * constructor(public parent: Parent) {}\n * *\n * set prop(v) {\n * // this updates the parent property, which is disallowed during change detection\n * // this will result in ExpressionChangedAfterItHasBeenCheckedError\n * this.parent.parentProp = 'updated';\n * }\n * }\n * ```\n */\n var ExpressionChangedAfterItHasBeenCheckedError = (function (_super) {\n __extends$7(ExpressionChangedAfterItHasBeenCheckedError, _super);\n /**\n * @param {?} oldValue\n * @param {?} currValue\n */\n function ExpressionChangedAfterItHasBeenCheckedError(oldValue, currValue) {\n var msg = \"Expression has changed after it was checked. Previous value: '\" + oldValue + \"'. Current value: '\" + currValue + \"'.\";\n if (oldValue === UNINITIALIZED) {\n msg +=\n \" It seems like the view has been created after its parent and its children have been dirty checked.\" +\n \" Has it been created in a change detection hook ?\";\n }\n _super.call(this, msg);\n }\n return ExpressionChangedAfterItHasBeenCheckedError;\n }(BaseError));\n /**\n * Thrown when an exception was raised during view creation, change detection or destruction.\n * *\n * This error wraps the original exception to attach additional contextual information that can\n * be useful for debugging.\n */\n var ViewWrappedError = (function (_super) {\n __extends$7(ViewWrappedError, _super);\n /**\n * @param {?} originalError\n * @param {?} context\n */\n function ViewWrappedError(originalError, context) {\n _super.call(this, \"Error in \" + context.source, originalError);\n this.context = context;\n }\n return ViewWrappedError;\n }(WrappedError));\n /**\n * Thrown when a destroyed view is used.\n * *\n * This error indicates a bug in the framework.\n * *\n * This is an internal Angular error.\n */\n var ViewDestroyedError = (function (_super) {\n __extends$7(ViewDestroyedError, _super);\n /**\n * @param {?} details\n */\n function ViewDestroyedError(details) {\n _super.call(this, \"Attempt to use a destroyed view: \" + details);\n }\n return ViewDestroyedError;\n }(BaseError));\n\n var ViewUtils = (function () {\n /**\n * @param {?} _renderer\n * @param {?} sanitizer\n * @param {?} animationQueue\n */\n function ViewUtils(_renderer, sanitizer, animationQueue) {\n this._renderer = _renderer;\n this.animationQueue = animationQueue;\n this._nextCompTypeId = 0;\n this.sanitizer = sanitizer;\n }\n /**\n * @param {?} renderComponentType\n * @return {?}\n */\n ViewUtils.prototype.renderComponent = function (renderComponentType) {\n return this._renderer.renderComponent(renderComponentType);\n };\n ViewUtils.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n ViewUtils.ctorParameters = function () { return [\n { type: RootRenderer, },\n { type: Sanitizer, },\n { type: AnimationQueue, },\n ]; };\n return ViewUtils;\n }());\n var /** @type {?} */ nextRenderComponentTypeId = 0;\n /**\n * @param {?} templateUrl\n * @param {?} slotCount\n * @param {?} encapsulation\n * @param {?} styles\n * @param {?} animations\n * @return {?}\n */\n function createRenderComponentType(templateUrl, slotCount, encapsulation, styles, animations) {\n return new RenderComponentType(\"\" + nextRenderComponentTypeId++, templateUrl, slotCount, encapsulation, styles, animations);\n }\n /**\n * @param {?} e\n * @param {?} array\n * @return {?}\n */\n function addToArray(e, array) {\n array.push(e);\n }\n /**\n * @param {?} valueCount\n * @param {?} constAndInterp\n * @return {?}\n */\n function interpolate(valueCount, constAndInterp) {\n var /** @type {?} */ result = '';\n for (var /** @type {?} */ i = 0; i < valueCount * 2; i = i + 2) {\n result = result + constAndInterp[i] + _toStringWithNull(constAndInterp[i + 1]);\n }\n return result + constAndInterp[valueCount * 2];\n }\n /**\n * @param {?} valueCount\n * @param {?} c0\n * @param {?} a1\n * @param {?} c1\n * @param {?=} a2\n * @param {?=} c2\n * @param {?=} a3\n * @param {?=} c3\n * @param {?=} a4\n * @param {?=} c4\n * @param {?=} a5\n * @param {?=} c5\n * @param {?=} a6\n * @param {?=} c6\n * @param {?=} a7\n * @param {?=} c7\n * @param {?=} a8\n * @param {?=} c8\n * @param {?=} a9\n * @param {?=} c9\n * @return {?}\n */\n function inlineInterpolate(valueCount, c0, a1, c1, a2, c2, a3, c3, a4, c4, a5, c5, a6, c6, a7, c7, a8, c8, a9, c9) {\n switch (valueCount) {\n case 1:\n return c0 + _toStringWithNull(a1) + c1;\n case 2:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2;\n case 3:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3;\n case 4:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4;\n case 5:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5;\n case 6:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) + c6;\n case 7:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n c6 + _toStringWithNull(a7) + c7;\n case 8:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n c6 + _toStringWithNull(a7) + c7 + _toStringWithNull(a8) + c8;\n case 9:\n return c0 + _toStringWithNull(a1) + c1 + _toStringWithNull(a2) + c2 + _toStringWithNull(a3) +\n c3 + _toStringWithNull(a4) + c4 + _toStringWithNull(a5) + c5 + _toStringWithNull(a6) +\n c6 + _toStringWithNull(a7) + c7 + _toStringWithNull(a8) + c8 + _toStringWithNull(a9) + c9;\n default:\n throw new Error(\"Does not support more than 9 expressions\");\n }\n }\n /**\n * @param {?} v\n * @return {?}\n */\n function _toStringWithNull(v) {\n return v != null ? v.toString() : '';\n }\n /**\n * @param {?} throwOnChange\n * @param {?} oldValue\n * @param {?} newValue\n * @return {?}\n */\n function checkBinding(throwOnChange, oldValue, newValue) {\n if (throwOnChange) {\n if (!devModeEqual(oldValue, newValue)) {\n throw new ExpressionChangedAfterItHasBeenCheckedError(oldValue, newValue);\n }\n return false;\n }\n else {\n return !looseIdentical(oldValue, newValue);\n }\n }\n /**\n * @param {?} input\n * @param {?} value\n * @return {?}\n */\n function castByValue(input, value) {\n return (input);\n }\n var /** @type {?} */ EMPTY_ARRAY = [];\n var /** @type {?} */ EMPTY_MAP = {};\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy1(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0 = UNINITIALIZED;\n return function (p0) {\n if (!looseIdentical(v0, p0)) {\n v0 = p0;\n result = fn(p0);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy2(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0 = UNINITIALIZED;\n var /** @type {?} */ v1 = UNINITIALIZED;\n return function (p0, p1) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1)) {\n v0 = p0;\n v1 = p1;\n result = fn(p0, p1);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy3(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0 = UNINITIALIZED;\n var /** @type {?} */ v1 = UNINITIALIZED;\n var /** @type {?} */ v2 = UNINITIALIZED;\n return function (p0, p1, p2) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n result = fn(p0, p1, p2);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy4(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3;\n v0 = v1 = v2 = v3 = UNINITIALIZED;\n return function (p0, p1, p2, p3) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n result = fn(p0, p1, p2, p3);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy5(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4;\n v0 = v1 = v2 = v3 = v4 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n result = fn(p0, p1, p2, p3, p4);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy6(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5;\n v0 = v1 = v2 = v3 = v4 = v5 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4, p5) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n v5 = p5;\n result = fn(p0, p1, p2, p3, p4, p5);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy7(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6;\n v0 = v1 = v2 = v3 = v4 = v5 = v6 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4, p5, p6) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n !looseIdentical(v6, p6)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n v5 = p5;\n v6 = p6;\n result = fn(p0, p1, p2, p3, p4, p5, p6);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy8(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7;\n v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4, p5, p6, p7) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n !looseIdentical(v6, p6) || !looseIdentical(v7, p7)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n v5 = p5;\n v6 = p6;\n v7 = p7;\n result = fn(p0, p1, p2, p3, p4, p5, p6, p7);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy9(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7, /** @type {?} */ v8;\n v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4, p5, p6, p7, p8) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n !looseIdentical(v6, p6) || !looseIdentical(v7, p7) || !looseIdentical(v8, p8)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n v5 = p5;\n v6 = p6;\n v7 = p7;\n v8 = p8;\n result = fn(p0, p1, p2, p3, p4, p5, p6, p7, p8);\n }\n return result;\n };\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n function pureProxy10(fn) {\n var /** @type {?} */ result;\n var /** @type {?} */ v0, /** @type {?} */ v1, /** @type {?} */ v2, /** @type {?} */ v3, /** @type {?} */ v4, /** @type {?} */ v5, /** @type {?} */ v6, /** @type {?} */ v7, /** @type {?} */ v8, /** @type {?} */ v9;\n v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = UNINITIALIZED;\n return function (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) {\n if (!looseIdentical(v0, p0) || !looseIdentical(v1, p1) || !looseIdentical(v2, p2) ||\n !looseIdentical(v3, p3) || !looseIdentical(v4, p4) || !looseIdentical(v5, p5) ||\n !looseIdentical(v6, p6) || !looseIdentical(v7, p7) || !looseIdentical(v8, p8) ||\n !looseIdentical(v9, p9)) {\n v0 = p0;\n v1 = p1;\n v2 = p2;\n v3 = p3;\n v4 = p4;\n v5 = p5;\n v6 = p6;\n v7 = p7;\n v8 = p8;\n v9 = p9;\n result = fn(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);\n }\n return result;\n };\n }\n /**\n * @param {?} renderer\n * @param {?} el\n * @param {?} changes\n * @return {?}\n */\n function setBindingDebugInfoForChanges(renderer, el, changes) {\n Object.keys(changes).forEach(function (propName) {\n setBindingDebugInfo(renderer, el, propName, changes[propName].currentValue);\n });\n }\n /**\n * @param {?} renderer\n * @param {?} el\n * @param {?} propName\n * @param {?} value\n * @return {?}\n */\n function setBindingDebugInfo(renderer, el, propName, value) {\n try {\n renderer.setBindingDebugInfo(el, \"ng-reflect-\" + camelCaseToDashCase(propName), value ? value.toString() : null);\n }\n catch (e) {\n renderer.setBindingDebugInfo(el, \"ng-reflect-\" + camelCaseToDashCase(propName), '[ERROR] Exception while trying to serialize the value');\n }\n }\n var /** @type {?} */ CAMEL_CASE_REGEXP = /([A-Z])/g;\n /**\n * @param {?} input\n * @return {?}\n */\n function camelCaseToDashCase(input) {\n return input.replace(CAMEL_CASE_REGEXP, function () {\n var m = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n m[_i - 0] = arguments[_i];\n }\n return '-' + m[1].toLowerCase();\n });\n }\n /**\n * @param {?} renderer\n * @param {?} parentElement\n * @param {?} name\n * @param {?} attrs\n * @param {?=} debugInfo\n * @return {?}\n */\n function createRenderElement(renderer, parentElement, name, attrs, debugInfo) {\n var /** @type {?} */ el = renderer.createElement(parentElement, name, debugInfo);\n for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n renderer.setElementAttribute(el, attrs.get(i), attrs.get(i + 1));\n }\n return el;\n }\n /**\n * @param {?} renderer\n * @param {?} elementName\n * @param {?} attrs\n * @param {?} rootSelectorOrNode\n * @param {?=} debugInfo\n * @return {?}\n */\n function selectOrCreateRenderHostElement(renderer, elementName, attrs, rootSelectorOrNode, debugInfo) {\n var /** @type {?} */ hostElement;\n if (isPresent(rootSelectorOrNode)) {\n hostElement = renderer.selectRootElement(rootSelectorOrNode, debugInfo);\n for (var /** @type {?} */ i = 0; i < attrs.length; i += 2) {\n renderer.setElementAttribute(hostElement, attrs.get(i), attrs.get(i + 1));\n }\n renderer.setElementAttribute(hostElement, 'ng-version', VERSION.full);\n }\n else {\n hostElement = createRenderElement(renderer, null, elementName, attrs, debugInfo);\n }\n return hostElement;\n }\n /**\n * @param {?} view\n * @param {?} element\n * @param {?} eventNamesAndTargets\n * @param {?} listener\n * @return {?}\n */\n function subscribeToRenderElement(view, element, eventNamesAndTargets, listener) {\n var /** @type {?} */ disposables = createEmptyInlineArray(eventNamesAndTargets.length / 2);\n for (var /** @type {?} */ i = 0; i < eventNamesAndTargets.length; i += 2) {\n var /** @type {?} */ eventName = eventNamesAndTargets.get(i);\n var /** @type {?} */ eventTarget = eventNamesAndTargets.get(i + 1);\n var /** @type {?} */ disposable = void 0;\n if (eventTarget) {\n disposable = view.renderer.listenGlobal(eventTarget, eventName, listener.bind(view, eventTarget + \":\" + eventName));\n }\n else {\n disposable = view.renderer.listen(element, eventName, listener.bind(view, eventName));\n }\n disposables.set(i / 2, disposable);\n }\n return disposeInlineArray.bind(null, disposables);\n }\n /**\n * @param {?} disposables\n * @return {?}\n */\n function disposeInlineArray(disposables) {\n for (var /** @type {?} */ i = 0; i < disposables.length; i++) {\n disposables.get(i)();\n }\n }\n /**\n * @return {?}\n */\n function noop() { }\n /**\n * @param {?} length\n * @return {?}\n */\n function createEmptyInlineArray(length) {\n var /** @type {?} */ ctor;\n if (length <= 2) {\n ctor = InlineArray2;\n }\n else if (length <= 4) {\n ctor = InlineArray4;\n }\n else if (length <= 8) {\n ctor = InlineArray8;\n }\n else if (length <= 16) {\n ctor = InlineArray16;\n }\n else {\n ctor = InlineArrayDynamic;\n }\n return new ctor(length);\n }\n var InlineArray0 = (function () {\n function InlineArray0() {\n this.length = 0;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArray0.prototype.get = function (index) { return undefined; };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArray0.prototype.set = function (index, value) { };\n return InlineArray0;\n }());\n var InlineArray2 = (function () {\n /**\n * @param {?} length\n * @param {?=} _v0\n * @param {?=} _v1\n */\n function InlineArray2(length, _v0, _v1) {\n this.length = length;\n this._v0 = _v0;\n this._v1 = _v1;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArray2.prototype.get = function (index) {\n switch (index) {\n case 0:\n return this._v0;\n case 1:\n return this._v1;\n default:\n return undefined;\n }\n };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArray2.prototype.set = function (index, value) {\n switch (index) {\n case 0:\n this._v0 = value;\n break;\n case 1:\n this._v1 = value;\n break;\n }\n };\n return InlineArray2;\n }());\n var InlineArray4 = (function () {\n /**\n * @param {?} length\n * @param {?=} _v0\n * @param {?=} _v1\n * @param {?=} _v2\n * @param {?=} _v3\n */\n function InlineArray4(length, _v0, _v1, _v2, _v3) {\n this.length = length;\n this._v0 = _v0;\n this._v1 = _v1;\n this._v2 = _v2;\n this._v3 = _v3;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArray4.prototype.get = function (index) {\n switch (index) {\n case 0:\n return this._v0;\n case 1:\n return this._v1;\n case 2:\n return this._v2;\n case 3:\n return this._v3;\n default:\n return undefined;\n }\n };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArray4.prototype.set = function (index, value) {\n switch (index) {\n case 0:\n this._v0 = value;\n break;\n case 1:\n this._v1 = value;\n break;\n case 2:\n this._v2 = value;\n break;\n case 3:\n this._v3 = value;\n break;\n }\n };\n return InlineArray4;\n }());\n var InlineArray8 = (function () {\n /**\n * @param {?} length\n * @param {?=} _v0\n * @param {?=} _v1\n * @param {?=} _v2\n * @param {?=} _v3\n * @param {?=} _v4\n * @param {?=} _v5\n * @param {?=} _v6\n * @param {?=} _v7\n */\n function InlineArray8(length, _v0, _v1, _v2, _v3, _v4, _v5, _v6, _v7) {\n this.length = length;\n this._v0 = _v0;\n this._v1 = _v1;\n this._v2 = _v2;\n this._v3 = _v3;\n this._v4 = _v4;\n this._v5 = _v5;\n this._v6 = _v6;\n this._v7 = _v7;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArray8.prototype.get = function (index) {\n switch (index) {\n case 0:\n return this._v0;\n case 1:\n return this._v1;\n case 2:\n return this._v2;\n case 3:\n return this._v3;\n case 4:\n return this._v4;\n case 5:\n return this._v5;\n case 6:\n return this._v6;\n case 7:\n return this._v7;\n default:\n return undefined;\n }\n };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArray8.prototype.set = function (index, value) {\n switch (index) {\n case 0:\n this._v0 = value;\n break;\n case 1:\n this._v1 = value;\n break;\n case 2:\n this._v2 = value;\n break;\n case 3:\n this._v3 = value;\n break;\n case 4:\n this._v4 = value;\n break;\n case 5:\n this._v5 = value;\n break;\n case 6:\n this._v6 = value;\n break;\n case 7:\n this._v7 = value;\n break;\n }\n };\n return InlineArray8;\n }());\n var InlineArray16 = (function () {\n /**\n * @param {?} length\n * @param {?=} _v0\n * @param {?=} _v1\n * @param {?=} _v2\n * @param {?=} _v3\n * @param {?=} _v4\n * @param {?=} _v5\n * @param {?=} _v6\n * @param {?=} _v7\n * @param {?=} _v8\n * @param {?=} _v9\n * @param {?=} _v10\n * @param {?=} _v11\n * @param {?=} _v12\n * @param {?=} _v13\n * @param {?=} _v14\n * @param {?=} _v15\n */\n function InlineArray16(length, _v0, _v1, _v2, _v3, _v4, _v5, _v6, _v7, _v8, _v9, _v10, _v11, _v12, _v13, _v14, _v15) {\n this.length = length;\n this._v0 = _v0;\n this._v1 = _v1;\n this._v2 = _v2;\n this._v3 = _v3;\n this._v4 = _v4;\n this._v5 = _v5;\n this._v6 = _v6;\n this._v7 = _v7;\n this._v8 = _v8;\n this._v9 = _v9;\n this._v10 = _v10;\n this._v11 = _v11;\n this._v12 = _v12;\n this._v13 = _v13;\n this._v14 = _v14;\n this._v15 = _v15;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArray16.prototype.get = function (index) {\n switch (index) {\n case 0:\n return this._v0;\n case 1:\n return this._v1;\n case 2:\n return this._v2;\n case 3:\n return this._v3;\n case 4:\n return this._v4;\n case 5:\n return this._v5;\n case 6:\n return this._v6;\n case 7:\n return this._v7;\n case 8:\n return this._v8;\n case 9:\n return this._v9;\n case 10:\n return this._v10;\n case 11:\n return this._v11;\n case 12:\n return this._v12;\n case 13:\n return this._v13;\n case 14:\n return this._v14;\n case 15:\n return this._v15;\n default:\n return undefined;\n }\n };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArray16.prototype.set = function (index, value) {\n switch (index) {\n case 0:\n this._v0 = value;\n break;\n case 1:\n this._v1 = value;\n break;\n case 2:\n this._v2 = value;\n break;\n case 3:\n this._v3 = value;\n break;\n case 4:\n this._v4 = value;\n break;\n case 5:\n this._v5 = value;\n break;\n case 6:\n this._v6 = value;\n break;\n case 7:\n this._v7 = value;\n break;\n case 8:\n this._v8 = value;\n break;\n case 9:\n this._v9 = value;\n break;\n case 10:\n this._v10 = value;\n break;\n case 11:\n this._v11 = value;\n break;\n case 12:\n this._v12 = value;\n break;\n case 13:\n this._v13 = value;\n break;\n case 14:\n this._v14 = value;\n break;\n case 15:\n this._v15 = value;\n break;\n }\n };\n return InlineArray16;\n }());\n var InlineArrayDynamic = (function () {\n /**\n * @param {?} length\n * @param {...?} values\n */\n function InlineArrayDynamic(length) {\n var values = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n values[_i - 1] = arguments[_i];\n }\n this.length = length;\n this._values = values;\n }\n /**\n * @param {?} index\n * @return {?}\n */\n InlineArrayDynamic.prototype.get = function (index) { return this._values[index]; };\n /**\n * @param {?} index\n * @param {?} value\n * @return {?}\n */\n InlineArrayDynamic.prototype.set = function (index, value) { this._values[index] = value; };\n return InlineArrayDynamic;\n }());\n var /** @type {?} */ EMPTY_INLINE_ARRAY = new InlineArray0();\n\n\n var view_utils = Object.freeze({\n ViewUtils: ViewUtils,\n createRenderComponentType: createRenderComponentType,\n addToArray: addToArray,\n interpolate: interpolate,\n inlineInterpolate: inlineInterpolate,\n checkBinding: checkBinding,\n castByValue: castByValue,\n EMPTY_ARRAY: EMPTY_ARRAY,\n EMPTY_MAP: EMPTY_MAP,\n pureProxy1: pureProxy1,\n pureProxy2: pureProxy2,\n pureProxy3: pureProxy3,\n pureProxy4: pureProxy4,\n pureProxy5: pureProxy5,\n pureProxy6: pureProxy6,\n pureProxy7: pureProxy7,\n pureProxy8: pureProxy8,\n pureProxy9: pureProxy9,\n pureProxy10: pureProxy10,\n setBindingDebugInfoForChanges: setBindingDebugInfoForChanges,\n setBindingDebugInfo: setBindingDebugInfo,\n createRenderElement: createRenderElement,\n selectOrCreateRenderHostElement: selectOrCreateRenderHostElement,\n subscribeToRenderElement: subscribeToRenderElement,\n noop: noop,\n InlineArray2: InlineArray2,\n InlineArray4: InlineArray4,\n InlineArray8: InlineArray8,\n InlineArray16: InlineArray16,\n InlineArrayDynamic: InlineArrayDynamic,\n EMPTY_INLINE_ARRAY: EMPTY_INLINE_ARRAY\n });\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$5 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Represents an instance of a Component created via a {@link ComponentFactory}.\n * *\n * `ComponentRef` provides access to the Component Instance as well other objects related to this\n * Component Instance and allows you to destroy the Component Instance via the {@link #destroy}\n * method.\n * @abstract\n */\n var ComponentRef = (function () {\n function ComponentRef() {\n }\n Object.defineProperty(ComponentRef.prototype, \"location\", {\n /**\n * Location of the Host Element of this Component Instance.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ComponentRef.prototype, \"injector\", {\n /**\n * The injector on which the component instance exists.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ComponentRef.prototype, \"instance\", {\n /**\n * The instance of the Component.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ComponentRef.prototype, \"hostView\", {\n /**\n * The {@link ViewRef} of the Host View of this Component instance.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ComponentRef.prototype, \"changeDetectorRef\", {\n /**\n * The {@link ChangeDetectorRef} of the Component instance.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ComponentRef.prototype, \"componentType\", {\n /**\n * The component type.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n /**\n * Destroys the component instance and all of the data structures associated with it.\n * @abstract\n * @return {?}\n */\n ComponentRef.prototype.destroy = function () { };\n /**\n * Allows to register a callback that will be called when the component is destroyed.\n * @abstract\n * @param {?} callback\n * @return {?}\n */\n ComponentRef.prototype.onDestroy = function (callback) { };\n return ComponentRef;\n }());\n var ComponentRef_ = (function (_super) {\n __extends$5(ComponentRef_, _super);\n /**\n * @param {?} _index\n * @param {?} _parentView\n * @param {?} _nativeElement\n * @param {?} _component\n */\n function ComponentRef_(_index, _parentView, _nativeElement, _component) {\n _super.call(this);\n this._index = _index;\n this._parentView = _parentView;\n this._nativeElement = _nativeElement;\n this._component = _component;\n }\n Object.defineProperty(ComponentRef_.prototype, \"location\", {\n /**\n * @return {?}\n */\n get: function () { return new ElementRef(this._nativeElement); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ComponentRef_.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._parentView.injector(this._index); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ComponentRef_.prototype, \"instance\", {\n /**\n * @return {?}\n */\n get: function () { return this._component; },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ComponentRef_.prototype, \"hostView\", {\n /**\n * @return {?}\n */\n get: function () { return this._parentView.ref; },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ComponentRef_.prototype, \"changeDetectorRef\", {\n /**\n * @return {?}\n */\n get: function () { return this._parentView.ref; },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ComponentRef_.prototype, \"componentType\", {\n /**\n * @return {?}\n */\n get: function () { return (this._component.constructor); },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n ComponentRef_.prototype.destroy = function () { this._parentView.detachAndDestroy(); };\n /**\n * @param {?} callback\n * @return {?}\n */\n ComponentRef_.prototype.onDestroy = function (callback) { this.hostView.onDestroy(callback); };\n return ComponentRef_;\n }(ComponentRef));\n /**\n * @stable\n */\n var ComponentFactory = (function () {\n /**\n * @param {?} selector\n * @param {?} _viewClass\n * @param {?} _componentType\n */\n function ComponentFactory(selector, _viewClass, _componentType) {\n this.selector = selector;\n this._viewClass = _viewClass;\n this._componentType = _componentType;\n }\n Object.defineProperty(ComponentFactory.prototype, \"componentType\", {\n /**\n * @return {?}\n */\n get: function () { return this._componentType; },\n enumerable: true,\n configurable: true\n });\n /**\n * Creates a new component.\n * @param {?} injector\n * @param {?=} projectableNodes\n * @param {?=} rootSelectorOrNode\n * @return {?}\n */\n ComponentFactory.prototype.create = function (injector, projectableNodes, rootSelectorOrNode) {\n if (projectableNodes === void 0) { projectableNodes = null; }\n if (rootSelectorOrNode === void 0) { rootSelectorOrNode = null; }\n var /** @type {?} */ vu = injector.get(ViewUtils);\n if (!projectableNodes) {\n projectableNodes = [];\n }\n var /** @type {?} */ hostView = new this._viewClass(vu, null, null, null);\n return hostView.createHostView(rootSelectorOrNode, injector, projectableNodes);\n };\n return ComponentFactory;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$8 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @stable\n */\n var NoComponentFactoryError = (function (_super) {\n __extends$8(NoComponentFactoryError, _super);\n /**\n * @param {?} component\n */\n function NoComponentFactoryError(component) {\n _super.call(this, \"No component factory found for \" + stringify(component) + \". Did you add it to @NgModule.entryComponents?\");\n this.component = component;\n }\n return NoComponentFactoryError;\n }(BaseError));\n var _NullComponentFactoryResolver = (function () {\n function _NullComponentFactoryResolver() {\n }\n /**\n * @param {?} component\n * @return {?}\n */\n _NullComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {\n throw new NoComponentFactoryError(component);\n };\n return _NullComponentFactoryResolver;\n }());\n /**\n * @abstract\n */\n var ComponentFactoryResolver = (function () {\n function ComponentFactoryResolver() {\n }\n /**\n * @abstract\n * @param {?} component\n * @return {?}\n */\n ComponentFactoryResolver.prototype.resolveComponentFactory = function (component) { };\n ComponentFactoryResolver.NULL = new _NullComponentFactoryResolver();\n return ComponentFactoryResolver;\n }());\n var CodegenComponentFactoryResolver = (function () {\n /**\n * @param {?} factories\n * @param {?} _parent\n */\n function CodegenComponentFactoryResolver(factories, _parent) {\n this._parent = _parent;\n this._factories = new Map();\n for (var i = 0; i < factories.length; i++) {\n var factory = factories[i];\n this._factories.set(factory.componentType, factory);\n }\n }\n /**\n * @param {?} component\n * @return {?}\n */\n CodegenComponentFactoryResolver.prototype.resolveComponentFactory = function (component) {\n var /** @type {?} */ result = this._factories.get(component);\n if (!result) {\n result = this._parent.resolveComponentFactory(component);\n }\n return result;\n };\n return CodegenComponentFactoryResolver;\n }());\n\n var /** @type {?} */ trace;\n var /** @type {?} */ events;\n /**\n * @return {?}\n */\n function detectWTF() {\n var /** @type {?} */ wtf = ((global$1) /** TODO #9100 */)['wtf'];\n if (wtf) {\n trace = wtf['trace'];\n if (trace) {\n events = trace['events'];\n return true;\n }\n }\n return false;\n }\n /**\n * @param {?} signature\n * @param {?=} flags\n * @return {?}\n */\n function createScope(signature, flags) {\n if (flags === void 0) { flags = null; }\n return events.createScope(signature, flags);\n }\n /**\n * @param {?} scope\n * @param {?=} returnValue\n * @return {?}\n */\n function leave(scope, returnValue) {\n trace.leaveScope(scope, returnValue);\n return returnValue;\n }\n /**\n * @param {?} rangeType\n * @param {?} action\n * @return {?}\n */\n function startTimeRange(rangeType, action) {\n return trace.beginTimeRange(rangeType, action);\n }\n /**\n * @param {?} range\n * @return {?}\n */\n function endTimeRange(range) {\n trace.endTimeRange(range);\n }\n\n /**\n * True if WTF is enabled.\n */\n var /** @type {?} */ wtfEnabled = detectWTF();\n /**\n * @param {?=} arg0\n * @param {?=} arg1\n * @return {?}\n */\n function noopScope(arg0, arg1) {\n return null;\n }\n /**\n * Create trace scope.\n *\n * Scopes must be strictly nested and are analogous to stack frames, but\n * do not have to follow the stack frames. Instead it is recommended that they follow logical\n * nesting. You may want to use\n * [Event\n * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)\n * as they are defined in WTF.\n *\n * Used to mark scope entry. The return value is used to leave the scope.\n *\n * var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');\n *\n * someMethod() {\n * var s = myScope('Foo'); // 'Foo' gets stored in tracing UI\n * // DO SOME WORK HERE\n * return wtfLeave(s, 123); // Return value 123\n * }\n *\n * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can\n * negatively impact the performance of your application. For this reason we recommend that\n * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and\n * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to\n * exception, will produce incorrect trace, but presence of exception signifies logic error which\n * needs to be fixed before the app should be profiled. Add try-finally only when you expect that\n * an exception is expected during normal execution while profiling.\n *\n * @experimental\n */\n var /** @type {?} */ wtfCreateScope = wtfEnabled ? createScope : function (signature, flags) { return noopScope; };\n /**\n * Used to mark end of Scope.\n *\n * - `scope` to end.\n * - `returnValue` (optional) to be passed to the WTF.\n *\n * Returns the `returnValue for easy chaining.\n * @experimental\n */\n var /** @type {?} */ wtfLeave = wtfEnabled ? leave : function (s, r) { return r; };\n /**\n * Used to mark Async start. Async are similar to scope but they don't have to be strictly nested.\n * The return value is used in the call to [endAsync]. Async ranges only work if WTF has been\n * enabled.\n *\n * someMethod() {\n * var s = wtfStartTimeRange('HTTP:GET', 'some.url');\n * var future = new Future.delay(5).then((_) {\n * wtfEndTimeRange(s);\n * });\n * }\n * @experimental\n */\n var /** @type {?} */ wtfStartTimeRange = wtfEnabled ? startTimeRange : function (rangeType, action) { return null; };\n /**\n * Ends a async time range operation.\n * [range] is the return value from [wtfStartTimeRange] Async ranges only work if WTF has been\n * enabled.\n * @experimental\n */\n var /** @type {?} */ wtfEndTimeRange = wtfEnabled ? endTimeRange : function (r) { return null; };\n\n /**\n * The Testability service provides testing hooks that can be accessed from\n * the browser and by services such as Protractor. Each bootstrapped Angular\n * application on the page will have an instance of Testability.\n */\n var Testability = (function () {\n /**\n * @param {?} _ngZone\n */\n function Testability(_ngZone) {\n this._ngZone = _ngZone;\n /** @internal */\n this._pendingCount = 0;\n /** @internal */\n this._isZoneStable = true;\n /**\n * Whether any work was done since the last 'whenStable' callback. This is\n * useful to detect if this could have potentially destabilized another\n * component while it is stabilizing.\n * @internal\n */\n this._didWork = false;\n /** @internal */\n this._callbacks = [];\n this._watchAngularEvents();\n }\n /**\n * @return {?}\n */\n Testability.prototype._watchAngularEvents = function () {\n var _this = this;\n this._ngZone.onUnstable.subscribe({\n next: function () {\n _this._didWork = true;\n _this._isZoneStable = false;\n }\n });\n this._ngZone.runOutsideAngular(function () {\n _this._ngZone.onStable.subscribe({\n next: function () {\n NgZone.assertNotInAngularZone();\n scheduleMicroTask(function () {\n _this._isZoneStable = true;\n _this._runCallbacksIfReady();\n });\n }\n });\n });\n };\n /**\n * @return {?}\n */\n Testability.prototype.increasePendingRequestCount = function () {\n this._pendingCount += 1;\n this._didWork = true;\n return this._pendingCount;\n };\n /**\n * @return {?}\n */\n Testability.prototype.decreasePendingRequestCount = function () {\n this._pendingCount -= 1;\n if (this._pendingCount < 0) {\n throw new Error('pending async requests below zero');\n }\n this._runCallbacksIfReady();\n return this._pendingCount;\n };\n /**\n * @return {?}\n */\n Testability.prototype.isStable = function () {\n return this._isZoneStable && this._pendingCount == 0 && !this._ngZone.hasPendingMacrotasks;\n };\n /**\n * @return {?}\n */\n Testability.prototype._runCallbacksIfReady = function () {\n var _this = this;\n if (this.isStable()) {\n // Schedules the call backs in a new frame so that it is always async.\n scheduleMicroTask(function () {\n while (_this._callbacks.length !== 0) {\n (_this._callbacks.pop())(_this._didWork);\n }\n _this._didWork = false;\n });\n }\n else {\n // Not Ready\n this._didWork = true;\n }\n };\n /**\n * @param {?} callback\n * @return {?}\n */\n Testability.prototype.whenStable = function (callback) {\n this._callbacks.push(callback);\n this._runCallbacksIfReady();\n };\n /**\n * @return {?}\n */\n Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };\n /**\n * @deprecated use findProviders\n * @param {?} using\n * @param {?} provider\n * @param {?} exactMatch\n * @return {?}\n */\n Testability.prototype.findBindings = function (using, provider, exactMatch) {\n // TODO(juliemr): implement.\n return [];\n };\n /**\n * @param {?} using\n * @param {?} provider\n * @param {?} exactMatch\n * @return {?}\n */\n Testability.prototype.findProviders = function (using, provider, exactMatch) {\n // TODO(juliemr): implement.\n return [];\n };\n Testability.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n Testability.ctorParameters = function () { return [\n { type: NgZone, },\n ]; };\n return Testability;\n }());\n /**\n * A global registry of {@link Testability} instances for specific elements.\n */\n var TestabilityRegistry = (function () {\n function TestabilityRegistry() {\n /** @internal */\n this._applications = new Map();\n _testabilityGetter.addToWindow(this);\n }\n /**\n * @param {?} token\n * @param {?} testability\n * @return {?}\n */\n TestabilityRegistry.prototype.registerApplication = function (token, testability) {\n this._applications.set(token, testability);\n };\n /**\n * @param {?} elem\n * @return {?}\n */\n TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem); };\n /**\n * @return {?}\n */\n TestabilityRegistry.prototype.getAllTestabilities = function () { return Array.from(this._applications.values()); };\n /**\n * @return {?}\n */\n TestabilityRegistry.prototype.getAllRootElements = function () { return Array.from(this._applications.keys()); };\n /**\n * @param {?} elem\n * @param {?=} findInAncestors\n * @return {?}\n */\n TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {\n if (findInAncestors === void 0) { findInAncestors = true; }\n return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);\n };\n TestabilityRegistry.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n TestabilityRegistry.ctorParameters = function () { return []; };\n return TestabilityRegistry;\n }());\n var _NoopGetTestability = (function () {\n function _NoopGetTestability() {\n }\n /**\n * @param {?} registry\n * @return {?}\n */\n _NoopGetTestability.prototype.addToWindow = function (registry) { };\n /**\n * @param {?} registry\n * @param {?} elem\n * @param {?} findInAncestors\n * @return {?}\n */\n _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {\n return null;\n };\n return _NoopGetTestability;\n }());\n /**\n * Set the {@link GetTestability} implementation used by the Angular testing framework.\n * @param {?} getter\n * @return {?}\n */\n function setTestabilityGetter(getter) {\n _testabilityGetter = getter;\n }\n var /** @type {?} */ _testabilityGetter = new _NoopGetTestability();\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$3 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ _devMode = true;\n var /** @type {?} */ _runModeLocked = false;\n var /** @type {?} */ _platform;\n /**\n * Disable Angular's development mode, which turns off assertions and other\n * checks within the framework.\n * *\n * One important assertion this disables verifies that a change detection pass\n * does not result in additional changes to any bindings (also known as\n * unidirectional data flow).\n * *\n * @return {?}\n */\n function enableProdMode() {\n if (_runModeLocked) {\n throw new Error('Cannot enable prod mode after platform setup.');\n }\n _devMode = false;\n }\n /**\n * Returns whether Angular is in development mode. After called once,\n * the value is locked and won't change any more.\n * *\n * By default, this is true, unless a user calls `enableProdMode` before calling this.\n * *\n * @return {?}\n */\n function isDevMode() {\n _runModeLocked = true;\n return _devMode;\n }\n /**\n * A token for third-party components that can register themselves with NgProbe.\n * *\n */\n var NgProbeToken = (function () {\n /**\n * @param {?} name\n * @param {?} token\n */\n function NgProbeToken(name, token) {\n this.name = name;\n this.token = token;\n }\n return NgProbeToken;\n }());\n /**\n * Creates a platform.\n * Platforms have to be eagerly created via this function.\n * *\n * @param {?} injector\n * @return {?}\n */\n function createPlatform(injector) {\n if (_platform && !_platform.destroyed) {\n throw new Error('There can be only one platform. Destroy the previous one to create a new one.');\n }\n _platform = injector.get(PlatformRef);\n var /** @type {?} */ inits = (injector.get(PLATFORM_INITIALIZER, null));\n if (inits)\n inits.forEach(function (init) { return init(); });\n return _platform;\n }\n /**\n * Creates a factory for a platform\n * *\n * @param {?} parentPlatformFactory\n * @param {?} name\n * @param {?=} providers\n * @return {?}\n */\n function createPlatformFactory(parentPlatformFactory, name, providers) {\n if (providers === void 0) { providers = []; }\n var /** @type {?} */ marker = new OpaqueToken(\"Platform: \" + name);\n return function (extraProviders) {\n if (extraProviders === void 0) { extraProviders = []; }\n if (!getPlatform()) {\n if (parentPlatformFactory) {\n parentPlatformFactory(providers.concat(extraProviders).concat({ provide: marker, useValue: true }));\n }\n else {\n createPlatform(ReflectiveInjector.resolveAndCreate(providers.concat(extraProviders).concat({ provide: marker, useValue: true })));\n }\n }\n return assertPlatform(marker);\n };\n }\n /**\n * Checks that there currently is a platform\n * which contains the given token as a provider.\n * *\n * @param {?} requiredToken\n * @return {?}\n */\n function assertPlatform(requiredToken) {\n var /** @type {?} */ platform = getPlatform();\n if (!platform) {\n throw new Error('No platform exists!');\n }\n if (!platform.injector.get(requiredToken, null)) {\n throw new Error('A platform with a different configuration has been created. Please destroy it first.');\n }\n return platform;\n }\n /**\n * Destroy the existing platform.\n * *\n * @return {?}\n */\n function destroyPlatform() {\n if (_platform && !_platform.destroyed) {\n _platform.destroy();\n }\n }\n /**\n * Returns the current platform.\n * *\n * @return {?}\n */\n function getPlatform() {\n return _platform && !_platform.destroyed ? _platform : null;\n }\n /**\n * The Angular platform is the entry point for Angular on a web page. Each page\n * has exactly one platform, and services (such as reflection) which are common\n * to every Angular application running on the page are bound in its scope.\n * *\n * A page's platform is initialized implicitly when {@link bootstrap}() is called, or\n * explicitly by calling {@link createPlatform}().\n * *\n * @abstract\n */\n var PlatformRef = (function () {\n function PlatformRef() {\n }\n /**\n * Creates an instance of an `@NgModule` for the given platform\n * for offline compilation.\n * *\n * ## Simple Example\n * *\n * ```typescript\n * my_module.ts:\n * *\n * imports: [BrowserModule]\n * })\n * class MyModule {}\n * *\n * main.ts:\n * import {MyModuleNgFactory} from './my_module.ngfactory';\n * import {platformBrowser} from '@angular/platform-browser';\n * *\n * let moduleRef = platformBrowser().bootstrapModuleFactory(MyModuleNgFactory);\n * ```\n * *\n * @param {?} moduleFactory\n * @return {?}\n */\n PlatformRef.prototype.bootstrapModuleFactory = function (moduleFactory) {\n throw unimplemented();\n };\n /**\n * Creates an instance of an `@NgModule` for a given platform using the given runtime compiler.\n * *\n * ## Simple Example\n * *\n * ```typescript\n * imports: [BrowserModule]\n * })\n * class MyModule {}\n * *\n * let moduleRef = platformBrowser().bootstrapModule(MyModule);\n * ```\n * @param {?} moduleType\n * @param {?=} compilerOptions\n * @return {?}\n */\n PlatformRef.prototype.bootstrapModule = function (moduleType, compilerOptions) {\n if (compilerOptions === void 0) { compilerOptions = []; }\n throw unimplemented();\n };\n /**\n * Register a listener to be called when the platform is disposed.\n * @abstract\n * @param {?} callback\n * @return {?}\n */\n PlatformRef.prototype.onDestroy = function (callback) { };\n Object.defineProperty(PlatformRef.prototype, \"injector\", {\n /**\n * Retrieve the platform {@link Injector}, which is the parent injector for\n * every Angular application on the page and provides singleton providers.\n * @return {?}\n */\n get: function () { throw unimplemented(); },\n enumerable: true,\n configurable: true\n });\n ;\n /**\n * Destroy the Angular platform and all Angular applications on the page.\n * @abstract\n * @return {?}\n */\n PlatformRef.prototype.destroy = function () { };\n Object.defineProperty(PlatformRef.prototype, \"destroyed\", {\n /**\n * @return {?}\n */\n get: function () { throw unimplemented(); },\n enumerable: true,\n configurable: true\n });\n return PlatformRef;\n }());\n /**\n * @param {?} errorHandler\n * @param {?} callback\n * @return {?}\n */\n function _callAndReportToErrorHandler(errorHandler, callback) {\n try {\n var /** @type {?} */ result = callback();\n if (isPromise(result)) {\n return result.catch(function (e) {\n errorHandler.handleError(e);\n // rethrow as the exception handler might not do it\n throw e;\n });\n }\n return result;\n }\n catch (e) {\n errorHandler.handleError(e);\n // rethrow as the exception handler might not do it\n throw e;\n }\n }\n var PlatformRef_ = (function (_super) {\n __extends$3(PlatformRef_, _super);\n /**\n * @param {?} _injector\n */\n function PlatformRef_(_injector) {\n _super.call(this);\n this._injector = _injector;\n this._modules = [];\n this._destroyListeners = [];\n this._destroyed = false;\n }\n /**\n * @param {?} callback\n * @return {?}\n */\n PlatformRef_.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };\n Object.defineProperty(PlatformRef_.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._injector; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(PlatformRef_.prototype, \"destroyed\", {\n /**\n * @return {?}\n */\n get: function () { return this._destroyed; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n PlatformRef_.prototype.destroy = function () {\n if (this._destroyed) {\n throw new Error('The platform has already been destroyed!');\n }\n this._modules.slice().forEach(function (module) { return module.destroy(); });\n this._destroyListeners.forEach(function (listener) { return listener(); });\n this._destroyed = true;\n };\n /**\n * @param {?} moduleFactory\n * @return {?}\n */\n PlatformRef_.prototype.bootstrapModuleFactory = function (moduleFactory) {\n return this._bootstrapModuleFactoryWithZone(moduleFactory, null);\n };\n /**\n * @param {?} moduleFactory\n * @param {?} ngZone\n * @return {?}\n */\n PlatformRef_.prototype._bootstrapModuleFactoryWithZone = function (moduleFactory, ngZone) {\n var _this = this;\n // Note: We need to create the NgZone _before_ we instantiate the module,\n // as instantiating the module creates some providers eagerly.\n // So we create a mini parent injector that just contains the new NgZone and\n // pass that as parent to the NgModuleFactory.\n if (!ngZone)\n ngZone = new NgZone({ enableLongStackTrace: isDevMode() });\n // Attention: Don't use ApplicationRef.run here,\n // as we want to be sure that all possible constructor calls are inside `ngZone.run`!\n return ngZone.run(function () {\n var /** @type {?} */ ngZoneInjector = ReflectiveInjector.resolveAndCreate([{ provide: NgZone, useValue: ngZone }], _this.injector);\n var /** @type {?} */ moduleRef = (moduleFactory.create(ngZoneInjector));\n var /** @type {?} */ exceptionHandler = moduleRef.injector.get(ErrorHandler, null);\n if (!exceptionHandler) {\n throw new Error('No ErrorHandler. Is platform module (BrowserModule) included?');\n }\n moduleRef.onDestroy(function () { return ListWrapper.remove(_this._modules, moduleRef); });\n ngZone.onError.subscribe({ next: function (error) { exceptionHandler.handleError(error); } });\n return _callAndReportToErrorHandler(exceptionHandler, function () {\n var /** @type {?} */ initStatus = moduleRef.injector.get(ApplicationInitStatus);\n return initStatus.donePromise.then(function () {\n _this._moduleDoBootstrap(moduleRef);\n return moduleRef;\n });\n });\n });\n };\n /**\n * @param {?} moduleType\n * @param {?=} compilerOptions\n * @return {?}\n */\n PlatformRef_.prototype.bootstrapModule = function (moduleType, compilerOptions) {\n if (compilerOptions === void 0) { compilerOptions = []; }\n return this._bootstrapModuleWithZone(moduleType, compilerOptions, null);\n };\n /**\n * @param {?} moduleType\n * @param {?=} compilerOptions\n * @param {?} ngZone\n * @param {?=} componentFactoryCallback\n * @return {?}\n */\n PlatformRef_.prototype._bootstrapModuleWithZone = function (moduleType, compilerOptions, ngZone, componentFactoryCallback) {\n var _this = this;\n if (compilerOptions === void 0) { compilerOptions = []; }\n var /** @type {?} */ compilerFactory = this.injector.get(CompilerFactory);\n var /** @type {?} */ compiler = compilerFactory.createCompiler(Array.isArray(compilerOptions) ? compilerOptions : [compilerOptions]);\n // ugly internal api hack: generate host component factories for all declared components and\n // pass the factories into the callback - this is used by UpdateAdapter to get hold of all\n // factories.\n if (componentFactoryCallback) {\n return compiler.compileModuleAndAllComponentsAsync(moduleType)\n .then(function (_a) {\n var ngModuleFactory = _a.ngModuleFactory, componentFactories = _a.componentFactories;\n componentFactoryCallback(componentFactories);\n return _this._bootstrapModuleFactoryWithZone(ngModuleFactory, ngZone);\n });\n }\n return compiler.compileModuleAsync(moduleType)\n .then(function (moduleFactory) { return _this._bootstrapModuleFactoryWithZone(moduleFactory, ngZone); });\n };\n /**\n * @param {?} moduleRef\n * @return {?}\n */\n PlatformRef_.prototype._moduleDoBootstrap = function (moduleRef) {\n var /** @type {?} */ appRef = moduleRef.injector.get(ApplicationRef);\n if (moduleRef.bootstrapFactories.length > 0) {\n moduleRef.bootstrapFactories.forEach(function (compFactory) { return appRef.bootstrap(compFactory); });\n }\n else if (moduleRef.instance.ngDoBootstrap) {\n moduleRef.instance.ngDoBootstrap(appRef);\n }\n else {\n throw new Error((\"The module \" + stringify(moduleRef.instance.constructor) + \" was bootstrapped, but it does not declare \\\"@NgModule.bootstrap\\\" components nor a \\\"ngDoBootstrap\\\" method. \") +\n \"Please define one of these.\");\n }\n };\n PlatformRef_.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n PlatformRef_.ctorParameters = function () { return [\n { type: Injector, },\n ]; };\n return PlatformRef_;\n }(PlatformRef));\n /**\n * A reference to an Angular application running on a page.\n * *\n * For more about Angular applications, see the documentation for {@link bootstrap}.\n * *\n * @abstract\n */\n var ApplicationRef = (function () {\n function ApplicationRef() {\n }\n /**\n * Bootstrap a new component at the root level of the application.\n * *\n * ### Bootstrap process\n * *\n * When bootstrapping a new root component into an application, Angular mounts the\n * specified application component onto DOM elements identified by the [componentType]'s\n * selector and kicks off automatic change detection to finish initializing the component.\n * *\n * ### Example\n * {@example core/ts/platform/platform.ts region='longform'}\n * @abstract\n * @param {?} componentFactory\n * @return {?}\n */\n ApplicationRef.prototype.bootstrap = function (componentFactory) { };\n /**\n * Invoke this method to explicitly process change detection and its side-effects.\n * *\n * In development mode, `tick()` also performs a second change detection cycle to ensure that no\n * further changes are detected. If additional changes are picked up during this second cycle,\n * bindings in the app have side-effects that cannot be resolved in a single change detection\n * pass.\n * In this case, Angular throws an error, since an Angular application can only have one change\n * detection pass during which all change detection must complete.\n * @abstract\n * @return {?}\n */\n ApplicationRef.prototype.tick = function () { };\n Object.defineProperty(ApplicationRef.prototype, \"componentTypes\", {\n /**\n * Get a list of component types registered to this application.\n * This list is populated even before the component is created.\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n ;\n Object.defineProperty(ApplicationRef.prototype, \"components\", {\n /**\n * Get a list of components registered to this application.\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n ;\n /**\n * Attaches a view so that it will be dirty checked.\n * The view will be automatically detached when it is destroyed.\n * This will throw if the view is already attached to a ViewContainer.\n * @param {?} view\n * @return {?}\n */\n ApplicationRef.prototype.attachView = function (view) { unimplemented(); };\n /**\n * Detaches a view from dirty checking again.\n * @param {?} view\n * @return {?}\n */\n ApplicationRef.prototype.detachView = function (view) { unimplemented(); };\n Object.defineProperty(ApplicationRef.prototype, \"viewCount\", {\n /**\n * Returns the number of attached views.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n return ApplicationRef;\n }());\n var ApplicationRef_ = (function (_super) {\n __extends$3(ApplicationRef_, _super);\n /**\n * @param {?} _zone\n * @param {?} _console\n * @param {?} _injector\n * @param {?} _exceptionHandler\n * @param {?} _componentFactoryResolver\n * @param {?} _initStatus\n * @param {?} _testabilityRegistry\n * @param {?} _testability\n */\n function ApplicationRef_(_zone, _console, _injector, _exceptionHandler, _componentFactoryResolver, _initStatus, _testabilityRegistry, _testability) {\n var _this = this;\n _super.call(this);\n this._zone = _zone;\n this._console = _console;\n this._injector = _injector;\n this._exceptionHandler = _exceptionHandler;\n this._componentFactoryResolver = _componentFactoryResolver;\n this._initStatus = _initStatus;\n this._testabilityRegistry = _testabilityRegistry;\n this._testability = _testability;\n this._bootstrapListeners = [];\n this._rootComponents = [];\n this._rootComponentTypes = [];\n this._views = [];\n this._runningTick = false;\n this._enforceNoNewChanges = false;\n this._enforceNoNewChanges = isDevMode();\n this._zone.onMicrotaskEmpty.subscribe({ next: function () { _this._zone.run(function () { _this.tick(); }); } });\n }\n /**\n * @param {?} viewRef\n * @return {?}\n */\n ApplicationRef_.prototype.attachView = function (viewRef) {\n var /** @type {?} */ view = ((viewRef)).internalView;\n this._views.push(view);\n view.attachToAppRef(this);\n };\n /**\n * @param {?} viewRef\n * @return {?}\n */\n ApplicationRef_.prototype.detachView = function (viewRef) {\n var /** @type {?} */ view = ((viewRef)).internalView;\n ListWrapper.remove(this._views, view);\n view.detach();\n };\n /**\n * @param {?} componentOrFactory\n * @return {?}\n */\n ApplicationRef_.prototype.bootstrap = function (componentOrFactory) {\n var _this = this;\n if (!this._initStatus.done) {\n throw new Error('Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.');\n }\n var /** @type {?} */ componentFactory;\n if (componentOrFactory instanceof ComponentFactory) {\n componentFactory = componentOrFactory;\n }\n else {\n componentFactory = this._componentFactoryResolver.resolveComponentFactory(componentOrFactory);\n }\n this._rootComponentTypes.push(componentFactory.componentType);\n var /** @type {?} */ compRef = componentFactory.create(this._injector, [], componentFactory.selector);\n compRef.onDestroy(function () { _this._unloadComponent(compRef); });\n var /** @type {?} */ testability = compRef.injector.get(Testability, null);\n if (testability) {\n compRef.injector.get(TestabilityRegistry)\n .registerApplication(compRef.location.nativeElement, testability);\n }\n this._loadComponent(compRef);\n if (isDevMode()) {\n this._console.log(\"Angular 2 is running in the development mode. Call enableProdMode() to enable the production mode.\");\n }\n return compRef;\n };\n /**\n * @param {?} componentRef\n * @return {?}\n */\n ApplicationRef_.prototype._loadComponent = function (componentRef) {\n this.attachView(componentRef.hostView);\n this.tick();\n this._rootComponents.push(componentRef);\n // Get the listeners lazily to prevent DI cycles.\n var /** @type {?} */ listeners = (this._injector.get(APP_BOOTSTRAP_LISTENER, [])\n .concat(this._bootstrapListeners));\n listeners.forEach(function (listener) { return listener(componentRef); });\n };\n /**\n * @param {?} componentRef\n * @return {?}\n */\n ApplicationRef_.prototype._unloadComponent = function (componentRef) {\n this.detachView(componentRef.hostView);\n ListWrapper.remove(this._rootComponents, componentRef);\n };\n /**\n * @return {?}\n */\n ApplicationRef_.prototype.tick = function () {\n if (this._runningTick) {\n throw new Error('ApplicationRef.tick is called recursively');\n }\n var /** @type {?} */ scope = ApplicationRef_._tickScope();\n try {\n this._runningTick = true;\n this._views.forEach(function (view) { return view.ref.detectChanges(); });\n if (this._enforceNoNewChanges) {\n this._views.forEach(function (view) { return view.ref.checkNoChanges(); });\n }\n }\n finally {\n this._runningTick = false;\n wtfLeave(scope);\n }\n };\n /**\n * @return {?}\n */\n ApplicationRef_.prototype.ngOnDestroy = function () {\n // TODO(alxhub): Dispose of the NgZone.\n this._views.slice().forEach(function (view) { return view.destroy(); });\n };\n Object.defineProperty(ApplicationRef_.prototype, \"viewCount\", {\n /**\n * @return {?}\n */\n get: function () { return this._views.length; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ApplicationRef_.prototype, \"componentTypes\", {\n /**\n * @return {?}\n */\n get: function () { return this._rootComponentTypes; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ApplicationRef_.prototype, \"components\", {\n /**\n * @return {?}\n */\n get: function () { return this._rootComponents; },\n enumerable: true,\n configurable: true\n });\n /** @internal */\n ApplicationRef_._tickScope = wtfCreateScope('ApplicationRef#tick()');\n ApplicationRef_.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n ApplicationRef_.ctorParameters = function () { return [\n { type: NgZone, },\n { type: Console, },\n { type: Injector, },\n { type: ErrorHandler, },\n { type: ComponentFactoryResolver, },\n { type: ApplicationInitStatus, },\n { type: TestabilityRegistry, decorators: [{ type: Optional },] },\n { type: Testability, decorators: [{ type: Optional },] },\n ]; };\n return ApplicationRef_;\n }(ApplicationRef));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$9 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Represents an instance of an NgModule created via a {@link NgModuleFactory}.\n * *\n * `NgModuleRef` provides access to the NgModule Instance as well other objects related to this\n * NgModule Instance.\n * *\n * @abstract\n */\n var NgModuleRef = (function () {\n function NgModuleRef() {\n }\n Object.defineProperty(NgModuleRef.prototype, \"injector\", {\n /**\n * The injector that contains all of the providers of the NgModule.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgModuleRef.prototype, \"componentFactoryResolver\", {\n /**\n * The ComponentFactoryResolver to get hold of the ComponentFactories\n * declared in the `entryComponents` property of the module.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgModuleRef.prototype, \"instance\", {\n /**\n * The NgModule instance.\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n /**\n * Destroys the module instance and all of the data structures associated with it.\n * @abstract\n * @return {?}\n */\n NgModuleRef.prototype.destroy = function () { };\n /**\n * Allows to register a callback that will be called when the module is destroyed.\n * @abstract\n * @param {?} callback\n * @return {?}\n */\n NgModuleRef.prototype.onDestroy = function (callback) { };\n return NgModuleRef;\n }());\n /**\n * @experimental\n */\n var NgModuleFactory = (function () {\n /**\n * @param {?} _injectorClass\n * @param {?} _moduleType\n */\n function NgModuleFactory(_injectorClass, _moduleType) {\n this._injectorClass = _injectorClass;\n this._moduleType = _moduleType;\n }\n Object.defineProperty(NgModuleFactory.prototype, \"moduleType\", {\n /**\n * @return {?}\n */\n get: function () { return this._moduleType; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} parentInjector\n * @return {?}\n */\n NgModuleFactory.prototype.create = function (parentInjector) {\n if (!parentInjector) {\n parentInjector = Injector.NULL;\n }\n var /** @type {?} */ instance = new this._injectorClass(parentInjector);\n instance.create();\n return instance;\n };\n return NgModuleFactory;\n }());\n var /** @type {?} */ _UNDEFINED = new Object();\n /**\n * @abstract\n */\n var NgModuleInjector = (function (_super) {\n __extends$9(NgModuleInjector, _super);\n /**\n * @param {?} parent\n * @param {?} factories\n * @param {?} bootstrapFactories\n */\n function NgModuleInjector(parent, factories, bootstrapFactories) {\n _super.call(this, factories, parent.get(ComponentFactoryResolver, ComponentFactoryResolver.NULL));\n this.parent = parent;\n this.bootstrapFactories = bootstrapFactories;\n this._destroyListeners = [];\n this._destroyed = false;\n }\n /**\n * @return {?}\n */\n NgModuleInjector.prototype.create = function () { this.instance = this.createInternal(); };\n /**\n * @abstract\n * @return {?}\n */\n NgModuleInjector.prototype.createInternal = function () { };\n /**\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n NgModuleInjector.prototype.get = function (token, notFoundValue) {\n if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n if (token === Injector || token === ComponentFactoryResolver) {\n return this;\n }\n var /** @type {?} */ result = this.getInternal(token, _UNDEFINED);\n return result === _UNDEFINED ? this.parent.get(token, notFoundValue) : result;\n };\n /**\n * @abstract\n * @param {?} token\n * @param {?} notFoundValue\n * @return {?}\n */\n NgModuleInjector.prototype.getInternal = function (token, notFoundValue) { };\n Object.defineProperty(NgModuleInjector.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgModuleInjector.prototype, \"componentFactoryResolver\", {\n /**\n * @return {?}\n */\n get: function () { return this; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n NgModuleInjector.prototype.destroy = function () {\n if (this._destroyed) {\n throw new Error(\"The ng module \" + stringify(this.instance.constructor) + \" has already been destroyed.\");\n }\n this._destroyed = true;\n this.destroyInternal();\n this._destroyListeners.forEach(function (listener) { return listener(); });\n };\n /**\n * @param {?} callback\n * @return {?}\n */\n NgModuleInjector.prototype.onDestroy = function (callback) { this._destroyListeners.push(callback); };\n /**\n * @abstract\n * @return {?}\n */\n NgModuleInjector.prototype.destroyInternal = function () { };\n return NgModuleInjector;\n }(CodegenComponentFactoryResolver));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * Used to load ng module factories.\n * @abstract\n */\n var NgModuleFactoryLoader = (function () {\n function NgModuleFactoryLoader() {\n }\n /**\n * @abstract\n * @param {?} path\n * @return {?}\n */\n NgModuleFactoryLoader.prototype.load = function (path) { };\n return NgModuleFactoryLoader;\n }());\n var /** @type {?} */ moduleFactories = new Map();\n /**\n * Registers a loaded module. Should only be called from generated NgModuleFactory code.\n * @param {?} id\n * @param {?} factory\n * @return {?}\n */\n function registerModuleFactory(id, factory) {\n var /** @type {?} */ existing = moduleFactories.get(id);\n if (existing) {\n throw new Error(\"Duplicate module registered for \" + id + \" - \" + existing.moduleType.name + \" vs \" + factory.moduleType.name);\n }\n moduleFactories.set(id, factory);\n }\n /**\n * Returns the NgModuleFactory with the given id, if it exists and has been loaded.\n * Factories for modules that do not specify an `id` cannot be retrieved. Throws if the module\n * cannot be found.\n * @param {?} id\n * @return {?}\n */\n function getModuleFactory(id) {\n var /** @type {?} */ factory = moduleFactories.get(id);\n if (!factory)\n throw new Error(\"No module with ID \" + id + \" loaded\");\n return factory;\n }\n\n /**\n * An unmodifiable list of items that Angular keeps up to date when the state\n * of the application changes.\n * *\n * The type of object that {@link Query} and {@link ViewQueryMetadata} provide.\n * *\n * Implements an iterable interface, therefore it can be used in both ES6\n * javascript `for (var i of items)` loops as well as in Angular templates with\n * `*ngFor=\"let i of myList\"`.\n * *\n * Changes can be observed by subscribing to the changes `Observable`.\n * *\n * NOTE: In the future this class will implement an `Observable` interface.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/RX8sJnQYl9FWuSCWme5z?p=preview))\n * ```typescript\n * class Container {\n * @ViewChildren(Item) items:QueryList<Item>;\n * }\n * ```\n */\n var QueryList = (function () {\n function QueryList() {\n this._dirty = true;\n this._results = [];\n this._emitter = new EventEmitter();\n }\n Object.defineProperty(QueryList.prototype, \"changes\", {\n /**\n * @return {?}\n */\n get: function () { return this._emitter; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QueryList.prototype, \"length\", {\n /**\n * @return {?}\n */\n get: function () { return this._results.length; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QueryList.prototype, \"first\", {\n /**\n * @return {?}\n */\n get: function () { return this._results[0]; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(QueryList.prototype, \"last\", {\n /**\n * @return {?}\n */\n get: function () { return this._results[this.length - 1]; },\n enumerable: true,\n configurable: true\n });\n /**\n * See\n * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)\n * @param {?} fn\n * @return {?}\n */\n QueryList.prototype.map = function (fn) { return this._results.map(fn); };\n /**\n * See\n * [Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)\n * @param {?} fn\n * @return {?}\n */\n QueryList.prototype.filter = function (fn) {\n return this._results.filter(fn);\n };\n /**\n * See\n * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)\n * @param {?} fn\n * @return {?}\n */\n QueryList.prototype.find = function (fn) { return this._results.find(fn); };\n /**\n * See\n * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)\n * @param {?} fn\n * @param {?} init\n * @return {?}\n */\n QueryList.prototype.reduce = function (fn, init) {\n return this._results.reduce(fn, init);\n };\n /**\n * See\n * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)\n * @param {?} fn\n * @return {?}\n */\n QueryList.prototype.forEach = function (fn) { this._results.forEach(fn); };\n /**\n * See\n * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)\n * @param {?} fn\n * @return {?}\n */\n QueryList.prototype.some = function (fn) {\n return this._results.some(fn);\n };\n /**\n * @return {?}\n */\n QueryList.prototype.toArray = function () { return this._results.slice(); };\n /**\n * @return {?}\n */\n QueryList.prototype[getSymbolIterator()] = function () { return ((this._results))[getSymbolIterator()](); };\n /**\n * @return {?}\n */\n QueryList.prototype.toString = function () { return this._results.toString(); };\n /**\n * @param {?} res\n * @return {?}\n */\n QueryList.prototype.reset = function (res) {\n this._results = ListWrapper.flatten(res);\n this._dirty = false;\n };\n /**\n * @return {?}\n */\n QueryList.prototype.notifyOnChanges = function () { this._emitter.emit(this); };\n /**\n * internal\n * @return {?}\n */\n QueryList.prototype.setDirty = function () { this._dirty = true; };\n Object.defineProperty(QueryList.prototype, \"dirty\", {\n /**\n * internal\n * @return {?}\n */\n get: function () { return this._dirty; },\n enumerable: true,\n configurable: true\n });\n return QueryList;\n }());\n\n var /** @type {?} */ _SEPARATOR = '#';\n var /** @type {?} */ FACTORY_CLASS_SUFFIX = 'NgFactory';\n /**\n * Configuration for SystemJsNgModuleLoader.\n * token.\n * *\n * @abstract\n */\n var SystemJsNgModuleLoaderConfig = (function () {\n function SystemJsNgModuleLoaderConfig() {\n }\n return SystemJsNgModuleLoaderConfig;\n }());\n var /** @type {?} */ DEFAULT_CONFIG = {\n factoryPathPrefix: '',\n factoryPathSuffix: '.ngfactory',\n };\n /**\n * NgModuleFactoryLoader that uses SystemJS to load NgModuleFactory\n */\n var SystemJsNgModuleLoader = (function () {\n /**\n * @param {?} _compiler\n * @param {?=} config\n */\n function SystemJsNgModuleLoader(_compiler, config) {\n this._compiler = _compiler;\n this._config = config || DEFAULT_CONFIG;\n }\n /**\n * @param {?} path\n * @return {?}\n */\n SystemJsNgModuleLoader.prototype.load = function (path) {\n var /** @type {?} */ offlineMode = this._compiler instanceof Compiler;\n return offlineMode ? this.loadFactory(path) : this.loadAndCompile(path);\n };\n /**\n * @param {?} path\n * @return {?}\n */\n SystemJsNgModuleLoader.prototype.loadAndCompile = function (path) {\n var _this = this;\n var _a = path.split(_SEPARATOR), module = _a[0], exportName = _a[1];\n if (exportName === undefined) {\n exportName = 'default';\n }\n return System.import(module)\n .then(function (module) { return module[exportName]; })\n .then(function (type) { return checkNotEmpty(type, module, exportName); })\n .then(function (type) { return _this._compiler.compileModuleAsync(type); });\n };\n /**\n * @param {?} path\n * @return {?}\n */\n SystemJsNgModuleLoader.prototype.loadFactory = function (path) {\n var _a = path.split(_SEPARATOR), module = _a[0], exportName = _a[1];\n var /** @type {?} */ factoryClassSuffix = FACTORY_CLASS_SUFFIX;\n if (exportName === undefined) {\n exportName = 'default';\n factoryClassSuffix = '';\n }\n return System.import(this._config.factoryPathPrefix + module + this._config.factoryPathSuffix)\n .then(function (module) { return module[exportName + factoryClassSuffix]; })\n .then(function (factory) { return checkNotEmpty(factory, module, exportName); });\n };\n SystemJsNgModuleLoader.decorators = [\n { type: Injectable },\n ];\n /** @nocollapse */\n SystemJsNgModuleLoader.ctorParameters = function () { return [\n { type: Compiler, },\n { type: SystemJsNgModuleLoaderConfig, decorators: [{ type: Optional },] },\n ]; };\n return SystemJsNgModuleLoader;\n }());\n /**\n * @param {?} value\n * @param {?} modulePath\n * @param {?} exportName\n * @return {?}\n */\n function checkNotEmpty(value, modulePath, exportName) {\n if (!value) {\n throw new Error(\"Cannot find '\" + exportName + \"' in '\" + modulePath + \"'\");\n }\n return value;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$10 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Represents an Embedded Template that can be used to instantiate Embedded Views.\n * *\n * You can access a `TemplateRef`, in two ways. Via a directive placed on a `<template>` element (or\n * directive prefixed with `*`) and have the `TemplateRef` for this Embedded View injected into the\n * constructor of the directive using the `TemplateRef` Token. Alternatively you can query for the\n * `TemplateRef` from a Component or a Directive via {@link Query}.\n * *\n * To instantiate Embedded Views based on a Template, use\n * {@link ViewContainerRef#createEmbeddedView}, which will create the View and attach it to the\n * View Container.\n * @abstract\n */\n var TemplateRef = (function () {\n function TemplateRef() {\n }\n Object.defineProperty(TemplateRef.prototype, \"elementRef\", {\n /**\n * @return {?}\n */\n get: function () { return null; },\n enumerable: true,\n configurable: true\n });\n /**\n * @abstract\n * @param {?} context\n * @return {?}\n */\n TemplateRef.prototype.createEmbeddedView = function (context) { };\n return TemplateRef;\n }());\n var TemplateRef_ = (function (_super) {\n __extends$10(TemplateRef_, _super);\n /**\n * @param {?} _parentView\n * @param {?} _nodeIndex\n * @param {?} _nativeElement\n */\n function TemplateRef_(_parentView, _nodeIndex, _nativeElement) {\n _super.call(this);\n this._parentView = _parentView;\n this._nodeIndex = _nodeIndex;\n this._nativeElement = _nativeElement;\n }\n /**\n * @param {?} context\n * @return {?}\n */\n TemplateRef_.prototype.createEmbeddedView = function (context) {\n var /** @type {?} */ view = this._parentView.createEmbeddedViewInternal(this._nodeIndex);\n view.create(context || ({}));\n return view.ref;\n };\n Object.defineProperty(TemplateRef_.prototype, \"elementRef\", {\n /**\n * @return {?}\n */\n get: function () { return new ElementRef(this._nativeElement); },\n enumerable: true,\n configurable: true\n });\n return TemplateRef_;\n }(TemplateRef));\n\n /**\n * Represents a container where one or more Views can be attached.\n * *\n * The container can contain two kinds of Views. Host Views, created by instantiating a\n * {@link Component} via {@link #createComponent}, and Embedded Views, created by instantiating an\n * {@link TemplateRef Embedded Template} via {@link #createEmbeddedView}.\n * *\n * The location of the View Container within the containing View is specified by the Anchor\n * `element`. Each View Container can have only one Anchor Element and each Anchor Element can only\n * have a single View Container.\n * *\n * Root elements of Views attached to this container become siblings of the Anchor Element in\n * the Rendered View.\n * *\n * To access a `ViewContainerRef` of an Element, you can either place a {@link Directive} injected\n * with `ViewContainerRef` on the Element, or you obtain it via a {@link ViewChild} query.\n * @abstract\n */\n var ViewContainerRef = (function () {\n function ViewContainerRef() {\n }\n Object.defineProperty(ViewContainerRef.prototype, \"element\", {\n /**\n * Anchor element that specifies the location of this container in the containing View.\n * <!-- TODO: rename to anchorElement -->\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainerRef.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainerRef.prototype, \"parentInjector\", {\n /**\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n /**\n * Destroys all Views in this container.\n * @abstract\n * @return {?}\n */\n ViewContainerRef.prototype.clear = function () { };\n /**\n * Returns the {@link ViewRef} for the View located in this container at the specified index.\n * @abstract\n * @param {?} index\n * @return {?}\n */\n ViewContainerRef.prototype.get = function (index) { };\n Object.defineProperty(ViewContainerRef.prototype, \"length\", {\n /**\n * Returns the number of Views currently attached to this container.\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n ;\n /**\n * Instantiates an Embedded View based on the {@link TemplateRef `templateRef`} and inserts it\n * into this container at the specified `index`.\n * *\n * If `index` is not specified, the new View will be inserted as the last View in the container.\n * *\n * Returns the {@link ViewRef} for the newly created View.\n * @abstract\n * @param {?} templateRef\n * @param {?=} context\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef.prototype.createEmbeddedView = function (templateRef, context, index) { };\n /**\n * Instantiates a single {@link Component} and inserts its Host View into this container at the\n * specified `index`.\n * *\n * The component is instantiated using its {@link ComponentFactory} which can be\n * obtained via {@link ComponentFactoryResolver#resolveComponentFactory}.\n * *\n * If `index` is not specified, the new View will be inserted as the last View in the container.\n * *\n * You can optionally specify the {@link Injector} that will be used as parent for the Component.\n * *\n * Returns the {@link ComponentRef} of the Host View created for the newly instantiated Component.\n * @abstract\n * @param {?} componentFactory\n * @param {?=} index\n * @param {?=} injector\n * @param {?=} projectableNodes\n * @return {?}\n */\n ViewContainerRef.prototype.createComponent = function (componentFactory, index, injector, projectableNodes) { };\n /**\n * Inserts a View identified by a {@link ViewRef} into the container at the specified `index`.\n * *\n * If `index` is not specified, the new View will be inserted as the last View in the container.\n * *\n * Returns the inserted {@link ViewRef}.\n * @abstract\n * @param {?} viewRef\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef.prototype.insert = function (viewRef, index) { };\n /**\n * Moves a View identified by a {@link ViewRef} into the container at the specified `index`.\n * *\n * Returns the inserted {@link ViewRef}.\n * @abstract\n * @param {?} viewRef\n * @param {?} currentIndex\n * @return {?}\n */\n ViewContainerRef.prototype.move = function (viewRef, currentIndex) { };\n /**\n * Returns the index of the View, specified via {@link ViewRef}, within the current container or\n * `-1` if this container doesn't contain the View.\n * @abstract\n * @param {?} viewRef\n * @return {?}\n */\n ViewContainerRef.prototype.indexOf = function (viewRef) { };\n /**\n * Destroys a View attached to this container at the specified `index`.\n * *\n * If `index` is not specified, the last View in the container will be removed.\n * @abstract\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef.prototype.remove = function (index) { };\n /**\n * Use along with {@link #insert} to move a View within the current container.\n * *\n * If the `index` param is omitted, the last {@link ViewRef} is detached.\n * @abstract\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef.prototype.detach = function (index) { };\n return ViewContainerRef;\n }());\n var ViewContainerRef_ = (function () {\n /**\n * @param {?} _element\n */\n function ViewContainerRef_(_element) {\n this._element = _element;\n /** @internal */\n this._createComponentInContainerScope = wtfCreateScope('ViewContainerRef#createComponent()');\n /** @internal */\n this._insertScope = wtfCreateScope('ViewContainerRef#insert()');\n /** @internal */\n this._removeScope = wtfCreateScope('ViewContainerRef#remove()');\n /** @internal */\n this._detachScope = wtfCreateScope('ViewContainerRef#detach()');\n }\n /**\n * @param {?} index\n * @return {?}\n */\n ViewContainerRef_.prototype.get = function (index) { return this._element.nestedViews[index].ref; };\n Object.defineProperty(ViewContainerRef_.prototype, \"length\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ views = this._element.nestedViews;\n return isPresent(views) ? views.length : 0;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainerRef_.prototype, \"element\", {\n /**\n * @return {?}\n */\n get: function () { return this._element.elementRef; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainerRef_.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._element.injector; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainerRef_.prototype, \"parentInjector\", {\n /**\n * @return {?}\n */\n get: function () { return this._element.parentInjector; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} templateRef\n * @param {?=} context\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, context, index) {\n if (context === void 0) { context = null; }\n if (index === void 0) { index = -1; }\n var /** @type {?} */ viewRef = templateRef.createEmbeddedView(context);\n this.insert(viewRef, index);\n return viewRef;\n };\n /**\n * @param {?} componentFactory\n * @param {?=} index\n * @param {?=} injector\n * @param {?=} projectableNodes\n * @return {?}\n */\n ViewContainerRef_.prototype.createComponent = function (componentFactory, index, injector, projectableNodes) {\n if (index === void 0) { index = -1; }\n if (injector === void 0) { injector = null; }\n if (projectableNodes === void 0) { projectableNodes = null; }\n var /** @type {?} */ s = this._createComponentInContainerScope();\n var /** @type {?} */ contextInjector = injector || this._element.parentInjector;\n var /** @type {?} */ componentRef = componentFactory.create(contextInjector, projectableNodes);\n this.insert(componentRef.hostView, index);\n return wtfLeave(s, componentRef);\n };\n /**\n * @param {?} viewRef\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef_.prototype.insert = function (viewRef, index) {\n if (index === void 0) { index = -1; }\n var /** @type {?} */ s = this._insertScope();\n if (index == -1)\n index = this.length;\n var /** @type {?} */ viewRef_ = (viewRef);\n this._element.attachView(viewRef_.internalView, index);\n return wtfLeave(s, viewRef_);\n };\n /**\n * @param {?} viewRef\n * @param {?} currentIndex\n * @return {?}\n */\n ViewContainerRef_.prototype.move = function (viewRef, currentIndex) {\n var /** @type {?} */ s = this._insertScope();\n if (currentIndex == -1)\n return;\n var /** @type {?} */ viewRef_ = (viewRef);\n this._element.moveView(viewRef_.internalView, currentIndex);\n return wtfLeave(s, viewRef_);\n };\n /**\n * @param {?} viewRef\n * @return {?}\n */\n ViewContainerRef_.prototype.indexOf = function (viewRef) {\n return this._element.nestedViews.indexOf(((viewRef)).internalView);\n };\n /**\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef_.prototype.remove = function (index) {\n if (index === void 0) { index = -1; }\n var /** @type {?} */ s = this._removeScope();\n if (index == -1)\n index = this.length - 1;\n var /** @type {?} */ view = this._element.detachView(index);\n view.destroy();\n // view is intentionally not returned to the client.\n wtfLeave(s);\n };\n /**\n * @param {?=} index\n * @return {?}\n */\n ViewContainerRef_.prototype.detach = function (index) {\n if (index === void 0) { index = -1; }\n var /** @type {?} */ s = this._detachScope();\n if (index == -1)\n index = this.length - 1;\n var /** @type {?} */ view = this._element.detachView(index);\n return wtfLeave(s, view.ref);\n };\n /**\n * @return {?}\n */\n ViewContainerRef_.prototype.clear = function () {\n for (var /** @type {?} */ i = this.length - 1; i >= 0; i--) {\n this.remove(i);\n }\n };\n return ViewContainerRef_;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$11 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @abstract\n */\n var ViewRef = (function (_super) {\n __extends$11(ViewRef, _super);\n function ViewRef() {\n _super.apply(this, arguments);\n }\n /**\n * Destroys the view and all of the data structures associated with it.\n * @abstract\n * @return {?}\n */\n ViewRef.prototype.destroy = function () { };\n Object.defineProperty(ViewRef.prototype, \"destroyed\", {\n /**\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n /**\n * @abstract\n * @param {?} callback\n * @return {?}\n */\n ViewRef.prototype.onDestroy = function (callback) { };\n return ViewRef;\n }(ChangeDetectorRef));\n /**\n * Represents an Angular View.\n * *\n * <!-- TODO: move the next two paragraphs to the dev guide -->\n * A View is a fundamental building block of the application UI. It is the smallest grouping of\n * Elements which are created and destroyed together.\n * *\n * Properties of elements in a View can change, but the structure (number and order) of elements in\n * a View cannot. Changing the structure of Elements can only be done by inserting, moving or\n * removing nested Views via a {@link ViewContainerRef}. Each View can contain many View Containers.\n * <!-- /TODO -->\n * *\n * ### Example\n * *\n * Given this template...\n * *\n * ```\n * Count: {{items.length}}\n * <ul>\n * <li *ngFor=\"let item of items\">{{item}}</li>\n * </ul>\n * ```\n * *\n * We have two {@link TemplateRef}s:\n * *\n * Outer {@link TemplateRef}:\n * ```\n * Count: {{items.length}}\n * <ul>\n * <template ngFor let-item [ngForOf]=\"items\"></template>\n * </ul>\n * ```\n * *\n * Inner {@link TemplateRef}:\n * ```\n * <li>{{item}}</li>\n * ```\n * *\n * Notice that the original template is broken down into two separate {@link TemplateRef}s.\n * *\n * The outer/inner {@link TemplateRef}s are then assembled into views like so:\n * *\n * ```\n * <!-- ViewRef: outer-0 -->\n * Count: 2\n * <ul>\n * <template view-container-ref></template>\n * <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->\n * <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->\n * </ul>\n * <!-- /ViewRef: outer-0 -->\n * ```\n * @abstract\n */\n var EmbeddedViewRef = (function (_super) {\n __extends$11(EmbeddedViewRef, _super);\n function EmbeddedViewRef() {\n _super.apply(this, arguments);\n }\n Object.defineProperty(EmbeddedViewRef.prototype, \"context\", {\n /**\n * @return {?}\n */\n get: function () { return unimplemented(); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EmbeddedViewRef.prototype, \"rootNodes\", {\n /**\n * @return {?}\n */\n get: function () { return (unimplemented()); },\n enumerable: true,\n configurable: true\n });\n ;\n return EmbeddedViewRef;\n }(ViewRef));\n var ViewRef_ = (function () {\n /**\n * @param {?} _view\n * @param {?} animationQueue\n */\n function ViewRef_(_view, animationQueue) {\n this._view = _view;\n this.animationQueue = animationQueue;\n this._view = _view;\n this._originalMode = this._view.cdMode;\n }\n Object.defineProperty(ViewRef_.prototype, \"internalView\", {\n /**\n * @return {?}\n */\n get: function () { return this._view; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewRef_.prototype, \"rootNodes\", {\n /**\n * @return {?}\n */\n get: function () { return this._view.flatRootNodes; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewRef_.prototype, \"context\", {\n /**\n * @return {?}\n */\n get: function () { return this._view.context; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewRef_.prototype, \"destroyed\", {\n /**\n * @return {?}\n */\n get: function () { return this._view.destroyed; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n ViewRef_.prototype.markForCheck = function () { this._view.markPathToRootAsCheckOnce(); };\n /**\n * @return {?}\n */\n ViewRef_.prototype.detach = function () { this._view.cdMode = ChangeDetectorStatus.Detached; };\n /**\n * @return {?}\n */\n ViewRef_.prototype.detectChanges = function () {\n this._view.detectChanges(false);\n this.animationQueue.flush();\n };\n /**\n * @return {?}\n */\n ViewRef_.prototype.checkNoChanges = function () { this._view.detectChanges(true); };\n /**\n * @return {?}\n */\n ViewRef_.prototype.reattach = function () {\n this._view.cdMode = this._originalMode;\n this.markForCheck();\n };\n /**\n * @param {?} callback\n * @return {?}\n */\n ViewRef_.prototype.onDestroy = function (callback) {\n if (!this._view.disposables) {\n this._view.disposables = [];\n }\n this._view.disposables.push(callback);\n };\n /**\n * @return {?}\n */\n ViewRef_.prototype.destroy = function () { this._view.detachAndDestroy(); };\n return ViewRef_;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$12 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var EventListener = (function () {\n /**\n * @param {?} name\n * @param {?} callback\n */\n function EventListener(name, callback) {\n this.name = name;\n this.callback = callback;\n }\n ;\n return EventListener;\n }());\n /**\n * @experimental All debugging apis are currently experimental.\n */\n var DebugNode = (function () {\n /**\n * @param {?} nativeNode\n * @param {?} parent\n * @param {?} _debugInfo\n */\n function DebugNode(nativeNode, parent, _debugInfo) {\n this._debugInfo = _debugInfo;\n this.nativeNode = nativeNode;\n if (parent && parent instanceof DebugElement) {\n parent.addChild(this);\n }\n else {\n this.parent = null;\n }\n this.listeners = [];\n }\n Object.defineProperty(DebugNode.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._debugInfo ? this._debugInfo.injector : null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugNode.prototype, \"componentInstance\", {\n /**\n * @return {?}\n */\n get: function () { return this._debugInfo ? this._debugInfo.component : null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugNode.prototype, \"context\", {\n /**\n * @return {?}\n */\n get: function () { return this._debugInfo ? this._debugInfo.context : null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugNode.prototype, \"references\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._debugInfo ? this._debugInfo.references : null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugNode.prototype, \"providerTokens\", {\n /**\n * @return {?}\n */\n get: function () { return this._debugInfo ? this._debugInfo.providerTokens : null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugNode.prototype, \"source\", {\n /**\n * @return {?}\n */\n get: function () { return this._debugInfo ? this._debugInfo.source : null; },\n enumerable: true,\n configurable: true\n });\n return DebugNode;\n }());\n /**\n * @experimental All debugging apis are currently experimental.\n */\n var DebugElement = (function (_super) {\n __extends$12(DebugElement, _super);\n /**\n * @param {?} nativeNode\n * @param {?} parent\n * @param {?} _debugInfo\n */\n function DebugElement(nativeNode, parent, _debugInfo) {\n _super.call(this, nativeNode, parent, _debugInfo);\n this.properties = {};\n this.attributes = {};\n this.classes = {};\n this.styles = {};\n this.childNodes = [];\n this.nativeElement = nativeNode;\n }\n /**\n * @param {?} child\n * @return {?}\n */\n DebugElement.prototype.addChild = function (child) {\n if (child) {\n this.childNodes.push(child);\n child.parent = this;\n }\n };\n /**\n * @param {?} child\n * @return {?}\n */\n DebugElement.prototype.removeChild = function (child) {\n var /** @type {?} */ childIndex = this.childNodes.indexOf(child);\n if (childIndex !== -1) {\n child.parent = null;\n this.childNodes.splice(childIndex, 1);\n }\n };\n /**\n * @param {?} child\n * @param {?} newChildren\n * @return {?}\n */\n DebugElement.prototype.insertChildrenAfter = function (child, newChildren) {\n var /** @type {?} */ siblingIndex = this.childNodes.indexOf(child);\n if (siblingIndex !== -1) {\n var /** @type {?} */ previousChildren = this.childNodes.slice(0, siblingIndex + 1);\n var /** @type {?} */ nextChildren = this.childNodes.slice(siblingIndex + 1);\n this.childNodes = previousChildren.concat(newChildren, nextChildren);\n for (var /** @type {?} */ i = 0; i < newChildren.length; ++i) {\n var /** @type {?} */ newChild = newChildren[i];\n if (newChild.parent) {\n newChild.parent.removeChild(newChild);\n }\n newChild.parent = this;\n }\n }\n };\n /**\n * @param {?} predicate\n * @return {?}\n */\n DebugElement.prototype.query = function (predicate) {\n var /** @type {?} */ results = this.queryAll(predicate);\n return results[0] || null;\n };\n /**\n * @param {?} predicate\n * @return {?}\n */\n DebugElement.prototype.queryAll = function (predicate) {\n var /** @type {?} */ matches = [];\n _queryElementChildren(this, predicate, matches);\n return matches;\n };\n /**\n * @param {?} predicate\n * @return {?}\n */\n DebugElement.prototype.queryAllNodes = function (predicate) {\n var /** @type {?} */ matches = [];\n _queryNodeChildren(this, predicate, matches);\n return matches;\n };\n Object.defineProperty(DebugElement.prototype, \"children\", {\n /**\n * @return {?}\n */\n get: function () {\n return (this.childNodes.filter(function (node) { return node instanceof DebugElement; }));\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} eventName\n * @param {?} eventObj\n * @return {?}\n */\n DebugElement.prototype.triggerEventHandler = function (eventName, eventObj) {\n this.listeners.forEach(function (listener) {\n if (listener.name == eventName) {\n listener.callback(eventObj);\n }\n });\n };\n return DebugElement;\n }(DebugNode));\n /**\n * @param {?} debugEls\n * @return {?}\n */\n function asNativeElements(debugEls) {\n return debugEls.map(function (el) { return el.nativeElement; });\n }\n /**\n * @param {?} element\n * @param {?} predicate\n * @param {?} matches\n * @return {?}\n */\n function _queryElementChildren(element, predicate, matches) {\n element.childNodes.forEach(function (node) {\n if (node instanceof DebugElement) {\n if (predicate(node)) {\n matches.push(node);\n }\n _queryElementChildren(node, predicate, matches);\n }\n });\n }\n /**\n * @param {?} parentNode\n * @param {?} predicate\n * @param {?} matches\n * @return {?}\n */\n function _queryNodeChildren(parentNode, predicate, matches) {\n if (parentNode instanceof DebugElement) {\n parentNode.childNodes.forEach(function (node) {\n if (predicate(node)) {\n matches.push(node);\n }\n if (node instanceof DebugElement) {\n _queryNodeChildren(node, predicate, matches);\n }\n });\n }\n }\n // Need to keep the nodes in a global Map so that multiple angular apps are supported.\n var /** @type {?} */ _nativeNodeToDebugNode = new Map();\n /**\n * @param {?} nativeNode\n * @return {?}\n */\n function getDebugNode(nativeNode) {\n return _nativeNodeToDebugNode.get(nativeNode);\n }\n /**\n * @param {?} node\n * @return {?}\n */\n function indexDebugNode(node) {\n _nativeNodeToDebugNode.set(node.nativeNode, node);\n }\n /**\n * @param {?} node\n * @return {?}\n */\n function removeDebugNodeFromIndex(node) {\n _nativeNodeToDebugNode.delete(node.nativeNode);\n }\n\n /**\n * @return {?}\n */\n function _reflector() {\n return reflector;\n }\n var /** @type {?} */ _CORE_PLATFORM_PROVIDERS = [\n PlatformRef_,\n { provide: PlatformRef, useExisting: PlatformRef_ },\n { provide: Reflector, useFactory: _reflector, deps: [] },\n { provide: ReflectorReader, useExisting: Reflector },\n TestabilityRegistry,\n Console,\n ];\n /**\n * This platform has to be included in any other platform\n *\n * @experimental\n */\n var /** @type {?} */ platformCore = createPlatformFactory(null, 'core', _CORE_PLATFORM_PROVIDERS);\n\n /**\n * @experimental i18n support is experimental.\n */\n var /** @type {?} */ LOCALE_ID = new OpaqueToken('LocaleId');\n /**\n * @experimental i18n support is experimental.\n */\n var /** @type {?} */ TRANSLATIONS = new OpaqueToken('Translations');\n /**\n * @experimental i18n support is experimental.\n */\n var /** @type {?} */ TRANSLATIONS_FORMAT = new OpaqueToken('TranslationsFormat');\n\n /**\n * @return {?}\n */\n function _iterableDiffersFactory() {\n return defaultIterableDiffers;\n }\n /**\n * @return {?}\n */\n function _keyValueDiffersFactory() {\n return defaultKeyValueDiffers;\n }\n /**\n * This module includes the providers of @angular/core that are needed\n * to bootstrap components via `ApplicationRef`.\n * *\n */\n var ApplicationModule = (function () {\n function ApplicationModule() {\n }\n ApplicationModule.decorators = [\n { type: NgModule, args: [{\n providers: [\n ApplicationRef_,\n { provide: ApplicationRef, useExisting: ApplicationRef_ },\n ApplicationInitStatus,\n Compiler,\n APP_ID_RANDOM_PROVIDER,\n ViewUtils,\n AnimationQueue,\n { provide: IterableDiffers, useFactory: _iterableDiffersFactory },\n { provide: KeyValueDiffers, useFactory: _keyValueDiffersFactory },\n { provide: LOCALE_ID, useValue: 'en-US' },\n ]\n },] },\n ];\n /** @nocollapse */\n ApplicationModule.ctorParameters = function () { return []; };\n return ApplicationModule;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ FILL_STYLE_FLAG = 'true'; // TODO (matsko): change to boolean\n var /** @type {?} */ ANY_STATE = '*';\n var /** @type {?} */ DEFAULT_STATE = '*';\n var /** @type {?} */ EMPTY_STATE = 'void';\n\n var AnimationGroupPlayer = (function () {\n /**\n * @param {?} _players\n */\n function AnimationGroupPlayer(_players) {\n var _this = this;\n this._players = _players;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this.parentPlayer = null;\n var count = 0;\n var total = this._players.length;\n if (total == 0) {\n scheduleMicroTask(function () { return _this._onFinish(); });\n }\n else {\n this._players.forEach(function (player) {\n player.parentPlayer = _this;\n player.onDone(function () {\n if (++count >= total) {\n _this._onFinish();\n }\n });\n });\n }\n }\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype._onFinish = function () {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(function (fn) { return fn(); });\n this._onDoneFns = [];\n }\n };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.init = function () { this._players.forEach(function (player) { return player.init(); }); };\n /**\n * @param {?} fn\n * @return {?}\n */\n AnimationGroupPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n /**\n * @param {?} fn\n * @return {?}\n */\n AnimationGroupPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.hasStarted = function () { return this._started; };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.play = function () {\n if (!isPresent(this.parentPlayer)) {\n this.init();\n }\n if (!this.hasStarted()) {\n this._onStartFns.forEach(function (fn) { return fn(); });\n this._onStartFns = [];\n this._started = true;\n }\n this._players.forEach(function (player) { return player.play(); });\n };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.pause = function () { this._players.forEach(function (player) { return player.pause(); }); };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.restart = function () { this._players.forEach(function (player) { return player.restart(); }); };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.finish = function () {\n this._onFinish();\n this._players.forEach(function (player) { return player.finish(); });\n };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.destroy = function () {\n if (!this._destroyed) {\n this._onFinish();\n this._players.forEach(function (player) { return player.destroy(); });\n this._destroyed = true;\n }\n };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.reset = function () {\n this._players.forEach(function (player) { return player.reset(); });\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n };\n /**\n * @param {?} p\n * @return {?}\n */\n AnimationGroupPlayer.prototype.setPosition = function (p) {\n this._players.forEach(function (player) { player.setPosition(p); });\n };\n /**\n * @return {?}\n */\n AnimationGroupPlayer.prototype.getPosition = function () {\n var /** @type {?} */ min = 0;\n this._players.forEach(function (player) {\n var /** @type {?} */ p = player.getPosition();\n min = Math.min(p, min);\n });\n return min;\n };\n Object.defineProperty(AnimationGroupPlayer.prototype, \"players\", {\n /**\n * @return {?}\n */\n get: function () { return this._players; },\n enumerable: true,\n configurable: true\n });\n return AnimationGroupPlayer;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var AnimationKeyframe = (function () {\n /**\n * @param {?} offset\n * @param {?} styles\n */\n function AnimationKeyframe(offset, styles) {\n this.offset = offset;\n this.styles = styles;\n }\n return AnimationKeyframe;\n }());\n\n /**\n * @abstract\n */\n var AnimationPlayer = (function () {\n function AnimationPlayer() {\n }\n /**\n * @abstract\n * @param {?} fn\n * @return {?}\n */\n AnimationPlayer.prototype.onDone = function (fn) { };\n /**\n * @abstract\n * @param {?} fn\n * @return {?}\n */\n AnimationPlayer.prototype.onStart = function (fn) { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.init = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.hasStarted = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.play = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.pause = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.restart = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.finish = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.destroy = function () { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.reset = function () { };\n /**\n * @abstract\n * @param {?} p\n * @return {?}\n */\n AnimationPlayer.prototype.setPosition = function (p) { };\n /**\n * @abstract\n * @return {?}\n */\n AnimationPlayer.prototype.getPosition = function () { };\n Object.defineProperty(AnimationPlayer.prototype, \"parentPlayer\", {\n /**\n * @return {?}\n */\n get: function () { throw new Error('NOT IMPLEMENTED: Base Class'); },\n /**\n * @param {?} player\n * @return {?}\n */\n set: function (player) { throw new Error('NOT IMPLEMENTED: Base Class'); },\n enumerable: true,\n configurable: true\n });\n return AnimationPlayer;\n }());\n var NoOpAnimationPlayer = (function () {\n function NoOpAnimationPlayer() {\n var _this = this;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._started = false;\n this.parentPlayer = null;\n scheduleMicroTask(function () { return _this._onFinish(); });\n }\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype._onFinish = function () {\n this._onDoneFns.forEach(function (fn) { return fn(); });\n this._onDoneFns = [];\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n /**\n * @param {?} fn\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.hasStarted = function () { return this._started; };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.init = function () { };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.play = function () {\n if (!this.hasStarted()) {\n this._onStartFns.forEach(function (fn) { return fn(); });\n this._onStartFns = [];\n }\n this._started = true;\n };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.pause = function () { };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.restart = function () { };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.finish = function () { this._onFinish(); };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.destroy = function () { };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.reset = function () { };\n /**\n * @param {?} p\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.setPosition = function (p) { };\n /**\n * @return {?}\n */\n NoOpAnimationPlayer.prototype.getPosition = function () { return 0; };\n return NoOpAnimationPlayer;\n }());\n\n var AnimationSequencePlayer = (function () {\n /**\n * @param {?} _players\n */\n function AnimationSequencePlayer(_players) {\n var _this = this;\n this._players = _players;\n this._currentIndex = 0;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this.parentPlayer = null;\n this._players.forEach(function (player) { player.parentPlayer = _this; });\n this._onNext(false);\n }\n /**\n * @param {?} start\n * @return {?}\n */\n AnimationSequencePlayer.prototype._onNext = function (start) {\n var _this = this;\n if (this._finished)\n return;\n if (this._players.length == 0) {\n this._activePlayer = new NoOpAnimationPlayer();\n scheduleMicroTask(function () { return _this._onFinish(); });\n }\n else if (this._currentIndex >= this._players.length) {\n this._activePlayer = new NoOpAnimationPlayer();\n this._onFinish();\n }\n else {\n var /** @type {?} */ player = this._players[this._currentIndex++];\n player.onDone(function () { return _this._onNext(true); });\n this._activePlayer = player;\n if (start) {\n player.play();\n }\n }\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype._onFinish = function () {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(function (fn) { return fn(); });\n this._onDoneFns = [];\n }\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.init = function () { this._players.forEach(function (player) { return player.init(); }); };\n /**\n * @param {?} fn\n * @return {?}\n */\n AnimationSequencePlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n /**\n * @param {?} fn\n * @return {?}\n */\n AnimationSequencePlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.hasStarted = function () { return this._started; };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.play = function () {\n if (!isPresent(this.parentPlayer)) {\n this.init();\n }\n if (!this.hasStarted()) {\n this._onStartFns.forEach(function (fn) { return fn(); });\n this._onStartFns = [];\n this._started = true;\n }\n this._activePlayer.play();\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.pause = function () { this._activePlayer.pause(); };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.restart = function () {\n this.reset();\n if (this._players.length > 0) {\n this._players[0].restart();\n }\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.reset = function () {\n this._players.forEach(function (player) { return player.reset(); });\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.finish = function () {\n this._onFinish();\n this._players.forEach(function (player) { return player.finish(); });\n };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.destroy = function () {\n if (!this._destroyed) {\n this._onFinish();\n this._players.forEach(function (player) { return player.destroy(); });\n this._destroyed = true;\n this._activePlayer = new NoOpAnimationPlayer();\n }\n };\n /**\n * @param {?} p\n * @return {?}\n */\n AnimationSequencePlayer.prototype.setPosition = function (p) { this._players[0].setPosition(p); };\n /**\n * @return {?}\n */\n AnimationSequencePlayer.prototype.getPosition = function () { return this._players[0].getPosition(); };\n Object.defineProperty(AnimationSequencePlayer.prototype, \"players\", {\n /**\n * @return {?}\n */\n get: function () { return this._players; },\n enumerable: true,\n configurable: true\n });\n return AnimationSequencePlayer;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$13 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @experimental Animation support is experimental.\n */\n var /** @type {?} */ AUTO_STYLE = '*';\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link trigger trigger\n * animation function} is called.\n * *\n */\n var AnimationEntryMetadata = (function () {\n /**\n * @param {?} name\n * @param {?} definitions\n */\n function AnimationEntryMetadata(name, definitions) {\n this.name = name;\n this.definitions = definitions;\n }\n return AnimationEntryMetadata;\n }());\n /**\n * @abstract\n */\n var AnimationStateMetadata = (function () {\n function AnimationStateMetadata() {\n }\n return AnimationStateMetadata;\n }());\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link state state animation\n * function} is called.\n * *\n */\n var AnimationStateDeclarationMetadata = (function (_super) {\n __extends$13(AnimationStateDeclarationMetadata, _super);\n /**\n * @param {?} stateNameExpr\n * @param {?} styles\n */\n function AnimationStateDeclarationMetadata(stateNameExpr, styles) {\n _super.call(this);\n this.stateNameExpr = stateNameExpr;\n this.styles = styles;\n }\n return AnimationStateDeclarationMetadata;\n }(AnimationStateMetadata));\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the\n * {@link transition transition animation function} is called.\n * *\n */\n var AnimationStateTransitionMetadata = (function (_super) {\n __extends$13(AnimationStateTransitionMetadata, _super);\n /**\n * @param {?} stateChangeExpr\n * @param {?} steps\n */\n function AnimationStateTransitionMetadata(stateChangeExpr, steps) {\n _super.call(this);\n this.stateChangeExpr = stateChangeExpr;\n this.steps = steps;\n }\n return AnimationStateTransitionMetadata;\n }(AnimationStateMetadata));\n /**\n * @abstract\n */\n var AnimationMetadata = (function () {\n function AnimationMetadata() {\n }\n return AnimationMetadata;\n }());\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link keyframes keyframes\n * animation function} is called.\n * *\n */\n var AnimationKeyframesSequenceMetadata = (function (_super) {\n __extends$13(AnimationKeyframesSequenceMetadata, _super);\n /**\n * @param {?} steps\n */\n function AnimationKeyframesSequenceMetadata(steps) {\n _super.call(this);\n this.steps = steps;\n }\n return AnimationKeyframesSequenceMetadata;\n }(AnimationMetadata));\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link style style animation\n * function} is called.\n * *\n */\n var AnimationStyleMetadata = (function (_super) {\n __extends$13(AnimationStyleMetadata, _super);\n /**\n * @param {?} styles\n * @param {?=} offset\n */\n function AnimationStyleMetadata(styles, offset) {\n if (offset === void 0) { offset = null; }\n _super.call(this);\n this.styles = styles;\n this.offset = offset;\n }\n return AnimationStyleMetadata;\n }(AnimationMetadata));\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link animate animate\n * animation function} is called.\n * *\n */\n var AnimationAnimateMetadata = (function (_super) {\n __extends$13(AnimationAnimateMetadata, _super);\n /**\n * @param {?} timings\n * @param {?} styles\n */\n function AnimationAnimateMetadata(timings, styles) {\n _super.call(this);\n this.timings = timings;\n this.styles = styles;\n }\n return AnimationAnimateMetadata;\n }(AnimationMetadata));\n /**\n * @abstract\n */\n var AnimationWithStepsMetadata = (function (_super) {\n __extends$13(AnimationWithStepsMetadata, _super);\n function AnimationWithStepsMetadata() {\n _super.call(this);\n }\n Object.defineProperty(AnimationWithStepsMetadata.prototype, \"steps\", {\n /**\n * @return {?}\n */\n get: function () { throw new Error('NOT IMPLEMENTED: Base Class'); },\n enumerable: true,\n configurable: true\n });\n return AnimationWithStepsMetadata;\n }(AnimationMetadata));\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link sequence sequence\n * animation function} is called.\n * *\n */\n var AnimationSequenceMetadata = (function (_super) {\n __extends$13(AnimationSequenceMetadata, _super);\n /**\n * @param {?} _steps\n */\n function AnimationSequenceMetadata(_steps) {\n _super.call(this);\n this._steps = _steps;\n }\n Object.defineProperty(AnimationSequenceMetadata.prototype, \"steps\", {\n /**\n * @return {?}\n */\n get: function () { return this._steps; },\n enumerable: true,\n configurable: true\n });\n return AnimationSequenceMetadata;\n }(AnimationWithStepsMetadata));\n /**\n * Metadata representing the entry of animations.\n * Instances of this class are provided via the animation DSL when the {@link group group animation\n * function} is called.\n * *\n */\n var AnimationGroupMetadata = (function (_super) {\n __extends$13(AnimationGroupMetadata, _super);\n /**\n * @param {?} _steps\n */\n function AnimationGroupMetadata(_steps) {\n _super.call(this);\n this._steps = _steps;\n }\n Object.defineProperty(AnimationGroupMetadata.prototype, \"steps\", {\n /**\n * @return {?}\n */\n get: function () { return this._steps; },\n enumerable: true,\n configurable: true\n });\n return AnimationGroupMetadata;\n }(AnimationWithStepsMetadata));\n /**\n * `animate` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `animate` specifies an animation step that will apply the provided `styles` data for a given\n * amount of\n * time based on the provided `timing` expression value. Calls to `animate` are expected to be\n * used within {@link sequence an animation sequence}, {@link group group}, or {@link transition\n * transition}.\n * *\n * ### Usage\n * *\n * The `animate` function accepts two input parameters: `timing` and `styles`:\n * *\n * - `timing` is a string based value that can be a combination of a duration with optional\n * delay and easing values. The format for the expression breaks down to `duration delay easing`\n * (therefore a value such as `1s 100ms ease-out` will be parse itself into `duration=1000,\n * delay=100, easing=ease-out`.\n * If a numeric value is provided then that will be used as the `duration` value in millisecond\n * form.\n * - `styles` is the style input data which can either be a call to {@link style style} or {@link\n * keyframes keyframes}.\n * If left empty then the styles from the destination state will be collected and used (this is\n * useful when\n * describing an animation step that will complete an animation by {@link\n * transition#the-final-animate-call animating to the final state}).\n * *\n * ```typescript\n * // various functions for specifying timing data\n * animate(500, style(...))\n * animate(\"1s\", style(...))\n * animate(\"100ms 0.5s\", style(...))\n * animate(\"5s ease\", style(...))\n * animate(\"5s 10ms cubic-bezier(.17,.67,.88,.1)\", style(...))\n * *\n * // either style() of keyframes() can be used\n * animate(500, style({ background: \"red\" }))\n * animate(500, keyframes([\n * style({ background: \"blue\" })),\n * style({ background: \"red\" }))\n * ])\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} timing\n * @param {?=} styles\n * @return {?}\n */\n function animate(timing, styles) {\n if (styles === void 0) { styles = null; }\n var /** @type {?} */ stylesEntry = styles;\n if (!isPresent(stylesEntry)) {\n var /** @type {?} */ EMPTY_STYLE = {};\n stylesEntry = new AnimationStyleMetadata([EMPTY_STYLE], 1);\n }\n return new AnimationAnimateMetadata(timing, stylesEntry);\n }\n /**\n * `group` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `group` specifies a list of animation steps that are all run in parallel. Grouped animations\n * are useful when a series of styles must be animated/closed off\n * at different statrting/ending times.\n * *\n * The `group` function can either be used within a {@link sequence sequence} or a {@link transition\n * transition}\n * and it will only continue to the next instruction once all of the inner animation steps\n * have completed.\n * *\n * ### Usage\n * *\n * The `steps` data that is passed into the `group` animation function can either consist\n * of {@link style style} or {@link animate animate} function calls. Each call to `style()` or\n * `animate()`\n * within a group will be executed instantly (use {@link keyframes keyframes} or a\n * {@link animate#usage animate() with a delay value} to offset styles to be applied at a later\n * time).\n * *\n * ```typescript\n * group([\n * animate(\"1s\", { background: \"black\" }))\n * animate(\"2s\", { color: \"white\" }))\n * ])\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} steps\n * @return {?}\n */\n function group(steps) {\n return new AnimationGroupMetadata(steps);\n }\n /**\n * `sequence` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `sequence` Specifies a list of animation steps that are run one by one. (`sequence` is used\n * by default when an array is passed as animation data into {@link transition transition}.)\n * *\n * The `sequence` function can either be used within a {@link group group} or a {@link transition\n * transition}\n * and it will only continue to the next instruction once each of the inner animation steps\n * have completed.\n * *\n * To perform animation styling in parallel with other animation steps then\n * have a look at the {@link group group} animation function.\n * *\n * ### Usage\n * *\n * The `steps` data that is passed into the `sequence` animation function can either consist\n * of {@link style style} or {@link animate animate} function calls. A call to `style()` will apply\n * the\n * provided styling data immediately while a call to `animate()` will apply its styling\n * data over a given time depending on its timing data.\n * *\n * ```typescript\n * sequence([\n * style({ opacity: 0 })),\n * animate(\"1s\", { opacity: 1 }))\n * ])\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} steps\n * @return {?}\n */\n function sequence(steps) {\n return new AnimationSequenceMetadata(steps);\n }\n /**\n * `style` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `style` declares a key/value object containing CSS properties/styles that can then\n * be used for {@link state animation states}, within an {@link sequence animation sequence}, or as\n * styling data for both {@link animate animate} and {@link keyframes keyframes}.\n * *\n * ### Usage\n * *\n * `style` takes in a key/value string map as data and expects one or more CSS property/value\n * pairs to be defined.\n * *\n * ```typescript\n * // string values are used for css properties\n * style({ background: \"red\", color: \"blue\" })\n * *\n * // numerical (pixel) values are also supported\n * style({ width: 100, height: 0 })\n * ```\n * *\n * #### Auto-styles (using `*`)\n * *\n * When an asterix (`*`) character is used as a value then it will be detected from the element\n * being animated\n * and applied as animation data when the animation starts.\n * *\n * This feature proves useful for a state depending on layout and/or environment factors; in such\n * cases\n * the styles are calculated just before the animation starts.\n * *\n * ```typescript\n * // the steps below will animate from 0 to the\n * // actual height of the element\n * style({ height: 0 }),\n * animate(\"1s\", style({ height: \"*\" }))\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} tokens\n * @return {?}\n */\n function style(tokens) {\n var /** @type {?} */ input;\n var /** @type {?} */ offset = null;\n if (typeof tokens === 'string') {\n input = [(tokens)];\n }\n else {\n if (Array.isArray(tokens)) {\n input = (tokens);\n }\n else {\n input = [(tokens)];\n }\n input.forEach(function (entry) {\n var /** @type {?} */ entryOffset = ((entry) /** TODO #9100 */)['offset'];\n if (isPresent(entryOffset)) {\n offset = offset == null ? parseFloat(entryOffset) : offset;\n }\n });\n }\n return new AnimationStyleMetadata(input, offset);\n }\n /**\n * `state` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `state` declares an animation state within the given trigger. When a state is\n * active within a component then its associated styles will persist on\n * the element that the trigger is attached to (even when the animation ends).\n * *\n * To animate between states, have a look at the animation {@link transition transition}\n * DSL function. To register states to an animation trigger please have a look\n * at the {@link trigger trigger} function.\n * *\n * #### The `void` state\n * *\n * The `void` state value is a reserved word that angular uses to determine when the element is not\n * apart\n * of the application anymore (e.g. when an `ngIf` evaluates to false then the state of the\n * associated element\n * is void).\n * *\n * #### The `*` (default) state\n * *\n * The `*` state (when styled) is a fallback state that will be used if\n * the state that is being animated is not declared within the trigger.\n * *\n * ### Usage\n * *\n * `state` will declare an animation state with its associated styles\n * within the given trigger.\n * *\n * - `stateNameExpr` can be one or more state names separated by commas.\n * - `styles` refers to the {@link style styling data} that will be persisted on the element once\n * the state\n * has been reached.\n * *\n * ```typescript\n * // \"void\" is a reserved name for a state and is used to represent\n * // the state in which an element is detached from from the application.\n * state(\"void\", style({ height: 0 }))\n * *\n * // user-defined states\n * state(\"closed\", style({ height: 0 }))\n * state(\"open, visible\", style({ height: \"*\" }))\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} stateNameExpr\n * @param {?} styles\n * @return {?}\n */\n function state(stateNameExpr, styles) {\n return new AnimationStateDeclarationMetadata(stateNameExpr, styles);\n }\n /**\n * `keyframes` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `keyframes` specifies a collection of {@link style style} entries each optionally characterized\n * by an `offset` value.\n * *\n * ### Usage\n * *\n * The `keyframes` animation function is designed to be used alongside the {@link animate animate}\n * animation function. Instead of applying animations from where they are\n * currently to their destination, keyframes can describe how each style entry is applied\n * and at what point within the animation arc (much like CSS Keyframe Animations do).\n * *\n * For each `style()` entry an `offset` value can be set. Doing so allows to specifiy at\n * what percentage of the animate time the styles will be applied.\n * *\n * ```typescript\n * // the provided offset values describe when each backgroundColor value is applied.\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\", offset: 0 }),\n * style({ backgroundColor: \"blue\", offset: 0.2 }),\n * style({ backgroundColor: \"orange\", offset: 0.3 }),\n * style({ backgroundColor: \"black\", offset: 1 })\n * ]))\n * ```\n * *\n * Alternatively, if there are no `offset` values used within the style entries then the offsets\n * will\n * be calculated automatically.\n * *\n * ```typescript\n * animate(\"5s\", keyframes([\n * style({ backgroundColor: \"red\" }) // offset = 0\n * style({ backgroundColor: \"blue\" }) // offset = 0.33\n * style({ backgroundColor: \"orange\" }) // offset = 0.66\n * style({ backgroundColor: \"black\" }) // offset = 1\n * ]))\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} steps\n * @return {?}\n */\n function keyframes(steps) {\n return new AnimationKeyframesSequenceMetadata(steps);\n }\n /**\n * `transition` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `transition` declares the {@link sequence sequence of animation steps} that will be run when the\n * provided\n * `stateChangeExpr` value is satisfied. The `stateChangeExpr` consists of a `state1 => state2`\n * which consists\n * of two known states (use an asterix (`*`) to refer to a dynamic starting and/or ending state).\n * *\n * Animation transitions are placed within an {@link trigger animation trigger}. For an transition\n * to animate to\n * a state value and persist its styles then one or more {@link state animation states} is expected\n * to be defined.\n * *\n * ### Usage\n * *\n * An animation transition is kicked off the `stateChangeExpr` predicate evaluates to true based on\n * what the\n * previous state is and what the current state has become. In other words, if a transition is\n * defined that\n * matches the old/current state criteria then the associated animation will be triggered.\n * *\n * ```typescript\n * // all transition/state changes are defined within an animation trigger\n * trigger(\"myAnimationTrigger\", [\n * // if a state is defined then its styles will be persisted when the\n * // animation has fully completed itself\n * state(\"on\", style({ background: \"green\" })),\n * state(\"off\", style({ background: \"grey\" })),\n * *\n * // a transition animation that will be kicked off when the state value\n * // bound to \"myAnimationTrigger\" changes from \"on\" to \"off\"\n * transition(\"on => off\", animate(500)),\n * *\n * // it is also possible to do run the same animation for both directions\n * transition(\"on <=> off\", animate(500)),\n * *\n * // or to define multiple states pairs separated by commas\n * transition(\"on => off, off => void\", animate(500)),\n * *\n * // this is a catch-all state change for when an element is inserted into\n * // the page and the destination state is unknown\n * transition(\"void => *\", [\n * style({ opacity: 0 }),\n * animate(500)\n * ]),\n * *\n * // this will capture a state change between any states\n * transition(\"* => *\", animate(\"1s 0s\")),\n * ])\n * ```\n * *\n * The template associated with this component will make use of the `myAnimationTrigger`\n * animation trigger by binding to an element within its template code.\n * *\n * ```html\n * <!-- somewhere inside of my-component-tpl.html -->\n * <div [@myAnimationTrigger]=\"myStatusExp\">...</div>\n * ```\n * *\n * #### The final `animate` call\n * *\n * If the final step within the transition steps is a call to `animate()` that **only**\n * uses a timing value with **no style data** then it will be automatically used as the final\n * animation\n * arc for the element to animate itself to the final state. This involves an automatic mix of\n * adding/removing CSS styles so that the element will be in the exact state it should be for the\n * applied state to be presented correctly.\n * *\n * ```\n * // start off by hiding the element, but make sure that it animates properly to whatever state\n * // is currently active for \"myAnimationTrigger\"\n * transition(\"void => *\", [\n * style({ opacity: 0 }),\n * animate(500)\n * ])\n * ```\n * *\n * ### Transition Aliases (`:enter` and `:leave`)\n * *\n * Given that enter (insertion) and leave (removal) animations are so common,\n * the `transition` function accepts both `:enter` and `:leave` values which\n * are aliases for the `void => *` and `* => void` state changes.\n * *\n * ```\n * transition(\":enter\", [\n * style({ opacity: 0 }),\n * animate(500, style({ opacity: 1 }))\n * ])\n * transition(\":leave\", [\n * animate(500, style({ opacity: 0 }))\n * ])\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} stateChangeExpr\n * @param {?} steps\n * @return {?}\n */\n function transition(stateChangeExpr, steps) {\n var /** @type {?} */ animationData = Array.isArray(steps) ? new AnimationSequenceMetadata(steps) : steps;\n return new AnimationStateTransitionMetadata(stateChangeExpr, animationData);\n }\n /**\n * `trigger` is an animation-specific function that is designed to be used inside of Angular2's\n * animation\n * DSL language. If this information is new, please navigate to the\n * {@link Component#animations-anchor component animations metadata\n * page} to gain a better understanding of how animations in Angular2 are used.\n * *\n * `trigger` Creates an animation trigger which will a list of {@link state state} and {@link\n * transition transition}\n * entries that will be evaluated when the expression bound to the trigger changes.\n * *\n * Triggers are registered within the component annotation data under the\n * {@link Component#animations-anchor animations section}. An animation trigger can\n * be placed on an element within a template by referencing the name of the\n * trigger followed by the expression value that the trigger is bound to\n * (in the form of `[@triggerName]=\"expression\"`.\n * *\n * ### Usage\n * *\n * `trigger` will create an animation trigger reference based on the provided `name` value.\n * The provided `animation` value is expected to be an array consisting of {@link state state} and\n * {@link transition transition}\n * declarations.\n * *\n * ```typescript\n * selector: 'my-component',\n * templateUrl: 'my-component-tpl.html',\n * animations: [\n * trigger(\"myAnimationTrigger\", [\n * state(...),\n * state(...),\n * transition(...),\n * transition(...)\n * ])\n * ]\n * })\n * class MyComponent {\n * myStatusExp = \"something\";\n * }\n * ```\n * *\n * The template associated with this component will make use of the `myAnimationTrigger`\n * animation trigger by binding to an element within its template code.\n * *\n * ```html\n * <!-- somewhere inside of my-component-tpl.html -->\n * <div [@myAnimationTrigger]=\"myStatusExp\">...</div>\n * ```\n * *\n * ### Example ([live demo](http://plnkr.co/edit/Kez8XGWBxWue7qP7nNvF?p=preview))\n * *\n * {@example core/animation/ts/dsl/animation_example.ts region='Component'}\n * *\n * @param {?} name\n * @param {?} animation\n * @return {?}\n */\n function trigger(name, animation) {\n return new AnimationEntryMetadata(name, animation);\n }\n\n /**\n * @param {?} previousStyles\n * @param {?} newStyles\n * @param {?=} nullValue\n * @return {?}\n */\n function prepareFinalAnimationStyles(previousStyles, newStyles, nullValue) {\n if (nullValue === void 0) { nullValue = null; }\n var /** @type {?} */ finalStyles = {};\n Object.keys(newStyles).forEach(function (prop) {\n var /** @type {?} */ value = newStyles[prop];\n finalStyles[prop] = value == AUTO_STYLE ? nullValue : value.toString();\n });\n Object.keys(previousStyles).forEach(function (prop) {\n if (!isPresent(finalStyles[prop])) {\n finalStyles[prop] = nullValue;\n }\n });\n return finalStyles;\n }\n /**\n * @param {?} collectedStyles\n * @param {?} finalStateStyles\n * @param {?} keyframes\n * @return {?}\n */\n function balanceAnimationKeyframes(collectedStyles, finalStateStyles, keyframes) {\n var /** @type {?} */ limit = keyframes.length - 1;\n var /** @type {?} */ firstKeyframe = keyframes[0];\n // phase 1: copy all the styles from the first keyframe into the lookup map\n var /** @type {?} */ flatenedFirstKeyframeStyles = flattenStyles(firstKeyframe.styles.styles);\n var /** @type {?} */ extraFirstKeyframeStyles = {};\n var /** @type {?} */ hasExtraFirstStyles = false;\n Object.keys(collectedStyles).forEach(function (prop) {\n var /** @type {?} */ value = (collectedStyles[prop]);\n // if the style is already defined in the first keyframe then\n // we do not replace it.\n if (!flatenedFirstKeyframeStyles[prop]) {\n flatenedFirstKeyframeStyles[prop] = value;\n extraFirstKeyframeStyles[prop] = value;\n hasExtraFirstStyles = true;\n }\n });\n var /** @type {?} */ keyframeCollectedStyles = StringMapWrapper.merge({}, flatenedFirstKeyframeStyles);\n // phase 2: normalize the final keyframe\n var /** @type {?} */ finalKeyframe = keyframes[limit];\n finalKeyframe.styles.styles.unshift(finalStateStyles);\n var /** @type {?} */ flatenedFinalKeyframeStyles = flattenStyles(finalKeyframe.styles.styles);\n var /** @type {?} */ extraFinalKeyframeStyles = {};\n var /** @type {?} */ hasExtraFinalStyles = false;\n Object.keys(keyframeCollectedStyles).forEach(function (prop) {\n if (!isPresent(flatenedFinalKeyframeStyles[prop])) {\n extraFinalKeyframeStyles[prop] = AUTO_STYLE;\n hasExtraFinalStyles = true;\n }\n });\n if (hasExtraFinalStyles) {\n finalKeyframe.styles.styles.push(extraFinalKeyframeStyles);\n }\n Object.keys(flatenedFinalKeyframeStyles).forEach(function (prop) {\n if (!isPresent(flatenedFirstKeyframeStyles[prop])) {\n extraFirstKeyframeStyles[prop] = AUTO_STYLE;\n hasExtraFirstStyles = true;\n }\n });\n if (hasExtraFirstStyles) {\n firstKeyframe.styles.styles.push(extraFirstKeyframeStyles);\n }\n collectAndResolveStyles(collectedStyles, [finalStateStyles]);\n return keyframes;\n }\n /**\n * @param {?} styles\n * @return {?}\n */\n function clearStyles(styles) {\n var /** @type {?} */ finalStyles = {};\n Object.keys(styles).forEach(function (key) { finalStyles[key] = null; });\n return finalStyles;\n }\n /**\n * @param {?} collection\n * @param {?} styles\n * @return {?}\n */\n function collectAndResolveStyles(collection, styles) {\n return styles.map(function (entry) {\n var /** @type {?} */ stylesObj = {};\n Object.keys(entry).forEach(function (prop) {\n var /** @type {?} */ value = entry[prop];\n if (value == FILL_STYLE_FLAG) {\n value = collection[prop];\n if (!isPresent(value)) {\n value = AUTO_STYLE;\n }\n }\n collection[prop] = value;\n stylesObj[prop] = value;\n });\n return stylesObj;\n });\n }\n /**\n * @param {?} element\n * @param {?} renderer\n * @param {?} styles\n * @return {?}\n */\n function renderStyles(element, renderer, styles) {\n Object.keys(styles).forEach(function (prop) { renderer.setElementStyle(element, prop, styles[prop]); });\n }\n /**\n * @param {?} styles\n * @return {?}\n */\n function flattenStyles(styles) {\n var /** @type {?} */ finalStyles = {};\n styles.forEach(function (entry) {\n Object.keys(entry).forEach(function (prop) { finalStyles[prop] = (entry[prop]); });\n });\n return finalStyles;\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var AnimationStyles = (function () {\n /**\n * @param {?} styles\n */\n function AnimationStyles(styles) {\n this.styles = styles;\n }\n return AnimationStyles;\n }());\n\n /**\n * An instance of this class is returned as an event parameter when an animation\n * callback is captured for an animation either during the start or done phase.\n * *\n * ```typescript\n * host: {\n * '[@myAnimationTrigger]': 'someExpression',\n * '(@myAnimationTrigger.start)': 'captureStartEvent($event)',\n * '(@myAnimationTrigger.done)': 'captureDoneEvent($event)',\n * },\n * animations: [\n * trigger(\"myAnimationTrigger\", [\n * // ...\n * ])\n * ]\n * })\n * class MyComponent {\n * someExpression: any = false;\n * captureStartEvent(event: AnimationTransitionEvent) {\n * // the toState, fromState and totalTime data is accessible from the event variable\n * }\n * *\n * captureDoneEvent(event: AnimationTransitionEvent) {\n * // the toState, fromState and totalTime data is accessible from the event variable\n * }\n * }\n * ```\n * *\n */\n var AnimationTransitionEvent = (function () {\n /**\n * @param {?} __0\n */\n function AnimationTransitionEvent(_a) {\n var fromState = _a.fromState, toState = _a.toState, totalTime = _a.totalTime, phaseName = _a.phaseName;\n this.fromState = fromState;\n this.toState = toState;\n this.totalTime = totalTime;\n this.phaseName = phaseName;\n }\n return AnimationTransitionEvent;\n }());\n\n var AnimationTransition = (function () {\n /**\n * @param {?} _player\n * @param {?} _fromState\n * @param {?} _toState\n * @param {?} _totalTime\n */\n function AnimationTransition(_player, _fromState, _toState, _totalTime) {\n this._player = _player;\n this._fromState = _fromState;\n this._toState = _toState;\n this._totalTime = _totalTime;\n }\n /**\n * @param {?} phaseName\n * @return {?}\n */\n AnimationTransition.prototype._createEvent = function (phaseName) {\n return new AnimationTransitionEvent({\n fromState: this._fromState,\n toState: this._toState,\n totalTime: this._totalTime,\n phaseName: phaseName\n });\n };\n /**\n * @param {?} callback\n * @return {?}\n */\n AnimationTransition.prototype.onStart = function (callback) {\n var _this = this;\n var /** @type {?} */ fn = (Zone.current.wrap(function () { return callback(_this._createEvent('start')); }, 'player.onStart'));\n this._player.onStart(fn);\n };\n /**\n * @param {?} callback\n * @return {?}\n */\n AnimationTransition.prototype.onDone = function (callback) {\n var _this = this;\n var /** @type {?} */ fn = (Zone.current.wrap(function () { return callback(_this._createEvent('done')); }, 'player.onDone'));\n this._player.onDone(fn);\n };\n return AnimationTransition;\n }());\n\n var DebugDomRootRenderer = (function () {\n /**\n * @param {?} _delegate\n */\n function DebugDomRootRenderer(_delegate) {\n this._delegate = _delegate;\n }\n /**\n * @param {?} componentProto\n * @return {?}\n */\n DebugDomRootRenderer.prototype.renderComponent = function (componentProto) {\n return new DebugDomRenderer(this._delegate.renderComponent(componentProto));\n };\n return DebugDomRootRenderer;\n }());\n var DebugDomRenderer = (function () {\n /**\n * @param {?} _delegate\n */\n function DebugDomRenderer(_delegate) {\n this._delegate = _delegate;\n }\n /**\n * @param {?} selectorOrNode\n * @param {?=} debugInfo\n * @return {?}\n */\n DebugDomRenderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) {\n var /** @type {?} */ nativeEl = this._delegate.selectRootElement(selectorOrNode, debugInfo);\n var /** @type {?} */ debugEl = new DebugElement(nativeEl, null, debugInfo);\n indexDebugNode(debugEl);\n return nativeEl;\n };\n /**\n * @param {?} parentElement\n * @param {?} name\n * @param {?=} debugInfo\n * @return {?}\n */\n DebugDomRenderer.prototype.createElement = function (parentElement, name, debugInfo) {\n var /** @type {?} */ nativeEl = this._delegate.createElement(parentElement, name, debugInfo);\n var /** @type {?} */ debugEl = new DebugElement(nativeEl, getDebugNode(parentElement), debugInfo);\n debugEl.name = name;\n indexDebugNode(debugEl);\n return nativeEl;\n };\n /**\n * @param {?} hostElement\n * @return {?}\n */\n DebugDomRenderer.prototype.createViewRoot = function (hostElement) { return this._delegate.createViewRoot(hostElement); };\n /**\n * @param {?} parentElement\n * @param {?=} debugInfo\n * @return {?}\n */\n DebugDomRenderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) {\n var /** @type {?} */ comment = this._delegate.createTemplateAnchor(parentElement, debugInfo);\n var /** @type {?} */ debugEl = new DebugNode(comment, getDebugNode(parentElement), debugInfo);\n indexDebugNode(debugEl);\n return comment;\n };\n /**\n * @param {?} parentElement\n * @param {?} value\n * @param {?=} debugInfo\n * @return {?}\n */\n DebugDomRenderer.prototype.createText = function (parentElement, value, debugInfo) {\n var /** @type {?} */ text = this._delegate.createText(parentElement, value, debugInfo);\n var /** @type {?} */ debugEl = new DebugNode(text, getDebugNode(parentElement), debugInfo);\n indexDebugNode(debugEl);\n return text;\n };\n /**\n * @param {?} parentElement\n * @param {?} nodes\n * @return {?}\n */\n DebugDomRenderer.prototype.projectNodes = function (parentElement, nodes) {\n var /** @type {?} */ debugParent = getDebugNode(parentElement);\n if (isPresent(debugParent) && debugParent instanceof DebugElement) {\n var /** @type {?} */ debugElement_1 = debugParent;\n nodes.forEach(function (node) { debugElement_1.addChild(getDebugNode(node)); });\n }\n this._delegate.projectNodes(parentElement, nodes);\n };\n /**\n * @param {?} node\n * @param {?} viewRootNodes\n * @return {?}\n */\n DebugDomRenderer.prototype.attachViewAfter = function (node, viewRootNodes) {\n var /** @type {?} */ debugNode = getDebugNode(node);\n if (isPresent(debugNode)) {\n var /** @type {?} */ debugParent = debugNode.parent;\n if (viewRootNodes.length > 0 && isPresent(debugParent)) {\n var /** @type {?} */ debugViewRootNodes_1 = [];\n viewRootNodes.forEach(function (rootNode) { return debugViewRootNodes_1.push(getDebugNode(rootNode)); });\n debugParent.insertChildrenAfter(debugNode, debugViewRootNodes_1);\n }\n }\n this._delegate.attachViewAfter(node, viewRootNodes);\n };\n /**\n * @param {?} viewRootNodes\n * @return {?}\n */\n DebugDomRenderer.prototype.detachView = function (viewRootNodes) {\n viewRootNodes.forEach(function (node) {\n var /** @type {?} */ debugNode = getDebugNode(node);\n if (isPresent(debugNode) && isPresent(debugNode.parent)) {\n debugNode.parent.removeChild(debugNode);\n }\n });\n this._delegate.detachView(viewRootNodes);\n };\n /**\n * @param {?} hostElement\n * @param {?} viewAllNodes\n * @return {?}\n */\n DebugDomRenderer.prototype.destroyView = function (hostElement, viewAllNodes) {\n viewAllNodes = viewAllNodes || [];\n viewAllNodes.forEach(function (node) { removeDebugNodeFromIndex(getDebugNode(node)); });\n this._delegate.destroyView(hostElement, viewAllNodes);\n };\n /**\n * @param {?} renderElement\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n DebugDomRenderer.prototype.listen = function (renderElement, name, callback) {\n var /** @type {?} */ debugEl = getDebugNode(renderElement);\n if (isPresent(debugEl)) {\n debugEl.listeners.push(new EventListener(name, callback));\n }\n return this._delegate.listen(renderElement, name, callback);\n };\n /**\n * @param {?} target\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n DebugDomRenderer.prototype.listenGlobal = function (target, name, callback) {\n return this._delegate.listenGlobal(target, name, callback);\n };\n /**\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n DebugDomRenderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) {\n var /** @type {?} */ debugEl = getDebugNode(renderElement);\n if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n debugEl.properties[propertyName] = propertyValue;\n }\n this._delegate.setElementProperty(renderElement, propertyName, propertyValue);\n };\n /**\n * @param {?} renderElement\n * @param {?} attributeName\n * @param {?} attributeValue\n * @return {?}\n */\n DebugDomRenderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) {\n var /** @type {?} */ debugEl = getDebugNode(renderElement);\n if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n debugEl.attributes[attributeName] = attributeValue;\n }\n this._delegate.setElementAttribute(renderElement, attributeName, attributeValue);\n };\n /**\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n DebugDomRenderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) {\n this._delegate.setBindingDebugInfo(renderElement, propertyName, propertyValue);\n };\n /**\n * @param {?} renderElement\n * @param {?} className\n * @param {?} isAdd\n * @return {?}\n */\n DebugDomRenderer.prototype.setElementClass = function (renderElement, className, isAdd) {\n var /** @type {?} */ debugEl = getDebugNode(renderElement);\n if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n debugEl.classes[className] = isAdd;\n }\n this._delegate.setElementClass(renderElement, className, isAdd);\n };\n /**\n * @param {?} renderElement\n * @param {?} styleName\n * @param {?} styleValue\n * @return {?}\n */\n DebugDomRenderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) {\n var /** @type {?} */ debugEl = getDebugNode(renderElement);\n if (isPresent(debugEl) && debugEl instanceof DebugElement) {\n debugEl.styles[styleName] = styleValue;\n }\n this._delegate.setElementStyle(renderElement, styleName, styleValue);\n };\n /**\n * @param {?} renderElement\n * @param {?} methodName\n * @param {?=} args\n * @return {?}\n */\n DebugDomRenderer.prototype.invokeElementMethod = function (renderElement, methodName, args) {\n this._delegate.invokeElementMethod(renderElement, methodName, args);\n };\n /**\n * @param {?} renderNode\n * @param {?} text\n * @return {?}\n */\n DebugDomRenderer.prototype.setText = function (renderNode, text) { this._delegate.setText(renderNode, text); };\n /**\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n DebugDomRenderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n if (previousPlayers === void 0) { previousPlayers = []; }\n return this._delegate.animate(element, startingStyles, keyframes, duration, delay, easing, previousPlayers);\n };\n return DebugDomRenderer;\n }());\n\n var ViewType = {};\n ViewType.HOST = 0;\n ViewType.COMPONENT = 1;\n ViewType.EMBEDDED = 2;\n ViewType[ViewType.HOST] = \"HOST\";\n ViewType[ViewType.COMPONENT] = \"COMPONENT\";\n ViewType[ViewType.EMBEDDED] = \"EMBEDDED\";\n\n var StaticNodeDebugInfo = (function () {\n /**\n * @param {?} providerTokens\n * @param {?} componentToken\n * @param {?} refTokens\n */\n function StaticNodeDebugInfo(providerTokens, componentToken, refTokens) {\n this.providerTokens = providerTokens;\n this.componentToken = componentToken;\n this.refTokens = refTokens;\n }\n return StaticNodeDebugInfo;\n }());\n var DebugContext = (function () {\n /**\n * @param {?} _view\n * @param {?} _nodeIndex\n * @param {?} _tplRow\n * @param {?} _tplCol\n */\n function DebugContext(_view, _nodeIndex, _tplRow, _tplCol) {\n this._view = _view;\n this._nodeIndex = _nodeIndex;\n this._tplRow = _tplRow;\n this._tplCol = _tplCol;\n }\n Object.defineProperty(DebugContext.prototype, \"_staticNodeInfo\", {\n /**\n * @return {?}\n */\n get: function () {\n return isPresent(this._nodeIndex) ? this._view.staticNodeDebugInfos[this._nodeIndex] : null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"context\", {\n /**\n * @return {?}\n */\n get: function () { return this._view.context; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"component\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n if (isPresent(staticNodeInfo) && isPresent(staticNodeInfo.componentToken)) {\n return this.injector.get(staticNodeInfo.componentToken);\n }\n return null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"componentRenderElement\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ componentView = this._view;\n while (isPresent(componentView.parentView) && componentView.type !== ViewType.COMPONENT) {\n componentView = (componentView.parentView);\n }\n return componentView.parentElement;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this._view.injector(this._nodeIndex); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"renderNode\", {\n /**\n * @return {?}\n */\n get: function () {\n if (isPresent(this._nodeIndex) && this._view.allNodes) {\n return this._view.allNodes[this._nodeIndex];\n }\n else {\n return null;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"providerTokens\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n return isPresent(staticNodeInfo) ? staticNodeInfo.providerTokens : null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"source\", {\n /**\n * @return {?}\n */\n get: function () {\n return this._view.componentType.templateUrl + \":\" + this._tplRow + \":\" + this._tplCol;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DebugContext.prototype, \"references\", {\n /**\n * @return {?}\n */\n get: function () {\n var _this = this;\n var /** @type {?} */ varValues = {};\n var /** @type {?} */ staticNodeInfo = this._staticNodeInfo;\n if (isPresent(staticNodeInfo)) {\n var /** @type {?} */ refs_1 = staticNodeInfo.refTokens;\n Object.keys(refs_1).forEach(function (refName) {\n var /** @type {?} */ refToken = refs_1[refName];\n var /** @type {?} */ varValue;\n if (isBlank(refToken)) {\n varValue = _this._view.allNodes ? _this._view.allNodes[_this._nodeIndex] : null;\n }\n else {\n varValue = _this._view.injectorGet(refToken, _this._nodeIndex, null);\n }\n varValues[refName] = varValue;\n });\n }\n return varValues;\n },\n enumerable: true,\n configurable: true\n });\n return DebugContext;\n }());\n\n var ViewAnimationMap = (function () {\n function ViewAnimationMap() {\n this._map = new Map();\n this._allPlayers = [];\n }\n /**\n * @param {?} element\n * @param {?} animationName\n * @return {?}\n */\n ViewAnimationMap.prototype.find = function (element, animationName) {\n var /** @type {?} */ playersByAnimation = this._map.get(element);\n if (isPresent(playersByAnimation)) {\n return playersByAnimation[animationName];\n }\n };\n /**\n * @param {?} element\n * @return {?}\n */\n ViewAnimationMap.prototype.findAllPlayersByElement = function (element) {\n var /** @type {?} */ el = this._map.get(element);\n return el ? Object.keys(el).map(function (k) { return el[k]; }) : [];\n };\n /**\n * @param {?} element\n * @param {?} animationName\n * @param {?} player\n * @return {?}\n */\n ViewAnimationMap.prototype.set = function (element, animationName, player) {\n var /** @type {?} */ playersByAnimation = this._map.get(element);\n if (!isPresent(playersByAnimation)) {\n playersByAnimation = {};\n }\n var /** @type {?} */ existingEntry = playersByAnimation[animationName];\n if (isPresent(existingEntry)) {\n this.remove(element, animationName);\n }\n playersByAnimation[animationName] = player;\n this._allPlayers.push(player);\n this._map.set(element, playersByAnimation);\n };\n /**\n * @return {?}\n */\n ViewAnimationMap.prototype.getAllPlayers = function () { return this._allPlayers; };\n /**\n * @param {?} element\n * @param {?} animationName\n * @param {?=} targetPlayer\n * @return {?}\n */\n ViewAnimationMap.prototype.remove = function (element, animationName, targetPlayer) {\n if (targetPlayer === void 0) { targetPlayer = null; }\n var /** @type {?} */ playersByAnimation = this._map.get(element);\n if (playersByAnimation) {\n var /** @type {?} */ player = playersByAnimation[animationName];\n if (!targetPlayer || player === targetPlayer) {\n delete playersByAnimation[animationName];\n var /** @type {?} */ index = this._allPlayers.indexOf(player);\n this._allPlayers.splice(index, 1);\n if (Object.keys(playersByAnimation).length === 0) {\n this._map.delete(element);\n }\n }\n }\n };\n return ViewAnimationMap;\n }());\n\n var AnimationViewContext = (function () {\n /**\n * @param {?} _animationQueue\n */\n function AnimationViewContext(_animationQueue) {\n this._animationQueue = _animationQueue;\n this._players = new ViewAnimationMap();\n }\n /**\n * @param {?} callback\n * @return {?}\n */\n AnimationViewContext.prototype.onAllActiveAnimationsDone = function (callback) {\n var /** @type {?} */ activeAnimationPlayers = this._players.getAllPlayers();\n // we check for the length to avoid having GroupAnimationPlayer\n // issue an unnecessary microtask when zero players are passed in\n if (activeAnimationPlayers.length) {\n new AnimationGroupPlayer(activeAnimationPlayers).onDone(function () { return callback(); });\n }\n else {\n callback();\n }\n };\n /**\n * @param {?} element\n * @param {?} animationName\n * @param {?} player\n * @return {?}\n */\n AnimationViewContext.prototype.queueAnimation = function (element, animationName, player) {\n var _this = this;\n this._animationQueue.enqueue(player);\n this._players.set(element, animationName, player);\n player.onDone(function () { return _this._players.remove(element, animationName, player); });\n };\n /**\n * @param {?} element\n * @param {?=} animationName\n * @return {?}\n */\n AnimationViewContext.prototype.getAnimationPlayers = function (element, animationName) {\n if (animationName === void 0) { animationName = null; }\n var /** @type {?} */ players = [];\n if (animationName) {\n var /** @type {?} */ currentPlayer = this._players.find(element, animationName);\n if (currentPlayer) {\n _recursePlayers(currentPlayer, players);\n }\n }\n else {\n this._players.findAllPlayersByElement(element).forEach(function (player) { return _recursePlayers(player, players); });\n }\n return players;\n };\n return AnimationViewContext;\n }());\n /**\n * @param {?} player\n * @param {?} collectedPlayers\n * @return {?}\n */\n function _recursePlayers(player, collectedPlayers) {\n if ((player instanceof AnimationGroupPlayer) || (player instanceof AnimationSequencePlayer)) {\n player.players.forEach(function (player) { return _recursePlayers(player, collectedPlayers); });\n }\n else {\n collectedPlayers.push(player);\n }\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$15 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var ElementInjector = (function (_super) {\n __extends$15(ElementInjector, _super);\n /**\n * @param {?} _view\n * @param {?} _nodeIndex\n */\n function ElementInjector(_view, _nodeIndex) {\n _super.call(this);\n this._view = _view;\n this._nodeIndex = _nodeIndex;\n }\n /**\n * @param {?} token\n * @param {?=} notFoundValue\n * @return {?}\n */\n ElementInjector.prototype.get = function (token, notFoundValue) {\n if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n return this._view.injectorGet(token, this._nodeIndex, notFoundValue);\n };\n return ElementInjector;\n }(Injector));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$14 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ _scope_check = wtfCreateScope(\"AppView#check(ascii id)\");\n /**\n * @experimental\n */\n var /** @type {?} */ EMPTY_CONTEXT$1 = new Object();\n var /** @type {?} */ UNDEFINED$1 = new Object();\n /**\n * Cost of making objects: http://jsperf.com/instantiate-size-of-object\n * *\n * @abstract\n */\n var AppView = (function () {\n /**\n * @param {?} clazz\n * @param {?} componentType\n * @param {?} type\n * @param {?} viewUtils\n * @param {?} parentView\n * @param {?} parentIndex\n * @param {?} parentElement\n * @param {?} cdMode\n * @param {?=} declaredViewContainer\n */\n function AppView(clazz, componentType, type, viewUtils, parentView, parentIndex, parentElement, cdMode, declaredViewContainer) {\n if (declaredViewContainer === void 0) { declaredViewContainer = null; }\n this.clazz = clazz;\n this.componentType = componentType;\n this.type = type;\n this.viewUtils = viewUtils;\n this.parentView = parentView;\n this.parentIndex = parentIndex;\n this.parentElement = parentElement;\n this.cdMode = cdMode;\n this.declaredViewContainer = declaredViewContainer;\n this.numberOfChecks = 0;\n this.ref = new ViewRef_(this, viewUtils.animationQueue);\n if (type === ViewType.COMPONENT || type === ViewType.HOST) {\n this.renderer = viewUtils.renderComponent(componentType);\n }\n else {\n this.renderer = parentView.renderer;\n }\n this._directRenderer = this.renderer.directRenderer;\n }\n Object.defineProperty(AppView.prototype, \"animationContext\", {\n /**\n * @return {?}\n */\n get: function () {\n if (!this._animationContext) {\n this._animationContext = new AnimationViewContext(this.viewUtils.animationQueue);\n }\n return this._animationContext;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AppView.prototype, \"destroyed\", {\n /**\n * @return {?}\n */\n get: function () { return this.cdMode === ChangeDetectorStatus.Destroyed; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} context\n * @return {?}\n */\n AppView.prototype.create = function (context) {\n this.context = context;\n return this.createInternal(null);\n };\n /**\n * @param {?} rootSelectorOrNode\n * @param {?} hostInjector\n * @param {?} projectableNodes\n * @return {?}\n */\n AppView.prototype.createHostView = function (rootSelectorOrNode, hostInjector, projectableNodes) {\n this.context = (EMPTY_CONTEXT$1);\n this._hasExternalHostElement = isPresent(rootSelectorOrNode);\n this._hostInjector = hostInjector;\n this._hostProjectableNodes = projectableNodes;\n return this.createInternal(rootSelectorOrNode);\n };\n /**\n * Overwritten by implementations.\n * Returns the ComponentRef for the host element for ViewType.HOST.\n * @param {?} rootSelectorOrNode\n * @return {?}\n */\n AppView.prototype.createInternal = function (rootSelectorOrNode) { return null; };\n /**\n * Overwritten by implementations.\n * @param {?} templateNodeIndex\n * @return {?}\n */\n AppView.prototype.createEmbeddedViewInternal = function (templateNodeIndex) { return null; };\n /**\n * @param {?} lastRootNode\n * @param {?} allNodes\n * @param {?} disposables\n * @return {?}\n */\n AppView.prototype.init = function (lastRootNode, allNodes, disposables) {\n this.lastRootNode = lastRootNode;\n this.allNodes = allNodes;\n this.disposables = disposables;\n if (this.type === ViewType.COMPONENT) {\n this.dirtyParentQueriesInternal();\n }\n };\n /**\n * @param {?} token\n * @param {?} nodeIndex\n * @param {?=} notFoundValue\n * @return {?}\n */\n AppView.prototype.injectorGet = function (token, nodeIndex, notFoundValue) {\n if (notFoundValue === void 0) { notFoundValue = THROW_IF_NOT_FOUND; }\n var /** @type {?} */ result = UNDEFINED$1;\n var /** @type {?} */ view = this;\n while (result === UNDEFINED$1) {\n if (isPresent(nodeIndex)) {\n result = view.injectorGetInternal(token, nodeIndex, UNDEFINED$1);\n }\n if (result === UNDEFINED$1 && view.type === ViewType.HOST) {\n result = view._hostInjector.get(token, notFoundValue);\n }\n nodeIndex = view.parentIndex;\n view = view.parentView;\n }\n return result;\n };\n /**\n * Overwritten by implementations\n * @param {?} token\n * @param {?} nodeIndex\n * @param {?} notFoundResult\n * @return {?}\n */\n AppView.prototype.injectorGetInternal = function (token, nodeIndex, notFoundResult) {\n return notFoundResult;\n };\n /**\n * @param {?} nodeIndex\n * @return {?}\n */\n AppView.prototype.injector = function (nodeIndex) { return new ElementInjector(this, nodeIndex); };\n /**\n * @return {?}\n */\n AppView.prototype.detachAndDestroy = function () {\n if (this.viewContainer) {\n this.viewContainer.detachView(this.viewContainer.nestedViews.indexOf(this));\n }\n else if (this.appRef) {\n this.appRef.detachView(this.ref);\n }\n else if (this._hasExternalHostElement) {\n this.detach();\n }\n this.destroy();\n };\n /**\n * @return {?}\n */\n AppView.prototype.destroy = function () {\n var _this = this;\n if (this.cdMode === ChangeDetectorStatus.Destroyed) {\n return;\n }\n var /** @type {?} */ hostElement = this.type === ViewType.COMPONENT ? this.parentElement : null;\n if (this.disposables) {\n for (var /** @type {?} */ i = 0; i < this.disposables.length; i++) {\n this.disposables[i]();\n }\n }\n this.destroyInternal();\n this.dirtyParentQueriesInternal();\n if (this._animationContext) {\n this._animationContext.onAllActiveAnimationsDone(function () { return _this.renderer.destroyView(hostElement, _this.allNodes); });\n }\n else {\n this.renderer.destroyView(hostElement, this.allNodes);\n }\n this.cdMode = ChangeDetectorStatus.Destroyed;\n };\n /**\n * Overwritten by implementations\n * @return {?}\n */\n AppView.prototype.destroyInternal = function () { };\n /**\n * Overwritten by implementations\n * @return {?}\n */\n AppView.prototype.detachInternal = function () { };\n /**\n * @return {?}\n */\n AppView.prototype.detach = function () {\n var _this = this;\n this.detachInternal();\n if (this._animationContext) {\n this._animationContext.onAllActiveAnimationsDone(function () { return _this._renderDetach(); });\n }\n else {\n this._renderDetach();\n }\n if (this.declaredViewContainer && this.declaredViewContainer !== this.viewContainer &&\n this.declaredViewContainer.projectedViews) {\n var /** @type {?} */ projectedViews = this.declaredViewContainer.projectedViews;\n var /** @type {?} */ index = projectedViews.indexOf(this);\n // perf: pop is faster than splice!\n if (index >= projectedViews.length - 1) {\n projectedViews.pop();\n }\n else {\n projectedViews.splice(index, 1);\n }\n }\n this.appRef = null;\n this.viewContainer = null;\n this.dirtyParentQueriesInternal();\n };\n /**\n * @return {?}\n */\n AppView.prototype._renderDetach = function () {\n if (this._directRenderer) {\n this.visitRootNodesInternal(this._directRenderer.remove, null);\n }\n else {\n this.renderer.detachView(this.flatRootNodes);\n }\n };\n /**\n * @param {?} appRef\n * @return {?}\n */\n AppView.prototype.attachToAppRef = function (appRef) {\n if (this.viewContainer) {\n throw new Error('This view is already attached to a ViewContainer!');\n }\n this.appRef = appRef;\n this.dirtyParentQueriesInternal();\n };\n /**\n * @param {?} viewContainer\n * @param {?} prevView\n * @return {?}\n */\n AppView.prototype.attachAfter = function (viewContainer, prevView) {\n if (this.appRef) {\n throw new Error('This view is already attached directly to the ApplicationRef!');\n }\n this._renderAttach(viewContainer, prevView);\n this.viewContainer = viewContainer;\n if (this.declaredViewContainer && this.declaredViewContainer !== viewContainer) {\n if (!this.declaredViewContainer.projectedViews) {\n this.declaredViewContainer.projectedViews = [];\n }\n this.declaredViewContainer.projectedViews.push(this);\n }\n this.dirtyParentQueriesInternal();\n };\n /**\n * @param {?} viewContainer\n * @param {?} prevView\n * @return {?}\n */\n AppView.prototype.moveAfter = function (viewContainer, prevView) {\n this._renderAttach(viewContainer, prevView);\n this.dirtyParentQueriesInternal();\n };\n /**\n * @param {?} viewContainer\n * @param {?} prevView\n * @return {?}\n */\n AppView.prototype._renderAttach = function (viewContainer, prevView) {\n var /** @type {?} */ prevNode = prevView ? prevView.lastRootNode : viewContainer.nativeElement;\n if (this._directRenderer) {\n var /** @type {?} */ nextSibling = this._directRenderer.nextSibling(prevNode);\n if (nextSibling) {\n this.visitRootNodesInternal(this._directRenderer.insertBefore, nextSibling);\n }\n else {\n var /** @type {?} */ parentElement = this._directRenderer.parentElement(prevNode);\n if (parentElement) {\n this.visitRootNodesInternal(this._directRenderer.appendChild, parentElement);\n }\n }\n }\n else {\n this.renderer.attachViewAfter(prevNode, this.flatRootNodes);\n }\n };\n Object.defineProperty(AppView.prototype, \"changeDetectorRef\", {\n /**\n * @return {?}\n */\n get: function () { return this.ref; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AppView.prototype, \"flatRootNodes\", {\n /**\n * @return {?}\n */\n get: function () {\n var /** @type {?} */ nodes = [];\n this.visitRootNodesInternal(addToArray, nodes);\n return nodes;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} parentElement\n * @param {?} ngContentIndex\n * @return {?}\n */\n AppView.prototype.projectNodes = function (parentElement, ngContentIndex) {\n if (this._directRenderer) {\n this.visitProjectedNodes(ngContentIndex, this._directRenderer.appendChild, parentElement);\n }\n else {\n var /** @type {?} */ nodes = [];\n this.visitProjectedNodes(ngContentIndex, addToArray, nodes);\n this.renderer.projectNodes(parentElement, nodes);\n }\n };\n /**\n * @param {?} ngContentIndex\n * @param {?} cb\n * @param {?} c\n * @return {?}\n */\n AppView.prototype.visitProjectedNodes = function (ngContentIndex, cb, c) {\n switch (this.type) {\n case ViewType.EMBEDDED:\n this.parentView.visitProjectedNodes(ngContentIndex, cb, c);\n break;\n case ViewType.COMPONENT:\n if (this.parentView.type === ViewType.HOST) {\n var /** @type {?} */ nodes = this.parentView._hostProjectableNodes[ngContentIndex] || [];\n for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n cb(nodes[i], c);\n }\n }\n else {\n this.parentView.visitProjectableNodesInternal(this.parentIndex, ngContentIndex, cb, c);\n }\n break;\n }\n };\n /**\n * Overwritten by implementations\n * @param {?} cb\n * @param {?} c\n * @return {?}\n */\n AppView.prototype.visitRootNodesInternal = function (cb, c) { };\n /**\n * Overwritten by implementations\n * @param {?} nodeIndex\n * @param {?} ngContentIndex\n * @param {?} cb\n * @param {?} c\n * @return {?}\n */\n AppView.prototype.visitProjectableNodesInternal = function (nodeIndex, ngContentIndex, cb, c) { };\n /**\n * Overwritten by implementations\n * @return {?}\n */\n AppView.prototype.dirtyParentQueriesInternal = function () { };\n /**\n * @param {?} throwOnChange\n * @return {?}\n */\n AppView.prototype.internalDetectChanges = function (throwOnChange) {\n if (this.cdMode !== ChangeDetectorStatus.Detached) {\n this.detectChanges(throwOnChange);\n }\n };\n /**\n * @param {?} throwOnChange\n * @return {?}\n */\n AppView.prototype.detectChanges = function (throwOnChange) {\n var /** @type {?} */ s = _scope_check(this.clazz);\n if (this.cdMode === ChangeDetectorStatus.Checked ||\n this.cdMode === ChangeDetectorStatus.Errored)\n return;\n if (this.cdMode === ChangeDetectorStatus.Destroyed) {\n this.throwDestroyedError('detectChanges');\n }\n this.detectChangesInternal(throwOnChange);\n if (this.cdMode === ChangeDetectorStatus.CheckOnce)\n this.cdMode = ChangeDetectorStatus.Checked;\n this.numberOfChecks++;\n wtfLeave(s);\n };\n /**\n * Overwritten by implementations\n * @param {?} throwOnChange\n * @return {?}\n */\n AppView.prototype.detectChangesInternal = function (throwOnChange) { };\n /**\n * @return {?}\n */\n AppView.prototype.markAsCheckOnce = function () { this.cdMode = ChangeDetectorStatus.CheckOnce; };\n /**\n * @return {?}\n */\n AppView.prototype.markPathToRootAsCheckOnce = function () {\n var /** @type {?} */ c = this;\n while (isPresent(c) && c.cdMode !== ChangeDetectorStatus.Detached) {\n if (c.cdMode === ChangeDetectorStatus.Checked) {\n c.cdMode = ChangeDetectorStatus.CheckOnce;\n }\n if (c.type === ViewType.COMPONENT) {\n c = c.parentView;\n }\n else {\n c = c.viewContainer ? c.viewContainer.parentView : null;\n }\n }\n };\n /**\n * @param {?} cb\n * @return {?}\n */\n AppView.prototype.eventHandler = function (cb) {\n return cb;\n };\n /**\n * @param {?} details\n * @return {?}\n */\n AppView.prototype.throwDestroyedError = function (details) { throw new ViewDestroyedError(details); };\n return AppView;\n }());\n var DebugAppView = (function (_super) {\n __extends$14(DebugAppView, _super);\n /**\n * @param {?} clazz\n * @param {?} componentType\n * @param {?} type\n * @param {?} viewUtils\n * @param {?} parentView\n * @param {?} parentIndex\n * @param {?} parentNode\n * @param {?} cdMode\n * @param {?} staticNodeDebugInfos\n * @param {?=} declaredViewContainer\n */\n function DebugAppView(clazz, componentType, type, viewUtils, parentView, parentIndex, parentNode, cdMode, staticNodeDebugInfos, declaredViewContainer) {\n if (declaredViewContainer === void 0) { declaredViewContainer = null; }\n _super.call(this, clazz, componentType, type, viewUtils, parentView, parentIndex, parentNode, cdMode, declaredViewContainer);\n this.staticNodeDebugInfos = staticNodeDebugInfos;\n this._currentDebugContext = null;\n }\n /**\n * @param {?} context\n * @return {?}\n */\n DebugAppView.prototype.create = function (context) {\n this._resetDebug();\n try {\n return _super.prototype.create.call(this, context);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @param {?} rootSelectorOrNode\n * @param {?} injector\n * @param {?=} projectableNodes\n * @return {?}\n */\n DebugAppView.prototype.createHostView = function (rootSelectorOrNode, injector, projectableNodes) {\n if (projectableNodes === void 0) { projectableNodes = null; }\n this._resetDebug();\n try {\n return _super.prototype.createHostView.call(this, rootSelectorOrNode, injector, projectableNodes);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @param {?} token\n * @param {?} nodeIndex\n * @param {?=} notFoundResult\n * @return {?}\n */\n DebugAppView.prototype.injectorGet = function (token, nodeIndex, notFoundResult) {\n this._resetDebug();\n try {\n return _super.prototype.injectorGet.call(this, token, nodeIndex, notFoundResult);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @return {?}\n */\n DebugAppView.prototype.detach = function () {\n this._resetDebug();\n try {\n _super.prototype.detach.call(this);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @return {?}\n */\n DebugAppView.prototype.destroy = function () {\n this._resetDebug();\n try {\n _super.prototype.destroy.call(this);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @param {?} throwOnChange\n * @return {?}\n */\n DebugAppView.prototype.detectChanges = function (throwOnChange) {\n this._resetDebug();\n try {\n _super.prototype.detectChanges.call(this, throwOnChange);\n }\n catch (e) {\n this._rethrowWithContext(e);\n throw e;\n }\n };\n /**\n * @return {?}\n */\n DebugAppView.prototype._resetDebug = function () { this._currentDebugContext = null; };\n /**\n * @param {?} nodeIndex\n * @param {?} rowNum\n * @param {?} colNum\n * @return {?}\n */\n DebugAppView.prototype.debug = function (nodeIndex, rowNum, colNum) {\n return this._currentDebugContext = new DebugContext(this, nodeIndex, rowNum, colNum);\n };\n /**\n * @param {?} e\n * @return {?}\n */\n DebugAppView.prototype._rethrowWithContext = function (e) {\n if (!(e instanceof ViewWrappedError)) {\n if (!(e instanceof ExpressionChangedAfterItHasBeenCheckedError)) {\n this.cdMode = ChangeDetectorStatus.Errored;\n }\n if (isPresent(this._currentDebugContext)) {\n throw new ViewWrappedError(e, this._currentDebugContext);\n }\n }\n };\n /**\n * @param {?} cb\n * @return {?}\n */\n DebugAppView.prototype.eventHandler = function (cb) {\n var _this = this;\n var /** @type {?} */ superHandler = _super.prototype.eventHandler.call(this, cb);\n return function (eventName, event) {\n _this._resetDebug();\n try {\n return superHandler.call(_this, eventName, event);\n }\n catch (e) {\n _this._rethrowWithContext(e);\n throw e;\n }\n };\n };\n return DebugAppView;\n }(AppView));\n\n /**\n * A ViewContainer is created for elements that have a ViewContainerRef\n * to keep track of the nested views.\n */\n var ViewContainer = (function () {\n /**\n * @param {?} index\n * @param {?} parentIndex\n * @param {?} parentView\n * @param {?} nativeElement\n */\n function ViewContainer(index, parentIndex, parentView, nativeElement) {\n this.index = index;\n this.parentIndex = parentIndex;\n this.parentView = parentView;\n this.nativeElement = nativeElement;\n }\n Object.defineProperty(ViewContainer.prototype, \"elementRef\", {\n /**\n * @return {?}\n */\n get: function () { return new ElementRef(this.nativeElement); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainer.prototype, \"vcRef\", {\n /**\n * @return {?}\n */\n get: function () { return new ViewContainerRef_(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainer.prototype, \"parentInjector\", {\n /**\n * @return {?}\n */\n get: function () { return this.parentView.injector(this.parentIndex); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ViewContainer.prototype, \"injector\", {\n /**\n * @return {?}\n */\n get: function () { return this.parentView.injector(this.index); },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} throwOnChange\n * @return {?}\n */\n ViewContainer.prototype.detectChangesInNestedViews = function (throwOnChange) {\n if (this.nestedViews) {\n for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n this.nestedViews[i].detectChanges(throwOnChange);\n }\n }\n };\n /**\n * @return {?}\n */\n ViewContainer.prototype.destroyNestedViews = function () {\n if (this.nestedViews) {\n for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n this.nestedViews[i].destroy();\n }\n }\n };\n /**\n * @param {?} cb\n * @param {?} c\n * @return {?}\n */\n ViewContainer.prototype.visitNestedViewRootNodes = function (cb, c) {\n if (this.nestedViews) {\n for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n this.nestedViews[i].visitRootNodesInternal(cb, c);\n }\n }\n };\n /**\n * @param {?} nestedViewClass\n * @param {?} callback\n * @return {?}\n */\n ViewContainer.prototype.mapNestedViews = function (nestedViewClass, callback) {\n var /** @type {?} */ result = [];\n if (this.nestedViews) {\n for (var /** @type {?} */ i = 0; i < this.nestedViews.length; i++) {\n var /** @type {?} */ nestedView = this.nestedViews[i];\n if (nestedView.clazz === nestedViewClass) {\n result.push(callback(nestedView));\n }\n }\n }\n if (this.projectedViews) {\n for (var /** @type {?} */ i = 0; i < this.projectedViews.length; i++) {\n var /** @type {?} */ projectedView = this.projectedViews[i];\n if (projectedView.clazz === nestedViewClass) {\n result.push(callback(projectedView));\n }\n }\n }\n return result;\n };\n /**\n * @param {?} view\n * @param {?} currentIndex\n * @return {?}\n */\n ViewContainer.prototype.moveView = function (view, currentIndex) {\n var /** @type {?} */ previousIndex = this.nestedViews.indexOf(view);\n if (view.type === ViewType.COMPONENT) {\n throw new Error(\"Component views can't be moved!\");\n }\n var /** @type {?} */ nestedViews = this.nestedViews;\n if (nestedViews == null) {\n nestedViews = [];\n this.nestedViews = nestedViews;\n }\n nestedViews.splice(previousIndex, 1);\n nestedViews.splice(currentIndex, 0, view);\n var /** @type {?} */ prevView = currentIndex > 0 ? nestedViews[currentIndex - 1] : null;\n view.moveAfter(this, prevView);\n };\n /**\n * @param {?} view\n * @param {?} viewIndex\n * @return {?}\n */\n ViewContainer.prototype.attachView = function (view, viewIndex) {\n if (view.type === ViewType.COMPONENT) {\n throw new Error(\"Component views can't be moved!\");\n }\n var /** @type {?} */ nestedViews = this.nestedViews;\n if (nestedViews == null) {\n nestedViews = [];\n this.nestedViews = nestedViews;\n }\n // perf: array.push is faster than array.splice!\n if (viewIndex >= nestedViews.length) {\n nestedViews.push(view);\n }\n else {\n nestedViews.splice(viewIndex, 0, view);\n }\n var /** @type {?} */ prevView = viewIndex > 0 ? nestedViews[viewIndex - 1] : null;\n view.attachAfter(this, prevView);\n };\n /**\n * @param {?} viewIndex\n * @return {?}\n */\n ViewContainer.prototype.detachView = function (viewIndex) {\n var /** @type {?} */ view = this.nestedViews[viewIndex];\n // perf: array.pop is faster than array.splice!\n if (viewIndex >= this.nestedViews.length - 1) {\n this.nestedViews.pop();\n }\n else {\n this.nestedViews.splice(viewIndex, 1);\n }\n if (view.type === ViewType.COMPONENT) {\n throw new Error(\"Component views can't be moved!\");\n }\n view.detach();\n return view;\n };\n return ViewContainer;\n }());\n\n var /** @type {?} */ __core_private__ = {\n isDefaultChangeDetectionStrategy: isDefaultChangeDetectionStrategy,\n ChangeDetectorStatus: ChangeDetectorStatus,\n constructDependencies: constructDependencies,\n LifecycleHooks: LifecycleHooks,\n LIFECYCLE_HOOKS_VALUES: LIFECYCLE_HOOKS_VALUES,\n ReflectorReader: ReflectorReader,\n CodegenComponentFactoryResolver: CodegenComponentFactoryResolver,\n ComponentRef_: ComponentRef_,\n ViewContainer: ViewContainer,\n AppView: AppView,\n DebugAppView: DebugAppView,\n NgModuleInjector: NgModuleInjector,\n registerModuleFactory: registerModuleFactory,\n ViewType: ViewType,\n view_utils: view_utils,\n ViewMetadata: ViewMetadata,\n DebugContext: DebugContext,\n StaticNodeDebugInfo: StaticNodeDebugInfo,\n devModeEqual: devModeEqual,\n UNINITIALIZED: UNINITIALIZED,\n ValueUnwrapper: ValueUnwrapper,\n RenderDebugInfo: RenderDebugInfo,\n TemplateRef_: TemplateRef_,\n ReflectionCapabilities: ReflectionCapabilities,\n makeDecorator: makeDecorator,\n DebugDomRootRenderer: DebugDomRootRenderer,\n Console: Console,\n reflector: reflector,\n Reflector: Reflector,\n NoOpAnimationPlayer: NoOpAnimationPlayer,\n AnimationPlayer: AnimationPlayer,\n AnimationSequencePlayer: AnimationSequencePlayer,\n AnimationGroupPlayer: AnimationGroupPlayer,\n AnimationKeyframe: AnimationKeyframe,\n prepareFinalAnimationStyles: prepareFinalAnimationStyles,\n balanceAnimationKeyframes: balanceAnimationKeyframes,\n flattenStyles: flattenStyles,\n clearStyles: clearStyles,\n renderStyles: renderStyles,\n collectAndResolveStyles: collectAndResolveStyles,\n APP_ID_RANDOM_PROVIDER: APP_ID_RANDOM_PROVIDER,\n AnimationStyles: AnimationStyles,\n ANY_STATE: ANY_STATE,\n DEFAULT_STATE: DEFAULT_STATE,\n EMPTY_STATE: EMPTY_STATE,\n FILL_STYLE_FLAG: FILL_STYLE_FLAG,\n ComponentStillLoadingError: ComponentStillLoadingError,\n isPromise: isPromise,\n AnimationTransition: AnimationTransition\n };\n\n exports.createPlatform = createPlatform;\n exports.assertPlatform = assertPlatform;\n exports.destroyPlatform = destroyPlatform;\n exports.getPlatform = getPlatform;\n exports.PlatformRef = PlatformRef;\n exports.ApplicationRef = ApplicationRef;\n exports.enableProdMode = enableProdMode;\n exports.isDevMode = isDevMode;\n exports.createPlatformFactory = createPlatformFactory;\n exports.NgProbeToken = NgProbeToken;\n exports.APP_ID = APP_ID;\n exports.PACKAGE_ROOT_URL = PACKAGE_ROOT_URL;\n exports.PLATFORM_INITIALIZER = PLATFORM_INITIALIZER;\n exports.APP_BOOTSTRAP_LISTENER = APP_BOOTSTRAP_LISTENER;\n exports.APP_INITIALIZER = APP_INITIALIZER;\n exports.ApplicationInitStatus = ApplicationInitStatus;\n exports.DebugElement = DebugElement;\n exports.DebugNode = DebugNode;\n exports.asNativeElements = asNativeElements;\n exports.getDebugNode = getDebugNode;\n exports.Testability = Testability;\n exports.TestabilityRegistry = TestabilityRegistry;\n exports.setTestabilityGetter = setTestabilityGetter;\n exports.TRANSLATIONS = TRANSLATIONS;\n exports.TRANSLATIONS_FORMAT = TRANSLATIONS_FORMAT;\n exports.LOCALE_ID = LOCALE_ID;\n exports.ApplicationModule = ApplicationModule;\n exports.wtfCreateScope = wtfCreateScope;\n exports.wtfLeave = wtfLeave;\n exports.wtfStartTimeRange = wtfStartTimeRange;\n exports.wtfEndTimeRange = wtfEndTimeRange;\n exports.Type = Type;\n exports.EventEmitter = EventEmitter;\n exports.ErrorHandler = ErrorHandler;\n exports.AnimationTransitionEvent = AnimationTransitionEvent;\n exports.AnimationPlayer = AnimationPlayer;\n exports.Sanitizer = Sanitizer;\n exports.SecurityContext = SecurityContext;\n exports.ANALYZE_FOR_ENTRY_COMPONENTS = ANALYZE_FOR_ENTRY_COMPONENTS;\n exports.Attribute = Attribute;\n exports.ContentChild = ContentChild;\n exports.ContentChildren = ContentChildren;\n exports.Query = Query;\n exports.ViewChild = ViewChild;\n exports.ViewChildren = ViewChildren;\n exports.Component = Component;\n exports.Directive = Directive;\n exports.HostBinding = HostBinding;\n exports.HostListener = HostListener;\n exports.Input = Input;\n exports.Output = Output;\n exports.Pipe = Pipe;\n exports.AfterContentChecked = AfterContentChecked;\n exports.AfterContentInit = AfterContentInit;\n exports.AfterViewChecked = AfterViewChecked;\n exports.AfterViewInit = AfterViewInit;\n exports.DoCheck = DoCheck;\n exports.OnChanges = OnChanges;\n exports.OnDestroy = OnDestroy;\n exports.OnInit = OnInit;\n exports.CUSTOM_ELEMENTS_SCHEMA = CUSTOM_ELEMENTS_SCHEMA;\n exports.NO_ERRORS_SCHEMA = NO_ERRORS_SCHEMA;\n exports.NgModule = NgModule;\n exports.ViewEncapsulation = ViewEncapsulation;\n exports.Version = Version;\n exports.VERSION = VERSION;\n exports.Class = Class;\n exports.forwardRef = forwardRef;\n exports.resolveForwardRef = resolveForwardRef;\n exports.Injector = Injector;\n exports.ReflectiveInjector = ReflectiveInjector;\n exports.ResolvedReflectiveFactory = ResolvedReflectiveFactory;\n exports.ReflectiveKey = ReflectiveKey;\n exports.OpaqueToken = OpaqueToken;\n exports.Inject = Inject;\n exports.Optional = Optional;\n exports.Injectable = Injectable;\n exports.Self = Self;\n exports.SkipSelf = SkipSelf;\n exports.Host = Host;\n exports.NgZone = NgZone;\n exports.RenderComponentType = RenderComponentType;\n exports.Renderer = Renderer;\n exports.RootRenderer = RootRenderer;\n exports.COMPILER_OPTIONS = COMPILER_OPTIONS;\n exports.Compiler = Compiler;\n exports.CompilerFactory = CompilerFactory;\n exports.ModuleWithComponentFactories = ModuleWithComponentFactories;\n exports.ComponentFactory = ComponentFactory;\n exports.ComponentRef = ComponentRef;\n exports.ComponentFactoryResolver = ComponentFactoryResolver;\n exports.ElementRef = ElementRef;\n exports.NgModuleFactory = NgModuleFactory;\n exports.NgModuleRef = NgModuleRef;\n exports.NgModuleFactoryLoader = NgModuleFactoryLoader;\n exports.getModuleFactory = getModuleFactory;\n exports.QueryList = QueryList;\n exports.SystemJsNgModuleLoader = SystemJsNgModuleLoader;\n exports.SystemJsNgModuleLoaderConfig = SystemJsNgModuleLoaderConfig;\n exports.TemplateRef = TemplateRef;\n exports.ViewContainerRef = ViewContainerRef;\n exports.EmbeddedViewRef = EmbeddedViewRef;\n exports.ViewRef = ViewRef;\n exports.ChangeDetectionStrategy = ChangeDetectionStrategy;\n exports.ChangeDetectorRef = ChangeDetectorRef;\n exports.CollectionChangeRecord = CollectionChangeRecord;\n exports.DefaultIterableDiffer = DefaultIterableDiffer;\n exports.IterableDiffers = IterableDiffers;\n exports.KeyValueChangeRecord = KeyValueChangeRecord;\n exports.KeyValueDiffers = KeyValueDiffers;\n exports.SimpleChange = SimpleChange;\n exports.WrappedValue = WrappedValue;\n exports.platformCore = platformCore;\n exports.__core_private__ = __core_private__;\n exports.AUTO_STYLE = AUTO_STYLE;\n exports.AnimationEntryMetadata = AnimationEntryMetadata;\n exports.AnimationStateMetadata = AnimationStateMetadata;\n exports.AnimationStateDeclarationMetadata = AnimationStateDeclarationMetadata;\n exports.AnimationStateTransitionMetadata = AnimationStateTransitionMetadata;\n exports.AnimationMetadata = AnimationMetadata;\n exports.AnimationKeyframesSequenceMetadata = AnimationKeyframesSequenceMetadata;\n exports.AnimationStyleMetadata = AnimationStyleMetadata;\n exports.AnimationAnimateMetadata = AnimationAnimateMetadata;\n exports.AnimationWithStepsMetadata = AnimationWithStepsMetadata;\n exports.AnimationSequenceMetadata = AnimationSequenceMetadata;\n exports.AnimationGroupMetadata = AnimationGroupMetadata;\n exports.animate = animate;\n exports.group = group;\n exports.sequence = sequence;\n exports.style = style;\n exports.state = state;\n exports.keyframes = keyframes;\n exports.transition = transition;\n exports.trigger = trigger;\n\n}));\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vQGFuZ3VsYXIvY29yZS9idW5kbGVzL2NvcmUudW1kLmpzP2UyYTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBBbmd1bGFyIHYyLjQuMVxuICogKGMpIDIwMTAtMjAxNiBHb29nbGUsIEluYy4gaHR0cHM6Ly9hbmd1bGFyLmlvL1xuICogTGljZW5zZTogTUlUXG4gKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdyeGpzL1N1YmplY3QnKSwgcmVxdWlyZSgncnhqcy9PYnNlcnZhYmxlJykpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ3J4anMvU3ViamVjdCcsICdyeGpzL09ic2VydmFibGUnXSwgZmFjdG9yeSkgOlxuICAgIChmYWN0b3J5KChnbG9iYWwubmcgPSBnbG9iYWwubmcgfHwge30sIGdsb2JhbC5uZy5jb3JlID0gZ2xvYmFsLm5nLmNvcmUgfHwge30pLGdsb2JhbC5SeCxnbG9iYWwuUngpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMscnhqc19TdWJqZWN0LHJ4anNfT2JzZXJ2YWJsZSkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZ2xvYmFsU2NvcGU7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSkge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSBhbnkgd2l0aCBXb3JrZXJHbG9iYWxTY29wZSBmcm9tIGxpYi53ZWJ3b3JrZXIuZC50cyAjMzQ5MlxuICAgICAgICAgICAgZ2xvYmFsU2NvcGUgPSAoc2VsZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWxTY29wZSA9IChnbG9iYWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnbG9iYWxTY29wZSA9ICh3aW5kb3cpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayhmbikge1xuICAgICAgICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soJ3NjaGVkdWxlTWljcm90YXNrJywgZm4pO1xuICAgIH1cbiAgICAvLyBOZWVkIHRvIGRlY2xhcmUgYSBuZXcgdmFyaWFibGUgZm9yIGdsb2JhbCBoZXJlIHNpbmNlIFR5cGVTY3JpcHRcbiAgICAvLyBleHBvcnRzIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgc3ltYm9sLlxuICAgIHZhciAvKiogQHR5cGUgez99ICovIGdsb2JhbCQxID0gZ2xvYmFsU2NvcGU7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB0eXBlXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0eXBlWyduYW1lJ10gfHwgdHlwZW9mIHR5cGU7XG4gICAgfVxuICAgIC8vIFRPRE86IHJlbW92ZSBjYWxscyB0byBhc3NlcnQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgIC8vIE5vdGU6IENhbid0IGp1c3QgZXhwb3J0IHRoaXMgYW5kIGltcG9ydCBpbiBpbiBvdGhlciBmaWxlc1xuICAgIC8vIGFzIGBhc3NlcnRgIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBEYXJ0XG4gICAgZ2xvYmFsJDEuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbikge1xuICAgICAgICAvLyBUT0RPOiB0byBiZSBmaXhlZCBwcm9wZXJseSB2aWEgIzI4MzAsIG5vb3AgZm9yIG5vd1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBvYmpcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJlc2VudChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbGFuayhvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiA9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHJpbmdpZnkodG9rZW4pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICcnICsgdG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuLm92ZXJyaWRkZW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm92ZXJyaWRkZW5OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbi5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gdG9rZW4udG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoJ1xcbicpO1xuICAgICAgICByZXR1cm4gbmV3TGluZUluZGV4ID09PSAtMSA/IHJlcyA6IHJlcy5zdWJzdHJpbmcoMCwgbmV3TGluZUluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBhXG4gICAgICogQHBhcmFtIHs/fSBiXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsb29zZUlkZW50aWNhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhID09PSBiIHx8IHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYiA9PT0gJ251bWJlcicgJiYgaXNOYU4oYSkgJiYgaXNOYU4oYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gb1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNKc09iamVjdChvKSB7XG4gICAgICAgIHJldHVybiBvICE9PSBudWxsICYmICh0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbyA9PT0gJ29iamVjdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJpbnQob2JqKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKG9iaik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3YXJuKG9iaikge1xuICAgICAgICBjb25zb2xlLndhcm4ob2JqKTtcbiAgICB9XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX3N5bWJvbEl0ZXJhdG9yID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFN5bWJvbEl0ZXJhdG9yKCkge1xuICAgICAgICBpZiAoIV9zeW1ib2xJdGVyYXRvcikge1xuICAgICAgICAgICAgaWYgKCgoZ2xvYmFsU2NvcGUpKS5TeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgX3N5bWJvbEl0ZXJhdG9yID0gU3ltYm9sLml0ZXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZXM2LXNoaW0gc3BlY2lmaWMgbG9naWNcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2VudHJpZXMnICYmIGtleSAhPT0gJ3NpemUnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoKE1hcCkpLnByb3RvdHlwZVtrZXldID09PSBNYXAucHJvdG90eXBlWydlbnRyaWVzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zeW1ib2xJdGVyYXRvciA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N5bWJvbEl0ZXJhdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcmltaXRpdmUob2JqKSB7XG4gICAgICAgIHJldHVybiAhaXNKc09iamVjdChvYmopO1xuICAgIH1cblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9uZXh0Q2xhc3NJZCA9IDA7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUmVmbGVjdCA9IGdsb2JhbCQxLlJlZmxlY3Q7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBleHRyYWN0QW5ub3RhdGlvbihhbm5vdGF0aW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBhbm5vdGF0aW9uLmhhc093blByb3BlcnR5KCdhbm5vdGF0aW9uJykpIHtcbiAgICAgICAgICAgIC8vIGl0IGlzIGEgZGVjb3JhdG9yLCBleHRyYWN0IGFubm90YXRpb25cbiAgICAgICAgICAgIGFubm90YXRpb24gPSBhbm5vdGF0aW9uLmFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFubm90YXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZm5PckFycmF5XG4gICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFwcGx5UGFyYW1zKGZuT3JBcnJheSwga2V5KSB7XG4gICAgICAgIGlmIChmbk9yQXJyYXkgPT09IE9iamVjdCB8fCBmbk9yQXJyYXkgPT09IFN0cmluZyB8fCBmbk9yQXJyYXkgPT09IEZ1bmN0aW9uIHx8XG4gICAgICAgICAgICBmbk9yQXJyYXkgPT09IE51bWJlciB8fCBmbk9yQXJyYXkgPT09IEFycmF5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4gbm90IHVzZSBuYXRpdmUgXCIgKyBzdHJpbmdpZnkoZm5PckFycmF5KSArIFwiIGFzIGNvbnN0cnVjdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZm5PckFycmF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZm5PckFycmF5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZuT3JBcnJheSkpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb25zID0gZm5PckFycmF5O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5ub0xlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmbiA9IGZuT3JBcnJheVthbm5vTGVuZ3RoXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMYXN0IHBvc2l0aW9uIG9mIENsYXNzIG1ldGhvZCBhcnJheSBtdXN0IGJlIEZ1bmN0aW9uIGluIGtleSBcIiArIGtleSArIFwiIHdhcyAnXCIgKyBzdHJpbmdpZnkoZm4pICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFubm9MZW5ndGggIT0gZm4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTnVtYmVyIG9mIGFubm90YXRpb25zIChcIiArIGFubm9MZW5ndGggKyBcIikgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIGFyZ3VtZW50cyAoXCIgKyBmbi5sZW5ndGggKyBcIikgaW4gdGhlIGZ1bmN0aW9uOiBcIiArIHN0cmluZ2lmeShmbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1zQW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDAsIC8qKiBAdHlwZSB7P30gKi8gaWkgPSBhbm5vdGF0aW9ucy5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtQW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBwYXJhbXNBbm5vdGF0aW9ucy5wdXNoKHBhcmFtQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGogPSAwOyBqIDwgYW5ub3RhdGlvbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Bbm5vdGF0aW9ucy5wdXNoKGV4dHJhY3RBbm5vdGF0aW9uKGFubm90YXRpb25bal0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbUFubm90YXRpb25zLnB1c2goZXh0cmFjdEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1Bbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ3BhcmFtZXRlcnMnLCBwYXJhbXNBbm5vdGF0aW9ucywgZm4pO1xuICAgICAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgRnVuY3Rpb24gb3IgQXJyYXkgaXMgc3VwcG9ydGVkIGluIENsYXNzIGRlZmluaXRpb24gZm9yIGtleSAnXCIgKyBrZXkgKyBcIicgaXMgJ1wiICsgc3RyaW5naWZ5KGZuT3JBcnJheSkgKyBcIidcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBQcm92aWRlcyBhIHdheSBmb3IgZXhwcmVzc2luZyBFUzYgY2xhc3NlcyB3aXRoIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBpbiBFUzUuXG4gICAgICAqICpcbiAgICAgICogIyMgQmFzaWMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiB2YXIgR3JlZXRlciA9IG5nLkNsYXNzKHtcbiAgICAgICogY29uc3RydWN0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICogdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICogfSxcbiAgICAgICogKlxuICAgICAgKiBncmVldDogZnVuY3Rpb24oKSB7XG4gICAgICAqIGFsZXJ0KCdIZWxsbyAnICsgdGhpcy5uYW1lICsgJyEnKTtcbiAgICAgICogfVxuICAgICAgKiB9KTtcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogaXMgZXF1aXZhbGVudCB0byBFUzY6XG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgICAgKiBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAqIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAqIH1cbiAgICAgICogKlxuICAgICAgKiBncmVldCgpIHtcbiAgICAgICogYWxlcnQoJ0hlbGxvICcgKyB0aGlzLm5hbWUgKyAnIScpO1xuICAgICAgKiB9XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogb3IgZXF1aXZhbGVudCB0byBFUzU6XG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIHZhciBHcmVldGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICogdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIEdyZWV0ZXIucHJvdG90eXBlLmdyZWV0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgKiBhbGVydCgnSGVsbG8gJyArIHRoaXMubmFtZSArICchJyk7XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgd2l0aCBwYXJhbWV0ZXIgYW5ub3RhdGlvbnNcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogdmFyIE15U2VydmljZSA9IG5nLkNsYXNzKHtcbiAgICAgICogY29uc3RydWN0b3I6IFtTdHJpbmcsIFtuZXcgT3B0aW9uYWwoKSwgU2VydmljZV0sIGZ1bmN0aW9uKG5hbWUsIG15U2VydmljZSkge1xuICAgICAgKiAuLi5cbiAgICAgICogfV1cbiAgICAgICogfSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIGlzIGVxdWl2YWxlbnQgdG8gRVM2OlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBjbGFzcyBNeVNlcnZpY2Uge1xuICAgICAgKiBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIEBPcHRpb25hbCgpIG15U2VydmljZTogU2VydmljZSkge1xuICAgICAgKiAuLi5cbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIHdpdGggaW5oZXJpdGFuY2VcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogdmFyIFNoYXBlID0gbmcuQ2xhc3Moe1xuICAgICAgKiBjb25zdHJ1Y3RvcjogKGNvbG9yKSB7XG4gICAgICAqIHRoaXMuY29sb3IgPSBjb2xvcjtcbiAgICAgICogfVxuICAgICAgKiB9KTtcbiAgICAgICogKlxuICAgICAgKiB2YXIgU3F1YXJlID0gbmcuQ2xhc3Moe1xuICAgICAgKiBleHRlbmRzOiBTaGFwZSxcbiAgICAgICogY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbG9yLCBzaXplKSB7XG4gICAgICAqIFNoYXBlLmNhbGwodGhpcywgY29sb3IpO1xuICAgICAgKiB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgKiB9XG4gICAgICAqIH0pO1xuICAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gez99IGNsc0RlZlxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gQ2xhc3MoY2xzRGVmKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbnN0cnVjdG9yID0gYXBwbHlQYXJhbXMoY2xzRGVmLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpID8gY2xzRGVmLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLCAnY29uc3RydWN0b3InKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvdG8gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgIGlmIChjbHNEZWYuaGFzT3duUHJvcGVydHkoJ2V4dGVuZHMnKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjbHNEZWYuZXh0ZW5kcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICgoY29uc3RydWN0b3IpKS5wcm90b3R5cGUgPSBwcm90byA9XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5jcmVhdGUoKChjbHNEZWYuZXh0ZW5kcykpLnByb3RvdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBkZWZpbml0aW9uICdleHRlbmRzJyBwcm9wZXJ0eSBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzOiBcIiArIHN0cmluZ2lmeShjbHNEZWYuZXh0ZW5kcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjbHNEZWYpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdleHRlbmRzJyAmJiBrZXkgIT09ICdwcm90b3R5cGUnICYmIGNsc0RlZi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9ba2V5XSA9IGFwcGx5UGFyYW1zKGNsc0RlZltrZXldLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMuYW5ub3RhdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgnYW5ub3RhdGlvbnMnLCB0aGlzLmFubm90YXRpb25zLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uc3RydWN0b3JOYW1lID0gY29uc3RydWN0b3JbJ25hbWUnXTtcbiAgICAgICAgaWYgKCFjb25zdHJ1Y3Rvck5hbWUgfHwgY29uc3RydWN0b3JOYW1lID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAoKGNvbnN0cnVjdG9yKSlbJ292ZXJyaWRkZW5OYW1lJ10gPSBcImNsYXNzXCIgKyBfbmV4dENsYXNzSWQrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICogQHBhcmFtIHs/fSBwcm9wc1xuICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudENsYXNzXG4gICAgICogQHBhcmFtIHs/PX0gY2hhaW5GblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFrZURlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGNoYWluRm4pIHtcbiAgICAgICAgaWYgKGNoYWluRm4gPT09IHZvaWQgMCkgeyBjaGFpbkZuID0gbnVsbDsgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IoW3Byb3BzXSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG9iak9yVHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdG9yRmFjdG9yeShvYmpPclR5cGUpIHtcbiAgICAgICAgICAgIGlmICghKFJlZmxlY3QgJiYgUmVmbGVjdC5nZXRPd25NZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAncmVmbGVjdC1tZXRhZGF0YSBzaGltIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgY2xhc3MgZGVjb3JhdG9ycyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERlY29yYXRvckZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBtZXRhQ3Rvci5jYWxsKHRoaXMsIG9iak9yVHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgKChEZWNvcmF0b3JGYWN0b3J5KSkob2JqT3JUeXBlKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoYWluQW5ub3RhdGlvbiA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nICYmIEFycmF5LmlzQXJyYXkodGhpcy5hbm5vdGF0aW9ucykgPyB0aGlzLmFubm90YXRpb25zIDogW107XG4gICAgICAgICAgICBjaGFpbkFubm90YXRpb24ucHVzaChhbm5vdGF0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVHlwZURlY29yYXRvciA9IChmdW5jdGlvbiBUeXBlRGVjb3JhdG9yKGNscykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb25zID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnYW5ub3RhdGlvbnMnLCBjbHMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdhbm5vdGF0aW9ucycsIGFubm90YXRpb25zLCBjbHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbHM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFR5cGVEZWNvcmF0b3IuYW5ub3RhdGlvbnMgPSBjaGFpbkFubm90YXRpb247XG4gICAgICAgICAgICBUeXBlRGVjb3JhdG9yLkNsYXNzID0gQ2xhc3M7XG4gICAgICAgICAgICBpZiAoY2hhaW5GbilcbiAgICAgICAgICAgICAgICBjaGFpbkZuKFR5cGVEZWNvcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIFR5cGVEZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7XG4gICAgICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChcIkBcIiArIG5hbWUpOyB9O1xuICAgICAgICAoKERlY29yYXRvckZhY3RvcnkpKS5hbm5vdGF0aW9uQ2xzID0gRGVjb3JhdG9yRmFjdG9yeTtcbiAgICAgICAgcmV0dXJuIERlY29yYXRvckZhY3Rvcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcHJvcHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcmdWYWwgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWluIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICBfdGhpc1twcm9wWzBdXSA9IGFyZ1ZhbCA9PT0gdW5kZWZpbmVkID8gcHJvcFsxXSA6IGFyZ1ZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzW3Byb3BOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVmFsICYmIGFyZ1ZhbC5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgPyBhcmdWYWxbcHJvcE5hbWVdIDogcHJvcFtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICogQHBhcmFtIHs/fSBwcm9wc1xuICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudENsYXNzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYWtlUGFyYW1EZWNvcmF0b3IobmFtZSwgcHJvcHMsIHBhcmVudENsYXNzKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1ldGFDdG9yID0gbWFrZU1ldGFkYXRhQ3Rvcihwcm9wcyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3NcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkge1xuICAgICAgICAgICAgICAgIG1ldGFDdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5ub3RhdGlvbkluc3RhbmNlID0gbmV3ICgoX2EgPSAoKFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkpKS5iaW5kLmFwcGx5KF9hLCBbdm9pZCAwXS5jb25jYXQoYXJncykpKSgpO1xuICAgICAgICAgICAgKChQYXJhbURlY29yYXRvcikpLmFubm90YXRpb24gPSBhbm5vdGF0aW9uSW5zdGFuY2U7XG4gICAgICAgICAgICByZXR1cm4gUGFyYW1EZWNvcmF0b3I7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2xzXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHVudXNlZEtleVxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZnVuY3Rpb24gUGFyYW1EZWNvcmF0b3IoY2xzLCB1bnVzZWRLZXksIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1ldGVycyA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoJ3BhcmFtZXRlcnMnLCBjbHMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIGdhcHMgaWYgc29tZSBpbiBiZXR3ZWVuIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgYW5ub3RhdGlvbnMuXG4gICAgICAgICAgICAgICAgLy8gd2UgcGFkIHdpdGggbnVsbHMuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tpbmRleF0gPSBwYXJhbWV0ZXJzW2luZGV4XSB8fCBbXTtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2luZGV4XS5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgncGFyYW1ldGVycycsIHBhcmFtZXRlcnMsIGNscyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q2xhc3MpIHtcbiAgICAgICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChcIkBcIiArIG5hbWUpOyB9O1xuICAgICAgICAoKFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkpLmFubm90YXRpb25DbHMgPSBQYXJhbURlY29yYXRvckZhY3Rvcnk7XG4gICAgICAgIHJldHVybiBQYXJhbURlY29yYXRvckZhY3Rvcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAqIEBwYXJhbSB7P30gcHJvcHNcbiAgICAgKiBAcGFyYW0gez89fSBwYXJlbnRDbGFzc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFrZVByb3BEZWNvcmF0b3IobmFtZSwgcHJvcHMsIHBhcmVudENsYXNzKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1ldGFDdG9yID0gbWFrZU1ldGFkYXRhQ3Rvcihwcm9wcyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3NcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3JGYWN0b3J5KCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvcERlY29yYXRvckZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICBtZXRhQ3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlY29yYXRvckluc3RhbmNlID0gbmV3ICgoX2EgPSAoKFByb3BEZWNvcmF0b3JGYWN0b3J5KSkpLmJpbmQuYXBwbHkoX2EsIFt2b2lkIDBdLmNvbmNhdChhcmdzKSkpKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gUHJvcERlY29yYXRvcih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtZXRhID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgdGFyZ2V0LmNvbnN0cnVjdG9yKSB8fCB7fTtcbiAgICAgICAgICAgICAgICBtZXRhW25hbWVdID0gbWV0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBtZXRhW25hbWVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIG1ldGFbbmFtZV0udW5zaGlmdChkZWNvcmF0b3JJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgbWV0YSwgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7XG4gICAgICAgICAgICBQcm9wRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgUHJvcERlY29yYXRvckZhY3RvcnkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKFwiQFwiICsgbmFtZSk7IH07XG4gICAgICAgICgoUHJvcERlY29yYXRvckZhY3RvcnkpKS5hbm5vdGF0aW9uQ2xzID0gUHJvcERlY29yYXRvckZhY3Rvcnk7XG4gICAgICAgIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmplY3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKiBAQW5ub3RhdGlvblxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEluamVjdCA9IG1ha2VQYXJhbURlY29yYXRvcignSW5qZWN0JywgW1sndG9rZW4nLCB1bmRlZmluZWRdXSk7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKiBAQW5ub3RhdGlvblxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIE9wdGlvbmFsID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdPcHRpb25hbCcsIFtdKTtcbiAgICAvKipcbiAgICAgKiBJbmplY3RhYmxlIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBJbmplY3RhYmxlID0gKG1ha2VEZWNvcmF0b3IoJ0luamVjdGFibGUnLCBbXSkpO1xuICAgIC8qKlxuICAgICAqIFNlbGYgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKiBAQW5ub3RhdGlvblxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIFNlbGYgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ1NlbGYnLCBbXSk7XG4gICAgLyoqXG4gICAgICogU2tpcFNlbGYgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKiBAQW5ub3RhdGlvblxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIFNraXBTZWxmID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdTa2lwU2VsZicsIFtdKTtcbiAgICAvKipcbiAgICAgKiBIb3N0IGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBIb3N0ID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdIb3N0JywgW10pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBESSBQcm92aWRlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZczllelhwajJNbm95M1VjOEtCcD9wPXByZXZpZXcpKVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHZhciB0ID0gbmV3IE9wYXF1ZVRva2VuKFwidmFsdWVcIik7XG4gICAgICpcbiAgICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgKiAgIHtwcm92aWRlOiB0LCB1c2VWYWx1ZTogXCJiaW5kaW5nVmFsdWVcIn1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGV4cGVjdChpbmplY3Rvci5nZXQodCkpLnRvRXF1YWwoXCJiaW5kaW5nVmFsdWVcIik7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBVc2luZyBhbiBgT3BhcXVlVG9rZW5gIGlzIHByZWZlcmFibGUgdG8gdXNpbmcgc3RyaW5ncyBhcyB0b2tlbnMgYmVjYXVzZSBvZiBwb3NzaWJsZSBjb2xsaXNpb25zXG4gICAgICogY2F1c2VkIGJ5IG11bHRpcGxlIHByb3ZpZGVycyB1c2luZyB0aGUgc2FtZSBzdHJpbmcgYXMgdHdvIGRpZmZlcmVudCB0b2tlbnMuXG4gICAgICpcbiAgICAgKiBVc2luZyBhbiBgT3BhcXVlVG9rZW5gIGlzIHByZWZlcmFibGUgdG8gdXNpbmcgYW4gYE9iamVjdGAgYXMgdG9rZW5zIGJlY2F1c2UgaXQgcHJvdmlkZXMgYmV0dGVyXG4gICAgICogZXJyb3IgbWVzc2FnZXMuXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIC8vIHNvIHRoYXQgbWV0YWRhdGEgaXMgZ2F0aGVyZWQgZm9yIHRoaXMgY2xhc3NcbiAgICB2YXIgT3BhcXVlVG9rZW4gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfZGVzY1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gT3BhcXVlVG9rZW4oX2Rlc2MpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rlc2MgPSBfZGVzYztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE9wYXF1ZVRva2VuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiVG9rZW4gXCIgKyB0aGlzLl9kZXNjOyB9O1xuICAgICAgICBPcGFxdWVUb2tlbi5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBPcGFxdWVUb2tlbi5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBPcGFxdWVUb2tlbjtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyB0b2tlbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB2aXJ0dWFsIHByb3ZpZGVyIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGVcbiAgICAgKiBgZW50cnlDb21wb25lbnRzYCBmaWVsZHMgb2YgY29tcG9uZW50cyBhbmQgbmcgbW9kdWxlcyBiYXNlZCBvbiBpdHMgYHVzZVZhbHVlYC5cbiAgICAgKiBBbGwgY29tcG9uZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSBgdXNlVmFsdWVgIHZhbHVlIChlaXRoZXIgZGlyZWN0bHlcbiAgICAgKiBvciBpbiBhIG5lc3RlZCBhcnJheSBvciBtYXApIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGBlbnRyeUNvbXBvbmVudHNgIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRoZSByb3V0ZXIgY2FuIHBvcHVsYXRlIHRoZSBgZW50cnlDb21wb25lbnRzYFxuICAgICAqIGZpZWxkIG9mIGFuIE5nTW9kdWxlIGJhc2VkIG9uIHRoZSByb3V0ZXIgY29uZmlndXJhdGlvbiB3aGljaCByZWZlcnNcbiAgICAgKiB0byBjb21wb25lbnRzLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGhlbHBlciBmdW5jdGlvbiBpbnNpZGUgdGhlIHJvdXRlclxuICAgICAqIGZ1bmN0aW9uIHByb3ZpZGVSb3V0ZXMocm91dGVzKSB7XG4gICAgICogICByZXR1cm4gW1xuICAgICAqICAgICB7cHJvdmlkZTogUk9VVEVTLCB1c2VWYWx1ZTogcm91dGVzfSxcbiAgICAgKiAgICAge3Byb3ZpZGU6IEFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMsIHVzZVZhbHVlOiByb3V0ZXMsIG11bHRpOiB0cnVlfVxuICAgICAqICAgXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyB1c2VyIGNvZGVcbiAgICAgKiBsZXQgcm91dGVzID0gW1xuICAgICAqICAge3BhdGg6ICcvcm9vdCcsIGNvbXBvbmVudDogUm9vdENvbXB9LFxuICAgICAqICAge3BhdGg6ICcvdGVhbXMnLCBjb21wb25lbnQ6IFRlYW1zQ29tcH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogQE5nTW9kdWxlKHtcbiAgICAgKiAgIHByb3ZpZGVyczogW3Byb3ZpZGVSb3V0ZXMocm91dGVzKV1cbiAgICAgKiB9KVxuICAgICAqIGNsYXNzIE1vZHVsZVdpdGhSb3V0ZXMge31cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0gbmV3IE9wYXF1ZVRva2VuKCdBbmFseXplRm9yRW50cnlDb21wb25lbnRzJyk7XG4gICAgLyoqXG4gICAgICogQXR0cmlidXRlIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBdHRyaWJ1dGUgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ0F0dHJpYnV0ZScsIFtbJ2F0dHJpYnV0ZU5hbWUnLCB1bmRlZmluZWRdXSk7XG4gICAgLyoqXG4gICAgICogIEJhc2UgY2xhc3MgZm9yIHF1ZXJ5IG1ldGFkYXRhLlxuICAgICAgKiAqXG4gICAgICAqIFNlZSB7QGxpbmsgQ29udGVudENoaWxkcmVufSwge0BsaW5rIENvbnRlbnRDaGlsZH0sIHtAbGluayBWaWV3Q2hpbGRyZW59LCB7QGxpbmsgVmlld0NoaWxkfSBmb3JcbiAgICAgICogbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBRdWVyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFF1ZXJ5KCkge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRdWVyeTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIENvbnRlbnRDaGlsZHJlbiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogIEBzdGFibGVcbiAgICAgKiAgQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDb250ZW50Q2hpbGRyZW4gPSAobWFrZVByb3BEZWNvcmF0b3IoJ0NvbnRlbnRDaGlsZHJlbicsIFtcbiAgICAgICAgWydzZWxlY3RvcicsIHVuZGVmaW5lZF0sIHtcbiAgICAgICAgICAgIGZpcnN0OiBmYWxzZSxcbiAgICAgICAgICAgIGlzVmlld1F1ZXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NlbmRhbnRzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgIF0sIFF1ZXJ5KSk7XG4gICAgLyoqXG4gICAgICogQHdoYXRJdERvZXMgQ29uZmlndXJlcyBhIGNvbnRlbnQgcXVlcnkuXG4gICAgICpcbiAgICAgKiBAaG93VG9Vc2VcbiAgICAgKlxuICAgICAqIHtAZXhhbXBsZSBjb3JlL2RpL3RzL2NvbnRlbnRDaGlsZC9jb250ZW50X2NoaWxkX2hvd3RvLnRzIHJlZ2lvbj0nSG93VG8nfVxuICAgICAqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHVzZSBDb250ZW50Q2hpbGQgdG8gZ2V0IHRoZSBmaXJzdCBlbGVtZW50IG9yIHRoZSBkaXJlY3RpdmUgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGZyb20gdGhlXG4gICAgICogY29udGVudCBET00uIElmIHRoZSBjb250ZW50IERPTSBjaGFuZ2VzLCBhbmQgYSBuZXcgY2hpbGQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXG4gICAgICogdGhlIHByb3BlcnR5IHdpbGwgYmUgdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgICAqXG4gICAgICogKipNZXRhZGF0YSBQcm9wZXJ0aWVzKio6XG4gICAgICpcbiAgICAgKiAqICoqc2VsZWN0b3IqKiAtIHRoZSBkaXJlY3RpdmUgdHlwZSBvciB0aGUgbmFtZSB1c2VkIGZvciBxdWVyeWluZy5cbiAgICAgKiAqICoqcmVhZCoqIC0gcmVhZCBhIGRpZmZlcmVudCB0b2tlbiBmcm9tIHRoZSBxdWVyaWVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBMZXQncyBsb29rIGF0IGFuIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiB7QGV4YW1wbGUgY29yZS9kaS90cy9jb250ZW50Q2hpbGQvY29udGVudF9jaGlsZF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAgICAgKlxuICAgICAqICoqbnBtIHBhY2thZ2UqKjogYEBhbmd1bGFyL2NvcmVgXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDb250ZW50Q2hpbGQgPSBtYWtlUHJvcERlY29yYXRvcignQ29udGVudENoaWxkJywgW1xuICAgICAgICBbJ3NlbGVjdG9yJywgdW5kZWZpbmVkXSwge1xuICAgICAgICAgICAgZmlyc3Q6IHRydWUsXG4gICAgICAgICAgICBpc1ZpZXdRdWVyeTogZmFsc2UsXG4gICAgICAgICAgICBkZXNjZW5kYW50czogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgIF0sIFF1ZXJ5KTtcbiAgICAvKipcbiAgICAgKiBAd2hhdEl0RG9lcyBDb25maWd1cmVzIGEgdmlldyBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBob3dUb1VzZVxuICAgICAqXG4gICAgICoge0BleGFtcGxlIGNvcmUvZGkvdHMvdmlld0NoaWxkcmVuL3ZpZXdfY2hpbGRyZW5faG93dG8udHMgcmVnaW9uPSdIb3dUbyd9XG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIFZpZXdDaGlsZHJlbiB0byBnZXQgdGhlIHtAbGluayBRdWVyeUxpc3R9IG9mIGVsZW1lbnRzIG9yIGRpcmVjdGl2ZXMgZnJvbSB0aGVcbiAgICAgKiB2aWV3IERPTS4gQW55IHRpbWUgYSBjaGlsZCBlbGVtZW50IGlzIGFkZGVkLCByZW1vdmVkLCBvciBtb3ZlZCwgdGhlIHF1ZXJ5IGxpc3Qgd2lsbCBiZSB1cGRhdGVkLFxuICAgICAqIGFuZCB0aGUgY2hhbmdlcyBvYnNlcnZhYmxlIG9mIHRoZSBxdWVyeSBsaXN0IHdpbGwgZW1pdCBhIG5ldyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFZpZXcgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgICAqXG4gICAgICogKipNZXRhZGF0YSBQcm9wZXJ0aWVzKio6XG4gICAgICpcbiAgICAgKiAqICoqc2VsZWN0b3IqKiAtIHRoZSBkaXJlY3RpdmUgdHlwZSBvciB0aGUgbmFtZSB1c2VkIGZvciBxdWVyeWluZy5cbiAgICAgKiAqICoqcmVhZCoqIC0gcmVhZCBhIGRpZmZlcmVudCB0b2tlbiBmcm9tIHRoZSBxdWVyaWVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogTGV0J3MgbG9vayBhdCBhbiBleGFtcGxlOlxuICAgICAqXG4gICAgICoge0BleGFtcGxlIGNvcmUvZGkvdHMvdmlld0NoaWxkcmVuL3ZpZXdfY2hpbGRyZW5fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gICAgICpcbiAgICAgKiAqKm5wbSBwYWNrYWdlKio6IGBAYW5ndWxhci9jb3JlYFxuICAgICAqXG4gICAgICogQHN0YWJsZVxuICAgICAqIEBBbm5vdGF0aW9uXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVmlld0NoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ1ZpZXdDaGlsZHJlbicsIFtcbiAgICAgICAgWydzZWxlY3RvcicsIHVuZGVmaW5lZF0sIHtcbiAgICAgICAgICAgIGZpcnN0OiBmYWxzZSxcbiAgICAgICAgICAgIGlzVmlld1F1ZXJ5OiB0cnVlLFxuICAgICAgICAgICAgZGVzY2VuZGFudHM6IHRydWUsXG4gICAgICAgICAgICByZWFkOiB1bmRlZmluZWQsXG4gICAgICAgIH1cbiAgICBdLCBRdWVyeSk7XG4gICAgLyoqXG4gICAgICogVmlld0NoaWxkIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWaWV3Q2hpbGQgPSBtYWtlUHJvcERlY29yYXRvcignVmlld0NoaWxkJywgW1xuICAgICAgICBbJ3NlbGVjdG9yJywgdW5kZWZpbmVkXSwge1xuICAgICAgICAgICAgZmlyc3Q6IHRydWUsXG4gICAgICAgICAgICBpc1ZpZXdRdWVyeTogdHJ1ZSxcbiAgICAgICAgICAgIGRlc2NlbmRhbnRzOiB0cnVlLFxuICAgICAgICAgICAgcmVhZDogdW5kZWZpbmVkLFxuICAgICAgICB9XG4gICAgXSwgUXVlcnkpO1xuXG4gICAgdmFyIENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0ge307XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoID0gMDtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0ID0gMTtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hdID0gXCJPblB1c2hcIjtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XSA9IFwiRGVmYXVsdFwiO1xuICAgIHZhciBDaGFuZ2VEZXRlY3RvclN0YXR1cyA9IHt9O1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrT25jZSA9IDA7XG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuQ2hlY2tlZCA9IDE7XG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuQ2hlY2tBbHdheXMgPSAyO1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzLkRldGFjaGVkID0gMztcbiAgICBDaGFuZ2VEZXRlY3RvclN0YXR1cy5FcnJvcmVkID0gNDtcbiAgICBDaGFuZ2VEZXRlY3RvclN0YXR1cy5EZXN0cm95ZWQgPSA1O1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrT25jZV0gPSBcIkNoZWNrT25jZVwiO1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrZWRdID0gXCJDaGVja2VkXCI7XG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuQ2hlY2tBbHdheXNdID0gXCJDaGVja0Fsd2F5c1wiO1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzLkRldGFjaGVkXSA9IFwiRGV0YWNoZWRcIjtcbiAgICBDaGFuZ2VEZXRlY3RvclN0YXR1c1tDaGFuZ2VEZXRlY3RvclN0YXR1cy5FcnJvcmVkXSA9IFwiRXJyb3JlZFwiO1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzLkRlc3Ryb3llZF0gPSBcIkRlc3Ryb3llZFwiO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRGVmYXVsdENoYW5nZURldGVjdGlvblN0cmF0ZWd5KGNoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB7XG4gICAgICAgIHJldHVybiBpc0JsYW5rKGNoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB8fFxuICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlyZWN0aXZlIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEaXJlY3RpdmUgPSAobWFrZURlY29yYXRvcignRGlyZWN0aXZlJywge1xuICAgICAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgICAgICBpbnB1dHM6IHVuZGVmaW5lZCxcbiAgICAgICAgb3V0cHV0czogdW5kZWZpbmVkLFxuICAgICAgICBob3N0OiB1bmRlZmluZWQsXG4gICAgICAgIHByb3ZpZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBleHBvcnRBczogdW5kZWZpbmVkLFxuICAgICAgICBxdWVyaWVzOiB1bmRlZmluZWRcbiAgICB9KSk7XG4gICAgLyoqXG4gICAgICogQ29tcG9uZW50IGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDb21wb25lbnQgPSAobWFrZURlY29yYXRvcignQ29tcG9uZW50Jywge1xuICAgICAgICBzZWxlY3RvcjogdW5kZWZpbmVkLFxuICAgICAgICBpbnB1dHM6IHVuZGVmaW5lZCxcbiAgICAgICAgb3V0cHV0czogdW5kZWZpbmVkLFxuICAgICAgICBob3N0OiB1bmRlZmluZWQsXG4gICAgICAgIGV4cG9ydEFzOiB1bmRlZmluZWQsXG4gICAgICAgIG1vZHVsZUlkOiB1bmRlZmluZWQsXG4gICAgICAgIHByb3ZpZGVyczogdW5kZWZpbmVkLFxuICAgICAgICB2aWV3UHJvdmlkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgICAgICAgcXVlcmllczogdW5kZWZpbmVkLFxuICAgICAgICB0ZW1wbGF0ZVVybDogdW5kZWZpbmVkLFxuICAgICAgICB0ZW1wbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBzdHlsZVVybHM6IHVuZGVmaW5lZCxcbiAgICAgICAgc3R5bGVzOiB1bmRlZmluZWQsXG4gICAgICAgIGFuaW1hdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgZW5jYXBzdWxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBpbnRlcnBvbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIGVudHJ5Q29tcG9uZW50czogdW5kZWZpbmVkXG4gICAgfSwgRGlyZWN0aXZlKSk7XG4gICAgLyoqXG4gICAgICogUGlwZSBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHN0YWJsZVxuICAgICAqIEBBbm5vdGF0aW9uXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUGlwZSA9IChtYWtlRGVjb3JhdG9yKCdQaXBlJywge1xuICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHB1cmU6IHRydWUsXG4gICAgfSkpO1xuICAgIC8qKlxuICAgICAqIElucHV0IGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBJbnB1dCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdJbnB1dCcsIFtbJ2JpbmRpbmdQcm9wZXJ0eU5hbWUnLCB1bmRlZmluZWRdXSk7XG4gICAgLyoqXG4gICAgICogT3V0cHV0IGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICogQEFubm90YXRpb25cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBPdXRwdXQgPSBtYWtlUHJvcERlY29yYXRvcignT3V0cHV0JywgW1snYmluZGluZ1Byb3BlcnR5TmFtZScsIHVuZGVmaW5lZF1dKTtcbiAgICAvKipcbiAgICAgKiBIb3N0QmluZGluZyBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHN0YWJsZVxuICAgICAqIEBBbm5vdGF0aW9uXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSG9zdEJpbmRpbmcgPSBtYWtlUHJvcERlY29yYXRvcignSG9zdEJpbmRpbmcnLCBbWydob3N0UHJvcGVydHlOYW1lJywgdW5kZWZpbmVkXV0pO1xuICAgIC8qKlxuICAgICAqIEhvc3RMaXN0ZW5lciBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICAgICAqXG4gICAgICogQHN0YWJsZVxuICAgICAqIEBBbm5vdGF0aW9uXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSG9zdExpc3RlbmVyID0gbWFrZVByb3BEZWNvcmF0b3IoJ0hvc3RMaXN0ZW5lcicsIFtbJ2V2ZW50TmFtZScsIHVuZGVmaW5lZF0sIFsnYXJncycsIFtdXV0pO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBMaWZlY3ljbGVIb29rcyA9IHt9O1xuICAgIExpZmVjeWNsZUhvb2tzLk9uSW5pdCA9IDA7XG4gICAgTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95ID0gMTtcbiAgICBMaWZlY3ljbGVIb29rcy5Eb0NoZWNrID0gMjtcbiAgICBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXMgPSAzO1xuICAgIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQgPSA0O1xuICAgIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQgPSA1O1xuICAgIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0luaXQgPSA2O1xuICAgIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWQgPSA3O1xuICAgIExpZmVjeWNsZUhvb2tzW0xpZmVjeWNsZUhvb2tzLk9uSW5pdF0gPSBcIk9uSW5pdFwiO1xuICAgIExpZmVjeWNsZUhvb2tzW0xpZmVjeWNsZUhvb2tzLk9uRGVzdHJveV0gPSBcIk9uRGVzdHJveVwiO1xuICAgIExpZmVjeWNsZUhvb2tzW0xpZmVjeWNsZUhvb2tzLkRvQ2hlY2tdID0gXCJEb0NoZWNrXCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3MuT25DaGFuZ2VzXSA9IFwiT25DaGFuZ2VzXCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50SW5pdF0gPSBcIkFmdGVyQ29udGVudEluaXRcIjtcbiAgICBMaWZlY3ljbGVIb29rc1tMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRDaGVja2VkXSA9IFwiQWZ0ZXJDb250ZW50Q2hlY2tlZFwiO1xuICAgIExpZmVjeWNsZUhvb2tzW0xpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0luaXRdID0gXCJBZnRlclZpZXdJbml0XCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3Q2hlY2tlZF0gPSBcIkFmdGVyVmlld0NoZWNrZWRcIjtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBMSUZFQ1lDTEVfSE9PS1NfVkFMVUVTID0gW1xuICAgICAgICBMaWZlY3ljbGVIb29rcy5PbkluaXQsIExpZmVjeWNsZUhvb2tzLk9uRGVzdHJveSwgTGlmZWN5Y2xlSG9va3MuRG9DaGVjaywgTGlmZWN5Y2xlSG9va3MuT25DaGFuZ2VzLFxuICAgICAgICBMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRJbml0LCBMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRDaGVja2VkLCBMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdJbml0LFxuICAgICAgICBMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdDaGVja2VkXG4gICAgXTtcbiAgICAvKipcbiAgICAgKiAge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbGlmZWN5Y2xlX2hvb2tzX3NwZWMudHMgcmVnaW9uPSdPbkNoYW5nZXMnfVxuICAgICAgKiAqXG4gICAgICAqIGBuZ09uQ2hhbmdlc2AgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBkYXRhLWJvdW5kIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGJlZm9yZSB2aWV3XG4gICAgICAqIGFuZCBjb250ZW50IGNoaWxkcmVuIGFyZSBjaGVja2VkIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGhhcyBjaGFuZ2VkLlxuICAgICAgKiBUaGUgYGNoYW5nZXNgIHBhcmFtZXRlciBjb250YWlucyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLlxuICAgICAgKiAqXG4gICAgICAqIFNlZSB7QGxpbmtEb2NzIGd1aWRlL2xpZmVjeWNsZS1ob29rcyNvbmNoYW5nZXMgXCJMaWZlY3ljbGUgSG9va3MgR3VpZGVcIn0uXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgT25DaGFuZ2VzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gT25DaGFuZ2VzKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBPbkNoYW5nZXMucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHsgfTtcbiAgICAgICAgcmV0dXJuIE9uQ2hhbmdlcztcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBpbml0aWFsaXplZC5cbiAgICAgICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbGlmZWN5Y2xlX2hvb2tzX3NwZWMudHMgcmVnaW9uPSdPbkluaXQnfVxuICAgICAgKiAqXG4gICAgICAqIGBuZ09uSW5pdGAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBkaXJlY3RpdmUncyBkYXRhLWJvdW5kIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIHRoZVxuICAgICAgKiBmaXJzdCB0aW1lLCBhbmQgYmVmb3JlIGFueSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlXG4gICAgICAqIGRpcmVjdGl2ZSBpcyBpbnN0YW50aWF0ZWQuXG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGlua0RvY3MgZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzIFwiTGlmZWN5Y2xlIEhvb2tzIEd1aWRlXCJ9LlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIE9uSW5pdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIE9uSW5pdCgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBPbkluaXQucHJvdG90eXBlLm5nT25Jbml0ID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICByZXR1cm4gT25Jbml0O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL2xpZmVjeWNsZV9ob29rc19zcGVjLnRzIHJlZ2lvbj0nRG9DaGVjayd9XG4gICAgICAqICpcbiAgICAgICogYG5nRG9DaGVja2AgZ2V0cyBjYWxsZWQgdG8gY2hlY2sgdGhlIGNoYW5nZXMgaW4gdGhlIGRpcmVjdGl2ZXMgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRcbiAgICAgICogYWxnb3JpdGhtLiBUaGUgZGVmYXVsdCBjaGFuZ2UgZGV0ZWN0aW9uIGFsZ29yaXRobSBsb29rcyBmb3IgZGlmZmVyZW5jZXMgYnkgY29tcGFyaW5nXG4gICAgICAqIGJvdW5kLXByb3BlcnR5IHZhbHVlcyBieSByZWZlcmVuY2UgYWNyb3NzIGNoYW5nZSBkZXRlY3Rpb24gcnVucy5cbiAgICAgICogKlxuICAgICAgKiBOb3RlIHRoYXQgYSBkaXJlY3RpdmUgdHlwaWNhbGx5IHNob3VsZCBub3QgdXNlIGJvdGggYERvQ2hlY2tgIGFuZCB7QGxpbmsgT25DaGFuZ2VzfSB0byByZXNwb25kIHRvXG4gICAgICAqIGNoYW5nZXMgb24gdGhlIHNhbWUgaW5wdXQsIGFzIGBuZ09uQ2hhbmdlc2Agd2lsbCBjb250aW51ZSB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZGVmYXVsdCBjaGFuZ2VcbiAgICAgICogZGV0ZWN0b3IgZGV0ZWN0cyBjaGFuZ2VzLlxuICAgICAgKiAqXG4gICAgICAqIFNlZSB7QGxpbmsgS2V5VmFsdWVEaWZmZXJzfSBhbmQge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gZm9yIGltcGxlbWVudGluZyBjdXN0b20gZGlydHkgY2hlY2tpbmdcbiAgICAgICogZm9yIGNvbGxlY3Rpb25zLlxuICAgICAgKiAqXG4gICAgICAqIFNlZSB7QGxpbmtEb2NzIGd1aWRlL2xpZmVjeWNsZS1ob29rcyNkb2NoZWNrIFwiTGlmZWN5Y2xlIEhvb2tzIEd1aWRlXCJ9LlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIERvQ2hlY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBEb0NoZWNrKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERvQ2hlY2sucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgcmV0dXJuIERvQ2hlY2s7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbGlmZWN5Y2xlX2hvb2tzX3NwZWMudHMgcmVnaW9uPSdPbkRlc3Ryb3knfVxuICAgICAgKiAqXG4gICAgICAqIGBuZ09uRGVzdHJveWAgY2FsbGJhY2sgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFueSBjdXN0b20gY2xlYW51cCB0aGF0IG5lZWRzIHRvIG9jY3VyIHdoZW4gdGhlXG4gICAgICAqIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cbiAgICAgICogKlxuICAgICAgKiBTZWUge0BsaW5rRG9jcyBndWlkZS9saWZlY3ljbGUtaG9va3MgXCJMaWZlY3ljbGUgSG9va3MgR3VpZGVcIn0uXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgT25EZXN0cm95ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gT25EZXN0cm95KCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE9uRGVzdHJveS5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIHJldHVybiBPbkRlc3Ryb3k7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBpbml0aWFsaXplZC5cbiAgICAgICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbGlmZWN5Y2xlX2hvb2tzX3NwZWMudHMgcmVnaW9uPSdBZnRlckNvbnRlbnRJbml0J31cbiAgICAgICogKlxuICAgICAgKiBTZWUge0BsaW5rRG9jcyBndWlkZS9saWZlY3ljbGUtaG9va3MjYWZ0ZXJjb250ZW50IFwiTGlmZWN5Y2xlIEhvb2tzIEd1aWRlXCJ9LlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIEFmdGVyQ29udGVudEluaXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFmdGVyQ29udGVudEluaXQucHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgcmV0dXJuIEFmdGVyQ29udGVudEluaXQ7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbGlmZWN5Y2xlX2hvb2tzX3NwZWMudHMgcmVnaW9uPSdBZnRlckNvbnRlbnRDaGVja2VkJ31cbiAgICAgICogKlxuICAgICAgKiBTZWUge0BsaW5rRG9jcyBndWlkZS9saWZlY3ljbGUtaG9va3MjYWZ0ZXJjb250ZW50IFwiTGlmZWN5Y2xlIEhvb2tzIEd1aWRlXCJ9LlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIEFmdGVyQ29udGVudENoZWNrZWQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFmdGVyQ29udGVudENoZWNrZWQucHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgcmV0dXJuIEFmdGVyQ29udGVudENoZWNrZWQ7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgaW5pdGlhbGl6ZWQuXG4gICAgICAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL2xpZmVjeWNsZV9ob29rc19zcGVjLnRzIHJlZ2lvbj0nQWZ0ZXJWaWV3SW5pdCd9XG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGlua0RvY3MgZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzI2FmdGVydmlldyBcIkxpZmVjeWNsZSBIb29rcyBHdWlkZVwifS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBZnRlclZpZXdJbml0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBZnRlclZpZXdJbml0LnByb3RvdHlwZS5uZ0FmdGVyVmlld0luaXQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIHJldHVybiBBZnRlclZpZXdJbml0O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL2xpZmVjeWNsZV9ob29rc19zcGVjLnRzIHJlZ2lvbj0nQWZ0ZXJWaWV3Q2hlY2tlZCd9XG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGlua0RvY3MgZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzI2FmdGVydmlldyBcIkxpZmVjeWNsZSBIb29rcyBHdWlkZVwifS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBZnRlclZpZXdDaGVja2VkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBZnRlclZpZXdDaGVja2VkLnByb3RvdHlwZS5uZ0FmdGVyVmlld0NoZWNrZWQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIHJldHVybiBBZnRlclZpZXdDaGVja2VkO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGEgc2NoZW1hIHRoYXQgd2lsbCBhbGxvdzpcbiAgICAgKiAtIGFueSBub24tQW5ndWxhciBlbGVtZW50cyB3aXRoIGEgYC1gIGluIHRoZWlyIG5hbWUsXG4gICAgICogLSBhbnkgcHJvcGVydGllcyBvbiBlbGVtZW50cyB3aXRoIGEgYC1gIGluIHRoZWlyIG5hbWUgd2hpY2ggaXMgdGhlIGNvbW1vbiBydWxlIGZvciBjdXN0b21cbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDVVNUT01fRUxFTUVOVFNfU0NIRU1BID0ge1xuICAgICAgICBuYW1lOiAnY3VzdG9tLWVsZW1lbnRzJ1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIHNjaGVtYSB0aGF0IHdpbGwgYWxsb3cgYW55IHByb3BlcnR5IG9uIGFueSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIE5PX0VSUk9SU19TQ0hFTUEgPSB7XG4gICAgICAgIG5hbWU6ICduby1lcnJvcnMtc2NoZW1hJ1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTmdNb2R1bGUgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKiBAQW5ub3RhdGlvblxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIE5nTW9kdWxlID0gKG1ha2VEZWNvcmF0b3IoJ05nTW9kdWxlJywge1xuICAgICAgICBwcm92aWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgZGVjbGFyYXRpb25zOiB1bmRlZmluZWQsXG4gICAgICAgIGltcG9ydHM6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhwb3J0czogdW5kZWZpbmVkLFxuICAgICAgICBlbnRyeUNvbXBvbmVudHM6IHVuZGVmaW5lZCxcbiAgICAgICAgYm9vdHN0cmFwOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIFZpZXdFbmNhcHN1bGF0aW9uID0ge307XG4gICAgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQgPSAwO1xuICAgIFZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZSA9IDE7XG4gICAgVmlld0VuY2Fwc3VsYXRpb24uTm9uZSA9IDI7XG4gICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRdID0gXCJFbXVsYXRlZFwiO1xuICAgIFZpZXdFbmNhcHN1bGF0aW9uW1ZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZV0gPSBcIk5hdGl2ZVwiO1xuICAgIFZpZXdFbmNhcHN1bGF0aW9uW1ZpZXdFbmNhcHN1bGF0aW9uLk5vbmVdID0gXCJOb25lXCI7XG4gICAgLyoqXG4gICAgICogIE1ldGFkYXRhIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZvciBjb25maWd1cmluZyBWaWV3cy5cbiAgICAgICogKlxuICAgICAgKiBGb3IgZGV0YWlscyBvbiB0aGUgYEBDb21wb25lbnRgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgQ29tcG9uZW50fS5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBzZWxlY3RvcjogJ2dyZWV0JyxcbiAgICAgICogdGVtcGxhdGU6ICdIZWxsbyB7e25hbWV9fSEnLFxuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBHcmVldCB7XG4gICAgICAqIG5hbWU6IHN0cmluZztcbiAgICAgICogKlxuICAgICAgKiBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICogdGhpcy5uYW1lID0gJ1dvcmxkJztcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIENvbXBvbmVudCBpbnN0ZWFkLlxuICAgICAgKiAqXG4gICAgICAqIHtAbGluayBDb21wb25lbnR9XG4gICAgICovXG4gICAgdmFyIFZpZXdNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez89fSBfXzBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFZpZXdNZXRhZGF0YShfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsIHRlbXBsYXRlVXJsID0gX2IudGVtcGxhdGVVcmwsIHRlbXBsYXRlID0gX2IudGVtcGxhdGUsIGVuY2Fwc3VsYXRpb24gPSBfYi5lbmNhcHN1bGF0aW9uLCBzdHlsZXMgPSBfYi5zdHlsZXMsIHN0eWxlVXJscyA9IF9iLnN0eWxlVXJscywgYW5pbWF0aW9ucyA9IF9iLmFuaW1hdGlvbnMsIGludGVycG9sYXRpb24gPSBfYi5pbnRlcnBvbGF0aW9uO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgICAgICAgICAgdGhpcy5zdHlsZVVybHMgPSBzdHlsZVVybHM7XG4gICAgICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgICAgIHRoaXMuZW5jYXBzdWxhdGlvbiA9IGVuY2Fwc3VsYXRpb247XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbnMgPSBhbmltYXRpb25zO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVmlld01ldGFkYXRhO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAqL1xuICAgIHZhciBWZXJzaW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZnVsbFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gVmVyc2lvbihmdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bGwgPSBmdWxsO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWZXJzaW9uLnByb3RvdHlwZSwgXCJtYWpvclwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5mdWxsLnNwbGl0KCcuJylbMF07IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmVyc2lvbi5wcm90b3R5cGUsIFwibWlub3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZnVsbC5zcGxpdCgnLicpWzFdOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZlcnNpb24ucHJvdG90eXBlLCBcInBhdGNoXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZ1bGwuc3BsaXQoJy4nKS5zbGljZSgyKS5qb2luKCcuJyk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gVmVyc2lvbjtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzIuNC4xJyk7XG5cbiAgICAvKipcbiAgICAgKiAgQWxsb3dzIHRvIHJlZmVyIHRvIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB5ZXQgZGVmaW5lZC5cbiAgICAgICogKlxuICAgICAgKiBGb3IgaW5zdGFuY2UsIGBmb3J3YXJkUmVmYCBpcyB1c2VkIHdoZW4gdGhlIGB0b2tlbmAgd2hpY2ggd2UgbmVlZCB0byByZWZlciB0byBmb3IgdGhlIHB1cnBvc2VzIG9mXG4gICAgICAqIERJIGlzIGRlY2xhcmVkLFxuICAgICAgKiBidXQgbm90IHlldCBkZWZpbmVkLiBJdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGUgYHRva2VuYCB3aGljaCB3ZSB1c2Ugd2hlbiBjcmVhdGluZyBhIHF1ZXJ5IGlzIG5vdFxuICAgICAgKiB5ZXQgZGVmaW5lZC5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZl9zcGVjLnRzIHJlZ2lvbj0nZm9yd2FyZF9yZWYnfVxuICAgICAqIEBwYXJhbSB7P30gZm9yd2FyZFJlZkZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3J3YXJkUmVmKGZvcndhcmRSZWZGbikge1xuICAgICAgICAoKGZvcndhcmRSZWZGbikpLl9fZm9yd2FyZF9yZWZfXyA9IGZvcndhcmRSZWY7XG4gICAgICAgICgoZm9yd2FyZFJlZkZuKSkudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmdpZnkodGhpcygpKTsgfTtcbiAgICAgICAgcmV0dXJuICgoKGZvcndhcmRSZWZGbikpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIExhemlseSByZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBmcm9tIGEgZm9yd2FyZFJlZi5cbiAgICAgICogKlxuICAgICAgKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HVTcybUpyazFmaW9kQ2hjbWlEUj9wPXByZXZpZXcpKVxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb3JlL2RpL3RzL2ZvcndhcmRfcmVmL2ZvcndhcmRfcmVmX3NwZWMudHMgcmVnaW9uPSdyZXNvbHZlX2ZvcndhcmRfcmVmJ31cbiAgICAgICogKlxuICAgICAgKiBTZWU6IHtAbGluayBmb3J3YXJkUmVmfVxuICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZS5oYXNPd25Qcm9wZXJ0eSgnX19mb3J3YXJkX3JlZl9fJykgJiZcbiAgICAgICAgICAgIHR5cGUuX19mb3J3YXJkX3JlZl9fID09PSBmb3J3YXJkUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gKCh0eXBlKSkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlIHVuZGVmaW5lZFxuICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgICogKlxuICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmltcGxlbWVudGVkKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuaW1wbGVtZW50ZWQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIHZhciBCYXNlRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMoQmFzZUVycm9yLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBCYXNlRXJyb3IobWVzc2FnZSkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBFcnJvcnMgZG9uJ3QgdXNlIGN1cnJlbnQgdGhpcywgaW5zdGVhZCB0aGV5IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZG8gZm9yd2FyZCBhbGwgb2Ygb3VyIGFwaSB0byB0aGUgbmF0aXZlSW5zdGFuY2UuXG4gICAgICAgICAgICAvLyBUT0RPKGJyYWRmb3JkY3NtaXRoKTogUmVtb3ZlIHRoaXMgaGFjayB3aGVuXG4gICAgICAgICAgICAvLyAgICAgZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzIxMDIgaXMgZml4ZWQuXG4gICAgICAgICAgICB2YXIgbmF0aXZlRXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLl9uYXRpdmVFcnJvciA9IG5hdGl2ZUVycm9yO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcIm1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLm1lc3NhZ2U7IH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobWVzc2FnZSkgeyB0aGlzLl9uYXRpdmVFcnJvci5tZXNzYWdlID0gbWVzc2FnZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLm5hbWU7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmFzZUVycm9yLnByb3RvdHlwZSwgXCJzdGFja1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKCh0aGlzLl9uYXRpdmVFcnJvcikpLnN0YWNrOyB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyAoKHRoaXMuX25hdGl2ZUVycm9yKSkuc3RhY2sgPSB2YWx1ZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQmFzZUVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLnRvU3RyaW5nKCk7IH07XG4gICAgICAgIHJldHVybiBCYXNlRXJyb3I7XG4gICAgfShFcnJvcikpO1xuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgV3JhcHBlZEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKFdyYXBwZWRFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBXcmFwcGVkRXJyb3IobWVzc2FnZSwgZXJyb3IpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UgKyBcIiBjYXVzZWQgYnk6IFwiICsgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IpKTtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFcnJvciA9IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcmFwcGVkRXJyb3IucHJvdG90eXBlLCBcInN0YWNrXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgoKHRoaXMub3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gdGhpcy5vcmlnaW5hbEVycm9yIDogdGhpcy5fbmF0aXZlRXJyb3IpKSlcbiAgICAgICAgICAgICAgICAgICAgLnN0YWNrO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBXcmFwcGVkRXJyb3I7XG4gICAgfShCYXNlRXJyb3IpKTtcblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9USFJPV19JRl9OT1RfRk9VTkQgPSBuZXcgT2JqZWN0KCk7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVEhST1dfSUZfTk9UX0ZPVU5EID0gX1RIUk9XX0lGX05PVF9GT1VORDtcbiAgICB2YXIgX051bGxJbmplY3RvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIF9OdWxsSW5qZWN0b3IoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgX051bGxJbmplY3Rvci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRva2VuLCBub3RGb3VuZFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSA9PT0gdm9pZCAwKSB7IG5vdEZvdW5kVmFsdWUgPSBfVEhST1dfSUZfTk9UX0ZPVU5EOyB9XG4gICAgICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSA9PT0gX1RIUk9XX0lGX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHByb3ZpZGVyIGZvciBcIiArIHN0cmluZ2lmeSh0b2tlbikgKyBcIiFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9OdWxsSW5qZWN0b3I7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgYGBgXG4gICAgICAqIGNvbnN0IGluamVjdG9yOiBJbmplY3RvciA9IC4uLjtcbiAgICAgICogaW5qZWN0b3IuZ2V0KC4uLik7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUge0BsaW5rRG9jcyBndWlkZS9kZXBlbmRlbmN5LWluamVjdGlvbiBcIkRlcGVuZGVuY3kgSW5qZWN0aW9uIEd1aWRlXCJ9LlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J0luamVjdG9yJ31cbiAgICAgICogKlxuICAgICAgKiBgSW5qZWN0b3JgIHJldHVybnMgaXRzZWxmIHdoZW4gZ2l2ZW4gYEluamVjdG9yYCBhcyBhIHRva2VuOlxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0naW5qZWN0SW5qZWN0b3InfVxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIEluamVjdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSW5qZWN0b3IoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgZnJvbSB0aGUgaW5qZWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuLlxuICAgICAgICAgICogSWYgbm90IGZvdW5kOlxuICAgICAgICAgICogLSBUaHJvd3Mge0BsaW5rIE5vUHJvdmlkZXJFcnJvcn0gaWYgbm8gYG5vdEZvdW5kVmFsdWVgIHRoYXQgaXMgbm90IGVxdWFsIHRvXG4gICAgICAgICAgKiBJbmplY3Rvci5USFJPV19JRl9OT1RfRk9VTkQgaXMgZ2l2ZW5cbiAgICAgICAgICAqIC0gUmV0dXJucyB0aGUgYG5vdEZvdW5kVmFsdWVgIG90aGVyd2lzZVxuICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEluamVjdG9yLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbiAgICAgICAgSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5EID0gX1RIUk9XX0lGX05PVF9GT1VORDtcbiAgICAgICAgSW5qZWN0b3IuTlVMTCA9IG5ldyBfTnVsbEluamVjdG9yKCk7XG4gICAgICAgIHJldHVybiBJbmplY3RvcjtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMSA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30ga2V5c1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEZpcnN0Q2xvc2VkQ3ljbGUoa2V5cykge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChyZXMuaW5kZXhPZihrZXlzW2ldKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKGtleXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30ga2V5c1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKSB7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJldmVyc2VkID0gZmluZEZpcnN0Q2xvc2VkQ3ljbGUoa2V5cy5zbGljZSgpLnJldmVyc2UoKSk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlblN0cnMgPSByZXZlcnNlZC5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIHN0cmluZ2lmeShrLnRva2VuKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gJyAoJyArIHRva2VuU3Rycy5qb2luKCcgLT4gJykgKyAnKSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQmFzZSBjbGFzcyBmb3IgYWxsIGVycm9ycyBhcmlzaW5nIGZyb20gbWlzY29uZmlndXJlZCBwcm92aWRlcnMuXG4gICAgICovXG4gICAgdmFyIEFic3RyYWN0UHJvdmlkZXJFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxKEFic3RyYWN0UHJvdmlkZXJFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBYnN0cmFjdFByb3ZpZGVyRXJyb3IoaW5qZWN0b3IsIGtleSwgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgJ0RJIEVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLmtleXMgPSBba2V5XTtcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JzID0gW2luamVjdG9yXTtcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSA9IGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICAgKiBAcGFyYW0gez99IGtleVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQWJzdHJhY3RQcm92aWRlckVycm9yLnByb3RvdHlwZS5hZGRLZXkgPSBmdW5jdGlvbiAoaW5qZWN0b3IsIGtleSkge1xuICAgICAgICAgICAgdGhpcy5pbmplY3RvcnMucHVzaChpbmplY3Rvcik7XG4gICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlKHRoaXMua2V5cyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBBYnN0cmFjdFByb3ZpZGVyRXJyb3I7XG4gICAgfShCYXNlRXJyb3IpKTtcbiAgICAvKipcbiAgICAgKiAgVGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBieSBrZXkgZnJvbSB7QGxpbmsgSW5qZWN0b3J9LCBidXQgdGhlXG4gICAgICAqIHtAbGluayBJbmplY3Rvcn0gZG9lcyBub3QgaGF2ZSBhIHtAbGluayBQcm92aWRlcn0gZm9yIHRoZSBnaXZlbiBrZXkuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3ZxOEQzRlJCOWFHYm5XSnF0RVBFP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBjbGFzcyBBIHtcbiAgICAgICogY29uc3RydWN0b3IoYjpCKSB7fVxuICAgICAgKiB9XG4gICAgICAqICpcbiAgICAgICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKSkudG9UaHJvd0Vycm9yKCk7XG4gICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhciBOb1Byb3ZpZGVyRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMShOb1Byb3ZpZGVyRXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOb1Byb3ZpZGVyRXJyb3IoaW5qZWN0b3IsIGtleSkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgaW5qZWN0b3IsIGtleSwgZnVuY3Rpb24gKGtleXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoa2V5c1swXS50b2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiTm8gcHJvdmlkZXIgZm9yIFwiICsgZmlyc3QgKyBcIiFcIiArIGNvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTm9Qcm92aWRlckVycm9yO1xuICAgIH0oQWJzdHJhY3RQcm92aWRlckVycm9yKSk7XG4gICAgLyoqXG4gICAgICogIFRocm93biB3aGVuIGRlcGVuZGVuY2llcyBmb3JtIGEgY3ljbGUuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3dZUWROb3MwVHpxbDNlaTFFVjlqP3A9aW5mbykpXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgICoge3Byb3ZpZGU6IFwib25lXCIsIHVzZUZhY3Rvcnk6ICh0d28pID0+IFwidHdvXCIsIGRlcHM6IFtbbmV3IEluamVjdChcInR3b1wiKV1dfSxcbiAgICAgICoge3Byb3ZpZGU6IFwidHdvXCIsIHVzZUZhY3Rvcnk6IChvbmUpID0+IFwib25lXCIsIGRlcHM6IFtbbmV3IEluamVjdChcIm9uZVwiKV1dfVxuICAgICAgKiBdKTtcbiAgICAgICogKlxuICAgICAgKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KFwib25lXCIpKS50b1Rocm93RXJyb3IoKTtcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogUmV0cmlldmluZyBgQWAgb3IgYEJgIHRocm93cyBhIGBDeWNsaWNEZXBlbmRlbmN5RXJyb3JgIGFzIHRoZSBncmFwaCBhYm92ZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQuXG4gICAgICovXG4gICAgdmFyIEN5Y2xpY0RlcGVuZGVuY3lFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxKEN5Y2xpY0RlcGVuZGVuY3lFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEN5Y2xpY0RlcGVuZGVuY3lFcnJvcihpbmplY3Rvciwga2V5KSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBpbmplY3Rvciwga2V5LCBmdW5jdGlvbiAoa2V5cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIkNhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSFcIiArIGNvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ3ljbGljRGVwZW5kZW5jeUVycm9yO1xuICAgIH0oQWJzdHJhY3RQcm92aWRlckVycm9yKSk7XG4gICAgLyoqXG4gICAgICogIFRocm93biB3aGVuIGEgY29uc3RydWN0aW5nIHR5cGUgcmV0dXJucyB3aXRoIGFuIEVycm9yLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgSW5zdGFudGlhdGlvbkVycm9yYCBjbGFzcyBjb250YWlucyB0aGUgb3JpZ2luYWwgZXJyb3IgcGx1cyB0aGUgZGVwZW5kZW5jeSBncmFwaCB3aGljaCBjYXVzZWRcbiAgICAgICogdGhpcyBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC83YVdZZGNxVFFzUDBlTnFFZFVBZj9wPXByZXZpZXcpKVxuICAgICAgKiAqXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogY2xhc3MgQSB7XG4gICAgICAqIGNvbnN0cnVjdG9yKCkge1xuICAgICAgKiB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UnKTtcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqICpcbiAgICAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pO1xuICAgICAgKiB0cnkge1xuICAgICAgKiBpbmplY3Rvci5nZXQoQSk7XG4gICAgICAqIH0gY2F0Y2ggKGUpIHtcbiAgICAgICogZXhwZWN0KGUgaW5zdGFuY2VvZiBJbnN0YW50aWF0aW9uRXJyb3IpLnRvQmUodHJ1ZSk7XG4gICAgICAqIGV4cGVjdChlLm9yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2UpLnRvRXF1YWwoXCJtZXNzYWdlXCIpO1xuICAgICAgKiBleHBlY3QoZS5vcmlnaW5hbFN0YWNrKS50b0JlRGVmaW5lZCgpO1xuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhciBJbnN0YW50aWF0aW9uRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMShJbnN0YW50aWF0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luYWxFeGNlcHRpb25cbiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5hbFN0YWNrXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBJbnN0YW50aWF0aW9uRXJyb3IoaW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXkpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsICdESSBFcnJvcicsIG9yaWdpbmFsRXhjZXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMua2V5cyA9IFtrZXldO1xuICAgICAgICAgICAgdGhpcy5pbmplY3RvcnMgPSBbaW5qZWN0b3JdO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbnN0YW50aWF0aW9uRXJyb3IucHJvdG90eXBlLmFkZEtleSA9IGZ1bmN0aW9uIChpbmplY3Rvciwga2V5KSB7XG4gICAgICAgICAgICB0aGlzLmluamVjdG9ycy5wdXNoKGluamVjdG9yKTtcbiAgICAgICAgICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbnN0YW50aWF0aW9uRXJyb3IucHJvdG90eXBlLCBcIm1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaXJzdCA9IHN0cmluZ2lmeSh0aGlzLmtleXNbMF0udG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRXJyb3IubWVzc2FnZSArIFwiOiBFcnJvciBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiBcIiArIGZpcnN0ICsgXCIhXCIgKyBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKHRoaXMua2V5cykgKyBcIi5cIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSW5zdGFudGlhdGlvbkVycm9yLnByb3RvdHlwZSwgXCJjYXVzZUtleVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzWzBdOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEluc3RhbnRpYXRpb25FcnJvcjtcbiAgICB9KFdyYXBwZWRFcnJvcikpO1xuICAgIC8qKlxuICAgICAqICBUaHJvd24gd2hlbiBhbiBvYmplY3Qgb3RoZXIgdGhlbiB7QGxpbmsgUHJvdmlkZXJ9IChvciBgVHlwZWApIGlzIHBhc3NlZCB0byB7QGxpbmsgSW5qZWN0b3J9XG4gICAgICAqIGNyZWF0aW9uLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZYXRDRmJQQU1DTDBKU1NRNG12SD9wPXByZXZpZXcpKVxuICAgICAgKiAqXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1wibm90IGEgdHlwZVwiXSkpLnRvVGhyb3dFcnJvcigpO1xuICAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB2YXIgSW52YWxpZFByb3ZpZGVyRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMShJbnZhbGlkUHJvdmlkZXJFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEludmFsaWRQcm92aWRlckVycm9yKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIkludmFsaWQgcHJvdmlkZXIgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBcIiArIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSW52YWxpZFByb3ZpZGVyRXJyb3I7XG4gICAgfShCYXNlRXJyb3IpKTtcbiAgICAvKipcbiAgICAgKiAgVGhyb3duIHdoZW4gdGhlIGNsYXNzIGhhcyBubyBhbm5vdGF0aW9uIGluZm9ybWF0aW9uLlxuICAgICAgKiAqXG4gICAgICAqIExhY2sgb2YgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBwcmV2ZW50cyB0aGUge0BsaW5rIEluamVjdG9yfSBmcm9tIGRldGVybWluaW5nIHdoaWNoIGRlcGVuZGVuY2llc1xuICAgICAgKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ySG5adGxOUzd2Sk9QUTZwY1ZrbT9wPXByZXZpZXcpKVxuICAgICAgKiAqXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogY2xhc3MgQSB7XG4gICAgICAqIGNvbnN0cnVjdG9yKGIpIHt9XG4gICAgICAqIH1cbiAgICAgICogKlxuICAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTtcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge0BsaW5rIEluamVjdGFibGV9IGhhcyBwYXJhbWV0ZXIgdHlwZXMuXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBjbGFzcyBCIHt9XG4gICAgICAqICpcbiAgICAgICogY2xhc3MgQSB7XG4gICAgICAqIGNvbnN0cnVjdG9yKGI6Qikge30gLy8gbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBBIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICAgICAgKiB9XG4gICAgICAqICpcbiAgICAgICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0EsQl0pKS50b1Rocm93RXJyb3IoKTtcbiAgICAgICogYGBgXG4gICAgICovXG4gICAgdmFyIE5vQW5ub3RhdGlvbkVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDEoTm9Bbm5vdGF0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmNcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgTm9Bbm5vdGF0aW9uRXJyb3IuX2dlbk1lc3NhZ2UodHlwZU9yRnVuYywgcGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTm9Bbm5vdGF0aW9uRXJyb3IuX2dlbk1lc3NhZ2UgPSBmdW5jdGlvbiAodHlwZU9yRnVuYywgcGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzaWduYXR1cmUgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDAsIC8qKiBAdHlwZSB7P30gKi8gaWkgPSBwYXJhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtZXRlciA9IHBhcmFtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlciB8fCBwYXJhbWV0ZXIubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLnB1c2goJz8nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5wdXNoKHBhcmFtZXRlci5tYXAoc3RyaW5naWZ5KS5qb2luKCcgJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFxcJycgKyBzdHJpbmdpZnkodHlwZU9yRnVuYykgKyAnXFwnKCcgK1xuICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5qb2luKCcsICcpICsgJykuICcgK1xuICAgICAgICAgICAgICAgICdNYWtlIHN1cmUgdGhhdCBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIGRlY29yYXRlZCB3aXRoIEluamVjdCBvciBoYXZlIHZhbGlkIHR5cGUgYW5ub3RhdGlvbnMgYW5kIHRoYXQgXFwnJyArXG4gICAgICAgICAgICAgICAgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1xcJyBpcyBkZWNvcmF0ZWQgd2l0aCBJbmplY3RhYmxlLic7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBOb0Fubm90YXRpb25FcnJvcjtcbiAgICB9KEJhc2VFcnJvcikpO1xuICAgIC8qKlxuICAgICAqICBUaHJvd24gd2hlbiBnZXR0aW5nIGFuIG9iamVjdCBieSBpbmRleC5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvYlJzMFNYMk9UUWlKenF2amdsOFA/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGNsYXNzIEEge31cbiAgICAgICogKlxuICAgICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSk7XG4gICAgICAqICpcbiAgICAgICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldEF0KDEwMCkpLnRvVGhyb3dFcnJvcigpO1xuICAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB2YXIgT3V0T2ZCb3VuZHNFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxKE91dE9mQm91bmRzRXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBPdXRPZkJvdW5kc0Vycm9yKGluZGV4KSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIkluZGV4IFwiICsgaW5kZXggKyBcIiBpcyBvdXQtb2YtYm91bmRzLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3V0T2ZCb3VuZHNFcnJvcjtcbiAgICB9KEJhc2VFcnJvcikpO1xuICAgIC8qKlxuICAgICAqICBUaHJvd24gd2hlbiBhIG11bHRpIHByb3ZpZGVyIGFuZCBhIHJlZ3VsYXIgcHJvdmlkZXIgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIHRva2VuLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAgICAqIHsgcHJvdmlkZTogXCJTdHJpbmdzXCIsIHVzZVZhbHVlOiBcInN0cmluZzFcIiwgbXVsdGk6IHRydWV9LFxuICAgICAgKiB7IHByb3ZpZGU6IFwiU3RyaW5nc1wiLCB1c2VWYWx1ZTogXCJzdHJpbmcyXCIsIG11bHRpOiBmYWxzZX1cbiAgICAgICogXSkpLnRvVGhyb3dFcnJvcigpO1xuICAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB2YXIgTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDEoTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcjFcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcjJcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihwcm92aWRlcjEsIHByb3ZpZGVyMikge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgJ0Nhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiAnICsgcHJvdmlkZXIxLnRvU3RyaW5nKCkgKyAnICcgK1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyMi50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yO1xuICAgIH0oQmFzZUVycm9yKSk7XG5cbiAgICAvKipcbiAgICAgKiAgQSB1bmlxdWUgb2JqZWN0IHVzZWQgZm9yIHJldHJpZXZpbmcgaXRlbXMgZnJvbSB0aGUge0BsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0uXG4gICAgICAqICpcbiAgICAgICogS2V5cyBoYXZlOlxuICAgICAgKiAtIGEgc3lzdGVtLXdpZGUgdW5pcXVlIGBpZGAuXG4gICAgICAqIC0gYSBgdG9rZW5gLlxuICAgICAgKiAqXG4gICAgICAqIGBLZXlgIGlzIHVzZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yfSBiZWNhdXNlIGl0cyBzeXN0ZW0td2lkZSB1bmlxdWUgYGlkYCBhbGxvd3NcbiAgICAgICogdGhlXG4gICAgICAqIGluamVjdG9yIHRvIHN0b3JlIGNyZWF0ZWQgb2JqZWN0cyBpbiBhIG1vcmUgZWZmaWNpZW50IHdheS5cbiAgICAgICogKlxuICAgICAgKiBgS2V5YCBzaG91bGQgbm90IGJlIGNyZWF0ZWQgZGlyZWN0bHkuIHtAbGluayBSZWZsZWN0aXZlSW5qZWN0b3J9IGNyZWF0ZXMga2V5cyBhdXRvbWF0aWNhbGx5IHdoZW5cbiAgICAgICogcmVzb2x2aW5nXG4gICAgICAqIHByb3ZpZGVycy5cbiAgICAgKi9cbiAgICB2YXIgUmVmbGVjdGl2ZUtleSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFJlZmxlY3RpdmVLZXkodG9rZW4sIGlkKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBtdXN0IGJlIGRlZmluZWQhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3RpdmVLZXkucHJvdG90eXBlLCBcImRpc3BsYXlOYW1lXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIFJldHVybnMgYSBzdHJpbmdpZmllZCB0b2tlbi5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5naWZ5KHRoaXMudG9rZW4pOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZXRyaWV2ZXMgYSBgS2V5YCBmb3IgYSB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUtleS5nZXQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBfZ2xvYmFsS2V5UmVnaXN0cnkuZ2V0KHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0aXZlS2V5LCBcIm51bWJlck9mS2V5c1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99IHRoZSBudW1iZXIgb2Yga2V5cyByZWdpc3RlcmVkIGluIHRoZSBzeXN0ZW0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5Lm51bWJlck9mS2V5czsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBSZWZsZWN0aXZlS2V5O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdmFyIEtleVJlZ2lzdHJ5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gS2V5UmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxLZXlzID0gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBLZXlSZWdpc3RyeS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBSZWZsZWN0aXZlS2V5KVxuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxLZXlzLmhhcyh0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWxsS2V5cy5nZXQodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV3S2V5ID0gbmV3IFJlZmxlY3RpdmVLZXkodG9rZW4sIFJlZmxlY3RpdmVLZXkubnVtYmVyT2ZLZXlzKTtcbiAgICAgICAgICAgIHRoaXMuX2FsbEtleXMuc2V0KHRva2VuLCBuZXdLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0tleTtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEtleVJlZ2lzdHJ5LnByb3RvdHlwZSwgXCJudW1iZXJPZktleXNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2FsbEtleXMuc2l6ZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBLZXlSZWdpc3RyeTtcbiAgICB9KCkpO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9nbG9iYWxLZXlSZWdpc3RyeSA9IG5ldyBLZXlSZWdpc3RyeSgpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIEB3aGF0SXREb2VzIFJlcHJlc2VudHMgYSB0eXBlIHRoYXQgYSBDb21wb25lbnQgb3Igb3RoZXIgb2JqZWN0IGlzIGluc3RhbmNlcyBvZi5cbiAgICAgKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqXG4gICAgICogQW4gZXhhbXBsZSBvZiBhIGBUeXBlYCBpcyBgTXlDdXN0b21Db21wb25lbnRgIGNsYXNzLCB3aGljaCBpbiBKYXZhU2NyaXB0IGlzIGJlIHJlcHJlc2VudGVkIGJ5XG4gICAgICogdGhlIGBNeUN1c3RvbUNvbXBvbmVudGAgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhYmxlXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVHlwZSA9IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW50aW9uOiBUaGlzIHJlZ2V4IGhhcyB0byBob2xkIGV2ZW4gaWYgdGhlIGNvZGUgaXMgbWluaWZpZWQhXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gREVMRUdBVEVfQ1RPUiA9IC9eZnVuY3Rpb25cXHMrXFxTK1xcKFxcKVxccyp7XFxzKihcInVzZSBzdHJpY3RcIjspP1xccyoocmV0dXJuXFxzKyk/XFxTK1xcLmFwcGx5XFwodGhpcyxcXHMqYXJndW1lbnRzXFwpLztcbiAgICB2YXIgUmVmbGVjdGlvbkNhcGFiaWxpdGllcyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez89fSByZWZsZWN0XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKHJlZmxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZmxlY3QgPSByZWZsZWN0IHx8IGdsb2JhbCQxLlJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5pc1JlZmxlY3Rpb25FbmFibGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuZmFjdG9yeSA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyAodC5iaW5kLmFwcGx5KHQsIFt2b2lkIDBdLmNvbmNhdChhcmdzKSkpKCk7XG4gICAgICAgIH07IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtVHlwZXNcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbUFubm90YXRpb25zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5femlwVHlwZXNBbmRBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbVR5cGVzLCBwYXJhbUFubm90YXRpb25zKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtVHlwZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShwYXJhbVR5cGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gVFMgb3V0cHV0cyBPYmplY3QgZm9yIHBhcmFtZXRlcnMgd2l0aG91dCB0eXBlcywgd2hpbGUgVHJhY2V1ciBvbWl0c1xuICAgICAgICAgICAgICAgIC8vIHRoZSBhbm5vdGF0aW9ucy4gRm9yIG5vdyB3ZSBwcmVzZXJ2ZSB0aGUgVHJhY2V1ciBiZWhhdmlvciB0byBhaWRcbiAgICAgICAgICAgICAgICAvLyBtaWdyYXRpb24sIGJ1dCB0aGlzIGNhbiBiZSByZXZpc2l0ZWQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1UeXBlc1tpXSAhPSBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJhbUFubm90YXRpb25zICYmIGlzUHJlc2VudChwYXJhbUFubm90YXRpb25zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRDdG9yXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5fb3duUGFyYW1ldGVycyA9IGZ1bmN0aW9uICh0eXBlLCBwYXJlbnRDdG9yKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRlY29yYXRvcnMsIHdlIG9ubHkgaGF2ZSBmdW5jdGlvbi5sZW5ndGggYXMgbWV0YWRhdGEuXG4gICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHRvIGRldGVjdCB3aGV0aGVyIGEgY2hpbGQgY2xhc3MgZGVjbGFyZWQgYW4gb3duIGNvbnN0cnVjdG9yIG9yIG5vdCxcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbG9vayBpbnNpZGUgb2YgdGhhdCBjb25zdHJ1Y3RvciB0byBjaGVjayB3aGV0aGVyIGl0IGlzXG4gICAgICAgICAgICAvLyBqdXN0IGNhbGxpbmcgdGhlIHBhcmVudC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxzbyBoZWxwcyB0byB3b3JrIGFyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xMjQzOVxuICAgICAgICAgICAgLy8gdGhhdCBzZXRzICdkZXNpZ246cGFyYW10eXBlcycgdG8gW11cbiAgICAgICAgICAgIC8vIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzIGJ1dCBoYXMgbm8gY3RvciBkZWNsYXJlZCBpdHNlbGYuXG4gICAgICAgICAgICBpZiAoREVMRUdBVEVfQ1RPUi5leGVjKHR5cGUudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS5cbiAgICAgICAgICAgIGlmICgoKHR5cGUpKS5wYXJhbWV0ZXJzICYmICgodHlwZSkpLnBhcmFtZXRlcnMgIT09IHBhcmVudEN0b3IucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKHR5cGUpKS5wYXJhbWV0ZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVBJIG9mIHRzaWNrbGUgZm9yIGxvd2VyaW5nIGRlY29yYXRvcnMgdG8gcHJvcGVydGllcyBvbiB0aGUgY2xhc3MuXG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0c2lja2xlQ3RvclBhcmFtcyA9ICgodHlwZSkpLmN0b3JQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgaWYgKHRzaWNrbGVDdG9yUGFyYW1zICYmIHRzaWNrbGVDdG9yUGFyYW1zICE9PSBwYXJlbnRDdG9yLmN0b3JQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3ZXIgdHNpY2tsZSB1c2VzIGEgZnVuY3Rpb24gY2xvc3VyZVxuICAgICAgICAgICAgICAgIC8vIFJldGFpbiB0aGUgbm9uLWZ1bmN0aW9uIGNhc2UgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB0c2lja2xlXG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3RvclBhcmFtZXRlcnMgPSB0eXBlb2YgdHNpY2tsZUN0b3JQYXJhbXMgPT09ICdmdW5jdGlvbicgPyB0c2lja2xlQ3RvclBhcmFtcygpIDogdHNpY2tsZUN0b3JQYXJhbXM7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1UeXBlcyA9IGN0b3JQYXJhbWV0ZXJzLm1hcChmdW5jdGlvbiAoY3RvclBhcmFtKSB7IHJldHVybiBjdG9yUGFyYW0gJiYgY3RvclBhcmFtLnR5cGU7IH0pO1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtQW5ub3RhdGlvbnMgPSBjdG9yUGFyYW1ldGVycy5tYXAoZnVuY3Rpb24gKGN0b3JQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3RvclBhcmFtICYmIGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKGN0b3JQYXJhbS5kZWNvcmF0b3JzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5femlwVHlwZXNBbmRBbm5vdGF0aW9ucyhwYXJhbVR5cGVzLCBwYXJhbUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy5cbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcmVmbGVjdCkgJiYgaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1Bbm5vdGF0aW9ucyA9IHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEoJ3BhcmFtZXRlcnMnLCB0eXBlKTtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbVR5cGVzID0gdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlcyB8fCBwYXJhbUFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgY2xhc3MgaGFzIG5vIGRlY29yYXRvcnMsIGF0IGxlYXN0IGNyZWF0ZSBtZXRhZGF0YVxuICAgICAgICAgICAgLy8gYmFzZWQgb24gZnVuY3Rpb24ubGVuZ3RoLlxuICAgICAgICAgICAgLy8gTm90ZTogV2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIGNvbnN0cnVjdG9yIGFzIHdlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIHRoZSBjb250ZW50IG9mIHRoZSBjb25zdHJ1Y3RvciBhYm92ZS5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXkoKCh0eXBlLmxlbmd0aCkpKS5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnBhcmFtZXRlcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICAgICAgLy8gTm90ZTogb25seSByZXBvcnQgbWV0YWRhdGEgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2xhc3MgZGVjb3JhdG9yXG4gICAgICAgICAgICAvLyB0byBzdGF5IGluIHN5bmMgd2l0aCB0aGUgc3RhdGljIHJlZmxlY3Rvci5cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudEN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1ldGVycyA9IHRoaXMuX293blBhcmFtZXRlcnModHlwZSwgcGFyZW50Q3Rvcik7XG4gICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnMgJiYgcGFyZW50Q3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycyhwYXJlbnRDdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzIHx8IFtdO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50Q3RvclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuX293bkFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpIHtcbiAgICAgICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS5cbiAgICAgICAgICAgIGlmICgoKHR5cGVPckZ1bmMpKS5hbm5vdGF0aW9ucyAmJiAoKHR5cGVPckZ1bmMpKS5hbm5vdGF0aW9ucyAhPT0gcGFyZW50Q3Rvci5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb25zID0gKCh0eXBlT3JGdW5jKSkuYW5ub3RhdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbm5vdGF0aW9ucyA9PT0gJ2Z1bmN0aW9uJyAmJiBhbm5vdGF0aW9ucy5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmFubm90YXRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy5cbiAgICAgICAgICAgIGlmICgoKHR5cGVPckZ1bmMpKS5kZWNvcmF0b3JzICYmICgodHlwZU9yRnVuYykpLmRlY29yYXRvcnMgIT09IHBhcmVudEN0b3IuZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YSgoKHR5cGVPckZ1bmMpKS5kZWNvcmF0b3JzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy5cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWZsZWN0ICYmIHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnYW5ub3RhdGlvbnMnLCB0eXBlT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuYW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50Q3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlT3JGdW5jLnByb3RvdHlwZSkuY29uc3RydWN0b3I7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvd25Bbm5vdGF0aW9ucyA9IHRoaXMuX293bkFubm90YXRpb25zKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpIHx8IFtdO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50QW5ub3RhdGlvbnMgPSBwYXJlbnRDdG9yICE9PSBPYmplY3QgPyB0aGlzLmFubm90YXRpb25zKHBhcmVudEN0b3IpIDogW107XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50QW5ub3RhdGlvbnMuY29uY2F0KG93bkFubm90YXRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEN0b3JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLl9vd25Qcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYywgcGFyZW50Q3Rvcikge1xuICAgICAgICAgICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLlxuICAgICAgICAgICAgaWYgKCgodHlwZU9yRnVuYykpLnByb3BNZXRhZGF0YSAmJlxuICAgICAgICAgICAgICAgICgodHlwZU9yRnVuYykpLnByb3BNZXRhZGF0YSAhPT0gcGFyZW50Q3Rvci5wcm9wTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wTWV0YWRhdGEgPSAoKHR5cGVPckZ1bmMpKS5wcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wTWV0YWRhdGEgPT09ICdmdW5jdGlvbicgJiYgcHJvcE1ldGFkYXRhLnByb3BNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGEgPSBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQVBJIG9mIHRzaWNrbGUgZm9yIGxvd2VyaW5nIGRlY29yYXRvcnMgdG8gcHJvcGVydGllcyBvbiB0aGUgY2xhc3MuXG4gICAgICAgICAgICBpZiAoKCh0eXBlT3JGdW5jKSkucHJvcERlY29yYXRvcnMgJiZcbiAgICAgICAgICAgICAgICAoKHR5cGVPckZ1bmMpKS5wcm9wRGVjb3JhdG9ycyAhPT0gcGFyZW50Q3Rvci5wcm9wRGVjb3JhdG9ycykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3BEZWNvcmF0b3JzXzEgPSAoKHR5cGVPckZ1bmMpKS5wcm9wRGVjb3JhdG9ycztcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9wTWV0YWRhdGFfMSA9ICh7fSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcERlY29yYXRvcnNfMSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFfMVtwcm9wXSA9IGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKHByb3BEZWNvcmF0b3JzXzFbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGFfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy5cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWZsZWN0ICYmIHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgdHlwZU9yRnVuYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnByb3BNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnRDdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHR5cGVPckZ1bmMucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3BNZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgaWYgKHBhcmVudEN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudFByb3BNZXRhZGF0YV8xID0gdGhpcy5wcm9wTWV0YWRhdGEocGFyZW50Q3Rvcik7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyZW50UHJvcE1ldGFkYXRhXzEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBwYXJlbnRQcm9wTWV0YWRhdGFfMVtwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvd25Qcm9wTWV0YWRhdGEgPSB0aGlzLl9vd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYywgcGFyZW50Q3Rvcik7XG4gICAgICAgICAgICBpZiAob3duUHJvcE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3duUHJvcE1ldGFkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNvcmF0b3JzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTWV0YWRhdGEuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2guYXBwbHkoZGVjb3JhdG9ycywgcHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9ycy5wdXNoLmFwcGx5KGRlY29yYXRvcnMsIG93blByb3BNZXRhZGF0YVtwcm9wTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcE5hbWVdID0gZGVjb3JhdG9ycztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBsY1Byb3BlcnR5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5oYXNMaWZlY3ljbGVIb29rID0gZnVuY3Rpb24gKHR5cGUsIGxjUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZSAmJiBsY1Byb3BlcnR5IGluIHR5cGUucHJvdG90eXBlO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5nZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gKChuZXcgRnVuY3Rpb24oJ28nLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnOycpKSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnNldHRlciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gKChuZXcgRnVuY3Rpb24oJ28nLCAndicsICdyZXR1cm4gby4nICsgbmFtZSArICcgPSB2OycpKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLm1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdW5jdGlvbkJvZHkgPSBcImlmICghby5cIiArIG5hbWUgKyBcIikgdGhyb3cgbmV3IEVycm9yKCdcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGlzIHVuZGVmaW5lZCcpO1xcbiAgICAgICAgcmV0dXJuIG8uXCIgKyBuYW1lICsgXCIuYXBwbHkobywgYXJncyk7XCI7XG4gICAgICAgICAgICByZXR1cm4gKChuZXcgRnVuY3Rpb24oJ28nLCAnYXJncycsIGZ1bmN0aW9uQm9keSkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuaW1wb3J0VXJpID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIC8vIFN0YXRpY1N5bWJvbFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlWydmaWxlUGF0aCddKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVbJ2ZpbGVQYXRoJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSdW50aW1lIHR5cGVcbiAgICAgICAgICAgIHJldHVybiBcIi4vXCIgKyBzdHJpbmdpZnkodHlwZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVVcmxcbiAgICAgICAgICogQHBhcmFtIHs/fSBydW50aW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5yZXNvbHZlSWRlbnRpZmllciA9IGZ1bmN0aW9uIChuYW1lLCBtb2R1bGVVcmwsIHJ1bnRpbWUpIHsgcmV0dXJuIHJ1bnRpbWU7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVudW1JZGVudGlmaWVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUucmVzb2x2ZUVudW0gPSBmdW5jdGlvbiAoZW51bUlkZW50aWZpZXIsIG5hbWUpIHsgcmV0dXJuIGVudW1JZGVudGlmaWVyW25hbWVdOyB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZGVjb3JhdG9ySW52b2NhdGlvbnNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKGRlY29yYXRvckludm9jYXRpb25zKSB7XG4gICAgICAgIGlmICghZGVjb3JhdG9ySW52b2NhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb3JhdG9ySW52b2NhdGlvbnMubWFwKGZ1bmN0aW9uIChkZWNvcmF0b3JJbnZvY2F0aW9uKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9ySW52b2NhdGlvbi50eXBlO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYW5ub3RhdGlvbkNscyA9IGRlY29yYXRvclR5cGUuYW5ub3RhdGlvbkNscztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFubm90YXRpb25BcmdzID0gZGVjb3JhdG9ySW52b2NhdGlvbi5hcmdzID8gZGVjb3JhdG9ySW52b2NhdGlvbi5hcmdzIDogW107XG4gICAgICAgICAgICByZXR1cm4gbmV3IChhbm5vdGF0aW9uQ2xzLmJpbmQuYXBwbHkoYW5ub3RhdGlvbkNscywgW3ZvaWQgMF0uY29uY2F0KGFubm90YXRpb25BcmdzKSkpKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBQcm92aWRlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHJlZmxlY3Rpb24gZGF0YSBhYm91dCBzeW1ib2xzLiBVc2VkIGludGVybmFsbHkgYnkgQW5ndWxhclxuICAgICAgKiB0byBwb3dlciBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgY29tcGlsYXRpb24uXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFJlZmxlY3RvclJlYWRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFJlZmxlY3RvclJlYWRlcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yUmVhZGVyLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RvclJlYWRlci5wcm90b3R5cGUuYW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yUmVhZGVyLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yUmVhZGVyLnByb3RvdHlwZS5pbXBvcnRVcmkgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVVybFxuICAgICAgICAgKiBAcGFyYW0gez99IHJ1bnRpbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RvclJlYWRlci5wcm90b3R5cGUucmVzb2x2ZUlkZW50aWZpZXIgPSBmdW5jdGlvbiAobmFtZSwgbW9kdWxlVXJsLCBydW50aW1lKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBpZGVudGlmaWVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yUmVhZGVyLnByb3RvdHlwZS5yZXNvbHZlRW51bSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBuYW1lKSB7IH07XG4gICAgICAgIHJldHVybiBSZWZsZWN0b3JSZWFkZXI7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDIgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgUHJvdmlkZXMgYWNjZXNzIHRvIHJlZmxlY3Rpb24gZGF0YSBhYm91dCBzeW1ib2xzLiBVc2VkIGludGVybmFsbHkgYnkgQW5ndWxhclxuICAgICAgKiB0byBwb3dlciBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgY29tcGlsYXRpb24uXG4gICAgICovXG4gICAgdmFyIFJlZmxlY3RvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQyKFJlZmxlY3RvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVmbGVjdGlvbkNhcGFiaWxpdGllc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVmbGVjdG9yKHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjYXBzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0b3IucHJvdG90eXBlLnVwZGF0ZUNhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIChjYXBzKSB7IHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcyA9IGNhcHM7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuZmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuZmFjdG9yeSh0eXBlKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucGFyYW1ldGVycyh0eXBlT3JGdW5jKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yLnByb3RvdHlwZS5hbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zKHR5cGVPckZ1bmMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0b3IucHJvdG90eXBlLnByb3BNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3BNZXRhZGF0YSh0eXBlT3JGdW5jKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICAgKiBAcGFyYW0gez99IGxjUHJvcGVydHlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmhhc0xpZmVjeWNsZUhvb2sodHlwZSwgbGNQcm9wZXJ0eSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuZ2V0dGVyID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5nZXR0ZXIobmFtZSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuc2V0dGVyID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUubWV0aG9kID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QobmFtZSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuaW1wb3J0VXJpID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5pbXBvcnRVcmkodHlwZSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVVcmxcbiAgICAgICAgICogQHBhcmFtIHs/fSBydW50aW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0b3IucHJvdG90eXBlLnJlc29sdmVJZGVudGlmaWVyID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZVVybCwgcnVudGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5yZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIHJ1bnRpbWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpZGVudGlmaWVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvbHZlRW51bSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc29sdmVFbnVtKGlkZW50aWZpZXIsIG5hbWUpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdG9yO1xuICAgIH0oUmVmbGVjdG9yUmVhZGVyKSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUge0BsaW5rIFJlZmxlY3Rvcn0gdXNlZCBpbnRlcm5hbGx5IGluIEFuZ3VsYXIgdG8gYWNjZXNzIG1ldGFkYXRhXG4gICAgICogYWJvdXQgc3ltYm9scy5cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWZsZWN0b3IgPSBuZXcgUmVmbGVjdG9yKG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCkpO1xuXG4gICAgLyoqXG4gICAgICogIGBEZXBlbmRlbmN5YCBpcyB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gZXh0ZW5kIERJLlxuICAgICAgKiBUaGlzIGlzIGludGVybmFsIHRvIEFuZ3VsYXIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICB2YXIgUmVmbGVjdGl2ZURlcGVuZGVuY3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25hbFxuICAgICAgICAgKiBAcGFyYW0gez99IGxvd2VyQm91bmRWaXNpYmlsaXR5XG4gICAgICAgICAqIEBwYXJhbSB7P30gdXBwZXJCb3VuZFZpc2liaWxpdHlcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0aWVzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZWZsZWN0aXZlRGVwZW5kZW5jeShrZXksIG9wdGlvbmFsLCBsb3dlckJvdW5kVmlzaWJpbGl0eSwgdXBwZXJCb3VuZFZpc2liaWxpdHksIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICAgICAgdGhpcy5sb3dlckJvdW5kVmlzaWJpbGl0eSA9IGxvd2VyQm91bmRWaXNpYmlsaXR5O1xuICAgICAgICAgICAgdGhpcy51cHBlckJvdW5kVmlzaWJpbGl0eSA9IHVwcGVyQm91bmRWaXNpYmlsaXR5O1xuICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVEZXBlbmRlbmN5LmZyb21LZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KGtleSwgZmFsc2UsIG51bGwsIG51bGwsIFtdKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RpdmVEZXBlbmRlbmN5O1xuICAgIH0oKSk7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0VNUFRZX0xJU1QgPSBbXTtcbiAgICB2YXIgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVzb2x2ZWRGYWN0b3JpZXNcbiAgICAgICAgICogQHBhcmFtIHs/fSBtdWx0aVByb3ZpZGVyXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8oa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVkRmFjdG9yaWVzID0gcmVzb2x2ZWRGYWN0b3JpZXM7XG4gICAgICAgICAgICB0aGlzLm11bHRpUHJvdmlkZXIgPSBtdWx0aVByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8ucHJvdG90eXBlLCBcInJlc29sdmVkRmFjdG9yeVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5yZXNvbHZlZEZhY3Rvcmllc1swXTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl87XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgQW4gaW50ZXJuYWwgcmVzb2x2ZWQgcmVwcmVzZW50YXRpb24gb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZWQgYnkgcmVzb2x2aW5nIHtAbGlua1xuICAgICAgKiBQcm92aWRlcn0uXG4gICAgICovXG4gICAgdmFyIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3J5XG4gICAgICAgICAqIEBwYXJhbSB7P30gZGVwZW5kZW5jaWVzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnksIGRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIFJlc29sdmUgYSBzaW5nbGUgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVJlZmxlY3RpdmVGYWN0b3J5KHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZhY3RvcnlGbjtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZWREZXBzO1xuICAgICAgICBpZiAocHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVzZUNsYXNzID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIudXNlQ2xhc3MpO1xuICAgICAgICAgICAgZmFjdG9yeUZuID0gcmVmbGVjdG9yLmZhY3RvcnkodXNlQ2xhc3MpO1xuICAgICAgICAgICAgcmVzb2x2ZWREZXBzID0gX2RlcGVuZGVuY2llc0Zvcih1c2VDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgICAgIGZhY3RvcnlGbiA9IGZ1bmN0aW9uIChhbGlhc0luc3RhbmNlKSB7IHJldHVybiBhbGlhc0luc3RhbmNlOyB9O1xuICAgICAgICAgICAgcmVzb2x2ZWREZXBzID0gW1JlZmxlY3RpdmVEZXBlbmRlbmN5LmZyb21LZXkoUmVmbGVjdGl2ZUtleS5nZXQocHJvdmlkZXIudXNlRXhpc3RpbmcpKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSkge1xuICAgICAgICAgICAgZmFjdG9yeUZuID0gcHJvdmlkZXIudXNlRmFjdG9yeTtcbiAgICAgICAgICAgIHJlc29sdmVkRGVwcyA9IGNvbnN0cnVjdERlcGVuZGVuY2llcyhwcm92aWRlci51c2VGYWN0b3J5LCBwcm92aWRlci5kZXBzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZhY3RvcnlGbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3ZpZGVyLnVzZVZhbHVlOyB9O1xuICAgICAgICAgICAgcmVzb2x2ZWREZXBzID0gX0VNUFRZX0xJU1Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnlGbiwgcmVzb2x2ZWREZXBzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENvbnZlcnRzIHRoZSB7QGxpbmsgUHJvdmlkZXJ9IGludG8ge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LlxuICAgICAgKiAqXG4gICAgICAqIHtAbGluayBJbmplY3Rvcn0gaW50ZXJuYWxseSBvbmx5IHVzZXMge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LCB7QGxpbmsgUHJvdmlkZXJ9IGNvbnRhaW5zXG4gICAgICAqIGNvbnZlbmllbmNlIHByb3ZpZGVyIHN5bnRheC5cbiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKFJlZmxlY3RpdmVLZXkuZ2V0KHByb3ZpZGVyLnByb3ZpZGUpLCBbcmVzb2x2ZVJlZmxlY3RpdmVGYWN0b3J5KHByb3ZpZGVyKV0sIHByb3ZpZGVyLm11bHRpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJlc29sdmUgYSBsaXN0IG9mIFByb3ZpZGVycy5cbiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcnMocHJvdmlkZXJzKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplUHJvdmlkZXJzKHByb3ZpZGVycywgW10pO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZCA9IG5vcm1hbGl6ZWQubWFwKHJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXIpO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZFByb3ZpZGVyTWFwID0gbWVyZ2VSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMocmVzb2x2ZWQsIG5ldyBNYXAoKSk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJlc29sdmVkUHJvdmlkZXJNYXAudmFsdWVzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgTWVyZ2VzIGEgbGlzdCBvZiBSZXNvbHZlZFByb3ZpZGVycyBpbnRvIGEgbGlzdCB3aGVyZVxuICAgICAgKiBlYWNoIGtleSBpcyBjb250YWluZWQgZXhhY3RseSBvbmNlIGFuZCBtdWx0aSBwcm92aWRlcnNcbiAgICAgICogaGF2ZSBiZWVuIG1lcmdlZC5cbiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAqIEBwYXJhbSB7P30gbm9ybWFsaXplZFByb3ZpZGVyc01hcFxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMocHJvdmlkZXJzLCBub3JtYWxpemVkUHJvdmlkZXJzTWFwKSB7XG4gICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3ZpZGVyID0gcHJvdmlkZXJzW2ldO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhpc3RpbmcgPSBub3JtYWxpemVkUHJvdmlkZXJzTWFwLmdldChwcm92aWRlci5rZXkuaWQpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIgIT09IGV4aXN0aW5nLm11bHRpUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZywgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGogPSAwOyBqIDwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlc29sdmVkRmFjdG9yaWVzLnB1c2gocHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJzTWFwLnNldChwcm92aWRlci5rZXkuaWQsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlZFByb3ZpZGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5tdWx0aVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKHByb3ZpZGVyLmtleSwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMuc2xpY2UoKSwgcHJvdmlkZXIubXVsdGlQcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm92aWRlcnNNYXAuc2V0KHByb3ZpZGVyLmtleS5pZCwgcmVzb2x2ZWRQcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQcm92aWRlcnNNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzXG4gICAgICogQHBhcmFtIHs/fSByZXNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCByZXMpIHtcbiAgICAgICAgcHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgVHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgcHJvdmlkZTogYiwgdXNlQ2xhc3M6IGIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiICYmIHR5cGVvZiBiID09ICdvYmplY3QnICYmICgoYikpLnByb3ZpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKC8qKiBAdHlwZSB7P30gKi8gKGIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIF9ub3JtYWxpemVQcm92aWRlcnMoYiwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdmlkZXJFcnJvcihiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuY1xuICAgICAqIEBwYXJhbSB7P30gZGVwZW5kZW5jaWVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25zdHJ1Y3REZXBlbmRlbmNpZXModHlwZU9yRnVuYywgZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gX2RlcGVuZGVuY2llc0Zvcih0eXBlT3JGdW5jKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtc18xID0gZGVwZW5kZW5jaWVzLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gW3RdOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHQsIHBhcmFtc18xKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfZGVwZW5kZW5jaWVzRm9yKHR5cGVPckZ1bmMpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1zID0gcmVmbGVjdG9yLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gICAgICAgIGlmICghcGFyYW1zKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBpZiAocGFyYW1zLnNvbWUoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAgPT0gbnVsbDsgfSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0Fubm90YXRpb25FcnJvcih0eXBlT3JGdW5jLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXMubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcyk7IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmNcbiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhXG4gICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgbWV0YWRhdGEsIHBhcmFtcykge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZXBQcm9wcyA9IFtdO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0b2tlbiA9IG51bGw7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YS50b2tlbiwgb3B0aW9uYWwsIG51bGwsIG51bGwsIGRlcFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YSwgb3B0aW9uYWwsIG51bGwsIG51bGwsIGRlcFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb3dlckJvdW5kVmlzaWJpbGl0eSA9IG51bGw7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVwcGVyQm91bmRWaXNpYmlsaXR5ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IG1ldGFkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbU1ldGFkYXRhID0gbWV0YWRhdGFbaV07XG4gICAgICAgICAgICBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgSW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgdG9rZW4gPSBwYXJhbU1ldGFkYXRhLnRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIE9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFNlbGYpIHtcbiAgICAgICAgICAgICAgICB1cHBlckJvdW5kVmlzaWJpbGl0eSA9IHBhcmFtTWV0YWRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgSG9zdCkge1xuICAgICAgICAgICAgICAgIHVwcGVyQm91bmRWaXNpYmlsaXR5ID0gcGFyYW1NZXRhZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBTa2lwU2VsZikge1xuICAgICAgICAgICAgICAgIGxvd2VyQm91bmRWaXNpYmlsaXR5ID0gcGFyYW1NZXRhZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b2tlbiA9IHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKTtcbiAgICAgICAgaWYgKHRva2VuICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSwgZGVwUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAqIEBwYXJhbSB7P30gb3B0aW9uYWxcbiAgICAgKiBAcGFyYW0gez99IGxvd2VyQm91bmRWaXNpYmlsaXR5XG4gICAgICogQHBhcmFtIHs/fSB1cHBlckJvdW5kVmlzaWJpbGl0eVxuICAgICAqIEBwYXJhbSB7P30gZGVwUHJvcHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9jcmVhdGVEZXBlbmRlbmN5KHRva2VuLCBvcHRpb25hbCwgbG93ZXJCb3VuZFZpc2liaWxpdHksIHVwcGVyQm91bmRWaXNpYmlsaXR5LCBkZXBQcm9wcykge1xuICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KFJlZmxlY3RpdmVLZXkuZ2V0KHRva2VuKSwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSwgZGVwUHJvcHMpO1xuICAgIH1cblxuICAgIC8vIFRocmVzaG9sZCBmb3IgdGhlIGR5bmFtaWMgdmVyc2lvblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9NQVhfQ09OU1RSVUNUSU9OX0NPVU5URVIgPSAxMDtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBVTkRFRklORUQgPSBuZXcgT2JqZWN0KCk7XG4gICAgdmFyIFJlZmxlY3RpdmVQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm90b0VJXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZWZsZWN0aXZlUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5KHByb3RvRUksIHByb3ZpZGVycykge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjEgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjYgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcjkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDEgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDYgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5rZXlJZDkgPSBudWxsO1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHByb3ZpZGVycy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIwID0gcHJvdmlkZXJzWzBdO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5SWQwID0gcHJvdmlkZXJzWzBdLmtleS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlcjEgPSBwcm92aWRlcnNbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlJZDEgPSBwcm92aWRlcnNbMV0ua2V5LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyMiA9IHByb3ZpZGVyc1syXTtcbiAgICAgICAgICAgICAgICB0aGlzLmtleUlkMiA9IHByb3ZpZGVyc1syXS5rZXkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIzID0gcHJvdmlkZXJzWzNdO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5SWQzID0gcHJvdmlkZXJzWzNdLmtleS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlcjQgPSBwcm92aWRlcnNbNF07XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlJZDQgPSBwcm92aWRlcnNbNF0ua2V5LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyNSA9IHByb3ZpZGVyc1s1XTtcbiAgICAgICAgICAgICAgICB0aGlzLmtleUlkNSA9IHByb3ZpZGVyc1s1XS5rZXkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gNikge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXI2ID0gcHJvdmlkZXJzWzZdO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5SWQ2ID0gcHJvdmlkZXJzWzZdLmtleS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW5ndGggPiA3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm92aWRlcjcgPSBwcm92aWRlcnNbN107XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlJZDcgPSBwcm92aWRlcnNbN10ua2V5LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyOCA9IHByb3ZpZGVyc1s4XTtcbiAgICAgICAgICAgICAgICB0aGlzLmtleUlkOCA9IHByb3ZpZGVyc1s4XS5rZXkuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGVuZ3RoID4gOSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXI5ID0gcHJvdmlkZXJzWzldO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5SWQ5ID0gcHJvdmlkZXJzWzldLmtleS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5wcm90b3R5cGUuZ2V0UHJvdmlkZXJBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjA7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjE7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjI7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjM7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjU7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjY7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjc7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gOClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjg7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gOSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlcjk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZCb3VuZHNFcnJvcihpbmRleCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5LnByb3RvdHlwZS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5ID0gZnVuY3Rpb24gKGluamVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVJbmplY3RvcklubGluZVN0cmF0ZWd5KGluamVjdG9yLCB0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RpdmVQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3k7XG4gICAgfSgpKTtcbiAgICB2YXIgUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm90b0lualxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kocHJvdG9JbmosIHByb3ZpZGVycykge1xuICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7XG4gICAgICAgICAgICB2YXIgbGVuID0gcHJvdmlkZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMua2V5SWRzID0gbmV3IEFycmF5KGxlbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlJZHNbaV0gPSBwcm92aWRlcnNbaV0ua2V5LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5wcm90b3R5cGUuZ2V0UHJvdmlkZXJBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPdXRPZkJvdW5kc0Vycm9yKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyc1tpbmRleF07XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVpXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5wcm90b3R5cGUuY3JlYXRlSW5qZWN0b3JTdHJhdGVneSA9IGZ1bmN0aW9uIChlaSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kodGhpcywgZWkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3k7XG4gICAgfSgpKTtcbiAgICB2YXIgUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFJlZmxlY3RpdmVQcm90b0luamVjdG9yKHByb3ZpZGVycykge1xuICAgICAgICAgICAgdGhpcy5udW1iZXJPZlByb3ZpZGVycyA9IHByb3ZpZGVycy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9zdHJhdGVneSA9IHByb3ZpZGVycy5sZW5ndGggPiBfTUFYX0NPTlNUUlVDVElPTl9DT1VOVEVSID9cbiAgICAgICAgICAgICAgICBuZXcgUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kodGhpcywgcHJvdmlkZXJzKSA6XG4gICAgICAgICAgICAgICAgbmV3IFJlZmxlY3RpdmVQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kodGhpcywgcHJvdmlkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVQcm90b0luamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyA9IGZ1bmN0aW9uIChwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3IocHJvdmlkZXJzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVQcm90b0luamVjdG9yLnByb3RvdHlwZS5nZXRQcm92aWRlckF0SW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdHJhdGVneS5nZXRQcm92aWRlckF0SW5kZXgoaW5kZXgpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZVByb3RvSW5qZWN0b3I7XG4gICAgfSgpKTtcbiAgICB2YXIgUmVmbGVjdGl2ZUluamVjdG9ySW5saW5lU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3RvU3RyYXRlZ3lcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFJlZmxlY3RpdmVJbmplY3RvcklubGluZVN0cmF0ZWd5KGluamVjdG9yLCBwcm90b1N0cmF0ZWd5KSB7XG4gICAgICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgICAgICB0aGlzLnByb3RvU3RyYXRlZ3kgPSBwcm90b1N0cmF0ZWd5O1xuICAgICAgICAgICAgdGhpcy5vYmowID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmoxID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmoyID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmozID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo0ID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo1ID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo2ID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo3ID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo4ID0gVU5ERUZJTkVEO1xuICAgICAgICAgICAgdGhpcy5vYmo5ID0gVU5ERUZJTkVEO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9ySW5saW5lU3RyYXRlZ3kucHJvdG90eXBlLnJlc2V0Q29uc3RydWN0aW9uQ291bnRlciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5pbmplY3Rvci5fY29uc3RydWN0aW9uQ291bnRlciA9IDA7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5wcm90b3R5cGUuaW5zdGFudGlhdGVQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuX25ldyhwcm92aWRlcik7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGtleUlkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5wcm90b3R5cGUuZ2V0T2JqQnlLZXlJZCA9IGZ1bmN0aW9uIChrZXlJZCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IHRoaXMucHJvdG9TdHJhdGVneTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluaiA9IHRoaXMuaW5qZWN0b3I7XG4gICAgICAgICAgICBpZiAocC5rZXlJZDAgPT09IGtleUlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqMCA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JqMCA9IGluai5fbmV3KHAucHJvdmlkZXIwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwLmtleUlkMSA9PT0ga2V5SWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmoxID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmoxID0gaW5qLl9uZXcocC5wcm92aWRlcjEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmoxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHAua2V5SWQyID09PSBrZXlJZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iajIgPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iajIgPSBpbmouX25ldyhwLnByb3ZpZGVyMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocC5rZXlJZDMgPT09IGtleUlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqMyA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JqMyA9IGluai5fbmV3KHAucHJvdmlkZXIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwLmtleUlkNCA9PT0ga2V5SWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmo0ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmo0ID0gaW5qLl9uZXcocC5wcm92aWRlcjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmo0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHAua2V5SWQ1ID09PSBrZXlJZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iajUgPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iajUgPSBpbmouX25ldyhwLnByb3ZpZGVyNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocC5rZXlJZDYgPT09IGtleUlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqNiA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JqNiA9IGluai5fbmV3KHAucHJvdmlkZXI2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwLmtleUlkNyA9PT0ga2V5SWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmo3ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmo3ID0gaW5qLl9uZXcocC5wcm92aWRlcjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmo3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHAua2V5SWQ4ID09PSBrZXlJZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iajggPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iajggPSBpbmouX25ldyhwLnByb3ZpZGVyOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocC5rZXlJZDkgPT09IGtleUlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JqOSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2JqOSA9IGluai5fbmV3KHAucHJvdmlkZXI5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBVTkRFRklORUQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5wcm90b3R5cGUuZ2V0T2JqQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqMDtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajE7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmoyO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqMztcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSA0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajQ7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gNSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmo1O1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqNjtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSA3KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9iajc7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gOClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmo4O1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqOTtcbiAgICAgICAgICAgIHRocm93IG5ldyBPdXRPZkJvdW5kc0Vycm9yKGluZGV4KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5wcm90b3R5cGUuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX01BWF9DT05TVFJVQ1RJT05fQ09VTlRFUjsgfTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RpdmVJbmplY3RvcklubGluZVN0cmF0ZWd5O1xuICAgIH0oKSk7XG4gICAgdmFyIFJlZmxlY3RpdmVJbmplY3RvckR5bmFtaWNTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3RvU3RyYXRlZ3lcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVmbGVjdGl2ZUluamVjdG9yRHluYW1pY1N0cmF0ZWd5KHByb3RvU3RyYXRlZ3ksIGluamVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb3RvU3RyYXRlZ3kgPSBwcm90b1N0cmF0ZWd5O1xuICAgICAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICAgICAgdGhpcy5vYmpzID0gbmV3IEFycmF5KHByb3RvU3RyYXRlZ3kucHJvdmlkZXJzLmxlbmd0aCkuZmlsbChVTkRFRklORUQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnByb3RvdHlwZS5yZXNldENvbnN0cnVjdGlvbkNvdW50ZXIgPSBmdW5jdGlvbiAoKSB7IHRoaXMuaW5qZWN0b3IuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnByb3RvdHlwZS5pbnN0YW50aWF0ZVByb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5fbmV3KHByb3ZpZGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5SWRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3RvckR5bmFtaWNTdHJhdGVneS5wcm90b3R5cGUuZ2V0T2JqQnlLZXlJZCA9IGZ1bmN0aW9uIChrZXlJZCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IHRoaXMucHJvdG9TdHJhdGVneTtcbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBwLmtleUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChwLmtleUlkc1tpXSA9PT0ga2V5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ianNbaV0gPSB0aGlzLmluamVjdG9yLl9uZXcocC5wcm92aWRlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9ianNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFVOREVGSU5FRDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3RvckR5bmFtaWNTdHJhdGVneS5wcm90b3R5cGUuZ2V0T2JqQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm9ianMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub2Jqc1tpbmRleF07XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnByb3RvdHlwZS5nZXRNYXhOdW1iZXJPZk9iamVjdHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm9ianMubGVuZ3RoOyB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZUluamVjdG9yRHluYW1pY1N0cmF0ZWd5O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIEEgUmVmbGVjdGl2ZURlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lciB1c2VkIGZvciBpbnN0YW50aWF0aW5nIG9iamVjdHMgYW5kIHJlc29sdmluZ1xuICAgICAgKiBkZXBlbmRlbmNpZXMuXG4gICAgICAqICpcbiAgICAgICogQW4gYEluamVjdG9yYCBpcyBhIHJlcGxhY2VtZW50IGZvciBhIGBuZXdgIG9wZXJhdG9yLCB3aGljaCBjYW4gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZVxuICAgICAgKiBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMuXG4gICAgICAqICpcbiAgICAgICogSW4gdHlwaWNhbCB1c2UsIGFwcGxpY2F0aW9uIGNvZGUgYXNrcyBmb3IgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZXkgYXJlXG4gICAgICAqIHJlc29sdmVkIGJ5IHRoZSBgSW5qZWN0b3JgLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qemplYzA/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhbiBgSW5qZWN0b3JgIGNvbmZpZ3VyZWQgdG8gY3JlYXRlIGBFbmdpbmVgIGFuZCBgQ2FyYC5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGNsYXNzIEVuZ2luZSB7XG4gICAgICAqIH1cbiAgICAgICogKlxuICAgICAgKiBjbGFzcyBDYXIge1xuICAgICAgKiBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICAgICAgKiB2YXIgY2FyID0gaW5qZWN0b3IuZ2V0KENhcik7XG4gICAgICAqIGV4cGVjdChjYXIgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAgICAqIGV4cGVjdChjYXIuZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKS50b0JlKHRydWUpO1xuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiBOb3RpY2UsIHdlIGRvbid0IHVzZSB0aGUgYG5ld2Agb3BlcmF0b3IgYmVjYXVzZSB3ZSBleHBsaWNpdGx5IHdhbnQgdG8gaGF2ZSB0aGUgYEluamVjdG9yYFxuICAgICAgKiByZXNvbHZlIGFsbCBvZiB0aGUgb2JqZWN0J3MgZGVwZW5kZW5jaWVzIGF1dG9tYXRpY2FsbHkuXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgUmVmbGVjdGl2ZUluamVjdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gUmVmbGVjdGl2ZUluamVjdG9yKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVHVybnMgYW4gYXJyYXkgb2YgcHJvdmlkZXIgZGVmaW5pdGlvbnMgaW50byBhbiBhcnJheSBvZiByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBBIHJlc29sdXRpb24gaXMgYSBwcm9jZXNzIG9mIGZsYXR0ZW5pbmcgbXVsdGlwbGUgbmVzdGVkIGFycmF5cyBhbmQgY29udmVydGluZyBpbmRpdmlkdWFsXG4gICAgICAgICAgKiBwcm92aWRlcnMgaW50byBhbiBhcnJheSBvZiB7QGxpbmsgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJ9cy5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9BaVhUSGk/cD1wcmV2aWV3KSlcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICAqIGNsYXNzIEVuZ2luZSB7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBjbGFzcyBDYXIge1xuICAgICAgICAgICogY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiB2YXIgcHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUoW0NhciwgW1tFbmdpbmVdXV0pO1xuICAgICAgICAgICogKlxuICAgICAgICAgICogZXhwZWN0KHByb3ZpZGVycy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmtleS5kaXNwbGF5TmFtZSkudG9CZShcIkNhclwiKTtcbiAgICAgICAgICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZGVwZW5kZW5jaWVzLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgICAgICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZmFjdG9yeSkudG9CZURlZmluZWQoKTtcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGV4cGVjdChwcm92aWRlcnNbMV0ua2V5LmRpc3BsYXlOYW1lKS50b0JlKFwiRW5naW5lXCIpO1xuICAgICAgICAgICogfSk7XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFNlZSB7QGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yI2Zyb21SZXNvbHZlZFByb3ZpZGVyc30gZm9yIG1vcmUgaW5mby5cbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlID0gZnVuY3Rpb24gKHByb3ZpZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmVzb2x2ZXMgYW4gYXJyYXkgb2YgcHJvdmlkZXJzIGFuZCBjcmVhdGVzIGFuIGluamVjdG9yIGZyb20gdGhvc2UgcHJvdmlkZXJzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgY2FuIGJlIGFuIGFycmF5IG9mIGBUeXBlYCwge0BsaW5rIFByb3ZpZGVyfSxcbiAgICAgICAgICAqIG9yIGEgcmVjdXJzaXZlIGFycmF5IG9mIG1vcmUgcHJvdmlkZXJzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2VQT2NjQT9wPXByZXZpZXcpKVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgICogY2xhc3MgRW5naW5lIHtcbiAgICAgICAgICAqIH1cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGNsYXNzIENhciB7XG4gICAgICAgICAgKiBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICAgICAgICAqIH1cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICAgICAgICAgICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgICAgICAgICogYGBgXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGBmcm9tUmVzb2x2ZWRQcm92aWRlcnNgXG4gICAgICAgICAgKiBiZWNhdXNlIGl0IG5lZWRzIHRvIHJlc29sdmUgdGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgZmlyc3QuXG4gICAgICAgICAgKiBTZWUge0BsaW5rIEluamVjdG9yI3Jlc29sdmV9IGFuZCB7QGxpbmsgSW5qZWN0b3IjZnJvbVJlc29sdmVkUHJvdmlkZXJzfS5cbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcGFyZW50XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZSA9IGZ1bmN0aW9uIChwcm92aWRlcnMsIHBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PT0gdm9pZCAwKSB7IHBhcmVudCA9IG51bGw7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKHByb3ZpZGVycyk7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZUluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMsIHBhcmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhpcyBBUEkgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBjb25zdHJ1Y3QgaW5qZWN0b3JzIGluIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBwYXJ0cy5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9LclNNY2k/cD1wcmV2aWV3KSlcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICAqIGNsYXNzIEVuZ2luZSB7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBjbGFzcyBDYXIge1xuICAgICAgICAgICogY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiB2YXIgcHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUoW0NhciwgRW5naW5lXSk7XG4gICAgICAgICAgKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVycyk7XG4gICAgICAgICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcGFyZW50XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzID0gZnVuY3Rpb24gKHByb3ZpZGVycywgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSB2b2lkIDApIHsgcGFyZW50ID0gbnVsbDsgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JfKFJlZmxlY3RpdmVQcm90b0luamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhwcm92aWRlcnMpLCBwYXJlbnQpO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVmbGVjdGl2ZUluamVjdG9yLnByb3RvdHlwZSwgXCJwYXJlbnRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgUGFyZW50IG9mIHRoaXMgaW5qZWN0b3IuXG4gICAgICAgICAgICAgICogKlxuICAgICAgICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byB0aGUgc2VjdGlvbiBvZiB0aGUgdXNlciBndWlkZSB0YWxraW5nIGFib3V0IGhpZXJhcmNoaWNhbCBpbmplY3Rpb24uXG4gICAgICAgICAgICAgICogLS0+XG4gICAgICAgICAgICAgICogKlxuICAgICAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9lb3NNR28/cD1wcmV2aWV3KSlcbiAgICAgICAgICAgICAgKiAqXG4gICAgICAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgICAgICAqIHZhciBwYXJlbnQgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXSk7XG4gICAgICAgICAgICAgICogdmFyIGNoaWxkID0gcGFyZW50LnJlc29sdmVBbmRDcmVhdGVDaGlsZChbXSk7XG4gICAgICAgICAgICAgICogZXhwZWN0KGNoaWxkLnBhcmVudCkudG9CZShwYXJlbnQpO1xuICAgICAgICAgICAgICAqIGBgYFxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogIFJlc29sdmVzIGFuIGFycmF5IG9mIHByb3ZpZGVycyBhbmQgY3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gdGhvc2UgcHJvdmlkZXJzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIHRoZSBzZWN0aW9uIG9mIHRoZSB1c2VyIGd1aWRlIHRhbGtpbmcgYWJvdXQgaGllcmFyY2hpY2FsIGluamVjdGlvbi5cbiAgICAgICAgICAqIC0tPlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgY2FuIGJlIGFuIGFycmF5IG9mIGBUeXBlYCwge0BsaW5rIFByb3ZpZGVyfSxcbiAgICAgICAgICAqIG9yIGEgcmVjdXJzaXZlIGFycmF5IG9mIG1vcmUgcHJvdmlkZXJzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L29wQjNUND9wPXByZXZpZXcpKVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgICogY2xhc3MgUGFyZW50UHJvdmlkZXIge31cbiAgICAgICAgICAqIGNsYXNzIENoaWxkUHJvdmlkZXIge31cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIHZhciBwYXJlbnQgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbUGFyZW50UHJvdmlkZXJdKTtcbiAgICAgICAgICAqIHZhciBjaGlsZCA9IHBhcmVudC5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQoW0NoaWxkUHJvdmlkZXJdKTtcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgKiBleHBlY3QoY2hpbGQuZ2V0KENoaWxkUHJvdmlkZXIpIGluc3RhbmNlb2YgQ2hpbGRQcm92aWRlcikudG9CZSh0cnVlKTtcbiAgICAgICAgICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpKS50b0JlKHBhcmVudC5nZXQoUGFyZW50UHJvdmlkZXIpKTtcbiAgICAgICAgICAqIGBgYFxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBzbG93ZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWRgXG4gICAgICAgICAgKiBiZWNhdXNlIGl0IG5lZWRzIHRvIHJlc29sdmUgdGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgZmlyc3QuXG4gICAgICAgICAgKiBTZWUge0BsaW5rIEluamVjdG9yI3Jlc29sdmV9IGFuZCB7QGxpbmsgSW5qZWN0b3IjY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWR9LlxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yLnByb3RvdHlwZS5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQgPSBmdW5jdGlvbiAocHJvdmlkZXJzKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gcHJldmlvdXNseSByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gdGhlIHNlY3Rpb24gb2YgdGhlIHVzZXIgZ3VpZGUgdGFsa2luZyBhYm91dCBoaWVyYXJjaGljYWwgaW5qZWN0aW9uLlxuICAgICAgICAgICogLS0+XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGlzIEFQSSBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNvbnN0cnVjdCBpbmplY3RvcnMgaW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIHBhcnRzLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1ZoeWZqTj9wPXByZXZpZXcpKVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgICogY2xhc3MgUGFyZW50UHJvdmlkZXIge31cbiAgICAgICAgICAqIGNsYXNzIENoaWxkUHJvdmlkZXIge31cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIHZhciBwYXJlbnRQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbUGFyZW50UHJvdmlkZXJdKTtcbiAgICAgICAgICAqIHZhciBjaGlsZFByb3ZpZGVycyA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtDaGlsZFByb3ZpZGVyXSk7XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiB2YXIgcGFyZW50ID0gUmVmbGVjdGl2ZUluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhwYXJlbnRQcm92aWRlcnMpO1xuICAgICAgICAgICogdmFyIGNoaWxkID0gcGFyZW50LmNyZWF0ZUNoaWxkRnJvbVJlc29sdmVkKGNoaWxkUHJvdmlkZXJzKTtcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgKiBleHBlY3QoY2hpbGQuZ2V0KENoaWxkUHJvdmlkZXIpIGluc3RhbmNlb2YgQ2hpbGRQcm92aWRlcikudG9CZSh0cnVlKTtcbiAgICAgICAgICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpKS50b0JlKHBhcmVudC5nZXQoUGFyZW50UHJvdmlkZXIpKTtcbiAgICAgICAgICAqIGBgYFxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yLnByb3RvdHlwZS5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZCA9IGZ1bmN0aW9uIChwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmltcGxlbWVudGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmVzb2x2ZXMgYSBwcm92aWRlciBhbmQgaW5zdGFudGlhdGVzIGFuIG9iamVjdCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5qZWN0b3IuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgY3JlYXRlZCBvYmplY3QgZG9lcyBub3QgZ2V0IGNhY2hlZCBieSB0aGUgaW5qZWN0b3IuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQveXZWWG9CP3A9cHJldmlldykpXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBjbGFzcyBFbmdpbmUge1xuICAgICAgICAgICogfVxuICAgICAgICAgICogKlxuICAgICAgICAgICogY2xhc3MgQ2FyIHtcbiAgICAgICAgICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICAgICAgICAgICogfVxuICAgICAgICAgICogKlxuICAgICAgICAgICogdmFyIGluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0VuZ2luZV0pO1xuICAgICAgICAgICogKlxuICAgICAgICAgICogdmFyIGNhciA9IGluamVjdG9yLnJlc29sdmVBbmRJbnN0YW50aWF0ZShDYXIpO1xuICAgICAgICAgICogZXhwZWN0KGNhci5lbmdpbmUpLnRvQmUoaW5qZWN0b3IuZ2V0KEVuZ2luZSkpO1xuICAgICAgICAgICogZXhwZWN0KGNhcikubm90LnRvQmUoaW5qZWN0b3IucmVzb2x2ZUFuZEluc3RhbnRpYXRlKENhcikpO1xuICAgICAgICAgICogYGBgXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvci5wcm90b3R5cGUucmVzb2x2ZUFuZEluc3RhbnRpYXRlID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgSW5zdGFudGlhdGVzIGFuIG9iamVjdCB1c2luZyBhIHJlc29sdmVkIHByb3ZpZGVyIGluIHRoZSBjb250ZXh0IG9mIHRoZSBpbmplY3Rvci5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFRoZSBjcmVhdGVkIG9iamVjdCBkb2VzIG5vdCBnZXQgY2FjaGVkIGJ5IHRoZSBpbmplY3Rvci5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9wdENJbVE/cD1wcmV2aWV3KSlcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICAqIGNsYXNzIEVuZ2luZSB7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBjbGFzcyBDYXIge1xuICAgICAgICAgICogY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbRW5naW5lXSk7XG4gICAgICAgICAgKiB2YXIgY2FyUHJvdmlkZXIgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbQ2FyXSlbMF07XG4gICAgICAgICAgKiB2YXIgY2FyID0gaW5qZWN0b3IuaW5zdGFudGlhdGVSZXNvbHZlZChjYXJQcm92aWRlcik7XG4gICAgICAgICAgKiBleHBlY3QoY2FyLmVuZ2luZSkudG9CZShpbmplY3Rvci5nZXQoRW5naW5lKSk7XG4gICAgICAgICAgKiBleHBlY3QoY2FyKS5ub3QudG9CZShpbmplY3Rvci5pbnN0YW50aWF0ZVJlc29sdmVkKGNhclByb3ZpZGVyKSk7XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yLnByb3RvdHlwZS5pbnN0YW50aWF0ZVJlc29sdmVkID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0b2tlbiwgbm90Rm91bmRWYWx1ZSkgeyB9O1xuICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZUluamVjdG9yO1xuICAgIH0oKSk7XG4gICAgdmFyIFJlZmxlY3RpdmVJbmplY3Rvcl8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogIFByaXZhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcHJvdG9cbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3BhcmVudFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVmbGVjdGl2ZUluamVjdG9yXyhfcHJvdG8gLyogUHJvdG9JbmplY3RvciAqLywgX3BhcmVudCkge1xuICAgICAgICAgICAgaWYgKF9wYXJlbnQgPT09IHZvaWQgMCkgeyBfcGFyZW50ID0gbnVsbDsgfVxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fY29uc3RydWN0aW9uQ291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLl9wcm90byA9IF9wcm90bztcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLl9zdHJhdGVneSA9IF9wcm90by5fc3RyYXRlZ3kuY3JlYXRlSW5qZWN0b3JTdHJhdGVneSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IFRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5KFJlZmxlY3RpdmVLZXkuZ2V0KHRva2VuKSwgbnVsbCwgbnVsbCwgbm90Rm91bmRWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5nZXRBdCA9IGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gdGhpcy5fc3RyYXRlZ3kuZ2V0T2JqQXRJbmRleChpbmRleCk7IH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZSwgXCJwYXJlbnRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZSwgXCJpbnRlcm5hbFN0cmF0ZWd5XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIEludGVybmFsLiBEbyBub3QgdXNlLlxuICAgICAgICAgICAgICAqIFdlIHJldHVybiBgYW55YCBub3QgdG8gZXhwb3J0IHRoZSBJbmplY3RvclN0cmF0ZWd5IHR5cGUuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5OyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQgPSBmdW5jdGlvbiAocHJvdmlkZXJzKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShwcm92aWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQoUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZCA9IGZ1bmN0aW9uIChwcm92aWRlcnMpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb3RvID0gbmV3IFJlZmxlY3RpdmVQcm90b0luamVjdG9yKHByb3ZpZGVycyk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmogPSBuZXcgUmVmbGVjdGl2ZUluamVjdG9yXyhwcm90byk7XG4gICAgICAgICAgICBpbmouX3BhcmVudCA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gaW5qO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUucmVzb2x2ZUFuZEluc3RhbnRpYXRlID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZVJlc29sdmVkKFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtwcm92aWRlcl0pWzBdKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLmluc3RhbnRpYXRlUmVzb2x2ZWQgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25zdHJ1Y3Rpb25Db3VudGVyKysgPiB0aGlzLl9zdHJhdGVneS5nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9pbnN0YW50aWF0ZVByb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IG5ldyBBcnJheShwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbaV0gPSB0aGlzLl9pbnN0YW50aWF0ZShwcm92aWRlciwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUuX2luc3RhbnRpYXRlID0gZnVuY3Rpb24gKHByb3ZpZGVyLCBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmYWN0b3J5ID0gUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeS5mYWN0b3J5O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVwcyA9IFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkuZGVwZW5kZW5jaWVzO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGVuZ3RoID0gZGVwcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkMDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZDI7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkMztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQ0O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZDU7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkNjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQ3O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZDg7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkOTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxMDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxMTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxMjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxMztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxNDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxNTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxNjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxNztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxODtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGQxOTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZDAgPSBsZW5ndGggPiAwID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1swXSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQxID0gbGVuZ3RoID4gMSA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMV0pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkMiA9IGxlbmd0aCA+IDIgPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzJdKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDMgPSBsZW5ndGggPiAzID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1szXSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQ0ID0gbGVuZ3RoID4gNCA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbNF0pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkNSA9IGxlbmd0aCA+IDUgPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzVdKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDYgPSBsZW5ndGggPiA2ID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s2XSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQ3ID0gbGVuZ3RoID4gNyA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbN10pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkOCA9IGxlbmd0aCA+IDggPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzhdKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDkgPSBsZW5ndGggPiA5ID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s5XSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQxMCA9IGxlbmd0aCA+IDEwID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxMF0pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkMTEgPSBsZW5ndGggPiAxMSA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTFdKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDEyID0gbGVuZ3RoID4gMTIgPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzEyXSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQxMyA9IGxlbmd0aCA+IDEzID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxM10pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkMTQgPSBsZW5ndGggPiAxNCA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTRdKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDE1ID0gbGVuZ3RoID4gMTUgPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE1XSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQxNiA9IGxlbmd0aCA+IDE2ID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxNl0pIDogbnVsbDtcbiAgICAgICAgICAgICAgICBkMTcgPSBsZW5ndGggPiAxNyA/IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTddKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgZDE4ID0gbGVuZ3RoID4gMTggPyB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE4XSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGQxOSA9IGxlbmd0aCA+IDE5ID8gdGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxOV0pIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBYnN0cmFjdFByb3ZpZGVyRXJyb3IgfHwgZSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JqO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsIGQxNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUsIGQxNiwgZDE3LCBkMTgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsIGQxNywgZDE4LCBkMTkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zdGFudGlhdGUgJ1wiICsgcHJvdmlkZXIua2V5LmRpc3BsYXlOYW1lICsgXCInIGJlY2F1c2UgaXQgaGFzIG1vcmUgdGhhbiAyMCBkZXBlbmRlbmNpZXNcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkVycm9yKHRoaXMsIGUsIGUuc3RhY2ssIHByb3ZpZGVyLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclxuICAgICAgICAgKiBAcGFyYW0gez99IGRlcFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kgPSBmdW5jdGlvbiAocHJvdmlkZXIsIGRlcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5KGRlcC5rZXksIGRlcC5sb3dlckJvdW5kVmlzaWJpbGl0eSwgZGVwLnVwcGVyQm91bmRWaXNpYmlsaXR5LCBkZXAub3B0aW9uYWwgPyBudWxsIDogVEhST1dfSUZfTk9UX0ZPVU5EKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7P30gbG93ZXJCb3VuZFZpc2liaWxpdHlcbiAgICAgICAgICogQHBhcmFtIHs/fSB1cHBlckJvdW5kVmlzaWJpbGl0eVxuICAgICAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9nZXRCeUtleSA9IGZ1bmN0aW9uIChrZXksIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gSU5KRUNUT1JfS0VZKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBwZXJCb3VuZFZpc2liaWxpdHkgaW5zdGFuY2VvZiBTZWxmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5U2VsZihrZXksIG5vdEZvdW5kVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5RGVmYXVsdChrZXksIG5vdEZvdW5kVmFsdWUsIGxvd2VyQm91bmRWaXNpYmlsaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUuX3Rocm93T3JOdWxsID0gZnVuY3Rpb24gKGtleSwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgIT09IFRIUk9XX0lGX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vUHJvdmlkZXJFcnJvcih0aGlzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5fZ2V0QnlLZXlTZWxmID0gZnVuY3Rpb24gKGtleSwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JqID0gdGhpcy5fc3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZChrZXkuaWQpO1xuICAgICAgICAgICAgcmV0dXJuIChvYmogIT09IFVOREVGSU5FRCkgPyBvYmogOiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlcbiAgICAgICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7P30gbG93ZXJCb3VuZFZpc2liaWxpdHlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9nZXRCeUtleURlZmF1bHQgPSBmdW5jdGlvbiAoa2V5LCBub3RGb3VuZFZhbHVlLCBsb3dlckJvdW5kVmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5qO1xuICAgICAgICAgICAgaWYgKGxvd2VyQm91bmRWaXNpYmlsaXR5IGluc3RhbmNlb2YgU2tpcFNlbGYpIHtcbiAgICAgICAgICAgICAgICBpbmogPSB0aGlzLl9wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmogPSB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGluaiBpbnN0YW5jZW9mIFJlZmxlY3RpdmVJbmplY3Rvcl8pIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmpfID0gKGluaik7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JqID0gaW5qXy5fc3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZChrZXkuaWQpO1xuICAgICAgICAgICAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgICBpbmogPSBpbmpfLl9wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5qICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluai5nZXQoa2V5LnRva2VuLCBub3RGb3VuZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm92aWRlcnMgPSBfbWFwUHJvdmlkZXJzKHRoaXMsIGZ1bmN0aW9uIChiKSB7IHJldHVybiAnIFwiJyArIGIua2V5LmRpc3BsYXlOYW1lICsgJ1wiICc7IH0pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlJlZmxlY3RpdmVJbmplY3Rvcihwcm92aWRlcnM6IFtcIiArIHByb3ZpZGVycyArIFwiXSlcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsgfTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RpdmVJbmplY3Rvcl87XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBJTkpFQ1RPUl9LRVkgPSBSZWZsZWN0aXZlS2V5LmdldChJbmplY3Rvcik7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9tYXBQcm92aWRlcnMoaW5qZWN0b3IsIGZuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IG5ldyBBcnJheShpbmplY3Rvci5fcHJvdG8ubnVtYmVyT2ZQcm92aWRlcnMpO1xuICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3RvLm51bWJlck9mUHJvdmlkZXJzOyArK2kpIHtcbiAgICAgICAgICAgIHJlc1tpXSA9IGZuKGluamVjdG9yLl9wcm90by5nZXRQcm92aWRlckF0SW5kZXgoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIC8qKlxuICAgICAqICAqXG4gICAgICAqICpcbiAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYEVycm9ySGFuZGxlcmAgcHJpbnRzIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBgY29uc29sZWAuIFRvXG4gICAgICAqIGludGVyY2VwdCBlcnJvciBoYW5kbGluZywgd3JpdGUgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCByZXBsYWNlcyB0aGlzIGRlZmF1bHQgYXNcbiAgICAgICogYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGNsYXNzIE15RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHtcbiAgICAgICogaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICogLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGV4Y2VwdGlvblxuICAgICAgKiB9XG4gICAgICAqIH1cbiAgICAgICogKlxuICAgICAgKiBwcm92aWRlcnM6IFt7cHJvdmlkZTogRXJyb3JIYW5kbGVyLCB1c2VDbGFzczogTXlFcnJvckhhbmRsZXJ9XVxuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBNeU1vZHVsZSB7fVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBFcnJvckhhbmRsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcmV0aHJvd0Vycm9yXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBFcnJvckhhbmRsZXIocmV0aHJvd0Vycm9yKSB7XG4gICAgICAgICAgICBpZiAocmV0aHJvd0Vycm9yID09PSB2b2lkIDApIHsgcmV0aHJvd0Vycm9yID0gdHJ1ZTsgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fY29uc29sZSA9IGNvbnNvbGU7XG4gICAgICAgICAgICB0aGlzLnJldGhyb3dFcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3JpZ2luYWxFcnJvciA9IHRoaXMuX2ZpbmRPcmlnaW5hbEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9yaWdpbmFsU3RhY2sgPSB0aGlzLl9maW5kT3JpZ2luYWxTdGFjayhlcnJvcik7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250ZXh0ID0gdGhpcy5fZmluZENvbnRleHQoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5fY29uc29sZS5lcnJvcihcIkVYQ0VQVElPTjogXCIgKyB0aGlzLl9leHRyYWN0TWVzc2FnZShlcnJvcikpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zb2xlLmVycm9yKFwiT1JJR0lOQUwgRVhDRVBUSU9OOiBcIiArIHRoaXMuX2V4dHJhY3RNZXNzYWdlKG9yaWdpbmFsRXJyb3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc29sZS5lcnJvcignT1JJR0lOQUwgU1RBQ0tUUkFDRTonKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zb2xlLmVycm9yKG9yaWdpbmFsU3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zb2xlLmVycm9yKCdFUlJPUiBDT05URVhUOicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnNvbGUuZXJyb3IoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSByZXRocm93IGV4Y2VwdGlvbnMsIHNvIG9wZXJhdGlvbnMgbGlrZSAnYm9vdHN0cmFwJyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvclxuICAgICAgICAgICAgLy8gd2hlbiBhbiBlcnJvciBoYXBwZW5zLiBJZiB3ZSBkbyBub3QgcmV0aHJvdywgYm9vdHN0cmFwIHdpbGwgYWx3YXlzIHN1Y2NlZWQuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRocm93RXJyb3IpXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLl9leHRyYWN0TWVzc2FnZSA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUuX2ZpbmRDb250ZXh0ID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IuY29udGV4dCA/IGVycm9yLmNvbnRleHQgOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maW5kQ29udGV4dCgoKGVycm9yKSkub3JpZ2luYWxFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUuX2ZpbmRPcmlnaW5hbEVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlID0gKChlcnJvcikpLm9yaWdpbmFsRXJyb3I7XG4gICAgICAgICAgICB3aGlsZSAoZSAmJiAoKGUpKS5vcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZSA9ICgoZSkpLm9yaWdpbmFsRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUuX2ZpbmRPcmlnaW5hbFN0YWNrID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGUgPSBlcnJvcjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YWNrID0gZS5zdGFjaztcbiAgICAgICAgICAgIHdoaWxlIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgKChlKSkub3JpZ2luYWxFcnJvcikge1xuICAgICAgICAgICAgICAgIGUgPSAoKGUpKS5vcmlnaW5hbEVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICBzdGFjayA9IGUuc3RhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gRXJyb3JIYW5kbGVyO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgV3JhcHMgSmF2YXNjcmlwdCBPYmplY3RzXG4gICAgICovXG4gICAgdmFyIFN0cmluZ01hcFdyYXBwZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBTdHJpbmdNYXBXcmFwcGVyKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG0xXG4gICAgICAgICAqIEBwYXJhbSB7P30gbTJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFN0cmluZ01hcFdyYXBwZXIubWVyZ2UgPSBmdW5jdGlvbiAobTEsIG0yKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gT2JqZWN0LmtleXMobTEpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHZhciBrID0gX2FbX2ldO1xuICAgICAgICAgICAgICAgIG1ba10gPSBtMVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSBPYmplY3Qua2V5cyhtMik7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBfY1tfYl07XG4gICAgICAgICAgICAgICAgbVtrXSA9IG0yW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG0xXG4gICAgICAgICAqIEBwYXJhbSB7P30gbTJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFN0cmluZ01hcFdyYXBwZXIuZXF1YWxzID0gZnVuY3Rpb24gKG0xLCBtMikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gazEgPSBPYmplY3Qua2V5cyhtMSk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrMiA9IE9iamVjdC5rZXlzKG0yKTtcbiAgICAgICAgICAgIGlmIChrMS5sZW5ndGggIT0gazIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGsxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gazFbaV07XG4gICAgICAgICAgICAgICAgaWYgKG0xW2tleV0gIT09IG0yW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlcjtcbiAgICB9KCkpO1xuICAgIHZhciBMaXN0V3JhcHBlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIExpc3RXcmFwcGVyKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGFyclxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbmRpdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTGlzdFdyYXBwZXIuZmluZExhc3QgPSBmdW5jdGlvbiAoYXJyLCBjb25kaXRpb24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IGFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24oYXJyW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBsaXN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gaXRlbXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExpc3RXcmFwcGVyLnJlbW92ZUFsbCA9IGZ1bmN0aW9uIChsaXN0LCBpdGVtcykge1xuICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSBsaXN0LmluZGV4T2YoaXRlbXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlID0gZnVuY3Rpb24gKGxpc3QsIGVsKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleCA9IGxpc3QuaW5kZXhPZihlbCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gYVxuICAgICAgICAgKiBAcGFyYW0gez99IGJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExpc3RXcmFwcGVyLmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExpc3RXcmFwcGVyLmZsYXR0ZW4gPSBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3QucmVkdWNlKGZ1bmN0aW9uIChmbGF0LCBpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmxhdEl0ZW0gPSBBcnJheS5pc0FycmF5KGl0ZW0pID8gTGlzdFdyYXBwZXIuZmxhdHRlbihpdGVtKSA6IGl0ZW07XG4gICAgICAgICAgICAgICAgcmV0dXJuICgoZmxhdCkpLmNvbmNhdChmbGF0SXRlbSk7XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBMaXN0V3JhcHBlcjtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xpc3RMaWtlSXRlcmFibGUob2JqKSB7XG4gICAgICAgIGlmICghaXNKc09iamVjdChvYmopKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgICAgICAgICAoIShvYmogaW5zdGFuY2VvZiBNYXApICYmXG4gICAgICAgICAgICAgICAgZ2V0U3ltYm9sSXRlcmF0b3IoKSBpbiBvYmopOyAvLyBKUyBJdGVyYWJsZSBoYXZlIGEgU3ltYm9sLml0ZXJhdG9yIHByb3BcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBhXG4gICAgICogQHBhcmFtIHs/fSBiXG4gICAgICogQHBhcmFtIHs/fSBjb21wYXJhdG9yXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcmVJdGVyYWJsZXNFcXVhbChhLCBiLCBjb21wYXJhdG9yKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGl0ZXJhdG9yMSA9IGFbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlcmF0b3IyID0gYltnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlbTEgPSBpdGVyYXRvcjEubmV4dCgpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlbTIgPSBpdGVyYXRvcjIubmV4dCgpO1xuICAgICAgICAgICAgaWYgKGl0ZW0xLmRvbmUgJiYgaXRlbTIuZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpdGVtMS5kb25lIHx8IGl0ZW0yLmRvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFjb21wYXJhdG9yKGl0ZW0xLnZhbHVlLCBpdGVtMi52YWx1ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICogQHBhcmFtIHs/fSBmblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZUxpc3RMaWtlKG9iaiwgZm4pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZuKG9ialtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpdGVyYXRvciA9IG9ialtnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlbSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHdoaWxlICghKChpdGVtID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSkge1xuICAgICAgICAgICAgICAgIGZuKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2UgdW5kZWZpbmVkXG4gICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAgKiAqXG4gICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgICAgICAvLyBhbGxvdyBhbnkgUHJvbWlzZS9BKyBjb21wbGlhbnQgdGhlbmFibGUuXG4gICAgICAgIC8vIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCBvYmoudGhlbiBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEFQUF9JTklUSUFMSVpFUiA9IG5ldyBPcGFxdWVUb2tlbignQXBwbGljYXRpb24gSW5pdGlhbGl6ZXInKTtcbiAgICAvKipcbiAgICAgKiAgQSBjbGFzcyB0aGF0IHJlZmxlY3RzIHRoZSBzdGF0ZSBvZiBydW5uaW5nIHtAbGluayBBUFBfSU5JVElBTElaRVJ9cy5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBBcHBsaWNhdGlvbkluaXRTdGF0dXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBJbml0c1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQXBwbGljYXRpb25Jbml0U3RhdHVzKGFwcEluaXRzKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGFzeW5jSW5pdFByb21pc2VzID0gW107XG4gICAgICAgICAgICBpZiAoYXBwSW5pdHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFwcEluaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0UmVzdWx0ID0gYXBwSW5pdHNbaV0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShpbml0UmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJbml0UHJvbWlzZXMucHVzaChpbml0UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RvbmVQcm9taXNlID0gUHJvbWlzZS5hbGwoYXN5bmNJbml0UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkgeyBfdGhpcy5fZG9uZSA9IHRydWU7IH0pO1xuICAgICAgICAgICAgaWYgKGFzeW5jSW5pdFByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvbkluaXRTdGF0dXMucHJvdG90eXBlLCBcImRvbmVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RvbmU7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXBwbGljYXRpb25Jbml0U3RhdHVzLnByb3RvdHlwZSwgXCJkb25lUHJvbWlzZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZG9uZVByb21pc2U7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBBcHBsaWNhdGlvbkluaXRTdGF0dXMuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgQXBwbGljYXRpb25Jbml0U3RhdHVzLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0lOSVRJQUxJWkVSLF0gfSwgeyB0eXBlOiBPcHRpb25hbCB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uSW5pdFN0YXR1cztcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQSBESSBUb2tlbiByZXByZXNlbnRpbmcgYSB1bmlxdWUgc3RyaW5nIGlkIGFzc2lnbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBieSBBbmd1bGFyIGFuZCB1c2VkXG4gICAgICogcHJpbWFyaWx5IGZvciBwcmVmaXhpbmcgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhbmQgQ1NTIHN0eWxlcyB3aGVuXG4gICAgICoge0BsaW5rIFZpZXdFbmNhcHN1bGF0aW9uI0VtdWxhdGVkfSBpcyBiZWluZyB1c2VkLlxuICAgICAqXG4gICAgICogSWYgeW91IG5lZWQgdG8gYXZvaWQgcmFuZG9tbHkgZ2VuZXJhdGVkIHZhbHVlIHRvIGJlIHVzZWQgYXMgYW4gYXBwbGljYXRpb24gaWQsIHlvdSBjYW4gcHJvdmlkZVxuICAgICAqIGEgY3VzdG9tIHZhbHVlIHZpYSBhIERJIHByb3ZpZGVyIDwhLS0gVE9ETzogcHJvdmlkZXIgLS0+IGNvbmZpZ3VyaW5nIHRoZSByb290IHtAbGluayBJbmplY3Rvcn1cbiAgICAgKiB1c2luZyB0aGlzIHRva2VuLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBUFBfSUQgPSBuZXcgT3BhcXVlVG9rZW4oJ0FwcElkJyk7XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnkoKSB7XG4gICAgICAgIHJldHVybiBcIlwiICsgX3JhbmRvbUNoYXIoKSArIF9yYW5kb21DaGFyKCkgKyBfcmFuZG9tQ2hhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcnMgdGhhdCB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIEFQUF9JRF9UT0tFTi5cbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQVBQX0lEX1JBTkRPTV9QUk9WSURFUiA9IHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lELFxuICAgICAgICB1c2VGYWN0b3J5OiBfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnksXG4gICAgICAgIGRlcHM6IC8qKiBAdHlwZSB7P30gKi8gKFtdKSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gX3JhbmRvbUNoYXIoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIHBsYXRmb3JtIGlzIGluaXRpYWxpemVkLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBQTEFURk9STV9JTklUSUFMSVpFUiA9IG5ldyBPcGFxdWVUb2tlbignUGxhdGZvcm0gSW5pdGlhbGl6ZXInKTtcbiAgICAvKipcbiAgICAgKiBBbGwgY2FsbGJhY2tzIHByb3ZpZGVkIHZpYSB0aGlzIHRva2VuIHdpbGwgYmUgY2FsbGVkIGZvciBldmVyeSBjb21wb25lbnQgdGhhdCBpcyBib290c3RyYXBwZWQuXG4gICAgICogU2lnbmF0dXJlIG9mIHRoZSBjYWxsYmFjazpcbiAgICAgKlxuICAgICAqIGAoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWYpID0+IHZvaWRgLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEFQUF9CT09UU1RSQVBfTElTVEVORVIgPSBuZXcgT3BhcXVlVG9rZW4oJ2FwcEJvb3RzdHJhcExpc3RlbmVyJyk7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvblxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBQQUNLQUdFX1JPT1RfVVJMID0gbmV3IE9wYXF1ZVRva2VuKCdBcHBsaWNhdGlvbiBQYWNrYWdlcyBSb290IFVSTCcpO1xuXG4gICAgdmFyIENvbnNvbGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBDb25zb2xlKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2VcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbnNvbGUucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHByaW50KG1lc3NhZ2UpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDb25zb2xlLnByb3RvdHlwZS53YXJuID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsgd2FybihtZXNzYWdlKTsgfTtcbiAgICAgICAgQ29uc29sZS5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBDb25zb2xlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBDb25zb2xlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQ0ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogIEluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50IGlzIHN0aWxsIGJlaW5nIGxvYWRlZCBpbiBhIHN5bmNocm9ub3VzIGNvbXBpbGUuXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgQ29tcG9uZW50U3RpbGxMb2FkaW5nRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkNChDb21wb25lbnRTdGlsbExvYWRpbmdFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcFR5cGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIENvbXBvbmVudFN0aWxsTG9hZGluZ0Vycm9yKGNvbXBUeXBlKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIkNhbid0IGNvbXBpbGUgc3luY2hyb25vdXNseSBhcyBcIiArIHN0cmluZ2lmeShjb21wVHlwZSkgKyBcIiBpcyBzdGlsbCBiZWluZyBsb2FkZWQhXCIpO1xuICAgICAgICAgICAgdGhpcy5jb21wVHlwZSA9IGNvbXBUeXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21wb25lbnRTdGlsbExvYWRpbmdFcnJvcjtcbiAgICB9KEJhc2VFcnJvcikpO1xuICAgIC8qKlxuICAgICAqICBDb21iaW5hdGlvbiBvZiBOZ01vZHVsZUZhY3RvcnkgYW5kIENvbXBvbmVudEZhY3RvcnlzLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZUZhY3RvcnlcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3JpZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXMobmdNb2R1bGVGYWN0b3J5LCBjb21wb25lbnRGYWN0b3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMubmdNb2R1bGVGYWN0b3J5ID0gbmdNb2R1bGVGYWN0b3J5O1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3JpZXMgPSBjb21wb25lbnRGYWN0b3JpZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXM7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF90aHJvd0Vycm9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIGNvbXBpbGVyIGlzIG5vdCBsb2FkZWRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBMb3ctbGV2ZWwgc2VydmljZSBmb3IgcnVubmluZyB0aGUgYW5ndWxhciBjb21waWxlciBkdXJpbmcgcnVudGltZVxuICAgICAgKiB0byBjcmVhdGUge0BsaW5rIENvbXBvbmVudEZhY3Rvcnl9cywgd2hpY2hcbiAgICAgICogY2FuIGxhdGVyIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCByZW5kZXIgYSBDb21wb25lbnQgaW5zdGFuY2UuXG4gICAgICAqICpcbiAgICAgICogRWFjaCBgQE5nTW9kdWxlYCBwcm92aWRlcyBhbiBvd24gYENvbXBpbGVyYCB0byBpdHMgaW5qZWN0b3IsXG4gICAgICAqIHRoYXQgd2lsbCB1c2UgdGhlIGRpcmVjdGl2ZXMvcGlwZXMgb2YgdGhlIG5nIG1vZHVsZSBmb3IgY29tcGlsYXRpb25cbiAgICAgICogb2YgY29tcG9uZW50cy5cbiAgICAgKi9cbiAgICB2YXIgQ29tcGlsZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBDb21waWxlcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogIENvbXBpbGVzIHRoZSBnaXZlbiBOZ01vZHVsZSBhbmQgYWxsIG9mIGl0cyBjb21wb25lbnRzLiBBbGwgdGVtcGxhdGVzIG9mIHRoZSBjb21wb25lbnRzIGxpc3RlZFxuICAgICAgICAgICogaW4gYGVudHJ5Q29tcG9uZW50c2BcbiAgICAgICAgICAqIGhhdmUgdG8gYmUgaW5saW5lZC4gT3RoZXJ3aXNlIHRocm93cyBhIHtAbGluayBDb21wb25lbnRTdGlsbExvYWRpbmdFcnJvcn0uXG4gICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVTeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsgdGhyb3cgX3Rocm93RXJyb3IoKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDb21waWxlcyB0aGUgZ2l2ZW4gTmdNb2R1bGUgYW5kIGFsbCBvZiBpdHMgY29tcG9uZW50c1xuICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQXN5bmMgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkgeyB0aHJvdyBfdGhyb3dFcnJvcigpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNhbWUgYXMge0BsaW5rIGNvbXBpbGVNb2R1bGVTeW5jfSBidXQgYWxzbyBjcmVhdGVzIENvbXBvbmVudEZhY3RvcmllcyBmb3IgYWxsIGNvbXBvbmVudHMuXG4gICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBfdGhyb3dFcnJvcigpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNhbWUgYXMge0BsaW5rIGNvbXBpbGVNb2R1bGVBc3luY30gYnV0IGFsc28gY3JlYXRlcyBDb21wb25lbnRGYWN0b3JpZXMgZm9yIGFsbCBjb21wb25lbnRzLlxuICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IF90aHJvd0Vycm9yKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgRXhwb3NlcyB0aGUgQ1NTLXN0eWxlIHNlbGVjdG9ycyB0aGF0IGhhdmUgYmVlbiB1c2VkIGluIGBuZ0NvbnRlbnRgIGRpcmVjdGl2ZXMgd2l0aGluXG4gICAgICAgICAgKiB0aGUgdGVtcGxhdGUgb2YgdGhlIGdpdmVuIGNvbXBvbmVudC5cbiAgICAgICAgICAqIFRoaXMgaXMgdXNlZCBieSB0aGUgYHVwZ3JhZGVgIGxpYnJhcnkgdG8gY29tcGlsZSB0aGUgYXBwcm9wcmlhdGUgdHJhbnNjbHVkZSBjb250ZW50XG4gICAgICAgICAgKiBpbiB0aGUgQW5ndWxhciAxIHdyYXBwZXIgY29tcG9uZW50LlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29tcGlsZXIucHJvdG90eXBlLmdldE5nQ29udGVudFNlbGVjdG9ycyA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsgdGhyb3cgX3Rocm93RXJyb3IoKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDbGVhcnMgYWxsIGNhY2hlcy5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBpbGVyLnByb3RvdHlwZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIENsZWFycyB0aGUgY2FjaGUgZm9yIHRoZSBnaXZlbiBjb21wb25lbnQvbmdNb2R1bGUuXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29tcGlsZXIucHJvdG90eXBlLmNsZWFyQ2FjaGVGb3IgPSBmdW5jdGlvbiAodHlwZSkgeyB9O1xuICAgICAgICBDb21waWxlci5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBDb21waWxlci5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gQ29tcGlsZXI7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBUb2tlbiB0byBwcm92aWRlIENvbXBpbGVyT3B0aW9ucyBpbiB0aGUgcGxhdGZvcm0gaW5qZWN0b3IuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ09NUElMRVJfT1BUSU9OUyA9IG5ldyBPcGFxdWVUb2tlbignY29tcGlsZXJPcHRpb25zJyk7XG4gICAgLyoqXG4gICAgICogIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgYSBDb21waWxlclxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIENvbXBpbGVyRmFjdG9yeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbXBpbGVyRmFjdG9yeSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBpbGVyRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlQ29tcGlsZXIgPSBmdW5jdGlvbiAob3B0aW9ucykgeyB9O1xuICAgICAgICByZXR1cm4gQ29tcGlsZXJGYWN0b3J5O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgLyoqXG4gICAgICogQSB3cmFwcGVyIGFyb3VuZCBhIG5hdGl2ZSBlbGVtZW50IGluc2lkZSBvZiBhIFZpZXcuXG4gICAgICpcbiAgICAgKiBBbiBgRWxlbWVudFJlZmAgaXMgYmFja2VkIGJ5IGEgcmVuZGVyLXNwZWNpZmljIGVsZW1lbnQuIEluIHRoZSBicm93c2VyLCB0aGlzIGlzIHVzdWFsbHkgYSBET01cbiAgICAgKiBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHNlY3VyaXR5IFBlcm1pdHRpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgRE9NIGNhbiBtYWtlIHlvdXIgYXBwbGljYXRpb24gbW9yZSB2dWxuZXJhYmxlIHRvXG4gICAgICogWFNTIGF0dGFja3MuIENhcmVmdWxseSByZXZpZXcgYW55IHVzZSBvZiBgRWxlbWVudFJlZmAgaW4geW91ciBjb2RlLiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGVcbiAgICAgKiBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS5cbiAgICAgKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICAvLyBOb3RlOiBXZSBkb24ndCBleHBvc2UgdGhpbmdzIGxpa2UgYEluamVjdG9yYCwgYFZpZXdDb250YWluZXJgLCAuLi4gaGVyZSxcbiAgICAvLyBpLmUuIHVzZXJzIGhhdmUgdG8gYXNrIGZvciB3aGF0IHRoZXkgbmVlZC4gV2l0aCB0aGF0LCB3ZSBjYW4gYnVpbGQgYmV0dGVyIGFuYWx5c2lzIHRvb2xzXG4gICAgLy8gYW5kIGNvdWxkIGRvIGJldHRlciBjb2RlZ2VuIGluIHRoZSBmdXR1cmUuXG4gICAgdmFyIEVsZW1lbnRSZWYgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYXRpdmVFbGVtZW50XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBFbGVtZW50UmVmKG5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IG5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVsZW1lbnRSZWY7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDYgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgVXNlIGJ5IGRpcmVjdGl2ZXMgYW5kIGNvbXBvbmVudHMgdG8gZW1pdCBjdXN0b20gRXZlbnRzLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAgKiAqXG4gICAgICAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYFppcHB5YCBhbHRlcm5hdGl2ZWx5IGVtaXRzIGBvcGVuYCBhbmQgYGNsb3NlYCBldmVudHMgd2hlbiBpdHNcbiAgICAgICogdGl0bGUgZ2V0cyBjbGlja2VkOlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBzZWxlY3RvcjogJ3ppcHB5JyxcbiAgICAgICogdGVtcGxhdGU6IGBcbiAgICAgICogPGRpdiBjbGFzcz1cInppcHB5XCI+XG4gICAgICAqIDxkaXYgKGNsaWNrKT1cInRvZ2dsZSgpXCI+VG9nZ2xlPC9kaXY+XG4gICAgICAqIDxkaXYgW2hpZGRlbl09XCIhdmlzaWJsZVwiPlxuICAgICAgKiA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAqIDwvZGl2PlxuICAgICAgKiA8L2Rpdj5gfSlcbiAgICAgICogZXhwb3J0IGNsYXNzIFppcHB5IHtcbiAgICAgICogdmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAgICAqIEBPdXRwdXQoKSBvcGVuOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICogQE91dHB1dCgpIGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICogKlxuICAgICAgKiB0b2dnbGUoKSB7XG4gICAgICAqIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gICAgICAqIGlmICh0aGlzLnZpc2libGUpIHtcbiAgICAgICogdGhpcy5vcGVuLmVtaXQobnVsbCk7XG4gICAgICAqIH0gZWxzZSB7XG4gICAgICAqIHRoaXMuY2xvc2UuZW1pdChudWxsKTtcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogVGhlIGV2ZW50cyBwYXlsb2FkIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgcGFyYW1ldGVyIGAkZXZlbnRgIG9uIHRoZSBjb21wb25lbnRzIG91dHB1dCBldmVudFxuICAgICAgKiBoYW5kbGVyOlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiA8emlwcHkgKG9wZW4pPVwib25PcGVuKCRldmVudClcIiAoY2xvc2UpPVwib25DbG9zZSgkZXZlbnQpXCI+PC96aXBweT5cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogVXNlcyBSeC5PYnNlcnZhYmxlIGJ1dCBwcm92aWRlcyBhbiBhZGFwdGVyIHRvIG1ha2UgaXQgd29yayBhcyBzcGVjaWZpZWQgaGVyZTpcbiAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2podXNhaW4vb2JzZXJ2YWJsZS1zcGVjXG4gICAgICAqICpcbiAgICAgICogT25jZSBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlYyBpcyBhdmFpbGFibGUsIHN3aXRjaCB0byBpdC5cbiAgICAgKi9cbiAgICB2YXIgRXZlbnRFbWl0dGVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDYoRXZlbnRFbWl0dGVyLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgW0V2ZW50RW1pdHRlcl0sIHdoaWNoIGRlcGVuZGluZyBvbiBbaXNBc3luY10sXG4gICAgICAgICAgKiBkZWxpdmVycyBldmVudHMgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS5cbiAgICAgICAgICogQHBhcmFtIHs/PX0gaXNBc3luY1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKGlzQXN5bmMpIHtcbiAgICAgICAgICAgIGlmIChpc0FzeW5jID09PSB2b2lkIDApIHsgaXNBc3luYyA9IGZhbHNlOyB9XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX19pc0FzeW5jID0gaXNBc3luYztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gdmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez89fSBnZW5lcmF0b3JPck5leHRcbiAgICAgICAgICogQHBhcmFtIHs/PX0gZXJyb3JcbiAgICAgICAgICogQHBhcmFtIHs/PX0gY29tcGxldGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKGdlbmVyYXRvck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzY2hlZHVsZXJGbjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVycm9yRm4gPSBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGxldGVGbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0ICYmIHR5cGVvZiBnZW5lcmF0b3JPck5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdlbmVyYXRvck9yTmV4dC5uZXh0KHZhbHVlKTsgfSk7XG4gICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh2YWx1ZSkgeyBnZW5lcmF0b3JPck5leHQubmV4dCh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckZuID0gdGhpcy5fX2lzQXN5bmMgPyBmdW5jdGlvbiAoZXJyKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycik7IH0pOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnIpIHsgZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycik7IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gZnVuY3Rpb24gKCkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOyB9KTsgfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7IGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlckZuID0gdGhpcy5fX2lzQXN5bmMgPyBmdW5jdGlvbiAodmFsdWUpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBnZW5lcmF0b3JPck5leHQodmFsdWUpOyB9KTsgfSA6XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkgeyBnZW5lcmF0b3JPck5leHQodmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckZuID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19pc0FzeW5jID8gZnVuY3Rpb24gKGVycikgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVycm9yKGVycik7IH0pOyB9IDogZnVuY3Rpb24gKGVycikgeyBlcnJvcihlcnIpOyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVGbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjb21wbGV0ZSgpOyB9KTsgfSA6IGZ1bmN0aW9uICgpIHsgY29tcGxldGUoKTsgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5zdWJzY3JpYmUuY2FsbCh0aGlzLCBzY2hlZHVsZXJGbiwgZXJyb3JGbiwgY29tcGxldGVGbik7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBFdmVudEVtaXR0ZXI7XG4gICAgfShyeGpzX1N1YmplY3QuU3ViamVjdCkpO1xuXG4gICAgLyoqXG4gICAgICogIEFuIGluamVjdGFibGUgc2VydmljZSBmb3IgZXhlY3V0aW5nIHdvcmsgaW5zaWRlIG9yIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgICogKlxuICAgICAgKiBUaGUgbW9zdCBjb21tb24gdXNlIG9mIHRoaXMgc2VydmljZSBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSB3aGVuIHN0YXJ0aW5nIGEgd29yayBjb25zaXN0aW5nIG9mXG4gICAgICAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5XG4gICAgICAqIEFuZ3VsYXIuIFN1Y2ggdGFza3MgY2FuIGJlIGtpY2tlZCBvZmYgdmlhIHtAbGluayBydW5PdXRzaWRlQW5ndWxhcn0gYW5kIGlmIG5lZWRlZCwgdGhlc2UgdGFza3NcbiAgICAgICogY2FuIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSB2aWEge0BsaW5rIHJ1bn0uXG4gICAgICAqICpcbiAgICAgICogPCEtLSBUT0RPOiBhZGQvZml4IGxpbmtzIHRvOlxuICAgICAgKiAtIGRvY3MgZXhwbGFpbmluZyB6b25lcyBhbmQgdGhlIHVzZSBvZiB6b25lcyBpbiBBbmd1bGFyIGFuZCBjaGFuZ2UtZGV0ZWN0aW9uXG4gICAgICAqIC0gbGluayB0byBydW5PdXRzaWRlQW5ndWxhci9ydW4gKHRocm91Z2hvdXQgdGhpcyBmaWxlISlcbiAgICAgICogLS0+XG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogYGBgXG4gICAgICAqIGltcG9ydCB7Q29tcG9uZW50LCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICAgICAgKiBpbXBvcnQge05nSWZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG4gICAgICAqICpcbiAgICAgICogc2VsZWN0b3I6ICduZy16b25lLWRlbW8nLlxuICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgKiA8aDI+RGVtbzogTmdab25lPC9oMj5cbiAgICAgICogKlxuICAgICAgKiA8cD5Qcm9ncmVzczoge3twcm9ncmVzc319JTwvcD5cbiAgICAgICogPHAgKm5nSWY9XCJwcm9ncmVzcyA+PSAxMDBcIj5Eb25lIHByb2Nlc3Npbmcge3tsYWJlbH19IG9mIEFuZ3VsYXIgem9uZSE8L3A+XG4gICAgICAqICpcbiAgICAgICogPGJ1dHRvbiAoY2xpY2spPVwicHJvY2Vzc1dpdGhpbkFuZ3VsYXJab25lKClcIj5Qcm9jZXNzIHdpdGhpbiBBbmd1bGFyIHpvbmU8L2J1dHRvbj5cbiAgICAgICogPGJ1dHRvbiAoY2xpY2spPVwicHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKClcIj5Qcm9jZXNzIG91dHNpZGUgb2YgQW5ndWxhciB6b25lPC9idXR0b24+XG4gICAgICAqIGAsXG4gICAgICAqIH0pXG4gICAgICAqIGV4cG9ydCBjbGFzcyBOZ1pvbmVEZW1vIHtcbiAgICAgICogcHJvZ3Jlc3M6IG51bWJlciA9IDA7XG4gICAgICAqIGxhYmVsOiBzdHJpbmc7XG4gICAgICAqICpcbiAgICAgICogY29uc3RydWN0b3IocHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG4gICAgICAqICpcbiAgICAgICogLy8gTG9vcCBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZVxuICAgICAgKiAvLyBzbyB0aGUgVUkgRE9FUyByZWZyZXNoIGFmdGVyIGVhY2ggc2V0VGltZW91dCBjeWNsZVxuICAgICAgKiBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7XG4gICAgICAqIHRoaXMubGFiZWwgPSAnaW5zaWRlJztcbiAgICAgICogdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAqIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTtcbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIC8vIExvb3Agb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lXG4gICAgICAqIC8vIHNvIHRoZSBVSSBET0VTIE5PVCByZWZyZXNoIGFmdGVyIGVhY2ggc2V0VGltZW91dCBjeWNsZVxuICAgICAgKiBwcm9jZXNzT3V0c2lkZU9mQW5ndWxhclpvbmUoKSB7XG4gICAgICAqIHRoaXMubGFiZWwgPSAnb3V0c2lkZSc7XG4gICAgICAqIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgICAgKiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgKiB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHtcbiAgICAgICogLy8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkaXNwbGF5IGRvbmVcbiAgICAgICogdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7Y29uc29sZS5sb2coJ091dHNpZGUgRG9uZSEnKSB9KTtcbiAgICAgICogfX0pKTtcbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIF9pbmNyZWFzZVByb2dyZXNzKGRvbmVDYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgICAgKiB0aGlzLnByb2dyZXNzICs9IDE7XG4gICAgICAqIGNvbnNvbGUubG9nKGBDdXJyZW50IHByb2dyZXNzOiAke3RoaXMucHJvZ3Jlc3N9JWApO1xuICAgICAgKiAqXG4gICAgICAqIGlmICh0aGlzLnByb2dyZXNzIDwgMTAwKSB7XG4gICAgICAqIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrKSksIDEwKVxuICAgICAgKiB9IGVsc2Uge1xuICAgICAgKiBkb25lQ2FsbGJhY2soKTtcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICovXG4gICAgdmFyIE5nWm9uZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9fMFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTmdab25lKF9hKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSBfYS5lbmFibGVMb25nU3RhY2tUcmFjZSwgZW5hYmxlTG9uZ1N0YWNrVHJhY2UgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYjtcbiAgICAgICAgICAgIHRoaXMuX2hhc1BlbmRpbmdNaWNyb3Rhc2tzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5faXNTdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbmVzdGluZyA9IDA7XG4gICAgICAgICAgICB0aGlzLl9vblVuc3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9vbk1pY3JvdGFza0VtcHR5ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9vblN0YWJsZSA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvckV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBab25lID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbmd1bGFyIHJlcXVpcmVzIFpvbmUuanMgcHJvbHlmaWxsLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgWm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy5vdXRlciA9IHRoaXMuaW5uZXIgPSBab25lLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoWm9uZVsnd3RmWm9uZVNwZWMnXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXIgPSB0aGlzLmlubmVyLmZvcmsoWm9uZVsnd3RmWm9uZVNwZWMnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5hYmxlTG9uZ1N0YWNrVHJhY2UgJiYgWm9uZVsnbG9uZ1N0YWNrVHJhY2Vab25lU3BlYyddKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbm5lciA9IHRoaXMuaW5uZXIuZm9yayhab25lWydsb25nU3RhY2tUcmFjZVpvbmVTcGVjJ10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLmlzSW5Bbmd1bGFyWm9uZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFpvbmUuY3VycmVudC5nZXQoJ2lzQW5ndWxhclpvbmUnKSA9PT0gdHJ1ZTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1pvbmUuYXNzZXJ0SW5Bbmd1bGFyWm9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLmFzc2VydE5vdEluQW5ndWxhclpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhbmQgcmV0dXJucyB2YWx1ZSByZXR1cm5lZCBieVxuICAgICAgICAgICogdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIGBydW5gIGFsbG93cyB5b3UgdG8gcmVlbnRlciBBbmd1bGFyIHpvbmUgZnJvbSBhIHRhc2sgdGhhdCB3YXMgZXhlY3V0ZWRcbiAgICAgICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtAbGluayBydW5PdXRzaWRlQW5ndWxhcn0pLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb21cbiAgICAgICAgICAqIHdpdGhpbiB0aGUgQW5ndWxhciB6b25lLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogSWYgYSBzeW5jaHJvbm91cyBlcnJvciBoYXBwZW5zIGl0IHdpbGwgYmUgcmV0aHJvd24gYW5kIG5vdCByZXBvcnRlZCB2aWEgYG9uRXJyb3JgLlxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1pvbmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChmbikgeyByZXR1cm4gdGhpcy5pbm5lci5ydW4oZm4pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNhbWUgYXMgYHJ1bmAsIGV4Y2VwdCB0aGF0IHN5bmNocm9ub3VzIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCBmb3J3YXJkZWQgdmlhIGBvbkVycm9yYCBhbmQgbm90XG4gICAgICAgICAgKiByZXRocm93bi5cbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLnByb3RvdHlwZS5ydW5HdWFyZGVkID0gZnVuY3Rpb24gKGZuKSB7IHJldHVybiB0aGlzLmlubmVyLnJ1bkd1YXJkZWQoZm4pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIEV4ZWN1dGVzIHRoZSBgZm5gIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgaW4gQW5ndWxhcidzIHBhcmVudCB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5XG4gICAgICAgICAgKiB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBSdW5uaW5nIGZ1bmN0aW9ucyB2aWEgYHJ1bk91dHNpZGVBbmd1bGFyYCBhbGxvd3MgeW91IHRvIGVzY2FwZSBBbmd1bGFyJ3Mgem9uZSBhbmQgZG8gd29yayB0aGF0XG4gICAgICAgICAgKiBkb2Vzbid0IHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UtZGV0ZWN0aW9uIG9yIGlzIHN1YmplY3QgdG8gQW5ndWxhcidzIGVycm9yIGhhbmRsaW5nLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb21cbiAgICAgICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFVzZSB7QGxpbmsgcnVufSB0byByZWVudGVyIHRoZSBBbmd1bGFyIHpvbmUgYW5kIGRvIHdvcmsgdGhhdCB1cGRhdGVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlbC5cbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLnByb3RvdHlwZS5ydW5PdXRzaWRlQW5ndWxhciA9IGZ1bmN0aW9uIChmbikgeyByZXR1cm4gdGhpcy5vdXRlci5ydW4oZm4pOyB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdab25lLnByb3RvdHlwZSwgXCJvblVuc3RhYmxlXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIE5vdGlmaWVzIHdoZW4gY29kZSBlbnRlcnMgQW5ndWxhciBab25lLiBUaGlzIGdldHMgZmlyZWQgZmlyc3Qgb24gVk0gVHVybi5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fb25VbnN0YWJsZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1pvbmUucHJvdG90eXBlLCBcIm9uTWljcm90YXNrRW1wdHlcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgTm90aWZpZXMgd2hlbiB0aGVyZSBpcyBubyBtb3JlIG1pY3JvdGFza3MgZW5xdWV1ZSBpbiB0aGUgY3VycmVudCBWTSBUdXJuLlxuICAgICAgICAgICAgICAqIFRoaXMgaXMgYSBoaW50IGZvciBBbmd1bGFyIHRvIGRvIGNoYW5nZSBkZXRlY3Rpb24sIHdoaWNoIG1heSBlbnF1ZXVlIG1vcmUgbWljcm90YXNrcy5cbiAgICAgICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24gdGhpcyBldmVudCBjYW4gZmlyZSBtdWx0aXBsZSB0aW1lcyBwZXIgVk0gVHVybi5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fb25NaWNyb3Rhc2tFbXB0eTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1pvbmUucHJvdG90eXBlLCBcIm9uU3RhYmxlXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIE5vdGlmaWVzIHdoZW4gdGhlIGxhc3QgYG9uTWljcm90YXNrRW1wdHlgIGhhcyBydW4gYW5kIHRoZXJlIGFyZSBubyBtb3JlIG1pY3JvdGFza3MsIHdoaWNoXG4gICAgICAgICAgICAgICogaW1wbGllcyB3ZSBhcmUgYWJvdXQgdG8gcmVsaW5xdWlzaCBWTSB0dXJuLlxuICAgICAgICAgICAgICAqIFRoaXMgZXZlbnQgZ2V0cyBjYWxsZWQganVzdCBvbmNlLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9vblN0YWJsZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1pvbmUucHJvdG90eXBlLCBcIm9uRXJyb3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgTm90aWZ5IHRoYXQgYW4gZXJyb3IgaGFzIGJlZW4gZGVsaXZlcmVkLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9vbkVycm9yRXZlbnRzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nWm9uZS5wcm90b3R5cGUsIFwiaXNTdGFibGVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgV2hldGhlciB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgbWljcm90YXNrcyBvciBtYWNyb3Rhc2tzLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9pc1N0YWJsZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1pvbmUucHJvdG90eXBlLCBcImhhc1BlbmRpbmdNaWNyb3Rhc2tzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9oYXNQZW5kaW5nTWljcm90YXNrczsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1pvbmUucHJvdG90eXBlLCBcImhhc1BlbmRpbmdNYWNyb3Rhc2tzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9oYXNQZW5kaW5nTWFjcm90YXNrczsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLnByb3RvdHlwZS5jaGVja1N0YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodGhpcy5fbmVzdGluZyA9PSAwICYmICF0aGlzLl9oYXNQZW5kaW5nTWljcm90YXNrcyAmJiAhdGhpcy5faXNTdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZXN0aW5nKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTWljcm90YXNrRW1wdHkuZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25lc3RpbmctLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9oYXNQZW5kaW5nTWljcm90YXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9vblN0YWJsZS5lbWl0KG51bGwpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1pvbmUucHJvdG90eXBlLmZvcmtJbm5lclpvbmVXaXRoQW5ndWxhckJlaGF2aW9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuaW5uZXIgPSB0aGlzLmlubmVyLmZvcmsoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdhbmd1bGFyJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiAvKiogQHR5cGUgez99ICovICh7ICdpc0FuZ3VsYXJab25lJzogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICBvbkludm9rZVRhc2s6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMub25FbnRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbkxlYXZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uSW52b2tlOiBmdW5jdGlvbiAoZGVsZWdhdGUsIGN1cnJlbnQsIHRhcmdldCwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm9uRW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2UodGFyZ2V0LCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5vbkxlYXZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uSGFzVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGhhc1Rhc2tTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBoYXNUYXNrIGV2ZW50cyB3aGljaCBvcmlnaW5hdGUgZnJvbSBvdXIgem9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEEgY2hpbGQgaGFzVGFzayBldmVudCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVGFza1N0YXRlLmNoYW5nZSA9PSAnbWljcm9UYXNrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldEhhc01pY3JvdGFzayhoYXNUYXNrU3RhdGUubWljcm9UYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhc1Rhc2tTdGF0ZS5jaGFuZ2UgPT0gJ21hY3JvVGFzaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRIYXNNYWNyb3Rhc2soaGFzVGFza1N0YXRlLm1hY3JvVGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uSGFuZGxlRXJyb3I6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5oYW5kbGVFcnJvcih0YXJnZXQsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlckVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nWm9uZS5wcm90b3R5cGUub25FbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX25lc3RpbmcrKztcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1N0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzU3RhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25VbnN0YWJsZS5lbWl0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nWm9uZS5wcm90b3R5cGUub25MZWF2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX25lc3RpbmctLTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTdGFibGUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaGFzTWljcm90YXNrc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdab25lLnByb3RvdHlwZS5zZXRIYXNNaWNyb3Rhc2sgPSBmdW5jdGlvbiAoaGFzTWljcm90YXNrcykge1xuICAgICAgICAgICAgdGhpcy5faGFzUGVuZGluZ01pY3JvdGFza3MgPSBoYXNNaWNyb3Rhc2tzO1xuICAgICAgICAgICAgdGhpcy5jaGVja1N0YWJsZSgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBoYXNNYWNyb3Rhc2tzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1pvbmUucHJvdG90eXBlLnNldEhhc01hY3JvdGFzayA9IGZ1bmN0aW9uIChoYXNNYWNyb3Rhc2tzKSB7IHRoaXMuX2hhc1BlbmRpbmdNYWNyb3Rhc2tzID0gaGFzTWFjcm90YXNrczsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nWm9uZS5wcm90b3R5cGUudHJpZ2dlckVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7IHRoaXMuX29uRXJyb3JFdmVudHMuZW1pdChlcnJvcik7IH07XG4gICAgICAgIHJldHVybiBOZ1pvbmU7XG4gICAgfSgpKTtcblxuICAgIHZhciBBbmltYXRpb25RdWV1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF96b25lXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBbmltYXRpb25RdWV1ZShfem9uZSkge1xuICAgICAgICAgICAgdGhpcy5fem9uZSA9IF96b25lO1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25RdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChwbGF5ZXIpIHsgdGhpcy5lbnRyaWVzLnB1c2gocGxheWVyKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25RdWV1ZS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgLy8gZ2l2ZW4gdGhhdCBlYWNoIGFuaW1hdGlvbiBwbGF5ZXIgbWF5IHNldCBhc2lkZVxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgcmVseSBvbiBET00tYmFzZWQgZXZlbnRzLCB0aGlzXG4gICAgICAgICAgICAvLyB3aWxsIGNhdXNlIEFuZ3VsYXIgdG8gcnVuIGNoYW5nZSBkZXRlY3Rpb24gYWZ0ZXJcbiAgICAgICAgICAgIC8vIGVhY2ggcmVxdWVzdC4gVGhpcyBzaWRlc3RlcHMgdGhlIGlzc3VlLiBJZiBhIHVzZXJcbiAgICAgICAgICAgIC8vIGhvb2tzIGludG8gYW4gYW5pbWF0aW9uIHZpYSAoQGFuaW0uc3RhcnQpIG9yIChAYW5pbS5kb25lKVxuICAgICAgICAgICAgLy8gdGhlbiB0aG9zZSBtZXRob2RzIHdpbGwgYXV0b21hdGljYWxseSB0cmlnZ2VyIGNoYW5nZVxuICAgICAgICAgICAgLy8gZGV0ZWN0aW9uIGJ5IHdyYXBwaW5nIHRoZW1zZWx2ZXMgaW5zaWRlIG9mIGEgem9uZVxuICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb2RlIGlzIHdyYXBwZWQgaW50byBhIHNpbmdsZSBwcm9taXNlIHN1Y2ggdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gb25TdGFydCBhbmQgb25Eb25lIHBsYXllciBjYWxsYmFja3MgYXJlIHRyaWdnZXJlZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBkaWdlc3QgY3ljbGUgb2YgYW5pbWF0aW9uc1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fdHJpZ2dlckFuaW1hdGlvbnMoKTsgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uUXVldWUucHJvdG90eXBlLl90cmlnZ2VyQW5pbWF0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lKCk7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5lbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllciA9IHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIC8vIGluIHRoZSBldmVudCB0aGF0IGFuIGFuaW1hdGlvbiB0aHJvd3MgYW4gZXJyb3IgdGhlbiB3ZSBkb1xuICAgICAgICAgICAgICAgIC8vIG5vdCB3YW50IHRvIHJlLXJ1biBhbmltYXRpb25zIG9uIGFueSBwcmV2aW91cyBhbmltYXRpb25zXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbiBraWNrZWQgb2ZmIGJlZm9yZWhhbmRcbiAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIEFuaW1hdGlvblF1ZXVlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIEFuaW1hdGlvblF1ZXVlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBOZ1pvbmUsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBBbmltYXRpb25RdWV1ZTtcbiAgICB9KCkpO1xuXG4gICAgdmFyIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeS5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBpc0xpc3RMaWtlSXRlcmFibGUob2JqKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2RSZWZcbiAgICAgICAgICogQHBhcmFtIHs/PX0gdHJhY2tCeUZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY2RSZWYsIHRyYWNrQnlGbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXIodHJhY2tCeUZuKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3Rvcnk7XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmFja0J5SWRlbnRpdHkgPSBmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHsgcmV0dXJuIGl0ZW07IH07XG4gICAgLyoqXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIHZhciBEZWZhdWx0SXRlcmFibGVEaWZmZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3RyYWNrQnlGblxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVmYXVsdEl0ZXJhYmxlRGlmZmVyKF90cmFja0J5Rm4pIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IF90cmFja0J5Rm47XG4gICAgICAgICAgICB0aGlzLl9sZW5ndGggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fY29sbGVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c0l0SGVhZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9tb3Zlc0hlYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbW92ZXNUYWlsID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IHRoaXMuX3RyYWNrQnlGbiB8fCB0cmFja0J5SWRlbnRpdHk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUsIFwiY29sbGVjdGlvblwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY29sbGVjdGlvbjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbGVuZ3RoOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hPcGVyYXRpb24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHRJdCA9IHRoaXMuX2l0SGVhZDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHRSZW1vdmUgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhZGRSZW1vdmVPZmZzZXQgPSAwO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW92ZU9mZnNldHMgPSBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKG5leHRJdCB8fCBuZXh0UmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBpcyB0aGUgbmV4dCByZWNvcmQgdG8gcHJvY2Vzc1xuICAgICAgICAgICAgICAgIC8vIE9yZGVyOiByZW1vdmUsIGFkZCwgbW92ZVxuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZCA9ICFuZXh0UmVtb3ZlIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEl0LmN1cnJlbnRJbmRleCA8IGdldFByZXZpb3VzSW5kZXgobmV4dFJlbW92ZSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykgP1xuICAgICAgICAgICAgICAgICAgICBuZXh0SXQgOlxuICAgICAgICAgICAgICAgICAgICBuZXh0UmVtb3ZlO1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFkalByZXZpb3VzSW5kZXggPSBnZXRQcmV2aW91c0luZGV4KHJlY29yZCwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cyk7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VycmVudEluZGV4ID0gcmVjb3JkLmN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBpdGVtLCBhbmQgYWRqdXN0IHRoZSBhZGRSZW1vdmVPZmZzZXQgYW5kIHVwZGF0ZSBtb3ZlRGlzdGFuY2UgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbmV4dFJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdmVPZmZzZXQtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dFJlbW92ZSA9IG5leHRSZW1vdmUuX25leHRSZW1vdmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ID0gbmV4dEl0Ll9uZXh0O1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3ZlT2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJTlZBUklBTlQ6ICBjdXJyZW50SW5kZXggPCBwcmV2aW91c0luZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVPZmZzZXRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsb2NhbE1vdmVQcmV2aW91c0luZGV4ID0gYWRqUHJldmlvdXNJbmRleCAtIGFkZFJlbW92ZU9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvY2FsQ3VycmVudEluZGV4ID0gY3VycmVudEluZGV4IC0gYWRkUmVtb3ZlT2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTW92ZVByZXZpb3VzSW5kZXggIT0gbG9jYWxDdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgbG9jYWxNb3ZlUHJldmlvdXNJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9mZnNldCA9IGkgPCBtb3ZlT2Zmc2V0cy5sZW5ndGggPyBtb3ZlT2Zmc2V0c1tpXSA6IChtb3ZlT2Zmc2V0c1tpXSA9IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleCA9IG9mZnNldCArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEN1cnJlbnRJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGxvY2FsTW92ZVByZXZpb3VzSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzW2ldID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2aW91c0luZGV4ID0gcmVjb3JkLnByZXZpb3VzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldHNbcHJldmlvdXNJbmRleF0gPSBsb2NhbEN1cnJlbnRJbmRleCAtIGxvY2FsTW92ZVByZXZpb3VzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFkalByZXZpb3VzSW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBmbihyZWNvcmQsIGFkalByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoUHJldmlvdXNJdGVtID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQ7XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzSXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaEFkZGVkSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjb3JkO1xuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaE1vdmVkSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjb3JkO1xuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9tb3Zlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0TW92ZWQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoUmVtb3ZlZEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRJZGVudGl0eUNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb25cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoaXNCbGFuayhjb2xsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gW107XG4gICAgICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHRyeWluZyB0byBkaWZmICdcIiArIGNvbGxlY3Rpb24gKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVjayhjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb25cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQgPSB0aGlzLl9pdEhlYWQ7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXlCZURpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGl0ZW07XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpdGVtVHJhY2tCeTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGlzdCA9IGNvbGxlY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleF8xID0gMDsgaW5kZXhfMSA8IHRoaXMuX2xlbmd0aDsgaW5kZXhfMSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsaXN0W2luZGV4XzFdO1xuICAgICAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IHRoaXMuX3RyYWNrQnlGbihpbmRleF8xLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLnRyYWNrQnlJZCwgaXRlbVRyYWNrQnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleF8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heUJlRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heUJlRGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogY2FuIHdlIGxpbWl0IHRoaXMgdG8gZHVwbGljYXRlcyBvbmx5P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4XzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGl0ZXJhdGVMaXN0TGlrZShjb2xsZWN0aW9uLCBmdW5jdGlvbiAoaXRlbSAvKiogVE9ETyAjOTEwMCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IF90aGlzLl90cmFja0J5Rm4oaW5kZXgsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09PSBudWxsIHx8ICFsb29zZUlkZW50aWNhbChyZWNvcmQudHJhY2tCeUlkLCBpdGVtVHJhY2tCeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IF90aGlzLl9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXlCZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXlCZURpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNhbiB3ZSBsaW1pdCB0aGlzIHRvIGR1cGxpY2F0ZXMgb25seT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSBfdGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpdGVtVHJhY2tCeSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlbmd0aCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdHJ1bmNhdGUocmVjb3JkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUsIFwiaXNEaXJ0eVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX21vdmVzSGVhZCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgIT09IG51bGwgfHwgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2hhbmdlIG9iamVjdHMgdG8gc2hvdyBubyBjaGFuZ2VzLiBUaGlzIG1lYW5zIHNldCBwcmV2aW91c0tleSB0b1xuICAgICAgICAgICogY3VycmVudEtleSwgYW5kIGNsZWFyIGFsbCBvZiB0aGUgcXVldWVzIChhZGRpdGlvbnMsIG1vdmVzLCByZW1vdmFscykuXG4gICAgICAgICAgKiBTZXQgdGhlIHByZXZpb3VzSW5kZXhlcyBvZiBtb3ZlZCBhbmQgYWRkZWQgaXRlbXMgdG8gdGhlaXIgY3VycmVudEluZGV4ZXNcbiAgICAgICAgICAqIFJlc2V0IHRoZSBsaXN0IG9mIGFkZGl0aW9ucywgbW92ZXMgYW5kIHJlbW92YWxzXG4gICAgICAgICAgKiAqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dFJlY29yZCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzSXRIZWFkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmQuX25leHRQcmV2aW91cyA9IHJlY29yZC5fbmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c0luZGV4ID0gcmVjb3JkLmN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fbW92ZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IG5leHRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzSW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBuZXh0UmVjb3JkID0gcmVjb3JkLl9uZXh0TW92ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVzSGVhZCA9IHRoaXMuX21vdmVzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gdGhpcy5fcmVtb3ZhbHNUYWlsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhpcyBpcyB0aGUgY29yZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29sbGVjdGlvbnMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAtIGByZWNvcmRgIGlzIHRoZSByZWNvcmQgd2hpY2ggd2Ugc2F3IGF0IHRoaXMgcG9zaXRpb24gbGFzdCB0aW1lLiBJZiBudWxsIHRoZW4gaXQgaXMgYSBuZXdcbiAgICAgICAgICAqIGl0ZW0uXG4gICAgICAgICAgKiAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uXG4gICAgICAgICAgKiAtIGBpbmRleGAgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBjb2xsZWN0aW9uXG4gICAgICAgICAgKiAqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXRlbVxuICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1UcmFja0J5XG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX21pc21hdGNoID0gZnVuY3Rpb24gKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZpb3VzUmVjb3JkO1xuICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzUmVjb3JkID0gdGhpcy5faXRUYWlsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNSZWNvcmQgPSByZWNvcmQuX3ByZXY7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSB0aGUgY29sbGVjdGlvbiBzaW5jZSB3ZSBrbm93IGl0IGRvZXMgbm90IG1hdGNoIHRoZSBpdGVtLlxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZShyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBzZWUgaWYgd2UgaGF2ZSBzZWVuIHRoZSBpdGVtIGJlZm9yZS5cbiAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX2xpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbGlua2VkUmVjb3Jkcy5nZXQoaXRlbVRyYWNrQnksIGluZGV4KTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHNlZW4gdGhpcyBiZWZvcmUsIHdlIG5lZWQgdG8gbW92ZSBpdCBmb3J3YXJkIGluIHRoZSBjb2xsZWN0aW9uLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCBmaXJzdCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGlkZW50aXR5IGNoYW5nZWQsIHNvIHdlIGNhbiB1cGRhdGUgaW4gdmlldyBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlQWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmV2ZXIgc2VlbiBpdCwgY2hlY2sgZXZpY3RlZCBsaXN0LlxuICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGFuIGl0ZW0gd2hpY2ggd2UgaGF2ZSBldmljdGVkIGVhcmxpZXI6IHJlaW5zZXJ0IGl0IGJhY2sgaW50byB0aGUgbGlzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgaWRlbnRpdHkgY2hhbmdlZCwgc28gd2UgY2FuIHVwZGF0ZSBpbiB2aWV3IGlmIG5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBuZXcgaXRlbTogYWRkIGl0LlxuICAgICAgICAgICAgICAgICAgICByZWNvcmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkQWZ0ZXIobmV3IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQoaXRlbSwgaXRlbVRyYWNrQnkpLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhpcyBjaGVjayBpcyBvbmx5IG5lZWRlZCBpZiBhbiBhcnJheSBjb250YWlucyBkdXBsaWNhdGVzLiAoU2hvcnQgY2lyY3VpdCBvZiBub3RoaW5nIGRpcnR5KVxuICAgICAgICAgICogKlxuICAgICAgICAgICogVXNlIGNhc2U6IGBbYSwgYV1gID0+IGBbYiwgYSwgYV1gXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBJZiB3ZSBkaWQgbm90IGhhdmUgdGhpcyBjaGVjayB0aGVuIHRoZSBpbnNlcnRpb24gb2YgYGJgIHdvdWxkOlxuICAgICAgICAgICogMSkgZXZpY3QgZmlyc3QgYGFgXG4gICAgICAgICAgKiAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC5cbiAgICAgICAgICAqIDMpIGxlYXZlIGBhYCBhdCBpbmRleCBgMWAgYXMgaXMuIDwtLSB0aGlzIGlzIHdyb25nIVxuICAgICAgICAgICogMykgcmVpbnNlcnQgYGFgIGF0IGluZGV4IDIuIDwtLSB0aGlzIGlzIHdyb25nIVxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhlIGNvcnJlY3QgYmVoYXZpb3IgaXM6XG4gICAgICAgICAgKiAxKSBldmljdCBmaXJzdCBgYWBcbiAgICAgICAgICAqIDIpIGluc2VydCBgYmAgYXQgYDBgIGluZGV4LlxuICAgICAgICAgICogMykgcmVpbnNlcnQgYGFgIGF0IGluZGV4IDEuXG4gICAgICAgICAgKiAzKSBtb3ZlIGBhYCBhdCBmcm9tIGAxYCB0byBgMmAuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBEb3VibGUgY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBldmljdGVkIGEgZHVwbGljYXRlIGl0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGl0ZW0gdHlwZSBtYXlcbiAgICAgICAgICAqIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQ6XG4gICAgICAgICAgKiBUaGUgaW5zZXJ0aW9uIG9mIGIgd2lsbCBldmljdCB0aGUgZmlyc3QgJ2EnLiBJZiB3ZSBkb24ndCByZWluc2VydCBpdCBub3cgaXQgd2lsbCBiZSByZWluc2VydGVkXG4gICAgICAgICAgKiBhdCB0aGUgZW5kLiBXaGljaCB3aWxsIHNob3cgdXAgYXMgdGhlIHR3byAnYSdzIHN3aXRjaGluZyBwb3NpdGlvbi4gVGhpcyBpcyBpbmNvcnJlY3QsIHNpbmNlIGFcbiAgICAgICAgICAqIGJldHRlciB3YXkgdG8gdGhpbmsgb2YgaXQgaXMgYXMgaW5zZXJ0IG9mICdiJyByYXRoZXIgdGhlbiBzd2l0Y2ggJ2EnIHdpdGggJ2InIGFuZCB0aGVuIGFkZCAnYSdcbiAgICAgICAgICAqIGF0IHRoZSBlbmQuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXRlbVxuICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1UcmFja0J5XG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX3ZlcmlmeVJlaW5zZXJ0aW9uID0gZnVuY3Rpb24gKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWluc2VydFJlY29yZCA9IHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5KTtcbiAgICAgICAgICAgIGlmIChyZWluc2VydFJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVpbnNlcnRSZWNvcmQsIHJlY29yZC5fcHJldiwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVjb3JkLmN1cnJlbnRJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBHZXQgcmlkIG9mIGFueSBleGNlc3Mge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9cyBmcm9tIHRoZSBwcmV2aW91cyBjb2xsZWN0aW9uXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAtIGByZWNvcmRgIFRoZSBmaXJzdCBleGNlc3Mge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9LlxuICAgICAgICAgICogKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fdHJ1bmNhdGUgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICAvLyBBbnl0aGluZyBhZnRlciB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQ7XG4gICAgICAgICAgICB3aGlsZSAocmVjb3JkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dFJlY29yZCA9IHJlY29yZC5fbmV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgICAgICAgICAgICAgICByZWNvcmQgPSBuZXh0UmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5jbGVhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2FkZGl0aW9uc1RhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21vdmVzVGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9pdFRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdFRhaWwuX25leHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX3JlaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXYgPSByZWNvcmQuX3ByZXZSZW1vdmVkO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IHJlY29yZC5fbmV4dFJlbW92ZWQ7XG4gICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvTW92ZXMocmVjb3JkLCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX21vdmVBZnRlciA9IGZ1bmN0aW9uIChyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLl91bmxpbmsocmVjb3JkKTtcbiAgICAgICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcGFyYW0gez99IHByZXZSZWNvcmRcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fYWRkQWZ0ZXIgPSBmdW5jdGlvbiAocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHRvZG8odmljYilcbiAgICAgICAgICAgICAgICAvLyBhc3NlcnQodGhpcy5fYWRkaXRpb25zSGVhZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAgICAgICAgICAgLy8gYXNzZXJ0KF9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcGFyYW0gez99IHByZXZSZWNvcmRcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5faW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkge1xuICAgICAgICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZCAhPSBwcmV2UmVjb3JkKTtcbiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT09IG51bGwpO1xuICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fcHJldiA9PT0gbnVsbCk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXh0ID0gcHJldlJlY29yZCA9PT0gbnVsbCA/IHRoaXMuX2l0SGVhZCA6IHByZXZSZWNvcmQuX25leHQ7XG4gICAgICAgICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAgICAgICAvLyBhc3NlcnQobmV4dCAhPSByZWNvcmQpO1xuICAgICAgICAgICAgLy8gYXNzZXJ0KHByZXZSZWNvcmQgIT0gcmVjb3JkKTtcbiAgICAgICAgICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7XG4gICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBwcmV2UmVjb3JkO1xuICAgICAgICAgICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZSZWNvcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmtlZFJlY29yZHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7XG4gICAgICAgICAgICByZWNvcmQuY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX3JlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl91bmxpbmsgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpbmtlZFJlY29yZHMucmVtb3ZlKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2ID0gcmVjb3JkLl9wcmV2O1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IHJlY29yZC5fbmV4dDtcbiAgICAgICAgICAgIC8vIHRvZG8odmljYilcbiAgICAgICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9wcmV2ID0gbnVsbCkgPT09IG51bGwpO1xuICAgICAgICAgICAgLy8gYXNzZXJ0KChyZWNvcmQuX25leHQgPSBudWxsKSA9PT0gbnVsbCk7XG4gICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0SGVhZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHQuX3ByZXYgPSBwcmV2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEBwYXJhbSB7P30gdG9JbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9Nb3ZlcyA9IGZ1bmN0aW9uIChyZWNvcmQsIHRvSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIHRvZG8odmljYilcbiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRNb3ZlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT09IHRvSW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21vdmVzVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHRvZG8odmljYilcbiAgICAgICAgICAgICAgICAvLyBhc3NlcnQoX21vdmVzSGVhZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZXNUYWlsID0gdGhpcy5fbW92ZXNIZWFkID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgICAgICAgICAgIC8vIGFzc2VydChfbW92ZXNUYWlsLl9uZXh0TW92ZWQgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVzVGFpbCA9IHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl9hZGRUb1JlbW92YWxzID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG5ldyBfRHVwbGljYXRlTWFwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7XG4gICAgICAgICAgICByZWNvcmQuY3VycmVudEluZGV4ID0gbnVsbDtcbiAgICAgICAgICAgIHJlY29yZC5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHRvZG8odmljYilcbiAgICAgICAgICAgICAgICAvLyBhc3NlcnQoX3JlbW92YWxzSGVhZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsID0gdGhpcy5fcmVtb3ZhbHNIZWFkID0gcmVjb3JkO1xuICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgICAgICAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dFJlbW92ZWQgPT09IG51bGwpO1xuICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSB0aGlzLl9yZW1vdmFsc1RhaWw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsID0gdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX2FkZElkZW50aXR5Q2hhbmdlID0gZnVuY3Rpb24gKHJlY29yZCwgaXRlbSkge1xuICAgICAgICAgICAgcmVjb3JkLml0ZW0gPSBpdGVtO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXN0ID0gW107XG4gICAgICAgICAgICB0aGlzLmZvckVhY2hJdGVtKGZ1bmN0aW9uIChyZWNvcmQgLyoqIFRPRE8gIzkxMDAgKi8pIHsgcmV0dXJuIGxpc3QucHVzaChyZWNvcmQpOyB9KTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZpb3VzID0gW107XG4gICAgICAgICAgICB0aGlzLmZvckVhY2hQcmV2aW91c0l0ZW0oZnVuY3Rpb24gKHJlY29yZCAvKiogVE9ETyAjOTEwMCAqLykgeyByZXR1cm4gcHJldmlvdXMucHVzaChyZWNvcmQpOyB9KTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFkZGl0aW9ucyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5mb3JFYWNoQWRkZWRJdGVtKGZ1bmN0aW9uIChyZWNvcmQgLyoqIFRPRE8gIzkxMDAgKi8pIHsgcmV0dXJuIGFkZGl0aW9ucy5wdXNoKHJlY29yZCk7IH0pO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW92ZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaE1vdmVkSXRlbShmdW5jdGlvbiAocmVjb3JkIC8qKiBUT0RPICM5MTAwICovKSB7IHJldHVybiBtb3Zlcy5wdXNoKHJlY29yZCk7IH0pO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVtb3ZhbHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaFJlbW92ZWRJdGVtKGZ1bmN0aW9uIChyZWNvcmQgLyoqIFRPRE8gIzkxMDAgKi8pIHsgcmV0dXJuIHJlbW92YWxzLnB1c2gocmVjb3JkKTsgfSk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZGVudGl0eUNoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZ1bmN0aW9uIChyZWNvcmQgLyoqIFRPRE8gIzkxMDAgKi8pIHsgcmV0dXJuIGlkZW50aXR5Q2hhbmdlcy5wdXNoKHJlY29yZCk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuICdjb2xsZWN0aW9uOiAnICsgbGlzdC5qb2luKCcsICcpICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgICdwcmV2aW91czogJyArIHByZXZpb3VzLmpvaW4oJywgJykgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgJ2FkZGl0aW9uczogJyArIGFkZGl0aW9ucy5qb2luKCcsICcpICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgICdtb3ZlczogJyArIG1vdmVzLmpvaW4oJywgJykgKyAnXFxuJyArXG4gICAgICAgICAgICAgICAgJ3JlbW92YWxzOiAnICsgcmVtb3ZhbHMuam9pbignLCAnKSArICdcXG4nICtcbiAgICAgICAgICAgICAgICAnaWRlbnRpdHlDaGFuZ2VzOiAnICsgaWRlbnRpdHlDaGFuZ2VzLmpvaW4oJywgJykgKyAnXFxuJztcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRJdGVyYWJsZURpZmZlcjtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1cbiAgICAgICAgICogQHBhcmFtIHs/fSB0cmFja0J5SWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQoaXRlbSwgdHJhY2tCeUlkKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy50cmFja0J5SWQgPSB0cmFja0J5SWQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dFByZXZpb3VzID0gbnVsbDtcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX3ByZXYgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9wcmV2RHVwID0gbnVsbDtcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX25leHREdXAgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX25leHRNb3ZlZCA9IG51bGw7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29sbGVjdGlvbkNoYW5nZVJlY29yZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c0luZGV4ID09PSB0aGlzLmN1cnJlbnRJbmRleCA/IHN0cmluZ2lmeSh0aGlzLml0ZW0pIDpcbiAgICAgICAgICAgICAgICBzdHJpbmdpZnkodGhpcy5pdGVtKSArICdbJyArXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLnByZXZpb3VzSW5kZXgpICsgJy0+JyArIHN0cmluZ2lmeSh0aGlzLmN1cnJlbnRJbmRleCkgKyAnXSc7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIH0oKSk7XG4gICAgLy8gQSBsaW5rZWQgbGlzdCBvZiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkcyB3aXRoIHRoZSBzYW1lIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQuaXRlbVxuICAgIHZhciBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QoKSB7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gbnVsbDtcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQXBwZW5kIHRoZSByZWNvcmQgdG8gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIE5vdGU6IGJ5IGRlc2lnbiBhbGwgcmVjb3JkcyBpbiB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzIGhvbGQgdGhlIHNhbWUgdmFsdWUgaW4gcmVjb3JkLml0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7XG4gICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0RHVwID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXZEdXAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuaXRlbSA9PSAgX2hlYWQuaXRlbSB8fFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHJlY29yZC5pdGVtIGlzIG51bSAmJiByZWNvcmQuaXRlbS5pc05hTiAmJiBfaGVhZC5pdGVtIGlzIG51bSAmJiBfaGVhZC5pdGVtLmlzTmFOKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWlsLl9uZXh0RHVwID0gcmVjb3JkO1xuICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldkR1cCA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0RHVwID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl90YWlsID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0cmFja0J5SWRcbiAgICAgICAgICogQHBhcmFtIHs/fSBhZnRlckluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0cmFja0J5SWQsIGFmdGVySW5kZXgpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5faGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHREdXApIHtcbiAgICAgICAgICAgICAgICBpZiAoKGFmdGVySW5kZXggPT09IG51bGwgfHwgYWZ0ZXJJbmRleCA8IHJlY29yZC5jdXJyZW50SW5kZXgpICYmXG4gICAgICAgICAgICAgICAgICAgIGxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIHRyYWNrQnlJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZW1vdmUgb25lIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkfSBmcm9tIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBpcyBlbXB0eS5cbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgICAgICAgLy8gYXNzZXJ0KCgpIHtcbiAgICAgICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuXG4gICAgICAgICAgICAvLyAgZm9yIChDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIGN1cnNvciA9IF9oZWFkOyBjdXJzb3IgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLl9uZXh0RHVwKSB7XG4gICAgICAgICAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAvLyAgfVxuICAgICAgICAgICAgLy8gIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vfSk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2ID0gcmVjb3JkLl9wcmV2RHVwO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IHJlY29yZC5fbmV4dER1cDtcbiAgICAgICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0RHVwID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2RHVwID0gcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkID09PSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0O1xuICAgIH0oKSk7XG4gICAgdmFyIF9EdXBsaWNhdGVNYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBfRHVwbGljYXRlTWFwKCkge1xuICAgICAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBfRHVwbGljYXRlTWFwLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXkgPSByZWNvcmQudHJhY2tCeUlkO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZHVwbGljYXRlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKCFkdXBsaWNhdGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwbGljYXRlcyA9IG5ldyBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5zZXQoa2V5LCBkdXBsaWNhdGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKHJlY29yZCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0cmlldmUgdGhlIGB2YWx1ZWAgdXNpbmcga2V5LiBCZWNhdXNlIHRoZSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHZhbHVlIG1heSBiZSBvbmUgd2hpY2ggd2VcbiAgICAgICAgICAqIGhhdmUgYWxyZWFkeSBpdGVyYXRlZCBvdmVyLCB3ZSB1c2UgdGhlIGFmdGVySW5kZXggdG8gcHJldGVuZCBpdCBpcyBub3QgdGhlcmUuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBVc2UgY2FzZTogYFthLCBiLCBjLCBhLCBhXWAgaWYgd2UgYXJlIGF0IGluZGV4IGAzYCB3aGljaCBpcyB0aGUgc2Vjb25kIGBhYCB0aGVuIGFza2luZyBpZiB3ZVxuICAgICAgICAgICogaGF2ZSBhbnkgbW9yZSBgYWBzIG5lZWRzIHRvIHJldHVybiB0aGUgbGFzdCBgYWAgbm90IHRoZSBmaXJzdCBvciBzZWNvbmQuXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHJhY2tCeUlkXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGFmdGVySW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIF9EdXBsaWNhdGVNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0cmFja0J5SWQsIGFmdGVySW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChhZnRlckluZGV4ID09PSB2b2lkIDApIHsgYWZ0ZXJJbmRleCA9IG51bGw7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IHRyYWNrQnlJZDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZExpc3QgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmRMaXN0ID8gcmVjb3JkTGlzdC5nZXQodHJhY2tCeUlkLCBhZnRlckluZGV4KSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmVtb3ZlcyBhIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkfSBmcm9tIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgbGlzdCBvZiBkdXBsaWNhdGVzIGFsc28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAgaWYgaXQgZ2V0cyBlbXB0eS5cbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIF9EdXBsaWNhdGVNYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IHJlY29yZC50cmFja0J5SWQ7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmRMaXN0ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyB3aGVuIGl0IGdldHMgZW1wdHlcbiAgICAgICAgICAgIGlmIChyZWNvcmRMaXN0LnJlbW92ZShyZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX0R1cGxpY2F0ZU1hcC5wcm90b3R5cGUsIFwiaXNFbXB0eVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5tYXAuc2l6ZSA9PT0gMDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgX0R1cGxpY2F0ZU1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7IHRoaXMubWFwLmNsZWFyKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgX0R1cGxpY2F0ZU1hcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnX0R1cGxpY2F0ZU1hcCgnICsgc3RyaW5naWZ5KHRoaXMubWFwKSArICcpJzsgfTtcbiAgICAgICAgcmV0dXJuIF9EdXBsaWNhdGVNYXA7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGl0ZW1cbiAgICAgKiBAcGFyYW0gez99IGFkZFJlbW92ZU9mZnNldFxuICAgICAqIEBwYXJhbSB7P30gbW92ZU9mZnNldHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFByZXZpb3VzSW5kZXgoaXRlbSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2aW91c0luZGV4ID0gaXRlbS5wcmV2aW91c0luZGV4O1xuICAgICAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0luZGV4O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb3ZlT2Zmc2V0ID0gMDtcbiAgICAgICAgaWYgKG1vdmVPZmZzZXRzICYmIHByZXZpb3VzSW5kZXggPCBtb3ZlT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG1vdmVPZmZzZXQgPSBtb3ZlT2Zmc2V0c1twcmV2aW91c0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJldmlvdXNJbmRleCArIGFkZFJlbW92ZU9mZnNldCArIG1vdmVPZmZzZXQ7XG4gICAgfVxuXG4gICAgdmFyIERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5KCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeS5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdChvYmopOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjZFJlZlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKGNkUmVmKSB7IHJldHVybiBuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyKCk7IH07XG4gICAgICAgIHJldHVybiBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5O1xuICAgIH0oKSk7XG4gICAgdmFyIERlZmF1bHRLZXlWYWx1ZURpZmZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIERlZmF1bHRLZXlWYWx1ZURpZmZlcigpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29yZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTWFwSGVhZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUsIFwiaXNEaXJ0eVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2NoYW5nZXNIZWFkICE9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjb3JkO1xuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9tYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hQcmV2aW91c0l0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaENoYW5nZWRJdGVtID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQ7XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2NoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoQWRkZWRJdGVtID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQ7XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoUmVtb3ZlZEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlY29yZDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBtYXBcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwKSB7XG4gICAgICAgICAgICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdChtYXApKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHRyeWluZyB0byBkaWZmICdcIiArIG1hcCArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrKG1hcCkgPyB0aGlzIDogbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbWFwXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKG1hcCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmRzID0gdGhpcy5fcmVjb3JkcztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9sZFNlcVJlY29yZCA9IHRoaXMuX21hcEhlYWQ7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0T2xkU2VxUmVjb3JkID0gbnVsbDtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3ROZXdTZXFSZWNvcmQgPSBudWxsO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VxQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChtYXAsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV3U2VxUmVjb3JkO1xuICAgICAgICAgICAgICAgIGlmIChvbGRTZXFSZWNvcmQgJiYga2V5ID09PSBvbGRTZXFSZWNvcmQua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1NlcVJlY29yZCA9IG9sZFNlcVJlY29yZDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX21heWJlQWRkVG9DaGFuZ2VzKG5ld1NlcVJlY29yZCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VxQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRTZXFSZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZW1vdmVGcm9tU2VxKGxhc3RPbGRTZXFSZWNvcmQsIG9sZFNlcVJlY29yZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYWRkVG9SZW1vdmFscyhvbGRTZXFSZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXFSZWNvcmQgPSByZWNvcmRzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX21heWJlQWRkVG9DaGFuZ2VzKG5ld1NlcVJlY29yZCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3U2VxUmVjb3JkID0gbmV3IEtleVZhbHVlQ2hhbmdlUmVjb3JkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzLnNldChrZXksIG5ld1NlcVJlY29yZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTZXFSZWNvcmQuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYWRkVG9BZGRpdGlvbnMobmV3U2VxUmVjb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2VxQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzSW5SZW1vdmFscyhuZXdTZXFSZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVtb3ZlRnJvbVJlbW92YWxzKG5ld1NlcVJlY29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3ROZXdTZXFSZWNvcmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX21hcEhlYWQgPSBuZXdTZXFSZWNvcmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0TmV3U2VxUmVjb3JkLl9uZXh0ID0gbmV3U2VxUmVjb3JkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3RPbGRTZXFSZWNvcmQgPSBvbGRTZXFSZWNvcmQ7XG4gICAgICAgICAgICAgICAgbGFzdE5ld1NlcVJlY29yZCA9IG5ld1NlcVJlY29yZDtcbiAgICAgICAgICAgICAgICBvbGRTZXFSZWNvcmQgPSBvbGRTZXFSZWNvcmQgJiYgb2xkU2VxUmVjb3JkLl9uZXh0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl90cnVuY2F0ZShsYXN0T2xkU2VxUmVjb3JkLCBvbGRTZXFSZWNvcmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgbWFwcGluZ1xuICAgICAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fY2hhbmdlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGxhc3RSZWNvcmRcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuX3RydW5jYXRlID0gZnVuY3Rpb24gKGxhc3RSZWNvcmQsIHJlY29yZCkge1xuICAgICAgICAgICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsYXN0UmVjb3JkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHRSZWNvcmQgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkVG9SZW1vdmFscyhyZWNvcmQpO1xuICAgICAgICAgICAgICAgIGxhc3RSZWNvcmQgPSByZWNvcmQ7XG4gICAgICAgICAgICAgICAgcmVjb3JkID0gbmV4dFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gcmVjID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWMgIT09IG51bGw7IHJlYyA9IHJlYy5fbmV4dFJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICByZWMucHJldmlvdXNWYWx1ZSA9IHJlYy5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgcmVjLmN1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjb3Jkcy5kZWxldGUocmVjLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLl9tYXliZUFkZFRvQ2hhbmdlcyA9IGZ1bmN0aW9uIChyZWNvcmQsIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKG5ld1ZhbHVlLCByZWNvcmQuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICByZWNvcmQuY3VycmVudFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkVG9DaGFuZ2VzKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5faXNJblJlbW92YWxzID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlY29yZCA9PT0gdGhpcy5fcmVtb3ZhbHNIZWFkIHx8IHJlY29yZC5fbmV4dFJlbW92ZWQgIT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXZSZW1vdmVkICE9PSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuX2FkZFRvUmVtb3ZhbHMgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVtb3ZhbHNIZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gdGhpcy5fcmVtb3ZhbHNUYWlsID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDtcbiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXZSZW1vdmVkID0gdGhpcy5fcmVtb3ZhbHNUYWlsO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJldlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVNlcSA9IGZ1bmN0aW9uIChwcmV2LCByZWNvcmQpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHQgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldi5fbmV4dCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQuX25leHQgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuX3JlbW92ZUZyb21SZW1vdmFscyA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXYgPSByZWNvcmQuX3ByZXZSZW1vdmVkO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IHJlY29yZC5fbmV4dFJlbW92ZWQ7XG4gICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQuX3ByZXZSZW1vdmVkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9BZGRpdGlvbnMgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gcmVjb3JkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9DaGFuZ2VzID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZXNIZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZCA9IHJlY29yZDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZpb3VzID0gW107XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFuZ2VzID0gW107XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhZGRpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlbW92YWxzID0gW107XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQ7XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChzdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzTWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goc3RyaW5naWZ5KHJlY29yZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRBZGRlZCkge1xuICAgICAgICAgICAgICAgIGFkZGl0aW9ucy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmFscy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnbWFwOiAnICsgaXRlbXMuam9pbignLCAnKSArICdcXG4nICtcbiAgICAgICAgICAgICAgICAncHJldmlvdXM6ICcgKyBwcmV2aW91cy5qb2luKCcsICcpICsgJ1xcbicgK1xuICAgICAgICAgICAgICAgICdhZGRpdGlvbnM6ICcgKyBhZGRpdGlvbnMuam9pbignLCAnKSArICdcXG4nICtcbiAgICAgICAgICAgICAgICAnY2hhbmdlczogJyArIGNoYW5nZXMuam9pbignLCAnKSArICdcXG4nICtcbiAgICAgICAgICAgICAgICAncmVtb3ZhbHM6ICcgKyByZW1vdmFscy5qb2luKCcsICcpICsgJ1xcbic7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLl9mb3JFYWNoID0gZnVuY3Rpb24gKG9iaiwgZm4pIHtcbiAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICBvYmouZm9yRWFjaChmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcmV0dXJuIGZuKG9ialtrXSwgayk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gRGVmYXVsdEtleVZhbHVlRGlmZmVyO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIHZhciBLZXlWYWx1ZUNoYW5nZVJlY29yZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGtleVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gS2V5VmFsdWVDaGFuZ2VSZWNvcmQoa2V5KSB7XG4gICAgICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9uZXh0UHJldmlvdXMgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9uZXh0QWRkZWQgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fbmV4dENoYW5nZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgS2V5VmFsdWVDaGFuZ2VSZWNvcmQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvb3NlSWRlbnRpY2FsKHRoaXMucHJldmlvdXNWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpID9cbiAgICAgICAgICAgICAgICBzdHJpbmdpZnkodGhpcy5rZXkpIDpcbiAgICAgICAgICAgICAgICAoc3RyaW5naWZ5KHRoaXMua2V5KSArICdbJyArIHN0cmluZ2lmeSh0aGlzLnByZXZpb3VzVmFsdWUpICsgJy0+JyArXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLmN1cnJlbnRWYWx1ZSkgKyAnXScpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gS2V5VmFsdWVDaGFuZ2VSZWNvcmQ7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqICBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IGl0ZXJhYmxlIGRpZmZpbmcgc3RyYXRlZ2llcyB1c2VkIGJ5IE5nRm9yLCBOZ0NsYXNzLCBhbmQgb3RoZXJzLlxuICAgICAqL1xuICAgIHZhciBJdGVyYWJsZURpZmZlcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZhY3Rvcmllc1xuICAgICAgICAgKiBAcGFyYW0gez89fSBwYXJlbnRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEl0ZXJhYmxlRGlmZmVycy5jcmVhdGUgPSBmdW5jdGlvbiAoZmFjdG9yaWVzLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBmYWN0b3JpZXMgPSBmYWN0b3JpZXMuY29uY2F0KGNvcGllZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmFibGVEaWZmZXJzKGZhY3Rvcmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGFrZXMgYW4gYXJyYXkgb2Yge0BsaW5rIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGVcbiAgICAgICAgICAqIGluaGVyaXRlZCB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmYWN0b3JpZXMgYW5kIHJldHVybiBhIG5ld1xuICAgICAgICAgICoge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2UuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGV4dGVuZCBhbiBleGlzdGluZyBsaXN0IG9mIGZhY3RvcmllcyxcbiAgICAgICAgICAqIHdoaWNoIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBpbmplY3RvciBmb3IgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge0BsaW5rIEl0ZXJhYmxlRGlmZmVyfSBhdmFpbGFibGUuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgXG4gICAgICAgICAgKiB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgICAgKiBJdGVyYWJsZURpZmZlcnMuZXh0ZW5kKFtuZXcgSW1tdXRhYmxlTGlzdERpZmZlcigpXSlcbiAgICAgICAgICAqIF1cbiAgICAgICAgICAqIH0pXG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQgPSBmdW5jdGlvbiAoZmFjdG9yaWVzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBpY2FsbHkgd291bGQgb2NjdXIgd2hlbiBjYWxsaW5nIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQgaW5zaWRlIG9mIGRlcGVuZGVuY2llcyBwYXNzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib290c3RyYXAoKSwgd2hpY2ggd291bGQgb3ZlcnJpZGUgZGVmYXVsdCBwaXBlcyBpbnN0ZWFkIG9mIGV4dGVuZGluZyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXh0ZW5kIEl0ZXJhYmxlRGlmZmVycyB3aXRob3V0IGEgcGFyZW50IGluamVjdG9yJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlRGlmZmVycy5jcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gRGVwZW5kZW5jeSB0ZWNobmljYWxseSBpc24ndCBvcHRpb25hbCwgYnV0IHdlIGNhbiBwcm92aWRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhpcyB3YXkuXG4gICAgICAgICAgICAgICAgZGVwczogW1tJdGVyYWJsZURpZmZlcnMsIG5ldyBTa2lwU2VsZigpLCBuZXcgT3B0aW9uYWwoKV1dXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVyYWJsZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSXRlcmFibGVEaWZmZXJzLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmYWN0b3J5ID0gdGhpcy5mYWN0b3JpZXMuZmluZChmdW5jdGlvbiAoZikgeyByZXR1cm4gZi5zdXBwb3J0cyhpdGVyYWJsZSk7IH0pO1xuICAgICAgICAgICAgaWYgKGlzUHJlc2VudChmYWN0b3J5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJ1wiICsgaXRlcmFibGUgKyBcIicgb2YgdHlwZSAnXCIgKyBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhpdGVyYWJsZSkgKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBJdGVyYWJsZURpZmZlcnM7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqICBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IE1hcCBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0NsYXNzLCBOZ1N0eWxlLCBhbmQgb3RoZXJzLlxuICAgICAqL1xuICAgIHZhciBLZXlWYWx1ZURpZmZlcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEtleVZhbHVlRGlmZmVycyhmYWN0b3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZhY3Rvcmllc1xuICAgICAgICAgKiBAcGFyYW0gez89fSBwYXJlbnRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEtleVZhbHVlRGlmZmVycy5jcmVhdGUgPSBmdW5jdGlvbiAoZmFjdG9yaWVzLCBwYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBmYWN0b3JpZXMgPSBmYWN0b3JpZXMuY29uY2F0KGNvcGllZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgS2V5VmFsdWVEaWZmZXJzKGZhY3Rvcmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGFrZXMgYW4gYXJyYXkgb2Yge0BsaW5rIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGVcbiAgICAgICAgICAqIGluaGVyaXRlZCB7QGxpbmsgS2V5VmFsdWVEaWZmZXJzfSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmYWN0b3JpZXMgYW5kIHJldHVybiBhIG5ld1xuICAgICAgICAgICoge0BsaW5rIEtleVZhbHVlRGlmZmVyc30gaW5zdGFuY2UuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGV4dGVuZCBhbiBleGlzdGluZyBsaXN0IG9mIGZhY3RvcmllcyxcbiAgICAgICAgICAqIHdoaWNoIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBpbmplY3RvciBmb3IgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge0BsaW5rIEtleVZhbHVlRGlmZmVyfSBhdmFpbGFibGUuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgXG4gICAgICAgICAgKiB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICAgICAgKiBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kKFtuZXcgSW1tdXRhYmxlTWFwRGlmZmVyKCldKVxuICAgICAgICAgICogXVxuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGBgYFxuICAgICAgICAgKiBAcGFyYW0gez99IGZhY3Rvcmllc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZCA9IGZ1bmN0aW9uIChmYWN0b3JpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcHJvdmlkZTogS2V5VmFsdWVEaWZmZXJzLFxuICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvb3RzdHJhcCgpLCB3aGljaCB3b3VsZCBvdmVycmlkZSBkZWZhdWx0IHBpcGVzIGluc3RlYWQgb2YgZXh0ZW5kaW5nIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleHRlbmQgS2V5VmFsdWVEaWZmZXJzIHdpdGhvdXQgYSBwYXJlbnQgaW5qZWN0b3InKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gS2V5VmFsdWVEaWZmZXJzLmNyZWF0ZShmYWN0b3JpZXMsIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgICAgICAgICAgICBkZXBzOiBbW0tleVZhbHVlRGlmZmVycywgbmV3IFNraXBTZWxmKCksIG5ldyBPcHRpb25hbCgpXV1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGt2XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBLZXlWYWx1ZURpZmZlcnMucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoa3YpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLnN1cHBvcnRzKGt2KTsgfSk7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KGZhY3RvcnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnXCIgKyBrdiArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEtleVZhbHVlRGlmZmVycztcbiAgICB9KCkpO1xuXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVU5JTklUSUFMSVpFRCA9IHtcbiAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdDRF9JTklUX1ZBTFVFJzsgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBhXG4gICAgICogQHBhcmFtIHs/fSBiXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZXZNb2RlRXF1YWwoYSwgYikge1xuICAgICAgICBpZiAoaXNMaXN0TGlrZUl0ZXJhYmxlKGEpICYmIGlzTGlzdExpa2VJdGVyYWJsZShiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFyZUl0ZXJhYmxlc0VxdWFsKGEsIGIsIGRldk1vZGVFcXVhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZShhKSAmJiAhaXNQcmltaXRpdmUoYSkgJiYgIWlzTGlzdExpa2VJdGVyYWJsZShiKSAmJiAhaXNQcmltaXRpdmUoYikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvb3NlSWRlbnRpY2FsKGEsIGIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0IG9mIGEge0BsaW5rIFBpcGV9IHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkIGV2ZW4gdGhvdWdoIHRoZVxuICAgICAgKiByZWZlcmVuY2VcbiAgICAgICogaGFzIG5vdCBjaGFuZ2VkLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSB3cmFwcGVkIHZhbHVlIHdpbGwgYmUgdW53cmFwcGVkIGJ5IGNoYW5nZSBkZXRlY3Rpb24sIGFuZCB0aGUgdW53cmFwcGVkIHZhbHVlIHdpbGwgYmUgc3RvcmVkLlxuICAgICAgKiAqXG4gICAgICAqIEV4YW1wbGU6XG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGlmICh0aGlzLl9sYXRlc3RWYWx1ZSA9PT0gdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSkge1xuICAgICAgKiByZXR1cm4gdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZTtcbiAgICAgICogfSBlbHNlIHtcbiAgICAgICogdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlO1xuICAgICAgKiByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOyAvLyB0aGlzIHdpbGwgZm9yY2UgdXBkYXRlXG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICovXG4gICAgdmFyIFdyYXBwZWRWYWx1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHdyYXBwZWRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFdyYXBwZWRWYWx1ZSh3cmFwcGVkKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBXcmFwcGVkVmFsdWUud3JhcCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFdyYXBwZWRWYWx1ZSh2YWx1ZSk7IH07XG4gICAgICAgIHJldHVybiBXcmFwcGVkVmFsdWU7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgSGVscGVyIGNsYXNzIGZvciB1bndyYXBwaW5nIFdyYXBwZWRWYWx1ZSBzXG4gICAgICovXG4gICAgdmFyIFZhbHVlVW53cmFwcGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gVmFsdWVVbndyYXBwZXIoKSB7XG4gICAgICAgICAgICB0aGlzLmhhc1dyYXBwZWRWYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWYWx1ZVVud3JhcHBlci5wcm90b3R5cGUudW53cmFwID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1dyYXBwZWRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLndyYXBwZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmFsdWVVbndyYXBwZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLmhhc1dyYXBwZWRWYWx1ZSA9IGZhbHNlOyB9O1xuICAgICAgICByZXR1cm4gVmFsdWVVbndyYXBwZXI7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgUmVwcmVzZW50cyBhIGJhc2ljIGNoYW5nZSBmcm9tIGEgcHJldmlvdXMgdG8gYSBuZXcgdmFsdWUuXG4gICAgICovXG4gICAgdmFyIFNpbXBsZUNoYW5nZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByZXZpb3VzVmFsdWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFNpbXBsZUNoYW5nZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogIENoZWNrIHdoZXRoZXIgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgZmlyc3QgdmFsdWUgYXNzaWduZWQuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBTaW1wbGVDaGFuZ2UucHJvdG90eXBlLmlzRmlyc3RDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnByZXZpb3VzVmFsdWUgPT09IFVOSU5JVElBTElaRUQ7IH07XG4gICAgICAgIHJldHVybiBTaW1wbGVDaGFuZ2U7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBDaGFuZ2VEZXRlY3RvclJlZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENoYW5nZURldGVjdG9yUmVmKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgTWFya3MgYWxsIHtAbGluayBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSNPblB1c2h9IGFuY2VzdG9ycyBhcyB0byBiZSBjaGVja2VkLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HQzUxMmI/cD1wcmV2aWV3KSlcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICAqIHNlbGVjdG9yOiAnY21wJyxcbiAgICAgICAgICAqIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAgICAgICogdGVtcGxhdGU6IGBOdW1iZXIgb2YgdGlja3M6IHt7bnVtYmVyT2ZUaWNrc319YFxuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGNsYXNzIENtcCB7XG4gICAgICAgICAgKiBudW1iZXJPZlRpY2tzID0gMDtcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIGNvbnN0cnVjdG9yKHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgICAqIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAqIHRoaXMubnVtYmVyT2ZUaWNrcyArK1xuICAgICAgICAgICogLy8gdGhlIGZvbGxvd2luZyBpcyByZXF1aXJlZCwgb3RoZXJ3aXNlIHRoZSB2aWV3IHdpbGwgbm90IGJlIHVwZGF0ZWRcbiAgICAgICAgICAqIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICogfSwgMTAwMCk7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBzZWxlY3RvcjogJ2FwcCcsXG4gICAgICAgICAgKiBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAgKiA8Y21wPjxjbXA+XG4gICAgICAgICAgKiBgLFxuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGNsYXNzIEFwcCB7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDaGFuZ2VEZXRlY3RvclJlZi5wcm90b3R5cGUubWFya0ZvckNoZWNrID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIERldGFjaGVzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgY2hhbmdlIGRldGVjdG9yIHRyZWUuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgZGV0YWNoZWQgY2hhbmdlIGRldGVjdG9yIHdpbGwgbm90IGJlIGNoZWNrZWQgdW50aWwgaXQgaXMgcmVhdHRhY2hlZC5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHtAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRlY3RDaGFuZ2VzfSB0byBpbXBsZW1lbnRcbiAgICAgICAgICAqIGxvY2FsIGNoYW5nZVxuICAgICAgICAgICogZGV0ZWN0aW9uIGNoZWNrcy5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT5cbiAgICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGl2ZSBkZW1vIG9uY2UgcmVmLmRldGVjdENoYW5nZXMgaXMgbWVyZ2VkIGludG8gbWFzdGVyIC0tPlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY29tcG9uZW50IHdpdGggYSBsYXJnZSBsaXN0IG9mIHJlYWRvbmx5IGRhdGEuXG4gICAgICAgICAgKiBJbWFnaW5lIHRoZSBkYXRhIGNoYW5nZXMgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyxcbiAgICAgICAgICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZ1xuICAgICAgICAgICogdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciBhbmQgZG9pbmcgYSBsb2NhbCBjaGVjayBldmVyeSBmaXZlIHNlY29uZHMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgICAgICAgICogLy8gaW4gYSByZWFsIGFwcGxpY2F0aW9uIHRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYmUgZGlmZmVyZW50IGV2ZXJ5IHRpbWVcbiAgICAgICAgICAqIGdldCBkYXRhKCkge1xuICAgICAgICAgICogcmV0dXJuIFsxLDIsMyw0LDVdO1xuICAgICAgICAgICogfVxuICAgICAgICAgICogfVxuICAgICAgICAgICogKlxuICAgICAgICAgICogc2VsZWN0b3I6ICdnaWFudC1saXN0JyxcbiAgICAgICAgICAqIHRlbXBsYXRlOiBgXG4gICAgICAgICAgKiA8bGkgKm5nRm9yPVwibGV0IGQgb2YgZGF0YVByb3ZpZGVyLmRhdGFcIj5EYXRhIHt7ZH19PC9saWc+XG4gICAgICAgICAgKiBgLFxuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGNsYXNzIEdpYW50TGlzdCB7XG4gICAgICAgICAgKiBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOkRhdGFQcm92aWRlcikge1xuICAgICAgICAgICogcmVmLmRldGFjaCgpO1xuICAgICAgICAgICogc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICogdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICogfSwgNTAwMCk7XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiB9XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBzZWxlY3RvcjogJ2FwcCcsXG4gICAgICAgICAgKiBwcm92aWRlcnM6IFtEYXRhUHJvdmlkZXJdLFxuICAgICAgICAgICogdGVtcGxhdGU6IGBcbiAgICAgICAgICAqIDxnaWFudC1saXN0PjxnaWFudC1saXN0PlxuICAgICAgICAgICogYCxcbiAgICAgICAgICAqIH0pXG4gICAgICAgICAgKiBjbGFzcyBBcHAge1xuICAgICAgICAgICogfVxuICAgICAgICAgICogYGBgXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDaGVja3MgdGhlIGNoYW5nZSBkZXRlY3RvciBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gdG8gaW1wbGVtZW50IGxvY2FsXG4gICAgICAgICAgKiBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgICAgKiBjaGVja3MuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+XG4gICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpdmUgZGVtbyBvbmNlIHJlZi5kZXRlY3RDaGFuZ2VzIGlzIG1lcmdlZCBpbnRvIG1hc3RlciAtLT5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkb25seSBkYXRhLlxuICAgICAgICAgICogSW1hZ2luZSwgdGhlIGRhdGEgY2hhbmdlcyBjb25zdGFudGx5LCBtYW55IHRpbWVzIHBlciBzZWNvbmQuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLFxuICAgICAgICAgICogd2Ugd2FudCB0byBjaGVjayBhbmQgdXBkYXRlIHRoZSBsaXN0IGV2ZXJ5IGZpdmUgc2Vjb25kcy5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAqIGNoZWNrXG4gICAgICAgICAgKiBldmVyeSBmaXZlIHNlY29uZHMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBTZWUge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYucHJvdG90eXBlLmRldGVjdENoYW5nZXMgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ2hlY2tzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGl0cyBjaGlsZHJlbiwgYW5kIHRocm93cyBpZiBhbnkgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBUaGlzIGlzIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSB0byB2ZXJpZnkgdGhhdCBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCBpbnRyb2R1Y2VcbiAgICAgICAgICAqIG90aGVyIGNoYW5nZXMuXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ2hhbmdlRGV0ZWN0b3JSZWYucHJvdG90eXBlLmNoZWNrTm9DaGFuZ2VzID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFJlYXR0YWNoIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgdG8gdGhlIGNoYW5nZSBkZXRlY3RvciB0cmVlLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhpcyBhbHNvIG1hcmtzIE9uUHVzaCBhbmNlc3RvcnMgYXMgdG8gYmUgY2hlY2tlZC4gVGhpcyByZWF0dGFjaGVkIGNoYW5nZSBkZXRlY3RvciB3aWxsIGJlXG4gICAgICAgICAgKiBjaGVja2VkIGR1cmluZyB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9hVWhaaGE/cD1wcmV2aWV3KSlcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IGRpc3BsYXlpbmcgYGxpdmVgIGRhdGEuIFRoZSBjb21wb25lbnQgd2lsbCBkZXRhY2hcbiAgICAgICAgICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5XG4gICAgICAgICAgKiBpcyBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgICAgICAgICogZGF0YSA9IDE7XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAqIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAqIHRoaXMuZGF0YSA9IHRoaXMuZGF0YSAqIDI7XG4gICAgICAgICAgKiB9LCA1MDApO1xuICAgICAgICAgICogfVxuICAgICAgICAgICogfVxuICAgICAgICAgICogKlxuICAgICAgICAgICogc2VsZWN0b3I6ICdsaXZlLWRhdGEnLFxuICAgICAgICAgICogaW5wdXRzOiBbJ2xpdmUnXSxcbiAgICAgICAgICAqIHRlbXBsYXRlOiAnRGF0YToge3tkYXRhUHJvdmlkZXIuZGF0YX19J1xuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGNsYXNzIExpdmVEYXRhIHtcbiAgICAgICAgICAqIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBkYXRhUHJvdmlkZXI6RGF0YVByb3ZpZGVyKSB7fVxuICAgICAgICAgICogKlxuICAgICAgICAgICogc2V0IGxpdmUodmFsdWUpIHtcbiAgICAgICAgICAqIGlmICh2YWx1ZSlcbiAgICAgICAgICAqIHRoaXMucmVmLnJlYXR0YWNoKCk7XG4gICAgICAgICAgKiBlbHNlXG4gICAgICAgICAgKiB0aGlzLnJlZi5kZXRhY2goKTtcbiAgICAgICAgICAqIH1cbiAgICAgICAgICAqIH1cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIHNlbGVjdG9yOiAnYXBwJyxcbiAgICAgICAgICAqIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sXG4gICAgICAgICAgKiB0ZW1wbGF0ZTogYFxuICAgICAgICAgICogTGl2ZSBVcGRhdGU6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImxpdmVcIj5cbiAgICAgICAgICAqIDxsaXZlLWRhdGEgW2xpdmVdPVwibGl2ZVwiPjxsaXZlLWRhdGE+XG4gICAgICAgICAgKiBgLFxuICAgICAgICAgICogfSlcbiAgICAgICAgICAqIGNsYXNzIEFwcCB7XG4gICAgICAgICAgKiBsaXZlID0gdHJ1ZTtcbiAgICAgICAgICAqIH1cbiAgICAgICAgICAqIGBgYFxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENoYW5nZURldGVjdG9yUmVmLnByb3RvdHlwZS5yZWF0dGFjaCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgcmV0dXJuIENoYW5nZURldGVjdG9yUmVmO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBPYmplY3RgcyBhbmQgYE1hcGBzLlxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleVZhbERpZmYgPSBbbmV3IERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKV07XG4gICAgLyoqXG4gICAgICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgSXRlcmFibGVgIHR5cGVzIHN1Y2ggYXMgYEFycmF5YHMuXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXRlcmFibGVEaWZmID0gW25ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCldO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlZmF1bHRJdGVyYWJsZURpZmZlcnMgPSBuZXcgSXRlcmFibGVEaWZmZXJzKGl0ZXJhYmxlRGlmZik7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVmYXVsdEtleVZhbHVlRGlmZmVycyA9IG5ldyBLZXlWYWx1ZURpZmZlcnMoa2V5VmFsRGlmZik7XG5cbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgLy8gVE9ETyAobWF0c2tvKTogYWRkIHR5cGluZyBmb3IgdGhlIGFuaW1hdGlvbiBmdW5jdGlvblxuICAgIHZhciBSZW5kZXJDb21wb25lbnRUeXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVVybFxuICAgICAgICAgKiBAcGFyYW0gez99IHNsb3RDb3VudFxuICAgICAgICAgKiBAcGFyYW0gez99IGVuY2Fwc3VsYXRpb25cbiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25zXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZW5kZXJDb21wb25lbnRUeXBlKGlkLCB0ZW1wbGF0ZVVybCwgc2xvdENvdW50LCBlbmNhcHN1bGF0aW9uLCBzdHlsZXMsIGFuaW1hdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVVcmwgPSB0ZW1wbGF0ZVVybDtcbiAgICAgICAgICAgIHRoaXMuc2xvdENvdW50ID0gc2xvdENvdW50O1xuICAgICAgICAgICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gZW5jYXBzdWxhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25zID0gYW5pbWF0aW9ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVuZGVyQ29tcG9uZW50VHlwZTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBSZW5kZXJEZWJ1Z0luZm8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBSZW5kZXJEZWJ1Z0luZm8oKSB7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlckRlYnVnSW5mby5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZW5kZXJEZWJ1Z0luZm8ucHJvdG90eXBlLCBcImNvbXBvbmVudFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlbmRlckRlYnVnSW5mby5wcm90b3R5cGUsIFwicHJvdmlkZXJUb2tlbnNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZW5kZXJEZWJ1Z0luZm8ucHJvdG90eXBlLCBcInJlZmVyZW5jZXNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZW5kZXJEZWJ1Z0luZm8ucHJvdG90eXBlLCBcImNvbnRleHRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZW5kZXJEZWJ1Z0luZm8ucHJvdG90eXBlLCBcInNvdXJjZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFJlbmRlckRlYnVnSW5mbztcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBSZW5kZXJlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFJlbmRlcmVyKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3Rvck9yTm9kZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBkZWJ1Z0luZm9cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZWxlY3RSb290RWxlbWVudCA9IGZ1bmN0aW9uIChzZWxlY3Rvck9yTm9kZSwgZGVidWdJbmZvKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBkZWJ1Z0luZm9cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQsIG5hbWUsIGRlYnVnSW5mbykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVWaWV3Um9vdCA9IGZ1bmN0aW9uIChob3N0RWxlbWVudCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50RWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez89fSBkZWJ1Z0luZm9cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUZW1wbGF0ZUFuY2hvciA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCBkZWJ1Z0luZm8pIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBkZWJ1Z0luZm9cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUZXh0ID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQsIHZhbHVlLCBkZWJ1Z0luZm8pIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVuZGVyZXIucHJvdG90eXBlLnByb2plY3ROb2RlcyA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCBub2RlcykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSb290Tm9kZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hdHRhY2hWaWV3QWZ0ZXIgPSBmdW5jdGlvbiAobm9kZSwgdmlld1Jvb3ROb2RlcykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld1Jvb3ROb2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVuZGVyZXIucHJvdG90eXBlLmRldGFjaFZpZXcgPSBmdW5jdGlvbiAodmlld1Jvb3ROb2RlcykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3QWxsTm9kZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95VmlldyA9IGZ1bmN0aW9uIChob3N0RWxlbWVudCwgdmlld0FsbE5vZGVzKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZW5kZXJlci5wcm90b3R5cGUubGlzdGVuID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIG5hbWUsIGNhbGxiYWNrKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5saXN0ZW5HbG9iYWwgPSBmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBjYWxsYmFjaykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5VmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0RWxlbWVudEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFVzZWQgb25seSBpbiBkZWJ1ZyBtb2RlIHRvIHNlcmlhbGl6ZSBwcm9wZXJ0eSBjaGFuZ2VzIHRvIGRvbSBub2RlcyBhcyBhdHRyaWJ1dGVzLlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlWYWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJpbmRpbmdEZWJ1Z0luZm8gPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXNBZGRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRFbGVtZW50Q2xhc3MgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgY2xhc3NOYW1lLCBpc0FkZCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlVmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRFbGVtZW50U3R5bGUgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgc3R5bGVOYW1lLCBzdHlsZVZhbHVlKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBhcmdzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZW5kZXJlci5wcm90b3R5cGUuaW52b2tlRWxlbWVudE1ldGhvZCA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBtZXRob2ROYW1lLCBhcmdzKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJOb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVuZGVyZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAocmVuZGVyTm9kZSwgdGV4dCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nU3R5bGVzXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzXG4gICAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxheVxuICAgICAgICAgKiBAcGFyYW0gez99IGVhc2luZ1xuICAgICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlbmRlcmVyLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0YXJ0aW5nU3R5bGVzLCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMpIHsgfTtcbiAgICAgICAgcmV0dXJuIFJlbmRlcmVyO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIEluamVjdGFibGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIGEgbG93LWxldmVsIGludGVyZmFjZSBmb3IgbW9kaWZ5aW5nIHRoZSBVSS5cbiAgICAgICogKlxuICAgICAgKiBVc2UgdGhpcyBzZXJ2aWNlIHRvIGJ5cGFzcyBBbmd1bGFyJ3MgdGVtcGxhdGluZyBhbmQgbWFrZSBjdXN0b20gVUkgY2hhbmdlcyB0aGF0IGNhbid0IGJlXG4gICAgICAqIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xuICAgICAgKiBub3Qgc3RhdGljYWxseSBrbm93biwgdXNlIHtAbGluayAjc2V0RWxlbWVudFByb3BlcnR5fSBvciB7QGxpbmsgI3NldEVsZW1lbnRBdHRyaWJ1dGV9XG4gICAgICAqIHJlc3BlY3RpdmVseS5cbiAgICAgICogKlxuICAgICAgKiBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIGN1c3RvbSByZW5kZXJlciwgeW91IG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBkZWZhdWx0IFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGlzIGBEb21SZW5kZXJlcmAuIEFsc28gYXZhaWxhYmxlIGlzIGBXZWJXb3JrZXJSZW5kZXJlcmAuXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFJvb3RSZW5kZXJlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFJvb3RSZW5kZXJlcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50VHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUm9vdFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50VHlwZSkgeyB9O1xuICAgICAgICByZXR1cm4gUm9vdFJlbmRlcmVyO1xuICAgIH0oKSk7XG5cbiAgICB2YXIgU2VjdXJpdHlDb250ZXh0ID0ge307XG4gICAgU2VjdXJpdHlDb250ZXh0Lk5PTkUgPSAwO1xuICAgIFNlY3VyaXR5Q29udGV4dC5IVE1MID0gMTtcbiAgICBTZWN1cml0eUNvbnRleHQuU1RZTEUgPSAyO1xuICAgIFNlY3VyaXR5Q29udGV4dC5TQ1JJUFQgPSAzO1xuICAgIFNlY3VyaXR5Q29udGV4dC5VUkwgPSA0O1xuICAgIFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwgPSA1O1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuTk9ORV0gPSBcIk5PTkVcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LkhUTUxdID0gXCJIVE1MXCI7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TVFlMRV0gPSBcIlNUWUxFXCI7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TQ1JJUFRdID0gXCJTQ1JJUFRcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LlVSTF0gPSBcIlVSTFwiO1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMXSA9IFwiUkVTT1VSQ0VfVVJMXCI7XG4gICAgLyoqXG4gICAgICogIFNhbml0aXplciBpcyB1c2VkIGJ5IHRoZSB2aWV3cyB0byBzYW5pdGl6ZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdmFsdWVzLlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFNhbml0aXplciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFNhbml0aXplcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBTYW5pdGl6ZXIucHJvdG90eXBlLnNhbml0aXplID0gZnVuY3Rpb24gKGNvbnRleHQsIHZhbHVlKSB7IH07XG4gICAgICAgIHJldHVybiBTYW5pdGl6ZXI7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDcgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgQW4gZXJyb3IgdGhyb3duIGlmIGFwcGxpY2F0aW9uIGNoYW5nZXMgbW9kZWwgYnJlYWtpbmcgdGhlIHRvcC1kb3duIGRhdGEgZmxvdy5cbiAgICAgICogKlxuICAgICAgKiBUaGlzIGV4Y2VwdGlvbiBpcyBvbmx5IHRocm93biBpbiBkZXYgbW9kZS5cbiAgICAgICogKlxuICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgb25jZSB0aGUgZGV2IG1vZGUgb3B0aW9uIGlzIGNvbmZpZ3VyYWJsZSAtLT5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogc2VsZWN0b3I6ICdwYXJlbnQnLFxuICAgICAgKiB0ZW1wbGF0ZTogJzxjaGlsZCBbcHJvcF09XCJwYXJlbnRQcm9wXCI+PC9jaGlsZD4nLFxuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBQYXJlbnQge1xuICAgICAgKiBwYXJlbnRQcm9wID0gJ2luaXQnO1xuICAgICAgKiB9XG4gICAgICAqICpcbiAgICAgICogY2xhc3MgQ2hpbGQge1xuICAgICAgKiBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBQYXJlbnQpIHt9XG4gICAgICAqICpcbiAgICAgICogc2V0IHByb3Aodikge1xuICAgICAgKiAvLyB0aGlzIHVwZGF0ZXMgdGhlIHBhcmVudCBwcm9wZXJ0eSwgd2hpY2ggaXMgZGlzYWxsb3dlZCBkdXJpbmcgY2hhbmdlIGRldGVjdGlvblxuICAgICAgKiAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICAgICogdGhpcy5wYXJlbnQucGFyZW50UHJvcCA9ICd1cGRhdGVkJztcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhciBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDcoRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gb2xkVmFsdWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyVmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3Iob2xkVmFsdWUsIGN1cnJWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIG1zZyA9IFwiRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZC4gUHJldmlvdXMgdmFsdWU6ICdcIiArIG9sZFZhbHVlICsgXCInLiBDdXJyZW50IHZhbHVlOiAnXCIgKyBjdXJyVmFsdWUgKyBcIicuXCI7XG4gICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IFVOSU5JVElBTElaRUQpIHtcbiAgICAgICAgICAgICAgICBtc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgXCIgSXQgc2VlbXMgbGlrZSB0aGUgdmlldyBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGl0cyBwYXJlbnQgYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gZGlydHkgY2hlY2tlZC5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBIYXMgaXQgYmVlbiBjcmVhdGVkIGluIGEgY2hhbmdlIGRldGVjdGlvbiBob29rID9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I7XG4gICAgfShCYXNlRXJyb3IpKTtcbiAgICAvKipcbiAgICAgKiAgVGhyb3duIHdoZW4gYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgZHVyaW5nIHZpZXcgY3JlYXRpb24sIGNoYW5nZSBkZXRlY3Rpb24gb3IgZGVzdHJ1Y3Rpb24uXG4gICAgICAqICpcbiAgICAgICogVGhpcyBlcnJvciB3cmFwcyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIHRvIGF0dGFjaCBhZGRpdGlvbmFsIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdGhhdCBjYW5cbiAgICAgICogYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICovXG4gICAgdmFyIFZpZXdXcmFwcGVkRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkNyhWaWV3V3JhcHBlZEVycm9yLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5hbEVycm9yXG4gICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gVmlld1dyYXBwZWRFcnJvcihvcmlnaW5hbEVycm9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIkVycm9yIGluIFwiICsgY29udGV4dC5zb3VyY2UsIG9yaWdpbmFsRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVmlld1dyYXBwZWRFcnJvcjtcbiAgICB9KFdyYXBwZWRFcnJvcikpO1xuICAgIC8qKlxuICAgICAqICBUaHJvd24gd2hlbiBhIGRlc3Ryb3llZCB2aWV3IGlzIHVzZWQuXG4gICAgICAqICpcbiAgICAgICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIGZyYW1ld29yay5cbiAgICAgICogKlxuICAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIEFuZ3VsYXIgZXJyb3IuXG4gICAgICovXG4gICAgdmFyIFZpZXdEZXN0cm95ZWRFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQ3KFZpZXdEZXN0cm95ZWRFcnJvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZGV0YWlsc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gVmlld0Rlc3Ryb3llZEVycm9yKGRldGFpbHMpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIFwiQXR0ZW1wdCB0byB1c2UgYSBkZXN0cm95ZWQgdmlldzogXCIgKyBkZXRhaWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVmlld0Rlc3Ryb3llZEVycm9yO1xuICAgIH0oQmFzZUVycm9yKSk7XG5cbiAgICB2YXIgVmlld1V0aWxzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gc2FuaXRpemVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uUXVldWVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFZpZXdVdGlscyhfcmVuZGVyZXIsIHNhbml0aXplciwgYW5pbWF0aW9uUXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICAgICAgdGhpcy5hbmltYXRpb25RdWV1ZSA9IGFuaW1hdGlvblF1ZXVlO1xuICAgICAgICAgICAgdGhpcy5fbmV4dENvbXBUeXBlSWQgPSAwO1xuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZXIgPSBzYW5pdGl6ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyQ29tcG9uZW50VHlwZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld1V0aWxzLnByb3RvdHlwZS5yZW5kZXJDb21wb25lbnQgPSBmdW5jdGlvbiAocmVuZGVyQ29tcG9uZW50VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLnJlbmRlckNvbXBvbmVudChyZW5kZXJDb21wb25lbnRUeXBlKTtcbiAgICAgICAgfTtcbiAgICAgICAgVmlld1V0aWxzLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIFZpZXdVdGlscy5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgdHlwZTogUm9vdFJlbmRlcmVyLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBTYW5pdGl6ZXIsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IEFuaW1hdGlvblF1ZXVlLCB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gVmlld1V0aWxzO1xuICAgIH0oKSk7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dFJlbmRlckNvbXBvbmVudFR5cGVJZCA9IDA7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVVybFxuICAgICAqIEBwYXJhbSB7P30gc2xvdENvdW50XG4gICAgICogQHBhcmFtIHs/fSBlbmNhcHN1bGF0aW9uXG4gICAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICAgKiBAcGFyYW0gez99IGFuaW1hdGlvbnNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckNvbXBvbmVudFR5cGUodGVtcGxhdGVVcmwsIHNsb3RDb3VudCwgZW5jYXBzdWxhdGlvbiwgc3R5bGVzLCBhbmltYXRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVuZGVyQ29tcG9uZW50VHlwZShcIlwiICsgbmV4dFJlbmRlckNvbXBvbmVudFR5cGVJZCsrLCB0ZW1wbGF0ZVVybCwgc2xvdENvdW50LCBlbmNhcHN1bGF0aW9uLCBzdHlsZXMsIGFuaW1hdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGVcbiAgICAgKiBAcGFyYW0gez99IGFycmF5XG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRUb0FycmF5KGUsIGFycmF5KSB7XG4gICAgICAgIGFycmF5LnB1c2goZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdmFsdWVDb3VudFxuICAgICAqIEBwYXJhbSB7P30gY29uc3RBbmRJbnRlcnBcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKHZhbHVlQ291bnQsIGNvbnN0QW5kSW50ZXJwKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmFsdWVDb3VudCAqIDI7IGkgPSBpICsgMikge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgY29uc3RBbmRJbnRlcnBbaV0gKyBfdG9TdHJpbmdXaXRoTnVsbChjb25zdEFuZEludGVycFtpICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBjb25zdEFuZEludGVycFt2YWx1ZUNvdW50ICogMl07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdmFsdWVDb3VudFxuICAgICAqIEBwYXJhbSB7P30gYzBcbiAgICAgKiBAcGFyYW0gez99IGExXG4gICAgICogQHBhcmFtIHs/fSBjMVxuICAgICAqIEBwYXJhbSB7Pz19IGEyXG4gICAgICogQHBhcmFtIHs/PX0gYzJcbiAgICAgKiBAcGFyYW0gez89fSBhM1xuICAgICAqIEBwYXJhbSB7Pz19IGMzXG4gICAgICogQHBhcmFtIHs/PX0gYTRcbiAgICAgKiBAcGFyYW0gez89fSBjNFxuICAgICAqIEBwYXJhbSB7Pz19IGE1XG4gICAgICogQHBhcmFtIHs/PX0gYzVcbiAgICAgKiBAcGFyYW0gez89fSBhNlxuICAgICAqIEBwYXJhbSB7Pz19IGM2XG4gICAgICogQHBhcmFtIHs/PX0gYTdcbiAgICAgKiBAcGFyYW0gez89fSBjN1xuICAgICAqIEBwYXJhbSB7Pz19IGE4XG4gICAgICogQHBhcmFtIHs/PX0gYzhcbiAgICAgKiBAcGFyYW0gez89fSBhOVxuICAgICAqIEBwYXJhbSB7Pz19IGM5XG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmxpbmVJbnRlcnBvbGF0ZSh2YWx1ZUNvdW50LCBjMCwgYTEsIGMxLCBhMiwgYzIsIGEzLCBjMywgYTQsIGM0LCBhNSwgYzUsIGE2LCBjNiwgYTcsIGM3LCBhOCwgYzgsIGE5LCBjOSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlQ291bnQpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMTtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgICAgICBjMztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICAgICAgYzMgKyBfdG9TdHJpbmdXaXRoTnVsbChhNCkgKyBjNDtcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICAgICAgYzMgKyBfdG9TdHJpbmdXaXRoTnVsbChhNCkgKyBjNCArIF90b1N0cmluZ1dpdGhOdWxsKGE1KSArIGM1O1xuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0ICsgX3RvU3RyaW5nV2l0aE51bGwoYTUpICsgYzUgKyBfdG9TdHJpbmdXaXRoTnVsbChhNikgKyBjNjtcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICAgICAgYzMgKyBfdG9TdHJpbmdXaXRoTnVsbChhNCkgKyBjNCArIF90b1N0cmluZ1dpdGhOdWxsKGE1KSArIGM1ICsgX3RvU3RyaW5nV2l0aE51bGwoYTYpICtcbiAgICAgICAgICAgICAgICAgICAgYzYgKyBfdG9TdHJpbmdXaXRoTnVsbChhNykgKyBjNztcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICAgICAgYzMgKyBfdG9TdHJpbmdXaXRoTnVsbChhNCkgKyBjNCArIF90b1N0cmluZ1dpdGhOdWxsKGE1KSArIGM1ICsgX3RvU3RyaW5nV2l0aE51bGwoYTYpICtcbiAgICAgICAgICAgICAgICAgICAgYzYgKyBfdG9TdHJpbmdXaXRoTnVsbChhNykgKyBjNyArIF90b1N0cmluZ1dpdGhOdWxsKGE4KSArIGM4O1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0ICsgX3RvU3RyaW5nV2l0aE51bGwoYTUpICsgYzUgKyBfdG9TdHJpbmdXaXRoTnVsbChhNikgK1xuICAgICAgICAgICAgICAgICAgICBjNiArIF90b1N0cmluZ1dpdGhOdWxsKGE3KSArIGM3ICsgX3RvU3RyaW5nV2l0aE51bGwoYTgpICsgYzggKyBfdG9TdHJpbmdXaXRoTnVsbChhOSkgKyBjOTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gOSBleHByZXNzaW9uc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHZcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF90b1N0cmluZ1dpdGhOdWxsKHYpIHtcbiAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYudG9TdHJpbmcoKSA6ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VcbiAgICAgKiBAcGFyYW0gez99IG9sZFZhbHVlXG4gICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hlY2tCaW5kaW5nKHRocm93T25DaGFuZ2UsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICBpZiAodGhyb3dPbkNoYW5nZSkge1xuICAgICAgICAgICAgaWYgKCFkZXZNb2RlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gIWxvb3NlSWRlbnRpY2FsKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RCeVZhbHVlKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKGlucHV0KTtcbiAgICB9XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRU1QVFlfQVJSQVkgPSBbXTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBFTVBUWV9NQVAgPSB7fTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdXJlUHJveHkxKGZuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdDtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdjAgPSBVTklOSVRJQUxJWkVEO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHAwKSB7XG4gICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHYwLCBwMCkpIHtcbiAgICAgICAgICAgICAgICB2MCA9IHAwO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZuKHAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1cmVQcm94eTIoZm4pIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2MCA9IFVOSU5JVElBTElaRUQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHYxID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwMCwgcDEpIHtcbiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwodjAsIHAwKSB8fCAhbG9vc2VJZGVudGljYWwodjEsIHAxKSkge1xuICAgICAgICAgICAgICAgIHYwID0gcDA7XG4gICAgICAgICAgICAgICAgdjEgPSBwMTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmbihwMCwgcDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBmblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVyZVByb3h5Myhmbikge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHYwID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdjEgPSBVTklOSVRJQUxJWkVEO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2MiA9IFVOSU5JVElBTElaRUQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocDAsIHAxLCBwMikge1xuICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbCh2MCwgcDApIHx8ICFsb29zZUlkZW50aWNhbCh2MSwgcDEpIHx8ICFsb29zZUlkZW50aWNhbCh2MiwgcDIpKSB7XG4gICAgICAgICAgICAgICAgdjAgPSBwMDtcbiAgICAgICAgICAgICAgICB2MSA9IHAxO1xuICAgICAgICAgICAgICAgIHYyID0gcDI7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdXJlUHJveHk0KGZuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdDtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdjAsIC8qKiBAdHlwZSB7P30gKi8gdjEsIC8qKiBAdHlwZSB7P30gKi8gdjIsIC8qKiBAdHlwZSB7P30gKi8gdjM7XG4gICAgICAgIHYwID0gdjEgPSB2MiA9IHYzID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwMCwgcDEsIHAyLCBwMykge1xuICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbCh2MCwgcDApIHx8ICFsb29zZUlkZW50aWNhbCh2MSwgcDEpIHx8ICFsb29zZUlkZW50aWNhbCh2MiwgcDIpIHx8XG4gICAgICAgICAgICAgICAgIWxvb3NlSWRlbnRpY2FsKHYzLCBwMykpIHtcbiAgICAgICAgICAgICAgICB2MCA9IHAwO1xuICAgICAgICAgICAgICAgIHYxID0gcDE7XG4gICAgICAgICAgICAgICAgdjIgPSBwMjtcbiAgICAgICAgICAgICAgICB2MyA9IHAzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZuKHAwLCBwMSwgcDIsIHAzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1cmVQcm94eTUoZm4pIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2MCwgLyoqIEB0eXBlIHs/fSAqLyB2MSwgLyoqIEB0eXBlIHs/fSAqLyB2MiwgLyoqIEB0eXBlIHs/fSAqLyB2MywgLyoqIEB0eXBlIHs/fSAqLyB2NDtcbiAgICAgICAgdjAgPSB2MSA9IHYyID0gdjMgPSB2NCA9IFVOSU5JVElBTElaRUQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocDAsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHYwLCBwMCkgfHwgIWxvb3NlSWRlbnRpY2FsKHYxLCBwMSkgfHwgIWxvb3NlSWRlbnRpY2FsKHYyLCBwMikgfHxcbiAgICAgICAgICAgICAgICAhbG9vc2VJZGVudGljYWwodjMsIHAzKSB8fCAhbG9vc2VJZGVudGljYWwodjQsIHA0KSkge1xuICAgICAgICAgICAgICAgIHYwID0gcDA7XG4gICAgICAgICAgICAgICAgdjEgPSBwMTtcbiAgICAgICAgICAgICAgICB2MiA9IHAyO1xuICAgICAgICAgICAgICAgIHYzID0gcDM7XG4gICAgICAgICAgICAgICAgdjQgPSBwNDtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmbihwMCwgcDEsIHAyLCBwMywgcDQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBmblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVyZVByb3h5Nihmbikge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHYwLCAvKiogQHR5cGUgez99ICovIHYxLCAvKiogQHR5cGUgez99ICovIHYyLCAvKiogQHR5cGUgez99ICovIHYzLCAvKiogQHR5cGUgez99ICovIHY0LCAvKiogQHR5cGUgez99ICovIHY1O1xuICAgICAgICB2MCA9IHYxID0gdjIgPSB2MyA9IHY0ID0gdjUgPSBVTklOSVRJQUxJWkVEO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUpIHtcbiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwodjAsIHAwKSB8fCAhbG9vc2VJZGVudGljYWwodjEsIHAxKSB8fCAhbG9vc2VJZGVudGljYWwodjIsIHAyKSB8fFxuICAgICAgICAgICAgICAgICFsb29zZUlkZW50aWNhbCh2MywgcDMpIHx8ICFsb29zZUlkZW50aWNhbCh2NCwgcDQpIHx8ICFsb29zZUlkZW50aWNhbCh2NSwgcDUpKSB7XG4gICAgICAgICAgICAgICAgdjAgPSBwMDtcbiAgICAgICAgICAgICAgICB2MSA9IHAxO1xuICAgICAgICAgICAgICAgIHYyID0gcDI7XG4gICAgICAgICAgICAgICAgdjMgPSBwMztcbiAgICAgICAgICAgICAgICB2NCA9IHA0O1xuICAgICAgICAgICAgICAgIHY1ID0gcDU7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdXJlUHJveHk3KGZuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdDtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdjAsIC8qKiBAdHlwZSB7P30gKi8gdjEsIC8qKiBAdHlwZSB7P30gKi8gdjIsIC8qKiBAdHlwZSB7P30gKi8gdjMsIC8qKiBAdHlwZSB7P30gKi8gdjQsIC8qKiBAdHlwZSB7P30gKi8gdjUsIC8qKiBAdHlwZSB7P30gKi8gdjY7XG4gICAgICAgIHYwID0gdjEgPSB2MiA9IHYzID0gdjQgPSB2NSA9IHY2ID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNikge1xuICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbCh2MCwgcDApIHx8ICFsb29zZUlkZW50aWNhbCh2MSwgcDEpIHx8ICFsb29zZUlkZW50aWNhbCh2MiwgcDIpIHx8XG4gICAgICAgICAgICAgICAgIWxvb3NlSWRlbnRpY2FsKHYzLCBwMykgfHwgIWxvb3NlSWRlbnRpY2FsKHY0LCBwNCkgfHwgIWxvb3NlSWRlbnRpY2FsKHY1LCBwNSkgfHxcbiAgICAgICAgICAgICAgICAhbG9vc2VJZGVudGljYWwodjYsIHA2KSkge1xuICAgICAgICAgICAgICAgIHYwID0gcDA7XG4gICAgICAgICAgICAgICAgdjEgPSBwMTtcbiAgICAgICAgICAgICAgICB2MiA9IHAyO1xuICAgICAgICAgICAgICAgIHYzID0gcDM7XG4gICAgICAgICAgICAgICAgdjQgPSBwNDtcbiAgICAgICAgICAgICAgICB2NSA9IHA1O1xuICAgICAgICAgICAgICAgIHY2ID0gcDY7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBmblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVyZVByb3h5OChmbikge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHYwLCAvKiogQHR5cGUgez99ICovIHYxLCAvKiogQHR5cGUgez99ICovIHYyLCAvKiogQHR5cGUgez99ICovIHYzLCAvKiogQHR5cGUgez99ICovIHY0LCAvKiogQHR5cGUgez99ICovIHY1LCAvKiogQHR5cGUgez99ICovIHY2LCAvKiogQHR5cGUgez99ICovIHY3O1xuICAgICAgICB2MCA9IHYxID0gdjIgPSB2MyA9IHY0ID0gdjUgPSB2NiA9IHY3ID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcpIHtcbiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwodjAsIHAwKSB8fCAhbG9vc2VJZGVudGljYWwodjEsIHAxKSB8fCAhbG9vc2VJZGVudGljYWwodjIsIHAyKSB8fFxuICAgICAgICAgICAgICAgICFsb29zZUlkZW50aWNhbCh2MywgcDMpIHx8ICFsb29zZUlkZW50aWNhbCh2NCwgcDQpIHx8ICFsb29zZUlkZW50aWNhbCh2NSwgcDUpIHx8XG4gICAgICAgICAgICAgICAgIWxvb3NlSWRlbnRpY2FsKHY2LCBwNikgfHwgIWxvb3NlSWRlbnRpY2FsKHY3LCBwNykpIHtcbiAgICAgICAgICAgICAgICB2MCA9IHAwO1xuICAgICAgICAgICAgICAgIHYxID0gcDE7XG4gICAgICAgICAgICAgICAgdjIgPSBwMjtcbiAgICAgICAgICAgICAgICB2MyA9IHAzO1xuICAgICAgICAgICAgICAgIHY0ID0gcDQ7XG4gICAgICAgICAgICAgICAgdjUgPSBwNTtcbiAgICAgICAgICAgICAgICB2NiA9IHA2O1xuICAgICAgICAgICAgICAgIHY3ID0gcDc7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1cmVQcm94eTkoZm4pIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2MCwgLyoqIEB0eXBlIHs/fSAqLyB2MSwgLyoqIEB0eXBlIHs/fSAqLyB2MiwgLyoqIEB0eXBlIHs/fSAqLyB2MywgLyoqIEB0eXBlIHs/fSAqLyB2NCwgLyoqIEB0eXBlIHs/fSAqLyB2NSwgLyoqIEB0eXBlIHs/fSAqLyB2NiwgLyoqIEB0eXBlIHs/fSAqLyB2NywgLyoqIEB0eXBlIHs/fSAqLyB2ODtcbiAgICAgICAgdjAgPSB2MSA9IHYyID0gdjMgPSB2NCA9IHY1ID0gdjYgPSB2NyA9IHY4ID0gVU5JTklUSUFMSVpFRDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4KSB7XG4gICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHYwLCBwMCkgfHwgIWxvb3NlSWRlbnRpY2FsKHYxLCBwMSkgfHwgIWxvb3NlSWRlbnRpY2FsKHYyLCBwMikgfHxcbiAgICAgICAgICAgICAgICAhbG9vc2VJZGVudGljYWwodjMsIHAzKSB8fCAhbG9vc2VJZGVudGljYWwodjQsIHA0KSB8fCAhbG9vc2VJZGVudGljYWwodjUsIHA1KSB8fFxuICAgICAgICAgICAgICAgICFsb29zZUlkZW50aWNhbCh2NiwgcDYpIHx8ICFsb29zZUlkZW50aWNhbCh2NywgcDcpIHx8ICFsb29zZUlkZW50aWNhbCh2OCwgcDgpKSB7XG4gICAgICAgICAgICAgICAgdjAgPSBwMDtcbiAgICAgICAgICAgICAgICB2MSA9IHAxO1xuICAgICAgICAgICAgICAgIHYyID0gcDI7XG4gICAgICAgICAgICAgICAgdjMgPSBwMztcbiAgICAgICAgICAgICAgICB2NCA9IHA0O1xuICAgICAgICAgICAgICAgIHY1ID0gcDU7XG4gICAgICAgICAgICAgICAgdjYgPSBwNjtcbiAgICAgICAgICAgICAgICB2NyA9IHA3O1xuICAgICAgICAgICAgICAgIHY4ID0gcDg7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdXJlUHJveHkxMChmbikge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHYwLCAvKiogQHR5cGUgez99ICovIHYxLCAvKiogQHR5cGUgez99ICovIHYyLCAvKiogQHR5cGUgez99ICovIHYzLCAvKiogQHR5cGUgez99ICovIHY0LCAvKiogQHR5cGUgez99ICovIHY1LCAvKiogQHR5cGUgez99ICovIHY2LCAvKiogQHR5cGUgez99ICovIHY3LCAvKiogQHR5cGUgez99ICovIHY4LCAvKiogQHR5cGUgez99ICovIHY5O1xuICAgICAgICB2MCA9IHYxID0gdjIgPSB2MyA9IHY0ID0gdjUgPSB2NiA9IHY3ID0gdjggPSB2OSA9IFVOSU5JVElBTElaRUQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpIHtcbiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwodjAsIHAwKSB8fCAhbG9vc2VJZGVudGljYWwodjEsIHAxKSB8fCAhbG9vc2VJZGVudGljYWwodjIsIHAyKSB8fFxuICAgICAgICAgICAgICAgICFsb29zZUlkZW50aWNhbCh2MywgcDMpIHx8ICFsb29zZUlkZW50aWNhbCh2NCwgcDQpIHx8ICFsb29zZUlkZW50aWNhbCh2NSwgcDUpIHx8XG4gICAgICAgICAgICAgICAgIWxvb3NlSWRlbnRpY2FsKHY2LCBwNikgfHwgIWxvb3NlSWRlbnRpY2FsKHY3LCBwNykgfHwgIWxvb3NlSWRlbnRpY2FsKHY4LCBwOCkgfHxcbiAgICAgICAgICAgICAgICAhbG9vc2VJZGVudGljYWwodjksIHA5KSkge1xuICAgICAgICAgICAgICAgIHYwID0gcDA7XG4gICAgICAgICAgICAgICAgdjEgPSBwMTtcbiAgICAgICAgICAgICAgICB2MiA9IHAyO1xuICAgICAgICAgICAgICAgIHYzID0gcDM7XG4gICAgICAgICAgICAgICAgdjQgPSBwNDtcbiAgICAgICAgICAgICAgICB2NSA9IHA1O1xuICAgICAgICAgICAgICAgIHY2ID0gcDY7XG4gICAgICAgICAgICAgICAgdjcgPSBwNztcbiAgICAgICAgICAgICAgICB2OCA9IHA4O1xuICAgICAgICAgICAgICAgIHY5ID0gcDk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4ocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldEJpbmRpbmdEZWJ1Z0luZm9Gb3JDaGFuZ2VzKHJlbmRlcmVyLCBlbCwgY2hhbmdlcykge1xuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgc2V0QmluZGluZ0RlYnVnSW5mbyhyZW5kZXJlciwgZWwsIHByb3BOYW1lLCBjaGFuZ2VzW3Byb3BOYW1lXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lXG4gICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0QmluZGluZ0RlYnVnSW5mbyhyZW5kZXJlciwgZWwsIHByb3BOYW1lLCB2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QmluZGluZ0RlYnVnSW5mbyhlbCwgXCJuZy1yZWZsZWN0LVwiICsgY2FtZWxDYXNlVG9EYXNoQ2FzZShwcm9wTmFtZSksIHZhbHVlID8gdmFsdWUudG9TdHJpbmcoKSA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRCaW5kaW5nRGVidWdJbmZvKGVsLCBcIm5nLXJlZmxlY3QtXCIgKyBjYW1lbENhc2VUb0Rhc2hDYXNlKHByb3BOYW1lKSwgJ1tFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvKFtBLVpdKS9nO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gaW5wdXRcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhbWVsQ2FzZVRvRGFzaENhc2UoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoQ0FNRUxfQ0FTRV9SRUdFWFAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIG1bX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJy0nICsgbVsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7P30gcGFyZW50RWxlbWVudFxuICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAqIEBwYXJhbSB7P30gYXR0cnNcbiAgICAgKiBAcGFyYW0gez89fSBkZWJ1Z0luZm9cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckVsZW1lbnQocmVuZGVyZXIsIHBhcmVudEVsZW1lbnQsIG5hbWUsIGF0dHJzLCBkZWJ1Z0luZm8pIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWwgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KHBhcmVudEVsZW1lbnQsIG5hbWUsIGRlYnVnSW5mbyk7XG4gICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZShlbCwgYXR0cnMuZ2V0KGkpLCBhdHRycy5nZXQoaSArIDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnROYW1lXG4gICAgICogQHBhcmFtIHs/fSBhdHRyc1xuICAgICAqIEBwYXJhbSB7P30gcm9vdFNlbGVjdG9yT3JOb2RlXG4gICAgICogQHBhcmFtIHs/PX0gZGVidWdJbmZvXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZWxlY3RPckNyZWF0ZVJlbmRlckhvc3RFbGVtZW50KHJlbmRlcmVyLCBlbGVtZW50TmFtZSwgYXR0cnMsIHJvb3RTZWxlY3Rvck9yTm9kZSwgZGVidWdJbmZvKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhvc3RFbGVtZW50O1xuICAgICAgICBpZiAoaXNQcmVzZW50KHJvb3RTZWxlY3Rvck9yTm9kZSkpIHtcbiAgICAgICAgICAgIGhvc3RFbGVtZW50ID0gcmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQocm9vdFNlbGVjdG9yT3JOb2RlLCBkZWJ1Z0luZm8pO1xuICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZShob3N0RWxlbWVudCwgYXR0cnMuZ2V0KGkpLCBhdHRycy5nZXQoaSArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcmVyLnNldEVsZW1lbnRBdHRyaWJ1dGUoaG9zdEVsZW1lbnQsICduZy12ZXJzaW9uJywgVkVSU0lPTi5mdWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhvc3RFbGVtZW50ID0gY3JlYXRlUmVuZGVyRWxlbWVudChyZW5kZXJlciwgbnVsbCwgZWxlbWVudE5hbWUsIGF0dHJzLCBkZWJ1Z0luZm8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3N0RWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB2aWV3XG4gICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVzQW5kVGFyZ2V0c1xuICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1YnNjcmliZVRvUmVuZGVyRWxlbWVudCh2aWV3LCBlbGVtZW50LCBldmVudE5hbWVzQW5kVGFyZ2V0cywgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGlzcG9zYWJsZXMgPSBjcmVhdGVFbXB0eUlubGluZUFycmF5KGV2ZW50TmFtZXNBbmRUYXJnZXRzLmxlbmd0aCAvIDIpO1xuICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgZXZlbnROYW1lc0FuZFRhcmdldHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNBbmRUYXJnZXRzLmdldChpKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50VGFyZ2V0ID0gZXZlbnROYW1lc0FuZFRhcmdldHMuZ2V0KGkgKyAxKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpc3Bvc2FibGUgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoZXZlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBkaXNwb3NhYmxlID0gdmlldy5yZW5kZXJlci5saXN0ZW5HbG9iYWwoZXZlbnRUYXJnZXQsIGV2ZW50TmFtZSwgbGlzdGVuZXIuYmluZCh2aWV3LCBldmVudFRhcmdldCArIFwiOlwiICsgZXZlbnROYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXNwb3NhYmxlID0gdmlldy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgZXZlbnROYW1lLCBsaXN0ZW5lci5iaW5kKHZpZXcsIGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcG9zYWJsZXMuc2V0KGkgLyAyLCBkaXNwb3NhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlzcG9zZUlubGluZUFycmF5LmJpbmQobnVsbCwgZGlzcG9zYWJsZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGRpc3Bvc2FibGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaXNwb3NlSW5saW5lQXJyYXkoZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGRpc3Bvc2FibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBkaXNwb3NhYmxlcy5nZXQoaSkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGxlbmd0aFxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRW1wdHlJbmxpbmVBcnJheShsZW5ndGgpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3RvcjtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICBjdG9yID0gSW5saW5lQXJyYXkyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICBjdG9yID0gSW5saW5lQXJyYXk0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA4KSB7XG4gICAgICAgICAgICBjdG9yID0gSW5saW5lQXJyYXk4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA8PSAxNikge1xuICAgICAgICAgICAgY3RvciA9IElubGluZUFycmF5MTY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdG9yID0gSW5saW5lQXJyYXlEeW5hbWljO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgY3RvcihsZW5ndGgpO1xuICAgIH1cbiAgICB2YXIgSW5saW5lQXJyYXkwID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSW5saW5lQXJyYXkwKCkge1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsgfTtcbiAgICAgICAgcmV0dXJuIElubGluZUFycmF5MDtcbiAgICB9KCkpO1xuICAgIHZhciBJbmxpbmVBcnJheTIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBsZW5ndGhcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YwXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSW5saW5lQXJyYXkyKGxlbmd0aCwgX3YwLCBfdjEpIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fdjAgPSBfdjA7XG4gICAgICAgICAgICB0aGlzLl92MSA9IF92MTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSW5saW5lQXJyYXkyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MDtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YwID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjEgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBJbmxpbmVBcnJheTI7XG4gICAgfSgpKTtcbiAgICB2YXIgSW5saW5lQXJyYXk0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbGVuZ3RoXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MFxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjFcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YyXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92M1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSW5saW5lQXJyYXk0KGxlbmd0aCwgX3YwLCBfdjEsIF92MiwgX3YzKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX3YwID0gX3YwO1xuICAgICAgICAgICAgdGhpcy5fdjEgPSBfdjE7XG4gICAgICAgICAgICB0aGlzLl92MiA9IF92MjtcbiAgICAgICAgICAgIHRoaXMuX3YzID0gX3YzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YwO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YxO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YyO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YzO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIElubGluZUFycmF5NC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuICAgICAgICAgICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjAgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBJbmxpbmVBcnJheTQ7XG4gICAgfSgpKTtcbiAgICB2YXIgSW5saW5lQXJyYXk4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbGVuZ3RoXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MFxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjFcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YyXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92M1xuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjRcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3Y1XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92NlxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjdcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIElubGluZUFycmF5OChsZW5ndGgsIF92MCwgX3YxLCBfdjIsIF92MywgX3Y0LCBfdjUsIF92NiwgX3Y3KSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX3YwID0gX3YwO1xuICAgICAgICAgICAgdGhpcy5fdjEgPSBfdjE7XG4gICAgICAgICAgICB0aGlzLl92MiA9IF92MjtcbiAgICAgICAgICAgIHRoaXMuX3YzID0gX3YzO1xuICAgICAgICAgICAgdGhpcy5fdjQgPSBfdjQ7XG4gICAgICAgICAgICB0aGlzLl92NSA9IF92NTtcbiAgICAgICAgICAgIHRoaXMuX3Y2ID0gX3Y2O1xuICAgICAgICAgICAgdGhpcy5fdjcgPSBfdjc7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIElubGluZUFycmF5OC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjA7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjE7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjI7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjM7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjU7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjY7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSW5saW5lQXJyYXk4LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YxID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Y0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92NiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Y3ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gSW5saW5lQXJyYXk4O1xuICAgIH0oKSk7XG4gICAgdmFyIElubGluZUFycmF5MTYgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBsZW5ndGhcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YwXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MVxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjJcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YzXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92NFxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjVcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3Y2XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92N1xuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjhcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3Y5XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MTBcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YxMVxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjEyXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IF92MTNcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX3YxNFxuICAgICAgICAgKiBAcGFyYW0gez89fSBfdjE1XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBJbmxpbmVBcnJheTE2KGxlbmd0aCwgX3YwLCBfdjEsIF92MiwgX3YzLCBfdjQsIF92NSwgX3Y2LCBfdjcsIF92OCwgX3Y5LCBfdjEwLCBfdjExLCBfdjEyLCBfdjEzLCBfdjE0LCBfdjE1KSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX3YwID0gX3YwO1xuICAgICAgICAgICAgdGhpcy5fdjEgPSBfdjE7XG4gICAgICAgICAgICB0aGlzLl92MiA9IF92MjtcbiAgICAgICAgICAgIHRoaXMuX3YzID0gX3YzO1xuICAgICAgICAgICAgdGhpcy5fdjQgPSBfdjQ7XG4gICAgICAgICAgICB0aGlzLl92NSA9IF92NTtcbiAgICAgICAgICAgIHRoaXMuX3Y2ID0gX3Y2O1xuICAgICAgICAgICAgdGhpcy5fdjcgPSBfdjc7XG4gICAgICAgICAgICB0aGlzLl92OCA9IF92ODtcbiAgICAgICAgICAgIHRoaXMuX3Y5ID0gX3Y5O1xuICAgICAgICAgICAgdGhpcy5fdjEwID0gX3YxMDtcbiAgICAgICAgICAgIHRoaXMuX3YxMSA9IF92MTE7XG4gICAgICAgICAgICB0aGlzLl92MTIgPSBfdjEyO1xuICAgICAgICAgICAgdGhpcy5fdjEzID0gX3YxMztcbiAgICAgICAgICAgIHRoaXMuX3YxNCA9IF92MTQ7XG4gICAgICAgICAgICB0aGlzLl92MTUgPSBfdjE1O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTE2LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MDtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MjtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92NDtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92NTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92NjtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92NztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92ODtcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92OTtcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjEwO1xuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MTE7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YxMjtcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdjEzO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92MTQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3YxNTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheTE2LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YxID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Y0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92NiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Y3ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjggPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92OSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MTAgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjExID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YxMiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92MTMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdjE0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3YxNSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIElubGluZUFycmF5MTY7XG4gICAgfSgpKTtcbiAgICB2YXIgSW5saW5lQXJyYXlEeW5hbWljID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbGVuZ3RoXG4gICAgICAgICAqIEBwYXJhbSB7Li4uP30gdmFsdWVzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBJbmxpbmVBcnJheUR5bmFtaWMobGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHZhbHVlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJbmxpbmVBcnJheUR5bmFtaWMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkgeyByZXR1cm4gdGhpcy5fdmFsdWVzW2luZGV4XTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSW5saW5lQXJyYXlEeW5hbWljLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7IHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsgfTtcbiAgICAgICAgcmV0dXJuIElubGluZUFycmF5RHluYW1pYztcbiAgICB9KCkpO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEVNUFRZX0lOTElORV9BUlJBWSA9IG5ldyBJbmxpbmVBcnJheTAoKTtcblxuXG4gICAgdmFyIHZpZXdfdXRpbHMgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgVmlld1V0aWxzOiBWaWV3VXRpbHMsXG4gICAgICAgIGNyZWF0ZVJlbmRlckNvbXBvbmVudFR5cGU6IGNyZWF0ZVJlbmRlckNvbXBvbmVudFR5cGUsXG4gICAgICAgIGFkZFRvQXJyYXk6IGFkZFRvQXJyYXksXG4gICAgICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZSxcbiAgICAgICAgaW5saW5lSW50ZXJwb2xhdGU6IGlubGluZUludGVycG9sYXRlLFxuICAgICAgICBjaGVja0JpbmRpbmc6IGNoZWNrQmluZGluZyxcbiAgICAgICAgY2FzdEJ5VmFsdWU6IGNhc3RCeVZhbHVlLFxuICAgICAgICBFTVBUWV9BUlJBWTogRU1QVFlfQVJSQVksXG4gICAgICAgIEVNUFRZX01BUDogRU1QVFlfTUFQLFxuICAgICAgICBwdXJlUHJveHkxOiBwdXJlUHJveHkxLFxuICAgICAgICBwdXJlUHJveHkyOiBwdXJlUHJveHkyLFxuICAgICAgICBwdXJlUHJveHkzOiBwdXJlUHJveHkzLFxuICAgICAgICBwdXJlUHJveHk0OiBwdXJlUHJveHk0LFxuICAgICAgICBwdXJlUHJveHk1OiBwdXJlUHJveHk1LFxuICAgICAgICBwdXJlUHJveHk2OiBwdXJlUHJveHk2LFxuICAgICAgICBwdXJlUHJveHk3OiBwdXJlUHJveHk3LFxuICAgICAgICBwdXJlUHJveHk4OiBwdXJlUHJveHk4LFxuICAgICAgICBwdXJlUHJveHk5OiBwdXJlUHJveHk5LFxuICAgICAgICBwdXJlUHJveHkxMDogcHVyZVByb3h5MTAsXG4gICAgICAgIHNldEJpbmRpbmdEZWJ1Z0luZm9Gb3JDaGFuZ2VzOiBzZXRCaW5kaW5nRGVidWdJbmZvRm9yQ2hhbmdlcyxcbiAgICAgICAgc2V0QmluZGluZ0RlYnVnSW5mbzogc2V0QmluZGluZ0RlYnVnSW5mbyxcbiAgICAgICAgY3JlYXRlUmVuZGVyRWxlbWVudDogY3JlYXRlUmVuZGVyRWxlbWVudCxcbiAgICAgICAgc2VsZWN0T3JDcmVhdGVSZW5kZXJIb3N0RWxlbWVudDogc2VsZWN0T3JDcmVhdGVSZW5kZXJIb3N0RWxlbWVudCxcbiAgICAgICAgc3Vic2NyaWJlVG9SZW5kZXJFbGVtZW50OiBzdWJzY3JpYmVUb1JlbmRlckVsZW1lbnQsXG4gICAgICAgIG5vb3A6IG5vb3AsXG4gICAgICAgIElubGluZUFycmF5MjogSW5saW5lQXJyYXkyLFxuICAgICAgICBJbmxpbmVBcnJheTQ6IElubGluZUFycmF5NCxcbiAgICAgICAgSW5saW5lQXJyYXk4OiBJbmxpbmVBcnJheTgsXG4gICAgICAgIElubGluZUFycmF5MTY6IElubGluZUFycmF5MTYsXG4gICAgICAgIElubGluZUFycmF5RHluYW1pYzogSW5saW5lQXJyYXlEeW5hbWljLFxuICAgICAgICBFTVBUWV9JTkxJTkVfQVJSQVk6IEVNUFRZX0lOTElORV9BUlJBWVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkNSA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqICBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIGEge0BsaW5rIENvbXBvbmVudEZhY3Rvcnl9LlxuICAgICAgKiAqXG4gICAgICAqIGBDb21wb25lbnRSZWZgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgQ29tcG9uZW50IEluc3RhbmNlIGFzIHdlbGwgb3RoZXIgb2JqZWN0cyByZWxhdGVkIHRvIHRoaXNcbiAgICAgICogQ29tcG9uZW50IEluc3RhbmNlIGFuZCBhbGxvd3MgeW91IHRvIGRlc3Ryb3kgdGhlIENvbXBvbmVudCBJbnN0YW5jZSB2aWEgdGhlIHtAbGluayAjZGVzdHJveX1cbiAgICAgICogbWV0aG9kLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBDb21wb25lbnRSZWYgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBDb21wb25lbnRSZWYoKSB7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZi5wcm90b3R5cGUsIFwibG9jYXRpb25cIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgTG9jYXRpb24gb2YgdGhlIEhvc3QgRWxlbWVudCBvZiB0aGlzIENvbXBvbmVudCBJbnN0YW5jZS5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZi5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgVGhlIGluamVjdG9yIG9uIHdoaWNoIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgZXhpc3RzLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50UmVmLnByb3RvdHlwZSwgXCJpbnN0YW5jZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBUaGUgaW5zdGFuY2Ugb2YgdGhlIENvbXBvbmVudC5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50UmVmLnByb3RvdHlwZSwgXCJob3N0Vmlld1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBUaGUge0BsaW5rIFZpZXdSZWZ9IG9mIHRoZSBIb3N0IFZpZXcgb2YgdGhpcyBDb21wb25lbnQgaW5zdGFuY2UuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZi5wcm90b3R5cGUsIFwiY2hhbmdlRGV0ZWN0b3JSZWZcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgVGhlIHtAbGluayBDaGFuZ2VEZXRlY3RvclJlZn0gb2YgdGhlIENvbXBvbmVudCBpbnN0YW5jZS5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZi5wcm90b3R5cGUsIFwiY29tcG9uZW50VHlwZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBUaGUgY29tcG9uZW50IHR5cGUuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgRGVzdHJveXMgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgYWxsIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGl0LlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBvbmVudFJlZi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBBbGxvd3MgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDb21wb25lbnRSZWYucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyB9O1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50UmVmO1xuICAgIH0oKSk7XG4gICAgdmFyIENvbXBvbmVudFJlZl8gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkNShDb21wb25lbnRSZWZfLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5kZXhcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Vmlld1xuICAgICAgICAgKiBAcGFyYW0gez99IF9uYXRpdmVFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gX2NvbXBvbmVudFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ29tcG9uZW50UmVmXyhfaW5kZXgsIF9wYXJlbnRWaWV3LCBfbmF0aXZlRWxlbWVudCwgX2NvbXBvbmVudCkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbmRleCA9IF9pbmRleDtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudFZpZXcgPSBfcGFyZW50VmlldztcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUVsZW1lbnQgPSBfbmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudCA9IF9jb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZl8ucHJvdG90eXBlLCBcImxvY2F0aW9uXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRWxlbWVudFJlZih0aGlzLl9uYXRpdmVFbGVtZW50KTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnRSZWZfLnByb3RvdHlwZSwgXCJpbmplY3RvclwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Vmlldy5pbmplY3Rvcih0aGlzLl9pbmRleCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50UmVmXy5wcm90b3R5cGUsIFwiaW5zdGFuY2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZl8ucHJvdG90eXBlLCBcImhvc3RWaWV3XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wYXJlbnRWaWV3LnJlZjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZl8ucHJvdG90eXBlLCBcImNoYW5nZURldGVjdG9yUmVmXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wYXJlbnRWaWV3LnJlZjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZl8ucHJvdG90eXBlLCBcImNvbXBvbmVudFR5cGVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLl9jb21wb25lbnQuY29uc3RydWN0b3IpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDb21wb25lbnRSZWZfLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wYXJlbnRWaWV3LmRldGFjaEFuZERlc3Ryb3koKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvbXBvbmVudFJlZl8ucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyB0aGlzLmhvc3RWaWV3Lm9uRGVzdHJveShjYWxsYmFjayk7IH07XG4gICAgICAgIHJldHVybiBDb21wb25lbnRSZWZfO1xuICAgIH0oQ29tcG9uZW50UmVmKSk7XG4gICAgLyoqXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIHZhciBDb21wb25lbnRGYWN0b3J5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld0NsYXNzXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2NvbXBvbmVudFR5cGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3Rvcnkoc2VsZWN0b3IsIF92aWV3Q2xhc3MsIF9jb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q2xhc3MgPSBfdmlld0NsYXNzO1xuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IF9jb21wb25lbnRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnRGYWN0b3J5LnByb3RvdHlwZSwgXCJjb21wb25lbnRUeXBlXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRUeXBlOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDcmVhdGVzIGEgbmV3IGNvbXBvbmVudC5cbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IHJvb3RTZWxlY3Rvck9yTm9kZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29tcG9uZW50RmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzLCByb290U2VsZWN0b3JPck5vZGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0YWJsZU5vZGVzID09PSB2b2lkIDApIHsgcHJvamVjdGFibGVOb2RlcyA9IG51bGw7IH1cbiAgICAgICAgICAgIGlmIChyb290U2VsZWN0b3JPck5vZGUgPT09IHZvaWQgMCkgeyByb290U2VsZWN0b3JPck5vZGUgPSBudWxsOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2dSA9IGluamVjdG9yLmdldChWaWV3VXRpbHMpO1xuICAgICAgICAgICAgaWYgKCFwcm9qZWN0YWJsZU5vZGVzKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGFibGVOb2RlcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaG9zdFZpZXcgPSBuZXcgdGhpcy5fdmlld0NsYXNzKHZ1LCBudWxsLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybiBob3N0Vmlldy5jcmVhdGVIb3N0Vmlldyhyb290U2VsZWN0b3JPck5vZGUsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudEZhY3Rvcnk7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDggPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAc3RhYmxlXG4gICAgICovXG4gICAgdmFyIE5vQ29tcG9uZW50RmFjdG9yeUVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDgoTm9Db21wb25lbnRGYWN0b3J5RXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIk5vIGNvbXBvbmVudCBmYWN0b3J5IGZvdW5kIGZvciBcIiArIHN0cmluZ2lmeShjb21wb25lbnQpICsgXCIuIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/XCIpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE5vQ29tcG9uZW50RmFjdG9yeUVycm9yO1xuICAgIH0oQmFzZUVycm9yKSk7XG4gICAgdmFyIF9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gX051bGxDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmVDb21wb25lbnRGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbXBvbmVudCkgeyB9O1xuICAgICAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIuTlVMTCA9IG5ldyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpO1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgIH0oKSk7XG4gICAgdmFyIENvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXNcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKGZhY3RvcmllcywgX3BhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgICAgIHRoaXMuX2ZhY3RvcmllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3JpZXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFjdG9yaWVzLnNldChmYWN0b3J5LmNvbXBvbmVudFR5cGUsIGZhY3RvcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLl9mYWN0b3JpZXMuZ2V0KGNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX3BhcmVudC5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG4gICAgfSgpKTtcblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIHRyYWNlO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIGV2ZW50cztcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRldGVjdFdURigpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd3RmID0gKChnbG9iYWwkMSkgLyoqIFRPRE8gIzkxMDAgKi8pWyd3dGYnXTtcbiAgICAgICAgaWYgKHd0Zikge1xuICAgICAgICAgICAgdHJhY2UgPSB3dGZbJ3RyYWNlJ107XG4gICAgICAgICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgICAgICAgICBldmVudHMgPSB0cmFjZVsnZXZlbnRzJ107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHNpZ25hdHVyZVxuICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZShzaWduYXR1cmUsIGZsYWdzKSB7XG4gICAgICAgIGlmIChmbGFncyA9PT0gdm9pZCAwKSB7IGZsYWdzID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gZXZlbnRzLmNyZWF0ZVNjb3BlKHNpZ25hdHVyZSwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHNjb3BlXG4gICAgICogQHBhcmFtIHs/PX0gcmV0dXJuVmFsdWVcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxlYXZlKHNjb3BlLCByZXR1cm5WYWx1ZSkge1xuICAgICAgICB0cmFjZS5sZWF2ZVNjb3BlKHNjb3BlLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSByYW5nZVR5cGVcbiAgICAgKiBAcGFyYW0gez99IGFjdGlvblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRUaW1lUmFuZ2UocmFuZ2VUeXBlLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNlLmJlZ2luVGltZVJhbmdlKHJhbmdlVHlwZSwgYWN0aW9uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSByYW5nZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kVGltZVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIHRyYWNlLmVuZFRpbWVSYW5nZShyYW5nZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiBXVEYgaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3dGZFbmFibGVkID0gZGV0ZWN0V1RGKCk7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/PX0gYXJnMFxuICAgICAqIEBwYXJhbSB7Pz19IGFyZzFcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3BTY29wZShhcmcwLCBhcmcxKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgdHJhY2Ugc2NvcGUuXG4gICAgICpcbiAgICAgKiBTY29wZXMgbXVzdCBiZSBzdHJpY3RseSBuZXN0ZWQgYW5kIGFyZSBhbmFsb2dvdXMgdG8gc3RhY2sgZnJhbWVzLCBidXRcbiAgICAgKiBkbyBub3QgaGF2ZSB0byBmb2xsb3cgdGhlIHN0YWNrIGZyYW1lcy4gSW5zdGVhZCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZXkgZm9sbG93IGxvZ2ljYWxcbiAgICAgKiBuZXN0aW5nLiBZb3UgbWF5IHdhbnQgdG8gdXNlXG4gICAgICogW0V2ZW50XG4gICAgICogU2lnbmF0dXJlc10oaHR0cDovL2dvb2dsZS5naXRodWIuaW8vdHJhY2luZy1mcmFtZXdvcmsvaW5zdHJ1bWVudGluZy1jb2RlLmh0bWwjY3VzdG9tLWV2ZW50cylcbiAgICAgKiBhcyB0aGV5IGFyZSBkZWZpbmVkIGluIFdURi5cbiAgICAgKlxuICAgICAqIFVzZWQgdG8gbWFyayBzY29wZSBlbnRyeS4gVGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkIHRvIGxlYXZlIHRoZSBzY29wZS5cbiAgICAgKlxuICAgICAqICAgICB2YXIgbXlTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdNeUNsYXNzI215TWV0aG9kKGFzY2lpIHNvbWVWYWwpJyk7XG4gICAgICpcbiAgICAgKiAgICAgc29tZU1ldGhvZCgpIHtcbiAgICAgKiAgICAgICAgdmFyIHMgPSBteVNjb3BlKCdGb28nKTsgLy8gJ0ZvbycgZ2V0cyBzdG9yZWQgaW4gdHJhY2luZyBVSVxuICAgICAqICAgICAgICAvLyBETyBTT01FIFdPUksgSEVSRVxuICAgICAqICAgICAgICByZXR1cm4gd3RmTGVhdmUocywgMTIzKTsgLy8gUmV0dXJuIHZhbHVlIDEyM1xuICAgICAqICAgICB9XG4gICAgICpcbiAgICAgKiBOb3RlLCBhZGRpbmcgdHJ5LWZpbmFsbHkgYmxvY2sgYXJvdW5kIHRoZSB3b3JrIHRvIGVuc3VyZSB0aGF0IGB3dGZMZWF2ZWAgZ2V0cyBjYWxsZWQgY2FuXG4gICAgICogbmVnYXRpdmVseSBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiB3ZSByZWNvbW1lbmQgdGhhdFxuICAgICAqIHlvdSBkb24ndCBhZGQgdGhlbSB0byBlbnN1cmUgdGhhdCBgd3RmTGVhdmVgIGdldHMgY2FsbGVkLiBJbiBwcm9kdWN0aW9uIGB3dGZMZWF2ZWAgaXMgYSBub29wIGFuZFxuICAgICAqIHNvIHRyeS1maW5hbGx5IGJsb2NrIGhhcyBubyB2YWx1ZS4gV2hlbiBkZWJ1Z2dpbmcgcGVyZiBpc3N1ZXMsIHNraXBwaW5nIGB3dGZMZWF2ZWAsIGRvIHRvXG4gICAgICogZXhjZXB0aW9uLCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHRyYWNlLCBidXQgcHJlc2VuY2Ugb2YgZXhjZXB0aW9uIHNpZ25pZmllcyBsb2dpYyBlcnJvciB3aGljaFxuICAgICAqIG5lZWRzIHRvIGJlIGZpeGVkIGJlZm9yZSB0aGUgYXBwIHNob3VsZCBiZSBwcm9maWxlZC4gQWRkIHRyeS1maW5hbGx5IG9ubHkgd2hlbiB5b3UgZXhwZWN0IHRoYXRcbiAgICAgKiBhbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24gd2hpbGUgcHJvZmlsaW5nLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIHd0ZkNyZWF0ZVNjb3BlID0gd3RmRW5hYmxlZCA/IGNyZWF0ZVNjb3BlIDogZnVuY3Rpb24gKHNpZ25hdHVyZSwgZmxhZ3MpIHsgcmV0dXJuIG5vb3BTY29wZTsgfTtcbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIG1hcmsgZW5kIG9mIFNjb3BlLlxuICAgICAqXG4gICAgICogLSBgc2NvcGVgIHRvIGVuZC5cbiAgICAgKiAtIGByZXR1cm5WYWx1ZWAgKG9wdGlvbmFsKSB0byBiZSBwYXNzZWQgdG8gdGhlIFdURi5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIGByZXR1cm5WYWx1ZSBmb3IgZWFzeSBjaGFpbmluZy5cbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd3RmTGVhdmUgPSB3dGZFbmFibGVkID8gbGVhdmUgOiBmdW5jdGlvbiAocywgcikgeyByZXR1cm4gcjsgfTtcbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIG1hcmsgQXN5bmMgc3RhcnQuIEFzeW5jIGFyZSBzaW1pbGFyIHRvIHNjb3BlIGJ1dCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgc3RyaWN0bHkgbmVzdGVkLlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCBpbiB0aGUgY2FsbCB0byBbZW5kQXN5bmNdLiBBc3luYyByYW5nZXMgb25seSB3b3JrIGlmIFdURiBoYXMgYmVlblxuICAgICAqIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiAgICAgc29tZU1ldGhvZCgpIHtcbiAgICAgKiAgICAgICAgdmFyIHMgPSB3dGZTdGFydFRpbWVSYW5nZSgnSFRUUDpHRVQnLCAnc29tZS51cmwnKTtcbiAgICAgKiAgICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmUuZGVsYXkoNSkudGhlbigoXykge1xuICAgICAqICAgICAgICAgIHd0ZkVuZFRpbWVSYW5nZShzKTtcbiAgICAgKiAgICAgICAgfSk7XG4gICAgICogICAgIH1cbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd3RmU3RhcnRUaW1lUmFuZ2UgPSB3dGZFbmFibGVkID8gc3RhcnRUaW1lUmFuZ2UgOiBmdW5jdGlvbiAocmFuZ2VUeXBlLCBhY3Rpb24pIHsgcmV0dXJuIG51bGw7IH07XG4gICAgLyoqXG4gICAgICogRW5kcyBhIGFzeW5jIHRpbWUgcmFuZ2Ugb3BlcmF0aW9uLlxuICAgICAqIFtyYW5nZV0gaXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFt3dGZTdGFydFRpbWVSYW5nZV0gQXN5bmMgcmFuZ2VzIG9ubHkgd29yayBpZiBXVEYgaGFzIGJlZW5cbiAgICAgKiBlbmFibGVkLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3dGZFbmRUaW1lUmFuZ2UgPSB3dGZFbmFibGVkID8gZW5kVGltZVJhbmdlIDogZnVuY3Rpb24gKHIpIHsgcmV0dXJuIG51bGw7IH07XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIFRlc3RhYmlsaXR5IHNlcnZpY2UgcHJvdmlkZXMgdGVzdGluZyBob29rcyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tXG4gICAgICAqIHRoZSBicm93c2VyIGFuZCBieSBzZXJ2aWNlcyBzdWNoIGFzIFByb3RyYWN0b3IuIEVhY2ggYm9vdHN0cmFwcGVkIEFuZ3VsYXJcbiAgICAgICogYXBwbGljYXRpb24gb24gdGhlIHBhZ2Ugd2lsbCBoYXZlIGFuIGluc3RhbmNlIG9mIFRlc3RhYmlsaXR5LlxuICAgICAqL1xuICAgIHZhciBUZXN0YWJpbGl0eSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFRlc3RhYmlsaXR5KF9uZ1pvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7XG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ291bnQgPSAwO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5faXNab25lU3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogV2hldGhlciBhbnkgd29yayB3YXMgZG9uZSBzaW5jZSB0aGUgbGFzdCAnd2hlblN0YWJsZScgY2FsbGJhY2suIFRoaXMgaXNcbiAgICAgICAgICAgICAqIHVzZWZ1bCB0byBkZXRlY3QgaWYgdGhpcyBjb3VsZCBoYXZlIHBvdGVudGlhbGx5IGRlc3RhYmlsaXplZCBhbm90aGVyXG4gICAgICAgICAgICAgKiBjb21wb25lbnQgd2hpbGUgaXQgaXMgc3RhYmlsaXppbmcuXG4gICAgICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5fZGlkV29yayA9IGZhbHNlO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICB0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS5fd2F0Y2hBbmd1bGFyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZGlkV29yayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9pc1pvbmVTdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX25nWm9uZS5vblN0YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9pc1pvbmVTdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmluY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCArPSAxO1xuICAgICAgICAgICAgdGhpcy5fZGlkV29yayA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50O1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS5kZWNyZWFzZVBlbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ291bnQgLT0gMTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwZW5kaW5nIGFzeW5jIHJlcXVlc3RzIGJlbG93IHplcm8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmlzU3RhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzWm9uZVN0YWJsZSAmJiB0aGlzLl9wZW5kaW5nQ291bnQgPT0gMCAmJiAhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS5fcnVuQ2FsbGJhY2tzSWZSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGVzIHRoZSBjYWxsIGJhY2tzIGluIGEgbmV3IGZyYW1lIHNvIHRoYXQgaXQgaXMgYWx3YXlzIGFzeW5jLlxuICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF90aGlzLl9jYWxsYmFja3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoX3RoaXMuX2NhbGxiYWNrcy5wb3AoKSkoX3RoaXMuX2RpZFdvcmspO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kaWRXb3JrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3QgUmVhZHlcbiAgICAgICAgICAgICAgICB0aGlzLl9kaWRXb3JrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS53aGVuU3RhYmxlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgICAgICB0aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmdldFBlbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZmluZFByb3ZpZGVyc1xuICAgICAgICAgKiBAcGFyYW0gez99IHVzaW5nXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJcbiAgICAgICAgICogQHBhcmFtIHs/fSBleGFjdE1hdGNoXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBUZXN0YWJpbGl0eS5wcm90b3R5cGUuZmluZEJpbmRpbmdzID0gZnVuY3Rpb24gKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgLy8gVE9ETyhqdWxpZW1yKTogaW1wbGVtZW50LlxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB1c2luZ1xuICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXhhY3RNYXRjaFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmZpbmRQcm92aWRlcnMgPSBmdW5jdGlvbiAodXNpbmcsIHByb3ZpZGVyLCBleGFjdE1hdGNoKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGp1bGllbXIpOiBpbXBsZW1lbnQuXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH07XG4gICAgICAgIFRlc3RhYmlsaXR5LmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIFRlc3RhYmlsaXR5LmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBOZ1pvbmUsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBUZXN0YWJpbGl0eTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBBIGdsb2JhbCByZWdpc3RyeSBvZiB7QGxpbmsgVGVzdGFiaWxpdHl9IGluc3RhbmNlcyBmb3Igc3BlY2lmaWMgZWxlbWVudHMuXG4gICAgICovXG4gICAgdmFyIFRlc3RhYmlsaXR5UmVnaXN0cnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBUZXN0YWJpbGl0eVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25zID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgX3Rlc3RhYmlsaXR5R2V0dGVyLmFkZFRvV2luZG93KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGVzdGFiaWxpdHlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkucHJvdG90eXBlLnJlZ2lzdGVyQXBwbGljYXRpb24gPSBmdW5jdGlvbiAodG9rZW4sIHRlc3RhYmlsaXR5KSB7XG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbnMuc2V0KHRva2VuLCB0ZXN0YWJpbGl0eSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkucHJvdG90eXBlLmdldFRlc3RhYmlsaXR5ID0gZnVuY3Rpb24gKGVsZW0pIHsgcmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9ucy5nZXQoZWxlbSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUuZ2V0QWxsVGVzdGFiaWxpdGllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLnZhbHVlcygpKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBUZXN0YWJpbGl0eVJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRBbGxSb290RWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2FwcGxpY2F0aW9ucy5rZXlzKCkpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGZpbmRJbkFuY2VzdG9yc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUuZmluZFRlc3RhYmlsaXR5SW5UcmVlID0gZnVuY3Rpb24gKGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICAgICAgaWYgKGZpbmRJbkFuY2VzdG9ycyA9PT0gdm9pZCAwKSB7IGZpbmRJbkFuY2VzdG9ycyA9IHRydWU7IH1cbiAgICAgICAgICAgIHJldHVybiBfdGVzdGFiaWxpdHlHZXR0ZXIuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHRoaXMsIGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7XG4gICAgICAgIH07XG4gICAgICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gVGVzdGFiaWxpdHlSZWdpc3RyeTtcbiAgICB9KCkpO1xuICAgIHZhciBfTm9vcEdldFRlc3RhYmlsaXR5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gX05vb3BHZXRUZXN0YWJpbGl0eSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWdpc3RyeVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgX05vb3BHZXRUZXN0YWJpbGl0eS5wcm90b3R5cGUuYWRkVG9XaW5kb3cgPSBmdW5jdGlvbiAocmVnaXN0cnkpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnlcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtXG4gICAgICAgICAqIEBwYXJhbSB7P30gZmluZEluQW5jZXN0b3JzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBfTm9vcEdldFRlc3RhYmlsaXR5LnByb3RvdHlwZS5maW5kVGVzdGFiaWxpdHlJblRyZWUgPSBmdW5jdGlvbiAocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfTm9vcEdldFRlc3RhYmlsaXR5O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIFNldCB0aGUge0BsaW5rIEdldFRlc3RhYmlsaXR5fSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoZSBBbmd1bGFyIHRlc3RpbmcgZnJhbWV3b3JrLlxuICAgICAqIEBwYXJhbSB7P30gZ2V0dGVyXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRUZXN0YWJpbGl0eUdldHRlcihnZXR0ZXIpIHtcbiAgICAgICAgX3Rlc3RhYmlsaXR5R2V0dGVyID0gZ2V0dGVyO1xuICAgIH1cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfdGVzdGFiaWxpdHlHZXR0ZXIgPSBuZXcgX05vb3BHZXRUZXN0YWJpbGl0eSgpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9kZXZNb2RlID0gdHJ1ZTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfcnVuTW9kZUxvY2tlZCA9IGZhbHNlO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9wbGF0Zm9ybTtcbiAgICAvKipcbiAgICAgKiAgRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyXG4gICAgICAqIGNoZWNrcyB3aXRoaW4gdGhlIGZyYW1ld29yay5cbiAgICAgICogKlxuICAgICAgKiBPbmUgaW1wb3J0YW50IGFzc2VydGlvbiB0aGlzIGRpc2FibGVzIHZlcmlmaWVzIHRoYXQgYSBjaGFuZ2UgZGV0ZWN0aW9uIHBhc3NcbiAgICAgICogZG9lcyBub3QgcmVzdWx0IGluIGFkZGl0aW9uYWwgY2hhbmdlcyB0byBhbnkgYmluZGluZ3MgKGFsc28ga25vd24gYXNcbiAgICAgICogdW5pZGlyZWN0aW9uYWwgZGF0YSBmbG93KS5cbiAgICAgICogKlxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5hYmxlUHJvZE1vZGUoKSB7XG4gICAgICAgIGlmIChfcnVuTW9kZUxvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4nKTtcbiAgICAgICAgfVxuICAgICAgICBfZGV2TW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB3aGV0aGVyIEFuZ3VsYXIgaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZS4gQWZ0ZXIgY2FsbGVkIG9uY2UsXG4gICAgICAqIHRoZSB2YWx1ZSBpcyBsb2NrZWQgYW5kIHdvbid0IGNoYW5nZSBhbnkgbW9yZS5cbiAgICAgICogKlxuICAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIHRydWUsIHVubGVzcyBhIHVzZXIgY2FsbHMgYGVuYWJsZVByb2RNb2RlYCBiZWZvcmUgY2FsbGluZyB0aGlzLlxuICAgICAgKiAqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gICAgICAgIF9ydW5Nb2RlTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF9kZXZNb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQSB0b2tlbiBmb3IgdGhpcmQtcGFydHkgY29tcG9uZW50cyB0aGF0IGNhbiByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggTmdQcm9iZS5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ1Byb2JlVG9rZW4gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE5nUHJvYmVUb2tlbihuYW1lLCB0b2tlbikge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmdQcm9iZVRva2VuO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYSBwbGF0Zm9ybS5cbiAgICAgICogUGxhdGZvcm1zIGhhdmUgdG8gYmUgZWFnZXJseSBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuICAgICAgKiAqXG4gICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGxhdGZvcm0oaW5qZWN0b3IpIHtcbiAgICAgICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBjYW4gYmUgb25seSBvbmUgcGxhdGZvcm0uIERlc3Ryb3kgdGhlIHByZXZpb3VzIG9uZSB0byBjcmVhdGUgYSBuZXcgb25lLicpO1xuICAgICAgICB9XG4gICAgICAgIF9wbGF0Zm9ybSA9IGluamVjdG9yLmdldChQbGF0Zm9ybVJlZik7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluaXRzID0gKGluamVjdG9yLmdldChQTEFURk9STV9JTklUSUFMSVpFUiwgbnVsbCkpO1xuICAgICAgICBpZiAoaW5pdHMpXG4gICAgICAgICAgICBpbml0cy5mb3JFYWNoKGZ1bmN0aW9uIChpbml0KSB7IHJldHVybiBpbml0KCk7IH0pO1xuICAgICAgICByZXR1cm4gX3BsYXRmb3JtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIGZhY3RvcnkgZm9yIGEgcGxhdGZvcm1cbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gcGFyZW50UGxhdGZvcm1GYWN0b3J5XG4gICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICogQHBhcmFtIHs/PX0gcHJvdmlkZXJzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybUZhY3RvcnkocGFyZW50UGxhdGZvcm1GYWN0b3J5LCBuYW1lLCBwcm92aWRlcnMpIHtcbiAgICAgICAgaWYgKHByb3ZpZGVycyA9PT0gdm9pZCAwKSB7IHByb3ZpZGVycyA9IFtdOyB9XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hcmtlciA9IG5ldyBPcGFxdWVUb2tlbihcIlBsYXRmb3JtOiBcIiArIG5hbWUpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV4dHJhUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmFQcm92aWRlcnMgPT09IHZvaWQgMCkgeyBleHRyYVByb3ZpZGVycyA9IFtdOyB9XG4gICAgICAgICAgICBpZiAoIWdldFBsYXRmb3JtKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UGxhdGZvcm1GYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFBsYXRmb3JtRmFjdG9yeShwcm92aWRlcnMuY29uY2F0KGV4dHJhUHJvdmlkZXJzKS5jb25jYXQoeyBwcm92aWRlOiBtYXJrZXIsIHVzZVZhbHVlOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBsYXRmb3JtKFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKHByb3ZpZGVycy5jb25jYXQoZXh0cmFQcm92aWRlcnMpLmNvbmNhdCh7IHByb3ZpZGU6IG1hcmtlciwgdXNlVmFsdWU6IHRydWUgfSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UGxhdGZvcm0obWFya2VyKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIENoZWNrcyB0aGF0IHRoZXJlIGN1cnJlbnRseSBpcyBhIHBsYXRmb3JtXG4gICAgICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBnaXZlbiB0b2tlbiBhcyBhIHByb3ZpZGVyLlxuICAgICAgKiAqXG4gICAgICogQHBhcmFtIHs/fSByZXF1aXJlZFRva2VuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NlcnRQbGF0Zm9ybShyZXF1aXJlZFRva2VuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXRmb3JtID0gZ2V0UGxhdGZvcm0oKTtcbiAgICAgICAgaWYgKCFwbGF0Zm9ybSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwbGF0Zm9ybSBleGlzdHMhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGF0Zm9ybS5pbmplY3Rvci5nZXQocmVxdWlyZWRUb2tlbiwgbnVsbCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBwbGF0Zm9ybSB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4gUGxlYXNlIGRlc3Ryb3kgaXQgZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBsYXRmb3JtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgRGVzdHJveSB0aGUgZXhpc3RpbmcgcGxhdGZvcm0uXG4gICAgICAqICpcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlc3Ryb3lQbGF0Zm9ybSgpIHtcbiAgICAgICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgX3BsYXRmb3JtLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAgICAgICogKlxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UGxhdGZvcm0oKSB7XG4gICAgICAgIHJldHVybiBfcGxhdGZvcm0gJiYgIV9wbGF0Zm9ybS5kZXN0cm95ZWQgPyBfcGxhdGZvcm0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIEFuZ3VsYXIgcGxhdGZvcm0gaXMgdGhlIGVudHJ5IHBvaW50IGZvciBBbmd1bGFyIG9uIGEgd2ViIHBhZ2UuIEVhY2ggcGFnZVxuICAgICAgKiBoYXMgZXhhY3RseSBvbmUgcGxhdGZvcm0sIGFuZCBzZXJ2aWNlcyAoc3VjaCBhcyByZWZsZWN0aW9uKSB3aGljaCBhcmUgY29tbW9uXG4gICAgICAqIHRvIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiB0aGUgcGFnZSBhcmUgYm91bmQgaW4gaXRzIHNjb3BlLlxuICAgICAgKiAqXG4gICAgICAqIEEgcGFnZSdzIHBsYXRmb3JtIGlzIGluaXRpYWxpemVkIGltcGxpY2l0bHkgd2hlbiB7QGxpbmsgYm9vdHN0cmFwfSgpIGlzIGNhbGxlZCwgb3JcbiAgICAgICogZXhwbGljaXRseSBieSBjYWxsaW5nIHtAbGluayBjcmVhdGVQbGF0Zm9ybX0oKS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBQbGF0Zm9ybVJlZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFBsYXRmb3JtUmVmKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgQE5nTW9kdWxlYCBmb3IgdGhlIGdpdmVuIHBsYXRmb3JtXG4gICAgICAgICAgKiBmb3Igb2ZmbGluZSBjb21waWxhdGlvbi5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIFNpbXBsZSBFeGFtcGxlXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBteV9tb2R1bGUudHM6XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV1cbiAgICAgICAgICAqIH0pXG4gICAgICAgICAgKiBjbGFzcyBNeU1vZHVsZSB7fVxuICAgICAgICAgICogKlxuICAgICAgICAgICogbWFpbi50czpcbiAgICAgICAgICAqIGltcG9ydCB7TXlNb2R1bGVOZ0ZhY3Rvcnl9IGZyb20gJy4vbXlfbW9kdWxlLm5nZmFjdG9yeSc7XG4gICAgICAgICAgKiBpbXBvcnQge3BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBsZXQgbW9kdWxlUmVmID0gcGxhdGZvcm1Ccm93c2VyKCkuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShNeU1vZHVsZU5nRmFjdG9yeSk7XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICAqICpcbiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVGYWN0b3J5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybVJlZi5wcm90b3R5cGUuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIChtb2R1bGVGYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyB1bmltcGxlbWVudGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgQE5nTW9kdWxlYCBmb3IgYSBnaXZlbiBwbGF0Zm9ybSB1c2luZyB0aGUgZ2l2ZW4gcnVudGltZSBjb21waWxlci5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIFNpbXBsZSBFeGFtcGxlXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV1cbiAgICAgICAgICAqIH0pXG4gICAgICAgICAgKiBjbGFzcyBNeU1vZHVsZSB7fVxuICAgICAgICAgICogKlxuICAgICAgICAgICogbGV0IG1vZHVsZVJlZiA9IHBsYXRmb3JtQnJvd3NlcigpLmJvb3RzdHJhcE1vZHVsZShNeU1vZHVsZSk7XG4gICAgICAgICAgKiBgYGBcbiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbXBpbGVyT3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGxhdGZvcm1SZWYucHJvdG90eXBlLmJvb3RzdHJhcE1vZHVsZSA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlLCBjb21waWxlck9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChjb21waWxlck9wdGlvbnMgPT09IHZvaWQgMCkgeyBjb21waWxlck9wdGlvbnMgPSBbXTsgfVxuICAgICAgICAgICAgdGhyb3cgdW5pbXBsZW1lbnRlZCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHBsYXRmb3JtIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFja1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGxhdGZvcm1SZWYucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxhdGZvcm1SZWYucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB7QGxpbmsgSW5qZWN0b3J9LCB3aGljaCBpcyB0aGUgcGFyZW50IGluamVjdG9yIGZvclxuICAgICAgICAgICAgICAqIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gb24gdGhlIHBhZ2UgYW5kIHByb3ZpZGVzIHNpbmdsZXRvbiBwcm92aWRlcnMuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgO1xuICAgICAgICAvKipcbiAgICAgICAgICogIERlc3Ryb3kgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gYW5kIGFsbCBBbmd1bGFyIGFwcGxpY2F0aW9ucyBvbiB0aGUgcGFnZS5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybVJlZi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsYXRmb3JtUmVmLnByb3RvdHlwZSwgXCJkZXN0cm95ZWRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtUmVmO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXJcbiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfY2FsbEFuZFJlcG9ydFRvRXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlciwgY2FsbGJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0aHJvdyBhcyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgbWlnaHQgbm90IGRvIGl0XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7XG4gICAgICAgICAgICAvLyByZXRocm93IGFzIHRoZSBleGNlcHRpb24gaGFuZGxlciBtaWdodCBub3QgZG8gaXRcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIFBsYXRmb3JtUmVmXyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQzKFBsYXRmb3JtUmVmXywgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBQbGF0Zm9ybVJlZl8oX2luamVjdG9yKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yO1xuICAgICAgICAgICAgdGhpcy5fbW9kdWxlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBsYXRmb3JtUmVmXy5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7IH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQbGF0Zm9ybVJlZl8ucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9pbmplY3RvcjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQbGF0Zm9ybVJlZl8ucHJvdG90eXBlLCBcImRlc3Ryb3llZFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVzdHJveWVkOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybVJlZl8ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tb2R1bGVzLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbiAobW9kdWxlKSB7IHJldHVybiBtb2R1bGUuZGVzdHJveSgpOyB9KTtcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKCk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlRmFjdG9yeVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGxhdGZvcm1SZWZfLnByb3RvdHlwZS5ib290c3RyYXBNb2R1bGVGYWN0b3J5ID0gZnVuY3Rpb24gKG1vZHVsZUZhY3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ib290c3RyYXBNb2R1bGVGYWN0b3J5V2l0aFpvbmUobW9kdWxlRmFjdG9yeSwgbnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZUZhY3RvcnlcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1pvbmVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBsYXRmb3JtUmVmXy5wcm90b3R5cGUuX2Jvb3RzdHJhcE1vZHVsZUZhY3RvcnlXaXRoWm9uZSA9IGZ1bmN0aW9uIChtb2R1bGVGYWN0b3J5LCBuZ1pvbmUpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBOb3RlOiBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgTmdab25lIF9iZWZvcmVfIHdlIGluc3RhbnRpYXRlIHRoZSBtb2R1bGUsXG4gICAgICAgICAgICAvLyBhcyBpbnN0YW50aWF0aW5nIHRoZSBtb2R1bGUgY3JlYXRlcyBzb21lIHByb3ZpZGVycyBlYWdlcmx5LlxuICAgICAgICAgICAgLy8gU28gd2UgY3JlYXRlIGEgbWluaSBwYXJlbnQgaW5qZWN0b3IgdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBuZXcgTmdab25lIGFuZFxuICAgICAgICAgICAgLy8gcGFzcyB0aGF0IGFzIHBhcmVudCB0byB0aGUgTmdNb2R1bGVGYWN0b3J5LlxuICAgICAgICAgICAgaWYgKCFuZ1pvbmUpXG4gICAgICAgICAgICAgICAgbmdab25lID0gbmV3IE5nWm9uZSh7IGVuYWJsZUxvbmdTdGFja1RyYWNlOiBpc0Rldk1vZGUoKSB9KTtcbiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgdXNlIEFwcGxpY2F0aW9uUmVmLnJ1biBoZXJlLFxuICAgICAgICAgICAgLy8gYXMgd2Ugd2FudCB0byBiZSBzdXJlIHRoYXQgYWxsIHBvc3NpYmxlIGNvbnN0cnVjdG9yIGNhbGxzIGFyZSBpbnNpZGUgYG5nWm9uZS5ydW5gIVxuICAgICAgICAgICAgcmV0dXJuIG5nWm9uZS5ydW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5nWm9uZUluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW3sgcHJvdmlkZTogTmdab25lLCB1c2VWYWx1ZTogbmdab25lIH1dLCBfdGhpcy5pbmplY3Rvcik7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbW9kdWxlUmVmID0gKG1vZHVsZUZhY3RvcnkuY3JlYXRlKG5nWm9uZUluamVjdG9yKSk7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhjZXB0aW9uSGFuZGxlciA9IG1vZHVsZVJlZi5pbmplY3Rvci5nZXQoRXJyb3JIYW5kbGVyLCBudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4Y2VwdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZHVsZVJlZi5vbkRlc3Ryb3koZnVuY3Rpb24gKCkgeyByZXR1cm4gTGlzdFdyYXBwZXIucmVtb3ZlKF90aGlzLl9tb2R1bGVzLCBtb2R1bGVSZWYpOyB9KTtcbiAgICAgICAgICAgICAgICBuZ1pvbmUub25FcnJvci5zdWJzY3JpYmUoeyBuZXh0OiBmdW5jdGlvbiAoZXJyb3IpIHsgZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7IH0gfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbml0U3RhdHVzID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChBcHBsaWNhdGlvbkluaXRTdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdFN0YXR1cy5kb25lUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9tb2R1bGVEb0Jvb3RzdHJhcChtb2R1bGVSZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVJlZjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBsYXRmb3JtUmVmXy5wcm90b3R5cGUuYm9vdHN0cmFwTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGNvbXBpbGVyT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKGNvbXBpbGVyT3B0aW9ucyA9PT0gdm9pZCAwKSB7IGNvbXBpbGVyT3B0aW9ucyA9IFtdOyB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYm9vdHN0cmFwTW9kdWxlV2l0aFpvbmUobW9kdWxlVHlwZSwgY29tcGlsZXJPcHRpb25zLCBudWxsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1pvbmVcbiAgICAgICAgICogQHBhcmFtIHs/PX0gY29tcG9uZW50RmFjdG9yeUNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybVJlZl8ucHJvdG90eXBlLl9ib290c3RyYXBNb2R1bGVXaXRoWm9uZSA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlLCBjb21waWxlck9wdGlvbnMsIG5nWm9uZSwgY29tcG9uZW50RmFjdG9yeUNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKGNvbXBpbGVyT3B0aW9ucyA9PT0gdm9pZCAwKSB7IGNvbXBpbGVyT3B0aW9ucyA9IFtdOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21waWxlckZhY3RvcnkgPSB0aGlzLmluamVjdG9yLmdldChDb21waWxlckZhY3RvcnkpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcGlsZXIgPSBjb21waWxlckZhY3RvcnkuY3JlYXRlQ29tcGlsZXIoQXJyYXkuaXNBcnJheShjb21waWxlck9wdGlvbnMpID8gY29tcGlsZXJPcHRpb25zIDogW2NvbXBpbGVyT3B0aW9uc10pO1xuICAgICAgICAgICAgLy8gdWdseSBpbnRlcm5hbCBhcGkgaGFjazogZ2VuZXJhdGUgaG9zdCBjb21wb25lbnQgZmFjdG9yaWVzIGZvciBhbGwgZGVjbGFyZWQgY29tcG9uZW50cyBhbmRcbiAgICAgICAgICAgIC8vIHBhc3MgdGhlIGZhY3RvcmllcyBpbnRvIHRoZSBjYWxsYmFjayAtIHRoaXMgaXMgdXNlZCBieSBVcGRhdGVBZGFwdGVyIHRvIGdldCBob2xkIG9mIGFsbFxuICAgICAgICAgICAgLy8gZmFjdG9yaWVzLlxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudEZhY3RvcnlDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jKG1vZHVsZVR5cGUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmdNb2R1bGVGYWN0b3J5ID0gX2EubmdNb2R1bGVGYWN0b3J5LCBjb21wb25lbnRGYWN0b3JpZXMgPSBfYS5jb21wb25lbnRGYWN0b3JpZXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnlDYWxsYmFjayhjb21wb25lbnRGYWN0b3JpZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2Jvb3RzdHJhcE1vZHVsZUZhY3RvcnlXaXRoWm9uZShuZ01vZHVsZUZhY3RvcnksIG5nWm9uZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKG1vZHVsZVR5cGUpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1vZHVsZUZhY3RvcnkpIHsgcmV0dXJuIF90aGlzLl9ib290c3RyYXBNb2R1bGVGYWN0b3J5V2l0aFpvbmUobW9kdWxlRmFjdG9yeSwgbmdab25lKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVJlZlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGxhdGZvcm1SZWZfLnByb3RvdHlwZS5fbW9kdWxlRG9Cb290c3RyYXAgPSBmdW5jdGlvbiAobW9kdWxlUmVmKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhcHBSZWYgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEFwcGxpY2F0aW9uUmVmKTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVSZWYuYm9vdHN0cmFwRmFjdG9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtb2R1bGVSZWYuYm9vdHN0cmFwRmFjdG9yaWVzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBGYWN0b3J5KSB7IHJldHVybiBhcHBSZWYuYm9vdHN0cmFwKGNvbXBGYWN0b3J5KTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtb2R1bGVSZWYuaW5zdGFuY2UubmdEb0Jvb3RzdHJhcCkge1xuICAgICAgICAgICAgICAgIG1vZHVsZVJlZi5pbnN0YW5jZS5uZ0RvQm9vdHN0cmFwKGFwcFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKFwiVGhlIG1vZHVsZSBcIiArIHN0cmluZ2lmeShtb2R1bGVSZWYuaW5zdGFuY2UuY29uc3RydWN0b3IpICsgXCIgd2FzIGJvb3RzdHJhcHBlZCwgYnV0IGl0IGRvZXMgbm90IGRlY2xhcmUgXFxcIkBOZ01vZHVsZS5ib290c3RyYXBcXFwiIGNvbXBvbmVudHMgbm9yIGEgXFxcIm5nRG9Cb290c3RyYXBcXFwiIG1ldGhvZC4gXCIpICtcbiAgICAgICAgICAgICAgICAgICAgXCJQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFBsYXRmb3JtUmVmXy5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBQbGF0Zm9ybVJlZl8uY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdG9yLCB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gUGxhdGZvcm1SZWZfO1xuICAgIH0oUGxhdGZvcm1SZWYpKTtcbiAgICAvKipcbiAgICAgKiAgQSByZWZlcmVuY2UgdG8gYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIGEgcGFnZS5cbiAgICAgICogKlxuICAgICAgKiBGb3IgbW9yZSBhYm91dCBBbmd1bGFyIGFwcGxpY2F0aW9ucywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB7QGxpbmsgYm9vdHN0cmFwfS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBcHBsaWNhdGlvblJlZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEFwcGxpY2F0aW9uUmVmKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiAjIyMgQm9vdHN0cmFwIHByb2Nlc3NcbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIFdoZW4gYm9vdHN0cmFwcGluZyBhIG5ldyByb290IGNvbXBvbmVudCBpbnRvIGFuIGFwcGxpY2F0aW9uLCBBbmd1bGFyIG1vdW50cyB0aGVcbiAgICAgICAgICAqIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBjb21wb25lbnQgb250byBET00gZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgW2NvbXBvbmVudFR5cGVdJ3NcbiAgICAgICAgICAqIHNlbGVjdG9yIGFuZCBraWNrcyBvZmYgYXV0b21hdGljIGNoYW5nZSBkZXRlY3Rpb24gdG8gZmluaXNoIGluaXRpYWxpemluZyB0aGUgY29tcG9uZW50LlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICAgICAqIHtAZXhhbXBsZSBjb3JlL3RzL3BsYXRmb3JtL3BsYXRmb3JtLnRzIHJlZ2lvbj0nbG9uZ2Zvcm0nfVxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3J5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUuYm9vdHN0cmFwID0gZnVuY3Rpb24gKGNvbXBvbmVudEZhY3RvcnkpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBJbnZva2UgdGhpcyBtZXRob2QgdG8gZXhwbGljaXRseSBwcm9jZXNzIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGl0cyBzaWRlLWVmZmVjdHMuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCBgdGljaygpYCBhbHNvIHBlcmZvcm1zIGEgc2Vjb25kIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgdG8gZW5zdXJlIHRoYXQgbm9cbiAgICAgICAgICAqIGZ1cnRoZXIgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuIElmIGFkZGl0aW9uYWwgY2hhbmdlcyBhcmUgcGlja2VkIHVwIGR1cmluZyB0aGlzIHNlY29uZCBjeWNsZSxcbiAgICAgICAgICAqIGJpbmRpbmdzIGluIHRoZSBhcHAgaGF2ZSBzaWRlLWVmZmVjdHMgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gYSBzaW5nbGUgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICAgICogcGFzcy5cbiAgICAgICAgICAqIEluIHRoaXMgY2FzZSwgQW5ndWxhciB0aHJvd3MgYW4gZXJyb3IsIHNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIG9ubHkgaGF2ZSBvbmUgY2hhbmdlXG4gICAgICAgICAgKiBkZXRlY3Rpb24gcGFzcyBkdXJpbmcgd2hpY2ggYWxsIGNoYW5nZSBkZXRlY3Rpb24gbXVzdCBjb21wbGV0ZS5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUudGljayA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFwcGxpY2F0aW9uUmVmLnByb3RvdHlwZSwgXCJjb21wb25lbnRUeXBlc1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcyByZWdpc3RlcmVkIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAgICAgICAgICAgICogVGhpcyBsaXN0IGlzIHBvcHVsYXRlZCBldmVuIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIGNyZWF0ZWQuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh1bmltcGxlbWVudGVkKCkpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXBwbGljYXRpb25SZWYucHJvdG90eXBlLCBcImNvbXBvbmVudHNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgR2V0IGEgbGlzdCBvZiBjb21wb25lbnRzIHJlZ2lzdGVyZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHVuaW1wbGVtZW50ZWQoKSk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQXR0YWNoZXMgYSB2aWV3IHNvIHRoYXQgaXQgd2lsbCBiZSBkaXJ0eSBjaGVja2VkLlxuICAgICAgICAgICogVGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGFjaGVkIHdoZW4gaXQgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICogVGhpcyB3aWxsIHRocm93IGlmIHRoZSB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyLlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmLnByb3RvdHlwZS5hdHRhY2hWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsgdW5pbXBsZW1lbnRlZCgpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIERldGFjaGVzIGEgdmlldyBmcm9tIGRpcnR5IGNoZWNraW5nIGFnYWluLlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmLnByb3RvdHlwZS5kZXRhY2hWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHsgdW5pbXBsZW1lbnRlZCgpOyB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXBwbGljYXRpb25SZWYucHJvdG90eXBlLCBcInZpZXdDb3VudFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0YWNoZWQgdmlld3MuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblJlZjtcbiAgICB9KCkpO1xuICAgIHZhciBBcHBsaWNhdGlvblJlZl8gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMyhBcHBsaWNhdGlvblJlZl8sIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF96b25lXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2NvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3JcbiAgICAgICAgICogQHBhcmFtIHs/fSBfZXhjZXB0aW9uSGFuZGxlclxuICAgICAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcbiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5pdFN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0gez99IF90ZXN0YWJpbGl0eVJlZ2lzdHJ5XG4gICAgICAgICAqIEBwYXJhbSB7P30gX3Rlc3RhYmlsaXR5XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBcHBsaWNhdGlvblJlZl8oX3pvbmUsIF9jb25zb2xlLCBfaW5qZWN0b3IsIF9leGNlcHRpb25IYW5kbGVyLCBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBfaW5pdFN0YXR1cywgX3Rlc3RhYmlsaXR5UmVnaXN0cnksIF90ZXN0YWJpbGl0eSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fem9uZSA9IF96b25lO1xuICAgICAgICAgICAgdGhpcy5fY29uc29sZSA9IF9jb25zb2xlO1xuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7XG4gICAgICAgICAgICB0aGlzLl9leGNlcHRpb25IYW5kbGVyID0gX2V4Y2VwdGlvbkhhbmRsZXI7XG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgICAgICAgICAgdGhpcy5faW5pdFN0YXR1cyA9IF9pbml0U3RhdHVzO1xuICAgICAgICAgICAgdGhpcy5fdGVzdGFiaWxpdHlSZWdpc3RyeSA9IF90ZXN0YWJpbGl0eVJlZ2lzdHJ5O1xuICAgICAgICAgICAgdGhpcy5fdGVzdGFiaWxpdHkgPSBfdGVzdGFiaWxpdHk7XG4gICAgICAgICAgICB0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RDb21wb25lbnRzID0gW107XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50VHlwZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzID0gW107XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGlzRGV2TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5fem9uZS5vbk1pY3JvdGFza0VtcHR5LnN1YnNjcmliZSh7IG5leHQ6IGZ1bmN0aW9uICgpIHsgX3RoaXMuX3pvbmUucnVuKGZ1bmN0aW9uICgpIHsgX3RoaXMudGljaygpOyB9KTsgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBsaWNhdGlvblJlZl8ucHJvdG90eXBlLmF0dGFjaFZpZXcgPSBmdW5jdGlvbiAodmlld1JlZikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9ICgodmlld1JlZikpLmludGVybmFsVmlldztcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnB1c2godmlldyk7XG4gICAgICAgICAgICB2aWV3LmF0dGFjaFRvQXBwUmVmKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBsaWNhdGlvblJlZl8ucHJvdG90eXBlLmRldGFjaFZpZXcgPSBmdW5jdGlvbiAodmlld1JlZikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9ICgodmlld1JlZikpLmludGVybmFsVmlldztcbiAgICAgICAgICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl92aWV3cywgdmlldyk7XG4gICAgICAgICAgICB2aWV3LmRldGFjaCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRPckZhY3RvcnlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmXy5wcm90b3R5cGUuYm9vdHN0cmFwID0gZnVuY3Rpb24gKGNvbXBvbmVudE9yRmFjdG9yeSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdFN0YXR1cy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYm9vdHN0cmFwIGFzIHRoZXJlIGFyZSBzdGlsbCBhc3luY2hyb25vdXMgaW5pdGlhbGl6ZXJzIHJ1bm5pbmcuIEJvb3RzdHJhcCBjb21wb25lbnRzIGluIHRoZSBgbmdEb0Jvb3RzdHJhcGAgbWV0aG9kIG9mIHRoZSByb290IG1vZHVsZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBvbmVudEZhY3Rvcnk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50T3JGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9uZW50RmFjdG9yeSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnkgPSBjb21wb25lbnRPckZhY3Rvcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudE9yRmFjdG9yeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50VHlwZXMucHVzaChjb21wb25lbnRGYWN0b3J5LmNvbXBvbmVudFR5cGUpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHRoaXMuX2luamVjdG9yLCBbXSwgY29tcG9uZW50RmFjdG9yeS5zZWxlY3Rvcik7XG4gICAgICAgICAgICBjb21wUmVmLm9uRGVzdHJveShmdW5jdGlvbiAoKSB7IF90aGlzLl91bmxvYWRDb21wb25lbnQoY29tcFJlZik7IH0pO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVzdGFiaWxpdHkgPSBjb21wUmVmLmluamVjdG9yLmdldChUZXN0YWJpbGl0eSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAodGVzdGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICBjb21wUmVmLmluamVjdG9yLmdldChUZXN0YWJpbGl0eVJlZ2lzdHJ5KVxuICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJBcHBsaWNhdGlvbihjb21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIHRlc3RhYmlsaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvYWRDb21wb25lbnQoY29tcFJlZik7XG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zb2xlLmxvZyhcIkFuZ3VsYXIgMiBpcyBydW5uaW5nIGluIHRoZSBkZXZlbG9wbWVudCBtb2RlLiBDYWxsIGVuYWJsZVByb2RNb2RlKCkgdG8gZW5hYmxlIHRoZSBwcm9kdWN0aW9uIG1vZGUuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbXBSZWY7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFJlZlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwbGljYXRpb25SZWZfLnByb3RvdHlwZS5fbG9hZENvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgdGhpcy50aWNrKCk7XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudFJlZik7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3RlbmVycyBsYXppbHkgdG8gcHJldmVudCBESSBjeWNsZXMuXG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXN0ZW5lcnMgPSAodGhpcy5faW5qZWN0b3IuZ2V0KEFQUF9CT09UU1RSQVBfTElTVEVORVIsIFtdKVxuICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYm9vdHN0cmFwTGlzdGVuZXJzKSk7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKGNvbXBvbmVudFJlZik7IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRSZWZcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmXy5wcm90b3R5cGUuX3VubG9hZENvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMuX3Jvb3RDb21wb25lbnRzLCBjb21wb25lbnRSZWYpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmXy5wcm90b3R5cGUudGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ydW5uaW5nVGljaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwbGljYXRpb25SZWYudGljayBpcyBjYWxsZWQgcmVjdXJzaXZlbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNjb3BlID0gQXBwbGljYXRpb25SZWZfLl90aWNrU2NvcGUoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcnVubmluZ1RpY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goZnVuY3Rpb24gKHZpZXcpIHsgcmV0dXJuIHZpZXcucmVmLmRldGVjdENoYW5nZXMoKTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld3MuZm9yRWFjaChmdW5jdGlvbiAodmlldykgeyByZXR1cm4gdmlldy5yZWYuY2hlY2tOb0NoYW5nZXMoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcnVubmluZ1RpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB3dGZMZWF2ZShzY29wZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwbGljYXRpb25SZWZfLnByb3RvdHlwZS5uZ09uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oYWx4aHViKTogRGlzcG9zZSBvZiB0aGUgTmdab25lLlxuICAgICAgICAgICAgdGhpcy5fdmlld3Muc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh2aWV3KSB7IHJldHVybiB2aWV3LmRlc3Ryb3koKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvblJlZl8ucHJvdG90eXBlLCBcInZpZXdDb3VudFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RoOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFwcGxpY2F0aW9uUmVmXy5wcm90b3R5cGUsIFwiY29tcG9uZW50VHlwZXNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jvb3RDb21wb25lbnRUeXBlczsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvblJlZl8ucHJvdG90eXBlLCBcImNvbXBvbmVudHNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jvb3RDb21wb25lbnRzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBBcHBsaWNhdGlvblJlZl8uX3RpY2tTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBsaWNhdGlvblJlZiN0aWNrKCknKTtcbiAgICAgICAgQXBwbGljYXRpb25SZWZfLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIEFwcGxpY2F0aW9uUmVmXy5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgdHlwZTogTmdab25lLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBDb25zb2xlLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBJbmplY3RvciwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogRXJyb3JIYW5kbGVyLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IEFwcGxpY2F0aW9uSW5pdFN0YXR1cywgfSxcbiAgICAgICAgICAgIHsgdHlwZTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSxdIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFRlc3RhYmlsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUmVmXztcbiAgICB9KEFwcGxpY2F0aW9uUmVmKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQ5ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYW4gTmdNb2R1bGUgY3JlYXRlZCB2aWEgYSB7QGxpbmsgTmdNb2R1bGVGYWN0b3J5fS5cbiAgICAgICogKlxuICAgICAgKiBgTmdNb2R1bGVSZWZgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmdNb2R1bGUgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpc1xuICAgICAgKiBOZ01vZHVsZSBJbnN0YW5jZS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBOZ01vZHVsZVJlZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIE5nTW9kdWxlUmVmKCkge1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ01vZHVsZVJlZi5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgVGhlIGluamVjdG9yIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBwcm92aWRlcnMgb2YgdGhlIE5nTW9kdWxlLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdNb2R1bGVSZWYucHJvdG90eXBlLCBcImNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBUaGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHRvIGdldCBob2xkIG9mIHRoZSBDb21wb25lbnRGYWN0b3JpZXNcbiAgICAgICAgICAgICAgKiBkZWNsYXJlZCBpbiB0aGUgYGVudHJ5Q29tcG9uZW50c2AgcHJvcGVydHkgb2YgdGhlIG1vZHVsZS5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nTW9kdWxlUmVmLnByb3RvdHlwZSwgXCJpbnN0YW5jZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBUaGUgTmdNb2R1bGUgaW5zdGFuY2UuXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgRGVzdHJveXMgdGhlIG1vZHVsZSBpbnN0YW5jZSBhbmQgYWxsIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGl0LlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTW9kdWxlUmVmLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIEFsbG93cyB0byByZWdpc3RlciBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGRlc3Ryb3llZC5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTW9kdWxlUmVmLnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsgfTtcbiAgICAgICAgcmV0dXJuIE5nTW9kdWxlUmVmO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciBOZ01vZHVsZUZhY3RvcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3JDbGFzc1xuICAgICAgICAgKiBAcGFyYW0gez99IF9tb2R1bGVUeXBlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ01vZHVsZUZhY3RvcnkoX2luamVjdG9yQ2xhc3MsIF9tb2R1bGVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmplY3RvckNsYXNzID0gX2luamVjdG9yQ2xhc3M7XG4gICAgICAgICAgICB0aGlzLl9tb2R1bGVUeXBlID0gX21vZHVsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nTW9kdWxlRmFjdG9yeS5wcm90b3R5cGUsIFwibW9kdWxlVHlwZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbW9kdWxlVHlwZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEluamVjdG9yXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ01vZHVsZUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChwYXJlbnRJbmplY3Rvcikge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRJbmplY3Rvcikge1xuICAgICAgICAgICAgICAgIHBhcmVudEluamVjdG9yID0gSW5qZWN0b3IuTlVMTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluc3RhbmNlID0gbmV3IHRoaXMuX2luamVjdG9yQ2xhc3MocGFyZW50SW5qZWN0b3IpO1xuICAgICAgICAgICAgaW5zdGFuY2UuY3JlYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBOZ01vZHVsZUZhY3Rvcnk7XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfVU5ERUZJTkVEID0gbmV3IE9iamVjdCgpO1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBOZ01vZHVsZUluamVjdG9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDkoTmdNb2R1bGVJbmplY3RvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gZmFjdG9yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7P30gYm9vdHN0cmFwRmFjdG9yaWVzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ01vZHVsZUluamVjdG9yKHBhcmVudCwgZmFjdG9yaWVzLCBib290c3RyYXBGYWN0b3JpZXMpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZhY3RvcmllcywgcGFyZW50LmdldChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5OVUxMKSk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuYm9vdHN0cmFwRmFjdG9yaWVzID0gYm9vdHN0cmFwRmFjdG9yaWVzO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ01vZHVsZUluamVjdG9yLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuaW5zdGFuY2UgPSB0aGlzLmNyZWF0ZUludGVybmFsKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTW9kdWxlSW5qZWN0b3IucHJvdG90eXBlLmNyZWF0ZUludGVybmFsID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ01vZHVsZUluamVjdG9yLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IFRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSBJbmplY3RvciB8fCB0b2tlbiA9PT0gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB0aGlzLmdldEludGVybmFsKHRva2VuLCBfVU5ERUZJTkVEKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IF9VTkRFRklORUQgPyB0aGlzLnBhcmVudC5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUpIDogcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ01vZHVsZUluamVjdG9yLnByb3RvdHlwZS5nZXRJbnRlcm5hbCA9IGZ1bmN0aW9uICh0b2tlbiwgbm90Rm91bmRWYWx1ZSkgeyB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdNb2R1bGVJbmplY3Rvci5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdNb2R1bGVJbmplY3Rvci5wcm90b3R5cGUsIFwiY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ01vZHVsZUluamVjdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBuZyBtb2R1bGUgXCIgKyBzdHJpbmdpZnkodGhpcy5pbnN0YW5jZS5jb25zdHJ1Y3RvcikgKyBcIiBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95SW50ZXJuYWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKCk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFja1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdNb2R1bGVJbmplY3Rvci5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTW9kdWxlSW5qZWN0b3IucHJvdG90eXBlLmRlc3Ryb3lJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgcmV0dXJuIE5nTW9kdWxlSW5qZWN0b3I7XG4gICAgfShDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgLyoqXG4gICAgICogIFVzZWQgdG8gbG9hZCBuZyBtb2R1bGUgZmFjdG9yaWVzLlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBOZ01vZHVsZUZhY3RvcnlMb2FkZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBOZ01vZHVsZUZhY3RvcnlMb2FkZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTW9kdWxlRmFjdG9yeUxvYWRlci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChwYXRoKSB7IH07XG4gICAgICAgIHJldHVybiBOZ01vZHVsZUZhY3RvcnlMb2FkZXI7XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2R1bGVGYWN0b3JpZXMgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogIFJlZ2lzdGVycyBhIGxvYWRlZCBtb2R1bGUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIGdlbmVyYXRlZCBOZ01vZHVsZUZhY3RvcnkgY29kZS5cbiAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICogQHBhcmFtIHs/fSBmYWN0b3J5XG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZUZhY3RvcnkoaWQsIGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhpc3RpbmcgPSBtb2R1bGVGYWN0b3JpZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgbW9kdWxlIHJlZ2lzdGVyZWQgZm9yIFwiICsgaWQgKyBcIiAtIFwiICsgZXhpc3RpbmcubW9kdWxlVHlwZS5uYW1lICsgXCIgdnMgXCIgKyBmYWN0b3J5Lm1vZHVsZVR5cGUubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgbW9kdWxlRmFjdG9yaWVzLnNldChpZCwgZmFjdG9yeSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBSZXR1cm5zIHRoZSBOZ01vZHVsZUZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gaWQsIGlmIGl0IGV4aXN0cyBhbmQgaGFzIGJlZW4gbG9hZGVkLlxuICAgICAgKiBGYWN0b3JpZXMgZm9yIG1vZHVsZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbiBgaWRgIGNhbm5vdCBiZSByZXRyaWV2ZWQuIFRocm93cyBpZiB0aGUgbW9kdWxlXG4gICAgICAqIGNhbm5vdCBiZSBmb3VuZC5cbiAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNb2R1bGVGYWN0b3J5KGlkKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZhY3RvcnkgPSBtb2R1bGVGYWN0b3JpZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFmYWN0b3J5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbW9kdWxlIHdpdGggSUQgXCIgKyBpZCArIFwiIGxvYWRlZFwiKTtcbiAgICAgICAgcmV0dXJuIGZhY3Rvcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZW1zIHRoYXQgQW5ndWxhciBrZWVwcyB1cCB0byBkYXRlIHdoZW4gdGhlIHN0YXRlXG4gICAgICAqIG9mIHRoZSBhcHBsaWNhdGlvbiBjaGFuZ2VzLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSB0eXBlIG9mIG9iamVjdCB0aGF0IHtAbGluayBRdWVyeX0gYW5kIHtAbGluayBWaWV3UXVlcnlNZXRhZGF0YX0gcHJvdmlkZS5cbiAgICAgICogKlxuICAgICAgKiBJbXBsZW1lbnRzIGFuIGl0ZXJhYmxlIGludGVyZmFjZSwgdGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIGluIGJvdGggRVM2XG4gICAgICAqIGphdmFzY3JpcHQgYGZvciAodmFyIGkgb2YgaXRlbXMpYCBsb29wcyBhcyB3ZWxsIGFzIGluIEFuZ3VsYXIgdGVtcGxhdGVzIHdpdGhcbiAgICAgICogYCpuZ0Zvcj1cImxldCBpIG9mIG15TGlzdFwiYC5cbiAgICAgICogKlxuICAgICAgKiBDaGFuZ2VzIGNhbiBiZSBvYnNlcnZlZCBieSBzdWJzY3JpYmluZyB0byB0aGUgY2hhbmdlcyBgT2JzZXJ2YWJsZWAuXG4gICAgICAqICpcbiAgICAgICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1JYOHNKblFZbDlGV3VTQ1dtZTV6P3A9cHJldmlldykpXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogY2xhc3MgQ29udGFpbmVyIHtcbiAgICAgICogQFZpZXdDaGlsZHJlbihJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT47XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICovXG4gICAgdmFyIFF1ZXJ5TGlzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFF1ZXJ5TGlzdCgpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFF1ZXJ5TGlzdC5wcm90b3R5cGUsIFwiY2hhbmdlc1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZW1pdHRlcjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUxpc3QucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUXVlcnlMaXN0LnByb3RvdHlwZSwgXCJmaXJzdFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVzdWx0c1swXTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdWVyeUxpc3QucHJvdG90eXBlLCBcImxhc3RcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHNbdGhpcy5sZW5ndGggLSAxXTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgU2VlXG4gICAgICAgICAgKiBbQXJyYXkubWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24gKGZuKSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLm1hcChmbik7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgU2VlXG4gICAgICAgICAgKiBbQXJyYXkuZmlsdGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maWx0ZXIpXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5maWx0ZXIoZm4pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNlZVxuICAgICAgICAgICogW0FycmF5LmZpbmRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChmbikgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy5maW5kKGZuKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBTZWVcbiAgICAgICAgICAqIFtBcnJheS5yZWR1Y2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZSlcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcGFyYW0gez99IGluaXRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGZuLCBpbml0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5yZWR1Y2UoZm4sIGluaXQpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNlZVxuICAgICAgICAgICogW0FycmF5LmZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9yZXN1bHRzLmZvckVhY2goZm4pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFNlZVxuICAgICAgICAgICogW0FycmF5LnNvbWVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvbWUpXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuc29tZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuc29tZShmbik7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUXVlcnlMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGVbZ2V0U3ltYm9sSXRlcmF0b3IoKV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoKHRoaXMuX3Jlc3VsdHMpKVtnZXRTeW1ib2xJdGVyYXRvcigpXSgpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLnRvU3RyaW5nKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUXVlcnlMaXN0LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdHMgPSBMaXN0V3JhcHBlci5mbGF0dGVuKHJlcyk7XG4gICAgICAgICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUubm90aWZ5T25DaGFuZ2VzID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9lbWl0dGVyLmVtaXQodGhpcyk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgaW50ZXJuYWxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuc2V0RGlydHkgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2RpcnR5ID0gdHJ1ZTsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFF1ZXJ5TGlzdC5wcm90b3R5cGUsIFwiZGlydHlcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgaW50ZXJuYWxcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGlydHk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUXVlcnlMaXN0O1xuICAgIH0oKSk7XG5cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfU0VQQVJBVE9SID0gJyMnO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEZBQ1RPUllfQ0xBU1NfU1VGRklYID0gJ05nRmFjdG9yeSc7XG4gICAgLyoqXG4gICAgICogIENvbmZpZ3VyYXRpb24gZm9yIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuXG4gICAgICAqIHRva2VuLlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnKCkge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnO1xuICAgIH0oKSk7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gREVGQVVMVF9DT05GSUcgPSB7XG4gICAgICAgIGZhY3RvcnlQYXRoUHJlZml4OiAnJyxcbiAgICAgICAgZmFjdG9yeVBhdGhTdWZmaXg6ICcubmdmYWN0b3J5JyxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqICBOZ01vZHVsZUZhY3RvcnlMb2FkZXIgdGhhdCB1c2VzIFN5c3RlbUpTIHRvIGxvYWQgTmdNb2R1bGVGYWN0b3J5XG4gICAgICovXG4gICAgdmFyIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfY29tcGlsZXJcbiAgICAgICAgICogQHBhcmFtIHs/PX0gY29uZmlnXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyKF9jb21waWxlciwgY29uZmlnKSB7XG4gICAgICAgICAgICB0aGlzLl9jb21waWxlciA9IF9jb21waWxlcjtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZyB8fCBERUZBVUxUX0NPTkZJRztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9mZmxpbmVNb2RlID0gdGhpcy5fY29tcGlsZXIgaW5zdGFuY2VvZiBDb21waWxlcjtcbiAgICAgICAgICAgIHJldHVybiBvZmZsaW5lTW9kZSA/IHRoaXMubG9hZEZhY3RvcnkocGF0aCkgOiB0aGlzLmxvYWRBbmRDb21waWxlKHBhdGgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLnByb3RvdHlwZS5sb2FkQW5kQ29tcGlsZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIF9hID0gcGF0aC5zcGxpdChfU0VQQVJBVE9SKSwgbW9kdWxlID0gX2FbMF0sIGV4cG9ydE5hbWUgPSBfYVsxXTtcbiAgICAgICAgICAgIGlmIChleHBvcnROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQobW9kdWxlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChtb2R1bGUpIHsgcmV0dXJuIG1vZHVsZVtleHBvcnROYW1lXTsgfSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gY2hlY2tOb3RFbXB0eSh0eXBlLCBtb2R1bGUsIGV4cG9ydE5hbWUpOyB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiBfdGhpcy5fY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKHR5cGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGF0aFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgU3lzdGVtSnNOZ01vZHVsZUxvYWRlci5wcm90b3R5cGUubG9hZEZhY3RvcnkgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgICAgdmFyIF9hID0gcGF0aC5zcGxpdChfU0VQQVJBVE9SKSwgbW9kdWxlID0gX2FbMF0sIGV4cG9ydE5hbWUgPSBfYVsxXTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZhY3RvcnlDbGFzc1N1ZmZpeCA9IEZBQ1RPUllfQ0xBU1NfU1VGRklYO1xuICAgICAgICAgICAgaWYgKGV4cG9ydE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGV4cG9ydE5hbWUgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzU3VmZml4ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gU3lzdGVtLmltcG9ydCh0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhQcmVmaXggKyBtb2R1bGUgKyB0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhTdWZmaXgpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1vZHVsZSkgeyByZXR1cm4gbW9kdWxlW2V4cG9ydE5hbWUgKyBmYWN0b3J5Q2xhc3NTdWZmaXhdOyB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChmYWN0b3J5KSB7IHJldHVybiBjaGVja05vdEVtcHR5KGZhY3RvcnksIG1vZHVsZSwgZXhwb3J0TmFtZSk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IENvbXBpbGVyLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXI7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICogQHBhcmFtIHs/fSBtb2R1bGVQYXRoXG4gICAgICogQHBhcmFtIHs/fSBleHBvcnROYW1lXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGVja05vdEVtcHR5KHZhbHVlLCBtb2R1bGVQYXRoLCBleHBvcnROYW1lKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kICdcIiArIGV4cG9ydE5hbWUgKyBcIicgaW4gJ1wiICsgbW9kdWxlUGF0aCArIFwiJ1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMTAgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgUmVwcmVzZW50cyBhbiBFbWJlZGRlZCBUZW1wbGF0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIEVtYmVkZGVkIFZpZXdzLlxuICAgICAgKiAqXG4gICAgICAqIFlvdSBjYW4gYWNjZXNzIGEgYFRlbXBsYXRlUmVmYCwgaW4gdHdvIHdheXMuIFZpYSBhIGRpcmVjdGl2ZSBwbGFjZWQgb24gYSBgPHRlbXBsYXRlPmAgZWxlbWVudCAob3JcbiAgICAgICogZGlyZWN0aXZlIHByZWZpeGVkIHdpdGggYCpgKSBhbmQgaGF2ZSB0aGUgYFRlbXBsYXRlUmVmYCBmb3IgdGhpcyBFbWJlZGRlZCBWaWV3IGluamVjdGVkIGludG8gdGhlXG4gICAgICAqIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXJlY3RpdmUgdXNpbmcgdGhlIGBUZW1wbGF0ZVJlZmAgVG9rZW4uIEFsdGVybmF0aXZlbHkgeW91IGNhbiBxdWVyeSBmb3IgdGhlXG4gICAgICAqIGBUZW1wbGF0ZVJlZmAgZnJvbSBhIENvbXBvbmVudCBvciBhIERpcmVjdGl2ZSB2aWEge0BsaW5rIFF1ZXJ5fS5cbiAgICAgICogKlxuICAgICAgKiBUbyBpbnN0YW50aWF0ZSBFbWJlZGRlZCBWaWV3cyBiYXNlZCBvbiBhIFRlbXBsYXRlLCB1c2VcbiAgICAgICoge0BsaW5rIFZpZXdDb250YWluZXJSZWYjY3JlYXRlRW1iZWRkZWRWaWV3fSwgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIFZpZXcgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAgICAgICogVmlldyBDb250YWluZXIuXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFRlbXBsYXRlUmVmID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRlbXBsYXRlUmVmLnByb3RvdHlwZSwgXCJlbGVtZW50UmVmXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFRlbXBsYXRlUmVmLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZFZpZXcgPSBmdW5jdGlvbiAoY29udGV4dCkgeyB9O1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVSZWY7XG4gICAgfSgpKTtcbiAgICB2YXIgVGVtcGxhdGVSZWZfID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDEwKFRlbXBsYXRlUmVmXywgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudFZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbm9kZUluZGV4XG4gICAgICAgICAqIEBwYXJhbSB7P30gX25hdGl2ZUVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlUmVmXyhfcGFyZW50VmlldywgX25vZGVJbmRleCwgX25hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50VmlldyA9IF9wYXJlbnRWaWV3O1xuICAgICAgICAgICAgdGhpcy5fbm9kZUluZGV4ID0gX25vZGVJbmRleDtcbiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUVsZW1lbnQgPSBfbmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBUZW1wbGF0ZVJlZl8ucHJvdG90eXBlLmNyZWF0ZUVtYmVkZGVkVmlldyA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gdGhpcy5fcGFyZW50Vmlldy5jcmVhdGVFbWJlZGRlZFZpZXdJbnRlcm5hbCh0aGlzLl9ub2RlSW5kZXgpO1xuICAgICAgICAgICAgdmlldy5jcmVhdGUoY29udGV4dCB8fCAoe30pKTtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LnJlZjtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRlbXBsYXRlUmVmXy5wcm90b3R5cGUsIFwiZWxlbWVudFJlZlwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEVsZW1lbnRSZWYodGhpcy5fbmF0aXZlRWxlbWVudCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gVGVtcGxhdGVSZWZfO1xuICAgIH0oVGVtcGxhdGVSZWYpKTtcblxuICAgIC8qKlxuICAgICAqICBSZXByZXNlbnRzIGEgY29udGFpbmVyIHdoZXJlIG9uZSBvciBtb3JlIFZpZXdzIGNhbiBiZSBhdHRhY2hlZC5cbiAgICAgICogKlxuICAgICAgKiBUaGUgY29udGFpbmVyIGNhbiBjb250YWluIHR3byBraW5kcyBvZiBWaWV3cy4gSG9zdCBWaWV3cywgY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGFcbiAgICAgICoge0BsaW5rIENvbXBvbmVudH0gdmlhIHtAbGluayAjY3JlYXRlQ29tcG9uZW50fSwgYW5kIEVtYmVkZGVkIFZpZXdzLCBjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgYW5cbiAgICAgICoge0BsaW5rIFRlbXBsYXRlUmVmIEVtYmVkZGVkIFRlbXBsYXRlfSB2aWEge0BsaW5rICNjcmVhdGVFbWJlZGRlZFZpZXd9LlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgVmlldyBDb250YWluZXIgd2l0aGluIHRoZSBjb250YWluaW5nIFZpZXcgaXMgc3BlY2lmaWVkIGJ5IHRoZSBBbmNob3JcbiAgICAgICogYGVsZW1lbnRgLiBFYWNoIFZpZXcgQ29udGFpbmVyIGNhbiBoYXZlIG9ubHkgb25lIEFuY2hvciBFbGVtZW50IGFuZCBlYWNoIEFuY2hvciBFbGVtZW50IGNhbiBvbmx5XG4gICAgICAqIGhhdmUgYSBzaW5nbGUgVmlldyBDb250YWluZXIuXG4gICAgICAqICpcbiAgICAgICogUm9vdCBlbGVtZW50cyBvZiBWaWV3cyBhdHRhY2hlZCB0byB0aGlzIGNvbnRhaW5lciBiZWNvbWUgc2libGluZ3Mgb2YgdGhlIEFuY2hvciBFbGVtZW50IGluXG4gICAgICAqIHRoZSBSZW5kZXJlZCBWaWV3LlxuICAgICAgKiAqXG4gICAgICAqIFRvIGFjY2VzcyBhIGBWaWV3Q29udGFpbmVyUmVmYCBvZiBhbiBFbGVtZW50LCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIHtAbGluayBEaXJlY3RpdmV9IGluamVjdGVkXG4gICAgICAqIHdpdGggYFZpZXdDb250YWluZXJSZWZgIG9uIHRoZSBFbGVtZW50LCBvciB5b3Ugb2J0YWluIGl0IHZpYSBhIHtAbGluayBWaWV3Q2hpbGR9IHF1ZXJ5LlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBWaWV3Q29udGFpbmVyUmVmID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gVmlld0NvbnRhaW5lclJlZigpIHtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZi5wcm90b3R5cGUsIFwiZWxlbWVudFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBBbmNob3IgZWxlbWVudCB0aGF0IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgaW4gdGhlIGNvbnRhaW5pbmcgVmlldy5cbiAgICAgICAgICAgICAgKiA8IS0tIFRPRE86IHJlbmFtZSB0byBhbmNob3JFbGVtZW50IC0tPlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodW5pbXBsZW1lbnRlZCgpKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZSwgXCJpbmplY3RvclwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHVuaW1wbGVtZW50ZWQoKSk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZi5wcm90b3R5cGUsIFwicGFyZW50SW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh1bmltcGxlbWVudGVkKCkpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBEZXN0cm95cyBhbGwgVmlld3MgaW4gdGhpcyBjb250YWluZXIuXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0NvbnRhaW5lclJlZi5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUge0BsaW5rIFZpZXdSZWZ9IGZvciB0aGUgVmlldyBsb2NhdGVkIGluIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdDb250YWluZXJSZWYucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVmlld3MgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyLlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodW5pbXBsZW1lbnRlZCgpKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBJbnN0YW50aWF0ZXMgYW4gRW1iZWRkZWQgVmlldyBiYXNlZCBvbiB0aGUge0BsaW5rIFRlbXBsYXRlUmVmIGB0ZW1wbGF0ZVJlZmB9IGFuZCBpbnNlcnRzIGl0XG4gICAgICAgICAgKiBpbnRvIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIElmIGBpbmRleGAgaXMgbm90IHNwZWNpZmllZCwgdGhlIG5ldyBWaWV3IHdpbGwgYmUgaW5zZXJ0ZWQgYXMgdGhlIGxhc3QgVmlldyBpbiB0aGUgY29udGFpbmVyLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIFZpZXdSZWZ9IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBWaWV3LlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZlxuICAgICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZFZpZXcgPSBmdW5jdGlvbiAodGVtcGxhdGVSZWYsIGNvbnRleHQsIGluZGV4KSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgSW5zdGFudGlhdGVzIGEgc2luZ2xlIHtAbGluayBDb21wb25lbnR9IGFuZCBpbnNlcnRzIGl0cyBIb3N0IFZpZXcgaW50byB0aGlzIGNvbnRhaW5lciBhdCB0aGVcbiAgICAgICAgICAqIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgdXNpbmcgaXRzIHtAbGluayBDb21wb25lbnRGYWN0b3J5fSB3aGljaCBjYW4gYmVcbiAgICAgICAgICAqIG9idGFpbmVkIHZpYSB7QGxpbmsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyI3Jlc29sdmVDb21wb25lbnRGYWN0b3J5fS5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIElmIGBpbmRleGAgaXMgbm90IHNwZWNpZmllZCwgdGhlIG5ldyBWaWV3IHdpbGwgYmUgaW5zZXJ0ZWQgYXMgdGhlIGxhc3QgVmlldyBpbiB0aGUgY29udGFpbmVyLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgdGhlIHtAbGluayBJbmplY3Rvcn0gdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyZW50IGZvciB0aGUgQ29tcG9uZW50LlxuICAgICAgICAgICogKlxuICAgICAgICAgICogUmV0dXJucyB0aGUge0BsaW5rIENvbXBvbmVudFJlZn0gb2YgdGhlIEhvc3QgVmlldyBjcmVhdGVkIGZvciB0aGUgbmV3bHkgaW5zdGFudGlhdGVkIENvbXBvbmVudC5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50RmFjdG9yeVxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmplY3RvclxuICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZS5jcmVhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50RmFjdG9yeSwgaW5kZXgsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgSW5zZXJ0cyBhIFZpZXcgaWRlbnRpZmllZCBieSBhIHtAbGluayBWaWV3UmVmfSBpbnRvIHRoZSBjb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogSWYgYGluZGV4YCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmV3IFZpZXcgd2lsbCBiZSBpbnNlcnRlZCBhcyB0aGUgbGFzdCBWaWV3IGluIHRoZSBjb250YWluZXIuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbnNlcnRlZCB7QGxpbmsgVmlld1JlZn0uXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWZcbiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXJSZWYucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh2aWV3UmVmLCBpbmRleCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE1vdmVzIGEgVmlldyBpZGVudGlmaWVkIGJ5IGEge0BsaW5rIFZpZXdSZWZ9IGludG8gdGhlIGNvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBpbnNlcnRlZCB7QGxpbmsgVmlld1JlZn0uXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWZcbiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50SW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXJSZWYucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAodmlld1JlZiwgY3VycmVudEluZGV4KSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIFZpZXcsIHNwZWNpZmllZCB2aWEge0BsaW5rIFZpZXdSZWZ9LCB3aXRoaW4gdGhlIGN1cnJlbnQgY29udGFpbmVyIG9yXG4gICAgICAgICAgKiBgLTFgIGlmIHRoaXMgY29udGFpbmVyIGRvZXNuJ3QgY29udGFpbiB0aGUgVmlldy5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld1JlZlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0NvbnRhaW5lclJlZi5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uICh2aWV3UmVmKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgRGVzdHJveXMgYSBWaWV3IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIElmIGBpbmRleGAgaXMgbm90IHNwZWNpZmllZCwgdGhlIGxhc3QgVmlldyBpbiB0aGUgY29udGFpbmVyIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaW5kZXgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2UgYWxvbmcgd2l0aCB7QGxpbmsgI2luc2VydH0gdG8gbW92ZSBhIFZpZXcgd2l0aGluIHRoZSBjdXJyZW50IGNvbnRhaW5lci5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIElmIHRoZSBgaW5kZXhgIHBhcmFtIGlzIG9taXR0ZWQsIHRoZSBsYXN0IHtAbGluayBWaWV3UmVmfSBpcyBkZXRhY2hlZC5cbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmLnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoaW5kZXgpIHsgfTtcbiAgICAgICAgcmV0dXJuIFZpZXdDb250YWluZXJSZWY7XG4gICAgfSgpKTtcbiAgICB2YXIgVmlld0NvbnRhaW5lclJlZl8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gVmlld0NvbnRhaW5lclJlZl8oX2VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBfZWxlbWVudDtcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNvbXBvbmVudEluQ29udGFpbmVyU2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnVmlld0NvbnRhaW5lclJlZiNjcmVhdGVDb21wb25lbnQoKScpO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5faW5zZXJ0U2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnVmlld0NvbnRhaW5lclJlZiNpbnNlcnQoKScpO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnVmlld0NvbnRhaW5lclJlZiNyZW1vdmUoKScpO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICAgICAgdGhpcy5fZGV0YWNoU2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnVmlld0NvbnRhaW5lclJlZiNkZXRhY2goKScpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiB0aGlzLl9lbGVtZW50Lm5lc3RlZFZpZXdzW2luZGV4XS5yZWY7IH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlld3MgPSB0aGlzLl9lbGVtZW50Lm5lc3RlZFZpZXdzO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQodmlld3MpID8gdmlld3MubGVuZ3RoIDogMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLCBcImVsZW1lbnRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQuZWxlbWVudFJlZjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQuaW5qZWN0b3I7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLCBcInBhcmVudEluamVjdG9yXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50LnBhcmVudEluamVjdG9yOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWZcbiAgICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dFxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLmNyZWF0ZUVtYmVkZGVkVmlldyA9IGZ1bmN0aW9uICh0ZW1wbGF0ZVJlZiwgY29udGV4dCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gLTE7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdSZWYgPSB0ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLmluc2VydCh2aWV3UmVmLCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50RmFjdG9yeVxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmplY3RvclxuICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudEZhY3RvcnksIGluZGV4LCBpbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcykge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHsgaW5kZXggPSAtMTsgfVxuICAgICAgICAgICAgaWYgKGluamVjdG9yID09PSB2b2lkIDApIHsgaW5qZWN0b3IgPSBudWxsOyB9XG4gICAgICAgICAgICBpZiAocHJvamVjdGFibGVOb2RlcyA9PT0gdm9pZCAwKSB7IHByb2plY3RhYmxlTm9kZXMgPSBudWxsOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gdGhpcy5fY3JlYXRlQ29tcG9uZW50SW5Db250YWluZXJTY29wZSgpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29udGV4dEluamVjdG9yID0gaW5qZWN0b3IgfHwgdGhpcy5fZWxlbWVudC5wYXJlbnRJbmplY3RvcjtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGNvbnRleHRJbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcyk7XG4gICAgICAgICAgICB0aGlzLmluc2VydChjb21wb25lbnRSZWYuaG9zdFZpZXcsIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiB3dGZMZWF2ZShzLCBjb21wb25lbnRSZWYpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHZpZXdSZWYsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkgeyBpbmRleCA9IC0xOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gdGhpcy5faW5zZXJ0U2NvcGUoKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSlcbiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlld1JlZl8gPSAodmlld1JlZik7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmF0dGFjaFZpZXcodmlld1JlZl8uaW50ZXJuYWxWaWV3LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gd3RmTGVhdmUocywgdmlld1JlZl8pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmXG4gICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudEluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICh2aWV3UmVmLCBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHMgPSB0aGlzLl9pbnNlcnRTY29wZSgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3UmVmXyA9ICh2aWV3UmVmKTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQubW92ZVZpZXcodmlld1JlZl8uaW50ZXJuYWxWaWV3LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHZpZXdSZWZfKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld1JlZlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAodmlld1JlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQubmVzdGVkVmlld3MuaW5kZXhPZigoKHZpZXdSZWYpKS5pbnRlcm5hbFZpZXcpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gLTE7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHMgPSB0aGlzLl9yZW1vdmVTY29wZSgpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9IHRoaXMuX2VsZW1lbnQuZGV0YWNoVmlldyhpbmRleCk7XG4gICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIHZpZXcgaXMgaW50ZW50aW9uYWxseSBub3QgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC5cbiAgICAgICAgICAgIHd0ZkxlYXZlKHMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gLTE7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHMgPSB0aGlzLl9kZXRhY2hTY29wZSgpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9IHRoaXMuX2VsZW1lbnQuZGV0YWNoVmlldyhpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gd3RmTGVhdmUocywgdmlldy5yZWYpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFZpZXdDb250YWluZXJSZWZfO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQxMSA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBWaWV3UmVmID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDExKFZpZXdSZWYsIF9zdXBlcik7XG4gICAgICAgIGZ1bmN0aW9uIFZpZXdSZWYoKSB7XG4gICAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogIERlc3Ryb3lzIHRoZSB2aWV3IGFuZCBhbGwgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld1JlZi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdSZWYucHJvdG90eXBlLCBcImRlc3Ryb3llZFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHVuaW1wbGVtZW50ZWQoKSk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdSZWYucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyB9O1xuICAgICAgICByZXR1cm4gVmlld1JlZjtcbiAgICB9KENoYW5nZURldGVjdG9yUmVmKSk7XG4gICAgLyoqXG4gICAgICogIFJlcHJlc2VudHMgYW4gQW5ndWxhciBWaWV3LlxuICAgICAgKiAqXG4gICAgICAqIDwhLS0gVE9ETzogbW92ZSB0aGUgbmV4dCB0d28gcGFyYWdyYXBocyB0byB0aGUgZGV2IGd1aWRlIC0tPlxuICAgICAgKiBBIFZpZXcgaXMgYSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9jayBvZiB0aGUgYXBwbGljYXRpb24gVUkuIEl0IGlzIHRoZSBzbWFsbGVzdCBncm91cGluZyBvZlxuICAgICAgKiBFbGVtZW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHRvZ2V0aGVyLlxuICAgICAgKiAqXG4gICAgICAqIFByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gYSBWaWV3IGNhbiBjaGFuZ2UsIGJ1dCB0aGUgc3RydWN0dXJlIChudW1iZXIgYW5kIG9yZGVyKSBvZiBlbGVtZW50cyBpblxuICAgICAgKiBhIFZpZXcgY2Fubm90LiBDaGFuZ2luZyB0aGUgc3RydWN0dXJlIG9mIEVsZW1lbnRzIGNhbiBvbmx5IGJlIGRvbmUgYnkgaW5zZXJ0aW5nLCBtb3Zpbmcgb3JcbiAgICAgICogcmVtb3ZpbmcgbmVzdGVkIFZpZXdzIHZpYSBhIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfS4gRWFjaCBWaWV3IGNhbiBjb250YWluIG1hbnkgVmlldyBDb250YWluZXJzLlxuICAgICAgKiA8IS0tIC9UT0RPIC0tPlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogR2l2ZW4gdGhpcyB0ZW1wbGF0ZS4uLlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBDb3VudDoge3tpdGVtcy5sZW5ndGh9fVxuICAgICAgKiA8dWw+XG4gICAgICAqIDxsaSAqbmdGb3I9XCJsZXQgIGl0ZW0gb2YgaXRlbXNcIj57e2l0ZW19fTwvbGk+XG4gICAgICAqIDwvdWw+XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIFdlIGhhdmUgdHdvIHtAbGluayBUZW1wbGF0ZVJlZn1zOlxuICAgICAgKiAqXG4gICAgICAqIE91dGVyIHtAbGluayBUZW1wbGF0ZVJlZn06XG4gICAgICAqIGBgYFxuICAgICAgKiBDb3VudDoge3tpdGVtcy5sZW5ndGh9fVxuICAgICAgKiA8dWw+XG4gICAgICAqIDx0ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiPjwvdGVtcGxhdGU+XG4gICAgICAqIDwvdWw+XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIElubmVyIHtAbGluayBUZW1wbGF0ZVJlZn06XG4gICAgICAqIGBgYFxuICAgICAgKiA8bGk+e3tpdGVtfX08L2xpPlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiBOb3RpY2UgdGhhdCB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgaXMgYnJva2VuIGRvd24gaW50byB0d28gc2VwYXJhdGUge0BsaW5rIFRlbXBsYXRlUmVmfXMuXG4gICAgICAqICpcbiAgICAgICogVGhlIG91dGVyL2lubmVyIHtAbGluayBUZW1wbGF0ZVJlZn1zIGFyZSB0aGVuIGFzc2VtYmxlZCBpbnRvIHZpZXdzIGxpa2Ugc286XG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIDwhLS0gVmlld1JlZjogb3V0ZXItMCAtLT5cbiAgICAgICogQ291bnQ6IDJcbiAgICAgICogPHVsPlxuICAgICAgKiA8dGVtcGxhdGUgdmlldy1jb250YWluZXItcmVmPjwvdGVtcGxhdGU+XG4gICAgICAqIDwhLS0gVmlld1JlZjogaW5uZXItMSAtLT48bGk+Zmlyc3Q8L2xpPjwhLS0gL1ZpZXdSZWY6IGlubmVyLTEgLS0+XG4gICAgICAqIDwhLS0gVmlld1JlZjogaW5uZXItMiAtLT48bGk+c2Vjb25kPC9saT48IS0tIC9WaWV3UmVmOiBpbm5lci0yIC0tPlxuICAgICAgKiA8L3VsPlxuICAgICAgKiA8IS0tIC9WaWV3UmVmOiBvdXRlci0wIC0tPlxuICAgICAgKiBgYGBcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgRW1iZWRkZWRWaWV3UmVmID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDExKEVtYmVkZGVkVmlld1JlZiwgX3N1cGVyKTtcbiAgICAgICAgZnVuY3Rpb24gRW1iZWRkZWRWaWV3UmVmKCkge1xuICAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVtYmVkZGVkVmlld1JlZi5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVtYmVkZGVkVmlld1JlZi5wcm90b3R5cGUsIFwicm9vdE5vZGVzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodW5pbXBsZW1lbnRlZCgpKTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIDtcbiAgICAgICAgcmV0dXJuIEVtYmVkZGVkVmlld1JlZjtcbiAgICB9KFZpZXdSZWYpKTtcbiAgICB2YXIgVmlld1JlZl8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld1xuICAgICAgICAgKiBAcGFyYW0gez99IGFuaW1hdGlvblF1ZXVlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBWaWV3UmVmXyhfdmlldywgYW5pbWF0aW9uUXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXcgPSBfdmlldztcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uUXVldWUgPSBhbmltYXRpb25RdWV1ZTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXcgPSBfdmlldztcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTW9kZSA9IHRoaXMuX3ZpZXcuY2RNb2RlO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3UmVmXy5wcm90b3R5cGUsIFwiaW50ZXJuYWxWaWV3XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92aWV3OyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdSZWZfLnByb3RvdHlwZSwgXCJyb290Tm9kZXNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3ZpZXcuZmxhdFJvb3ROb2RlczsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3UmVmXy5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdmlldy5jb250ZXh0OyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdSZWZfLnByb3RvdHlwZSwgXCJkZXN0cm95ZWRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3ZpZXcuZGVzdHJveWVkOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3UmVmXy5wcm90b3R5cGUubWFya0ZvckNoZWNrID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3Lm1hcmtQYXRoVG9Sb290QXNDaGVja09uY2UoKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3UmVmXy5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3LmNkTW9kZSA9IENoYW5nZURldGVjdG9yU3RhdHVzLkRldGFjaGVkOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdSZWZfLnByb3RvdHlwZS5kZXRlY3RDaGFuZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fdmlldy5kZXRlY3RDaGFuZ2VzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uUXVldWUuZmx1c2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3UmVmXy5wcm90b3R5cGUuY2hlY2tOb0NoYW5nZXMgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3ZpZXcuZGV0ZWN0Q2hhbmdlcyh0cnVlKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3UmVmXy5wcm90b3R5cGUucmVhdHRhY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3LmNkTW9kZSA9IHRoaXMuX29yaWdpbmFsTW9kZTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3UmVmXy5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXcuZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3LmRpc3Bvc2FibGVzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl92aWV3LmRpc3Bvc2FibGVzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdSZWZfLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3LmRldGFjaEFuZERlc3Ryb3koKTsgfTtcbiAgICAgICAgcmV0dXJuIFZpZXdSZWZfO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQxMiA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIHZhciBFdmVudExpc3RlbmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBFdmVudExpc3RlbmVyKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIDtcbiAgICAgICAgcmV0dXJuIEV2ZW50TGlzdGVuZXI7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsIEFsbCBkZWJ1Z2dpbmcgYXBpcyBhcmUgY3VycmVudGx5IGV4cGVyaW1lbnRhbC5cbiAgICAgKi9cbiAgICB2YXIgRGVidWdOb2RlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmF0aXZlTm9kZVxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICAgKiBAcGFyYW0gez99IF9kZWJ1Z0luZm9cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIERlYnVnTm9kZShuYXRpdmVOb2RlLCBwYXJlbnQsIF9kZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnSW5mbyA9IF9kZWJ1Z0luZm87XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZU5vZGUgPSBuYXRpdmVOb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGUucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWJ1Z0luZm8gPyB0aGlzLl9kZWJ1Z0luZm8uaW5qZWN0b3IgOiBudWxsOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZS5wcm90b3R5cGUsIFwiY29tcG9uZW50SW5zdGFuY2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlYnVnSW5mbyA/IHRoaXMuX2RlYnVnSW5mby5jb21wb25lbnQgOiBudWxsOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZS5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVidWdJbmZvID8gdGhpcy5fZGVidWdJbmZvLmNvbnRleHQgOiBudWxsOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZS5wcm90b3R5cGUsIFwicmVmZXJlbmNlc1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWJ1Z0luZm8gPyB0aGlzLl9kZWJ1Z0luZm8ucmVmZXJlbmNlcyA6IG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZS5wcm90b3R5cGUsIFwicHJvdmlkZXJUb2tlbnNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlYnVnSW5mbyA/IHRoaXMuX2RlYnVnSW5mby5wcm92aWRlclRva2VucyA6IG51bGw7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdOb2RlLnByb3RvdHlwZSwgXCJzb3VyY2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlYnVnSW5mbyA/IHRoaXMuX2RlYnVnSW5mby5zb3VyY2UgOiBudWxsOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIERlYnVnTm9kZTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIEBleHBlcmltZW50YWwgQWxsIGRlYnVnZ2luZyBhcGlzIGFyZSBjdXJyZW50bHkgZXhwZXJpbWVudGFsLlxuICAgICAqL1xuICAgIHZhciBEZWJ1Z0VsZW1lbnQgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMTIoRGVidWdFbGVtZW50LCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYXRpdmVOb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gX2RlYnVnSW5mb1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVidWdFbGVtZW50KG5hdGl2ZU5vZGUsIHBhcmVudCwgX2RlYnVnSW5mbykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbmF0aXZlTm9kZSwgcGFyZW50LCBfZGVidWdJbmZvKTtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG4gICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IG5hdGl2ZU5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2hpbGRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRWxlbWVudC5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjaGlsZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRJbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKGNoaWxkKTtcbiAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnNwbGljZShjaGlsZEluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2hpbGRcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdDaGlsZHJlblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRDaGlsZHJlbkFmdGVyID0gZnVuY3Rpb24gKGNoaWxkLCBuZXdDaGlsZHJlbikge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2libGluZ0luZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGQpO1xuICAgICAgICAgICAgaWYgKHNpYmxpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2aW91c0NoaWxkcmVuID0gdGhpcy5jaGlsZE5vZGVzLnNsaWNlKDAsIHNpYmxpbmdJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHRDaGlsZHJlbiA9IHRoaXMuY2hpbGROb2Rlcy5zbGljZShzaWJsaW5nSW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMgPSBwcmV2aW91c0NoaWxkcmVuLmNvbmNhdChuZXdDaGlsZHJlbiwgbmV4dENoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV3Q2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50LnJlbW92ZUNoaWxkKG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJlZGljYXRlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0VsZW1lbnQucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0cyA9IHRoaXMucXVlcnlBbGwocHJlZGljYXRlKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzWzBdIHx8IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdFbGVtZW50LnByb3RvdHlwZS5xdWVyeUFsbCA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoZXMgPSBbXTtcbiAgICAgICAgICAgIF9xdWVyeUVsZW1lbnRDaGlsZHJlbih0aGlzLCBwcmVkaWNhdGUsIG1hdGNoZXMpO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdFbGVtZW50LnByb3RvdHlwZS5xdWVyeUFsbE5vZGVzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuKHRoaXMsIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnRWxlbWVudC5wcm90b3R5cGUsIFwiY2hpbGRyZW5cIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuY2hpbGROb2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQ7IH0pKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE9ialxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdFbGVtZW50LnByb3RvdHlwZS50cmlnZ2VyRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZXZlbnRPYmopIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLm5hbWUgPT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKGV2ZW50T2JqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlYnVnRWxlbWVudDtcbiAgICB9KERlYnVnTm9kZSkpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZGVidWdFbHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzTmF0aXZlRWxlbWVudHMoZGVidWdFbHMpIHtcbiAgICAgICAgcmV0dXJuIGRlYnVnRWxzLm1hcChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLm5hdGl2ZUVsZW1lbnQ7IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZVxuICAgICAqIEBwYXJhbSB7P30gbWF0Y2hlc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gX3F1ZXJ5RWxlbWVudENoaWxkcmVuKGVsZW1lbnQsIHByZWRpY2F0ZSwgbWF0Y2hlcykge1xuICAgICAgICBlbGVtZW50LmNoaWxkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3F1ZXJ5RWxlbWVudENoaWxkcmVuKG5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHBhcmVudE5vZGVcbiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZVxuICAgICAqIEBwYXJhbSB7P30gbWF0Y2hlc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gX3F1ZXJ5Tm9kZUNoaWxkcmVuKHBhcmVudE5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcykge1xuICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIERlYnVnRWxlbWVudCkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuKG5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTmVlZCB0byBrZWVwIHRoZSBub2RlcyBpbiBhIGdsb2JhbCBNYXAgc28gdGhhdCBtdWx0aXBsZSBhbmd1bGFyIGFwcHMgYXJlIHN1cHBvcnRlZC5cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfbmF0aXZlTm9kZVRvRGVidWdOb2RlID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gbmF0aXZlTm9kZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0RGVidWdOb2RlKG5hdGl2ZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIF9uYXRpdmVOb2RlVG9EZWJ1Z05vZGUuZ2V0KG5hdGl2ZU5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4RGVidWdOb2RlKG5vZGUpIHtcbiAgICAgICAgX25hdGl2ZU5vZGVUb0RlYnVnTm9kZS5zZXQobm9kZS5uYXRpdmVOb2RlLCBub2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW1vdmVEZWJ1Z05vZGVGcm9tSW5kZXgobm9kZSkge1xuICAgICAgICBfbmF0aXZlTm9kZVRvRGVidWdOb2RlLmRlbGV0ZShub2RlLm5hdGl2ZU5vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gX3JlZmxlY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHJlZmxlY3RvcjtcbiAgICB9XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX0NPUkVfUExBVEZPUk1fUFJPVklERVJTID0gW1xuICAgICAgICBQbGF0Zm9ybVJlZl8sXG4gICAgICAgIHsgcHJvdmlkZTogUGxhdGZvcm1SZWYsIHVzZUV4aXN0aW5nOiBQbGF0Zm9ybVJlZl8gfSxcbiAgICAgICAgeyBwcm92aWRlOiBSZWZsZWN0b3IsIHVzZUZhY3Rvcnk6IF9yZWZsZWN0b3IsIGRlcHM6IFtdIH0sXG4gICAgICAgIHsgcHJvdmlkZTogUmVmbGVjdG9yUmVhZGVyLCB1c2VFeGlzdGluZzogUmVmbGVjdG9yIH0sXG4gICAgICAgIFRlc3RhYmlsaXR5UmVnaXN0cnksXG4gICAgICAgIENvbnNvbGUsXG4gICAgXTtcbiAgICAvKipcbiAgICAgKiBUaGlzIHBsYXRmb3JtIGhhcyB0byBiZSBpbmNsdWRlZCBpbiBhbnkgb3RoZXIgcGxhdGZvcm1cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbGF0Zm9ybUNvcmUgPSBjcmVhdGVQbGF0Zm9ybUZhY3RvcnkobnVsbCwgJ2NvcmUnLCBfQ09SRV9QTEFURk9STV9QUk9WSURFUlMpO1xuXG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbCBpMThuIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLlxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIExPQ0FMRV9JRCA9IG5ldyBPcGFxdWVUb2tlbignTG9jYWxlSWQnKTtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsIGkxOG4gc3VwcG9ydCBpcyBleHBlcmltZW50YWwuXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVFJBTlNMQVRJT05TID0gbmV3IE9wYXF1ZVRva2VuKCdUcmFuc2xhdGlvbnMnKTtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsIGkxOG4gc3VwcG9ydCBpcyBleHBlcmltZW50YWwuXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVFJBTlNMQVRJT05TX0ZPUk1BVCA9IG5ldyBPcGFxdWVUb2tlbignVHJhbnNsYXRpb25zRm9ybWF0Jyk7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5KCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdEl0ZXJhYmxlRGlmZmVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfa2V5VmFsdWVEaWZmZXJzRmFjdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRLZXlWYWx1ZURpZmZlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBUaGlzIG1vZHVsZSBpbmNsdWRlcyB0aGUgcHJvdmlkZXJzIG9mIEBhbmd1bGFyL2NvcmUgdGhhdCBhcmUgbmVlZGVkXG4gICAgICAqIHRvIGJvb3RzdHJhcCBjb21wb25lbnRzIHZpYSBgQXBwbGljYXRpb25SZWZgLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFwcGxpY2F0aW9uTW9kdWxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQXBwbGljYXRpb25Nb2R1bGUoKSB7XG4gICAgICAgIH1cbiAgICAgICAgQXBwbGljYXRpb25Nb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblJlZl8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBBcHBsaWNhdGlvblJlZiwgdXNlRXhpc3Rpbmc6IEFwcGxpY2F0aW9uUmVmXyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5pdFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFBfSURfUkFORE9NX1BST1ZJREVSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdVdGlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRpb25RdWV1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEl0ZXJhYmxlRGlmZmVycywgdXNlRmFjdG9yeTogX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEtleVZhbHVlRGlmZmVycywgdXNlRmFjdG9yeTogX2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IExPQ0FMRV9JRCwgdXNlVmFsdWU6ICdlbi1VUycgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBBcHBsaWNhdGlvbk1vZHVsZS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gQXBwbGljYXRpb25Nb2R1bGU7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBGSUxMX1NUWUxFX0ZMQUcgPSAndHJ1ZSc7IC8vIFRPRE8gKG1hdHNrbyk6IGNoYW5nZSB0byBib29sZWFuXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQU5ZX1NUQVRFID0gJyonO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIERFRkFVTFRfU1RBVEUgPSAnKic7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRU1QVFlfU1RBVEUgPSAndm9pZCc7XG5cbiAgICB2YXIgQW5pbWF0aW9uR3JvdXBQbGF5ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxheWVyc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uR3JvdXBQbGF5ZXIoX3BsYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzID0gX3BsYXllcnM7XG4gICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50UGxheWVyID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgICAgICB2YXIgdG90YWwgPSB0aGlzLl9wbGF5ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0b3RhbCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX29uRmluaXNoKCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBhcmVudFBsYXllciA9IF90aGlzO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIub25Eb25lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID49IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29uRmluaXNoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uR3JvdXBQbGF5ZXIucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25Hcm91cFBsYXllci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHsgcmV0dXJuIHBsYXllci5pbml0KCk7IH0pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uR3JvdXBQbGF5ZXIucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5vbkRvbmUgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5fb25Eb25lRm5zLnB1c2goZm4pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5oYXNTdGFydGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc3RhcnRlZDsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25Hcm91cFBsYXllci5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghaXNQcmVzZW50KHRoaXMucGFyZW50UGxheWVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIucGxheSgpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25Hcm91cFBsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIucGF1c2UoKTsgfSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uR3JvdXBQbGF5ZXIucHJvdG90eXBlLnJlc3RhcnQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIucmVzdGFydCgpOyB9KTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25Hcm91cFBsYXllci5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIuZmluaXNoKCk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkZpbmlzaCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIuZGVzdHJveSgpOyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIucmVzZXQoKTsgfSk7XG4gICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikgeyBwbGF5ZXIuc2V0UG9zaXRpb24ocCk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvbkdyb3VwUGxheWVyLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1pbiA9IDA7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHAgPSBwbGF5ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihwLCBtaW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbWluO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQW5pbWF0aW9uR3JvdXBQbGF5ZXIucHJvdG90eXBlLCBcInBsYXllcnNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BsYXllcnM7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gQW5pbWF0aW9uR3JvdXBQbGF5ZXI7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgQW5pbWF0aW9uS2V5ZnJhbWUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbktleWZyYW1lKG9mZnNldCwgc3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBbmltYXRpb25LZXlmcmFtZTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvblBsYXllciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvblBsYXllcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUub25Eb25lID0gZnVuY3Rpb24gKGZuKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKGZuKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5oYXNTdGFydGVkID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHBcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAocCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZSwgXCJwYXJlbnRQbGF5ZXJcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCdOT1QgSU1QTEVNRU5URUQ6IEJhc2UgQ2xhc3MnKTsgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXJcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHBsYXllcikgeyB0aHJvdyBuZXcgRXJyb3IoJ05PVCBJTVBMRU1FTlRFRDogQmFzZSBDbGFzcycpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblBsYXllcjtcbiAgICB9KCkpO1xuICAgIHZhciBOb09wQW5pbWF0aW9uUGxheWVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gTm9PcEFuaW1hdGlvblBsYXllcigpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50UGxheWVyID0gbnVsbDtcbiAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9vbkZpbmlzaCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfSk7XG4gICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLm9uRG9uZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkRvbmVGbnMucHVzaChmbik7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTm9PcEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuaGFzU3RhcnRlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQ7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTm9PcEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOb09wQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLnJlc3RhcnQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTm9PcEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9vbkZpbmlzaCgpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTm9PcEFuaW1hdGlvblBsYXllci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5vT3BBbmltYXRpb25QbGF5ZXIucHJvdG90eXBlLnNldFBvc2l0aW9uID0gZnVuY3Rpb24gKHApIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOb09wQW5pbWF0aW9uUGxheWVyLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDA7IH07XG4gICAgICAgIHJldHVybiBOb09wQW5pbWF0aW9uUGxheWVyO1xuICAgIH0oKSk7XG5cbiAgICB2YXIgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxheWVyc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIoX3BsYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzID0gX3BsYXllcnM7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zID0gW107XG4gICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnBhcmVudFBsYXllciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikgeyBwbGF5ZXIucGFyZW50UGxheWVyID0gX3RoaXM7IH0pO1xuICAgICAgICAgICAgdGhpcy5fb25OZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdGFydFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIucHJvdG90eXBlLl9vbk5leHQgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmluaXNoZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXllcnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVQbGF5ZXIgPSBuZXcgTm9PcEFuaW1hdGlvblBsYXllcigpO1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9vbkZpbmlzaCgpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2N1cnJlbnRJbmRleCA+PSB0aGlzLl9wbGF5ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVBsYXllciA9IG5ldyBOb09wQW5pbWF0aW9uUGxheWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllciA9IHRoaXMuX3BsYXllcnNbdGhpcy5fY3VycmVudEluZGV4KytdO1xuICAgICAgICAgICAgICAgIHBsYXllci5vbkRvbmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX29uTmV4dCh0cnVlKTsgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlUGxheWVyID0gcGxheWVyO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25TZXF1ZW5jZVBsYXllci5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9maW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikgeyByZXR1cm4gcGxheWVyLmluaXQoKTsgfSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25TZXF1ZW5jZVBsYXllci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vblN0YXJ0Rm5zLnB1c2goZm4pOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIucHJvdG90eXBlLm9uRG9uZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkRvbmVGbnMucHVzaChmbik7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIucHJvdG90eXBlLmhhc1N0YXJ0ZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQodGhpcy5wYXJlbnRQbGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzU3RhcnRlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlUGxheWVyLnBsYXkoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25TZXF1ZW5jZVBsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2FjdGl2ZVBsYXllci5wYXVzZSgpOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BsYXllcnNbMF0ucmVzdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYXllcnMuZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7IHJldHVybiBwbGF5ZXIucmVzZXQoKTsgfSk7XG4gICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRmluaXNoKCk7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikgeyByZXR1cm4gcGxheWVyLmZpbmlzaCgpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25TZXF1ZW5jZVBsYXllci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wbGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKHBsYXllcikgeyByZXR1cm4gcGxheWVyLmRlc3Ryb3koKTsgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVQbGF5ZXIgPSBuZXcgTm9PcEFuaW1hdGlvblBsYXllcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25TZXF1ZW5jZVBsYXllci5wcm90b3R5cGUuc2V0UG9zaXRpb24gPSBmdW5jdGlvbiAocCkgeyB0aGlzLl9wbGF5ZXJzWzBdLnNldFBvc2l0aW9uKHApOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BsYXllcnNbMF0uZ2V0UG9zaXRpb24oKTsgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFuaW1hdGlvblNlcXVlbmNlUGxheWVyLnByb3RvdHlwZSwgXCJwbGF5ZXJzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wbGF5ZXJzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQxMyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBleHBlcmltZW50YWwgQW5pbWF0aW9uIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLlxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEFVVE9fU1RZTEUgPSAnKic7XG4gICAgLyoqXG4gICAgICogIE1ldGFkYXRhIHJlcHJlc2VudGluZyB0aGUgZW50cnkgb2YgYW5pbWF0aW9ucy5cbiAgICAgICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHByb3ZpZGVkIHZpYSB0aGUgYW5pbWF0aW9uIERTTCB3aGVuIHRoZSB7QGxpbmsgdHJpZ2dlciB0cmlnZ2VyXG4gICAgICAqIGFuaW1hdGlvbiBmdW5jdGlvbn0gaXMgY2FsbGVkLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvbkVudHJ5TWV0YWRhdGEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gZGVmaW5pdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkVudHJ5TWV0YWRhdGEobmFtZSwgZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB0aGlzLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvbkVudHJ5TWV0YWRhdGE7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlTWV0YWRhdGEoKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblN0YXRlTWV0YWRhdGE7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgTWV0YWRhdGEgcmVwcmVzZW50aW5nIHRoZSBlbnRyeSBvZiBhbmltYXRpb25zLlxuICAgICAgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgcHJvdmlkZWQgdmlhIHRoZSBhbmltYXRpb24gRFNMIHdoZW4gdGhlIHtAbGluayBzdGF0ZSBzdGF0ZSBhbmltYXRpb25cbiAgICAgICogZnVuY3Rpb259IGlzIGNhbGxlZC5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMTMoQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbk1ldGFkYXRhLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZU5hbWVFeHByXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEoc3RhdGVOYW1lRXhwciwgc3R5bGVzKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVOYW1lRXhwciA9IHN0YXRlTmFtZUV4cHI7XG4gICAgICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbk1ldGFkYXRhO1xuICAgIH0oQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqICBNZXRhZGF0YSByZXByZXNlbnRpbmcgdGhlIGVudHJ5IG9mIGFuaW1hdGlvbnMuXG4gICAgICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBwcm92aWRlZCB2aWEgdGhlIGFuaW1hdGlvbiBEU0wgd2hlbiB0aGVcbiAgICAgICoge0BsaW5rIHRyYW5zaXRpb24gdHJhbnNpdGlvbiBhbmltYXRpb24gZnVuY3Rpb259IGlzIGNhbGxlZC5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxMyhBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVDaGFuZ2VFeHByXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RlcHNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhKHN0YXRlQ2hhbmdlRXhwciwgc3RlcHMpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZUV4cHIgPSBzdGF0ZUNoYW5nZUV4cHI7XG4gICAgICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblN0YXRlVHJhbnNpdGlvbk1ldGFkYXRhO1xuICAgIH0oQW5pbWF0aW9uU3RhdGVNZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBbmltYXRpb25NZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbk1ldGFkYXRhKCkge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBbmltYXRpb25NZXRhZGF0YTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBNZXRhZGF0YSByZXByZXNlbnRpbmcgdGhlIGVudHJ5IG9mIGFuaW1hdGlvbnMuXG4gICAgICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBwcm92aWRlZCB2aWEgdGhlIGFuaW1hdGlvbiBEU0wgd2hlbiB0aGUge0BsaW5rIGtleWZyYW1lcyBrZXlmcmFtZXNcbiAgICAgICogYW5pbWF0aW9uIGZ1bmN0aW9ufSBpcyBjYWxsZWQuXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxMyhBbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdGVwc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YShzdGVwcykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvbktleWZyYW1lc1NlcXVlbmNlTWV0YWRhdGE7XG4gICAgfShBbmltYXRpb25NZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqICBNZXRhZGF0YSByZXByZXNlbnRpbmcgdGhlIGVudHJ5IG9mIGFuaW1hdGlvbnMuXG4gICAgICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBwcm92aWRlZCB2aWEgdGhlIGFuaW1hdGlvbiBEU0wgd2hlbiB0aGUge0BsaW5rIHN0eWxlIHN0eWxlIGFuaW1hdGlvblxuICAgICAgKiBmdW5jdGlvbn0gaXMgY2FsbGVkLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvblN0eWxlTWV0YWRhdGEgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMTMoQW5pbWF0aW9uU3R5bGVNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9mZnNldFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uU3R5bGVNZXRhZGF0YShzdHlsZXMsIG9mZnNldCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gdm9pZCAwKSB7IG9mZnNldCA9IG51bGw7IH1cbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQW5pbWF0aW9uU3R5bGVNZXRhZGF0YTtcbiAgICB9KEFuaW1hdGlvbk1ldGFkYXRhKSk7XG4gICAgLyoqXG4gICAgICogIE1ldGFkYXRhIHJlcHJlc2VudGluZyB0aGUgZW50cnkgb2YgYW5pbWF0aW9ucy5cbiAgICAgICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHByb3ZpZGVkIHZpYSB0aGUgYW5pbWF0aW9uIERTTCB3aGVuIHRoZSB7QGxpbmsgYW5pbWF0ZSBhbmltYXRlXG4gICAgICAqIGFuaW1hdGlvbiBmdW5jdGlvbn0gaXMgY2FsbGVkLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvbkFuaW1hdGVNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxMyhBbmltYXRpb25BbmltYXRlTWV0YWRhdGEsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRpbWluZ3NcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkFuaW1hdGVNZXRhZGF0YSh0aW1pbmdzLCBzdHlsZXMpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy50aW1pbmdzID0gdGltaW5ncztcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBbmltYXRpb25BbmltYXRlTWV0YWRhdGE7XG4gICAgfShBbmltYXRpb25NZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxMyhBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEoKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEucHJvdG90eXBlLCBcInN0ZXBzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBFcnJvcignTk9UIElNUExFTUVOVEVEOiBCYXNlIENsYXNzJyk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGE7XG4gICAgfShBbmltYXRpb25NZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqICBNZXRhZGF0YSByZXByZXNlbnRpbmcgdGhlIGVudHJ5IG9mIGFuaW1hdGlvbnMuXG4gICAgICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBwcm92aWRlZCB2aWEgdGhlIGFuaW1hdGlvbiBEU0wgd2hlbiB0aGUge0BsaW5rIHNlcXVlbmNlIHNlcXVlbmNlXG4gICAgICAqIGFuaW1hdGlvbiBmdW5jdGlvbn0gaXMgY2FsbGVkLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGEgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMTMoQW5pbWF0aW9uU2VxdWVuY2VNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3N0ZXBzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhKF9zdGVwcykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9zdGVwcyA9IF9zdGVwcztcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQW5pbWF0aW9uU2VxdWVuY2VNZXRhZGF0YS5wcm90b3R5cGUsIFwic3RlcHNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3N0ZXBzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGE7XG4gICAgfShBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqICBNZXRhZGF0YSByZXByZXNlbnRpbmcgdGhlIGVudHJ5IG9mIGFuaW1hdGlvbnMuXG4gICAgICAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBwcm92aWRlZCB2aWEgdGhlIGFuaW1hdGlvbiBEU0wgd2hlbiB0aGUge0BsaW5rIGdyb3VwIGdyb3VwIGFuaW1hdGlvblxuICAgICAgKiBmdW5jdGlvbn0gaXMgY2FsbGVkLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvbkdyb3VwTWV0YWRhdGEgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMTMoQW5pbWF0aW9uR3JvdXBNZXRhZGF0YSwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3N0ZXBzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBbmltYXRpb25Hcm91cE1ldGFkYXRhKF9zdGVwcykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9zdGVwcyA9IF9zdGVwcztcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQW5pbWF0aW9uR3JvdXBNZXRhZGF0YS5wcm90b3R5cGUsIFwic3RlcHNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3N0ZXBzOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvbkdyb3VwTWV0YWRhdGE7XG4gICAgfShBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YSkpO1xuICAgIC8qKlxuICAgICAqICBgYW5pbWF0ZWAgaXMgYW4gYW5pbWF0aW9uLXNwZWNpZmljIGZ1bmN0aW9uIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbnNpZGUgb2YgQW5ndWxhcjInc1xuICAgICAgKiBhbmltYXRpb25cbiAgICAgICogRFNMIGxhbmd1YWdlLiBJZiB0aGlzIGluZm9ybWF0aW9uIGlzIG5ldywgcGxlYXNlIG5hdmlnYXRlIHRvIHRoZVxuICAgICAgKiB7QGxpbmsgQ29tcG9uZW50I2FuaW1hdGlvbnMtYW5jaG9yIGNvbXBvbmVudCBhbmltYXRpb25zIG1ldGFkYXRhXG4gICAgICAqIHBhZ2V9IHRvIGdhaW4gYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgYW5pbWF0aW9ucyBpbiBBbmd1bGFyMiBhcmUgdXNlZC5cbiAgICAgICogKlxuICAgICAgKiBgYW5pbWF0ZWAgc3BlY2lmaWVzIGFuIGFuaW1hdGlvbiBzdGVwIHRoYXQgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgYHN0eWxlc2AgZGF0YSBmb3IgYSBnaXZlblxuICAgICAgKiBhbW91bnQgb2ZcbiAgICAgICogdGltZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYHRpbWluZ2AgZXhwcmVzc2lvbiB2YWx1ZS4gQ2FsbHMgdG8gYGFuaW1hdGVgIGFyZSBleHBlY3RlZCB0byBiZVxuICAgICAgKiB1c2VkIHdpdGhpbiB7QGxpbmsgc2VxdWVuY2UgYW4gYW5pbWF0aW9uIHNlcXVlbmNlfSwge0BsaW5rIGdyb3VwIGdyb3VwfSwgb3Ige0BsaW5rIHRyYW5zaXRpb25cbiAgICAgICogdHJhbnNpdGlvbn0uXG4gICAgICAqICpcbiAgICAgICogIyMjIFVzYWdlXG4gICAgICAqICpcbiAgICAgICogVGhlIGBhbmltYXRlYCBmdW5jdGlvbiBhY2NlcHRzIHR3byBpbnB1dCBwYXJhbWV0ZXJzOiBgdGltaW5nYCBhbmQgYHN0eWxlc2A6XG4gICAgICAqICpcbiAgICAgICogLSBgdGltaW5nYCBpcyBhIHN0cmluZyBiYXNlZCB2YWx1ZSB0aGF0IGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGEgZHVyYXRpb24gd2l0aCBvcHRpb25hbFxuICAgICAgKiBkZWxheSBhbmQgZWFzaW5nIHZhbHVlcy4gVGhlIGZvcm1hdCBmb3IgdGhlIGV4cHJlc3Npb24gYnJlYWtzIGRvd24gdG8gYGR1cmF0aW9uIGRlbGF5IGVhc2luZ2BcbiAgICAgICogKHRoZXJlZm9yZSBhIHZhbHVlIHN1Y2ggYXMgYDFzIDEwMG1zIGVhc2Utb3V0YCB3aWxsIGJlIHBhcnNlIGl0c2VsZiBpbnRvIGBkdXJhdGlvbj0xMDAwLFxuICAgICAgKiBkZWxheT0xMDAsIGVhc2luZz1lYXNlLW91dGAuXG4gICAgICAqIElmIGEgbnVtZXJpYyB2YWx1ZSBpcyBwcm92aWRlZCB0aGVuIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBgZHVyYXRpb25gIHZhbHVlIGluIG1pbGxpc2Vjb25kXG4gICAgICAqIGZvcm0uXG4gICAgICAqIC0gYHN0eWxlc2AgaXMgdGhlIHN0eWxlIGlucHV0IGRhdGEgd2hpY2ggY2FuIGVpdGhlciBiZSBhIGNhbGwgdG8ge0BsaW5rIHN0eWxlIHN0eWxlfSBvciB7QGxpbmtcbiAgICAgICoga2V5ZnJhbWVzIGtleWZyYW1lc30uXG4gICAgICAqIElmIGxlZnQgZW1wdHkgdGhlbiB0aGUgc3R5bGVzIGZyb20gdGhlIGRlc3RpbmF0aW9uIHN0YXRlIHdpbGwgYmUgY29sbGVjdGVkIGFuZCB1c2VkICh0aGlzIGlzXG4gICAgICAqIHVzZWZ1bCB3aGVuXG4gICAgICAqIGRlc2NyaWJpbmcgYW4gYW5pbWF0aW9uIHN0ZXAgdGhhdCB3aWxsIGNvbXBsZXRlIGFuIGFuaW1hdGlvbiBieSB7QGxpbmtcbiAgICAgICogdHJhbnNpdGlvbiN0aGUtZmluYWwtYW5pbWF0ZS1jYWxsIGFuaW1hdGluZyB0byB0aGUgZmluYWwgc3RhdGV9KS5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIC8vIHZhcmlvdXMgZnVuY3Rpb25zIGZvciBzcGVjaWZ5aW5nIHRpbWluZyBkYXRhXG4gICAgICAqIGFuaW1hdGUoNTAwLCBzdHlsZSguLi4pKVxuICAgICAgKiBhbmltYXRlKFwiMXNcIiwgc3R5bGUoLi4uKSlcbiAgICAgICogYW5pbWF0ZShcIjEwMG1zIDAuNXNcIiwgc3R5bGUoLi4uKSlcbiAgICAgICogYW5pbWF0ZShcIjVzIGVhc2VcIiwgc3R5bGUoLi4uKSlcbiAgICAgICogYW5pbWF0ZShcIjVzIDEwbXMgY3ViaWMtYmV6aWVyKC4xNywuNjcsLjg4LC4xKVwiLCBzdHlsZSguLi4pKVxuICAgICAgKiAqXG4gICAgICAqIC8vIGVpdGhlciBzdHlsZSgpIG9mIGtleWZyYW1lcygpIGNhbiBiZSB1c2VkXG4gICAgICAqIGFuaW1hdGUoNTAwLCBzdHlsZSh7IGJhY2tncm91bmQ6IFwicmVkXCIgfSkpXG4gICAgICAqIGFuaW1hdGUoNTAwLCBrZXlmcmFtZXMoW1xuICAgICAgKiBzdHlsZSh7IGJhY2tncm91bmQ6IFwiYmx1ZVwiIH0pKSxcbiAgICAgICogc3R5bGUoeyBiYWNrZ3JvdW5kOiBcInJlZFwiIH0pKVxuICAgICAgKiBdKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS2V6OFhHV0J4V3VlN3FQN25OdkY/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9hbmltYXRpb24vdHMvZHNsL2FuaW1hdGlvbl9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gdGltaW5nXG4gICAgICogQHBhcmFtIHs/PX0gc3R5bGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhbmltYXRlKHRpbWluZywgc3R5bGVzKSB7XG4gICAgICAgIGlmIChzdHlsZXMgPT09IHZvaWQgMCkgeyBzdHlsZXMgPSBudWxsOyB9XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlc0VudHJ5ID0gc3R5bGVzO1xuICAgICAgICBpZiAoIWlzUHJlc2VudChzdHlsZXNFbnRyeSkpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIEVNUFRZX1NUWUxFID0ge307XG4gICAgICAgICAgICBzdHlsZXNFbnRyeSA9IG5ldyBBbmltYXRpb25TdHlsZU1ldGFkYXRhKFtFTVBUWV9TVFlMRV0sIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhKHRpbWluZywgc3R5bGVzRW50cnkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgYGdyb3VwYCBpcyBhbiBhbmltYXRpb24tc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGluc2lkZSBvZiBBbmd1bGFyMidzXG4gICAgICAqIGFuaW1hdGlvblxuICAgICAgKiBEU0wgbGFuZ3VhZ2UuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbmV3LCBwbGVhc2UgbmF2aWdhdGUgdG8gdGhlXG4gICAgICAqIHtAbGluayBDb21wb25lbnQjYW5pbWF0aW9ucy1hbmNob3IgY29tcG9uZW50IGFuaW1hdGlvbnMgbWV0YWRhdGFcbiAgICAgICogcGFnZX0gdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBhbmltYXRpb25zIGluIEFuZ3VsYXIyIGFyZSB1c2VkLlxuICAgICAgKiAqXG4gICAgICAqIGBncm91cGAgc3BlY2lmaWVzIGEgbGlzdCBvZiBhbmltYXRpb24gc3RlcHMgdGhhdCBhcmUgYWxsIHJ1biBpbiBwYXJhbGxlbC4gR3JvdXBlZCBhbmltYXRpb25zXG4gICAgICAqIGFyZSB1c2VmdWwgd2hlbiBhIHNlcmllcyBvZiBzdHlsZXMgbXVzdCBiZSBhbmltYXRlZC9jbG9zZWQgb2ZmXG4gICAgICAqIGF0IGRpZmZlcmVudCBzdGF0cnRpbmcvZW5kaW5nIHRpbWVzLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgZ3JvdXBgIGZ1bmN0aW9uIGNhbiBlaXRoZXIgYmUgdXNlZCB3aXRoaW4gYSB7QGxpbmsgc2VxdWVuY2Ugc2VxdWVuY2V9IG9yIGEge0BsaW5rIHRyYW5zaXRpb25cbiAgICAgICogdHJhbnNpdGlvbn1cbiAgICAgICogYW5kIGl0IHdpbGwgb25seSBjb250aW51ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBvbmNlIGFsbCBvZiB0aGUgaW5uZXIgYW5pbWF0aW9uIHN0ZXBzXG4gICAgICAqIGhhdmUgY29tcGxldGVkLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBVc2FnZVxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgc3RlcHNgIGRhdGEgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgYGdyb3VwYCBhbmltYXRpb24gZnVuY3Rpb24gY2FuIGVpdGhlciBjb25zaXN0XG4gICAgICAqIG9mIHtAbGluayBzdHlsZSBzdHlsZX0gb3Ige0BsaW5rIGFuaW1hdGUgYW5pbWF0ZX0gZnVuY3Rpb24gY2FsbHMuIEVhY2ggY2FsbCB0byBgc3R5bGUoKWAgb3JcbiAgICAgICogYGFuaW1hdGUoKWBcbiAgICAgICogd2l0aGluIGEgZ3JvdXAgd2lsbCBiZSBleGVjdXRlZCBpbnN0YW50bHkgKHVzZSB7QGxpbmsga2V5ZnJhbWVzIGtleWZyYW1lc30gb3IgYVxuICAgICAgKiB7QGxpbmsgYW5pbWF0ZSN1c2FnZSBhbmltYXRlKCkgd2l0aCBhIGRlbGF5IHZhbHVlfSB0byBvZmZzZXQgc3R5bGVzIHRvIGJlIGFwcGxpZWQgYXQgYSBsYXRlclxuICAgICAgKiB0aW1lKS5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGdyb3VwKFtcbiAgICAgICogYW5pbWF0ZShcIjFzXCIsIHsgYmFja2dyb3VuZDogXCJibGFja1wiIH0pKVxuICAgICAgKiBhbmltYXRlKFwiMnNcIiwgeyBjb2xvcjogXCJ3aGl0ZVwiIH0pKVxuICAgICAgKiBdKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS2V6OFhHV0J4V3VlN3FQN25OdkY/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9hbmltYXRpb24vdHMvZHNsL2FuaW1hdGlvbl9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gc3RlcHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdyb3VwKHN0ZXBzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uR3JvdXBNZXRhZGF0YShzdGVwcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBgc2VxdWVuY2VgIGlzIGFuIGFuaW1hdGlvbi1zcGVjaWZpYyBmdW5jdGlvbiB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW5zaWRlIG9mIEFuZ3VsYXIyJ3NcbiAgICAgICogYW5pbWF0aW9uXG4gICAgICAqIERTTCBsYW5ndWFnZS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBuZXcsIHBsZWFzZSBuYXZpZ2F0ZSB0byB0aGVcbiAgICAgICoge0BsaW5rIENvbXBvbmVudCNhbmltYXRpb25zLWFuY2hvciBjb21wb25lbnQgYW5pbWF0aW9ucyBtZXRhZGF0YVxuICAgICAgKiBwYWdlfSB0byBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IGFuaW1hdGlvbnMgaW4gQW5ndWxhcjIgYXJlIHVzZWQuXG4gICAgICAqICpcbiAgICAgICogYHNlcXVlbmNlYCBTcGVjaWZpZXMgYSBsaXN0IG9mIGFuaW1hdGlvbiBzdGVwcyB0aGF0IGFyZSBydW4gb25lIGJ5IG9uZS4gKGBzZXF1ZW5jZWAgaXMgdXNlZFxuICAgICAgKiBieSBkZWZhdWx0IHdoZW4gYW4gYXJyYXkgaXMgcGFzc2VkIGFzIGFuaW1hdGlvbiBkYXRhIGludG8ge0BsaW5rIHRyYW5zaXRpb24gdHJhbnNpdGlvbn0uKVxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgc2VxdWVuY2VgIGZ1bmN0aW9uIGNhbiBlaXRoZXIgYmUgdXNlZCB3aXRoaW4gYSB7QGxpbmsgZ3JvdXAgZ3JvdXB9IG9yIGEge0BsaW5rIHRyYW5zaXRpb25cbiAgICAgICogdHJhbnNpdGlvbn1cbiAgICAgICogYW5kIGl0IHdpbGwgb25seSBjb250aW51ZSB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBvbmNlIGVhY2ggb2YgdGhlIGlubmVyIGFuaW1hdGlvbiBzdGVwc1xuICAgICAgKiBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICogKlxuICAgICAgKiBUbyBwZXJmb3JtIGFuaW1hdGlvbiBzdHlsaW5nIGluIHBhcmFsbGVsIHdpdGggb3RoZXIgYW5pbWF0aW9uIHN0ZXBzIHRoZW5cbiAgICAgICogaGF2ZSBhIGxvb2sgYXQgdGhlIHtAbGluayBncm91cCBncm91cH0gYW5pbWF0aW9uIGZ1bmN0aW9uLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBVc2FnZVxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgc3RlcHNgIGRhdGEgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgYHNlcXVlbmNlYCBhbmltYXRpb24gZnVuY3Rpb24gY2FuIGVpdGhlciBjb25zaXN0XG4gICAgICAqIG9mIHtAbGluayBzdHlsZSBzdHlsZX0gb3Ige0BsaW5rIGFuaW1hdGUgYW5pbWF0ZX0gZnVuY3Rpb24gY2FsbHMuIEEgY2FsbCB0byBgc3R5bGUoKWAgd2lsbCBhcHBseVxuICAgICAgKiB0aGVcbiAgICAgICogcHJvdmlkZWQgc3R5bGluZyBkYXRhIGltbWVkaWF0ZWx5IHdoaWxlIGEgY2FsbCB0byBgYW5pbWF0ZSgpYCB3aWxsIGFwcGx5IGl0cyBzdHlsaW5nXG4gICAgICAqIGRhdGEgb3ZlciBhIGdpdmVuIHRpbWUgZGVwZW5kaW5nIG9uIGl0cyB0aW1pbmcgZGF0YS5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIHNlcXVlbmNlKFtcbiAgICAgICogc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSxcbiAgICAgICogYW5pbWF0ZShcIjFzXCIsIHsgb3BhY2l0eTogMSB9KSlcbiAgICAgICogXSlcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0tlejhYR1dCeFd1ZTdxUDduTnZGP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvcmUvYW5pbWF0aW9uL3RzL2RzbC9hbmltYXRpb25fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gICAgICAqICpcbiAgICAgKiBAcGFyYW0gez99IHN0ZXBzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXF1ZW5jZShzdGVwcykge1xuICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGEoc3RlcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgYHN0eWxlYCBpcyBhbiBhbmltYXRpb24tc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGluc2lkZSBvZiBBbmd1bGFyMidzXG4gICAgICAqIGFuaW1hdGlvblxuICAgICAgKiBEU0wgbGFuZ3VhZ2UuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbmV3LCBwbGVhc2UgbmF2aWdhdGUgdG8gdGhlXG4gICAgICAqIHtAbGluayBDb21wb25lbnQjYW5pbWF0aW9ucy1hbmNob3IgY29tcG9uZW50IGFuaW1hdGlvbnMgbWV0YWRhdGFcbiAgICAgICogcGFnZX0gdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBhbmltYXRpb25zIGluIEFuZ3VsYXIyIGFyZSB1c2VkLlxuICAgICAgKiAqXG4gICAgICAqIGBzdHlsZWAgZGVjbGFyZXMgYSBrZXkvdmFsdWUgb2JqZWN0IGNvbnRhaW5pbmcgQ1NTIHByb3BlcnRpZXMvc3R5bGVzIHRoYXQgY2FuIHRoZW5cbiAgICAgICogYmUgdXNlZCBmb3Ige0BsaW5rIHN0YXRlIGFuaW1hdGlvbiBzdGF0ZXN9LCB3aXRoaW4gYW4ge0BsaW5rIHNlcXVlbmNlIGFuaW1hdGlvbiBzZXF1ZW5jZX0sIG9yIGFzXG4gICAgICAqIHN0eWxpbmcgZGF0YSBmb3IgYm90aCB7QGxpbmsgYW5pbWF0ZSBhbmltYXRlfSBhbmQge0BsaW5rIGtleWZyYW1lcyBrZXlmcmFtZXN9LlxuICAgICAgKiAqXG4gICAgICAqICMjIyBVc2FnZVxuICAgICAgKiAqXG4gICAgICAqIGBzdHlsZWAgdGFrZXMgaW4gYSBrZXkvdmFsdWUgc3RyaW5nIG1hcCBhcyBkYXRhIGFuZCBleHBlY3RzIG9uZSBvciBtb3JlIENTUyBwcm9wZXJ0eS92YWx1ZVxuICAgICAgKiBwYWlycyB0byBiZSBkZWZpbmVkLlxuICAgICAgKiAqXG4gICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICogLy8gc3RyaW5nIHZhbHVlcyBhcmUgdXNlZCBmb3IgY3NzIHByb3BlcnRpZXNcbiAgICAgICogc3R5bGUoeyBiYWNrZ3JvdW5kOiBcInJlZFwiLCBjb2xvcjogXCJibHVlXCIgfSlcbiAgICAgICogKlxuICAgICAgKiAvLyBudW1lcmljYWwgKHBpeGVsKSB2YWx1ZXMgYXJlIGFsc28gc3VwcG9ydGVkXG4gICAgICAqIHN0eWxlKHsgd2lkdGg6IDEwMCwgaGVpZ2h0OiAwIH0pXG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqICMjIyMgQXV0by1zdHlsZXMgKHVzaW5nIGAqYClcbiAgICAgICogKlxuICAgICAgKiBXaGVuIGFuIGFzdGVyaXggKGAqYCkgY2hhcmFjdGVyIGlzIHVzZWQgYXMgYSB2YWx1ZSB0aGVuIGl0IHdpbGwgYmUgZGV0ZWN0ZWQgZnJvbSB0aGUgZWxlbWVudFxuICAgICAgKiBiZWluZyBhbmltYXRlZFxuICAgICAgKiBhbmQgYXBwbGllZCBhcyBhbmltYXRpb24gZGF0YSB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzLlxuICAgICAgKiAqXG4gICAgICAqIFRoaXMgZmVhdHVyZSBwcm92ZXMgdXNlZnVsIGZvciBhIHN0YXRlIGRlcGVuZGluZyBvbiBsYXlvdXQgYW5kL29yIGVudmlyb25tZW50IGZhY3RvcnM7IGluIHN1Y2hcbiAgICAgICogY2FzZXNcbiAgICAgICogdGhlIHN0eWxlcyBhcmUgY2FsY3VsYXRlZCBqdXN0IGJlZm9yZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cy5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIC8vIHRoZSBzdGVwcyBiZWxvdyB3aWxsIGFuaW1hdGUgZnJvbSAwIHRvIHRoZVxuICAgICAgKiAvLyBhY3R1YWwgaGVpZ2h0IG9mIHRoZSBlbGVtZW50XG4gICAgICAqIHN0eWxlKHsgaGVpZ2h0OiAwIH0pLFxuICAgICAgKiBhbmltYXRlKFwiMXNcIiwgc3R5bGUoeyBoZWlnaHQ6IFwiKlwiIH0pKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS2V6OFhHV0J4V3VlN3FQN25OdkY/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9hbmltYXRpb24vdHMvZHNsL2FuaW1hdGlvbl9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gdG9rZW5zXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHlsZSh0b2tlbnMpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5wdXQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9mZnNldCA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaW5wdXQgPSBbKHRva2VucyldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW5zKSkge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gKHRva2Vucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IFsodG9rZW5zKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnB1dC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVudHJ5T2Zmc2V0ID0gKChlbnRyeSkgLyoqIFRPRE8gIzkxMDAgKi8pWydvZmZzZXQnXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGVudHJ5T2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPT0gbnVsbCA/IHBhcnNlRmxvYXQoZW50cnlPZmZzZXQpIDogb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uU3R5bGVNZXRhZGF0YShpbnB1dCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIGBzdGF0ZWAgaXMgYW4gYW5pbWF0aW9uLXNwZWNpZmljIGZ1bmN0aW9uIHRoYXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbnNpZGUgb2YgQW5ndWxhcjInc1xuICAgICAgKiBhbmltYXRpb25cbiAgICAgICogRFNMIGxhbmd1YWdlLiBJZiB0aGlzIGluZm9ybWF0aW9uIGlzIG5ldywgcGxlYXNlIG5hdmlnYXRlIHRvIHRoZVxuICAgICAgKiB7QGxpbmsgQ29tcG9uZW50I2FuaW1hdGlvbnMtYW5jaG9yIGNvbXBvbmVudCBhbmltYXRpb25zIG1ldGFkYXRhXG4gICAgICAqIHBhZ2V9IHRvIGdhaW4gYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBob3cgYW5pbWF0aW9ucyBpbiBBbmd1bGFyMiBhcmUgdXNlZC5cbiAgICAgICogKlxuICAgICAgKiBgc3RhdGVgIGRlY2xhcmVzIGFuIGFuaW1hdGlvbiBzdGF0ZSB3aXRoaW4gdGhlIGdpdmVuIHRyaWdnZXIuIFdoZW4gYSBzdGF0ZSBpc1xuICAgICAgKiBhY3RpdmUgd2l0aGluIGEgY29tcG9uZW50IHRoZW4gaXRzIGFzc29jaWF0ZWQgc3R5bGVzIHdpbGwgcGVyc2lzdCBvblxuICAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHRoZSB0cmlnZ2VyIGlzIGF0dGFjaGVkIHRvIChldmVuIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzKS5cbiAgICAgICogKlxuICAgICAgKiBUbyBhbmltYXRlIGJldHdlZW4gc3RhdGVzLCBoYXZlIGEgbG9vayBhdCB0aGUgYW5pbWF0aW9uIHtAbGluayB0cmFuc2l0aW9uIHRyYW5zaXRpb259XG4gICAgICAqIERTTCBmdW5jdGlvbi4gVG8gcmVnaXN0ZXIgc3RhdGVzIHRvIGFuIGFuaW1hdGlvbiB0cmlnZ2VyIHBsZWFzZSBoYXZlIGEgbG9va1xuICAgICAgKiBhdCB0aGUge0BsaW5rIHRyaWdnZXIgdHJpZ2dlcn0gZnVuY3Rpb24uXG4gICAgICAqICpcbiAgICAgICogIyMjIyBUaGUgYHZvaWRgIHN0YXRlXG4gICAgICAqICpcbiAgICAgICogVGhlIGB2b2lkYCBzdGF0ZSB2YWx1ZSBpcyBhIHJlc2VydmVkIHdvcmQgdGhhdCBhbmd1bGFyIHVzZXMgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90XG4gICAgICAqIGFwYXJ0XG4gICAgICAqIG9mIHRoZSBhcHBsaWNhdGlvbiBhbnltb3JlIChlLmcuIHdoZW4gYW4gYG5nSWZgIGV2YWx1YXRlcyB0byBmYWxzZSB0aGVuIHRoZSBzdGF0ZSBvZiB0aGVcbiAgICAgICogYXNzb2NpYXRlZCBlbGVtZW50XG4gICAgICAqIGlzIHZvaWQpLlxuICAgICAgKiAqXG4gICAgICAqICMjIyMgVGhlIGAqYCAoZGVmYXVsdCkgc3RhdGVcbiAgICAgICogKlxuICAgICAgKiBUaGUgYCpgIHN0YXRlICh3aGVuIHN0eWxlZCkgaXMgYSBmYWxsYmFjayBzdGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCBpZlxuICAgICAgKiB0aGUgc3RhdGUgdGhhdCBpcyBiZWluZyBhbmltYXRlZCBpcyBub3QgZGVjbGFyZWQgd2l0aGluIHRoZSB0cmlnZ2VyLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBVc2FnZVxuICAgICAgKiAqXG4gICAgICAqIGBzdGF0ZWAgd2lsbCBkZWNsYXJlIGFuIGFuaW1hdGlvbiBzdGF0ZSB3aXRoIGl0cyBhc3NvY2lhdGVkIHN0eWxlc1xuICAgICAgKiB3aXRoaW4gdGhlIGdpdmVuIHRyaWdnZXIuXG4gICAgICAqICpcbiAgICAgICogLSBgc3RhdGVOYW1lRXhwcmAgY2FuIGJlIG9uZSBvciBtb3JlIHN0YXRlIG5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMuXG4gICAgICAqIC0gYHN0eWxlc2AgcmVmZXJzIHRvIHRoZSB7QGxpbmsgc3R5bGUgc3R5bGluZyBkYXRhfSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIG9uIHRoZSBlbGVtZW50IG9uY2VcbiAgICAgICogdGhlIHN0YXRlXG4gICAgICAqIGhhcyBiZWVuIHJlYWNoZWQuXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiAvLyBcInZvaWRcIiBpcyBhIHJlc2VydmVkIG5hbWUgZm9yIGEgc3RhdGUgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50XG4gICAgICAqIC8vIHRoZSBzdGF0ZSBpbiB3aGljaCBhbiBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gZnJvbSB0aGUgYXBwbGljYXRpb24uXG4gICAgICAqIHN0YXRlKFwidm9pZFwiLCBzdHlsZSh7IGhlaWdodDogMCB9KSlcbiAgICAgICogKlxuICAgICAgKiAvLyB1c2VyLWRlZmluZWQgc3RhdGVzXG4gICAgICAqIHN0YXRlKFwiY2xvc2VkXCIsIHN0eWxlKHsgaGVpZ2h0OiAwIH0pKVxuICAgICAgKiBzdGF0ZShcIm9wZW4sIHZpc2libGVcIiwgc3R5bGUoeyBoZWlnaHQ6IFwiKlwiIH0pKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS2V6OFhHV0J4V3VlN3FQN25OdkY/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29yZS9hbmltYXRpb24vdHMvZHNsL2FuaW1hdGlvbl9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gc3RhdGVOYW1lRXhwclxuICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGF0ZShzdGF0ZU5hbWVFeHByLCBzdHlsZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25TdGF0ZURlY2xhcmF0aW9uTWV0YWRhdGEoc3RhdGVOYW1lRXhwciwgc3R5bGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIGBrZXlmcmFtZXNgIGlzIGFuIGFuaW1hdGlvbi1zcGVjaWZpYyBmdW5jdGlvbiB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW5zaWRlIG9mIEFuZ3VsYXIyJ3NcbiAgICAgICogYW5pbWF0aW9uXG4gICAgICAqIERTTCBsYW5ndWFnZS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBuZXcsIHBsZWFzZSBuYXZpZ2F0ZSB0byB0aGVcbiAgICAgICoge0BsaW5rIENvbXBvbmVudCNhbmltYXRpb25zLWFuY2hvciBjb21wb25lbnQgYW5pbWF0aW9ucyBtZXRhZGF0YVxuICAgICAgKiBwYWdlfSB0byBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IGFuaW1hdGlvbnMgaW4gQW5ndWxhcjIgYXJlIHVzZWQuXG4gICAgICAqICpcbiAgICAgICogYGtleWZyYW1lc2Agc3BlY2lmaWVzIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgc3R5bGUgc3R5bGV9IGVudHJpZXMgZWFjaCBvcHRpb25hbGx5IGNoYXJhY3Rlcml6ZWRcbiAgICAgICogYnkgYW4gYG9mZnNldGAgdmFsdWUuXG4gICAgICAqICpcbiAgICAgICogIyMjIFVzYWdlXG4gICAgICAqICpcbiAgICAgICogVGhlIGBrZXlmcmFtZXNgIGFuaW1hdGlvbiBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGFsb25nc2lkZSB0aGUge0BsaW5rIGFuaW1hdGUgYW5pbWF0ZX1cbiAgICAgICogYW5pbWF0aW9uIGZ1bmN0aW9uLiBJbnN0ZWFkIG9mIGFwcGx5aW5nIGFuaW1hdGlvbnMgZnJvbSB3aGVyZSB0aGV5IGFyZVxuICAgICAgKiBjdXJyZW50bHkgdG8gdGhlaXIgZGVzdGluYXRpb24sIGtleWZyYW1lcyBjYW4gZGVzY3JpYmUgaG93IGVhY2ggc3R5bGUgZW50cnkgaXMgYXBwbGllZFxuICAgICAgKiBhbmQgYXQgd2hhdCBwb2ludCB3aXRoaW4gdGhlIGFuaW1hdGlvbiBhcmMgKG11Y2ggbGlrZSBDU1MgS2V5ZnJhbWUgQW5pbWF0aW9ucyBkbykuXG4gICAgICAqICpcbiAgICAgICogRm9yIGVhY2ggYHN0eWxlKClgIGVudHJ5IGFuIGBvZmZzZXRgIHZhbHVlIGNhbiBiZSBzZXQuIERvaW5nIHNvIGFsbG93cyB0byBzcGVjaWZpeSBhdFxuICAgICAgKiB3aGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGFuaW1hdGUgdGltZSB0aGUgc3R5bGVzIHdpbGwgYmUgYXBwbGllZC5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIC8vIHRoZSBwcm92aWRlZCBvZmZzZXQgdmFsdWVzIGRlc2NyaWJlIHdoZW4gZWFjaCBiYWNrZ3JvdW5kQ29sb3IgdmFsdWUgaXMgYXBwbGllZC5cbiAgICAgICogYW5pbWF0ZShcIjVzXCIsIGtleWZyYW1lcyhbXG4gICAgICAqIHN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiBcInJlZFwiLCBvZmZzZXQ6IDAgfSksXG4gICAgICAqIHN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiBcImJsdWVcIiwgb2Zmc2V0OiAwLjIgfSksXG4gICAgICAqIHN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiBcIm9yYW5nZVwiLCBvZmZzZXQ6IDAuMyB9KSxcbiAgICAgICogc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6IFwiYmxhY2tcIiwgb2Zmc2V0OiAxIH0pXG4gICAgICAqIF0pKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiBBbHRlcm5hdGl2ZWx5LCBpZiB0aGVyZSBhcmUgbm8gYG9mZnNldGAgdmFsdWVzIHVzZWQgd2l0aGluIHRoZSBzdHlsZSBlbnRyaWVzIHRoZW4gdGhlIG9mZnNldHNcbiAgICAgICogd2lsbFxuICAgICAgKiBiZSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBhbmltYXRlKFwiNXNcIiwga2V5ZnJhbWVzKFtcbiAgICAgICogc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIgfSkgLy8gb2Zmc2V0ID0gMFxuICAgICAgKiBzdHlsZSh7IGJhY2tncm91bmRDb2xvcjogXCJibHVlXCIgfSkgLy8gb2Zmc2V0ID0gMC4zM1xuICAgICAgKiBzdHlsZSh7IGJhY2tncm91bmRDb2xvcjogXCJvcmFuZ2VcIiB9KSAvLyBvZmZzZXQgPSAwLjY2XG4gICAgICAqIHN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiBcImJsYWNrXCIgfSkgLy8gb2Zmc2V0ID0gMVxuICAgICAgKiBdKSlcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0tlejhYR1dCeFd1ZTdxUDduTnZGP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvcmUvYW5pbWF0aW9uL3RzL2RzbC9hbmltYXRpb25fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gICAgICAqICpcbiAgICAgKiBAcGFyYW0gez99IHN0ZXBzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlmcmFtZXMoc3RlcHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhKHN0ZXBzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIGB0cmFuc2l0aW9uYCBpcyBhbiBhbmltYXRpb24tc3BlY2lmaWMgZnVuY3Rpb24gdGhhdCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGluc2lkZSBvZiBBbmd1bGFyMidzXG4gICAgICAqIGFuaW1hdGlvblxuICAgICAgKiBEU0wgbGFuZ3VhZ2UuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbmV3LCBwbGVhc2UgbmF2aWdhdGUgdG8gdGhlXG4gICAgICAqIHtAbGluayBDb21wb25lbnQjYW5pbWF0aW9ucy1hbmNob3IgY29tcG9uZW50IGFuaW1hdGlvbnMgbWV0YWRhdGFcbiAgICAgICogcGFnZX0gdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBhbmltYXRpb25zIGluIEFuZ3VsYXIyIGFyZSB1c2VkLlxuICAgICAgKiAqXG4gICAgICAqIGB0cmFuc2l0aW9uYCBkZWNsYXJlcyB0aGUge0BsaW5rIHNlcXVlbmNlIHNlcXVlbmNlIG9mIGFuaW1hdGlvbiBzdGVwc30gdGhhdCB3aWxsIGJlIHJ1biB3aGVuIHRoZVxuICAgICAgKiBwcm92aWRlZFxuICAgICAgKiBgc3RhdGVDaGFuZ2VFeHByYCB2YWx1ZSBpcyBzYXRpc2ZpZWQuIFRoZSBgc3RhdGVDaGFuZ2VFeHByYCBjb25zaXN0cyBvZiBhIGBzdGF0ZTEgPT4gc3RhdGUyYFxuICAgICAgKiB3aGljaCBjb25zaXN0c1xuICAgICAgKiBvZiB0d28ga25vd24gc3RhdGVzICh1c2UgYW4gYXN0ZXJpeCAoYCpgKSB0byByZWZlciB0byBhIGR5bmFtaWMgc3RhcnRpbmcgYW5kL29yIGVuZGluZyBzdGF0ZSkuXG4gICAgICAqICpcbiAgICAgICogQW5pbWF0aW9uIHRyYW5zaXRpb25zIGFyZSBwbGFjZWQgd2l0aGluIGFuIHtAbGluayB0cmlnZ2VyIGFuaW1hdGlvbiB0cmlnZ2VyfS4gRm9yIGFuIHRyYW5zaXRpb25cbiAgICAgICogdG8gYW5pbWF0ZSB0b1xuICAgICAgKiBhIHN0YXRlIHZhbHVlIGFuZCBwZXJzaXN0IGl0cyBzdHlsZXMgdGhlbiBvbmUgb3IgbW9yZSB7QGxpbmsgc3RhdGUgYW5pbWF0aW9uIHN0YXRlc30gaXMgZXhwZWN0ZWRcbiAgICAgICogdG8gYmUgZGVmaW5lZC5cbiAgICAgICogKlxuICAgICAgKiAjIyMgVXNhZ2VcbiAgICAgICogKlxuICAgICAgKiBBbiBhbmltYXRpb24gdHJhbnNpdGlvbiBpcyBraWNrZWQgb2ZmIHRoZSBgc3RhdGVDaGFuZ2VFeHByYCBwcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgYmFzZWQgb25cbiAgICAgICogd2hhdCB0aGVcbiAgICAgICogcHJldmlvdXMgc3RhdGUgaXMgYW5kIHdoYXQgdGhlIGN1cnJlbnQgc3RhdGUgaGFzIGJlY29tZS4gSW4gb3RoZXIgd29yZHMsIGlmIGEgdHJhbnNpdGlvbiBpc1xuICAgICAgKiBkZWZpbmVkIHRoYXRcbiAgICAgICogbWF0Y2hlcyB0aGUgb2xkL2N1cnJlbnQgc3RhdGUgY3JpdGVyaWEgdGhlbiB0aGUgYXNzb2NpYXRlZCBhbmltYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQuXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiAvLyBhbGwgdHJhbnNpdGlvbi9zdGF0ZSBjaGFuZ2VzIGFyZSBkZWZpbmVkIHdpdGhpbiBhbiBhbmltYXRpb24gdHJpZ2dlclxuICAgICAgKiB0cmlnZ2VyKFwibXlBbmltYXRpb25UcmlnZ2VyXCIsIFtcbiAgICAgICogLy8gaWYgYSBzdGF0ZSBpcyBkZWZpbmVkIHRoZW4gaXRzIHN0eWxlcyB3aWxsIGJlIHBlcnNpc3RlZCB3aGVuIHRoZVxuICAgICAgKiAvLyBhbmltYXRpb24gaGFzIGZ1bGx5IGNvbXBsZXRlZCBpdHNlbGZcbiAgICAgICogc3RhdGUoXCJvblwiLCBzdHlsZSh7IGJhY2tncm91bmQ6IFwiZ3JlZW5cIiB9KSksXG4gICAgICAqIHN0YXRlKFwib2ZmXCIsIHN0eWxlKHsgYmFja2dyb3VuZDogXCJncmV5XCIgfSkpLFxuICAgICAgKiAqXG4gICAgICAqIC8vIGEgdHJhbnNpdGlvbiBhbmltYXRpb24gdGhhdCB3aWxsIGJlIGtpY2tlZCBvZmYgd2hlbiB0aGUgc3RhdGUgdmFsdWVcbiAgICAgICogLy8gYm91bmQgdG8gXCJteUFuaW1hdGlvblRyaWdnZXJcIiBjaGFuZ2VzIGZyb20gXCJvblwiIHRvIFwib2ZmXCJcbiAgICAgICogdHJhbnNpdGlvbihcIm9uID0+IG9mZlwiLCBhbmltYXRlKDUwMCkpLFxuICAgICAgKiAqXG4gICAgICAqIC8vIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZG8gcnVuIHRoZSBzYW1lIGFuaW1hdGlvbiBmb3IgYm90aCBkaXJlY3Rpb25zXG4gICAgICAqIHRyYW5zaXRpb24oXCJvbiA8PT4gb2ZmXCIsIGFuaW1hdGUoNTAwKSksXG4gICAgICAqICpcbiAgICAgICogLy8gb3IgdG8gZGVmaW5lIG11bHRpcGxlIHN0YXRlcyBwYWlycyBzZXBhcmF0ZWQgYnkgY29tbWFzXG4gICAgICAqIHRyYW5zaXRpb24oXCJvbiA9PiBvZmYsIG9mZiA9PiB2b2lkXCIsIGFuaW1hdGUoNTAwKSksXG4gICAgICAqICpcbiAgICAgICogLy8gdGhpcyBpcyBhIGNhdGNoLWFsbCBzdGF0ZSBjaGFuZ2UgZm9yIHdoZW4gYW4gZWxlbWVudCBpcyBpbnNlcnRlZCBpbnRvXG4gICAgICAqIC8vIHRoZSBwYWdlIGFuZCB0aGUgZGVzdGluYXRpb24gc3RhdGUgaXMgdW5rbm93blxuICAgICAgKiB0cmFuc2l0aW9uKFwidm9pZCA9PiAqXCIsIFtcbiAgICAgICogc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgKiBhbmltYXRlKDUwMClcbiAgICAgICogXSksXG4gICAgICAqICpcbiAgICAgICogLy8gdGhpcyB3aWxsIGNhcHR1cmUgYSBzdGF0ZSBjaGFuZ2UgYmV0d2VlbiBhbnkgc3RhdGVzXG4gICAgICAqIHRyYW5zaXRpb24oXCIqID0+ICpcIiwgYW5pbWF0ZShcIjFzIDBzXCIpKSxcbiAgICAgICogXSlcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogVGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCB3aWxsIG1ha2UgdXNlIG9mIHRoZSBgbXlBbmltYXRpb25UcmlnZ2VyYFxuICAgICAgKiBhbmltYXRpb24gdHJpZ2dlciBieSBiaW5kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIGl0cyB0ZW1wbGF0ZSBjb2RlLlxuICAgICAgKiAqXG4gICAgICAqIGBgYGh0bWxcbiAgICAgICogPCEtLSBzb21ld2hlcmUgaW5zaWRlIG9mIG15LWNvbXBvbmVudC10cGwuaHRtbCAtLT5cbiAgICAgICogPGRpdiBbQG15QW5pbWF0aW9uVHJpZ2dlcl09XCJteVN0YXR1c0V4cFwiPi4uLjwvZGl2PlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMjIFRoZSBmaW5hbCBgYW5pbWF0ZWAgY2FsbFxuICAgICAgKiAqXG4gICAgICAqIElmIHRoZSBmaW5hbCBzdGVwIHdpdGhpbiB0aGUgdHJhbnNpdGlvbiBzdGVwcyBpcyBhIGNhbGwgdG8gYGFuaW1hdGUoKWAgdGhhdCAqKm9ubHkqKlxuICAgICAgKiB1c2VzIGEgdGltaW5nIHZhbHVlIHdpdGggKipubyBzdHlsZSBkYXRhKiogdGhlbiBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXNlZCBhcyB0aGUgZmluYWxcbiAgICAgICogYW5pbWF0aW9uXG4gICAgICAqIGFyYyBmb3IgdGhlIGVsZW1lbnQgdG8gYW5pbWF0ZSBpdHNlbGYgdG8gdGhlIGZpbmFsIHN0YXRlLiBUaGlzIGludm9sdmVzIGFuIGF1dG9tYXRpYyBtaXggb2ZcbiAgICAgICogYWRkaW5nL3JlbW92aW5nIENTUyBzdHlsZXMgc28gdGhhdCB0aGUgZWxlbWVudCB3aWxsIGJlIGluIHRoZSBleGFjdCBzdGF0ZSBpdCBzaG91bGQgYmUgZm9yIHRoZVxuICAgICAgKiBhcHBsaWVkIHN0YXRlIHRvIGJlIHByZXNlbnRlZCBjb3JyZWN0bHkuXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIC8vIHN0YXJ0IG9mZiBieSBoaWRpbmcgdGhlIGVsZW1lbnQsIGJ1dCBtYWtlIHN1cmUgdGhhdCBpdCBhbmltYXRlcyBwcm9wZXJseSB0byB3aGF0ZXZlciBzdGF0ZVxuICAgICAgKiAvLyBpcyBjdXJyZW50bHkgYWN0aXZlIGZvciBcIm15QW5pbWF0aW9uVHJpZ2dlclwiXG4gICAgICAqIHRyYW5zaXRpb24oXCJ2b2lkID0+ICpcIiwgW1xuICAgICAgKiBzdHlsZSh7IG9wYWNpdHk6IDAgfSksXG4gICAgICAqIGFuaW1hdGUoNTAwKVxuICAgICAgKiBdKVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgVHJhbnNpdGlvbiBBbGlhc2VzIChgOmVudGVyYCBhbmQgYDpsZWF2ZWApXG4gICAgICAqICpcbiAgICAgICogR2l2ZW4gdGhhdCBlbnRlciAoaW5zZXJ0aW9uKSBhbmQgbGVhdmUgKHJlbW92YWwpIGFuaW1hdGlvbnMgYXJlIHNvIGNvbW1vbixcbiAgICAgICogdGhlIGB0cmFuc2l0aW9uYCBmdW5jdGlvbiBhY2NlcHRzIGJvdGggYDplbnRlcmAgYW5kIGA6bGVhdmVgIHZhbHVlcyB3aGljaFxuICAgICAgKiBhcmUgYWxpYXNlcyBmb3IgdGhlIGB2b2lkID0+ICpgIGFuZCBgKiA9PiB2b2lkYCBzdGF0ZSBjaGFuZ2VzLlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiB0cmFuc2l0aW9uKFwiOmVudGVyXCIsIFtcbiAgICAgICogc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgKiBhbmltYXRlKDUwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKVxuICAgICAgKiBdKVxuICAgICAgKiB0cmFuc2l0aW9uKFwiOmxlYXZlXCIsIFtcbiAgICAgICogYW5pbWF0ZSg1MDAsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSlcbiAgICAgICogXSlcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0tlejhYR1dCeFd1ZTdxUDduTnZGP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvcmUvYW5pbWF0aW9uL3RzL2RzbC9hbmltYXRpb25fZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gICAgICAqICpcbiAgICAgKiBAcGFyYW0gez99IHN0YXRlQ2hhbmdlRXhwclxuICAgICAqIEBwYXJhbSB7P30gc3RlcHNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24oc3RhdGVDaGFuZ2VFeHByLCBzdGVwcykge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhbmltYXRpb25EYXRhID0gQXJyYXkuaXNBcnJheShzdGVwcykgPyBuZXcgQW5pbWF0aW9uU2VxdWVuY2VNZXRhZGF0YShzdGVwcykgOiBzdGVwcztcbiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YShzdGF0ZUNoYW5nZUV4cHIsIGFuaW1hdGlvbkRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgYHRyaWdnZXJgIGlzIGFuIGFuaW1hdGlvbi1zcGVjaWZpYyBmdW5jdGlvbiB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW5zaWRlIG9mIEFuZ3VsYXIyJ3NcbiAgICAgICogYW5pbWF0aW9uXG4gICAgICAqIERTTCBsYW5ndWFnZS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBuZXcsIHBsZWFzZSBuYXZpZ2F0ZSB0byB0aGVcbiAgICAgICoge0BsaW5rIENvbXBvbmVudCNhbmltYXRpb25zLWFuY2hvciBjb21wb25lbnQgYW5pbWF0aW9ucyBtZXRhZGF0YVxuICAgICAgKiBwYWdlfSB0byBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IGFuaW1hdGlvbnMgaW4gQW5ndWxhcjIgYXJlIHVzZWQuXG4gICAgICAqICpcbiAgICAgICogYHRyaWdnZXJgIENyZWF0ZXMgYW4gYW5pbWF0aW9uIHRyaWdnZXIgd2hpY2ggd2lsbCBhIGxpc3Qgb2Yge0BsaW5rIHN0YXRlIHN0YXRlfSBhbmQge0BsaW5rXG4gICAgICAqIHRyYW5zaXRpb24gdHJhbnNpdGlvbn1cbiAgICAgICogZW50cmllcyB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIHdoZW4gdGhlIGV4cHJlc3Npb24gYm91bmQgdG8gdGhlIHRyaWdnZXIgY2hhbmdlcy5cbiAgICAgICogKlxuICAgICAgKiBUcmlnZ2VycyBhcmUgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIGNvbXBvbmVudCBhbm5vdGF0aW9uIGRhdGEgdW5kZXIgdGhlXG4gICAgICAqIHtAbGluayBDb21wb25lbnQjYW5pbWF0aW9ucy1hbmNob3IgYW5pbWF0aW9ucyBzZWN0aW9ufS4gQW4gYW5pbWF0aW9uIHRyaWdnZXIgY2FuXG4gICAgICAqIGJlIHBsYWNlZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhIHRlbXBsYXRlIGJ5IHJlZmVyZW5jaW5nIHRoZSBuYW1lIG9mIHRoZVxuICAgICAgKiB0cmlnZ2VyIGZvbGxvd2VkIGJ5IHRoZSBleHByZXNzaW9uIHZhbHVlIHRoYXQgdGhlIHRyaWdnZXIgaXMgYm91bmQgdG9cbiAgICAgICogKGluIHRoZSBmb3JtIG9mIGBbQHRyaWdnZXJOYW1lXT1cImV4cHJlc3Npb25cImAuXG4gICAgICAqICpcbiAgICAgICogIyMjIFVzYWdlXG4gICAgICAqICpcbiAgICAgICogYHRyaWdnZXJgIHdpbGwgY3JlYXRlIGFuIGFuaW1hdGlvbiB0cmlnZ2VyIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYG5hbWVgIHZhbHVlLlxuICAgICAgKiBUaGUgcHJvdmlkZWQgYGFuaW1hdGlvbmAgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgY29uc2lzdGluZyBvZiB7QGxpbmsgc3RhdGUgc3RhdGV9IGFuZFxuICAgICAgKiB7QGxpbmsgdHJhbnNpdGlvbiB0cmFuc2l0aW9ufVxuICAgICAgKiBkZWNsYXJhdGlvbnMuXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBzZWxlY3RvcjogJ215LWNvbXBvbmVudCcsXG4gICAgICAqIHRlbXBsYXRlVXJsOiAnbXktY29tcG9uZW50LXRwbC5odG1sJyxcbiAgICAgICogYW5pbWF0aW9uczogW1xuICAgICAgKiB0cmlnZ2VyKFwibXlBbmltYXRpb25UcmlnZ2VyXCIsIFtcbiAgICAgICogc3RhdGUoLi4uKSxcbiAgICAgICogc3RhdGUoLi4uKSxcbiAgICAgICogdHJhbnNpdGlvbiguLi4pLFxuICAgICAgKiB0cmFuc2l0aW9uKC4uLilcbiAgICAgICogXSlcbiAgICAgICogXVxuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gICAgICAqIG15U3RhdHVzRXhwID0gXCJzb21ldGhpbmdcIjtcbiAgICAgICogfVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiBUaGUgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50IHdpbGwgbWFrZSB1c2Ugb2YgdGhlIGBteUFuaW1hdGlvblRyaWdnZXJgXG4gICAgICAqIGFuaW1hdGlvbiB0cmlnZ2VyIGJ5IGJpbmRpbmcgdG8gYW4gZWxlbWVudCB3aXRoaW4gaXRzIHRlbXBsYXRlIGNvZGUuXG4gICAgICAqICpcbiAgICAgICogYGBgaHRtbFxuICAgICAgKiA8IS0tIHNvbWV3aGVyZSBpbnNpZGUgb2YgbXktY29tcG9uZW50LXRwbC5odG1sIC0tPlxuICAgICAgKiA8ZGl2IFtAbXlBbmltYXRpb25UcmlnZ2VyXT1cIm15U3RhdHVzRXhwXCI+Li4uPC9kaXY+XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9LZXo4WEdXQnhXdWU3cVA3bk52Rj9wPXByZXZpZXcpKVxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb3JlL2FuaW1hdGlvbi90cy9kc2wvYW5pbWF0aW9uX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICAgICAgKiAqXG4gICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaWdnZXIobmFtZSwgYW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uRW50cnlNZXRhZGF0YShuYW1lLCBhbmltYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcHJldmlvdXNTdHlsZXNcbiAgICAgKiBAcGFyYW0gez99IG5ld1N0eWxlc1xuICAgICAqIEBwYXJhbSB7Pz19IG51bGxWYWx1ZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJlcGFyZUZpbmFsQW5pbWF0aW9uU3R5bGVzKHByZXZpb3VzU3R5bGVzLCBuZXdTdHlsZXMsIG51bGxWYWx1ZSkge1xuICAgICAgICBpZiAobnVsbFZhbHVlID09PSB2b2lkIDApIHsgbnVsbFZhbHVlID0gbnVsbDsgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaW5hbFN0eWxlcyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhuZXdTdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gbmV3U3R5bGVzW3Byb3BdO1xuICAgICAgICAgICAgZmluYWxTdHlsZXNbcHJvcF0gPSB2YWx1ZSA9PSBBVVRPX1NUWUxFID8gbnVsbFZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHByZXZpb3VzU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICBpZiAoIWlzUHJlc2VudChmaW5hbFN0eWxlc1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbFN0eWxlc1twcm9wXSA9IG51bGxWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaW5hbFN0eWxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBjb2xsZWN0ZWRTdHlsZXNcbiAgICAgKiBAcGFyYW0gez99IGZpbmFsU3RhdGVTdHlsZXNcbiAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFsYW5jZUFuaW1hdGlvbktleWZyYW1lcyhjb2xsZWN0ZWRTdHlsZXMsIGZpbmFsU3RhdGVTdHlsZXMsIGtleWZyYW1lcykge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaW1pdCA9IGtleWZyYW1lcy5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmaXJzdEtleWZyYW1lID0ga2V5ZnJhbWVzWzBdO1xuICAgICAgICAvLyBwaGFzZSAxOiBjb3B5IGFsbCB0aGUgc3R5bGVzIGZyb20gdGhlIGZpcnN0IGtleWZyYW1lIGludG8gdGhlIGxvb2t1cCBtYXBcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmxhdGVuZWRGaXJzdEtleWZyYW1lU3R5bGVzID0gZmxhdHRlblN0eWxlcyhmaXJzdEtleWZyYW1lLnN0eWxlcy5zdHlsZXMpO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHRyYUZpcnN0S2V5ZnJhbWVTdHlsZXMgPSB7fTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGFzRXh0cmFGaXJzdFN0eWxlcyA9IGZhbHNlO1xuICAgICAgICBPYmplY3Qua2V5cyhjb2xsZWN0ZWRTdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gKGNvbGxlY3RlZFN0eWxlc1twcm9wXSk7XG4gICAgICAgICAgICAvLyBpZiB0aGUgc3R5bGUgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBmaXJzdCBrZXlmcmFtZSB0aGVuXG4gICAgICAgICAgICAvLyB3ZSBkbyBub3QgcmVwbGFjZSBpdC5cbiAgICAgICAgICAgIGlmICghZmxhdGVuZWRGaXJzdEtleWZyYW1lU3R5bGVzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgZmxhdGVuZWRGaXJzdEtleWZyYW1lU3R5bGVzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgZXh0cmFGaXJzdEtleWZyYW1lU3R5bGVzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgaGFzRXh0cmFGaXJzdFN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrZXlmcmFtZUNvbGxlY3RlZFN0eWxlcyA9IFN0cmluZ01hcFdyYXBwZXIubWVyZ2Uoe30sIGZsYXRlbmVkRmlyc3RLZXlmcmFtZVN0eWxlcyk7XG4gICAgICAgIC8vIHBoYXNlIDI6IG5vcm1hbGl6ZSB0aGUgZmluYWwga2V5ZnJhbWVcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmluYWxLZXlmcmFtZSA9IGtleWZyYW1lc1tsaW1pdF07XG4gICAgICAgIGZpbmFsS2V5ZnJhbWUuc3R5bGVzLnN0eWxlcy51bnNoaWZ0KGZpbmFsU3RhdGVTdHlsZXMpO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmbGF0ZW5lZEZpbmFsS2V5ZnJhbWVTdHlsZXMgPSBmbGF0dGVuU3R5bGVzKGZpbmFsS2V5ZnJhbWUuc3R5bGVzLnN0eWxlcyk7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4dHJhRmluYWxLZXlmcmFtZVN0eWxlcyA9IHt9O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoYXNFeHRyYUZpbmFsU3R5bGVzID0gZmFsc2U7XG4gICAgICAgIE9iamVjdC5rZXlzKGtleWZyYW1lQ29sbGVjdGVkU3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICBpZiAoIWlzUHJlc2VudChmbGF0ZW5lZEZpbmFsS2V5ZnJhbWVTdHlsZXNbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFGaW5hbEtleWZyYW1lU3R5bGVzW3Byb3BdID0gQVVUT19TVFlMRTtcbiAgICAgICAgICAgICAgICBoYXNFeHRyYUZpbmFsU3R5bGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNFeHRyYUZpbmFsU3R5bGVzKSB7XG4gICAgICAgICAgICBmaW5hbEtleWZyYW1lLnN0eWxlcy5zdHlsZXMucHVzaChleHRyYUZpbmFsS2V5ZnJhbWVTdHlsZXMpO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKGZsYXRlbmVkRmluYWxLZXlmcmFtZVN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQoZmxhdGVuZWRGaXJzdEtleWZyYW1lU3R5bGVzW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIGV4dHJhRmlyc3RLZXlmcmFtZVN0eWxlc1twcm9wXSA9IEFVVE9fU1RZTEU7XG4gICAgICAgICAgICAgICAgaGFzRXh0cmFGaXJzdFN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzRXh0cmFGaXJzdFN0eWxlcykge1xuICAgICAgICAgICAgZmlyc3RLZXlmcmFtZS5zdHlsZXMuc3R5bGVzLnB1c2goZXh0cmFGaXJzdEtleWZyYW1lU3R5bGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0QW5kUmVzb2x2ZVN0eWxlcyhjb2xsZWN0ZWRTdHlsZXMsIFtmaW5hbFN0YXRlU3R5bGVzXSk7XG4gICAgICAgIHJldHVybiBrZXlmcmFtZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbGVhclN0eWxlcyhzdHlsZXMpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmluYWxTdHlsZXMgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZmluYWxTdHlsZXNba2V5XSA9IG51bGw7IH0pO1xuICAgICAgICByZXR1cm4gZmluYWxTdHlsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gY29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb2xsZWN0QW5kUmVzb2x2ZVN0eWxlcyhjb2xsZWN0aW9uLCBzdHlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZXNPYmogPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGVudHJ5KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBlbnRyeVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gRklMTF9TVFlMRV9GTEFHKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sbGVjdGlvbltwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFVVE9fU1RZTEU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbltwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHN0eWxlc09ialtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGVzT2JqO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICogQHBhcmFtIHs/fSByZW5kZXJlclxuICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZW5kZXJTdHlsZXMoZWxlbWVudCwgcmVuZGVyZXIsIHN0eWxlcykge1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHsgcmVuZGVyZXIuc2V0RWxlbWVudFN0eWxlKGVsZW1lbnQsIHByb3AsIHN0eWxlc1twcm9wXSk7IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlblN0eWxlcyhzdHlsZXMpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmluYWxTdHlsZXMgPSB7fTtcbiAgICAgICAgc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeyBmaW5hbFN0eWxlc1twcm9wXSA9IChlbnRyeVtwcm9wXSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZpbmFsU3R5bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlIHVuZGVmaW5lZFxuICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgICogKlxuICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIEFuaW1hdGlvblN0eWxlcyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uU3R5bGVzKHN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblN0eWxlcztcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgcmV0dXJuZWQgYXMgYW4gZXZlbnQgcGFyYW1ldGVyIHdoZW4gYW4gYW5pbWF0aW9uXG4gICAgICAqIGNhbGxiYWNrIGlzIGNhcHR1cmVkIGZvciBhbiBhbmltYXRpb24gZWl0aGVyIGR1cmluZyB0aGUgc3RhcnQgb3IgZG9uZSBwaGFzZS5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGhvc3Q6IHtcbiAgICAgICogJ1tAbXlBbmltYXRpb25UcmlnZ2VyXSc6ICdzb21lRXhwcmVzc2lvbicsXG4gICAgICAqICcoQG15QW5pbWF0aW9uVHJpZ2dlci5zdGFydCknOiAnY2FwdHVyZVN0YXJ0RXZlbnQoJGV2ZW50KScsXG4gICAgICAqICcoQG15QW5pbWF0aW9uVHJpZ2dlci5kb25lKSc6ICdjYXB0dXJlRG9uZUV2ZW50KCRldmVudCknLFxuICAgICAgKiB9LFxuICAgICAgKiBhbmltYXRpb25zOiBbXG4gICAgICAqIHRyaWdnZXIoXCJteUFuaW1hdGlvblRyaWdnZXJcIiwgW1xuICAgICAgKiAvLyAuLi5cbiAgICAgICogXSlcbiAgICAgICogXVxuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gICAgICAqIHNvbWVFeHByZXNzaW9uOiBhbnkgPSBmYWxzZTtcbiAgICAgICogY2FwdHVyZVN0YXJ0RXZlbnQoZXZlbnQ6IEFuaW1hdGlvblRyYW5zaXRpb25FdmVudCkge1xuICAgICAgKiAvLyB0aGUgdG9TdGF0ZSwgZnJvbVN0YXRlIGFuZCB0b3RhbFRpbWUgZGF0YSBpcyBhY2Nlc3NpYmxlIGZyb20gdGhlIGV2ZW50IHZhcmlhYmxlXG4gICAgICAqIH1cbiAgICAgICogKlxuICAgICAgKiBjYXB0dXJlRG9uZUV2ZW50KGV2ZW50OiBBbmltYXRpb25UcmFuc2l0aW9uRXZlbnQpIHtcbiAgICAgICogLy8gdGhlIHRvU3RhdGUsIGZyb21TdGF0ZSBhbmQgdG90YWxUaW1lIGRhdGEgaXMgYWNjZXNzaWJsZSBmcm9tIHRoZSBldmVudCB2YXJpYWJsZVxuICAgICAgKiB9XG4gICAgICAqIH1cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgQW5pbWF0aW9uVHJhbnNpdGlvbkV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX18wXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBbmltYXRpb25UcmFuc2l0aW9uRXZlbnQoX2EpIHtcbiAgICAgICAgICAgIHZhciBmcm9tU3RhdGUgPSBfYS5mcm9tU3RhdGUsIHRvU3RhdGUgPSBfYS50b1N0YXRlLCB0b3RhbFRpbWUgPSBfYS50b3RhbFRpbWUsIHBoYXNlTmFtZSA9IF9hLnBoYXNlTmFtZTtcbiAgICAgICAgICAgIHRoaXMuZnJvbVN0YXRlID0gZnJvbVN0YXRlO1xuICAgICAgICAgICAgdGhpcy50b1N0YXRlID0gdG9TdGF0ZTtcbiAgICAgICAgICAgIHRoaXMudG90YWxUaW1lID0gdG90YWxUaW1lO1xuICAgICAgICAgICAgdGhpcy5waGFzZU5hbWUgPSBwaGFzZU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblRyYW5zaXRpb25FdmVudDtcbiAgICB9KCkpO1xuXG4gICAgdmFyIEFuaW1hdGlvblRyYW5zaXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxheWVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2Zyb21TdGF0ZVxuICAgICAgICAgKiBAcGFyYW0gez99IF90b1N0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3RvdGFsVGltZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uVHJhbnNpdGlvbihfcGxheWVyLCBfZnJvbVN0YXRlLCBfdG9TdGF0ZSwgX3RvdGFsVGltZSkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWVyID0gX3BsYXllcjtcbiAgICAgICAgICAgIHRoaXMuX2Zyb21TdGF0ZSA9IF9mcm9tU3RhdGU7XG4gICAgICAgICAgICB0aGlzLl90b1N0YXRlID0gX3RvU3RhdGU7XG4gICAgICAgICAgICB0aGlzLl90b3RhbFRpbWUgPSBfdG90YWxUaW1lO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBoYXNlTmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uVHJhbnNpdGlvbi5wcm90b3R5cGUuX2NyZWF0ZUV2ZW50ID0gZnVuY3Rpb24gKHBoYXNlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25UcmFuc2l0aW9uRXZlbnQoe1xuICAgICAgICAgICAgICAgIGZyb21TdGF0ZTogdGhpcy5fZnJvbVN0YXRlLFxuICAgICAgICAgICAgICAgIHRvU3RhdGU6IHRoaXMuX3RvU3RhdGUsXG4gICAgICAgICAgICAgICAgdG90YWxUaW1lOiB0aGlzLl90b3RhbFRpbWUsXG4gICAgICAgICAgICAgICAgcGhhc2VOYW1lOiBwaGFzZU5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFja1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQW5pbWF0aW9uVHJhbnNpdGlvbi5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuID0gKFpvbmUuY3VycmVudC53cmFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbGxiYWNrKF90aGlzLl9jcmVhdGVFdmVudCgnc3RhcnQnKSk7IH0sICdwbGF5ZXIub25TdGFydCcpKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXllci5vblN0YXJ0KGZuKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblRyYW5zaXRpb24ucHJvdG90eXBlLm9uRG9uZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuID0gKFpvbmUuY3VycmVudC53cmFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbGxiYWNrKF90aGlzLl9jcmVhdGVFdmVudCgnZG9uZScpKTsgfSwgJ3BsYXllci5vbkRvbmUnKSk7XG4gICAgICAgICAgICB0aGlzLl9wbGF5ZXIub25Eb25lKGZuKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEFuaW1hdGlvblRyYW5zaXRpb247XG4gICAgfSgpKTtcblxuICAgIHZhciBEZWJ1Z0RvbVJvb3RSZW5kZXJlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9kZWxlZ2F0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVidWdEb21Sb290UmVuZGVyZXIoX2RlbGVnYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRQcm90b1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21Sb290UmVuZGVyZXIucHJvdG90eXBlLnJlbmRlckNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnRQcm90bykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWJ1Z0RvbVJlbmRlcmVyKHRoaXMuX2RlbGVnYXRlLnJlbmRlckNvbXBvbmVudChjb21wb25lbnRQcm90bykpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gRGVidWdEb21Sb290UmVuZGVyZXI7XG4gICAgfSgpKTtcbiAgICB2YXIgRGVidWdEb21SZW5kZXJlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9kZWxlZ2F0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVidWdEb21SZW5kZXJlcihfZGVsZWdhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yT3JOb2RlXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGRlYnVnSW5mb1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuc2VsZWN0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiAoc2VsZWN0b3JPck5vZGUsIGRlYnVnSW5mbykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmF0aXZlRWwgPSB0aGlzLl9kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudChzZWxlY3Rvck9yTm9kZSwgZGVidWdJbmZvKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlYnVnRWwgPSBuZXcgRGVidWdFbGVtZW50KG5hdGl2ZUVsLCBudWxsLCBkZWJ1Z0luZm8pO1xuICAgICAgICAgICAgaW5kZXhEZWJ1Z05vZGUoZGVidWdFbCk7XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlRWw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGRlYnVnSW5mb1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCBuYW1lLCBkZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hdGl2ZUVsID0gdGhpcy5fZGVsZWdhdGUuY3JlYXRlRWxlbWVudChwYXJlbnRFbGVtZW50LCBuYW1lLCBkZWJ1Z0luZm8pO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVidWdFbCA9IG5ldyBEZWJ1Z0VsZW1lbnQobmF0aXZlRWwsIGdldERlYnVnTm9kZShwYXJlbnRFbGVtZW50KSwgZGVidWdJbmZvKTtcbiAgICAgICAgICAgIGRlYnVnRWwubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICBpbmRleERlYnVnTm9kZShkZWJ1Z0VsKTtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVFbDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVZpZXdSb290ID0gZnVuY3Rpb24gKGhvc3RFbGVtZW50KSB7IHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jcmVhdGVWaWV3Um9vdChob3N0RWxlbWVudCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVidWdJbmZvXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0RvbVJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUZW1wbGF0ZUFuY2hvciA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCBkZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbW1lbnQgPSB0aGlzLl9kZWxlZ2F0ZS5jcmVhdGVUZW1wbGF0ZUFuY2hvcihwYXJlbnRFbGVtZW50LCBkZWJ1Z0luZm8pO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVidWdFbCA9IG5ldyBEZWJ1Z05vZGUoY29tbWVudCwgZ2V0RGVidWdOb2RlKHBhcmVudEVsZW1lbnQpLCBkZWJ1Z0luZm8pO1xuICAgICAgICAgICAgaW5kZXhEZWJ1Z05vZGUoZGVidWdFbCk7XG4gICAgICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50RWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGRlYnVnSW5mb1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlVGV4dCA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCB2YWx1ZSwgZGVidWdJbmZvKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ZXh0ID0gdGhpcy5fZGVsZWdhdGUuY3JlYXRlVGV4dChwYXJlbnRFbGVtZW50LCB2YWx1ZSwgZGVidWdJbmZvKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlYnVnRWwgPSBuZXcgRGVidWdOb2RlKHRleHQsIGdldERlYnVnTm9kZShwYXJlbnRFbGVtZW50KSwgZGVidWdJbmZvKTtcbiAgICAgICAgICAgIGluZGV4RGVidWdOb2RlKGRlYnVnRWwpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUucHJvamVjdE5vZGVzID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQsIG5vZGVzKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z1BhcmVudCA9IGdldERlYnVnTm9kZShwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGVidWdQYXJlbnQpICYmIGRlYnVnUGFyZW50IGluc3RhbmNlb2YgRGVidWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVidWdFbGVtZW50XzEgPSBkZWJ1Z1BhcmVudDtcbiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IGRlYnVnRWxlbWVudF8xLmFkZENoaWxkKGdldERlYnVnTm9kZShub2RlKSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUucHJvamVjdE5vZGVzKHBhcmVudEVsZW1lbnQsIG5vZGVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSb290Tm9kZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLmF0dGFjaFZpZXdBZnRlciA9IGZ1bmN0aW9uIChub2RlLCB2aWV3Um9vdE5vZGVzKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z05vZGUgPSBnZXREZWJ1Z05vZGUobm9kZSk7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KGRlYnVnTm9kZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z1BhcmVudCA9IGRlYnVnTm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXdSb290Tm9kZXMubGVuZ3RoID4gMCAmJiBpc1ByZXNlbnQoZGVidWdQYXJlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlYnVnVmlld1Jvb3ROb2Rlc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZpZXdSb290Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAocm9vdE5vZGUpIHsgcmV0dXJuIGRlYnVnVmlld1Jvb3ROb2Rlc18xLnB1c2goZ2V0RGVidWdOb2RlKHJvb3ROb2RlKSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z1BhcmVudC5pbnNlcnRDaGlsZHJlbkFmdGVyKGRlYnVnTm9kZSwgZGVidWdWaWV3Um9vdE5vZGVzXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLmF0dGFjaFZpZXdBZnRlcihub2RlLCB2aWV3Um9vdE5vZGVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld1Jvb3ROb2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuZGV0YWNoVmlldyA9IGZ1bmN0aW9uICh2aWV3Um9vdE5vZGVzKSB7XG4gICAgICAgICAgICB2aWV3Um9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z05vZGUgPSBnZXREZWJ1Z05vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChkZWJ1Z05vZGUpICYmIGlzUHJlc2VudChkZWJ1Z05vZGUucGFyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z05vZGUucGFyZW50LnJlbW92ZUNoaWxkKGRlYnVnTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5kZXRhY2hWaWV3KHZpZXdSb290Tm9kZXMpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdBbGxOb2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuZGVzdHJveVZpZXcgPSBmdW5jdGlvbiAoaG9zdEVsZW1lbnQsIHZpZXdBbGxOb2Rlcykge1xuICAgICAgICAgICAgdmlld0FsbE5vZGVzID0gdmlld0FsbE5vZGVzIHx8IFtdO1xuICAgICAgICAgICAgdmlld0FsbE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmVtb3ZlRGVidWdOb2RlRnJvbUluZGV4KGdldERlYnVnTm9kZShub2RlKSk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveVZpZXcoaG9zdEVsZW1lbnQsIHZpZXdBbGxOb2Rlcyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLmxpc3RlbiA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVidWdFbCA9IGdldERlYnVnTm9kZShyZW5kZXJFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGVidWdFbCkpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0VsLmxpc3RlbmVycy5wdXNoKG5ldyBFdmVudExpc3RlbmVyKG5hbWUsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUubGlzdGVuKHJlbmRlckVsZW1lbnQsIG5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0XG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0RvbVJlbmRlcmVyLnByb3RvdHlwZS5saXN0ZW5HbG9iYWwgPSBmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmxpc3Rlbkdsb2JhbCh0YXJnZXQsIG5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5VmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldEVsZW1lbnRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlYnVnRWwgPSBnZXREZWJ1Z05vZGUocmVuZGVyRWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KGRlYnVnRWwpICYmIGRlYnVnRWwgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0VsLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXRFbGVtZW50UHJvcGVydHkocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdEb21SZW5kZXJlci5wcm90b3R5cGUuc2V0RWxlbWVudEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVidWdFbCA9IGdldERlYnVnTm9kZShyZW5kZXJFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZGVidWdFbCkgJiYgZGVidWdFbCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGRlYnVnRWwuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUuc2V0RWxlbWVudEF0dHJpYnV0ZShyZW5kZXJFbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eU5hbWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eVZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0RvbVJlbmRlcmVyLnByb3RvdHlwZS5zZXRCaW5kaW5nRGVidWdJbmZvID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fZGVsZWdhdGUuc2V0QmluZGluZ0RlYnVnSW5mbyhyZW5kZXJFbGVtZW50LCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXNBZGRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldEVsZW1lbnRDbGFzcyA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBjbGFzc05hbWUsIGlzQWRkKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWJ1Z0VsID0gZ2V0RGVidWdOb2RlKHJlbmRlckVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGlzUHJlc2VudChkZWJ1Z0VsKSAmJiBkZWJ1Z0VsIGluc3RhbmNlb2YgRGVidWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZGVidWdFbC5jbGFzc2VzW2NsYXNzTmFtZV0gPSBpc0FkZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldEVsZW1lbnRDbGFzcyhyZW5kZXJFbGVtZW50LCBjbGFzc05hbWUsIGlzQWRkKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlVmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldEVsZW1lbnRTdHlsZSA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBzdHlsZU5hbWUsIHN0eWxlVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRlYnVnRWwgPSBnZXREZWJ1Z05vZGUocmVuZGVyRWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoaXNQcmVzZW50KGRlYnVnRWwpICYmIGRlYnVnRWwgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0VsLnN0eWxlc1tzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLnNldEVsZW1lbnRTdHlsZShyZW5kZXJFbGVtZW50LCBzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBhcmdzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0RvbVJlbmRlcmVyLnByb3RvdHlwZS5pbnZva2VFbGVtZW50TWV0aG9kID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIG1ldGhvZE5hbWUsIGFyZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbGVnYXRlLmludm9rZUVsZW1lbnRNZXRob2QocmVuZGVyRWxlbWVudCwgbWV0aG9kTmFtZSwgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlbmRlck5vZGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0RvbVJlbmRlcmVyLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKHJlbmRlck5vZGUsIHRleHQpIHsgdGhpcy5fZGVsZWdhdGUuc2V0VGV4dChyZW5kZXJOb2RlLCB0ZXh0KTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nU3R5bGVzXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzXG4gICAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxheVxuICAgICAgICAgKiBAcGFyYW0gez99IGVhc2luZ1xuICAgICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnRG9tUmVuZGVyZXIucHJvdG90eXBlLmFuaW1hdGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgc3RhcnRpbmdTdHlsZXMsIGtleWZyYW1lcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHByZXZpb3VzUGxheWVycykge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzUGxheWVycyA9PT0gdm9pZCAwKSB7IHByZXZpb3VzUGxheWVycyA9IFtdOyB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuYW5pbWF0ZShlbGVtZW50LCBzdGFydGluZ1N0eWxlcywga2V5ZnJhbWVzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgcHJldmlvdXNQbGF5ZXJzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlYnVnRG9tUmVuZGVyZXI7XG4gICAgfSgpKTtcblxuICAgIHZhciBWaWV3VHlwZSA9IHt9O1xuICAgIFZpZXdUeXBlLkhPU1QgPSAwO1xuICAgIFZpZXdUeXBlLkNPTVBPTkVOVCA9IDE7XG4gICAgVmlld1R5cGUuRU1CRURERUQgPSAyO1xuICAgIFZpZXdUeXBlW1ZpZXdUeXBlLkhPU1RdID0gXCJIT1NUXCI7XG4gICAgVmlld1R5cGVbVmlld1R5cGUuQ09NUE9ORU5UXSA9IFwiQ09NUE9ORU5UXCI7XG4gICAgVmlld1R5cGVbVmlld1R5cGUuRU1CRURERURdID0gXCJFTUJFRERFRFwiO1xuXG4gICAgdmFyIFN0YXRpY05vZGVEZWJ1Z0luZm8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlclRva2Vuc1xuICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVmVG9rZW5zXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBTdGF0aWNOb2RlRGVidWdJbmZvKHByb3ZpZGVyVG9rZW5zLCBjb21wb25lbnRUb2tlbiwgcmVmVG9rZW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVyVG9rZW5zID0gcHJvdmlkZXJUb2tlbnM7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFRva2VuID0gY29tcG9uZW50VG9rZW47XG4gICAgICAgICAgICB0aGlzLnJlZlRva2VucyA9IHJlZlRva2VucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RhdGljTm9kZURlYnVnSW5mbztcbiAgICB9KCkpO1xuICAgIHZhciBEZWJ1Z0NvbnRleHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld1xuICAgICAgICAgKiBAcGFyYW0gez99IF9ub2RlSW5kZXhcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdHBsUm93XG4gICAgICAgICAqIEBwYXJhbSB7P30gX3RwbENvbFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGVidWdDb250ZXh0KF92aWV3LCBfbm9kZUluZGV4LCBfdHBsUm93LCBfdHBsQ29sKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3ID0gX3ZpZXc7XG4gICAgICAgICAgICB0aGlzLl9ub2RlSW5kZXggPSBfbm9kZUluZGV4O1xuICAgICAgICAgICAgdGhpcy5fdHBsUm93ID0gX3RwbFJvdztcbiAgICAgICAgICAgIHRoaXMuX3RwbENvbCA9IF90cGxDb2w7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnQ29udGV4dC5wcm90b3R5cGUsIFwiX3N0YXRpY05vZGVJbmZvXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9ub2RlSW5kZXgpID8gdGhpcy5fdmlldy5zdGF0aWNOb2RlRGVidWdJbmZvc1t0aGlzLl9ub2RlSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0LnByb3RvdHlwZSwgXCJjb250ZXh0XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92aWV3LmNvbnRleHQ7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0LnByb3RvdHlwZSwgXCJjb21wb25lbnRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0aWNOb2RlSW5mbyA9IHRoaXMuX3N0YXRpY05vZGVJbmZvO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoc3RhdGljTm9kZUluZm8pICYmIGlzUHJlc2VudChzdGF0aWNOb2RlSW5mby5jb21wb25lbnRUb2tlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KHN0YXRpY05vZGVJbmZvLmNvbXBvbmVudFRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnQ29udGV4dC5wcm90b3R5cGUsIFwiY29tcG9uZW50UmVuZGVyRWxlbWVudFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbXBvbmVudFZpZXcgPSB0aGlzLl92aWV3O1xuICAgICAgICAgICAgICAgIHdoaWxlIChpc1ByZXNlbnQoY29tcG9uZW50Vmlldy5wYXJlbnRWaWV3KSAmJiBjb21wb25lbnRWaWV3LnR5cGUgIT09IFZpZXdUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRWaWV3ID0gKGNvbXBvbmVudFZpZXcucGFyZW50Vmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnQ29udGV4dC5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3ZpZXcuaW5qZWN0b3IodGhpcy5fbm9kZUluZGV4KTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0NvbnRleHQucHJvdG90eXBlLCBcInJlbmRlck5vZGVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuX25vZGVJbmRleCkgJiYgdGhpcy5fdmlldy5hbGxOb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlldy5hbGxOb2Rlc1t0aGlzLl9ub2RlSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0NvbnRleHQucHJvdG90eXBlLCBcInByb3ZpZGVyVG9rZW5zXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RhdGljTm9kZUluZm8gPSB0aGlzLl9zdGF0aWNOb2RlSW5mbztcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNQcmVzZW50KHN0YXRpY05vZGVJbmZvKSA/IHN0YXRpY05vZGVJbmZvLnByb3ZpZGVyVG9rZW5zIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0LnByb3RvdHlwZSwgXCJzb3VyY2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlldy5jb21wb25lbnRUeXBlLnRlbXBsYXRlVXJsICsgXCI6XCIgKyB0aGlzLl90cGxSb3cgKyBcIjpcIiArIHRoaXMuX3RwbENvbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0LnByb3RvdHlwZSwgXCJyZWZlcmVuY2VzXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YXJWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0aWNOb2RlSW5mbyA9IHRoaXMuX3N0YXRpY05vZGVJbmZvO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoc3RhdGljTm9kZUluZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlZnNfMSA9IHN0YXRpY05vZGVJbmZvLnJlZlRva2VucztcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmc18xKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWZOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWZUb2tlbiA9IHJlZnNfMVtyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhbmsocmVmVG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyVmFsdWUgPSBfdGhpcy5fdmlldy5hbGxOb2RlcyA/IF90aGlzLl92aWV3LmFsbE5vZGVzW190aGlzLl9ub2RlSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhclZhbHVlID0gX3RoaXMuX3ZpZXcuaW5qZWN0b3JHZXQocmVmVG9rZW4sIF90aGlzLl9ub2RlSW5kZXgsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyVmFsdWVzW3JlZk5hbWVdID0gdmFyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFyVmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBEZWJ1Z0NvbnRleHQ7XG4gICAgfSgpKTtcblxuICAgIHZhciBWaWV3QW5pbWF0aW9uTWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gVmlld0FuaW1hdGlvbk1hcCgpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHRoaXMuX2FsbFBsYXllcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0FuaW1hdGlvbk1hcC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBhbmltYXRpb25OYW1lKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbGF5ZXJzQnlBbmltYXRpb24gPSB0aGlzLl9tYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGlzUHJlc2VudChwbGF5ZXJzQnlBbmltYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcnNCeUFuaW1hdGlvblthbmltYXRpb25OYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVmlld0FuaW1hdGlvbk1hcC5wcm90b3R5cGUuZmluZEFsbFBsYXllcnNCeUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWwgPSB0aGlzLl9tYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGVsID8gT2JqZWN0LmtleXMoZWwpLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gZWxba107IH0pIDogW107XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25OYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3QW5pbWF0aW9uTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgYW5pbWF0aW9uTmFtZSwgcGxheWVyKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbGF5ZXJzQnlBbmltYXRpb24gPSB0aGlzLl9tYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKCFpc1ByZXNlbnQocGxheWVyc0J5QW5pbWF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHBsYXllcnNCeUFuaW1hdGlvbiA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhpc3RpbmdFbnRyeSA9IHBsYXllcnNCeUFuaW1hdGlvblthbmltYXRpb25OYW1lXTtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoZXhpc3RpbmdFbnRyeSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShlbGVtZW50LCBhbmltYXRpb25OYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBsYXllcnNCeUFuaW1hdGlvblthbmltYXRpb25OYW1lXSA9IHBsYXllcjtcbiAgICAgICAgICAgIHRoaXMuX2FsbFBsYXllcnMucHVzaChwbGF5ZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLnNldChlbGVtZW50LCBwbGF5ZXJzQnlBbmltYXRpb24pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdBbmltYXRpb25NYXAucHJvdG90eXBlLmdldEFsbFBsYXllcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9hbGxQbGF5ZXJzOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez89fSB0YXJnZXRQbGF5ZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdBbmltYXRpb25NYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhbmltYXRpb25OYW1lLCB0YXJnZXRQbGF5ZXIpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRQbGF5ZXIgPT09IHZvaWQgMCkgeyB0YXJnZXRQbGF5ZXIgPSBudWxsOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbGF5ZXJzQnlBbmltYXRpb24gPSB0aGlzLl9tYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHBsYXllcnNCeUFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllciA9IHBsYXllcnNCeUFuaW1hdGlvblthbmltYXRpb25OYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFBsYXllciB8fCBwbGF5ZXIgPT09IHRhcmdldFBsYXllcikge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGxheWVyc0J5QW5pbWF0aW9uW2FuaW1hdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmRleCA9IHRoaXMuX2FsbFBsYXllcnMuaW5kZXhPZihwbGF5ZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxQbGF5ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhwbGF5ZXJzQnlBbmltYXRpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFZpZXdBbmltYXRpb25NYXA7XG4gICAgfSgpKTtcblxuICAgIHZhciBBbmltYXRpb25WaWV3Q29udGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9hbmltYXRpb25RdWV1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uVmlld0NvbnRleHQoX2FuaW1hdGlvblF1ZXVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRpb25RdWV1ZSA9IF9hbmltYXRpb25RdWV1ZTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXllcnMgPSBuZXcgVmlld0FuaW1hdGlvbk1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25WaWV3Q29udGV4dC5wcm90b3R5cGUub25BbGxBY3RpdmVBbmltYXRpb25zRG9uZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWN0aXZlQW5pbWF0aW9uUGxheWVycyA9IHRoaXMuX3BsYXllcnMuZ2V0QWxsUGxheWVycygpO1xuICAgICAgICAgICAgLy8gd2UgY2hlY2sgZm9yIHRoZSBsZW5ndGggdG8gYXZvaWQgaGF2aW5nIEdyb3VwQW5pbWF0aW9uUGxheWVyXG4gICAgICAgICAgICAvLyBpc3N1ZSBhbiB1bm5lY2Vzc2FyeSBtaWNyb3Rhc2sgd2hlbiB6ZXJvIHBsYXllcnMgYXJlIHBhc3NlZCBpblxuICAgICAgICAgICAgaWYgKGFjdGl2ZUFuaW1hdGlvblBsYXllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbmV3IEFuaW1hdGlvbkdyb3VwUGxheWVyKGFjdGl2ZUFuaW1hdGlvblBsYXllcnMpLm9uRG9uZShmdW5jdGlvbiAoKSB7IHJldHVybiBjYWxsYmFjaygpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25OYW1lXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBbmltYXRpb25WaWV3Q29udGV4dC5wcm90b3R5cGUucXVldWVBbmltYXRpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwgYW5pbWF0aW9uTmFtZSwgcGxheWVyKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uUXVldWUuZW5xdWV1ZShwbGF5ZXIpO1xuICAgICAgICAgICAgdGhpcy5fcGxheWVycy5zZXQoZWxlbWVudCwgYW5pbWF0aW9uTmFtZSwgcGxheWVyKTtcbiAgICAgICAgICAgIHBsYXllci5vbkRvbmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3BsYXllcnMucmVtb3ZlKGVsZW1lbnQsIGFuaW1hdGlvbk5hbWUsIHBsYXllcik7IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk5hbWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFuaW1hdGlvblZpZXdDb250ZXh0LnByb3RvdHlwZS5nZXRBbmltYXRpb25QbGF5ZXJzID0gZnVuY3Rpb24gKGVsZW1lbnQsIGFuaW1hdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb25OYW1lID09PSB2b2lkIDApIHsgYW5pbWF0aW9uTmFtZSA9IG51bGw7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllcnMgPSBbXTtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VycmVudFBsYXllciA9IHRoaXMuX3BsYXllcnMuZmluZChlbGVtZW50LCBhbmltYXRpb25OYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBsYXllcikge1xuICAgICAgICAgICAgICAgICAgICBfcmVjdXJzZVBsYXllcnMoY3VycmVudFBsYXllciwgcGxheWVycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWVycy5maW5kQWxsUGxheWVyc0J5RWxlbWVudChlbGVtZW50KS5mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHsgcmV0dXJuIF9yZWN1cnNlUGxheWVycyhwbGF5ZXIsIHBsYXllcnMpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwbGF5ZXJzO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gQW5pbWF0aW9uVmlld0NvbnRleHQ7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHBsYXllclxuICAgICAqIEBwYXJhbSB7P30gY29sbGVjdGVkUGxheWVyc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gX3JlY3Vyc2VQbGF5ZXJzKHBsYXllciwgY29sbGVjdGVkUGxheWVycykge1xuICAgICAgICBpZiAoKHBsYXllciBpbnN0YW5jZW9mIEFuaW1hdGlvbkdyb3VwUGxheWVyKSB8fCAocGxheWVyIGluc3RhbmNlb2YgQW5pbWF0aW9uU2VxdWVuY2VQbGF5ZXIpKSB7XG4gICAgICAgICAgICBwbGF5ZXIucGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHsgcmV0dXJuIF9yZWN1cnNlUGxheWVycyhwbGF5ZXIsIGNvbGxlY3RlZFBsYXllcnMpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbGxlY3RlZFBsYXllcnMucHVzaChwbGF5ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMTUgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICB2YXIgRWxlbWVudEluamVjdG9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDE1KEVsZW1lbnRJbmplY3RvciwgX3N1cGVyKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbm9kZUluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBFbGVtZW50SW5qZWN0b3IoX3ZpZXcsIF9ub2RlSW5kZXgpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fdmlldyA9IF92aWV3O1xuICAgICAgICAgICAgdGhpcy5fbm9kZUluZGV4ID0gX25vZGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBFbGVtZW50SW5qZWN0b3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0b2tlbiwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgPT09IHZvaWQgMCkgeyBub3RGb3VuZFZhbHVlID0gVEhST1dfSUZfTk9UX0ZPVU5EOyB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlldy5pbmplY3RvckdldCh0b2tlbiwgdGhpcy5fbm9kZUluZGV4LCBub3RGb3VuZFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEVsZW1lbnRJbmplY3RvcjtcbiAgICB9KEluamVjdG9yKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQxNCA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9zY29wZV9jaGVjayA9IHd0ZkNyZWF0ZVNjb3BlKFwiQXBwVmlldyNjaGVjayhhc2NpaSBpZClcIik7XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEVNUFRZX0NPTlRFWFQkMSA9IG5ldyBPYmplY3QoKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBVTkRFRklORUQkMSA9IG5ldyBPYmplY3QoKTtcbiAgICAvKipcbiAgICAgKiAgQ29zdCBvZiBtYWtpbmcgb2JqZWN0czogaHR0cDovL2pzcGVyZi5jb20vaW5zdGFudGlhdGUtc2l6ZS1vZi1vYmplY3RcbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBBcHBWaWV3ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2xhenpcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRUeXBlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdVdGlsc1xuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudFZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBjZE1vZGVcbiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVjbGFyZWRWaWV3Q29udGFpbmVyXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBcHBWaWV3KGNsYXp6LCBjb21wb25lbnRUeXBlLCB0eXBlLCB2aWV3VXRpbHMsIHBhcmVudFZpZXcsIHBhcmVudEluZGV4LCBwYXJlbnRFbGVtZW50LCBjZE1vZGUsIGRlY2xhcmVkVmlld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKGRlY2xhcmVkVmlld0NvbnRhaW5lciA9PT0gdm9pZCAwKSB7IGRlY2xhcmVkVmlld0NvbnRhaW5lciA9IG51bGw7IH1cbiAgICAgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdGhpcy52aWV3VXRpbHMgPSB2aWV3VXRpbHM7XG4gICAgICAgICAgICB0aGlzLnBhcmVudFZpZXcgPSBwYXJlbnRWaWV3O1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRJbmRleCA9IHBhcmVudEluZGV4O1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuY2RNb2RlID0gY2RNb2RlO1xuICAgICAgICAgICAgdGhpcy5kZWNsYXJlZFZpZXdDb250YWluZXIgPSBkZWNsYXJlZFZpZXdDb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ2hlY2tzID0gMDtcbiAgICAgICAgICAgIHRoaXMucmVmID0gbmV3IFZpZXdSZWZfKHRoaXMsIHZpZXdVdGlscy5hbmltYXRpb25RdWV1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gVmlld1R5cGUuQ09NUE9ORU5UIHx8IHR5cGUgPT09IFZpZXdUeXBlLkhPU1QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyID0gdmlld1V0aWxzLnJlbmRlckNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIgPSBwYXJlbnRWaWV3LnJlbmRlcmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGlyZWN0UmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyLmRpcmVjdFJlbmRlcmVyO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBWaWV3LnByb3RvdHlwZSwgXCJhbmltYXRpb25Db250ZXh0XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9hbmltYXRpb25Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkNvbnRleHQgPSBuZXcgQW5pbWF0aW9uVmlld0NvbnRleHQodGhpcy52aWV3VXRpbHMuYW5pbWF0aW9uUXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0aW9uQ29udGV4dDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXBwVmlldy5wcm90b3R5cGUsIFwiZGVzdHJveWVkXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNkTW9kZSA9PT0gQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuRGVzdHJveWVkOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbnRlcm5hbChudWxsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcm9vdFNlbGVjdG9yT3JOb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEluamVjdG9yXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJvamVjdGFibGVOb2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuY3JlYXRlSG9zdFZpZXcgPSBmdW5jdGlvbiAocm9vdFNlbGVjdG9yT3JOb2RlLCBob3N0SW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IChFTVBUWV9DT05URVhUJDEpO1xuICAgICAgICAgICAgdGhpcy5faGFzRXh0ZXJuYWxIb3N0RWxlbWVudCA9IGlzUHJlc2VudChyb290U2VsZWN0b3JPck5vZGUpO1xuICAgICAgICAgICAgdGhpcy5faG9zdEluamVjdG9yID0gaG9zdEluamVjdG9yO1xuICAgICAgICAgICAgdGhpcy5faG9zdFByb2plY3RhYmxlTm9kZXMgPSBwcm9qZWN0YWJsZU5vZGVzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSW50ZXJuYWwocm9vdFNlbGVjdG9yT3JOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBPdmVyd3JpdHRlbiBieSBpbXBsZW1lbnRhdGlvbnMuXG4gICAgICAgICAgKiBSZXR1cm5zIHRoZSBDb21wb25lbnRSZWYgZm9yIHRoZSBob3N0IGVsZW1lbnQgZm9yIFZpZXdUeXBlLkhPU1QuXG4gICAgICAgICAqIEBwYXJhbSB7P30gcm9vdFNlbGVjdG9yT3JOb2RlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5jcmVhdGVJbnRlcm5hbCA9IGZ1bmN0aW9uIChyb290U2VsZWN0b3JPck5vZGUpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgT3ZlcndyaXR0ZW4gYnkgaW1wbGVtZW50YXRpb25zLlxuICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlTm9kZUluZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZFZpZXdJbnRlcm5hbCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZU5vZGVJbmRleCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbGFzdFJvb3ROb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gYWxsTm9kZXNcbiAgICAgICAgICogQHBhcmFtIHs/fSBkaXNwb3NhYmxlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uIChsYXN0Um9vdE5vZGUsIGFsbE5vZGVzLCBkaXNwb3NhYmxlcykge1xuICAgICAgICAgICAgdGhpcy5sYXN0Um9vdE5vZGUgPSBsYXN0Um9vdE5vZGU7XG4gICAgICAgICAgICB0aGlzLmFsbE5vZGVzID0gYWxsTm9kZXM7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzID0gZGlzcG9zYWJsZXM7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBWaWV3VHlwZS5DT01QT05FTlQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5UGFyZW50UXVlcmllc0ludGVybmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7P30gbm9kZUluZGV4XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLmluamVjdG9yR2V0ID0gZnVuY3Rpb24gKHRva2VuLCBub2RlSW5kZXgsIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IFRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0gVU5ERUZJTkVEJDE7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gdGhpcztcbiAgICAgICAgICAgIHdoaWxlIChyZXN1bHQgPT09IFVOREVGSU5FRCQxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChub2RlSW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZpZXcuaW5qZWN0b3JHZXRJbnRlcm5hbCh0b2tlbiwgbm9kZUluZGV4LCBVTkRFRklORUQkMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFVOREVGSU5FRCQxICYmIHZpZXcudHlwZSA9PT0gVmlld1R5cGUuSE9TVCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2aWV3Ll9ob3N0SW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gdmlldy5wYXJlbnRJbmRleDtcbiAgICAgICAgICAgICAgICB2aWV3ID0gdmlldy5wYXJlbnRWaWV3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBPdmVyd3JpdHRlbiBieSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kUmVzdWx0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5pbmplY3RvckdldEludGVybmFsID0gZnVuY3Rpb24gKHRva2VuLCBub2RlSW5kZXgsIG5vdEZvdW5kUmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbm90Rm91bmRSZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuaW5qZWN0b3IgPSBmdW5jdGlvbiAobm9kZUluZGV4KSB7IHJldHVybiBuZXcgRWxlbWVudEluamVjdG9yKHRoaXMsIG5vZGVJbmRleCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuZGV0YWNoQW5kRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuZGV0YWNoVmlldyh0aGlzLnZpZXdDb250YWluZXIubmVzdGVkVmlld3MuaW5kZXhPZih0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFwcFJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5yZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5faGFzRXh0ZXJuYWxIb3N0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0aGlzLmNkTW9kZSA9PT0gQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaG9zdEVsZW1lbnQgPSB0aGlzLnR5cGUgPT09IFZpZXdUeXBlLkNPTVBPTkVOVCA/IHRoaXMucGFyZW50RWxlbWVudCA6IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NhYmxlcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXNbaV0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lJbnRlcm5hbCgpO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eVBhcmVudFF1ZXJpZXNJbnRlcm5hbCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRpb25Db250ZXh0Lm9uQWxsQWN0aXZlQW5pbWF0aW9uc0RvbmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucmVuZGVyZXIuZGVzdHJveVZpZXcoaG9zdEVsZW1lbnQsIF90aGlzLmFsbE5vZGVzKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlc3Ryb3lWaWV3KGhvc3RFbGVtZW50LCB0aGlzLmFsbE5vZGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2RNb2RlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuRGVzdHJveWVkO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE92ZXJ3cml0dGVuIGJ5IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuZGVzdHJveUludGVybmFsID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE92ZXJ3cml0dGVuIGJ5IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuZGV0YWNoSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoSW50ZXJuYWwoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hbmltYXRpb25Db250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uQ29udGV4dC5vbkFsbEFjdGl2ZUFuaW1hdGlvbnNEb25lKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9yZW5kZXJEZXRhY2goKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJEZXRhY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRlY2xhcmVkVmlld0NvbnRhaW5lciAmJiB0aGlzLmRlY2xhcmVkVmlld0NvbnRhaW5lciAhPT0gdGhpcy52aWV3Q29udGFpbmVyICYmXG4gICAgICAgICAgICAgICAgdGhpcy5kZWNsYXJlZFZpZXdDb250YWluZXIucHJvamVjdGVkVmlld3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9qZWN0ZWRWaWV3cyA9IHRoaXMuZGVjbGFyZWRWaWV3Q29udGFpbmVyLnByb2plY3RlZFZpZXdzO1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gcHJvamVjdGVkVmlld3MuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBwZXJmOiBwb3AgaXMgZmFzdGVyIHRoYW4gc3BsaWNlIVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBwcm9qZWN0ZWRWaWV3cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RlZFZpZXdzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkVmlld3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcFJlZiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eVBhcmVudFF1ZXJpZXNJbnRlcm5hbCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLl9yZW5kZXJEZXRhY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Um9vdE5vZGVzSW50ZXJuYWwodGhpcy5fZGlyZWN0UmVuZGVyZXIucmVtb3ZlLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGV0YWNoVmlldyh0aGlzLmZsYXRSb290Tm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBSZWZcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLmF0dGFjaFRvQXBwUmVmID0gZnVuY3Rpb24gKGFwcFJlZikge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBSZWYgPSBhcHBSZWY7XG4gICAgICAgICAgICB0aGlzLmRpcnR5UGFyZW50UXVlcmllc0ludGVybmFsKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXJcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2Vmlld1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuYXR0YWNoQWZ0ZXIgPSBmdW5jdGlvbiAodmlld0NvbnRhaW5lciwgcHJldlZpZXcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFwcFJlZikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIEFwcGxpY2F0aW9uUmVmIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyQXR0YWNoKHZpZXdDb250YWluZXIsIHByZXZWaWV3KTtcbiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IHZpZXdDb250YWluZXI7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWNsYXJlZFZpZXdDb250YWluZXIgJiYgdGhpcy5kZWNsYXJlZFZpZXdDb250YWluZXIgIT09IHZpZXdDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVjbGFyZWRWaWV3Q29udGFpbmVyLnByb2plY3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjbGFyZWRWaWV3Q29udGFpbmVyLnByb2plY3RlZFZpZXdzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGVjbGFyZWRWaWV3Q29udGFpbmVyLnByb2plY3RlZFZpZXdzLnB1c2godGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpcnR5UGFyZW50UXVlcmllc0ludGVybmFsKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXJcbiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2Vmlld1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUubW92ZUFmdGVyID0gZnVuY3Rpb24gKHZpZXdDb250YWluZXIsIHByZXZWaWV3KSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJBdHRhY2godmlld0NvbnRhaW5lciwgcHJldlZpZXcpO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eVBhcmVudFF1ZXJpZXNJbnRlcm5hbCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gcHJldlZpZXdcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLl9yZW5kZXJBdHRhY2ggPSBmdW5jdGlvbiAodmlld0NvbnRhaW5lciwgcHJldlZpZXcpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZOb2RlID0gcHJldlZpZXcgPyBwcmV2Vmlldy5sYXN0Um9vdE5vZGUgOiB2aWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXh0U2libGluZyA9IHRoaXMuX2RpcmVjdFJlbmRlcmVyLm5leHRTaWJsaW5nKHByZXZOb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdFJvb3ROb2Rlc0ludGVybmFsKHRoaXMuX2RpcmVjdFJlbmRlcmVyLmluc2VydEJlZm9yZSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyZW50RWxlbWVudCA9IHRoaXMuX2RpcmVjdFJlbmRlcmVyLnBhcmVudEVsZW1lbnQocHJldk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdFJvb3ROb2Rlc0ludGVybmFsKHRoaXMuX2RpcmVjdFJlbmRlcmVyLmFwcGVuZENoaWxkLCBwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXR0YWNoVmlld0FmdGVyKHByZXZOb2RlLCB0aGlzLmZsYXRSb290Tm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXBwVmlldy5wcm90b3R5cGUsIFwiY2hhbmdlRGV0ZWN0b3JSZWZcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVmOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFwcFZpZXcucHJvdG90eXBlLCBcImZsYXRSb290Tm9kZXNcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXRSb290Tm9kZXNJbnRlcm5hbChhZGRUb0FycmF5LCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRlbnRJbmRleFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUucHJvamVjdE5vZGVzID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQsIG5nQ29udGVudEluZGV4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0UHJvamVjdGVkTm9kZXMobmdDb250ZW50SW5kZXgsIHRoaXMuX2RpcmVjdFJlbmRlcmVyLmFwcGVuZENoaWxkLCBwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdFByb2plY3RlZE5vZGVzKG5nQ29udGVudEluZGV4LCBhZGRUb0FycmF5LCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5wcm9qZWN0Tm9kZXMocGFyZW50RWxlbWVudCwgbm9kZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRlbnRJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IGNiXG4gICAgICAgICAqIEBwYXJhbSB7P30gY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUudmlzaXRQcm9qZWN0ZWROb2RlcyA9IGZ1bmN0aW9uIChuZ0NvbnRlbnRJbmRleCwgY2IsIGMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3VHlwZS5FTUJFRERFRDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRWaWV3LnZpc2l0UHJvamVjdGVkTm9kZXMobmdDb250ZW50SW5kZXgsIGNiLCBjKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3VHlwZS5DT01QT05FTlQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFZpZXcudHlwZSA9PT0gVmlld1R5cGUuSE9TVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZXMgPSB0aGlzLnBhcmVudFZpZXcuX2hvc3RQcm9qZWN0YWJsZU5vZGVzW25nQ29udGVudEluZGV4XSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKG5vZGVzW2ldLCBjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Vmlldy52aXNpdFByb2plY3RhYmxlTm9kZXNJbnRlcm5hbCh0aGlzLnBhcmVudEluZGV4LCBuZ0NvbnRlbnRJbmRleCwgY2IsIGMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE92ZXJ3cml0dGVuIGJ5IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgKiBAcGFyYW0gez99IGNiXG4gICAgICAgICAqIEBwYXJhbSB7P30gY1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUudmlzaXRSb290Tm9kZXNJbnRlcm5hbCA9IGZ1bmN0aW9uIChjYiwgYykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE92ZXJ3cml0dGVuIGJ5IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IG5nQ29udGVudEluZGV4XG4gICAgICAgICAqIEBwYXJhbSB7P30gY2JcbiAgICAgICAgICogQHBhcmFtIHs/fSBjXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS52aXNpdFByb2plY3RhYmxlTm9kZXNJbnRlcm5hbCA9IGZ1bmN0aW9uIChub2RlSW5kZXgsIG5nQ29udGVudEluZGV4LCBjYiwgYykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE92ZXJ3cml0dGVuIGJ5IGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUuZGlydHlQYXJlbnRRdWVyaWVzSW50ZXJuYWwgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLmludGVybmFsRGV0ZWN0Q2hhbmdlcyA9IGZ1bmN0aW9uICh0aHJvd09uQ2hhbmdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZE1vZGUgIT09IENoYW5nZURldGVjdG9yU3RhdHVzLkRldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzKHRocm93T25DaGFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aHJvd09uQ2hhbmdlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5kZXRlY3RDaGFuZ2VzID0gZnVuY3Rpb24gKHRocm93T25DaGFuZ2UpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHMgPSBfc2NvcGVfY2hlY2sodGhpcy5jbGF6eik7XG4gICAgICAgICAgICBpZiAodGhpcy5jZE1vZGUgPT09IENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrZWQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmNkTW9kZSA9PT0gQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuRXJyb3JlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAodGhpcy5jZE1vZGUgPT09IENoYW5nZURldGVjdG9yU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dEZXN0cm95ZWRFcnJvcignZGV0ZWN0Q2hhbmdlcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzSW50ZXJuYWwodGhyb3dPbkNoYW5nZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jZE1vZGUgPT09IENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrT25jZSlcbiAgICAgICAgICAgICAgICB0aGlzLmNkTW9kZSA9IENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrZWQ7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ2hlY2tzKys7XG4gICAgICAgICAgICB3dGZMZWF2ZShzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBPdmVyd3JpdHRlbiBieSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aHJvd09uQ2hhbmdlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5kZXRlY3RDaGFuZ2VzSW50ZXJuYWwgPSBmdW5jdGlvbiAodGhyb3dPbkNoYW5nZSkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFwcFZpZXcucHJvdG90eXBlLm1hcmtBc0NoZWNrT25jZSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5jZE1vZGUgPSBDaGFuZ2VEZXRlY3RvclN0YXR1cy5DaGVja09uY2U7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUubWFya1BhdGhUb1Jvb3RBc0NoZWNrT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGMgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKGlzUHJlc2VudChjKSAmJiBjLmNkTW9kZSAhPT0gQ2hhbmdlRGV0ZWN0b3JTdGF0dXMuRGV0YWNoZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5jZE1vZGUgPT09IENoYW5nZURldGVjdG9yU3RhdHVzLkNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jZE1vZGUgPSBDaGFuZ2VEZXRlY3RvclN0YXR1cy5DaGVja09uY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjLnR5cGUgPT09IFZpZXdUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgICAgICAgICAgICAgICBjID0gYy5wYXJlbnRWaWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGMudmlld0NvbnRhaW5lciA/IGMudmlld0NvbnRhaW5lci5wYXJlbnRWaWV3IDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNiXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBcHBWaWV3LnByb3RvdHlwZS5ldmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIHJldHVybiBjYjtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZGV0YWlsc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXBwVmlldy5wcm90b3R5cGUudGhyb3dEZXN0cm95ZWRFcnJvciA9IGZ1bmN0aW9uIChkZXRhaWxzKSB7IHRocm93IG5ldyBWaWV3RGVzdHJveWVkRXJyb3IoZGV0YWlscyk7IH07XG4gICAgICAgIHJldHVybiBBcHBWaWV3O1xuICAgIH0oKSk7XG4gICAgdmFyIERlYnVnQXBwVmlldyA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxNChEZWJ1Z0FwcFZpZXcsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNsYXp6XG4gICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50VHlwZVxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3VXRpbHNcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRWaWV3XG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50SW5kZXhcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnROb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2RNb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGljTm9kZURlYnVnSW5mb3NcbiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVjbGFyZWRWaWV3Q29udGFpbmVyXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBEZWJ1Z0FwcFZpZXcoY2xhenosIGNvbXBvbmVudFR5cGUsIHR5cGUsIHZpZXdVdGlscywgcGFyZW50VmlldywgcGFyZW50SW5kZXgsIHBhcmVudE5vZGUsIGNkTW9kZSwgc3RhdGljTm9kZURlYnVnSW5mb3MsIGRlY2xhcmVkVmlld0NvbnRhaW5lcikge1xuICAgICAgICAgICAgaWYgKGRlY2xhcmVkVmlld0NvbnRhaW5lciA9PT0gdm9pZCAwKSB7IGRlY2xhcmVkVmlld0NvbnRhaW5lciA9IG51bGw7IH1cbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGNsYXp6LCBjb21wb25lbnRUeXBlLCB0eXBlLCB2aWV3VXRpbHMsIHBhcmVudFZpZXcsIHBhcmVudEluZGV4LCBwYXJlbnROb2RlLCBjZE1vZGUsIGRlY2xhcmVkVmlld0NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLnN0YXRpY05vZGVEZWJ1Z0luZm9zID0gc3RhdGljTm9kZURlYnVnSW5mb3M7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50RGVidWdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0FwcFZpZXcucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldERlYnVnKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNyZWF0ZS5jYWxsKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXRocm93V2l0aENvbnRleHQoZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcm9vdFNlbGVjdG9yT3JOb2RlXG4gICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcHJvamVjdGFibGVOb2Rlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdBcHBWaWV3LnByb3RvdHlwZS5jcmVhdGVIb3N0VmlldyA9IGZ1bmN0aW9uIChyb290U2VsZWN0b3JPck5vZGUsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvamVjdGFibGVOb2RlcyA9PT0gdm9pZCAwKSB7IHByb2plY3RhYmxlTm9kZXMgPSBudWxsOyB9XG4gICAgICAgICAgICB0aGlzLl9yZXNldERlYnVnKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNyZWF0ZUhvc3RWaWV3LmNhbGwodGhpcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBpbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JldGhyb3dXaXRoQ29udGV4dChlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFJlc3VsdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdBcHBWaWV3LnByb3RvdHlwZS5pbmplY3RvckdldCA9IGZ1bmN0aW9uICh0b2tlbiwgbm9kZUluZGV4LCBub3RGb3VuZFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXREZWJ1ZygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5pbmplY3RvckdldC5jYWxsKHRoaXMsIHRva2VuLCBub2RlSW5kZXgsIG5vdEZvdW5kUmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmV0aHJvd1dpdGhDb250ZXh0KGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdBcHBWaWV3LnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldERlYnVnKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JldGhyb3dXaXRoQ29udGV4dChlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnQXBwVmlldy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RGVidWcoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JldGhyb3dXaXRoQ29udGV4dChlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aHJvd09uQ2hhbmdlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEZWJ1Z0FwcFZpZXcucHJvdG90eXBlLmRldGVjdENoYW5nZXMgPSBmdW5jdGlvbiAodGhyb3dPbkNoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXREZWJ1ZygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRldGVjdENoYW5nZXMuY2FsbCh0aGlzLCB0aHJvd09uQ2hhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmV0aHJvd1dpdGhDb250ZXh0KGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdBcHBWaWV3LnByb3RvdHlwZS5fcmVzZXREZWJ1ZyA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fY3VycmVudERlYnVnQ29udGV4dCA9IG51bGw7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHJvd051bVxuICAgICAgICAgKiBAcGFyYW0gez99IGNvbE51bVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVidWdBcHBWaWV3LnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uIChub2RlSW5kZXgsIHJvd051bSwgY29sTnVtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudERlYnVnQ29udGV4dCA9IG5ldyBEZWJ1Z0NvbnRleHQodGhpcywgbm9kZUluZGV4LCByb3dOdW0sIGNvbE51bSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnQXBwVmlldy5wcm90b3R5cGUuX3JldGhyb3dXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgVmlld1dyYXBwZWRFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZE1vZGUgPSBDaGFuZ2VEZXRlY3RvclN0YXR1cy5FcnJvcmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2N1cnJlbnREZWJ1Z0NvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWaWV3V3JhcHBlZEVycm9yKGUsIHRoaXMuX2N1cnJlbnREZWJ1Z0NvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2JcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIERlYnVnQXBwVmlldy5wcm90b3R5cGUuZXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3VwZXJIYW5kbGVyID0gX3N1cGVyLnByb3RvdHlwZS5ldmVudEhhbmRsZXIuY2FsbCh0aGlzLCBjYik7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVzZXREZWJ1ZygpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlckhhbmRsZXIuY2FsbChfdGhpcywgZXZlbnROYW1lLCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXRocm93V2l0aENvbnRleHQoZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlYnVnQXBwVmlldztcbiAgICB9KEFwcFZpZXcpKTtcblxuICAgIC8qKlxuICAgICAqICBBIFZpZXdDb250YWluZXIgaXMgY3JlYXRlZCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgVmlld0NvbnRhaW5lclJlZlxuICAgICAgKiB0byBrZWVwIHRyYWNrIG9mIHRoZSBuZXN0ZWQgdmlld3MuXG4gICAgICovXG4gICAgdmFyIFZpZXdDb250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudEluZGV4XG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50Vmlld1xuICAgICAgICAgKiBAcGFyYW0gez99IG5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFZpZXdDb250YWluZXIoaW5kZXgsIHBhcmVudEluZGV4LCBwYXJlbnRWaWV3LCBuYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgICAgICAgICB0aGlzLnBhcmVudFZpZXcgPSBwYXJlbnRWaWV3O1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gbmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lci5wcm90b3R5cGUsIFwiZWxlbWVudFJlZlwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEVsZW1lbnRSZWYodGhpcy5uYXRpdmVFbGVtZW50KTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyLnByb3RvdHlwZSwgXCJ2Y1JlZlwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFZpZXdDb250YWluZXJSZWZfKHRoaXMpOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdDb250YWluZXIucHJvdG90eXBlLCBcInBhcmVudEluamVjdG9yXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnBhcmVudFZpZXcuaW5qZWN0b3IodGhpcy5wYXJlbnRJbmRleCk7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lci5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucGFyZW50Vmlldy5pbmplY3Rvcih0aGlzLmluZGV4KTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHRocm93T25DaGFuZ2VcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXIucHJvdG90eXBlLmRldGVjdENoYW5nZXNJbk5lc3RlZFZpZXdzID0gZnVuY3Rpb24gKHRocm93T25DaGFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lc3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMubmVzdGVkVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3c1tpXS5kZXRlY3RDaGFuZ2VzKHRocm93T25DaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS5kZXN0cm95TmVzdGVkVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5uZXN0ZWRWaWV3cykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB0aGlzLm5lc3RlZFZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkVmlld3NbaV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2JcbiAgICAgICAgICogQHBhcmFtIHs/fSBjXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS52aXNpdE5lc3RlZFZpZXdSb290Tm9kZXMgPSBmdW5jdGlvbiAoY2IsIGMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lc3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMubmVzdGVkVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3c1tpXS52aXNpdFJvb3ROb2Rlc0ludGVybmFsKGNiLCBjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5lc3RlZFZpZXdDbGFzc1xuICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS5tYXBOZXN0ZWRWaWV3cyA9IGZ1bmN0aW9uIChuZXN0ZWRWaWV3Q2xhc3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lc3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMubmVzdGVkVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmVzdGVkVmlldyA9IHRoaXMubmVzdGVkVmlld3NbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRWaWV3LmNsYXp6ID09PSBuZXN0ZWRWaWV3Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKG5lc3RlZFZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMucHJvamVjdGVkVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJvamVjdGVkVmlldyA9IHRoaXMucHJvamVjdGVkVmlld3NbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ZWRWaWV3LmNsYXp6ID09PSBuZXN0ZWRWaWV3Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrKHByb2plY3RlZFZpZXcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50SW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXIucHJvdG90eXBlLm1vdmVWaWV3ID0gZnVuY3Rpb24gKHZpZXcsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJldmlvdXNJbmRleCA9IHRoaXMubmVzdGVkVmlld3MuaW5kZXhPZih2aWV3KTtcbiAgICAgICAgICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBvbmVudCB2aWV3cyBjYW4ndCBiZSBtb3ZlZCFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXN0ZWRWaWV3cyA9IHRoaXMubmVzdGVkVmlld3M7XG4gICAgICAgICAgICBpZiAobmVzdGVkVmlld3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5lc3RlZFZpZXdzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRWaWV3cyA9IG5lc3RlZFZpZXdzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmVzdGVkVmlld3Muc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgICAgICAgbmVzdGVkVmlld3Muc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgdmlldyk7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2VmlldyA9IGN1cnJlbnRJbmRleCA+IDAgPyBuZXN0ZWRWaWV3c1tjdXJyZW50SW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgICAgICB2aWV3Lm1vdmVBZnRlcih0aGlzLCBwcmV2Vmlldyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3SW5kZXhcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFZpZXdDb250YWluZXIucHJvdG90eXBlLmF0dGFjaFZpZXcgPSBmdW5jdGlvbiAodmlldywgdmlld0luZGV4KSB7XG4gICAgICAgICAgICBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5DT01QT05FTlQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21wb25lbnQgdmlld3MgY2FuJ3QgYmUgbW92ZWQhXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmVzdGVkVmlld3MgPSB0aGlzLm5lc3RlZFZpZXdzO1xuICAgICAgICAgICAgaWYgKG5lc3RlZFZpZXdzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXN0ZWRWaWV3cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkVmlld3MgPSBuZXN0ZWRWaWV3cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHBlcmY6IGFycmF5LnB1c2ggaXMgZmFzdGVyIHRoYW4gYXJyYXkuc3BsaWNlIVxuICAgICAgICAgICAgaWYgKHZpZXdJbmRleCA+PSBuZXN0ZWRWaWV3cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuZXN0ZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmVzdGVkVmlld3Muc3BsaWNlKHZpZXdJbmRleCwgMCwgdmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2VmlldyA9IHZpZXdJbmRleCA+IDAgPyBuZXN0ZWRWaWV3c1t2aWV3SW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgICAgICB2aWV3LmF0dGFjaEFmdGVyKHRoaXMsIHByZXZWaWV3KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld0luZGV4XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS5kZXRhY2hWaWV3ID0gZnVuY3Rpb24gKHZpZXdJbmRleCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmlldyA9IHRoaXMubmVzdGVkVmlld3Nbdmlld0luZGV4XTtcbiAgICAgICAgICAgIC8vIHBlcmY6IGFycmF5LnBvcCBpcyBmYXN0ZXIgdGhhbiBhcnJheS5zcGxpY2UhXG4gICAgICAgICAgICBpZiAodmlld0luZGV4ID49IHRoaXMubmVzdGVkVmlld3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmVzdGVkVmlld3MucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZFZpZXdzLnNwbGljZSh2aWV3SW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcG9uZW50IHZpZXdzIGNhbid0IGJlIG1vdmVkIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuZGV0YWNoKCk7XG4gICAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFZpZXdDb250YWluZXI7XG4gICAgfSgpKTtcblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9fY29yZV9wcml2YXRlX18gPSB7XG4gICAgICAgIGlzRGVmYXVsdENoYW5nZURldGVjdGlvblN0cmF0ZWd5OiBpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICAgICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXM6IENoYW5nZURldGVjdG9yU3RhdHVzLFxuICAgICAgICBjb25zdHJ1Y3REZXBlbmRlbmNpZXM6IGNvbnN0cnVjdERlcGVuZGVuY2llcyxcbiAgICAgICAgTGlmZWN5Y2xlSG9va3M6IExpZmVjeWNsZUhvb2tzLFxuICAgICAgICBMSUZFQ1lDTEVfSE9PS1NfVkFMVUVTOiBMSUZFQ1lDTEVfSE9PS1NfVkFMVUVTLFxuICAgICAgICBSZWZsZWN0b3JSZWFkZXI6IFJlZmxlY3RvclJlYWRlcixcbiAgICAgICAgQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgQ29tcG9uZW50UmVmXzogQ29tcG9uZW50UmVmXyxcbiAgICAgICAgVmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lcixcbiAgICAgICAgQXBwVmlldzogQXBwVmlldyxcbiAgICAgICAgRGVidWdBcHBWaWV3OiBEZWJ1Z0FwcFZpZXcsXG4gICAgICAgIE5nTW9kdWxlSW5qZWN0b3I6IE5nTW9kdWxlSW5qZWN0b3IsXG4gICAgICAgIHJlZ2lzdGVyTW9kdWxlRmFjdG9yeTogcmVnaXN0ZXJNb2R1bGVGYWN0b3J5LFxuICAgICAgICBWaWV3VHlwZTogVmlld1R5cGUsXG4gICAgICAgIHZpZXdfdXRpbHM6IHZpZXdfdXRpbHMsXG4gICAgICAgIFZpZXdNZXRhZGF0YTogVmlld01ldGFkYXRhLFxuICAgICAgICBEZWJ1Z0NvbnRleHQ6IERlYnVnQ29udGV4dCxcbiAgICAgICAgU3RhdGljTm9kZURlYnVnSW5mbzogU3RhdGljTm9kZURlYnVnSW5mbyxcbiAgICAgICAgZGV2TW9kZUVxdWFsOiBkZXZNb2RlRXF1YWwsXG4gICAgICAgIFVOSU5JVElBTElaRUQ6IFVOSU5JVElBTElaRUQsXG4gICAgICAgIFZhbHVlVW53cmFwcGVyOiBWYWx1ZVVud3JhcHBlcixcbiAgICAgICAgUmVuZGVyRGVidWdJbmZvOiBSZW5kZXJEZWJ1Z0luZm8sXG4gICAgICAgIFRlbXBsYXRlUmVmXzogVGVtcGxhdGVSZWZfLFxuICAgICAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOiBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLFxuICAgICAgICBtYWtlRGVjb3JhdG9yOiBtYWtlRGVjb3JhdG9yLFxuICAgICAgICBEZWJ1Z0RvbVJvb3RSZW5kZXJlcjogRGVidWdEb21Sb290UmVuZGVyZXIsXG4gICAgICAgIENvbnNvbGU6IENvbnNvbGUsXG4gICAgICAgIHJlZmxlY3RvcjogcmVmbGVjdG9yLFxuICAgICAgICBSZWZsZWN0b3I6IFJlZmxlY3RvcixcbiAgICAgICAgTm9PcEFuaW1hdGlvblBsYXllcjogTm9PcEFuaW1hdGlvblBsYXllcixcbiAgICAgICAgQW5pbWF0aW9uUGxheWVyOiBBbmltYXRpb25QbGF5ZXIsXG4gICAgICAgIEFuaW1hdGlvblNlcXVlbmNlUGxheWVyOiBBbmltYXRpb25TZXF1ZW5jZVBsYXllcixcbiAgICAgICAgQW5pbWF0aW9uR3JvdXBQbGF5ZXI6IEFuaW1hdGlvbkdyb3VwUGxheWVyLFxuICAgICAgICBBbmltYXRpb25LZXlmcmFtZTogQW5pbWF0aW9uS2V5ZnJhbWUsXG4gICAgICAgIHByZXBhcmVGaW5hbEFuaW1hdGlvblN0eWxlczogcHJlcGFyZUZpbmFsQW5pbWF0aW9uU3R5bGVzLFxuICAgICAgICBiYWxhbmNlQW5pbWF0aW9uS2V5ZnJhbWVzOiBiYWxhbmNlQW5pbWF0aW9uS2V5ZnJhbWVzLFxuICAgICAgICBmbGF0dGVuU3R5bGVzOiBmbGF0dGVuU3R5bGVzLFxuICAgICAgICBjbGVhclN0eWxlczogY2xlYXJTdHlsZXMsXG4gICAgICAgIHJlbmRlclN0eWxlczogcmVuZGVyU3R5bGVzLFxuICAgICAgICBjb2xsZWN0QW5kUmVzb2x2ZVN0eWxlczogY29sbGVjdEFuZFJlc29sdmVTdHlsZXMsXG4gICAgICAgIEFQUF9JRF9SQU5ET01fUFJPVklERVI6IEFQUF9JRF9SQU5ET01fUFJPVklERVIsXG4gICAgICAgIEFuaW1hdGlvblN0eWxlczogQW5pbWF0aW9uU3R5bGVzLFxuICAgICAgICBBTllfU1RBVEU6IEFOWV9TVEFURSxcbiAgICAgICAgREVGQVVMVF9TVEFURTogREVGQVVMVF9TVEFURSxcbiAgICAgICAgRU1QVFlfU1RBVEU6IEVNUFRZX1NUQVRFLFxuICAgICAgICBGSUxMX1NUWUxFX0ZMQUc6IEZJTExfU1RZTEVfRkxBRyxcbiAgICAgICAgQ29tcG9uZW50U3RpbGxMb2FkaW5nRXJyb3I6IENvbXBvbmVudFN0aWxsTG9hZGluZ0Vycm9yLFxuICAgICAgICBpc1Byb21pc2U6IGlzUHJvbWlzZSxcbiAgICAgICAgQW5pbWF0aW9uVHJhbnNpdGlvbjogQW5pbWF0aW9uVHJhbnNpdGlvblxuICAgIH07XG5cbiAgICBleHBvcnRzLmNyZWF0ZVBsYXRmb3JtID0gY3JlYXRlUGxhdGZvcm07XG4gICAgZXhwb3J0cy5hc3NlcnRQbGF0Zm9ybSA9IGFzc2VydFBsYXRmb3JtO1xuICAgIGV4cG9ydHMuZGVzdHJveVBsYXRmb3JtID0gZGVzdHJveVBsYXRmb3JtO1xuICAgIGV4cG9ydHMuZ2V0UGxhdGZvcm0gPSBnZXRQbGF0Zm9ybTtcbiAgICBleHBvcnRzLlBsYXRmb3JtUmVmID0gUGxhdGZvcm1SZWY7XG4gICAgZXhwb3J0cy5BcHBsaWNhdGlvblJlZiA9IEFwcGxpY2F0aW9uUmVmO1xuICAgIGV4cG9ydHMuZW5hYmxlUHJvZE1vZGUgPSBlbmFibGVQcm9kTW9kZTtcbiAgICBleHBvcnRzLmlzRGV2TW9kZSA9IGlzRGV2TW9kZTtcbiAgICBleHBvcnRzLmNyZWF0ZVBsYXRmb3JtRmFjdG9yeSA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeTtcbiAgICBleHBvcnRzLk5nUHJvYmVUb2tlbiA9IE5nUHJvYmVUb2tlbjtcbiAgICBleHBvcnRzLkFQUF9JRCA9IEFQUF9JRDtcbiAgICBleHBvcnRzLlBBQ0tBR0VfUk9PVF9VUkwgPSBQQUNLQUdFX1JPT1RfVVJMO1xuICAgIGV4cG9ydHMuUExBVEZPUk1fSU5JVElBTElaRVIgPSBQTEFURk9STV9JTklUSUFMSVpFUjtcbiAgICBleHBvcnRzLkFQUF9CT09UU1RSQVBfTElTVEVORVIgPSBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSO1xuICAgIGV4cG9ydHMuQVBQX0lOSVRJQUxJWkVSID0gQVBQX0lOSVRJQUxJWkVSO1xuICAgIGV4cG9ydHMuQXBwbGljYXRpb25Jbml0U3RhdHVzID0gQXBwbGljYXRpb25Jbml0U3RhdHVzO1xuICAgIGV4cG9ydHMuRGVidWdFbGVtZW50ID0gRGVidWdFbGVtZW50O1xuICAgIGV4cG9ydHMuRGVidWdOb2RlID0gRGVidWdOb2RlO1xuICAgIGV4cG9ydHMuYXNOYXRpdmVFbGVtZW50cyA9IGFzTmF0aXZlRWxlbWVudHM7XG4gICAgZXhwb3J0cy5nZXREZWJ1Z05vZGUgPSBnZXREZWJ1Z05vZGU7XG4gICAgZXhwb3J0cy5UZXN0YWJpbGl0eSA9IFRlc3RhYmlsaXR5O1xuICAgIGV4cG9ydHMuVGVzdGFiaWxpdHlSZWdpc3RyeSA9IFRlc3RhYmlsaXR5UmVnaXN0cnk7XG4gICAgZXhwb3J0cy5zZXRUZXN0YWJpbGl0eUdldHRlciA9IHNldFRlc3RhYmlsaXR5R2V0dGVyO1xuICAgIGV4cG9ydHMuVFJBTlNMQVRJT05TID0gVFJBTlNMQVRJT05TO1xuICAgIGV4cG9ydHMuVFJBTlNMQVRJT05TX0ZPUk1BVCA9IFRSQU5TTEFUSU9OU19GT1JNQVQ7XG4gICAgZXhwb3J0cy5MT0NBTEVfSUQgPSBMT0NBTEVfSUQ7XG4gICAgZXhwb3J0cy5BcHBsaWNhdGlvbk1vZHVsZSA9IEFwcGxpY2F0aW9uTW9kdWxlO1xuICAgIGV4cG9ydHMud3RmQ3JlYXRlU2NvcGUgPSB3dGZDcmVhdGVTY29wZTtcbiAgICBleHBvcnRzLnd0ZkxlYXZlID0gd3RmTGVhdmU7XG4gICAgZXhwb3J0cy53dGZTdGFydFRpbWVSYW5nZSA9IHd0ZlN0YXJ0VGltZVJhbmdlO1xuICAgIGV4cG9ydHMud3RmRW5kVGltZVJhbmdlID0gd3RmRW5kVGltZVJhbmdlO1xuICAgIGV4cG9ydHMuVHlwZSA9IFR5cGU7XG4gICAgZXhwb3J0cy5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG4gICAgZXhwb3J0cy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG4gICAgZXhwb3J0cy5BbmltYXRpb25UcmFuc2l0aW9uRXZlbnQgPSBBbmltYXRpb25UcmFuc2l0aW9uRXZlbnQ7XG4gICAgZXhwb3J0cy5BbmltYXRpb25QbGF5ZXIgPSBBbmltYXRpb25QbGF5ZXI7XG4gICAgZXhwb3J0cy5TYW5pdGl6ZXIgPSBTYW5pdGl6ZXI7XG4gICAgZXhwb3J0cy5TZWN1cml0eUNvbnRleHQgPSBTZWN1cml0eUNvbnRleHQ7XG4gICAgZXhwb3J0cy5BTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0gQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUztcbiAgICBleHBvcnRzLkF0dHJpYnV0ZSA9IEF0dHJpYnV0ZTtcbiAgICBleHBvcnRzLkNvbnRlbnRDaGlsZCA9IENvbnRlbnRDaGlsZDtcbiAgICBleHBvcnRzLkNvbnRlbnRDaGlsZHJlbiA9IENvbnRlbnRDaGlsZHJlbjtcbiAgICBleHBvcnRzLlF1ZXJ5ID0gUXVlcnk7XG4gICAgZXhwb3J0cy5WaWV3Q2hpbGQgPSBWaWV3Q2hpbGQ7XG4gICAgZXhwb3J0cy5WaWV3Q2hpbGRyZW4gPSBWaWV3Q2hpbGRyZW47XG4gICAgZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG4gICAgZXhwb3J0cy5EaXJlY3RpdmUgPSBEaXJlY3RpdmU7XG4gICAgZXhwb3J0cy5Ib3N0QmluZGluZyA9IEhvc3RCaW5kaW5nO1xuICAgIGV4cG9ydHMuSG9zdExpc3RlbmVyID0gSG9zdExpc3RlbmVyO1xuICAgIGV4cG9ydHMuSW5wdXQgPSBJbnB1dDtcbiAgICBleHBvcnRzLk91dHB1dCA9IE91dHB1dDtcbiAgICBleHBvcnRzLlBpcGUgPSBQaXBlO1xuICAgIGV4cG9ydHMuQWZ0ZXJDb250ZW50Q2hlY2tlZCA9IEFmdGVyQ29udGVudENoZWNrZWQ7XG4gICAgZXhwb3J0cy5BZnRlckNvbnRlbnRJbml0ID0gQWZ0ZXJDb250ZW50SW5pdDtcbiAgICBleHBvcnRzLkFmdGVyVmlld0NoZWNrZWQgPSBBZnRlclZpZXdDaGVja2VkO1xuICAgIGV4cG9ydHMuQWZ0ZXJWaWV3SW5pdCA9IEFmdGVyVmlld0luaXQ7XG4gICAgZXhwb3J0cy5Eb0NoZWNrID0gRG9DaGVjaztcbiAgICBleHBvcnRzLk9uQ2hhbmdlcyA9IE9uQ2hhbmdlcztcbiAgICBleHBvcnRzLk9uRGVzdHJveSA9IE9uRGVzdHJveTtcbiAgICBleHBvcnRzLk9uSW5pdCA9IE9uSW5pdDtcbiAgICBleHBvcnRzLkNVU1RPTV9FTEVNRU5UU19TQ0hFTUEgPSBDVVNUT01fRUxFTUVOVFNfU0NIRU1BO1xuICAgIGV4cG9ydHMuTk9fRVJST1JTX1NDSEVNQSA9IE5PX0VSUk9SU19TQ0hFTUE7XG4gICAgZXhwb3J0cy5OZ01vZHVsZSA9IE5nTW9kdWxlO1xuICAgIGV4cG9ydHMuVmlld0VuY2Fwc3VsYXRpb24gPSBWaWV3RW5jYXBzdWxhdGlvbjtcbiAgICBleHBvcnRzLlZlcnNpb24gPSBWZXJzaW9uO1xuICAgIGV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG4gICAgZXhwb3J0cy5DbGFzcyA9IENsYXNzO1xuICAgIGV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG4gICAgZXhwb3J0cy5yZXNvbHZlRm9yd2FyZFJlZiA9IHJlc29sdmVGb3J3YXJkUmVmO1xuICAgIGV4cG9ydHMuSW5qZWN0b3IgPSBJbmplY3RvcjtcbiAgICBleHBvcnRzLlJlZmxlY3RpdmVJbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3RvcjtcbiAgICBleHBvcnRzLlJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkgPSBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5O1xuICAgIGV4cG9ydHMuUmVmbGVjdGl2ZUtleSA9IFJlZmxlY3RpdmVLZXk7XG4gICAgZXhwb3J0cy5PcGFxdWVUb2tlbiA9IE9wYXF1ZVRva2VuO1xuICAgIGV4cG9ydHMuSW5qZWN0ID0gSW5qZWN0O1xuICAgIGV4cG9ydHMuT3B0aW9uYWwgPSBPcHRpb25hbDtcbiAgICBleHBvcnRzLkluamVjdGFibGUgPSBJbmplY3RhYmxlO1xuICAgIGV4cG9ydHMuU2VsZiA9IFNlbGY7XG4gICAgZXhwb3J0cy5Ta2lwU2VsZiA9IFNraXBTZWxmO1xuICAgIGV4cG9ydHMuSG9zdCA9IEhvc3Q7XG4gICAgZXhwb3J0cy5OZ1pvbmUgPSBOZ1pvbmU7XG4gICAgZXhwb3J0cy5SZW5kZXJDb21wb25lbnRUeXBlID0gUmVuZGVyQ29tcG9uZW50VHlwZTtcbiAgICBleHBvcnRzLlJlbmRlcmVyID0gUmVuZGVyZXI7XG4gICAgZXhwb3J0cy5Sb290UmVuZGVyZXIgPSBSb290UmVuZGVyZXI7XG4gICAgZXhwb3J0cy5DT01QSUxFUl9PUFRJT05TID0gQ09NUElMRVJfT1BUSU9OUztcbiAgICBleHBvcnRzLkNvbXBpbGVyID0gQ29tcGlsZXI7XG4gICAgZXhwb3J0cy5Db21waWxlckZhY3RvcnkgPSBDb21waWxlckZhY3Rvcnk7XG4gICAgZXhwb3J0cy5Nb2R1bGVXaXRoQ29tcG9uZW50RmFjdG9yaWVzID0gTW9kdWxlV2l0aENvbXBvbmVudEZhY3RvcmllcztcbiAgICBleHBvcnRzLkNvbXBvbmVudEZhY3RvcnkgPSBDb21wb25lbnRGYWN0b3J5O1xuICAgIGV4cG9ydHMuQ29tcG9uZW50UmVmID0gQ29tcG9uZW50UmVmO1xuICAgIGV4cG9ydHMuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xuICAgIGV4cG9ydHMuRWxlbWVudFJlZiA9IEVsZW1lbnRSZWY7XG4gICAgZXhwb3J0cy5OZ01vZHVsZUZhY3RvcnkgPSBOZ01vZHVsZUZhY3Rvcnk7XG4gICAgZXhwb3J0cy5OZ01vZHVsZVJlZiA9IE5nTW9kdWxlUmVmO1xuICAgIGV4cG9ydHMuTmdNb2R1bGVGYWN0b3J5TG9hZGVyID0gTmdNb2R1bGVGYWN0b3J5TG9hZGVyO1xuICAgIGV4cG9ydHMuZ2V0TW9kdWxlRmFjdG9yeSA9IGdldE1vZHVsZUZhY3Rvcnk7XG4gICAgZXhwb3J0cy5RdWVyeUxpc3QgPSBRdWVyeUxpc3Q7XG4gICAgZXhwb3J0cy5TeXN0ZW1Kc05nTW9kdWxlTG9hZGVyID0gU3lzdGVtSnNOZ01vZHVsZUxvYWRlcjtcbiAgICBleHBvcnRzLlN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcgPSBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnO1xuICAgIGV4cG9ydHMuVGVtcGxhdGVSZWYgPSBUZW1wbGF0ZVJlZjtcbiAgICBleHBvcnRzLlZpZXdDb250YWluZXJSZWYgPSBWaWV3Q29udGFpbmVyUmVmO1xuICAgIGV4cG9ydHMuRW1iZWRkZWRWaWV3UmVmID0gRW1iZWRkZWRWaWV3UmVmO1xuICAgIGV4cG9ydHMuVmlld1JlZiA9IFZpZXdSZWY7XG4gICAgZXhwb3J0cy5DaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5O1xuICAgIGV4cG9ydHMuQ2hhbmdlRGV0ZWN0b3JSZWYgPSBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgICBleHBvcnRzLkNvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIGV4cG9ydHMuRGVmYXVsdEl0ZXJhYmxlRGlmZmVyID0gRGVmYXVsdEl0ZXJhYmxlRGlmZmVyO1xuICAgIGV4cG9ydHMuSXRlcmFibGVEaWZmZXJzID0gSXRlcmFibGVEaWZmZXJzO1xuICAgIGV4cG9ydHMuS2V5VmFsdWVDaGFuZ2VSZWNvcmQgPSBLZXlWYWx1ZUNoYW5nZVJlY29yZDtcbiAgICBleHBvcnRzLktleVZhbHVlRGlmZmVycyA9IEtleVZhbHVlRGlmZmVycztcbiAgICBleHBvcnRzLlNpbXBsZUNoYW5nZSA9IFNpbXBsZUNoYW5nZTtcbiAgICBleHBvcnRzLldyYXBwZWRWYWx1ZSA9IFdyYXBwZWRWYWx1ZTtcbiAgICBleHBvcnRzLnBsYXRmb3JtQ29yZSA9IHBsYXRmb3JtQ29yZTtcbiAgICBleHBvcnRzLl9fY29yZV9wcml2YXRlX18gPSBfX2NvcmVfcHJpdmF0ZV9fO1xuICAgIGV4cG9ydHMuQVVUT19TVFlMRSA9IEFVVE9fU1RZTEU7XG4gICAgZXhwb3J0cy5BbmltYXRpb25FbnRyeU1ldGFkYXRhID0gQW5pbWF0aW9uRW50cnlNZXRhZGF0YTtcbiAgICBleHBvcnRzLkFuaW1hdGlvblN0YXRlTWV0YWRhdGEgPSBBbmltYXRpb25TdGF0ZU1ldGFkYXRhO1xuICAgIGV4cG9ydHMuQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbk1ldGFkYXRhID0gQW5pbWF0aW9uU3RhdGVEZWNsYXJhdGlvbk1ldGFkYXRhO1xuICAgIGV4cG9ydHMuQW5pbWF0aW9uU3RhdGVUcmFuc2l0aW9uTWV0YWRhdGEgPSBBbmltYXRpb25TdGF0ZVRyYW5zaXRpb25NZXRhZGF0YTtcbiAgICBleHBvcnRzLkFuaW1hdGlvbk1ldGFkYXRhID0gQW5pbWF0aW9uTWV0YWRhdGE7XG4gICAgZXhwb3J0cy5BbmltYXRpb25LZXlmcmFtZXNTZXF1ZW5jZU1ldGFkYXRhID0gQW5pbWF0aW9uS2V5ZnJhbWVzU2VxdWVuY2VNZXRhZGF0YTtcbiAgICBleHBvcnRzLkFuaW1hdGlvblN0eWxlTWV0YWRhdGEgPSBBbmltYXRpb25TdHlsZU1ldGFkYXRhO1xuICAgIGV4cG9ydHMuQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhID0gQW5pbWF0aW9uQW5pbWF0ZU1ldGFkYXRhO1xuICAgIGV4cG9ydHMuQW5pbWF0aW9uV2l0aFN0ZXBzTWV0YWRhdGEgPSBBbmltYXRpb25XaXRoU3RlcHNNZXRhZGF0YTtcbiAgICBleHBvcnRzLkFuaW1hdGlvblNlcXVlbmNlTWV0YWRhdGEgPSBBbmltYXRpb25TZXF1ZW5jZU1ldGFkYXRhO1xuICAgIGV4cG9ydHMuQW5pbWF0aW9uR3JvdXBNZXRhZGF0YSA9IEFuaW1hdGlvbkdyb3VwTWV0YWRhdGE7XG4gICAgZXhwb3J0cy5hbmltYXRlID0gYW5pbWF0ZTtcbiAgICBleHBvcnRzLmdyb3VwID0gZ3JvdXA7XG4gICAgZXhwb3J0cy5zZXF1ZW5jZSA9IHNlcXVlbmNlO1xuICAgIGV4cG9ydHMuc3R5bGUgPSBzdHlsZTtcbiAgICBleHBvcnRzLnN0YXRlID0gc3RhdGU7XG4gICAgZXhwb3J0cy5rZXlmcmFtZXMgPSBrZXlmcmFtZXM7XG4gICAgZXhwb3J0cy50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcbiAgICBleHBvcnRzLnRyaWdnZXIgPSB0cmlnZ2VyO1xuXG59KSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L0Bhbmd1bGFyL2NvcmUvYnVuZGxlcy9jb3JlLnVtZC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  18. /***/ },
  19. /* 5 */
  20. /***/ function(module, exports, __webpack_require__) {
  21. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar Subscriber_1 = __webpack_require__(9);\nvar Subscription_1 = __webpack_require__(11);\nvar ObjectUnsubscribedError_1 = __webpack_require__(20);\nvar SubjectSubscription_1 = __webpack_require__(21);\nvar rxSubscriber_1 = __webpack_require__(18);\n/**\n * @class SubjectSubscriber<T>\n */\nvar SubjectSubscriber = (function (_super) {\n __extends(SubjectSubscriber, _super);\n function SubjectSubscriber(destination) {\n _super.call(this, destination);\n this.destination = destination;\n }\n return SubjectSubscriber;\n}(Subscriber_1.Subscriber));\nexports.SubjectSubscriber = SubjectSubscriber;\n/**\n * @class Subject<T>\n */\nvar Subject = (function (_super) {\n __extends(Subject, _super);\n function Subject() {\n _super.call(this);\n this.observers = [];\n this.closed = false;\n this.isStopped = false;\n this.hasError = false;\n this.thrownError = null;\n }\n Subject.prototype[rxSubscriber_1.$$rxSubscriber] = function () {\n return new SubjectSubscriber(this);\n };\n Subject.prototype.lift = function (operator) {\n var subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n };\n Subject.prototype.next = function (value) {\n if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n if (!this.isStopped) {\n var observers = this.observers;\n var len = observers.length;\n var copy = observers.slice();\n for (var i = 0; i < len; i++) {\n copy[i].next(value);\n }\n }\n };\n Subject.prototype.error = function (err) {\n if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n this.hasError = true;\n this.thrownError = err;\n this.isStopped = true;\n var observers = this.observers;\n var len = observers.length;\n var copy = observers.slice();\n for (var i = 0; i < len; i++) {\n copy[i].error(err);\n }\n this.observers.length = 0;\n };\n Subject.prototype.complete = function () {\n if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n this.isStopped = true;\n var observers = this.observers;\n var len = observers.length;\n var copy = observers.slice();\n for (var i = 0; i < len; i++) {\n copy[i].complete();\n }\n this.observers.length = 0;\n };\n Subject.prototype.unsubscribe = function () {\n this.isStopped = true;\n this.closed = true;\n this.observers = null;\n };\n Subject.prototype._subscribe = function (subscriber) {\n if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n else if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription_1.Subscription.EMPTY;\n }\n else if (this.isStopped) {\n subscriber.complete();\n return Subscription_1.Subscription.EMPTY;\n }\n else {\n this.observers.push(subscriber);\n return new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n }\n };\n Subject.prototype.asObservable = function () {\n var observable = new Observable_1.Observable();\n observable.source = this;\n return observable;\n };\n Subject.create = function (destination, source) {\n return new AnonymousSubject(destination, source);\n };\n return Subject;\n}(Observable_1.Observable));\nexports.Subject = Subject;\n/**\n * @class AnonymousSubject<T>\n */\nvar AnonymousSubject = (function (_super) {\n __extends(AnonymousSubject, _super);\n function AnonymousSubject(destination, source) {\n _super.call(this);\n this.destination = destination;\n this.source = source;\n }\n AnonymousSubject.prototype.next = function (value) {\n var destination = this.destination;\n if (destination && destination.next) {\n destination.next(value);\n }\n };\n AnonymousSubject.prototype.error = function (err) {\n var destination = this.destination;\n if (destination && destination.error) {\n this.destination.error(err);\n }\n };\n AnonymousSubject.prototype.complete = function () {\n var destination = this.destination;\n if (destination && destination.complete) {\n this.destination.complete();\n }\n };\n AnonymousSubject.prototype._subscribe = function (subscriber) {\n var source = this.source;\n if (source) {\n return this.source.subscribe(subscriber);\n }\n else {\n return Subscription_1.Subscription.EMPTY;\n }\n };\n return AnonymousSubject;\n}(Subject));\nexports.AnonymousSubject = AnonymousSubject;\n//# sourceMappingURL=Subject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vcnhqcy9TdWJqZWN0LmpzP2MxYzYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL09ic2VydmFibGUnKTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuL1N1YnNjcmliZXInKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4vU3Vic2NyaXB0aW9uJyk7XG52YXIgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JfMSA9IHJlcXVpcmUoJy4vdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvcicpO1xudmFyIFN1YmplY3RTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4vU3ViamVjdFN1YnNjcmlwdGlvbicpO1xudmFyIHJ4U3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi9zeW1ib2wvcnhTdWJzY3JpYmVyJyk7XG4vKipcbiAqIEBjbGFzcyBTdWJqZWN0U3Vic2NyaWJlcjxUPlxuICovXG52YXIgU3ViamVjdFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTdWJqZWN0U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJqZWN0U3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIFN1YmplY3RTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5TdWJqZWN0U3Vic2NyaWJlciA9IFN1YmplY3RTdWJzY3JpYmVyO1xuLyoqXG4gKiBAY2xhc3MgU3ViamVjdDxUPlxuICovXG52YXIgU3ViamVjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3ViamVjdCgpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aHJvd25FcnJvciA9IG51bGw7XG4gICAgfVxuICAgIFN1YmplY3QucHJvdG90eXBlW3J4U3Vic2NyaWJlcl8xLiQkcnhTdWJzY3JpYmVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdWJqZWN0U3Vic2NyaWJlcih0aGlzKTtcbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAob3BlcmF0b3IpIHtcbiAgICAgICAgdmFyIHN1YmplY3QgPSBuZXcgQW5vbnltb3VzU3ViamVjdCh0aGlzLCB0aGlzKTtcbiAgICAgICAgc3ViamVjdC5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JfMS5PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgICAgIHZhciBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb3B5W2ldLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JfMS5PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLnRocm93bkVycm9yID0gZXJyO1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgdmFyIGxlbiA9IG9ic2VydmVycy5sZW5ndGg7XG4gICAgICAgIHZhciBjb3B5ID0gb2JzZXJ2ZXJzLnNsaWNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvcHlbaV0uZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yXzEuT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgdmFyIGxlbiA9IG9ic2VydmVycy5sZW5ndGg7XG4gICAgICAgIHZhciBjb3B5ID0gb2JzZXJ2ZXJzLnNsaWNlKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvcHlbaV0uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9ic2VydmVycy5sZW5ndGggPSAwO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9ic2VydmVycyA9IG51bGw7XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JfMS5PYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaGFzRXJyb3IpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhpcy50aHJvd25FcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbl8xLlN1YmplY3RTdWJzY3JpcHRpb24odGhpcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLmFzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoKTtcbiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzO1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgICB9O1xuICAgIFN1YmplY3QuY3JlYXRlID0gZnVuY3Rpb24gKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpO1xuICAgIH07XG4gICAgcmV0dXJuIFN1YmplY3Q7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLlN1YmplY3QgPSBTdWJqZWN0O1xuLyoqXG4gKiBAY2xhc3MgQW5vbnltb3VzU3ViamVjdDxUPlxuICovXG52YXIgQW5vbnltb3VzU3ViamVjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQW5vbnltb3VzU3ViamVjdChkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBBbm9ueW1vdXNTdWJqZWN0LnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5uZXh0KSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBbm9ueW1vdXNTdWJqZWN0LnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFub255bW91c1N1YmplY3QucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQW5vbnltb3VzU3ViamVjdDtcbn0oU3ViamVjdCkpO1xuZXhwb3J0cy5Bbm9ueW1vdXNTdWJqZWN0ID0gQW5vbnltb3VzU3ViamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvU3ViamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  22. /***/ },
  23. /* 6 */
  24. /***/ function(module, exports, __webpack_require__) {
  25. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar toSubscriber_1 = __webpack_require__(8);\nvar observable_1 = __webpack_require__(19);\n/**\n * A representation of any set of values over any amount of time. This the most basic building block\n * of RxJS.\n *\n * @class Observable<T>\n */\nvar Observable = (function () {\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n function Observable(subscribe) {\n this._isScalar = false;\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n /**\n * Creates a new Observable, with this Observable as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param {Operator} operator the operator defining the operation to take on the observable\n * @return {Observable} a new observable with the Operator applied\n */\n Observable.prototype.lift = function (operator) {\n var observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n };\n Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n var operator = this.operator;\n var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);\n if (operator) {\n operator.call(sink, this.source);\n }\n else {\n sink.add(this._subscribe(sink));\n }\n if (sink.syncErrorThrowable) {\n sink.syncErrorThrowable = false;\n if (sink.syncErrorThrown) {\n throw sink.syncErrorValue;\n }\n }\n return sink;\n };\n /**\n * @method forEach\n * @param {Function} next a handler for each value emitted by the observable\n * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise\n * @return {Promise} a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n Observable.prototype.forEach = function (next, PromiseCtor) {\n var _this = this;\n if (!PromiseCtor) {\n if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n PromiseCtor = root_1.root.Rx.config.Promise;\n }\n else if (root_1.root.Promise) {\n PromiseCtor = root_1.root.Promise;\n }\n }\n if (!PromiseCtor) {\n throw new Error('no Promise impl found');\n }\n return new PromiseCtor(function (resolve, reject) {\n var subscription = _this.subscribe(function (value) {\n if (subscription) {\n // if there is a subscription, then we can surmise\n // the next handling is asynchronous. Any errors thrown\n // need to be rejected explicitly and unsubscribe must be\n // called manually\n try {\n next(value);\n }\n catch (err) {\n reject(err);\n subscription.unsubscribe();\n }\n }\n else {\n // if there is NO subscription, then we're getting a nexted\n // value synchronously during subscription. We can just call it.\n // If it errors, Observable's `subscribe` will ensure the\n // unsubscription logic is called, then synchronously rethrow the error.\n // After that, Promise will trap the error and send it\n // down the rejection path.\n next(value);\n }\n }, reject, resolve);\n });\n };\n Observable.prototype._subscribe = function (subscriber) {\n return this.source.subscribe(subscriber);\n };\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n Observable.prototype[observable_1.$$observable] = function () {\n return this;\n };\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new cold Observable by calling the Observable constructor\n * @static true\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new cold observable\n */\n Observable.create = function (subscribe) {\n return new Observable(subscribe);\n };\n return Observable;\n}());\nexports.Observable = Observable;\n//# sourceMappingURL=Observable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vcnhqcy9PYnNlcnZhYmxlLmpzPzRlMDYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi91dGlsL3Jvb3QnKTtcbnZhciB0b1N1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4vdXRpbC90b1N1YnNjcmliZXInKTtcbnZhciBvYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL3N5bWJvbC9vYnNlcnZhYmxlJyk7XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW55IHNldCBvZiB2YWx1ZXMgb3ZlciBhbnkgYW1vdW50IG9mIHRpbWUuIFRoaXMgdGhlIG1vc3QgYmFzaWMgYnVpbGRpbmcgYmxvY2tcbiAqIG9mIFJ4SlMuXG4gKlxuICogQGNsYXNzIE9ic2VydmFibGU8VD5cbiAqL1xudmFyIE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YnNjcmliZSB0aGUgZnVuY3Rpb24gdGhhdCBpcyAgY2FsbGVkIHdoZW4gdGhlIE9ic2VydmFibGUgaXNcbiAgICAgKiBpbml0aWFsbHkgc3Vic2NyaWJlZCB0by4gVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiBhIFN1YnNjcmliZXIsIHRvIHdoaWNoIG5ldyB2YWx1ZXNcbiAgICAgKiBjYW4gYmUgYG5leHRgZWQsIG9yIGFuIGBlcnJvcmAgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gcmFpc2UgYW4gZXJyb3IsIG9yXG4gICAgICogYGNvbXBsZXRlYCBjYW4gYmUgY2FsbGVkIHRvIG5vdGlmeSBvZiBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBPYnNlcnZhYmxlKHN1YnNjcmliZSkge1xuICAgICAgICB0aGlzLl9pc1NjYWxhciA9IGZhbHNlO1xuICAgICAgICBpZiAoc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPYnNlcnZhYmxlLCB3aXRoIHRoaXMgT2JzZXJ2YWJsZSBhcyB0aGUgc291cmNlLCBhbmQgdGhlIHBhc3NlZFxuICAgICAqIG9wZXJhdG9yIGRlZmluZWQgYXMgdGhlIG5ldyBvYnNlcnZhYmxlJ3Mgb3BlcmF0b3IuXG4gICAgICogQG1ldGhvZCBsaWZ0XG4gICAgICogQHBhcmFtIHtPcGVyYXRvcn0gb3BlcmF0b3IgdGhlIG9wZXJhdG9yIGRlZmluaW5nIHRoZSBvcGVyYXRpb24gdG8gdGFrZSBvbiB0aGUgb2JzZXJ2YWJsZVxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGV9IGEgbmV3IG9ic2VydmFibGUgd2l0aCB0aGUgT3BlcmF0b3IgYXBwbGllZFxuICAgICAqL1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAob3BlcmF0b3IpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgICAgICBvYnNlcnZhYmxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgIG9ic2VydmFibGUub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm9wZXJhdG9yO1xuICAgICAgICB2YXIgc2luayA9IHRvU3Vic2NyaWJlcl8xLnRvU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgICAgICAgaWYgKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBvcGVyYXRvci5jYWxsKHNpbmssIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNpbmsuYWRkKHRoaXMuX3N1YnNjcmliZShzaW5rKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpbmsuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICBzaW5rLnN5bmNFcnJvclRocm93YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNpbmsuc3luY0Vycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc2luay5zeW5jRXJyb3JWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2luaztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZm9yRWFjaFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgYSBoYW5kbGVyIGZvciBlYWNoIHZhbHVlIGVtaXR0ZWQgYnkgdGhlIG9ic2VydmFibGVcbiAgICAgKiBAcGFyYW0ge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1Byb21pc2VDdG9yXSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIFByb21pc2VcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBlaXRoZXIgcmVzb2x2ZXMgb24gb2JzZXJ2YWJsZSBjb21wbGV0aW9uIG9yXG4gICAgICogIHJlamVjdHMgd2l0aCB0aGUgaGFuZGxlZCBlcnJvclxuICAgICAqL1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAobmV4dCwgUHJvbWlzZUN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCFQcm9taXNlQ3Rvcikge1xuICAgICAgICAgICAgaWYgKHJvb3RfMS5yb290LlJ4ICYmIHJvb3RfMS5yb290LlJ4LmNvbmZpZyAmJiByb290XzEucm9vdC5SeC5jb25maWcuUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIFByb21pc2VDdG9yID0gcm9vdF8xLnJvb3QuUnguY29uZmlnLlByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyb290XzEucm9vdC5Qcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZUN0b3IgPSByb290XzEucm9vdC5Qcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghUHJvbWlzZUN0b3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gUHJvbWlzZSBpbXBsIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ3RvcihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gX3RoaXMuc3Vic2NyaWJlKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzdWJzY3JpcHRpb24sIHRoZW4gd2UgY2FuIHN1cm1pc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgaGFuZGxpbmcgaXMgYXN5bmNocm9ub3VzLiBBbnkgZXJyb3JzIHRocm93blxuICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHJlamVjdGVkIGV4cGxpY2l0bHkgYW5kIHVuc3Vic2NyaWJlIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGVkIG1hbnVhbGx5XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBOTyBzdWJzY3JpcHRpb24sIHRoZW4gd2UncmUgZ2V0dGluZyBhIG5leHRlZFxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzeW5jaHJvbm91c2x5IGR1cmluZyBzdWJzY3JpcHRpb24uIFdlIGNhbiBqdXN0IGNhbGwgaXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGVycm9ycywgT2JzZXJ2YWJsZSdzIGBzdWJzY3JpYmVgIHdpbGwgZW5zdXJlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyB1bnN1YnNjcmlwdGlvbiBsb2dpYyBpcyBjYWxsZWQsIHRoZW4gc3luY2hyb25vdXNseSByZXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgdGhhdCwgUHJvbWlzZSB3aWxsIHRyYXAgdGhlIGVycm9yIGFuZCBzZW5kIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvd24gdGhlIHJlamVjdGlvbiBwYXRoLlxuICAgICAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QsIHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQW4gaW50ZXJvcCBwb2ludCBkZWZpbmVkIGJ5IHRoZSBlczctb2JzZXJ2YWJsZSBzcGVjIGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5wYXJzaW5nL2VzLW9ic2VydmFibGVcbiAgICAgKiBAbWV0aG9kIFN5bWJvbC5vYnNlcnZhYmxlXG4gICAgICogQHJldHVybiB7T2JzZXJ2YWJsZX0gdGhpcyBpbnN0YW5jZSBvZiB0aGUgb2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlW29ic2VydmFibGVfMS4kJG9ic2VydmFibGVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8vIEhBQ0s6IFNpbmNlIFR5cGVTY3JpcHQgaW5oZXJpdHMgc3RhdGljIHByb3BlcnRpZXMgdG9vLCB3ZSBoYXZlIHRvXG4gICAgLy8gZmlnaHQgYWdhaW5zdCBUeXBlU2NyaXB0IGhlcmUgc28gU3ViamVjdCBjYW4gaGF2ZSBhIGRpZmZlcmVudCBzdGF0aWMgY3JlYXRlIHNpZ25hdHVyZVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29sZCBPYnNlcnZhYmxlIGJ5IGNhbGxpbmcgdGhlIE9ic2VydmFibGUgY29uc3RydWN0b3JcbiAgICAgKiBAc3RhdGljIHRydWVcbiAgICAgKiBAb3duZXIgT2JzZXJ2YWJsZVxuICAgICAqIEBtZXRob2QgY3JlYXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3Vic2NyaWJlPyB0aGUgc3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSBwYXNzZWQgdG8gdGhlIE9ic2VydmFibGUgY29uc3RydWN0b3JcbiAgICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhIG5ldyBjb2xkIG9ic2VydmFibGVcbiAgICAgKi9cbiAgICBPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZTtcbn0oKSk7XG5leHBvcnRzLk9ic2VydmFibGUgPSBPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9PYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  26. /***/ },
  27. /* 7 */
  28. /***/ function(module, exports) {
  29. eval("/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n/**\n * window: browser in DOM main thread\n * self: browser in WebWorker\n * global: Node.js/other\n */\nexports.root = (typeof window == 'object' && window.window === window && window\n || typeof self == 'object' && self.self === self && self\n || typeof global == 'object' && global.global === global && global);\nif (!exports.root) {\n throw new Error('RxJS could not find any global context (window, self, global)');\n}\n//# sourceMappingURL=root.js.map\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vcnhqcy91dGlsL3Jvb3QuanM/OTNjMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogd2luZG93OiBicm93c2VyIGluIERPTSBtYWluIHRocmVhZFxuICogc2VsZjogYnJvd3NlciBpbiBXZWJXb3JrZXJcbiAqIGdsb2JhbDogTm9kZS5qcy9vdGhlclxuICovXG5leHBvcnRzLnJvb3QgPSAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cud2luZG93ID09PSB3aW5kb3cgJiYgd2luZG93XG4gICAgfHwgdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmICYmIHNlbGZcbiAgICB8fCB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbC5nbG9iYWwgPT09IGdsb2JhbCAmJiBnbG9iYWwpO1xuaWYgKCFleHBvcnRzLnJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1J4SlMgY291bGQgbm90IGZpbmQgYW55IGdsb2JhbCBjb250ZXh0ICh3aW5kb3csIHNlbGYsIGdsb2JhbCknKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvb3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9yb290LmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  30. /***/ },
  31. /* 8 */
  32. /***/ function(module, exports, __webpack_require__) {
  33. eval("\"use strict\";\nvar Subscriber_1 = __webpack_require__(9);\nvar rxSubscriber_1 = __webpack_require__(18);\nvar Observer_1 = __webpack_require__(17);\nfunction toSubscriber(nextOrObserver, error, complete) {\n if (nextOrObserver) {\n if (nextOrObserver instanceof Subscriber_1.Subscriber) {\n return nextOrObserver;\n }\n if (nextOrObserver[rxSubscriber_1.$$rxSubscriber]) {\n return nextOrObserver[rxSubscriber_1.$$rxSubscriber]();\n }\n }\n if (!nextOrObserver && !error && !complete) {\n return new Subscriber_1.Subscriber(Observer_1.empty);\n }\n return new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n}\nexports.toSubscriber = toSubscriber;\n//# sourceMappingURL=toSubscriber.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vcnhqcy91dGlsL3RvU3Vic2NyaWJlci5qcz9mOGZlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciByeFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9yeFN1YnNjcmliZXInKTtcbnZhciBPYnNlcnZlcl8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2ZXInKTtcbmZ1bmN0aW9uIHRvU3Vic2NyaWJlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgaWYgKG5leHRPck9ic2VydmVyKSB7XG4gICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciBpbnN0YW5jZW9mIFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dE9yT2JzZXJ2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyW3J4U3Vic2NyaWJlcl8xLiQkcnhTdWJzY3JpYmVyXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRPck9ic2VydmVyW3J4U3Vic2NyaWJlcl8xLiQkcnhTdWJzY3JpYmVyXSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghbmV4dE9yT2JzZXJ2ZXIgJiYgIWVycm9yICYmICFjb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKE9ic2VydmVyXzEuZW1wdHkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpO1xufVxuZXhwb3J0cy50b1N1YnNjcmliZXIgPSB0b1N1YnNjcmliZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b1N1YnNjcmliZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC90b1N1YnNjcmliZXIuanNcbi8vIG1vZHVsZSBpZCA9IDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  34. /***/ },
  35. /* 9 */
  36. /***/ function(module, exports, __webpack_require__) {
  37. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isFunction_1 = __webpack_require__(10);\nvar Subscription_1 = __webpack_require__(11);\nvar Observer_1 = __webpack_require__(17);\nvar rxSubscriber_1 = __webpack_require__(18);\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber<T>\n */\nvar Subscriber = (function (_super) {\n __extends(Subscriber, _super);\n /**\n * @param {Observer|function(value: T): void} [destinationOrNext] A partially\n * defined Observer or a `next` callback function.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n */\n function Subscriber(destinationOrNext, error, complete) {\n _super.call(this);\n this.syncErrorValue = null;\n this.syncErrorThrown = false;\n this.syncErrorThrowable = false;\n this.isStopped = false;\n switch (arguments.length) {\n case 0:\n this.destination = Observer_1.empty;\n break;\n case 1:\n if (!destinationOrNext) {\n this.destination = Observer_1.empty;\n break;\n }\n if (typeof destinationOrNext === 'object') {\n if (destinationOrNext instanceof Subscriber) {\n this.destination = destinationOrNext;\n this.destination.add(this);\n }\n else {\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, destinationOrNext);\n }\n break;\n }\n default:\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);\n break;\n }\n }\n Subscriber.prototype[rxSubscriber_1.$$rxSubscriber] = function () { return this; };\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param {function(x: ?T): void} [next] The `next` callback of an Observer.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n */\n Subscriber.create = function (next, error, complete) {\n var subscriber = new Subscriber(next, error, complete);\n subscriber.syncErrorThrowable = false;\n return subscriber;\n };\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n Subscriber.prototype.next = function (value) {\n if (!this.isStopped) {\n this._next(value);\n }\n };\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached {@link Error}. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n Subscriber.prototype.error = function (err) {\n if (!this.isStopped) {\n this.isStopped = true;\n this._error(err);\n }\n };\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n Subscriber.prototype.complete = function () {\n if (!this.isStopped) {\n this.isStopped = true;\n this._complete();\n }\n };\n Subscriber.prototype.unsubscribe = function () {\n if (this.closed) {\n return;\n }\n this.isStopped = true;\n _super.prototype.unsubscribe.call(this);\n };\n Subscriber.prototype._next = function (value) {\n this.destination.next(value);\n };\n Subscriber.prototype._error = function (err) {\n this.destination.error(err);\n this.unsubscribe();\n };\n Subscriber.prototype._complete = function () {\n this.destination.complete();\n this.unsubscribe();\n };\n return Subscriber;\n}(Subscription_1.Subscription));\nexports.Subscriber = Subscriber;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SafeSubscriber = (function (_super) {\n __extends(SafeSubscriber, _super);\n function SafeSubscriber(_parent, observerOrNext, error, complete) {\n _super.call(this);\n this._parent = _parent;\n var next;\n var context = this;\n if (isFunction_1.isFunction(observerOrNext)) {\n next = observerOrNext;\n }\n else if (observerOrNext) {\n context = observerOrNext;\n next = observerOrNext.next;\n error = observerOrNext.error;\n complete = observerOrNext.complete;\n if (isFunction_1.isFunction(context.unsubscribe)) {\n this.add(context.unsubscribe.bind(context));\n }\n context.unsubscribe = this.unsubscribe.bind(this);\n }\n this._context = context;\n this._next = next;\n this._error = error;\n this._complete = complete;\n }\n SafeSubscriber.prototype.next = function (value) {\n if (!this.isStopped && this._next) {\n var _parent = this._parent;\n if (!_parent.syncErrorThrowable) {\n this.__tryOrUnsub(this._next, value);\n }\n else if (this.__tryOrSetError(_parent, this._next, value)) {\n this.unsubscribe();\n }\n }\n };\n SafeSubscriber.prototype.error = function (err) {\n if (!this.isStopped) {\n var _parent = this._parent;\n if (this._error) {\n if (!_parent.syncErrorThrowable) {\n this.__tryOrUnsub(this._error, err);\n this.unsubscribe();\n }\n else {\n this.__tryOrSetError(_parent, this._error, err);\n this.unsubscribe();\n }\n }\n else if (!_parent.syncErrorThrowable) {\n this.unsubscribe();\n throw err;\n }\n else {\n _parent.syncErrorValue = err;\n _parent.syncErrorThrown = true;\n this.unsubscribe();\n }\n }\n };\n SafeSubscriber.prototype.complete = function () {\n if (!this.isStopped) {\n var _parent = this._parent;\n if (this._complete) {\n if (!_parent.syncErrorThrowable) {\n this.__tryOrUnsub(this._complete);\n this.unsubscribe();\n }\n else {\n this.__tryOrSetError(_parent, this._complete);\n this.unsubscribe();\n }\n }\n else {\n this.unsubscribe();\n }\n }\n };\n SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {\n try {\n fn.call(this._context, value);\n }\n catch (err) {\n this.unsubscribe();\n throw err;\n }\n };\n SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {\n try {\n fn.call(this._context, value);\n }\n catch (err) {\n parent.syncErrorValue = err;\n parent.syncErrorThrown = true;\n return true;\n }\n return false;\n };\n SafeSubscriber.prototype._unsubscribe = function () {\n var _parent = this._parent;\n this._context = null;\n this._parent = null;\n _parent.unsubscribe();\n };\n return SafeSubscriber;\n}(Subscriber));\n//# sourceMappingURL=Subscriber.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vcnhqcy9TdWJzY3JpYmVyLmpzPzIxNWUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBpc0Z1bmN0aW9uXzEgPSByZXF1aXJlKCcuL3V0aWwvaXNGdW5jdGlvbicpO1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi9TdWJzY3JpcHRpb24nKTtcbnZhciBPYnNlcnZlcl8xID0gcmVxdWlyZSgnLi9PYnNlcnZlcicpO1xudmFyIHJ4U3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi9zeW1ib2wvcnhTdWJzY3JpYmVyJyk7XG4vKipcbiAqIEltcGxlbWVudHMgdGhlIHtAbGluayBPYnNlcnZlcn0gaW50ZXJmYWNlIGFuZCBleHRlbmRzIHRoZVxuICoge0BsaW5rIFN1YnNjcmlwdGlvbn0gY2xhc3MuIFdoaWxlIHRoZSB7QGxpbmsgT2JzZXJ2ZXJ9IGlzIHRoZSBwdWJsaWMgQVBJIGZvclxuICogY29uc3VtaW5nIHRoZSB2YWx1ZXMgb2YgYW4ge0BsaW5rIE9ic2VydmFibGV9LCBhbGwgT2JzZXJ2ZXJzIGdldCBjb252ZXJ0ZWQgdG9cbiAqIGEgU3Vic2NyaWJlciwgaW4gb3JkZXIgdG8gcHJvdmlkZSBTdWJzY3JpcHRpb24tbGlrZSBjYXBhYmlsaXRpZXMgc3VjaCBhc1xuICogYHVuc3Vic2NyaWJlYC4gU3Vic2NyaWJlciBpcyBhIGNvbW1vbiB0eXBlIGluIFJ4SlMsIGFuZCBjcnVjaWFsIGZvclxuICogaW1wbGVtZW50aW5nIG9wZXJhdG9ycywgYnV0IGl0IGlzIHJhcmVseSB1c2VkIGFzIGEgcHVibGljIEFQSS5cbiAqXG4gKiBAY2xhc3MgU3Vic2NyaWJlcjxUPlxuICovXG52YXIgU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPYnNlcnZlcnxmdW5jdGlvbih2YWx1ZTogVCk6IHZvaWR9IFtkZXN0aW5hdGlvbk9yTmV4dF0gQSBwYXJ0aWFsbHlcbiAgICAgKiBkZWZpbmVkIE9ic2VydmVyIG9yIGEgYG5leHRgIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oZTogP2FueSk6IHZvaWR9IFtlcnJvcl0gVGhlIGBlcnJvcmAgY2FsbGJhY2sgb2YgYW5cbiAgICAgKiBPYnNlcnZlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHZvaWR9IFtjb21wbGV0ZV0gVGhlIGBjb21wbGV0ZWAgY2FsbGJhY2sgb2YgYW5cbiAgICAgKiBPYnNlcnZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdWJzY3JpYmVyKGRlc3RpbmF0aW9uT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc3luY0Vycm9yVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gT2JzZXJ2ZXJfMS5lbXB0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uT3JOZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBPYnNlcnZlcl8xLmVtcHR5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbk9yTmV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uT3JOZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5hZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbmV3IFNhZmVTdWJzY3JpYmVyKHRoaXMsIGRlc3RpbmF0aW9uT3JOZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3dhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbmV3IFNhZmVTdWJzY3JpYmVyKHRoaXMsIGRlc3RpbmF0aW9uT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFN1YnNjcmliZXIucHJvdG90eXBlW3J4U3Vic2NyaWJlcl8xLiQkcnhTdWJzY3JpYmVyXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgLyoqXG4gICAgICogQSBzdGF0aWMgZmFjdG9yeSBmb3IgYSBTdWJzY3JpYmVyLCBnaXZlbiBhIChwb3RlbnRpYWxseSBwYXJ0aWFsKSBkZWZpbml0aW9uXG4gICAgICogb2YgYW4gT2JzZXJ2ZXIuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbih4OiA/VCk6IHZvaWR9IFtuZXh0XSBUaGUgYG5leHRgIGNhbGxiYWNrIG9mIGFuIE9ic2VydmVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oZTogP2FueSk6IHZvaWR9IFtlcnJvcl0gVGhlIGBlcnJvcmAgY2FsbGJhY2sgb2YgYW5cbiAgICAgKiBPYnNlcnZlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHZvaWR9IFtjb21wbGV0ZV0gVGhlIGBjb21wbGV0ZWAgY2FsbGJhY2sgb2YgYW5cbiAgICAgKiBPYnNlcnZlci5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpYmVyPFQ+fSBBIFN1YnNjcmliZXIgd3JhcHBpbmcgdGhlIChwYXJ0aWFsbHkgZGVmaW5lZClcbiAgICAgKiBPYnNlcnZlciByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgICAqL1xuICAgIFN1YnNjcmliZXIuY3JlYXRlID0gZnVuY3Rpb24gKG5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTdWJzY3JpYmVyKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7XG4gICAgICAgIHN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBPYnNlcnZlcn0gY2FsbGJhY2sgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIG9mIHR5cGUgYG5leHRgIGZyb21cbiAgICAgKiB0aGUgT2JzZXJ2YWJsZSwgd2l0aCBhIHZhbHVlLiBUaGUgT2JzZXJ2YWJsZSBtYXkgY2FsbCB0aGlzIG1ldGhvZCAwIG9yIG1vcmVcbiAgICAgKiB0aW1lcy5cbiAgICAgKiBAcGFyYW0ge1R9IFt2YWx1ZV0gVGhlIGBuZXh0YCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgICAqL1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgT2JzZXJ2ZXJ9IGNhbGxiYWNrIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZiB0eXBlIGBlcnJvcmAgZnJvbVxuICAgICAqIHRoZSBPYnNlcnZhYmxlLCB3aXRoIGFuIGF0dGFjaGVkIHtAbGluayBFcnJvcn0uIE5vdGlmaWVzIHRoZSBPYnNlcnZlciB0aGF0XG4gICAgICogdGhlIE9ic2VydmFibGUgaGFzIGV4cGVyaWVuY2VkIGFuIGVycm9yIGNvbmRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge2FueX0gW2Vycl0gVGhlIGBlcnJvcmAgZXhjZXB0aW9uLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoZSB7QGxpbmsgT2JzZXJ2ZXJ9IGNhbGxiYWNrIHRvIHJlY2VpdmUgYSB2YWx1ZWxlc3Mgbm90aWZpY2F0aW9uIG9mIHR5cGVcbiAgICAgKiBgY29tcGxldGVgIGZyb20gdGhlIE9ic2VydmFibGUuIE5vdGlmaWVzIHRoZSBPYnNlcnZlciB0aGF0IHRoZSBPYnNlcnZhYmxlXG4gICAgICogaGFzIGZpbmlzaGVkIHNlbmRpbmcgcHVzaC1iYXNlZCBub3RpZmljYXRpb25zLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBTdWJzY3JpYmVyO1xufShTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24pKTtcbmV4cG9ydHMuU3Vic2NyaWJlciA9IFN1YnNjcmliZXI7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFNhZmVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2FmZVN1YnNjcmliZXIoX3BhcmVudCwgb2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgdmFyIG5leHQ7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgaWYgKGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSkge1xuICAgICAgICAgICAgbmV4dCA9IG9ic2VydmVyT3JOZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9ic2VydmVyT3JOZXh0KSB7XG4gICAgICAgICAgICBjb250ZXh0ID0gb2JzZXJ2ZXJPck5leHQ7XG4gICAgICAgICAgICBuZXh0ID0gb2JzZXJ2ZXJPck5leHQubmV4dDtcbiAgICAgICAgICAgIGVycm9yID0gb2JzZXJ2ZXJPck5leHQuZXJyb3I7XG4gICAgICAgICAgICBjb21wbGV0ZSA9IG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKGNvbnRleHQudW5zdWJzY3JpYmUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoY29udGV4dC51bnN1YnNjcmliZS5iaW5kKGNvbnRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRleHQudW5zdWJzY3JpYmUgPSB0aGlzLnVuc3Vic2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX25leHQgPSBuZXh0O1xuICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLl9jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIH1cbiAgICBTYWZlU3Vic2NyaWJlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkICYmIHRoaXMuX25leHQpIHtcbiAgICAgICAgICAgIHZhciBfcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgICAgICAgaWYgKCFfcGFyZW50LnN5bmNFcnJvclRocm93YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclVuc3ViKHRoaXMuX25leHQsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnQsIHRoaXMuX25leHQsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU2FmZVN1YnNjcmliZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgX3BhcmVudCA9IHRoaXMuX3BhcmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghX3BhcmVudC5zeW5jRXJyb3JUaHJvd2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIodGhpcy5fZXJyb3IsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnQsIHRoaXMuX2Vycm9yLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIV9wYXJlbnQuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF9wYXJlbnQuc3luY0Vycm9yVmFsdWUgPSBlcnI7XG4gICAgICAgICAgICAgICAgX3BhcmVudC5zeW5jRXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU2FmZVN1YnNjcmliZXIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgX3BhcmVudCA9IHRoaXMuX3BhcmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghX3BhcmVudC5zeW5jRXJyb3JUaHJvd2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIodGhpcy5fY29tcGxldGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50LCB0aGlzLl9jb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNhZmVTdWJzY3JpYmVyLnByb3RvdHlwZS5fX3RyeU9yVW5zdWIgPSBmdW5jdGlvbiAoZm4sIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNhZmVTdWJzY3JpYmVyLnByb3RvdHlwZS5fX3RyeU9yU2V0RXJyb3IgPSBmdW5jdGlvbiAocGFyZW50LCBmbiwgdmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpcy5fY29udGV4dCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBhcmVudC5zeW5jRXJyb3JWYWx1ZSA9IGVycjtcbiAgICAgICAgICAgIHBhcmVudC5zeW5jRXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgU2FmZVN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgICBfcGFyZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2FmZVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YnNjcmliZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvU3Vic2NyaWJlci5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  38. /***/ },
  39. /* 10 */
  40. /***/ function(module, exports) {
  41. eval("\"use strict\";\nfunction isFunction(x) {\n return typeof x === 'function';\n}\nexports.isFunction = isFunction;\n//# sourceMappingURL=isFunction.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9pc0Z1bmN0aW9uLmpzPzUxYzAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNGdW5jdGlvbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL2lzRnVuY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  42. /***/ },
  43. /* 11 */
  44. /***/ function(module, exports, __webpack_require__) {
  45. eval("\"use strict\";\nvar isArray_1 = __webpack_require__(12);\nvar isObject_1 = __webpack_require__(13);\nvar isFunction_1 = __webpack_require__(10);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar UnsubscriptionError_1 = __webpack_require__(16);\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nvar Subscription = (function () {\n /**\n * @param {function(): void} [unsubscribe] A function describing how to\n * perform the disposal of resources when the `unsubscribe` method is called.\n */\n function Subscription(unsubscribe) {\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n * @type {boolean}\n */\n this.closed = false;\n if (unsubscribe) {\n this._unsubscribe = unsubscribe;\n }\n }\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n Subscription.prototype.unsubscribe = function () {\n var hasErrors = false;\n var errors;\n if (this.closed) {\n return;\n }\n this.closed = true;\n var _a = this, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;\n this._subscriptions = null;\n if (isFunction_1.isFunction(_unsubscribe)) {\n var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);\n if (trial === errorObject_1.errorObject) {\n hasErrors = true;\n (errors = errors || []).push(errorObject_1.errorObject.e);\n }\n }\n if (isArray_1.isArray(_subscriptions)) {\n var index = -1;\n var len = _subscriptions.length;\n while (++index < len) {\n var sub = _subscriptions[index];\n if (isObject_1.isObject(sub)) {\n var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);\n if (trial === errorObject_1.errorObject) {\n hasErrors = true;\n errors = errors || [];\n var err = errorObject_1.errorObject.e;\n if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {\n errors = errors.concat(err.errors);\n }\n else {\n errors.push(err);\n }\n }\n }\n }\n }\n if (hasErrors) {\n throw new UnsubscriptionError_1.UnsubscriptionError(errors);\n }\n };\n /**\n * Adds a tear down to be called during the unsubscribe() of this\n * Subscription.\n *\n * If the tear down being added is a subscription that is already\n * unsubscribed, is the same reference `add` is being called on, or is\n * `Subscription.EMPTY`, it will not be added.\n *\n * If this subscription is already in an `closed` state, the passed\n * tear down logic will be executed immediately.\n *\n * @param {TeardownLogic} teardown The additional logic to execute on\n * teardown.\n * @return {Subscription} Returns the Subscription used or created to be\n * added to the inner subscriptions list. This Subscription can be used with\n * `remove()` to remove the passed teardown logic from the inner subscriptions\n * list.\n */\n Subscription.prototype.add = function (teardown) {\n if (!teardown || (teardown === Subscription.EMPTY)) {\n return Subscription.EMPTY;\n }\n if (teardown === this) {\n return this;\n }\n var sub = teardown;\n switch (typeof teardown) {\n case 'function':\n sub = new Subscription(teardown);\n case 'object':\n if (sub.closed || typeof sub.unsubscribe !== 'function') {\n break;\n }\n else if (this.closed) {\n sub.unsubscribe();\n }\n else {\n (this._subscriptions || (this._subscriptions = [])).push(sub);\n }\n break;\n default:\n throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n }\n return sub;\n };\n /**\n * Removes a Subscription from the internal list of subscriptions that will\n * unsubscribe during the unsubscribe process of this Subscription.\n * @param {Subscription} subscription The subscription to remove.\n * @return {void}\n */\n Subscription.prototype.remove = function (subscription) {\n // HACK: This might be redundant because of the logic in `add()`\n if (subscription == null || (subscription === this) || (subscription === Subscription.EMPTY)) {\n return;\n }\n var subscriptions = this._subscriptions;\n if (subscriptions) {\n var subscriptionIndex = subscriptions.indexOf(subscription);\n if (subscriptionIndex !== -1) {\n subscriptions.splice(subscriptionIndex, 1);\n }\n }\n };\n Subscription.EMPTY = (function (empty) {\n empty.closed = true;\n return empty;\n }(new Subscription()));\n return Subscription;\n}());\nexports.Subscription = Subscription;\n//# sourceMappingURL=Subscription.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvU3Vic2NyaXB0aW9uLmpzPzVjNTgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgaXNBcnJheV8xID0gcmVxdWlyZSgnLi91dGlsL2lzQXJyYXknKTtcbnZhciBpc09iamVjdF8xID0gcmVxdWlyZSgnLi91dGlsL2lzT2JqZWN0Jyk7XG52YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZSgnLi91dGlsL2lzRnVuY3Rpb24nKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi91dGlsL3RyeUNhdGNoJyk7XG52YXIgZXJyb3JPYmplY3RfMSA9IHJlcXVpcmUoJy4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIFVuc3Vic2NyaXB0aW9uRXJyb3JfMSA9IHJlcXVpcmUoJy4vdXRpbC9VbnN1YnNjcmlwdGlvbkVycm9yJyk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBkaXNwb3NhYmxlIHJlc291cmNlLCBzdWNoIGFzIHRoZSBleGVjdXRpb24gb2YgYW4gT2JzZXJ2YWJsZS4gQVxuICogU3Vic2NyaXB0aW9uIGhhcyBvbmUgaW1wb3J0YW50IG1ldGhvZCwgYHVuc3Vic2NyaWJlYCwgdGhhdCB0YWtlcyBubyBhcmd1bWVudFxuICogYW5kIGp1c3QgZGlzcG9zZXMgdGhlIHJlc291cmNlIGhlbGQgYnkgdGhlIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIHN1YnNjcmlwdGlvbnMgbWF5IGJlIGdyb3VwZWQgdG9nZXRoZXIgdGhyb3VnaCB0aGUgYGFkZCgpYFxuICogbWV0aG9kLCB3aGljaCB3aWxsIGF0dGFjaCBhIGNoaWxkIFN1YnNjcmlwdGlvbiB0byB0aGUgY3VycmVudCBTdWJzY3JpcHRpb24uXG4gKiBXaGVuIGEgU3Vic2NyaXB0aW9uIGlzIHVuc3Vic2NyaWJlZCwgYWxsIGl0cyBjaGlsZHJlbiAoYW5kIGl0cyBncmFuZGNoaWxkcmVuKVxuICogd2lsbCBiZSB1bnN1YnNjcmliZWQgYXMgd2VsbC5cbiAqXG4gKiBAY2xhc3MgU3Vic2NyaXB0aW9uXG4gKi9cbnZhciBTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogdm9pZH0gW3Vuc3Vic2NyaWJlXSBBIGZ1bmN0aW9uIGRlc2NyaWJpbmcgaG93IHRvXG4gICAgICogcGVyZm9ybSB0aGUgZGlzcG9zYWwgb2YgcmVzb3VyY2VzIHdoZW4gdGhlIGB1bnN1YnNjcmliZWAgbWV0aG9kIGlzIGNhbGxlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdWJzY3JpcHRpb24odW5zdWJzY3JpYmUpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgU3Vic2NyaXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gdW5zdWJzY3JpYmVkLlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyB0aGUgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIHN1YnNjcmlwdGlvbi4gTWF5LCBmb3IgaW5zdGFuY2UsIGNhbmNlbFxuICAgICAqIGFuIG9uZ29pbmcgT2JzZXJ2YWJsZSBleGVjdXRpb24gb3IgY2FuY2VsIGFueSBvdGhlciB0eXBlIG9mIHdvcmsgdGhhdFxuICAgICAqIHN0YXJ0ZWQgd2hlbiB0aGUgU3Vic2NyaXB0aW9uIHdhcyBjcmVhdGVkLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3JzO1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIF91bnN1YnNjcmliZSA9IF9hLl91bnN1YnNjcmliZSwgX3N1YnNjcmlwdGlvbnMgPSBfYS5fc3Vic2NyaXB0aW9ucztcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG51bGw7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uXzEuaXNGdW5jdGlvbihfdW5zdWJzY3JpYmUpKSB7XG4gICAgICAgICAgICB2YXIgdHJpYWwgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKF91bnN1YnNjcmliZSkuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIGlmICh0cmlhbCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgKGVycm9ycyA9IGVycm9ycyB8fCBbXSkucHVzaChlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5XzEuaXNBcnJheShfc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICAgICAgdmFyIGxlbiA9IF9zdWJzY3JpcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YiA9IF9zdWJzY3JpcHRpb25zW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3RfMS5pc09iamVjdChzdWIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmlhbCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goc3ViLnVuc3Vic2NyaWJlKS5jYWxsKHN1Yik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmlhbCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcl8xLlVuc3Vic2NyaXB0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGVyci5lcnJvcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdWJzY3JpcHRpb25FcnJvcl8xLlVuc3Vic2NyaXB0aW9uRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHRlYXIgZG93biB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSB1bnN1YnNjcmliZSgpIG9mIHRoaXNcbiAgICAgKiBTdWJzY3JpcHRpb24uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGVhciBkb3duIGJlaW5nIGFkZGVkIGlzIGEgc3Vic2NyaXB0aW9uIHRoYXQgaXMgYWxyZWFkeVxuICAgICAqIHVuc3Vic2NyaWJlZCwgaXMgdGhlIHNhbWUgcmVmZXJlbmNlIGBhZGRgIGlzIGJlaW5nIGNhbGxlZCBvbiwgb3IgaXNcbiAgICAgKiBgU3Vic2NyaXB0aW9uLkVNUFRZYCwgaXQgd2lsbCBub3QgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIHN1YnNjcmlwdGlvbiBpcyBhbHJlYWR5IGluIGFuIGBjbG9zZWRgIHN0YXRlLCB0aGUgcGFzc2VkXG4gICAgICogdGVhciBkb3duIGxvZ2ljIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RlYXJkb3duTG9naWN9IHRlYXJkb3duIFRoZSBhZGRpdGlvbmFsIGxvZ2ljIHRvIGV4ZWN1dGUgb25cbiAgICAgKiB0ZWFyZG93bi5cbiAgICAgKiBAcmV0dXJuIHtTdWJzY3JpcHRpb259IFJldHVybnMgdGhlIFN1YnNjcmlwdGlvbiB1c2VkIG9yIGNyZWF0ZWQgdG8gYmVcbiAgICAgKiBhZGRlZCB0byB0aGUgaW5uZXIgc3Vic2NyaXB0aW9ucyBsaXN0LiBUaGlzIFN1YnNjcmlwdGlvbiBjYW4gYmUgdXNlZCB3aXRoXG4gICAgICogYHJlbW92ZSgpYCB0byByZW1vdmUgdGhlIHBhc3NlZCB0ZWFyZG93biBsb2dpYyBmcm9tIHRoZSBpbm5lciBzdWJzY3JpcHRpb25zXG4gICAgICogbGlzdC5cbiAgICAgKi9cbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0ZWFyZG93bikge1xuICAgICAgICBpZiAoIXRlYXJkb3duIHx8ICh0ZWFyZG93biA9PT0gU3Vic2NyaXB0aW9uLkVNUFRZKSkge1xuICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVhcmRvd24gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdWIgPSB0ZWFyZG93bjtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdGVhcmRvd24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKHRlYXJkb3duKTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKHN1Yi5jbG9zZWQgfHwgdHlwZW9mIHN1Yi51bnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5fc3Vic2NyaXB0aW9ucyB8fCAodGhpcy5fc3Vic2NyaXB0aW9ucyA9IFtdKSkucHVzaChzdWIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdGVhcmRvd24gJyArIHRlYXJkb3duICsgJyBhZGRlZCB0byBTdWJzY3JpcHRpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBTdWJzY3JpcHRpb24gZnJvbSB0aGUgaW50ZXJuYWwgbGlzdCBvZiBzdWJzY3JpcHRpb25zIHRoYXQgd2lsbFxuICAgICAqIHVuc3Vic2NyaWJlIGR1cmluZyB0aGUgdW5zdWJzY3JpYmUgcHJvY2VzcyBvZiB0aGlzIFN1YnNjcmlwdGlvbi5cbiAgICAgKiBAcGFyYW0ge1N1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uIFRoZSBzdWJzY3JpcHRpb24gdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIC8vIEhBQ0s6IFRoaXMgbWlnaHQgYmUgcmVkdW5kYW50IGJlY2F1c2Ugb2YgdGhlIGxvZ2ljIGluIGBhZGQoKWBcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsIHx8IChzdWJzY3JpcHRpb24gPT09IHRoaXMpIHx8IChzdWJzY3JpcHRpb24gPT09IFN1YnNjcmlwdGlvbi5FTVBUWSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnM7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2NyaXB0aW9uSW5kZXggPSBzdWJzY3JpcHRpb25zLmluZGV4T2Yoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShzdWJzY3JpcHRpb25JbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5FTVBUWSA9IChmdW5jdGlvbiAoZW1wdHkpIHtcbiAgICAgICAgZW1wdHkuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGVtcHR5O1xuICAgIH0obmV3IFN1YnNjcmlwdGlvbigpKSk7XG4gICAgcmV0dXJuIFN1YnNjcmlwdGlvbjtcbn0oKSk7XG5leHBvcnRzLlN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YnNjcmlwdGlvbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9TdWJzY3JpcHRpb24uanNcbi8vIG1vZHVsZSBpZCA9IDExXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  46. /***/ },
  47. /* 12 */
  48. /***/ function(module, exports) {
  49. eval("\"use strict\";\nexports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });\n//# sourceMappingURL=isArray.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9pc0FycmF5LmpzP2IwZWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IChmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAmJiB0eXBlb2YgeC5sZW5ndGggPT09ICdudW1iZXInOyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzQXJyYXkuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9pc0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  50. /***/ },
  51. /* 13 */
  52. /***/ function(module, exports) {
  53. eval("\"use strict\";\nfunction isObject(x) {\n return x != null && typeof x === 'object';\n}\nexports.isObject = isObject;\n//# sourceMappingURL=isObject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9pc09iamVjdC5qcz9hYTJlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB4ICE9IG51bGwgJiYgdHlwZW9mIHggPT09ICdvYmplY3QnO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNPYmplY3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9pc09iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  54. /***/ },
  55. /* 14 */
  56. /***/ function(module, exports, __webpack_require__) {
  57. eval("\"use strict\";\nvar errorObject_1 = __webpack_require__(15);\nvar tryCatchTarget;\nfunction tryCatcher() {\n try {\n return tryCatchTarget.apply(this, arguments);\n }\n catch (e) {\n errorObject_1.errorObject.e = e;\n return errorObject_1.errorObject;\n }\n}\nfunction tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n;\n//# sourceMappingURL=tryCatch.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC90cnlDYXRjaC5qcz83Njk0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuL2Vycm9yT2JqZWN0Jyk7XG52YXIgdHJ5Q2F0Y2hUYXJnZXQ7XG5mdW5jdGlvbiB0cnlDYXRjaGVyKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0cnlDYXRjaFRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUgPSBlO1xuICAgICAgICByZXR1cm4gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdDtcbiAgICB9XG59XG5mdW5jdGlvbiB0cnlDYXRjaChmbikge1xuICAgIHRyeUNhdGNoVGFyZ2V0ID0gZm47XG4gICAgcmV0dXJuIHRyeUNhdGNoZXI7XG59XG5leHBvcnRzLnRyeUNhdGNoID0gdHJ5Q2F0Y2g7XG47XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cnlDYXRjaC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL3RyeUNhdGNoLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  58. /***/ },
  59. /* 15 */
  60. /***/ function(module, exports) {
  61. eval("\"use strict\";\n// typeof any so that it we don't have to cast when comparing a result to the error object\nexports.errorObject = { e: {} };\n//# sourceMappingURL=errorObject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9lcnJvck9iamVjdC5qcz9mNDliIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gdHlwZW9mIGFueSBzbyB0aGF0IGl0IHdlIGRvbid0IGhhdmUgdG8gY2FzdCB3aGVuIGNvbXBhcmluZyBhIHJlc3VsdCB0byB0aGUgZXJyb3Igb2JqZWN0XG5leHBvcnRzLmVycm9yT2JqZWN0ID0geyBlOiB7fSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JPYmplY3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9lcnJvck9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  62. /***/ },
  63. /* 16 */
  64. /***/ function(module, exports) {
  65. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nvar UnsubscriptionError = (function (_super) {\n __extends(UnsubscriptionError, _super);\n function UnsubscriptionError(errors) {\n _super.call(this);\n this.errors = errors;\n var err = Error.call(this, errors ?\n errors.length + \" errors occurred during unsubscription:\\n \" + errors.map(function (err, i) { return ((i + 1) + \") \" + err.toString()); }).join('\\n ') : '');\n this.name = err.name = 'UnsubscriptionError';\n this.stack = err.stack;\n this.message = err.message;\n }\n return UnsubscriptionError;\n}(Error));\nexports.UnsubscriptionError = UnsubscriptionError;\n//# sourceMappingURL=UnsubscriptionError.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9VbnN1YnNjcmlwdGlvbkVycm9yLmpzP2JjOWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gb25lIG9yIG1vcmUgZXJyb3JzIGhhdmUgb2NjdXJyZWQgZHVyaW5nIHRoZVxuICogYHVuc3Vic2NyaWJlYCBvZiBhIHtAbGluayBTdWJzY3JpcHRpb259LlxuICovXG52YXIgVW5zdWJzY3JpcHRpb25FcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuc3Vic2NyaXB0aW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvcihlcnJvcnMpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICB2YXIgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBlcnJvcnMgP1xuICAgICAgICAgICAgZXJyb3JzLmxlbmd0aCArIFwiIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XFxuICBcIiArIGVycm9ycy5tYXAoZnVuY3Rpb24gKGVyciwgaSkgeyByZXR1cm4gKChpICsgMSkgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKSk7IH0pLmpvaW4oJ1xcbiAgJykgOiAnJyk7XG4gICAgICAgIHRoaXMubmFtZSA9IGVyci5uYW1lID0gJ1Vuc3Vic2NyaXB0aW9uRXJyb3InO1xuICAgICAgICB0aGlzLnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIFVuc3Vic2NyaXB0aW9uRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLlVuc3Vic2NyaXB0aW9uRXJyb3IgPSBVbnN1YnNjcmlwdGlvbkVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5zdWJzY3JpcHRpb25FcnJvci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanNcbi8vIG1vZHVsZSBpZCA9IDE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  66. /***/ },
  67. /* 17 */
  68. /***/ function(module, exports) {
  69. eval("\"use strict\";\nexports.empty = {\n closed: true,\n next: function (value) { },\n error: function (err) { throw err; },\n complete: function () { }\n};\n//# sourceMappingURL=Observer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvT2JzZXJ2ZXIuanM/ZjA5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW1wdHkgPSB7XG4gICAgY2xvc2VkOiB0cnVlLFxuICAgIG5leHQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyB9LFxuICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyKSB7IHRocm93IGVycjsgfSxcbiAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgeyB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JzZXJ2ZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvT2JzZXJ2ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  70. /***/ },
  71. /* 18 */
  72. /***/ function(module, exports, __webpack_require__) {
  73. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar Symbol = root_1.root.Symbol;\nexports.$$rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?\n Symbol.for('rxSubscriber') : '@@rxSubscriber';\n//# sourceMappingURL=rxSubscriber.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvc3ltYm9sL3J4U3Vic2NyaWJlci5qcz8xMTJjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIHJvb3RfMSA9IHJlcXVpcmUoJy4uL3V0aWwvcm9vdCcpO1xudmFyIFN5bWJvbCA9IHJvb3RfMS5yb290LlN5bWJvbDtcbmV4cG9ydHMuJCRyeFN1YnNjcmliZXIgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJykgP1xuICAgIFN5bWJvbC5mb3IoJ3J4U3Vic2NyaWJlcicpIDogJ0BAcnhTdWJzY3JpYmVyJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ4U3Vic2NyaWJlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zeW1ib2wvcnhTdWJzY3JpYmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  74. /***/ },
  75. /* 19 */
  76. /***/ function(module, exports, __webpack_require__) {
  77. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nfunction getSymbolObservable(context) {\n var $$observable;\n var Symbol = context.Symbol;\n if (typeof Symbol === 'function') {\n if (Symbol.observable) {\n $$observable = Symbol.observable;\n }\n else {\n $$observable = Symbol('observable');\n Symbol.observable = $$observable;\n }\n }\n else {\n $$observable = '@@observable';\n }\n return $$observable;\n}\nexports.getSymbolObservable = getSymbolObservable;\nexports.$$observable = getSymbolObservable(root_1.root);\n//# sourceMappingURL=observable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvc3ltYm9sL29ic2VydmFibGUuanM/MWYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciByb290XzEgPSByZXF1aXJlKCcuLi91dGlsL3Jvb3QnKTtcbmZ1bmN0aW9uIGdldFN5bWJvbE9ic2VydmFibGUoY29udGV4dCkge1xuICAgIHZhciAkJG9ic2VydmFibGU7XG4gICAgdmFyIFN5bWJvbCA9IGNvbnRleHQuU3ltYm9sO1xuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChTeW1ib2wub2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgJCRvYnNlcnZhYmxlID0gU3ltYm9sLm9ic2VydmFibGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAkJG9ic2VydmFibGUgPSBTeW1ib2woJ29ic2VydmFibGUnKTtcbiAgICAgICAgICAgIFN5bWJvbC5vYnNlcnZhYmxlID0gJCRvYnNlcnZhYmxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAkJG9ic2VydmFibGUgPSAnQEBvYnNlcnZhYmxlJztcbiAgICB9XG4gICAgcmV0dXJuICQkb2JzZXJ2YWJsZTtcbn1cbmV4cG9ydHMuZ2V0U3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbE9ic2VydmFibGU7XG5leHBvcnRzLiQkb2JzZXJ2YWJsZSA9IGdldFN5bWJvbE9ic2VydmFibGUocm9vdF8xLnJvb3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zeW1ib2wvb2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  78. /***/ },
  79. /* 20 */
  80. /***/ function(module, exports) {
  81. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nvar ObjectUnsubscribedError = (function (_super) {\n __extends(ObjectUnsubscribedError, _super);\n function ObjectUnsubscribedError() {\n var err = _super.call(this, 'object unsubscribed');\n this.name = err.name = 'ObjectUnsubscribedError';\n this.stack = err.stack;\n this.message = err.message;\n }\n return ObjectUnsubscribedError;\n}(Error));\nexports.ObjectUnsubscribedError = ObjectUnsubscribedError;\n//# sourceMappingURL=ObjectUnsubscribedError.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qcz9lNTU5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG4vKipcbiAqIEFuIGVycm9yIHRocm93biB3aGVuIGFuIGFjdGlvbiBpcyBpbnZhbGlkIGJlY2F1c2UgdGhlIG9iamVjdCBoYXMgYmVlblxuICogdW5zdWJzY3JpYmVkLlxuICpcbiAqIEBzZWUge0BsaW5rIFN1YmplY3R9XG4gKiBAc2VlIHtAbGluayBCZWhhdmlvclN1YmplY3R9XG4gKlxuICogQGNsYXNzIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yXG4gKi9cbnZhciBPYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9iamVjdFVuc3Vic2NyaWJlZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCkge1xuICAgICAgICB2YXIgZXJyID0gX3N1cGVyLmNhbGwodGhpcywgJ29iamVjdCB1bnN1YnNjcmliZWQnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZXJyLm5hbWUgPSAnT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3InO1xuICAgICAgICB0aGlzLnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5PYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qc1xuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  82. /***/ },
  83. /* 21 */
  84. /***/ function(module, exports, __webpack_require__) {
  85. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = __webpack_require__(11);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SubjectSubscription = (function (_super) {\n __extends(SubjectSubscription, _super);\n function SubjectSubscription(subject, subscriber) {\n _super.call(this);\n this.subject = subject;\n this.subscriber = subscriber;\n this.closed = false;\n }\n SubjectSubscription.prototype.unsubscribe = function () {\n if (this.closed) {\n return;\n }\n this.closed = true;\n var subject = this.subject;\n var observers = subject.observers;\n this.subject = null;\n if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n return;\n }\n var subscriberIndex = observers.indexOf(this.subscriber);\n if (subscriberIndex !== -1) {\n observers.splice(subscriberIndex, 1);\n }\n };\n return SubjectSubscription;\n}(Subscription_1.Subscription));\nexports.SubjectSubscription = SubjectSubscription;\n//# sourceMappingURL=SubjectSubscription.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvU3ViamVjdFN1YnNjcmlwdGlvbi5qcz9kMzUxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlKCcuL1N1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBTdWJqZWN0U3Vic2NyaXB0aW9uID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3ViamVjdFN1YnNjcmlwdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJqZWN0U3Vic2NyaXB0aW9uKHN1YmplY3QsIHN1YnNjcmliZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgfVxuICAgIFN1YmplY3RTdWJzY3JpcHRpb24ucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0O1xuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gc3ViamVjdC5vYnNlcnZlcnM7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IG51bGw7XG4gICAgICAgIGlmICghb2JzZXJ2ZXJzIHx8IG9ic2VydmVycy5sZW5ndGggPT09IDAgfHwgc3ViamVjdC5pc1N0b3BwZWQgfHwgc3ViamVjdC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3Vic2NyaWJlckluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2YodGhpcy5zdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG9ic2VydmVycy5zcGxpY2Uoc3Vic2NyaWJlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFN1YmplY3RTdWJzY3JpcHRpb247XG59KFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbikpO1xuZXhwb3J0cy5TdWJqZWN0U3Vic2NyaXB0aW9uID0gU3ViamVjdFN1YnNjcmlwdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YmplY3RTdWJzY3JpcHRpb24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvU3ViamVjdFN1YnNjcmlwdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  86. /***/ },
  87. /* 22 */
  88. /***/ function(module, exports, __webpack_require__) {
  89. eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * @license Angular v2.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(23), __webpack_require__(4)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/common', '@angular/core'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.platformBrowser = global.ng.platformBrowser || {}),global.ng.common,global.ng.core));\n}(this, function (exports,_angular_common,core) { 'use strict';\n\n var /** @type {?} */ DebugDomRootRenderer = core.__core_private__.DebugDomRootRenderer;\n var /** @type {?} */ NoOpAnimationPlayer = core.__core_private__.NoOpAnimationPlayer;\n\n /**\n * @experimental\n */\n var NoOpAnimationDriver = (function () {\n function NoOpAnimationDriver() {\n }\n /**\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n NoOpAnimationDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n if (previousPlayers === void 0) { previousPlayers = []; }\n return new NoOpAnimationPlayer();\n };\n return NoOpAnimationDriver;\n }());\n /**\n * @abstract\n */\n var AnimationDriver = (function () {\n function AnimationDriver() {\n }\n /**\n * @abstract\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n AnimationDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) { };\n AnimationDriver.NOOP = new NoOpAnimationDriver();\n return AnimationDriver;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ globalScope;\n if (typeof window === 'undefined') {\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n globalScope = (self);\n }\n else {\n globalScope = (global);\n }\n }\n else {\n globalScope = (window);\n }\n // Need to declare a new variable for global here since TypeScript\n // exports the original value of the symbol.\n var /** @type {?} */ global$1 = globalScope;\n // TODO: remove calls to assert in production environment\n // Note: Can't just export this and import in in other files\n // as `assert` is a reserved keyword in Dart\n global$1.assert = function assert(condition) {\n // TODO: to be fixed properly via #2830, noop for now\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPresent(obj) {\n return obj != null;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isBlank(obj) {\n return obj == null;\n }\n /**\n * @param {?} token\n * @return {?}\n */\n function stringify(token) {\n if (typeof token === 'string') {\n return token;\n }\n if (token == null) {\n return '' + token;\n }\n if (token.overriddenName) {\n return \"\" + token.overriddenName;\n }\n if (token.name) {\n return \"\" + token.name;\n }\n var /** @type {?} */ res = token.toString();\n var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n }\n /**\n * @param {?} global\n * @param {?} path\n * @param {?} value\n * @return {?}\n */\n function setValueOnPath(global, path, value) {\n var /** @type {?} */ parts = path.split('.');\n var /** @type {?} */ obj = global;\n while (parts.length > 1) {\n var /** @type {?} */ name_1 = parts.shift();\n if (obj.hasOwnProperty(name_1) && obj[name_1] != null) {\n obj = obj[name_1];\n }\n else {\n obj = obj[name_1] = {};\n }\n }\n if (obj === undefined || obj === null) {\n obj = {};\n }\n obj[parts.shift()] = value;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ _DOM = null;\n /**\n * @return {?}\n */\n function getDOM() {\n return _DOM;\n }\n /**\n * @param {?} adapter\n * @return {?}\n */\n function setRootDomAdapter(adapter) {\n if (!_DOM) {\n _DOM = adapter;\n }\n }\n /**\n * Provides DOM operations in an environment-agnostic way.\n * *\n * can introduce XSS risks.\n * @abstract\n */\n var DomAdapter = (function () {\n function DomAdapter() {\n this.resourceLoaderType = null;\n }\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.hasProperty = function (element /** TODO #9100 */, name) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setProperty = function (el, name, value) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.getProperty = function (el, name) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} methodName\n * @param {?} args\n * @return {?}\n */\n DomAdapter.prototype.invoke = function (el, methodName, args) { };\n /**\n * @abstract\n * @param {?} error\n * @return {?}\n */\n DomAdapter.prototype.logError = function (error) { };\n /**\n * @abstract\n * @param {?} error\n * @return {?}\n */\n DomAdapter.prototype.log = function (error) { };\n /**\n * @abstract\n * @param {?} error\n * @return {?}\n */\n DomAdapter.prototype.logGroup = function (error) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.logGroupEnd = function () { };\n Object.defineProperty(DomAdapter.prototype, \"attrToPropMap\", {\n /**\n * Maps attribute names to their corresponding property names for cases\n * where attribute name doesn't match property name.\n * @return {?}\n */\n get: function () { return this._attrToPropMap; },\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) { this._attrToPropMap = value; },\n enumerable: true,\n configurable: true\n });\n ;\n ;\n /**\n * @abstract\n * @param {?} templateHtml\n * @return {?}\n */\n DomAdapter.prototype.parse = function (templateHtml) { };\n /**\n * @abstract\n * @param {?} selector\n * @return {?}\n */\n DomAdapter.prototype.query = function (selector) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} selector\n * @return {?}\n */\n DomAdapter.prototype.querySelector = function (el /** TODO #9100 */, selector) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} selector\n * @return {?}\n */\n DomAdapter.prototype.querySelectorAll = function (el /** TODO #9100 */, selector) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} evt\n * @param {?} listener\n * @return {?}\n */\n DomAdapter.prototype.on = function (el /** TODO #9100 */, evt /** TODO #9100 */, listener) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} evt\n * @param {?} listener\n * @return {?}\n */\n DomAdapter.prototype.onAndCancel = function (el /** TODO #9100 */, evt /** TODO #9100 */, listener) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} evt\n * @return {?}\n */\n DomAdapter.prototype.dispatchEvent = function (el /** TODO #9100 */, evt) { };\n /**\n * @abstract\n * @param {?} eventType\n * @return {?}\n */\n DomAdapter.prototype.createMouseEvent = function (eventType) { };\n /**\n * @abstract\n * @param {?} eventType\n * @return {?}\n */\n DomAdapter.prototype.createEvent = function (eventType) { };\n /**\n * @abstract\n * @param {?} evt\n * @return {?}\n */\n DomAdapter.prototype.preventDefault = function (evt) { };\n /**\n * @abstract\n * @param {?} evt\n * @return {?}\n */\n DomAdapter.prototype.isPrevented = function (evt) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getInnerHTML = function (el) { };\n /**\n * Returns content if el is a <template> element, null otherwise.\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getTemplateContent = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getOuterHTML = function (el) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.nodeName = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.nodeValue = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.type = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.content = function (node) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.firstChild = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.nextSibling = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.parentElement = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.childNodes = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.childNodesAsList = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.clearNodes = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.appendChild = function (el /** TODO #9100 */, node) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.removeChild = function (el /** TODO #9100 */, node) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} newNode\n * @param {?} oldNode\n * @return {?}\n */\n DomAdapter.prototype.replaceChild = function (el /** TODO #9100 */, newNode /** TODO #9100 */, oldNode) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.remove = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.insertBefore = function (el /** TODO #9100 */, node) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} nodes\n * @return {?}\n */\n DomAdapter.prototype.insertAllBefore = function (el /** TODO #9100 */, nodes) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.insertAfter = function (el /** TODO #9100 */, node) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setInnerHTML = function (el /** TODO #9100 */, value) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getText = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setText = function (el /** TODO #9100 */, value) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getValue = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setValue = function (el /** TODO #9100 */, value) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getChecked = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setChecked = function (el /** TODO #9100 */, value) { };\n /**\n * @abstract\n * @param {?} text\n * @return {?}\n */\n DomAdapter.prototype.createComment = function (text) { };\n /**\n * @abstract\n * @param {?} html\n * @return {?}\n */\n DomAdapter.prototype.createTemplate = function (html) { };\n /**\n * @abstract\n * @param {?} tagName\n * @param {?=} doc\n * @return {?}\n */\n DomAdapter.prototype.createElement = function (tagName /** TODO #9100 */, doc) { };\n /**\n * @abstract\n * @param {?} ns\n * @param {?} tagName\n * @param {?=} doc\n * @return {?}\n */\n DomAdapter.prototype.createElementNS = function (ns, tagName, doc) { };\n /**\n * @abstract\n * @param {?} text\n * @param {?=} doc\n * @return {?}\n */\n DomAdapter.prototype.createTextNode = function (text, doc) { };\n /**\n * @abstract\n * @param {?} attrName\n * @param {?} attrValue\n * @param {?=} doc\n * @return {?}\n */\n DomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) { };\n /**\n * @abstract\n * @param {?} css\n * @param {?=} doc\n * @return {?}\n */\n DomAdapter.prototype.createStyleElement = function (css, doc) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.createShadowRoot = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getShadowRoot = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getHost = function (el) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getDistributedNodes = function (el) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.clone /*<T extends Node>*/ = function (node) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.getElementsByClassName = function (element /** TODO #9100 */, name) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.getElementsByTagName = function (element /** TODO #9100 */, name) { };\n /**\n * @abstract\n * @param {?} element\n * @return {?}\n */\n DomAdapter.prototype.classList = function (element) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n DomAdapter.prototype.addClass = function (element /** TODO #9100 */, className) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n DomAdapter.prototype.removeClass = function (element /** TODO #9100 */, className) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n DomAdapter.prototype.hasClass = function (element /** TODO #9100 */, className) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} styleName\n * @param {?} styleValue\n * @return {?}\n */\n DomAdapter.prototype.setStyle = function (element /** TODO #9100 */, styleName, styleValue) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} styleName\n * @return {?}\n */\n DomAdapter.prototype.removeStyle = function (element /** TODO #9100 */, styleName) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} styleName\n * @return {?}\n */\n DomAdapter.prototype.getStyle = function (element /** TODO #9100 */, styleName) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} styleName\n * @param {?=} styleValue\n * @return {?}\n */\n DomAdapter.prototype.hasStyle = function (element /** TODO #9100 */, styleName, styleValue) { };\n /**\n * @abstract\n * @param {?} element\n * @return {?}\n */\n DomAdapter.prototype.tagName = function (element) { };\n /**\n * @abstract\n * @param {?} element\n * @return {?}\n */\n DomAdapter.prototype.attributeMap = function (element) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.hasAttribute = function (element /** TODO #9100 */, attribute) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} ns\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.hasAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.getAttribute = function (element /** TODO #9100 */, attribute) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} ns\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.getAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setAttribute = function (element /** TODO #9100 */, name, value) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} ns\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setAttributeNS = function (element /** TODO #9100 */, ns, name, value) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.removeAttribute = function (element /** TODO #9100 */, attribute) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} ns\n * @param {?} attribute\n * @return {?}\n */\n DomAdapter.prototype.removeAttributeNS = function (element /** TODO #9100 */, ns, attribute) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.templateAwareRoot = function (el) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.createHtmlDocument = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.defaultDoc = function () { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.getBoundingClientRect = function (el) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getTitle = function () { };\n /**\n * @abstract\n * @param {?} newTitle\n * @return {?}\n */\n DomAdapter.prototype.setTitle = function (newTitle) { };\n /**\n * @abstract\n * @param {?} n\n * @param {?} selector\n * @return {?}\n */\n DomAdapter.prototype.elementMatches = function (n /** TODO #9100 */, selector) { };\n /**\n * @abstract\n * @param {?} el\n * @return {?}\n */\n DomAdapter.prototype.isTemplateElement = function (el) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.isTextNode = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.isCommentNode = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.isElementNode = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.hasShadowRoot = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.isShadowRoot = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.importIntoDoc /*<T extends Node>*/ = function (node) { };\n /**\n * @abstract\n * @param {?} node\n * @return {?}\n */\n DomAdapter.prototype.adoptNode /*<T extends Node>*/ = function (node) { };\n /**\n * @abstract\n * @param {?} element\n * @return {?}\n */\n DomAdapter.prototype.getHref = function (element) { };\n /**\n * @abstract\n * @param {?} event\n * @return {?}\n */\n DomAdapter.prototype.getEventKey = function (event) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} baseUrl\n * @param {?} href\n * @return {?}\n */\n DomAdapter.prototype.resolveAndSetHref = function (element /** TODO #9100 */, baseUrl, href) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.supportsDOMEvents = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.supportsNativeShadowDOM = function () { };\n /**\n * @abstract\n * @param {?} target\n * @return {?}\n */\n DomAdapter.prototype.getGlobalEventTarget = function (target) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getHistory = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getLocation = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getBaseHref = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.resetBaseElement = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getUserAgent = function () { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setData = function (element /** TODO #9100 */, name, value) { };\n /**\n * @abstract\n * @param {?} element\n * @return {?}\n */\n DomAdapter.prototype.getComputedStyle = function (element) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.getData = function (element /** TODO #9100 */, name) { };\n /**\n * @abstract\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setGlobalVar = function (name, value) { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.supportsWebAnimation = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.performanceNow = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getAnimationPrefix = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.getTransitionEnd = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.supportsAnimation = function () { };\n /**\n * @abstract\n * @return {?}\n */\n DomAdapter.prototype.supportsCookies = function () { };\n /**\n * @abstract\n * @param {?} name\n * @return {?}\n */\n DomAdapter.prototype.getCookie = function (name) { };\n /**\n * @abstract\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n DomAdapter.prototype.setCookie = function (name, value) { };\n return DomAdapter;\n }());\n\n var WebAnimationsPlayer = (function () {\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} options\n * @param {?=} previousPlayers\n */\n function WebAnimationsPlayer(element, keyframes, options, previousPlayers) {\n var _this = this;\n if (previousPlayers === void 0) { previousPlayers = []; }\n this.element = element;\n this.keyframes = keyframes;\n this.options = options;\n this._onDoneFns = [];\n this._onStartFns = [];\n this._initialized = false;\n this._finished = false;\n this._started = false;\n this._destroyed = false;\n this.parentPlayer = null;\n this._duration = options['duration'];\n this.previousStyles = {};\n previousPlayers.forEach(function (player) {\n var styles = player._captureStyles();\n Object.keys(styles).forEach(function (prop) { return _this.previousStyles[prop] = styles[prop]; });\n });\n }\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype._onFinish = function () {\n if (!this._finished) {\n this._finished = true;\n this._onDoneFns.forEach(function (fn) { return fn(); });\n this._onDoneFns = [];\n }\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.init = function () {\n var _this = this;\n if (this._initialized)\n return;\n this._initialized = true;\n var /** @type {?} */ keyframes = this.keyframes.map(function (styles) {\n var /** @type {?} */ formattedKeyframe = {};\n Object.keys(styles).forEach(function (prop, index) {\n var /** @type {?} */ value = styles[prop];\n if (value == core.AUTO_STYLE) {\n value = _computeStyle(_this.element, prop);\n }\n if (value != undefined) {\n formattedKeyframe[prop] = value;\n }\n });\n return formattedKeyframe;\n });\n var /** @type {?} */ previousStyleProps = Object.keys(this.previousStyles);\n if (previousStyleProps.length) {\n var /** @type {?} */ startingKeyframe_1 = findStartingKeyframe(keyframes);\n previousStyleProps.forEach(function (prop) {\n if (isPresent(startingKeyframe_1[prop])) {\n startingKeyframe_1[prop] = _this.previousStyles[prop];\n }\n });\n }\n this._player = this._triggerWebAnimation(this.element, keyframes, this.options);\n this._finalKeyframe = _copyKeyframeStyles(keyframes[keyframes.length - 1]);\n // this is required so that the player doesn't start to animate right away\n this._resetDomPlayerState();\n this._player.addEventListener('finish', function () { return _this._onFinish(); });\n };\n /**\n * @param {?} element\n * @param {?} keyframes\n * @param {?} options\n * @return {?}\n */\n WebAnimationsPlayer.prototype._triggerWebAnimation = function (element, keyframes, options) {\n return (element.animate(keyframes, options));\n };\n Object.defineProperty(WebAnimationsPlayer.prototype, \"domPlayer\", {\n /**\n * @return {?}\n */\n get: function () { return this._player; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} fn\n * @return {?}\n */\n WebAnimationsPlayer.prototype.onStart = function (fn) { this._onStartFns.push(fn); };\n /**\n * @param {?} fn\n * @return {?}\n */\n WebAnimationsPlayer.prototype.onDone = function (fn) { this._onDoneFns.push(fn); };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.play = function () {\n this.init();\n if (!this.hasStarted()) {\n this._onStartFns.forEach(function (fn) { return fn(); });\n this._onStartFns = [];\n this._started = true;\n }\n this._player.play();\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.pause = function () {\n this.init();\n this._player.pause();\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.finish = function () {\n this.init();\n this._onFinish();\n this._player.finish();\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.reset = function () {\n this._resetDomPlayerState();\n this._destroyed = false;\n this._finished = false;\n this._started = false;\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype._resetDomPlayerState = function () {\n if (this._player) {\n this._player.cancel();\n }\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.restart = function () {\n this.reset();\n this.play();\n };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.hasStarted = function () { return this._started; };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.destroy = function () {\n if (!this._destroyed) {\n this._resetDomPlayerState();\n this._onFinish();\n this._destroyed = true;\n }\n };\n Object.defineProperty(WebAnimationsPlayer.prototype, \"totalTime\", {\n /**\n * @return {?}\n */\n get: function () { return this._duration; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} p\n * @return {?}\n */\n WebAnimationsPlayer.prototype.setPosition = function (p) { this._player.currentTime = p * this.totalTime; };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype.getPosition = function () { return this._player.currentTime / this.totalTime; };\n /**\n * @return {?}\n */\n WebAnimationsPlayer.prototype._captureStyles = function () {\n var _this = this;\n var /** @type {?} */ styles = {};\n if (this.hasStarted()) {\n Object.keys(this._finalKeyframe).forEach(function (prop) {\n if (prop != 'offset') {\n styles[prop] =\n _this._finished ? _this._finalKeyframe[prop] : _computeStyle(_this.element, prop);\n }\n });\n }\n return styles;\n };\n return WebAnimationsPlayer;\n }());\n /**\n * @param {?} element\n * @param {?} prop\n * @return {?}\n */\n function _computeStyle(element, prop) {\n return getDOM().getComputedStyle(element)[prop];\n }\n /**\n * @param {?} styles\n * @return {?}\n */\n function _copyKeyframeStyles(styles) {\n var /** @type {?} */ newStyles = {};\n Object.keys(styles).forEach(function (prop) {\n if (prop != 'offset') {\n newStyles[prop] = styles[prop];\n }\n });\n return newStyles;\n }\n /**\n * @param {?} keyframes\n * @return {?}\n */\n function findStartingKeyframe(keyframes) {\n var /** @type {?} */ startingKeyframe = keyframes[0];\n // it's important that we find the LAST keyframe\n // to ensure that style overidding is final.\n for (var /** @type {?} */ i = 1; i < keyframes.length; i++) {\n var /** @type {?} */ kf = keyframes[i];\n var /** @type {?} */ offset = kf['offset'];\n if (offset !== 0)\n break;\n startingKeyframe = kf;\n }\n return startingKeyframe;\n }\n\n var WebAnimationsDriver = (function () {\n function WebAnimationsDriver() {\n }\n /**\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n WebAnimationsDriver.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n if (previousPlayers === void 0) { previousPlayers = []; }\n var /** @type {?} */ formattedSteps = [];\n var /** @type {?} */ startingStyleLookup = {};\n if (isPresent(startingStyles) && startingStyles.styles.length > 0) {\n startingStyleLookup = _populateStyles(startingStyles, {});\n startingStyleLookup['offset'] = 0;\n formattedSteps.push(startingStyleLookup);\n }\n keyframes.forEach(function (keyframe) {\n var /** @type {?} */ data = _populateStyles(keyframe.styles, startingStyleLookup);\n data['offset'] = Math.max(0, Math.min(1, keyframe.offset));\n formattedSteps.push(data);\n });\n // this is a special case when only styles are applied as an\n // animation. When this occurs we want to animate from start to\n // end with the same values. Removing the offset and having only\n // start/end values is suitable enough for the web-animations API\n if (formattedSteps.length == 1) {\n var /** @type {?} */ start = formattedSteps[0];\n start['offset'] = null;\n formattedSteps = [start, start];\n }\n var /** @type {?} */ playerOptions = {\n 'duration': duration,\n 'delay': delay,\n 'fill': 'both' // we use `both` because it allows for styling at 0% to work with `delay`\n };\n // we check for this to avoid having a null|undefined value be present\n // for the easing (which results in an error for certain browsers #9752)\n if (easing) {\n playerOptions['easing'] = easing;\n }\n // there may be a chance a NoOp player is returned depending\n // on when the previous animation was cancelled\n previousPlayers = previousPlayers.filter(filterWebAnimationPlayerFn);\n return new WebAnimationsPlayer(element, formattedSteps, playerOptions, /** @type {?} */ (previousPlayers));\n };\n return WebAnimationsDriver;\n }());\n /**\n * @param {?} styles\n * @param {?} defaultStyles\n * @return {?}\n */\n function _populateStyles(styles, defaultStyles) {\n var /** @type {?} */ data = {};\n styles.styles.forEach(function (entry) { Object.keys(entry).forEach(function (prop) { data[prop] = entry[prop]; }); });\n Object.keys(defaultStyles).forEach(function (prop) {\n if (!isPresent(data[prop])) {\n data[prop] = defaultStyles[prop];\n }\n });\n return data;\n }\n /**\n * @param {?} player\n * @return {?}\n */\n function filterWebAnimationPlayerFn(player) {\n return player instanceof WebAnimationsPlayer;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Provides DOM operations in any browser environment.\n * *\n * can introduce XSS risks.\n * @abstract\n */\n var GenericBrowserDomAdapter = (function (_super) {\n __extends$1(GenericBrowserDomAdapter, _super);\n function GenericBrowserDomAdapter() {\n var _this = this;\n _super.call(this);\n this._animationPrefix = null;\n this._transitionEnd = null;\n try {\n var element_1 = this.createElement('div', this.defaultDoc());\n if (isPresent(this.getStyle(element_1, 'animationName'))) {\n this._animationPrefix = '';\n }\n else {\n var domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];\n for (var i = 0; i < domPrefixes.length; i++) {\n if (isPresent(this.getStyle(element_1, domPrefixes[i] + 'AnimationName'))) {\n this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';\n break;\n }\n }\n }\n var transEndEventNames_1 = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n Object.keys(transEndEventNames_1).forEach(function (key) {\n if (isPresent(_this.getStyle(element_1, key))) {\n _this._transitionEnd = transEndEventNames_1[key];\n }\n });\n }\n catch (e) {\n this._animationPrefix = null;\n this._transitionEnd = null;\n }\n }\n /**\n * @param {?} el\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.getDistributedNodes = function (el) { return ((el)).getDistributedNodes(); };\n /**\n * @param {?} el\n * @param {?} baseUrl\n * @param {?} href\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.resolveAndSetHref = function (el, baseUrl, href) {\n el.href = href == null ? baseUrl : baseUrl + '/../' + href;\n };\n /**\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () { return true; };\n /**\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM = function () {\n return typeof ((this.defaultDoc().body)).createShadowRoot === 'function';\n };\n /**\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.getAnimationPrefix = function () { return this._animationPrefix ? this._animationPrefix : ''; };\n /**\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.getTransitionEnd = function () { return this._transitionEnd ? this._transitionEnd : ''; };\n /**\n * @return {?}\n */\n GenericBrowserDomAdapter.prototype.supportsAnimation = function () {\n return isPresent(this._animationPrefix) && isPresent(this._transitionEnd);\n };\n return GenericBrowserDomAdapter;\n }(DomAdapter));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ _attrToPropMap = {\n 'class': 'className',\n 'innerHtml': 'innerHTML',\n 'readonly': 'readOnly',\n 'tabindex': 'tabIndex',\n };\n var /** @type {?} */ DOM_KEY_LOCATION_NUMPAD = 3;\n // Map to convert some key or keyIdentifier values to what will be returned by getEventKey\n var /** @type {?} */ _keyMap = {\n // The following values are here for cross-browser compatibility and to match the W3C standard\n // cf http://www.w3.org/TR/DOM-Level-3-Events-key/\n '\\b': 'Backspace',\n '\\t': 'Tab',\n '\\x7F': 'Delete',\n '\\x1B': 'Escape',\n 'Del': 'Delete',\n 'Esc': 'Escape',\n 'Left': 'ArrowLeft',\n 'Right': 'ArrowRight',\n 'Up': 'ArrowUp',\n 'Down': 'ArrowDown',\n 'Menu': 'ContextMenu',\n 'Scroll': 'ScrollLock',\n 'Win': 'OS'\n };\n // There is a bug in Chrome for numeric keypad keys:\n // https://code.google.com/p/chromium/issues/detail?id=155654\n // 1, 2, 3 ... are reported as A, B, C ...\n var /** @type {?} */ _chromeNumKeyPadMap = {\n 'A': '1',\n 'B': '2',\n 'C': '3',\n 'D': '4',\n 'E': '5',\n 'F': '6',\n 'G': '7',\n 'H': '8',\n 'I': '9',\n 'J': '*',\n 'K': '+',\n 'M': '-',\n 'N': '.',\n 'O': '/',\n '\\x60': '0',\n '\\x90': 'NumLock'\n };\n /**\n * A `DomAdapter` powered by full browser DOM APIs.\n *\n * @security Tread carefully! Interacting with the DOM directly is dangerous and\n * can introduce XSS risks.\n */\n /* tslint:disable:requireParameterType no-console */\n var BrowserDomAdapter = (function (_super) {\n __extends(BrowserDomAdapter, _super);\n function BrowserDomAdapter() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} templateHtml\n * @return {?}\n */\n BrowserDomAdapter.prototype.parse = function (templateHtml) { throw new Error('parse not implemented'); };\n /**\n * @return {?}\n */\n BrowserDomAdapter.makeCurrent = function () { setRootDomAdapter(new BrowserDomAdapter()); };\n /**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasProperty = function (element, name) { return name in element; };\n /**\n * @param {?} el\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setProperty = function (el, name, value) { ((el))[name] = value; };\n /**\n * @param {?} el\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getProperty = function (el, name) { return ((el))[name]; };\n /**\n * @param {?} el\n * @param {?} methodName\n * @param {?} args\n * @return {?}\n */\n BrowserDomAdapter.prototype.invoke = function (el, methodName, args) { (_a = ((el)))[methodName].apply(_a, args); var _a; };\n /**\n * @param {?} error\n * @return {?}\n */\n BrowserDomAdapter.prototype.logError = function (error) {\n if (window.console) {\n if (console.error) {\n console.error(error);\n }\n else {\n console.log(error);\n }\n }\n };\n /**\n * @param {?} error\n * @return {?}\n */\n BrowserDomAdapter.prototype.log = function (error) {\n if (window.console) {\n window.console.log && window.console.log(error);\n }\n };\n /**\n * @param {?} error\n * @return {?}\n */\n BrowserDomAdapter.prototype.logGroup = function (error) {\n if (window.console) {\n window.console.group && window.console.group(error);\n }\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.logGroupEnd = function () {\n if (window.console) {\n window.console.groupEnd && window.console.groupEnd();\n }\n };\n Object.defineProperty(BrowserDomAdapter.prototype, \"attrToPropMap\", {\n /**\n * @return {?}\n */\n get: function () { return _attrToPropMap; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} selector\n * @return {?}\n */\n BrowserDomAdapter.prototype.query = function (selector) { return document.querySelector(selector); };\n /**\n * @param {?} el\n * @param {?} selector\n * @return {?}\n */\n BrowserDomAdapter.prototype.querySelector = function (el, selector) {\n return (el.querySelector(selector));\n };\n /**\n * @param {?} el\n * @param {?} selector\n * @return {?}\n */\n BrowserDomAdapter.prototype.querySelectorAll = function (el, selector) { return el.querySelectorAll(selector); };\n /**\n * @param {?} el\n * @param {?} evt\n * @param {?} listener\n * @return {?}\n */\n BrowserDomAdapter.prototype.on = function (el, evt, listener) { el.addEventListener(evt, listener, false); };\n /**\n * @param {?} el\n * @param {?} evt\n * @param {?} listener\n * @return {?}\n */\n BrowserDomAdapter.prototype.onAndCancel = function (el, evt, listener) {\n el.addEventListener(evt, listener, false);\n // Needed to follow Dart's subscription semantic, until fix of\n // https://code.google.com/p/dart/issues/detail?id=17406\n return function () { el.removeEventListener(evt, listener, false); };\n };\n /**\n * @param {?} el\n * @param {?} evt\n * @return {?}\n */\n BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) { el.dispatchEvent(evt); };\n /**\n * @param {?} eventType\n * @return {?}\n */\n BrowserDomAdapter.prototype.createMouseEvent = function (eventType) {\n var /** @type {?} */ evt = document.createEvent('MouseEvent');\n evt.initEvent(eventType, true, true);\n return evt;\n };\n /**\n * @param {?} eventType\n * @return {?}\n */\n BrowserDomAdapter.prototype.createEvent = function (eventType) {\n var /** @type {?} */ evt = document.createEvent('Event');\n evt.initEvent(eventType, true, true);\n return evt;\n };\n /**\n * @param {?} evt\n * @return {?}\n */\n BrowserDomAdapter.prototype.preventDefault = function (evt) {\n evt.preventDefault();\n evt.returnValue = false;\n };\n /**\n * @param {?} evt\n * @return {?}\n */\n BrowserDomAdapter.prototype.isPrevented = function (evt) {\n return evt.defaultPrevented || isPresent(evt.returnValue) && !evt.returnValue;\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getInnerHTML = function (el) { return el.innerHTML; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getTemplateContent = function (el) {\n return 'content' in el && el instanceof HTMLTemplateElement ? el.content : null;\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getOuterHTML = function (el) { return el.outerHTML; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.nodeName = function (node) { return node.nodeName; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.nodeValue = function (node) { return node.nodeValue; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.type = function (node) { return node.type; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.content = function (node) {\n if (this.hasProperty(node, 'content')) {\n return ((node)).content;\n }\n else {\n return node;\n }\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.firstChild = function (el) { return el.firstChild; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.nextSibling = function (el) { return el.nextSibling; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.parentElement = function (el) { return el.parentNode; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.childNodes = function (el) { return el.childNodes; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.childNodesAsList = function (el) {\n var /** @type {?} */ childNodes = el.childNodes;\n var /** @type {?} */ res = new Array(childNodes.length);\n for (var /** @type {?} */ i = 0; i < childNodes.length; i++) {\n res[i] = childNodes[i];\n }\n return res;\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.clearNodes = function (el) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n };\n /**\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.appendChild = function (el, node) { el.appendChild(node); };\n /**\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.removeChild = function (el, node) { el.removeChild(node); };\n /**\n * @param {?} el\n * @param {?} newChild\n * @param {?} oldChild\n * @return {?}\n */\n BrowserDomAdapter.prototype.replaceChild = function (el, newChild, oldChild) { el.replaceChild(newChild, oldChild); };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.remove = function (node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n return node;\n };\n /**\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.insertBefore = function (el, node) { el.parentNode.insertBefore(node, el); };\n /**\n * @param {?} el\n * @param {?} nodes\n * @return {?}\n */\n BrowserDomAdapter.prototype.insertAllBefore = function (el, nodes) {\n nodes.forEach(function (n) { return el.parentNode.insertBefore(n, el); });\n };\n /**\n * @param {?} el\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.insertAfter = function (el, node) { el.parentNode.insertBefore(node, el.nextSibling); };\n /**\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setInnerHTML = function (el, value) { el.innerHTML = value; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getText = function (el) { return el.textContent; };\n /**\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setText = function (el, value) { el.textContent = value; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getValue = function (el) { return el.value; };\n /**\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setValue = function (el, value) { el.value = value; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getChecked = function (el) { return el.checked; };\n /**\n * @param {?} el\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setChecked = function (el, value) { el.checked = value; };\n /**\n * @param {?} text\n * @return {?}\n */\n BrowserDomAdapter.prototype.createComment = function (text) { return document.createComment(text); };\n /**\n * @param {?} html\n * @return {?}\n */\n BrowserDomAdapter.prototype.createTemplate = function (html) {\n var /** @type {?} */ t = document.createElement('template');\n t.innerHTML = html;\n return t;\n };\n /**\n * @param {?} tagName\n * @param {?=} doc\n * @return {?}\n */\n BrowserDomAdapter.prototype.createElement = function (tagName, doc) {\n if (doc === void 0) { doc = document; }\n return doc.createElement(tagName);\n };\n /**\n * @param {?} ns\n * @param {?} tagName\n * @param {?=} doc\n * @return {?}\n */\n BrowserDomAdapter.prototype.createElementNS = function (ns, tagName, doc) {\n if (doc === void 0) { doc = document; }\n return doc.createElementNS(ns, tagName);\n };\n /**\n * @param {?} text\n * @param {?=} doc\n * @return {?}\n */\n BrowserDomAdapter.prototype.createTextNode = function (text, doc) {\n if (doc === void 0) { doc = document; }\n return doc.createTextNode(text);\n };\n /**\n * @param {?} attrName\n * @param {?} attrValue\n * @param {?=} doc\n * @return {?}\n */\n BrowserDomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) {\n if (doc === void 0) { doc = document; }\n var /** @type {?} */ el = (doc.createElement('SCRIPT'));\n el.setAttribute(attrName, attrValue);\n return el;\n };\n /**\n * @param {?} css\n * @param {?=} doc\n * @return {?}\n */\n BrowserDomAdapter.prototype.createStyleElement = function (css, doc) {\n if (doc === void 0) { doc = document; }\n var /** @type {?} */ style = (doc.createElement('style'));\n this.appendChild(style, this.createTextNode(css));\n return style;\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.createShadowRoot = function (el) { return ((el)).createShadowRoot(); };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getShadowRoot = function (el) { return ((el)).shadowRoot; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getHost = function (el) { return ((el)).host; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.clone = function (node) { return node.cloneNode(true); };\n /**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getElementsByClassName = function (element, name) {\n return element.getElementsByClassName(name);\n };\n /**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getElementsByTagName = function (element, name) {\n return element.getElementsByTagName(name);\n };\n /**\n * @param {?} element\n * @return {?}\n */\n BrowserDomAdapter.prototype.classList = function (element) { return Array.prototype.slice.call(element.classList, 0); };\n /**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n BrowserDomAdapter.prototype.addClass = function (element, className) { element.classList.add(className); };\n /**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n BrowserDomAdapter.prototype.removeClass = function (element, className) { element.classList.remove(className); };\n /**\n * @param {?} element\n * @param {?} className\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasClass = function (element, className) {\n return element.classList.contains(className);\n };\n /**\n * @param {?} element\n * @param {?} styleName\n * @param {?} styleValue\n * @return {?}\n */\n BrowserDomAdapter.prototype.setStyle = function (element, styleName, styleValue) {\n element.style[styleName] = styleValue;\n };\n /**\n * @param {?} element\n * @param {?} stylename\n * @return {?}\n */\n BrowserDomAdapter.prototype.removeStyle = function (element, stylename) {\n // IE requires '' instead of null\n // see https://github.com/angular/angular/issues/7916\n element.style[stylename] = '';\n };\n /**\n * @param {?} element\n * @param {?} stylename\n * @return {?}\n */\n BrowserDomAdapter.prototype.getStyle = function (element, stylename) { return element.style[stylename]; };\n /**\n * @param {?} element\n * @param {?} styleName\n * @param {?=} styleValue\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasStyle = function (element, styleName, styleValue) {\n if (styleValue === void 0) { styleValue = null; }\n var /** @type {?} */ value = this.getStyle(element, styleName) || '';\n return styleValue ? value == styleValue : value.length > 0;\n };\n /**\n * @param {?} element\n * @return {?}\n */\n BrowserDomAdapter.prototype.tagName = function (element) { return element.tagName; };\n /**\n * @param {?} element\n * @return {?}\n */\n BrowserDomAdapter.prototype.attributeMap = function (element) {\n var /** @type {?} */ res = new Map();\n var /** @type {?} */ elAttrs = element.attributes;\n for (var /** @type {?} */ i = 0; i < elAttrs.length; i++) {\n var /** @type {?} */ attrib = elAttrs[i];\n res.set(attrib.name, attrib.value);\n }\n return res;\n };\n /**\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasAttribute = function (element, attribute) {\n return element.hasAttribute(attribute);\n };\n /**\n * @param {?} element\n * @param {?} ns\n * @param {?} attribute\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasAttributeNS = function (element, ns, attribute) {\n return element.hasAttributeNS(ns, attribute);\n };\n /**\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n BrowserDomAdapter.prototype.getAttribute = function (element, attribute) {\n return element.getAttribute(attribute);\n };\n /**\n * @param {?} element\n * @param {?} ns\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getAttributeNS = function (element, ns, name) {\n return element.getAttributeNS(ns, name);\n };\n /**\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setAttribute = function (element, name, value) { element.setAttribute(name, value); };\n /**\n * @param {?} element\n * @param {?} ns\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setAttributeNS = function (element, ns, name, value) {\n element.setAttributeNS(ns, name, value);\n };\n /**\n * @param {?} element\n * @param {?} attribute\n * @return {?}\n */\n BrowserDomAdapter.prototype.removeAttribute = function (element, attribute) { element.removeAttribute(attribute); };\n /**\n * @param {?} element\n * @param {?} ns\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.removeAttributeNS = function (element, ns, name) {\n element.removeAttributeNS(ns, name);\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.templateAwareRoot = function (el) { return this.isTemplateElement(el) ? this.content(el) : el; };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.createHtmlDocument = function () {\n return document.implementation.createHTMLDocument('fakeTitle');\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.defaultDoc = function () { return document; };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getBoundingClientRect = function (el) {\n try {\n return el.getBoundingClientRect();\n }\n catch (e) {\n return { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 };\n }\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.getTitle = function () { return document.title; };\n /**\n * @param {?} newTitle\n * @return {?}\n */\n BrowserDomAdapter.prototype.setTitle = function (newTitle) { document.title = newTitle || ''; };\n /**\n * @param {?} n\n * @param {?} selector\n * @return {?}\n */\n BrowserDomAdapter.prototype.elementMatches = function (n, selector) {\n if (n instanceof HTMLElement) {\n return n.matches && n.matches(selector) ||\n n.msMatchesSelector && n.msMatchesSelector(selector) ||\n n.webkitMatchesSelector && n.webkitMatchesSelector(selector);\n }\n return false;\n };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.isTemplateElement = function (el) {\n return el instanceof HTMLElement && el.nodeName == 'TEMPLATE';\n };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.isCommentNode = function (node) { return node.nodeType === Node.COMMENT_NODE; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.hasShadowRoot = function (node) {\n return isPresent(node.shadowRoot) && node instanceof HTMLElement;\n };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.isShadowRoot = function (node) { return node instanceof DocumentFragment; };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.importIntoDoc = function (node) { return document.importNode(this.templateAwareRoot(node), true); };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserDomAdapter.prototype.adoptNode = function (node) { return document.adoptNode(node); };\n /**\n * @param {?} el\n * @return {?}\n */\n BrowserDomAdapter.prototype.getHref = function (el) { return ((el)).href; };\n /**\n * @param {?} event\n * @return {?}\n */\n BrowserDomAdapter.prototype.getEventKey = function (event) {\n var /** @type {?} */ key = event.key;\n if (isBlank(key)) {\n key = event.keyIdentifier;\n // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and\n // Safari cf\n // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces\n if (isBlank(key)) {\n return 'Unidentified';\n }\n if (key.startsWith('U+')) {\n key = String.fromCharCode(parseInt(key.substring(2), 16));\n if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) {\n // There is a bug in Chrome for numeric keypad keys:\n // https://code.google.com/p/chromium/issues/detail?id=155654\n // 1, 2, 3 ... are reported as A, B, C ...\n key = ((_chromeNumKeyPadMap))[key];\n }\n }\n }\n return _keyMap[key] || key;\n };\n /**\n * @param {?} target\n * @return {?}\n */\n BrowserDomAdapter.prototype.getGlobalEventTarget = function (target) {\n if (target === 'window') {\n return window;\n }\n if (target === 'document') {\n return document;\n }\n if (target === 'body') {\n return document.body;\n }\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.getHistory = function () { return window.history; };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.getLocation = function () { return window.location; };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.getBaseHref = function () {\n var /** @type {?} */ href = getBaseElementHref();\n return isBlank(href) ? null : relativePath(href);\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.resetBaseElement = function () { baseElement = null; };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.getUserAgent = function () { return window.navigator.userAgent; };\n /**\n * @param {?} element\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setData = function (element, name, value) {\n this.setAttribute(element, 'data-' + name, value);\n };\n /**\n * @param {?} element\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getData = function (element, name) {\n return this.getAttribute(element, 'data-' + name);\n };\n /**\n * @param {?} element\n * @return {?}\n */\n BrowserDomAdapter.prototype.getComputedStyle = function (element) { return getComputedStyle(element); };\n /**\n * @param {?} path\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setGlobalVar = function (path, value) { setValueOnPath(global$1, path, value); };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.supportsWebAnimation = function () {\n return typeof ((Element)).prototype['animate'] === 'function';\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.performanceNow = function () {\n // performance.now() is not available in all browsers, see\n // http://caniuse.com/#search=performance.now\n return window.performance && window.performance.now ? window.performance.now() :\n new Date().getTime();\n };\n /**\n * @return {?}\n */\n BrowserDomAdapter.prototype.supportsCookies = function () { return true; };\n /**\n * @param {?} name\n * @return {?}\n */\n BrowserDomAdapter.prototype.getCookie = function (name) { return parseCookieValue(document.cookie, name); };\n /**\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n BrowserDomAdapter.prototype.setCookie = function (name, value) {\n // document.cookie is magical, assigning into it assigns/overrides one cookie value, but does\n // not clear other cookies.\n document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);\n };\n return BrowserDomAdapter;\n }(GenericBrowserDomAdapter));\n var /** @type {?} */ baseElement = null;\n /**\n * @return {?}\n */\n function getBaseElementHref() {\n if (!baseElement) {\n baseElement = document.querySelector('base');\n if (!baseElement) {\n return null;\n }\n }\n return baseElement.getAttribute('href');\n }\n // based on urlUtils.js in AngularJS 1\n var /** @type {?} */ urlParsingNode;\n /**\n * @param {?} url\n * @return {?}\n */\n function relativePath(url) {\n if (!urlParsingNode) {\n urlParsingNode = document.createElement('a');\n }\n urlParsingNode.setAttribute('href', url);\n return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname :\n '/' + urlParsingNode.pathname;\n }\n /**\n * @param {?} cookieStr\n * @param {?} name\n * @return {?}\n */\n function parseCookieValue(cookieStr, name) {\n name = encodeURIComponent(name);\n for (var _i = 0, _a = cookieStr.split(';'); _i < _a.length; _i++) {\n var cookie = _a[_i];\n var /** @type {?} */ eqIndex = cookie.indexOf('=');\n var _b = eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)], cookieName = _b[0], cookieValue = _b[1];\n if (cookieName.trim() === name) {\n return decodeURIComponent(cookieValue);\n }\n }\n return null;\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @return {?}\n */\n function supportsState() {\n return !!window.history.pushState;\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$2 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * `PlatformLocation` encapsulates all of the direct calls to platform APIs.\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n */\n var BrowserPlatformLocation = (function (_super) {\n __extends$2(BrowserPlatformLocation, _super);\n function BrowserPlatformLocation() {\n _super.call(this);\n this._init();\n }\n /**\n * @return {?}\n */\n BrowserPlatformLocation.prototype._init = function () {\n this._location = getDOM().getLocation();\n this._history = getDOM().getHistory();\n };\n Object.defineProperty(BrowserPlatformLocation.prototype, \"location\", {\n /**\n * @return {?}\n */\n get: function () { return this._location; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n BrowserPlatformLocation.prototype.getBaseHrefFromDOM = function () { return getDOM().getBaseHref(); };\n /**\n * @param {?} fn\n * @return {?}\n */\n BrowserPlatformLocation.prototype.onPopState = function (fn) {\n getDOM().getGlobalEventTarget('window').addEventListener('popstate', fn, false);\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n BrowserPlatformLocation.prototype.onHashChange = function (fn) {\n getDOM().getGlobalEventTarget('window').addEventListener('hashchange', fn, false);\n };\n Object.defineProperty(BrowserPlatformLocation.prototype, \"pathname\", {\n /**\n * @return {?}\n */\n get: function () { return this._location.pathname; },\n /**\n * @param {?} newPath\n * @return {?}\n */\n set: function (newPath) { this._location.pathname = newPath; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BrowserPlatformLocation.prototype, \"search\", {\n /**\n * @return {?}\n */\n get: function () { return this._location.search; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BrowserPlatformLocation.prototype, \"hash\", {\n /**\n * @return {?}\n */\n get: function () { return this._location.hash; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @return {?}\n */\n BrowserPlatformLocation.prototype.pushState = function (state, title, url) {\n if (supportsState()) {\n this._history.pushState(state, title, url);\n }\n else {\n this._location.hash = url;\n }\n };\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @return {?}\n */\n BrowserPlatformLocation.prototype.replaceState = function (state, title, url) {\n if (supportsState()) {\n this._history.replaceState(state, title, url);\n }\n else {\n this._location.hash = url;\n }\n };\n /**\n * @return {?}\n */\n BrowserPlatformLocation.prototype.forward = function () { this._history.forward(); };\n /**\n * @return {?}\n */\n BrowserPlatformLocation.prototype.back = function () { this._history.back(); };\n BrowserPlatformLocation.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n BrowserPlatformLocation.ctorParameters = function () { return []; };\n return BrowserPlatformLocation;\n }(_angular_common.PlatformLocation));\n\n var BrowserGetTestability = (function () {\n function BrowserGetTestability() {\n }\n /**\n * @return {?}\n */\n BrowserGetTestability.init = function () { core.setTestabilityGetter(new BrowserGetTestability()); };\n /**\n * @param {?} registry\n * @return {?}\n */\n BrowserGetTestability.prototype.addToWindow = function (registry) {\n global$1.getAngularTestability = function (elem, findInAncestors) {\n if (findInAncestors === void 0) { findInAncestors = true; }\n var /** @type {?} */ testability = registry.findTestabilityInTree(elem, findInAncestors);\n if (testability == null) {\n throw new Error('Could not find testability for element.');\n }\n return testability;\n };\n global$1.getAllAngularTestabilities = function () { return registry.getAllTestabilities(); };\n global$1.getAllAngularRootElements = function () { return registry.getAllRootElements(); };\n var /** @type {?} */ whenAllStable = function (callback /** TODO #9100 */) {\n var /** @type {?} */ testabilities = global$1.getAllAngularTestabilities();\n var /** @type {?} */ count = testabilities.length;\n var /** @type {?} */ didWork = false;\n var /** @type {?} */ decrement = function (didWork_ /** TODO #9100 */) {\n didWork = didWork || didWork_;\n count--;\n if (count == 0) {\n callback(didWork);\n }\n };\n testabilities.forEach(function (testability /** TODO #9100 */) {\n testability.whenStable(decrement);\n });\n };\n if (!global$1['frameworkStabilizers']) {\n global$1['frameworkStabilizers'] = [];\n }\n global$1['frameworkStabilizers'].push(whenAllStable);\n };\n /**\n * @param {?} registry\n * @param {?} elem\n * @param {?} findInAncestors\n * @return {?}\n */\n BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {\n if (elem == null) {\n return null;\n }\n var /** @type {?} */ t = registry.getTestability(elem);\n if (isPresent(t)) {\n return t;\n }\n else if (!findInAncestors) {\n return null;\n }\n if (getDOM().isShadowRoot(elem)) {\n return this.findTestabilityInTree(registry, getDOM().getHost(elem), true);\n }\n return this.findTestabilityInTree(registry, getDOM().parentElement(elem), true);\n };\n return BrowserGetTestability;\n }());\n\n /**\n * A service that can be used to get and set the title of a current HTML document.\n * *\n * Since an Angular 2 application can't be bootstrapped on the entire HTML document (`<html>` tag)\n * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements\n * (representing the `<title>` tag). Instead, this service can be used to set and get the current\n * title value.\n * *\n */\n var Title = (function () {\n function Title() {\n }\n /**\n * Get the title of the current HTML document.\n * @return {?}\n */\n Title.prototype.getTitle = function () { return getDOM().getTitle(); };\n /**\n * Set the title of the current HTML document.\n * @param {?} newTitle\n * @return {?}\n */\n Title.prototype.setTitle = function (newTitle) { getDOM().setTitle(newTitle); };\n return Title;\n }());\n\n /**\n * Wraps Javascript Objects\n */\n var StringMapWrapper = (function () {\n function StringMapWrapper() {\n }\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.merge = function (m1, m2) {\n var /** @type {?} */ m = {};\n for (var _i = 0, _a = Object.keys(m1); _i < _a.length; _i++) {\n var k = _a[_i];\n m[k] = m1[k];\n }\n for (var _b = 0, _c = Object.keys(m2); _b < _c.length; _b++) {\n var k = _c[_b];\n m[k] = m2[k];\n }\n return m;\n };\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n StringMapWrapper.equals = function (m1, m2) {\n var /** @type {?} */ k1 = Object.keys(m1);\n var /** @type {?} */ k2 = Object.keys(m2);\n if (k1.length != k2.length) {\n return false;\n }\n for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n var /** @type {?} */ key = k1[i];\n if (m1[key] !== m2[key]) {\n return false;\n }\n }\n return true;\n };\n return StringMapWrapper;\n }());\n\n /**\n * A DI Token representing the main rendering context. In a browser this is the DOM Document.\n *\n * Note: Document might not be available in the Application Context when Application and Rendering\n * Contexts are not the same (e.g. when running the application into a Web Worker).\n *\n * @stable\n */\n var /** @type {?} */ DOCUMENT = new core.OpaqueToken('DocumentToken');\n\n /**\n * @stable\n */\n var /** @type {?} */ EVENT_MANAGER_PLUGINS = new core.OpaqueToken('EventManagerPlugins');\n /**\n * @stable\n */\n var EventManager = (function () {\n /**\n * @param {?} plugins\n * @param {?} _zone\n */\n function EventManager(plugins, _zone) {\n var _this = this;\n this._zone = _zone;\n this._eventNameToPlugin = new Map();\n plugins.forEach(function (p) { return p.manager = _this; });\n this._plugins = plugins.slice().reverse();\n }\n /**\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n EventManager.prototype.addEventListener = function (element, eventName, handler) {\n var /** @type {?} */ plugin = this._findPluginFor(eventName);\n return plugin.addEventListener(element, eventName, handler);\n };\n /**\n * @param {?} target\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {\n var /** @type {?} */ plugin = this._findPluginFor(eventName);\n return plugin.addGlobalEventListener(target, eventName, handler);\n };\n /**\n * @return {?}\n */\n EventManager.prototype.getZone = function () { return this._zone; };\n /**\n * @param {?} eventName\n * @return {?}\n */\n EventManager.prototype._findPluginFor = function (eventName) {\n var /** @type {?} */ plugin = this._eventNameToPlugin.get(eventName);\n if (plugin) {\n return plugin;\n }\n var /** @type {?} */ plugins = this._plugins;\n for (var /** @type {?} */ i = 0; i < plugins.length; i++) {\n var /** @type {?} */ plugin_1 = plugins[i];\n if (plugin_1.supports(eventName)) {\n this._eventNameToPlugin.set(eventName, plugin_1);\n return plugin_1;\n }\n }\n throw new Error(\"No event manager plugin found for event \" + eventName);\n };\n EventManager.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n EventManager.ctorParameters = function () { return [\n { type: Array, decorators: [{ type: core.Inject, args: [EVENT_MANAGER_PLUGINS,] },] },\n { type: core.NgZone, },\n ]; };\n return EventManager;\n }());\n /**\n * @abstract\n */\n var EventManagerPlugin = (function () {\n function EventManagerPlugin() {\n }\n /**\n * @abstract\n * @param {?} eventName\n * @return {?}\n */\n EventManagerPlugin.prototype.supports = function (eventName) { };\n /**\n * @abstract\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n EventManagerPlugin.prototype.addEventListener = function (element, eventName, handler) { };\n /**\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {\n var /** @type {?} */ target = getDOM().getGlobalEventTarget(element);\n if (!target) {\n throw new Error(\"Unsupported event target \" + target + \" for event \" + eventName);\n }\n return this.addEventListener(target, eventName, handler);\n };\n ;\n return EventManagerPlugin;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$4 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var SharedStylesHost = (function () {\n function SharedStylesHost() {\n /** @internal */\n this._styles = [];\n /** @internal */\n this._stylesSet = new Set();\n }\n /**\n * @param {?} styles\n * @return {?}\n */\n SharedStylesHost.prototype.addStyles = function (styles) {\n var _this = this;\n var /** @type {?} */ additions = [];\n styles.forEach(function (style) {\n if (!_this._stylesSet.has(style)) {\n _this._stylesSet.add(style);\n _this._styles.push(style);\n additions.push(style);\n }\n });\n this.onStylesAdded(additions);\n };\n /**\n * @param {?} additions\n * @return {?}\n */\n SharedStylesHost.prototype.onStylesAdded = function (additions) { };\n /**\n * @return {?}\n */\n SharedStylesHost.prototype.getAllStyles = function () { return this._styles; };\n SharedStylesHost.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n SharedStylesHost.ctorParameters = function () { return []; };\n return SharedStylesHost;\n }());\n var DomSharedStylesHost = (function (_super) {\n __extends$4(DomSharedStylesHost, _super);\n /**\n * @param {?} doc\n */\n function DomSharedStylesHost(doc) {\n _super.call(this);\n this._hostNodes = new Set();\n this._hostNodes.add(doc.head);\n }\n /**\n * @param {?} styles\n * @param {?} host\n * @return {?}\n */\n DomSharedStylesHost.prototype._addStylesToHost = function (styles, host) {\n for (var /** @type {?} */ i = 0; i < styles.length; i++) {\n var /** @type {?} */ styleEl = document.createElement('style');\n styleEl.textContent = styles[i];\n host.appendChild(styleEl);\n }\n };\n /**\n * @param {?} hostNode\n * @return {?}\n */\n DomSharedStylesHost.prototype.addHost = function (hostNode) {\n this._addStylesToHost(this._styles, hostNode);\n this._hostNodes.add(hostNode);\n };\n /**\n * @param {?} hostNode\n * @return {?}\n */\n DomSharedStylesHost.prototype.removeHost = function (hostNode) { this._hostNodes.delete(hostNode); };\n /**\n * @param {?} additions\n * @return {?}\n */\n DomSharedStylesHost.prototype.onStylesAdded = function (additions) {\n var _this = this;\n this._hostNodes.forEach(function (hostNode) { _this._addStylesToHost(additions, hostNode); });\n };\n DomSharedStylesHost.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n DomSharedStylesHost.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: core.Inject, args: [DOCUMENT,] },] },\n ]; };\n return DomSharedStylesHost;\n }(SharedStylesHost));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$3 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ NAMESPACE_URIS = {\n 'xlink': 'http://www.w3.org/1999/xlink',\n 'svg': 'http://www.w3.org/2000/svg',\n 'xhtml': 'http://www.w3.org/1999/xhtml'\n };\n var /** @type {?} */ TEMPLATE_COMMENT_TEXT = 'template bindings={}';\n var /** @type {?} */ TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/;\n /**\n * @abstract\n */\n var DomRootRenderer = (function () {\n /**\n * @param {?} document\n * @param {?} eventManager\n * @param {?} sharedStylesHost\n * @param {?} animationDriver\n * @param {?} appId\n */\n function DomRootRenderer(document, eventManager, sharedStylesHost, animationDriver, appId) {\n this.document = document;\n this.eventManager = eventManager;\n this.sharedStylesHost = sharedStylesHost;\n this.animationDriver = animationDriver;\n this.appId = appId;\n this.registeredComponents = new Map();\n }\n /**\n * @param {?} componentProto\n * @return {?}\n */\n DomRootRenderer.prototype.renderComponent = function (componentProto) {\n var /** @type {?} */ renderer = this.registeredComponents.get(componentProto.id);\n if (!renderer) {\n renderer = new DomRenderer(this, componentProto, this.animationDriver, this.appId + \"-\" + componentProto.id);\n this.registeredComponents.set(componentProto.id, renderer);\n }\n return renderer;\n };\n return DomRootRenderer;\n }());\n var DomRootRenderer_ = (function (_super) {\n __extends$3(DomRootRenderer_, _super);\n /**\n * @param {?} _document\n * @param {?} _eventManager\n * @param {?} sharedStylesHost\n * @param {?} animationDriver\n * @param {?} appId\n */\n function DomRootRenderer_(_document, _eventManager, sharedStylesHost, animationDriver, appId) {\n _super.call(this, _document, _eventManager, sharedStylesHost, animationDriver, appId);\n }\n DomRootRenderer_.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n DomRootRenderer_.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: core.Inject, args: [DOCUMENT,] },] },\n { type: EventManager, },\n { type: DomSharedStylesHost, },\n { type: AnimationDriver, },\n { type: undefined, decorators: [{ type: core.Inject, args: [core.APP_ID,] },] },\n ]; };\n return DomRootRenderer_;\n }(DomRootRenderer));\n var /** @type {?} */ DIRECT_DOM_RENDERER = {\n /**\n * @param {?} node\n * @return {?}\n */\n remove: function (node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n },\n /**\n * @param {?} node\n * @param {?} parent\n * @return {?}\n */\n appendChild: function (node, parent) { parent.appendChild(node); },\n /**\n * @param {?} node\n * @param {?} refNode\n * @return {?}\n */\n insertBefore: function (node, refNode) { refNode.parentNode.insertBefore(node, refNode); },\n /**\n * @param {?} node\n * @return {?}\n */\n nextSibling: function (node) { return node.nextSibling; },\n /**\n * @param {?} node\n * @return {?}\n */\n parentElement: function (node) { return (node.parentNode); }\n };\n var DomRenderer = (function () {\n /**\n * @param {?} _rootRenderer\n * @param {?} componentProto\n * @param {?} _animationDriver\n * @param {?} styleShimId\n */\n function DomRenderer(_rootRenderer, componentProto, _animationDriver, styleShimId) {\n this._rootRenderer = _rootRenderer;\n this.componentProto = componentProto;\n this._animationDriver = _animationDriver;\n this.directRenderer = DIRECT_DOM_RENDERER;\n this._styles = flattenStyles(styleShimId, componentProto.styles, []);\n if (componentProto.encapsulation !== core.ViewEncapsulation.Native) {\n this._rootRenderer.sharedStylesHost.addStyles(this._styles);\n }\n if (this.componentProto.encapsulation === core.ViewEncapsulation.Emulated) {\n this._contentAttr = shimContentAttribute(styleShimId);\n this._hostAttr = shimHostAttribute(styleShimId);\n }\n else {\n this._contentAttr = null;\n this._hostAttr = null;\n }\n }\n /**\n * @param {?} selectorOrNode\n * @param {?} debugInfo\n * @return {?}\n */\n DomRenderer.prototype.selectRootElement = function (selectorOrNode, debugInfo) {\n var /** @type {?} */ el;\n if (typeof selectorOrNode === 'string') {\n el = this._rootRenderer.document.querySelector(selectorOrNode);\n if (!el) {\n throw new Error(\"The selector \\\"\" + selectorOrNode + \"\\\" did not match any elements\");\n }\n }\n else {\n el = selectorOrNode;\n }\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n return el;\n };\n /**\n * @param {?} parent\n * @param {?} name\n * @param {?} debugInfo\n * @return {?}\n */\n DomRenderer.prototype.createElement = function (parent, name, debugInfo) {\n var /** @type {?} */ el;\n if (isNamespaced(name)) {\n var /** @type {?} */ nsAndName = splitNamespace(name);\n el = document.createElementNS((NAMESPACE_URIS)[nsAndName[0]], nsAndName[1]);\n }\n else {\n el = document.createElement(name);\n }\n if (this._contentAttr) {\n el.setAttribute(this._contentAttr, '');\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n };\n /**\n * @param {?} hostElement\n * @return {?}\n */\n DomRenderer.prototype.createViewRoot = function (hostElement) {\n var /** @type {?} */ nodesParent;\n if (this.componentProto.encapsulation === core.ViewEncapsulation.Native) {\n nodesParent = ((hostElement)).createShadowRoot();\n this._rootRenderer.sharedStylesHost.addHost(nodesParent);\n for (var /** @type {?} */ i = 0; i < this._styles.length; i++) {\n var /** @type {?} */ styleEl = document.createElement('style');\n styleEl.textContent = this._styles[i];\n nodesParent.appendChild(styleEl);\n }\n }\n else {\n if (this._hostAttr) {\n hostElement.setAttribute(this._hostAttr, '');\n }\n nodesParent = hostElement;\n }\n return nodesParent;\n };\n /**\n * @param {?} parentElement\n * @param {?} debugInfo\n * @return {?}\n */\n DomRenderer.prototype.createTemplateAnchor = function (parentElement, debugInfo) {\n var /** @type {?} */ comment = document.createComment(TEMPLATE_COMMENT_TEXT);\n if (parentElement) {\n parentElement.appendChild(comment);\n }\n return comment;\n };\n /**\n * @param {?} parentElement\n * @param {?} value\n * @param {?} debugInfo\n * @return {?}\n */\n DomRenderer.prototype.createText = function (parentElement, value, debugInfo) {\n var /** @type {?} */ node = document.createTextNode(value);\n if (parentElement) {\n parentElement.appendChild(node);\n }\n return node;\n };\n /**\n * @param {?} parentElement\n * @param {?} nodes\n * @return {?}\n */\n DomRenderer.prototype.projectNodes = function (parentElement, nodes) {\n if (!parentElement)\n return;\n appendNodes(parentElement, nodes);\n };\n /**\n * @param {?} node\n * @param {?} viewRootNodes\n * @return {?}\n */\n DomRenderer.prototype.attachViewAfter = function (node, viewRootNodes) { moveNodesAfterSibling(node, viewRootNodes); };\n /**\n * @param {?} viewRootNodes\n * @return {?}\n */\n DomRenderer.prototype.detachView = function (viewRootNodes) {\n for (var /** @type {?} */ i = 0; i < viewRootNodes.length; i++) {\n var /** @type {?} */ node = viewRootNodes[i];\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n };\n /**\n * @param {?} hostElement\n * @param {?} viewAllNodes\n * @return {?}\n */\n DomRenderer.prototype.destroyView = function (hostElement, viewAllNodes) {\n if (this.componentProto.encapsulation === core.ViewEncapsulation.Native && hostElement) {\n this._rootRenderer.sharedStylesHost.removeHost(((hostElement)).shadowRoot);\n }\n };\n /**\n * @param {?} renderElement\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n DomRenderer.prototype.listen = function (renderElement, name, callback) {\n return this._rootRenderer.eventManager.addEventListener(renderElement, name, decoratePreventDefault(callback));\n };\n /**\n * @param {?} target\n * @param {?} name\n * @param {?} callback\n * @return {?}\n */\n DomRenderer.prototype.listenGlobal = function (target, name, callback) {\n return this._rootRenderer.eventManager.addGlobalEventListener(target, name, decoratePreventDefault(callback));\n };\n /**\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n DomRenderer.prototype.setElementProperty = function (renderElement, propertyName, propertyValue) {\n ((renderElement))[propertyName] = propertyValue;\n };\n /**\n * @param {?} renderElement\n * @param {?} attributeName\n * @param {?} attributeValue\n * @return {?}\n */\n DomRenderer.prototype.setElementAttribute = function (renderElement, attributeName, attributeValue) {\n var /** @type {?} */ attrNs;\n var /** @type {?} */ attrNameWithoutNs = attributeName;\n if (isNamespaced(attributeName)) {\n var /** @type {?} */ nsAndName = splitNamespace(attributeName);\n attrNameWithoutNs = nsAndName[1];\n attributeName = nsAndName[0] + ':' + nsAndName[1];\n attrNs = NAMESPACE_URIS[nsAndName[0]];\n }\n if (isPresent(attributeValue)) {\n if (attrNs) {\n renderElement.setAttributeNS(attrNs, attributeName, attributeValue);\n }\n else {\n renderElement.setAttribute(attributeName, attributeValue);\n }\n }\n else {\n if (isPresent(attrNs)) {\n renderElement.removeAttributeNS(attrNs, attrNameWithoutNs);\n }\n else {\n renderElement.removeAttribute(attributeName);\n }\n }\n };\n /**\n * @param {?} renderElement\n * @param {?} propertyName\n * @param {?} propertyValue\n * @return {?}\n */\n DomRenderer.prototype.setBindingDebugInfo = function (renderElement, propertyName, propertyValue) {\n if (renderElement.nodeType === Node.COMMENT_NODE) {\n var /** @type {?} */ existingBindings = renderElement.nodeValue.replace(/\\n/g, '').match(TEMPLATE_BINDINGS_EXP);\n var /** @type {?} */ parsedBindings = JSON.parse(existingBindings[1]);\n parsedBindings[propertyName] = propertyValue;\n renderElement.nodeValue =\n TEMPLATE_COMMENT_TEXT.replace('{}', JSON.stringify(parsedBindings, null, 2));\n }\n else {\n this.setElementAttribute(renderElement, propertyName, propertyValue);\n }\n };\n /**\n * @param {?} renderElement\n * @param {?} className\n * @param {?} isAdd\n * @return {?}\n */\n DomRenderer.prototype.setElementClass = function (renderElement, className, isAdd) {\n if (isAdd) {\n renderElement.classList.add(className);\n }\n else {\n renderElement.classList.remove(className);\n }\n };\n /**\n * @param {?} renderElement\n * @param {?} styleName\n * @param {?} styleValue\n * @return {?}\n */\n DomRenderer.prototype.setElementStyle = function (renderElement, styleName, styleValue) {\n if (isPresent(styleValue)) {\n ((renderElement.style))[styleName] = stringify(styleValue);\n }\n else {\n // IE requires '' instead of null\n // see https://github.com/angular/angular/issues/7916\n ((renderElement.style))[styleName] = '';\n }\n };\n /**\n * @param {?} renderElement\n * @param {?} methodName\n * @param {?} args\n * @return {?}\n */\n DomRenderer.prototype.invokeElementMethod = function (renderElement, methodName, args) {\n ((renderElement))[methodName].apply(renderElement, args);\n };\n /**\n * @param {?} renderNode\n * @param {?} text\n * @return {?}\n */\n DomRenderer.prototype.setText = function (renderNode, text) { renderNode.nodeValue = text; };\n /**\n * @param {?} element\n * @param {?} startingStyles\n * @param {?} keyframes\n * @param {?} duration\n * @param {?} delay\n * @param {?} easing\n * @param {?=} previousPlayers\n * @return {?}\n */\n DomRenderer.prototype.animate = function (element, startingStyles, keyframes, duration, delay, easing, previousPlayers) {\n if (previousPlayers === void 0) { previousPlayers = []; }\n try {\n return this._animationDriver.animate(element, startingStyles, keyframes, duration, delay, easing, previousPlayers);\n }\n catch (e) {\n return new NoOpAnimationPlayer();\n }\n };\n return DomRenderer;\n }());\n /**\n * @param {?} sibling\n * @param {?} nodes\n * @return {?}\n */\n function moveNodesAfterSibling(sibling, nodes) {\n var /** @type {?} */ parent = sibling.parentNode;\n if (nodes.length > 0 && parent) {\n var /** @type {?} */ nextSibling = sibling.nextSibling;\n if (nextSibling) {\n for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n parent.insertBefore(nodes[i], nextSibling);\n }\n }\n else {\n for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n parent.appendChild(nodes[i]);\n }\n }\n }\n }\n /**\n * @param {?} parent\n * @param {?} nodes\n * @return {?}\n */\n function appendNodes(parent, nodes) {\n for (var /** @type {?} */ i = 0; i < nodes.length; i++) {\n parent.appendChild(nodes[i]);\n }\n }\n /**\n * @param {?} eventHandler\n * @return {?}\n */\n function decoratePreventDefault(eventHandler) {\n return function (event) {\n var /** @type {?} */ allowDefaultBehavior = eventHandler(event);\n if (allowDefaultBehavior === false) {\n // TODO(tbosch): move preventDefault into event plugins...\n event.preventDefault();\n event.returnValue = false;\n }\n };\n }\n var /** @type {?} */ COMPONENT_REGEX = /%COMP%/g;\n var /** @type {?} */ COMPONENT_VARIABLE = '%COMP%';\n var /** @type {?} */ HOST_ATTR = \"_nghost-\" + COMPONENT_VARIABLE;\n var /** @type {?} */ CONTENT_ATTR = \"_ngcontent-\" + COMPONENT_VARIABLE;\n /**\n * @param {?} componentShortId\n * @return {?}\n */\n function shimContentAttribute(componentShortId) {\n return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);\n }\n /**\n * @param {?} componentShortId\n * @return {?}\n */\n function shimHostAttribute(componentShortId) {\n return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);\n }\n /**\n * @param {?} compId\n * @param {?} styles\n * @param {?} target\n * @return {?}\n */\n function flattenStyles(compId, styles, target) {\n for (var /** @type {?} */ i = 0; i < styles.length; i++) {\n var /** @type {?} */ style = styles[i];\n if (Array.isArray(style)) {\n flattenStyles(compId, style, target);\n }\n else {\n style = style.replace(COMPONENT_REGEX, compId);\n target.push(style);\n }\n }\n return target;\n }\n var /** @type {?} */ NS_PREFIX_RE = /^:([^:]+):(.+)$/;\n /**\n * @param {?} name\n * @return {?}\n */\n function isNamespaced(name) {\n return name[0] === ':';\n }\n /**\n * @param {?} name\n * @return {?}\n */\n function splitNamespace(name) {\n var /** @type {?} */ match = name.match(NS_PREFIX_RE);\n return [match[1], match[2]];\n }\n\n var /** @type {?} */ CORE_TOKENS = {\n 'ApplicationRef': core.ApplicationRef,\n 'NgZone': core.NgZone,\n };\n var /** @type {?} */ INSPECT_GLOBAL_NAME = 'ng.probe';\n var /** @type {?} */ CORE_TOKENS_GLOBAL_NAME = 'ng.coreTokens';\n /**\n * Returns a {@link DebugElement} for the given native DOM element, or\n * null if the given native element does not have an Angular view associated\n * with it.\n * @param {?} element\n * @return {?}\n */\n function inspectNativeElement(element) {\n return core.getDebugNode(element);\n }\n /**\n * Deprecated. Use the one from '@angular/core'.\n * @deprecated\n */\n var NgProbeToken = (function () {\n /**\n * @param {?} name\n * @param {?} token\n */\n function NgProbeToken(name, token) {\n this.name = name;\n this.token = token;\n }\n return NgProbeToken;\n }());\n /**\n * @param {?} rootRenderer\n * @param {?} extraTokens\n * @param {?} coreTokens\n * @return {?}\n */\n function _createConditionalRootRenderer(rootRenderer, extraTokens, coreTokens) {\n return core.isDevMode() ?\n _createRootRenderer(rootRenderer, (extraTokens || []).concat(coreTokens || [])) :\n rootRenderer;\n }\n /**\n * @param {?} rootRenderer\n * @param {?} extraTokens\n * @return {?}\n */\n function _createRootRenderer(rootRenderer, extraTokens) {\n getDOM().setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement);\n getDOM().setGlobalVar(CORE_TOKENS_GLOBAL_NAME, StringMapWrapper.merge(CORE_TOKENS, _ngProbeTokensToMap(extraTokens || [])));\n return new DebugDomRootRenderer(rootRenderer);\n }\n /**\n * @param {?} tokens\n * @return {?}\n */\n function _ngProbeTokensToMap(tokens) {\n return tokens.reduce(function (prev, t) { return (prev[t.name] = t.token, prev); }, {});\n }\n /**\n * Providers which support debugging Angular applications (e.g. via `ng.probe`).\n */\n var /** @type {?} */ ELEMENT_PROBE_PROVIDERS = [{\n provide: core.RootRenderer,\n useFactory: _createConditionalRootRenderer,\n deps: [\n DomRootRenderer, [NgProbeToken, new core.Optional()],\n [core.NgProbeToken, new core.Optional()]\n ]\n }];\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$5 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var DomEventsPlugin = (function (_super) {\n __extends$5(DomEventsPlugin, _super);\n function DomEventsPlugin() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} eventName\n * @return {?}\n */\n DomEventsPlugin.prototype.supports = function (eventName) { return true; };\n /**\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n element.addEventListener(eventName, /** @type {?} */ (handler), false);\n return function () { return element.removeEventListener(eventName, /** @type {?} */ (handler), false); };\n };\n DomEventsPlugin.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n DomEventsPlugin.ctorParameters = function () { return []; };\n return DomEventsPlugin;\n }(EventManagerPlugin));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$6 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ EVENT_NAMES = {\n // pan\n 'pan': true,\n 'panstart': true,\n 'panmove': true,\n 'panend': true,\n 'pancancel': true,\n 'panleft': true,\n 'panright': true,\n 'panup': true,\n 'pandown': true,\n // pinch\n 'pinch': true,\n 'pinchstart': true,\n 'pinchmove': true,\n 'pinchend': true,\n 'pinchcancel': true,\n 'pinchin': true,\n 'pinchout': true,\n // press\n 'press': true,\n 'pressup': true,\n // rotate\n 'rotate': true,\n 'rotatestart': true,\n 'rotatemove': true,\n 'rotateend': true,\n 'rotatecancel': true,\n // swipe\n 'swipe': true,\n 'swipeleft': true,\n 'swiperight': true,\n 'swipeup': true,\n 'swipedown': true,\n // tap\n 'tap': true,\n };\n /**\n * A DI token that you can use to provide{@link HammerGestureConfig} to Angular. Use it to configure\n * Hammer gestures.\n *\n * @experimental\n */\n var /** @type {?} */ HAMMER_GESTURE_CONFIG = new core.OpaqueToken('HammerGestureConfig');\n /**\n * @experimental\n */\n var HammerGestureConfig = (function () {\n function HammerGestureConfig() {\n this.events = [];\n this.overrides = {};\n }\n /**\n * @param {?} element\n * @return {?}\n */\n HammerGestureConfig.prototype.buildHammer = function (element) {\n var /** @type {?} */ mc = new Hammer(element);\n mc.get('pinch').set({ enable: true });\n mc.get('rotate').set({ enable: true });\n for (var eventName in this.overrides) {\n mc.get(eventName).set(this.overrides[eventName]);\n }\n return mc;\n };\n HammerGestureConfig.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n HammerGestureConfig.ctorParameters = function () { return []; };\n return HammerGestureConfig;\n }());\n var HammerGesturesPlugin = (function (_super) {\n __extends$6(HammerGesturesPlugin, _super);\n /**\n * @param {?} _config\n */\n function HammerGesturesPlugin(_config) {\n _super.call(this);\n this._config = _config;\n }\n /**\n * @param {?} eventName\n * @return {?}\n */\n HammerGesturesPlugin.prototype.supports = function (eventName) {\n if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {\n return false;\n }\n if (!((window)).Hammer) {\n throw new Error(\"Hammer.js is not loaded, can not bind \" + eventName + \" event\");\n }\n return true;\n };\n /**\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {\n var _this = this;\n var /** @type {?} */ zone = this.manager.getZone();\n eventName = eventName.toLowerCase();\n return zone.runOutsideAngular(function () {\n // Creating the manager bind events, must be done outside of angular\n var /** @type {?} */ mc = _this._config.buildHammer(element);\n var /** @type {?} */ callback = function (eventObj) {\n zone.runGuarded(function () { handler(eventObj); });\n };\n mc.on(eventName, callback);\n return function () { return mc.off(eventName, callback); };\n });\n };\n /**\n * @param {?} eventName\n * @return {?}\n */\n HammerGesturesPlugin.prototype.isCustomEvent = function (eventName) { return this._config.events.indexOf(eventName) > -1; };\n HammerGesturesPlugin.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n HammerGesturesPlugin.ctorParameters = function () { return [\n { type: HammerGestureConfig, decorators: [{ type: core.Inject, args: [HAMMER_GESTURE_CONFIG,] },] },\n ]; };\n return HammerGesturesPlugin;\n }(EventManagerPlugin));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$7 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ MODIFIER_KEYS = ['alt', 'control', 'meta', 'shift'];\n var /** @type {?} */ MODIFIER_KEY_GETTERS = {\n 'alt': function (event) { return event.altKey; },\n 'control': function (event) { return event.ctrlKey; },\n 'meta': function (event) { return event.metaKey; },\n 'shift': function (event) { return event.shiftKey; }\n };\n /**\n * @experimental\n */\n var KeyEventsPlugin = (function (_super) {\n __extends$7(KeyEventsPlugin, _super);\n function KeyEventsPlugin() {\n _super.call(this);\n }\n /**\n * @param {?} eventName\n * @return {?}\n */\n KeyEventsPlugin.prototype.supports = function (eventName) { return KeyEventsPlugin.parseEventName(eventName) != null; };\n /**\n * @param {?} element\n * @param {?} eventName\n * @param {?} handler\n * @return {?}\n */\n KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {\n var /** @type {?} */ parsedEvent = KeyEventsPlugin.parseEventName(eventName);\n var /** @type {?} */ outsideHandler = KeyEventsPlugin.eventCallback(parsedEvent['fullKey'], handler, this.manager.getZone());\n return this.manager.getZone().runOutsideAngular(function () {\n return getDOM().onAndCancel(element, parsedEvent['domEventName'], outsideHandler);\n });\n };\n /**\n * @param {?} eventName\n * @return {?}\n */\n KeyEventsPlugin.parseEventName = function (eventName) {\n var /** @type {?} */ parts = eventName.toLowerCase().split('.');\n var /** @type {?} */ domEventName = parts.shift();\n if ((parts.length === 0) || !(domEventName === 'keydown' || domEventName === 'keyup')) {\n return null;\n }\n var /** @type {?} */ key = KeyEventsPlugin._normalizeKey(parts.pop());\n var /** @type {?} */ fullKey = '';\n MODIFIER_KEYS.forEach(function (modifierName) {\n var /** @type {?} */ index = parts.indexOf(modifierName);\n if (index > -1) {\n parts.splice(index, 1);\n fullKey += modifierName + '.';\n }\n });\n fullKey += key;\n if (parts.length != 0 || key.length === 0) {\n // returning null instead of throwing to let another plugin process the event\n return null;\n }\n var /** @type {?} */ result = {};\n result['domEventName'] = domEventName;\n result['fullKey'] = fullKey;\n return result;\n };\n /**\n * @param {?} event\n * @return {?}\n */\n KeyEventsPlugin.getEventFullKey = function (event) {\n var /** @type {?} */ fullKey = '';\n var /** @type {?} */ key = getDOM().getEventKey(event);\n key = key.toLowerCase();\n if (key === ' ') {\n key = 'space'; // for readability\n }\n else if (key === '.') {\n key = 'dot'; // because '.' is used as a separator in event names\n }\n MODIFIER_KEYS.forEach(function (modifierName) {\n if (modifierName != key) {\n var /** @type {?} */ modifierGetter = MODIFIER_KEY_GETTERS[modifierName];\n if (modifierGetter(event)) {\n fullKey += modifierName + '.';\n }\n }\n });\n fullKey += key;\n return fullKey;\n };\n /**\n * @param {?} fullKey\n * @param {?} handler\n * @param {?} zone\n * @return {?}\n */\n KeyEventsPlugin.eventCallback = function (fullKey, handler, zone) {\n return function (event /** TODO #9100 */) {\n if (KeyEventsPlugin.getEventFullKey(event) === fullKey) {\n zone.runGuarded(function () { return handler(event); });\n }\n };\n };\n /**\n * @param {?} keyName\n * @return {?}\n */\n KeyEventsPlugin._normalizeKey = function (keyName) {\n // TODO: switch to a Map if the mapping grows too much\n switch (keyName) {\n case 'esc':\n return 'escape';\n default:\n return keyName;\n }\n };\n KeyEventsPlugin.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n KeyEventsPlugin.ctorParameters = function () { return []; };\n return KeyEventsPlugin;\n }(EventManagerPlugin));\n\n /**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * This regular expression matches a subset of URLs that will not cause script\n * execution if used in URL context within a HTML document. Specifically, this\n * regular expression matches if (comment from here on and regex copied from\n * Soy's EscapingConventions):\n * (1) Either a protocol in a whitelist (http, https, mailto or ftp).\n * (2) or no protocol. A protocol must be followed by a colon. The below\n * allows that by allowing colons only after one of the characters [/?#].\n * A colon after a hash (#) must be in the fragment.\n * Otherwise, a colon after a (?) must be in a query.\n * Otherwise, a colon after a single solidus (/) must be in a path.\n * Otherwise, a colon after a double solidus (//) must be in the authority\n * (before port).\n *\n * The pattern disallows &, used in HTML entity declarations before\n * one of the characters in [/?#]. This disallows HTML entities used in the\n * protocol name, which should never happen, e.g. \"h&#116;tp\" for \"http\".\n * It also disallows HTML entities in the first path part of a relative path,\n * e.g. \"foo&lt;bar/baz\". Our existing escaping functions should not produce\n * that. More importantly, it disallows masking of a colon,\n * e.g. \"javascript&#58;...\".\n *\n * This regular expression was taken from the Closure sanitization library.\n */\n var /** @type {?} */ SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n /** A pattern that matches safe data URLs. Only matches image, video and audio types. */\n var /** @type {?} */ DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\\/]+=*$/i;\n /**\n * @param {?} url\n * @return {?}\n */\n function sanitizeUrl(url) {\n url = String(url);\n if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN))\n return url;\n if (core.isDevMode()) {\n getDOM().log(\"WARNING: sanitizing unsafe URL value \" + url + \" (see http://g.co/ng/security#xss)\");\n }\n return 'unsafe:' + url;\n }\n /**\n * @param {?} srcset\n * @return {?}\n */\n function sanitizeSrcset(srcset) {\n srcset = String(srcset);\n return srcset.split(',').map(function (srcset) { return sanitizeUrl(srcset.trim()); }).join(', ');\n }\n\n /** A <body> element that can be safely used to parse untrusted HTML. Lazily initialized below. */\n var /** @type {?} */ inertElement = null;\n /** Lazily initialized to make sure the DOM adapter gets set before use. */\n var /** @type {?} */ DOM = null;\n /**\n * Returns an HTML element that is guaranteed to not execute code when creating elements in it.\n * @return {?}\n */\n function getInertElement() {\n if (inertElement)\n return inertElement;\n DOM = getDOM();\n // Prefer using <template> element if supported.\n var /** @type {?} */ templateEl = DOM.createElement('template');\n if ('content' in templateEl)\n return templateEl;\n var /** @type {?} */ doc = DOM.createHtmlDocument();\n inertElement = DOM.querySelector(doc, 'body');\n if (inertElement == null) {\n // usually there should be only one body element in the document, but IE doesn't have any, so we\n // need to create one.\n var /** @type {?} */ html = DOM.createElement('html', doc);\n inertElement = DOM.createElement('body', doc);\n DOM.appendChild(html, inertElement);\n DOM.appendChild(doc, html);\n }\n return inertElement;\n }\n /**\n * @param {?} tags\n * @return {?}\n */\n function tagSet(tags) {\n var /** @type {?} */ res = {};\n for (var _i = 0, _a = tags.split(','); _i < _a.length; _i++) {\n var t = _a[_i];\n res[t] = true;\n }\n return res;\n }\n /**\n * @param {...?} sets\n * @return {?}\n */\n function merge() {\n var sets = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sets[_i - 0] = arguments[_i];\n }\n var /** @type {?} */ res = {};\n for (var _a = 0, sets_1 = sets; _a < sets_1.length; _a++) {\n var s = sets_1[_a];\n for (var v in s) {\n if (s.hasOwnProperty(v))\n res[v] = true;\n }\n }\n return res;\n }\n // Good source of info about elements and attributes\n // http://dev.w3.org/html5/spec/Overview.html#semantics\n // http://simon.html5.org/html-elements\n // Safe Void Elements - HTML5\n // http://dev.w3.org/html5/spec/Overview.html#void-elements\n var /** @type {?} */ VOID_ELEMENTS = tagSet('area,br,col,hr,img,wbr');\n // Elements that you can, intentionally, leave open (and which close themselves)\n // http://dev.w3.org/html5/spec/Overview.html#optional-tags\n var /** @type {?} */ OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr');\n var /** @type {?} */ OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet('rp,rt');\n var /** @type {?} */ OPTIONAL_END_TAG_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);\n // Safe Block Elements - HTML5\n var /** @type {?} */ BLOCK_ELEMENTS = merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet('address,article,' +\n 'aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +\n 'h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul'));\n // Inline Elements - HTML5\n var /** @type {?} */ INLINE_ELEMENTS = merge(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet('a,abbr,acronym,audio,b,' +\n 'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,' +\n 'samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video'));\n var /** @type {?} */ VALID_ELEMENTS = merge(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);\n // Attributes that have href and hence need to be sanitized\n var /** @type {?} */ URI_ATTRS = tagSet('background,cite,href,itemtype,longdesc,poster,src,xlink:href');\n // Attributes that have special href set hence need to be sanitized\n var /** @type {?} */ SRCSET_ATTRS = tagSet('srcset');\n var /** @type {?} */ HTML_ATTRS = tagSet('abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,' +\n 'compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,' +\n 'ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,' +\n 'scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,' +\n 'valign,value,vspace,width');\n // NB: This currently conciously doesn't support SVG. SVG sanitization has had several security\n // issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via\n // innerHTML is required, SVG attributes should be added here.\n // NB: Sanitization does not allow <form> elements or other active elements (<button> etc). Those\n // can be sanitized, but they increase security surface area without a legitimate use case, so they\n // are left out here.\n var /** @type {?} */ VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS);\n /**\n * SanitizingHtmlSerializer serializes a DOM fragment, stripping out any unsafe elements and unsafe\n * attributes.\n */\n var SanitizingHtmlSerializer = (function () {\n function SanitizingHtmlSerializer() {\n this.sanitizedSomething = false;\n this.buf = [];\n }\n /**\n * @param {?} el\n * @return {?}\n */\n SanitizingHtmlSerializer.prototype.sanitizeChildren = function (el) {\n // This cannot use a TreeWalker, as it has to run on Angular's various DOM adapters.\n // However this code never accesses properties off of `document` before deleting its contents\n // again, so it shouldn't be vulnerable to DOM clobbering.\n var /** @type {?} */ current = el.firstChild;\n while (current) {\n if (DOM.isElementNode(current)) {\n this.startElement(/** @type {?} */ (current));\n }\n else if (DOM.isTextNode(current)) {\n this.chars(DOM.nodeValue(current));\n }\n else {\n // Strip non-element, non-text nodes.\n this.sanitizedSomething = true;\n }\n if (DOM.firstChild(current)) {\n current = DOM.firstChild(current);\n continue;\n }\n while (current) {\n // Leaving the element. Walk up and to the right, closing tags as we go.\n if (DOM.isElementNode(current)) {\n this.endElement(/** @type {?} */ (current));\n }\n if (DOM.nextSibling(current)) {\n current = DOM.nextSibling(current);\n break;\n }\n current = DOM.parentElement(current);\n }\n }\n return this.buf.join('');\n };\n /**\n * @param {?} element\n * @return {?}\n */\n SanitizingHtmlSerializer.prototype.startElement = function (element) {\n var _this = this;\n var /** @type {?} */ tagName = DOM.nodeName(element).toLowerCase();\n if (!VALID_ELEMENTS.hasOwnProperty(tagName)) {\n this.sanitizedSomething = true;\n return;\n }\n this.buf.push('<');\n this.buf.push(tagName);\n DOM.attributeMap(element).forEach(function (value, attrName) {\n var /** @type {?} */ lower = attrName.toLowerCase();\n if (!VALID_ATTRS.hasOwnProperty(lower)) {\n _this.sanitizedSomething = true;\n return;\n }\n // TODO(martinprobst): Special case image URIs for data:image/...\n if (URI_ATTRS[lower])\n value = sanitizeUrl(value);\n if (SRCSET_ATTRS[lower])\n value = sanitizeSrcset(value);\n _this.buf.push(' ');\n _this.buf.push(attrName);\n _this.buf.push('=\"');\n _this.buf.push(encodeEntities(value));\n _this.buf.push('\"');\n });\n this.buf.push('>');\n };\n /**\n * @param {?} current\n * @return {?}\n */\n SanitizingHtmlSerializer.prototype.endElement = function (current) {\n var /** @type {?} */ tagName = DOM.nodeName(current).toLowerCase();\n if (VALID_ELEMENTS.hasOwnProperty(tagName) && !VOID_ELEMENTS.hasOwnProperty(tagName)) {\n this.buf.push('</');\n this.buf.push(tagName);\n this.buf.push('>');\n }\n };\n /**\n * @param {?} chars\n * @return {?}\n */\n SanitizingHtmlSerializer.prototype.chars = function (chars /** TODO #9100 */) { this.buf.push(encodeEntities(chars)); };\n return SanitizingHtmlSerializer;\n }());\n // Regular Expressions for parsing tags and attributes\n var /** @type {?} */ SURROGATE_PAIR_REGEXP = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n // ! to ~ is the ASCII range.\n var /** @type {?} */ NON_ALPHANUMERIC_REGEXP = /([^\\#-~ |!])/g;\n /**\n * Escapes all potentially dangerous characters, so that the\n * resulting string can be safely inserted into attribute or\n * element text.\n * @param {?} value\n * @return {?}\n */\n function encodeEntities(value) {\n return value.replace(/&/g, '&amp;')\n .replace(SURROGATE_PAIR_REGEXP, function (match) {\n var /** @type {?} */ hi = match.charCodeAt(0);\n var /** @type {?} */ low = match.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n })\n .replace(NON_ALPHANUMERIC_REGEXP, function (match) { return '&#' + match.charCodeAt(0) + ';'; })\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n /**\n * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1'\n * attribute to declare ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo').\n * *\n * This is undesirable since we don't want to allow any of these custom attributes. This method\n * strips them all.\n * @param {?} el\n * @return {?}\n */\n function stripCustomNsAttrs(el) {\n DOM.attributeMap(el).forEach(function (_, attrName) {\n if (attrName === 'xmlns:ns1' || attrName.indexOf('ns1:') === 0) {\n DOM.removeAttribute(el, attrName);\n }\n });\n for (var _i = 0, _a = DOM.childNodesAsList(el); _i < _a.length; _i++) {\n var n = _a[_i];\n if (DOM.isElementNode(n))\n stripCustomNsAttrs(/** @type {?} */ (n));\n }\n }\n /**\n * Sanitizes the given unsafe, untrusted HTML fragment, and returns HTML text that is safe to add to\n * the DOM in a browser environment.\n * @param {?} unsafeHtmlInput\n * @return {?}\n */\n function sanitizeHtml(unsafeHtmlInput) {\n try {\n var /** @type {?} */ containerEl = getInertElement();\n // Make sure unsafeHtml is actually a string (TypeScript types are not enforced at runtime).\n var /** @type {?} */ unsafeHtml = unsafeHtmlInput ? String(unsafeHtmlInput) : '';\n // mXSS protection. Repeatedly parse the document to make sure it stabilizes, so that a browser\n // trying to auto-correct incorrect HTML cannot cause formerly inert HTML to become dangerous.\n var /** @type {?} */ mXSSAttempts = 5;\n var /** @type {?} */ parsedHtml = unsafeHtml;\n do {\n if (mXSSAttempts === 0) {\n throw new Error('Failed to sanitize html because the input is unstable');\n }\n mXSSAttempts--;\n unsafeHtml = parsedHtml;\n DOM.setInnerHTML(containerEl, unsafeHtml);\n if (((DOM.defaultDoc())).documentMode) {\n // strip custom-namespaced attributes on IE<=11\n stripCustomNsAttrs(containerEl);\n }\n parsedHtml = DOM.getInnerHTML(containerEl);\n } while (unsafeHtml !== parsedHtml);\n var /** @type {?} */ sanitizer = new SanitizingHtmlSerializer();\n var /** @type {?} */ safeHtml = sanitizer.sanitizeChildren(DOM.getTemplateContent(containerEl) || containerEl);\n // Clear out the body element.\n var /** @type {?} */ parent_1 = DOM.getTemplateContent(containerEl) || containerEl;\n for (var _i = 0, _a = DOM.childNodesAsList(parent_1); _i < _a.length; _i++) {\n var child = _a[_i];\n DOM.removeChild(parent_1, child);\n }\n if (core.isDevMode() && sanitizer.sanitizedSomething) {\n DOM.log('WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss).');\n }\n return safeHtml;\n }\n catch (e) {\n // In case anything goes wrong, clear out inertElement to reset the entire DOM structure.\n inertElement = null;\n throw e;\n }\n }\n\n /**\n * Regular expression for safe style values.\n *\n * Quotes (\" and ') are allowed, but a check must be done elsewhere to ensure they're balanced.\n *\n * ',' allows multiple values to be assigned to the same property (e.g. background-attachment or\n * font-family) and hence could allow multiple values to get injected, but that should pose no risk\n * of XSS.\n *\n * The function expression checks only for XSS safety, not for CSS validity.\n *\n * This regular expression was taken from the Closure sanitization library, and augmented for\n * transformation values.\n */\n var /** @type {?} */ VALUES = '[-,.\"\\'%_!# a-zA-Z0-9]+';\n var /** @type {?} */ TRANSFORMATION_FNS = '(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|3d)?';\n var /** @type {?} */ COLOR_FNS = '(?:rgb|hsl)a?';\n var /** @type {?} */ FN_ARGS = '\\\\([-0-9.%, a-zA-Z]+\\\\)';\n var /** @type {?} */ SAFE_STYLE_VALUE = new RegExp(\"^(\" + VALUES + \"|(?:\" + TRANSFORMATION_FNS + \"|\" + COLOR_FNS + \")\" + FN_ARGS + \")$\", 'g');\n /**\n * Matches a `url(...)` value with an arbitrary argument as long as it does\n * not contain parentheses.\n *\n * The URL value still needs to be sanitized separately.\n *\n * `url(...)` values are a very common use case, e.g. for `background-image`. With carefully crafted\n * CSS style rules, it is possible to construct an information leak with `url` values in CSS, e.g.\n * by observing whether scroll bars are displayed, or character ranges used by a font face\n * definition.\n *\n * Angular only allows binding CSS values (as opposed to entire CSS rules), so it is unlikely that\n * binding a URL value without further cooperation from the page will cause an information leak, and\n * if so, it is just a leak, not a full blown XSS vulnerability.\n *\n * Given the common use case, low likelihood of attack vector, and low impact of an attack, this\n * code is permissive and allows URLs that sanitize otherwise.\n */\n var /** @type {?} */ URL_RE = /^url\\(([^)]+)\\)$/;\n /**\n * Checks that quotes (\" and ') are properly balanced inside a string. Assumes\n * that neither escape (\\) nor any other character that could result in\n * breaking out of a string parsing context are allowed;\n * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.\n * *\n * This code was taken from the Closure sanitization library.\n * @param {?} value\n * @return {?}\n */\n function hasBalancedQuotes(value) {\n var /** @type {?} */ outsideSingle = true;\n var /** @type {?} */ outsideDouble = true;\n for (var /** @type {?} */ i = 0; i < value.length; i++) {\n var /** @type {?} */ c = value.charAt(i);\n if (c === '\\'' && outsideDouble) {\n outsideSingle = !outsideSingle;\n }\n else if (c === '\"' && outsideSingle) {\n outsideDouble = !outsideDouble;\n }\n }\n return outsideSingle && outsideDouble;\n }\n /**\n * Sanitizes the given untrusted CSS style property value (i.e. not an entire object, just a single\n * value) and returns a value that is safe to use in a browser environment.\n * @param {?} value\n * @return {?}\n */\n function sanitizeStyle(value) {\n value = String(value).trim(); // Make sure it's actually a string.\n if (!value)\n return '';\n // Single url(...) values are supported, but only for URLs that sanitize cleanly. See above for\n // reasoning behind this.\n var /** @type {?} */ urlMatch = value.match(URL_RE);\n if ((urlMatch && sanitizeUrl(urlMatch[1]) === urlMatch[1]) ||\n value.match(SAFE_STYLE_VALUE) && hasBalancedQuotes(value)) {\n return value; // Safe style values.\n }\n if (core.isDevMode()) {\n getDOM().log(\"WARNING: sanitizing unsafe style value \" + value + \" (see http://g.co/ng/security#xss).\");\n }\n return 'unsafe';\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$8 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * DomSanitizer helps preventing Cross Site Scripting Security bugs (XSS) by sanitizing\n * values to be safe to use in the different DOM contexts.\n * *\n * For example, when binding a URL in an `<a [href]=\"someValue\">` hyperlink, `someValue` will be\n * sanitized so that an attacker cannot inject e.g. a `javascript:` URL that would execute code on\n * the website.\n * *\n * In specific situations, it might be necessary to disable sanitization, for example if the\n * application genuinely needs to produce a `javascript:` style link with a dynamic value in it.\n * Users can bypass security by constructing a value with one of the `bypassSecurityTrust...`\n * methods, and then binding to that value from the template.\n * *\n * These situations should be very rare, and extraordinary care must be taken to avoid creating a\n * Cross Site Scripting (XSS) security bug!\n * *\n * When using `bypassSecurityTrust...`, make sure to call the method as early as possible and as\n * close as possible to the source of the value, to make it easy to verify no security bug is\n * created by its use.\n * *\n * It is not required (and not recommended) to bypass security if the value is safe, e.g. a URL that\n * does not start with a suspicious protocol, or an HTML snippet that does not contain dangerous\n * code. The sanitizer leaves safe values intact.\n * *\n * sanitization for the value passed in. Carefully check and audit all values and code paths going\n * into this call. Make sure any user data is appropriately escaped for this security context.\n * For more detail, see the [Security Guide](http://g.co/ng/security).\n * *\n * @abstract\n */\n var DomSanitizer = (function () {\n function DomSanitizer() {\n }\n /**\n * Sanitizes a value for use in the given SecurityContext.\n * *\n * If value is trusted for the context, this method will unwrap the contained safe value and use\n * it directly. Otherwise, value will be sanitized to be safe in the given context, for example\n * by replacing URLs that have an unsafe protocol part (such as `javascript:`). The implementation\n * is responsible to make sure that the value can definitely be safely used in the given context.\n * @abstract\n * @param {?} context\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.sanitize = function (context, value) { };\n /**\n * Bypass security and trust the given value to be safe HTML. Only use this when the bound HTML\n * is unsafe (e.g. contains `<script>` tags) and the code should be executed. The sanitizer will\n * leave safe HTML intact, so in most situations this method should not be used.\n * *\n * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n * security risks!\n * @abstract\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.bypassSecurityTrustHtml = function (value) { };\n /**\n * Bypass security and trust the given value to be safe style value (CSS).\n * *\n * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n * security risks!\n * @abstract\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.bypassSecurityTrustStyle = function (value) { };\n /**\n * Bypass security and trust the given value to be safe JavaScript.\n * *\n * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n * security risks!\n * @abstract\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.bypassSecurityTrustScript = function (value) { };\n /**\n * Bypass security and trust the given value to be a safe style URL, i.e. a value that can be used\n * in hyperlinks or `<img src>`.\n * *\n * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n * security risks!\n * @abstract\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.bypassSecurityTrustUrl = function (value) { };\n /**\n * Bypass security and trust the given value to be a safe resource URL, i.e. a location that may\n * be used to load executable code from, like `<script src>`, or `<iframe src>`.\n * *\n * **WARNING:** calling this method with untrusted user data exposes your application to XSS\n * security risks!\n * @abstract\n * @param {?} value\n * @return {?}\n */\n DomSanitizer.prototype.bypassSecurityTrustResourceUrl = function (value) { };\n return DomSanitizer;\n }());\n var DomSanitizerImpl = (function (_super) {\n __extends$8(DomSanitizerImpl, _super);\n function DomSanitizerImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @param {?} ctx\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.sanitize = function (ctx, value) {\n if (value == null)\n return null;\n switch (ctx) {\n case core.SecurityContext.NONE:\n return value;\n case core.SecurityContext.HTML:\n if (value instanceof SafeHtmlImpl)\n return value.changingThisBreaksApplicationSecurity;\n this.checkNotSafeValue(value, 'HTML');\n return sanitizeHtml(String(value));\n case core.SecurityContext.STYLE:\n if (value instanceof SafeStyleImpl)\n return value.changingThisBreaksApplicationSecurity;\n this.checkNotSafeValue(value, 'Style');\n return sanitizeStyle(value);\n case core.SecurityContext.SCRIPT:\n if (value instanceof SafeScriptImpl)\n return value.changingThisBreaksApplicationSecurity;\n this.checkNotSafeValue(value, 'Script');\n throw new Error('unsafe value used in a script context');\n case core.SecurityContext.URL:\n if (value instanceof SafeResourceUrlImpl || value instanceof SafeUrlImpl) {\n // Allow resource URLs in URL contexts, they are strictly more trusted.\n return value.changingThisBreaksApplicationSecurity;\n }\n this.checkNotSafeValue(value, 'URL');\n return sanitizeUrl(String(value));\n case core.SecurityContext.RESOURCE_URL:\n if (value instanceof SafeResourceUrlImpl) {\n return value.changingThisBreaksApplicationSecurity;\n }\n this.checkNotSafeValue(value, 'ResourceURL');\n throw new Error('unsafe value used in a resource URL context (see http://g.co/ng/security#xss)');\n default:\n throw new Error(\"Unexpected SecurityContext \" + ctx + \" (see http://g.co/ng/security#xss)\");\n }\n };\n /**\n * @param {?} value\n * @param {?} expectedType\n * @return {?}\n */\n DomSanitizerImpl.prototype.checkNotSafeValue = function (value, expectedType) {\n if (value instanceof SafeValueImpl) {\n throw new Error((\"Required a safe \" + expectedType + \", got a \" + value.getTypeName() + \" \") +\n \"(see http://g.co/ng/security#xss)\");\n }\n };\n /**\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.bypassSecurityTrustHtml = function (value) { return new SafeHtmlImpl(value); };\n /**\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.bypassSecurityTrustStyle = function (value) { return new SafeStyleImpl(value); };\n /**\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.bypassSecurityTrustScript = function (value) { return new SafeScriptImpl(value); };\n /**\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.bypassSecurityTrustUrl = function (value) { return new SafeUrlImpl(value); };\n /**\n * @param {?} value\n * @return {?}\n */\n DomSanitizerImpl.prototype.bypassSecurityTrustResourceUrl = function (value) {\n return new SafeResourceUrlImpl(value);\n };\n DomSanitizerImpl.decorators = [\n { type: core.Injectable },\n ];\n /** @nocollapse */\n DomSanitizerImpl.ctorParameters = function () { return []; };\n return DomSanitizerImpl;\n }(DomSanitizer));\n /**\n * @abstract\n */\n var SafeValueImpl = (function () {\n /**\n * @param {?} changingThisBreaksApplicationSecurity\n */\n function SafeValueImpl(changingThisBreaksApplicationSecurity) {\n this.changingThisBreaksApplicationSecurity = changingThisBreaksApplicationSecurity;\n // empty\n }\n /**\n * @abstract\n * @return {?}\n */\n SafeValueImpl.prototype.getTypeName = function () { };\n /**\n * @return {?}\n */\n SafeValueImpl.prototype.toString = function () {\n return (\"SafeValue must use [property]=binding: \" + this.changingThisBreaksApplicationSecurity) +\n \" (see http://g.co/ng/security#xss)\";\n };\n return SafeValueImpl;\n }());\n var SafeHtmlImpl = (function (_super) {\n __extends$8(SafeHtmlImpl, _super);\n function SafeHtmlImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @return {?}\n */\n SafeHtmlImpl.prototype.getTypeName = function () { return 'HTML'; };\n return SafeHtmlImpl;\n }(SafeValueImpl));\n var SafeStyleImpl = (function (_super) {\n __extends$8(SafeStyleImpl, _super);\n function SafeStyleImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @return {?}\n */\n SafeStyleImpl.prototype.getTypeName = function () { return 'Style'; };\n return SafeStyleImpl;\n }(SafeValueImpl));\n var SafeScriptImpl = (function (_super) {\n __extends$8(SafeScriptImpl, _super);\n function SafeScriptImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @return {?}\n */\n SafeScriptImpl.prototype.getTypeName = function () { return 'Script'; };\n return SafeScriptImpl;\n }(SafeValueImpl));\n var SafeUrlImpl = (function (_super) {\n __extends$8(SafeUrlImpl, _super);\n function SafeUrlImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @return {?}\n */\n SafeUrlImpl.prototype.getTypeName = function () { return 'URL'; };\n return SafeUrlImpl;\n }(SafeValueImpl));\n var SafeResourceUrlImpl = (function (_super) {\n __extends$8(SafeResourceUrlImpl, _super);\n function SafeResourceUrlImpl() {\n _super.apply(this, arguments);\n }\n /**\n * @return {?}\n */\n SafeResourceUrlImpl.prototype.getTypeName = function () { return 'ResourceURL'; };\n return SafeResourceUrlImpl;\n }(SafeValueImpl));\n\n var /** @type {?} */ INTERNAL_BROWSER_PLATFORM_PROVIDERS = [\n { provide: core.PLATFORM_INITIALIZER, useValue: initDomAdapter, multi: true },\n { provide: _angular_common.PlatformLocation, useClass: BrowserPlatformLocation }\n ];\n /**\n * @security Replacing built-in sanitization providers exposes the application to XSS risks.\n * Attacker-controlled data introduced by an unsanitized provider could expose your\n * application to XSS risks. For more detail, see the [Security Guide](http://g.co/ng/security).\n * @experimental\n */\n var /** @type {?} */ BROWSER_SANITIZATION_PROVIDERS = [\n { provide: core.Sanitizer, useExisting: DomSanitizer },\n { provide: DomSanitizer, useClass: DomSanitizerImpl },\n ];\n /**\n * @stable\n */\n var /** @type {?} */ platformBrowser = core.createPlatformFactory(core.platformCore, 'browser', INTERNAL_BROWSER_PLATFORM_PROVIDERS);\n /**\n * @return {?}\n */\n function initDomAdapter() {\n BrowserDomAdapter.makeCurrent();\n BrowserGetTestability.init();\n }\n /**\n * @return {?}\n */\n function errorHandler() {\n return new core.ErrorHandler();\n }\n /**\n * @return {?}\n */\n function _document() {\n return getDOM().defaultDoc();\n }\n /**\n * @return {?}\n */\n function _resolveDefaultAnimationDriver() {\n if (getDOM().supportsWebAnimation()) {\n return new WebAnimationsDriver();\n }\n return AnimationDriver.NOOP;\n }\n /**\n * The ng module for the browser.\n * *\n */\n var BrowserModule = (function () {\n /**\n * @param {?} parentModule\n */\n function BrowserModule(parentModule) {\n if (parentModule) {\n throw new Error(\"BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.\");\n }\n }\n BrowserModule.decorators = [\n { type: core.NgModule, args: [{\n providers: [\n BROWSER_SANITIZATION_PROVIDERS, { provide: core.ErrorHandler, useFactory: errorHandler, deps: [] },\n { provide: DOCUMENT, useFactory: _document, deps: [] },\n { provide: EVENT_MANAGER_PLUGINS, useClass: DomEventsPlugin, multi: true },\n { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true },\n { provide: EVENT_MANAGER_PLUGINS, useClass: HammerGesturesPlugin, multi: true },\n { provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig },\n { provide: DomRootRenderer, useClass: DomRootRenderer_ },\n { provide: core.RootRenderer, useExisting: DomRootRenderer },\n { provide: SharedStylesHost, useExisting: DomSharedStylesHost },\n { provide: AnimationDriver, useFactory: _resolveDefaultAnimationDriver }, DomSharedStylesHost,\n core.Testability, EventManager, ELEMENT_PROBE_PROVIDERS, Title\n ],\n exports: [_angular_common.CommonModule, core.ApplicationModule]\n },] },\n ];\n /** @nocollapse */\n BrowserModule.ctorParameters = function () { return [\n { type: BrowserModule, decorators: [{ type: core.Optional }, { type: core.SkipSelf },] },\n ]; };\n return BrowserModule;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * JS version of browser APIs. This library can only run in the browser.\n */\n var /** @type {?} */ win = typeof window !== 'undefined' && window || ({});\n\n var ChangeDetectionPerfRecord = (function () {\n /**\n * @param {?} msPerTick\n * @param {?} numTicks\n */\n function ChangeDetectionPerfRecord(msPerTick, numTicks) {\n this.msPerTick = msPerTick;\n this.numTicks = numTicks;\n }\n return ChangeDetectionPerfRecord;\n }());\n /**\n * Entry point for all Angular debug tools. This object corresponds to the `ng`\n * global variable accessible in the dev console.\n */\n var AngularTools = (function () {\n /**\n * @param {?} ref\n */\n function AngularTools(ref) {\n this.profiler = new AngularProfiler(ref);\n }\n return AngularTools;\n }());\n /**\n * Entry point for all Angular profiling-related debug tools. This object\n * corresponds to the `ng.profiler` in the dev console.\n */\n var AngularProfiler = (function () {\n /**\n * @param {?} ref\n */\n function AngularProfiler(ref) {\n this.appRef = ref.injector.get(core.ApplicationRef);\n }\n /**\n * Exercises change detection in a loop and then prints the average amount of\n * time in milliseconds how long a single round of change detection takes for\n * the current state of the UI. It runs a minimum of 5 rounds for a minimum\n * of 500 milliseconds.\n * *\n * Optionally, a user may pass a `config` parameter containing a map of\n * options. Supported options are:\n * *\n * `record` (boolean) - causes the profiler to record a CPU profile while\n * it exercises the change detector. Example:\n * *\n * ```\n * ng.profiler.timeChangeDetection({record: true})\n * ```\n * @param {?} config\n * @return {?}\n */\n AngularProfiler.prototype.timeChangeDetection = function (config) {\n var /** @type {?} */ record = config && config['record'];\n var /** @type {?} */ profileName = 'Change Detection';\n // Profiler is not available in Android browsers, nor in IE 9 without dev tools opened\n var /** @type {?} */ isProfilerAvailable = isPresent(win.console.profile);\n if (record && isProfilerAvailable) {\n win.console.profile(profileName);\n }\n var /** @type {?} */ start = getDOM().performanceNow();\n var /** @type {?} */ numTicks = 0;\n while (numTicks < 5 || (getDOM().performanceNow() - start) < 500) {\n this.appRef.tick();\n numTicks++;\n }\n var /** @type {?} */ end = getDOM().performanceNow();\n if (record && isProfilerAvailable) {\n // need to cast to <any> because type checker thinks there's no argument\n // while in fact there is:\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/Console/profileEnd\n ((win.console.profileEnd))(profileName);\n }\n var /** @type {?} */ msPerTick = (end - start) / numTicks;\n win.console.log(\"ran \" + numTicks + \" change detection cycles\");\n win.console.log(msPerTick.toFixed(2) + \" ms per check\");\n return new ChangeDetectionPerfRecord(msPerTick, numTicks);\n };\n return AngularProfiler;\n }());\n\n var /** @type {?} */ context = (global$1);\n /**\n * Enabled Angular 2 debug tools that are accessible via your browser's\n * developer console.\n * *\n * Usage:\n * *\n * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)\n * 1. Type `ng.` (usually the console will show auto-complete suggestion)\n * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`\n * then hit Enter.\n * *\n * @param {?} ref\n * @return {?}\n */\n function enableDebugTools(ref) {\n ((Object)).assign(context.ng, new AngularTools(ref));\n return ref;\n }\n /**\n * Disables Angular 2 tools.\n * *\n * @return {?}\n */\n function disableDebugTools() {\n if (context.ng) {\n delete context.ng.profiler;\n }\n }\n\n /**\n * Predicates for use with {@link DebugElement}'s query functions.\n * *\n */\n var By = (function () {\n function By() {\n }\n /**\n * Match all elements.\n * *\n * ## Example\n * *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}\n * @return {?}\n */\n By.all = function () { return function (debugElement) { return true; }; };\n /**\n * Match elements by the given CSS selector.\n * *\n * ## Example\n * *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}\n * @param {?} selector\n * @return {?}\n */\n By.css = function (selector) {\n return function (debugElement) {\n return isPresent(debugElement.nativeElement) ?\n getDOM().elementMatches(debugElement.nativeElement, selector) :\n false;\n };\n };\n /**\n * Match elements that have the given directive present.\n * *\n * ## Example\n * *\n * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}\n * @param {?} type\n * @return {?}\n */\n By.directive = function (type) {\n return function (debugElement) { return debugElement.providerTokens.indexOf(type) !== -1; };\n };\n return By;\n }());\n\n var /** @type {?} */ __platform_browser_private__ = {\n BrowserPlatformLocation: BrowserPlatformLocation,\n DomAdapter: DomAdapter,\n BrowserDomAdapter: BrowserDomAdapter,\n BrowserGetTestability: BrowserGetTestability,\n getDOM: getDOM,\n setRootDomAdapter: setRootDomAdapter,\n DomRootRenderer_: DomRootRenderer_,\n DomRootRenderer: DomRootRenderer,\n NAMESPACE_URIS: NAMESPACE_URIS,\n shimContentAttribute: shimContentAttribute,\n shimHostAttribute: shimHostAttribute,\n flattenStyles: flattenStyles,\n splitNamespace: splitNamespace,\n isNamespaced: isNamespaced,\n DomSharedStylesHost: DomSharedStylesHost,\n SharedStylesHost: SharedStylesHost,\n ELEMENT_PROBE_PROVIDERS: ELEMENT_PROBE_PROVIDERS,\n DomEventsPlugin: DomEventsPlugin,\n KeyEventsPlugin: KeyEventsPlugin,\n HammerGesturesPlugin: HammerGesturesPlugin,\n initDomAdapter: initDomAdapter,\n INTERNAL_BROWSER_PLATFORM_PROVIDERS: INTERNAL_BROWSER_PLATFORM_PROVIDERS,\n BROWSER_SANITIZATION_PROVIDERS: BROWSER_SANITIZATION_PROVIDERS,\n WebAnimationsDriver: WebAnimationsDriver\n };\n\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new core.Version('2.4.1');\n\n exports.BrowserModule = BrowserModule;\n exports.platformBrowser = platformBrowser;\n exports.Title = Title;\n exports.disableDebugTools = disableDebugTools;\n exports.enableDebugTools = enableDebugTools;\n exports.AnimationDriver = AnimationDriver;\n exports.By = By;\n exports.NgProbeToken = NgProbeToken;\n exports.DOCUMENT = DOCUMENT;\n exports.EVENT_MANAGER_PLUGINS = EVENT_MANAGER_PLUGINS;\n exports.EventManager = EventManager;\n exports.HAMMER_GESTURE_CONFIG = HAMMER_GESTURE_CONFIG;\n exports.HammerGestureConfig = HammerGestureConfig;\n exports.DomSanitizer = DomSanitizer;\n exports.VERSION = VERSION;\n exports.__platform_browser_private__ = __platform_browser_private__;\n\n}));\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvYnVuZGxlcy9wbGF0Zm9ybS1icm93c2VyLnVtZC5qcz8wMTcxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhciB2Mi40LjFcbiAqIChjKSAyMDEwLTIwMTYgR29vZ2xlLCBJbmMuIGh0dHBzOi8vYW5ndWxhci5pby9cbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ0Bhbmd1bGFyL2NvbW1vbicpLCByZXF1aXJlKCdAYW5ndWxhci9jb3JlJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdAYW5ndWxhci9jb21tb24nLCAnQGFuZ3VsYXIvY29yZSddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwubmcgPSBnbG9iYWwubmcgfHwge30sIGdsb2JhbC5uZy5wbGF0Zm9ybUJyb3dzZXIgPSBnbG9iYWwubmcucGxhdGZvcm1Ccm93c2VyIHx8IHt9KSxnbG9iYWwubmcuY29tbW9uLGdsb2JhbC5uZy5jb3JlKSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzLF9hbmd1bGFyX2NvbW1vbixjb3JlKSB7ICd1c2Ugc3RyaWN0JztcblxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEZWJ1Z0RvbVJvb3RSZW5kZXJlciA9IGNvcmUuX19jb3JlX3ByaXZhdGVfXy5EZWJ1Z0RvbVJvb3RSZW5kZXJlcjtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTm9PcEFuaW1hdGlvblBsYXllciA9IGNvcmUuX19jb3JlX3ByaXZhdGVfXy5Ob09wQW5pbWF0aW9uUGxheWVyO1xuXG4gIC8qKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2YXIgTm9PcEFuaW1hdGlvbkRyaXZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBOb09wQW5pbWF0aW9uRHJpdmVyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRpbmdTdHlsZXNcbiAgICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzXG4gICAgICAgKiBAcGFyYW0gez99IGR1cmF0aW9uXG4gICAgICAgKiBAcGFyYW0gez99IGRlbGF5XG4gICAgICAgKiBAcGFyYW0gez99IGVhc2luZ1xuICAgICAgICogQHBhcmFtIHs/PX0gcHJldmlvdXNQbGF5ZXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOb09wQW5pbWF0aW9uRHJpdmVyLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0YXJ0aW5nU3R5bGVzLCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMpIHtcbiAgICAgICAgICBpZiAocHJldmlvdXNQbGF5ZXJzID09PSB2b2lkIDApIHsgcHJldmlvdXNQbGF5ZXJzID0gW107IH1cbiAgICAgICAgICByZXR1cm4gbmV3IE5vT3BBbmltYXRpb25QbGF5ZXIoKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTm9PcEFuaW1hdGlvbkRyaXZlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIEFuaW1hdGlvbkRyaXZlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBBbmltYXRpb25Ecml2ZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nU3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc1xuICAgICAgICogQHBhcmFtIHs/fSBkdXJhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSBkZWxheVxuICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmdcbiAgICAgICAqIEBwYXJhbSB7Pz19IHByZXZpb3VzUGxheWVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQW5pbWF0aW9uRHJpdmVyLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0YXJ0aW5nU3R5bGVzLCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMpIHsgfTtcbiAgICAgIEFuaW1hdGlvbkRyaXZlci5OT09QID0gbmV3IE5vT3BBbmltYXRpb25Ecml2ZXIoKTtcbiAgICAgIHJldHVybiBBbmltYXRpb25Ecml2ZXI7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBnbG9iYWxTY29wZTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpIHtcbiAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIGFueSB3aXRoIFdvcmtlckdsb2JhbFNjb3BlIGZyb20gbGliLndlYndvcmtlci5kLnRzICMzNDkyXG4gICAgICAgICAgZ2xvYmFsU2NvcGUgPSAoc2VsZik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICBnbG9iYWxTY29wZSA9IChnbG9iYWwpO1xuICAgICAgfVxuICB9XG4gIGVsc2Uge1xuICAgICAgZ2xvYmFsU2NvcGUgPSAod2luZG93KTtcbiAgfVxuICAvLyBOZWVkIHRvIGRlY2xhcmUgYSBuZXcgdmFyaWFibGUgZm9yIGdsb2JhbCBoZXJlIHNpbmNlIFR5cGVTY3JpcHRcbiAgLy8gZXhwb3J0cyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZ2xvYmFsJDEgPSBnbG9iYWxTY29wZTtcbiAgLy8gVE9ETzogcmVtb3ZlIGNhbGxzIHRvIGFzc2VydCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gIC8vIE5vdGU6IENhbid0IGp1c3QgZXhwb3J0IHRoaXMgYW5kIGltcG9ydCBpbiBpbiBvdGhlciBmaWxlc1xuICAvLyBhcyBgYXNzZXJ0YCBpcyBhIHJlc2VydmVkIGtleXdvcmQgaW4gRGFydFxuICBnbG9iYWwkMS5hc3NlcnQgPSBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uKSB7XG4gICAgICAvLyBUT0RPOiB0byBiZSBmaXhlZCBwcm9wZXJseSB2aWEgIzI4MzAsIG5vb3AgZm9yIG5vd1xuICB9O1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBvYmpcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzUHJlc2VudChvYmopIHtcbiAgICAgIHJldHVybiBvYmogIT0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBvYmpcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGlzQmxhbmsob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ2lmeSh0b2tlbikge1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAnJyArIHRva2VuO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuLm92ZXJyaWRkZW5OYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyB0b2tlbi5vdmVycmlkZGVuTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbi5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyB0b2tlbi5uYW1lO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gdG9rZW4udG9TdHJpbmcoKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5ld0xpbmVJbmRleCA9IHJlcy5pbmRleE9mKCdcXG4nKTtcbiAgICAgIHJldHVybiBuZXdMaW5lSW5kZXggPT09IC0xID8gcmVzIDogcmVzLnN1YnN0cmluZygwLCBuZXdMaW5lSW5kZXgpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGdsb2JhbFxuICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VmFsdWVPblBhdGgoZ2xvYmFsLCBwYXRoLCB2YWx1ZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvYmogPSBnbG9iYWw7XG4gICAgICB3aGlsZSAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShuYW1lXzEpICYmIG9ialtuYW1lXzFdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgb2JqID0gb2JqW25hbWVfMV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBvYmogPSBvYmpbbmFtZV8xXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgICBvYmogPSB7fTtcbiAgICAgIH1cbiAgICAgIG9ialtwYXJ0cy5zaGlmdCgpXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfRE9NID0gbnVsbDtcbiAgLyoqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRET00oKSB7XG4gICAgICByZXR1cm4gX0RPTTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhZGFwdGVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzZXRSb290RG9tQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgICBpZiAoIV9ET00pIHtcbiAgICAgICAgICBfRE9NID0gYWRhcHRlcjtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFuIGVudmlyb25tZW50LWFnbm9zdGljIHdheS5cbiAgICAqICpcbiAgICAqIGNhbiBpbnRyb2R1Y2UgWFNTIHJpc2tzLlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBEb21BZGFwdGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIERvbUFkYXB0ZXIoKSB7XG4gICAgICAgICAgdGhpcy5yZXNvdXJjZUxvYWRlclR5cGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBuYW1lKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsdWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBtZXRob2ROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChlbCwgbWV0aG9kTmFtZSwgYXJncykgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmxvZ0Vycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGVycm9yKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUubG9nR3JvdXAgPSBmdW5jdGlvbiAoZXJyb3IpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5sb2dHcm91cEVuZCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEb21BZGFwdGVyLnByb3RvdHlwZSwgXCJhdHRyVG9Qcm9wTWFwXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgTWFwcyBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcyBmb3IgY2FzZXNcbiAgICAgICAgICAgICogd2hlcmUgYXR0cmlidXRlIG5hbWUgZG9lc24ndCBtYXRjaCBwcm9wZXJ0eSBuYW1lLlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9hdHRyVG9Qcm9wTWFwOyB9LFxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMuX2F0dHJUb1Byb3BNYXAgPSB2YWx1ZTsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICA7XG4gICAgICA7XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZUh0bWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHRlbXBsYXRlSHRtbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUucXVlcnlTZWxlY3RvciA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgc2VsZWN0b3IpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsID0gZnVuY3Rpb24gKGVsIC8qKiBUT0RPICM5MTAwICovLCBzZWxlY3RvcikgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gZXZ0XG4gICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgZXZ0IC8qKiBUT0RPICM5MTAwICovLCBsaXN0ZW5lcikgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gZXZ0XG4gICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5vbkFuZENhbmNlbCA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgZXZ0IC8qKiBUT0RPICM5MTAwICovLCBsaXN0ZW5lcikgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gZXZ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGVsIC8qKiBUT0RPICM5MTAwICovLCBldnQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50VHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlTW91c2VFdmVudCA9IGZ1bmN0aW9uIChldmVudFR5cGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50VHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBldnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZXZ0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5pc1ByZXZlbnRlZCA9IGZ1bmN0aW9uIChldnQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRJbm5lckhUTUwgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFJldHVybnMgY29udGVudCBpZiBlbCBpcyBhIDx0ZW1wbGF0ZT4gZWxlbWVudCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldFRlbXBsYXRlQ29udGVudCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldE91dGVySFRNTCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUubm9kZU5hbWUgPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUubm9kZVZhbHVlID0gZnVuY3Rpb24gKG5vZGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY29udGVudCA9IGZ1bmN0aW9uIChub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZmlyc3RDaGlsZCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLm5leHRTaWJsaW5nID0gZnVuY3Rpb24gKGVsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUucGFyZW50RWxlbWVudCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmNoaWxkTm9kZXMgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jaGlsZE5vZGVzQXNMaXN0ID0gZnVuY3Rpb24gKGVsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY2xlYXJOb2RlcyA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAoZWwgLyoqIFRPRE8gIzkxMDAgKi8sIG5vZGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGVsIC8qKiBUT0RPICM5MTAwICovLCBub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBuZXdOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IG9sZE5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgbmV3Tm9kZSAvKiogVE9ETyAjOTEwMCAqLywgb2xkTm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKGVsIC8qKiBUT0RPICM5MTAwICovLCBub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QWxsQmVmb3JlID0gZnVuY3Rpb24gKGVsIC8qKiBUT0RPICM5MTAwICovLCBub2RlcykgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoZWwgLyoqIFRPRE8gIzkxMDAgKi8sIG5vZGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRJbm5lckhUTUwgPSBmdW5jdGlvbiAoZWwgLyoqIFRPRE8gIzkxMDAgKi8sIHZhbHVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAoZWwgLyoqIFRPRE8gIzkxMDAgKi8sIHZhbHVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgdmFsdWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRDaGVja2VkID0gZnVuY3Rpb24gKGVsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0Q2hlY2tlZCA9IGZ1bmN0aW9uIChlbCAvKiogVE9ETyAjOTEwMCAqLywgdmFsdWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHRleHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZUNvbW1lbnQgPSBmdW5jdGlvbiAodGV4dCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gaHRtbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlVGVtcGxhdGUgPSBmdW5jdGlvbiAoaHRtbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWUgLyoqIFRPRE8gIzkxMDAgKi8sIGRvYykgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMgPSBmdW5jdGlvbiAobnMsIHRhZ05hbWUsIGRvYykgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVUZXh0Tm9kZSA9IGZ1bmN0aW9uICh0ZXh0LCBkb2MpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJWYWx1ZVxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVTY3JpcHRUYWcgPSBmdW5jdGlvbiAoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgZG9jKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBjc3NcbiAgICAgICAqIEBwYXJhbSB7Pz19IGRvY1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlU3R5bGVFbGVtZW50ID0gZnVuY3Rpb24gKGNzcywgZG9jKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldFNoYWRvd1Jvb3QgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRIb3N0ID0gZnVuY3Rpb24gKGVsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0RGlzdHJpYnV0ZWROb2RlcyA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY2xvbmUgLyo8VCBleHRlbmRzIE5vZGU+Ki8gPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIG5hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBmdW5jdGlvbiAoZWxlbWVudCAvKiogVE9ETyAjOTEwMCAqLywgbmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuY2xhc3NMaXN0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBjbGFzc05hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBjbGFzc05hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBjbGFzc05hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlVmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnNldFN0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZU5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZVN0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIHN0eWxlTmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZU5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIHN0eWxlTmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZU5hbWVcbiAgICAgICAqIEBwYXJhbSB7Pz19IHN0eWxlVmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmhhc1N0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUudGFnTmFtZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5hdHRyaWJ1dGVNYXAgPSBmdW5jdGlvbiAoZWxlbWVudCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBhdHRyaWJ1dGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbnNcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBucywgYXR0cmlidXRlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIGF0dHJpYnV0ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuc1xuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIG5zLCBhdHRyaWJ1dGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIG5hbWUsIHZhbHVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5zXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIG5zLCBuYW1lLCB2YWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBhdHRyaWJ1dGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbnNcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBucywgYXR0cmlidXRlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUudGVtcGxhdGVBd2FyZVJvb3QgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVIdG1sRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZGVmYXVsdERvYyA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBmdW5jdGlvbiAoZWwpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5ld1RpdGxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uIChuZXdUaXRsZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gblxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZWxlbWVudE1hdGNoZXMgPSBmdW5jdGlvbiAobiAvKiogVE9ETyAjOTEwMCAqLywgc2VsZWN0b3IpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5pc1RlbXBsYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChlbCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaXNUZXh0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5pc0NvbW1lbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmlzRWxlbWVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaGFzU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5pc1NoYWRvd1Jvb3QgPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuaW1wb3J0SW50b0RvYyAvKjxUIGV4dGVuZHMgTm9kZT4qLyA9IGZ1bmN0aW9uIChub2RlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5hZG9wdE5vZGUgLyo8VCBleHRlbmRzIE5vZGU+Ki8gPSBmdW5jdGlvbiAobm9kZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SHJlZiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBldmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0RXZlbnRLZXkgPSBmdW5jdGlvbiAoZXZlbnQpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gYmFzZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBocmVmXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5yZXNvbHZlQW5kU2V0SHJlZiA9IGZ1bmN0aW9uIChlbGVtZW50IC8qKiBUT0RPICM5MTAwICovLCBiYXNlVXJsLCBocmVmKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuc3VwcG9ydHNET01FdmVudHMgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuc3VwcG9ydHNOYXRpdmVTaGFkb3dET00gPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldEdsb2JhbEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldEhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0QmFzZUhyZWYgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tQWRhcHRlci5wcm90b3R5cGUucmVzZXRCYXNlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRVc2VyQWdlbnQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnNldERhdGEgPSBmdW5jdGlvbiAoZWxlbWVudCAvKiogVE9ETyAjOTEwMCAqLywgbmFtZSwgdmFsdWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlbWVudCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKGVsZW1lbnQgLyoqIFRPRE8gIzkxMDAgKi8sIG5hbWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnNldEdsb2JhbFZhciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzV2ViQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldEFuaW1hdGlvblByZWZpeCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzQ29va2llcyA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUFkYXB0ZXIucHJvdG90eXBlLmdldENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRDb29raWUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsgfTtcbiAgICAgIHJldHVybiBEb21BZGFwdGVyO1xuICB9KCkpO1xuXG4gIHZhciBXZWJBbmltYXRpb25zUGxheWVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc1xuICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zXG4gICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gV2ViQW5pbWF0aW9uc1BsYXllcihlbGVtZW50LCBrZXlmcmFtZXMsIG9wdGlvbnMsIHByZXZpb3VzUGxheWVycykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKHByZXZpb3VzUGxheWVycyA9PT0gdm9pZCAwKSB7IHByZXZpb3VzUGxheWVycyA9IFtdOyB9XG4gICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICB0aGlzLmtleWZyYW1lcyA9IGtleWZyYW1lcztcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdO1xuICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucGFyZW50UGxheWVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IG9wdGlvbnNbJ2R1cmF0aW9uJ107XG4gICAgICAgICAgdGhpcy5wcmV2aW91c1N0eWxlcyA9IHt9O1xuICAgICAgICAgIHByZXZpb3VzUGxheWVycy5mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHtcbiAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IHBsYXllci5fY2FwdHVyZVN0eWxlcygpO1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHsgcmV0dXJuIF90aGlzLnByZXZpb3VzU3R5bGVzW3Byb3BdID0gc3R5bGVzW3Byb3BdOyB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUuX29uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleWZyYW1lcyA9IHRoaXMua2V5ZnJhbWVzLm1hcChmdW5jdGlvbiAoc3R5bGVzKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZvcm1hdHRlZEtleWZyYW1lID0ge307XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gc3R5bGVzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGNvcmUuQVVUT19TVFlMRSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX2NvbXB1dGVTdHlsZShfdGhpcy5lbGVtZW50LCBwcm9wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRLZXlmcmFtZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZEtleWZyYW1lO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZpb3VzU3R5bGVQcm9wcyA9IE9iamVjdC5rZXlzKHRoaXMucHJldmlvdXNTdHlsZXMpO1xuICAgICAgICAgIGlmIChwcmV2aW91c1N0eWxlUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0aW5nS2V5ZnJhbWVfMSA9IGZpbmRTdGFydGluZ0tleWZyYW1lKGtleWZyYW1lcyk7XG4gICAgICAgICAgICAgIHByZXZpb3VzU3R5bGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHN0YXJ0aW5nS2V5ZnJhbWVfMVtwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0tleWZyYW1lXzFbcHJvcF0gPSBfdGhpcy5wcmV2aW91c1N0eWxlc1twcm9wXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3BsYXllciA9IHRoaXMuX3RyaWdnZXJXZWJBbmltYXRpb24odGhpcy5lbGVtZW50LCBrZXlmcmFtZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgdGhpcy5fZmluYWxLZXlmcmFtZSA9IF9jb3B5S2V5ZnJhbWVTdHlsZXMoa2V5ZnJhbWVzW2tleWZyYW1lcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBzdGFydCB0byBhbmltYXRlIHJpZ2h0IGF3YXlcbiAgICAgICAgICB0aGlzLl9yZXNldERvbVBsYXllclN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5fcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9vbkZpbmlzaCgpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXNcbiAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUuX3RyaWdnZXJXZWJBbmltYXRpb24gPSBmdW5jdGlvbiAoZWxlbWVudCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIChlbGVtZW50LmFuaW1hdGUoa2V5ZnJhbWVzLCBvcHRpb25zKSk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFuaW1hdGlvbnNQbGF5ZXIucHJvdG90eXBlLCBcImRvbVBsYXllclwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BsYXllcjsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFdlYkFuaW1hdGlvbnNQbGF5ZXIucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUub25Eb25lID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMuX29uRG9uZUZucy5wdXNoKGZuKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU3RhcnRlZCgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107XG4gICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9wbGF5ZXIucGxheSgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgdGhpcy5fcGxheWVyLnBhdXNlKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgdGhpcy5fb25GaW5pc2goKTtcbiAgICAgICAgICB0aGlzLl9wbGF5ZXIuZmluaXNoKCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLl9yZXNldERvbVBsYXllclN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5fcmVzZXREb21QbGF5ZXJTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5fcGxheWVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BsYXllci5jYW5jZWwoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFdlYkFuaW1hdGlvbnNQbGF5ZXIucHJvdG90eXBlLmhhc1N0YXJ0ZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKTtcbiAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTtcbiAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFuaW1hdGlvbnNQbGF5ZXIucHJvdG90eXBlLCBcInRvdGFsVGltZVwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2R1cmF0aW9uOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBXZWJBbmltYXRpb25zUGxheWVyLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChwKSB7IHRoaXMuX3BsYXllci5jdXJyZW50VGltZSA9IHAgKiB0aGlzLnRvdGFsVGltZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wbGF5ZXIuY3VycmVudFRpbWUgLyB0aGlzLnRvdGFsVGltZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc1BsYXllci5wcm90b3R5cGUuX2NhcHR1cmVTdHlsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZXMgPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5oYXNTdGFydGVkKCkpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fZmluYWxLZXlmcmFtZSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gJ29mZnNldCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbcHJvcF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmluaXNoZWQgPyBfdGhpcy5fZmluYWxLZXlmcmFtZVtwcm9wXSA6IF9jb21wdXRlU3R5bGUoX3RoaXMuZWxlbWVudCwgcHJvcCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc3R5bGVzO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBXZWJBbmltYXRpb25zUGxheWVyO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7P30gcHJvcFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2NvbXB1dGVTdHlsZShlbGVtZW50LCBwcm9wKSB7XG4gICAgICByZXR1cm4gZ2V0RE9NKCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVtwcm9wXTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9jb3B5S2V5ZnJhbWVTdHlsZXMoc3R5bGVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdTdHlsZXMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIGlmIChwcm9wICE9ICdvZmZzZXQnKSB7XG4gICAgICAgICAgICAgIG5ld1N0eWxlc1twcm9wXSA9IHN0eWxlc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdTdHlsZXM7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kU3RhcnRpbmdLZXlmcmFtZShrZXlmcmFtZXMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0aW5nS2V5ZnJhbWUgPSBrZXlmcmFtZXNbMF07XG4gICAgICAvLyBpdCdzIGltcG9ydGFudCB0aGF0IHdlIGZpbmQgdGhlIExBU1Qga2V5ZnJhbWVcbiAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IHN0eWxlIG92ZXJpZGRpbmcgaXMgZmluYWwuXG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAxOyBpIDwga2V5ZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2YgPSBrZXlmcmFtZXNbaV07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2Zmc2V0ID0ga2ZbJ29mZnNldCddO1xuICAgICAgICAgIGlmIChvZmZzZXQgIT09IDApXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIHN0YXJ0aW5nS2V5ZnJhbWUgPSBrZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFydGluZ0tleWZyYW1lO1xuICB9XG5cbiAgdmFyIFdlYkFuaW1hdGlvbnNEcml2ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gV2ViQW5pbWF0aW9uc0RyaXZlcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nU3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lc1xuICAgICAgICogQHBhcmFtIHs/fSBkdXJhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSBkZWxheVxuICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmdcbiAgICAgICAqIEBwYXJhbSB7Pz19IHByZXZpb3VzUGxheWVyc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgV2ViQW5pbWF0aW9uc0RyaXZlci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdGFydGluZ1N0eWxlcywga2V5ZnJhbWVzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgcHJldmlvdXNQbGF5ZXJzKSB7XG4gICAgICAgICAgaWYgKHByZXZpb3VzUGxheWVycyA9PT0gdm9pZCAwKSB7IHByZXZpb3VzUGxheWVycyA9IFtdOyB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm9ybWF0dGVkU3RlcHMgPSBbXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydGluZ1N0eWxlTG9va3VwID0ge307XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChzdGFydGluZ1N0eWxlcykgJiYgc3RhcnRpbmdTdHlsZXMuc3R5bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc3RhcnRpbmdTdHlsZUxvb2t1cCA9IF9wb3B1bGF0ZVN0eWxlcyhzdGFydGluZ1N0eWxlcywge30pO1xuICAgICAgICAgICAgICBzdGFydGluZ1N0eWxlTG9va3VwWydvZmZzZXQnXSA9IDA7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFN0ZXBzLnB1c2goc3RhcnRpbmdTdHlsZUxvb2t1cCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXlmcmFtZSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkYXRhID0gX3BvcHVsYXRlU3R5bGVzKGtleWZyYW1lLnN0eWxlcywgc3RhcnRpbmdTdHlsZUxvb2t1cCk7XG4gICAgICAgICAgICAgIGRhdGFbJ29mZnNldCddID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwga2V5ZnJhbWUub2Zmc2V0KSk7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFN0ZXBzLnB1c2goZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGVuIG9ubHkgc3R5bGVzIGFyZSBhcHBsaWVkIGFzIGFuXG4gICAgICAgICAgLy8gYW5pbWF0aW9uLiBXaGVuIHRoaXMgb2NjdXJzIHdlIHdhbnQgdG8gYW5pbWF0ZSBmcm9tIHN0YXJ0IHRvXG4gICAgICAgICAgLy8gZW5kIHdpdGggdGhlIHNhbWUgdmFsdWVzLiBSZW1vdmluZyB0aGUgb2Zmc2V0IGFuZCBoYXZpbmcgb25seVxuICAgICAgICAgIC8vIHN0YXJ0L2VuZCB2YWx1ZXMgaXMgc3VpdGFibGUgZW5vdWdoIGZvciB0aGUgd2ViLWFuaW1hdGlvbnMgQVBJXG4gICAgICAgICAgaWYgKGZvcm1hdHRlZFN0ZXBzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0ID0gZm9ybWF0dGVkU3RlcHNbMF07XG4gICAgICAgICAgICAgIHN0YXJ0WydvZmZzZXQnXSA9IG51bGw7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZFN0ZXBzID0gW3N0YXJ0LCBzdGFydF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsYXllck9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICdkdXJhdGlvbic6IGR1cmF0aW9uLFxuICAgICAgICAgICAgICAnZGVsYXknOiBkZWxheSxcbiAgICAgICAgICAgICAgJ2ZpbGwnOiAnYm90aCcgLy8gd2UgdXNlIGBib3RoYCBiZWNhdXNlIGl0IGFsbG93cyBmb3Igc3R5bGluZyBhdCAwJSB0byB3b3JrIHdpdGggYGRlbGF5YFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gd2UgY2hlY2sgZm9yIHRoaXMgdG8gYXZvaWQgaGF2aW5nIGEgbnVsbHx1bmRlZmluZWQgdmFsdWUgYmUgcHJlc2VudFxuICAgICAgICAgIC8vIGZvciB0aGUgZWFzaW5nICh3aGljaCByZXN1bHRzIGluIGFuIGVycm9yIGZvciBjZXJ0YWluIGJyb3dzZXJzICM5NzUyKVxuICAgICAgICAgIGlmIChlYXNpbmcpIHtcbiAgICAgICAgICAgICAgcGxheWVyT3B0aW9uc1snZWFzaW5nJ10gPSBlYXNpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHRoZXJlIG1heSBiZSBhIGNoYW5jZSBhIE5vT3AgcGxheWVyIGlzIHJldHVybmVkIGRlcGVuZGluZ1xuICAgICAgICAgIC8vIG9uIHdoZW4gdGhlIHByZXZpb3VzIGFuaW1hdGlvbiB3YXMgY2FuY2VsbGVkXG4gICAgICAgICAgcHJldmlvdXNQbGF5ZXJzID0gcHJldmlvdXNQbGF5ZXJzLmZpbHRlcihmaWx0ZXJXZWJBbmltYXRpb25QbGF5ZXJGbik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBXZWJBbmltYXRpb25zUGxheWVyKGVsZW1lbnQsIGZvcm1hdHRlZFN0ZXBzLCBwbGF5ZXJPcHRpb25zLCAvKiogQHR5cGUgez99ICovIChwcmV2aW91c1BsYXllcnMpKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gV2ViQW5pbWF0aW9uc0RyaXZlcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAqIEBwYXJhbSB7P30gZGVmYXVsdFN0eWxlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX3BvcHVsYXRlU3R5bGVzKHN0eWxlcywgZGVmYXVsdFN0eWxlcykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGF0YSA9IHt9O1xuICAgICAgc3R5bGVzLnN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyBPYmplY3Qua2V5cyhlbnRyeSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeyBkYXRhW3Byb3BdID0gZW50cnlbcHJvcF07IH0pOyB9KTtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRTdHlsZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBpZiAoIWlzUHJlc2VudChkYXRhW3Byb3BdKSkge1xuICAgICAgICAgICAgICBkYXRhW3Byb3BdID0gZGVmYXVsdFN0eWxlc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBsYXllclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZmlsdGVyV2ViQW5pbWF0aW9uUGxheWVyRm4ocGxheWVyKSB7XG4gICAgICByZXR1cm4gcGxheWVyIGluc3RhbmNlb2YgV2ViQW5pbWF0aW9uc1BsYXllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQxID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFueSBicm93c2VyIGVudmlyb25tZW50LlxuICAgICogKlxuICAgICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIoKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRpb25QcmVmaXggPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmQgPSBudWxsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBlbGVtZW50XzEgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHRoaXMuZGVmYXVsdERvYygpKTtcbiAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmdldFN0eWxlKGVsZW1lbnRfMSwgJ2FuaW1hdGlvbk5hbWUnKSkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIGRvbVByZWZpeGVzID0gWydXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tUHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KHRoaXMuZ2V0U3R5bGUoZWxlbWVudF8xLCBkb21QcmVmaXhlc1tpXSArICdBbmltYXRpb25OYW1lJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblByZWZpeCA9ICctJyArIGRvbVByZWZpeGVzW2ldLnRvTG93ZXJDYXNlKCkgKyAnLSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgdHJhbnNFbmRFdmVudE5hbWVzXzEgPSB7XG4gICAgICAgICAgICAgICAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICAgICAgICAgICAgICBNb3pUcmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgICAgICAgICAgICAgICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0cmFuc0VuZEV2ZW50TmFtZXNfMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KF90aGlzLmdldFN0eWxlKGVsZW1lbnRfMSwga2V5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdHJhbnNpdGlvbkVuZCA9IHRyYW5zRW5kRXZlbnROYW1lc18xW2tleV07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLl9hbmltYXRpb25QcmVmaXggPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0RGlzdHJpYnV0ZWROb2RlcyA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gKChlbCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBiYXNlVXJsXG4gICAgICAgKiBAcGFyYW0gez99IGhyZWZcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVzb2x2ZUFuZFNldEhyZWYgPSBmdW5jdGlvbiAoZWwsIGJhc2VVcmwsIGhyZWYpIHtcbiAgICAgICAgICBlbC5ocmVmID0gaHJlZiA9PSBudWxsID8gYmFzZVVybCA6IGJhc2VVcmwgKyAnLy4uLycgKyBocmVmO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c0RPTUV2ZW50cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc3VwcG9ydHNOYXRpdmVTaGFkb3dET00gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiAoKHRoaXMuZGVmYXVsdERvYygpLmJvZHkpKS5jcmVhdGVTaGFkb3dSb290ID09PSAnZnVuY3Rpb24nO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRBbmltYXRpb25QcmVmaXggPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9hbmltYXRpb25QcmVmaXggPyB0aGlzLl9hbmltYXRpb25QcmVmaXggOiAnJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbkVuZCA/IHRoaXMuX3RyYW5zaXRpb25FbmQgOiAnJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c0FuaW1hdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2FuaW1hdGlvblByZWZpeCkgJiYgaXNQcmVzZW50KHRoaXMuX3RyYW5zaXRpb25FbmQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXI7XG4gIH0oRG9tQWRhcHRlcikpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX2F0dHJUb1Byb3BNYXAgPSB7XG4gICAgICAnY2xhc3MnOiAnY2xhc3NOYW1lJyxcbiAgICAgICdpbm5lckh0bWwnOiAnaW5uZXJIVE1MJyxcbiAgICAgICdyZWFkb25seSc6ICdyZWFkT25seScsXG4gICAgICAndGFiaW5kZXgnOiAndGFiSW5kZXgnLFxuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBET01fS0VZX0xPQ0FUSU9OX05VTVBBRCA9IDM7XG4gIC8vIE1hcCB0byBjb252ZXJ0IHNvbWUga2V5IG9yIGtleUlkZW50aWZpZXIgdmFsdWVzIHRvIHdoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBnZXRFdmVudEtleVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfa2V5TWFwID0ge1xuICAgICAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZFxuICAgICAgLy8gY2YgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLWtleS9cbiAgICAgICdcXGInOiAnQmFja3NwYWNlJyxcbiAgICAgICdcXHQnOiAnVGFiJyxcbiAgICAgICdcXHg3Ric6ICdEZWxldGUnLFxuICAgICAgJ1xceDFCJzogJ0VzY2FwZScsXG4gICAgICAnRGVsJzogJ0RlbGV0ZScsXG4gICAgICAnRXNjJzogJ0VzY2FwZScsXG4gICAgICAnTGVmdCc6ICdBcnJvd0xlZnQnLFxuICAgICAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLFxuICAgICAgJ1VwJzogJ0Fycm93VXAnLFxuICAgICAgJ0Rvd24nOiAnQXJyb3dEb3duJyxcbiAgICAgICdNZW51JzogJ0NvbnRleHRNZW51JyxcbiAgICAgICdTY3JvbGwnOiAnU2Nyb2xsTG9jaycsXG4gICAgICAnV2luJzogJ09TJ1xuICB9O1xuICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDaHJvbWUgZm9yIG51bWVyaWMga2V5cGFkIGtleXM6XG4gIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbiAgLy8gMSwgMiwgMyAuLi4gYXJlIHJlcG9ydGVkIGFzIEEsIEIsIEMgLi4uXG4gIHZhciAvKiogQHR5cGUgez99ICovIF9jaHJvbWVOdW1LZXlQYWRNYXAgPSB7XG4gICAgICAnQSc6ICcxJyxcbiAgICAgICdCJzogJzInLFxuICAgICAgJ0MnOiAnMycsXG4gICAgICAnRCc6ICc0JyxcbiAgICAgICdFJzogJzUnLFxuICAgICAgJ0YnOiAnNicsXG4gICAgICAnRyc6ICc3JyxcbiAgICAgICdIJzogJzgnLFxuICAgICAgJ0knOiAnOScsXG4gICAgICAnSic6ICcqJyxcbiAgICAgICdLJzogJysnLFxuICAgICAgJ00nOiAnLScsXG4gICAgICAnTic6ICcuJyxcbiAgICAgICdPJzogJy8nLFxuICAgICAgJ1xceDYwJzogJzAnLFxuICAgICAgJ1xceDkwJzogJ051bUxvY2snXG4gIH07XG4gIC8qKlxuICAgKiBBIGBEb21BZGFwdGVyYCBwb3dlcmVkIGJ5IGZ1bGwgYnJvd3NlciBET00gQVBJcy5cbiAgICpcbiAgICogQHNlY3VyaXR5IFRyZWFkIGNhcmVmdWxseSEgSW50ZXJhY3Rpbmcgd2l0aCB0aGUgRE9NIGRpcmVjdGx5IGlzIGRhbmdlcm91cyBhbmRcbiAgICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpyZXF1aXJlUGFyYW1ldGVyVHlwZSBuby1jb25zb2xlICovXG4gIHZhciBCcm93c2VyRG9tQWRhcHRlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMoQnJvd3NlckRvbUFkYXB0ZXIsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBCcm93c2VyRG9tQWRhcHRlcigpIHtcbiAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZUh0bWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZUh0bWwpIHsgdGhyb3cgbmV3IEVycm9yKCdwYXJzZSBub3QgaW1wbGVtZW50ZWQnKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIubWFrZUN1cnJlbnQgPSBmdW5jdGlvbiAoKSB7IHNldFJvb3REb21BZGFwdGVyKG5ldyBCcm93c2VyRG9tQWRhcHRlcigpKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNQcm9wZXJ0eSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lKSB7IHJldHVybiBuYW1lIGluIGVsZW1lbnQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsLCBuYW1lLCB2YWx1ZSkgeyAoKGVsKSlbbmFtZV0gPSB2YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiAoZWwsIG5hbWUpIHsgcmV0dXJuICgoZWwpKVtuYW1lXTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBtZXRob2ROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGFyZ3NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5pbnZva2UgPSBmdW5jdGlvbiAoZWwsIG1ldGhvZE5hbWUsIGFyZ3MpIHsgKF9hID0gKChlbCkpKVttZXRob2ROYW1lXS5hcHBseShfYSwgYXJncyk7IHZhciBfYTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmxvZ0Vycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIHtcbiAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlcnJvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmxvZ0dyb3VwID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwICYmIHdpbmRvdy5jb25zb2xlLmdyb3VwKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUubG9nR3JvdXBFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kICYmIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUsIFwiYXR0clRvUHJvcE1hcFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9hdHRyVG9Qcm9wTWFwOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7IHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IgPSBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgcmV0dXJuIChlbC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCA9IGZ1bmN0aW9uIChlbCwgc2VsZWN0b3IpIHsgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IGV2dFxuICAgICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGVsLCBldnQsIGxpc3RlbmVyKSB7IGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IGV2dFxuICAgICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm9uQW5kQ2FuY2VsID0gZnVuY3Rpb24gKGVsLCBldnQsIGxpc3RlbmVyKSB7XG4gICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgLy8gTmVlZGVkIHRvIGZvbGxvdyBEYXJ0J3Mgc3Vic2NyaXB0aW9uIHNlbWFudGljLCB1bnRpbCBmaXggb2ZcbiAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhcnQvaXNzdWVzL2RldGFpbD9pZD0xNzQwNlxuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UpOyB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBldnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGVsLCBldnQpIHsgZWwuZGlzcGF0Y2hFdmVudChldnQpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50VHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZU1vdXNlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgICAgICAgICBldnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuIGV2dDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRUeXBlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICAgICAgZXZ0LmluaXRFdmVudChldmVudFR5cGUsIHRydWUsIHRydWUpO1xuICAgICAgICAgIHJldHVybiBldnQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBldnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5pc1ByZXZlbnRlZCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICByZXR1cm4gZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaXNQcmVzZW50KGV2dC5yZXR1cm5WYWx1ZSkgJiYgIWV2dC5yZXR1cm5WYWx1ZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRJbm5lckhUTUwgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmlubmVySFRNTDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFRlbXBsYXRlQ29udGVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiAnY29udGVudCcgaW4gZWwgJiYgZWwgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID8gZWwuY29udGVudCA6IG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0T3V0ZXJIVE1MID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5vdXRlckhUTUw7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm5vZGVOYW1lID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUubm9kZU5hbWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm5vZGVWYWx1ZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVWYWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnR5cGU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc1Byb3BlcnR5KG5vZGUsICdjb250ZW50JykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICgobm9kZSkpLmNvbnRlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZmlyc3RDaGlsZCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuZmlyc3RDaGlsZDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm5leHRTaWJsaW5nID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5uZXh0U2libGluZzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnBhcmVudEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLnBhcmVudE5vZGU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jaGlsZE5vZGVzID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jaGlsZE5vZGVzOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY2hpbGROb2Rlc0FzTGlzdCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IG5ldyBBcnJheShjaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgcmVzW2ldID0gY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jbGVhck5vZGVzID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgZWwucmVtb3ZlQ2hpbGQoZWwuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAoZWwsIG5vZGUpIHsgZWwuYXBwZW5kQ2hpbGQobm9kZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGVsLCBub2RlKSB7IGVsLnJlbW92ZUNoaWxkKG5vZGUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkXG4gICAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVwbGFjZUNoaWxkID0gZnVuY3Rpb24gKGVsLCBuZXdDaGlsZCwgb2xkQ2hpbGQpIHsgZWwucmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKGVsLCBub2RlKSB7IGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmluc2VydEFsbEJlZm9yZSA9IGZ1bmN0aW9uIChlbCwgbm9kZXMpIHtcbiAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IHJldHVybiBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBlbCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAoZWwsIG5vZGUpIHsgZWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZWwubmV4dFNpYmxpbmcpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0SW5uZXJIVE1MID0gZnVuY3Rpb24gKGVsLCB2YWx1ZSkgeyBlbC5pbm5lckhUTUwgPSB2YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLnRleHRDb250ZW50OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0VGV4dCA9IGZ1bmN0aW9uIChlbCwgdmFsdWUpIHsgZWwudGV4dENvbnRlbnQgPSB2YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC52YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKGVsLCB2YWx1ZSkgeyBlbC52YWx1ZSA9IHZhbHVlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0Q2hlY2tlZCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2hlY2tlZDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldENoZWNrZWQgPSBmdW5jdGlvbiAoZWwsIHZhbHVlKSB7IGVsLmNoZWNrZWQgPSB2YWx1ZTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0ZXh0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlQ29tbWVudCA9IGZ1bmN0aW9uICh0ZXh0KSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KHRleHQpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGh0bWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVUZW1wbGF0ZSA9IGZ1bmN0aW9uIChodG1sKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgdC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0YWdOYW1lXG4gICAgICAgKiBAcGFyYW0gez89fSBkb2NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MgPT09IHZvaWQgMCkgeyBkb2MgPSBkb2N1bWVudDsgfVxuICAgICAgICAgIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbnNcbiAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudE5TID0gZnVuY3Rpb24gKG5zLCB0YWdOYW1lLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jID09PSB2b2lkIDApIHsgZG9jID0gZG9jdW1lbnQ7IH1cbiAgICAgICAgICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnROUyhucywgdGFnTmFtZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRleHRcbiAgICAgICAqIEBwYXJhbSB7Pz19IGRvY1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVRleHROb2RlID0gZnVuY3Rpb24gKHRleHQsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MgPT09IHZvaWQgMCkgeyBkb2MgPSBkb2N1bWVudDsgfVxuICAgICAgICAgIHJldHVybiBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJWYWx1ZVxuICAgICAgICogQHBhcmFtIHs/PX0gZG9jXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlU2NyaXB0VGFnID0gZnVuY3Rpb24gKGF0dHJOYW1lLCBhdHRyVmFsdWUsIGRvYykge1xuICAgICAgICAgIGlmIChkb2MgPT09IHZvaWQgMCkgeyBkb2MgPSBkb2N1bWVudDsgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVsID0gKGRvYy5jcmVhdGVFbGVtZW50KCdTQ1JJUFQnKSk7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3NzXG4gICAgICAgKiBAcGFyYW0gez89fSBkb2NcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVTdHlsZUVsZW1lbnQgPSBmdW5jdGlvbiAoY3NzLCBkb2MpIHtcbiAgICAgICAgICBpZiAoZG9jID09PSB2b2lkIDApIHsgZG9jID0gZG9jdW1lbnQ7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZSA9IChkb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSk7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChzdHlsZSwgdGhpcy5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gKChlbCkpLmNyZWF0ZVNoYWRvd1Jvb3QoKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFNoYWRvd1Jvb3QgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICgoZWwpKS5zaGFkb3dSb290OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SG9zdCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gKChlbCkpLmhvc3Q7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUuY2xvbmVOb2RlKHRydWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobmFtZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNsYXNzTGlzdCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbGVtZW50LmNsYXNzTGlzdCwgMCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHsgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHsgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZU5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVWYWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldFN0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVtb3ZlU3R5bGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgc3R5bGVuYW1lKSB7XG4gICAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzc5MTZcbiAgICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlbmFtZV0gPSAnJztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdHlsZW5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRTdHlsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZW5hbWUpIHsgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVuYW1lXTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlTmFtZVxuICAgICAgICogQHBhcmFtIHs/PX0gc3R5bGVWYWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmhhc1N0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICAgICAgICAgIGlmIChzdHlsZVZhbHVlID09PSB2b2lkIDApIHsgc3R5bGVWYWx1ZSA9IG51bGw7IH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IHRoaXMuZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVOYW1lKSB8fCAnJztcbiAgICAgICAgICByZXR1cm4gc3R5bGVWYWx1ZSA/IHZhbHVlID09IHN0eWxlVmFsdWUgOiB2YWx1ZS5sZW5ndGggPiAwO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUudGFnTmFtZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBlbGVtZW50LnRhZ05hbWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmF0dHJpYnV0ZU1hcCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVsQXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGVsQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0cmliID0gZWxBdHRyc1tpXTtcbiAgICAgICAgICAgICAgcmVzLnNldChhdHRyaWIubmFtZSwgYXR0cmliLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbnNcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaGFzQXR0cmlidXRlTlMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbnMsIGF0dHJpYnV0ZSkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKG5zLCBhdHRyaWJ1dGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuc1xuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbnMsIG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhucywgbmFtZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lLCB2YWx1ZSkgeyBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBuc1xuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbnMsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhucywgbmFtZSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGF0dHJpYnV0ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGUpIHsgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5zXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50LCBucywgbmFtZSkge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTlMobnMsIG5hbWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnRlbXBsYXRlQXdhcmVSb290ID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzLmlzVGVtcGxhdGVFbGVtZW50KGVsKSA/IHRoaXMuY29udGVudChlbCkgOiBlbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZUh0bWxEb2N1bWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCdmYWtlVGl0bGUnKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5kZWZhdWx0RG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvY3VtZW50LnRpdGxlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5ld1RpdGxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0VGl0bGUgPSBmdW5jdGlvbiAobmV3VGl0bGUpIHsgZG9jdW1lbnQudGl0bGUgPSBuZXdUaXRsZSB8fCAnJzsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZWxlbWVudE1hdGNoZXMgPSBmdW5jdGlvbiAobiwgc2VsZWN0b3IpIHtcbiAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBuLm1hdGNoZXMgJiYgbi5tYXRjaGVzKHNlbGVjdG9yKSB8fFxuICAgICAgICAgICAgICAgICAgbi5tc01hdGNoZXNTZWxlY3RvciAmJiBuLm1zTWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSB8fFxuICAgICAgICAgICAgICAgICAgbi53ZWJraXRNYXRjaGVzU2VsZWN0b3IgJiYgbi53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaXNUZW1wbGF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlbC5ub2RlTmFtZSA9PSAnVEVNUExBVEUnO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaXNUZXh0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaXNDb21tZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkNPTU1FTlRfTk9ERTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaXNFbGVtZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaGFzU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIGlzUHJlc2VudChub2RlLnNoYWRvd1Jvb3QpICYmIG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW1wb3J0SW50b0RvYyA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRoaXMudGVtcGxhdGVBd2FyZVJvb3Qobm9kZSksIHRydWUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5hZG9wdE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZG9jdW1lbnQuYWRvcHROb2RlKG5vZGUpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SHJlZiA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gKChlbCkpLmhyZWY7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRFdmVudEtleSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IGV2ZW50LmtleTtcbiAgICAgICAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICAgICAgICAgIGtleSA9IGV2ZW50LmtleUlkZW50aWZpZXI7XG4gICAgICAgICAgICAgIC8vIGtleUlkZW50aWZpZXIgaXMgZGVmaW5lZCBpbiB0aGUgb2xkIGRyYWZ0IG9mIERPTSBMZXZlbCAzIEV2ZW50cyBpbXBsZW1lbnRlZCBieSBDaHJvbWUgYW5kXG4gICAgICAgICAgICAgIC8vIFNhZmFyaSBjZlxuICAgICAgICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA3L1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDA3MTIyMS9ldmVudHMuaHRtbCNFdmVudHMtS2V5Ym9hcmRFdmVudHMtSW50ZXJmYWNlc1xuICAgICAgICAgICAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gJ1VuaWRlbnRpZmllZCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCdVKycpKSB7XG4gICAgICAgICAgICAgICAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGtleS5zdWJzdHJpbmcoMiksIDE2KSk7XG4gICAgICAgICAgICAgICAgICBpZiAoZXZlbnQubG9jYXRpb24gPT09IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEICYmIF9jaHJvbWVOdW1LZXlQYWRNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIGluIENocm9tZSBmb3IgbnVtZXJpYyBrZXlwYWQga2V5czpcbiAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTU1NjU0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gMSwgMiwgMyAuLi4gYXJlIHJlcG9ydGVkIGFzIEEsIEIsIEMgLi4uXG4gICAgICAgICAgICAgICAgICAgICAga2V5ID0gKChfY2hyb21lTnVtS2V5UGFkTWFwKSlba2V5XTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2tleU1hcFtrZXldIHx8IGtleTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0R2xvYmFsRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRhcmdldCA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0YXJnZXQgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SGlzdG9yeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5oaXN0b3J5OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB3aW5kb3cubG9jYXRpb247IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRCYXNlSHJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBocmVmID0gZ2V0QmFzZUVsZW1lbnRIcmVmKCk7XG4gICAgICAgICAgcmV0dXJuIGlzQmxhbmsoaHJlZikgPyBudWxsIDogcmVsYXRpdmVQYXRoKGhyZWYpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlc2V0QmFzZUVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7IGJhc2VFbGVtZW50ID0gbnVsbDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFVzZXJBZ2VudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldERhdGEgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS0nICsgbmFtZSwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtJyArIG5hbWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRHbG9iYWxWYXIgPSBmdW5jdGlvbiAocGF0aCwgdmFsdWUpIHsgc2V0VmFsdWVPblBhdGgoZ2xvYmFsJDEsIHBhdGgsIHZhbHVlKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzV2ViQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgKChFbGVtZW50KSkucHJvdG90eXBlWydhbmltYXRlJ10gPT09ICdmdW5jdGlvbic7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucGVyZm9ybWFuY2VOb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gcGVyZm9ybWFuY2Uubm93KCkgaXMgbm90IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnMsIHNlZVxuICAgICAgICAgIC8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXBlcmZvcm1hbmNlLm5vd1xuICAgICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSA6XG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzQ29va2llcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBwYXJzZUNvb2tpZVZhbHVlKGRvY3VtZW50LmNvb2tpZSwgbmFtZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIC8vIGRvY3VtZW50LmNvb2tpZSBpcyBtYWdpY2FsLCBhc3NpZ25pbmcgaW50byBpdCBhc3NpZ25zL292ZXJyaWRlcyBvbmUgY29va2llIHZhbHVlLCBidXQgZG9lc1xuICAgICAgICAgIC8vIG5vdCBjbGVhciBvdGhlciBjb29raWVzLlxuICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJyb3dzZXJEb21BZGFwdGVyO1xuICB9KEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlcikpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBiYXNlRWxlbWVudCA9IG51bGw7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QmFzZUVsZW1lbnRIcmVmKCkge1xuICAgICAgaWYgKCFiYXNlRWxlbWVudCkge1xuICAgICAgICAgIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xuICAgICAgICAgIGlmICghYmFzZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VFbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICB9XG4gIC8vIGJhc2VkIG9uIHVybFV0aWxzLmpzIGluIEFuZ3VsYXJKUyAxXG4gIHZhciAvKiogQHR5cGUgez99ICovIHVybFBhcnNpbmdOb2RlO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB1cmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHJlbGF0aXZlUGF0aCh1cmwpIHtcbiAgICAgIGlmICghdXJsUGFyc2luZ05vZGUpIHtcbiAgICAgICAgICB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIH1cbiAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICByZXR1cm4gKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/IHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb29raWVTdHJcbiAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUNvb2tpZVZhbHVlKGNvb2tpZVN0ciwgbmFtZSkge1xuICAgICAgbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb29raWVTdHIuc3BsaXQoJzsnKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgY29va2llID0gX2FbX2ldO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVxSW5kZXggPSBjb29raWUuaW5kZXhPZignPScpO1xuICAgICAgICAgIHZhciBfYiA9IGVxSW5kZXggPT0gLTEgPyBbY29va2llLCAnJ10gOiBbY29va2llLnNsaWNlKDAsIGVxSW5kZXgpLCBjb29raWUuc2xpY2UoZXFJbmRleCArIDEpXSwgY29va2llTmFtZSA9IF9iWzBdLCBjb29raWVWYWx1ZSA9IF9iWzFdO1xuICAgICAgICAgIGlmIChjb29raWVOYW1lLnRyaW0oKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZSB1bmRlZmluZWRcbiAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICogKlxuICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN1cHBvcnRzU3RhdGUoKSB7XG4gICAgICByZXR1cm4gISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkMiA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgLyoqXG4gICAqICBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuXG4gICAgKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuIEluc3RlYWQsIHVzZVxuICAgICoge0BsaW5rIExvY2F0aW9ufS5cbiAgICovXG4gIHZhciBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMihCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uKCkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuX2luaXQoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2xvY2F0aW9uID0gZ2V0RE9NKCkuZ2V0TG9jYXRpb24oKTtcbiAgICAgICAgICB0aGlzLl9oaXN0b3J5ID0gZ2V0RE9NKCkuZ2V0SGlzdG9yeSgpO1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwibG9jYXRpb25cIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9sb2NhdGlvbjsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5nZXRCYXNlSHJlZkZyb21ET00gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRET00oKS5nZXRCYXNlSHJlZigpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUub25Qb3BTdGF0ZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIGdldERPTSgpLmdldEdsb2JhbEV2ZW50VGFyZ2V0KCd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGZuLCBmYWxzZSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUub25IYXNoQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQoJ3dpbmRvdycpLmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBmbiwgZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwicGF0aG5hbWVcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9sb2NhdGlvbi5wYXRobmFtZTsgfSxcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcGFyYW0gez99IG5ld1BhdGhcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1BhdGgpIHsgdGhpcy5fbG9jYXRpb24ucGF0aG5hbWUgPSBuZXdQYXRoOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwic2VhcmNoXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbG9jYXRpb24uc2VhcmNoOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwiaGFzaFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2xvY2F0aW9uLmhhc2g7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlXG4gICAgICAgKiBAcGFyYW0gez99IHRpdGxlXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24uaGFzaCA9IHVybDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0YXRlXG4gICAgICAgKiBAcGFyYW0gez99IHRpdGxlXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24uaGFzaCA9IHVybDtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5faGlzdG9yeS5mb3J3YXJkKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5iYWNrID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9oaXN0b3J5LmJhY2soKTsgfTtcbiAgICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgeyB0eXBlOiBjb3JlLkluamVjdGFibGUgfSxcbiAgICAgIF07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICByZXR1cm4gQnJvd3NlclBsYXRmb3JtTG9jYXRpb247XG4gIH0oX2FuZ3VsYXJfY29tbW9uLlBsYXRmb3JtTG9jYXRpb24pKTtcblxuICB2YXIgQnJvd3NlckdldFRlc3RhYmlsaXR5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJyb3dzZXJHZXRUZXN0YWJpbGl0eSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LmluaXQgPSBmdW5jdGlvbiAoKSB7IGNvcmUuc2V0VGVzdGFiaWxpdHlHZXR0ZXIobmV3IEJyb3dzZXJHZXRUZXN0YWJpbGl0eSgpKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWdpc3RyeVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LnByb3RvdHlwZS5hZGRUb1dpbmRvdyA9IGZ1bmN0aW9uIChyZWdpc3RyeSkge1xuICAgICAgICAgIGdsb2JhbCQxLmdldEFuZ3VsYXJUZXN0YWJpbGl0eSA9IGZ1bmN0aW9uIChlbGVtLCBmaW5kSW5BbmNlc3RvcnMpIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmRJbkFuY2VzdG9ycyA9PT0gdm9pZCAwKSB7IGZpbmRJbkFuY2VzdG9ycyA9IHRydWU7IH1cbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVzdGFiaWxpdHkgPSByZWdpc3RyeS5maW5kVGVzdGFiaWxpdHlJblRyZWUoZWxlbSwgZmluZEluQW5jZXN0b3JzKTtcbiAgICAgICAgICAgICAgaWYgKHRlc3RhYmlsaXR5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdGVzdGFiaWxpdHkgZm9yIGVsZW1lbnQuJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRlc3RhYmlsaXR5O1xuICAgICAgICAgIH07XG4gICAgICAgICAgZ2xvYmFsJDEuZ2V0QWxsQW5ndWxhclRlc3RhYmlsaXRpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiByZWdpc3RyeS5nZXRBbGxUZXN0YWJpbGl0aWVzKCk7IH07XG4gICAgICAgICAgZ2xvYmFsJDEuZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZ2lzdHJ5LmdldEFsbFJvb3RFbGVtZW50cygpOyB9O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHdoZW5BbGxTdGFibGUgPSBmdW5jdGlvbiAoY2FsbGJhY2sgLyoqIFRPRE8gIzkxMDAgKi8pIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGVzdGFiaWxpdGllcyA9IGdsb2JhbCQxLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzKCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvdW50ID0gdGVzdGFiaWxpdGllcy5sZW5ndGg7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRpZFdvcmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVjcmVtZW50ID0gZnVuY3Rpb24gKGRpZFdvcmtfIC8qKiBUT0RPICM5MTAwICovKSB7XG4gICAgICAgICAgICAgICAgICBkaWRXb3JrID0gZGlkV29yayB8fCBkaWRXb3JrXztcbiAgICAgICAgICAgICAgICAgIGNvdW50LS07XG4gICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRpZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB0ZXN0YWJpbGl0aWVzLmZvckVhY2goZnVuY3Rpb24gKHRlc3RhYmlsaXR5IC8qKiBUT0RPICM5MTAwICovKSB7XG4gICAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlKGRlY3JlbWVudCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKCFnbG9iYWwkMVsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXSkge1xuICAgICAgICAgICAgICBnbG9iYWwkMVsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnbG9iYWwkMVsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXS5wdXNoKHdoZW5BbGxTdGFibGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWdpc3RyeVxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtXG4gICAgICAgKiBAcGFyYW0gez99IGZpbmRJbkFuY2VzdG9yc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LnByb3RvdHlwZS5maW5kVGVzdGFiaWxpdHlJblRyZWUgPSBmdW5jdGlvbiAocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICAgIGlmIChlbGVtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHQgPSByZWdpc3RyeS5nZXRUZXN0YWJpbGl0eShlbGVtKTtcbiAgICAgICAgICBpZiAoaXNQcmVzZW50KHQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICghZmluZEluQW5jZXN0b3JzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZ2V0RE9NKCkuaXNTaGFkb3dSb290KGVsZW0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZ2V0RE9NKCkuZ2V0SG9zdChlbGVtKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZ2V0RE9NKCkucGFyZW50RWxlbWVudChlbGVtKSwgdHJ1ZSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJyb3dzZXJHZXRUZXN0YWJpbGl0eTtcbiAgfSgpKTtcblxuICAvKipcbiAgICogIEEgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBhbmQgc2V0IHRoZSB0aXRsZSBvZiBhIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAgICAqICpcbiAgICAqIFNpbmNlIGFuIEFuZ3VsYXIgMiBhcHBsaWNhdGlvbiBjYW4ndCBiZSBib290c3RyYXBwZWQgb24gdGhlIGVudGlyZSBIVE1MIGRvY3VtZW50IChgPGh0bWw+YCB0YWcpXG4gICAgKiBpdCBpcyBub3QgcG9zc2libGUgdG8gYmluZCB0byB0aGUgYHRleHRgIHByb3BlcnR5IG9mIHRoZSBgSFRNTFRpdGxlRWxlbWVudGAgZWxlbWVudHNcbiAgICAqIChyZXByZXNlbnRpbmcgdGhlIGA8dGl0bGU+YCB0YWcpLiBJbnN0ZWFkLCB0aGlzIHNlcnZpY2UgY2FuIGJlIHVzZWQgdG8gc2V0IGFuZCBnZXQgdGhlIGN1cnJlbnRcbiAgICAqIHRpdGxlIHZhbHVlLlxuICAgICogKlxuICAgKi9cbiAgdmFyIFRpdGxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFRpdGxlKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgR2V0IHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBIVE1MIGRvY3VtZW50LlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVGl0bGUucHJvdG90eXBlLmdldFRpdGxlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0RE9NKCkuZ2V0VGl0bGUoKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFNldCB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAgICAgICAqIEBwYXJhbSB7P30gbmV3VGl0bGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRpdGxlLnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uIChuZXdUaXRsZSkgeyBnZXRET00oKS5zZXRUaXRsZShuZXdUaXRsZSk7IH07XG4gICAgICByZXR1cm4gVGl0bGU7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqICBXcmFwcyBKYXZhc2NyaXB0IE9iamVjdHNcbiAgICovXG4gIHZhciBTdHJpbmdNYXBXcmFwcGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFN0cmluZ01hcFdyYXBwZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbTFcbiAgICAgICAqIEBwYXJhbSB7P30gbTJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFN0cmluZ01hcFdyYXBwZXIubWVyZ2UgPSBmdW5jdGlvbiAobTEsIG0yKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbSA9IHt9O1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhtMSk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBrID0gX2FbX2ldO1xuICAgICAgICAgICAgICBtW2tdID0gbTFba107XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSBPYmplY3Qua2V5cyhtMik7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgICAgICAgIHZhciBrID0gX2NbX2JdO1xuICAgICAgICAgICAgICBtW2tdID0gbTJba107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtMVxuICAgICAgICogQHBhcmFtIHs/fSBtMlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5lcXVhbHMgPSBmdW5jdGlvbiAobTEsIG0yKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gazEgPSBPYmplY3Qua2V5cyhtMSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gazIgPSBPYmplY3Qua2V5cyhtMik7XG4gICAgICAgICAgaWYgKGsxLmxlbmd0aCAhPSBrMi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgazEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gazFbaV07XG4gICAgICAgICAgICAgIGlmIChtMVtrZXldICE9PSBtMltrZXldKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFN0cmluZ01hcFdyYXBwZXI7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEEgREkgVG9rZW4gcmVwcmVzZW50aW5nIHRoZSBtYWluIHJlbmRlcmluZyBjb250ZXh0LiBJbiBhIGJyb3dzZXIgdGhpcyBpcyB0aGUgRE9NIERvY3VtZW50LlxuICAgKlxuICAgKiBOb3RlOiBEb2N1bWVudCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0IHdoZW4gQXBwbGljYXRpb24gYW5kIFJlbmRlcmluZ1xuICAgKiBDb250ZXh0cyBhcmUgbm90IHRoZSBzYW1lIChlLmcuIHdoZW4gcnVubmluZyB0aGUgYXBwbGljYXRpb24gaW50byBhIFdlYiBXb3JrZXIpLlxuICAgKlxuICAgKiBAc3RhYmxlXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBET0NVTUVOVCA9IG5ldyBjb3JlLk9wYXF1ZVRva2VuKCdEb2N1bWVudFRva2VuJyk7XG5cbiAgLyoqXG4gICAqIEBzdGFibGVcbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIEVWRU5UX01BTkFHRVJfUExVR0lOUyA9IG5ldyBjb3JlLk9wYXF1ZVRva2VuKCdFdmVudE1hbmFnZXJQbHVnaW5zJyk7XG4gIC8qKlxuICAgKiBAc3RhYmxlXG4gICAqL1xuICB2YXIgRXZlbnRNYW5hZ2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwbHVnaW5zXG4gICAgICAgKiBAcGFyYW0gez99IF96b25lXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEV2ZW50TWFuYWdlcihwbHVnaW5zLCBfem9uZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdGhpcy5fem9uZSA9IF96b25lO1xuICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5tYW5hZ2VyID0gX3RoaXM7IH0pO1xuICAgICAgICAgIHRoaXMuX3BsdWdpbnMgPSBwbHVnaW5zLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV2ZW50TWFuYWdlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHBsdWdpbi5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRhcmdldFxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXZlbnRNYW5hZ2VyLnByb3RvdHlwZS5hZGRHbG9iYWxFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGx1Z2luID0gdGhpcy5fZmluZFBsdWdpbkZvcihldmVudE5hbWUpO1xuICAgICAgICAgIHJldHVybiBwbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFdmVudE1hbmFnZXIucHJvdG90eXBlLmdldFpvbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl96b25lOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXZlbnRNYW5hZ2VyLnByb3RvdHlwZS5fZmluZFBsdWdpbkZvciA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbHVnaW4gPSB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAocGx1Z2luKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsdWdpbnMgPSB0aGlzLl9wbHVnaW5zO1xuICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBsdWdpbl8xID0gcGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgaWYgKHBsdWdpbl8xLnN1cHBvcnRzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luLnNldChldmVudE5hbWUsIHBsdWdpbl8xKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW5fMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBldmVudCBtYW5hZ2VyIHBsdWdpbiBmb3VuZCBmb3IgZXZlbnQgXCIgKyBldmVudE5hbWUpO1xuICAgICAgfTtcbiAgICAgIEV2ZW50TWFuYWdlci5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBFdmVudE1hbmFnZXIuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogY29yZS5JbmplY3QsIGFyZ3M6IFtFVkVOVF9NQU5BR0VSX1BMVUdJTlMsXSB9LF0gfSxcbiAgICAgICAgICB7IHR5cGU6IGNvcmUuTmdab25lLCB9LFxuICAgICAgXTsgfTtcbiAgICAgIHJldHVybiBFdmVudE1hbmFnZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBFdmVudE1hbmFnZXJQbHVnaW4gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gRXZlbnRNYW5hZ2VyUGx1Z2luKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBFdmVudE1hbmFnZXJQbHVnaW4ucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRXZlbnRNYW5hZ2VyUGx1Z2luLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEV2ZW50TWFuYWdlclBsdWdpbi5wcm90b3R5cGUuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YXJnZXQgPSBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldChlbGVtZW50KTtcbiAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBldmVudCB0YXJnZXQgXCIgKyB0YXJnZXQgKyBcIiBmb3IgZXZlbnQgXCIgKyBldmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGRFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgICA7XG4gICAgICByZXR1cm4gRXZlbnRNYW5hZ2VyUGx1Z2luO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQ0ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgU2hhcmVkU3R5bGVzSG9zdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTaGFyZWRTdHlsZXNIb3N0KCkge1xuICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICB0aGlzLl9zdHlsZXMgPSBbXTtcbiAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgdGhpcy5fc3R5bGVzU2V0ID0gbmV3IFNldCgpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUuYWRkU3R5bGVzID0gZnVuY3Rpb24gKHN0eWxlcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYWRkaXRpb25zID0gW107XG4gICAgICAgICAgc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICAgICAgICAgIGlmICghX3RoaXMuX3N0eWxlc1NldC5oYXMoc3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fc3R5bGVzU2V0LmFkZChzdHlsZSk7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5fc3R5bGVzLnB1c2goc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgYWRkaXRpb25zLnB1c2goc3R5bGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5vblN0eWxlc0FkZGVkKGFkZGl0aW9ucyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGFkZGl0aW9uc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUub25TdHlsZXNBZGRlZCA9IGZ1bmN0aW9uIChhZGRpdGlvbnMpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUuZ2V0QWxsU3R5bGVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc3R5bGVzOyB9O1xuICAgICAgU2hhcmVkU3R5bGVzSG9zdC5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBTaGFyZWRTdHlsZXNIb3N0LmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICByZXR1cm4gU2hhcmVkU3R5bGVzSG9zdDtcbiAgfSgpKTtcbiAgdmFyIERvbVNoYXJlZFN0eWxlc0hvc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDQoRG9tU2hhcmVkU3R5bGVzSG9zdCwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkb2NcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRG9tU2hhcmVkU3R5bGVzSG9zdChkb2MpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9ob3N0Tm9kZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgdGhpcy5faG9zdE5vZGVzLmFkZChkb2MuaGVhZCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNoYXJlZFN0eWxlc0hvc3QucHJvdG90eXBlLl9hZGRTdHlsZXNUb0hvc3QgPSBmdW5jdGlvbiAoc3R5bGVzLCBob3N0KSB7XG4gICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IHN0eWxlc1tpXTtcbiAgICAgICAgICAgICAgaG9zdC5hcHBlbmRDaGlsZChzdHlsZUVsKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGhvc3ROb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TaGFyZWRTdHlsZXNIb3N0LnByb3RvdHlwZS5hZGRIb3N0ID0gZnVuY3Rpb24gKGhvc3ROb2RlKSB7XG4gICAgICAgICAgdGhpcy5fYWRkU3R5bGVzVG9Ib3N0KHRoaXMuX3N0eWxlcywgaG9zdE5vZGUpO1xuICAgICAgICAgIHRoaXMuX2hvc3ROb2Rlcy5hZGQoaG9zdE5vZGUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0Tm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUucmVtb3ZlSG9zdCA9IGZ1bmN0aW9uIChob3N0Tm9kZSkgeyB0aGlzLl9ob3N0Tm9kZXMuZGVsZXRlKGhvc3ROb2RlKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNoYXJlZFN0eWxlc0hvc3QucHJvdG90eXBlLm9uU3R5bGVzQWRkZWQgPSBmdW5jdGlvbiAoYWRkaXRpb25zKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaG9zdE5vZGUpIHsgX3RoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKTsgfSk7XG4gICAgICB9O1xuICAgICAgRG9tU2hhcmVkU3R5bGVzSG9zdC5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBEb21TaGFyZWRTdHlsZXNIb3N0LmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBjb3JlLkluamVjdCwgYXJnczogW0RPQ1VNRU5ULF0gfSxdIH0sXG4gICAgICBdOyB9O1xuICAgICAgcmV0dXJuIERvbVNoYXJlZFN0eWxlc0hvc3Q7XG4gIH0oU2hhcmVkU3R5bGVzSG9zdCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOQU1FU1BBQ0VfVVJJUyA9IHtcbiAgICAgICd4bGluayc6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyxcbiAgICAgICdzdmcnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgJ3hodG1sJzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnXG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIFRFTVBMQVRFX0NPTU1FTlRfVEVYVCA9ICd0ZW1wbGF0ZSBiaW5kaW5ncz17fSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFRFTVBMQVRFX0JJTkRJTkdTX0VYUCA9IC9edGVtcGxhdGUgYmluZGluZ3M9KC4qKSQvO1xuICAvKipcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgRG9tUm9vdFJlbmRlcmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBkb2N1bWVudFxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE1hbmFnZXJcbiAgICAgICAqIEBwYXJhbSB7P30gc2hhcmVkU3R5bGVzSG9zdFxuICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb25Ecml2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gYXBwSWRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRG9tUm9vdFJlbmRlcmVyKGRvY3VtZW50LCBldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGFuaW1hdGlvbkRyaXZlciwgYXBwSWQpIHtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0ID0gc2hhcmVkU3R5bGVzSG9zdDtcbiAgICAgICAgICB0aGlzLmFuaW1hdGlvbkRyaXZlciA9IGFuaW1hdGlvbkRyaXZlcjtcbiAgICAgICAgICB0aGlzLmFwcElkID0gYXBwSWQ7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ29tcG9uZW50cyA9IG5ldyBNYXAoKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRQcm90b1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUm9vdFJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50UHJvdG8pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZW5kZXJlciA9IHRoaXMucmVnaXN0ZXJlZENvbXBvbmVudHMuZ2V0KGNvbXBvbmVudFByb3RvLmlkKTtcbiAgICAgICAgICBpZiAoIXJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyID0gbmV3IERvbVJlbmRlcmVyKHRoaXMsIGNvbXBvbmVudFByb3RvLCB0aGlzLmFuaW1hdGlvbkRyaXZlciwgdGhpcy5hcHBJZCArIFwiLVwiICsgY29tcG9uZW50UHJvdG8uaWQpO1xuICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRDb21wb25lbnRzLnNldChjb21wb25lbnRQcm90by5pZCwgcmVuZGVyZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIERvbVJvb3RSZW5kZXJlcjtcbiAgfSgpKTtcbiAgdmFyIERvbVJvb3RSZW5kZXJlcl8gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDMoRG9tUm9vdFJlbmRlcmVyXywgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gX2V2ZW50TWFuYWdlclxuICAgICAgICogQHBhcmFtIHs/fSBzaGFyZWRTdHlsZXNIb3N0XG4gICAgICAgKiBAcGFyYW0gez99IGFuaW1hdGlvbkRyaXZlclxuICAgICAgICogQHBhcmFtIHs/fSBhcHBJZFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBEb21Sb290UmVuZGVyZXJfKF9kb2N1bWVudCwgX2V2ZW50TWFuYWdlciwgc2hhcmVkU3R5bGVzSG9zdCwgYW5pbWF0aW9uRHJpdmVyLCBhcHBJZCkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIF9kb2N1bWVudCwgX2V2ZW50TWFuYWdlciwgc2hhcmVkU3R5bGVzSG9zdCwgYW5pbWF0aW9uRHJpdmVyLCBhcHBJZCk7XG4gICAgICB9XG4gICAgICBEb21Sb290UmVuZGVyZXJfLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgeyB0eXBlOiBjb3JlLkluamVjdGFibGUgfSxcbiAgICAgIF07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIERvbVJvb3RSZW5kZXJlcl8uY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IGNvcmUuSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQsXSB9LF0gfSxcbiAgICAgICAgICB7IHR5cGU6IEV2ZW50TWFuYWdlciwgfSxcbiAgICAgICAgICB7IHR5cGU6IERvbVNoYXJlZFN0eWxlc0hvc3QsIH0sXG4gICAgICAgICAgeyB0eXBlOiBBbmltYXRpb25Ecml2ZXIsIH0sXG4gICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IGNvcmUuSW5qZWN0LCBhcmdzOiBbY29yZS5BUFBfSUQsXSB9LF0gfSxcbiAgICAgIF07IH07XG4gICAgICByZXR1cm4gRG9tUm9vdFJlbmRlcmVyXztcbiAgfShEb21Sb290UmVuZGVyZXIpKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRElSRUNUX0RPTV9SRU5ERVJFUiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uIChub2RlLCBwYXJlbnQpIHsgcGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOyB9LFxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gcmVmTm9kZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbiAobm9kZSwgcmVmTm9kZSkgeyByZWZOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpOyB9LFxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIG5leHRTaWJsaW5nOiBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5uZXh0U2libGluZzsgfSxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBub2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBwYXJlbnRFbGVtZW50OiBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gKG5vZGUucGFyZW50Tm9kZSk7IH1cbiAgfTtcbiAgdmFyIERvbVJlbmRlcmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfcm9vdFJlbmRlcmVyXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFByb3RvXG4gICAgICAgKiBAcGFyYW0gez99IF9hbmltYXRpb25Ecml2ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVTaGltSWRcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gRG9tUmVuZGVyZXIoX3Jvb3RSZW5kZXJlciwgY29tcG9uZW50UHJvdG8sIF9hbmltYXRpb25Ecml2ZXIsIHN0eWxlU2hpbUlkKSB7XG4gICAgICAgICAgdGhpcy5fcm9vdFJlbmRlcmVyID0gX3Jvb3RSZW5kZXJlcjtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFByb3RvID0gY29tcG9uZW50UHJvdG87XG4gICAgICAgICAgdGhpcy5fYW5pbWF0aW9uRHJpdmVyID0gX2FuaW1hdGlvbkRyaXZlcjtcbiAgICAgICAgICB0aGlzLmRpcmVjdFJlbmRlcmVyID0gRElSRUNUX0RPTV9SRU5ERVJFUjtcbiAgICAgICAgICB0aGlzLl9zdHlsZXMgPSBmbGF0dGVuU3R5bGVzKHN0eWxlU2hpbUlkLCBjb21wb25lbnRQcm90by5zdHlsZXMsIFtdKTtcbiAgICAgICAgICBpZiAoY29tcG9uZW50UHJvdG8uZW5jYXBzdWxhdGlvbiAhPT0gY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5OYXRpdmUpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdFJlbmRlcmVyLnNoYXJlZFN0eWxlc0hvc3QuYWRkU3R5bGVzKHRoaXMuX3N0eWxlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFByb3RvLmVuY2Fwc3VsYXRpb24gPT09IGNvcmUuVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY29udGVudEF0dHIgPSBzaGltQ29udGVudEF0dHJpYnV0ZShzdHlsZVNoaW1JZCk7XG4gICAgICAgICAgICAgIHRoaXMuX2hvc3RBdHRyID0gc2hpbUhvc3RBdHRyaWJ1dGUoc3R5bGVTaGltSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fY29udGVudEF0dHIgPSBudWxsO1xuICAgICAgICAgICAgICB0aGlzLl9ob3N0QXR0ciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yT3JOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IGRlYnVnSW5mb1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLnNlbGVjdFJvb3RFbGVtZW50ID0gZnVuY3Rpb24gKHNlbGVjdG9yT3JOb2RlLCBkZWJ1Z0luZm8pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbDtcbiAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JOb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBlbCA9IHRoaXMuX3Jvb3RSZW5kZXJlci5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yT3JOb2RlKTtcbiAgICAgICAgICAgICAgaWYgKCFlbCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNlbGVjdG9yIFxcXCJcIiArIHNlbGVjdG9yT3JOb2RlICsgXCJcXFwiIGRpZCBub3QgbWF0Y2ggYW55IGVsZW1lbnRzXCIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBlbCA9IHNlbGVjdG9yT3JOb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoZWwuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbC5yZW1vdmVDaGlsZChlbC5maXJzdENoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBkZWJ1Z0luZm9cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmVudCwgbmFtZSwgZGVidWdJbmZvKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZWw7XG4gICAgICAgICAgaWYgKGlzTmFtZXNwYWNlZChuYW1lKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuc0FuZE5hbWUgPSBzcGxpdE5hbWVzcGFjZShuYW1lKTtcbiAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoKE5BTUVTUEFDRV9VUklTKVtuc0FuZE5hbWVbMF1dLCBuc0FuZE5hbWVbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fY29udGVudEF0dHIpIHtcbiAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKHRoaXMuX2NvbnRlbnRBdHRyLCAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVZpZXdSb290ID0gZnVuY3Rpb24gKGhvc3RFbGVtZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZXNQYXJlbnQ7XG4gICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UHJvdG8uZW5jYXBzdWxhdGlvbiA9PT0gY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5OYXRpdmUpIHtcbiAgICAgICAgICAgICAgbm9kZXNQYXJlbnQgPSAoKGhvc3RFbGVtZW50KSkuY3JlYXRlU2hhZG93Um9vdCgpO1xuICAgICAgICAgICAgICB0aGlzLl9yb290UmVuZGVyZXIuc2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0KG5vZGVzUGFyZW50KTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHRoaXMuX3N0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gdGhpcy5fc3R5bGVzW2ldO1xuICAgICAgICAgICAgICAgICAgbm9kZXNQYXJlbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0QXR0cikge1xuICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuX2hvc3RBdHRyLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbm9kZXNQYXJlbnQgPSBob3N0RWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5vZGVzUGFyZW50O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IGRlYnVnSW5mb1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRlbXBsYXRlQW5jaG9yID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQsIGRlYnVnSW5mbykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFRFTVBMQVRFX0NPTU1FTlRfVEVYVCk7XG4gICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb21tZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudEVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7P30gZGVidWdJbmZvXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21SZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlVGV4dCA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCB2YWx1ZSwgZGVidWdJbmZvKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTtcbiAgICAgICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50RWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLnByb2plY3ROb2RlcyA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCBub2Rlcykge1xuICAgICAgICAgIGlmICghcGFyZW50RWxlbWVudClcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGFwcGVuZE5vZGVzKHBhcmVudEVsZW1lbnQsIG5vZGVzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbm9kZVxuICAgICAgICogQHBhcmFtIHs/fSB2aWV3Um9vdE5vZGVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21SZW5kZXJlci5wcm90b3R5cGUuYXR0YWNoVmlld0FmdGVyID0gZnVuY3Rpb24gKG5vZGUsIHZpZXdSb290Tm9kZXMpIHsgbW92ZU5vZGVzQWZ0ZXJTaWJsaW5nKG5vZGUsIHZpZXdSb290Tm9kZXMpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHZpZXdSb290Tm9kZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5kZXRhY2hWaWV3ID0gZnVuY3Rpb24gKHZpZXdSb290Tm9kZXMpIHtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmlld1Jvb3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub2RlID0gdmlld1Jvb3ROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSB2aWV3QWxsTm9kZXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95VmlldyA9IGZ1bmN0aW9uIChob3N0RWxlbWVudCwgdmlld0FsbE5vZGVzKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UHJvdG8uZW5jYXBzdWxhdGlvbiA9PT0gY29yZS5WaWV3RW5jYXBzdWxhdGlvbi5OYXRpdmUgJiYgaG9zdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdFJlbmRlcmVyLnNoYXJlZFN0eWxlc0hvc3QucmVtb3ZlSG9zdCgoKGhvc3RFbGVtZW50KSkuc2hhZG93Um9vdCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJFbGVtZW50XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgbmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdFJlbmRlcmVyLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHJlbmRlckVsZW1lbnQsIG5hbWUsIGRlY29yYXRlUHJldmVudERlZmF1bHQoY2FsbGJhY2spKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0XG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5saXN0ZW5HbG9iYWwgPSBmdW5jdGlvbiAodGFyZ2V0LCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9yb290UmVuZGVyZXIuZXZlbnRNYW5hZ2VyLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBuYW1lLCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5VmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5zZXRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgKChyZW5kZXJFbGVtZW50KSlbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gYXR0cmlidXRlTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldEVsZW1lbnRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhdHRyTnM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYXR0ck5hbWVXaXRob3V0TnMgPSBhdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgIGlmIChpc05hbWVzcGFjZWQoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbnNBbmROYW1lID0gc3BsaXROYW1lc3BhY2UoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgIGF0dHJOYW1lV2l0aG91dE5zID0gbnNBbmROYW1lWzFdO1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gbnNBbmROYW1lWzBdICsgJzonICsgbnNBbmROYW1lWzFdO1xuICAgICAgICAgICAgICBhdHRyTnMgPSBOQU1FU1BBQ0VfVVJJU1tuc0FuZE5hbWVbMF1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcmVzZW50KGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgICAgICAgICBpZiAoYXR0ck5zKSB7XG4gICAgICAgICAgICAgICAgICByZW5kZXJFbGVtZW50LnNldEF0dHJpYnV0ZU5TKGF0dHJOcywgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoaXNQcmVzZW50KGF0dHJOcykpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTlMoYXR0ck5zLCBhdHRyTmFtZVdpdGhvdXROcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZW5kZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVuZGVyRWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eU5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlWYWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldEJpbmRpbmdEZWJ1Z0luZm8gPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgaWYgKHJlbmRlckVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4aXN0aW5nQmluZGluZ3MgPSByZW5kZXJFbGVtZW50Lm5vZGVWYWx1ZS5yZXBsYWNlKC9cXG4vZywgJycpLm1hdGNoKFRFTVBMQVRFX0JJTkRJTkdTX0VYUCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnNlZEJpbmRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0JpbmRpbmdzWzFdKTtcbiAgICAgICAgICAgICAgcGFyc2VkQmluZGluZ3NbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG4gICAgICAgICAgICAgIHJlbmRlckVsZW1lbnQubm9kZVZhbHVlID1cbiAgICAgICAgICAgICAgICAgIFRFTVBMQVRFX0NPTU1FTlRfVEVYVC5yZXBsYWNlKCd7fScsIEpTT04uc3RyaW5naWZ5KHBhcnNlZEJpbmRpbmdzLCBudWxsLCAyKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRBdHRyaWJ1dGUocmVuZGVyRWxlbWVudCwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGlzQWRkXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21SZW5kZXJlci5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIGNsYXNzTmFtZSwgaXNBZGQpIHtcbiAgICAgICAgICBpZiAoaXNBZGQpIHtcbiAgICAgICAgICAgICAgcmVuZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZW5kZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVOYW1lXG4gICAgICAgKiBAcGFyYW0gez99IHN0eWxlVmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5zZXRFbGVtZW50U3R5bGUgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgc3R5bGVOYW1lLCBzdHlsZVZhbHVlKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChzdHlsZVZhbHVlKSkge1xuICAgICAgICAgICAgICAoKHJlbmRlckVsZW1lbnQuc3R5bGUpKVtzdHlsZU5hbWVdID0gc3RyaW5naWZ5KHN0eWxlVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsXG4gICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy83OTE2XG4gICAgICAgICAgICAgICgocmVuZGVyRWxlbWVudC5zdHlsZSkpW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlckVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kTmFtZVxuICAgICAgICogQHBhcmFtIHs/fSBhcmdzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21SZW5kZXJlci5wcm90b3R5cGUuaW52b2tlRWxlbWVudE1ldGhvZCA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgICAgICAgKChyZW5kZXJFbGVtZW50KSlbbWV0aG9kTmFtZV0uYXBwbHkocmVuZGVyRWxlbWVudCwgYXJncyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlbmRlck5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tUmVuZGVyZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAocmVuZGVyTm9kZSwgdGV4dCkgeyByZW5kZXJOb2RlLm5vZGVWYWx1ZSA9IHRleHQ7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBzdGFydGluZ1N0eWxlc1xuICAgICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXNcbiAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gZGVsYXlcbiAgICAgICAqIEBwYXJhbSB7P30gZWFzaW5nXG4gICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVJlbmRlcmVyLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0YXJ0aW5nU3R5bGVzLCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMpIHtcbiAgICAgICAgICBpZiAocHJldmlvdXNQbGF5ZXJzID09PSB2b2lkIDApIHsgcHJldmlvdXNQbGF5ZXJzID0gW107IH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0aW9uRHJpdmVyLmFuaW1hdGUoZWxlbWVudCwgc3RhcnRpbmdTdHlsZXMsIGtleWZyYW1lcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHByZXZpb3VzUGxheWVycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTm9PcEFuaW1hdGlvblBsYXllcigpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gRG9tUmVuZGVyZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNpYmxpbmdcbiAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbW92ZU5vZGVzQWZ0ZXJTaWJsaW5nKHNpYmxpbmcsIG5vZGVzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJlbnQgPSBzaWJsaW5nLnBhcmVudE5vZGU7XG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCAmJiBwYXJlbnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXh0U2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7XG4gICAgICAgICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2Rlc1tpXSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2Rlc1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcGFyZW50XG4gICAqIEBwYXJhbSB7P30gbm9kZXNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZE5vZGVzKHBhcmVudCwgbm9kZXMpIHtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2Rlc1tpXSk7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZXZlbnRIYW5kbGVyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGV2ZW50SGFuZGxlcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGFsbG93RGVmYXVsdEJlaGF2aW9yID0gZXZlbnRIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICBpZiAoYWxsb3dEZWZhdWx0QmVoYXZpb3IgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8odGJvc2NoKTogbW92ZSBwcmV2ZW50RGVmYXVsdCBpbnRvIGV2ZW50IHBsdWdpbnMuLi5cbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICB9XG4gIHZhciAvKiogQHR5cGUgez99ICovIENPTVBPTkVOVF9SRUdFWCA9IC8lQ09NUCUvZztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ09NUE9ORU5UX1ZBUklBQkxFID0gJyVDT01QJSc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEhPU1RfQVRUUiA9IFwiX25naG9zdC1cIiArIENPTVBPTkVOVF9WQVJJQUJMRTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQ09OVEVOVF9BVFRSID0gXCJfbmdjb250ZW50LVwiICsgQ09NUE9ORU5UX1ZBUklBQkxFO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzaGltQ29udGVudEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7XG4gICAgICByZXR1cm4gQ09OVEVOVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzaGltSG9zdEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7XG4gICAgICByZXR1cm4gSE9TVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21wSWRcbiAgICogQHBhcmFtIHs/fSBzdHlsZXNcbiAgICogQHBhcmFtIHs/fSB0YXJnZXRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZsYXR0ZW5TdHlsZXMoY29tcElkLCBzdHlsZXMsIHRhcmdldCkge1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkge1xuICAgICAgICAgICAgICBmbGF0dGVuU3R5bGVzKGNvbXBJZCwgc3R5bGUsIHRhcmdldCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wSWQpO1xuICAgICAgICAgICAgICB0YXJnZXQucHVzaChzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOU19QUkVGSVhfUkUgPSAvXjooW146XSspOiguKykkLztcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbmFtZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNOYW1lc3BhY2VkKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lWzBdID09PSAnOic7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbmFtZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXROYW1lc3BhY2UobmFtZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2ggPSBuYW1lLm1hdGNoKE5TX1BSRUZJWF9SRSk7XG4gICAgICByZXR1cm4gW21hdGNoWzFdLCBtYXRjaFsyXV07XG4gIH1cblxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT1JFX1RPS0VOUyA9IHtcbiAgICAgICdBcHBsaWNhdGlvblJlZic6IGNvcmUuQXBwbGljYXRpb25SZWYsXG4gICAgICAnTmdab25lJzogY29yZS5OZ1pvbmUsXG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIElOU1BFQ1RfR0xPQkFMX05BTUUgPSAnbmcucHJvYmUnO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT1JFX1RPS0VOU19HTE9CQUxfTkFNRSA9ICduZy5jb3JlVG9rZW5zJztcbiAgLyoqXG4gICAqICBSZXR1cm5zIGEge0BsaW5rIERlYnVnRWxlbWVudH0gZm9yIHRoZSBnaXZlbiBuYXRpdmUgRE9NIGVsZW1lbnQsIG9yXG4gICAgKiBudWxsIGlmIHRoZSBnaXZlbiBuYXRpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIEFuZ3VsYXIgdmlldyBhc3NvY2lhdGVkXG4gICAgKiB3aXRoIGl0LlxuICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGluc3BlY3ROYXRpdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjb3JlLmdldERlYnVnTm9kZShlbGVtZW50KTtcbiAgfVxuICAvKipcbiAgICogIERlcHJlY2F0ZWQuIFVzZSB0aGUgb25lIGZyb20gJ0Bhbmd1bGFyL2NvcmUnLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgdmFyIE5nUHJvYmVUb2tlbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBOZ1Byb2JlVG9rZW4obmFtZSwgdG9rZW4pIHtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOZ1Byb2JlVG9rZW47XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvb3RSZW5kZXJlclxuICAgKiBAcGFyYW0gez99IGV4dHJhVG9rZW5zXG4gICAqIEBwYXJhbSB7P30gY29yZVRva2Vuc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gX2NyZWF0ZUNvbmRpdGlvbmFsUm9vdFJlbmRlcmVyKHJvb3RSZW5kZXJlciwgZXh0cmFUb2tlbnMsIGNvcmVUb2tlbnMpIHtcbiAgICAgIHJldHVybiBjb3JlLmlzRGV2TW9kZSgpID9cbiAgICAgICAgICBfY3JlYXRlUm9vdFJlbmRlcmVyKHJvb3RSZW5kZXJlciwgKGV4dHJhVG9rZW5zIHx8IFtdKS5jb25jYXQoY29yZVRva2VucyB8fCBbXSkpIDpcbiAgICAgICAgICByb290UmVuZGVyZXI7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcm9vdFJlbmRlcmVyXG4gICAqIEBwYXJhbSB7P30gZXh0cmFUb2tlbnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9jcmVhdGVSb290UmVuZGVyZXIocm9vdFJlbmRlcmVyLCBleHRyYVRva2Vucykge1xuICAgICAgZ2V0RE9NKCkuc2V0R2xvYmFsVmFyKElOU1BFQ1RfR0xPQkFMX05BTUUsIGluc3BlY3ROYXRpdmVFbGVtZW50KTtcbiAgICAgIGdldERPTSgpLnNldEdsb2JhbFZhcihDT1JFX1RPS0VOU19HTE9CQUxfTkFNRSwgU3RyaW5nTWFwV3JhcHBlci5tZXJnZShDT1JFX1RPS0VOUywgX25nUHJvYmVUb2tlbnNUb01hcChleHRyYVRva2VucyB8fCBbXSkpKTtcbiAgICAgIHJldHVybiBuZXcgRGVidWdEb21Sb290UmVuZGVyZXIocm9vdFJlbmRlcmVyKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB0b2tlbnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9uZ1Byb2JlVG9rZW5zVG9NYXAodG9rZW5zKSB7XG4gICAgICByZXR1cm4gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAocHJldiwgdCkgeyByZXR1cm4gKHByZXZbdC5uYW1lXSA9IHQudG9rZW4sIHByZXYpOyB9LCB7fSk7XG4gIH1cbiAgLyoqXG4gICAqIFByb3ZpZGVycyB3aGljaCBzdXBwb3J0IGRlYnVnZ2luZyBBbmd1bGFyIGFwcGxpY2F0aW9ucyAoZS5nLiB2aWEgYG5nLnByb2JlYCkuXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBFTEVNRU5UX1BST0JFX1BST1ZJREVSUyA9IFt7XG4gICAgICAgICAgcHJvdmlkZTogY29yZS5Sb290UmVuZGVyZXIsXG4gICAgICAgICAgdXNlRmFjdG9yeTogX2NyZWF0ZUNvbmRpdGlvbmFsUm9vdFJlbmRlcmVyLFxuICAgICAgICAgIGRlcHM6IFtcbiAgICAgICAgICAgICAgRG9tUm9vdFJlbmRlcmVyLCBbTmdQcm9iZVRva2VuLCBuZXcgY29yZS5PcHRpb25hbCgpXSxcbiAgICAgICAgICAgICAgW2NvcmUuTmdQcm9iZVRva2VuLCBuZXcgY29yZS5PcHRpb25hbCgpXVxuICAgICAgICAgIF1cbiAgICAgIH1dO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQ1ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICB2YXIgRG9tRXZlbnRzUGx1Z2luID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ1KERvbUV2ZW50c1BsdWdpbiwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIERvbUV2ZW50c1BsdWdpbigpIHtcbiAgICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUV2ZW50c1BsdWdpbi5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7IHJldHVybiB0cnVlOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbUV2ZW50c1BsdWdpbi5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAvKiogQHR5cGUgez99ICovIChoYW5kbGVyKSwgZmFsc2UpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAvKiogQHR5cGUgez99ICovIChoYW5kbGVyKSwgZmFsc2UpOyB9O1xuICAgICAgfTtcbiAgICAgIERvbUV2ZW50c1BsdWdpbi5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBEb21FdmVudHNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgIHJldHVybiBEb21FdmVudHNQbHVnaW47XG4gIH0oRXZlbnRNYW5hZ2VyUGx1Z2luKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzJDYgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG4gIHZhciAvKiogQHR5cGUgez99ICovIEVWRU5UX05BTUVTID0ge1xuICAgICAgLy8gcGFuXG4gICAgICAncGFuJzogdHJ1ZSxcbiAgICAgICdwYW5zdGFydCc6IHRydWUsXG4gICAgICAncGFubW92ZSc6IHRydWUsXG4gICAgICAncGFuZW5kJzogdHJ1ZSxcbiAgICAgICdwYW5jYW5jZWwnOiB0cnVlLFxuICAgICAgJ3BhbmxlZnQnOiB0cnVlLFxuICAgICAgJ3BhbnJpZ2h0JzogdHJ1ZSxcbiAgICAgICdwYW51cCc6IHRydWUsXG4gICAgICAncGFuZG93bic6IHRydWUsXG4gICAgICAvLyBwaW5jaFxuICAgICAgJ3BpbmNoJzogdHJ1ZSxcbiAgICAgICdwaW5jaHN0YXJ0JzogdHJ1ZSxcbiAgICAgICdwaW5jaG1vdmUnOiB0cnVlLFxuICAgICAgJ3BpbmNoZW5kJzogdHJ1ZSxcbiAgICAgICdwaW5jaGNhbmNlbCc6IHRydWUsXG4gICAgICAncGluY2hpbic6IHRydWUsXG4gICAgICAncGluY2hvdXQnOiB0cnVlLFxuICAgICAgLy8gcHJlc3NcbiAgICAgICdwcmVzcyc6IHRydWUsXG4gICAgICAncHJlc3N1cCc6IHRydWUsXG4gICAgICAvLyByb3RhdGVcbiAgICAgICdyb3RhdGUnOiB0cnVlLFxuICAgICAgJ3JvdGF0ZXN0YXJ0JzogdHJ1ZSxcbiAgICAgICdyb3RhdGVtb3ZlJzogdHJ1ZSxcbiAgICAgICdyb3RhdGVlbmQnOiB0cnVlLFxuICAgICAgJ3JvdGF0ZWNhbmNlbCc6IHRydWUsXG4gICAgICAvLyBzd2lwZVxuICAgICAgJ3N3aXBlJzogdHJ1ZSxcbiAgICAgICdzd2lwZWxlZnQnOiB0cnVlLFxuICAgICAgJ3N3aXBlcmlnaHQnOiB0cnVlLFxuICAgICAgJ3N3aXBldXAnOiB0cnVlLFxuICAgICAgJ3N3aXBlZG93bic6IHRydWUsXG4gICAgICAvLyB0YXBcbiAgICAgICd0YXAnOiB0cnVlLFxuICB9O1xuICAvKipcbiAgICogQSBESSB0b2tlbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHByb3ZpZGV7QGxpbmsgSGFtbWVyR2VzdHVyZUNvbmZpZ30gdG8gQW5ndWxhci4gVXNlIGl0IHRvIGNvbmZpZ3VyZVxuICAgKiBIYW1tZXIgZ2VzdHVyZXMuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIEhBTU1FUl9HRVNUVVJFX0NPTkZJRyA9IG5ldyBjb3JlLk9wYXF1ZVRva2VuKCdIYW1tZXJHZXN0dXJlQ29uZmlnJyk7XG4gIC8qKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2YXIgSGFtbWVyR2VzdHVyZUNvbmZpZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBIYW1tZXJHZXN0dXJlQ29uZmlnKCkge1xuICAgICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgICAgICAgdGhpcy5vdmVycmlkZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBIYW1tZXJHZXN0dXJlQ29uZmlnLnByb3RvdHlwZS5idWlsZEhhbW1lciA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWMgPSBuZXcgSGFtbWVyKGVsZW1lbnQpO1xuICAgICAgICAgIG1jLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XG4gICAgICAgICAgbWMuZ2V0KCdyb3RhdGUnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XG4gICAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMub3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICAgIG1jLmdldChldmVudE5hbWUpLnNldCh0aGlzLm92ZXJyaWRlc1tldmVudE5hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1jO1xuICAgICAgfTtcbiAgICAgIEhhbW1lckdlc3R1cmVDb25maWcuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IGNvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgXTtcbiAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgSGFtbWVyR2VzdHVyZUNvbmZpZy5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgcmV0dXJuIEhhbW1lckdlc3R1cmVDb25maWc7XG4gIH0oKSk7XG4gIHZhciBIYW1tZXJHZXN0dXJlc1BsdWdpbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkNihIYW1tZXJHZXN0dXJlc1BsdWdpbiwgX3N1cGVyKTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBfY29uZmlnXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEhhbW1lckdlc3R1cmVzUGx1Z2luKF9jb25maWcpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9jb25maWcgPSBfY29uZmlnO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4ucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgIGlmICghRVZFTlRfTkFNRVMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkpICYmICF0aGlzLmlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKCh3aW5kb3cpKS5IYW1tZXIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGFtbWVyLmpzIGlzIG5vdCBsb2FkZWQsIGNhbiBub3QgYmluZCBcIiArIGV2ZW50TmFtZSArIFwiIGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4ucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcbiAgICAgICAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICByZXR1cm4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1jID0gX3RoaXMuX2NvbmZpZy5idWlsZEhhbW1lcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnRPYmopIHtcbiAgICAgICAgICAgICAgICAgIHpvbmUucnVuR3VhcmRlZChmdW5jdGlvbiAoKSB7IGhhbmRsZXIoZXZlbnRPYmopOyB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbWMub24oZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBtYy5vZmYoZXZlbnROYW1lLCBjYWxsYmFjayk7IH07XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4ucHJvdG90eXBlLmlzQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7IHJldHVybiB0aGlzLl9jb25maWcuZXZlbnRzLmluZGV4T2YoZXZlbnROYW1lKSA+IC0xOyB9O1xuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4uZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IGNvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgXTtcbiAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiBIYW1tZXJHZXN0dXJlQ29uZmlnLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBjb3JlLkluamVjdCwgYXJnczogW0hBTU1FUl9HRVNUVVJFX0NPTkZJRyxdIH0sXSB9LFxuICAgICAgXTsgfTtcbiAgICAgIHJldHVybiBIYW1tZXJHZXN0dXJlc1BsdWdpbjtcbiAgfShFdmVudE1hbmFnZXJQbHVnaW4pKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkNyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gTU9ESUZJRVJfS0VZUyA9IFsnYWx0JywgJ2NvbnRyb2wnLCAnbWV0YScsICdzaGlmdCddO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBNT0RJRklFUl9LRVlfR0VUVEVSUyA9IHtcbiAgICAgICdhbHQnOiBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LmFsdEtleTsgfSxcbiAgICAgICdjb250cm9sJzogZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBldmVudC5jdHJsS2V5OyB9LFxuICAgICAgJ21ldGEnOiBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIGV2ZW50Lm1ldGFLZXk7IH0sXG4gICAgICAnc2hpZnQnOiBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnNoaWZ0S2V5OyB9XG4gIH07XG4gIC8qKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2YXIgS2V5RXZlbnRzUGx1Z2luID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ3KEtleUV2ZW50c1BsdWdpbiwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIEtleUV2ZW50c1BsdWdpbigpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEtleUV2ZW50c1BsdWdpbi5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7IHJldHVybiBLZXlFdmVudHNQbHVnaW4ucGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKSAhPSBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lXG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEtleUV2ZW50c1BsdWdpbi5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJzZWRFdmVudCA9IEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dHNpZGVIYW5kbGVyID0gS2V5RXZlbnRzUGx1Z2luLmV2ZW50Q2FsbGJhY2socGFyc2VkRXZlbnRbJ2Z1bGxLZXknXSwgaGFuZGxlciwgdGhpcy5tYW5hZ2VyLmdldFpvbmUoKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXRab25lKCkucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0RE9NKCkub25BbmRDYW5jZWwoZWxlbWVudCwgcGFyc2VkRXZlbnRbJ2RvbUV2ZW50TmFtZSddLCBvdXRzaWRlSGFuZGxlcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy4nKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkb21FdmVudE5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgIGlmICgocGFydHMubGVuZ3RoID09PSAwKSB8fCAhKGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IEtleUV2ZW50c1BsdWdpbi5fbm9ybWFsaXplS2V5KHBhcnRzLnBvcCgpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdWxsS2V5ID0gJyc7XG4gICAgICAgICAgTU9ESUZJRVJfS0VZUy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllck5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSBwYXJ0cy5pbmRleE9mKG1vZGlmaWVyTmFtZSk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgZnVsbEtleSArPSBtb2RpZmllck5hbWUgKyAnLic7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmdWxsS2V5ICs9IGtleTtcbiAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9IDAgfHwga2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nIHRvIGxldCBhbm90aGVyIHBsdWdpbiBwcm9jZXNzIHRoZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzdWx0ID0ge307XG4gICAgICAgICAgcmVzdWx0Wydkb21FdmVudE5hbWUnXSA9IGRvbUV2ZW50TmFtZTtcbiAgICAgICAgICByZXN1bHRbJ2Z1bGxLZXknXSA9IGZ1bGxLZXk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdWxsS2V5ID0gJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gZ2V0RE9NKCkuZ2V0RXZlbnRLZXkoZXZlbnQpO1xuICAgICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChrZXkgPT09ICcgJykge1xuICAgICAgICAgICAgICBrZXkgPSAnc3BhY2UnOyAvLyBmb3IgcmVhZGFiaWxpdHlcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnLicpIHtcbiAgICAgICAgICAgICAga2V5ID0gJ2RvdCc7IC8vIGJlY2F1c2UgJy4nIGlzIHVzZWQgYXMgYSBzZXBhcmF0b3IgaW4gZXZlbnQgbmFtZXNcbiAgICAgICAgICB9XG4gICAgICAgICAgTU9ESUZJRVJfS0VZUy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllck5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyTmFtZSAhPSBrZXkpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1vZGlmaWVyR2V0dGVyID0gTU9ESUZJRVJfS0VZX0dFVFRFUlNbbW9kaWZpZXJOYW1lXTtcbiAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllckdldHRlcihldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZ1bGxLZXkgKz0ga2V5O1xuICAgICAgICAgIHJldHVybiBmdWxsS2V5O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmdWxsS2V5XG4gICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gem9uZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgS2V5RXZlbnRzUGx1Z2luLmV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZnVsbEtleSwgaGFuZGxlciwgem9uZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQgLyoqIFRPRE8gIzkxMDAgKi8pIHtcbiAgICAgICAgICAgICAgaWYgKEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpID09PSBmdWxsS2V5KSB7XG4gICAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gaGFuZGxlcihldmVudCk7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30ga2V5TmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkgPSBmdW5jdGlvbiAoa2V5TmFtZSkge1xuICAgICAgICAgIC8vIFRPRE86IHN3aXRjaCB0byBhIE1hcCBpZiB0aGUgbWFwcGluZyBncm93cyB0b28gbXVjaFxuICAgICAgICAgIHN3aXRjaCAoa2V5TmFtZSkge1xuICAgICAgICAgICAgICBjYXNlICdlc2MnOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuICdlc2NhcGUnO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIEtleUV2ZW50c1BsdWdpbi5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBLZXlFdmVudHNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgIHJldHVybiBLZXlFdmVudHNQbHVnaW47XG4gIH0oRXZlbnRNYW5hZ2VyUGx1Z2luKSk7XG5cbiAgLyoqXG4gICAqIEEgcGF0dGVybiB0aGF0IHJlY29nbml6ZXMgYSBjb21tb25seSB1c2VmdWwgc3Vic2V0IG9mIFVSTHMgdGhhdCBhcmUgc2FmZS5cbiAgICpcbiAgICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBhIHN1YnNldCBvZiBVUkxzIHRoYXQgd2lsbCBub3QgY2F1c2Ugc2NyaXB0XG4gICAqIGV4ZWN1dGlvbiBpZiB1c2VkIGluIFVSTCBjb250ZXh0IHdpdGhpbiBhIEhUTUwgZG9jdW1lbnQuIFNwZWNpZmljYWxseSwgdGhpc1xuICAgKiByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBpZiAoY29tbWVudCBmcm9tIGhlcmUgb24gYW5kIHJlZ2V4IGNvcGllZCBmcm9tXG4gICAqIFNveSdzIEVzY2FwaW5nQ29udmVudGlvbnMpOlxuICAgKiAoMSkgRWl0aGVyIGEgcHJvdG9jb2wgaW4gYSB3aGl0ZWxpc3QgKGh0dHAsIGh0dHBzLCBtYWlsdG8gb3IgZnRwKS5cbiAgICogKDIpIG9yIG5vIHByb3RvY29sLiAgQSBwcm90b2NvbCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgY29sb24uIFRoZSBiZWxvd1xuICAgKiAgICAgYWxsb3dzIHRoYXQgYnkgYWxsb3dpbmcgY29sb25zIG9ubHkgYWZ0ZXIgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIFsvPyNdLlxuICAgKiAgICAgQSBjb2xvbiBhZnRlciBhIGhhc2ggKCMpIG11c3QgYmUgaW4gdGhlIGZyYWdtZW50LlxuICAgKiAgICAgT3RoZXJ3aXNlLCBhIGNvbG9uIGFmdGVyIGEgKD8pIG11c3QgYmUgaW4gYSBxdWVyeS5cbiAgICogICAgIE90aGVyd2lzZSwgYSBjb2xvbiBhZnRlciBhIHNpbmdsZSBzb2xpZHVzICgvKSBtdXN0IGJlIGluIGEgcGF0aC5cbiAgICogICAgIE90aGVyd2lzZSwgYSBjb2xvbiBhZnRlciBhIGRvdWJsZSBzb2xpZHVzICgvLykgbXVzdCBiZSBpbiB0aGUgYXV0aG9yaXR5XG4gICAqICAgICAoYmVmb3JlIHBvcnQpLlxuICAgKlxuICAgKiBUaGUgcGF0dGVybiBkaXNhbGxvd3MgJiwgdXNlZCBpbiBIVE1MIGVudGl0eSBkZWNsYXJhdGlvbnMgYmVmb3JlXG4gICAqIG9uZSBvZiB0aGUgY2hhcmFjdGVycyBpbiBbLz8jXS4gVGhpcyBkaXNhbGxvd3MgSFRNTCBlbnRpdGllcyB1c2VkIGluIHRoZVxuICAgKiBwcm90b2NvbCBuYW1lLCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBlLmcuIFwiaCYjMTE2O3RwXCIgZm9yIFwiaHR0cFwiLlxuICAgKiBJdCBhbHNvIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIGluIHRoZSBmaXJzdCBwYXRoIHBhcnQgb2YgYSByZWxhdGl2ZSBwYXRoLFxuICAgKiBlLmcuIFwiZm9vJmx0O2Jhci9iYXpcIi4gIE91ciBleGlzdGluZyBlc2NhcGluZyBmdW5jdGlvbnMgc2hvdWxkIG5vdCBwcm9kdWNlXG4gICAqIHRoYXQuIE1vcmUgaW1wb3J0YW50bHksIGl0IGRpc2FsbG93cyBtYXNraW5nIG9mIGEgY29sb24sXG4gICAqIGUuZy4gXCJqYXZhc2NyaXB0JiM1ODsuLi5cIi5cbiAgICpcbiAgICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTQUZFX1VSTF9QQVRURVJOID0gL14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteJjovPyNdKig/OlsvPyNdfCQpKS9naTtcbiAgLyoqIEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgc2FmZSBkYXRhIFVSTHMuIE9ubHkgbWF0Y2hlcyBpbWFnZSwgdmlkZW8gYW5kIGF1ZGlvIHR5cGVzLiAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXFwvKD86Ym1wfGdpZnxqcGVnfGpwZ3xwbmd8dGlmZnx3ZWJwKXx2aWRlb1xcLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1xcLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcXC9dKz0qJC9pO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSB1cmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNhbml0aXplVXJsKHVybCkge1xuICAgICAgdXJsID0gU3RyaW5nKHVybCk7XG4gICAgICBpZiAodXJsLm1hdGNoKFNBRkVfVVJMX1BBVFRFUk4pIHx8IHVybC5tYXRjaChEQVRBX1VSTF9QQVRURVJOKSlcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgaWYgKGNvcmUuaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICBnZXRET00oKS5sb2coXCJXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBVUkwgdmFsdWUgXCIgKyB1cmwgKyBcIiAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3Vuc2FmZTonICsgdXJsO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNyY3NldFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2FuaXRpemVTcmNzZXQoc3Jjc2V0KSB7XG4gICAgICBzcmNzZXQgPSBTdHJpbmcoc3Jjc2V0KTtcbiAgICAgIHJldHVybiBzcmNzZXQuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHNyY3NldCkgeyByZXR1cm4gc2FuaXRpemVVcmwoc3Jjc2V0LnRyaW0oKSk7IH0pLmpvaW4oJywgJyk7XG4gIH1cblxuICAvKiogQSA8Ym9keT4gZWxlbWVudCB0aGF0IGNhbiBiZSBzYWZlbHkgdXNlZCB0byBwYXJzZSB1bnRydXN0ZWQgSFRNTC4gTGF6aWx5IGluaXRpYWxpemVkIGJlbG93LiAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmVydEVsZW1lbnQgPSBudWxsO1xuICAvKiogTGF6aWx5IGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGUgRE9NIGFkYXB0ZXIgZ2V0cyBzZXQgYmVmb3JlIHVzZS4gKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRE9NID0gbnVsbDtcbiAgLyoqXG4gICAqICBSZXR1cm5zIGFuIEhUTUwgZWxlbWVudCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4ZWN1dGUgY29kZSB3aGVuIGNyZWF0aW5nIGVsZW1lbnRzIGluIGl0LlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW5lcnRFbGVtZW50KCkge1xuICAgICAgaWYgKGluZXJ0RWxlbWVudClcbiAgICAgICAgICByZXR1cm4gaW5lcnRFbGVtZW50O1xuICAgICAgRE9NID0gZ2V0RE9NKCk7XG4gICAgICAvLyBQcmVmZXIgdXNpbmcgPHRlbXBsYXRlPiBlbGVtZW50IGlmIHN1cHBvcnRlZC5cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRlbXBsYXRlRWwgPSBET00uY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgIGlmICgnY29udGVudCcgaW4gdGVtcGxhdGVFbClcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGVFbDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRvYyA9IERPTS5jcmVhdGVIdG1sRG9jdW1lbnQoKTtcbiAgICAgIGluZXJ0RWxlbWVudCA9IERPTS5xdWVyeVNlbGVjdG9yKGRvYywgJ2JvZHknKTtcbiAgICAgIGlmIChpbmVydEVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIHVzdWFsbHkgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGJvZHkgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQsIGJ1dCBJRSBkb2Vzbid0IGhhdmUgYW55LCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIG9uZS5cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBodG1sID0gRE9NLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnLCBkb2MpO1xuICAgICAgICAgIGluZXJ0RWxlbWVudCA9IERPTS5jcmVhdGVFbGVtZW50KCdib2R5JywgZG9jKTtcbiAgICAgICAgICBET00uYXBwZW5kQ2hpbGQoaHRtbCwgaW5lcnRFbGVtZW50KTtcbiAgICAgICAgICBET00uYXBwZW5kQ2hpbGQoZG9jLCBodG1sKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmVydEVsZW1lbnQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdGFnc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdGFnU2V0KHRhZ3MpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IHt9O1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRhZ3Muc3BsaXQoJywnKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgdCA9IF9hW19pXTtcbiAgICAgICAgICByZXNbdF0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHsuLi4/fSBzZXRzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICAgIHZhciBzZXRzID0gW107XG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHNldHNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgIGZvciAodmFyIF9hID0gMCwgc2V0c18xID0gc2V0czsgX2EgPCBzZXRzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgdmFyIHMgPSBzZXRzXzFbX2FdO1xuICAgICAgICAgIGZvciAodmFyIHYgaW4gcykge1xuICAgICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eSh2KSlcbiAgICAgICAgICAgICAgICAgIHJlc1t2XSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgfVxuICAvLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzXG4gIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNzZW1hbnRpY3NcbiAgLy8gaHR0cDovL3NpbW9uLmh0bWw1Lm9yZy9odG1sLWVsZW1lbnRzXG4gIC8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1XG4gIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzXG4gIHZhciAvKiogQHR5cGUgez99ICovIFZPSURfRUxFTUVOVFMgPSB0YWdTZXQoJ2FyZWEsYnIsY29sLGhyLGltZyx3YnInKTtcbiAgLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcylcbiAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy9PdmVydmlldy5odG1sI29wdGlvbmFsLXRhZ3NcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gT1BUSU9OQUxfRU5EX1RBR19CTE9DS19FTEVNRU5UUyA9IHRhZ1NldCgnY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0cicpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyA9IHRhZ1NldCgncnAscnQnKTtcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gT1BUSU9OQUxfRU5EX1RBR19FTEVNRU5UUyA9IG1lcmdlKE9QVElPTkFMX0VORF9UQUdfSU5MSU5FX0VMRU1FTlRTLCBPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTKTtcbiAgLy8gU2FmZSBCbG9jayBFbGVtZW50cyAtIEhUTUw1XG4gIHZhciAvKiogQHR5cGUgez99ICovIEJMT0NLX0VMRU1FTlRTID0gbWVyZ2UoT1BUSU9OQUxfRU5EX1RBR19CTE9DS19FTEVNRU5UUywgdGFnU2V0KCdhZGRyZXNzLGFydGljbGUsJyArXG4gICAgICAnYXNpZGUsYmxvY2txdW90ZSxjYXB0aW9uLGNlbnRlcixkZWwsZGV0YWlscyxkaWFsb2csZGlyLGRpdixkbCxmaWd1cmUsZmlnY2FwdGlvbixmb290ZXIsaDEsaDIsaDMsaDQsaDUsJyArXG4gICAgICAnaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFpbixtYXAsbWVudSxuYXYsb2wscHJlLHNlY3Rpb24sc3VtbWFyeSx0YWJsZSx1bCcpKTtcbiAgLy8gSW5saW5lIEVsZW1lbnRzIC0gSFRNTDVcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSU5MSU5FX0VMRU1FTlRTID0gbWVyZ2UoT1BUSU9OQUxfRU5EX1RBR19JTkxJTkVfRUxFTUVOVFMsIHRhZ1NldCgnYSxhYmJyLGFjcm9ueW0sYXVkaW8sYiwnICtcbiAgICAgICdiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscGljdHVyZSxxLHJ1YnkscnAscnQscywnICtcbiAgICAgICdzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvJykpO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWQUxJRF9FTEVNRU5UUyA9IG1lcmdlKFZPSURfRUxFTUVOVFMsIEJMT0NLX0VMRU1FTlRTLCBJTkxJTkVfRUxFTUVOVFMsIE9QVElPTkFMX0VORF9UQUdfRUxFTUVOVFMpO1xuICAvLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBocmVmIGFuZCBoZW5jZSBuZWVkIHRvIGJlIHNhbml0aXplZFxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBVUklfQVRUUlMgPSB0YWdTZXQoJ2JhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZicpO1xuICAvLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBzcGVjaWFsIGhyZWYgc2V0IGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkXG4gIHZhciAvKiogQHR5cGUgez99ICovIFNSQ1NFVF9BVFRSUyA9IHRhZ1NldCgnc3Jjc2V0Jyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEhUTUxfQVRUUlMgPSB0YWdTZXQoJ2FiYnIsYWNjZXNza2V5LGFsaWduLGFsdCxhdXRvcGxheSxheGlzLGJnY29sb3IsYm9yZGVyLGNlbGxwYWRkaW5nLGNlbGxzcGFjaW5nLGNsYXNzLGNsZWFyLGNvbG9yLGNvbHMsY29sc3BhbiwnICtcbiAgICAgICdjb21wYWN0LGNvbnRyb2xzLGNvb3JkcyxkYXRldGltZSxkZWZhdWx0LGRpcixkb3dubG9hZCxmYWNlLGhlYWRlcnMsaGVpZ2h0LGhpZGRlbixocmVmbGFuZyxoc3BhY2UsJyArXG4gICAgICAnaXNtYXAsaXRlbXNjb3BlLGl0ZW1wcm9wLGtpbmQsbGFiZWwsbGFuZyxsYW5ndWFnZSxsb29wLG1lZGlhLG11dGVkLG5vaHJlZixub3dyYXAsb3BlbixwcmVsb2FkLHJlbCxyZXYscm9sZSxyb3dzLHJvd3NwYW4scnVsZXMsJyArXG4gICAgICAnc2NvcGUsc2Nyb2xsaW5nLHNoYXBlLHNpemUsc2l6ZXMsc3BhbixzcmNsYW5nLHN0YXJ0LHN1bW1hcnksdGFiaW5kZXgsdGFyZ2V0LHRpdGxlLHRyYW5zbGF0ZSx0eXBlLHVzZW1hcCwnICtcbiAgICAgICd2YWxpZ24sdmFsdWUsdnNwYWNlLHdpZHRoJyk7XG4gIC8vIE5COiBUaGlzIGN1cnJlbnRseSBjb25jaW91c2x5IGRvZXNuJ3Qgc3VwcG9ydCBTVkcuIFNWRyBzYW5pdGl6YXRpb24gaGFzIGhhZCBzZXZlcmFsIHNlY3VyaXR5XG4gIC8vIGlzc3VlcyBpbiB0aGUgcGFzdCwgc28gaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUgaXQgb3V0IGlmIHBvc3NpYmxlLiBJZiBzdXBwb3J0IGZvciBiaW5kaW5nIFNWRyB2aWFcbiAgLy8gaW5uZXJIVE1MIGlzIHJlcXVpcmVkLCBTVkcgYXR0cmlidXRlcyBzaG91bGQgYmUgYWRkZWQgaGVyZS5cbiAgLy8gTkI6IFNhbml0aXphdGlvbiBkb2VzIG5vdCBhbGxvdyA8Zm9ybT4gZWxlbWVudHMgb3Igb3RoZXIgYWN0aXZlIGVsZW1lbnRzICg8YnV0dG9uPiBldGMpLiBUaG9zZVxuICAvLyBjYW4gYmUgc2FuaXRpemVkLCBidXQgdGhleSBpbmNyZWFzZSBzZWN1cml0eSBzdXJmYWNlIGFyZWEgd2l0aG91dCBhIGxlZ2l0aW1hdGUgdXNlIGNhc2UsIHNvIHRoZXlcbiAgLy8gYXJlIGxlZnQgb3V0IGhlcmUuXG4gIHZhciAvKiogQHR5cGUgez99ICovIFZBTElEX0FUVFJTID0gbWVyZ2UoVVJJX0FUVFJTLCBTUkNTRVRfQVRUUlMsIEhUTUxfQVRUUlMpO1xuICAvKipcbiAgICogIFNhbml0aXppbmdIdG1sU2VyaWFsaXplciBzZXJpYWxpemVzIGEgRE9NIGZyYWdtZW50LCBzdHJpcHBpbmcgb3V0IGFueSB1bnNhZmUgZWxlbWVudHMgYW5kIHVuc2FmZVxuICAgICogYXR0cmlidXRlcy5cbiAgICovXG4gIHZhciBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyKCkge1xuICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5idWYgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBlbFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyLnByb3RvdHlwZS5zYW5pdGl6ZUNoaWxkcmVuID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgLy8gVGhpcyBjYW5ub3QgdXNlIGEgVHJlZVdhbGtlciwgYXMgaXQgaGFzIHRvIHJ1biBvbiBBbmd1bGFyJ3MgdmFyaW91cyBET00gYWRhcHRlcnMuXG4gICAgICAgICAgLy8gSG93ZXZlciB0aGlzIGNvZGUgbmV2ZXIgYWNjZXNzZXMgcHJvcGVydGllcyBvZmYgb2YgYGRvY3VtZW50YCBiZWZvcmUgZGVsZXRpbmcgaXRzIGNvbnRlbnRzXG4gICAgICAgICAgLy8gYWdhaW4sIHNvIGl0IHNob3VsZG4ndCBiZSB2dWxuZXJhYmxlIHRvIERPTSBjbG9iYmVyaW5nLlxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydEVsZW1lbnQoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKERPTS5pc1RleHROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNoYXJzKERPTS5ub2RlVmFsdWUoY3VycmVudCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gU3RyaXAgbm9uLWVsZW1lbnQsIG5vbi10ZXh0IG5vZGVzLlxuICAgICAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChET00uZmlyc3RDaGlsZChjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IERPTS5maXJzdENoaWxkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExlYXZpbmcgdGhlIGVsZW1lbnQuIFdhbGsgdXAgYW5kIHRvIHRoZSByaWdodCwgY2xvc2luZyB0YWdzIGFzIHdlIGdvLlxuICAgICAgICAgICAgICAgICAgaWYgKERPTS5pc0VsZW1lbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRFbGVtZW50KC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChET00ubmV4dFNpYmxpbmcoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gRE9NLm5leHRTaWJsaW5nKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IERPTS5wYXJlbnRFbGVtZW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmJ1Zi5qb2luKCcnKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyLnByb3RvdHlwZS5zdGFydEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdGFnTmFtZSA9IERPTS5ub2RlTmFtZShlbGVtZW50KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmICghVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYnVmLnB1c2goJzwnKTtcbiAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKHRhZ05hbWUpO1xuICAgICAgICAgIERPTS5hdHRyaWJ1dGVNYXAoZWxlbWVudCkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGF0dHJOYW1lKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvd2VyID0gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgaWYgKCFWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlcikpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnNhbml0aXplZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gVE9ETyhtYXJ0aW5wcm9ic3QpOiBTcGVjaWFsIGNhc2UgaW1hZ2UgVVJJcyBmb3IgZGF0YTppbWFnZS8uLi5cbiAgICAgICAgICAgICAgaWYgKFVSSV9BVFRSU1tsb3dlcl0pXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNhbml0aXplVXJsKHZhbHVlKTtcbiAgICAgICAgICAgICAgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlcl0pXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNhbml0aXplU3Jjc2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgX3RoaXMuYnVmLnB1c2goJyAnKTtcbiAgICAgICAgICAgICAgX3RoaXMuYnVmLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICBfdGhpcy5idWYucHVzaCgnPVwiJyk7XG4gICAgICAgICAgICAgIF90aGlzLmJ1Zi5wdXNoKGVuY29kZUVudGl0aWVzKHZhbHVlKSk7XG4gICAgICAgICAgICAgIF90aGlzLmJ1Zi5wdXNoKCdcIicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyLnByb3RvdHlwZS5lbmRFbGVtZW50ID0gZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0YWdOYW1lID0gRE9NLm5vZGVOYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgaWYgKFZBTElEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpICYmICFWT0lEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJzwvJyk7XG4gICAgICAgICAgICAgIHRoaXMuYnVmLnB1c2godGFnTmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoYXJzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIucHJvdG90eXBlLmNoYXJzID0gZnVuY3Rpb24gKGNoYXJzIC8qKiBUT0RPICM5MTAwICovKSB7IHRoaXMuYnVmLnB1c2goZW5jb2RlRW50aXRpZXMoY2hhcnMpKTsgfTtcbiAgICAgIHJldHVybiBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXI7XG4gIH0oKSk7XG4gIC8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlc1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBTVVJST0dBVEVfUEFJUl9SRUdFWFAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuICAvLyAhIHRvIH4gaXMgdGhlIEFTQ0lJIHJhbmdlLlxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBOT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC8oW15cXCMtfiB8IV0pL2c7XG4gIC8qKlxuICAgKiAgRXNjYXBlcyBhbGwgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMsIHNvIHRoYXQgdGhlXG4gICAgKiByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSBzYWZlbHkgaW5zZXJ0ZWQgaW50byBhdHRyaWJ1dGUgb3JcbiAgICAqIGVsZW1lbnQgdGV4dC5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlRW50aXRpZXModmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgICAgLnJlcGxhY2UoU1VSUk9HQVRFX1BBSVJfUkVHRVhQLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBoaSA9IG1hdGNoLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbG93ID0gbWF0Y2guY2hhckNvZGVBdCgxKTtcbiAgICAgICAgICByZXR1cm4gJyYjJyArICgoKGhpIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMCkgKyAnOyc7XG4gICAgICB9KVxuICAgICAgICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQLCBmdW5jdGlvbiAobWF0Y2gpIHsgcmV0dXJuICcmIycgKyBtYXRjaC5jaGFyQ29kZUF0KDApICsgJzsnOyB9KVxuICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuICB9XG4gIC8qKlxuICAgKiAgV2hlbiBJRTktMTEgY29tZXMgYWNyb3NzIGFuIHVua25vd24gbmFtZXNwYWNlZCBhdHRyaWJ1dGUgZS5nLiAneGxpbms6Zm9vJyBpdCBhZGRzICd4bWxuczpuczEnXG4gICAgKiBhdHRyaWJ1dGUgdG8gZGVjbGFyZSBuczEgbmFtZXNwYWNlIGFuZCBwcmVmaXhlcyB0aGUgYXR0cmlidXRlIHdpdGggJ25zMScgKGUuZy4gJ25zMTp4bGluazpmb28nKS5cbiAgICAqICpcbiAgICAqIFRoaXMgaXMgdW5kZXNpcmFibGUgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBhbnkgb2YgdGhlc2UgY3VzdG9tIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kXG4gICAgKiBzdHJpcHMgdGhlbSBhbGwuXG4gICAqIEBwYXJhbSB7P30gZWxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmlwQ3VzdG9tTnNBdHRycyhlbCkge1xuICAgICAgRE9NLmF0dHJpYnV0ZU1hcChlbCkuZm9yRWFjaChmdW5jdGlvbiAoXywgYXR0ck5hbWUpIHtcbiAgICAgICAgICBpZiAoYXR0ck5hbWUgPT09ICd4bWxuczpuczEnIHx8IGF0dHJOYW1lLmluZGV4T2YoJ25zMTonKSA9PT0gMCkge1xuICAgICAgICAgICAgICBET00ucmVtb3ZlQXR0cmlidXRlKGVsLCBhdHRyTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gRE9NLmNoaWxkTm9kZXNBc0xpc3QoZWwpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBuID0gX2FbX2ldO1xuICAgICAgICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShuKSlcbiAgICAgICAgICAgICAgc3RyaXBDdXN0b21Oc0F0dHJzKC8qKiBAdHlwZSB7P30gKi8gKG4pKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogIFNhbml0aXplcyB0aGUgZ2l2ZW4gdW5zYWZlLCB1bnRydXN0ZWQgSFRNTCBmcmFnbWVudCwgYW5kIHJldHVybnMgSFRNTCB0ZXh0IHRoYXQgaXMgc2FmZSB0byBhZGQgdG9cbiAgICAqIHRoZSBET00gaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICAgKiBAcGFyYW0gez99IHVuc2FmZUh0bWxJbnB1dFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2FuaXRpemVIdG1sKHVuc2FmZUh0bWxJbnB1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250YWluZXJFbCA9IGdldEluZXJ0RWxlbWVudCgpO1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB1bnNhZmVIdG1sIGlzIGFjdHVhbGx5IGEgc3RyaW5nIChUeXBlU2NyaXB0IHR5cGVzIGFyZSBub3QgZW5mb3JjZWQgYXQgcnVudGltZSkuXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdW5zYWZlSHRtbCA9IHVuc2FmZUh0bWxJbnB1dCA/IFN0cmluZyh1bnNhZmVIdG1sSW5wdXQpIDogJyc7XG4gICAgICAgICAgLy8gbVhTUyBwcm90ZWN0aW9uLiBSZXBlYXRlZGx5IHBhcnNlIHRoZSBkb2N1bWVudCB0byBtYWtlIHN1cmUgaXQgc3RhYmlsaXplcywgc28gdGhhdCBhIGJyb3dzZXJcbiAgICAgICAgICAvLyB0cnlpbmcgdG8gYXV0by1jb3JyZWN0IGluY29ycmVjdCBIVE1MIGNhbm5vdCBjYXVzZSBmb3JtZXJseSBpbmVydCBIVE1MIHRvIGJlY29tZSBkYW5nZXJvdXMuXG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbVhTU0F0dGVtcHRzID0gNTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJzZWRIdG1sID0gdW5zYWZlSHRtbDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIGlmIChtWFNTQXR0ZW1wdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgaW5wdXQgaXMgdW5zdGFibGUnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtWFNTQXR0ZW1wdHMtLTtcbiAgICAgICAgICAgICAgdW5zYWZlSHRtbCA9IHBhcnNlZEh0bWw7XG4gICAgICAgICAgICAgIERPTS5zZXRJbm5lckhUTUwoY29udGFpbmVyRWwsIHVuc2FmZUh0bWwpO1xuICAgICAgICAgICAgICBpZiAoKChET00uZGVmYXVsdERvYygpKSkuZG9jdW1lbnRNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAvLyBzdHJpcCBjdXN0b20tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIG9uIElFPD0xMVxuICAgICAgICAgICAgICAgICAgc3RyaXBDdXN0b21Oc0F0dHJzKGNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwYXJzZWRIdG1sID0gRE9NLmdldElubmVySFRNTChjb250YWluZXJFbCk7XG4gICAgICAgICAgfSB3aGlsZSAodW5zYWZlSHRtbCAhPT0gcGFyc2VkSHRtbCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2FuaXRpemVyID0gbmV3IFNhbml0aXppbmdIdG1sU2VyaWFsaXplcigpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNhZmVIdG1sID0gc2FuaXRpemVyLnNhbml0aXplQ2hpbGRyZW4oRE9NLmdldFRlbXBsYXRlQ29udGVudChjb250YWluZXJFbCkgfHwgY29udGFpbmVyRWwpO1xuICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgYm9keSBlbGVtZW50LlxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudF8xID0gRE9NLmdldFRlbXBsYXRlQ29udGVudChjb250YWluZXJFbCkgfHwgY29udGFpbmVyRWw7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IERPTS5jaGlsZE5vZGVzQXNMaXN0KHBhcmVudF8xKTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgdmFyIGNoaWxkID0gX2FbX2ldO1xuICAgICAgICAgICAgICBET00ucmVtb3ZlQ2hpbGQocGFyZW50XzEsIGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcmUuaXNEZXZNb2RlKCkgJiYgc2FuaXRpemVyLnNhbml0aXplZFNvbWV0aGluZykge1xuICAgICAgICAgICAgICBET00ubG9nKCdXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNhZmVIdG1sO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJbiBjYXNlIGFueXRoaW5nIGdvZXMgd3JvbmcsIGNsZWFyIG91dCBpbmVydEVsZW1lbnQgdG8gcmVzZXQgdGhlIGVudGlyZSBET00gc3RydWN0dXJlLlxuICAgICAgICAgIGluZXJ0RWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNhZmUgc3R5bGUgdmFsdWVzLlxuICAgKlxuICAgKiBRdW90ZXMgKFwiIGFuZCAnKSBhcmUgYWxsb3dlZCwgYnV0IGEgY2hlY2sgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSB0byBlbnN1cmUgdGhleSdyZSBiYWxhbmNlZC5cbiAgICpcbiAgICogJywnIGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcHJvcGVydHkgKGUuZy4gYmFja2dyb3VuZC1hdHRhY2htZW50IG9yXG4gICAqIGZvbnQtZmFtaWx5KSBhbmQgaGVuY2UgY291bGQgYWxsb3cgbXVsdGlwbGUgdmFsdWVzIHRvIGdldCBpbmplY3RlZCwgYnV0IHRoYXQgc2hvdWxkIHBvc2Ugbm8gcmlza1xuICAgKiBvZiBYU1MuXG4gICAqXG4gICAqIFRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGNoZWNrcyBvbmx5IGZvciBYU1Mgc2FmZXR5LCBub3QgZm9yIENTUyB2YWxpZGl0eS5cbiAgICpcbiAgICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnksIGFuZCBhdWdtZW50ZWQgZm9yXG4gICAqIHRyYW5zZm9ybWF0aW9uIHZhbHVlcy5cbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIFZBTFVFUyA9ICdbLSwuXCJcXCclXyEjIGEtekEtWjAtOV0rJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVFJBTlNGT1JNQVRJT05fRk5TID0gJyg/Om1hdHJpeHx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXd8cGVyc3BlY3RpdmUpKD86WHxZfDNkKT8nO1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT0xPUl9GTlMgPSAnKD86cmdifGhzbClhPyc7XG4gIHZhciAvKiogQHR5cGUgez99ICovIEZOX0FSR1MgPSAnXFxcXChbLTAtOS4lLCBhLXpBLVpdK1xcXFwpJztcbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gU0FGRV9TVFlMRV9WQUxVRSA9IG5ldyBSZWdFeHAoXCJeKFwiICsgVkFMVUVTICsgXCJ8KD86XCIgKyBUUkFOU0ZPUk1BVElPTl9GTlMgKyBcInxcIiArIENPTE9SX0ZOUyArIFwiKVwiICsgRk5fQVJHUyArIFwiKSRcIiwgJ2cnKTtcbiAgLyoqXG4gICAqIE1hdGNoZXMgYSBgdXJsKC4uLilgIHZhbHVlIHdpdGggYW4gYXJiaXRyYXJ5IGFyZ3VtZW50IGFzIGxvbmcgYXMgaXQgZG9lc1xuICAgKiBub3QgY29udGFpbiBwYXJlbnRoZXNlcy5cbiAgICpcbiAgICogVGhlIFVSTCB2YWx1ZSBzdGlsbCBuZWVkcyB0byBiZSBzYW5pdGl6ZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogYHVybCguLi4pYCB2YWx1ZXMgYXJlIGEgdmVyeSBjb21tb24gdXNlIGNhc2UsIGUuZy4gZm9yIGBiYWNrZ3JvdW5kLWltYWdlYC4gV2l0aCBjYXJlZnVsbHkgY3JhZnRlZFxuICAgKiBDU1Mgc3R5bGUgcnVsZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhbiBpbmZvcm1hdGlvbiBsZWFrIHdpdGggYHVybGAgdmFsdWVzIGluIENTUywgZS5nLlxuICAgKiBieSBvYnNlcnZpbmcgd2hldGhlciBzY3JvbGwgYmFycyBhcmUgZGlzcGxheWVkLCBvciBjaGFyYWN0ZXIgcmFuZ2VzIHVzZWQgYnkgYSBmb250IGZhY2VcbiAgICogZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQW5ndWxhciBvbmx5IGFsbG93cyBiaW5kaW5nIENTUyB2YWx1ZXMgKGFzIG9wcG9zZWQgdG8gZW50aXJlIENTUyBydWxlcyksIHNvIGl0IGlzIHVubGlrZWx5IHRoYXRcbiAgICogYmluZGluZyBhIFVSTCB2YWx1ZSB3aXRob3V0IGZ1cnRoZXIgY29vcGVyYXRpb24gZnJvbSB0aGUgcGFnZSB3aWxsIGNhdXNlIGFuIGluZm9ybWF0aW9uIGxlYWssIGFuZFxuICAgKiBpZiBzbywgaXQgaXMganVzdCBhIGxlYWssIG5vdCBhIGZ1bGwgYmxvd24gWFNTIHZ1bG5lcmFiaWxpdHkuXG4gICAqXG4gICAqIEdpdmVuIHRoZSBjb21tb24gdXNlIGNhc2UsIGxvdyBsaWtlbGlob29kIG9mIGF0dGFjayB2ZWN0b3IsIGFuZCBsb3cgaW1wYWN0IG9mIGFuIGF0dGFjaywgdGhpc1xuICAgKiBjb2RlIGlzIHBlcm1pc3NpdmUgYW5kIGFsbG93cyBVUkxzIHRoYXQgc2FuaXRpemUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVVJMX1JFID0gL151cmxcXCgoW14pXSspXFwpJC87XG4gIC8qKlxuICAgKiAgQ2hlY2tzIHRoYXQgcXVvdGVzIChcIiBhbmQgJykgYXJlIHByb3Blcmx5IGJhbGFuY2VkIGluc2lkZSBhIHN0cmluZy4gQXNzdW1lc1xuICAgICogdGhhdCBuZWl0aGVyIGVzY2FwZSAoXFwpIG5vciBhbnkgb3RoZXIgY2hhcmFjdGVyIHRoYXQgY291bGQgcmVzdWx0IGluXG4gICAgKiBicmVha2luZyBvdXQgb2YgYSBzdHJpbmcgcGFyc2luZyBjb250ZXh0IGFyZSBhbGxvd2VkO1xuICAgICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNzdHJpbmctdG9rZW4tZGlhZ3JhbS5cbiAgICAqICpcbiAgICAqIFRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSB0aGUgQ2xvc3VyZSBzYW5pdGl6YXRpb24gbGlicmFyeS5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzQmFsYW5jZWRRdW90ZXModmFsdWUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dHNpZGVTaW5nbGUgPSB0cnVlO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3V0c2lkZURvdWJsZSA9IHRydWU7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjID0gdmFsdWUuY2hhckF0KGkpO1xuICAgICAgICAgIGlmIChjID09PSAnXFwnJyAmJiBvdXRzaWRlRG91YmxlKSB7XG4gICAgICAgICAgICAgIG91dHNpZGVTaW5nbGUgPSAhb3V0c2lkZVNpbmdsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoYyA9PT0gJ1wiJyAmJiBvdXRzaWRlU2luZ2xlKSB7XG4gICAgICAgICAgICAgIG91dHNpZGVEb3VibGUgPSAhb3V0c2lkZURvdWJsZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0c2lkZVNpbmdsZSAmJiBvdXRzaWRlRG91YmxlO1xuICB9XG4gIC8qKlxuICAgKiAgU2FuaXRpemVzIHRoZSBnaXZlbiB1bnRydXN0ZWQgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlIChpLmUuIG5vdCBhbiBlbnRpcmUgb2JqZWN0LCBqdXN0IGEgc2luZ2xlXG4gICAgKiB2YWx1ZSkgYW5kIHJldHVybnMgYSB2YWx1ZSB0aGF0IGlzIHNhZmUgdG8gdXNlIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2FuaXRpemVTdHlsZSh2YWx1ZSkge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcuXG4gICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgIC8vIFNpbmdsZSB1cmwoLi4uKSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG9ubHkgZm9yIFVSTHMgdGhhdCBzYW5pdGl6ZSBjbGVhbmx5LiBTZWUgYWJvdmUgZm9yXG4gICAgICAvLyByZWFzb25pbmcgYmVoaW5kIHRoaXMuXG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cmxNYXRjaCA9IHZhbHVlLm1hdGNoKFVSTF9SRSk7XG4gICAgICBpZiAoKHVybE1hdGNoICYmIHNhbml0aXplVXJsKHVybE1hdGNoWzFdKSA9PT0gdXJsTWF0Y2hbMV0pIHx8XG4gICAgICAgICAgdmFsdWUubWF0Y2goU0FGRV9TVFlMRV9WQUxVRSkgJiYgaGFzQmFsYW5jZWRRdW90ZXModmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlOyAvLyBTYWZlIHN0eWxlIHZhbHVlcy5cbiAgICAgIH1cbiAgICAgIGlmIChjb3JlLmlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgZ2V0RE9NKCkubG9nKFwiV0FSTklORzogc2FuaXRpemluZyB1bnNhZmUgc3R5bGUgdmFsdWUgXCIgKyB2YWx1ZSArIFwiIChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3Vuc2FmZSc7XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIHZhciBfX2V4dGVuZHMkOCA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbiAgLyoqXG4gICAqICBEb21TYW5pdGl6ZXIgaGVscHMgcHJldmVudGluZyBDcm9zcyBTaXRlIFNjcmlwdGluZyBTZWN1cml0eSBidWdzIChYU1MpIGJ5IHNhbml0aXppbmdcbiAgICAqIHZhbHVlcyB0byBiZSBzYWZlIHRvIHVzZSBpbiB0aGUgZGlmZmVyZW50IERPTSBjb250ZXh0cy5cbiAgICAqICpcbiAgICAqIEZvciBleGFtcGxlLCB3aGVuIGJpbmRpbmcgYSBVUkwgaW4gYW4gYDxhIFtocmVmXT1cInNvbWVWYWx1ZVwiPmAgaHlwZXJsaW5rLCBgc29tZVZhbHVlYCB3aWxsIGJlXG4gICAgKiBzYW5pdGl6ZWQgc28gdGhhdCBhbiBhdHRhY2tlciBjYW5ub3QgaW5qZWN0IGUuZy4gYSBgamF2YXNjcmlwdDpgIFVSTCB0aGF0IHdvdWxkIGV4ZWN1dGUgY29kZSBvblxuICAgICogdGhlIHdlYnNpdGUuXG4gICAgKiAqXG4gICAgKiBJbiBzcGVjaWZpYyBzaXR1YXRpb25zLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSBzYW5pdGl6YXRpb24sIGZvciBleGFtcGxlIGlmIHRoZVxuICAgICogYXBwbGljYXRpb24gZ2VudWluZWx5IG5lZWRzIHRvIHByb2R1Y2UgYSBgamF2YXNjcmlwdDpgIHN0eWxlIGxpbmsgd2l0aCBhIGR5bmFtaWMgdmFsdWUgaW4gaXQuXG4gICAgKiBVc2VycyBjYW4gYnlwYXNzIHNlY3VyaXR5IGJ5IGNvbnN0cnVjdGluZyBhIHZhbHVlIHdpdGggb25lIG9mIHRoZSBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmBcbiAgICAqIG1ldGhvZHMsIGFuZCB0aGVuIGJpbmRpbmcgdG8gdGhhdCB2YWx1ZSBmcm9tIHRoZSB0ZW1wbGF0ZS5cbiAgICAqICpcbiAgICAqIFRoZXNlIHNpdHVhdGlvbnMgc2hvdWxkIGJlIHZlcnkgcmFyZSwgYW5kIGV4dHJhb3JkaW5hcnkgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGNyZWF0aW5nIGFcbiAgICAqIENyb3NzIFNpdGUgU2NyaXB0aW5nIChYU1MpIHNlY3VyaXR5IGJ1ZyFcbiAgICAqICpcbiAgICAqIFdoZW4gdXNpbmcgYGJ5cGFzc1NlY3VyaXR5VHJ1c3QuLi5gLCBtYWtlIHN1cmUgdG8gY2FsbCB0aGUgbWV0aG9kIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGFuZCBhc1xuICAgICogY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHNvdXJjZSBvZiB0aGUgdmFsdWUsIHRvIG1ha2UgaXQgZWFzeSB0byB2ZXJpZnkgbm8gc2VjdXJpdHkgYnVnIGlzXG4gICAgKiBjcmVhdGVkIGJ5IGl0cyB1c2UuXG4gICAgKiAqXG4gICAgKiBJdCBpcyBub3QgcmVxdWlyZWQgKGFuZCBub3QgcmVjb21tZW5kZWQpIHRvIGJ5cGFzcyBzZWN1cml0eSBpZiB0aGUgdmFsdWUgaXMgc2FmZSwgZS5nLiBhIFVSTCB0aGF0XG4gICAgKiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3VzcGljaW91cyBwcm90b2NvbCwgb3IgYW4gSFRNTCBzbmlwcGV0IHRoYXQgZG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXNcbiAgICAqIGNvZGUuIFRoZSBzYW5pdGl6ZXIgbGVhdmVzIHNhZmUgdmFsdWVzIGludGFjdC5cbiAgICAqICpcbiAgICAqIHNhbml0aXphdGlvbiBmb3IgdGhlIHZhbHVlIHBhc3NlZCBpbi4gQ2FyZWZ1bGx5IGNoZWNrIGFuZCBhdWRpdCBhbGwgdmFsdWVzIGFuZCBjb2RlIHBhdGhzIGdvaW5nXG4gICAgKiBpbnRvIHRoaXMgY2FsbC4gTWFrZSBzdXJlIGFueSB1c2VyIGRhdGEgaXMgYXBwcm9wcmlhdGVseSBlc2NhcGVkIGZvciB0aGlzIHNlY3VyaXR5IGNvbnRleHQuXG4gICAgKiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuXG4gICAgKiAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIERvbVNhbml0aXplciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBEb21TYW5pdGl6ZXIoKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqICBTYW5pdGl6ZXMgYSB2YWx1ZSBmb3IgdXNlIGluIHRoZSBnaXZlbiBTZWN1cml0eUNvbnRleHQuXG4gICAgICAgICogKlxuICAgICAgICAqIElmIHZhbHVlIGlzIHRydXN0ZWQgZm9yIHRoZSBjb250ZXh0LCB0aGlzIG1ldGhvZCB3aWxsIHVud3JhcCB0aGUgY29udGFpbmVkIHNhZmUgdmFsdWUgYW5kIHVzZVxuICAgICAgICAqIGl0IGRpcmVjdGx5LiBPdGhlcndpc2UsIHZhbHVlIHdpbGwgYmUgc2FuaXRpemVkIHRvIGJlIHNhZmUgaW4gdGhlIGdpdmVuIGNvbnRleHQsIGZvciBleGFtcGxlXG4gICAgICAgICogYnkgcmVwbGFjaW5nIFVSTHMgdGhhdCBoYXZlIGFuIHVuc2FmZSBwcm90b2NvbCBwYXJ0IChzdWNoIGFzIGBqYXZhc2NyaXB0OmApLiBUaGUgaW1wbGVtZW50YXRpb25cbiAgICAgICAgKiBpcyByZXNwb25zaWJsZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgY2FuIGRlZmluaXRlbHkgYmUgc2FmZWx5IHVzZWQgaW4gdGhlIGdpdmVuIGNvbnRleHQuXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tU2FuaXRpemVyLnByb3RvdHlwZS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB2YWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgQnlwYXNzIHNlY3VyaXR5IGFuZCB0cnVzdCB0aGUgZ2l2ZW4gdmFsdWUgdG8gYmUgc2FmZSBIVE1MLiBPbmx5IHVzZSB0aGlzIHdoZW4gdGhlIGJvdW5kIEhUTUxcbiAgICAgICAgKiBpcyB1bnNhZmUgKGUuZy4gY29udGFpbnMgYDxzY3JpcHQ+YCB0YWdzKSBhbmQgdGhlIGNvZGUgc2hvdWxkIGJlIGV4ZWN1dGVkLiBUaGUgc2FuaXRpemVyIHdpbGxcbiAgICAgICAgKiBsZWF2ZSBzYWZlIEhUTUwgaW50YWN0LCBzbyBpbiBtb3N0IHNpdHVhdGlvbnMgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICAgICAgICAqICpcbiAgICAgICAgKiAqKldBUk5JTkc6KiogY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHVudHJ1c3RlZCB1c2VyIGRhdGEgZXhwb3NlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIFhTU1xuICAgICAgICAqIHNlY3VyaXR5IHJpc2tzIVxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TYW5pdGl6ZXIucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sID0gZnVuY3Rpb24gKHZhbHVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBCeXBhc3Mgc2VjdXJpdHkgYW5kIHRydXN0IHRoZSBnaXZlbiB2YWx1ZSB0byBiZSBzYWZlIHN0eWxlIHZhbHVlIChDU1MpLlxuICAgICAgICAqICpcbiAgICAgICAgKiAqKldBUk5JTkc6KiogY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHVudHJ1c3RlZCB1c2VyIGRhdGEgZXhwb3NlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIFhTU1xuICAgICAgICAqIHNlY3VyaXR5IHJpc2tzIVxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TYW5pdGl6ZXIucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgQnlwYXNzIHNlY3VyaXR5IGFuZCB0cnVzdCB0aGUgZ2l2ZW4gdmFsdWUgdG8gYmUgc2FmZSBKYXZhU2NyaXB0LlxuICAgICAgICAqICpcbiAgICAgICAgKiAqKldBUk5JTkc6KiogY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHVudHJ1c3RlZCB1c2VyIGRhdGEgZXhwb3NlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIFhTU1xuICAgICAgICAqIHNlY3VyaXR5IHJpc2tzIVxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TYW5pdGl6ZXIucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQgPSBmdW5jdGlvbiAodmFsdWUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogIEJ5cGFzcyBzZWN1cml0eSBhbmQgdHJ1c3QgdGhlIGdpdmVuIHZhbHVlIHRvIGJlIGEgc2FmZSBzdHlsZSBVUkwsIGkuZS4gYSB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkXG4gICAgICAgICogaW4gaHlwZXJsaW5rcyBvciBgPGltZyBzcmM+YC5cbiAgICAgICAgKiAqXG4gICAgICAgICogKipXQVJOSU5HOioqIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCB1bnRydXN0ZWQgdXNlciBkYXRhIGV4cG9zZXMgeW91ciBhcHBsaWNhdGlvbiB0byBYU1NcbiAgICAgICAgKiBzZWN1cml0eSByaXNrcyFcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tU2FuaXRpemVyLnByb3RvdHlwZS5ieXBhc3NTZWN1cml0eVRydXN0VXJsID0gZnVuY3Rpb24gKHZhbHVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBCeXBhc3Mgc2VjdXJpdHkgYW5kIHRydXN0IHRoZSBnaXZlbiB2YWx1ZSB0byBiZSBhIHNhZmUgcmVzb3VyY2UgVVJMLCBpLmUuIGEgbG9jYXRpb24gdGhhdCBtYXlcbiAgICAgICAgKiBiZSB1c2VkIHRvIGxvYWQgZXhlY3V0YWJsZSBjb2RlIGZyb20sIGxpa2UgYDxzY3JpcHQgc3JjPmAsIG9yIGA8aWZyYW1lIHNyYz5gLlxuICAgICAgICAqICpcbiAgICAgICAgKiAqKldBUk5JTkc6KiogY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHVudHJ1c3RlZCB1c2VyIGRhdGEgZXhwb3NlcyB5b3VyIGFwcGxpY2F0aW9uIHRvIFhTU1xuICAgICAgICAqIHNlY3VyaXR5IHJpc2tzIVxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TYW5pdGl6ZXIucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyB9O1xuICAgICAgcmV0dXJuIERvbVNhbml0aXplcjtcbiAgfSgpKTtcbiAgdmFyIERvbVNhbml0aXplckltcGwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDgoRG9tU2FuaXRpemVySW1wbCwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIERvbVNhbml0aXplckltcGwoKSB7XG4gICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY3R4XG4gICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEb21TYW5pdGl6ZXJJbXBsLnByb3RvdHlwZS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChjdHgsIHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIHN3aXRjaCAoY3R4KSB7XG4gICAgICAgICAgICAgIGNhc2UgY29yZS5TZWN1cml0eUNvbnRleHQuTk9ORTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgY2FzZSBjb3JlLlNlY3VyaXR5Q29udGV4dC5IVE1MOlxuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2FmZUh0bWxJbXBsKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja05vdFNhZmVWYWx1ZSh2YWx1ZSwgJ0hUTUwnKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUh0bWwoU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgIGNhc2UgY29yZS5TZWN1cml0eUNvbnRleHQuU1RZTEU6XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTYWZlU3R5bGVJbXBsKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja05vdFNhZmVWYWx1ZSh2YWx1ZSwgJ1N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2FuaXRpemVTdHlsZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIGNhc2UgY29yZS5TZWN1cml0eUNvbnRleHQuU0NSSVBUOlxuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2FmZVNjcmlwdEltcGwpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTm90U2FmZVZhbHVlKHZhbHVlLCAnU2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgc2NyaXB0IGNvbnRleHQnKTtcbiAgICAgICAgICAgICAgY2FzZSBjb3JlLlNlY3VyaXR5Q29udGV4dC5VUkw6XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTYWZlUmVzb3VyY2VVcmxJbXBsIHx8IHZhbHVlIGluc3RhbmNlb2YgU2FmZVVybEltcGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyByZXNvdXJjZSBVUkxzIGluIFVSTCBjb250ZXh0cywgdGhleSBhcmUgc3RyaWN0bHkgbW9yZSB0cnVzdGVkLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja05vdFNhZmVWYWx1ZSh2YWx1ZSwgJ1VSTCcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplVXJsKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICBjYXNlIGNvcmUuU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTDpcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNhZmVSZXNvdXJjZVVybEltcGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tOb3RTYWZlVmFsdWUodmFsdWUsICdSZXNvdXJjZVVSTCcpO1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKScpO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBTZWN1cml0eUNvbnRleHQgXCIgKyBjdHggKyBcIiAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylcIik7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBleHBlY3RlZFR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmNoZWNrTm90U2FmZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTYWZlVmFsdWVJbXBsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigoXCJSZXF1aXJlZCBhIHNhZmUgXCIgKyBleHBlY3RlZFR5cGUgKyBcIiwgZ290IGEgXCIgKyB2YWx1ZS5nZXRUeXBlTmFtZSgpICsgXCIgXCIpICtcbiAgICAgICAgICAgICAgICAgIFwiKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpXCIpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgU2FmZUh0bWxJbXBsKHZhbHVlKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgRG9tU2FuaXRpemVySW1wbC5wcm90b3R5cGUuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgU2FmZVN0eWxlSW1wbCh2YWx1ZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBTYWZlU2NyaXB0SW1wbCh2YWx1ZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBTYWZlVXJsSW1wbCh2YWx1ZSk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBuZXcgU2FmZVJlc291cmNlVXJsSW1wbCh2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgRG9tU2FuaXRpemVySW1wbC5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBEb21TYW5pdGl6ZXJJbXBsLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICByZXR1cm4gRG9tU2FuaXRpemVySW1wbDtcbiAgfShEb21TYW5pdGl6ZXIpKTtcbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIFNhZmVWYWx1ZUltcGwgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHlcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gU2FmZVZhbHVlSW1wbChjaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5KSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5ID0gY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eTtcbiAgICAgICAgICAvLyBlbXB0eVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFNhZmVWYWx1ZUltcGwucHJvdG90eXBlLmdldFR5cGVOYW1lID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlVmFsdWVJbXBsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gKFwiU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzogXCIgKyB0aGlzLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHkpICtcbiAgICAgICAgICAgICAgXCIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFNhZmVWYWx1ZUltcGw7XG4gIH0oKSk7XG4gIHZhciBTYWZlSHRtbEltcGwgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzJDgoU2FmZUh0bWxJbXBsLCBfc3VwZXIpO1xuICAgICAgZnVuY3Rpb24gU2FmZUh0bWxJbXBsKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlSHRtbEltcGwucHJvdG90eXBlLmdldFR5cGVOYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ0hUTUwnOyB9O1xuICAgICAgcmV0dXJuIFNhZmVIdG1sSW1wbDtcbiAgfShTYWZlVmFsdWVJbXBsKSk7XG4gIHZhciBTYWZlU3R5bGVJbXBsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ4KFNhZmVTdHlsZUltcGwsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBTYWZlU3R5bGVJbXBsKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlU3R5bGVJbXBsLnByb3RvdHlwZS5nZXRUeXBlTmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdTdHlsZSc7IH07XG4gICAgICByZXR1cm4gU2FmZVN0eWxlSW1wbDtcbiAgfShTYWZlVmFsdWVJbXBsKSk7XG4gIHZhciBTYWZlU2NyaXB0SW1wbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkOChTYWZlU2NyaXB0SW1wbCwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIFNhZmVTY3JpcHRJbXBsKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlU2NyaXB0SW1wbC5wcm90b3R5cGUuZ2V0VHlwZU5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnU2NyaXB0JzsgfTtcbiAgICAgIHJldHVybiBTYWZlU2NyaXB0SW1wbDtcbiAgfShTYWZlVmFsdWVJbXBsKSk7XG4gIHZhciBTYWZlVXJsSW1wbCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkOChTYWZlVXJsSW1wbCwgX3N1cGVyKTtcbiAgICAgIGZ1bmN0aW9uIFNhZmVVcmxJbXBsKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlVXJsSW1wbC5wcm90b3R5cGUuZ2V0VHlwZU5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnVVJMJzsgfTtcbiAgICAgIHJldHVybiBTYWZlVXJsSW1wbDtcbiAgfShTYWZlVmFsdWVJbXBsKSk7XG4gIHZhciBTYWZlUmVzb3VyY2VVcmxJbXBsID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQ4KFNhZmVSZXNvdXJjZVVybEltcGwsIF9zdXBlcik7XG4gICAgICBmdW5jdGlvbiBTYWZlUmVzb3VyY2VVcmxJbXBsKCkge1xuICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBTYWZlUmVzb3VyY2VVcmxJbXBsLnByb3RvdHlwZS5nZXRUeXBlTmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdSZXNvdXJjZVVSTCc7IH07XG4gICAgICByZXR1cm4gU2FmZVJlc291cmNlVXJsSW1wbDtcbiAgfShTYWZlVmFsdWVJbXBsKSk7XG5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlMgPSBbXG4gICAgICB7IHByb3ZpZGU6IGNvcmUuUExBVEZPUk1fSU5JVElBTElaRVIsIHVzZVZhbHVlOiBpbml0RG9tQWRhcHRlciwgbXVsdGk6IHRydWUgfSxcbiAgICAgIHsgcHJvdmlkZTogX2FuZ3VsYXJfY29tbW9uLlBsYXRmb3JtTG9jYXRpb24sIHVzZUNsYXNzOiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiB9XG4gIF07XG4gIC8qKlxuICAgKiBAc2VjdXJpdHkgUmVwbGFjaW5nIGJ1aWx0LWluIHNhbml0aXphdGlvbiBwcm92aWRlcnMgZXhwb3NlcyB0aGUgYXBwbGljYXRpb24gdG8gWFNTIHJpc2tzLlxuICAgKiBBdHRhY2tlci1jb250cm9sbGVkIGRhdGEgaW50cm9kdWNlZCBieSBhbiB1bnNhbml0aXplZCBwcm92aWRlciBjb3VsZCBleHBvc2UgeW91clxuICAgKiBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuIEZvciBtb3JlIGRldGFpbCwgc2VlIHRoZSBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS5cbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gQlJPV1NFUl9TQU5JVElaQVRJT05fUFJPVklERVJTID0gW1xuICAgICAgeyBwcm92aWRlOiBjb3JlLlNhbml0aXplciwgdXNlRXhpc3Rpbmc6IERvbVNhbml0aXplciB9LFxuICAgICAgeyBwcm92aWRlOiBEb21TYW5pdGl6ZXIsIHVzZUNsYXNzOiBEb21TYW5pdGl6ZXJJbXBsIH0sXG4gIF07XG4gIC8qKlxuICAgKiBAc3RhYmxlXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwbGF0Zm9ybUJyb3dzZXIgPSBjb3JlLmNyZWF0ZVBsYXRmb3JtRmFjdG9yeShjb3JlLnBsYXRmb3JtQ29yZSwgJ2Jyb3dzZXInLCBJTlRFUk5BTF9CUk9XU0VSX1BMQVRGT1JNX1BST1ZJREVSUyk7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdERvbUFkYXB0ZXIoKSB7XG4gICAgICBCcm93c2VyRG9tQWRhcHRlci5tYWtlQ3VycmVudCgpO1xuICAgICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LmluaXQoKTtcbiAgfVxuICAvKipcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGVycm9ySGFuZGxlcigpIHtcbiAgICAgIHJldHVybiBuZXcgY29yZS5FcnJvckhhbmRsZXIoKTtcbiAgfVxuICAvKipcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIF9kb2N1bWVudCgpIHtcbiAgICAgIHJldHVybiBnZXRET00oKS5kZWZhdWx0RG9jKCk7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBfcmVzb2x2ZURlZmF1bHRBbmltYXRpb25Ecml2ZXIoKSB7XG4gICAgICBpZiAoZ2V0RE9NKCkuc3VwcG9ydHNXZWJBbmltYXRpb24oKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgV2ViQW5pbWF0aW9uc0RyaXZlcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEFuaW1hdGlvbkRyaXZlci5OT09QO1xuICB9XG4gIC8qKlxuICAgKiAgVGhlIG5nIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIuXG4gICAgKiAqXG4gICAqL1xuICB2YXIgQnJvd3Nlck1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50TW9kdWxlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEJyb3dzZXJNb2R1bGUocGFyZW50TW9kdWxlKSB7XG4gICAgICAgICAgaWYgKHBhcmVudE1vZHVsZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyTW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gY29tbW9uIGRpcmVjdGl2ZXMgc3VjaCBhcyBOZ0lmIGFuZCBOZ0ZvciBmcm9tIGEgbGF6eSBsb2FkZWQgbW9kdWxlLCBpbXBvcnQgQ29tbW9uTW9kdWxlIGluc3RlYWQuXCIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEJyb3dzZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IGNvcmUuTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUywgeyBwcm92aWRlOiBjb3JlLkVycm9ySGFuZGxlciwgdXNlRmFjdG9yeTogZXJyb3JIYW5kbGVyLCBkZXBzOiBbXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IERPQ1VNRU5ULCB1c2VGYWN0b3J5OiBfZG9jdW1lbnQsIGRlcHM6IFtdIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB1c2VDbGFzczogRG9tRXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUywgdXNlQ2xhc3M6IEtleUV2ZW50c1BsdWdpbiwgbXVsdGk6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIHVzZUNsYXNzOiBIYW1tZXJHZXN0dXJlc1BsdWdpbiwgbXVsdGk6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBIQU1NRVJfR0VTVFVSRV9DT05GSUcsIHVzZUNsYXNzOiBIYW1tZXJHZXN0dXJlQ29uZmlnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogRG9tUm9vdFJlbmRlcmVyLCB1c2VDbGFzczogRG9tUm9vdFJlbmRlcmVyXyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IGNvcmUuUm9vdFJlbmRlcmVyLCB1c2VFeGlzdGluZzogRG9tUm9vdFJlbmRlcmVyIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogU2hhcmVkU3R5bGVzSG9zdCwgdXNlRXhpc3Rpbmc6IERvbVNoYXJlZFN0eWxlc0hvc3QgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBBbmltYXRpb25Ecml2ZXIsIHVzZUZhY3Rvcnk6IF9yZXNvbHZlRGVmYXVsdEFuaW1hdGlvbkRyaXZlciB9LCBEb21TaGFyZWRTdHlsZXNIb3N0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlLlRlc3RhYmlsaXR5LCBFdmVudE1hbmFnZXIsIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLCBUaXRsZVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW19hbmd1bGFyX2NvbW1vbi5Db21tb25Nb2R1bGUsIGNvcmUuQXBwbGljYXRpb25Nb2R1bGVdXG4gICAgICAgICAgICAgICAgICB9LF0gfSxcbiAgICAgIF07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIEJyb3dzZXJNb2R1bGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiBCcm93c2VyTW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBjb3JlLk9wdGlvbmFsIH0sIHsgdHlwZTogY29yZS5Ta2lwU2VsZiB9LF0gfSxcbiAgICAgIF07IH07XG4gICAgICByZXR1cm4gQnJvd3Nlck1vZHVsZTtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIC8qKlxuICAgKiBKUyB2ZXJzaW9uIG9mIGJyb3dzZXIgQVBJcy4gVGhpcyBsaWJyYXJ5IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3Nlci5cbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIHdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCAoe30pO1xuXG4gIHZhciBDaGFuZ2VEZXRlY3Rpb25QZXJmUmVjb3JkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBtc1BlclRpY2tcbiAgICAgICAqIEBwYXJhbSB7P30gbnVtVGlja3NcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQ2hhbmdlRGV0ZWN0aW9uUGVyZlJlY29yZChtc1BlclRpY2ssIG51bVRpY2tzKSB7XG4gICAgICAgICAgdGhpcy5tc1BlclRpY2sgPSBtc1BlclRpY2s7XG4gICAgICAgICAgdGhpcy5udW1UaWNrcyA9IG51bVRpY2tzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblBlcmZSZWNvcmQ7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgRW50cnkgcG9pbnQgZm9yIGFsbCBBbmd1bGFyIGRlYnVnIHRvb2xzLiBUaGlzIG9iamVjdCBjb3JyZXNwb25kcyB0byB0aGUgYG5nYFxuICAgICogZ2xvYmFsIHZhcmlhYmxlIGFjY2Vzc2libGUgaW4gdGhlIGRldiBjb25zb2xlLlxuICAgKi9cbiAgdmFyIEFuZ3VsYXJUb29scyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVmXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFuZ3VsYXJUb29scyhyZWYpIHtcbiAgICAgICAgICB0aGlzLnByb2ZpbGVyID0gbmV3IEFuZ3VsYXJQcm9maWxlcihyZWYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEFuZ3VsYXJUb29scztcbiAgfSgpKTtcbiAgLyoqXG4gICAqICBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgcHJvZmlsaW5nLXJlbGF0ZWQgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0XG4gICAgKiBjb3JyZXNwb25kcyB0byB0aGUgYG5nLnByb2ZpbGVyYCBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gICAqL1xuICB2YXIgQW5ndWxhclByb2ZpbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWZcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQW5ndWxhclByb2ZpbGVyKHJlZikge1xuICAgICAgICAgIHRoaXMuYXBwUmVmID0gcmVmLmluamVjdG9yLmdldChjb3JlLkFwcGxpY2F0aW9uUmVmKTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIEV4ZXJjaXNlcyBjaGFuZ2UgZGV0ZWN0aW9uIGluIGEgbG9vcCBhbmQgdGhlbiBwcmludHMgdGhlIGF2ZXJhZ2UgYW1vdW50IG9mXG4gICAgICAgICogdGltZSBpbiBtaWxsaXNlY29uZHMgaG93IGxvbmcgYSBzaW5nbGUgcm91bmQgb2YgY2hhbmdlIGRldGVjdGlvbiB0YWtlcyBmb3JcbiAgICAgICAgKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgVUkuIEl0IHJ1bnMgYSBtaW5pbXVtIG9mIDUgcm91bmRzIGZvciBhIG1pbmltdW1cbiAgICAgICAgKiBvZiA1MDAgbWlsbGlzZWNvbmRzLlxuICAgICAgICAqICpcbiAgICAgICAgKiBPcHRpb25hbGx5LCBhIHVzZXIgbWF5IHBhc3MgYSBgY29uZmlnYCBwYXJhbWV0ZXIgY29udGFpbmluZyBhIG1hcCBvZlxuICAgICAgICAqIG9wdGlvbnMuIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAgICAgICAgKiAqXG4gICAgICAgICogYHJlY29yZGAgKGJvb2xlYW4pIC0gY2F1c2VzIHRoZSBwcm9maWxlciB0byByZWNvcmQgYSBDUFUgcHJvZmlsZSB3aGlsZVxuICAgICAgICAqIGl0IGV4ZXJjaXNlcyB0aGUgY2hhbmdlIGRldGVjdG9yLiBFeGFtcGxlOlxuICAgICAgICAqICpcbiAgICAgICAgKiBgYGBcbiAgICAgICAgKiBuZy5wcm9maWxlci50aW1lQ2hhbmdlRGV0ZWN0aW9uKHtyZWNvcmQ6IHRydWV9KVxuICAgICAgICAqIGBgYFxuICAgICAgICogQHBhcmFtIHs/fSBjb25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFuZ3VsYXJQcm9maWxlci5wcm90b3R5cGUudGltZUNoYW5nZURldGVjdGlvbiA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWNvcmQgPSBjb25maWcgJiYgY29uZmlnWydyZWNvcmQnXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9maWxlTmFtZSA9ICdDaGFuZ2UgRGV0ZWN0aW9uJztcbiAgICAgICAgICAvLyBQcm9maWxlciBpcyBub3QgYXZhaWxhYmxlIGluIEFuZHJvaWQgYnJvd3NlcnMsIG5vciBpbiBJRSA5IHdpdGhvdXQgZGV2IHRvb2xzIG9wZW5lZFxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzUHJvZmlsZXJBdmFpbGFibGUgPSBpc1ByZXNlbnQod2luLmNvbnNvbGUucHJvZmlsZSk7XG4gICAgICAgICAgaWYgKHJlY29yZCAmJiBpc1Byb2ZpbGVyQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgIHdpbi5jb25zb2xlLnByb2ZpbGUocHJvZmlsZU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGFydCA9IGdldERPTSgpLnBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbnVtVGlja3MgPSAwO1xuICAgICAgICAgIHdoaWxlIChudW1UaWNrcyA8IDUgfHwgKGdldERPTSgpLnBlcmZvcm1hbmNlTm93KCkgLSBzdGFydCkgPCA1MDApIHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBSZWYudGljaygpO1xuICAgICAgICAgICAgICBudW1UaWNrcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbmQgPSBnZXRET00oKS5wZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgIGlmIChyZWNvcmQgJiYgaXNQcm9maWxlckF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNhc3QgdG8gPGFueT4gYmVjYXVzZSB0eXBlIGNoZWNrZXIgdGhpbmtzIHRoZXJlJ3Mgbm8gYXJndW1lbnRcbiAgICAgICAgICAgICAgLy8gd2hpbGUgaW4gZmFjdCB0aGVyZSBpczpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NvbnNvbGUvcHJvZmlsZUVuZFxuICAgICAgICAgICAgICAoKHdpbi5jb25zb2xlLnByb2ZpbGVFbmQpKShwcm9maWxlTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1zUGVyVGljayA9IChlbmQgLSBzdGFydCkgLyBudW1UaWNrcztcbiAgICAgICAgICB3aW4uY29uc29sZS5sb2coXCJyYW4gXCIgKyBudW1UaWNrcyArIFwiIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzXCIpO1xuICAgICAgICAgIHdpbi5jb25zb2xlLmxvZyhtc1BlclRpY2sudG9GaXhlZCgyKSArIFwiIG1zIHBlciBjaGVja1wiKTtcbiAgICAgICAgICByZXR1cm4gbmV3IENoYW5nZURldGVjdGlvblBlcmZSZWNvcmQobXNQZXJUaWNrLCBudW1UaWNrcyk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFuZ3VsYXJQcm9maWxlcjtcbiAgfSgpKTtcblxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb250ZXh0ID0gKGdsb2JhbCQxKTtcbiAgLyoqXG4gICAqICBFbmFibGVkIEFuZ3VsYXIgMiBkZWJ1ZyB0b29scyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHZpYSB5b3VyIGJyb3dzZXInc1xuICAgICogZGV2ZWxvcGVyIGNvbnNvbGUuXG4gICAgKiAqXG4gICAgKiBVc2FnZTpcbiAgICAqICpcbiAgICAqIDEuIE9wZW4gZGV2ZWxvcGVyIGNvbnNvbGUgKGUuZy4gaW4gQ2hyb21lIEN0cmwgKyBTaGlmdCArIGopXG4gICAgKiAxLiBUeXBlIGBuZy5gICh1c3VhbGx5IHRoZSBjb25zb2xlIHdpbGwgc2hvdyBhdXRvLWNvbXBsZXRlIHN1Z2dlc3Rpb24pXG4gICAgKiAxLiBUcnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gcHJvZmlsZXIgYG5nLnByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24oKWBcbiAgICAqIHRoZW4gaGl0IEVudGVyLlxuICAgICogKlxuICAgKiBAcGFyYW0gez99IHJlZlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZW5hYmxlRGVidWdUb29scyhyZWYpIHtcbiAgICAgICgoT2JqZWN0KSkuYXNzaWduKGNvbnRleHQubmcsIG5ldyBBbmd1bGFyVG9vbHMocmVmKSk7XG4gICAgICByZXR1cm4gcmVmO1xuICB9XG4gIC8qKlxuICAgKiAgRGlzYWJsZXMgQW5ndWxhciAyIHRvb2xzLlxuICAgICogKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZURlYnVnVG9vbHMoKSB7XG4gICAgICBpZiAoY29udGV4dC5uZykge1xuICAgICAgICAgIGRlbGV0ZSBjb250ZXh0Lm5nLnByb2ZpbGVyO1xuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBQcmVkaWNhdGVzIGZvciB1c2Ugd2l0aCB7QGxpbmsgRGVidWdFbGVtZW50fSdzIHF1ZXJ5IGZ1bmN0aW9ucy5cbiAgICAqICpcbiAgICovXG4gIHZhciBCeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBCeSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIE1hdGNoIGFsbCBlbGVtZW50cy5cbiAgICAgICAgKiAqXG4gICAgICAgICogIyMgRXhhbXBsZVxuICAgICAgICAqICpcbiAgICAgICAgKiB7QGV4YW1wbGUgcGxhdGZvcm0tYnJvd3Nlci9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9hbGwnfVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQnkuYWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZnVuY3Rpb24gKGRlYnVnRWxlbWVudCkgeyByZXR1cm4gdHJ1ZTsgfTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogIE1hdGNoIGVsZW1lbnRzIGJ5IHRoZSBnaXZlbiBDU1Mgc2VsZWN0b3IuXG4gICAgICAgICogKlxuICAgICAgICAqICMjIEV4YW1wbGVcbiAgICAgICAgKiAqXG4gICAgICAgICoge0BleGFtcGxlIHBsYXRmb3JtLWJyb3dzZXIvZG9tL2RlYnVnL3RzL2J5L2J5LnRzIHJlZ2lvbj0nYnlfY3NzJ31cbiAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJ5LmNzcyA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVidWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQoZGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpID9cbiAgICAgICAgICAgICAgICAgIGdldERPTSgpLmVsZW1lbnRNYXRjaGVzKGRlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50LCBzZWxlY3RvcikgOlxuICAgICAgICAgICAgICAgICAgZmFsc2U7XG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBNYXRjaCBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIGdpdmVuIGRpcmVjdGl2ZSBwcmVzZW50LlxuICAgICAgICAqICpcbiAgICAgICAgKiAjIyBFeGFtcGxlXG4gICAgICAgICogKlxuICAgICAgICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS1icm93c2VyL2RvbS9kZWJ1Zy90cy9ieS9ieS50cyByZWdpb249J2J5X2RpcmVjdGl2ZSd9XG4gICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEJ5LmRpcmVjdGl2ZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkZWJ1Z0VsZW1lbnQpIHsgcmV0dXJuIGRlYnVnRWxlbWVudC5wcm92aWRlclRva2Vucy5pbmRleE9mKHR5cGUpICE9PSAtMTsgfTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQnk7XG4gIH0oKSk7XG5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX19wbGF0Zm9ybV9icm93c2VyX3ByaXZhdGVfXyA9IHtcbiAgICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uOiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgIERvbUFkYXB0ZXI6IERvbUFkYXB0ZXIsXG4gICAgICBCcm93c2VyRG9tQWRhcHRlcjogQnJvd3NlckRvbUFkYXB0ZXIsXG4gICAgICBCcm93c2VyR2V0VGVzdGFiaWxpdHk6IEJyb3dzZXJHZXRUZXN0YWJpbGl0eSxcbiAgICAgIGdldERPTTogZ2V0RE9NLFxuICAgICAgc2V0Um9vdERvbUFkYXB0ZXI6IHNldFJvb3REb21BZGFwdGVyLFxuICAgICAgRG9tUm9vdFJlbmRlcmVyXzogRG9tUm9vdFJlbmRlcmVyXyxcbiAgICAgIERvbVJvb3RSZW5kZXJlcjogRG9tUm9vdFJlbmRlcmVyLFxuICAgICAgTkFNRVNQQUNFX1VSSVM6IE5BTUVTUEFDRV9VUklTLFxuICAgICAgc2hpbUNvbnRlbnRBdHRyaWJ1dGU6IHNoaW1Db250ZW50QXR0cmlidXRlLFxuICAgICAgc2hpbUhvc3RBdHRyaWJ1dGU6IHNoaW1Ib3N0QXR0cmlidXRlLFxuICAgICAgZmxhdHRlblN0eWxlczogZmxhdHRlblN0eWxlcyxcbiAgICAgIHNwbGl0TmFtZXNwYWNlOiBzcGxpdE5hbWVzcGFjZSxcbiAgICAgIGlzTmFtZXNwYWNlZDogaXNOYW1lc3BhY2VkLFxuICAgICAgRG9tU2hhcmVkU3R5bGVzSG9zdDogRG9tU2hhcmVkU3R5bGVzSG9zdCxcbiAgICAgIFNoYXJlZFN0eWxlc0hvc3Q6IFNoYXJlZFN0eWxlc0hvc3QsXG4gICAgICBFTEVNRU5UX1BST0JFX1BST1ZJREVSUzogRUxFTUVOVF9QUk9CRV9QUk9WSURFUlMsXG4gICAgICBEb21FdmVudHNQbHVnaW46IERvbUV2ZW50c1BsdWdpbixcbiAgICAgIEtleUV2ZW50c1BsdWdpbjogS2V5RXZlbnRzUGx1Z2luLFxuICAgICAgSGFtbWVyR2VzdHVyZXNQbHVnaW46IEhhbW1lckdlc3R1cmVzUGx1Z2luLFxuICAgICAgaW5pdERvbUFkYXB0ZXI6IGluaXREb21BZGFwdGVyLFxuICAgICAgSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlM6IElOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTLFxuICAgICAgQlJPV1NFUl9TQU5JVElaQVRJT05fUFJPVklERVJTOiBCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlMsXG4gICAgICBXZWJBbmltYXRpb25zRHJpdmVyOiBXZWJBbmltYXRpb25zRHJpdmVyXG4gIH07XG5cbiAgLyoqXG4gICAqIEBzdGFibGVcbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIFZFUlNJT04gPSBuZXcgY29yZS5WZXJzaW9uKCcyLjQuMScpO1xuXG4gIGV4cG9ydHMuQnJvd3Nlck1vZHVsZSA9IEJyb3dzZXJNb2R1bGU7XG4gIGV4cG9ydHMucGxhdGZvcm1Ccm93c2VyID0gcGxhdGZvcm1Ccm93c2VyO1xuICBleHBvcnRzLlRpdGxlID0gVGl0bGU7XG4gIGV4cG9ydHMuZGlzYWJsZURlYnVnVG9vbHMgPSBkaXNhYmxlRGVidWdUb29scztcbiAgZXhwb3J0cy5lbmFibGVEZWJ1Z1Rvb2xzID0gZW5hYmxlRGVidWdUb29scztcbiAgZXhwb3J0cy5BbmltYXRpb25Ecml2ZXIgPSBBbmltYXRpb25Ecml2ZXI7XG4gIGV4cG9ydHMuQnkgPSBCeTtcbiAgZXhwb3J0cy5OZ1Byb2JlVG9rZW4gPSBOZ1Byb2JlVG9rZW47XG4gIGV4cG9ydHMuRE9DVU1FTlQgPSBET0NVTUVOVDtcbiAgZXhwb3J0cy5FVkVOVF9NQU5BR0VSX1BMVUdJTlMgPSBFVkVOVF9NQU5BR0VSX1BMVUdJTlM7XG4gIGV4cG9ydHMuRXZlbnRNYW5hZ2VyID0gRXZlbnRNYW5hZ2VyO1xuICBleHBvcnRzLkhBTU1FUl9HRVNUVVJFX0NPTkZJRyA9IEhBTU1FUl9HRVNUVVJFX0NPTkZJRztcbiAgZXhwb3J0cy5IYW1tZXJHZXN0dXJlQ29uZmlnID0gSGFtbWVyR2VzdHVyZUNvbmZpZztcbiAgZXhwb3J0cy5Eb21TYW5pdGl6ZXIgPSBEb21TYW5pdGl6ZXI7XG4gIGV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG4gIGV4cG9ydHMuX19wbGF0Zm9ybV9icm93c2VyX3ByaXZhdGVfXyA9IF9fcGxhdGZvcm1fYnJvd3Nlcl9wcml2YXRlX187XG5cbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9idW5kbGVzL3BsYXRmb3JtLWJyb3dzZXIudW1kLmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  90. /***/ },
  91. /* 23 */
  92. /***/ function(module, exports, __webpack_require__) {
  93. eval("/* WEBPACK VAR INJECTION */(function(global) {/**\n * @license Angular v2.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(4)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/core'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.common = global.ng.common || {}),global.ng.core));\n}(this, function (exports,_angular_core) { 'use strict';\n\n /**\n * This class should not be used directly by an application developer. Instead, use\n * {@link Location}.\n * *\n * `PlatformLocation` encapsulates all calls to DOM apis, which allows the Router to be platform\n * agnostic.\n * This means that we can have different implementation of `PlatformLocation` for the different\n * platforms\n * that angular supports. For example, the default `PlatformLocation` is {@link\n * BrowserPlatformLocation},\n * however when you run your app in a WebWorker you use {@link WebWorkerPlatformLocation}.\n * *\n * The `PlatformLocation` class is used directly by all implementations of {@link LocationStrategy}\n * when\n * they need to interact with the DOM apis like pushState, popState, etc...\n * *\n * {@link LocationStrategy} in turn is used by the {@link Location} service which is used directly\n * by\n * the {@link Router} in order to navigate between routes. Since all interactions between {@link\n * Router} /\n * {@link Location} / {@link LocationStrategy} and DOM apis flow through the `PlatformLocation`\n * class\n * they are all platform independent.\n * *\n * @abstract\n */\n var PlatformLocation = (function () {\n function PlatformLocation() {\n }\n /**\n * @abstract\n * @return {?}\n */\n PlatformLocation.prototype.getBaseHrefFromDOM = function () { };\n /**\n * @abstract\n * @param {?} fn\n * @return {?}\n */\n PlatformLocation.prototype.onPopState = function (fn) { };\n /**\n * @abstract\n * @param {?} fn\n * @return {?}\n */\n PlatformLocation.prototype.onHashChange = function (fn) { };\n Object.defineProperty(PlatformLocation.prototype, \"pathname\", {\n /**\n * @return {?}\n */\n get: function () { return null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(PlatformLocation.prototype, \"search\", {\n /**\n * @return {?}\n */\n get: function () { return null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(PlatformLocation.prototype, \"hash\", {\n /**\n * @return {?}\n */\n get: function () { return null; },\n enumerable: true,\n configurable: true\n });\n /**\n * @abstract\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @return {?}\n */\n PlatformLocation.prototype.replaceState = function (state, title, url) { };\n /**\n * @abstract\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @return {?}\n */\n PlatformLocation.prototype.pushState = function (state, title, url) { };\n /**\n * @abstract\n * @return {?}\n */\n PlatformLocation.prototype.forward = function () { };\n /**\n * @abstract\n * @return {?}\n */\n PlatformLocation.prototype.back = function () { };\n return PlatformLocation;\n }());\n\n /**\n * `LocationStrategy` is responsible for representing and reading route state\n * from the browser's URL. Angular provides two strategies:\n * {@link HashLocationStrategy} and {@link PathLocationStrategy}.\n * *\n * This is used under the hood of the {@link Location} service.\n * *\n * Applications should use the {@link Router} or {@link Location} services to\n * interact with application route state.\n * *\n * For instance, {@link HashLocationStrategy} produces URLs like\n * `http://example.com#/foo`, and {@link PathLocationStrategy} produces\n * `http://example.com/foo` as an equivalent URL.\n * *\n * See these two classes for more.\n * *\n * @abstract\n */\n var LocationStrategy = (function () {\n function LocationStrategy() {\n }\n /**\n * @abstract\n * @param {?=} includeHash\n * @return {?}\n */\n LocationStrategy.prototype.path = function (includeHash) { };\n /**\n * @abstract\n * @param {?} internal\n * @return {?}\n */\n LocationStrategy.prototype.prepareExternalUrl = function (internal) { };\n /**\n * @abstract\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @param {?} queryParams\n * @return {?}\n */\n LocationStrategy.prototype.pushState = function (state, title, url, queryParams) { };\n /**\n * @abstract\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @param {?} queryParams\n * @return {?}\n */\n LocationStrategy.prototype.replaceState = function (state, title, url, queryParams) { };\n /**\n * @abstract\n * @return {?}\n */\n LocationStrategy.prototype.forward = function () { };\n /**\n * @abstract\n * @return {?}\n */\n LocationStrategy.prototype.back = function () { };\n /**\n * @abstract\n * @param {?} fn\n * @return {?}\n */\n LocationStrategy.prototype.onPopState = function (fn) { };\n /**\n * @abstract\n * @return {?}\n */\n LocationStrategy.prototype.getBaseHref = function () { };\n return LocationStrategy;\n }());\n /**\n * The `APP_BASE_HREF` token represents the base href to be used with the\n * {@link PathLocationStrategy}.\n *\n * If you're using {@link PathLocationStrategy}, you must provide a provider to a string\n * representing the URL prefix that should be preserved when generating and recognizing\n * URLs.\n *\n * ### Example\n *\n * ```typescript\n * import {Component, NgModule} from '@angular/core';\n * import {APP_BASE_HREF} from '@angular/common';\n *\n * @NgModule({\n * providers: [{provide: APP_BASE_HREF, useValue: '/my/app'}]\n * })\n * class AppModule {}\n * ```\n *\n * @stable\n */\n var /** @type {?} */ APP_BASE_HREF = new _angular_core.OpaqueToken('appBaseHref');\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var /** @type {?} */ globalScope;\n if (typeof window === 'undefined') {\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492\n globalScope = (self);\n }\n else {\n globalScope = (global);\n }\n }\n else {\n globalScope = (window);\n }\n // Need to declare a new variable for global here since TypeScript\n // exports the original value of the symbol.\n var /** @type {?} */ _global = globalScope;\n /**\n * @param {?} type\n * @return {?}\n */\n function getTypeNameForDebugging(type) {\n return type['name'] || typeof type;\n }\n // TODO: remove calls to assert in production environment\n // Note: Can't just export this and import in in other files\n // as `assert` is a reserved keyword in Dart\n _global.assert = function assert(condition) {\n // TODO: to be fixed properly via #2830, noop for now\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n function isPresent(obj) {\n return obj != null;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isBlank(obj) {\n return obj == null;\n }\n /**\n * @param {?} obj\n * @return {?}\n */\n function isDate(obj) {\n return obj instanceof Date && !isNaN(obj.valueOf());\n }\n /**\n * @param {?} token\n * @return {?}\n */\n function stringify(token) {\n if (typeof token === 'string') {\n return token;\n }\n if (token == null) {\n return '' + token;\n }\n if (token.overriddenName) {\n return \"\" + token.overriddenName;\n }\n if (token.name) {\n return \"\" + token.name;\n }\n var /** @type {?} */ res = token.toString();\n var /** @type {?} */ newLineIndex = res.indexOf('\\n');\n return newLineIndex === -1 ? res : res.substring(0, newLineIndex);\n }\n var NumberWrapper = (function () {\n function NumberWrapper() {\n }\n /**\n * @param {?} text\n * @return {?}\n */\n NumberWrapper.parseIntAutoRadix = function (text) {\n var /** @type {?} */ result = parseInt(text);\n if (isNaN(result)) {\n throw new Error('Invalid integer literal when parsing ' + text);\n }\n return result;\n };\n /**\n * @param {?} value\n * @return {?}\n */\n NumberWrapper.isNumeric = function (value) { return !isNaN(value - parseFloat(value)); };\n return NumberWrapper;\n }());\n /**\n * @param {?} o\n * @return {?}\n */\n function isJsObject(o) {\n return o !== null && (typeof o === 'function' || typeof o === 'object');\n }\n var /** @type {?} */ _symbolIterator = null;\n /**\n * @return {?}\n */\n function getSymbolIterator() {\n if (!_symbolIterator) {\n if (((globalScope)).Symbol && Symbol.iterator) {\n _symbolIterator = Symbol.iterator;\n }\n else {\n // es6-shim specific logic\n var /** @type {?} */ keys = Object.getOwnPropertyNames(Map.prototype);\n for (var /** @type {?} */ i = 0; i < keys.length; ++i) {\n var /** @type {?} */ key = keys[i];\n if (key !== 'entries' && key !== 'size' &&\n ((Map)).prototype[key] === Map.prototype['entries']) {\n _symbolIterator = key;\n }\n }\n }\n }\n return _symbolIterator;\n }\n\n /**\n * Depending on which {@link LocationStrategy} is used, `Location` will either persist\n * to the URL's path or the URL's hash segment.\n * *\n * Note: it's better to use {@link Router#navigate} service to trigger route changes. Use\n * `Location` only if you need to interact with or create normalized URLs outside of\n * routing.\n * *\n * `Location` is responsible for normalizing the URL against the application's base href.\n * A normalized URL is absolute from the URL host, includes the application's base href, and has no\n * trailing slash:\n * - `/my/app/user/123` is normalized\n * - `my/app/user/123` **is not** normalized\n * - `/my/app/user/123/` **is not** normalized\n * *\n * ### Example\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n */\n var Location = (function () {\n /**\n * @param {?} platformStrategy\n */\n function Location(platformStrategy) {\n var _this = this;\n /** @internal */\n this._subject = new _angular_core.EventEmitter();\n this._platformStrategy = platformStrategy;\n var browserBaseHref = this._platformStrategy.getBaseHref();\n this._baseHref = Location.stripTrailingSlash(_stripIndexHtml(browserBaseHref));\n this._platformStrategy.onPopState(function (ev) {\n _this._subject.emit({\n 'url': _this.path(true),\n 'pop': true,\n 'type': ev.type,\n });\n });\n }\n /**\n * @param {?=} includeHash\n * @return {?}\n */\n Location.prototype.path = function (includeHash) {\n if (includeHash === void 0) { includeHash = false; }\n return this.normalize(this._platformStrategy.path(includeHash));\n };\n /**\n * Normalizes the given path and compares to the current normalized path.\n * @param {?} path\n * @param {?=} query\n * @return {?}\n */\n Location.prototype.isCurrentPathEqualTo = function (path, query) {\n if (query === void 0) { query = ''; }\n return this.path() == this.normalize(path + Location.normalizeQueryParams(query));\n };\n /**\n * Given a string representing a URL, returns the normalized URL path without leading or\n * trailing slashes.\n * @param {?} url\n * @return {?}\n */\n Location.prototype.normalize = function (url) {\n return Location.stripTrailingSlash(_stripBaseHref(this._baseHref, _stripIndexHtml(url)));\n };\n /**\n * Given a string representing a URL, returns the platform-specific external URL path.\n * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one\n * before normalizing. This method will also add a hash if `HashLocationStrategy` is\n * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.\n * @param {?} url\n * @return {?}\n */\n Location.prototype.prepareExternalUrl = function (url) {\n if (url && url[0] !== '/') {\n url = '/' + url;\n }\n return this._platformStrategy.prepareExternalUrl(url);\n };\n /**\n * Changes the browsers URL to the normalized version of the given URL, and pushes a\n * new item onto the platform's history.\n * @param {?} path\n * @param {?=} query\n * @return {?}\n */\n Location.prototype.go = function (path, query) {\n if (query === void 0) { query = ''; }\n this._platformStrategy.pushState(null, '', path, query);\n };\n /**\n * Changes the browsers URL to the normalized version of the given URL, and replaces\n * the top item on the platform's history stack.\n * @param {?} path\n * @param {?=} query\n * @return {?}\n */\n Location.prototype.replaceState = function (path, query) {\n if (query === void 0) { query = ''; }\n this._platformStrategy.replaceState(null, '', path, query);\n };\n /**\n * Navigates forward in the platform's history.\n * @return {?}\n */\n Location.prototype.forward = function () { this._platformStrategy.forward(); };\n /**\n * Navigates back in the platform's history.\n * @return {?}\n */\n Location.prototype.back = function () { this._platformStrategy.back(); };\n /**\n * Subscribe to the platform's `popState` events.\n * @param {?} onNext\n * @param {?=} onThrow\n * @param {?=} onReturn\n * @return {?}\n */\n Location.prototype.subscribe = function (onNext, onThrow, onReturn) {\n if (onThrow === void 0) { onThrow = null; }\n if (onReturn === void 0) { onReturn = null; }\n return this._subject.subscribe({ next: onNext, error: onThrow, complete: onReturn });\n };\n /**\n * Given a string of url parameters, prepend with '?' if needed, otherwise return parameters as\n * is.\n * @param {?} params\n * @return {?}\n */\n Location.normalizeQueryParams = function (params) {\n return params && params[0] !== '?' ? '?' + params : params;\n };\n /**\n * Given 2 parts of a url, join them with a slash if needed.\n * @param {?} start\n * @param {?} end\n * @return {?}\n */\n Location.joinWithSlash = function (start, end) {\n if (start.length == 0) {\n return end;\n }\n if (end.length == 0) {\n return start;\n }\n var /** @type {?} */ slashes = 0;\n if (start.endsWith('/')) {\n slashes++;\n }\n if (end.startsWith('/')) {\n slashes++;\n }\n if (slashes == 2) {\n return start + end.substring(1);\n }\n if (slashes == 1) {\n return start + end;\n }\n return start + '/' + end;\n };\n /**\n * If url has a trailing slash, remove it, otherwise return url as is.\n * @param {?} url\n * @return {?}\n */\n Location.stripTrailingSlash = function (url) { return url.replace(/\\/$/, ''); };\n Location.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n Location.ctorParameters = function () { return [\n { type: LocationStrategy, },\n ]; };\n return Location;\n }());\n /**\n * @param {?} baseHref\n * @param {?} url\n * @return {?}\n */\n function _stripBaseHref(baseHref, url) {\n return baseHref && url.startsWith(baseHref) ? url.substring(baseHref.length) : url;\n }\n /**\n * @param {?} url\n * @return {?}\n */\n function _stripIndexHtml(url) {\n return url.replace(/\\/index.html$/, '');\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * `HashLocationStrategy` is a {@link LocationStrategy} used to configure the\n * {@link Location} service to represent its state in the\n * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)\n * of the browser's URL.\n * *\n * For instance, if you call `location.go('/foo')`, the browser's URL will become\n * `example.com#/foo`.\n * *\n * ### Example\n * *\n * {@example common/location/ts/hash_location_component.ts region='LocationComponent'}\n * *\n */\n var HashLocationStrategy = (function (_super) {\n __extends(HashLocationStrategy, _super);\n /**\n * @param {?} _platformLocation\n * @param {?=} _baseHref\n */\n function HashLocationStrategy(_platformLocation, _baseHref) {\n _super.call(this);\n this._platformLocation = _platformLocation;\n this._baseHref = '';\n if (isPresent(_baseHref)) {\n this._baseHref = _baseHref;\n }\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n HashLocationStrategy.prototype.onPopState = function (fn) {\n this._platformLocation.onPopState(fn);\n this._platformLocation.onHashChange(fn);\n };\n /**\n * @return {?}\n */\n HashLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };\n /**\n * @param {?=} includeHash\n * @return {?}\n */\n HashLocationStrategy.prototype.path = function (includeHash) {\n if (includeHash === void 0) { includeHash = false; }\n // the hash value is always prefixed with a `#`\n // and if it is empty then it will stay empty\n var /** @type {?} */ path = this._platformLocation.hash;\n if (!isPresent(path))\n path = '#';\n return path.length > 0 ? path.substring(1) : path;\n };\n /**\n * @param {?} internal\n * @return {?}\n */\n HashLocationStrategy.prototype.prepareExternalUrl = function (internal) {\n var /** @type {?} */ url = Location.joinWithSlash(this._baseHref, internal);\n return url.length > 0 ? ('#' + url) : url;\n };\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} path\n * @param {?} queryParams\n * @return {?}\n */\n HashLocationStrategy.prototype.pushState = function (state, title, path, queryParams) {\n var /** @type {?} */ url = this.prepareExternalUrl(path + Location.normalizeQueryParams(queryParams));\n if (url.length == 0) {\n url = this._platformLocation.pathname;\n }\n this._platformLocation.pushState(state, title, url);\n };\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} path\n * @param {?} queryParams\n * @return {?}\n */\n HashLocationStrategy.prototype.replaceState = function (state, title, path, queryParams) {\n var /** @type {?} */ url = this.prepareExternalUrl(path + Location.normalizeQueryParams(queryParams));\n if (url.length == 0) {\n url = this._platformLocation.pathname;\n }\n this._platformLocation.replaceState(state, title, url);\n };\n /**\n * @return {?}\n */\n HashLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };\n /**\n * @return {?}\n */\n HashLocationStrategy.prototype.back = function () { this._platformLocation.back(); };\n HashLocationStrategy.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n HashLocationStrategy.ctorParameters = function () { return [\n { type: PlatformLocation, },\n { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [APP_BASE_HREF,] },] },\n ]; };\n return HashLocationStrategy;\n }(LocationStrategy));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * `PathLocationStrategy` is a {@link LocationStrategy} used to configure the\n * {@link Location} service to represent its state in the\n * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the\n * browser's URL.\n * *\n * If you're using `PathLocationStrategy`, you must provide a {@link APP_BASE_HREF}\n * or add a base element to the document. This URL prefix that will be preserved\n * when generating and recognizing URLs.\n * *\n * For instance, if you provide an `APP_BASE_HREF` of `'/my/app'` and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`.\n * *\n * Similarly, if you add `<base href='/my/app'/>` to the document and call\n * `location.go('/foo')`, the browser's URL will become\n * `example.com/my/app/foo`.\n * *\n * ### Example\n * *\n * {@example common/location/ts/path_location_component.ts region='LocationComponent'}\n * *\n */\n var PathLocationStrategy = (function (_super) {\n __extends$1(PathLocationStrategy, _super);\n /**\n * @param {?} _platformLocation\n * @param {?=} href\n */\n function PathLocationStrategy(_platformLocation, href) {\n _super.call(this);\n this._platformLocation = _platformLocation;\n if (isBlank(href)) {\n href = this._platformLocation.getBaseHrefFromDOM();\n }\n if (isBlank(href)) {\n throw new Error(\"No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.\");\n }\n this._baseHref = href;\n }\n /**\n * @param {?} fn\n * @return {?}\n */\n PathLocationStrategy.prototype.onPopState = function (fn) {\n this._platformLocation.onPopState(fn);\n this._platformLocation.onHashChange(fn);\n };\n /**\n * @return {?}\n */\n PathLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };\n /**\n * @param {?} internal\n * @return {?}\n */\n PathLocationStrategy.prototype.prepareExternalUrl = function (internal) {\n return Location.joinWithSlash(this._baseHref, internal);\n };\n /**\n * @param {?=} includeHash\n * @return {?}\n */\n PathLocationStrategy.prototype.path = function (includeHash) {\n if (includeHash === void 0) { includeHash = false; }\n var /** @type {?} */ pathname = this._platformLocation.pathname +\n Location.normalizeQueryParams(this._platformLocation.search);\n var /** @type {?} */ hash = this._platformLocation.hash;\n return hash && includeHash ? \"\" + pathname + hash : pathname;\n };\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @param {?} queryParams\n * @return {?}\n */\n PathLocationStrategy.prototype.pushState = function (state, title, url, queryParams) {\n var /** @type {?} */ externalUrl = this.prepareExternalUrl(url + Location.normalizeQueryParams(queryParams));\n this._platformLocation.pushState(state, title, externalUrl);\n };\n /**\n * @param {?} state\n * @param {?} title\n * @param {?} url\n * @param {?} queryParams\n * @return {?}\n */\n PathLocationStrategy.prototype.replaceState = function (state, title, url, queryParams) {\n var /** @type {?} */ externalUrl = this.prepareExternalUrl(url + Location.normalizeQueryParams(queryParams));\n this._platformLocation.replaceState(state, title, externalUrl);\n };\n /**\n * @return {?}\n */\n PathLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };\n /**\n * @return {?}\n */\n PathLocationStrategy.prototype.back = function () { this._platformLocation.back(); };\n PathLocationStrategy.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n PathLocationStrategy.ctorParameters = function () { return [\n { type: PlatformLocation, },\n { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [APP_BASE_HREF,] },] },\n ]; };\n return PathLocationStrategy;\n }(LocationStrategy));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$2 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @abstract\n */\n var NgLocalization = (function () {\n function NgLocalization() {\n }\n /**\n * @abstract\n * @param {?} value\n * @return {?}\n */\n NgLocalization.prototype.getPluralCategory = function (value) { };\n return NgLocalization;\n }());\n /**\n * Returns the plural category for a given value.\n * - \"=value\" when the case exists,\n * - the plural category otherwise\n * *\n * @param {?} value\n * @param {?} cases\n * @param {?} ngLocalization\n * @return {?}\n */\n function getPluralCategory(value, cases, ngLocalization) {\n var /** @type {?} */ key = \"=\" + value;\n if (cases.indexOf(key) > -1) {\n return key;\n }\n key = ngLocalization.getPluralCategory(value);\n if (cases.indexOf(key) > -1) {\n return key;\n }\n if (cases.indexOf('other') > -1) {\n return 'other';\n }\n throw new Error(\"No plural message found for value \\\"\" + value + \"\\\"\");\n }\n /**\n * Returns the plural case based on the locale\n * *\n */\n var NgLocaleLocalization = (function (_super) {\n __extends$2(NgLocaleLocalization, _super);\n /**\n * @param {?} _locale\n */\n function NgLocaleLocalization(_locale) {\n _super.call(this);\n this._locale = _locale;\n }\n /**\n * @param {?} value\n * @return {?}\n */\n NgLocaleLocalization.prototype.getPluralCategory = function (value) {\n var /** @type {?} */ plural = getPluralCase(this._locale, value);\n switch (plural) {\n case Plural.Zero:\n return 'zero';\n case Plural.One:\n return 'one';\n case Plural.Two:\n return 'two';\n case Plural.Few:\n return 'few';\n case Plural.Many:\n return 'many';\n default:\n return 'other';\n }\n };\n NgLocaleLocalization.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n NgLocaleLocalization.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n ]; };\n return NgLocaleLocalization;\n }(NgLocalization));\n var Plural = {};\n Plural.Zero = 0;\n Plural.One = 1;\n Plural.Two = 2;\n Plural.Few = 3;\n Plural.Many = 4;\n Plural.Other = 5;\n Plural[Plural.Zero] = \"Zero\";\n Plural[Plural.One] = \"One\";\n Plural[Plural.Two] = \"Two\";\n Plural[Plural.Few] = \"Few\";\n Plural[Plural.Many] = \"Many\";\n Plural[Plural.Other] = \"Other\";\n /**\n * Returns the plural case based on the locale\n * *\n * @param {?} locale\n * @param {?} nLike\n * @return {?}\n */\n function getPluralCase(locale, nLike) {\n // TODO(vicb): lazy compute\n if (typeof nLike === 'string') {\n nLike = parseInt(/** @type {?} */ (nLike), 10);\n }\n var /** @type {?} */ n = (nLike);\n var /** @type {?} */ nDecimal = n.toString().replace(/^[^.]*\\.?/, '');\n var /** @type {?} */ i = Math.floor(Math.abs(n));\n var /** @type {?} */ v = nDecimal.length;\n var /** @type {?} */ f = parseInt(nDecimal, 10);\n var /** @type {?} */ t = parseInt(n.toString().replace(/^[^.]*\\.?|0+$/g, ''), 10) || 0;\n var /** @type {?} */ lang = locale.split('-')[0].toLowerCase();\n switch (lang) {\n case 'af':\n case 'asa':\n case 'az':\n case 'bem':\n case 'bez':\n case 'bg':\n case 'brx':\n case 'ce':\n case 'cgg':\n case 'chr':\n case 'ckb':\n case 'ee':\n case 'el':\n case 'eo':\n case 'es':\n case 'eu':\n case 'fo':\n case 'fur':\n case 'gsw':\n case 'ha':\n case 'haw':\n case 'hu':\n case 'jgo':\n case 'jmc':\n case 'ka':\n case 'kk':\n case 'kkj':\n case 'kl':\n case 'ks':\n case 'ksb':\n case 'ky':\n case 'lb':\n case 'lg':\n case 'mas':\n case 'mgo':\n case 'ml':\n case 'mn':\n case 'nb':\n case 'nd':\n case 'ne':\n case 'nn':\n case 'nnh':\n case 'nyn':\n case 'om':\n case 'or':\n case 'os':\n case 'ps':\n case 'rm':\n case 'rof':\n case 'rwk':\n case 'saq':\n case 'seh':\n case 'sn':\n case 'so':\n case 'sq':\n case 'ta':\n case 'te':\n case 'teo':\n case 'tk':\n case 'tr':\n case 'ug':\n case 'uz':\n case 'vo':\n case 'vun':\n case 'wae':\n case 'xog':\n if (n === 1)\n return Plural.One;\n return Plural.Other;\n case 'agq':\n case 'bas':\n case 'cu':\n case 'dav':\n case 'dje':\n case 'dua':\n case 'dyo':\n case 'ebu':\n case 'ewo':\n case 'guz':\n case 'kam':\n case 'khq':\n case 'ki':\n case 'kln':\n case 'kok':\n case 'ksf':\n case 'lrc':\n case 'lu':\n case 'luo':\n case 'luy':\n case 'mer':\n case 'mfe':\n case 'mgh':\n case 'mua':\n case 'mzn':\n case 'nmg':\n case 'nus':\n case 'qu':\n case 'rn':\n case 'rw':\n case 'sbp':\n case 'twq':\n case 'vai':\n case 'yav':\n case 'yue':\n case 'zgh':\n case 'ak':\n case 'ln':\n case 'mg':\n case 'pa':\n case 'ti':\n if (n === Math.floor(n) && n >= 0 && n <= 1)\n return Plural.One;\n return Plural.Other;\n case 'am':\n case 'as':\n case 'bn':\n case 'fa':\n case 'gu':\n case 'hi':\n case 'kn':\n case 'mr':\n case 'zu':\n if (i === 0 || n === 1)\n return Plural.One;\n return Plural.Other;\n case 'ar':\n if (n === 0)\n return Plural.Zero;\n if (n === 1)\n return Plural.One;\n if (n === 2)\n return Plural.Two;\n if (n % 100 === Math.floor(n % 100) && n % 100 >= 3 && n % 100 <= 10)\n return Plural.Few;\n if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 99)\n return Plural.Many;\n return Plural.Other;\n case 'ast':\n case 'ca':\n case 'de':\n case 'en':\n case 'et':\n case 'fi':\n case 'fy':\n case 'gl':\n case 'it':\n case 'nl':\n case 'sv':\n case 'sw':\n case 'ur':\n case 'yi':\n if (i === 1 && v === 0)\n return Plural.One;\n return Plural.Other;\n case 'be':\n if (n % 10 === 1 && !(n % 100 === 11))\n return Plural.One;\n if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 &&\n !(n % 100 >= 12 && n % 100 <= 14))\n return Plural.Few;\n if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 ||\n n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14)\n return Plural.Many;\n return Plural.Other;\n case 'br':\n if (n % 10 === 1 && !(n % 100 === 11 || n % 100 === 71 || n % 100 === 91))\n return Plural.One;\n if (n % 10 === 2 && !(n % 100 === 12 || n % 100 === 72 || n % 100 === 92))\n return Plural.Two;\n if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) &&\n !(n % 100 >= 10 && n % 100 <= 19 || n % 100 >= 70 && n % 100 <= 79 ||\n n % 100 >= 90 && n % 100 <= 99))\n return Plural.Few;\n if (!(n === 0) && n % 1e6 === 0)\n return Plural.Many;\n return Plural.Other;\n case 'bs':\n case 'hr':\n case 'sr':\n if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11))\n return Plural.One;\n if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n !(i % 100 >= 12 && i % 100 <= 14) ||\n f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 &&\n !(f % 100 >= 12 && f % 100 <= 14))\n return Plural.Few;\n return Plural.Other;\n case 'cs':\n case 'sk':\n if (i === 1 && v === 0)\n return Plural.One;\n if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0)\n return Plural.Few;\n if (!(v === 0))\n return Plural.Many;\n return Plural.Other;\n case 'cy':\n if (n === 0)\n return Plural.Zero;\n if (n === 1)\n return Plural.One;\n if (n === 2)\n return Plural.Two;\n if (n === 3)\n return Plural.Few;\n if (n === 6)\n return Plural.Many;\n return Plural.Other;\n case 'da':\n if (n === 1 || !(t === 0) && (i === 0 || i === 1))\n return Plural.One;\n return Plural.Other;\n case 'dsb':\n case 'hsb':\n if (v === 0 && i % 100 === 1 || f % 100 === 1)\n return Plural.One;\n if (v === 0 && i % 100 === 2 || f % 100 === 2)\n return Plural.Two;\n if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 ||\n f % 100 === Math.floor(f % 100) && f % 100 >= 3 && f % 100 <= 4)\n return Plural.Few;\n return Plural.Other;\n case 'ff':\n case 'fr':\n case 'hy':\n case 'kab':\n if (i === 0 || i === 1)\n return Plural.One;\n return Plural.Other;\n case 'fil':\n if (v === 0 && (i === 1 || i === 2 || i === 3) ||\n v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) ||\n !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9))\n return Plural.One;\n return Plural.Other;\n case 'ga':\n if (n === 1)\n return Plural.One;\n if (n === 2)\n return Plural.Two;\n if (n === Math.floor(n) && n >= 3 && n <= 6)\n return Plural.Few;\n if (n === Math.floor(n) && n >= 7 && n <= 10)\n return Plural.Many;\n return Plural.Other;\n case 'gd':\n if (n === 1 || n === 11)\n return Plural.One;\n if (n === 2 || n === 12)\n return Plural.Two;\n if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19))\n return Plural.Few;\n return Plural.Other;\n case 'gv':\n if (v === 0 && i % 10 === 1)\n return Plural.One;\n if (v === 0 && i % 10 === 2)\n return Plural.Two;\n if (v === 0 &&\n (i % 100 === 0 || i % 100 === 20 || i % 100 === 40 || i % 100 === 60 || i % 100 === 80))\n return Plural.Few;\n if (!(v === 0))\n return Plural.Many;\n return Plural.Other;\n case 'he':\n if (i === 1 && v === 0)\n return Plural.One;\n if (i === 2 && v === 0)\n return Plural.Two;\n if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0)\n return Plural.Many;\n return Plural.Other;\n case 'is':\n if (t === 0 && i % 10 === 1 && !(i % 100 === 11) || !(t === 0))\n return Plural.One;\n return Plural.Other;\n case 'ksh':\n if (n === 0)\n return Plural.Zero;\n if (n === 1)\n return Plural.One;\n return Plural.Other;\n case 'kw':\n case 'naq':\n case 'se':\n case 'smn':\n if (n === 1)\n return Plural.One;\n if (n === 2)\n return Plural.Two;\n return Plural.Other;\n case 'lag':\n if (n === 0)\n return Plural.Zero;\n if ((i === 0 || i === 1) && !(n === 0))\n return Plural.One;\n return Plural.Other;\n case 'lt':\n if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19))\n return Plural.One;\n if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 9 &&\n !(n % 100 >= 11 && n % 100 <= 19))\n return Plural.Few;\n if (!(f === 0))\n return Plural.Many;\n return Plural.Other;\n case 'lv':\n case 'prg':\n if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 ||\n v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19)\n return Plural.Zero;\n if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) ||\n !(v === 2) && f % 10 === 1)\n return Plural.One;\n return Plural.Other;\n case 'mk':\n if (v === 0 && i % 10 === 1 || f % 10 === 1)\n return Plural.One;\n return Plural.Other;\n case 'mt':\n if (n === 1)\n return Plural.One;\n if (n === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 2 && n % 100 <= 10)\n return Plural.Few;\n if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19)\n return Plural.Many;\n return Plural.Other;\n case 'pl':\n if (i === 1 && v === 0)\n return Plural.One;\n if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n !(i % 100 >= 12 && i % 100 <= 14))\n return Plural.Few;\n if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 ||\n v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14)\n return Plural.Many;\n return Plural.Other;\n case 'pt':\n if (n === Math.floor(n) && n >= 0 && n <= 2 && !(n === 2))\n return Plural.One;\n return Plural.Other;\n case 'ro':\n if (i === 1 && v === 0)\n return Plural.One;\n if (!(v === 0) || n === 0 ||\n !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19)\n return Plural.Few;\n return Plural.Other;\n case 'ru':\n case 'uk':\n if (v === 0 && i % 10 === 1 && !(i % 100 === 11))\n return Plural.One;\n if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 &&\n !(i % 100 >= 12 && i % 100 <= 14))\n return Plural.Few;\n if (v === 0 && i % 10 === 0 ||\n v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 ||\n v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14)\n return Plural.Many;\n return Plural.Other;\n case 'shi':\n if (i === 0 || n === 1)\n return Plural.One;\n if (n === Math.floor(n) && n >= 2 && n <= 10)\n return Plural.Few;\n return Plural.Other;\n case 'si':\n if (n === 0 || n === 1 || i === 0 && f === 1)\n return Plural.One;\n return Plural.Other;\n case 'sl':\n if (v === 0 && i % 100 === 1)\n return Plural.One;\n if (v === 0 && i % 100 === 2)\n return Plural.Two;\n if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || !(v === 0))\n return Plural.Few;\n return Plural.Other;\n case 'tzm':\n if (n === Math.floor(n) && n >= 0 && n <= 1 || n === Math.floor(n) && n >= 11 && n <= 99)\n return Plural.One;\n return Plural.Other;\n default:\n return Plural.Other;\n }\n }\n\n /**\n * @param {?} obj\n * @return {?}\n */\n function isListLikeIterable(obj) {\n if (!isJsObject(obj))\n return false;\n return Array.isArray(obj) ||\n (!(obj instanceof Map) &&\n getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop\n }\n\n /**\n * *\n * *\n * ```\n * <some-element [ngClass]=\"'first second'\">...</some-element>\n * *\n * <some-element [ngClass]=\"['first', 'second']\">...</some-element>\n * *\n * <some-element [ngClass]=\"{'first': true, 'second': true, 'third': false}\">...</some-element>\n * *\n * <some-element [ngClass]=\"stringExp|arrayExp|objExp\">...</some-element>\n * ```\n * *\n * *\n * The CSS classes are updated as follows, depending on the type of the expression evaluation:\n * - `string` - the CSS classes listed in the string (space delimited) are added,\n * - `Array` - the CSS classes declared as Array elements are added,\n * - `Object` - keys are CSS classes that get added when the expression given in the value\n * evaluates to a truthy value, otherwise they are removed.\n * *\n */\n var NgClass = (function () {\n /**\n * @param {?} _iterableDiffers\n * @param {?} _keyValueDiffers\n * @param {?} _ngEl\n * @param {?} _renderer\n */\n function NgClass(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {\n this._iterableDiffers = _iterableDiffers;\n this._keyValueDiffers = _keyValueDiffers;\n this._ngEl = _ngEl;\n this._renderer = _renderer;\n this._initialClasses = [];\n }\n Object.defineProperty(NgClass.prototype, \"klass\", {\n /**\n * @param {?} v\n * @return {?}\n */\n set: function (v) {\n this._applyInitialClasses(true);\n this._initialClasses = typeof v === 'string' ? v.split(/\\s+/) : [];\n this._applyInitialClasses(false);\n this._applyClasses(this._rawClass, false);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgClass.prototype, \"ngClass\", {\n /**\n * @param {?} v\n * @return {?}\n */\n set: function (v) {\n this._cleanupClasses(this._rawClass);\n this._iterableDiffer = null;\n this._keyValueDiffer = null;\n this._rawClass = typeof v === 'string' ? v.split(/\\s+/) : v;\n if (this._rawClass) {\n if (isListLikeIterable(this._rawClass)) {\n this._iterableDiffer = this._iterableDiffers.find(this._rawClass).create(null);\n }\n else {\n this._keyValueDiffer = this._keyValueDiffers.find(this._rawClass).create(null);\n }\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n NgClass.prototype.ngDoCheck = function () {\n if (this._iterableDiffer) {\n var /** @type {?} */ changes = this._iterableDiffer.diff(this._rawClass);\n if (changes) {\n this._applyIterableChanges(changes);\n }\n }\n else if (this._keyValueDiffer) {\n var /** @type {?} */ changes = this._keyValueDiffer.diff(this._rawClass);\n if (changes) {\n this._applyKeyValueChanges(changes);\n }\n }\n };\n /**\n * @param {?} rawClassVal\n * @return {?}\n */\n NgClass.prototype._cleanupClasses = function (rawClassVal) {\n this._applyClasses(rawClassVal, true);\n this._applyInitialClasses(false);\n };\n /**\n * @param {?} changes\n * @return {?}\n */\n NgClass.prototype._applyKeyValueChanges = function (changes) {\n var _this = this;\n changes.forEachAddedItem(function (record) { return _this._toggleClass(record.key, record.currentValue); });\n changes.forEachChangedItem(function (record) { return _this._toggleClass(record.key, record.currentValue); });\n changes.forEachRemovedItem(function (record) {\n if (record.previousValue) {\n _this._toggleClass(record.key, false);\n }\n });\n };\n /**\n * @param {?} changes\n * @return {?}\n */\n NgClass.prototype._applyIterableChanges = function (changes) {\n var _this = this;\n changes.forEachAddedItem(function (record) {\n if (typeof record.item === 'string') {\n _this._toggleClass(record.item, true);\n }\n else {\n throw new Error(\"NgClass can only toggle CSS classes expressed as strings, got \" + stringify(record.item));\n }\n });\n changes.forEachRemovedItem(function (record) { return _this._toggleClass(record.item, false); });\n };\n /**\n * @param {?} isCleanup\n * @return {?}\n */\n NgClass.prototype._applyInitialClasses = function (isCleanup) {\n var _this = this;\n this._initialClasses.forEach(function (klass) { return _this._toggleClass(klass, !isCleanup); });\n };\n /**\n * @param {?} rawClassVal\n * @param {?} isCleanup\n * @return {?}\n */\n NgClass.prototype._applyClasses = function (rawClassVal, isCleanup) {\n var _this = this;\n if (rawClassVal) {\n if (Array.isArray(rawClassVal) || rawClassVal instanceof Set) {\n ((rawClassVal)).forEach(function (klass) { return _this._toggleClass(klass, !isCleanup); });\n }\n else {\n Object.keys(rawClassVal).forEach(function (klass) {\n if (isPresent(rawClassVal[klass]))\n _this._toggleClass(klass, !isCleanup);\n });\n }\n }\n };\n /**\n * @param {?} klass\n * @param {?} enabled\n * @return {?}\n */\n NgClass.prototype._toggleClass = function (klass, enabled) {\n var _this = this;\n klass = klass.trim();\n if (klass) {\n klass.split(/\\s+/g).forEach(function (klass) { _this._renderer.setElementClass(_this._ngEl.nativeElement, klass, enabled); });\n }\n };\n NgClass.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngClass]' },] },\n ];\n /** @nocollapse */\n NgClass.ctorParameters = function () { return [\n { type: _angular_core.IterableDiffers, },\n { type: _angular_core.KeyValueDiffers, },\n { type: _angular_core.ElementRef, },\n { type: _angular_core.Renderer, },\n ]; };\n NgClass.propDecorators = {\n 'klass': [{ type: _angular_core.Input, args: ['class',] },],\n 'ngClass': [{ type: _angular_core.Input },],\n };\n return NgClass;\n }());\n\n var NgForRow = (function () {\n /**\n * @param {?} $implicit\n * @param {?} index\n * @param {?} count\n */\n function NgForRow($implicit, index, count) {\n this.$implicit = $implicit;\n this.index = index;\n this.count = count;\n }\n Object.defineProperty(NgForRow.prototype, \"first\", {\n /**\n * @return {?}\n */\n get: function () { return this.index === 0; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgForRow.prototype, \"last\", {\n /**\n * @return {?}\n */\n get: function () { return this.index === this.count - 1; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgForRow.prototype, \"even\", {\n /**\n * @return {?}\n */\n get: function () { return this.index % 2 === 0; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgForRow.prototype, \"odd\", {\n /**\n * @return {?}\n */\n get: function () { return !this.even; },\n enumerable: true,\n configurable: true\n });\n return NgForRow;\n }());\n /**\n * The `NgFor` directive instantiates a template once per item from an iterable. The context for\n * each instantiated template inherits from the outer context with the given loop variable set\n * to the current item from the iterable.\n * *\n * ### Local Variables\n * *\n * `NgFor` provides several exported values that can be aliased to local variables:\n * *\n * * `index` will be set to the current loop iteration for each template context.\n * * `first` will be set to a boolean value indicating whether the item is the first one in the\n * iteration.\n * * `last` will be set to a boolean value indicating whether the item is the last one in the\n * iteration.\n * * `even` will be set to a boolean value indicating whether this item has an even index.\n * * `odd` will be set to a boolean value indicating whether this item has an odd index.\n * *\n * ### Change Propagation\n * *\n * When the contents of the iterator changes, `NgFor` makes the corresponding changes to the DOM:\n * *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n * * Otherwise, the DOM element for that item will remain the same.\n * *\n * Angular uses object identity to track insertions and deletions within the iterator and reproduce\n * those changes in the DOM. This has important implications for animations and any stateful\n * controls\n * (such as `<input>` elements which accept user input) that are present. Inserted rows can be\n * animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state such\n * as user input.\n * *\n * It is possible for the identities of elements in the iterator to change while the data does not.\n * This can happen, for example, if the iterator produced from an RPC to the server, and that\n * RPC is re-run. Even if the data hasn't changed, the second response will produce objects with\n * different identities, and Angular will tear down the entire DOM and rebuild it (as if all old\n * elements were deleted and all new elements inserted). This is an expensive operation and should\n * be avoided if possible.\n * *\n * To customize the default tracking algorithm, `NgFor` supports `trackBy` option.\n * `trackBy` takes a function which has two arguments: `index` and `item`.\n * If `trackBy` is given, Angular tracks changes by the return value of the function.\n * *\n * ### Syntax\n * *\n * - `<li *ngFor=\"let item of items; let i = index; trackBy: trackByFn\">...</li>`\n * - `<li template=\"ngFor let item of items; let i = index; trackBy: trackByFn\">...</li>`\n * *\n * With `<template>` element:\n * *\n * ```\n * <template ngFor let-item [ngForOf]=\"items\" let-i=\"index\" [ngForTrackBy]=\"trackByFn\">\n * <li>...</li>\n * </template>\n * ```\n * *\n * ### Example\n * *\n * See a [live demo](http://plnkr.co/edit/KVuXxDp0qinGDyo307QW?p=preview) for a more detailed\n * example.\n * *\n */\n var NgFor = (function () {\n /**\n * @param {?} _viewContainer\n * @param {?} _template\n * @param {?} _differs\n * @param {?} _cdr\n */\n function NgFor(_viewContainer, _template, _differs, _cdr) {\n this._viewContainer = _viewContainer;\n this._template = _template;\n this._differs = _differs;\n this._cdr = _cdr;\n this._differ = null;\n }\n Object.defineProperty(NgFor.prototype, \"ngForTrackBy\", {\n /**\n * @return {?}\n */\n get: function () { return this._trackByFn; },\n /**\n * @param {?} fn\n * @return {?}\n */\n set: function (fn) {\n if (typeof fn !== 'function') {\n throw new Error(\"trackBy must be a function, but received \" + JSON.stringify(fn));\n }\n this._trackByFn = fn;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgFor.prototype, \"ngForTemplate\", {\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) {\n if (value) {\n this._template = value;\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} changes\n * @return {?}\n */\n NgFor.prototype.ngOnChanges = function (changes) {\n if ('ngForOf' in changes) {\n // React on ngForOf changes only once all inputs have been initialized\n var /** @type {?} */ value = changes['ngForOf'].currentValue;\n if (!this._differ && value) {\n try {\n this._differ = this._differs.find(value).create(this._cdr, this.ngForTrackBy);\n }\n catch (e) {\n throw new Error(\"Cannot find a differ supporting object '\" + value + \"' of type '\" + getTypeNameForDebugging(value) + \"'. NgFor only supports binding to Iterables such as Arrays.\");\n }\n }\n }\n };\n /**\n * @return {?}\n */\n NgFor.prototype.ngDoCheck = function () {\n if (this._differ) {\n var /** @type {?} */ changes = this._differ.diff(this.ngForOf);\n if (changes)\n this._applyChanges(changes);\n }\n };\n /**\n * @param {?} changes\n * @return {?}\n */\n NgFor.prototype._applyChanges = function (changes) {\n var _this = this;\n var /** @type {?} */ insertTuples = [];\n changes.forEachOperation(function (item, adjustedPreviousIndex, currentIndex) {\n if (item.previousIndex == null) {\n var /** @type {?} */ view = _this._viewContainer.createEmbeddedView(_this._template, new NgForRow(null, null, null), currentIndex);\n var /** @type {?} */ tuple = new RecordViewTuple(item, view);\n insertTuples.push(tuple);\n }\n else if (currentIndex == null) {\n _this._viewContainer.remove(adjustedPreviousIndex);\n }\n else {\n var /** @type {?} */ view = _this._viewContainer.get(adjustedPreviousIndex);\n _this._viewContainer.move(view, currentIndex);\n var /** @type {?} */ tuple = new RecordViewTuple(item, /** @type {?} */ (view));\n insertTuples.push(tuple);\n }\n });\n for (var /** @type {?} */ i = 0; i < insertTuples.length; i++) {\n this._perViewChange(insertTuples[i].view, insertTuples[i].record);\n }\n for (var /** @type {?} */ i = 0, /** @type {?} */ ilen = this._viewContainer.length; i < ilen; i++) {\n var /** @type {?} */ viewRef = (this._viewContainer.get(i));\n viewRef.context.index = i;\n viewRef.context.count = ilen;\n }\n changes.forEachIdentityChange(function (record) {\n var /** @type {?} */ viewRef = (_this._viewContainer.get(record.currentIndex));\n viewRef.context.$implicit = record.item;\n });\n };\n /**\n * @param {?} view\n * @param {?} record\n * @return {?}\n */\n NgFor.prototype._perViewChange = function (view, record) {\n view.context.$implicit = record.item;\n };\n NgFor.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngFor][ngForOf]' },] },\n ];\n /** @nocollapse */\n NgFor.ctorParameters = function () { return [\n { type: _angular_core.ViewContainerRef, },\n { type: _angular_core.TemplateRef, },\n { type: _angular_core.IterableDiffers, },\n { type: _angular_core.ChangeDetectorRef, },\n ]; };\n NgFor.propDecorators = {\n 'ngForOf': [{ type: _angular_core.Input },],\n 'ngForTrackBy': [{ type: _angular_core.Input },],\n 'ngForTemplate': [{ type: _angular_core.Input },],\n };\n return NgFor;\n }());\n var RecordViewTuple = (function () {\n /**\n * @param {?} record\n * @param {?} view\n */\n function RecordViewTuple(record, view) {\n this.record = record;\n this.view = view;\n }\n return RecordViewTuple;\n }());\n\n /**\n * Removes or recreates a portion of the DOM tree based on an {expression}.\n * *\n * If the expression assigned to `ngIf` evaluates to a falsy value then the element\n * is removed from the DOM, otherwise a clone of the element is reinserted into the DOM.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/fe0kgemFBtmQOY31b4tw?p=preview)):\n * *\n * ```\n * <div *ngIf=\"errorCount > 0\" class=\"error\">\n * <!-- Error message displayed when the errorCount property in the current context is greater\n * than 0. -->\n * {{errorCount}} errors detected\n * </div>\n * ```\n * *\n * ### Syntax\n * *\n * - `<div *ngIf=\"condition\">...</div>`\n * - `<div template=\"ngIf condition\">...</div>`\n * - `<template [ngIf]=\"condition\"><div>...</div></template>`\n * *\n */\n var NgIf = (function () {\n /**\n * @param {?} _viewContainer\n * @param {?} _template\n */\n function NgIf(_viewContainer, _template) {\n this._viewContainer = _viewContainer;\n this._template = _template;\n this._hasView = false;\n }\n Object.defineProperty(NgIf.prototype, \"ngIf\", {\n /**\n * @param {?} condition\n * @return {?}\n */\n set: function (condition) {\n if (condition && !this._hasView) {\n this._hasView = true;\n this._viewContainer.createEmbeddedView(this._template);\n }\n else if (!condition && this._hasView) {\n this._hasView = false;\n this._viewContainer.clear();\n }\n },\n enumerable: true,\n configurable: true\n });\n NgIf.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngIf]' },] },\n ];\n /** @nocollapse */\n NgIf.ctorParameters = function () { return [\n { type: _angular_core.ViewContainerRef, },\n { type: _angular_core.TemplateRef, },\n ]; };\n NgIf.propDecorators = {\n 'ngIf': [{ type: _angular_core.Input },],\n };\n return NgIf;\n }());\n\n var SwitchView = (function () {\n /**\n * @param {?} _viewContainerRef\n * @param {?} _templateRef\n */\n function SwitchView(_viewContainerRef, _templateRef) {\n this._viewContainerRef = _viewContainerRef;\n this._templateRef = _templateRef;\n this._created = false;\n }\n /**\n * @return {?}\n */\n SwitchView.prototype.create = function () {\n this._created = true;\n this._viewContainerRef.createEmbeddedView(this._templateRef);\n };\n /**\n * @return {?}\n */\n SwitchView.prototype.destroy = function () {\n this._created = false;\n this._viewContainerRef.clear();\n };\n /**\n * @param {?} created\n * @return {?}\n */\n SwitchView.prototype.enforceState = function (created) {\n if (created && !this._created) {\n this.create();\n }\n else if (!created && this._created) {\n this.destroy();\n }\n };\n return SwitchView;\n }());\n /**\n * *\n * expression.\n * *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n * <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n * <some-element *ngSwitchCase=\"match_expression_2\">...</some-element>\n * <some-other-element *ngSwitchCase=\"match_expression_3\">...</some-other-element>\n * <ng-container *ngSwitchCase=\"match_expression_3\">\n * <!-- use a ng-container to group multiple root nodes -->\n * <inner-element></inner-element>\n * <inner-other-element></inner-other-element>\n * </ng-container>\n * <some-element *ngSwitchDefault>...</some-element>\n * </container-element>\n * ```\n * *\n * `NgSwitch` stamps out nested views when their match expression value matches the value of the\n * switch expression.\n * *\n * In other words:\n * - you define a container element (where you place the directive with a switch expression on the\n * `[ngSwitch]=\"...\"` attribute)\n * - you define inner views inside the `NgSwitch` and place a `*ngSwitchCase` attribute on the view\n * root elements.\n * *\n * Elements within `NgSwitch` but outside of a `NgSwitchCase` or `NgSwitchDefault` directives will\n * be preserved at the location.\n * *\n * The `ngSwitchCase` directive informs the parent `NgSwitch` of which view to display when the\n * expression is evaluated.\n * When no matching expression is found on a `ngSwitchCase` view, the `ngSwitchDefault` view is\n * stamped out.\n * *\n */\n var NgSwitch = (function () {\n function NgSwitch() {\n this._defaultUsed = false;\n this._caseCount = 0;\n this._lastCaseCheckIndex = 0;\n this._lastCasesMatched = false;\n }\n Object.defineProperty(NgSwitch.prototype, \"ngSwitch\", {\n /**\n * @param {?} newValue\n * @return {?}\n */\n set: function (newValue) {\n this._ngSwitch = newValue;\n if (this._caseCount === 0) {\n this._updateDefaultCases(true);\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n NgSwitch.prototype._addCase = function () { return this._caseCount++; };\n /**\n * @param {?} view\n * @return {?}\n */\n NgSwitch.prototype._addDefault = function (view) {\n if (!this._defaultViews) {\n this._defaultViews = [];\n }\n this._defaultViews.push(view);\n };\n /**\n * @param {?} value\n * @return {?}\n */\n NgSwitch.prototype._matchCase = function (value) {\n var /** @type {?} */ matched = value == this._ngSwitch;\n this._lastCasesMatched = this._lastCasesMatched || matched;\n this._lastCaseCheckIndex++;\n if (this._lastCaseCheckIndex === this._caseCount) {\n this._updateDefaultCases(!this._lastCasesMatched);\n this._lastCaseCheckIndex = 0;\n this._lastCasesMatched = false;\n }\n return matched;\n };\n /**\n * @param {?} useDefault\n * @return {?}\n */\n NgSwitch.prototype._updateDefaultCases = function (useDefault) {\n if (this._defaultViews && useDefault !== this._defaultUsed) {\n this._defaultUsed = useDefault;\n for (var /** @type {?} */ i = 0; i < this._defaultViews.length; i++) {\n var /** @type {?} */ defaultView = this._defaultViews[i];\n defaultView.enforceState(useDefault);\n }\n }\n };\n NgSwitch.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngSwitch]' },] },\n ];\n /** @nocollapse */\n NgSwitch.ctorParameters = function () { return []; };\n NgSwitch.propDecorators = {\n 'ngSwitch': [{ type: _angular_core.Input },],\n };\n return NgSwitch;\n }());\n /**\n * *\n * given expression evaluate to respectively the same/different value as the switch\n * expression.\n * *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n * <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n * </container-element>\n * *```\n * *\n * Insert the sub-tree when the expression evaluates to the same value as the enclosing switch\n * expression.\n * *\n * If multiple match expressions match the switch expression value, all of them are displayed.\n * *\n * See {@link NgSwitch} for more details and example.\n * *\n */\n var NgSwitchCase = (function () {\n /**\n * @param {?} viewContainer\n * @param {?} templateRef\n * @param {?} ngSwitch\n */\n function NgSwitchCase(viewContainer, templateRef, ngSwitch) {\n this.ngSwitch = ngSwitch;\n ngSwitch._addCase();\n this._view = new SwitchView(viewContainer, templateRef);\n }\n /**\n * @return {?}\n */\n NgSwitchCase.prototype.ngDoCheck = function () { this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase)); };\n NgSwitchCase.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngSwitchCase]' },] },\n ];\n /** @nocollapse */\n NgSwitchCase.ctorParameters = function () { return [\n { type: _angular_core.ViewContainerRef, },\n { type: _angular_core.TemplateRef, },\n { type: NgSwitch, decorators: [{ type: _angular_core.Host },] },\n ]; };\n NgSwitchCase.propDecorators = {\n 'ngSwitchCase': [{ type: _angular_core.Input },],\n };\n return NgSwitchCase;\n }());\n /**\n * match the\n * switch expression.\n * *\n * ```\n * <container-element [ngSwitch]=\"switch_expression\">\n * <some-element *ngSwitchCase=\"match_expression_1\">...</some-element>\n * <some-other-element *ngSwitchDefault>...</some-other-element>\n * </container-element>\n * ```\n * *\n * *\n * Insert the sub-tree when no case expressions evaluate to the same value as the enclosing switch\n * expression.\n * *\n * See {@link NgSwitch} for more details and example.\n * *\n */\n var NgSwitchDefault = (function () {\n /**\n * @param {?} viewContainer\n * @param {?} templateRef\n * @param {?} ngSwitch\n */\n function NgSwitchDefault(viewContainer, templateRef, ngSwitch) {\n ngSwitch._addDefault(new SwitchView(viewContainer, templateRef));\n }\n NgSwitchDefault.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngSwitchDefault]' },] },\n ];\n /** @nocollapse */\n NgSwitchDefault.ctorParameters = function () { return [\n { type: _angular_core.ViewContainerRef, },\n { type: _angular_core.TemplateRef, },\n { type: NgSwitch, decorators: [{ type: _angular_core.Host },] },\n ]; };\n return NgSwitchDefault;\n }());\n\n /**\n * *\n * *\n * ```\n * <some-element [ngPlural]=\"value\">\n * <ng-container *ngPluralCase=\"'=0'\">there is nothing</ng-container>\n * <ng-container *ngPluralCase=\"'=1'\">there is one</ng-container>\n * <ng-container *ngPluralCase=\"'few'\">there are a few</ng-container>\n * <ng-container *ngPluralCase=\"'other'\">there are exactly #</ng-container>\n * </some-element>\n * ```\n * *\n * *\n * Displays DOM sub-trees that match the switch expression value, or failing that, DOM sub-trees\n * that match the switch expression's pluralization category.\n * *\n * To use this directive you must provide a container element that sets the `[ngPlural]` attribute\n * to a switch expression. Inner elements with a `[ngPluralCase]` will display based on their\n * expression:\n * - if `[ngPluralCase]` is set to a value starting with `=`, it will only display if the value\n * matches the switch expression exactly,\n * - otherwise, the view will be treated as a \"category match\", and will only display if exact\n * value matches aren't found and the value maps to its category for the defined locale.\n * *\n * See http://cldr.unicode.org/index/cldr-spec/plural-rules\n * *\n */\n var NgPlural = (function () {\n /**\n * @param {?} _localization\n */\n function NgPlural(_localization) {\n this._localization = _localization;\n this._caseViews = {};\n }\n Object.defineProperty(NgPlural.prototype, \"ngPlural\", {\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) {\n this._switchValue = value;\n this._updateView();\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} value\n * @param {?} switchView\n * @return {?}\n */\n NgPlural.prototype.addCase = function (value, switchView) { this._caseViews[value] = switchView; };\n /**\n * @return {?}\n */\n NgPlural.prototype._updateView = function () {\n this._clearViews();\n var /** @type {?} */ cases = Object.keys(this._caseViews);\n var /** @type {?} */ key = getPluralCategory(this._switchValue, cases, this._localization);\n this._activateView(this._caseViews[key]);\n };\n /**\n * @return {?}\n */\n NgPlural.prototype._clearViews = function () {\n if (this._activeView)\n this._activeView.destroy();\n };\n /**\n * @param {?} view\n * @return {?}\n */\n NgPlural.prototype._activateView = function (view) {\n if (view) {\n this._activeView = view;\n this._activeView.create();\n }\n };\n NgPlural.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngPlural]' },] },\n ];\n /** @nocollapse */\n NgPlural.ctorParameters = function () { return [\n { type: NgLocalization, },\n ]; };\n NgPlural.propDecorators = {\n 'ngPlural': [{ type: _angular_core.Input },],\n };\n return NgPlural;\n }());\n /**\n * *\n * given expression matches the plural expression according to CLDR rules.\n * *\n * ```\n * <some-element [ngPlural]=\"value\">\n * <ng-container *ngPluralCase=\"'=0'\">...</ng-container>\n * <ng-container *ngPluralCase=\"'other'\">...</ng-container>\n * </some-element>\n * *```\n * *\n * See {@link NgPlural} for more details and example.\n * *\n */\n var NgPluralCase = (function () {\n /**\n * @param {?} value\n * @param {?} template\n * @param {?} viewContainer\n * @param {?} ngPlural\n */\n function NgPluralCase(value, template, viewContainer, ngPlural) {\n this.value = value;\n ngPlural.addCase(value, new SwitchView(viewContainer, template));\n }\n NgPluralCase.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngPluralCase]' },] },\n ];\n /** @nocollapse */\n NgPluralCase.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Attribute, args: ['ngPluralCase',] },] },\n { type: _angular_core.TemplateRef, },\n { type: _angular_core.ViewContainerRef, },\n { type: NgPlural, decorators: [{ type: _angular_core.Host },] },\n ]; };\n return NgPluralCase;\n }());\n\n /**\n * *\n * *\n * ```\n * <some-element [ngStyle]=\"{'font-style': styleExp}\">...</some-element>\n * *\n * <some-element [ngStyle]=\"{'max-width.px': widthExp}\">...</some-element>\n * *\n * <some-element [ngStyle]=\"objExp\">...</some-element>\n * ```\n * *\n * *\n * The styles are updated according to the value of the expression evaluation:\n * - keys are style names with an optional `.<unit>` suffix (ie 'top.px', 'font-style.em'),\n * - values are the values assigned to those properties (expressed in the given unit).\n * *\n */\n var NgStyle = (function () {\n /**\n * @param {?} _differs\n * @param {?} _ngEl\n * @param {?} _renderer\n */\n function NgStyle(_differs, _ngEl, _renderer) {\n this._differs = _differs;\n this._ngEl = _ngEl;\n this._renderer = _renderer;\n }\n Object.defineProperty(NgStyle.prototype, \"ngStyle\", {\n /**\n * @param {?} v\n * @return {?}\n */\n set: function (v) {\n this._ngStyle = v;\n if (!this._differ && v) {\n this._differ = this._differs.find(v).create(null);\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n NgStyle.prototype.ngDoCheck = function () {\n if (this._differ) {\n var /** @type {?} */ changes = this._differ.diff(this._ngStyle);\n if (changes) {\n this._applyChanges(changes);\n }\n }\n };\n /**\n * @param {?} changes\n * @return {?}\n */\n NgStyle.prototype._applyChanges = function (changes) {\n var _this = this;\n changes.forEachRemovedItem(function (record) { return _this._setStyle(record.key, null); });\n changes.forEachAddedItem(function (record) { return _this._setStyle(record.key, record.currentValue); });\n changes.forEachChangedItem(function (record) { return _this._setStyle(record.key, record.currentValue); });\n };\n /**\n * @param {?} nameAndUnit\n * @param {?} value\n * @return {?}\n */\n NgStyle.prototype._setStyle = function (nameAndUnit, value) {\n var _a = nameAndUnit.split('.'), name = _a[0], unit = _a[1];\n value = value && unit ? \"\" + value + unit : value;\n this._renderer.setElementStyle(this._ngEl.nativeElement, name, value);\n };\n NgStyle.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngStyle]' },] },\n ];\n /** @nocollapse */\n NgStyle.ctorParameters = function () { return [\n { type: _angular_core.KeyValueDiffers, },\n { type: _angular_core.ElementRef, },\n { type: _angular_core.Renderer, },\n ]; };\n NgStyle.propDecorators = {\n 'ngStyle': [{ type: _angular_core.Input },],\n };\n return NgStyle;\n }());\n\n /**\n * *\n * *\n * ```\n * <template [ngTemplateOutlet]=\"templateRefExpression\"\n * [ngOutletContext]=\"objectExpression\">\n * </template>\n * ```\n * *\n * *\n * You can attach a context object to the `EmbeddedViewRef` by setting `[ngOutletContext]`.\n * `[ngOutletContext]` should be an object, the object's keys will be the local template variables\n * available within the `TemplateRef`.\n * *\n * Note: using the key `$implicit` in the context object will set it's value as default.\n * *\n */\n var NgTemplateOutlet = (function () {\n /**\n * @param {?} _viewContainerRef\n */\n function NgTemplateOutlet(_viewContainerRef) {\n this._viewContainerRef = _viewContainerRef;\n }\n Object.defineProperty(NgTemplateOutlet.prototype, \"ngOutletContext\", {\n /**\n * @param {?} context\n * @return {?}\n */\n set: function (context) { this._context = context; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(NgTemplateOutlet.prototype, \"ngTemplateOutlet\", {\n /**\n * @param {?} templateRef\n * @return {?}\n */\n set: function (templateRef) { this._templateRef = templateRef; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} changes\n * @return {?}\n */\n NgTemplateOutlet.prototype.ngOnChanges = function (changes) {\n if (this._viewRef) {\n this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef));\n }\n if (this._templateRef) {\n this._viewRef = this._viewContainerRef.createEmbeddedView(this._templateRef, this._context);\n }\n };\n NgTemplateOutlet.decorators = [\n { type: _angular_core.Directive, args: [{ selector: '[ngTemplateOutlet]' },] },\n ];\n /** @nocollapse */\n NgTemplateOutlet.ctorParameters = function () { return [\n { type: _angular_core.ViewContainerRef, },\n ]; };\n NgTemplateOutlet.propDecorators = {\n 'ngOutletContext': [{ type: _angular_core.Input },],\n 'ngTemplateOutlet': [{ type: _angular_core.Input },],\n };\n return NgTemplateOutlet;\n }());\n\n /**\n * A collection of Angular directives that are likely to be used in each and every Angular\n * application.\n */\n var /** @type {?} */ COMMON_DIRECTIVES = [\n NgClass,\n NgFor,\n NgIf,\n NgTemplateOutlet,\n NgStyle,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault,\n NgPlural,\n NgPluralCase,\n ];\n\n var /** @type {?} */ isPromise = _angular_core.__core_private__.isPromise;\n\n var __extends$4 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @stable\n */\n var BaseError = (function (_super) {\n __extends$4(BaseError, _super);\n /**\n * @param {?} message\n */\n function BaseError(message) {\n _super.call(this, message);\n // Errors don't use current this, instead they create a new instance.\n // We have to do forward all of our api to the nativeInstance.\n // TODO(bradfordcsmith): Remove this hack when\n // google/closure-compiler/issues/2102 is fixed.\n var nativeError = new Error(message);\n this._nativeError = nativeError;\n }\n Object.defineProperty(BaseError.prototype, \"message\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.message; },\n /**\n * @param {?} message\n * @return {?}\n */\n set: function (message) { this._nativeError.message = message; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"name\", {\n /**\n * @return {?}\n */\n get: function () { return this._nativeError.name; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(BaseError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () { return ((this._nativeError)).stack; },\n /**\n * @param {?} value\n * @return {?}\n */\n set: function (value) { ((this._nativeError)).stack = value; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n BaseError.prototype.toString = function () { return this._nativeError.toString(); };\n return BaseError;\n }(Error));\n /**\n * @stable\n */\n var WrappedError = (function (_super) {\n __extends$4(WrappedError, _super);\n /**\n * @param {?} message\n * @param {?} error\n */\n function WrappedError(message, error) {\n _super.call(this, message + \" caused by: \" + (error instanceof Error ? error.message : error));\n this.originalError = error;\n }\n Object.defineProperty(WrappedError.prototype, \"stack\", {\n /**\n * @return {?}\n */\n get: function () {\n return (((this.originalError instanceof Error ? this.originalError : this._nativeError)))\n .stack;\n },\n enumerable: true,\n configurable: true\n });\n return WrappedError;\n }(BaseError));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$3 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var InvalidPipeArgumentError = (function (_super) {\n __extends$3(InvalidPipeArgumentError, _super);\n /**\n * @param {?} type\n * @param {?} value\n */\n function InvalidPipeArgumentError(type, value) {\n _super.call(this, \"Invalid argument '\" + value + \"' for pipe '\" + stringify(type) + \"'\");\n }\n return InvalidPipeArgumentError;\n }(BaseError));\n\n var ObservableStrategy = (function () {\n function ObservableStrategy() {\n }\n /**\n * @param {?} async\n * @param {?} updateLatestValue\n * @return {?}\n */\n ObservableStrategy.prototype.createSubscription = function (async, updateLatestValue) {\n return async.subscribe({ next: updateLatestValue, error: function (e) { throw e; } });\n };\n /**\n * @param {?} subscription\n * @return {?}\n */\n ObservableStrategy.prototype.dispose = function (subscription) { subscription.unsubscribe(); };\n /**\n * @param {?} subscription\n * @return {?}\n */\n ObservableStrategy.prototype.onDestroy = function (subscription) { subscription.unsubscribe(); };\n return ObservableStrategy;\n }());\n var PromiseStrategy = (function () {\n function PromiseStrategy() {\n }\n /**\n * @param {?} async\n * @param {?} updateLatestValue\n * @return {?}\n */\n PromiseStrategy.prototype.createSubscription = function (async, updateLatestValue) {\n return async.then(updateLatestValue, function (e) { throw e; });\n };\n /**\n * @param {?} subscription\n * @return {?}\n */\n PromiseStrategy.prototype.dispose = function (subscription) { };\n /**\n * @param {?} subscription\n * @return {?}\n */\n PromiseStrategy.prototype.onDestroy = function (subscription) { };\n return PromiseStrategy;\n }());\n var /** @type {?} */ _promiseStrategy = new PromiseStrategy();\n var /** @type {?} */ _observableStrategy = new ObservableStrategy();\n /**\n * The `async` pipe subscribes to an `Observable` or `Promise` and returns the latest value it has\n * emitted. When a new value is emitted, the `async` pipe marks the component to be checked for\n * changes. When the component gets destroyed, the `async` pipe unsubscribes automatically to avoid\n * potential memory leaks.\n * *\n * *\n * ## Examples\n * *\n * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the\n * promise.\n * *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipePromise'}\n * *\n * It's also possible to use `async` with Observables. The example below binds the `time` Observable\n * to the view. The Observable continuously updates the view with the current time.\n * *\n * {@example common/pipes/ts/async_pipe.ts region='AsyncPipeObservable'}\n * *\n */\n var AsyncPipe = (function () {\n /**\n * @param {?} _ref\n */\n function AsyncPipe(_ref) {\n this._ref = _ref;\n this._latestValue = null;\n this._latestReturnedValue = null;\n this._subscription = null;\n this._obj = null;\n this._strategy = null;\n }\n /**\n * @return {?}\n */\n AsyncPipe.prototype.ngOnDestroy = function () {\n if (this._subscription) {\n this._dispose();\n }\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n AsyncPipe.prototype.transform = function (obj) {\n if (!this._obj) {\n if (obj) {\n this._subscribe(obj);\n }\n this._latestReturnedValue = this._latestValue;\n return this._latestValue;\n }\n if (obj !== this._obj) {\n this._dispose();\n return this.transform(obj);\n }\n if (this._latestValue === this._latestReturnedValue) {\n return this._latestReturnedValue;\n }\n this._latestReturnedValue = this._latestValue;\n return _angular_core.WrappedValue.wrap(this._latestValue);\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n AsyncPipe.prototype._subscribe = function (obj) {\n var _this = this;\n this._obj = obj;\n this._strategy = this._selectStrategy(obj);\n this._subscription = this._strategy.createSubscription(obj, function (value) { return _this._updateLatestValue(obj, value); });\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n AsyncPipe.prototype._selectStrategy = function (obj) {\n if (isPromise(obj)) {\n return _promiseStrategy;\n }\n if (((obj)).subscribe) {\n return _observableStrategy;\n }\n throw new InvalidPipeArgumentError(AsyncPipe, obj);\n };\n /**\n * @return {?}\n */\n AsyncPipe.prototype._dispose = function () {\n this._strategy.dispose(this._subscription);\n this._latestValue = null;\n this._latestReturnedValue = null;\n this._subscription = null;\n this._obj = null;\n };\n /**\n * @param {?} async\n * @param {?} value\n * @return {?}\n */\n AsyncPipe.prototype._updateLatestValue = function (async, value) {\n if (async === this._obj) {\n this._latestValue = value;\n this._ref.markForCheck();\n }\n };\n AsyncPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'async', pure: false },] },\n ];\n /** @nocollapse */\n AsyncPipe.ctorParameters = function () { return [\n { type: _angular_core.ChangeDetectorRef, },\n ]; };\n return AsyncPipe;\n }());\n\n var NumberFormatStyle = {};\n NumberFormatStyle.Decimal = 0;\n NumberFormatStyle.Percent = 1;\n NumberFormatStyle.Currency = 2;\n NumberFormatStyle[NumberFormatStyle.Decimal] = \"Decimal\";\n NumberFormatStyle[NumberFormatStyle.Percent] = \"Percent\";\n NumberFormatStyle[NumberFormatStyle.Currency] = \"Currency\";\n var NumberFormatter = (function () {\n function NumberFormatter() {\n }\n /**\n * @param {?} num\n * @param {?} locale\n * @param {?} style\n * @param {?=} __3\n * @return {?}\n */\n NumberFormatter.format = function (num, locale, style, _a) {\n var _b = _a === void 0 ? {} : _a, minimumIntegerDigits = _b.minimumIntegerDigits, minimumFractionDigits = _b.minimumFractionDigits, maximumFractionDigits = _b.maximumFractionDigits, currency = _b.currency, _c = _b.currencyAsSymbol, currencyAsSymbol = _c === void 0 ? false : _c;\n var /** @type {?} */ options = {\n minimumIntegerDigits: minimumIntegerDigits,\n minimumFractionDigits: minimumFractionDigits,\n maximumFractionDigits: maximumFractionDigits,\n style: NumberFormatStyle[style].toLowerCase()\n };\n if (style == NumberFormatStyle.Currency) {\n options.currency = currency;\n options.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';\n }\n return new Intl.NumberFormat(locale, options).format(num);\n };\n return NumberFormatter;\n }());\n var /** @type {?} */ DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsazZEwGjJ']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|J+|j+|m+|s+|a|z|Z|G+|w+))(.*)/;\n var /** @type {?} */ PATTERN_ALIASES = {\n // Keys are quoted so they do not get renamed during closure compilation.\n 'yMMMdjms': datePartGetterFactory(combine([\n digitCondition('year', 1),\n nameCondition('month', 3),\n digitCondition('day', 1),\n digitCondition('hour', 1),\n digitCondition('minute', 1),\n digitCondition('second', 1),\n ])),\n 'yMdjm': datePartGetterFactory(combine([\n digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1),\n digitCondition('hour', 1), digitCondition('minute', 1)\n ])),\n 'yMMMMEEEEd': datePartGetterFactory(combine([\n digitCondition('year', 1), nameCondition('month', 4), nameCondition('weekday', 4),\n digitCondition('day', 1)\n ])),\n 'yMMMMd': datePartGetterFactory(combine([digitCondition('year', 1), nameCondition('month', 4), digitCondition('day', 1)])),\n 'yMMMd': datePartGetterFactory(combine([digitCondition('year', 1), nameCondition('month', 3), digitCondition('day', 1)])),\n 'yMd': datePartGetterFactory(combine([digitCondition('year', 1), digitCondition('month', 1), digitCondition('day', 1)])),\n 'jms': datePartGetterFactory(combine([digitCondition('hour', 1), digitCondition('second', 1), digitCondition('minute', 1)])),\n 'jm': datePartGetterFactory(combine([digitCondition('hour', 1), digitCondition('minute', 1)]))\n };\n var /** @type {?} */ DATE_FORMATS = {\n // Keys are quoted so they do not get renamed.\n 'yyyy': datePartGetterFactory(digitCondition('year', 4)),\n 'yy': datePartGetterFactory(digitCondition('year', 2)),\n 'y': datePartGetterFactory(digitCondition('year', 1)),\n 'MMMM': datePartGetterFactory(nameCondition('month', 4)),\n 'MMM': datePartGetterFactory(nameCondition('month', 3)),\n 'MM': datePartGetterFactory(digitCondition('month', 2)),\n 'M': datePartGetterFactory(digitCondition('month', 1)),\n 'LLLL': datePartGetterFactory(nameCondition('month', 4)),\n 'L': datePartGetterFactory(nameCondition('month', 1)),\n 'dd': datePartGetterFactory(digitCondition('day', 2)),\n 'd': datePartGetterFactory(digitCondition('day', 1)),\n 'HH': digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), false)))),\n 'H': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), false))),\n 'hh': digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 2), true)))),\n 'h': hourExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n 'jj': datePartGetterFactory(digitCondition('hour', 2)),\n 'j': datePartGetterFactory(digitCondition('hour', 1)),\n 'mm': digitModifier(datePartGetterFactory(digitCondition('minute', 2))),\n 'm': datePartGetterFactory(digitCondition('minute', 1)),\n 'ss': digitModifier(datePartGetterFactory(digitCondition('second', 2))),\n 's': datePartGetterFactory(digitCondition('second', 1)),\n // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n // we can be just safely rely on using `sss` since we currently don't support single or two digit\n // fractions\n 'sss': datePartGetterFactory(digitCondition('second', 3)),\n 'EEEE': datePartGetterFactory(nameCondition('weekday', 4)),\n 'EEE': datePartGetterFactory(nameCondition('weekday', 3)),\n 'EE': datePartGetterFactory(nameCondition('weekday', 2)),\n 'E': datePartGetterFactory(nameCondition('weekday', 1)),\n 'a': hourClockExtractor(datePartGetterFactory(hour12Modify(digitCondition('hour', 1), true))),\n 'Z': timeZoneGetter('short'),\n 'z': timeZoneGetter('long'),\n 'ww': datePartGetterFactory({}),\n // first Thursday of the year. not support ?\n 'w': datePartGetterFactory({}),\n // of the year not support ?\n 'G': datePartGetterFactory(nameCondition('era', 1)),\n 'GG': datePartGetterFactory(nameCondition('era', 2)),\n 'GGG': datePartGetterFactory(nameCondition('era', 3)),\n 'GGGG': datePartGetterFactory(nameCondition('era', 4))\n };\n /**\n * @param {?} inner\n * @return {?}\n */\n function digitModifier(inner) {\n return function (date, locale) {\n var /** @type {?} */ result = inner(date, locale);\n return result.length == 1 ? '0' + result : result;\n };\n }\n /**\n * @param {?} inner\n * @return {?}\n */\n function hourClockExtractor(inner) {\n return function (date, locale) { return inner(date, locale).split(' ')[1]; };\n }\n /**\n * @param {?} inner\n * @return {?}\n */\n function hourExtractor(inner) {\n return function (date, locale) { return inner(date, locale).split(' ')[0]; };\n }\n /**\n * @param {?} date\n * @param {?} locale\n * @param {?} options\n * @return {?}\n */\n function intlDateFormat(date, locale, options) {\n return new Intl.DateTimeFormat(locale, options).format(date).replace(/[\\u200e\\u200f]/g, '');\n }\n /**\n * @param {?} timezone\n * @return {?}\n */\n function timeZoneGetter(timezone) {\n // To workaround `Intl` API restriction for single timezone let format with 24 hours\n var /** @type {?} */ options = { hour: '2-digit', hour12: false, timeZoneName: timezone };\n return function (date, locale) {\n var /** @type {?} */ result = intlDateFormat(date, locale, options);\n // Then extract first 3 letters that related to hours\n return result ? result.substring(3) : '';\n };\n }\n /**\n * @param {?} options\n * @param {?} value\n * @return {?}\n */\n function hour12Modify(options, value) {\n options.hour12 = value;\n return options;\n }\n /**\n * @param {?} prop\n * @param {?} len\n * @return {?}\n */\n function digitCondition(prop, len) {\n var /** @type {?} */ result = {};\n result[prop] = len === 2 ? '2-digit' : 'numeric';\n return result;\n }\n /**\n * @param {?} prop\n * @param {?} len\n * @return {?}\n */\n function nameCondition(prop, len) {\n var /** @type {?} */ result = {};\n if (len < 4) {\n result[prop] = len > 1 ? 'short' : 'narrow';\n }\n else {\n result[prop] = 'long';\n }\n return result;\n }\n /**\n * @param {?} options\n * @return {?}\n */\n function combine(options) {\n return (_a = ((Object))).assign.apply(_a, [{}].concat(options));\n var _a;\n }\n /**\n * @param {?} ret\n * @return {?}\n */\n function datePartGetterFactory(ret) {\n return function (date, locale) { return intlDateFormat(date, locale, ret); };\n }\n var /** @type {?} */ DATE_FORMATTER_CACHE = new Map();\n /**\n * @param {?} format\n * @param {?} date\n * @param {?} locale\n * @return {?}\n */\n function dateFormatter(format, date, locale) {\n var /** @type {?} */ fn = PATTERN_ALIASES[format];\n if (fn)\n return fn(date, locale);\n var /** @type {?} */ cacheKey = format;\n var /** @type {?} */ parts = DATE_FORMATTER_CACHE.get(cacheKey);\n if (!parts) {\n parts = [];\n var /** @type {?} */ match = void 0;\n DATE_FORMATS_SPLIT.exec(format);\n while (format) {\n match = DATE_FORMATS_SPLIT.exec(format);\n if (match) {\n parts = parts.concat(match.slice(1));\n format = parts.pop();\n }\n else {\n parts.push(format);\n format = null;\n }\n }\n DATE_FORMATTER_CACHE.set(cacheKey, parts);\n }\n return parts.reduce(function (text, part) {\n var /** @type {?} */ fn = DATE_FORMATS[part];\n return text + (fn ? fn(date, locale) : partToTime(part));\n }, '');\n }\n /**\n * @param {?} part\n * @return {?}\n */\n function partToTime(part) {\n return part === '\\'\\'' ? '\\'' : part.replace(/(^'|'$)/g, '').replace(/''/g, '\\'');\n }\n var DateFormatter = (function () {\n function DateFormatter() {\n }\n /**\n * @param {?} date\n * @param {?} locale\n * @param {?} pattern\n * @return {?}\n */\n DateFormatter.format = function (date, locale, pattern) {\n return dateFormatter(pattern, date, locale);\n };\n return DateFormatter;\n }());\n\n /**\n * *\n * Where:\n * - `expression` is a date object or a number (milliseconds since UTC epoch) or an ISO string\n * (https://www.w3.org/TR/NOTE-datetime).\n * - `format` indicates which date/time components to include. The format can be predifined as\n * shown below or custom as shown in the table.\n * - `'medium'`: equivalent to `'yMMMdjms'` (e.g. `Sep 3, 2010, 12:05:08 PM` for `en-US`)\n * - `'short'`: equivalent to `'yMdjm'` (e.g. `9/3/2010, 12:05 PM` for `en-US`)\n * - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. `Friday, September 3, 2010` for `en-US`)\n * - `'longDate'`: equivalent to `'yMMMMd'` (e.g. `September 3, 2010` for `en-US`)\n * - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. `Sep 3, 2010` for `en-US`)\n * - `'shortDate'`: equivalent to `'yMd'` (e.g. `9/3/2010` for `en-US`)\n * - `'mediumTime'`: equivalent to `'jms'` (e.g. `12:05:08 PM` for `en-US`)\n * - `'shortTime'`: equivalent to `'jm'` (e.g. `12:05 PM` for `en-US`)\n * *\n * *\n * | Component | Symbol | Narrow | Short Form | Long Form | Numeric | 2-digit |\n * |-----------|:------:|--------|--------------|-------------------|-----------|-----------|\n * | era | G | G (A) | GGG (AD) | GGGG (Anno Domini)| - | - |\n * | year | y | - | - | - | y (2015) | yy (15) |\n * | month | M | L (S) | MMM (Sep) | MMMM (September) | M (9) | MM (09) |\n * | day | d | - | - | - | d (3) | dd (03) |\n * | weekday | E | E (S) | EEE (Sun) | EEEE (Sunday) | - | - |\n * | hour | j | - | - | - | j (13) | jj (13) |\n * | hour12 | h | - | - | - | h (1 PM) | hh (01 PM)|\n * | hour24 | H | - | - | - | H (13) | HH (13) |\n * | minute | m | - | - | - | m (5) | mm (05) |\n * | second | s | - | - | - | s (9) | ss (09) |\n * | timezone | z | - | - | z (Pacific Standard Time)| - | - |\n * | timezone | Z | - | Z (GMT-8:00) | - | - | - |\n * | timezone | a | - | a (PM) | - | - | - |\n * *\n * In javascript, only the components specified will be respected (not the ordering,\n * punctuations, ...) and details of the formatting will be dependent on the locale.\n * *\n * Timezone of the formatted text will be the local system timezone of the end-user's machine.\n * *\n * When the expression is a ISO string without time (e.g. 2016-09-19) the time zone offset is not\n * applied and the formatted text will have the same day, month and year of the expression.\n * *\n * WARNINGS:\n * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.\n * Instead users should treat the date as an immutable object and change the reference when the\n * pipe needs to re-run (this is to avoid reformatting the date on every change detection run\n * which would be an expensive operation).\n * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera\n * browsers.\n * *\n * ### Examples\n * *\n * Assuming `dateObj` is (year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11)\n * in the _local_ time and locale is 'en-US':\n * *\n * ```\n * {{ dateObj | date }} // output is 'Jun 15, 2015'\n * {{ dateObj | date:'medium' }} // output is 'Jun 15, 2015, 9:43:11 PM'\n * {{ dateObj | date:'shortTime' }} // output is '9:43 PM'\n * {{ dateObj | date:'mmss' }} // output is '43:11'\n * ```\n * *\n * {@example common/pipes/ts/date_pipe.ts region='DatePipe'}\n * *\n */\n var DatePipe = (function () {\n /**\n * @param {?} _locale\n */\n function DatePipe(_locale) {\n this._locale = _locale;\n }\n /**\n * @param {?} value\n * @param {?=} pattern\n * @return {?}\n */\n DatePipe.prototype.transform = function (value, pattern) {\n if (pattern === void 0) { pattern = 'mediumDate'; }\n var /** @type {?} */ date;\n if (isBlank$1(value))\n return null;\n if (typeof value === 'string') {\n value = value.trim();\n }\n if (isDate(value)) {\n date = value;\n }\n else if (NumberWrapper.isNumeric(value)) {\n date = new Date(parseFloat(value));\n }\n else if (typeof value === 'string' && /^(\\d{4}-\\d{1,2}-\\d{1,2})$/.test(value)) {\n /**\n * For ISO Strings without time the day, month and year must be extracted from the ISO String\n * before Date creation to avoid time offset and errors in the new Date.\n * If we only replace '-' with ',' in the ISO String (\"2015,01,01\"), and try to create a new\n * date, some browsers (e.g. IE 9) will throw an invalid Date error\n * If we leave the '-' (\"2015-01-01\") and try to create a new Date(\"2015-01-01\") the timeoffset\n * is applied\n * Note: ISO months are 0 for January, 1 for February, ...\n */\n var _a = value.split('-').map(function (val) { return parseInt(val, 10); }), y = _a[0], m = _a[1], d = _a[2];\n date = new Date(y, m - 1, d);\n }\n else {\n date = new Date(value);\n }\n if (!isDate(date)) {\n throw new InvalidPipeArgumentError(DatePipe, value);\n }\n return DateFormatter.format(date, this._locale, DatePipe._ALIASES[pattern] || pattern);\n };\n /** @internal */\n DatePipe._ALIASES = {\n 'medium': 'yMMMdjms',\n 'short': 'yMdjm',\n 'fullDate': 'yMMMMEEEEd',\n 'longDate': 'yMMMMd',\n 'mediumDate': 'yMMMd',\n 'shortDate': 'yMd',\n 'mediumTime': 'jms',\n 'shortTime': 'jm'\n };\n DatePipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'date', pure: true },] },\n ];\n /** @nocollapse */\n DatePipe.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n ]; };\n return DatePipe;\n }());\n /**\n * @param {?} obj\n * @return {?}\n */\n function isBlank$1(obj) {\n return obj == null || obj === '';\n }\n\n var /** @type {?} */ _INTERPOLATION_REGEXP = /#/g;\n /**\n * *\n * Where:\n * - `expression` is a number.\n * - `mapping` is an object that mimics the ICU format, see\n * http://userguide.icu-project.org/formatparse/messages\n * *\n * ## Example\n * *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nPluralPipeComponent'}\n * *\n */\n var I18nPluralPipe = (function () {\n /**\n * @param {?} _localization\n */\n function I18nPluralPipe(_localization) {\n this._localization = _localization;\n }\n /**\n * @param {?} value\n * @param {?} pluralMap\n * @return {?}\n */\n I18nPluralPipe.prototype.transform = function (value, pluralMap) {\n if (isBlank(value))\n return '';\n if (typeof pluralMap !== 'object' || pluralMap === null) {\n throw new InvalidPipeArgumentError(I18nPluralPipe, pluralMap);\n }\n var /** @type {?} */ key = getPluralCategory(value, Object.keys(pluralMap), this._localization);\n return pluralMap[key].replace(_INTERPOLATION_REGEXP, value.toString());\n };\n I18nPluralPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'i18nPlural', pure: true },] },\n ];\n /** @nocollapse */\n I18nPluralPipe.ctorParameters = function () { return [\n { type: NgLocalization, },\n ]; };\n return I18nPluralPipe;\n }());\n\n /**\n * *\n * Where `mapping` is an object that indicates the text that should be displayed\n * for different values of the provided `expression`.\n * If none of the keys of the mapping match the value of the `expression`, then the content\n * of the `other` key is returned when present, otherwise an empty string is returned.\n * *\n * ## Example\n * *\n * {@example common/pipes/ts/i18n_pipe.ts region='I18nSelectPipeComponent'}\n * *\n * @experimental\n */\n var I18nSelectPipe = (function () {\n function I18nSelectPipe() {\n }\n /**\n * @param {?} value\n * @param {?} mapping\n * @return {?}\n */\n I18nSelectPipe.prototype.transform = function (value, mapping) {\n if (value == null)\n return '';\n if (typeof mapping !== 'object' || typeof value !== 'string') {\n throw new InvalidPipeArgumentError(I18nSelectPipe, mapping);\n }\n if (mapping.hasOwnProperty(value)) {\n return mapping[value];\n }\n if (mapping.hasOwnProperty('other')) {\n return mapping['other'];\n }\n return '';\n };\n I18nSelectPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'i18nSelect', pure: true },] },\n ];\n /** @nocollapse */\n I18nSelectPipe.ctorParameters = function () { return []; };\n return I18nSelectPipe;\n }());\n\n /**\n * *\n * Converts value into string using `JSON.stringify`. Useful for debugging.\n * *\n * ### Example\n * {@example common/pipes/ts/json_pipe.ts region='JsonPipe'}\n * *\n */\n var JsonPipe = (function () {\n function JsonPipe() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n JsonPipe.prototype.transform = function (value) { return JSON.stringify(value, null, 2); };\n JsonPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'json', pure: false },] },\n ];\n /** @nocollapse */\n JsonPipe.ctorParameters = function () { return []; };\n return JsonPipe;\n }());\n\n /**\n * *\n * Converts value into a lowercase string using `String.prototype.toLowerCase()`.\n * *\n * ### Example\n * *\n * {@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}\n * *\n */\n var LowerCasePipe = (function () {\n function LowerCasePipe() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n LowerCasePipe.prototype.transform = function (value) {\n if (isBlank(value))\n return value;\n if (typeof value !== 'string') {\n throw new InvalidPipeArgumentError(LowerCasePipe, value);\n }\n return value.toLowerCase();\n };\n LowerCasePipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'lowercase' },] },\n ];\n /** @nocollapse */\n LowerCasePipe.ctorParameters = function () { return []; };\n return LowerCasePipe;\n }());\n\n var /** @type {?} */ _NUMBER_FORMAT_REGEXP = /^(\\d+)?\\.((\\d+)(-(\\d+))?)?$/;\n /**\n * @param {?} pipe\n * @param {?} locale\n * @param {?} value\n * @param {?} style\n * @param {?} digits\n * @param {?=} currency\n * @param {?=} currencyAsSymbol\n * @return {?}\n */\n function formatNumber(pipe, locale, value, style, digits, currency, currencyAsSymbol) {\n if (currency === void 0) { currency = null; }\n if (currencyAsSymbol === void 0) { currencyAsSymbol = false; }\n if (isBlank(value))\n return null;\n // Convert strings to numbers\n value = typeof value === 'string' && NumberWrapper.isNumeric(value) ? +value : value;\n if (typeof value !== 'number') {\n throw new InvalidPipeArgumentError(pipe, value);\n }\n var /** @type {?} */ minInt;\n var /** @type {?} */ minFraction;\n var /** @type {?} */ maxFraction;\n if (style !== NumberFormatStyle.Currency) {\n // rely on Intl default for currency\n minInt = 1;\n minFraction = 0;\n maxFraction = 3;\n }\n if (digits) {\n var /** @type {?} */ parts = digits.match(_NUMBER_FORMAT_REGEXP);\n if (parts === null) {\n throw new Error(digits + \" is not a valid digit info for number pipes\");\n }\n if (isPresent(parts[1])) {\n minInt = NumberWrapper.parseIntAutoRadix(parts[1]);\n }\n if (isPresent(parts[3])) {\n minFraction = NumberWrapper.parseIntAutoRadix(parts[3]);\n }\n if (isPresent(parts[5])) {\n maxFraction = NumberWrapper.parseIntAutoRadix(parts[5]);\n }\n }\n return NumberFormatter.format(/** @type {?} */ (value), locale, style, {\n minimumIntegerDigits: minInt,\n minimumFractionDigits: minFraction,\n maximumFractionDigits: maxFraction,\n currency: currency,\n currencyAsSymbol: currencyAsSymbol,\n });\n }\n /**\n * *\n * Formats a number as text. Group sizing and separator and other locale-specific\n * configurations are based on the active locale.\n * *\n * where `expression` is a number:\n * - `digitInfo` is a `string` which has a following format: <br>\n * <code>{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}</code>\n * - `minIntegerDigits` is the minimum number of integer digits to use. Defaults to `1`.\n * - `minFractionDigits` is the minimum number of digits after fraction. Defaults to `0`.\n * - `maxFractionDigits` is the maximum number of digits after fraction. Defaults to `3`.\n * *\n * For more information on the acceptable range for each of these numbers and other\n * details see your native internationalization library.\n * *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See {@linkDocs guide/browser-support} for details.\n * *\n * ### Example\n * *\n * {@example common/pipes/ts/number_pipe.ts region='NumberPipe'}\n * *\n */\n var DecimalPipe = (function () {\n /**\n * @param {?} _locale\n */\n function DecimalPipe(_locale) {\n this._locale = _locale;\n }\n /**\n * @param {?} value\n * @param {?=} digits\n * @return {?}\n */\n DecimalPipe.prototype.transform = function (value, digits) {\n if (digits === void 0) { digits = null; }\n return formatNumber(DecimalPipe, this._locale, value, NumberFormatStyle.Decimal, digits);\n };\n DecimalPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'number' },] },\n ];\n /** @nocollapse */\n DecimalPipe.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n ]; };\n return DecimalPipe;\n }());\n /**\n * *\n * *\n * Formats a number as percentage.\n * *\n * - `digitInfo` See {@link DecimalPipe} for detailed description.\n * *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See {@linkDocs guide/browser-support} for details.\n * *\n * ### Example\n * *\n * {@example common/pipes/ts/number_pipe.ts region='PercentPipe'}\n * *\n */\n var PercentPipe = (function () {\n /**\n * @param {?} _locale\n */\n function PercentPipe(_locale) {\n this._locale = _locale;\n }\n /**\n * @param {?} value\n * @param {?=} digits\n * @return {?}\n */\n PercentPipe.prototype.transform = function (value, digits) {\n if (digits === void 0) { digits = null; }\n return formatNumber(PercentPipe, this._locale, value, NumberFormatStyle.Percent, digits);\n };\n PercentPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'percent' },] },\n ];\n /** @nocollapse */\n PercentPipe.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n ]; };\n return PercentPipe;\n }());\n /**\n * *\n * Use `currency` to format a number as currency.\n * *\n * - `currencyCode` is the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such\n * as `USD` for the US dollar and `EUR` for the euro.\n * - `symbolDisplay` is a boolean indicating whether to use the currency symbol or code.\n * - `true`: use symbol (e.g. `$`).\n * - `false`(default): use code (e.g. `USD`).\n * - `digitInfo` See {@link DecimalPipe} for detailed description.\n * *\n * WARNING: this pipe uses the Internationalization API which is not yet available in all browsers\n * and may require a polyfill. See {@linkDocs guide/browser-support} for details.\n * *\n * ### Example\n * *\n * {@example common/pipes/ts/number_pipe.ts region='CurrencyPipe'}\n * *\n */\n var CurrencyPipe = (function () {\n /**\n * @param {?} _locale\n */\n function CurrencyPipe(_locale) {\n this._locale = _locale;\n }\n /**\n * @param {?} value\n * @param {?=} currencyCode\n * @param {?=} symbolDisplay\n * @param {?=} digits\n * @return {?}\n */\n CurrencyPipe.prototype.transform = function (value, currencyCode, symbolDisplay, digits) {\n if (currencyCode === void 0) { currencyCode = 'USD'; }\n if (symbolDisplay === void 0) { symbolDisplay = false; }\n if (digits === void 0) { digits = null; }\n return formatNumber(CurrencyPipe, this._locale, value, NumberFormatStyle.Currency, digits, currencyCode, symbolDisplay);\n };\n CurrencyPipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'currency' },] },\n ];\n /** @nocollapse */\n CurrencyPipe.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Inject, args: [_angular_core.LOCALE_ID,] },] },\n ]; };\n return CurrencyPipe;\n }());\n\n /**\n * *\n * Where the input expression is a `List` or `String`, and:\n * - `start`: The starting index of the subset to return.\n * - **a positive integer**: return the item at `start` index and all items after\n * in the list or string expression.\n * - **a negative integer**: return the item at `start` index from the end and all items after\n * in the list or string expression.\n * - **if positive and greater than the size of the expression**: return an empty list or string.\n * - **if negative and greater than the size of the expression**: return entire list or string.\n * - `end`: The ending index of the subset to return.\n * - **omitted**: return all items until the end.\n * - **if positive**: return all items before `end` index of the list or string.\n * - **if negative**: return all items before `end` index from the end of the list or string.\n * *\n * All behavior is based on the expected behavior of the JavaScript API `Array.prototype.slice()`\n * and `String.prototype.slice()`.\n * *\n * When operating on a [List], the returned list is always a copy even when all\n * the elements are being returned.\n * *\n * When operating on a blank value, the pipe returns the blank value.\n * *\n * ## List Example\n * *\n * This `ngFor` example:\n * *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_list'}\n * *\n * produces the following:\n * *\n * <li>b</li>\n * <li>c</li>\n * *\n * ## String Examples\n * *\n * {@example common/pipes/ts/slice_pipe.ts region='SlicePipe_string'}\n * *\n */\n var SlicePipe = (function () {\n function SlicePipe() {\n }\n /**\n * @param {?} value\n * @param {?} start\n * @param {?=} end\n * @return {?}\n */\n SlicePipe.prototype.transform = function (value, start, end) {\n if (isBlank(value))\n return value;\n if (!this.supports(value)) {\n throw new InvalidPipeArgumentError(SlicePipe, value);\n }\n return value.slice(start, end);\n };\n /**\n * @param {?} obj\n * @return {?}\n */\n SlicePipe.prototype.supports = function (obj) { return typeof obj === 'string' || Array.isArray(obj); };\n SlicePipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'slice', pure: false },] },\n ];\n /** @nocollapse */\n SlicePipe.ctorParameters = function () { return []; };\n return SlicePipe;\n }());\n\n /**\n * *\n * Converts value into an uppercase string using `String.prototype.toUpperCase()`.\n * *\n * ### Example\n * *\n * {@example common/pipes/ts/lowerupper_pipe.ts region='LowerUpperPipe'}\n * *\n */\n var UpperCasePipe = (function () {\n function UpperCasePipe() {\n }\n /**\n * @param {?} value\n * @return {?}\n */\n UpperCasePipe.prototype.transform = function (value) {\n if (isBlank(value))\n return value;\n if (typeof value !== 'string') {\n throw new InvalidPipeArgumentError(UpperCasePipe, value);\n }\n return value.toUpperCase();\n };\n UpperCasePipe.decorators = [\n { type: _angular_core.Pipe, args: [{ name: 'uppercase' },] },\n ];\n /** @nocollapse */\n UpperCasePipe.ctorParameters = function () { return []; };\n return UpperCasePipe;\n }());\n\n /**\n * A collection of Angular pipes that are likely to be used in each and every application.\n */\n var /** @type {?} */ COMMON_PIPES = [\n AsyncPipe,\n UpperCasePipe,\n LowerCasePipe,\n JsonPipe,\n SlicePipe,\n DecimalPipe,\n PercentPipe,\n CurrencyPipe,\n DatePipe,\n I18nPluralPipe,\n I18nSelectPipe,\n ];\n\n /**\n * The module that includes all the basic Angular directives like {@link NgIf}, {@link NgFor}, ...\n * *\n */\n var CommonModule = (function () {\n function CommonModule() {\n }\n CommonModule.decorators = [\n { type: _angular_core.NgModule, args: [{\n declarations: [COMMON_DIRECTIVES, COMMON_PIPES],\n exports: [COMMON_DIRECTIVES, COMMON_PIPES],\n providers: [\n { provide: NgLocalization, useClass: NgLocaleLocalization },\n ],\n },] },\n ];\n /** @nocollapse */\n CommonModule.ctorParameters = function () { return []; };\n return CommonModule;\n }());\n\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new _angular_core.Version('2.4.1');\n\n exports.NgLocalization = NgLocalization;\n exports.CommonModule = CommonModule;\n exports.NgClass = NgClass;\n exports.NgFor = NgFor;\n exports.NgIf = NgIf;\n exports.NgPlural = NgPlural;\n exports.NgPluralCase = NgPluralCase;\n exports.NgStyle = NgStyle;\n exports.NgSwitch = NgSwitch;\n exports.NgSwitchCase = NgSwitchCase;\n exports.NgSwitchDefault = NgSwitchDefault;\n exports.NgTemplateOutlet = NgTemplateOutlet;\n exports.AsyncPipe = AsyncPipe;\n exports.DatePipe = DatePipe;\n exports.I18nPluralPipe = I18nPluralPipe;\n exports.I18nSelectPipe = I18nSelectPipe;\n exports.JsonPipe = JsonPipe;\n exports.LowerCasePipe = LowerCasePipe;\n exports.CurrencyPipe = CurrencyPipe;\n exports.DecimalPipe = DecimalPipe;\n exports.PercentPipe = PercentPipe;\n exports.SlicePipe = SlicePipe;\n exports.UpperCasePipe = UpperCasePipe;\n exports.VERSION = VERSION;\n exports.Version = _angular_core.Version;\n exports.PlatformLocation = PlatformLocation;\n exports.LocationStrategy = LocationStrategy;\n exports.APP_BASE_HREF = APP_BASE_HREF;\n exports.HashLocationStrategy = HashLocationStrategy;\n exports.PathLocationStrategy = PathLocationStrategy;\n exports.Location = Location;\n\n}));\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L0Bhbmd1bGFyL2NvbW1vbi9idW5kbGVzL2NvbW1vbi51bWQuanM/ZDk4MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjIuNC4xXG4gKiAoYykgMjAxMC0yMDE2IEdvb2dsZSwgSW5jLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKSkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnQGFuZ3VsYXIvY29yZSddLCBmYWN0b3J5KSA6XG4gICAgKGZhY3RvcnkoKGdsb2JhbC5uZyA9IGdsb2JhbC5uZyB8fCB7fSwgZ2xvYmFsLm5nLmNvbW1vbiA9IGdsb2JhbC5uZy5jb21tb24gfHwge30pLGdsb2JhbC5uZy5jb3JlKSk7XG59KHRoaXMsIGZ1bmN0aW9uIChleHBvcnRzLF9hbmd1bGFyX2NvcmUpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyoqXG4gICAgICogIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uIGRldmVsb3Blci4gSW5zdGVhZCwgdXNlXG4gICAgICAqIHtAbGluayBMb2NhdGlvbn0uXG4gICAgICAqICpcbiAgICAgICogYFBsYXRmb3JtTG9jYXRpb25gIGVuY2Fwc3VsYXRlcyBhbGwgY2FsbHMgdG8gRE9NIGFwaXMsIHdoaWNoIGFsbG93cyB0aGUgUm91dGVyIHRvIGJlIHBsYXRmb3JtXG4gICAgICAqIGFnbm9zdGljLlxuICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIGBQbGF0Zm9ybUxvY2F0aW9uYCBmb3IgdGhlIGRpZmZlcmVudFxuICAgICAgKiBwbGF0Zm9ybXNcbiAgICAgICogdGhhdCBhbmd1bGFyIHN1cHBvcnRzLiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgYFBsYXRmb3JtTG9jYXRpb25gIGlzIHtAbGlua1xuICAgICAgKiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbn0sXG4gICAgICAqIGhvd2V2ZXIgd2hlbiB5b3UgcnVuIHlvdXIgYXBwIGluIGEgV2ViV29ya2VyIHlvdSB1c2Uge0BsaW5rIFdlYldvcmtlclBsYXRmb3JtTG9jYXRpb259LlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAgY2xhc3MgaXMgdXNlZCBkaXJlY3RseSBieSBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fVxuICAgICAgKiB3aGVuXG4gICAgICAqIHRoZXkgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBET00gYXBpcyBsaWtlIHB1c2hTdGF0ZSwgcG9wU3RhdGUsIGV0Yy4uLlxuICAgICAgKiAqXG4gICAgICAqIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBpbiB0dXJuIGlzIHVzZWQgYnkgdGhlIHtAbGluayBMb2NhdGlvbn0gc2VydmljZSB3aGljaCBpcyB1c2VkIGRpcmVjdGx5XG4gICAgICAqIGJ5XG4gICAgICAqIHRoZSB7QGxpbmsgUm91dGVyfSBpbiBvcmRlciB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHJvdXRlcy4gU2luY2UgYWxsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHtAbGlua1xuICAgICAgKiBSb3V0ZXJ9IC9cbiAgICAgICoge0BsaW5rIExvY2F0aW9ufSAvIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBhbmQgRE9NIGFwaXMgZmxvdyB0aHJvdWdoIHRoZSBgUGxhdGZvcm1Mb2NhdGlvbmBcbiAgICAgICogY2xhc3NcbiAgICAgICogdGhleSBhcmUgYWxsIHBsYXRmb3JtIGluZGVwZW5kZW50LlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIFBsYXRmb3JtTG9jYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBQbGF0Zm9ybUxvY2F0aW9uKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLmdldEJhc2VIcmVmRnJvbURPTSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5vblBvcFN0YXRlID0gZnVuY3Rpb24gKGZuKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUub25IYXNoQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7IH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZSwgXCJwYXRobmFtZVwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZSwgXCJzZWFyY2hcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwiaGFzaFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0gez99IHRpdGxlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5yZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGl0bGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5iYWNrID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICByZXR1cm4gUGxhdGZvcm1Mb2NhdGlvbjtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogIGBMb2NhdGlvblN0cmF0ZWd5YCBpcyByZXNwb25zaWJsZSBmb3IgcmVwcmVzZW50aW5nIGFuZCByZWFkaW5nIHJvdXRlIHN0YXRlXG4gICAgICAqIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuIEFuZ3VsYXIgcHJvdmlkZXMgdHdvIHN0cmF0ZWdpZXM6XG4gICAgICAqIHtAbGluayBIYXNoTG9jYXRpb25TdHJhdGVneX0gYW5kIHtAbGluayBQYXRoTG9jYXRpb25TdHJhdGVneX0uXG4gICAgICAqICpcbiAgICAgICogVGhpcyBpcyB1c2VkIHVuZGVyIHRoZSBob29kIG9mIHRoZSB7QGxpbmsgTG9jYXRpb259IHNlcnZpY2UuXG4gICAgICAqICpcbiAgICAgICogQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIHtAbGluayBSb3V0ZXJ9IG9yIHtAbGluayBMb2NhdGlvbn0gc2VydmljZXMgdG9cbiAgICAgICogaW50ZXJhY3Qgd2l0aCBhcHBsaWNhdGlvbiByb3V0ZSBzdGF0ZS5cbiAgICAgICogKlxuICAgICAgKiBGb3IgaW5zdGFuY2UsIHtAbGluayBIYXNoTG9jYXRpb25TdHJhdGVneX0gcHJvZHVjZXMgVVJMcyBsaWtlXG4gICAgICAqIGBodHRwOi8vZXhhbXBsZS5jb20jL2Zvb2AsIGFuZCB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9IHByb2R1Y2VzXG4gICAgICAqIGBodHRwOi8vZXhhbXBsZS5jb20vZm9vYCBhcyBhbiBlcXVpdmFsZW50IFVSTC5cbiAgICAgICogKlxuICAgICAgKiBTZWUgdGhlc2UgdHdvIGNsYXNzZXMgZm9yIG1vcmUuXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgTG9jYXRpb25TdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIExvY2F0aW9uU3RyYXRlZ3koKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez89fSBpbmNsdWRlSGFzaFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIChpbmNsdWRlSGFzaCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJuYWxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnByZXBhcmVFeHRlcm5hbFVybCA9IGZ1bmN0aW9uIChpbnRlcm5hbCkgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGFic3RyYWN0XG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aXRsZVxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0gez99IHRpdGxlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCwgcXVlcnlQYXJhbXMpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuYmFjayA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5vblBvcFN0YXRlID0gZnVuY3Rpb24gKGZuKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLmdldEJhc2VIcmVmID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICByZXR1cm4gTG9jYXRpb25TdHJhdGVneTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqIFRoZSBgQVBQX0JBU0VfSFJFRmAgdG9rZW4gcmVwcmVzZW50cyB0aGUgYmFzZSBocmVmIHRvIGJlIHVzZWQgd2l0aCB0aGVcbiAgICAgKiB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9LlxuICAgICAqXG4gICAgICogSWYgeW91J3JlIHVzaW5nIHtAbGluayBQYXRoTG9jYXRpb25TdHJhdGVneX0sIHlvdSBtdXN0IHByb3ZpZGUgYSBwcm92aWRlciB0byBhIHN0cmluZ1xuICAgICAqIHJlcHJlc2VudGluZyB0aGUgVVJMIHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBnZW5lcmF0aW5nIGFuZCByZWNvZ25pemluZ1xuICAgICAqIFVSTHMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGltcG9ydCB7Q29tcG9uZW50LCBOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gICAgICogaW1wb3J0IHtBUFBfQkFTRV9IUkVGfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuICAgICAqXG4gICAgICogQE5nTW9kdWxlKHtcbiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBBUFBfQkFTRV9IUkVGLCB1c2VWYWx1ZTogJy9teS9hcHAnfV1cbiAgICAgKiB9KVxuICAgICAqIGNsYXNzIEFwcE1vZHVsZSB7fVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHN0YWJsZVxuICAgICAqL1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEFQUF9CQVNFX0hSRUYgPSBuZXcgX2FuZ3VsYXJfY29yZS5PcGFxdWVUb2tlbignYXBwQmFzZUhyZWYnKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBnbG9iYWxTY29wZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIGFueSB3aXRoIFdvcmtlckdsb2JhbFNjb3BlIGZyb20gbGliLndlYndvcmtlci5kLnRzICMzNDkyXG4gICAgICAgICAgICBnbG9iYWxTY29wZSA9IChzZWxmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbFNjb3BlID0gKGdsb2JhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdsb2JhbFNjb3BlID0gKHdpbmRvdyk7XG4gICAgfVxuICAgIC8vIE5lZWQgdG8gZGVjbGFyZSBhIG5ldyB2YXJpYWJsZSBmb3IgZ2xvYmFsIGhlcmUgc2luY2UgVHlwZVNjcmlwdFxuICAgIC8vIGV4cG9ydHMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX2dsb2JhbCA9IGdsb2JhbFNjb3BlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdHlwZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcodHlwZSkge1xuICAgICAgICByZXR1cm4gdHlwZVsnbmFtZSddIHx8IHR5cGVvZiB0eXBlO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmUgY2FsbHMgdG8gYXNzZXJ0IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAgICAvLyBOb3RlOiBDYW4ndCBqdXN0IGV4cG9ydCB0aGlzIGFuZCBpbXBvcnQgaW4gaW4gb3RoZXIgZmlsZXNcbiAgICAvLyBhcyBgYXNzZXJ0YCBpcyBhIHJlc2VydmVkIGtleXdvcmQgaW4gRGFydFxuICAgIF9nbG9iYWwuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbikge1xuICAgICAgICAvLyBUT0RPOiB0byBiZSBmaXhlZCBwcm9wZXJseSB2aWEgIzI4MzAsIG5vb3AgZm9yIG5vd1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBvYmpcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUHJlc2VudChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbGFuayhvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiA9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNEYXRlKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4ob2JqLnZhbHVlT2YoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdG9rZW5cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeSh0b2tlbikge1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgdG9rZW4ub3ZlcnJpZGRlbk5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgdG9rZW4ubmFtZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB0b2tlbi50b1N0cmluZygpO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdMaW5lSW5kZXggPSByZXMuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIHJldHVybiBuZXdMaW5lSW5kZXggPT09IC0xID8gcmVzIDogcmVzLnN1YnN0cmluZygwLCBuZXdMaW5lSW5kZXgpO1xuICAgIH1cbiAgICB2YXIgTnVtYmVyV3JhcHBlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIE51bWJlcldyYXBwZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGV4dFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTnVtYmVyV3JhcHBlci5wYXJzZUludEF1dG9SYWRpeCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBwYXJzZUludCh0ZXh0KTtcbiAgICAgICAgICAgIGlmIChpc05hTihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGludGVnZXIgbGl0ZXJhbCB3aGVuIHBhcnNpbmcgJyArIHRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE51bWJlcldyYXBwZXIuaXNOdW1lcmljID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhaXNOYU4odmFsdWUgLSBwYXJzZUZsb2F0KHZhbHVlKSk7IH07XG4gICAgICAgIHJldHVybiBOdW1iZXJXcmFwcGVyO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBvXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0pzT2JqZWN0KG8pIHtcbiAgICAgICAgcmV0dXJuIG8gIT09IG51bGwgJiYgKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvID09PSAnb2JqZWN0Jyk7XG4gICAgfVxuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9zeW1ib2xJdGVyYXRvciA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvcigpIHtcbiAgICAgICAgaWYgKCFfc3ltYm9sSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGlmICgoKGdsb2JhbFNjb3BlKSkuU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcikge1xuICAgICAgICAgICAgICAgIF9zeW1ib2xJdGVyYXRvciA9IFN5bWJvbC5pdGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzNi1zaGltIHNwZWNpZmljIGxvZ2ljXG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE1hcC5wcm90b3R5cGUpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKChNYXApKS5wcm90b3R5cGVba2V5XSA9PT0gTWFwLnByb3RvdHlwZVsnZW50cmllcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc3ltYm9sSXRlcmF0b3IgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGVwZW5kaW5nIG9uIHdoaWNoIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBpcyB1c2VkLCBgTG9jYXRpb25gIHdpbGwgZWl0aGVyIHBlcnNpc3RcbiAgICAgICogdG8gdGhlIFVSTCdzIHBhdGggb3IgdGhlIFVSTCdzIGhhc2ggc2VnbWVudC5cbiAgICAgICogKlxuICAgICAgKiBOb3RlOiBpdCdzIGJldHRlciB0byB1c2Uge0BsaW5rIFJvdXRlciNuYXZpZ2F0ZX0gc2VydmljZSB0byB0cmlnZ2VyIHJvdXRlIGNoYW5nZXMuIFVzZVxuICAgICAgKiBgTG9jYXRpb25gIG9ubHkgaWYgeW91IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBvciBjcmVhdGUgbm9ybWFsaXplZCBVUkxzIG91dHNpZGUgb2ZcbiAgICAgICogcm91dGluZy5cbiAgICAgICogKlxuICAgICAgKiBgTG9jYXRpb25gIGlzIHJlc3BvbnNpYmxlIGZvciBub3JtYWxpemluZyB0aGUgVVJMIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBocmVmLlxuICAgICAgKiBBIG5vcm1hbGl6ZWQgVVJMIGlzIGFic29sdXRlIGZyb20gdGhlIFVSTCBob3N0LCBpbmNsdWRlcyB0aGUgYXBwbGljYXRpb24ncyBiYXNlIGhyZWYsIGFuZCBoYXMgbm9cbiAgICAgICogdHJhaWxpbmcgc2xhc2g6XG4gICAgICAqIC0gYC9teS9hcHAvdXNlci8xMjNgIGlzIG5vcm1hbGl6ZWRcbiAgICAgICogLSBgbXkvYXBwL3VzZXIvMTIzYCAqKmlzIG5vdCoqIG5vcm1hbGl6ZWRcbiAgICAgICogLSBgL215L2FwcC91c2VyLzEyMy9gICoqaXMgbm90Kiogbm9ybWFsaXplZFxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvcGF0aF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9XG4gICAgICovXG4gICAgdmFyIExvY2F0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm1TdHJhdGVneVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTG9jYXRpb24ocGxhdGZvcm1TdHJhdGVneSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSBuZXcgX2FuZ3VsYXJfY29yZS5FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kgPSBwbGF0Zm9ybVN0cmF0ZWd5O1xuICAgICAgICAgICAgdmFyIGJyb3dzZXJCYXNlSHJlZiA9IHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuZ2V0QmFzZUhyZWYoKTtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gTG9jYXRpb24uc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEluZGV4SHRtbChicm93c2VyQmFzZUhyZWYpKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kub25Qb3BTdGF0ZShmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fc3ViamVjdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgJ3VybCc6IF90aGlzLnBhdGgodHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICdwb3AnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAndHlwZSc6IGV2LnR5cGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUhhc2hcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uLnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gKGluY2x1ZGVIYXNoKSB7XG4gICAgICAgICAgICBpZiAoaW5jbHVkZUhhc2ggPT09IHZvaWQgMCkgeyBpbmNsdWRlSGFzaCA9IGZhbHNlOyB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKGluY2x1ZGVIYXNoKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgTm9ybWFsaXplcyB0aGUgZ2l2ZW4gcGF0aCBhbmQgY29tcGFyZXMgdG8gdGhlIGN1cnJlbnQgbm9ybWFsaXplZCBwYXRoLlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcXVlcnlcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uLnByb3RvdHlwZS5pc0N1cnJlbnRQYXRoRXF1YWxUbyA9IGZ1bmN0aW9uIChwYXRoLCBxdWVyeSkge1xuICAgICAgICAgICAgaWYgKHF1ZXJ5ID09PSB2b2lkIDApIHsgcXVlcnkgPSAnJzsgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGF0aCgpID09IHRoaXMubm9ybWFsaXplKHBhdGggKyBMb2NhdGlvbi5ub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeSkpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTCwgcmV0dXJucyB0aGUgbm9ybWFsaXplZCBVUkwgcGF0aCB3aXRob3V0IGxlYWRpbmcgb3JcbiAgICAgICAgICAqIHRyYWlsaW5nIHNsYXNoZXMuXG4gICAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvbi5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgcmV0dXJuIExvY2F0aW9uLnN0cmlwVHJhaWxpbmdTbGFzaChfc3RyaXBCYXNlSHJlZih0aGlzLl9iYXNlSHJlZiwgX3N0cmlwSW5kZXhIdG1sKHVybCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBHaXZlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwsIHJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGV4dGVybmFsIFVSTCBwYXRoLlxuICAgICAgICAgICogSWYgdGhlIGdpdmVuIFVSTCBkb2Vzbid0IGJlZ2luIHdpdGggYSBsZWFkaW5nIHNsYXNoIChgJy8nYCksIHRoaXMgbWV0aG9kIGFkZHMgb25lXG4gICAgICAgICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhZGQgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXNcbiAgICAgICAgICAqIHVzZWQsIG9yIHRoZSBgQVBQX0JBU0VfSFJFRmAgaWYgdGhlIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgaW4gdXNlLlxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG9jYXRpb24ucHJvdG90eXBlLnByZXBhcmVFeHRlcm5hbFVybCA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgIGlmICh1cmwgJiYgdXJsWzBdICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSAnLycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDaGFuZ2VzIHRoZSBicm93c2VycyBVUkwgdG8gdGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gVVJMLCBhbmQgcHVzaGVzIGFcbiAgICAgICAgICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS5cbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IHF1ZXJ5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvbi5wcm90b3R5cGUuZ28gPSBmdW5jdGlvbiAocGF0aCwgcXVlcnkpIHtcbiAgICAgICAgICAgIGlmIChxdWVyeSA9PT0gdm9pZCAwKSB7IHF1ZXJ5ID0gJyc7IH1cbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucHVzaFN0YXRlKG51bGwsICcnLCBwYXRoLCBxdWVyeSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ2hhbmdlcyB0aGUgYnJvd3NlcnMgVVJMIHRvIHRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIFVSTCwgYW5kIHJlcGxhY2VzXG4gICAgICAgICAgKiB0aGUgdG9wIGl0ZW0gb24gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeSBzdGFjay5cbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IHF1ZXJ5XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvbi5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHBhdGgsIHF1ZXJ5KSB7XG4gICAgICAgICAgICBpZiAocXVlcnkgPT09IHZvaWQgMCkgeyBxdWVyeSA9ICcnOyB9XG4gICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgcGF0aCwgcXVlcnkpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIE5hdmlnYXRlcyBmb3J3YXJkIGluIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvbi5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5mb3J3YXJkKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgTmF2aWdhdGVzIGJhY2sgaW4gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uLnByb3RvdHlwZS5iYWNrID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LmJhY2soKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBTdWJzY3JpYmUgdG8gdGhlIHBsYXRmb3JtJ3MgYHBvcFN0YXRlYCBldmVudHMuXG4gICAgICAgICAqIEBwYXJhbSB7P30gb25OZXh0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9uVGhyb3dcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb25SZXR1cm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAob25OZXh0LCBvblRocm93LCBvblJldHVybikge1xuICAgICAgICAgICAgaWYgKG9uVGhyb3cgPT09IHZvaWQgMCkgeyBvblRocm93ID0gbnVsbDsgfVxuICAgICAgICAgICAgaWYgKG9uUmV0dXJuID09PSB2b2lkIDApIHsgb25SZXR1cm4gPSBudWxsOyB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUoeyBuZXh0OiBvbk5leHQsIGVycm9yOiBvblRocm93LCBjb21wbGV0ZTogb25SZXR1cm4gfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgR2l2ZW4gYSBzdHJpbmcgb2YgdXJsIHBhcmFtZXRlcnMsIHByZXBlbmQgd2l0aCAnPycgaWYgbmVlZGVkLCBvdGhlcndpc2UgcmV0dXJuIHBhcmFtZXRlcnMgYXNcbiAgICAgICAgICAqIGlzLlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zICYmIHBhcmFtc1swXSAhPT0gJz8nID8gJz8nICsgcGFyYW1zIDogcGFyYW1zO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIEdpdmVuIDIgcGFydHMgb2YgYSB1cmwsIGpvaW4gdGhlbSB3aXRoIGEgc2xhc2ggaWYgbmVlZGVkLlxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgICAqIEBwYXJhbSB7P30gZW5kXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBMb2NhdGlvbi5qb2luV2l0aFNsYXNoID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGlmIChzdGFydC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2xhc2hlcyA9IDA7XG4gICAgICAgICAgICBpZiAoc3RhcnQuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHNsYXNoZXMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgc2xhc2hlcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNsYXNoZXMgPT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIGVuZC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2xhc2hlcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIElmIHVybCBoYXMgYSB0cmFpbGluZyBzbGFzaCwgcmVtb3ZlIGl0LCBvdGhlcndpc2UgcmV0dXJuIHVybCBhcyBpcy5cbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIExvY2F0aW9uLnN0cmlwVHJhaWxpbmdTbGFzaCA9IGZ1bmN0aW9uICh1cmwpIHsgcmV0dXJuIHVybC5yZXBsYWNlKC9cXC8kLywgJycpOyB9O1xuICAgICAgICBMb2NhdGlvbi5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIExvY2F0aW9uLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBMb2NhdGlvblN0cmF0ZWd5LCB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gTG9jYXRpb247XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGJhc2VIcmVmXG4gICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9zdHJpcEJhc2VIcmVmKGJhc2VIcmVmLCB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VIcmVmICYmIHVybC5zdGFydHNXaXRoKGJhc2VIcmVmKSA/IHVybC5zdWJzdHJpbmcoYmFzZUhyZWYubGVuZ3RoKSA6IHVybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9zdHJpcEluZGV4SHRtbCh1cmwpIHtcbiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXC9pbmRleC5odG1sJC8sICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqICBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgIGlzIGEge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICAgICAgKiB7QGxpbmsgTG9jYXRpb259IHNlcnZpY2UgdG8gcmVwcmVzZW50IGl0cyBzdGF0ZSBpbiB0aGVcbiAgICAgICogW2hhc2ggZnJhZ21lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpXG4gICAgICAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLlxuICAgICAgKiAqXG4gICAgICAqIEZvciBpbnN0YW5jZSwgaWYgeW91IGNhbGwgYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZVxuICAgICAgKiBgZXhhbXBsZS5jb20jL2Zvb2AuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL2xvY2F0aW9uL3RzL2hhc2hfbG9jYXRpb25fY29tcG9uZW50LnRzIHJlZ2lvbj0nTG9jYXRpb25Db21wb25lbnQnfVxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEhhc2hMb2NhdGlvblN0cmF0ZWd5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKEhhc2hMb2NhdGlvblN0cmF0ZWd5LCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm1Mb2NhdGlvblxuICAgICAgICAgKiBAcGFyYW0gez89fSBfYmFzZUhyZWZcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEhhc2hMb2NhdGlvblN0cmF0ZWd5KF9wbGF0Zm9ybUxvY2F0aW9uLCBfYmFzZUhyZWYpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uO1xuICAgICAgICAgICAgdGhpcy5fYmFzZUhyZWYgPSAnJztcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQoX2Jhc2VIcmVmKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gX2Jhc2VIcmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUub25Qb3BTdGF0ZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vblBvcFN0YXRlKGZuKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKGZuKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuZ2V0QmFzZUhyZWYgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9iYXNlSHJlZjsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGluY2x1ZGVIYXNoXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIChpbmNsdWRlSGFzaCkge1xuICAgICAgICAgICAgaWYgKGluY2x1ZGVIYXNoID09PSB2b2lkIDApIHsgaW5jbHVkZUhhc2ggPSBmYWxzZTsgfVxuICAgICAgICAgICAgLy8gdGhlIGhhc2ggdmFsdWUgaXMgYWx3YXlzIHByZWZpeGVkIHdpdGggYSBgI2BcbiAgICAgICAgICAgIC8vIGFuZCBpZiBpdCBpcyBlbXB0eSB0aGVuIGl0IHdpbGwgc3RheSBlbXB0eVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGF0aCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDtcbiAgICAgICAgICAgIGlmICghaXNQcmVzZW50KHBhdGgpKVxuICAgICAgICAgICAgICAgIHBhdGggPSAnIyc7XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gcGF0aC5zdWJzdHJpbmcoMSkgOiBwYXRoO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbnRlcm5hbFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnByZXBhcmVFeHRlcm5hbFVybCA9IGZ1bmN0aW9uIChpbnRlcm5hbCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsID0gTG9jYXRpb24uam9pbldpdGhTbGFzaCh0aGlzLl9iYXNlSHJlZiwgaW50ZXJuYWwpO1xuICAgICAgICAgICAgcmV0dXJuIHVybC5sZW5ndGggPiAwID8gKCcjJyArIHVybCkgOiB1cmw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGl0bGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEhhc2hMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCBwYXRoLCBxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIExvY2F0aW9uLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aXRsZVxuICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICAgICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEhhc2hMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuYmFjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCk7IH07XG4gICAgICAgIEhhc2hMb2NhdGlvblN0cmF0ZWd5LmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24sIH0sXG4gICAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5PcHRpb25hbCB9LCB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gSGFzaExvY2F0aW9uU3RyYXRlZ3k7XG4gICAgfShMb2NhdGlvblN0cmF0ZWd5KSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQxID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgYSB7QGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdXNlZCB0byBjb25maWd1cmUgdGhlXG4gICAgICAqIHtAbGluayBMb2NhdGlvbn0gc2VydmljZSB0byByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZVxuICAgICAgKiBbcGF0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkgb2YgdGhlXG4gICAgICAqIGJyb3dzZXIncyBVUkwuXG4gICAgICAqICpcbiAgICAgICogSWYgeW91J3JlIHVzaW5nIGBQYXRoTG9jYXRpb25TdHJhdGVneWAsIHlvdSBtdXN0IHByb3ZpZGUgYSB7QGxpbmsgQVBQX0JBU0VfSFJFRn1cbiAgICAgICogb3IgYWRkIGEgYmFzZSBlbGVtZW50IHRvIHRoZSBkb2N1bWVudC4gVGhpcyBVUkwgcHJlZml4IHRoYXQgd2lsbCBiZSBwcmVzZXJ2ZWRcbiAgICAgICogd2hlbiBnZW5lcmF0aW5nIGFuZCByZWNvZ25pemluZyBVUkxzLlxuICAgICAgKiAqXG4gICAgICAqIEZvciBpbnN0YW5jZSwgaWYgeW91IHByb3ZpZGUgYW4gYEFQUF9CQVNFX0hSRUZgIG9mIGAnL215L2FwcCdgIGFuZCBjYWxsXG4gICAgICAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWVcbiAgICAgICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLlxuICAgICAgKiAqXG4gICAgICAqIFNpbWlsYXJseSwgaWYgeW91IGFkZCBgPGJhc2UgaHJlZj0nL215L2FwcCcvPmAgdG8gdGhlIGRvY3VtZW50IGFuZCBjYWxsXG4gICAgICAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWVcbiAgICAgICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvbW1vbi9sb2NhdGlvbi90cy9wYXRoX2xvY2F0aW9uX2NvbXBvbmVudC50cyByZWdpb249J0xvY2F0aW9uQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBQYXRoTG9jYXRpb25TdHJhdGVneSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQxKFBhdGhMb2NhdGlvblN0cmF0ZWd5LCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm1Mb2NhdGlvblxuICAgICAgICAgKiBAcGFyYW0gez89fSBocmVmXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBQYXRoTG9jYXRpb25TdHJhdGVneShfcGxhdGZvcm1Mb2NhdGlvbiwgaHJlZikge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uID0gX3BsYXRmb3JtTG9jYXRpb247XG4gICAgICAgICAgICBpZiAoaXNCbGFuayhocmVmKSkge1xuICAgICAgICAgICAgICAgIGhyZWYgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQmxhbmsoaHJlZikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYXNlIGhyZWYgc2V0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQVBQX0JBU0VfSFJFRiB0b2tlbiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gaHJlZjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBmblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLm9uUG9wU3RhdGUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7XG4gICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLmdldEJhc2VIcmVmID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fYmFzZUhyZWY7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGludGVybmFsXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQYXRoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucHJlcGFyZUV4dGVybmFsVXJsID0gZnVuY3Rpb24gKGludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gTG9jYXRpb24uam9pbldpdGhTbGFzaCh0aGlzLl9iYXNlSHJlZiwgaW50ZXJuYWwpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUhhc2hcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gKGluY2x1ZGVIYXNoKSB7XG4gICAgICAgICAgICBpZiAoaW5jbHVkZUhhc2ggPT09IHZvaWQgMCkgeyBpbmNsdWRlSGFzaCA9IGZhbHNlOyB9XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXRobmFtZSA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUgK1xuICAgICAgICAgICAgICAgIExvY2F0aW9uLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGhhc2ggPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmhhc2g7XG4gICAgICAgICAgICByZXR1cm4gaGFzaCAmJiBpbmNsdWRlSGFzaCA/IFwiXCIgKyBwYXRobmFtZSArIGhhc2ggOiBwYXRobmFtZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB0aXRsZVxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQYXRoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucHVzaFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsLCBxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBMb2NhdGlvbi5ub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCBleHRlcm5hbFVybCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGl0bGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCwgcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQYXRoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuYmFjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCk7IH07XG4gICAgICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24sIH0sXG4gICAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5PcHRpb25hbCB9LCB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gUGF0aExvY2F0aW9uU3RyYXRlZ3k7XG4gICAgfShMb2NhdGlvblN0cmF0ZWd5KSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQyID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIE5nTG9jYWxpemF0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gTmdMb2NhbGl6YXRpb24oKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0xvY2FsaXphdGlvbi5wcm90b3R5cGUuZ2V0UGx1cmFsQ2F0ZWdvcnkgPSBmdW5jdGlvbiAodmFsdWUpIHsgfTtcbiAgICAgICAgcmV0dXJuIE5nTG9jYWxpemF0aW9uO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHBsdXJhbCBjYXRlZ29yeSBmb3IgYSBnaXZlbiB2YWx1ZS5cbiAgICAgICogLSBcIj12YWx1ZVwiIHdoZW4gdGhlIGNhc2UgZXhpc3RzLFxuICAgICAgKiAtIHRoZSBwbHVyYWwgY2F0ZWdvcnkgb3RoZXJ3aXNlXG4gICAgICAqICpcbiAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICogQHBhcmFtIHs/fSBjYXNlc1xuICAgICAqIEBwYXJhbSB7P30gbmdMb2NhbGl6YXRpb25cbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBjYXNlcywgbmdMb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gXCI9XCIgKyB2YWx1ZTtcbiAgICAgICAgaWYgKGNhc2VzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IG5nTG9jYWxpemF0aW9uLmdldFBsdXJhbENhdGVnb3J5KHZhbHVlKTtcbiAgICAgICAgaWYgKGNhc2VzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXNlcy5pbmRleE9mKCdvdGhlcicpID4gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBsdXJhbCBtZXNzYWdlIGZvdW5kIGZvciB2YWx1ZSBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHBsdXJhbCBjYXNlIGJhc2VkIG9uIHRoZSBsb2NhbGVcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ0xvY2FsZUxvY2FsaXphdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQyKE5nTG9jYWxlTG9jYWxpemF0aW9uLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbG9jYWxlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ0xvY2FsZUxvY2FsaXphdGlvbihfbG9jYWxlKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nTG9jYWxlTG9jYWxpemF0aW9uLnByb3RvdHlwZS5nZXRQbHVyYWxDYXRlZ29yeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGx1cmFsID0gZ2V0UGx1cmFsQ2FzZSh0aGlzLl9sb2NhbGUsIHZhbHVlKTtcbiAgICAgICAgICAgIHN3aXRjaCAocGx1cmFsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBQbHVyYWwuWmVybzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5PbmU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5Ud286XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5GZXc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZmV3JztcbiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5NYW55OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBOZ0xvY2FsZUxvY2FsaXphdGlvbi5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIE5nTG9jYWxlTG9jYWxpemF0aW9uLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0LCBhcmdzOiBbX2FuZ3VsYXJfY29yZS5MT0NBTEVfSUQsXSB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIE5nTG9jYWxlTG9jYWxpemF0aW9uO1xuICAgIH0oTmdMb2NhbGl6YXRpb24pKTtcbiAgICB2YXIgUGx1cmFsID0ge307XG4gICAgUGx1cmFsLlplcm8gPSAwO1xuICAgIFBsdXJhbC5PbmUgPSAxO1xuICAgIFBsdXJhbC5Ud28gPSAyO1xuICAgIFBsdXJhbC5GZXcgPSAzO1xuICAgIFBsdXJhbC5NYW55ID0gNDtcbiAgICBQbHVyYWwuT3RoZXIgPSA1O1xuICAgIFBsdXJhbFtQbHVyYWwuWmVyb10gPSBcIlplcm9cIjtcbiAgICBQbHVyYWxbUGx1cmFsLk9uZV0gPSBcIk9uZVwiO1xuICAgIFBsdXJhbFtQbHVyYWwuVHdvXSA9IFwiVHdvXCI7XG4gICAgUGx1cmFsW1BsdXJhbC5GZXddID0gXCJGZXdcIjtcbiAgICBQbHVyYWxbUGx1cmFsLk1hbnldID0gXCJNYW55XCI7XG4gICAgUGx1cmFsW1BsdXJhbC5PdGhlcl0gPSBcIk90aGVyXCI7XG4gICAgLyoqXG4gICAgICogIFJldHVybnMgdGhlIHBsdXJhbCBjYXNlIGJhc2VkIG9uIHRoZSBsb2NhbGVcbiAgICAgICogKlxuICAgICAqIEBwYXJhbSB7P30gbG9jYWxlXG4gICAgICogQHBhcmFtIHs/fSBuTGlrZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UGx1cmFsQ2FzZShsb2NhbGUsIG5MaWtlKSB7XG4gICAgICAgIC8vIFRPRE8odmljYik6IGxhenkgY29tcHV0ZVxuICAgICAgICBpZiAodHlwZW9mIG5MaWtlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbkxpa2UgPSBwYXJzZUludCgvKiogQHR5cGUgez99ICovIChuTGlrZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuID0gKG5MaWtlKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbkRlY2ltYWwgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2ID0gbkRlY2ltYWwubGVuZ3RoO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmID0gcGFyc2VJbnQobkRlY2ltYWwsIDEwKTtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdCA9IHBhcnNlSW50KG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/fDArJC9nLCAnJyksIDEwKSB8fCAwO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYW5nID0gbG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoIChsYW5nKSB7XG4gICAgICAgICAgICBjYXNlICdhZic6XG4gICAgICAgICAgICBjYXNlICdhc2EnOlxuICAgICAgICAgICAgY2FzZSAnYXonOlxuICAgICAgICAgICAgY2FzZSAnYmVtJzpcbiAgICAgICAgICAgIGNhc2UgJ2Jleic6XG4gICAgICAgICAgICBjYXNlICdiZyc6XG4gICAgICAgICAgICBjYXNlICdicngnOlxuICAgICAgICAgICAgY2FzZSAnY2UnOlxuICAgICAgICAgICAgY2FzZSAnY2dnJzpcbiAgICAgICAgICAgIGNhc2UgJ2Nocic6XG4gICAgICAgICAgICBjYXNlICdja2InOlxuICAgICAgICAgICAgY2FzZSAnZWUnOlxuICAgICAgICAgICAgY2FzZSAnZWwnOlxuICAgICAgICAgICAgY2FzZSAnZW8nOlxuICAgICAgICAgICAgY2FzZSAnZXMnOlxuICAgICAgICAgICAgY2FzZSAnZXUnOlxuICAgICAgICAgICAgY2FzZSAnZm8nOlxuICAgICAgICAgICAgY2FzZSAnZnVyJzpcbiAgICAgICAgICAgIGNhc2UgJ2dzdyc6XG4gICAgICAgICAgICBjYXNlICdoYSc6XG4gICAgICAgICAgICBjYXNlICdoYXcnOlxuICAgICAgICAgICAgY2FzZSAnaHUnOlxuICAgICAgICAgICAgY2FzZSAnamdvJzpcbiAgICAgICAgICAgIGNhc2UgJ2ptYyc6XG4gICAgICAgICAgICBjYXNlICdrYSc6XG4gICAgICAgICAgICBjYXNlICdrayc6XG4gICAgICAgICAgICBjYXNlICdra2onOlxuICAgICAgICAgICAgY2FzZSAna2wnOlxuICAgICAgICAgICAgY2FzZSAna3MnOlxuICAgICAgICAgICAgY2FzZSAna3NiJzpcbiAgICAgICAgICAgIGNhc2UgJ2t5JzpcbiAgICAgICAgICAgIGNhc2UgJ2xiJzpcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgICAgIGNhc2UgJ21hcyc6XG4gICAgICAgICAgICBjYXNlICdtZ28nOlxuICAgICAgICAgICAgY2FzZSAnbWwnOlxuICAgICAgICAgICAgY2FzZSAnbW4nOlxuICAgICAgICAgICAgY2FzZSAnbmInOlxuICAgICAgICAgICAgY2FzZSAnbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmUnOlxuICAgICAgICAgICAgY2FzZSAnbm4nOlxuICAgICAgICAgICAgY2FzZSAnbm5oJzpcbiAgICAgICAgICAgIGNhc2UgJ255bic6XG4gICAgICAgICAgICBjYXNlICdvbSc6XG4gICAgICAgICAgICBjYXNlICdvcic6XG4gICAgICAgICAgICBjYXNlICdvcyc6XG4gICAgICAgICAgICBjYXNlICdwcyc6XG4gICAgICAgICAgICBjYXNlICdybSc6XG4gICAgICAgICAgICBjYXNlICdyb2YnOlxuICAgICAgICAgICAgY2FzZSAncndrJzpcbiAgICAgICAgICAgIGNhc2UgJ3NhcSc6XG4gICAgICAgICAgICBjYXNlICdzZWgnOlxuICAgICAgICAgICAgY2FzZSAnc24nOlxuICAgICAgICAgICAgY2FzZSAnc28nOlxuICAgICAgICAgICAgY2FzZSAnc3EnOlxuICAgICAgICAgICAgY2FzZSAndGEnOlxuICAgICAgICAgICAgY2FzZSAndGUnOlxuICAgICAgICAgICAgY2FzZSAndGVvJzpcbiAgICAgICAgICAgIGNhc2UgJ3RrJzpcbiAgICAgICAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgICAgIGNhc2UgJ3VnJzpcbiAgICAgICAgICAgIGNhc2UgJ3V6JzpcbiAgICAgICAgICAgIGNhc2UgJ3ZvJzpcbiAgICAgICAgICAgIGNhc2UgJ3Z1bic6XG4gICAgICAgICAgICBjYXNlICd3YWUnOlxuICAgICAgICAgICAgY2FzZSAneG9nJzpcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2FncSc6XG4gICAgICAgICAgICBjYXNlICdiYXMnOlxuICAgICAgICAgICAgY2FzZSAnY3UnOlxuICAgICAgICAgICAgY2FzZSAnZGF2JzpcbiAgICAgICAgICAgIGNhc2UgJ2RqZSc6XG4gICAgICAgICAgICBjYXNlICdkdWEnOlxuICAgICAgICAgICAgY2FzZSAnZHlvJzpcbiAgICAgICAgICAgIGNhc2UgJ2VidSc6XG4gICAgICAgICAgICBjYXNlICdld28nOlxuICAgICAgICAgICAgY2FzZSAnZ3V6JzpcbiAgICAgICAgICAgIGNhc2UgJ2thbSc6XG4gICAgICAgICAgICBjYXNlICdraHEnOlxuICAgICAgICAgICAgY2FzZSAna2knOlxuICAgICAgICAgICAgY2FzZSAna2xuJzpcbiAgICAgICAgICAgIGNhc2UgJ2tvayc6XG4gICAgICAgICAgICBjYXNlICdrc2YnOlxuICAgICAgICAgICAgY2FzZSAnbHJjJzpcbiAgICAgICAgICAgIGNhc2UgJ2x1JzpcbiAgICAgICAgICAgIGNhc2UgJ2x1byc6XG4gICAgICAgICAgICBjYXNlICdsdXknOlxuICAgICAgICAgICAgY2FzZSAnbWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ21mZSc6XG4gICAgICAgICAgICBjYXNlICdtZ2gnOlxuICAgICAgICAgICAgY2FzZSAnbXVhJzpcbiAgICAgICAgICAgIGNhc2UgJ216bic6XG4gICAgICAgICAgICBjYXNlICdubWcnOlxuICAgICAgICAgICAgY2FzZSAnbnVzJzpcbiAgICAgICAgICAgIGNhc2UgJ3F1JzpcbiAgICAgICAgICAgIGNhc2UgJ3JuJzpcbiAgICAgICAgICAgIGNhc2UgJ3J3JzpcbiAgICAgICAgICAgIGNhc2UgJ3NicCc6XG4gICAgICAgICAgICBjYXNlICd0d3EnOlxuICAgICAgICAgICAgY2FzZSAndmFpJzpcbiAgICAgICAgICAgIGNhc2UgJ3lhdic6XG4gICAgICAgICAgICBjYXNlICd5dWUnOlxuICAgICAgICAgICAgY2FzZSAnemdoJzpcbiAgICAgICAgICAgIGNhc2UgJ2FrJzpcbiAgICAgICAgICAgIGNhc2UgJ2xuJzpcbiAgICAgICAgICAgIGNhc2UgJ21nJzpcbiAgICAgICAgICAgIGNhc2UgJ3BhJzpcbiAgICAgICAgICAgIGNhc2UgJ3RpJzpcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDAgJiYgbiA8PSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnYW0nOlxuICAgICAgICAgICAgY2FzZSAnYXMnOlxuICAgICAgICAgICAgY2FzZSAnYm4nOlxuICAgICAgICAgICAgY2FzZSAnZmEnOlxuICAgICAgICAgICAgY2FzZSAnZ3UnOlxuICAgICAgICAgICAgY2FzZSAnaGknOlxuICAgICAgICAgICAgY2FzZSAna24nOlxuICAgICAgICAgICAgY2FzZSAnbXInOlxuICAgICAgICAgICAgY2FzZSAnenUnOlxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IG4gPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdhcic6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICBpZiAobiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gOTkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnYXN0JzpcbiAgICAgICAgICAgIGNhc2UgJ2NhJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlJzpcbiAgICAgICAgICAgIGNhc2UgJ2VuJzpcbiAgICAgICAgICAgIGNhc2UgJ2V0JzpcbiAgICAgICAgICAgIGNhc2UgJ2ZpJzpcbiAgICAgICAgICAgIGNhc2UgJ2Z5JzpcbiAgICAgICAgICAgIGNhc2UgJ2dsJzpcbiAgICAgICAgICAgIGNhc2UgJ2l0JzpcbiAgICAgICAgICAgIGNhc2UgJ25sJzpcbiAgICAgICAgICAgIGNhc2UgJ3N2JzpcbiAgICAgICAgICAgIGNhc2UgJ3N3JzpcbiAgICAgICAgICAgIGNhc2UgJ3VyJzpcbiAgICAgICAgICAgIGNhc2UgJ3lpJzpcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnYmUnOlxuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDEgJiYgIShuICUgMTAwID09PSAxMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICAgICAhKG4gJSAxMDAgPj0gMTIgJiYgbiAlIDEwMCA8PSAxNCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDAgfHwgbiAlIDEwID09PSBNYXRoLmZsb29yKG4gJSAxMCkgJiYgbiAlIDEwID49IDUgJiYgbiAlIDEwIDw9IDkgfHxcbiAgICAgICAgICAgICAgICAgICAgbiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gMTQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnYnInOlxuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDEgJiYgIShuICUgMTAwID09PSAxMSB8fCBuICUgMTAwID09PSA3MSB8fCBuICUgMTAwID09PSA5MSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDIgJiYgIShuICUgMTAwID09PSAxMiB8fCBuICUgMTAwID09PSA3MiB8fCBuICUgMTAwID09PSA5MikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiAobiAlIDEwID49IDMgJiYgbiAlIDEwIDw9IDQgfHwgbiAlIDEwID09PSA5KSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG4gJSAxMDAgPj0gMTAgJiYgbiAlIDEwMCA8PSAxOSB8fCBuICUgMTAwID49IDcwICYmIG4gJSAxMDAgPD0gNzkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gJSAxMDAgPj0gOTAgJiYgbiAlIDEwMCA8PSA5OSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgICAgIGlmICghKG4gPT09IDApICYmIG4gJSAxZTYgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnYnMnOlxuICAgICAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICAgICAgY2FzZSAnc3InOlxuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSAmJiAhKGkgJSAxMDAgPT09IDExKSB8fCBmICUgMTAgPT09IDEgJiYgIShmICUgMTAwID09PSAxMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAyICYmIGkgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgICAgICEoaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KSB8fFxuICAgICAgICAgICAgICAgICAgICBmICUgMTAgPT09IE1hdGguZmxvb3IoZiAlIDEwKSAmJiBmICUgMTAgPj0gMiAmJiBmICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShmICUgMTAwID49IDEyICYmIGYgJSAxMDAgPD0gMTQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnY3MnOlxuICAgICAgICAgICAgY2FzZSAnc2snOlxuICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBNYXRoLmZsb29yKGkpICYmIGkgPj0gMiAmJiBpIDw9IDQgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICAgICAgaWYgKCEodiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnY3knOlxuICAgICAgICAgICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlplcm87XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuID09PSAyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gMylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnZGEnOlxuICAgICAgICAgICAgICAgIGlmIChuID09PSAxIHx8ICEodCA9PT0gMCkgJiYgKGkgPT09IDAgfHwgaSA9PT0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdkc2InOlxuICAgICAgICAgICAgY2FzZSAnaHNiJzpcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSAxIHx8IGYgJSAxMDAgPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMDAgPT09IDIgfHwgZiAlIDEwMCA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gTWF0aC5mbG9vcihpICUgMTAwKSAmJiBpICUgMTAwID49IDMgJiYgaSAlIDEwMCA8PSA0IHx8XG4gICAgICAgICAgICAgICAgICAgIGYgJSAxMDAgPT09IE1hdGguZmxvb3IoZiAlIDEwMCkgJiYgZiAlIDEwMCA+PSAzICYmIGYgJSAxMDAgPD0gNClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2ZmJzpcbiAgICAgICAgICAgIGNhc2UgJ2ZyJzpcbiAgICAgICAgICAgIGNhc2UgJ2h5JzpcbiAgICAgICAgICAgIGNhc2UgJ2thYic6XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2ZpbCc6XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgKGkgPT09IDEgfHwgaSA9PT0gMiB8fCBpID09PSAzKSB8fFxuICAgICAgICAgICAgICAgICAgICB2ID09PSAwICYmICEoaSAlIDEwID09PSA0IHx8IGkgJSAxMCA9PT0gNiB8fCBpICUgMTAgPT09IDkpIHx8XG4gICAgICAgICAgICAgICAgICAgICEodiA9PT0gMCkgJiYgIShmICUgMTAgPT09IDQgfHwgZiAlIDEwID09PSA2IHx8IGYgJSAxMCA9PT0gOSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdnYSc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuID09PSAyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDMgJiYgbiA8PSA2KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDcgJiYgbiA8PSAxMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdnZCc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDEgfHwgbiA9PT0gMTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuID09PSAyIHx8IG4gPT09IDEyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiAobiA+PSAzICYmIG4gPD0gMTAgfHwgbiA+PSAxMyAmJiBuIDw9IDE5KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2d2JzpcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgKGkgJSAxMDAgPT09IDAgfHwgaSAlIDEwMCA9PT0gMjAgfHwgaSAlIDEwMCA9PT0gNDAgfHwgaSAlIDEwMCA9PT0gNjAgfHwgaSAlIDEwMCA9PT0gODApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICBpZiAoISh2ID09PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdoZSc6XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDIgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgIShuID49IDAgJiYgbiA8PSAxMCkgJiYgbiAlIDEwID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2lzJzpcbiAgICAgICAgICAgICAgICBpZiAodCA9PT0gMCAmJiBpICUgMTAgPT09IDEgJiYgIShpICUgMTAwID09PSAxMSkgfHwgISh0ID09PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2tzaCc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2t3JzpcbiAgICAgICAgICAgIGNhc2UgJ25hcSc6XG4gICAgICAgICAgICBjYXNlICdzZSc6XG4gICAgICAgICAgICBjYXNlICdzbW4nOlxuICAgICAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgICAgICBpZiAobiA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2xhZyc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgICAgICBpZiAoKGkgPT09IDAgfHwgaSA9PT0gMSkgJiYgIShuID09PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ2x0JzpcbiAgICAgICAgICAgICAgICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAxMCA9PT0gTWF0aC5mbG9vcihuICUgMTApICYmIG4gJSAxMCA+PSAyICYmIG4gJSAxMCA8PSA5ICYmXG4gICAgICAgICAgICAgICAgICAgICEobiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICAgICAgaWYgKCEoZiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnbHYnOlxuICAgICAgICAgICAgY2FzZSAncHJnJzpcbiAgICAgICAgICAgICAgICBpZiAobiAlIDEwID09PSAwIHx8IG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5IHx8XG4gICAgICAgICAgICAgICAgICAgIHYgPT09IDIgJiYgZiAlIDEwMCA9PT0gTWF0aC5mbG9vcihmICUgMTAwKSAmJiBmICUgMTAwID49IDExICYmIGYgJSAxMDAgPD0gMTkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgICAgICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA9PT0gMTEpIHx8IHYgPT09IDIgJiYgZiAlIDEwID09PSAxICYmICEoZiAlIDEwMCA9PT0gMTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICEodiA9PT0gMikgJiYgZiAlIDEwID09PSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAnbWsnOlxuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSB8fCBmICUgMTAgPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdtdCc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmIChuID09PSAwIHx8IG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAyICYmIG4gJSAxMDAgPD0gMTApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgICAgIGlmIChuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxOSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdwbCc6XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDIgJiYgaSAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCAmJiAhKGkgPT09IDEpICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAwICYmIGkgJSAxMCA8PSAxIHx8XG4gICAgICAgICAgICAgICAgICAgIHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDUgJiYgaSAlIDEwIDw9IDkgfHxcbiAgICAgICAgICAgICAgICAgICAgdiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+PSAwICYmIG4gPD0gMiAmJiAhKG4gPT09IDIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAncm8nOlxuICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIGlmICghKHYgPT09IDApIHx8IG4gPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgIShuID09PSAxKSAmJiBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMSAmJiBuICUgMTAwIDw9IDE5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAgICAgY2FzZSAncnUnOlxuICAgICAgICAgICAgY2FzZSAndWsnOlxuICAgICAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSAmJiAhKGkgJSAxMDAgPT09IDExKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDIgJiYgaSAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgdiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gNSAmJiBpICUgMTAgPD0gOSB8fFxuICAgICAgICAgICAgICAgICAgICB2ID09PSAwICYmIGkgJSAxMDAgPT09IE1hdGguZmxvb3IoaSAlIDEwMCkgJiYgaSAlIDEwMCA+PSAxMSAmJiBpICUgMTAwIDw9IDE0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgICAgIGNhc2UgJ3NoaSc6XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgbiA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+PSAyICYmIG4gPD0gMTApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdzaSc6XG4gICAgICAgICAgICAgICAgaWYgKG4gPT09IDAgfHwgbiA9PT0gMSB8fCBpID09PSAwICYmIGYgPT09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICdzbCc6XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gTWF0aC5mbG9vcihpICUgMTAwKSAmJiBpICUgMTAwID49IDMgJiYgaSAlIDEwMCA8PSA0IHx8ICEodiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBjYXNlICd0em0nOlxuICAgICAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMCAmJiBuIDw9IDEgfHwgbiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDExICYmIG4gPD0gOTkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iaikge1xuICAgICAgICBpZiAoIWlzSnNPYmplY3Qob2JqKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fFxuICAgICAgICAgICAgKCEob2JqIGluc3RhbmNlb2YgTWFwKSAmJlxuICAgICAgICAgICAgICAgIGdldFN5bWJvbEl0ZXJhdG9yKCkgaW4gb2JqKTsgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPHNvbWUtZWxlbWVudCBbbmdDbGFzc109XCInZmlyc3Qgc2Vjb25kJ1wiPi4uLjwvc29tZS1lbGVtZW50PlxuICAgICAgKiAqXG4gICAgICAqIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPVwiWydmaXJzdCcsICdzZWNvbmQnXVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICAgICAgKiAqXG4gICAgICAqIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPVwieydmaXJzdCc6IHRydWUsICdzZWNvbmQnOiB0cnVlLCAndGhpcmQnOiBmYWxzZX1cIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogKlxuICAgICAgKiA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT1cInN0cmluZ0V4cHxhcnJheUV4cHxvYmpFeHBcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogKlxuICAgICAgKiBUaGUgQ1NTIGNsYXNzZXMgYXJlIHVwZGF0ZWQgYXMgZm9sbG93cywgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb246XG4gICAgICAqIC0gYHN0cmluZ2AgLSB0aGUgQ1NTIGNsYXNzZXMgbGlzdGVkIGluIHRoZSBzdHJpbmcgKHNwYWNlIGRlbGltaXRlZCkgYXJlIGFkZGVkLFxuICAgICAgKiAtIGBBcnJheWAgLSB0aGUgQ1NTIGNsYXNzZXMgZGVjbGFyZWQgYXMgQXJyYXkgZWxlbWVudHMgYXJlIGFkZGVkLFxuICAgICAgKiAtIGBPYmplY3RgIC0ga2V5cyBhcmUgQ1NTIGNsYXNzZXMgdGhhdCBnZXQgYWRkZWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgdmFsdWVcbiAgICAgICogZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlLCBvdGhlcndpc2UgdGhleSBhcmUgcmVtb3ZlZC5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ0NsYXNzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2l0ZXJhYmxlRGlmZmVyc1xuICAgICAgICAgKiBAcGFyYW0gez99IF9rZXlWYWx1ZURpZmZlcnNcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdFbFxuICAgICAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTmdDbGFzcyhfaXRlcmFibGVEaWZmZXJzLCBfa2V5VmFsdWVEaWZmZXJzLCBfbmdFbCwgX3JlbmRlcmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlcnMgPSBfaXRlcmFibGVEaWZmZXJzO1xuICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVEaWZmZXJzID0gX2tleVZhbHVlRGlmZmVycztcbiAgICAgICAgICAgIHRoaXMuX25nRWwgPSBfbmdFbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbENsYXNzZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdDbGFzcy5wcm90b3R5cGUsIFwia2xhc3NcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHZcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUluaXRpYWxDbGFzc2VzKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxDbGFzc2VzID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdi5zcGxpdCgvXFxzKy8pIDogW107XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3NlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nQ2xhc3MucHJvdG90eXBlLCBcIm5nQ2xhc3NcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHZcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhbnVwQ2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yYXdDbGFzcyA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYuc3BsaXQoL1xccysvKSA6IHY7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Jhd0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUodGhpcy5fcmF3Q2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZURpZmZlciA9IHRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0NsYXNzLnByb3RvdHlwZS5uZ0RvQ2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXRlcmFibGVEaWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFuZ2VzID0gdGhpcy5faXRlcmFibGVEaWZmZXIuZGlmZih0aGlzLl9yYXdDbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlJdGVyYWJsZUNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fa2V5VmFsdWVEaWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFuZ2VzID0gdGhpcy5fa2V5VmFsdWVEaWZmZXIuZGlmZih0aGlzLl9yYXdDbGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlLZXlWYWx1ZUNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByYXdDbGFzc1ZhbFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdDbGFzcy5wcm90b3R5cGUuX2NsZWFudXBDbGFzc2VzID0gZnVuY3Rpb24gKHJhd0NsYXNzVmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXMocmF3Q2xhc3NWYWwsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3NlcyhmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nQ2xhc3MucHJvdG90eXBlLl9hcHBseUtleVZhbHVlQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuIF90aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKTsgfSk7XG4gICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiBfdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0NsYXNzLnByb3RvdHlwZS5fYXBwbHlJdGVyYWJsZUNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQuaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5nQ2xhc3MgY2FuIG9ubHkgdG9nZ2xlIENTUyBjbGFzc2VzIGV4cHJlc3NlZCBhcyBzdHJpbmdzLCBnb3QgXCIgKyBzdHJpbmdpZnkocmVjb3JkLml0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuIF90aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQuaXRlbSwgZmFsc2UpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXNDbGVhbnVwXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0NsYXNzLnByb3RvdHlwZS5fYXBwbHlJbml0aWFsQ2xhc3NlcyA9IGZ1bmN0aW9uIChpc0NsZWFudXApIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChrbGFzcykgeyByZXR1cm4gX3RoaXMuX3RvZ2dsZUNsYXNzKGtsYXNzLCAhaXNDbGVhbnVwKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJhd0NsYXNzVmFsXG4gICAgICAgICAqIEBwYXJhbSB7P30gaXNDbGVhbnVwXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0NsYXNzLnByb3RvdHlwZS5fYXBwbHlDbGFzc2VzID0gZnVuY3Rpb24gKHJhd0NsYXNzVmFsLCBpc0NsZWFudXApIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBpZiAocmF3Q2xhc3NWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdDbGFzc1ZhbCkgfHwgcmF3Q2xhc3NWYWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgKChyYXdDbGFzc1ZhbCkpLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7IHJldHVybiBfdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsICFpc0NsZWFudXApOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJhd0NsYXNzVmFsKS5mb3JFYWNoKGZ1bmN0aW9uIChrbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChyYXdDbGFzc1ZhbFtrbGFzc10pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgIWlzQ2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3NcbiAgICAgICAgICogQHBhcmFtIHs/fSBlbmFibGVkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0NsYXNzLnByb3RvdHlwZS5fdG9nZ2xlQ2xhc3MgPSBmdW5jdGlvbiAoa2xhc3MsIGVuYWJsZWQpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBrbGFzcyA9IGtsYXNzLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChrbGFzcykge1xuICAgICAgICAgICAgICAgIGtsYXNzLnNwbGl0KC9cXHMrL2cpLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7IF90aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MoX3RoaXMuX25nRWwubmF0aXZlRWxlbWVudCwga2xhc3MsIGVuYWJsZWQpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgTmdDbGFzcy5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkRpcmVjdGl2ZSwgYXJnczogW3sgc2VsZWN0b3I6ICdbbmdDbGFzc10nIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgTmdDbGFzcy5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JdGVyYWJsZURpZmZlcnMsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuS2V5VmFsdWVEaWZmZXJzLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkVsZW1lbnRSZWYsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUmVuZGVyZXIsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIE5nQ2xhc3MucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAna2xhc3MnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0LCBhcmdzOiBbJ2NsYXNzJyxdIH0sXSxcbiAgICAgICAgICAgICduZ0NsYXNzJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBOZ0NsYXNzO1xuICAgIH0oKSk7XG5cbiAgICB2YXIgTmdGb3JSb3cgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSAkaW1wbGljaXRcbiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleFxuICAgICAgICAgKiBAcGFyYW0gez99IGNvdW50XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ0ZvclJvdygkaW1wbGljaXQsIGluZGV4LCBjb3VudCkge1xuICAgICAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAkaW1wbGljaXQ7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nRm9yUm93LnByb3RvdHlwZSwgXCJmaXJzdFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0ZvclJvdy5wcm90b3R5cGUsIFwibGFzdFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5jb3VudCAtIDE7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdGb3JSb3cucHJvdG90eXBlLCBcImV2ZW5cIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaW5kZXggJSAyID09PSAwOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nRm9yUm93LnByb3RvdHlwZSwgXCJvZGRcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICF0aGlzLmV2ZW47IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gTmdGb3JSb3c7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgVGhlIGBOZ0ZvcmAgZGlyZWN0aXZlIGluc3RhbnRpYXRlcyBhIHRlbXBsYXRlIG9uY2UgcGVyIGl0ZW0gZnJvbSBhbiBpdGVyYWJsZS4gVGhlIGNvbnRleHQgZm9yXG4gICAgICAqIGVhY2ggaW5zdGFudGlhdGVkIHRlbXBsYXRlIGluaGVyaXRzIGZyb20gdGhlIG91dGVyIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gbG9vcCB2YXJpYWJsZSBzZXRcbiAgICAgICogdG8gdGhlIGN1cnJlbnQgaXRlbSBmcm9tIHRoZSBpdGVyYWJsZS5cbiAgICAgICogKlxuICAgICAgKiAjIyMgTG9jYWwgVmFyaWFibGVzXG4gICAgICAqICpcbiAgICAgICogYE5nRm9yYCBwcm92aWRlcyBzZXZlcmFsIGV4cG9ydGVkIHZhbHVlcyB0aGF0IGNhbiBiZSBhbGlhc2VkIHRvIGxvY2FsIHZhcmlhYmxlczpcbiAgICAgICogKlxuICAgICAgKiAqIGBpbmRleGAgd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQgbG9vcCBpdGVyYXRpb24gZm9yIGVhY2ggdGVtcGxhdGUgY29udGV4dC5cbiAgICAgICogKiBgZmlyc3RgIHdpbGwgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGl0ZW0gaXMgdGhlIGZpcnN0IG9uZSBpbiB0aGVcbiAgICAgICogaXRlcmF0aW9uLlxuICAgICAgKiAqIGBsYXN0YCB3aWxsIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpdGVtIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGVcbiAgICAgICogaXRlcmF0aW9uLlxuICAgICAgKiAqIGBldmVuYCB3aWxsIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXRlbSBoYXMgYW4gZXZlbiBpbmRleC5cbiAgICAgICogKiBgb2RkYCB3aWxsIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXRlbSBoYXMgYW4gb2RkIGluZGV4LlxuICAgICAgKiAqXG4gICAgICAqICMjIyBDaGFuZ2UgUHJvcGFnYXRpb25cbiAgICAgICogKlxuICAgICAgKiBXaGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRlcmF0b3IgY2hhbmdlcywgYE5nRm9yYCBtYWtlcyB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvIHRoZSBET006XG4gICAgICAqICpcbiAgICAgICogKiBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQsIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgKiAqIFdoZW4gYW4gaXRlbSBpcyByZW1vdmVkLCBpdHMgdGVtcGxhdGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uXG4gICAgICAqICogV2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkLCB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlcyBhcmUgcmVvcmRlcmVkIGluIHRoZSBET00uXG4gICAgICAqICogT3RoZXJ3aXNlLCB0aGUgRE9NIGVsZW1lbnQgZm9yIHRoYXQgaXRlbSB3aWxsIHJlbWFpbiB0aGUgc2FtZS5cbiAgICAgICogKlxuICAgICAgKiBBbmd1bGFyIHVzZXMgb2JqZWN0IGlkZW50aXR5IHRvIHRyYWNrIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucyB3aXRoaW4gdGhlIGl0ZXJhdG9yIGFuZCByZXByb2R1Y2VcbiAgICAgICogdGhvc2UgY2hhbmdlcyBpbiB0aGUgRE9NLiBUaGlzIGhhcyBpbXBvcnRhbnQgaW1wbGljYXRpb25zIGZvciBhbmltYXRpb25zIGFuZCBhbnkgc3RhdGVmdWxcbiAgICAgICogY29udHJvbHNcbiAgICAgICogKHN1Y2ggYXMgYDxpbnB1dD5gIGVsZW1lbnRzIHdoaWNoIGFjY2VwdCB1c2VyIGlucHV0KSB0aGF0IGFyZSBwcmVzZW50LiBJbnNlcnRlZCByb3dzIGNhbiBiZVxuICAgICAgKiBhbmltYXRlZCBpbiwgZGVsZXRlZCByb3dzIGNhbiBiZSBhbmltYXRlZCBvdXQsIGFuZCB1bmNoYW5nZWQgcm93cyByZXRhaW4gYW55IHVuc2F2ZWQgc3RhdGUgc3VjaFxuICAgICAgKiBhcyB1c2VyIGlucHV0LlxuICAgICAgKiAqXG4gICAgICAqIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaWRlbnRpdGllcyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgdG8gY2hhbmdlIHdoaWxlIHRoZSBkYXRhIGRvZXMgbm90LlxuICAgICAgKiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGUgaXRlcmF0b3IgcHJvZHVjZWQgZnJvbSBhbiBSUEMgdG8gdGhlIHNlcnZlciwgYW5kIHRoYXRcbiAgICAgICogUlBDIGlzIHJlLXJ1bi4gRXZlbiBpZiB0aGUgZGF0YSBoYXNuJ3QgY2hhbmdlZCwgdGhlIHNlY29uZCByZXNwb25zZSB3aWxsIHByb2R1Y2Ugb2JqZWN0cyB3aXRoXG4gICAgICAqIGRpZmZlcmVudCBpZGVudGl0aWVzLCBhbmQgQW5ndWxhciB3aWxsIHRlYXIgZG93biB0aGUgZW50aXJlIERPTSBhbmQgcmVidWlsZCBpdCAoYXMgaWYgYWxsIG9sZFxuICAgICAgKiBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgYW5kIGFsbCBuZXcgZWxlbWVudHMgaW5zZXJ0ZWQpLiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gYW5kIHNob3VsZFxuICAgICAgKiBiZSBhdm9pZGVkIGlmIHBvc3NpYmxlLlxuICAgICAgKiAqXG4gICAgICAqIFRvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0cmFja2luZyBhbGdvcml0aG0sIGBOZ0ZvcmAgc3VwcG9ydHMgYHRyYWNrQnlgIG9wdGlvbi5cbiAgICAgICogYHRyYWNrQnlgIHRha2VzIGEgZnVuY3Rpb24gd2hpY2ggaGFzIHR3byBhcmd1bWVudHM6IGBpbmRleGAgYW5kIGBpdGVtYC5cbiAgICAgICogSWYgYHRyYWNrQnlgIGlzIGdpdmVuLCBBbmd1bGFyIHRyYWNrcyBjaGFuZ2VzIGJ5IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBTeW50YXhcbiAgICAgICogKlxuICAgICAgKiAtIGA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiPi4uLjwvbGk+YFxuICAgICAgKiAtIGA8bGkgdGVtcGxhdGU9XCJuZ0ZvciBsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCI+Li4uPC9saT5gXG4gICAgICAqICpcbiAgICAgICogV2l0aCBgPHRlbXBsYXRlPmAgZWxlbWVudDpcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPHRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cIml0ZW1zXCIgbGV0LWk9XCJpbmRleFwiIFtuZ0ZvclRyYWNrQnldPVwidHJhY2tCeUZuXCI+XG4gICAgICAqIDxsaT4uLi48L2xpPlxuICAgICAgKiA8L3RlbXBsYXRlPlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIFNlZSBhIFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0tWdVh4RHAwcWluR0R5bzMwN1FXP3A9cHJldmlldykgZm9yIGEgbW9yZSBkZXRhaWxlZFxuICAgICAgKiBleGFtcGxlLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIE5nRm9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlmZmVyc1xuICAgICAgICAgKiBAcGFyYW0gez99IF9jZHJcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE5nRm9yKF92aWV3Q29udGFpbmVyLCBfdGVtcGxhdGUsIF9kaWZmZXJzLCBfY2RyKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyID0gX3ZpZXdDb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IF90ZW1wbGF0ZTtcbiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVycztcbiAgICAgICAgICAgIHRoaXMuX2NkciA9IF9jZHI7XG4gICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvci5wcm90b3R5cGUsIFwibmdGb3JUcmFja0J5XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl90cmFja0J5Rm47IH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFja0J5IG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkIFwiICsgSlNPTi5zdHJpbmdpZnkoZm4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tCeUZuID0gZm47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nRm9yLnByb3RvdHlwZSwgXCJuZ0ZvclRlbXBsYXRlXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdGb3IucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICgnbmdGb3JPZicgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIC8vIFJlYWN0IG9uIG5nRm9yT2YgY2hhbmdlcyBvbmx5IG9uY2UgYWxsIGlucHV0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGNoYW5nZXNbJ25nRm9yT2YnXS5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKHRoaXMuX2NkciwgdGhpcy5uZ0ZvclRyYWNrQnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnXCIgKyB2YWx1ZSArIFwiJyBvZiB0eXBlICdcIiArIGdldFR5cGVOYW1lRm9yRGVidWdnaW5nKHZhbHVlKSArIFwiJy4gTmdGb3Igb25seSBzdXBwb3J0cyBiaW5kaW5nIHRvIEl0ZXJhYmxlcyBzdWNoIGFzIEFycmF5cy5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdGb3IucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5uZ0Zvck9mKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ0Zvci5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5zZXJ0VHVwbGVzID0gW107XG4gICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oZnVuY3Rpb24gKGl0ZW0sIGFkanVzdGVkUHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ucHJldmlvdXNJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXcgPSBfdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoX3RoaXMuX3RlbXBsYXRlLCBuZXcgTmdGb3JSb3cobnVsbCwgbnVsbCwgbnVsbCksIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHR1cGxlID0gbmV3IFJlY29yZFZpZXdUdXBsZShpdGVtLCB2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2godHVwbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50SW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdmlld0NvbnRhaW5lci5yZW1vdmUoYWRqdXN0ZWRQcmV2aW91c0luZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXcgPSBfdGhpcy5fdmlld0NvbnRhaW5lci5nZXQoYWRqdXN0ZWRQcmV2aW91c0luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3ZpZXdDb250YWluZXIubW92ZSh2aWV3LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0dXBsZSA9IG5ldyBSZWNvcmRWaWV3VHVwbGUoaXRlbSwgLyoqIEB0eXBlIHs/fSAqLyAodmlldykpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRUdXBsZXMucHVzaCh0dXBsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVyVmlld0NoYW5nZShpbnNlcnRUdXBsZXNbaV0udmlldywgaW5zZXJ0VHVwbGVzW2ldLnJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwLCAvKiogQHR5cGUgez99ICovIGlsZW4gPSB0aGlzLl92aWV3Q29udGFpbmVyLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZpZXdSZWYgPSAodGhpcy5fdmlld0NvbnRhaW5lci5nZXQoaSkpO1xuICAgICAgICAgICAgICAgIHZpZXdSZWYuY29udGV4dC5pbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LmNvdW50ID0gaWxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3UmVmID0gKF90aGlzLl92aWV3Q29udGFpbmVyLmdldChyZWNvcmQuY3VycmVudEluZGV4KSk7XG4gICAgICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nRm9yLnByb3RvdHlwZS5fcGVyVmlld0NoYW5nZSA9IGZ1bmN0aW9uICh2aWV3LCByZWNvcmQpIHtcbiAgICAgICAgICAgIHZpZXcuY29udGV4dC4kaW1wbGljaXQgPSByZWNvcmQuaXRlbTtcbiAgICAgICAgfTtcbiAgICAgICAgTmdGb3IuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW25nRm9yXVtuZ0Zvck9mXScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBOZ0Zvci5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5WaWV3Q29udGFpbmVyUmVmLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLlRlbXBsYXRlUmVmLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkl0ZXJhYmxlRGlmZmVycywgfSxcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5DaGFuZ2VEZXRlY3RvclJlZiwgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgTmdGb3IucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAnbmdGb3JPZic6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICAgJ25nRm9yVHJhY2tCeSc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICAgJ25nRm9yVGVtcGxhdGUnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE5nRm9yO1xuICAgIH0oKSk7XG4gICAgdmFyIFJlY29yZFZpZXdUdXBsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZFxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFJlY29yZFZpZXdUdXBsZShyZWNvcmQsIHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkID0gcmVjb3JkO1xuICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVjb3JkVmlld1R1cGxlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgUmVtb3ZlcyBvciByZWNyZWF0ZXMgYSBwb3J0aW9uIG9mIHRoZSBET00gdHJlZSBiYXNlZCBvbiBhbiB7ZXhwcmVzc2lvbn0uXG4gICAgICAqICpcbiAgICAgICogSWYgdGhlIGV4cHJlc3Npb24gYXNzaWduZWQgdG8gYG5nSWZgIGV2YWx1YXRlcyB0byBhIGZhbHN5IHZhbHVlIHRoZW4gdGhlIGVsZW1lbnRcbiAgICAgICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00sIG90aGVyd2lzZSBhIGNsb25lIG9mIHRoZSBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9mZTBrZ2VtRkJ0bVFPWTMxYjR0dz9wPXByZXZpZXcpKTpcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPGRpdiAqbmdJZj1cImVycm9yQ291bnQgPiAwXCIgY2xhc3M9XCJlcnJvclwiPlxuICAgICAgKiA8IS0tIEVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGVycm9yQ291bnQgcHJvcGVydHkgaW4gdGhlIGN1cnJlbnQgY29udGV4dCBpcyBncmVhdGVyXG4gICAgICAqIHRoYW4gMC4gLS0+XG4gICAgICAqIHt7ZXJyb3JDb3VudH19IGVycm9ycyBkZXRlY3RlZFxuICAgICAgKiA8L2Rpdj5cbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogIyMjIFN5bnRheFxuICAgICAgKiAqXG4gICAgICAqIC0gYDxkaXYgKm5nSWY9XCJjb25kaXRpb25cIj4uLi48L2Rpdj5gXG4gICAgICAqIC0gYDxkaXYgdGVtcGxhdGU9XCJuZ0lmIGNvbmRpdGlvblwiPi4uLjwvZGl2PmBcbiAgICAgICogLSBgPHRlbXBsYXRlIFtuZ0lmXT1cImNvbmRpdGlvblwiPjxkaXY+Li4uPC9kaXY+PC90ZW1wbGF0ZT5gXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgTmdJZiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3RlbXBsYXRlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ0lmKF92aWV3Q29udGFpbmVyLCBfdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIgPSBfdmlld0NvbnRhaW5lcjtcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gX3RlbXBsYXRlO1xuICAgICAgICAgICAgdGhpcy5faGFzVmlldyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0lmLnByb3RvdHlwZSwgXCJuZ0lmXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb25cbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24gJiYgIXRoaXMuX2hhc1ZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVmlldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNvbmRpdGlvbiAmJiB0aGlzLl9oYXNWaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1ZpZXcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBOZ0lmLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuRGlyZWN0aXZlLCBhcmdzOiBbeyBzZWxlY3RvcjogJ1tuZ0lmXScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBOZ0lmLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLlZpZXdDb250YWluZXJSZWYsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuVGVtcGxhdGVSZWYsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIE5nSWYucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAnbmdJZic6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gTmdJZjtcbiAgICB9KCkpO1xuXG4gICAgdmFyIFN3aXRjaFZpZXcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lclJlZlxuICAgICAgICAgKiBAcGFyYW0gez99IF90ZW1wbGF0ZVJlZlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gU3dpdGNoVmlldyhfdmlld0NvbnRhaW5lclJlZiwgX3RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZVJlZiA9IF90ZW1wbGF0ZVJlZjtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFN3aXRjaFZpZXcucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGVSZWYpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFN3aXRjaFZpZXcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNyZWF0ZWRcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFN3aXRjaFZpZXcucHJvdG90eXBlLmVuZm9yY2VTdGF0ZSA9IGZ1bmN0aW9uIChjcmVhdGVkKSB7XG4gICAgICAgICAgICBpZiAoY3JlYXRlZCAmJiAhdGhpcy5fY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghY3JlYXRlZCAmJiB0aGlzLl9jcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBTd2l0Y2hWaWV3O1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogZXhwcmVzc2lvbi5cbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICAgICAgKiA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzFcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPVwibWF0Y2hfZXhwcmVzc2lvbl8yXCI+Li4uPC9zb21lLWVsZW1lbnQ+XG4gICAgICAqIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT1cIm1hdGNoX2V4cHJlc3Npb25fM1wiPi4uLjwvc29tZS1vdGhlci1lbGVtZW50PlxuICAgICAgKiA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzNcIj5cbiAgICAgICogPCEtLSB1c2UgYSBuZy1jb250YWluZXIgdG8gZ3JvdXAgbXVsdGlwbGUgcm9vdCBub2RlcyAtLT5cbiAgICAgICogPGlubmVyLWVsZW1lbnQ+PC9pbm5lci1lbGVtZW50PlxuICAgICAgKiA8aW5uZXItb3RoZXItZWxlbWVudD48L2lubmVyLW90aGVyLWVsZW1lbnQ+XG4gICAgICAqIDwvbmctY29udGFpbmVyPlxuICAgICAgKiA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+XG4gICAgICAqIDwvY29udGFpbmVyLWVsZW1lbnQ+XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIGBOZ1N3aXRjaGAgc3RhbXBzIG91dCBuZXN0ZWQgdmlld3Mgd2hlbiB0aGVpciBtYXRjaCBleHByZXNzaW9uIHZhbHVlIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoZVxuICAgICAgKiBzd2l0Y2ggZXhwcmVzc2lvbi5cbiAgICAgICogKlxuICAgICAgKiBJbiBvdGhlciB3b3JkczpcbiAgICAgICogLSB5b3UgZGVmaW5lIGEgY29udGFpbmVyIGVsZW1lbnQgKHdoZXJlIHlvdSBwbGFjZSB0aGUgZGlyZWN0aXZlIHdpdGggYSBzd2l0Y2ggZXhwcmVzc2lvbiBvbiB0aGVcbiAgICAgICogYFtuZ1N3aXRjaF09XCIuLi5cImAgYXR0cmlidXRlKVxuICAgICAgKiAtIHlvdSBkZWZpbmUgaW5uZXIgdmlld3MgaW5zaWRlIHRoZSBgTmdTd2l0Y2hgIGFuZCBwbGFjZSBhIGAqbmdTd2l0Y2hDYXNlYCBhdHRyaWJ1dGUgb24gdGhlIHZpZXdcbiAgICAgICogcm9vdCBlbGVtZW50cy5cbiAgICAgICogKlxuICAgICAgKiBFbGVtZW50cyB3aXRoaW4gYE5nU3dpdGNoYCBidXQgb3V0c2lkZSBvZiBhIGBOZ1N3aXRjaENhc2VgIG9yIGBOZ1N3aXRjaERlZmF1bHRgIGRpcmVjdGl2ZXMgd2lsbFxuICAgICAgKiBiZSBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBgbmdTd2l0Y2hDYXNlYCBkaXJlY3RpdmUgaW5mb3JtcyB0aGUgcGFyZW50IGBOZ1N3aXRjaGAgb2Ygd2hpY2ggdmlldyB0byBkaXNwbGF5IHdoZW4gdGhlXG4gICAgICAqIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuICAgICAgKiBXaGVuIG5vIG1hdGNoaW5nIGV4cHJlc3Npb24gaXMgZm91bmQgb24gYSBgbmdTd2l0Y2hDYXNlYCB2aWV3LCB0aGUgYG5nU3dpdGNoRGVmYXVsdGAgdmlldyBpc1xuICAgICAgKiBzdGFtcGVkIG91dC5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ1N3aXRjaCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIE5nU3dpdGNoKCkge1xuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2Nhc2VDb3VudCA9IDA7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1N3aXRjaC5wcm90b3R5cGUsIFwibmdTd2l0Y2hcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25nU3dpdGNoID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Nhc2VDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdTd2l0Y2gucHJvdG90eXBlLl9hZGRDYXNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY2FzZUNvdW50Kys7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nU3dpdGNoLnByb3RvdHlwZS5fYWRkRGVmYXVsdCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RlZmF1bHRWaWV3cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRWaWV3cyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFZpZXdzLnB1c2godmlldyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1N3aXRjaC5wcm90b3R5cGUuX21hdGNoQ2FzZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlZCA9IHZhbHVlID09IHRoaXMuX25nU3dpdGNoO1xuICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgfHwgbWF0Y2hlZDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleCA9PT0gdGhpcy5fY2FzZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdENhc2VzKCF0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVkO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB1c2VEZWZhdWx0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1N3aXRjaC5wcm90b3R5cGUuX3VwZGF0ZURlZmF1bHRDYXNlcyA9IGZ1bmN0aW9uICh1c2VEZWZhdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGVmYXVsdFZpZXdzICYmIHVzZURlZmF1bHQgIT09IHRoaXMuX2RlZmF1bHRVc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFVzZWQgPSB1c2VEZWZhdWx0O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCB0aGlzLl9kZWZhdWx0Vmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVmYXVsdFZpZXcgPSB0aGlzLl9kZWZhdWx0Vmlld3NbaV07XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3LmVuZm9yY2VTdGF0ZSh1c2VEZWZhdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE5nU3dpdGNoLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuRGlyZWN0aXZlLCBhcmdzOiBbeyBzZWxlY3RvcjogJ1tuZ1N3aXRjaF0nIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgTmdTd2l0Y2guY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgICAgTmdTd2l0Y2gucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAnbmdTd2l0Y2gnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE5nU3dpdGNoO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogZ2l2ZW4gZXhwcmVzc2lvbiBldmFsdWF0ZSB0byByZXNwZWN0aXZlbHkgdGhlIHNhbWUvZGlmZmVyZW50IHZhbHVlIGFzIHRoZSBzd2l0Y2hcbiAgICAgICogZXhwcmVzc2lvbi5cbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICAgICAgKiA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzFcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogPC9jb250YWluZXItZWxlbWVudD5cbiAgICAgICogKmBgYFxuICAgICAgKiAqXG4gICAgICAqIEluc2VydCB0aGUgc3ViLXRyZWUgd2hlbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGVuY2xvc2luZyBzd2l0Y2hcbiAgICAgICogZXhwcmVzc2lvbi5cbiAgICAgICogKlxuICAgICAgKiBJZiBtdWx0aXBsZSBtYXRjaCBleHByZXNzaW9ucyBtYXRjaCB0aGUgc3dpdGNoIGV4cHJlc3Npb24gdmFsdWUsIGFsbCBvZiB0aGVtIGFyZSBkaXNwbGF5ZWQuXG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ1N3aXRjaENhc2UgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWZcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1N3aXRjaFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTmdTd2l0Y2hDYXNlKHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmLCBuZ1N3aXRjaCkge1xuICAgICAgICAgICAgdGhpcy5uZ1N3aXRjaCA9IG5nU3dpdGNoO1xuICAgICAgICAgICAgbmdTd2l0Y2guX2FkZENhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXcgPSBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1N3aXRjaENhc2UucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fdmlldy5lbmZvcmNlU3RhdGUodGhpcy5uZ1N3aXRjaC5fbWF0Y2hDYXNlKHRoaXMubmdTd2l0Y2hDYXNlKSk7IH07XG4gICAgICAgIE5nU3dpdGNoQ2FzZS5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkRpcmVjdGl2ZSwgYXJnczogW3sgc2VsZWN0b3I6ICdbbmdTd2l0Y2hDYXNlXScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBOZ1N3aXRjaENhc2UuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuVmlld0NvbnRhaW5lclJlZiwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5UZW1wbGF0ZVJlZiwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogTmdTd2l0Y2gsIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSG9zdCB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgTmdTd2l0Y2hDYXNlLnByb3BEZWNvcmF0b3JzID0ge1xuICAgICAgICAgICAgJ25nU3dpdGNoQ2FzZSc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gTmdTd2l0Y2hDYXNlO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIG1hdGNoIHRoZVxuICAgICAgKiBzd2l0Y2ggZXhwcmVzc2lvbi5cbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICAgICAgKiA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzFcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogPHNvbWUtb3RoZXItZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1vdGhlci1lbGVtZW50PlxuICAgICAgKiA8L2NvbnRhaW5lci1lbGVtZW50PlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAqXG4gICAgICAqIEluc2VydCB0aGUgc3ViLXRyZWUgd2hlbiBubyBjYXNlIGV4cHJlc3Npb25zIGV2YWx1YXRlIHRvIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBlbmNsb3Npbmcgc3dpdGNoXG4gICAgICAqIGV4cHJlc3Npb24uXG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ1N3aXRjaERlZmF1bHQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyXG4gICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWZcbiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1N3aXRjaFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTmdTd2l0Y2hEZWZhdWx0KHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmLCBuZ1N3aXRjaCkge1xuICAgICAgICAgICAgbmdTd2l0Y2guX2FkZERlZmF1bHQobmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpKTtcbiAgICAgICAgfVxuICAgICAgICBOZ1N3aXRjaERlZmF1bHQuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW25nU3dpdGNoRGVmYXVsdF0nIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgTmdTd2l0Y2hEZWZhdWx0LmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLlZpZXdDb250YWluZXJSZWYsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuVGVtcGxhdGVSZWYsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IE5nU3dpdGNoLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkhvc3QgfSxdIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBOZ1N3aXRjaERlZmF1bHQ7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqICAqXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIDxzb21lLWVsZW1lbnQgW25nUGx1cmFsXT1cInZhbHVlXCI+XG4gICAgICAqIDxuZy1jb250YWluZXIgKm5nUGx1cmFsQ2FzZT1cIic9MCdcIj50aGVyZSBpcyBub3RoaW5nPC9uZy1jb250YWluZXI+XG4gICAgICAqIDxuZy1jb250YWluZXIgKm5nUGx1cmFsQ2FzZT1cIic9MSdcIj50aGVyZSBpcyBvbmU8L25nLWNvbnRhaW5lcj5cbiAgICAgICogPG5nLWNvbnRhaW5lciAqbmdQbHVyYWxDYXNlPVwiJ2ZldydcIj50aGVyZSBhcmUgYSBmZXc8L25nLWNvbnRhaW5lcj5cbiAgICAgICogPG5nLWNvbnRhaW5lciAqbmdQbHVyYWxDYXNlPVwiJ290aGVyJ1wiPnRoZXJlIGFyZSBleGFjdGx5ICM8L25nLWNvbnRhaW5lcj5cbiAgICAgICogPC9zb21lLWVsZW1lbnQ+XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqICpcbiAgICAgICogRGlzcGxheXMgRE9NIHN1Yi10cmVlcyB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgb3IgZmFpbGluZyB0aGF0LCBET00gc3ViLXRyZWVzXG4gICAgICAqIHRoYXQgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uJ3MgcGx1cmFsaXphdGlvbiBjYXRlZ29yeS5cbiAgICAgICogKlxuICAgICAgKiBUbyB1c2UgdGhpcyBkaXJlY3RpdmUgeW91IG11c3QgcHJvdmlkZSBhIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgc2V0cyB0aGUgYFtuZ1BsdXJhbF1gIGF0dHJpYnV0ZVxuICAgICAgKiB0byBhIHN3aXRjaCBleHByZXNzaW9uLiBJbm5lciBlbGVtZW50cyB3aXRoIGEgYFtuZ1BsdXJhbENhc2VdYCB3aWxsIGRpc3BsYXkgYmFzZWQgb24gdGhlaXJcbiAgICAgICogZXhwcmVzc2lvbjpcbiAgICAgICogLSBpZiBgW25nUGx1cmFsQ2FzZV1gIGlzIHNldCB0byBhIHZhbHVlIHN0YXJ0aW5nIHdpdGggYD1gLCBpdCB3aWxsIG9ubHkgZGlzcGxheSBpZiB0aGUgdmFsdWVcbiAgICAgICogbWF0Y2hlcyB0aGUgc3dpdGNoIGV4cHJlc3Npb24gZXhhY3RseSxcbiAgICAgICogLSBvdGhlcndpc2UsIHRoZSB2aWV3IHdpbGwgYmUgdHJlYXRlZCBhcyBhIFwiY2F0ZWdvcnkgbWF0Y2hcIiwgYW5kIHdpbGwgb25seSBkaXNwbGF5IGlmIGV4YWN0XG4gICAgICAqIHZhbHVlIG1hdGNoZXMgYXJlbid0IGZvdW5kIGFuZCB0aGUgdmFsdWUgbWFwcyB0byBpdHMgY2F0ZWdvcnkgZm9yIHRoZSBkZWZpbmVkIGxvY2FsZS5cbiAgICAgICogKlxuICAgICAgKiBTZWUgaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvY2xkci1zcGVjL3BsdXJhbC1ydWxlc1xuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIE5nUGx1cmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2xvY2FsaXphdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gTmdQbHVyYWwoX2xvY2FsaXphdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxpemF0aW9uID0gX2xvY2FsaXphdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX2Nhc2VWaWV3cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1BsdXJhbC5wcm90b3R5cGUsIFwibmdQbHVyYWxcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N3aXRjaFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3dpdGNoVmlld1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdQbHVyYWwucHJvdG90eXBlLmFkZENhc2UgPSBmdW5jdGlvbiAodmFsdWUsIHN3aXRjaFZpZXcpIHsgdGhpcy5fY2FzZVZpZXdzW3ZhbHVlXSA9IHN3aXRjaFZpZXc7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdQbHVyYWwucHJvdG90eXBlLl91cGRhdGVWaWV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJWaWV3cygpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2FzZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9jYXNlVmlld3MpO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5ID0gZ2V0UGx1cmFsQ2F0ZWdvcnkodGhpcy5fc3dpdGNoVmFsdWUsIGNhc2VzLCB0aGlzLl9sb2NhbGl6YXRpb24pO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZhdGVWaWV3KHRoaXMuX2Nhc2VWaWV3c1trZXldKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOZ1BsdXJhbC5wcm90b3R5cGUuX2NsZWFyVmlld3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlVmlldylcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdQbHVyYWwucHJvdG90eXBlLl9hY3RpdmF0ZVZpZXcgPSBmdW5jdGlvbiAodmlldykge1xuICAgICAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3ID0gdmlldztcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3LmNyZWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBOZ1BsdXJhbC5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkRpcmVjdGl2ZSwgYXJnczogW3sgc2VsZWN0b3I6ICdbbmdQbHVyYWxdJyB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIE5nUGx1cmFsLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBOZ0xvY2FsaXphdGlvbiwgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgTmdQbHVyYWwucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAnbmdQbHVyYWwnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE5nUGx1cmFsO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogZ2l2ZW4gZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhY2NvcmRpbmcgdG8gQ0xEUiBydWxlcy5cbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPVwidmFsdWVcIj5cbiAgICAgICogPG5nLWNvbnRhaW5lciAqbmdQbHVyYWxDYXNlPVwiJz0wJ1wiPi4uLjwvbmctY29udGFpbmVyPlxuICAgICAgKiA8bmctY29udGFpbmVyICpuZ1BsdXJhbENhc2U9XCInb3RoZXInXCI+Li4uPC9uZy1jb250YWluZXI+XG4gICAgICAqIDwvc29tZS1lbGVtZW50PlxuICAgICAgKiAqYGBgXG4gICAgICAqICpcbiAgICAgICogU2VlIHtAbGluayBOZ1BsdXJhbH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBOZ1BsdXJhbENhc2UgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclxuICAgICAgICAgKiBAcGFyYW0gez99IG5nUGx1cmFsXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ1BsdXJhbENhc2UodmFsdWUsIHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyLCBuZ1BsdXJhbCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgbmdQbHVyYWwuYWRkQ2FzZSh2YWx1ZSwgbmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICBOZ1BsdXJhbENhc2UuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW25nUGx1cmFsQ2FzZV0nIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgTmdQbHVyYWxDYXNlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuQXR0cmlidXRlLCBhcmdzOiBbJ25nUGx1cmFsQ2FzZScsXSB9LF0gfSxcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5UZW1wbGF0ZVJlZiwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5WaWV3Q29udGFpbmVyUmVmLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBOZ1BsdXJhbCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5Ib3N0IH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gTmdQbHVyYWxDYXNlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiA8c29tZS1lbGVtZW50IFtuZ1N0eWxlXT1cInsnZm9udC1zdHlsZSc6IHN0eWxlRXhwfVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICAgICAgKiAqXG4gICAgICAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPVwieydtYXgtd2lkdGgucHgnOiB3aWR0aEV4cH1cIj4uLi48L3NvbWUtZWxlbWVudD5cbiAgICAgICogKlxuICAgICAgKiA8c29tZS1lbGVtZW50IFtuZ1N0eWxlXT1cIm9iakV4cFwiPi4uLjwvc29tZS1lbGVtZW50PlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBzdHlsZXMgYXJlIHVwZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uOlxuICAgICAgKiAtIGtleXMgYXJlIHN0eWxlIG5hbWVzIHdpdGggYW4gb3B0aW9uYWwgYC48dW5pdD5gIHN1ZmZpeCAoaWUgJ3RvcC5weCcsICdmb250LXN0eWxlLmVtJyksXG4gICAgICAqIC0gdmFsdWVzIGFyZSB0aGUgdmFsdWVzIGFzc2lnbmVkIHRvIHRob3NlIHByb3BlcnRpZXMgKGV4cHJlc3NlZCBpbiB0aGUgZ2l2ZW4gdW5pdCkuXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgTmdTdHlsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7P30gX25nRWxcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXJcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIE5nU3R5bGUoX2RpZmZlcnMsIF9uZ0VsLCBfcmVuZGVyZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVycztcbiAgICAgICAgICAgIHRoaXMuX25nRWwgPSBfbmdFbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1N0eWxlLnByb3RvdHlwZSwgXCJuZ1N0eWxlXCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2XG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbmdTdHlsZSA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodikuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nU3R5bGUucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdTdHlsZS5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gX3RoaXMuX3NldFN0eWxlKHJlY29yZC5rZXksIG51bGwpOyB9KTtcbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiBfdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gX3RoaXMuX3NldFN0eWxlKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZUFuZFVuaXRcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTmdTdHlsZS5wcm90b3R5cGUuX3NldFN0eWxlID0gZnVuY3Rpb24gKG5hbWVBbmRVbml0LCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIF9hID0gbmFtZUFuZFVuaXQuc3BsaXQoJy4nKSwgbmFtZSA9IF9hWzBdLCB1bml0ID0gX2FbMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICYmIHVuaXQgPyBcIlwiICsgdmFsdWUgKyB1bml0IDogdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIE5nU3R5bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW25nU3R5bGVdJyB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIE5nU3R5bGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuS2V5VmFsdWVEaWZmZXJzLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkVsZW1lbnRSZWYsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUmVuZGVyZXIsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIE5nU3R5bGUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgICAnbmdTdHlsZSc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gTmdTdHlsZTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogPHRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlUmVmRXhwcmVzc2lvblwiXG4gICAgICAqIFtuZ091dGxldENvbnRleHRdPVwib2JqZWN0RXhwcmVzc2lvblwiPlxuICAgICAgKiA8L3RlbXBsYXRlPlxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAgKiAqXG4gICAgICAqIFlvdSBjYW4gYXR0YWNoIGEgY29udGV4dCBvYmplY3QgdG8gdGhlIGBFbWJlZGRlZFZpZXdSZWZgIGJ5IHNldHRpbmcgYFtuZ091dGxldENvbnRleHRdYC5cbiAgICAgICogYFtuZ091dGxldENvbnRleHRdYCBzaG91bGQgYmUgYW4gb2JqZWN0LCB0aGUgb2JqZWN0J3Mga2V5cyB3aWxsIGJlIHRoZSBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZXNcbiAgICAgICogYXZhaWxhYmxlIHdpdGhpbiB0aGUgYFRlbXBsYXRlUmVmYC5cbiAgICAgICogKlxuICAgICAgKiBOb3RlOiB1c2luZyB0aGUga2V5IGAkaW1wbGljaXRgIGluIHRoZSBjb250ZXh0IG9iamVjdCB3aWxsIHNldCBpdCdzIHZhbHVlIGFzIGRlZmF1bHQuXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgTmdUZW1wbGF0ZU91dGxldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBOZ1RlbXBsYXRlT3V0bGV0KF92aWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nVGVtcGxhdGVPdXRsZXQucHJvdG90eXBlLCBcIm5nT3V0bGV0Q29udGV4dFwiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dFxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoY29udGV4dCkgeyB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1RlbXBsYXRlT3V0bGV0LnByb3RvdHlwZSwgXCJuZ1RlbXBsYXRlT3V0bGV0XCIsIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZlxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodGVtcGxhdGVSZWYpIHsgdGhpcy5fdGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92aWV3UmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5yZW1vdmUodGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZiwgdGhpcy5fY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnW25nVGVtcGxhdGVPdXRsZXRdJyB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuVmlld0NvbnRhaW5lclJlZiwgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldC5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICAgICAgICAgICduZ091dGxldENvbnRleHQnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAgICduZ1RlbXBsYXRlT3V0bGV0JzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBOZ1RlbXBsYXRlT3V0bGV0O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBkaXJlY3RpdmVzIHRoYXQgYXJlIGxpa2VseSB0byBiZSB1c2VkIGluIGVhY2ggYW5kIGV2ZXJ5IEFuZ3VsYXJcbiAgICAgKiBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT01NT05fRElSRUNUSVZFUyA9IFtcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIE5nU3R5bGUsXG4gICAgICAgIE5nU3dpdGNoLFxuICAgICAgICBOZ1N3aXRjaENhc2UsXG4gICAgICAgIE5nU3dpdGNoRGVmYXVsdCxcbiAgICAgICAgTmdQbHVyYWwsXG4gICAgICAgIE5nUGx1cmFsQ2FzZSxcbiAgICBdO1xuXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNQcm9taXNlID0gX2FuZ3VsYXJfY29yZS5fX2NvcmVfcHJpdmF0ZV9fLmlzUHJvbWlzZTtcblxuICAgIHZhciBfX2V4dGVuZHMkNCA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgQmFzZUVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDQoQmFzZUVycm9yLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBCYXNlRXJyb3IobWVzc2FnZSkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgICAgICAvLyBFcnJvcnMgZG9uJ3QgdXNlIGN1cnJlbnQgdGhpcywgaW5zdGVhZCB0aGV5IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZG8gZm9yd2FyZCBhbGwgb2Ygb3VyIGFwaSB0byB0aGUgbmF0aXZlSW5zdGFuY2UuXG4gICAgICAgICAgICAvLyBUT0RPKGJyYWRmb3JkY3NtaXRoKTogUmVtb3ZlIHRoaXMgaGFjayB3aGVuXG4gICAgICAgICAgICAvLyAgICAgZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzIxMDIgaXMgZml4ZWQuXG4gICAgICAgICAgICB2YXIgbmF0aXZlRXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLl9uYXRpdmVFcnJvciA9IG5hdGl2ZUVycm9yO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcIm1lc3NhZ2VcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLm1lc3NhZ2U7IH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobWVzc2FnZSkgeyB0aGlzLl9uYXRpdmVFcnJvci5tZXNzYWdlID0gbWVzc2FnZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNlRXJyb3IucHJvdG90eXBlLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLm5hbWU7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmFzZUVycm9yLnByb3RvdHlwZSwgXCJzdGFja1wiLCB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKCh0aGlzLl9uYXRpdmVFcnJvcikpLnN0YWNrOyB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyAoKHRoaXMuX25hdGl2ZUVycm9yKSkuc3RhY2sgPSB2YWx1ZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQmFzZUVycm9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hdGl2ZUVycm9yLnRvU3RyaW5nKCk7IH07XG4gICAgICAgIHJldHVybiBCYXNlRXJyb3I7XG4gICAgfShFcnJvcikpO1xuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgV3JhcHBlZEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDQoV3JhcHBlZEVycm9yLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlXG4gICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFdyYXBwZWRFcnJvcihtZXNzYWdlLCBlcnJvcikge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSArIFwiIGNhdXNlZCBieTogXCIgKyAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpO1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbEVycm9yID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyYXBwZWRFcnJvci5wcm90b3R5cGUsIFwic3RhY2tcIiwge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCgodGhpcy5vcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB0aGlzLm9yaWdpbmFsRXJyb3IgOiB0aGlzLl9uYXRpdmVFcnJvcikpKVxuICAgICAgICAgICAgICAgICAgICAuc3RhY2s7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFdyYXBwZWRFcnJvcjtcbiAgICB9KEJhc2VFcnJvcikpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIHZhciBJbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMyhJbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHR5cGVcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBcIkludmFsaWQgYXJndW1lbnQgJ1wiICsgdmFsdWUgKyBcIicgZm9yIHBpcGUgJ1wiICsgc3RyaW5naWZ5KHR5cGUpICsgXCInXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3I7XG4gICAgfShCYXNlRXJyb3IpKTtcblxuICAgIHZhciBPYnNlcnZhYmxlU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBPYnNlcnZhYmxlU3RyYXRlZ3koKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gYXN5bmNcbiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgT2JzZXJ2YWJsZVN0cmF0ZWd5LnByb3RvdHlwZS5jcmVhdGVTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoYXN5bmMsIHVwZGF0ZUxhdGVzdFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMuc3Vic2NyaWJlKHsgbmV4dDogdXBkYXRlTGF0ZXN0VmFsdWUsIGVycm9yOiBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9IH0pO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBzdWJzY3JpcHRpb25cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIE9ic2VydmFibGVTdHJhdGVneS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHN1YnNjcmlwdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgT2JzZXJ2YWJsZVN0cmF0ZWd5LnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyB9O1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZVN0cmF0ZWd5O1xuICAgIH0oKSk7XG4gICAgdmFyIFByb21pc2VTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFByb21pc2VTdHJhdGVneSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBhc3luY1xuICAgICAgICAgKiBAcGFyYW0gez99IHVwZGF0ZUxhdGVzdFZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQcm9taXNlU3RyYXRlZ3kucHJvdG90eXBlLmNyZWF0ZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChhc3luYywgdXBkYXRlTGF0ZXN0VmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3luYy50aGVuKHVwZGF0ZUxhdGVzdFZhbHVlLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBQcm9taXNlU3RyYXRlZ3kucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHN1YnNjcmlwdGlvblxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUHJvbWlzZVN0cmF0ZWd5LnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7IH07XG4gICAgICAgIHJldHVybiBQcm9taXNlU3RyYXRlZ3k7XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfcHJvbWlzZVN0cmF0ZWd5ID0gbmV3IFByb21pc2VTdHJhdGVneSgpO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIF9vYnNlcnZhYmxlU3RyYXRlZ3kgPSBuZXcgT2JzZXJ2YWJsZVN0cmF0ZWd5KCk7XG4gICAgLyoqXG4gICAgICogIFRoZSBgYXN5bmNgIHBpcGUgc3Vic2NyaWJlcyB0byBhbiBgT2JzZXJ2YWJsZWAgb3IgYFByb21pc2VgIGFuZCByZXR1cm5zIHRoZSBsYXRlc3QgdmFsdWUgaXQgaGFzXG4gICAgICAqIGVtaXR0ZWQuIFdoZW4gYSBuZXcgdmFsdWUgaXMgZW1pdHRlZCwgdGhlIGBhc3luY2AgcGlwZSBtYXJrcyB0aGUgY29tcG9uZW50IHRvIGJlIGNoZWNrZWQgZm9yXG4gICAgICAqIGNoYW5nZXMuIFdoZW4gdGhlIGNvbXBvbmVudCBnZXRzIGRlc3Ryb3llZCwgdGhlIGBhc3luY2AgcGlwZSB1bnN1YnNjcmliZXMgYXV0b21hdGljYWxseSB0byBhdm9pZFxuICAgICAgKiBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzLlxuICAgICAgKiAqXG4gICAgICAqICpcbiAgICAgICogIyMgRXhhbXBsZXNcbiAgICAgICogKlxuICAgICAgKiBUaGlzIGV4YW1wbGUgYmluZHMgYSBgUHJvbWlzZWAgdG8gdGhlIHZpZXcuIENsaWNraW5nIHRoZSBgUmVzb2x2ZWAgYnV0dG9uIHJlc29sdmVzIHRoZVxuICAgICAgKiBwcm9taXNlLlxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZVByb21pc2UnfVxuICAgICAgKiAqXG4gICAgICAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0byB1c2UgYGFzeW5jYCB3aXRoIE9ic2VydmFibGVzLiBUaGUgZXhhbXBsZSBiZWxvdyBiaW5kcyB0aGUgYHRpbWVgIE9ic2VydmFibGVcbiAgICAgICogdG8gdGhlIHZpZXcuIFRoZSBPYnNlcnZhYmxlIGNvbnRpbnVvdXNseSB1cGRhdGVzIHRoZSB2aWV3IHdpdGggdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2FzeW5jX3BpcGUudHMgcmVnaW9uPSdBc3luY1BpcGVPYnNlcnZhYmxlJ31cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBBc3luY1BpcGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVmXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBBc3luY1BpcGUoX3JlZikge1xuICAgICAgICAgICAgdGhpcy5fcmVmID0gX3JlZjtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX29iaiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9zdHJhdGVneSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBc3luY1BpcGUucHJvdG90eXBlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBBc3luY1BpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iaikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUob2JqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvYmogIT09IHRoaXMuX29iaikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXRlc3RWYWx1ZSA9PT0gdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIF9hbmd1bGFyX2NvcmUuV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBvYmpcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFzeW5jUGlwZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9vYmogPSBvYmo7XG4gICAgICAgICAgICB0aGlzLl9zdHJhdGVneSA9IHRoaXMuX3NlbGVjdFN0cmF0ZWd5KG9iaik7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLl9zdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24ob2JqLCBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIF90aGlzLl91cGRhdGVMYXRlc3RWYWx1ZShvYmosIHZhbHVlKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fc2VsZWN0U3RyYXRlZ3kgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKG9iaikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3Byb21pc2VTdHJhdGVneTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoKG9iaikpLnN1YnNjcmliZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVN0cmF0ZWd5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFcnJvcihBc3luY1BpcGUsIG9iaik7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UodGhpcy5fc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX29iaiA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEFzeW5jUGlwZS5wcm90b3R5cGUuX3VwZGF0ZUxhdGVzdFZhbHVlID0gZnVuY3Rpb24gKGFzeW5jLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKGFzeW5jID09PSB0aGlzLl9vYmopIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgQXN5bmNQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ2FzeW5jJywgcHVyZTogZmFsc2UgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBBc3luY1BpcGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuQ2hhbmdlRGV0ZWN0b3JSZWYsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBBc3luY1BpcGU7XG4gICAgfSgpKTtcblxuICAgIHZhciBOdW1iZXJGb3JtYXRTdHlsZSA9IHt9O1xuICAgIE51bWJlckZvcm1hdFN0eWxlLkRlY2ltYWwgPSAwO1xuICAgIE51bWJlckZvcm1hdFN0eWxlLlBlcmNlbnQgPSAxO1xuICAgIE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5ID0gMjtcbiAgICBOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5EZWNpbWFsXSA9IFwiRGVjaW1hbFwiO1xuICAgIE51bWJlckZvcm1hdFN0eWxlW051bWJlckZvcm1hdFN0eWxlLlBlcmNlbnRdID0gXCJQZXJjZW50XCI7XG4gICAgTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3ldID0gXCJDdXJyZW5jeVwiO1xuICAgIHZhciBOdW1iZXJGb3JtYXR0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBOdW1iZXJGb3JtYXR0ZXIoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbnVtXG4gICAgICAgICAqIEBwYXJhbSB7P30gbG9jYWxlXG4gICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX18zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBOdW1iZXJGb3JtYXR0ZXIuZm9ybWF0ID0gZnVuY3Rpb24gKG51bSwgbG9jYWxlLCBzdHlsZSwgX2EpIHtcbiAgICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBtaW5pbXVtSW50ZWdlckRpZ2l0cyA9IF9iLm1pbmltdW1JbnRlZ2VyRGlnaXRzLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgPSBfYi5taW5pbXVtRnJhY3Rpb25EaWdpdHMsIG1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IF9iLm1heGltdW1GcmFjdGlvbkRpZ2l0cywgY3VycmVuY3kgPSBfYi5jdXJyZW5jeSwgX2MgPSBfYi5jdXJyZW5jeUFzU3ltYm9sLCBjdXJyZW5jeUFzU3ltYm9sID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2M7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5pbXVtSW50ZWdlckRpZ2l0cyxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbmltdW1GcmFjdGlvbkRpZ2l0cyxcbiAgICAgICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heGltdW1GcmFjdGlvbkRpZ2l0cyxcbiAgICAgICAgICAgICAgICBzdHlsZTogTnVtYmVyRm9ybWF0U3R5bGVbc3R5bGVdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoc3R5bGUgPT0gTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmN1cnJlbmN5ID0gY3VycmVuY3k7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jdXJyZW5jeURpc3BsYXkgPSBjdXJyZW5jeUFzU3ltYm9sID8gJ3N5bWJvbCcgOiAnY29kZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KG51bSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBOdW1iZXJGb3JtYXR0ZXI7XG4gICAgfSgpKTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBEQVRFX0ZPUk1BVFNfU1BMSVQgPSAvKCg/OlteeU1MZEhobXNhelpFd0dqSiddKyl8KD86Jyg/OlteJ118JycpKicpfCg/OkUrfHkrfE0rfEwrfGQrfEgrfGgrfEorfGorfG0rfHMrfGF8enxafEcrfHcrKSkoLiopLztcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBQQVRURVJOX0FMSUFTRVMgPSB7XG4gICAgICAgIC8vIEtleXMgYXJlIHF1b3RlZCBzbyB0aGV5IGRvIG5vdCBnZXQgcmVuYW1lZCBkdXJpbmcgY2xvc3VyZSBjb21waWxhdGlvbi5cbiAgICAgICAgJ3lNTU1kam1zJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGNvbWJpbmUoW1xuICAgICAgICAgICAgZGlnaXRDb25kaXRpb24oJ3llYXInLCAxKSxcbiAgICAgICAgICAgIG5hbWVDb25kaXRpb24oJ21vbnRoJywgMyksXG4gICAgICAgICAgICBkaWdpdENvbmRpdGlvbignZGF5JywgMSksXG4gICAgICAgICAgICBkaWdpdENvbmRpdGlvbignaG91cicsIDEpLFxuICAgICAgICAgICAgZGlnaXRDb25kaXRpb24oJ21pbnV0ZScsIDEpLFxuICAgICAgICAgICAgZGlnaXRDb25kaXRpb24oJ3NlY29uZCcsIDEpLFxuICAgICAgICBdKSksXG4gICAgICAgICd5TWRqbSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtcbiAgICAgICAgICAgIGRpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpLCBkaWdpdENvbmRpdGlvbignZGF5JywgMSksXG4gICAgICAgICAgICBkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCBkaWdpdENvbmRpdGlvbignbWludXRlJywgMSlcbiAgICAgICAgXSkpLFxuICAgICAgICAneU1NTU1FRUVFZCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtcbiAgICAgICAgICAgIGRpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIG5hbWVDb25kaXRpb24oJ21vbnRoJywgNCksIG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCA0KSxcbiAgICAgICAgICAgIGRpZ2l0Q29uZGl0aW9uKCdkYXknLCAxKVxuICAgICAgICBdKSksXG4gICAgICAgICd5TU1NTWQnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoY29tYmluZShbZGlnaXRDb25kaXRpb24oJ3llYXInLCAxKSwgbmFtZUNvbmRpdGlvbignbW9udGgnLCA0KSwgZGlnaXRDb25kaXRpb24oJ2RheScsIDEpXSkpLFxuICAgICAgICAneU1NTWQnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoY29tYmluZShbZGlnaXRDb25kaXRpb24oJ3llYXInLCAxKSwgbmFtZUNvbmRpdGlvbignbW9udGgnLCAzKSwgZGlnaXRDb25kaXRpb24oJ2RheScsIDEpXSkpLFxuICAgICAgICAneU1kJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGNvbWJpbmUoW2RpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpLCBkaWdpdENvbmRpdGlvbignZGF5JywgMSldKSksXG4gICAgICAgICdqbXMnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoY29tYmluZShbZGlnaXRDb25kaXRpb24oJ2hvdXInLCAxKSwgZGlnaXRDb25kaXRpb24oJ3NlY29uZCcsIDEpLCBkaWdpdENvbmRpdGlvbignbWludXRlJywgMSldKSksXG4gICAgICAgICdqbSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCBkaWdpdENvbmRpdGlvbignbWludXRlJywgMSldKSlcbiAgICB9O1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIERBVEVfRk9STUFUUyA9IHtcbiAgICAgICAgLy8gS2V5cyBhcmUgcXVvdGVkIHNvIHRoZXkgZG8gbm90IGdldCByZW5hbWVkLlxuICAgICAgICAneXl5eSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbigneWVhcicsIDQpKSxcbiAgICAgICAgJ3l5JzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMikpLFxuICAgICAgICAneSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbigneWVhcicsIDEpKSxcbiAgICAgICAgJ01NTU0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignbW9udGgnLCA0KSksXG4gICAgICAgICdNTU0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignbW9udGgnLCAzKSksXG4gICAgICAgICdNTSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignbW9udGgnLCAyKSksXG4gICAgICAgICdNJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpKSxcbiAgICAgICAgJ0xMTEwnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignbW9udGgnLCA0KSksXG4gICAgICAgICdMJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ21vbnRoJywgMSkpLFxuICAgICAgICAnZGQnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ2RheScsIDIpKSxcbiAgICAgICAgJ2QnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ2RheScsIDEpKSxcbiAgICAgICAgJ0hIJzogZGlnaXRNb2RpZmllcihob3VyRXh0cmFjdG9yKGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShob3VyMTJNb2RpZnkoZGlnaXRDb25kaXRpb24oJ2hvdXInLCAyKSwgZmFsc2UpKSkpLFxuICAgICAgICAnSCc6IGhvdXJFeHRyYWN0b3IoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGhvdXIxMk1vZGlmeShkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCBmYWxzZSkpKSxcbiAgICAgICAgJ2hoJzogZGlnaXRNb2RpZmllcihob3VyRXh0cmFjdG9yKGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShob3VyMTJNb2RpZnkoZGlnaXRDb25kaXRpb24oJ2hvdXInLCAyKSwgdHJ1ZSkpKSksXG4gICAgICAgICdoJzogaG91ckV4dHJhY3RvcihkYXRlUGFydEdldHRlckZhY3RvcnkoaG91cjEyTW9kaWZ5KGRpZ2l0Q29uZGl0aW9uKCdob3VyJywgMSksIHRydWUpKSksXG4gICAgICAgICdqaic6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignaG91cicsIDIpKSxcbiAgICAgICAgJ2onOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ2hvdXInLCAxKSksXG4gICAgICAgICdtbSc6IGRpZ2l0TW9kaWZpZXIoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdtaW51dGUnLCAyKSkpLFxuICAgICAgICAnbSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignbWludXRlJywgMSkpLFxuICAgICAgICAnc3MnOiBkaWdpdE1vZGlmaWVyKGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignc2Vjb25kJywgMikpKSxcbiAgICAgICAgJ3MnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ3NlY29uZCcsIDEpKSxcbiAgICAgICAgLy8gd2hpbGUgSVNPIDg2MDEgcmVxdWlyZXMgZnJhY3Rpb25zIHRvIGJlIHByZWZpeGVkIHdpdGggYC5gIG9yIGAsYFxuICAgICAgICAvLyB3ZSBjYW4gYmUganVzdCBzYWZlbHkgcmVseSBvbiB1c2luZyBgc3NzYCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBzaW5nbGUgb3IgdHdvIGRpZ2l0XG4gICAgICAgIC8vIGZyYWN0aW9uc1xuICAgICAgICAnc3NzJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdzZWNvbmQnLCAzKSksXG4gICAgICAgICdFRUVFJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCA0KSksXG4gICAgICAgICdFRUUnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignd2Vla2RheScsIDMpKSxcbiAgICAgICAgJ0VFJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCAyKSksXG4gICAgICAgICdFJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCAxKSksXG4gICAgICAgICdhJzogaG91ckNsb2NrRXh0cmFjdG9yKGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShob3VyMTJNb2RpZnkoZGlnaXRDb25kaXRpb24oJ2hvdXInLCAxKSwgdHJ1ZSkpKSxcbiAgICAgICAgJ1onOiB0aW1lWm9uZUdldHRlcignc2hvcnQnKSxcbiAgICAgICAgJ3onOiB0aW1lWm9uZUdldHRlcignbG9uZycpLFxuICAgICAgICAnd3cnOiBkYXRlUGFydEdldHRlckZhY3Rvcnkoe30pLFxuICAgICAgICAvLyBmaXJzdCBUaHVyc2RheSBvZiB0aGUgeWVhci4gbm90IHN1cHBvcnQgP1xuICAgICAgICAndyc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeSh7fSksXG4gICAgICAgIC8vIG9mIHRoZSB5ZWFyIG5vdCBzdXBwb3J0ID9cbiAgICAgICAgJ0cnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignZXJhJywgMSkpLFxuICAgICAgICAnR0cnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignZXJhJywgMikpLFxuICAgICAgICAnR0dHJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ2VyYScsIDMpKSxcbiAgICAgICAgJ0dHR0cnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignZXJhJywgNCkpXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGlubmVyXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkaWdpdE1vZGlmaWVyKGlubmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSBpbm5lcihkYXRlLCBsb2NhbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT0gMSA/ICcwJyArIHJlc3VsdCA6IHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBpbm5lclxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaG91ckNsb2NrRXh0cmFjdG9yKGlubmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7IHJldHVybiBpbm5lcihkYXRlLCBsb2NhbGUpLnNwbGl0KCcgJylbMV07IH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gaW5uZXJcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhvdXJFeHRyYWN0b3IoaW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsgcmV0dXJuIGlubmVyKGRhdGUsIGxvY2FsZSkuc3BsaXQoJyAnKVswXTsgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBkYXRlXG4gICAgICogQHBhcmFtIHs/fSBsb2NhbGVcbiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludGxEYXRlRm9ybWF0KGRhdGUsIGxvY2FsZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQoZGF0ZSkucmVwbGFjZSgvW1xcdTIwMGVcXHUyMDBmXS9nLCAnJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gdGltZXpvbmVcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVab25lR2V0dGVyKHRpbWV6b25lKSB7XG4gICAgICAgIC8vIFRvIHdvcmthcm91bmQgYEludGxgIEFQSSByZXN0cmljdGlvbiBmb3Igc2luZ2xlIHRpbWV6b25lIGxldCBmb3JtYXQgd2l0aCAyNCBob3Vyc1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvcHRpb25zID0geyBob3VyOiAnMi1kaWdpdCcsIGhvdXIxMjogZmFsc2UsIHRpbWVab25lTmFtZTogdGltZXpvbmUgfTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IGludGxEYXRlRm9ybWF0KGRhdGUsIGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBUaGVuIGV4dHJhY3QgZmlyc3QgMyBsZXR0ZXJzIHRoYXQgcmVsYXRlZCB0byBob3Vyc1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdC5zdWJzdHJpbmcoMykgOiAnJztcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaG91cjEyTW9kaWZ5KG9wdGlvbnMsIHZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnMuaG91cjEyID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHByb3BcbiAgICAgKiBAcGFyYW0gez99IGxlblxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGlnaXRDb25kaXRpb24ocHJvcCwgbGVuKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc3VsdCA9IHt9O1xuICAgICAgICByZXN1bHRbcHJvcF0gPSBsZW4gPT09IDIgPyAnMi1kaWdpdCcgOiAnbnVtZXJpYyc7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcHJvcFxuICAgICAqIEBwYXJhbSB7P30gbGVuXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBuYW1lQ29uZGl0aW9uKHByb3AsIGxlbikge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKGxlbiA8IDQpIHtcbiAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IGxlbiA+IDEgPyAnc2hvcnQnIDogJ25hcnJvdyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRbcHJvcF0gPSAnbG9uZyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBvcHRpb25zXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21iaW5lKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIChfYSA9ICgoT2JqZWN0KSkpLmFzc2lnbi5hcHBseShfYSwgW3t9XS5jb25jYXQob3B0aW9ucykpO1xuICAgICAgICB2YXIgX2E7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gcmV0XG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkYXRlUGFydEdldHRlckZhY3RvcnkocmV0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7IHJldHVybiBpbnRsRGF0ZUZvcm1hdChkYXRlLCBsb2NhbGUsIHJldCk7IH07XG4gICAgfVxuICAgIHZhciAvKiogQHR5cGUgez99ICovIERBVEVfRk9STUFUVEVSX0NBQ0hFID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P30gZm9ybWF0XG4gICAgICogQHBhcmFtIHs/fSBkYXRlXG4gICAgICogQHBhcmFtIHs/fSBsb2NhbGVcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRhdGVGb3JtYXR0ZXIoZm9ybWF0LCBkYXRlLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZm4gPSBQQVRURVJOX0FMSUFTRVNbZm9ybWF0XTtcbiAgICAgICAgaWYgKGZuKVxuICAgICAgICAgICAgcmV0dXJuIGZuKGRhdGUsIGxvY2FsZSk7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhY2hlS2V5ID0gZm9ybWF0O1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IERBVEVfRk9STUFUVEVSX0NBQ0hFLmdldChjYWNoZUtleSk7XG4gICAgICAgIGlmICghcGFydHMpIHtcbiAgICAgICAgICAgIHBhcnRzID0gW107XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXRjaCA9IHZvaWQgMDtcbiAgICAgICAgICAgIERBVEVfRk9STUFUU19TUExJVC5leGVjKGZvcm1hdCk7XG4gICAgICAgICAgICB3aGlsZSAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBEQVRFX0ZPUk1BVFNfU1BMSVQuZXhlYyhmb3JtYXQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChmb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERBVEVfRk9STUFUVEVSX0NBQ0hFLnNldChjYWNoZUtleSwgcGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoZnVuY3Rpb24gKHRleHQsIHBhcnQpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZuID0gREFURV9GT1JNQVRTW3BhcnRdO1xuICAgICAgICAgICAgcmV0dXJuIHRleHQgKyAoZm4gPyBmbihkYXRlLCBsb2NhbGUpIDogcGFydFRvVGltZShwYXJ0KSk7XG4gICAgICAgIH0sICcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBwYXJ0XG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJ0VG9UaW1lKHBhcnQpIHtcbiAgICAgICAgcmV0dXJuIHBhcnQgPT09ICdcXCdcXCcnID8gJ1xcJycgOiBwYXJ0LnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcXCcnKTtcbiAgICB9XG4gICAgdmFyIERhdGVGb3JtYXR0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBEYXRlRm9ybWF0dGVyKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGRhdGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhbGVcbiAgICAgICAgICogQHBhcmFtIHs/fSBwYXR0ZXJuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEYXRlRm9ybWF0dGVyLmZvcm1hdCA9IGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUsIHBhdHRlcm4pIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVyKHBhdHRlcm4sIGRhdGUsIGxvY2FsZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBEYXRlRm9ybWF0dGVyO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBXaGVyZTpcbiAgICAgICogLSBgZXhwcmVzc2lvbmAgaXMgYSBkYXRlIG9iamVjdCBvciBhIG51bWJlciAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCkgb3IgYW4gSVNPIHN0cmluZ1xuICAgICAgKiAoaHR0cHM6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUpLlxuICAgICAgKiAtIGBmb3JtYXRgIGluZGljYXRlcyB3aGljaCBkYXRlL3RpbWUgY29tcG9uZW50cyB0byBpbmNsdWRlLiBUaGUgZm9ybWF0IGNhbiBiZSBwcmVkaWZpbmVkIGFzXG4gICAgICAqIHNob3duIGJlbG93IG9yIGN1c3RvbSBhcyBzaG93biBpbiB0aGUgdGFibGUuXG4gICAgICAqIC0gYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ3lNTU1kam1zJ2AgKGUuZy4gYFNlcCAzLCAyMDEwLCAxMjowNTowOCBQTWAgZm9yIGBlbi1VU2ApXG4gICAgICAqIC0gYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAneU1kam0nYCAoZS5nLiBgOS8zLzIwMTAsIDEyOjA1IFBNYCBmb3IgYGVuLVVTYClcbiAgICAgICogLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTUVFRUVkJ2AgKGUuZy4gYEZyaWRheSwgU2VwdGVtYmVyIDMsIDIwMTBgIGZvciBgZW4tVVNgKVxuICAgICAgKiAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ3lNTU1NZCdgIChlLmcuIGBTZXB0ZW1iZXIgMywgMjAxMGAgZm9yIGBlbi1VU2ApXG4gICAgICAqIC0gYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NZCdgIChlLmcuIGBTZXAgMywgMjAxMGAgZm9yIGBlbi1VU2ApXG4gICAgICAqIC0gYCdzaG9ydERhdGUnYDogZXF1aXZhbGVudCB0byBgJ3lNZCdgIChlLmcuIGA5LzMvMjAxMGAgZm9yIGBlbi1VU2ApXG4gICAgICAqIC0gYCdtZWRpdW1UaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbXMnYCAoZS5nLiBgMTI6MDU6MDggUE1gIGZvciBgZW4tVVNgKVxuICAgICAgKiAtIGAnc2hvcnRUaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbSdgIChlLmcuIGAxMjowNSBQTWAgZm9yIGBlbi1VU2ApXG4gICAgICAqICpcbiAgICAgICogKlxuICAgICAgKiB8IENvbXBvbmVudCB8IFN5bWJvbCB8IE5hcnJvdyB8IFNob3J0IEZvcm0gICB8IExvbmcgRm9ybSAgICAgICAgIHwgTnVtZXJpYyAgIHwgMi1kaWdpdCAgIHxcbiAgICAgICogfC0tLS0tLS0tLS0tfDotLS0tLS06fC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS18XG4gICAgICAqIHwgZXJhICAgICAgIHwgICBHICAgIHwgRyAoQSkgIHwgR0dHIChBRCkgICAgIHwgR0dHRyAoQW5ubyBEb21pbmkpfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICAgICAgKiB8IHllYXIgICAgICB8ICAgeSAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgeSAoMjAxNSkgIHwgeXkgKDE1KSAgIHxcbiAgICAgICogfCBtb250aCAgICAgfCAgIE0gICAgfCBMIChTKSAgfCBNTU0gKFNlcCkgICAgfCBNTU1NIChTZXB0ZW1iZXIpICB8IE0gKDkpICAgICB8IE1NICgwOSkgICB8XG4gICAgICAqIHwgZGF5ICAgICAgIHwgICBkICAgIHwgLSAgICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBkICgzKSAgICAgfCBkZCAoMDMpICAgfFxuICAgICAgKiB8IHdlZWtkYXkgICB8ICAgRSAgICB8IEUgKFMpICB8IEVFRSAoU3VuKSAgICB8IEVFRUUgKFN1bmRheSkgICAgIHwgLSAgICAgICAgIHwgLSAgICAgICAgIHxcbiAgICAgICogfCBob3VyICAgICAgfCAgIGogICAgfCAtICAgICAgfCAtICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICB8IGogKDEzKSAgICB8IGpqICgxMykgICB8XG4gICAgICAqIHwgaG91cjEyICAgIHwgICBoICAgIHwgLSAgICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBoICgxIFBNKSAgfCBoaCAoMDEgUE0pfFxuICAgICAgKiB8IGhvdXIyNCAgICB8ICAgSCAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgSCAoMTMpICAgIHwgSEggKDEzKSAgIHxcbiAgICAgICogfCBtaW51dGUgICAgfCAgIG0gICAgfCAtICAgICAgfCAtICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICB8IG0gKDUpICAgICB8IG1tICgwNSkgICB8XG4gICAgICAqIHwgc2Vjb25kICAgIHwgICBzICAgIHwgLSAgICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBzICg5KSAgICAgfCBzcyAoMDkpICAgfFxuICAgICAgKiB8IHRpbWV6b25lICB8ICAgeiAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IHogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSl8IC0gIHwgLSAgICAgICAgIHxcbiAgICAgICogfCB0aW1lem9uZSAgfCAgIFogICAgfCAtICAgICAgfCBaIChHTVQtODowMCkgfCAtICAgICAgICAgICAgICAgICB8IC0gICAgICAgICB8IC0gICAgICAgICB8XG4gICAgICAqIHwgdGltZXpvbmUgIHwgICBhICAgIHwgLSAgICAgIHwgYSAoUE0pICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICAgICAgKiAqXG4gICAgICAqIEluIGphdmFzY3JpcHQsIG9ubHkgdGhlIGNvbXBvbmVudHMgc3BlY2lmaWVkIHdpbGwgYmUgcmVzcGVjdGVkIChub3QgdGhlIG9yZGVyaW5nLFxuICAgICAgKiBwdW5jdHVhdGlvbnMsIC4uLikgYW5kIGRldGFpbHMgb2YgdGhlIGZvcm1hdHRpbmcgd2lsbCBiZSBkZXBlbmRlbnQgb24gdGhlIGxvY2FsZS5cbiAgICAgICogKlxuICAgICAgKiBUaW1lem9uZSBvZiB0aGUgZm9ybWF0dGVkIHRleHQgd2lsbCBiZSB0aGUgbG9jYWwgc3lzdGVtIHRpbWV6b25lIG9mIHRoZSBlbmQtdXNlcidzIG1hY2hpbmUuXG4gICAgICAqICpcbiAgICAgICogV2hlbiB0aGUgZXhwcmVzc2lvbiBpcyBhIElTTyBzdHJpbmcgd2l0aG91dCB0aW1lIChlLmcuIDIwMTYtMDktMTkpIHRoZSB0aW1lIHpvbmUgb2Zmc2V0IGlzIG5vdFxuICAgICAgKiBhcHBsaWVkIGFuZCB0aGUgZm9ybWF0dGVkIHRleHQgd2lsbCBoYXZlIHRoZSBzYW1lIGRheSwgbW9udGggYW5kIHllYXIgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICAqICpcbiAgICAgICogV0FSTklOR1M6XG4gICAgICAqIC0gdGhpcyBwaXBlIGlzIG1hcmtlZCBhcyBwdXJlIGhlbmNlIGl0IHdpbGwgbm90IGJlIHJlLWV2YWx1YXRlZCB3aGVuIHRoZSBpbnB1dCBpcyBtdXRhdGVkLlxuICAgICAgKiBJbnN0ZWFkIHVzZXJzIHNob3VsZCB0cmVhdCB0aGUgZGF0ZSBhcyBhbiBpbW11dGFibGUgb2JqZWN0IGFuZCBjaGFuZ2UgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZVxuICAgICAgKiBwaXBlIG5lZWRzIHRvIHJlLXJ1biAodGhpcyBpcyB0byBhdm9pZCByZWZvcm1hdHRpbmcgdGhlIGRhdGUgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBydW5cbiAgICAgICogd2hpY2ggd291bGQgYmUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbikuXG4gICAgICAqIC0gdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSS4gVGhlcmVmb3JlIGl0IGlzIG9ubHkgcmVsaWFibGUgaW4gQ2hyb21lIGFuZCBPcGVyYVxuICAgICAgKiBicm93c2Vycy5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgICogKlxuICAgICAgKiBBc3N1bWluZyBgZGF0ZU9iamAgaXMgKHllYXI6IDIwMTUsIG1vbnRoOiA2LCBkYXk6IDE1LCBob3VyOiAyMSwgbWludXRlOiA0Mywgc2Vjb25kOiAxMSlcbiAgICAgICogaW4gdGhlIF9sb2NhbF8gdGltZSBhbmQgbG9jYWxlIGlzICdlbi1VUyc6XG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIHt7IGRhdGVPYmogfCBkYXRlIH19ICAgICAgICAgICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUnXG4gICAgICAqIHt7IGRhdGVPYmogfCBkYXRlOidtZWRpdW0nIH19ICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUsIDk6NDM6MTEgUE0nXG4gICAgICAqIHt7IGRhdGVPYmogfCBkYXRlOidzaG9ydFRpbWUnIH19ICAgLy8gb3V0cHV0IGlzICc5OjQzIFBNJ1xuICAgICAgKiB7eyBkYXRlT2JqIHwgZGF0ZTonbW1zcycgfX0gICAgICAgIC8vIG91dHB1dCBpcyAnNDM6MTEnXG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvZGF0ZV9waXBlLnRzIHJlZ2lvbj0nRGF0ZVBpcGUnfVxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIERhdGVQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2xvY2FsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gRGF0ZVBpcGUoX2xvY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBwYXR0ZXJuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBEYXRlUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgICAgICAgICBpZiAocGF0dGVybiA9PT0gdm9pZCAwKSB7IHBhdHRlcm4gPSAnbWVkaXVtRGF0ZSc7IH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRhdGU7XG4gICAgICAgICAgICBpZiAoaXNCbGFuayQxKHZhbHVlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKE51bWJlcldyYXBwZXIuaXNOdW1lcmljKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eKFxcZHs0fS1cXGR7MSwyfS1cXGR7MSwyfSkkLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICogRm9yIElTTyBTdHJpbmdzIHdpdGhvdXQgdGltZSB0aGUgZGF5LCBtb250aCBhbmQgeWVhciBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBJU08gU3RyaW5nXG4gICAgICAgICAgICAgICAgKiBiZWZvcmUgRGF0ZSBjcmVhdGlvbiB0byBhdm9pZCB0aW1lIG9mZnNldCBhbmQgZXJyb3JzIGluIHRoZSBuZXcgRGF0ZS5cbiAgICAgICAgICAgICAgICAqIElmIHdlIG9ubHkgcmVwbGFjZSAnLScgd2l0aCAnLCcgaW4gdGhlIElTTyBTdHJpbmcgKFwiMjAxNSwwMSwwMVwiKSwgYW5kIHRyeSB0byBjcmVhdGUgYSBuZXdcbiAgICAgICAgICAgICAgICAqIGRhdGUsIHNvbWUgYnJvd3NlcnMgKGUuZy4gSUUgOSkgd2lsbCB0aHJvdyBhbiBpbnZhbGlkIERhdGUgZXJyb3JcbiAgICAgICAgICAgICAgICAqIElmIHdlIGxlYXZlIHRoZSAnLScgKFwiMjAxNS0wMS0wMVwiKSBhbmQgdHJ5IHRvIGNyZWF0ZSBhIG5ldyBEYXRlKFwiMjAxNS0wMS0wMVwiKSB0aGUgdGltZW9mZnNldFxuICAgICAgICAgICAgICAgICogaXMgYXBwbGllZFxuICAgICAgICAgICAgICAgICogTm90ZTogSVNPIG1vbnRocyBhcmUgMCBmb3IgSmFudWFyeSwgMSBmb3IgRmVicnVhcnksIC4uLlxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdmFyIF9hID0gdmFsdWUuc3BsaXQoJy0nKS5tYXAoZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7IH0pLCB5ID0gX2FbMF0sIG0gPSBfYVsxXSwgZCA9IF9hWzJdO1xuICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKERhdGVQaXBlLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRGF0ZUZvcm1hdHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5fbG9jYWxlLCBEYXRlUGlwZS5fQUxJQVNFU1twYXR0ZXJuXSB8fCBwYXR0ZXJuKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBEYXRlUGlwZS5fQUxJQVNFUyA9IHtcbiAgICAgICAgICAgICdtZWRpdW0nOiAneU1NTWRqbXMnLFxuICAgICAgICAgICAgJ3Nob3J0JzogJ3lNZGptJyxcbiAgICAgICAgICAgICdmdWxsRGF0ZSc6ICd5TU1NTUVFRUVkJyxcbiAgICAgICAgICAgICdsb25nRGF0ZSc6ICd5TU1NTWQnLFxuICAgICAgICAgICAgJ21lZGl1bURhdGUnOiAneU1NTWQnLFxuICAgICAgICAgICAgJ3Nob3J0RGF0ZSc6ICd5TWQnLFxuICAgICAgICAgICAgJ21lZGl1bVRpbWUnOiAnam1zJyxcbiAgICAgICAgICAgICdzaG9ydFRpbWUnOiAnam0nXG4gICAgICAgIH07XG4gICAgICAgIERhdGVQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ2RhdGUnLCBwdXJlOiB0cnVlIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgRGF0ZVBpcGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3QsIGFyZ3M6IFtfYW5ndWxhcl9jb3JlLkxPQ0FMRV9JRCxdIH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gRGF0ZVBpcGU7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IG9ialxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCbGFuayQxKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqID09IG51bGwgfHwgb2JqID09PSAnJztcbiAgICB9XG5cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfSU5URVJQT0xBVElPTl9SRUdFWFAgPSAvIy9nO1xuICAgIC8qKlxuICAgICAqICAqXG4gICAgICAqIFdoZXJlOlxuICAgICAgKiAtIGBleHByZXNzaW9uYCBpcyBhIG51bWJlci5cbiAgICAgICogLSBgbWFwcGluZ2AgaXMgYW4gb2JqZWN0IHRoYXQgbWltaWNzIHRoZSBJQ1UgZm9ybWF0LCBzZWVcbiAgICAgICogaHR0cDovL3VzZXJndWlkZS5pY3UtcHJvamVjdC5vcmcvZm9ybWF0cGFyc2UvbWVzc2FnZXNcbiAgICAgICogKlxuICAgICAgKiAjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICoge0BleGFtcGxlIGNvbW1vbi9waXBlcy90cy9pMThuX3BpcGUudHMgcmVnaW9uPSdJMThuUGx1cmFsUGlwZUNvbXBvbmVudCd9XG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgSTE4blBsdXJhbFBpcGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbG9jYWxpemF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBJMThuUGx1cmFsUGlwZShfbG9jYWxpemF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSBfbG9jYWxpemF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGx1cmFsTWFwXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJMThuUGx1cmFsUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBwbHVyYWxNYXApIHtcbiAgICAgICAgICAgIGlmIChpc0JsYW5rKHZhbHVlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBsdXJhbE1hcCAhPT0gJ29iamVjdCcgfHwgcGx1cmFsTWFwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuUGx1cmFsUGlwZSwgcGx1cmFsTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBPYmplY3Qua2V5cyhwbHVyYWxNYXApLCB0aGlzLl9sb2NhbGl6YXRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHBsdXJhbE1hcFtrZXldLnJlcGxhY2UoX0lOVEVSUE9MQVRJT05fUkVHRVhQLCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfTtcbiAgICAgICAgSTE4blBsdXJhbFBpcGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5QaXBlLCBhcmdzOiBbeyBuYW1lOiAnaTE4blBsdXJhbCcsIHB1cmU6IHRydWUgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBJMThuUGx1cmFsUGlwZS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgdHlwZTogTmdMb2NhbGl6YXRpb24sIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBJMThuUGx1cmFsUGlwZTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogV2hlcmUgYG1hcHBpbmdgIGlzIGFuIG9iamVjdCB0aGF0IGluZGljYXRlcyB0aGUgdGV4dCB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgICogZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIGBleHByZXNzaW9uYC5cbiAgICAgICogSWYgbm9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGBleHByZXNzaW9uYCwgdGhlbiB0aGUgY29udGVudFxuICAgICAgKiBvZiB0aGUgYG90aGVyYCBrZXkgaXMgcmV0dXJuZWQgd2hlbiBwcmVzZW50LCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICAgICAgKiAqXG4gICAgICAqICMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2kxOG5fcGlwZS50cyByZWdpb249J0kxOG5TZWxlY3RQaXBlQ29tcG9uZW50J31cbiAgICAgICogKlxuICAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICovXG4gICAgdmFyIEkxOG5TZWxlY3RQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSTE4blNlbGVjdFBpcGUoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIHs/fSBtYXBwaW5nXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBJMThuU2VsZWN0UGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBtYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEkxOG5TZWxlY3RQaXBlLCBtYXBwaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KCdvdGhlcicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdbJ290aGVyJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH07XG4gICAgICAgIEkxOG5TZWxlY3RQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ2kxOG5TZWxlY3QnLCBwdXJlOiB0cnVlIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgSTE4blNlbGVjdFBpcGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgICAgcmV0dXJuIEkxOG5TZWxlY3RQaXBlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBDb252ZXJ0cyB2YWx1ZSBpbnRvIHN0cmluZyB1c2luZyBgSlNPTi5zdHJpbmdpZnlgLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2pzb25fcGlwZS50cyByZWdpb249J0pzb25QaXBlJ31cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBKc29uUGlwZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIEpzb25QaXBlKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBKc29uUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7IH07XG4gICAgICAgIEpzb25QaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ2pzb24nLCBwdXJlOiBmYWxzZSB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIEpzb25QaXBlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBKc29uUGlwZTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogQ29udmVydHMgdmFsdWUgaW50byBhIGxvd2VyY2FzZSBzdHJpbmcgdXNpbmcgYFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UoKWAuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2xvd2VydXBwZXJfcGlwZS50cyByZWdpb249J0xvd2VyVXBwZXJQaXBlJ31cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBMb3dlckNhc2VQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gTG93ZXJDYXNlUGlwZSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgTG93ZXJDYXNlUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNCbGFuayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKExvd2VyQ2FzZVBpcGUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9O1xuICAgICAgICBMb3dlckNhc2VQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ2xvd2VyY2FzZScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBMb3dlckNhc2VQaXBlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBMb3dlckNhc2VQaXBlO1xuICAgIH0oKSk7XG5cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfTlVNQkVSX0ZPUk1BVF9SRUdFWFAgPSAvXihcXGQrKT9cXC4oKFxcZCspKC0oXFxkKykpPyk/JC87XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBwaXBlXG4gICAgICogQHBhcmFtIHs/fSBsb2NhbGVcbiAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICogQHBhcmFtIHs/fSBzdHlsZVxuICAgICAqIEBwYXJhbSB7P30gZGlnaXRzXG4gICAgICogQHBhcmFtIHs/PX0gY3VycmVuY3lcbiAgICAgKiBAcGFyYW0gez89fSBjdXJyZW5jeUFzU3ltYm9sXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JtYXROdW1iZXIocGlwZSwgbG9jYWxlLCB2YWx1ZSwgc3R5bGUsIGRpZ2l0cywgY3VycmVuY3ksIGN1cnJlbmN5QXNTeW1ib2wpIHtcbiAgICAgICAgaWYgKGN1cnJlbmN5ID09PSB2b2lkIDApIHsgY3VycmVuY3kgPSBudWxsOyB9XG4gICAgICAgIGlmIChjdXJyZW5jeUFzU3ltYm9sID09PSB2b2lkIDApIHsgY3VycmVuY3lBc1N5bWJvbCA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChpc0JsYW5rKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb252ZXJ0IHN0cmluZ3MgdG8gbnVtYmVyc1xuICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgTnVtYmVyV3JhcHBlci5pc051bWVyaWModmFsdWUpID8gK3ZhbHVlIDogdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKHBpcGUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtaW5JbnQ7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1pbkZyYWN0aW9uO1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXhGcmFjdGlvbjtcbiAgICAgICAgaWYgKHN0eWxlICE9PSBOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeSkge1xuICAgICAgICAgICAgLy8gcmVseSBvbiBJbnRsIGRlZmF1bHQgZm9yIGN1cnJlbmN5XG4gICAgICAgICAgICBtaW5JbnQgPSAxO1xuICAgICAgICAgICAgbWluRnJhY3Rpb24gPSAwO1xuICAgICAgICAgICAgbWF4RnJhY3Rpb24gPSAzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWdpdHMpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcnRzID0gZGlnaXRzLm1hdGNoKF9OVU1CRVJfRk9STUFUX1JFR0VYUCk7XG4gICAgICAgICAgICBpZiAocGFydHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGlnaXRzICsgXCIgaXMgbm90IGEgdmFsaWQgZGlnaXQgaW5mbyBmb3IgbnVtYmVyIHBpcGVzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzUHJlc2VudChwYXJ0c1sxXSkpIHtcbiAgICAgICAgICAgICAgICBtaW5JbnQgPSBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHBhcnRzWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFydHNbM10pKSB7XG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb24gPSBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHBhcnRzWzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQocGFydHNbNV0pKSB7XG4gICAgICAgICAgICAgICAgbWF4RnJhY3Rpb24gPSBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHBhcnRzWzVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTnVtYmVyRm9ybWF0dGVyLmZvcm1hdCgvKiogQHR5cGUgez99ICovICh2YWx1ZSksIGxvY2FsZSwgc3R5bGUsIHtcbiAgICAgICAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5JbnQsXG4gICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uLFxuICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhGcmFjdGlvbixcbiAgICAgICAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcbiAgICAgICAgICAgIGN1cnJlbmN5QXNTeW1ib2w6IGN1cnJlbmN5QXNTeW1ib2wsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBGb3JtYXRzIGEgbnVtYmVyIGFzIHRleHQuIEdyb3VwIHNpemluZyBhbmQgc2VwYXJhdG9yIGFuZCBvdGhlciBsb2NhbGUtc3BlY2lmaWNcbiAgICAgICogY29uZmlndXJhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBhY3RpdmUgbG9jYWxlLlxuICAgICAgKiAqXG4gICAgICAqIHdoZXJlIGBleHByZXNzaW9uYCBpcyBhIG51bWJlcjpcbiAgICAgICogLSBgZGlnaXRJbmZvYCBpcyBhIGBzdHJpbmdgIHdoaWNoIGhhcyBhIGZvbGxvd2luZyBmb3JtYXQ6IDxicj5cbiAgICAgICogPGNvZGU+e21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfTwvY29kZT5cbiAgICAgICogLSBgbWluSW50ZWdlckRpZ2l0c2AgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIHRvIHVzZS4gRGVmYXVsdHMgdG8gYDFgLlxuICAgICAgKiAtIGBtaW5GcmFjdGlvbkRpZ2l0c2AgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbi4gRGVmYXVsdHMgdG8gYDBgLlxuICAgICAgKiAtIGBtYXhGcmFjdGlvbkRpZ2l0c2AgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbi4gRGVmYXVsdHMgdG8gYDNgLlxuICAgICAgKiAqXG4gICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhY2NlcHRhYmxlIHJhbmdlIGZvciBlYWNoIG9mIHRoZXNlIG51bWJlcnMgYW5kIG90aGVyXG4gICAgICAqIGRldGFpbHMgc2VlIHlvdXIgbmF0aXZlIGludGVybmF0aW9uYWxpemF0aW9uIGxpYnJhcnkuXG4gICAgICAqICpcbiAgICAgICogV0FSTklORzogdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnNcbiAgICAgICogYW5kIG1heSByZXF1aXJlIGEgcG9seWZpbGwuIFNlZSB7QGxpbmtEb2NzIGd1aWRlL2Jyb3dzZXItc3VwcG9ydH0gZm9yIGRldGFpbHMuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL251bWJlcl9waXBlLnRzIHJlZ2lvbj0nTnVtYmVyUGlwZSd9XG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgRGVjaW1hbFBpcGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfbG9jYWxlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBEZWNpbWFsUGlwZShfbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGRpZ2l0c1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgRGVjaW1hbFBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSwgZGlnaXRzKSB7XG4gICAgICAgICAgICBpZiAoZGlnaXRzID09PSB2b2lkIDApIHsgZGlnaXRzID0gbnVsbDsgfVxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcihEZWNpbWFsUGlwZSwgdGhpcy5fbG9jYWxlLCB2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbCwgZGlnaXRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgRGVjaW1hbFBpcGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5QaXBlLCBhcmdzOiBbeyBuYW1lOiAnbnVtYmVyJyB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIERlY2ltYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0LCBhcmdzOiBbX2FuZ3VsYXJfY29yZS5MT0NBTEVfSUQsXSB9LF0gfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIERlY2ltYWxQaXBlO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogICpcbiAgICAgICogKlxuICAgICAgKiBGb3JtYXRzIGEgbnVtYmVyIGFzIHBlcmNlbnRhZ2UuXG4gICAgICAqICpcbiAgICAgICogLSBgZGlnaXRJbmZvYCBTZWUge0BsaW5rIERlY2ltYWxQaXBlfSBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24uXG4gICAgICAqICpcbiAgICAgICogV0FSTklORzogdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnNcbiAgICAgICogYW5kIG1heSByZXF1aXJlIGEgcG9seWZpbGwuIFNlZSB7QGxpbmtEb2NzIGd1aWRlL2Jyb3dzZXItc3VwcG9ydH0gZm9yIGRldGFpbHMuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL251bWJlcl9waXBlLnRzIHJlZ2lvbj0nUGVyY2VudFBpcGUnfVxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIFBlcmNlbnRQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2xvY2FsZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUGVyY2VudFBpcGUoX2xvY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFBlcmNlbnRQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIGRpZ2l0cykge1xuICAgICAgICAgICAgaWYgKGRpZ2l0cyA9PT0gdm9pZCAwKSB7IGRpZ2l0cyA9IG51bGw7IH1cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXROdW1iZXIoUGVyY2VudFBpcGUsIHRoaXMuX2xvY2FsZSwgdmFsdWUsIE51bWJlckZvcm1hdFN0eWxlLlBlcmNlbnQsIGRpZ2l0cyk7XG4gICAgICAgIH07XG4gICAgICAgIFBlcmNlbnRQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ3BlcmNlbnQnIH0sXSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgUGVyY2VudFBpcGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3QsIGFyZ3M6IFtfYW5ndWxhcl9jb3JlLkxPQ0FMRV9JRCxdIH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gUGVyY2VudFBpcGU7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBVc2UgYGN1cnJlbmN5YCB0byBmb3JtYXQgYSBudW1iZXIgYXMgY3VycmVuY3kuXG4gICAgICAqICpcbiAgICAgICogLSBgY3VycmVuY3lDb2RlYCBpcyB0aGUgW0lTTyA0MjE3XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNDIxNykgY3VycmVuY3kgY29kZSwgc3VjaFxuICAgICAgKiBhcyBgVVNEYCBmb3IgdGhlIFVTIGRvbGxhciBhbmQgYEVVUmAgZm9yIHRoZSBldXJvLlxuICAgICAgKiAtIGBzeW1ib2xEaXNwbGF5YCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSB0aGUgY3VycmVuY3kgc3ltYm9sIG9yIGNvZGUuXG4gICAgICAqIC0gYHRydWVgOiB1c2Ugc3ltYm9sIChlLmcuIGAkYCkuXG4gICAgICAqIC0gYGZhbHNlYChkZWZhdWx0KTogdXNlIGNvZGUgKGUuZy4gYFVTRGApLlxuICAgICAgKiAtIGBkaWdpdEluZm9gIFNlZSB7QGxpbmsgRGVjaW1hbFBpcGV9IGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAgICAgICogKlxuICAgICAgKiBXQVJOSU5HOiB0aGlzIHBpcGUgdXNlcyB0aGUgSW50ZXJuYXRpb25hbGl6YXRpb24gQVBJIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGluIGFsbCBicm93c2Vyc1xuICAgICAgKiBhbmQgbWF5IHJlcXVpcmUgYSBwb2x5ZmlsbC4gU2VlIHtAbGlua0RvY3MgZ3VpZGUvYnJvd3Nlci1zdXBwb3J0fSBmb3IgZGV0YWlscy5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvbnVtYmVyX3BpcGUudHMgcmVnaW9uPSdDdXJyZW5jeVBpcGUnfVxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEN1cnJlbmN5UGlwZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEN1cnJlbmN5UGlwZShfbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGN1cnJlbmN5Q29kZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBzeW1ib2xEaXNwbGF5XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGRpZ2l0c1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQ3VycmVuY3lQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIGN1cnJlbmN5Q29kZSwgc3ltYm9sRGlzcGxheSwgZGlnaXRzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVuY3lDb2RlID09PSB2b2lkIDApIHsgY3VycmVuY3lDb2RlID0gJ1VTRCc7IH1cbiAgICAgICAgICAgIGlmIChzeW1ib2xEaXNwbGF5ID09PSB2b2lkIDApIHsgc3ltYm9sRGlzcGxheSA9IGZhbHNlOyB9XG4gICAgICAgICAgICBpZiAoZGlnaXRzID09PSB2b2lkIDApIHsgZGlnaXRzID0gbnVsbDsgfVxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcihDdXJyZW5jeVBpcGUsIHRoaXMuX2xvY2FsZSwgdmFsdWUsIE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5LCBkaWdpdHMsIGN1cnJlbmN5Q29kZSwgc3ltYm9sRGlzcGxheSk7XG4gICAgICAgIH07XG4gICAgICAgIEN1cnJlbmN5UGlwZS5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLlBpcGUsIGFyZ3M6IFt7IG5hbWU6ICdjdXJyZW5jeScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBDdXJyZW5jeVBpcGUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3QsIGFyZ3M6IFtfYW5ndWxhcl9jb3JlLkxPQ0FMRV9JRCxdIH0sXSB9LFxuICAgICAgICBdOyB9O1xuICAgICAgICByZXR1cm4gQ3VycmVuY3lQaXBlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBXaGVyZSB0aGUgaW5wdXQgZXhwcmVzc2lvbiBpcyBhIGBMaXN0YCBvciBgU3RyaW5nYCwgYW5kOlxuICAgICAgKiAtIGBzdGFydGA6IFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc3Vic2V0IHRvIHJldHVybi5cbiAgICAgICogLSAqKmEgcG9zaXRpdmUgaW50ZWdlcioqOiByZXR1cm4gdGhlIGl0ZW0gYXQgYHN0YXJ0YCBpbmRleCBhbmQgYWxsIGl0ZW1zIGFmdGVyXG4gICAgICAqIGluIHRoZSBsaXN0IG9yIHN0cmluZyBleHByZXNzaW9uLlxuICAgICAgKiAtICoqYSBuZWdhdGl2ZSBpbnRlZ2VyKio6IHJldHVybiB0aGUgaXRlbSBhdCBgc3RhcnRgIGluZGV4IGZyb20gdGhlIGVuZCBhbmQgYWxsIGl0ZW1zIGFmdGVyXG4gICAgICAqIGluIHRoZSBsaXN0IG9yIHN0cmluZyBleHByZXNzaW9uLlxuICAgICAgKiAtICoqaWYgcG9zaXRpdmUgYW5kIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbioqOiByZXR1cm4gYW4gZW1wdHkgbGlzdCBvciBzdHJpbmcuXG4gICAgICAqIC0gKippZiBuZWdhdGl2ZSBhbmQgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBleHByZXNzaW9uKio6IHJldHVybiBlbnRpcmUgbGlzdCBvciBzdHJpbmcuXG4gICAgICAqIC0gYGVuZGA6IFRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHN1YnNldCB0byByZXR1cm4uXG4gICAgICAqIC0gKipvbWl0dGVkKio6IHJldHVybiBhbGwgaXRlbXMgdW50aWwgdGhlIGVuZC5cbiAgICAgICogLSAqKmlmIHBvc2l0aXZlKio6IHJldHVybiBhbGwgaXRlbXMgYmVmb3JlIGBlbmRgIGluZGV4IG9mIHRoZSBsaXN0IG9yIHN0cmluZy5cbiAgICAgICogLSAqKmlmIG5lZ2F0aXZlKio6IHJldHVybiBhbGwgaXRlbXMgYmVmb3JlIGBlbmRgIGluZGV4IGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCBvciBzdHJpbmcuXG4gICAgICAqICpcbiAgICAgICogQWxsIGJlaGF2aW9yIGlzIGJhc2VkIG9uIHRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiB0aGUgSmF2YVNjcmlwdCBBUEkgYEFycmF5LnByb3RvdHlwZS5zbGljZSgpYFxuICAgICAgKiBhbmQgYFN0cmluZy5wcm90b3R5cGUuc2xpY2UoKWAuXG4gICAgICAqICpcbiAgICAgICogV2hlbiBvcGVyYXRpbmcgb24gYSBbTGlzdF0sIHRoZSByZXR1cm5lZCBsaXN0IGlzIGFsd2F5cyBhIGNvcHkgZXZlbiB3aGVuIGFsbFxuICAgICAgKiB0aGUgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkLlxuICAgICAgKiAqXG4gICAgICAqIFdoZW4gb3BlcmF0aW5nIG9uIGEgYmxhbmsgdmFsdWUsIHRoZSBwaXBlIHJldHVybnMgdGhlIGJsYW5rIHZhbHVlLlxuICAgICAgKiAqXG4gICAgICAqICMjIExpc3QgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIFRoaXMgYG5nRm9yYCBleGFtcGxlOlxuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvc2xpY2VfcGlwZS50cyByZWdpb249J1NsaWNlUGlwZV9saXN0J31cbiAgICAgICogKlxuICAgICAgKiBwcm9kdWNlcyB0aGUgZm9sbG93aW5nOlxuICAgICAgKiAqXG4gICAgICAqIDxsaT5iPC9saT5cbiAgICAgICogPGxpPmM8L2xpPlxuICAgICAgKiAqXG4gICAgICAqICMjIFN0cmluZyBFeGFtcGxlc1xuICAgICAgKiAqXG4gICAgICAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvc2xpY2VfcGlwZS50cyByZWdpb249J1NsaWNlUGlwZV9zdHJpbmcnfVxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIFNsaWNlUGlwZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFNsaWNlUGlwZSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcGFyYW0gez99IHN0YXJ0XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGVuZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgU2xpY2VQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGlmIChpc0JsYW5rKHZhbHVlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFcnJvcihTbGljZVBpcGUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gb2JqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBTbGljZVBpcGUucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShvYmopOyB9O1xuICAgICAgICBTbGljZVBpcGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5QaXBlLCBhcmdzOiBbeyBuYW1lOiAnc2xpY2UnLCBwdXJlOiBmYWxzZSB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIFNsaWNlUGlwZS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gU2xpY2VQaXBlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgKlxuICAgICAgKiBDb252ZXJ0cyB2YWx1ZSBpbnRvIGFuIHVwcGVyY2FzZSBzdHJpbmcgdXNpbmcgYFN0cmluZy5wcm90b3R5cGUudG9VcHBlckNhc2UoKWAuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2xvd2VydXBwZXJfcGlwZS50cyByZWdpb249J0xvd2VyVXBwZXJQaXBlJ31cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBVcHBlckNhc2VQaXBlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gVXBwZXJDYXNlUGlwZSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVXBwZXJDYXNlUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNCbGFuayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEVycm9yKFVwcGVyQ2FzZVBpcGUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB9O1xuICAgICAgICBVcHBlckNhc2VQaXBlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuUGlwZSwgYXJnczogW3sgbmFtZTogJ3VwcGVyY2FzZScgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBVcHBlckNhc2VQaXBlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBVcHBlckNhc2VQaXBlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBwaXBlcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBpbiBlYWNoIGFuZCBldmVyeSBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBDT01NT05fUElQRVMgPSBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVXBwZXJDYXNlUGlwZSxcbiAgICAgICAgTG93ZXJDYXNlUGlwZSxcbiAgICAgICAgSnNvblBpcGUsXG4gICAgICAgIFNsaWNlUGlwZSxcbiAgICAgICAgRGVjaW1hbFBpcGUsXG4gICAgICAgIFBlcmNlbnRQaXBlLFxuICAgICAgICBDdXJyZW5jeVBpcGUsXG4gICAgICAgIERhdGVQaXBlLFxuICAgICAgICBJMThuUGx1cmFsUGlwZSxcbiAgICAgICAgSTE4blNlbGVjdFBpcGUsXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqICBUaGUgbW9kdWxlIHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBiYXNpYyBBbmd1bGFyIGRpcmVjdGl2ZXMgbGlrZSB7QGxpbmsgTmdJZn0sIHtAbGluayBOZ0Zvcn0sIC4uLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIENvbW1vbk1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbW1vbk1vZHVsZSgpIHtcbiAgICAgICAgfVxuICAgICAgICBDb21tb25Nb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5OZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0NPTU1PTl9ESVJFQ1RJVkVTLCBDT01NT05fUElQRVNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0NPTU1PTl9ESVJFQ1RJVkVTLCBDT01NT05fUElQRVNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBOZ0xvY2FsaXphdGlvbiwgdXNlQ2xhc3M6IE5nTG9jYWxlTG9jYWxpemF0aW9uIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LF0gfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIENvbW1vbk1vZHVsZS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gQ29tbW9uTW9kdWxlO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBAc3RhYmxlXG4gICAgICovXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVkVSU0lPTiA9IG5ldyBfYW5ndWxhcl9jb3JlLlZlcnNpb24oJzIuNC4xJyk7XG5cbiAgICBleHBvcnRzLk5nTG9jYWxpemF0aW9uID0gTmdMb2NhbGl6YXRpb247XG4gICAgZXhwb3J0cy5Db21tb25Nb2R1bGUgPSBDb21tb25Nb2R1bGU7XG4gICAgZXhwb3J0cy5OZ0NsYXNzID0gTmdDbGFzcztcbiAgICBleHBvcnRzLk5nRm9yID0gTmdGb3I7XG4gICAgZXhwb3J0cy5OZ0lmID0gTmdJZjtcbiAgICBleHBvcnRzLk5nUGx1cmFsID0gTmdQbHVyYWw7XG4gICAgZXhwb3J0cy5OZ1BsdXJhbENhc2UgPSBOZ1BsdXJhbENhc2U7XG4gICAgZXhwb3J0cy5OZ1N0eWxlID0gTmdTdHlsZTtcbiAgICBleHBvcnRzLk5nU3dpdGNoID0gTmdTd2l0Y2g7XG4gICAgZXhwb3J0cy5OZ1N3aXRjaENhc2UgPSBOZ1N3aXRjaENhc2U7XG4gICAgZXhwb3J0cy5OZ1N3aXRjaERlZmF1bHQgPSBOZ1N3aXRjaERlZmF1bHQ7XG4gICAgZXhwb3J0cy5OZ1RlbXBsYXRlT3V0bGV0ID0gTmdUZW1wbGF0ZU91dGxldDtcbiAgICBleHBvcnRzLkFzeW5jUGlwZSA9IEFzeW5jUGlwZTtcbiAgICBleHBvcnRzLkRhdGVQaXBlID0gRGF0ZVBpcGU7XG4gICAgZXhwb3J0cy5JMThuUGx1cmFsUGlwZSA9IEkxOG5QbHVyYWxQaXBlO1xuICAgIGV4cG9ydHMuSTE4blNlbGVjdFBpcGUgPSBJMThuU2VsZWN0UGlwZTtcbiAgICBleHBvcnRzLkpzb25QaXBlID0gSnNvblBpcGU7XG4gICAgZXhwb3J0cy5Mb3dlckNhc2VQaXBlID0gTG93ZXJDYXNlUGlwZTtcbiAgICBleHBvcnRzLkN1cnJlbmN5UGlwZSA9IEN1cnJlbmN5UGlwZTtcbiAgICBleHBvcnRzLkRlY2ltYWxQaXBlID0gRGVjaW1hbFBpcGU7XG4gICAgZXhwb3J0cy5QZXJjZW50UGlwZSA9IFBlcmNlbnRQaXBlO1xuICAgIGV4cG9ydHMuU2xpY2VQaXBlID0gU2xpY2VQaXBlO1xuICAgIGV4cG9ydHMuVXBwZXJDYXNlUGlwZSA9IFVwcGVyQ2FzZVBpcGU7XG4gICAgZXhwb3J0cy5WRVJTSU9OID0gVkVSU0lPTjtcbiAgICBleHBvcnRzLlZlcnNpb24gPSBfYW5ndWxhcl9jb3JlLlZlcnNpb247XG4gICAgZXhwb3J0cy5QbGF0Zm9ybUxvY2F0aW9uID0gUGxhdGZvcm1Mb2NhdGlvbjtcbiAgICBleHBvcnRzLkxvY2F0aW9uU3RyYXRlZ3kgPSBMb2NhdGlvblN0cmF0ZWd5O1xuICAgIGV4cG9ydHMuQVBQX0JBU0VfSFJFRiA9IEFQUF9CQVNFX0hSRUY7XG4gICAgZXhwb3J0cy5IYXNoTG9jYXRpb25TdHJhdGVneSA9IEhhc2hMb2NhdGlvblN0cmF0ZWd5O1xuICAgIGV4cG9ydHMuUGF0aExvY2F0aW9uU3RyYXRlZ3kgPSBQYXRoTG9jYXRpb25TdHJhdGVneTtcbiAgICBleHBvcnRzLkxvY2F0aW9uID0gTG9jYXRpb247XG5cbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vQGFuZ3VsYXIvY29tbW9uL2J1bmRsZXMvY29tbW9uLnVtZC5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  94. /***/ },
  95. /* 24 */,
  96. /* 25 */,
  97. /* 26 */
  98. /***/ function(module, exports, __webpack_require__) {
  99. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\n/* tslint:disable:max-line-length */\n/**\n * @param PromiseCtor\n * @return {Promise<T>}\n * @method toPromise\n * @owner Observable\n */\nfunction toPromise(PromiseCtor) {\n var _this = this;\n if (!PromiseCtor) {\n if (root_1.root.Rx && root_1.root.Rx.config && root_1.root.Rx.config.Promise) {\n PromiseCtor = root_1.root.Rx.config.Promise;\n }\n else if (root_1.root.Promise) {\n PromiseCtor = root_1.root.Promise;\n }\n }\n if (!PromiseCtor) {\n throw new Error('no Promise impl found');\n }\n return new PromiseCtor(function (resolve, reject) {\n var value;\n _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });\n });\n}\nexports.toPromise = toPromise;\n//# sourceMappingURL=toPromise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvdG9Qcm9taXNlLmpzPzA3NWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9yb290Jyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogQHBhcmFtIFByb21pc2VDdG9yXG4gKiBAcmV0dXJuIHtQcm9taXNlPFQ+fVxuICogQG1ldGhvZCB0b1Byb21pc2VcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRvUHJvbWlzZShQcm9taXNlQ3Rvcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgaWYgKCFQcm9taXNlQ3Rvcikge1xuICAgICAgICBpZiAocm9vdF8xLnJvb3QuUnggJiYgcm9vdF8xLnJvb3QuUnguY29uZmlnICYmIHJvb3RfMS5yb290LlJ4LmNvbmZpZy5Qcm9taXNlKSB7XG4gICAgICAgICAgICBQcm9taXNlQ3RvciA9IHJvb3RfMS5yb290LlJ4LmNvbmZpZy5Qcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3RfMS5yb290LlByb21pc2UpIHtcbiAgICAgICAgICAgIFByb21pc2VDdG9yID0gcm9vdF8xLnJvb3QuUHJvbWlzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIVByb21pc2VDdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gUHJvbWlzZSBpbXBsIGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZUN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIF90aGlzLnN1YnNjcmliZShmdW5jdGlvbiAoeCkgeyByZXR1cm4gdmFsdWUgPSB4OyB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiByZWplY3QoZXJyKTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7IH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy50b1Byb21pc2UgPSB0b1Byb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b1Byb21pc2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdG9Qcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  100. /***/ },
  101. /* 27 */
  102. /***/ function(module, exports, __webpack_require__) {
  103. eval("\"use strict\";\nvar PromiseObservable_1 = __webpack_require__(28);\nexports.fromPromise = PromiseObservable_1.PromiseObservable.create;\n//# sourceMappingURL=fromPromise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZS5qcz9lMDNhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIFByb21pc2VPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL1Byb21pc2VPYnNlcnZhYmxlJyk7XG5leHBvcnRzLmZyb21Qcm9taXNlID0gUHJvbWlzZU9ic2VydmFibGVfMS5Qcm9taXNlT2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tUHJvbWlzZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlLmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  104. /***/ },
  105. /* 28 */
  106. /***/ function(module, exports, __webpack_require__) {
  107. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = __webpack_require__(7);\nvar Observable_1 = __webpack_require__(6);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar PromiseObservable = (function (_super) {\n __extends(PromiseObservable, _super);\n function PromiseObservable(promise, scheduler) {\n _super.call(this);\n this.promise = promise;\n this.scheduler = scheduler;\n }\n /**\n * Converts a Promise to an Observable.\n *\n * <span class=\"informal\">Returns an Observable that just emits the Promise's\n * resolved value, then completes.</span>\n *\n * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an\n * Observable. If the Promise resolves with a value, the output Observable\n * emits that resolved value as a `next`, and then completes. If the Promise\n * is rejected, then the output Observable emits the corresponding Error.\n *\n * @example <caption>Convert the Promise returned by Fetch to an Observable</caption>\n * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link bindCallback}\n * @see {@link from}\n *\n * @param {Promise<T>} promise The promise to be converted.\n * @param {Scheduler} [scheduler] An optional Scheduler to use for scheduling\n * the delivery of the resolved value (or the rejection).\n * @return {Observable<T>} An Observable which wraps the Promise.\n * @static true\n * @name fromPromise\n * @owner Observable\n */\n PromiseObservable.create = function (promise, scheduler) {\n return new PromiseObservable(promise, scheduler);\n };\n PromiseObservable.prototype._subscribe = function (subscriber) {\n var _this = this;\n var promise = this.promise;\n var scheduler = this.scheduler;\n if (scheduler == null) {\n if (this._isScalar) {\n if (!subscriber.closed) {\n subscriber.next(this.value);\n subscriber.complete();\n }\n }\n else {\n promise.then(function (value) {\n _this.value = value;\n _this._isScalar = true;\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n }, function (err) {\n if (!subscriber.closed) {\n subscriber.error(err);\n }\n })\n .then(null, function (err) {\n // escape the promise trap, throw unhandled errors\n root_1.root.setTimeout(function () { throw err; });\n });\n }\n }\n else {\n if (this._isScalar) {\n if (!subscriber.closed) {\n return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber: subscriber });\n }\n }\n else {\n promise.then(function (value) {\n _this.value = value;\n _this._isScalar = true;\n if (!subscriber.closed) {\n subscriber.add(scheduler.schedule(dispatchNext, 0, { value: value, subscriber: subscriber }));\n }\n }, function (err) {\n if (!subscriber.closed) {\n subscriber.add(scheduler.schedule(dispatchError, 0, { err: err, subscriber: subscriber }));\n }\n })\n .then(null, function (err) {\n // escape the promise trap, throw unhandled errors\n root_1.root.setTimeout(function () { throw err; });\n });\n }\n }\n };\n return PromiseObservable;\n}(Observable_1.Observable));\nexports.PromiseObservable = PromiseObservable;\nfunction dispatchNext(arg) {\n var value = arg.value, subscriber = arg.subscriber;\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n}\nfunction dispatchError(arg) {\n var err = arg.err, subscriber = arg.subscriber;\n if (!subscriber.closed) {\n subscriber.error(err);\n }\n}\n//# sourceMappingURL=PromiseObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9Qcm9taXNlT2JzZXJ2YWJsZS5qcz80ZTk4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9yb290Jyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBQcm9taXNlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFByb21pc2VPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByb21pc2VPYnNlcnZhYmxlKHByb21pc2UsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgUHJvbWlzZSB0byBhbiBPYnNlcnZhYmxlLlxuICAgICAqXG4gICAgICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPlJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGp1c3QgZW1pdHMgdGhlIFByb21pc2Unc1xuICAgICAqIHJlc29sdmVkIHZhbHVlLCB0aGVuIGNvbXBsZXRlcy48L3NwYW4+XG4gICAgICpcbiAgICAgKiBDb252ZXJ0cyBhbiBFUzIwMTUgUHJvbWlzZSBvciBhIFByb21pc2VzL0ErIHNwZWMgY29tcGxpYW50IFByb21pc2UgdG8gYW5cbiAgICAgKiBPYnNlcnZhYmxlLiBJZiB0aGUgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGEgdmFsdWUsIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZVxuICAgICAqIGVtaXRzIHRoYXQgcmVzb2x2ZWQgdmFsdWUgYXMgYSBgbmV4dGAsIGFuZCB0aGVuIGNvbXBsZXRlcy4gSWYgdGhlIFByb21pc2VcbiAgICAgKiBpcyByZWplY3RlZCwgdGhlbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgZW1pdHMgdGhlIGNvcnJlc3BvbmRpbmcgRXJyb3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5Db252ZXJ0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IEZldGNoIHRvIGFuIE9ic2VydmFibGU8L2NhcHRpb24+XG4gICAgICogdmFyIHJlc3VsdCA9IFJ4Lk9ic2VydmFibGUuZnJvbVByb21pc2UoZmV0Y2goJ2h0dHA6Ly9teXNlcnZlci5jb20vJykpO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSwgZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGJpbmRDYWxsYmFja31cbiAgICAgKiBAc2VlIHtAbGluayBmcm9tfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9taXNlPFQ+fSBwcm9taXNlIFRoZSBwcm9taXNlIHRvIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gQW4gb3B0aW9uYWwgU2NoZWR1bGVyIHRvIHVzZSBmb3Igc2NoZWR1bGluZ1xuICAgICAqIHRoZSBkZWxpdmVyeSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUgKG9yIHRoZSByZWplY3Rpb24pLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgd2hpY2ggd3JhcHMgdGhlIFByb21pc2UuXG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgZnJvbVByb21pc2VcbiAgICAgKiBAb3duZXIgT2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIFByb21pc2VPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlT2JzZXJ2YWJsZShwcm9taXNlLCBzY2hlZHVsZXIpO1xuICAgIH07XG4gICAgUHJvbWlzZU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZTtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICBpZiAoc2NoZWR1bGVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1NjYWxhcikge1xuICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5faXNTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzY2FwZSB0aGUgcHJvbWlzZSB0cmFwLCB0aHJvdyB1bmhhbmRsZWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIHJvb3RfMS5yb290LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2NhbGFyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCwgMCwgeyB2YWx1ZTogdGhpcy52YWx1ZSwgc3Vic2NyaWJlcjogc3Vic2NyaWJlciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9pc1NjYWxhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaE5leHQsIDAsIHsgdmFsdWU6IHZhbHVlLCBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoRXJyb3IsIDAsIHsgZXJyOiBlcnIsIHN1YnNjcmliZXI6IHN1YnNjcmliZXIgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGUgdGhlIHByb21pc2UgdHJhcCwgdGhyb3cgdW5oYW5kbGVkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICByb290XzEucm9vdC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyOyB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFByb21pc2VPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5Qcm9taXNlT2JzZXJ2YWJsZSA9IFByb21pc2VPYnNlcnZhYmxlO1xuZnVuY3Rpb24gZGlzcGF0Y2hOZXh0KGFyZykge1xuICAgIHZhciB2YWx1ZSA9IGFyZy52YWx1ZSwgc3Vic2NyaWJlciA9IGFyZy5zdWJzY3JpYmVyO1xuICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXJyb3IoYXJnKSB7XG4gICAgdmFyIGVyciA9IGFyZy5lcnIsIHN1YnNjcmliZXIgPSBhcmcuc3Vic2NyaWJlcjtcbiAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Qcm9taXNlT2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL1Byb21pc2VPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  108. /***/ },
  109. /* 29 */,
  110. /* 30 */,
  111. /* 31 */,
  112. /* 32 */
  113. /***/ function(module, exports, __webpack_require__) {
  114. eval("/**\n * @license Angular v3.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */(function (global, factory) {\n true ? factory(exports, __webpack_require__(23), __webpack_require__(4), __webpack_require__(33), __webpack_require__(5), __webpack_require__(34), __webpack_require__(46), __webpack_require__(47), __webpack_require__(52), __webpack_require__(53), __webpack_require__(55), __webpack_require__(48), __webpack_require__(56), __webpack_require__(6), __webpack_require__(57), __webpack_require__(58), __webpack_require__(54), __webpack_require__(27), __webpack_require__(60), __webpack_require__(59), __webpack_require__(22), __webpack_require__(61)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/common', '@angular/core', 'rxjs/BehaviorSubject', 'rxjs/Subject', 'rxjs/observable/from', 'rxjs/observable/of', 'rxjs/operator/concatMap', 'rxjs/operator/every', 'rxjs/operator/first', 'rxjs/operator/map', 'rxjs/operator/mergeMap', 'rxjs/operator/reduce', 'rxjs/Observable', 'rxjs/operator/catch', 'rxjs/operator/concatAll', 'rxjs/util/EmptyError', 'rxjs/observable/fromPromise', 'rxjs/operator/last', 'rxjs/operator/mergeAll', '@angular/platform-browser', 'rxjs/operator/filter'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.router = global.ng.router || {}),global.ng.common,global.ng.core,global.Rx,global.Rx,global.Rx.Observable,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.Rx,global.Rx.Observable,global.Rx.Observable.prototype,global.Rx.Observable.prototype,global.ng.platformBrowser,global.Rx.Observable.prototype));\n}(this, function (exports,_angular_common,_angular_core,rxjs_BehaviorSubject,rxjs_Subject,rxjs_observable_from,rxjs_observable_of,rxjs_operator_concatMap,rxjs_operator_every,rxjs_operator_first,rxjs_operator_map,rxjs_operator_mergeMap,rxjs_operator_reduce,rxjs_Observable,rxjs_operator_catch,rxjs_operator_concatAll,rxjs_util_EmptyError,rxjs_observable_fromPromise,l,rxjs_operator_mergeAll,_angular_platformBrowser,rxjs_operator_filter) { 'use strict';\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @whatItDoes Name of the primary outlet.\n *\n * @stable\n */\n var /** @type {?} */ PRIMARY_OUTLET = 'primary';\n var NavigationCancelingError = (function (_super) {\n __extends(NavigationCancelingError, _super);\n /**\n * @param {?} message\n */\n function NavigationCancelingError(message) {\n _super.call(this, message);\n this.message = message;\n this.stack = (new Error(message)).stack;\n }\n /**\n * @return {?}\n */\n NavigationCancelingError.prototype.toString = function () { return this.message; };\n return NavigationCancelingError;\n }(Error));\n /**\n * @param {?} segments\n * @param {?} segmentGroup\n * @param {?} route\n * @return {?}\n */\n function defaultUrlMatcher(segments, segmentGroup, route) {\n var /** @type {?} */ path = route.path;\n var /** @type {?} */ parts = path.split('/');\n var /** @type {?} */ posParams = {};\n var /** @type {?} */ consumed = [];\n var /** @type {?} */ currentIndex = 0;\n for (var /** @type {?} */ i = 0; i < parts.length; ++i) {\n if (currentIndex >= segments.length)\n return null;\n var /** @type {?} */ current = segments[currentIndex];\n var /** @type {?} */ p = parts[i];\n var /** @type {?} */ isPosParam = p.startsWith(':');\n if (!isPosParam && p !== current.path)\n return null;\n if (isPosParam) {\n posParams[p.substring(1)] = current;\n }\n consumed.push(current);\n currentIndex++;\n }\n if (route.pathMatch === 'full' &&\n (segmentGroup.hasChildren() || currentIndex < segments.length)) {\n return null;\n }\n else {\n return { consumed: consumed, posParams: posParams };\n }\n }\n\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function shallowEqualArrays(a, b) {\n if (a.length !== b.length)\n return false;\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n if (!shallowEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function shallowEqual(a, b) {\n var /** @type {?} */ k1 = Object.keys(a);\n var /** @type {?} */ k2 = Object.keys(b);\n if (k1.length != k2.length) {\n return false;\n }\n var /** @type {?} */ key;\n for (var /** @type {?} */ i = 0; i < k1.length; i++) {\n key = k1[i];\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n }\n /**\n * @param {?} a\n * @return {?}\n */\n function flatten(a) {\n var /** @type {?} */ target = [];\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n for (var /** @type {?} */ j = 0; j < a[i].length; ++j) {\n target.push(a[i][j]);\n }\n }\n return target;\n }\n /**\n * @param {?} a\n * @return {?}\n */\n function last(a) {\n return a.length > 0 ? a[a.length - 1] : null;\n }\n /**\n * @param {?} m1\n * @param {?} m2\n * @return {?}\n */\n function merge(m1, m2) {\n var /** @type {?} */ m = {};\n for (var attr in m1) {\n if (m1.hasOwnProperty(attr)) {\n m[attr] = m1[attr];\n }\n }\n for (var attr in m2) {\n if (m2.hasOwnProperty(attr)) {\n m[attr] = m2[attr];\n }\n }\n return m;\n }\n /**\n * @param {?} map\n * @param {?} callback\n * @return {?}\n */\n function forEach(map, callback) {\n for (var prop in map) {\n if (map.hasOwnProperty(prop)) {\n callback(map[prop], prop);\n }\n }\n }\n /**\n * @param {?} obj\n * @param {?} fn\n * @return {?}\n */\n function waitForMap(obj, fn) {\n var /** @type {?} */ waitFor = [];\n var /** @type {?} */ res = {};\n forEach(obj, function (a, k) {\n if (k === PRIMARY_OUTLET) {\n waitFor.push(rxjs_operator_map.map.call(fn(k, a), function (_) {\n res[k] = _;\n return _;\n }));\n }\n });\n forEach(obj, function (a, k) {\n if (k !== PRIMARY_OUTLET) {\n waitFor.push(rxjs_operator_map.map.call(fn(k, a), function (_) {\n res[k] = _;\n return _;\n }));\n }\n });\n if (waitFor.length > 0) {\n var /** @type {?} */ concatted$ = rxjs_operator_concatAll.concatAll.call(rxjs_observable_of.of.apply(void 0, waitFor));\n var /** @type {?} */ last$ = l.last.call(concatted$);\n return rxjs_operator_map.map.call(last$, function () { return res; });\n }\n return rxjs_observable_of.of(res);\n }\n /**\n * @param {?} observables\n * @return {?}\n */\n function andObservables(observables) {\n var /** @type {?} */ merged$ = rxjs_operator_mergeAll.mergeAll.call(observables);\n return rxjs_operator_every.every.call(merged$, function (result) { return result === true; });\n }\n /**\n * @param {?} value\n * @return {?}\n */\n function wrapIntoObservable(value) {\n if (value instanceof rxjs_Observable.Observable) {\n return value;\n }\n if (value instanceof Promise) {\n return rxjs_observable_fromPromise.fromPromise(value);\n }\n return rxjs_observable_of.of(value);\n }\n\n /**\n * @experimental\n */\n var /** @type {?} */ ROUTES = new _angular_core.OpaqueToken('ROUTES');\n var LoadedRouterConfig = (function () {\n /**\n * @param {?} routes\n * @param {?} injector\n * @param {?} factoryResolver\n * @param {?} injectorFactory\n */\n function LoadedRouterConfig(routes, injector, factoryResolver, injectorFactory) {\n this.routes = routes;\n this.injector = injector;\n this.factoryResolver = factoryResolver;\n this.injectorFactory = injectorFactory;\n }\n return LoadedRouterConfig;\n }());\n var RouterConfigLoader = (function () {\n /**\n * @param {?} loader\n * @param {?} compiler\n */\n function RouterConfigLoader(loader, compiler) {\n this.loader = loader;\n this.compiler = compiler;\n }\n /**\n * @param {?} parentInjector\n * @param {?} loadChildren\n * @return {?}\n */\n RouterConfigLoader.prototype.load = function (parentInjector, loadChildren) {\n return rxjs_operator_map.map.call(this.loadModuleFactory(loadChildren), function (r) {\n var /** @type {?} */ ref = r.create(parentInjector);\n var /** @type {?} */ injectorFactory = function (parent) { return r.create(parent).injector; };\n return new LoadedRouterConfig(flatten(ref.injector.get(ROUTES)), ref.injector, ref.componentFactoryResolver, injectorFactory);\n });\n };\n /**\n * @param {?} loadChildren\n * @return {?}\n */\n RouterConfigLoader.prototype.loadModuleFactory = function (loadChildren) {\n var _this = this;\n if (typeof loadChildren === 'string') {\n return rxjs_observable_fromPromise.fromPromise(this.loader.load(loadChildren));\n }\n else {\n var /** @type {?} */ offlineMode_1 = this.compiler instanceof _angular_core.Compiler;\n return rxjs_operator_mergeMap.mergeMap.call(wrapIntoObservable(loadChildren()), function (t) { return offlineMode_1 ? rxjs_observable_of.of(/** @type {?} */ (t)) : rxjs_observable_fromPromise.fromPromise(_this.compiler.compileModuleAsync(t)); });\n }\n };\n return RouterConfigLoader;\n }());\n\n /**\n * @return {?}\n */\n function createEmptyUrlTree() {\n return new UrlTree(new UrlSegmentGroup([], {}), {}, null);\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @param {?} exact\n * @return {?}\n */\n function containsTree(container, containee, exact) {\n if (exact) {\n return equalQueryParams(container.queryParams, containee.queryParams) &&\n equalSegmentGroups(container.root, containee.root);\n }\n return containsQueryParams(container.queryParams, containee.queryParams) &&\n containsSegmentGroup(container.root, containee.root);\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @return {?}\n */\n function equalQueryParams(container, containee) {\n return shallowEqual(container, containee);\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @return {?}\n */\n function equalSegmentGroups(container, containee) {\n if (!equalPath(container.segments, containee.segments))\n return false;\n if (container.numberOfChildren !== containee.numberOfChildren)\n return false;\n for (var c in containee.children) {\n if (!container.children[c])\n return false;\n if (!equalSegmentGroups(container.children[c], containee.children[c]))\n return false;\n }\n return true;\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @return {?}\n */\n function containsQueryParams(container, containee) {\n return Object.keys(containee) <= Object.keys(container) &&\n Object.keys(containee).every(function (key) { return containee[key] === container[key]; });\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @return {?}\n */\n function containsSegmentGroup(container, containee) {\n return containsSegmentGroupHelper(container, containee, containee.segments);\n }\n /**\n * @param {?} container\n * @param {?} containee\n * @param {?} containeePaths\n * @return {?}\n */\n function containsSegmentGroupHelper(container, containee, containeePaths) {\n if (container.segments.length > containeePaths.length) {\n var /** @type {?} */ current = container.segments.slice(0, containeePaths.length);\n if (!equalPath(current, containeePaths))\n return false;\n if (containee.hasChildren())\n return false;\n return true;\n }\n else if (container.segments.length === containeePaths.length) {\n if (!equalPath(container.segments, containeePaths))\n return false;\n for (var c in containee.children) {\n if (!container.children[c])\n return false;\n if (!containsSegmentGroup(container.children[c], containee.children[c]))\n return false;\n }\n return true;\n }\n else {\n var /** @type {?} */ current = containeePaths.slice(0, container.segments.length);\n var /** @type {?} */ next = containeePaths.slice(container.segments.length);\n if (!equalPath(container.segments, current))\n return false;\n if (!container.children[PRIMARY_OUTLET])\n return false;\n return containsSegmentGroupHelper(container.children[PRIMARY_OUTLET], containee, next);\n }\n }\n /**\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(router: Router) {\n * const tree: UrlTree =\n * router.parseUrl('/team/33/(user/victor//support:help)?debug=true#fragment');\n * const f = tree.fragment; // return 'fragment'\n * const q = tree.queryParams; // returns {debug: 'true'}\n * const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n * const s: UrlSegment[] = g.segments; // returns 2 segments 'team' and '33'\n * g.children[PRIMARY_OUTLET].segments; // returns 2 segments 'user' and 'victor'\n * g.children['support'].segments; // return 1 segment 'help'\n * }\n * }\n * ```\n * *\n * *\n * Since a router state is a tree, and the URL is nothing but a serialized state, the URL is a\n * serialized tree.\n * UrlTree is a data structure that provides a lot of affordances in dealing with URLs\n * *\n */\n var UrlTree = (function () {\n /**\n * @param {?} root\n * @param {?} queryParams\n * @param {?} fragment\n */\n function UrlTree(root, queryParams, fragment) {\n this.root = root;\n this.queryParams = queryParams;\n this.fragment = fragment;\n }\n /**\n * @return {?}\n */\n UrlTree.prototype.toString = function () { return new DefaultUrlSerializer().serialize(this); };\n return UrlTree;\n }());\n /**\n * *\n * See {@link UrlTree} for more information.\n * *\n */\n var UrlSegmentGroup = (function () {\n /**\n * @param {?} segments\n * @param {?} children\n */\n function UrlSegmentGroup(segments, children) {\n var _this = this;\n this.segments = segments;\n this.children = children;\n /** The parent node in the url tree */\n this.parent = null;\n forEach(children, function (v, k) { return v.parent = _this; });\n }\n /**\n * Wether the segment has child segments\n * @return {?}\n */\n UrlSegmentGroup.prototype.hasChildren = function () { return this.numberOfChildren > 0; };\n Object.defineProperty(UrlSegmentGroup.prototype, \"numberOfChildren\", {\n /**\n * Number of child segments\n * @return {?}\n */\n get: function () { return Object.keys(this.children).length; },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n UrlSegmentGroup.prototype.toString = function () { return serializePaths(this); };\n return UrlSegmentGroup;\n }());\n /**\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(router: Router) {\n * const tree: UrlTree = router.parseUrl('/team;id=33');\n * const g: UrlSegmentGroup = tree.root.children[PRIMARY_OUTLET];\n * const s: UrlSegment[] = g.segments;\n * s[0].path; // returns 'team'\n * s[0].parameters; // returns {id: 33}\n * }\n * }\n * ```\n * *\n * *\n * A UrlSegment is a part of a URL between the two slashes. It contains a path and the matrix\n * parameters associated with the segment.\n * *\n */\n var UrlSegment = (function () {\n /**\n * @param {?} path\n * @param {?} parameters\n */\n function UrlSegment(path, parameters) {\n this.path = path;\n this.parameters = parameters;\n }\n /**\n * @return {?}\n */\n UrlSegment.prototype.toString = function () { return serializePath(this); };\n return UrlSegment;\n }());\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function equalSegments(a, b) {\n if (a.length !== b.length)\n return false;\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n if (a[i].path !== b[i].path)\n return false;\n if (!shallowEqual(a[i].parameters, b[i].parameters))\n return false;\n }\n return true;\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function equalPath(a, b) {\n if (a.length !== b.length)\n return false;\n for (var /** @type {?} */ i = 0; i < a.length; ++i) {\n if (a[i].path !== b[i].path)\n return false;\n }\n return true;\n }\n /**\n * @param {?} segment\n * @param {?} fn\n * @return {?}\n */\n function mapChildrenIntoArray(segment, fn) {\n var /** @type {?} */ res = [];\n forEach(segment.children, function (child, childOutlet) {\n if (childOutlet === PRIMARY_OUTLET) {\n res = res.concat(fn(child, childOutlet));\n }\n });\n forEach(segment.children, function (child, childOutlet) {\n if (childOutlet !== PRIMARY_OUTLET) {\n res = res.concat(fn(child, childOutlet));\n }\n });\n return res;\n }\n /**\n * *\n * make all URLs case insensitive by providing a custom UrlSerializer.\n * *\n * See {@link DefaultUrlSerializer} for an example of a URL serializer.\n * *\n * @abstract\n */\n var UrlSerializer = (function () {\n function UrlSerializer() {\n }\n /**\n * Parse a url into a {@link UrlTree}\n * @abstract\n * @param {?} url\n * @return {?}\n */\n UrlSerializer.prototype.parse = function (url) { };\n /**\n * Converts a {@link UrlTree} into a url\n * @abstract\n * @param {?} tree\n * @return {?}\n */\n UrlSerializer.prototype.serialize = function (tree) { };\n return UrlSerializer;\n }());\n /**\n * *\n * *\n * Example URLs:\n * *\n * ```\n * /inbox/33(popup:compose)\n * /inbox/33;open=true/messages/44\n * ```\n * *\n * DefaultUrlSerializer uses parentheses to serialize secondary segments (e.g., popup:compose), the\n * colon syntax to specify the outlet, and the ';parameter=value' syntax (e.g., open=true) to\n * specify route specific parameters.\n * *\n */\n var DefaultUrlSerializer = (function () {\n function DefaultUrlSerializer() {\n }\n /**\n * Parses a url into a {@link UrlTree}\n * @param {?} url\n * @return {?}\n */\n DefaultUrlSerializer.prototype.parse = function (url) {\n var /** @type {?} */ p = new UrlParser(url);\n return new UrlTree(p.parseRootSegment(), p.parseQueryParams(), p.parseFragment());\n };\n /**\n * Converts a {@link UrlTree} into a url\n * @param {?} tree\n * @return {?}\n */\n DefaultUrlSerializer.prototype.serialize = function (tree) {\n var /** @type {?} */ segment = \"/\" + serializeSegment(tree.root, true);\n var /** @type {?} */ query = serializeQueryParams(tree.queryParams);\n var /** @type {?} */ fragment = tree.fragment !== null && tree.fragment !== undefined ? \"#\" + encodeURI(tree.fragment) : '';\n return \"\" + segment + query + fragment;\n };\n return DefaultUrlSerializer;\n }());\n /**\n * @param {?} segment\n * @return {?}\n */\n function serializePaths(segment) {\n return segment.segments.map(function (p) { return serializePath(p); }).join('/');\n }\n /**\n * @param {?} segment\n * @param {?} root\n * @return {?}\n */\n function serializeSegment(segment, root) {\n if (segment.hasChildren() && root) {\n var /** @type {?} */ primary = segment.children[PRIMARY_OUTLET] ?\n serializeSegment(segment.children[PRIMARY_OUTLET], false) :\n '';\n var /** @type {?} */ children_1 = [];\n forEach(segment.children, function (v, k) {\n if (k !== PRIMARY_OUTLET) {\n children_1.push(k + \":\" + serializeSegment(v, false));\n }\n });\n if (children_1.length > 0) {\n return primary + \"(\" + children_1.join('//') + \")\";\n }\n else {\n return \"\" + primary;\n }\n }\n else if (segment.hasChildren() && !root) {\n var /** @type {?} */ children = mapChildrenIntoArray(segment, function (v, k) {\n if (k === PRIMARY_OUTLET) {\n return [serializeSegment(segment.children[PRIMARY_OUTLET], false)];\n }\n else {\n return [(k + \":\" + serializeSegment(v, false))];\n }\n });\n return serializePaths(segment) + \"/(\" + children.join('//') + \")\";\n }\n else {\n return serializePaths(segment);\n }\n }\n /**\n * @param {?} s\n * @return {?}\n */\n function encode(s) {\n return encodeURIComponent(s);\n }\n /**\n * @param {?} s\n * @return {?}\n */\n function decode(s) {\n return decodeURIComponent(s);\n }\n /**\n * @param {?} path\n * @return {?}\n */\n function serializePath(path) {\n return \"\" + encode(path.path) + serializeParams(path.parameters);\n }\n /**\n * @param {?} params\n * @return {?}\n */\n function serializeParams(params) {\n return pairs(params).map(function (p) { return (\";\" + encode(p.first) + \"=\" + encode(p.second)); }).join('');\n }\n /**\n * @param {?} params\n * @return {?}\n */\n function serializeQueryParams(params) {\n var /** @type {?} */ strParams = Object.keys(params).map(function (name) {\n var /** @type {?} */ value = params[name];\n return Array.isArray(value) ? value.map(function (v) { return (encode(name) + \"=\" + encode(v)); }).join('&') :\n encode(name) + \"=\" + encode(value);\n });\n return strParams.length ? \"?\" + strParams.join(\"&\") : '';\n }\n var Pair = (function () {\n /**\n * @param {?} first\n * @param {?} second\n */\n function Pair(first, second) {\n this.first = first;\n this.second = second;\n }\n return Pair;\n }());\n /**\n * @param {?} obj\n * @return {?}\n */\n function pairs(obj) {\n var /** @type {?} */ res = [];\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n res.push(new Pair(prop, obj[prop]));\n }\n }\n return res;\n }\n var /** @type {?} */ SEGMENT_RE = /^[^\\/()?;=&#]+/;\n /**\n * @param {?} str\n * @return {?}\n */\n function matchSegments(str) {\n SEGMENT_RE.lastIndex = 0;\n var /** @type {?} */ match = str.match(SEGMENT_RE);\n return match ? match[0] : '';\n }\n var /** @type {?} */ QUERY_PARAM_RE = /^[^=?&#]+/;\n /**\n * @param {?} str\n * @return {?}\n */\n function matchQueryParams(str) {\n QUERY_PARAM_RE.lastIndex = 0;\n var /** @type {?} */ match = str.match(SEGMENT_RE);\n return match ? match[0] : '';\n }\n var /** @type {?} */ QUERY_PARAM_VALUE_RE = /^[^?&#]+/;\n /**\n * @param {?} str\n * @return {?}\n */\n function matchUrlQueryParamValue(str) {\n QUERY_PARAM_VALUE_RE.lastIndex = 0;\n var /** @type {?} */ match = str.match(QUERY_PARAM_VALUE_RE);\n return match ? match[0] : '';\n }\n var UrlParser = (function () {\n /**\n * @param {?} url\n */\n function UrlParser(url) {\n this.url = url;\n this.remaining = url;\n }\n /**\n * @param {?} str\n * @return {?}\n */\n UrlParser.prototype.peekStartsWith = function (str) { return this.remaining.startsWith(str); };\n /**\n * @param {?} str\n * @return {?}\n */\n UrlParser.prototype.capture = function (str) {\n if (!this.remaining.startsWith(str)) {\n throw new Error(\"Expected \\\"\" + str + \"\\\".\");\n }\n this.remaining = this.remaining.substring(str.length);\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseRootSegment = function () {\n if (this.remaining.startsWith('/')) {\n this.capture('/');\n }\n if (this.remaining === '' || this.remaining.startsWith('?') || this.remaining.startsWith('#')) {\n return new UrlSegmentGroup([], {});\n }\n return new UrlSegmentGroup([], this.parseChildren());\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseChildren = function () {\n if (this.remaining.length == 0) {\n return {};\n }\n if (this.peekStartsWith('/')) {\n this.capture('/');\n }\n var /** @type {?} */ paths = [];\n if (!this.peekStartsWith('(')) {\n paths.push(this.parseSegments());\n }\n while (this.peekStartsWith('/') && !this.peekStartsWith('//') && !this.peekStartsWith('/(')) {\n this.capture('/');\n paths.push(this.parseSegments());\n }\n var /** @type {?} */ children = {};\n if (this.peekStartsWith('/(')) {\n this.capture('/');\n children = this.parseParens(true);\n }\n var /** @type {?} */ res = {};\n if (this.peekStartsWith('(')) {\n res = this.parseParens(false);\n }\n if (paths.length > 0 || Object.keys(children).length > 0) {\n res[PRIMARY_OUTLET] = new UrlSegmentGroup(paths, children);\n }\n return res;\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseSegments = function () {\n var /** @type {?} */ path = matchSegments(this.remaining);\n if (path === '' && this.peekStartsWith(';')) {\n throw new Error(\"Empty path url segment cannot have parameters: '\" + this.remaining + \"'.\");\n }\n this.capture(path);\n var /** @type {?} */ matrixParams = {};\n if (this.peekStartsWith(';')) {\n matrixParams = this.parseMatrixParams();\n }\n return new UrlSegment(decode(path), matrixParams);\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseQueryParams = function () {\n var /** @type {?} */ params = {};\n if (this.peekStartsWith('?')) {\n this.capture('?');\n this.parseQueryParam(params);\n while (this.remaining.length > 0 && this.peekStartsWith('&')) {\n this.capture('&');\n this.parseQueryParam(params);\n }\n }\n return params;\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseFragment = function () {\n if (this.peekStartsWith('#')) {\n return decodeURI(this.remaining.substring(1));\n }\n return null;\n };\n /**\n * @return {?}\n */\n UrlParser.prototype.parseMatrixParams = function () {\n var /** @type {?} */ params = {};\n while (this.remaining.length > 0 && this.peekStartsWith(';')) {\n this.capture(';');\n this.parseParam(params);\n }\n return params;\n };\n /**\n * @param {?} params\n * @return {?}\n */\n UrlParser.prototype.parseParam = function (params) {\n var /** @type {?} */ key = matchSegments(this.remaining);\n if (!key) {\n return;\n }\n this.capture(key);\n var /** @type {?} */ value = '';\n if (this.peekStartsWith('=')) {\n this.capture('=');\n var /** @type {?} */ valueMatch = matchSegments(this.remaining);\n if (valueMatch) {\n value = valueMatch;\n this.capture(value);\n }\n }\n params[decode(key)] = decode(value);\n };\n /**\n * @param {?} params\n * @return {?}\n */\n UrlParser.prototype.parseQueryParam = function (params) {\n var /** @type {?} */ key = matchQueryParams(this.remaining);\n if (!key) {\n return;\n }\n this.capture(key);\n var /** @type {?} */ value = '';\n if (this.peekStartsWith('=')) {\n this.capture('=');\n var /** @type {?} */ valueMatch = matchUrlQueryParamValue(this.remaining);\n if (valueMatch) {\n value = valueMatch;\n this.capture(value);\n }\n }\n var /** @type {?} */ decodedKey = decode(key);\n var /** @type {?} */ decodedVal = decode(value);\n if (params.hasOwnProperty(decodedKey)) {\n // Append to existing values\n var /** @type {?} */ currentVal = params[decodedKey];\n if (!Array.isArray(currentVal)) {\n currentVal = [currentVal];\n params[decodedKey] = currentVal;\n }\n currentVal.push(decodedVal);\n }\n else {\n // Create a new value\n params[decodedKey] = decodedVal;\n }\n };\n /**\n * @param {?} allowPrimary\n * @return {?}\n */\n UrlParser.prototype.parseParens = function (allowPrimary) {\n var /** @type {?} */ segments = {};\n this.capture('(');\n while (!this.peekStartsWith(')') && this.remaining.length > 0) {\n var /** @type {?} */ path = matchSegments(this.remaining);\n var /** @type {?} */ next = this.remaining[path.length];\n // if is is not one of these characters, then the segment was unescaped\n // or the group was not closed\n if (next !== '/' && next !== ')' && next !== ';') {\n throw new Error(\"Cannot parse url '\" + this.url + \"'\");\n }\n var /** @type {?} */ outletName = void 0;\n if (path.indexOf(':') > -1) {\n outletName = path.substr(0, path.indexOf(':'));\n this.capture(outletName);\n this.capture(':');\n }\n else if (allowPrimary) {\n outletName = PRIMARY_OUTLET;\n }\n var /** @type {?} */ children = this.parseChildren();\n segments[outletName] = Object.keys(children).length === 1 ? children[PRIMARY_OUTLET] :\n new UrlSegmentGroup([], children);\n if (this.peekStartsWith('//')) {\n this.capture('//');\n }\n }\n this.capture(')');\n return segments;\n };\n return UrlParser;\n }());\n\n var NoMatch = (function () {\n /**\n * @param {?=} segmentGroup\n */\n function NoMatch(segmentGroup) {\n if (segmentGroup === void 0) { segmentGroup = null; }\n this.segmentGroup = segmentGroup;\n }\n return NoMatch;\n }());\n var AbsoluteRedirect = (function () {\n /**\n * @param {?} urlTree\n */\n function AbsoluteRedirect(urlTree) {\n this.urlTree = urlTree;\n }\n return AbsoluteRedirect;\n }());\n /**\n * @param {?} segmentGroup\n * @return {?}\n */\n function noMatch(segmentGroup) {\n return new rxjs_Observable.Observable(function (obs) { return obs.error(new NoMatch(segmentGroup)); });\n }\n /**\n * @param {?} newTree\n * @return {?}\n */\n function absoluteRedirect(newTree) {\n return new rxjs_Observable.Observable(function (obs) { return obs.error(new AbsoluteRedirect(newTree)); });\n }\n /**\n * @param {?} redirectTo\n * @return {?}\n */\n function namedOutletsRedirect(redirectTo) {\n return new rxjs_Observable.Observable(function (obs) { return obs.error(new Error(\"Only absolute redirects can have named outlets. redirectTo: '\" + redirectTo + \"'\")); });\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function canLoadFails(route) {\n return new rxjs_Observable.Observable(function (obs) { return obs.error(new NavigationCancelingError(\"Cannot load children because the guard of the route \\\"path: '\" + route.path + \"'\\\" returned false\")); });\n }\n /**\n * @param {?} injector\n * @param {?} configLoader\n * @param {?} urlSerializer\n * @param {?} urlTree\n * @param {?} config\n * @return {?}\n */\n function applyRedirects(injector, configLoader, urlSerializer, urlTree, config) {\n return new ApplyRedirects(injector, configLoader, urlSerializer, urlTree, config).apply();\n }\n var ApplyRedirects = (function () {\n /**\n * @param {?} injector\n * @param {?} configLoader\n * @param {?} urlSerializer\n * @param {?} urlTree\n * @param {?} config\n */\n function ApplyRedirects(injector, configLoader, urlSerializer, urlTree, config) {\n this.injector = injector;\n this.configLoader = configLoader;\n this.urlSerializer = urlSerializer;\n this.urlTree = urlTree;\n this.config = config;\n this.allowRedirects = true;\n }\n /**\n * @return {?}\n */\n ApplyRedirects.prototype.apply = function () {\n var _this = this;\n var /** @type {?} */ expanded$ = this.expandSegmentGroup(this.injector, this.config, this.urlTree.root, PRIMARY_OUTLET);\n var /** @type {?} */ urlTrees$ = rxjs_operator_map.map.call(expanded$, function (rootSegmentGroup) { return _this.createUrlTree(rootSegmentGroup, _this.urlTree.queryParams, _this.urlTree.fragment); });\n return rxjs_operator_catch._catch.call(urlTrees$, function (e) {\n if (e instanceof AbsoluteRedirect) {\n // after an absolute redirect we do not apply any more redirects!\n _this.allowRedirects = false;\n // we need to run matching, so we can fetch all lazy-loaded modules\n return _this.match(e.urlTree);\n }\n else if (e instanceof NoMatch) {\n throw _this.noMatchError(e);\n }\n else {\n throw e;\n }\n });\n };\n /**\n * @param {?} tree\n * @return {?}\n */\n ApplyRedirects.prototype.match = function (tree) {\n var _this = this;\n var /** @type {?} */ expanded$ = this.expandSegmentGroup(this.injector, this.config, tree.root, PRIMARY_OUTLET);\n var /** @type {?} */ mapped$ = rxjs_operator_map.map.call(expanded$, function (rootSegmentGroup) {\n return _this.createUrlTree(rootSegmentGroup, tree.queryParams, tree.fragment);\n });\n return rxjs_operator_catch._catch.call(mapped$, function (e) {\n if (e instanceof NoMatch) {\n throw _this.noMatchError(e);\n }\n else {\n throw e;\n }\n });\n };\n /**\n * @param {?} e\n * @return {?}\n */\n ApplyRedirects.prototype.noMatchError = function (e) {\n return new Error(\"Cannot match any routes. URL Segment: '\" + e.segmentGroup + \"'\");\n };\n /**\n * @param {?} rootCandidate\n * @param {?} queryParams\n * @param {?} fragment\n * @return {?}\n */\n ApplyRedirects.prototype.createUrlTree = function (rootCandidate, queryParams, fragment) {\n var /** @type {?} */ root = rootCandidate.segments.length > 0 ?\n new UrlSegmentGroup([], (_a = {}, _a[PRIMARY_OUTLET] = rootCandidate, _a)) :\n rootCandidate;\n return new UrlTree(root, queryParams, fragment);\n var _a;\n };\n /**\n * @param {?} injector\n * @param {?} routes\n * @param {?} segmentGroup\n * @param {?} outlet\n * @return {?}\n */\n ApplyRedirects.prototype.expandSegmentGroup = function (injector, routes, segmentGroup, outlet) {\n if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n return rxjs_operator_map.map.call(this.expandChildren(injector, routes, segmentGroup), function (children) { return new UrlSegmentGroup([], children); });\n }\n else {\n return this.expandSegment(injector, segmentGroup, routes, segmentGroup.segments, outlet, true);\n }\n };\n /**\n * @param {?} injector\n * @param {?} routes\n * @param {?} segmentGroup\n * @return {?}\n */\n ApplyRedirects.prototype.expandChildren = function (injector, routes, segmentGroup) {\n var _this = this;\n return waitForMap(segmentGroup.children, function (childOutlet, child) { return _this.expandSegmentGroup(injector, routes, child, childOutlet); });\n };\n /**\n * @param {?} injector\n * @param {?} segmentGroup\n * @param {?} routes\n * @param {?} segments\n * @param {?} outlet\n * @param {?} allowRedirects\n * @return {?}\n */\n ApplyRedirects.prototype.expandSegment = function (injector, segmentGroup, routes, segments, outlet, allowRedirects) {\n var _this = this;\n var /** @type {?} */ routes$ = rxjs_observable_of.of.apply(void 0, routes);\n var /** @type {?} */ processedRoutes$ = rxjs_operator_map.map.call(routes$, function (r) {\n var /** @type {?} */ expanded$ = _this.expandSegmentAgainstRoute(injector, segmentGroup, routes, r, segments, outlet, allowRedirects);\n return rxjs_operator_catch._catch.call(expanded$, function (e) {\n if (e instanceof NoMatch)\n return rxjs_observable_of.of(null);\n else\n throw e;\n });\n });\n var /** @type {?} */ concattedProcessedRoutes$ = rxjs_operator_concatAll.concatAll.call(processedRoutes$);\n var /** @type {?} */ first$ = rxjs_operator_first.first.call(concattedProcessedRoutes$, function (s) { return !!s; });\n return rxjs_operator_catch._catch.call(first$, function (e, _) {\n if (e instanceof rxjs_util_EmptyError.EmptyError) {\n if (_this.noLeftoversInUrl(segmentGroup, segments, outlet)) {\n return rxjs_observable_of.of(new UrlSegmentGroup([], {}));\n }\n else {\n throw new NoMatch(segmentGroup);\n }\n }\n else {\n throw e;\n }\n });\n };\n /**\n * @param {?} segmentGroup\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n ApplyRedirects.prototype.noLeftoversInUrl = function (segmentGroup, segments, outlet) {\n return segments.length === 0 && !segmentGroup.children[outlet];\n };\n /**\n * @param {?} injector\n * @param {?} segmentGroup\n * @param {?} routes\n * @param {?} route\n * @param {?} paths\n * @param {?} outlet\n * @param {?} allowRedirects\n * @return {?}\n */\n ApplyRedirects.prototype.expandSegmentAgainstRoute = function (injector, segmentGroup, routes, route, paths, outlet, allowRedirects) {\n if (getOutlet$1(route) !== outlet)\n return noMatch(segmentGroup);\n if (route.redirectTo !== undefined && !(allowRedirects && this.allowRedirects))\n return noMatch(segmentGroup);\n if (route.redirectTo === undefined) {\n return this.matchSegmentAgainstRoute(injector, segmentGroup, route, paths);\n }\n else {\n return this.expandSegmentAgainstRouteUsingRedirect(injector, segmentGroup, routes, route, paths, outlet);\n }\n };\n /**\n * @param {?} injector\n * @param {?} segmentGroup\n * @param {?} routes\n * @param {?} route\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n ApplyRedirects.prototype.expandSegmentAgainstRouteUsingRedirect = function (injector, segmentGroup, routes, route, segments, outlet) {\n if (route.path === '**') {\n return this.expandWildCardWithParamsAgainstRouteUsingRedirect(injector, routes, route, outlet);\n }\n else {\n return this.expandRegularSegmentAgainstRouteUsingRedirect(injector, segmentGroup, routes, route, segments, outlet);\n }\n };\n /**\n * @param {?} injector\n * @param {?} routes\n * @param {?} route\n * @param {?} outlet\n * @return {?}\n */\n ApplyRedirects.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect = function (injector, routes, route, outlet) {\n var _this = this;\n var /** @type {?} */ newTree = this.applyRedirectCommands([], route.redirectTo, {});\n if (route.redirectTo.startsWith('/')) {\n return absoluteRedirect(newTree);\n }\n else {\n return rxjs_operator_mergeMap.mergeMap.call(this.lineralizeSegments(route, newTree), function (newSegments) {\n var /** @type {?} */ group = new UrlSegmentGroup(newSegments, {});\n return _this.expandSegment(injector, group, routes, newSegments, outlet, false);\n });\n }\n };\n /**\n * @param {?} injector\n * @param {?} segmentGroup\n * @param {?} routes\n * @param {?} route\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n ApplyRedirects.prototype.expandRegularSegmentAgainstRouteUsingRedirect = function (injector, segmentGroup, routes, route, segments, outlet) {\n var _this = this;\n var _a = match(segmentGroup, route, segments), matched = _a.matched, consumedSegments = _a.consumedSegments, lastChild = _a.lastChild, positionalParamSegments = _a.positionalParamSegments;\n if (!matched)\n return noMatch(segmentGroup);\n var /** @type {?} */ newTree = this.applyRedirectCommands(consumedSegments, route.redirectTo, /** @type {?} */ (positionalParamSegments));\n if (route.redirectTo.startsWith('/')) {\n return absoluteRedirect(newTree);\n }\n else {\n return rxjs_operator_mergeMap.mergeMap.call(this.lineralizeSegments(route, newTree), function (newSegments) {\n return _this.expandSegment(injector, segmentGroup, routes, newSegments.concat(segments.slice(lastChild)), outlet, false);\n });\n }\n };\n /**\n * @param {?} injector\n * @param {?} rawSegmentGroup\n * @param {?} route\n * @param {?} segments\n * @return {?}\n */\n ApplyRedirects.prototype.matchSegmentAgainstRoute = function (injector, rawSegmentGroup, route, segments) {\n var _this = this;\n if (route.path === '**') {\n if (route.loadChildren) {\n return rxjs_operator_map.map.call(this.configLoader.load(injector, route.loadChildren), function (r) {\n ((route))._loadedConfig = r;\n return rxjs_observable_of.of(new UrlSegmentGroup(segments, {}));\n });\n }\n else {\n return rxjs_observable_of.of(new UrlSegmentGroup(segments, {}));\n }\n }\n else {\n var _a = match(rawSegmentGroup, route, segments), matched = _a.matched, consumedSegments_1 = _a.consumedSegments, lastChild = _a.lastChild;\n if (!matched)\n return noMatch(rawSegmentGroup);\n var /** @type {?} */ rawSlicedSegments_1 = segments.slice(lastChild);\n var /** @type {?} */ childConfig$ = this.getChildConfig(injector, route);\n return rxjs_operator_mergeMap.mergeMap.call(childConfig$, function (routerConfig) {\n var /** @type {?} */ childInjector = routerConfig.injector;\n var /** @type {?} */ childConfig = routerConfig.routes;\n var _a = split(rawSegmentGroup, consumedSegments_1, rawSlicedSegments_1, childConfig), segmentGroup = _a.segmentGroup, slicedSegments = _a.slicedSegments;\n if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {\n var /** @type {?} */ expanded$ = _this.expandChildren(childInjector, childConfig, segmentGroup);\n return rxjs_operator_map.map.call(expanded$, function (children) { return new UrlSegmentGroup(consumedSegments_1, children); });\n }\n else if (childConfig.length === 0 && slicedSegments.length === 0) {\n return rxjs_observable_of.of(new UrlSegmentGroup(consumedSegments_1, {}));\n }\n else {\n var /** @type {?} */ expanded$ = _this.expandSegment(childInjector, segmentGroup, childConfig, slicedSegments, PRIMARY_OUTLET, true);\n return rxjs_operator_map.map.call(expanded$, function (cs) { return new UrlSegmentGroup(consumedSegments_1.concat(cs.segments), cs.children); });\n }\n });\n }\n };\n /**\n * @param {?} injector\n * @param {?} route\n * @return {?}\n */\n ApplyRedirects.prototype.getChildConfig = function (injector, route) {\n var _this = this;\n if (route.children) {\n return rxjs_observable_of.of(new LoadedRouterConfig(route.children, injector, null, null));\n }\n else if (route.loadChildren) {\n return rxjs_operator_mergeMap.mergeMap.call(runGuards(injector, route), function (shouldLoad) {\n if (shouldLoad) {\n if (((route))._loadedConfig) {\n return rxjs_observable_of.of(((route))._loadedConfig);\n }\n else {\n return rxjs_operator_map.map.call(_this.configLoader.load(injector, route.loadChildren), function (r) {\n ((route))._loadedConfig = r;\n return r;\n });\n }\n }\n else {\n return canLoadFails(route);\n }\n });\n }\n else {\n return rxjs_observable_of.of(new LoadedRouterConfig([], injector, null, null));\n }\n };\n /**\n * @param {?} route\n * @param {?} urlTree\n * @return {?}\n */\n ApplyRedirects.prototype.lineralizeSegments = function (route, urlTree) {\n var /** @type {?} */ res = [];\n var /** @type {?} */ c = urlTree.root;\n while (true) {\n res = res.concat(c.segments);\n if (c.numberOfChildren === 0) {\n return rxjs_observable_of.of(res);\n }\n else if (c.numberOfChildren > 1 || !c.children[PRIMARY_OUTLET]) {\n return namedOutletsRedirect(route.redirectTo);\n }\n else {\n c = c.children[PRIMARY_OUTLET];\n }\n }\n };\n /**\n * @param {?} segments\n * @param {?} redirectTo\n * @param {?} posParams\n * @return {?}\n */\n ApplyRedirects.prototype.applyRedirectCommands = function (segments, redirectTo, posParams) {\n var /** @type {?} */ t = this.urlSerializer.parse(redirectTo);\n return this.applyRedirectCreatreUrlTree(redirectTo, this.urlSerializer.parse(redirectTo), segments, posParams);\n };\n /**\n * @param {?} redirectTo\n * @param {?} urlTree\n * @param {?} segments\n * @param {?} posParams\n * @return {?}\n */\n ApplyRedirects.prototype.applyRedirectCreatreUrlTree = function (redirectTo, urlTree, segments, posParams) {\n var /** @type {?} */ newRoot = this.createSegmentGroup(redirectTo, urlTree.root, segments, posParams);\n return new UrlTree(newRoot, this.createQueryParams(urlTree.queryParams, this.urlTree.queryParams), urlTree.fragment);\n };\n /**\n * @param {?} redirectToParams\n * @param {?} actualParams\n * @return {?}\n */\n ApplyRedirects.prototype.createQueryParams = function (redirectToParams, actualParams) {\n var /** @type {?} */ res = {};\n forEach(redirectToParams, function (v, k) {\n if (v.startsWith(':')) {\n res[k] = actualParams[v.substring(1)];\n }\n else {\n res[k] = v;\n }\n });\n return res;\n };\n /**\n * @param {?} redirectTo\n * @param {?} group\n * @param {?} segments\n * @param {?} posParams\n * @return {?}\n */\n ApplyRedirects.prototype.createSegmentGroup = function (redirectTo, group, segments, posParams) {\n var _this = this;\n var /** @type {?} */ updatedSegments = this.createSegments(redirectTo, group.segments, segments, posParams);\n var /** @type {?} */ children = {};\n forEach(group.children, function (child, name) {\n children[name] = _this.createSegmentGroup(redirectTo, child, segments, posParams);\n });\n return new UrlSegmentGroup(updatedSegments, children);\n };\n /**\n * @param {?} redirectTo\n * @param {?} redirectToSegments\n * @param {?} actualSegments\n * @param {?} posParams\n * @return {?}\n */\n ApplyRedirects.prototype.createSegments = function (redirectTo, redirectToSegments, actualSegments, posParams) {\n var _this = this;\n return redirectToSegments.map(function (s) { return s.path.startsWith(':') ? _this.findPosParam(redirectTo, s, posParams) :\n _this.findOrReturn(s, actualSegments); });\n };\n /**\n * @param {?} redirectTo\n * @param {?} redirectToUrlSegment\n * @param {?} posParams\n * @return {?}\n */\n ApplyRedirects.prototype.findPosParam = function (redirectTo, redirectToUrlSegment, posParams) {\n var /** @type {?} */ pos = posParams[redirectToUrlSegment.path.substring(1)];\n if (!pos)\n throw new Error(\"Cannot redirect to '\" + redirectTo + \"'. Cannot find '\" + redirectToUrlSegment.path + \"'.\");\n return pos;\n };\n /**\n * @param {?} redirectToUrlSegment\n * @param {?} actualSegments\n * @return {?}\n */\n ApplyRedirects.prototype.findOrReturn = function (redirectToUrlSegment, actualSegments) {\n var /** @type {?} */ idx = 0;\n for (var _i = 0, actualSegments_1 = actualSegments; _i < actualSegments_1.length; _i++) {\n var s = actualSegments_1[_i];\n if (s.path === redirectToUrlSegment.path) {\n actualSegments.splice(idx);\n return s;\n }\n idx++;\n }\n return redirectToUrlSegment;\n };\n return ApplyRedirects;\n }());\n /**\n * @param {?} injector\n * @param {?} route\n * @return {?}\n */\n function runGuards(injector, route) {\n var /** @type {?} */ canLoad = route.canLoad;\n if (!canLoad || canLoad.length === 0)\n return rxjs_observable_of.of(true);\n var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(canLoad), function (c) {\n var /** @type {?} */ guard = injector.get(c);\n if (guard.canLoad) {\n return wrapIntoObservable(guard.canLoad(route));\n }\n else {\n return wrapIntoObservable(guard(route));\n }\n });\n return andObservables(obs);\n }\n /**\n * @param {?} segmentGroup\n * @param {?} route\n * @param {?} segments\n * @return {?}\n */\n function match(segmentGroup, route, segments) {\n var /** @type {?} */ noMatch = { matched: false, consumedSegments: /** @type {?} */ ([]), lastChild: 0, positionalParamSegments: {} };\n if (route.path === '') {\n if ((route.pathMatch === 'full') && (segmentGroup.hasChildren() || segments.length > 0)) {\n return { matched: false, consumedSegments: [], lastChild: 0, positionalParamSegments: {} };\n }\n else {\n return { matched: true, consumedSegments: [], lastChild: 0, positionalParamSegments: {} };\n }\n }\n var /** @type {?} */ matcher = route.matcher || defaultUrlMatcher;\n var /** @type {?} */ res = matcher(segments, segmentGroup, route);\n if (!res)\n return noMatch;\n return {\n matched: true,\n consumedSegments: res.consumed,\n lastChild: res.consumed.length,\n positionalParamSegments: res.posParams\n };\n }\n /**\n * @param {?} segmentGroup\n * @param {?} consumedSegments\n * @param {?} slicedSegments\n * @param {?} config\n * @return {?}\n */\n function split(segmentGroup, consumedSegments, slicedSegments, config) {\n if (slicedSegments.length > 0 &&\n containsEmptyPathRedirectsWithNamedOutlets(segmentGroup, slicedSegments, config)) {\n var /** @type {?} */ s = new UrlSegmentGroup(consumedSegments, createChildrenForEmptySegments(config, new UrlSegmentGroup(slicedSegments, segmentGroup.children)));\n return { segmentGroup: mergeTrivialChildren(s), slicedSegments: [] };\n }\n else if (slicedSegments.length === 0 &&\n containsEmptyPathRedirects(segmentGroup, slicedSegments, config)) {\n var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, addEmptySegmentsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children));\n return { segmentGroup: mergeTrivialChildren(s), slicedSegments: slicedSegments };\n }\n else {\n return { segmentGroup: segmentGroup, slicedSegments: slicedSegments };\n }\n }\n /**\n * @param {?} s\n * @return {?}\n */\n function mergeTrivialChildren(s) {\n if (s.numberOfChildren === 1 && s.children[PRIMARY_OUTLET]) {\n var /** @type {?} */ c = s.children[PRIMARY_OUTLET];\n return new UrlSegmentGroup(s.segments.concat(c.segments), c.children);\n }\n else {\n return s;\n }\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @param {?} children\n * @return {?}\n */\n function addEmptySegmentsToChildrenIfNeeded(segmentGroup, slicedSegments, routes, children) {\n var /** @type {?} */ res = {};\n for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n var r = routes_1[_i];\n if (emptyPathRedirect(segmentGroup, slicedSegments, r) && !children[getOutlet$1(r)]) {\n res[getOutlet$1(r)] = new UrlSegmentGroup([], {});\n }\n }\n return merge(children, res);\n }\n /**\n * @param {?} routes\n * @param {?} primarySegmentGroup\n * @return {?}\n */\n function createChildrenForEmptySegments(routes, primarySegmentGroup) {\n var /** @type {?} */ res = {};\n res[PRIMARY_OUTLET] = primarySegmentGroup;\n for (var _i = 0, routes_2 = routes; _i < routes_2.length; _i++) {\n var r = routes_2[_i];\n if (r.path === '' && getOutlet$1(r) !== PRIMARY_OUTLET) {\n res[getOutlet$1(r)] = new UrlSegmentGroup([], {});\n }\n }\n return res;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @return {?}\n */\n function containsEmptyPathRedirectsWithNamedOutlets(segmentGroup, slicedSegments, routes) {\n return routes\n .filter(function (r) { return emptyPathRedirect(segmentGroup, slicedSegments, r) &&\n getOutlet$1(r) !== PRIMARY_OUTLET; })\n .length > 0;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @return {?}\n */\n function containsEmptyPathRedirects(segmentGroup, slicedSegments, routes) {\n return routes.filter(function (r) { return emptyPathRedirect(segmentGroup, slicedSegments, r); }).length > 0;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} r\n * @return {?}\n */\n function emptyPathRedirect(segmentGroup, slicedSegments, r) {\n if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === 'full')\n return false;\n return r.path === '' && r.redirectTo !== undefined;\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function getOutlet$1(route) {\n return route.outlet ? route.outlet : PRIMARY_OUTLET;\n }\n\n /**\n * @param {?} config\n * @param {?=} parentPath\n * @return {?}\n */\n function validateConfig(config, parentPath) {\n if (parentPath === void 0) { parentPath = ''; }\n // forEach doesn't iterate undefined values\n for (var /** @type {?} */ i = 0; i < config.length; i++) {\n var /** @type {?} */ route = config[i];\n var /** @type {?} */ fullPath = getFullPath(parentPath, route);\n validateNode(route, fullPath);\n }\n }\n /**\n * @param {?} route\n * @param {?} fullPath\n * @return {?}\n */\n function validateNode(route, fullPath) {\n if (!route) {\n throw new Error(\"\\n Invalid configuration of route '\" + fullPath + \"': Encountered undefined route.\\n The reason might be an extra comma.\\n \\n Example: \\n const routes: Routes = [\\n { path: '', redirectTo: '/dashboard', pathMatch: 'full' },\\n { path: 'dashboard', component: DashboardComponent },, << two commas\\n { path: 'detail/:id', component: HeroDetailComponent }\\n ];\\n \");\n }\n if (Array.isArray(route)) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': Array cannot be specified\");\n }\n if (!route.component && (route.outlet && route.outlet !== PRIMARY_OUTLET)) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': a componentless route cannot have a named outlet set\");\n }\n if (route.redirectTo && route.children) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and children cannot be used together\");\n }\n if (route.redirectTo && route.loadChildren) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and loadChildren cannot be used together\");\n }\n if (route.children && route.loadChildren) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': children and loadChildren cannot be used together\");\n }\n if (route.redirectTo && route.component) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': redirectTo and component cannot be used together\");\n }\n if (route.path && route.matcher) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': path and matcher cannot be used together\");\n }\n if (route.redirectTo === void 0 && !route.component && !route.children && !route.loadChildren) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"'. One of the following must be provided: component, redirectTo, children or loadChildren\");\n }\n if (route.path === void 0 && route.matcher === void 0) {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': routes must have either a path or a matcher specified\");\n }\n if (typeof route.path === 'string' && route.path.charAt(0) === '/') {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': path cannot start with a slash\");\n }\n if (route.path === '' && route.redirectTo !== void 0 && route.pathMatch === void 0) {\n var /** @type {?} */ exp = \"The default value of 'pathMatch' is 'prefix', but often the intent is to use 'full'.\";\n throw new Error(\"Invalid configuration of route '{path: \\\"\" + fullPath + \"\\\", redirectTo: \\\"\" + route.redirectTo + \"\\\"}': please provide 'pathMatch'. \" + exp);\n }\n if (route.pathMatch !== void 0 && route.pathMatch !== 'full' && route.pathMatch !== 'prefix') {\n throw new Error(\"Invalid configuration of route '\" + fullPath + \"': pathMatch can only be set to 'prefix' or 'full'\");\n }\n if (route.children) {\n validateConfig(route.children, fullPath);\n }\n }\n /**\n * @param {?} parentPath\n * @param {?} currentRoute\n * @return {?}\n */\n function getFullPath(parentPath, currentRoute) {\n if (!currentRoute) {\n return parentPath;\n }\n if (!parentPath && !currentRoute.path) {\n return '';\n }\n else if (parentPath && !currentRoute.path) {\n return parentPath + \"/\";\n }\n else if (!parentPath && currentRoute.path) {\n return currentRoute.path;\n }\n else {\n return parentPath + \"/\" + currentRoute.path;\n }\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var Tree = (function () {\n /**\n * @param {?} root\n */\n function Tree(root) {\n this._root = root;\n }\n Object.defineProperty(Tree.prototype, \"root\", {\n /**\n * @return {?}\n */\n get: function () { return this._root.value; },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} t\n * @return {?}\n */\n Tree.prototype.parent = function (t) {\n var /** @type {?} */ p = this.pathFromRoot(t);\n return p.length > 1 ? p[p.length - 2] : null;\n };\n /**\n * @param {?} t\n * @return {?}\n */\n Tree.prototype.children = function (t) {\n var /** @type {?} */ n = findNode(t, this._root);\n return n ? n.children.map(function (t) { return t.value; }) : [];\n };\n /**\n * @param {?} t\n * @return {?}\n */\n Tree.prototype.firstChild = function (t) {\n var /** @type {?} */ n = findNode(t, this._root);\n return n && n.children.length > 0 ? n.children[0].value : null;\n };\n /**\n * @param {?} t\n * @return {?}\n */\n Tree.prototype.siblings = function (t) {\n var /** @type {?} */ p = findPath(t, this._root, []);\n if (p.length < 2)\n return [];\n var /** @type {?} */ c = p[p.length - 2].children.map(function (c) { return c.value; });\n return c.filter(function (cc) { return cc !== t; });\n };\n /**\n * @param {?} t\n * @return {?}\n */\n Tree.prototype.pathFromRoot = function (t) { return findPath(t, this._root, []).map(function (s) { return s.value; }); };\n return Tree;\n }());\n /**\n * @param {?} expected\n * @param {?} c\n * @return {?}\n */\n function findNode(expected, c) {\n if (expected === c.value)\n return c;\n for (var _i = 0, _a = c.children; _i < _a.length; _i++) {\n var cc = _a[_i];\n var /** @type {?} */ r = findNode(expected, cc);\n if (r)\n return r;\n }\n return null;\n }\n /**\n * @param {?} expected\n * @param {?} c\n * @param {?} collected\n * @return {?}\n */\n function findPath(expected, c, collected) {\n collected.push(c);\n if (expected === c.value)\n return collected;\n for (var _i = 0, _a = c.children; _i < _a.length; _i++) {\n var cc = _a[_i];\n var /** @type {?} */ cloned = collected.slice(0);\n var /** @type {?} */ r = findPath(expected, cc, cloned);\n if (r.length > 0)\n return r;\n }\n return [];\n }\n var TreeNode = (function () {\n /**\n * @param {?} value\n * @param {?} children\n */\n function TreeNode(value, children) {\n this.value = value;\n this.children = children;\n }\n /**\n * @return {?}\n */\n TreeNode.prototype.toString = function () { return \"TreeNode(\" + this.value + \")\"; };\n return TreeNode;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(router: Router) {\n * const state: RouterState = router.routerState;\n * const root: ActivatedRoute = state.root;\n * const child = root.firstChild;\n * const id: Observable<string> = child.params.map(p => p.id);\n * //...\n * }\n * }\n * ```\n * *\n * RouterState is a tree of activated routes. Every node in this tree knows about the \"consumed\" URL\n * segments,\n * the extracted parameters, and the resolved data.\n * *\n * See {@link ActivatedRoute} for more information.\n * *\n */\n var RouterState = (function (_super) {\n __extends$1(RouterState, _super);\n /**\n * @param {?} root\n * @param {?} snapshot\n */\n function RouterState(root, snapshot) {\n _super.call(this, root);\n this.snapshot = snapshot;\n setRouterStateSnapshot(this, root);\n }\n /**\n * @return {?}\n */\n RouterState.prototype.toString = function () { return this.snapshot.toString(); };\n return RouterState;\n }(Tree));\n /**\n * @param {?} urlTree\n * @param {?} rootComponent\n * @return {?}\n */\n function createEmptyState(urlTree, rootComponent) {\n var /** @type {?} */ snapshot = createEmptyStateSnapshot(urlTree, rootComponent);\n var /** @type {?} */ emptyUrl = new rxjs_BehaviorSubject.BehaviorSubject([new UrlSegment('', {})]);\n var /** @type {?} */ emptyParams = new rxjs_BehaviorSubject.BehaviorSubject({});\n var /** @type {?} */ emptyData = new rxjs_BehaviorSubject.BehaviorSubject({});\n var /** @type {?} */ emptyQueryParams = new rxjs_BehaviorSubject.BehaviorSubject({});\n var /** @type {?} */ fragment = new rxjs_BehaviorSubject.BehaviorSubject('');\n var /** @type {?} */ activated = new ActivatedRoute(emptyUrl, emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, snapshot.root);\n activated.snapshot = snapshot.root;\n return new RouterState(new TreeNode(activated, []), snapshot);\n }\n /**\n * @param {?} urlTree\n * @param {?} rootComponent\n * @return {?}\n */\n function createEmptyStateSnapshot(urlTree, rootComponent) {\n var /** @type {?} */ emptyParams = {};\n var /** @type {?} */ emptyData = {};\n var /** @type {?} */ emptyQueryParams = {};\n var /** @type {?} */ fragment = '';\n var /** @type {?} */ activated = new ActivatedRouteSnapshot([], emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, null, urlTree.root, -1, {});\n return new RouterStateSnapshot('', new TreeNode(activated, []));\n }\n /**\n * outlet.\n * An `ActivatedRoute` can also be used to traverse the router state tree.\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(route: ActivatedRoute) {\n * const id: Observable<string> = route.params.map(p => p.id);\n * const url: Observable<string> = route.url.map(segments => segments.join(''));\n * // route.data includes both `data` and `resolve`\n * const user = route.data.map(d => d.user);\n * }\n * }\n * ```\n * *\n */\n var ActivatedRoute = (function () {\n /**\n * @param {?} url\n * @param {?} params\n * @param {?} queryParams\n * @param {?} fragment\n * @param {?} data\n * @param {?} outlet\n * @param {?} component\n * @param {?} futureSnapshot\n */\n function ActivatedRoute(url, params, queryParams, fragment, data, outlet, component, futureSnapshot) {\n this.url = url;\n this.params = params;\n this.queryParams = queryParams;\n this.fragment = fragment;\n this.data = data;\n this.outlet = outlet;\n this.component = component;\n this._futureSnapshot = futureSnapshot;\n }\n Object.defineProperty(ActivatedRoute.prototype, \"routeConfig\", {\n /**\n * The configuration used to match this route\n * @return {?}\n */\n get: function () { return this._futureSnapshot.routeConfig; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRoute.prototype, \"root\", {\n /**\n * The root of the router state\n * @return {?}\n */\n get: function () { return this._routerState.root; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRoute.prototype, \"parent\", {\n /**\n * The parent of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.parent(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRoute.prototype, \"firstChild\", {\n /**\n * The first child of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.firstChild(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRoute.prototype, \"children\", {\n /**\n * The children of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.children(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRoute.prototype, \"pathFromRoot\", {\n /**\n * The path from the root of the router state tree to this route\n * @return {?}\n */\n get: function () { return this._routerState.pathFromRoot(this); },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n ActivatedRoute.prototype.toString = function () {\n return this.snapshot ? this.snapshot.toString() : \"Future(\" + this._futureSnapshot + \")\";\n };\n return ActivatedRoute;\n }());\n /**\n * @param {?} route\n * @return {?}\n */\n function inheritedParamsDataResolve(route) {\n var /** @type {?} */ pathToRoot = route.pathFromRoot;\n var /** @type {?} */ inhertingStartingFrom = pathToRoot.length - 1;\n while (inhertingStartingFrom >= 1) {\n var /** @type {?} */ current = pathToRoot[inhertingStartingFrom];\n var /** @type {?} */ parent_1 = pathToRoot[inhertingStartingFrom - 1];\n // current route is an empty path => inherits its parent's params and data\n if (current.routeConfig && current.routeConfig.path === '') {\n inhertingStartingFrom--;\n }\n else if (!parent_1.component) {\n inhertingStartingFrom--;\n }\n else {\n break;\n }\n }\n return pathToRoot.slice(inhertingStartingFrom).reduce(function (res, curr) {\n var /** @type {?} */ params = merge(res.params, curr.params);\n var /** @type {?} */ data = merge(res.data, curr.data);\n var /** @type {?} */ resolve = merge(res.resolve, curr._resolvedData);\n return { params: params, data: data, resolve: resolve };\n }, /** @type {?} */ ({ params: {}, data: {}, resolve: {} }));\n }\n /**\n * outlet\n * at a particular moment in time. ActivatedRouteSnapshot can also be used to traverse the router\n * state tree.\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(route: ActivatedRoute) {\n * const id: string = route.snapshot.params.id;\n * const url: string = route.snapshot.url.join('');\n * const user = route.snapshot.data.user;\n * }\n * }\n * ```\n * *\n */\n var ActivatedRouteSnapshot = (function () {\n /**\n * @param {?} url\n * @param {?} params\n * @param {?} queryParams\n * @param {?} fragment\n * @param {?} data\n * @param {?} outlet\n * @param {?} component\n * @param {?} routeConfig\n * @param {?} urlSegment\n * @param {?} lastPathIndex\n * @param {?} resolve\n */\n function ActivatedRouteSnapshot(url, params, queryParams, fragment, data, outlet, component, routeConfig, urlSegment, lastPathIndex, resolve) {\n this.url = url;\n this.params = params;\n this.queryParams = queryParams;\n this.fragment = fragment;\n this.data = data;\n this.outlet = outlet;\n this.component = component;\n this._routeConfig = routeConfig;\n this._urlSegment = urlSegment;\n this._lastPathIndex = lastPathIndex;\n this._resolve = resolve;\n }\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"routeConfig\", {\n /**\n * The configuration used to match this route\n * @return {?}\n */\n get: function () { return this._routeConfig; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"root\", {\n /**\n * The root of the router state\n * @return {?}\n */\n get: function () { return this._routerState.root; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"parent\", {\n /**\n * The parent of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.parent(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"firstChild\", {\n /**\n * The first child of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.firstChild(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"children\", {\n /**\n * The children of this route in the router state tree\n * @return {?}\n */\n get: function () { return this._routerState.children(this); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ActivatedRouteSnapshot.prototype, \"pathFromRoot\", {\n /**\n * The path from the root of the router state tree to this route\n * @return {?}\n */\n get: function () { return this._routerState.pathFromRoot(this); },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n ActivatedRouteSnapshot.prototype.toString = function () {\n var /** @type {?} */ url = this.url.map(function (segment) { return segment.toString(); }).join('/');\n var /** @type {?} */ matched = this._routeConfig ? this._routeConfig.path : '';\n return \"Route(url:'\" + url + \"', path:'\" + matched + \"')\";\n };\n return ActivatedRouteSnapshot;\n }());\n /**\n * *\n * *\n * ```\n * class MyComponent {\n * constructor(router: Router) {\n * const state: RouterState = router.routerState;\n * const snapshot: RouterStateSnapshot = state.snapshot;\n * const root: ActivatedRouteSnapshot = snapshot.root;\n * const child = root.firstChild;\n * const id: Observable<string> = child.params.map(p => p.id);\n * //...\n * }\n * }\n * ```\n * *\n * RouterStateSnapshot is a tree of activated route snapshots. Every node in this tree knows about\n * the \"consumed\" URL segments, the extracted parameters, and the resolved data.\n * *\n */\n var RouterStateSnapshot = (function (_super) {\n __extends$1(RouterStateSnapshot, _super);\n /**\n * @param {?} url\n * @param {?} root\n */\n function RouterStateSnapshot(url, root) {\n _super.call(this, root);\n this.url = url;\n setRouterStateSnapshot(this, root);\n }\n /**\n * @return {?}\n */\n RouterStateSnapshot.prototype.toString = function () { return serializeNode(this._root); };\n return RouterStateSnapshot;\n }(Tree));\n /**\n * @param {?} state\n * @param {?} node\n * @return {?}\n */\n function setRouterStateSnapshot(state, node) {\n node.value._routerState = state;\n node.children.forEach(function (c) { return setRouterStateSnapshot(state, c); });\n }\n /**\n * @param {?} node\n * @return {?}\n */\n function serializeNode(node) {\n var /** @type {?} */ c = node.children.length > 0 ? \" { \" + node.children.map(serializeNode).join(\", \") + \" } \" : '';\n return \"\" + node.value + c;\n }\n /**\n * The expectation is that the activate route is created with the right set of parameters.\n * So we push new values into the observables only when they are not the initial values.\n * And we detect that by checking if the snapshot field is set.\n * @param {?} route\n * @return {?}\n */\n function advanceActivatedRoute(route) {\n if (route.snapshot) {\n if (!shallowEqual(route.snapshot.queryParams, route._futureSnapshot.queryParams)) {\n ((route.queryParams)).next(route._futureSnapshot.queryParams);\n }\n if (route.snapshot.fragment !== route._futureSnapshot.fragment) {\n ((route.fragment)).next(route._futureSnapshot.fragment);\n }\n if (!shallowEqual(route.snapshot.params, route._futureSnapshot.params)) {\n ((route.params)).next(route._futureSnapshot.params);\n }\n if (!shallowEqualArrays(route.snapshot.url, route._futureSnapshot.url)) {\n ((route.url)).next(route._futureSnapshot.url);\n }\n if (!equalParamsAndUrlSegments(route.snapshot, route._futureSnapshot)) {\n ((route.data)).next(route._futureSnapshot.data);\n }\n route.snapshot = route._futureSnapshot;\n }\n else {\n route.snapshot = route._futureSnapshot;\n // this is for resolved data\n ((route.data)).next(route._futureSnapshot.data);\n }\n }\n /**\n * @param {?} a\n * @param {?} b\n * @return {?}\n */\n function equalParamsAndUrlSegments(a, b) {\n return shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);\n }\n\n /**\n * @param {?} routeReuseStrategy\n * @param {?} curr\n * @param {?} prevState\n * @return {?}\n */\n function createRouterState(routeReuseStrategy, curr, prevState) {\n var /** @type {?} */ root = createNode(routeReuseStrategy, curr._root, prevState ? prevState._root : undefined);\n return new RouterState(root, curr);\n }\n /**\n * @param {?} routeReuseStrategy\n * @param {?} curr\n * @param {?=} prevState\n * @return {?}\n */\n function createNode(routeReuseStrategy, curr, prevState) {\n // reuse an activated route that is currently displayed on the screen\n if (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) {\n var /** @type {?} */ value = prevState.value;\n value._futureSnapshot = curr.value;\n var /** @type {?} */ children = createOrReuseChildren(routeReuseStrategy, curr, prevState);\n return new TreeNode(value, children);\n }\n else if (routeReuseStrategy.retrieve(curr.value)) {\n var /** @type {?} */ tree = ((routeReuseStrategy.retrieve(curr.value))).route;\n setFutureSnapshotsOfActivatedRoutes(curr, tree);\n return tree;\n }\n else {\n var /** @type {?} */ value = createActivatedRoute(curr.value);\n var /** @type {?} */ children = curr.children.map(function (c) { return createNode(routeReuseStrategy, c); });\n return new TreeNode(value, children);\n }\n }\n /**\n * @param {?} curr\n * @param {?} result\n * @return {?}\n */\n function setFutureSnapshotsOfActivatedRoutes(curr, result) {\n if (curr.value.routeConfig !== result.value.routeConfig) {\n throw new Error('Cannot reattach ActivatedRouteSnapshot created from a different route');\n }\n if (curr.children.length !== result.children.length) {\n throw new Error('Cannot reattach ActivatedRouteSnapshot with a different number of children');\n }\n result.value._futureSnapshot = curr.value;\n for (var /** @type {?} */ i = 0; i < curr.children.length; ++i) {\n setFutureSnapshotsOfActivatedRoutes(curr.children[i], result.children[i]);\n }\n }\n /**\n * @param {?} routeReuseStrategy\n * @param {?} curr\n * @param {?} prevState\n * @return {?}\n */\n function createOrReuseChildren(routeReuseStrategy, curr, prevState) {\n return curr.children.map(function (child) {\n for (var _i = 0, _a = prevState.children; _i < _a.length; _i++) {\n var p = _a[_i];\n if (routeReuseStrategy.shouldReuseRoute(p.value.snapshot, child.value)) {\n return createNode(routeReuseStrategy, child, p);\n }\n }\n return createNode(routeReuseStrategy, child);\n });\n }\n /**\n * @param {?} c\n * @return {?}\n */\n function createActivatedRoute(c) {\n return new ActivatedRoute(new rxjs_BehaviorSubject.BehaviorSubject(c.url), new rxjs_BehaviorSubject.BehaviorSubject(c.params), new rxjs_BehaviorSubject.BehaviorSubject(c.queryParams), new rxjs_BehaviorSubject.BehaviorSubject(c.fragment), new rxjs_BehaviorSubject.BehaviorSubject(c.data), c.outlet, c.component, c);\n }\n\n /**\n * @param {?} route\n * @param {?} urlTree\n * @param {?} commands\n * @param {?} queryParams\n * @param {?} fragment\n * @return {?}\n */\n function createUrlTree(route, urlTree, commands, queryParams, fragment) {\n if (commands.length === 0) {\n return tree(urlTree.root, urlTree.root, urlTree, queryParams, fragment);\n }\n var /** @type {?} */ nav = computeNavigation(commands);\n if (nav.toRoot()) {\n return tree(urlTree.root, new UrlSegmentGroup([], {}), urlTree, queryParams, fragment);\n }\n var /** @type {?} */ startingPosition = findStartingPosition(nav, urlTree, route);\n var /** @type {?} */ segmentGroup = startingPosition.processChildren ?\n updateSegmentGroupChildren(startingPosition.segmentGroup, startingPosition.index, nav.commands) :\n updateSegmentGroup(startingPosition.segmentGroup, startingPosition.index, nav.commands);\n return tree(startingPosition.segmentGroup, segmentGroup, urlTree, queryParams, fragment);\n }\n /**\n * @param {?} command\n * @return {?}\n */\n function isMatrixParams(command) {\n return typeof command === 'object' && !command.outlets && !command.segmentPath;\n }\n /**\n * @param {?} oldSegmentGroup\n * @param {?} newSegmentGroup\n * @param {?} urlTree\n * @param {?} queryParams\n * @param {?} fragment\n * @return {?}\n */\n function tree(oldSegmentGroup, newSegmentGroup, urlTree, queryParams, fragment) {\n if (urlTree.root === oldSegmentGroup) {\n return new UrlTree(newSegmentGroup, stringify(queryParams), fragment);\n }\n return new UrlTree(replaceSegment(urlTree.root, oldSegmentGroup, newSegmentGroup), stringify(queryParams), fragment);\n }\n /**\n * @param {?} current\n * @param {?} oldSegment\n * @param {?} newSegment\n * @return {?}\n */\n function replaceSegment(current, oldSegment, newSegment) {\n var /** @type {?} */ children = {};\n forEach(current.children, function (c, outletName) {\n if (c === oldSegment) {\n children[outletName] = newSegment;\n }\n else {\n children[outletName] = replaceSegment(c, oldSegment, newSegment);\n }\n });\n return new UrlSegmentGroup(current.segments, children);\n }\n var Navigation = (function () {\n /**\n * @param {?} isAbsolute\n * @param {?} numberOfDoubleDots\n * @param {?} commands\n */\n function Navigation(isAbsolute, numberOfDoubleDots, commands) {\n this.isAbsolute = isAbsolute;\n this.numberOfDoubleDots = numberOfDoubleDots;\n this.commands = commands;\n if (isAbsolute && commands.length > 0 && isMatrixParams(commands[0])) {\n throw new Error('Root segment cannot have matrix parameters');\n }\n var cmdWithOutlet = commands.find(function (c) { return typeof c === 'object' && c.outlets; });\n if (cmdWithOutlet && cmdWithOutlet !== last(commands)) {\n throw new Error('{outlets:{}} has to be the last command');\n }\n }\n /**\n * @return {?}\n */\n Navigation.prototype.toRoot = function () {\n return this.isAbsolute && this.commands.length === 1 && this.commands[0] == '/';\n };\n return Navigation;\n }());\n /**\n * Transforms commands to a normalized `Navigation`\n * @param {?} commands\n * @return {?}\n */\n function computeNavigation(commands) {\n if ((typeof commands[0] === 'string') && commands.length === 1 && commands[0] === '/') {\n return new Navigation(true, 0, commands);\n }\n var /** @type {?} */ numberOfDoubleDots = 0;\n var /** @type {?} */ isAbsolute = false;\n var /** @type {?} */ res = commands.reduce(function (res, cmd, cmdIdx) {\n if (typeof cmd === 'object') {\n if (cmd.outlets) {\n var /** @type {?} */ outlets_1 = {};\n forEach(cmd.outlets, function (commands, name) {\n outlets_1[name] = typeof commands === 'string' ? commands.split('/') : commands;\n });\n return res.concat([{ outlets: outlets_1 }]);\n }\n if (cmd.segmentPath) {\n return res.concat([cmd.segmentPath]);\n }\n }\n if (!(typeof cmd === 'string')) {\n return res.concat([cmd]);\n }\n if (cmdIdx === 0) {\n cmd.split('/').forEach(function (urlPart, partIndex) {\n if (partIndex == 0 && urlPart === '.') {\n }\n else if (partIndex == 0 && urlPart === '') {\n isAbsolute = true;\n }\n else if (urlPart === '..') {\n numberOfDoubleDots++;\n }\n else if (urlPart != '') {\n res.push(urlPart);\n }\n });\n return res;\n }\n return res.concat([cmd]);\n }, []);\n return new Navigation(isAbsolute, numberOfDoubleDots, res);\n }\n var Position = (function () {\n /**\n * @param {?} segmentGroup\n * @param {?} processChildren\n * @param {?} index\n */\n function Position(segmentGroup, processChildren, index) {\n this.segmentGroup = segmentGroup;\n this.processChildren = processChildren;\n this.index = index;\n }\n return Position;\n }());\n /**\n * @param {?} nav\n * @param {?} tree\n * @param {?} route\n * @return {?}\n */\n function findStartingPosition(nav, tree, route) {\n if (nav.isAbsolute) {\n return new Position(tree.root, true, 0);\n }\n if (route.snapshot._lastPathIndex === -1) {\n return new Position(route.snapshot._urlSegment, true, 0);\n }\n var /** @type {?} */ modifier = isMatrixParams(nav.commands[0]) ? 0 : 1;\n var /** @type {?} */ index = route.snapshot._lastPathIndex + modifier;\n return createPositionApplyingDoubleDots(route.snapshot._urlSegment, index, nav.numberOfDoubleDots);\n }\n /**\n * @param {?} group\n * @param {?} index\n * @param {?} numberOfDoubleDots\n * @return {?}\n */\n function createPositionApplyingDoubleDots(group, index, numberOfDoubleDots) {\n var /** @type {?} */ g = group;\n var /** @type {?} */ ci = index;\n var /** @type {?} */ dd = numberOfDoubleDots;\n while (dd > ci) {\n dd -= ci;\n g = g.parent;\n if (!g) {\n throw new Error('Invalid number of \\'../\\'');\n }\n ci = g.segments.length;\n }\n return new Position(g, false, ci - dd);\n }\n /**\n * @param {?} command\n * @return {?}\n */\n function getPath(command) {\n if (typeof command === 'object' && command.outlets)\n return command.outlets[PRIMARY_OUTLET];\n return \"\" + command;\n }\n /**\n * @param {?} commands\n * @return {?}\n */\n function getOutlets(commands) {\n if (!(typeof commands[0] === 'object'))\n return (_a = {}, _a[PRIMARY_OUTLET] = commands, _a);\n if (commands[0].outlets === undefined)\n return (_b = {}, _b[PRIMARY_OUTLET] = commands, _b);\n return commands[0].outlets;\n var _a, _b;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} startIndex\n * @param {?} commands\n * @return {?}\n */\n function updateSegmentGroup(segmentGroup, startIndex, commands) {\n if (!segmentGroup) {\n segmentGroup = new UrlSegmentGroup([], {});\n }\n if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n return updateSegmentGroupChildren(segmentGroup, startIndex, commands);\n }\n var /** @type {?} */ m = prefixedWith(segmentGroup, startIndex, commands);\n var /** @type {?} */ slicedCommands = commands.slice(m.commandIndex);\n if (m.match && m.pathIndex < segmentGroup.segments.length) {\n var /** @type {?} */ g = new UrlSegmentGroup(segmentGroup.segments.slice(0, m.pathIndex), {});\n g.children[PRIMARY_OUTLET] =\n new UrlSegmentGroup(segmentGroup.segments.slice(m.pathIndex), segmentGroup.children);\n return updateSegmentGroupChildren(g, 0, slicedCommands);\n }\n else if (m.match && slicedCommands.length === 0) {\n return new UrlSegmentGroup(segmentGroup.segments, {});\n }\n else if (m.match && !segmentGroup.hasChildren()) {\n return createNewSegmentGroup(segmentGroup, startIndex, commands);\n }\n else if (m.match) {\n return updateSegmentGroupChildren(segmentGroup, 0, slicedCommands);\n }\n else {\n return createNewSegmentGroup(segmentGroup, startIndex, commands);\n }\n }\n /**\n * @param {?} segmentGroup\n * @param {?} startIndex\n * @param {?} commands\n * @return {?}\n */\n function updateSegmentGroupChildren(segmentGroup, startIndex, commands) {\n if (commands.length === 0) {\n return new UrlSegmentGroup(segmentGroup.segments, {});\n }\n else {\n var /** @type {?} */ outlets_2 = getOutlets(commands);\n var /** @type {?} */ children_1 = {};\n forEach(outlets_2, function (commands, outlet) {\n if (commands !== null) {\n children_1[outlet] = updateSegmentGroup(segmentGroup.children[outlet], startIndex, commands);\n }\n });\n forEach(segmentGroup.children, function (child, childOutlet) {\n if (outlets_2[childOutlet] === undefined) {\n children_1[childOutlet] = child;\n }\n });\n return new UrlSegmentGroup(segmentGroup.segments, children_1);\n }\n }\n /**\n * @param {?} segmentGroup\n * @param {?} startIndex\n * @param {?} commands\n * @return {?}\n */\n function prefixedWith(segmentGroup, startIndex, commands) {\n var /** @type {?} */ currentCommandIndex = 0;\n var /** @type {?} */ currentPathIndex = startIndex;\n var /** @type {?} */ noMatch = { match: false, pathIndex: 0, commandIndex: 0 };\n while (currentPathIndex < segmentGroup.segments.length) {\n if (currentCommandIndex >= commands.length)\n return noMatch;\n var /** @type {?} */ path = segmentGroup.segments[currentPathIndex];\n var /** @type {?} */ curr = getPath(commands[currentCommandIndex]);\n var /** @type {?} */ next = currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;\n if (currentPathIndex > 0 && curr === undefined)\n break;\n if (curr && next && (typeof next === 'object') && next.outlets === undefined) {\n if (!compare(curr, next, path))\n return noMatch;\n currentCommandIndex += 2;\n }\n else {\n if (!compare(curr, {}, path))\n return noMatch;\n currentCommandIndex++;\n }\n currentPathIndex++;\n }\n return { match: true, pathIndex: currentPathIndex, commandIndex: currentCommandIndex };\n }\n /**\n * @param {?} segmentGroup\n * @param {?} startIndex\n * @param {?} commands\n * @return {?}\n */\n function createNewSegmentGroup(segmentGroup, startIndex, commands) {\n var /** @type {?} */ paths = segmentGroup.segments.slice(0, startIndex);\n var /** @type {?} */ i = 0;\n while (i < commands.length) {\n if (typeof commands[i] === 'object' && commands[i].outlets !== undefined) {\n var /** @type {?} */ children = createNewSegmentChildren(commands[i].outlets);\n return new UrlSegmentGroup(paths, children);\n }\n // if we start with an object literal, we need to reuse the path part from the segment\n if (i === 0 && isMatrixParams(commands[0])) {\n var /** @type {?} */ p = segmentGroup.segments[startIndex];\n paths.push(new UrlSegment(p.path, commands[0]));\n i++;\n continue;\n }\n var /** @type {?} */ curr = getPath(commands[i]);\n var /** @type {?} */ next = (i < commands.length - 1) ? commands[i + 1] : null;\n if (curr && next && isMatrixParams(next)) {\n paths.push(new UrlSegment(curr, stringify(next)));\n i += 2;\n }\n else {\n paths.push(new UrlSegment(curr, {}));\n i++;\n }\n }\n return new UrlSegmentGroup(paths, {});\n }\n /**\n * @param {?} outlets\n * @return {?}\n */\n function createNewSegmentChildren(outlets) {\n var /** @type {?} */ children = {};\n forEach(outlets, function (commands, outlet) {\n if (commands !== null) {\n children[outlet] = createNewSegmentGroup(new UrlSegmentGroup([], {}), 0, commands);\n }\n });\n return children;\n }\n /**\n * @param {?} params\n * @return {?}\n */\n function stringify(params) {\n var /** @type {?} */ res = {};\n forEach(params, function (v, k) { return res[k] = \"\" + v; });\n return res;\n }\n /**\n * @param {?} path\n * @param {?} params\n * @param {?} segment\n * @return {?}\n */\n function compare(path, params, segment) {\n return path == segment.path && shallowEqual(params, segment.parameters);\n }\n\n var NoMatch$1 = (function () {\n function NoMatch() {\n }\n return NoMatch;\n }());\n /**\n * @param {?} rootComponentType\n * @param {?} config\n * @param {?} urlTree\n * @param {?} url\n * @return {?}\n */\n function recognize(rootComponentType, config, urlTree, url) {\n return new Recognizer(rootComponentType, config, urlTree, url).recognize();\n }\n var Recognizer = (function () {\n /**\n * @param {?} rootComponentType\n * @param {?} config\n * @param {?} urlTree\n * @param {?} url\n */\n function Recognizer(rootComponentType, config, urlTree, url) {\n this.rootComponentType = rootComponentType;\n this.config = config;\n this.urlTree = urlTree;\n this.url = url;\n }\n /**\n * @return {?}\n */\n Recognizer.prototype.recognize = function () {\n try {\n var /** @type {?} */ rootSegmentGroup = split$1(this.urlTree.root, [], [], this.config).segmentGroup;\n var /** @type {?} */ children = this.processSegmentGroup(this.config, rootSegmentGroup, PRIMARY_OUTLET);\n var /** @type {?} */ root = new ActivatedRouteSnapshot([], Object.freeze({}), Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, {}, PRIMARY_OUTLET, this.rootComponentType, null, this.urlTree.root, -1, {});\n var /** @type {?} */ rootNode = new TreeNode(root, children);\n var /** @type {?} */ routeState = new RouterStateSnapshot(this.url, rootNode);\n this.inheriteParamsAndData(routeState._root);\n return rxjs_observable_of.of(routeState);\n }\n catch (e) {\n return new rxjs_Observable.Observable(function (obs) { return obs.error(e); });\n }\n };\n /**\n * @param {?} routeNode\n * @return {?}\n */\n Recognizer.prototype.inheriteParamsAndData = function (routeNode) {\n var _this = this;\n var /** @type {?} */ route = routeNode.value;\n var /** @type {?} */ i = inheritedParamsDataResolve(route);\n route.params = Object.freeze(i.params);\n route.data = Object.freeze(i.data);\n routeNode.children.forEach(function (n) { return _this.inheriteParamsAndData(n); });\n };\n /**\n * @param {?} config\n * @param {?} segmentGroup\n * @param {?} outlet\n * @return {?}\n */\n Recognizer.prototype.processSegmentGroup = function (config, segmentGroup, outlet) {\n if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {\n return this.processChildren(config, segmentGroup);\n }\n else {\n return this.processSegment(config, segmentGroup, segmentGroup.segments, outlet);\n }\n };\n /**\n * @param {?} config\n * @param {?} segmentGroup\n * @return {?}\n */\n Recognizer.prototype.processChildren = function (config, segmentGroup) {\n var _this = this;\n var /** @type {?} */ children = mapChildrenIntoArray(segmentGroup, function (child, childOutlet) { return _this.processSegmentGroup(config, child, childOutlet); });\n checkOutletNameUniqueness(children);\n sortActivatedRouteSnapshots(children);\n return children;\n };\n /**\n * @param {?} config\n * @param {?} segmentGroup\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n Recognizer.prototype.processSegment = function (config, segmentGroup, segments, outlet) {\n for (var _i = 0, config_1 = config; _i < config_1.length; _i++) {\n var r = config_1[_i];\n try {\n return this.processSegmentAgainstRoute(r, segmentGroup, segments, outlet);\n }\n catch (e) {\n if (!(e instanceof NoMatch$1))\n throw e;\n }\n }\n if (this.noLeftoversInUrl(segmentGroup, segments, outlet)) {\n return [];\n }\n else {\n throw new NoMatch$1();\n }\n };\n /**\n * @param {?} segmentGroup\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n Recognizer.prototype.noLeftoversInUrl = function (segmentGroup, segments, outlet) {\n return segments.length === 0 && !segmentGroup.children[outlet];\n };\n /**\n * @param {?} route\n * @param {?} rawSegment\n * @param {?} segments\n * @param {?} outlet\n * @return {?}\n */\n Recognizer.prototype.processSegmentAgainstRoute = function (route, rawSegment, segments, outlet) {\n if (route.redirectTo)\n throw new NoMatch$1();\n if ((route.outlet ? route.outlet : PRIMARY_OUTLET) !== outlet)\n throw new NoMatch$1();\n if (route.path === '**') {\n var /** @type {?} */ params = segments.length > 0 ? last(segments).parameters : {};\n var /** @type {?} */ snapshot_1 = new ActivatedRouteSnapshot(segments, params, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, getData(route), outlet, route.component, route, getSourceSegmentGroup(rawSegment), getPathIndexShift(rawSegment) + segments.length, getResolve(route));\n return [new TreeNode(snapshot_1, [])];\n }\n var _a = match$1(rawSegment, route, segments), consumedSegments = _a.consumedSegments, parameters = _a.parameters, lastChild = _a.lastChild;\n var /** @type {?} */ rawSlicedSegments = segments.slice(lastChild);\n var /** @type {?} */ childConfig = getChildConfig(route);\n var _b = split$1(rawSegment, consumedSegments, rawSlicedSegments, childConfig), segmentGroup = _b.segmentGroup, slicedSegments = _b.slicedSegments;\n var /** @type {?} */ snapshot = new ActivatedRouteSnapshot(consumedSegments, parameters, Object.freeze(this.urlTree.queryParams), this.urlTree.fragment, getData(route), outlet, route.component, route, getSourceSegmentGroup(rawSegment), getPathIndexShift(rawSegment) + consumedSegments.length, getResolve(route));\n if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {\n var /** @type {?} */ children = this.processChildren(childConfig, segmentGroup);\n return [new TreeNode(snapshot, children)];\n }\n else if (childConfig.length === 0 && slicedSegments.length === 0) {\n return [new TreeNode(snapshot, [])];\n }\n else {\n var /** @type {?} */ children = this.processSegment(childConfig, segmentGroup, slicedSegments, PRIMARY_OUTLET);\n return [new TreeNode(snapshot, children)];\n }\n };\n return Recognizer;\n }());\n /**\n * @param {?} nodes\n * @return {?}\n */\n function sortActivatedRouteSnapshots(nodes) {\n nodes.sort(function (a, b) {\n if (a.value.outlet === PRIMARY_OUTLET)\n return -1;\n if (b.value.outlet === PRIMARY_OUTLET)\n return 1;\n return a.value.outlet.localeCompare(b.value.outlet);\n });\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function getChildConfig(route) {\n if (route.children) {\n return route.children;\n }\n else if (route.loadChildren) {\n return ((route))._loadedConfig.routes;\n }\n else {\n return [];\n }\n }\n /**\n * @param {?} segmentGroup\n * @param {?} route\n * @param {?} segments\n * @return {?}\n */\n function match$1(segmentGroup, route, segments) {\n if (route.path === '') {\n if (route.pathMatch === 'full' && (segmentGroup.hasChildren() || segments.length > 0)) {\n throw new NoMatch$1();\n }\n else {\n return { consumedSegments: [], lastChild: 0, parameters: {} };\n }\n }\n var /** @type {?} */ matcher = route.matcher || defaultUrlMatcher;\n var /** @type {?} */ res = matcher(segments, segmentGroup, route);\n if (!res)\n throw new NoMatch$1();\n var /** @type {?} */ posParams = {};\n forEach(res.posParams, function (v, k) { posParams[k] = v.path; });\n var /** @type {?} */ parameters = merge(posParams, res.consumed[res.consumed.length - 1].parameters);\n return { consumedSegments: res.consumed, lastChild: res.consumed.length, parameters: parameters };\n }\n /**\n * @param {?} nodes\n * @return {?}\n */\n function checkOutletNameUniqueness(nodes) {\n var /** @type {?} */ names = {};\n nodes.forEach(function (n) {\n var /** @type {?} */ routeWithSameOutletName = names[n.value.outlet];\n if (routeWithSameOutletName) {\n var /** @type {?} */ p = routeWithSameOutletName.url.map(function (s) { return s.toString(); }).join('/');\n var /** @type {?} */ c = n.value.url.map(function (s) { return s.toString(); }).join('/');\n throw new Error(\"Two segments cannot have the same outlet name: '\" + p + \"' and '\" + c + \"'.\");\n }\n names[n.value.outlet] = n.value;\n });\n }\n /**\n * @param {?} segmentGroup\n * @return {?}\n */\n function getSourceSegmentGroup(segmentGroup) {\n var /** @type {?} */ s = segmentGroup;\n while (s._sourceSegment) {\n s = s._sourceSegment;\n }\n return s;\n }\n /**\n * @param {?} segmentGroup\n * @return {?}\n */\n function getPathIndexShift(segmentGroup) {\n var /** @type {?} */ s = segmentGroup;\n var /** @type {?} */ res = (s._segmentIndexShift ? s._segmentIndexShift : 0);\n while (s._sourceSegment) {\n s = s._sourceSegment;\n res += (s._segmentIndexShift ? s._segmentIndexShift : 0);\n }\n return res - 1;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} consumedSegments\n * @param {?} slicedSegments\n * @param {?} config\n * @return {?}\n */\n function split$1(segmentGroup, consumedSegments, slicedSegments, config) {\n if (slicedSegments.length > 0 &&\n containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, config)) {\n var /** @type {?} */ s = new UrlSegmentGroup(consumedSegments, createChildrenForEmptyPaths(segmentGroup, consumedSegments, config, new UrlSegmentGroup(slicedSegments, segmentGroup.children)));\n s._sourceSegment = segmentGroup;\n s._segmentIndexShift = consumedSegments.length;\n return { segmentGroup: s, slicedSegments: [] };\n }\n else if (slicedSegments.length === 0 &&\n containsEmptyPathMatches(segmentGroup, slicedSegments, config)) {\n var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children));\n s._sourceSegment = segmentGroup;\n s._segmentIndexShift = consumedSegments.length;\n return { segmentGroup: s, slicedSegments: slicedSegments };\n }\n else {\n var /** @type {?} */ s = new UrlSegmentGroup(segmentGroup.segments, segmentGroup.children);\n s._sourceSegment = segmentGroup;\n s._segmentIndexShift = consumedSegments.length;\n return { segmentGroup: s, slicedSegments: slicedSegments };\n }\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @param {?} children\n * @return {?}\n */\n function addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, routes, children) {\n var /** @type {?} */ res = {};\n for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n var r = routes_1[_i];\n if (emptyPathMatch(segmentGroup, slicedSegments, r) && !children[getOutlet$2(r)]) {\n var /** @type {?} */ s = new UrlSegmentGroup([], {});\n s._sourceSegment = segmentGroup;\n s._segmentIndexShift = segmentGroup.segments.length;\n res[getOutlet$2(r)] = s;\n }\n }\n return merge(children, res);\n }\n /**\n * @param {?} segmentGroup\n * @param {?} consumedSegments\n * @param {?} routes\n * @param {?} primarySegment\n * @return {?}\n */\n function createChildrenForEmptyPaths(segmentGroup, consumedSegments, routes, primarySegment) {\n var /** @type {?} */ res = {};\n res[PRIMARY_OUTLET] = primarySegment;\n primarySegment._sourceSegment = segmentGroup;\n primarySegment._segmentIndexShift = consumedSegments.length;\n for (var _i = 0, routes_2 = routes; _i < routes_2.length; _i++) {\n var r = routes_2[_i];\n if (r.path === '' && getOutlet$2(r) !== PRIMARY_OUTLET) {\n var /** @type {?} */ s = new UrlSegmentGroup([], {});\n s._sourceSegment = segmentGroup;\n s._segmentIndexShift = consumedSegments.length;\n res[getOutlet$2(r)] = s;\n }\n }\n return res;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @return {?}\n */\n function containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, routes) {\n return routes\n .filter(function (r) { return emptyPathMatch(segmentGroup, slicedSegments, r) &&\n getOutlet$2(r) !== PRIMARY_OUTLET; })\n .length > 0;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} routes\n * @return {?}\n */\n function containsEmptyPathMatches(segmentGroup, slicedSegments, routes) {\n return routes.filter(function (r) { return emptyPathMatch(segmentGroup, slicedSegments, r); }).length > 0;\n }\n /**\n * @param {?} segmentGroup\n * @param {?} slicedSegments\n * @param {?} r\n * @return {?}\n */\n function emptyPathMatch(segmentGroup, slicedSegments, r) {\n if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === 'full')\n return false;\n return r.path === '' && r.redirectTo === undefined;\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function getOutlet$2(route) {\n return route.outlet ? route.outlet : PRIMARY_OUTLET;\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function getData(route) {\n return route.data ? route.data : {};\n }\n /**\n * @param {?} route\n * @return {?}\n */\n function getResolve(route) {\n return route.resolve ? route.resolve : {};\n }\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * *\n */\n var RouterOutletMap = (function () {\n function RouterOutletMap() {\n /** @internal */\n this._outlets = {};\n }\n /**\n * Adds an outlet to this map.\n * @param {?} name\n * @param {?} outlet\n * @return {?}\n */\n RouterOutletMap.prototype.registerOutlet = function (name, outlet) { this._outlets[name] = outlet; };\n /**\n * Removes an outlet from this map.\n * @param {?} name\n * @return {?}\n */\n RouterOutletMap.prototype.removeOutlet = function (name) { this._outlets[name] = undefined; };\n return RouterOutletMap;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * *\n * @abstract\n */\n var UrlHandlingStrategy = (function () {\n function UrlHandlingStrategy() {\n }\n /**\n * Tells the router if this URL should be processed.\n * *\n * When it returns true, the router will execute the regular navigation.\n * When it returns false, the router will set the router state to an empty state.\n * As a result, all the active components will be destroyed.\n * *\n * @abstract\n * @param {?} url\n * @return {?}\n */\n UrlHandlingStrategy.prototype.shouldProcessUrl = function (url) { };\n /**\n * Extracts the part of the URL that should be handled by the router.\n * The rest of the URL will remain untouched.\n * @abstract\n * @param {?} url\n * @return {?}\n */\n UrlHandlingStrategy.prototype.extract = function (url) { };\n /**\n * Merges the URL fragment with the rest of the URL.\n * @abstract\n * @param {?} newUrlPart\n * @param {?} rawUrl\n * @return {?}\n */\n UrlHandlingStrategy.prototype.merge = function (newUrlPart, rawUrl) { };\n return UrlHandlingStrategy;\n }());\n /**\n * @experimental\n */\n var DefaultUrlHandlingStrategy = (function () {\n function DefaultUrlHandlingStrategy() {\n }\n /**\n * @param {?} url\n * @return {?}\n */\n DefaultUrlHandlingStrategy.prototype.shouldProcessUrl = function (url) { return true; };\n /**\n * @param {?} url\n * @return {?}\n */\n DefaultUrlHandlingStrategy.prototype.extract = function (url) { return url; };\n /**\n * @param {?} newUrlPart\n * @param {?} wholeUrl\n * @return {?}\n */\n DefaultUrlHandlingStrategy.prototype.merge = function (newUrlPart, wholeUrl) { return newUrlPart; };\n return DefaultUrlHandlingStrategy;\n }());\n\n /**\n * *\n */\n var NavigationStart = (function () {\n /**\n * @param {?} id\n * @param {?} url\n */\n function NavigationStart(id, url) {\n this.id = id;\n this.url = url;\n }\n /**\n * @return {?}\n */\n NavigationStart.prototype.toString = function () { return \"NavigationStart(id: \" + this.id + \", url: '\" + this.url + \"')\"; };\n return NavigationStart;\n }());\n /**\n * *\n */\n var NavigationEnd = (function () {\n /**\n * @param {?} id\n * @param {?} url\n * @param {?} urlAfterRedirects\n */\n function NavigationEnd(id, url, urlAfterRedirects) {\n this.id = id;\n this.url = url;\n this.urlAfterRedirects = urlAfterRedirects;\n }\n /**\n * @return {?}\n */\n NavigationEnd.prototype.toString = function () {\n return \"NavigationEnd(id: \" + this.id + \", url: '\" + this.url + \"', urlAfterRedirects: '\" + this.urlAfterRedirects + \"')\";\n };\n return NavigationEnd;\n }());\n /**\n * *\n */\n var NavigationCancel = (function () {\n /**\n * @param {?} id\n * @param {?} url\n * @param {?} reason\n */\n function NavigationCancel(id, url, reason) {\n this.id = id;\n this.url = url;\n this.reason = reason;\n }\n /**\n * @return {?}\n */\n NavigationCancel.prototype.toString = function () { return \"NavigationCancel(id: \" + this.id + \", url: '\" + this.url + \"')\"; };\n return NavigationCancel;\n }());\n /**\n * *\n */\n var NavigationError = (function () {\n /**\n * @param {?} id\n * @param {?} url\n * @param {?} error\n */\n function NavigationError(id, url, error) {\n this.id = id;\n this.url = url;\n this.error = error;\n }\n /**\n * @return {?}\n */\n NavigationError.prototype.toString = function () {\n return \"NavigationError(id: \" + this.id + \", url: '\" + this.url + \"', error: \" + this.error + \")\";\n };\n return NavigationError;\n }());\n /**\n * *\n */\n var RoutesRecognized = (function () {\n /**\n * @param {?} id\n * @param {?} url\n * @param {?} urlAfterRedirects\n * @param {?} state\n */\n function RoutesRecognized(id, url, urlAfterRedirects, state) {\n this.id = id;\n this.url = url;\n this.urlAfterRedirects = urlAfterRedirects;\n this.state = state;\n }\n /**\n * @return {?}\n */\n RoutesRecognized.prototype.toString = function () {\n return \"RoutesRecognized(id: \" + this.id + \", url: '\" + this.url + \"', urlAfterRedirects: '\" + this.urlAfterRedirects + \"', state: \" + this.state + \")\";\n };\n return RoutesRecognized;\n }());\n /**\n * @param {?} error\n * @return {?}\n */\n function defaultErrorHandler(error) {\n throw error;\n }\n /**\n * Does not detach any subtrees. Reuses routes as long as their route config is the same.\n */\n var DefaultRouteReuseStrategy = (function () {\n function DefaultRouteReuseStrategy() {\n }\n /**\n * @param {?} route\n * @return {?}\n */\n DefaultRouteReuseStrategy.prototype.shouldDetach = function (route) { return false; };\n /**\n * @param {?} route\n * @param {?} detachedTree\n * @return {?}\n */\n DefaultRouteReuseStrategy.prototype.store = function (route, detachedTree) { };\n /**\n * @param {?} route\n * @return {?}\n */\n DefaultRouteReuseStrategy.prototype.shouldAttach = function (route) { return false; };\n /**\n * @param {?} route\n * @return {?}\n */\n DefaultRouteReuseStrategy.prototype.retrieve = function (route) { return null; };\n /**\n * @param {?} future\n * @param {?} curr\n * @return {?}\n */\n DefaultRouteReuseStrategy.prototype.shouldReuseRoute = function (future, curr) {\n return future.routeConfig === curr.routeConfig;\n };\n return DefaultRouteReuseStrategy;\n }());\n /**\n * *\n * See {@link Routes} for more details and examples.\n * *\n * *\n */\n var Router = (function () {\n /**\n * @param {?} rootComponentType\n * @param {?} urlSerializer\n * @param {?} outletMap\n * @param {?} location\n * @param {?} injector\n * @param {?} loader\n * @param {?} compiler\n * @param {?} config\n */\n function Router(rootComponentType, urlSerializer, outletMap, location, injector, loader, compiler, config) {\n this.rootComponentType = rootComponentType;\n this.urlSerializer = urlSerializer;\n this.outletMap = outletMap;\n this.location = location;\n this.injector = injector;\n this.config = config;\n this.navigations = new rxjs_BehaviorSubject.BehaviorSubject(null);\n this.routerEvents = new rxjs_Subject.Subject();\n this.navigationId = 0;\n /**\n * Error handler that is invoked when a navigation errors.\n *\n * See {@link ErrorHandler} for more information.\n */\n this.errorHandler = defaultErrorHandler;\n /**\n * Indicates if at least one navigation happened.\n */\n this.navigated = false;\n /**\n * Extracts and merges URLs. Used for Angular 1 to Angular 2 migrations.\n */\n this.urlHandlingStrategy = new DefaultUrlHandlingStrategy();\n this.routeReuseStrategy = new DefaultRouteReuseStrategy();\n this.resetConfig(config);\n this.currentUrlTree = createEmptyUrlTree();\n this.rawUrlTree = this.currentUrlTree;\n this.configLoader = new RouterConfigLoader(loader, compiler);\n this.currentRouterState = createEmptyState(this.currentUrlTree, this.rootComponentType);\n this.processNavigations();\n }\n /**\n * TODO: this should be removed once the constructor of the router made internal\n * @param {?} rootComponentType\n * @return {?}\n */\n Router.prototype.resetRootComponentType = function (rootComponentType) {\n this.rootComponentType = rootComponentType;\n // TODO: vsavkin router 4.0 should make the root component set to null\n // this will simplify the lifecycle of the router.\n this.currentRouterState.root.component = this.rootComponentType;\n };\n /**\n * Sets up the location change listener and performs the initial navigation.\n * @return {?}\n */\n Router.prototype.initialNavigation = function () {\n this.setUpLocationChangeListener();\n this.navigateByUrl(this.location.path(true), { replaceUrl: true });\n };\n /**\n * Sets up the location change listener.\n * @return {?}\n */\n Router.prototype.setUpLocationChangeListener = function () {\n var _this = this;\n // Zone.current.wrap is needed because of the issue with RxJS scheduler,\n // which does not work properly with zone.js in IE and Safari\n if (!this.locationSubscription) {\n this.locationSubscription = (this.location.subscribe(Zone.current.wrap(function (change) {\n var /** @type {?} */ rawUrlTree = _this.urlSerializer.parse(change['url']);\n var /** @type {?} */ source = change['type'] === 'popstate' ? 'popstate' : 'hashchange';\n setTimeout(function () { _this.scheduleNavigation(rawUrlTree, source, { replaceUrl: true }); }, 0);\n })));\n }\n };\n Object.defineProperty(Router.prototype, \"routerState\", {\n /**\n * The current route state\n * @return {?}\n */\n get: function () { return this.currentRouterState; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"url\", {\n /**\n * The current url\n * @return {?}\n */\n get: function () { return this.serializeUrl(this.currentUrlTree); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"events\", {\n /**\n * An observable of router events\n * @return {?}\n */\n get: function () { return this.routerEvents; },\n enumerable: true,\n configurable: true\n });\n /**\n * Resets the configuration used for navigation and generating links.\n * *\n * ### Usage\n * *\n * ```\n * router.resetConfig([\n * { path: 'team/:id', component: TeamCmp, children: [\n * { path: 'simple', component: SimpleCmp },\n * { path: 'user/:name', component: UserCmp }\n * ]}\n * ]);\n * ```\n * @param {?} config\n * @return {?}\n */\n Router.prototype.resetConfig = function (config) {\n validateConfig(config);\n this.config = config;\n };\n /**\n * @return {?}\n */\n Router.prototype.ngOnDestroy = function () { this.dispose(); };\n /**\n * Disposes of the router\n * @return {?}\n */\n Router.prototype.dispose = function () {\n if (this.locationSubscription) {\n this.locationSubscription.unsubscribe();\n this.locationSubscription = null;\n }\n };\n /**\n * Applies an array of commands to the current url tree and creates a new url tree.\n * *\n * When given an activate route, applies the given commands starting from the route.\n * When not given a route, applies the given command starting from the root.\n * *\n * ### Usage\n * *\n * ```\n * // create /team/33/user/11\n * router.createUrlTree(['/team', 33, 'user', 11]);\n * *\n * // create /team/33;expand=true/user/11\n * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);\n * *\n * // you can collapse static segments like this (this works only with the first passed-in value):\n * router.createUrlTree(['/team/33/user', userId]);\n * *\n * // If the first segment can contain slashes, and you do not want the router to split it, you\n * // can do the following:\n * *\n * router.createUrlTree([{segmentPath: '/one/two'}]);\n * *\n * // create /team/33/(user/11//right:chat)\n * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: 'chat'}}]);\n * *\n * // remove the right secondary node\n * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: null}}]);\n * *\n * // assuming the current url is `/team/33/user/11` and the route points to `user/11`\n * *\n * // navigate to /team/33/user/11/details\n * router.createUrlTree(['details'], {relativeTo: route});\n * *\n * // navigate to /team/33/user/22\n * router.createUrlTree(['../22'], {relativeTo: route});\n * *\n * // navigate to /team/44/user/22\n * router.createUrlTree(['../../team/44/user/22'], {relativeTo: route});\n * ```\n * @param {?} commands\n * @param {?=} __1\n * @return {?}\n */\n Router.prototype.createUrlTree = function (commands, _a) {\n var _b = _a === void 0 ? {} : _a, relativeTo = _b.relativeTo, queryParams = _b.queryParams, fragment = _b.fragment, preserveQueryParams = _b.preserveQueryParams, preserveFragment = _b.preserveFragment;\n var /** @type {?} */ a = relativeTo || this.routerState.root;\n var /** @type {?} */ q = preserveQueryParams ? this.currentUrlTree.queryParams : queryParams;\n var /** @type {?} */ f = preserveFragment ? this.currentUrlTree.fragment : fragment;\n return createUrlTree(a, this.currentUrlTree, commands, q, f);\n };\n /**\n * Navigate based on the provided url. This navigation is always absolute.\n * *\n * Returns a promise that:\n * - resolves to 'true' when navigation succeeds,\n * - resolves to 'false' when navigation fails,\n * - is rejected when an error happens.\n * *\n * ### Usage\n * *\n * ```\n * router.navigateByUrl(\"/team/33/user/11\");\n * *\n * // Navigate without updating the URL\n * router.navigateByUrl(\"/team/33/user/11\", { skipLocationChange: true });\n * ```\n * *\n * In opposite to `navigate`, `navigateByUrl` takes a whole URL\n * and does not apply any delta to the current one.\n * @param {?} url\n * @param {?=} extras\n * @return {?}\n */\n Router.prototype.navigateByUrl = function (url, extras) {\n if (extras === void 0) { extras = { skipLocationChange: false }; }\n if (url instanceof UrlTree) {\n return this.scheduleNavigation(this.urlHandlingStrategy.merge(url, this.rawUrlTree), 'imperative', extras);\n }\n var /** @type {?} */ urlTree = this.urlSerializer.parse(url);\n return this.scheduleNavigation(this.urlHandlingStrategy.merge(urlTree, this.rawUrlTree), 'imperative', extras);\n };\n /**\n * Navigate based on the provided array of commands and a starting point.\n * If no starting route is provided, the navigation is absolute.\n * *\n * Returns a promise that:\n * - resolves to 'true' when navigation succeeds,\n * - resolves to 'false' when navigation fails,\n * - is rejected when an error happens.\n * *\n * ### Usage\n * *\n * ```\n * router.navigate(['team', 33, 'user', 11], {relativeTo: route});\n * *\n * // Navigate without updating the URL\n * router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});\n * ```\n * *\n * In opposite to `navigateByUrl`, `navigate` always takes a delta that is applied to the current\n * URL.\n * @param {?} commands\n * @param {?=} extras\n * @return {?}\n */\n Router.prototype.navigate = function (commands, extras) {\n if (extras === void 0) { extras = { skipLocationChange: false }; }\n if (typeof extras.queryParams === 'object' && extras.queryParams !== null) {\n extras.queryParams = this.removeEmptyProps(extras.queryParams);\n }\n return this.navigateByUrl(this.createUrlTree(commands, extras), extras);\n };\n /**\n * Serializes a {@link UrlTree} into a string\n * @param {?} url\n * @return {?}\n */\n Router.prototype.serializeUrl = function (url) { return this.urlSerializer.serialize(url); };\n /**\n * Parses a string into a {@link UrlTree}\n * @param {?} url\n * @return {?}\n */\n Router.prototype.parseUrl = function (url) { return this.urlSerializer.parse(url); };\n /**\n * Returns whether the url is activated\n * @param {?} url\n * @param {?} exact\n * @return {?}\n */\n Router.prototype.isActive = function (url, exact) {\n if (url instanceof UrlTree) {\n return containsTree(this.currentUrlTree, url, exact);\n }\n else {\n var /** @type {?} */ urlTree = this.urlSerializer.parse(url);\n return containsTree(this.currentUrlTree, urlTree, exact);\n }\n };\n /**\n * @param {?} params\n * @return {?}\n */\n Router.prototype.removeEmptyProps = function (params) {\n return Object.keys(params).reduce(function (result, key) {\n var /** @type {?} */ value = params[key];\n if (value !== null && value !== undefined) {\n result[key] = value;\n }\n return result;\n }, {});\n };\n /**\n * @return {?}\n */\n Router.prototype.processNavigations = function () {\n var _this = this;\n rxjs_operator_concatMap.concatMap\n .call(this.navigations, function (nav) {\n if (nav) {\n _this.executeScheduledNavigation(nav);\n // a failed navigation should not stop the router from processing\n // further navigations => the catch\n return nav.promise.catch(function () { });\n }\n else {\n return (rxjs_observable_of.of(null));\n }\n })\n .subscribe(function () { });\n };\n /**\n * @param {?} rawUrl\n * @param {?} source\n * @param {?} extras\n * @return {?}\n */\n Router.prototype.scheduleNavigation = function (rawUrl, source, extras) {\n var /** @type {?} */ lastNavigation = this.navigations.value;\n // If the user triggers a navigation imperatively (e.g., by using navigateByUrl),\n // and that navigation results in 'replaceState' that leads to the same URL,\n // we should skip those.\n if (lastNavigation && source !== 'imperative' && lastNavigation.source === 'imperative' &&\n lastNavigation.rawUrl.toString() === rawUrl.toString()) {\n return null; // return value is not used\n }\n // Because of a bug in IE and Edge, the location class fires two events (popstate and\n // hashchange)\n // every single time. The second one should be ignored. Otherwise, the URL will flicker.\n if (lastNavigation && source == 'hashchange' && lastNavigation.source === 'popstate' &&\n lastNavigation.rawUrl.toString() === rawUrl.toString()) {\n return null; // return value is not used\n }\n var /** @type {?} */ resolve = null;\n var /** @type {?} */ reject = null;\n var /** @type {?} */ promise = new Promise(function (res, rej) {\n resolve = res;\n reject = rej;\n });\n var /** @type {?} */ id = ++this.navigationId;\n this.navigations.next({ id: id, source: source, rawUrl: rawUrl, extras: extras, resolve: resolve, reject: reject, promise: promise });\n // Make sure that the error is propagated even though `processNavigations` catch\n // handler does not rethrow\n return promise.catch(function (e) { return Promise.reject(e); });\n };\n /**\n * @param {?} __0\n * @return {?}\n */\n Router.prototype.executeScheduledNavigation = function (_a) {\n var _this = this;\n var id = _a.id, rawUrl = _a.rawUrl, extras = _a.extras, resolve = _a.resolve, reject = _a.reject;\n var /** @type {?} */ url = this.urlHandlingStrategy.extract(rawUrl);\n var /** @type {?} */ urlTransition = !this.navigated || url.toString() !== this.currentUrlTree.toString();\n if (urlTransition && this.urlHandlingStrategy.shouldProcessUrl(rawUrl)) {\n this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));\n Promise.resolve()\n .then(function (_) { return _this.runNavigate(url, rawUrl, extras.skipLocationChange, extras.replaceUrl, id, null); })\n .then(resolve, reject);\n }\n else if (urlTransition && this.rawUrlTree &&\n this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)) {\n this.routerEvents.next(new NavigationStart(id, this.serializeUrl(url)));\n Promise.resolve()\n .then(function (_) { return _this.runNavigate(url, rawUrl, false, false, id, createEmptyState(url, _this.rootComponentType).snapshot); })\n .then(resolve, reject);\n }\n else {\n this.rawUrlTree = rawUrl;\n resolve(null);\n }\n };\n /**\n * @param {?} url\n * @param {?} rawUrl\n * @param {?} shouldPreventPushState\n * @param {?} shouldReplaceUrl\n * @param {?} id\n * @param {?} precreatedState\n * @return {?}\n */\n Router.prototype.runNavigate = function (url, rawUrl, shouldPreventPushState, shouldReplaceUrl, id, precreatedState) {\n var _this = this;\n if (id !== this.navigationId) {\n this.location.go(this.urlSerializer.serialize(this.currentUrlTree));\n this.routerEvents.next(new NavigationCancel(id, this.serializeUrl(url), \"Navigation ID \" + id + \" is not equal to the current navigation id \" + this.navigationId));\n return Promise.resolve(false);\n }\n return new Promise(function (resolvePromise, rejectPromise) {\n // create an observable of the url and route state snapshot\n // this operation do not result in any side effects\n var /** @type {?} */ urlAndSnapshot$;\n if (!precreatedState) {\n var /** @type {?} */ redirectsApplied$ = applyRedirects(_this.injector, _this.configLoader, _this.urlSerializer, url, _this.config);\n urlAndSnapshot$ = rxjs_operator_mergeMap.mergeMap.call(redirectsApplied$, function (appliedUrl) {\n return rxjs_operator_map.map.call(recognize(_this.rootComponentType, _this.config, appliedUrl, _this.serializeUrl(appliedUrl)), function (snapshot) {\n _this.routerEvents.next(new RoutesRecognized(id, _this.serializeUrl(url), _this.serializeUrl(appliedUrl), snapshot));\n return { appliedUrl: appliedUrl, snapshot: snapshot };\n });\n });\n }\n else {\n urlAndSnapshot$ = rxjs_observable_of.of({ appliedUrl: url, snapshot: precreatedState });\n }\n // run preactivation: guards and data resolvers\n var /** @type {?} */ preActivation;\n var /** @type {?} */ preactivationTraverse$ = rxjs_operator_map.map.call(urlAndSnapshot$, function (_a) {\n var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot;\n preActivation =\n new PreActivation(snapshot, _this.currentRouterState.snapshot, _this.injector);\n preActivation.traverse(_this.outletMap);\n return { appliedUrl: appliedUrl, snapshot: snapshot };\n });\n var /** @type {?} */ preactivationCheckGuards = rxjs_operator_mergeMap.mergeMap.call(preactivationTraverse$, function (_a) {\n var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot;\n if (_this.navigationId !== id)\n return rxjs_observable_of.of(false);\n return rxjs_operator_map.map.call(preActivation.checkGuards(), function (shouldActivate) {\n return { appliedUrl: appliedUrl, snapshot: snapshot, shouldActivate: shouldActivate };\n });\n });\n var /** @type {?} */ preactivationResolveData$ = rxjs_operator_mergeMap.mergeMap.call(preactivationCheckGuards, function (p) {\n if (_this.navigationId !== id)\n return rxjs_observable_of.of(false);\n if (p.shouldActivate) {\n return rxjs_operator_map.map.call(preActivation.resolveData(), function () { return p; });\n }\n else {\n return rxjs_observable_of.of(p);\n }\n });\n // create router state\n // this operation has side effects => route state is being affected\n var /** @type {?} */ routerState$ = rxjs_operator_map.map.call(preactivationResolveData$, function (_a) {\n var appliedUrl = _a.appliedUrl, snapshot = _a.snapshot, shouldActivate = _a.shouldActivate;\n if (shouldActivate) {\n var /** @type {?} */ state = createRouterState(_this.routeReuseStrategy, snapshot, _this.currentRouterState);\n return { appliedUrl: appliedUrl, state: state, shouldActivate: shouldActivate };\n }\n else {\n return { appliedUrl: appliedUrl, state: null, shouldActivate: shouldActivate };\n }\n });\n // applied the new router state\n // this operation has side effects\n var /** @type {?} */ navigationIsSuccessful;\n var /** @type {?} */ storedState = _this.currentRouterState;\n var /** @type {?} */ storedUrl = _this.currentUrlTree;\n routerState$\n .forEach(function (_a) {\n var appliedUrl = _a.appliedUrl, state = _a.state, shouldActivate = _a.shouldActivate;\n if (!shouldActivate || id !== _this.navigationId) {\n navigationIsSuccessful = false;\n return;\n }\n _this.currentUrlTree = appliedUrl;\n _this.rawUrlTree = _this.urlHandlingStrategy.merge(_this.currentUrlTree, rawUrl);\n _this.currentRouterState = state;\n if (!shouldPreventPushState) {\n var /** @type {?} */ path = _this.urlSerializer.serialize(_this.rawUrlTree);\n if (_this.location.isCurrentPathEqualTo(path) || shouldReplaceUrl) {\n _this.location.replaceState(path);\n }\n else {\n _this.location.go(path);\n }\n }\n new ActivateRoutes(_this.routeReuseStrategy, state, storedState)\n .activate(_this.outletMap);\n navigationIsSuccessful = true;\n })\n .then(function () {\n _this.navigated = true;\n if (navigationIsSuccessful) {\n _this.routerEvents.next(new NavigationEnd(id, _this.serializeUrl(url), _this.serializeUrl(_this.currentUrlTree)));\n resolvePromise(true);\n }\n else {\n _this.resetUrlToCurrentUrlTree();\n _this.routerEvents.next(new NavigationCancel(id, _this.serializeUrl(url), ''));\n resolvePromise(false);\n }\n }, function (e) {\n if (e instanceof NavigationCancelingError) {\n _this.resetUrlToCurrentUrlTree();\n _this.navigated = true;\n _this.routerEvents.next(new NavigationCancel(id, _this.serializeUrl(url), e.message));\n resolvePromise(false);\n }\n else {\n _this.routerEvents.next(new NavigationError(id, _this.serializeUrl(url), e));\n try {\n resolvePromise(_this.errorHandler(e));\n }\n catch (ee) {\n rejectPromise(ee);\n }\n }\n _this.currentRouterState = storedState;\n _this.currentUrlTree = storedUrl;\n _this.rawUrlTree = _this.urlHandlingStrategy.merge(_this.currentUrlTree, rawUrl);\n _this.location.replaceState(_this.serializeUrl(_this.rawUrlTree));\n });\n });\n };\n /**\n * @return {?}\n */\n Router.prototype.resetUrlToCurrentUrlTree = function () {\n var /** @type {?} */ path = this.urlSerializer.serialize(this.rawUrlTree);\n this.location.replaceState(path);\n };\n return Router;\n }());\n var CanActivate = (function () {\n /**\n * @param {?} path\n */\n function CanActivate(path) {\n this.path = path;\n }\n Object.defineProperty(CanActivate.prototype, \"route\", {\n /**\n * @return {?}\n */\n get: function () { return this.path[this.path.length - 1]; },\n enumerable: true,\n configurable: true\n });\n return CanActivate;\n }());\n var CanDeactivate = (function () {\n /**\n * @param {?} component\n * @param {?} route\n */\n function CanDeactivate(component, route) {\n this.component = component;\n this.route = route;\n }\n return CanDeactivate;\n }());\n var PreActivation = (function () {\n /**\n * @param {?} future\n * @param {?} curr\n * @param {?} injector\n */\n function PreActivation(future, curr, injector) {\n this.future = future;\n this.curr = curr;\n this.injector = injector;\n this.checks = [];\n }\n /**\n * @param {?} parentOutletMap\n * @return {?}\n */\n PreActivation.prototype.traverse = function (parentOutletMap) {\n var /** @type {?} */ futureRoot = this.future._root;\n var /** @type {?} */ currRoot = this.curr ? this.curr._root : null;\n this.traverseChildRoutes(futureRoot, currRoot, parentOutletMap, [futureRoot.value]);\n };\n /**\n * @return {?}\n */\n PreActivation.prototype.checkGuards = function () {\n var _this = this;\n if (this.checks.length === 0)\n return rxjs_observable_of.of(true);\n var /** @type {?} */ checks$ = rxjs_observable_from.from(this.checks);\n var /** @type {?} */ runningChecks$ = rxjs_operator_mergeMap.mergeMap.call(checks$, function (s) {\n if (s instanceof CanActivate) {\n return andObservables(rxjs_observable_from.from([_this.runCanActivateChild(s.path), _this.runCanActivate(s.route)]));\n }\n else if (s instanceof CanDeactivate) {\n // workaround https://github.com/Microsoft/TypeScript/issues/7271\n var /** @type {?} */ s2 = (s);\n return _this.runCanDeactivate(s2.component, s2.route);\n }\n else {\n throw new Error('Cannot be reached');\n }\n });\n return rxjs_operator_every.every.call(runningChecks$, function (result) { return result === true; });\n };\n /**\n * @return {?}\n */\n PreActivation.prototype.resolveData = function () {\n var _this = this;\n if (this.checks.length === 0)\n return rxjs_observable_of.of(null);\n var /** @type {?} */ checks$ = rxjs_observable_from.from(this.checks);\n var /** @type {?} */ runningChecks$ = rxjs_operator_concatMap.concatMap.call(checks$, function (s) {\n if (s instanceof CanActivate) {\n return _this.runResolve(s.route);\n }\n else {\n return rxjs_observable_of.of(null);\n }\n });\n return rxjs_operator_reduce.reduce.call(runningChecks$, function (_, __) { return _; });\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} outletMap\n * @param {?} futurePath\n * @return {?}\n */\n PreActivation.prototype.traverseChildRoutes = function (futureNode, currNode, outletMap, futurePath) {\n var _this = this;\n var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n futureNode.children.forEach(function (c) {\n _this.traverseRoutes(c, prevChildren[c.value.outlet], outletMap, futurePath.concat([c.value]));\n delete prevChildren[c.value.outlet];\n });\n forEach(prevChildren, function (v, k) { return _this.deactiveRouteAndItsChildren(v, outletMap._outlets[k]); });\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} parentOutletMap\n * @param {?} futurePath\n * @return {?}\n */\n PreActivation.prototype.traverseRoutes = function (futureNode, currNode, parentOutletMap, futurePath) {\n var /** @type {?} */ future = futureNode.value;\n var /** @type {?} */ curr = currNode ? currNode.value : null;\n var /** @type {?} */ outlet = parentOutletMap ? parentOutletMap._outlets[futureNode.value.outlet] : null;\n // reusing the node\n if (curr && future._routeConfig === curr._routeConfig) {\n if (!equalParamsAndUrlSegments(future, curr)) {\n this.checks.push(new CanDeactivate(outlet.component, curr), new CanActivate(futurePath));\n }\n else {\n // we need to set the data\n future.data = curr.data;\n future._resolvedData = curr._resolvedData;\n }\n // If we have a component, we need to go through an outlet.\n if (future.component) {\n this.traverseChildRoutes(futureNode, currNode, outlet ? outlet.outletMap : null, futurePath);\n }\n else {\n this.traverseChildRoutes(futureNode, currNode, parentOutletMap, futurePath);\n }\n }\n else {\n if (curr) {\n this.deactiveRouteAndItsChildren(currNode, outlet);\n }\n this.checks.push(new CanActivate(futurePath));\n // If we have a component, we need to go through an outlet.\n if (future.component) {\n this.traverseChildRoutes(futureNode, null, outlet ? outlet.outletMap : null, futurePath);\n }\n else {\n this.traverseChildRoutes(futureNode, null, parentOutletMap, futurePath);\n }\n }\n };\n /**\n * @param {?} route\n * @param {?} outlet\n * @return {?}\n */\n PreActivation.prototype.deactiveRouteAndItsChildren = function (route, outlet) {\n var _this = this;\n var /** @type {?} */ prevChildren = nodeChildrenAsMap(route);\n var /** @type {?} */ r = route.value;\n forEach(prevChildren, function (v, k) {\n if (!r.component) {\n _this.deactiveRouteAndItsChildren(v, outlet);\n }\n else if (!!outlet) {\n _this.deactiveRouteAndItsChildren(v, outlet.outletMap._outlets[k]);\n }\n else {\n _this.deactiveRouteAndItsChildren(v, null);\n }\n });\n if (!r.component) {\n this.checks.push(new CanDeactivate(null, r));\n }\n else if (outlet && outlet.isActivated) {\n this.checks.push(new CanDeactivate(outlet.component, r));\n }\n else {\n this.checks.push(new CanDeactivate(null, r));\n }\n };\n /**\n * @param {?} future\n * @return {?}\n */\n PreActivation.prototype.runCanActivate = function (future) {\n var _this = this;\n var /** @type {?} */ canActivate = future._routeConfig ? future._routeConfig.canActivate : null;\n if (!canActivate || canActivate.length === 0)\n return rxjs_observable_of.of(true);\n var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(canActivate), function (c) {\n var /** @type {?} */ guard = _this.getToken(c, future);\n var /** @type {?} */ observable;\n if (guard.canActivate) {\n observable = wrapIntoObservable(guard.canActivate(future, _this.future));\n }\n else {\n observable = wrapIntoObservable(guard(future, _this.future));\n }\n return rxjs_operator_first.first.call(observable);\n });\n return andObservables(obs);\n };\n /**\n * @param {?} path\n * @return {?}\n */\n PreActivation.prototype.runCanActivateChild = function (path) {\n var _this = this;\n var /** @type {?} */ future = path[path.length - 1];\n var /** @type {?} */ canActivateChildGuards = path.slice(0, path.length - 1)\n .reverse()\n .map(function (p) { return _this.extractCanActivateChild(p); })\n .filter(function (_) { return _ !== null; });\n return andObservables(rxjs_operator_map.map.call(rxjs_observable_from.from(canActivateChildGuards), function (d) {\n var /** @type {?} */ obs = rxjs_operator_map.map.call(rxjs_observable_from.from(d.guards), function (c) {\n var /** @type {?} */ guard = _this.getToken(c, c.node);\n var /** @type {?} */ observable;\n if (guard.canActivateChild) {\n observable = wrapIntoObservable(guard.canActivateChild(future, _this.future));\n }\n else {\n observable = wrapIntoObservable(guard(future, _this.future));\n }\n return rxjs_operator_first.first.call(observable);\n });\n return andObservables(obs);\n }));\n };\n /**\n * @param {?} p\n * @return {?}\n */\n PreActivation.prototype.extractCanActivateChild = function (p) {\n var /** @type {?} */ canActivateChild = p._routeConfig ? p._routeConfig.canActivateChild : null;\n if (!canActivateChild || canActivateChild.length === 0)\n return null;\n return { node: p, guards: canActivateChild };\n };\n /**\n * @param {?} component\n * @param {?} curr\n * @return {?}\n */\n PreActivation.prototype.runCanDeactivate = function (component, curr) {\n var _this = this;\n var /** @type {?} */ canDeactivate = curr && curr._routeConfig ? curr._routeConfig.canDeactivate : null;\n if (!canDeactivate || canDeactivate.length === 0)\n return rxjs_observable_of.of(true);\n var /** @type {?} */ canDeactivate$ = rxjs_operator_mergeMap.mergeMap.call(rxjs_observable_from.from(canDeactivate), function (c) {\n var /** @type {?} */ guard = _this.getToken(c, curr);\n var /** @type {?} */ observable;\n if (guard.canDeactivate) {\n observable = wrapIntoObservable(guard.canDeactivate(component, curr, _this.curr));\n }\n else {\n observable = wrapIntoObservable(guard(component, curr, _this.curr));\n }\n return rxjs_operator_first.first.call(observable);\n });\n return rxjs_operator_every.every.call(canDeactivate$, function (result) { return result === true; });\n };\n /**\n * @param {?} future\n * @return {?}\n */\n PreActivation.prototype.runResolve = function (future) {\n var /** @type {?} */ resolve = future._resolve;\n return rxjs_operator_map.map.call(this.resolveNode(resolve, future), function (resolvedData) {\n future._resolvedData = resolvedData;\n future.data = merge(future.data, inheritedParamsDataResolve(future).resolve);\n return null;\n });\n };\n /**\n * @param {?} resolve\n * @param {?} future\n * @return {?}\n */\n PreActivation.prototype.resolveNode = function (resolve, future) {\n var _this = this;\n return waitForMap(resolve, function (k, v) {\n var /** @type {?} */ resolver = _this.getToken(v, future);\n return resolver.resolve ? wrapIntoObservable(resolver.resolve(future, _this.future)) :\n wrapIntoObservable(resolver(future, _this.future));\n });\n };\n /**\n * @param {?} token\n * @param {?} snapshot\n * @return {?}\n */\n PreActivation.prototype.getToken = function (token, snapshot) {\n var /** @type {?} */ config = closestLoadedConfig(snapshot);\n var /** @type {?} */ injector = config ? config.injector : this.injector;\n return injector.get(token);\n };\n return PreActivation;\n }());\n var ActivateRoutes = (function () {\n /**\n * @param {?} routeReuseStrategy\n * @param {?} futureState\n * @param {?} currState\n */\n function ActivateRoutes(routeReuseStrategy, futureState, currState) {\n this.routeReuseStrategy = routeReuseStrategy;\n this.futureState = futureState;\n this.currState = currState;\n }\n /**\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.activate = function (parentOutletMap) {\n var /** @type {?} */ futureRoot = this.futureState._root;\n var /** @type {?} */ currRoot = this.currState ? this.currState._root : null;\n this.deactivateChildRoutes(futureRoot, currRoot, parentOutletMap);\n advanceActivatedRoute(this.futureState.root);\n this.activateChildRoutes(futureRoot, currRoot, parentOutletMap);\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} outletMap\n * @return {?}\n */\n ActivateRoutes.prototype.deactivateChildRoutes = function (futureNode, currNode, outletMap) {\n var _this = this;\n var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n futureNode.children.forEach(function (c) {\n _this.deactivateRoutes(c, prevChildren[c.value.outlet], outletMap);\n delete prevChildren[c.value.outlet];\n });\n forEach(prevChildren, function (v, k) { return _this.deactiveRouteAndItsChildren(v, outletMap); });\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} outletMap\n * @return {?}\n */\n ActivateRoutes.prototype.activateChildRoutes = function (futureNode, currNode, outletMap) {\n var _this = this;\n var /** @type {?} */ prevChildren = nodeChildrenAsMap(currNode);\n futureNode.children.forEach(function (c) { _this.activateRoutes(c, prevChildren[c.value.outlet], outletMap); });\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.deactivateRoutes = function (futureNode, currNode, parentOutletMap) {\n var /** @type {?} */ future = futureNode.value;\n var /** @type {?} */ curr = currNode ? currNode.value : null;\n // reusing the node\n if (future === curr) {\n // If we have a normal route, we need to go through an outlet.\n if (future.component) {\n var /** @type {?} */ outlet = getOutlet(parentOutletMap, future);\n this.deactivateChildRoutes(futureNode, currNode, outlet.outletMap);\n }\n else {\n this.deactivateChildRoutes(futureNode, currNode, parentOutletMap);\n }\n }\n else {\n if (curr) {\n this.deactiveRouteAndItsChildren(currNode, parentOutletMap);\n }\n }\n };\n /**\n * @param {?} futureNode\n * @param {?} currNode\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.activateRoutes = function (futureNode, currNode, parentOutletMap) {\n var /** @type {?} */ future = futureNode.value;\n var /** @type {?} */ curr = currNode ? currNode.value : null;\n // reusing the node\n if (future === curr) {\n // advance the route to push the parameters\n advanceActivatedRoute(future);\n // If we have a normal route, we need to go through an outlet.\n if (future.component) {\n var /** @type {?} */ outlet = getOutlet(parentOutletMap, future);\n this.activateChildRoutes(futureNode, currNode, outlet.outletMap);\n }\n else {\n this.activateChildRoutes(futureNode, currNode, parentOutletMap);\n }\n }\n else {\n // if we have a normal route, we need to advance the route\n // and place the component into the outlet. After that recurse.\n if (future.component) {\n advanceActivatedRoute(future);\n var /** @type {?} */ outlet = getOutlet(parentOutletMap, futureNode.value);\n if (this.routeReuseStrategy.shouldAttach(future.snapshot)) {\n var /** @type {?} */ stored = ((this.routeReuseStrategy.retrieve(future.snapshot)));\n this.routeReuseStrategy.store(future.snapshot, null);\n outlet.attach(stored.componentRef, stored.route.value);\n advanceActivatedRouteNodeAndItsChildren(stored.route);\n }\n else {\n var /** @type {?} */ outletMap = new RouterOutletMap();\n this.placeComponentIntoOutlet(outletMap, future, outlet);\n this.activateChildRoutes(futureNode, null, outletMap);\n }\n }\n else {\n advanceActivatedRoute(future);\n this.activateChildRoutes(futureNode, null, parentOutletMap);\n }\n }\n };\n /**\n * @param {?} outletMap\n * @param {?} future\n * @param {?} outlet\n * @return {?}\n */\n ActivateRoutes.prototype.placeComponentIntoOutlet = function (outletMap, future, outlet) {\n var /** @type {?} */ resolved = ([{ provide: ActivatedRoute, useValue: future }, {\n provide: RouterOutletMap,\n useValue: outletMap\n }]);\n var /** @type {?} */ config = parentLoadedConfig(future.snapshot);\n var /** @type {?} */ resolver = null;\n var /** @type {?} */ injector = null;\n if (config) {\n injector = config.injectorFactory(outlet.locationInjector);\n resolver = config.factoryResolver;\n resolved.push({ provide: _angular_core.ComponentFactoryResolver, useValue: resolver });\n }\n else {\n injector = outlet.locationInjector;\n resolver = outlet.locationFactoryResolver;\n }\n outlet.activate(future, resolver, injector, _angular_core.ReflectiveInjector.resolve(resolved), outletMap);\n };\n /**\n * @param {?} route\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.deactiveRouteAndItsChildren = function (route, parentOutletMap) {\n if (this.routeReuseStrategy.shouldDetach(route.value.snapshot)) {\n this.detachAndStoreRouteSubtree(route, parentOutletMap);\n }\n else {\n this.deactiveRouteAndOutlet(route, parentOutletMap);\n }\n };\n /**\n * @param {?} route\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.detachAndStoreRouteSubtree = function (route, parentOutletMap) {\n var /** @type {?} */ outlet = getOutlet(parentOutletMap, route.value);\n var /** @type {?} */ componentRef = outlet.detach();\n this.routeReuseStrategy.store(route.value.snapshot, { componentRef: componentRef, route: route });\n };\n /**\n * @param {?} route\n * @param {?} parentOutletMap\n * @return {?}\n */\n ActivateRoutes.prototype.deactiveRouteAndOutlet = function (route, parentOutletMap) {\n var _this = this;\n var /** @type {?} */ prevChildren = nodeChildrenAsMap(route);\n var /** @type {?} */ outlet = null;\n // getOutlet throws when cannot find the right outlet,\n // which can happen if an outlet was in an NgIf and was removed\n try {\n outlet = getOutlet(parentOutletMap, route.value);\n }\n catch (e) {\n return;\n }\n var /** @type {?} */ childOutletMap = outlet.outletMap;\n forEach(prevChildren, function (v, k) {\n if (route.value.component) {\n _this.deactiveRouteAndItsChildren(v, childOutletMap);\n }\n else {\n _this.deactiveRouteAndItsChildren(v, parentOutletMap);\n }\n });\n if (outlet && outlet.isActivated) {\n outlet.deactivate();\n }\n };\n return ActivateRoutes;\n }());\n /**\n * @param {?} node\n * @return {?}\n */\n function advanceActivatedRouteNodeAndItsChildren(node) {\n advanceActivatedRoute(node.value);\n node.children.forEach(advanceActivatedRouteNodeAndItsChildren);\n }\n /**\n * @param {?} snapshot\n * @return {?}\n */\n function parentLoadedConfig(snapshot) {\n var /** @type {?} */ s = snapshot.parent;\n while (s) {\n var /** @type {?} */ c = s._routeConfig;\n if (c && c._loadedConfig)\n return c._loadedConfig;\n if (c && c.component)\n return null;\n s = s.parent;\n }\n return null;\n }\n /**\n * @param {?} snapshot\n * @return {?}\n */\n function closestLoadedConfig(snapshot) {\n if (!snapshot)\n return null;\n var /** @type {?} */ s = snapshot.parent;\n while (s) {\n var /** @type {?} */ c = s._routeConfig;\n if (c && c._loadedConfig)\n return c._loadedConfig;\n s = s.parent;\n }\n return null;\n }\n /**\n * @param {?} node\n * @return {?}\n */\n function nodeChildrenAsMap(node) {\n return node ? node.children.reduce(function (m, c) {\n m[c.value.outlet] = c;\n return m;\n }, {}) : {};\n }\n /**\n * @param {?} outletMap\n * @param {?} route\n * @return {?}\n */\n function getOutlet(outletMap, route) {\n var /** @type {?} */ outlet = outletMap._outlets[route.outlet];\n if (!outlet) {\n var /** @type {?} */ componentName = ((route.component)).name;\n if (route.outlet === PRIMARY_OUTLET) {\n throw new Error(\"Cannot find primary outlet to load '\" + componentName + \"'\");\n }\n else {\n throw new Error(\"Cannot find the outlet \" + route.outlet + \" to load '\" + componentName + \"'\");\n }\n }\n return outlet;\n }\n\n /**\n * *\n * *\n * Consider the following route configuration:\n * `[{ path: 'user/:name', component: UserCmp }]`\n * *\n * When linking to this `user/:name` route, you can write:\n * `<a routerLink='/user/bob'>link to user component</a>`\n * *\n * *\n * The RouterLink directives let you link to specific parts of your app.\n * *\n * When the link is static, you can use the directive as follows:\n * `<a routerLink=\"/user/bob\">link to user component</a>`\n * *\n * If you use dynamic values to generate the link, you can pass an array of path\n * segments, followed by the params for each segment.\n * *\n * For instance `['/team', teamId, 'user', userName, {details: true}]`\n * means that we want to generate a link to `/team/11/user/bob;details=true`.\n * *\n * Multiple static segments can be merged into one\n * (e.g., `['/team/11/user', userName, {details: true}]`).\n * *\n * The first segment name can be prepended with `/`, `./`, or `../`:\n * * If the first segment begins with `/`, the router will look up the route from the root of the\n * app.\n * * If the first segment begins with `./`, or doesn't begin with a slash, the router will\n * instead look in the children of the current activated route.\n * * And if the first segment begins with `../`, the router will go up one level.\n * *\n * You can set query params and fragment as follows:\n * *\n * ```\n * <a [routerLink]=\"['/user/bob']\" [queryParams]=\"{debug: true}\" fragment=\"education\">\n * link to user component\n * </a>\n * ```\n * RouterLink will use these to generate this link: `/user/bob#education?debug=true`.\n * *\n * You can also tell the directive to preserve the current query params and fragment:\n * *\n * ```\n * <a [routerLink]=\"['/user/bob']\" preserveQueryParams preserveFragment>\n * link to user component\n * </a>\n * ```\n * *\n * The router link directive always treats the provided input as a delta to the current url.\n * *\n * For instance, if the current url is `/user/(box//aux:team)`.\n * *\n * Then the following link `<a [routerLink]=\"['/user/jim']\">Jim</a>` will generate the link\n * `/user/(jim//aux:team)`.\n * *\n * *\n * See {@link Router.createUrlTree} for more information.\n * *\n */\n var RouterLink = (function () {\n /**\n * @param {?} router\n * @param {?} route\n */\n function RouterLink(router, route) {\n this.router = router;\n this.route = route;\n this.commands = [];\n }\n Object.defineProperty(RouterLink.prototype, \"routerLink\", {\n /**\n * @param {?} data\n * @return {?}\n */\n set: function (data) {\n if (Array.isArray(data)) {\n this.commands = data;\n }\n else {\n this.commands = [data];\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n RouterLink.prototype.onClick = function () {\n var /** @type {?} */ extras = {\n skipLocationChange: attrBoolValue(this.skipLocationChange),\n replaceUrl: attrBoolValue(this.replaceUrl),\n };\n this.router.navigateByUrl(this.urlTree, extras);\n return true;\n };\n Object.defineProperty(RouterLink.prototype, \"urlTree\", {\n /**\n * @return {?}\n */\n get: function () {\n return this.router.createUrlTree(this.commands, {\n relativeTo: this.route,\n queryParams: this.queryParams,\n fragment: this.fragment,\n preserveQueryParams: attrBoolValue(this.preserveQueryParams),\n preserveFragment: attrBoolValue(this.preserveFragment),\n });\n },\n enumerable: true,\n configurable: true\n });\n RouterLink.decorators = [\n { type: _angular_core.Directive, args: [{ selector: ':not(a)[routerLink]' },] },\n ];\n /** @nocollapse */\n RouterLink.ctorParameters = function () { return [\n { type: Router, },\n { type: ActivatedRoute, },\n ]; };\n RouterLink.propDecorators = {\n 'queryParams': [{ type: _angular_core.Input },],\n 'fragment': [{ type: _angular_core.Input },],\n 'preserveQueryParams': [{ type: _angular_core.Input },],\n 'preserveFragment': [{ type: _angular_core.Input },],\n 'skipLocationChange': [{ type: _angular_core.Input },],\n 'replaceUrl': [{ type: _angular_core.Input },],\n 'routerLink': [{ type: _angular_core.Input },],\n 'onClick': [{ type: _angular_core.HostListener, args: ['click', [],] },],\n };\n return RouterLink;\n }());\n /**\n * *\n * See {@link RouterLink} for more information.\n * *\n * *\n */\n var RouterLinkWithHref = (function () {\n /**\n * @param {?} router\n * @param {?} route\n * @param {?} locationStrategy\n */\n function RouterLinkWithHref(router, route, locationStrategy) {\n var _this = this;\n this.router = router;\n this.route = route;\n this.locationStrategy = locationStrategy;\n this.commands = [];\n this.subscription = router.events.subscribe(function (s) {\n if (s instanceof NavigationEnd) {\n _this.updateTargetUrlAndHref();\n }\n });\n }\n Object.defineProperty(RouterLinkWithHref.prototype, \"routerLink\", {\n /**\n * @param {?} data\n * @return {?}\n */\n set: function (data) {\n if (Array.isArray(data)) {\n this.commands = data;\n }\n else {\n this.commands = [data];\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} changes\n * @return {?}\n */\n RouterLinkWithHref.prototype.ngOnChanges = function (changes) { this.updateTargetUrlAndHref(); };\n /**\n * @return {?}\n */\n RouterLinkWithHref.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n /**\n * @param {?} button\n * @param {?} ctrlKey\n * @param {?} metaKey\n * @return {?}\n */\n RouterLinkWithHref.prototype.onClick = function (button, ctrlKey, metaKey) {\n if (button !== 0 || ctrlKey || metaKey) {\n return true;\n }\n if (typeof this.target === 'string' && this.target != '_self') {\n return true;\n }\n var /** @type {?} */ extras = {\n skipLocationChange: attrBoolValue(this.skipLocationChange),\n replaceUrl: attrBoolValue(this.replaceUrl),\n };\n this.router.navigateByUrl(this.urlTree, extras);\n return false;\n };\n /**\n * @return {?}\n */\n RouterLinkWithHref.prototype.updateTargetUrlAndHref = function () {\n this.href = this.locationStrategy.prepareExternalUrl(this.router.serializeUrl(this.urlTree));\n };\n Object.defineProperty(RouterLinkWithHref.prototype, \"urlTree\", {\n /**\n * @return {?}\n */\n get: function () {\n return this.router.createUrlTree(this.commands, {\n relativeTo: this.route,\n queryParams: this.queryParams,\n fragment: this.fragment,\n preserveQueryParams: attrBoolValue(this.preserveQueryParams),\n preserveFragment: attrBoolValue(this.preserveFragment),\n });\n },\n enumerable: true,\n configurable: true\n });\n RouterLinkWithHref.decorators = [\n { type: _angular_core.Directive, args: [{ selector: 'a[routerLink]' },] },\n ];\n /** @nocollapse */\n RouterLinkWithHref.ctorParameters = function () { return [\n { type: Router, },\n { type: ActivatedRoute, },\n { type: _angular_common.LocationStrategy, },\n ]; };\n RouterLinkWithHref.propDecorators = {\n 'target': [{ type: _angular_core.Input },],\n 'queryParams': [{ type: _angular_core.Input },],\n 'fragment': [{ type: _angular_core.Input },],\n 'preserveQueryParams': [{ type: _angular_core.Input },],\n 'preserveFragment': [{ type: _angular_core.Input },],\n 'skipLocationChange': [{ type: _angular_core.Input },],\n 'replaceUrl': [{ type: _angular_core.Input },],\n 'href': [{ type: _angular_core.HostBinding },],\n 'routerLink': [{ type: _angular_core.Input },],\n 'onClick': [{ type: _angular_core.HostListener, args: ['click', ['$event.button', '$event.ctrlKey', '$event.metaKey'],] },],\n };\n return RouterLinkWithHref;\n }());\n /**\n * @param {?} s\n * @return {?}\n */\n function attrBoolValue(s) {\n return s === '' || !!s;\n }\n\n /**\n * *\n * *\n * ```\n * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\">Bob</a>\n * ```\n * *\n * *\n * The RouterLinkActive directive lets you add a CSS class to an element when the link's route\n * becomes active.\n * *\n * Consider the following example:\n * *\n * ```\n * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\">Bob</a>\n * ```\n * *\n * When the url is either '/user' or '/user/bob', the active-link class will\n * be added to the `a` tag. If the url changes, the class will be removed.\n * *\n * You can set more than one class, as follows:\n * *\n * ```\n * <a routerLink=\"/user/bob\" routerLinkActive=\"class1 class2\">Bob</a>\n * <a routerLink=\"/user/bob\" [routerLinkActive]=\"['class1', 'class2']\">Bob</a>\n * ```\n * *\n * You can configure RouterLinkActive by passing `exact: true`. This will add the classes\n * only when the url matches the link exactly.\n * *\n * ```\n * <a routerLink=\"/user/bob\" routerLinkActive=\"active-link\" [routerLinkActiveOptions]=\"{exact:\n * true}\">Bob</a>\n * ```\n * *\n * You can assign the RouterLinkActive instance to a template variable and directly check\n * the `isActive` status.\n * ```\n * <a routerLink=\"/user/bob\" routerLinkActive #rla=\"routerLinkActive\">\n * Bob {{ rla.isActive ? '(already open)' : ''}}\n * </a>\n * ```\n * *\n * Finally, you can apply the RouterLinkActive directive to an ancestor of a RouterLink.\n * *\n * ```\n * <div routerLinkActive=\"active-link\" [routerLinkActiveOptions]=\"{exact: true}\">\n * <a routerLink=\"/user/jim\">Jim</a>\n * <a routerLink=\"/user/bob\">Bob</a>\n * </div>\n * ```\n * *\n * This will set the active-link class on the div tag if the url is either '/user/jim' or\n * '/user/bob'.\n * *\n * *\n */\n var RouterLinkActive = (function () {\n /**\n * @param {?} router\n * @param {?} element\n * @param {?} renderer\n */\n function RouterLinkActive(router, element, renderer) {\n var _this = this;\n this.router = router;\n this.element = element;\n this.renderer = renderer;\n this.classes = [];\n this.routerLinkActiveOptions = { exact: false };\n this.subscription = router.events.subscribe(function (s) {\n if (s instanceof NavigationEnd) {\n _this.update();\n }\n });\n }\n Object.defineProperty(RouterLinkActive.prototype, \"isActive\", {\n /**\n * @return {?}\n */\n get: function () { return this.hasActiveLink(); },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n RouterLinkActive.prototype.ngAfterContentInit = function () {\n var _this = this;\n this.links.changes.subscribe(function (s) { return _this.update(); });\n this.linksWithHrefs.changes.subscribe(function (s) { return _this.update(); });\n this.update();\n };\n Object.defineProperty(RouterLinkActive.prototype, \"routerLinkActive\", {\n /**\n * @param {?} data\n * @return {?}\n */\n set: function (data) {\n if (Array.isArray(data)) {\n this.classes = (data);\n }\n else {\n this.classes = data.split(' ');\n }\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @param {?} changes\n * @return {?}\n */\n RouterLinkActive.prototype.ngOnChanges = function (changes) { this.update(); };\n /**\n * @return {?}\n */\n RouterLinkActive.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n /**\n * @return {?}\n */\n RouterLinkActive.prototype.update = function () {\n var _this = this;\n if (!this.links || !this.linksWithHrefs || !this.router.navigated)\n return;\n var /** @type {?} */ isActive = this.hasActiveLink();\n this.classes.forEach(function (c) {\n if (c) {\n _this.renderer.setElementClass(_this.element.nativeElement, c, isActive);\n }\n });\n };\n /**\n * @param {?} router\n * @return {?}\n */\n RouterLinkActive.prototype.isLinkActive = function (router) {\n var _this = this;\n return function (link) {\n return router.isActive(link.urlTree, _this.routerLinkActiveOptions.exact);\n };\n };\n /**\n * @return {?}\n */\n RouterLinkActive.prototype.hasActiveLink = function () {\n return this.links.some(this.isLinkActive(this.router)) ||\n this.linksWithHrefs.some(this.isLinkActive(this.router));\n };\n RouterLinkActive.decorators = [\n { type: _angular_core.Directive, args: [{\n selector: '[routerLinkActive]',\n exportAs: 'routerLinkActive',\n },] },\n ];\n /** @nocollapse */\n RouterLinkActive.ctorParameters = function () { return [\n { type: Router, },\n { type: _angular_core.ElementRef, },\n { type: _angular_core.Renderer, },\n ]; };\n RouterLinkActive.propDecorators = {\n 'links': [{ type: _angular_core.ContentChildren, args: [RouterLink, { descendants: true },] },],\n 'linksWithHrefs': [{ type: _angular_core.ContentChildren, args: [RouterLinkWithHref, { descendants: true },] },],\n 'routerLinkActiveOptions': [{ type: _angular_core.Input },],\n 'routerLinkActive': [{ type: _angular_core.Input },],\n };\n return RouterLinkActive;\n }());\n\n /**\n * state.\n * *\n * *\n * ```\n * <router-outlet></router-outlet>\n * <router-outlet name='left'></router-outlet>\n * <router-outlet name='right'></router-outlet>\n * ```\n * *\n * A router outlet will emit an activate event any time a new component is being instantiated,\n * and a deactivate event when it is being destroyed.\n * *\n * ```\n * <router-outlet\n * (activate)='onActivate($event)'\n * (deactivate)='onDeactivate($event)'></router-outlet>\n * ```\n * *\n */\n var RouterOutlet = (function () {\n /**\n * @param {?} parentOutletMap\n * @param {?} location\n * @param {?} resolver\n * @param {?} name\n */\n function RouterOutlet(parentOutletMap, location, resolver, name) {\n this.parentOutletMap = parentOutletMap;\n this.location = location;\n this.resolver = resolver;\n this.name = name;\n this.activateEvents = new _angular_core.EventEmitter();\n this.deactivateEvents = new _angular_core.EventEmitter();\n parentOutletMap.registerOutlet(name ? name : PRIMARY_OUTLET, this);\n }\n /**\n * @return {?}\n */\n RouterOutlet.prototype.ngOnDestroy = function () { this.parentOutletMap.removeOutlet(this.name ? this.name : PRIMARY_OUTLET); };\n Object.defineProperty(RouterOutlet.prototype, \"locationInjector\", {\n /**\n * @return {?}\n */\n get: function () { return this.location.injector; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RouterOutlet.prototype, \"locationFactoryResolver\", {\n /**\n * @return {?}\n */\n get: function () { return this.resolver; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RouterOutlet.prototype, \"isActivated\", {\n /**\n * @return {?}\n */\n get: function () { return !!this.activated; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RouterOutlet.prototype, \"component\", {\n /**\n * @return {?}\n */\n get: function () {\n if (!this.activated)\n throw new Error('Outlet is not activated');\n return this.activated.instance;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(RouterOutlet.prototype, \"activatedRoute\", {\n /**\n * @return {?}\n */\n get: function () {\n if (!this.activated)\n throw new Error('Outlet is not activated');\n return this._activatedRoute;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * @return {?}\n */\n RouterOutlet.prototype.detach = function () {\n if (!this.activated)\n throw new Error('Outlet is not activated');\n this.location.detach();\n var /** @type {?} */ r = this.activated;\n this.activated = null;\n this._activatedRoute = null;\n return r;\n };\n /**\n * @param {?} ref\n * @param {?} activatedRoute\n * @return {?}\n */\n RouterOutlet.prototype.attach = function (ref, activatedRoute) {\n this.activated = ref;\n this._activatedRoute = activatedRoute;\n this.location.insert(ref.hostView);\n };\n /**\n * @return {?}\n */\n RouterOutlet.prototype.deactivate = function () {\n if (this.activated) {\n var /** @type {?} */ c = this.component;\n this.activated.destroy();\n this.activated = null;\n this._activatedRoute = null;\n this.deactivateEvents.emit(c);\n }\n };\n /**\n * @param {?} activatedRoute\n * @param {?} resolver\n * @param {?} injector\n * @param {?} providers\n * @param {?} outletMap\n * @return {?}\n */\n RouterOutlet.prototype.activate = function (activatedRoute, resolver, injector, providers, outletMap) {\n if (this.isActivated) {\n throw new Error('Cannot activate an already activated outlet');\n }\n this.outletMap = outletMap;\n this._activatedRoute = activatedRoute;\n var /** @type {?} */ snapshot = activatedRoute._futureSnapshot;\n var /** @type {?} */ component = (snapshot._routeConfig.component);\n var /** @type {?} */ factory = resolver.resolveComponentFactory(component);\n var /** @type {?} */ inj = _angular_core.ReflectiveInjector.fromResolvedProviders(providers, injector);\n this.activated = this.location.createComponent(factory, this.location.length, inj, []);\n this.activated.changeDetectorRef.detectChanges();\n this.activateEvents.emit(this.activated.instance);\n };\n RouterOutlet.decorators = [\n { type: _angular_core.Directive, args: [{ selector: 'router-outlet' },] },\n ];\n /** @nocollapse */\n RouterOutlet.ctorParameters = function () { return [\n { type: RouterOutletMap, },\n { type: _angular_core.ViewContainerRef, },\n { type: _angular_core.ComponentFactoryResolver, },\n { type: undefined, decorators: [{ type: _angular_core.Attribute, args: ['name',] },] },\n ]; };\n RouterOutlet.propDecorators = {\n 'activateEvents': [{ type: _angular_core.Output, args: ['activate',] },],\n 'deactivateEvents': [{ type: _angular_core.Output, args: ['deactivate',] },],\n };\n return RouterOutlet;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * *\n * @abstract\n */\n var RouteReuseStrategy = (function () {\n function RouteReuseStrategy() {\n }\n /**\n * Determines if this route (and its subtree) should be detached to be reused later\n * @abstract\n * @param {?} route\n * @return {?}\n */\n RouteReuseStrategy.prototype.shouldDetach = function (route) { };\n /**\n * Stores the detached route\n * @abstract\n * @param {?} route\n * @param {?} handle\n * @return {?}\n */\n RouteReuseStrategy.prototype.store = function (route, handle) { };\n /**\n * Determines if this route (and its subtree) should be reattached\n * @abstract\n * @param {?} route\n * @return {?}\n */\n RouteReuseStrategy.prototype.shouldAttach = function (route) { };\n /**\n * Retrieves the previously stored route\n * @abstract\n * @param {?} route\n * @return {?}\n */\n RouteReuseStrategy.prototype.retrieve = function (route) { };\n /**\n * Determines if a route should be reused\n * @abstract\n * @param {?} future\n * @param {?} curr\n * @return {?}\n */\n RouteReuseStrategy.prototype.shouldReuseRoute = function (future, curr) { };\n return RouteReuseStrategy;\n }());\n\n var /** @type {?} */ getDOM = _angular_platformBrowser.__platform_browser_private__.getDOM;\n\n /**\n * *\n * @abstract\n */\n var PreloadingStrategy = (function () {\n function PreloadingStrategy() {\n }\n /**\n * @abstract\n * @param {?} route\n * @param {?} fn\n * @return {?}\n */\n PreloadingStrategy.prototype.preload = function (route, fn) { };\n return PreloadingStrategy;\n }());\n /**\n * *\n * *\n * ```\n * RouteModule.forRoot(ROUTES, {preloadingStrategy: PreloadAllModules})\n * ```\n * *\n */\n var PreloadAllModules = (function () {\n function PreloadAllModules() {\n }\n /**\n * @param {?} route\n * @param {?} fn\n * @return {?}\n */\n PreloadAllModules.prototype.preload = function (route, fn) {\n return rxjs_operator_catch._catch.call(fn(), function () { return rxjs_observable_of.of(null); });\n };\n return PreloadAllModules;\n }());\n /**\n * *\n * *\n * This strategy is enabled by default.\n * *\n */\n var NoPreloading = (function () {\n function NoPreloading() {\n }\n /**\n * @param {?} route\n * @param {?} fn\n * @return {?}\n */\n NoPreloading.prototype.preload = function (route, fn) { return rxjs_observable_of.of(null); };\n return NoPreloading;\n }());\n /**\n * The preloader optimistically loads all router configurations to\n * make navigations into lazily-loaded sections of the application faster.\n * *\n * The preloader runs in the background. When the router bootstraps, the preloader\n * starts listening to all navigation events. After every such event, the preloader\n * will check if any configurations can be loaded lazily.\n * *\n * If a route is protected by `canLoad` guards, the preloaded will not load it.\n * *\n */\n var RouterPreloader = (function () {\n /**\n * @param {?} router\n * @param {?} moduleLoader\n * @param {?} compiler\n * @param {?} injector\n * @param {?} preloadingStrategy\n */\n function RouterPreloader(router, moduleLoader, compiler, injector, preloadingStrategy) {\n this.router = router;\n this.injector = injector;\n this.preloadingStrategy = preloadingStrategy;\n this.loader = new RouterConfigLoader(moduleLoader, compiler);\n }\n ;\n /**\n * @return {?}\n */\n RouterPreloader.prototype.setUpPreloading = function () {\n var _this = this;\n var /** @type {?} */ navigations = rxjs_operator_filter.filter.call(this.router.events, function (e) { return e instanceof NavigationEnd; });\n this.subscription = rxjs_operator_concatMap.concatMap.call(navigations, function () { return _this.preload(); }).subscribe(function (v) { });\n };\n /**\n * @return {?}\n */\n RouterPreloader.prototype.preload = function () { return this.processRoutes(this.injector, this.router.config); };\n /**\n * @return {?}\n */\n RouterPreloader.prototype.ngOnDestroy = function () { this.subscription.unsubscribe(); };\n /**\n * @param {?} injector\n * @param {?} routes\n * @return {?}\n */\n RouterPreloader.prototype.processRoutes = function (injector, routes) {\n var /** @type {?} */ res = [];\n for (var _i = 0, routes_1 = routes; _i < routes_1.length; _i++) {\n var c = routes_1[_i];\n // we already have the config loaded, just recurce\n if (c.loadChildren && !c.canLoad && ((c))._loadedConfig) {\n var /** @type {?} */ childConfig = ((c))._loadedConfig;\n res.push(this.processRoutes(childConfig.injector, childConfig.routes));\n }\n else if (c.loadChildren && !c.canLoad) {\n res.push(this.preloadConfig(injector, c));\n }\n else if (c.children) {\n res.push(this.processRoutes(injector, c.children));\n }\n }\n return rxjs_operator_mergeAll.mergeAll.call(rxjs_observable_from.from(res));\n };\n /**\n * @param {?} injector\n * @param {?} route\n * @return {?}\n */\n RouterPreloader.prototype.preloadConfig = function (injector, route) {\n var _this = this;\n return this.preloadingStrategy.preload(route, function () {\n var /** @type {?} */ loaded = _this.loader.load(injector, route.loadChildren);\n return rxjs_operator_mergeMap.mergeMap.call(loaded, function (config) {\n var /** @type {?} */ c = route;\n c._loadedConfig = config;\n return _this.processRoutes(config.injector, config.routes);\n });\n });\n };\n RouterPreloader.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n RouterPreloader.ctorParameters = function () { return [\n { type: Router, },\n { type: _angular_core.NgModuleFactoryLoader, },\n { type: _angular_core.Compiler, },\n { type: _angular_core.Injector, },\n { type: PreloadingStrategy, },\n ]; };\n return RouterPreloader;\n }());\n\n /**\n * @whatItDoes Contains a list of directives\n * @stable\n */\n var /** @type {?} */ ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkWithHref, RouterLinkActive];\n /**\n * @whatItDoes Is used in DI to configure the router.\n * @stable\n */\n var /** @type {?} */ ROUTER_CONFIGURATION = new _angular_core.OpaqueToken('ROUTER_CONFIGURATION');\n /**\n * @docsNotRequired\n */\n var /** @type {?} */ ROUTER_FORROOT_GUARD = new _angular_core.OpaqueToken('ROUTER_FORROOT_GUARD');\n var /** @type {?} */ ROUTER_PROVIDERS = [\n _angular_common.Location,\n { provide: UrlSerializer, useClass: DefaultUrlSerializer },\n {\n provide: Router,\n useFactory: setupRouter,\n deps: [\n _angular_core.ApplicationRef, UrlSerializer, RouterOutletMap, _angular_common.Location, _angular_core.Injector, _angular_core.NgModuleFactoryLoader,\n _angular_core.Compiler, ROUTES, ROUTER_CONFIGURATION, [UrlHandlingStrategy, new _angular_core.Optional()],\n [RouteReuseStrategy, new _angular_core.Optional()]\n ]\n },\n RouterOutletMap,\n { provide: ActivatedRoute, useFactory: rootRoute, deps: [Router] },\n { provide: _angular_core.NgModuleFactoryLoader, useClass: _angular_core.SystemJsNgModuleLoader },\n RouterPreloader,\n NoPreloading,\n PreloadAllModules,\n { provide: ROUTER_CONFIGURATION, useValue: { enableTracing: false } },\n ];\n /**\n * @return {?}\n */\n function routerNgProbeToken() {\n return new _angular_core.NgProbeToken('Router', Router);\n }\n /**\n * *\n * *\n * RouterModule can be imported multiple times: once per lazily-loaded bundle.\n * Since the router deals with a global shared resource--location, we cannot have\n * more than one router service active.\n * *\n * That is why there are two ways to create the module: `RouterModule.forRoot` and\n * `RouterModule.forChild`.\n * *\n * * `forRoot` creates a module that contains all the directives, the given routes, and the router\n * service itself.\n * * `forChild` creates a module that contains all the directives and the given routes, but does not\n * include the router service.\n * *\n * When registered at the root, the module should be used as follows\n * *\n * ```\n * imports: [RouterModule.forRoot(ROUTES)]\n * })\n * class MyNgModule {}\n * ```\n * *\n * For submodules and lazy loaded submodules the module should be used as follows:\n * *\n * ```\n * imports: [RouterModule.forChild(ROUTES)]\n * })\n * class MyNgModule {}\n * ```\n * *\n * *\n * Managing state transitions is one of the hardest parts of building applications. This is\n * especially true on the web, where you also need to ensure that the state is reflected in the URL.\n * In addition, we often want to split applications into multiple bundles and load them on demand.\n * Doing this transparently is not trivial.\n * *\n * The Angular 2 router solves these problems. Using the router, you can declaratively specify\n * application states, manage state transitions while taking care of the URL, and load bundles on\n * demand.\n * *\n * [Read this developer guide](https://angular.io/docs/ts/latest/guide/router.html) to get an\n * overview of how the router should be used.\n * *\n */\n var RouterModule = (function () {\n /**\n * @param {?} guard\n */\n function RouterModule(guard) {\n }\n /**\n * Creates a module with all the router providers and directives. It also optionally sets up an\n * application listener to perform an initial navigation.\n * *\n * Options:\n * * `enableTracing` makes the router log all its internal events to the console.\n * * `useHash` enables the location strategy that uses the URL fragment instead of the history\n * API.\n * * `initialNavigation` disables the initial navigation.\n * * `errorHandler` provides a custom error handler.\n * @param {?} routes\n * @param {?=} config\n * @return {?}\n */\n RouterModule.forRoot = function (routes, config) {\n return {\n ngModule: RouterModule,\n providers: [\n ROUTER_PROVIDERS,\n provideRoutes(routes),\n {\n provide: ROUTER_FORROOT_GUARD,\n useFactory: provideForRootGuard,\n deps: [[Router, new _angular_core.Optional(), new _angular_core.SkipSelf()]]\n },\n { provide: ROUTER_CONFIGURATION, useValue: config ? config : {} },\n {\n provide: _angular_common.LocationStrategy,\n useFactory: provideLocationStrategy,\n deps: [\n _angular_common.PlatformLocation, [new _angular_core.Inject(_angular_common.APP_BASE_HREF), new _angular_core.Optional()], ROUTER_CONFIGURATION\n ]\n },\n {\n provide: PreloadingStrategy,\n useExisting: config && config.preloadingStrategy ? config.preloadingStrategy :\n NoPreloading\n },\n { provide: _angular_core.NgProbeToken, multi: true, useFactory: routerNgProbeToken },\n provideRouterInitializer(),\n ],\n };\n };\n /**\n * Creates a module with all the router directives and a provider registering routes.\n * @param {?} routes\n * @return {?}\n */\n RouterModule.forChild = function (routes) {\n return { ngModule: RouterModule, providers: [provideRoutes(routes)] };\n };\n RouterModule.decorators = [\n { type: _angular_core.NgModule, args: [{ declarations: ROUTER_DIRECTIVES, exports: ROUTER_DIRECTIVES },] },\n ];\n /** @nocollapse */\n RouterModule.ctorParameters = function () { return [\n { type: undefined, decorators: [{ type: _angular_core.Optional }, { type: _angular_core.Inject, args: [ROUTER_FORROOT_GUARD,] },] },\n ]; };\n return RouterModule;\n }());\n /**\n * @param {?} platformLocationStrategy\n * @param {?} baseHref\n * @param {?=} options\n * @return {?}\n */\n function provideLocationStrategy(platformLocationStrategy, baseHref, options) {\n if (options === void 0) { options = {}; }\n return options.useHash ? new _angular_common.HashLocationStrategy(platformLocationStrategy, baseHref) :\n new _angular_common.PathLocationStrategy(platformLocationStrategy, baseHref);\n }\n /**\n * @param {?} router\n * @return {?}\n */\n function provideForRootGuard(router) {\n if (router) {\n throw new Error(\"RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.\");\n }\n return 'guarded';\n }\n /**\n * *\n * *\n * ```\n * imports: [RouterModule.forChild(ROUTES)],\n * providers: [provideRoutes(EXTRA_ROUTES)]\n * })\n * class MyNgModule {}\n * ```\n * *\n * @param {?} routes\n * @return {?}\n */\n function provideRoutes(routes) {\n return [\n { provide: _angular_core.ANALYZE_FOR_ENTRY_COMPONENTS, multi: true, useValue: routes },\n { provide: ROUTES, multi: true, useValue: routes },\n ];\n }\n /**\n * @param {?} ref\n * @param {?} urlSerializer\n * @param {?} outletMap\n * @param {?} location\n * @param {?} injector\n * @param {?} loader\n * @param {?} compiler\n * @param {?} config\n * @param {?=} opts\n * @param {?=} urlHandlingStrategy\n * @param {?=} routeReuseStrategy\n * @return {?}\n */\n function setupRouter(ref, urlSerializer, outletMap, location, injector, loader, compiler, config, opts, urlHandlingStrategy, routeReuseStrategy) {\n if (opts === void 0) { opts = {}; }\n var /** @type {?} */ router = new Router(null, urlSerializer, outletMap, location, injector, loader, compiler, flatten(config));\n if (urlHandlingStrategy) {\n router.urlHandlingStrategy = urlHandlingStrategy;\n }\n if (routeReuseStrategy) {\n router.routeReuseStrategy = routeReuseStrategy;\n }\n if (opts.errorHandler) {\n router.errorHandler = opts.errorHandler;\n }\n if (opts.enableTracing) {\n var /** @type {?} */ dom_1 = getDOM();\n router.events.subscribe(function (e) {\n dom_1.logGroup(\"Router Event: \" + ((e.constructor)).name);\n dom_1.log(e.toString());\n dom_1.log(e);\n dom_1.logGroupEnd();\n });\n }\n return router;\n }\n /**\n * @param {?} router\n * @return {?}\n */\n function rootRoute(router) {\n return router.routerState.root;\n }\n /**\n * @param {?} router\n * @param {?} ref\n * @param {?} preloader\n * @param {?} opts\n * @return {?}\n */\n function initialRouterNavigation(router, ref, preloader, opts) {\n return function (bootstrappedComponentRef) {\n if (bootstrappedComponentRef !== ref.components[0]) {\n return;\n }\n router.resetRootComponentType(ref.componentTypes[0]);\n preloader.setUpPreloading();\n if (opts.initialNavigation === false) {\n router.setUpLocationChangeListener();\n }\n else {\n router.initialNavigation();\n }\n };\n }\n /**\n * A token for the router initializer that will be called after the app is bootstrapped.\n *\n * @experimental\n */\n var /** @type {?} */ ROUTER_INITIALIZER = new _angular_core.OpaqueToken('Router Initializer');\n /**\n * @return {?}\n */\n function provideRouterInitializer() {\n return [\n {\n provide: ROUTER_INITIALIZER,\n useFactory: initialRouterNavigation,\n deps: [Router, _angular_core.ApplicationRef, RouterPreloader, ROUTER_CONFIGURATION]\n },\n { provide: _angular_core.APP_BOOTSTRAP_LISTENER, multi: true, useExisting: ROUTER_INITIALIZER },\n ];\n }\n\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new _angular_core.Version('3.4.1');\n\n var /** @type {?} */ __router_private__ = {\n ROUTER_PROVIDERS: ROUTER_PROVIDERS,\n ROUTES: ROUTES,\n flatten: flatten,\n };\n\n exports.RouterLink = RouterLink;\n exports.RouterLinkWithHref = RouterLinkWithHref;\n exports.RouterLinkActive = RouterLinkActive;\n exports.RouterOutlet = RouterOutlet;\n exports.RouteReuseStrategy = RouteReuseStrategy;\n exports.NavigationCancel = NavigationCancel;\n exports.NavigationEnd = NavigationEnd;\n exports.NavigationError = NavigationError;\n exports.NavigationStart = NavigationStart;\n exports.Router = Router;\n exports.RoutesRecognized = RoutesRecognized;\n exports.ROUTER_CONFIGURATION = ROUTER_CONFIGURATION;\n exports.ROUTER_INITIALIZER = ROUTER_INITIALIZER;\n exports.RouterModule = RouterModule;\n exports.provideRoutes = provideRoutes;\n exports.RouterOutletMap = RouterOutletMap;\n exports.NoPreloading = NoPreloading;\n exports.PreloadAllModules = PreloadAllModules;\n exports.PreloadingStrategy = PreloadingStrategy;\n exports.RouterPreloader = RouterPreloader;\n exports.ActivatedRoute = ActivatedRoute;\n exports.ActivatedRouteSnapshot = ActivatedRouteSnapshot;\n exports.RouterState = RouterState;\n exports.RouterStateSnapshot = RouterStateSnapshot;\n exports.PRIMARY_OUTLET = PRIMARY_OUTLET;\n exports.UrlHandlingStrategy = UrlHandlingStrategy;\n exports.DefaultUrlSerializer = DefaultUrlSerializer;\n exports.UrlSegment = UrlSegment;\n exports.UrlSegmentGroup = UrlSegmentGroup;\n exports.UrlSerializer = UrlSerializer;\n exports.UrlTree = UrlTree;\n exports.VERSION = VERSION;\n exports.__router_private__ = __router_private__;\n\n}));//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L0Bhbmd1bGFyL3JvdXRlci9idW5kbGVzL3JvdXRlci51bWQuanM/Y2EzYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjMuNC4xXG4gKiAoYykgMjAxMC0yMDE2IEdvb2dsZSwgSW5jLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqLyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnQGFuZ3VsYXIvY29tbW9uJyksIHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKSwgcmVxdWlyZSgncnhqcy9CZWhhdmlvclN1YmplY3QnKSwgcmVxdWlyZSgncnhqcy9TdWJqZWN0JyksIHJlcXVpcmUoJ3J4anMvb2JzZXJ2YWJsZS9mcm9tJyksIHJlcXVpcmUoJ3J4anMvb2JzZXJ2YWJsZS9vZicpLCByZXF1aXJlKCdyeGpzL29wZXJhdG9yL2NvbmNhdE1hcCcpLCByZXF1aXJlKCdyeGpzL29wZXJhdG9yL2V2ZXJ5JyksIHJlcXVpcmUoJ3J4anMvb3BlcmF0b3IvZmlyc3QnKSwgcmVxdWlyZSgncnhqcy9vcGVyYXRvci9tYXAnKSwgcmVxdWlyZSgncnhqcy9vcGVyYXRvci9tZXJnZU1hcCcpLCByZXF1aXJlKCdyeGpzL29wZXJhdG9yL3JlZHVjZScpLCByZXF1aXJlKCdyeGpzL09ic2VydmFibGUnKSwgcmVxdWlyZSgncnhqcy9vcGVyYXRvci9jYXRjaCcpLCByZXF1aXJlKCdyeGpzL29wZXJhdG9yL2NvbmNhdEFsbCcpLCByZXF1aXJlKCdyeGpzL3V0aWwvRW1wdHlFcnJvcicpLCByZXF1aXJlKCdyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2UnKSwgcmVxdWlyZSgncnhqcy9vcGVyYXRvci9sYXN0JyksIHJlcXVpcmUoJ3J4anMvb3BlcmF0b3IvbWVyZ2VBbGwnKSwgcmVxdWlyZSgnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcicpLCByZXF1aXJlKCdyeGpzL29wZXJhdG9yL2ZpbHRlcicpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnQGFuZ3VsYXIvY29tbW9uJywgJ0Bhbmd1bGFyL2NvcmUnLCAncnhqcy9CZWhhdmlvclN1YmplY3QnLCAncnhqcy9TdWJqZWN0JywgJ3J4anMvb2JzZXJ2YWJsZS9mcm9tJywgJ3J4anMvb2JzZXJ2YWJsZS9vZicsICdyeGpzL29wZXJhdG9yL2NvbmNhdE1hcCcsICdyeGpzL29wZXJhdG9yL2V2ZXJ5JywgJ3J4anMvb3BlcmF0b3IvZmlyc3QnLCAncnhqcy9vcGVyYXRvci9tYXAnLCAncnhqcy9vcGVyYXRvci9tZXJnZU1hcCcsICdyeGpzL29wZXJhdG9yL3JlZHVjZScsICdyeGpzL09ic2VydmFibGUnLCAncnhqcy9vcGVyYXRvci9jYXRjaCcsICdyeGpzL29wZXJhdG9yL2NvbmNhdEFsbCcsICdyeGpzL3V0aWwvRW1wdHlFcnJvcicsICdyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2UnLCAncnhqcy9vcGVyYXRvci9sYXN0JywgJ3J4anMvb3BlcmF0b3IvbWVyZ2VBbGwnLCAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcicsICdyeGpzL29wZXJhdG9yL2ZpbHRlciddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwubmcgPSBnbG9iYWwubmcgfHwge30sIGdsb2JhbC5uZy5yb3V0ZXIgPSBnbG9iYWwubmcucm91dGVyIHx8IHt9KSxnbG9iYWwubmcuY29tbW9uLGdsb2JhbC5uZy5jb3JlLGdsb2JhbC5SeCxnbG9iYWwuUngsZ2xvYmFsLlJ4Lk9ic2VydmFibGUsZ2xvYmFsLlJ4Lk9ic2VydmFibGUsZ2xvYmFsLlJ4Lk9ic2VydmFibGUucHJvdG90eXBlLGdsb2JhbC5SeC5PYnNlcnZhYmxlLnByb3RvdHlwZSxnbG9iYWwuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUsZ2xvYmFsLlJ4Lk9ic2VydmFibGUucHJvdG90eXBlLGdsb2JhbC5SeC5PYnNlcnZhYmxlLnByb3RvdHlwZSxnbG9iYWwuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUsZ2xvYmFsLlJ4LGdsb2JhbC5SeC5PYnNlcnZhYmxlLnByb3RvdHlwZSxnbG9iYWwuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUsZ2xvYmFsLlJ4LGdsb2JhbC5SeC5PYnNlcnZhYmxlLGdsb2JhbC5SeC5PYnNlcnZhYmxlLnByb3RvdHlwZSxnbG9iYWwuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUsZ2xvYmFsLm5nLnBsYXRmb3JtQnJvd3NlcixnbG9iYWwuUnguT2JzZXJ2YWJsZS5wcm90b3R5cGUpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsX2FuZ3VsYXJfY29tbW9uLF9hbmd1bGFyX2NvcmUscnhqc19CZWhhdmlvclN1YmplY3Qscnhqc19TdWJqZWN0LHJ4anNfb2JzZXJ2YWJsZV9mcm9tLHJ4anNfb2JzZXJ2YWJsZV9vZixyeGpzX29wZXJhdG9yX2NvbmNhdE1hcCxyeGpzX29wZXJhdG9yX2V2ZXJ5LHJ4anNfb3BlcmF0b3JfZmlyc3Qscnhqc19vcGVyYXRvcl9tYXAscnhqc19vcGVyYXRvcl9tZXJnZU1hcCxyeGpzX29wZXJhdG9yX3JlZHVjZSxyeGpzX09ic2VydmFibGUscnhqc19vcGVyYXRvcl9jYXRjaCxyeGpzX29wZXJhdG9yX2NvbmNhdEFsbCxyeGpzX3V0aWxfRW1wdHlFcnJvcixyeGpzX29ic2VydmFibGVfZnJvbVByb21pc2UsbCxyeGpzX29wZXJhdG9yX21lcmdlQWxsLF9hbmd1bGFyX3BsYXRmb3JtQnJvd3NlcixyeGpzX29wZXJhdG9yX2ZpbHRlcikgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogQHdoYXRJdERvZXMgTmFtZSBvZiB0aGUgcHJpbWFyeSBvdXRsZXQuXG4gICAqXG4gICAqIEBzdGFibGVcbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIFBSSU1BUllfT1VUTEVUID0gJ3ByaW1hcnknO1xuICB2YXIgTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyhOYXZpZ2F0aW9uQ2FuY2VsaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBOYXZpZ2F0aW9uQ2FuY2VsaW5nRXJyb3IobWVzc2FnZSkge1xuICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IobWVzc2FnZSkpLnN0YWNrO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOYXZpZ2F0aW9uQ2FuY2VsaW5nRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9O1xuICAgICAgcmV0dXJuIE5hdmlnYXRpb25DYW5jZWxpbmdFcnJvcjtcbiAgfShFcnJvcikpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VXJsTWF0Y2hlcihzZWdtZW50cywgc2VnbWVudEdyb3VwLCByb3V0ZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGF0aCA9IHJvdXRlLnBhdGg7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBvc1BhcmFtcyA9IHt9O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uc3VtZWQgPSBbXTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnRJbmRleCA9IDA7XG4gICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID49IHNlZ21lbnRzLmxlbmd0aClcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VycmVudCA9IHNlZ21lbnRzW2N1cnJlbnRJbmRleF07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IHBhcnRzW2ldO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGlzUG9zUGFyYW0gPSBwLnN0YXJ0c1dpdGgoJzonKTtcbiAgICAgICAgICBpZiAoIWlzUG9zUGFyYW0gJiYgcCAhPT0gY3VycmVudC5wYXRoKVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBpZiAoaXNQb3NQYXJhbSkge1xuICAgICAgICAgICAgICBwb3NQYXJhbXNbcC5zdWJzdHJpbmcoMSldID0gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3VtZWQucHVzaChjdXJyZW50KTtcbiAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5wYXRoTWF0Y2ggPT09ICdmdWxsJyAmJlxuICAgICAgICAgIChzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSB8fCBjdXJyZW50SW5kZXggPCBzZWdtZW50cy5sZW5ndGgpKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBjb25zdW1lZDogY29uc3VtZWQsIHBvc1BhcmFtczogcG9zUGFyYW1zIH07XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2hhbGxvd0VxdWFsQXJyYXlzKGEsIGIpIHtcbiAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoIXNoYWxsb3dFcXVhbChhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gYVxuICAgKiBAcGFyYW0gez99IGJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChhLCBiKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBrMSA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gazIgPSBPYmplY3Qua2V5cyhiKTtcbiAgICAgIGlmIChrMS5sZW5ndGggIT0gazIubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8ga2V5O1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGsxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAga2V5ID0gazFbaV07XG4gICAgICAgICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBmbGF0dGVuKGEpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHRhcmdldCA9IFtdO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICB0YXJnZXQucHVzaChhW2ldW2pdKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGxhc3QoYSkge1xuICAgICAgcmV0dXJuIGEubGVuZ3RoID4gMCA/IGFbYS5sZW5ndGggLSAxXSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbTFcbiAgICogQHBhcmFtIHs/fSBtMlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2UobTEsIG0yKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtID0ge307XG4gICAgICBmb3IgKHZhciBhdHRyIGluIG0xKSB7XG4gICAgICAgICAgaWYgKG0xLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICAgIG1bYXR0cl0gPSBtMVthdHRyXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBhdHRyIGluIG0yKSB7XG4gICAgICAgICAgaWYgKG0yLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICAgIG1bYXR0cl0gPSBtMlthdHRyXTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBtYXBcbiAgICogQHBhcmFtIHs/fSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChtYXAsIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBwcm9wIGluIG1hcCkge1xuICAgICAgICAgIGlmIChtYXAuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2sobWFwW3Byb3BdLCBwcm9wKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2JqXG4gICAqIEBwYXJhbSB7P30gZm5cbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHdhaXRGb3JNYXAob2JqLCBmbikge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gd2FpdEZvciA9IFtdO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0ge307XG4gICAgICBmb3JFYWNoKG9iaiwgZnVuY3Rpb24gKGEsIGspIHtcbiAgICAgICAgICBpZiAoayA9PT0gUFJJTUFSWV9PVVRMRVQpIHtcbiAgICAgICAgICAgICAgd2FpdEZvci5wdXNoKHJ4anNfb3BlcmF0b3JfbWFwLm1hcC5jYWxsKGZuKGssIGEpLCBmdW5jdGlvbiAoXykge1xuICAgICAgICAgICAgICAgICAgcmVzW2tdID0gXztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3JFYWNoKG9iaiwgZnVuY3Rpb24gKGEsIGspIHtcbiAgICAgICAgICBpZiAoayAhPT0gUFJJTUFSWV9PVVRMRVQpIHtcbiAgICAgICAgICAgICAgd2FpdEZvci5wdXNoKHJ4anNfb3BlcmF0b3JfbWFwLm1hcC5jYWxsKGZuKGssIGEpLCBmdW5jdGlvbiAoXykge1xuICAgICAgICAgICAgICAgICAgcmVzW2tdID0gXztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAod2FpdEZvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uY2F0dGVkJCA9IHJ4anNfb3BlcmF0b3JfY29uY2F0QWxsLmNvbmNhdEFsbC5jYWxsKHJ4anNfb2JzZXJ2YWJsZV9vZi5vZi5hcHBseSh2b2lkIDAsIHdhaXRGb3IpKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsYXN0JCA9IGwubGFzdC5jYWxsKGNvbmNhdHRlZCQpO1xuICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbChsYXN0JCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzOyB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YocmVzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBvYnNlcnZhYmxlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYW5kT2JzZXJ2YWJsZXMob2JzZXJ2YWJsZXMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1lcmdlZCQgPSByeGpzX29wZXJhdG9yX21lcmdlQWxsLm1lcmdlQWxsLmNhbGwob2JzZXJ2YWJsZXMpO1xuICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfZXZlcnkuZXZlcnkuY2FsbChtZXJnZWQkLCBmdW5jdGlvbiAocmVzdWx0KSB7IHJldHVybiByZXN1bHQgPT09IHRydWU7IH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiB3cmFwSW50b09ic2VydmFibGUodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHJ4anNfT2JzZXJ2YWJsZS5PYnNlcnZhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfZnJvbVByb21pc2UuZnJvbVByb21pc2UodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUk9VVEVTID0gbmV3IF9hbmd1bGFyX2NvcmUuT3BhcXVlVG9rZW4oJ1JPVVRFUycpO1xuICB2YXIgTG9hZGVkUm91dGVyQ29uZmlnID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gZmFjdG9yeVJlc29sdmVyXG4gICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yRmFjdG9yeVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBMb2FkZWRSb3V0ZXJDb25maWcocm91dGVzLCBpbmplY3RvciwgZmFjdG9yeVJlc29sdmVyLCBpbmplY3RvckZhY3RvcnkpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlcyA9IHJvdXRlcztcbiAgICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgICAgdGhpcy5mYWN0b3J5UmVzb2x2ZXIgPSBmYWN0b3J5UmVzb2x2ZXI7XG4gICAgICAgICAgdGhpcy5pbmplY3RvckZhY3RvcnkgPSBpbmplY3RvckZhY3Rvcnk7XG4gICAgICB9XG4gICAgICByZXR1cm4gTG9hZGVkUm91dGVyQ29uZmlnO1xuICB9KCkpO1xuICB2YXIgUm91dGVyQ29uZmlnTG9hZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBsb2FkZXJcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcGlsZXJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUm91dGVyQ29uZmlnTG9hZGVyKGxvYWRlciwgY29tcGlsZXIpIHtcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50SW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gbG9hZENoaWxkcmVuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJDb25maWdMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAocGFyZW50SW5qZWN0b3IsIGxvYWRDaGlsZHJlbikge1xuICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbCh0aGlzLmxvYWRNb2R1bGVGYWN0b3J5KGxvYWRDaGlsZHJlbiksIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlZiA9IHIuY3JlYXRlKHBhcmVudEluamVjdG9yKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5qZWN0b3JGYWN0b3J5ID0gZnVuY3Rpb24gKHBhcmVudCkgeyByZXR1cm4gci5jcmVhdGUocGFyZW50KS5pbmplY3RvcjsgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2FkZWRSb3V0ZXJDb25maWcoZmxhdHRlbihyZWYuaW5qZWN0b3IuZ2V0KFJPVVRFUykpLCByZWYuaW5qZWN0b3IsIHJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIGluamVjdG9yRmFjdG9yeSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGxvYWRDaGlsZHJlblxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyQ29uZmlnTG9hZGVyLnByb3RvdHlwZS5sb2FkTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIChsb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0eXBlb2YgbG9hZENoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vYnNlcnZhYmxlX2Zyb21Qcm9taXNlLmZyb21Qcm9taXNlKHRoaXMubG9hZGVyLmxvYWQobG9hZENoaWxkcmVuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvZmZsaW5lTW9kZV8xID0gdGhpcy5jb21waWxlciBpbnN0YW5jZW9mIF9hbmd1bGFyX2NvcmUuQ29tcGlsZXI7XG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21lcmdlTWFwLm1lcmdlTWFwLmNhbGwod3JhcEludG9PYnNlcnZhYmxlKGxvYWRDaGlsZHJlbigpKSwgZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG9mZmxpbmVNb2RlXzEgPyByeGpzX29ic2VydmFibGVfb2Yub2YoLyoqIEB0eXBlIHs/fSAqLyAodCkpIDogcnhqc19vYnNlcnZhYmxlX2Zyb21Qcm9taXNlLmZyb21Qcm9taXNlKF90aGlzLmNvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyh0KSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gUm91dGVyQ29uZmlnTG9hZGVyO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlRW1wdHlVcmxUcmVlKCkge1xuICAgICAgcmV0dXJuIG5ldyBVcmxUcmVlKG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KSwge30sIG51bGwpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lZVxuICAgKiBAcGFyYW0gez99IGV4YWN0XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb250YWluc1RyZWUoY29udGFpbmVyLCBjb250YWluZWUsIGV4YWN0KSB7XG4gICAgICBpZiAoZXhhY3QpIHtcbiAgICAgICAgICByZXR1cm4gZXF1YWxRdWVyeVBhcmFtcyhjb250YWluZXIucXVlcnlQYXJhbXMsIGNvbnRhaW5lZS5xdWVyeVBhcmFtcykgJiZcbiAgICAgICAgICAgICAgZXF1YWxTZWdtZW50R3JvdXBzKGNvbnRhaW5lci5yb290LCBjb250YWluZWUucm9vdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGFpbnNRdWVyeVBhcmFtcyhjb250YWluZXIucXVlcnlQYXJhbXMsIGNvbnRhaW5lZS5xdWVyeVBhcmFtcykgJiZcbiAgICAgICAgICBjb250YWluc1NlZ21lbnRHcm91cChjb250YWluZXIucm9vdCwgY29udGFpbmVlLnJvb3QpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXF1YWxRdWVyeVBhcmFtcyhjb250YWluZXIsIGNvbnRhaW5lZSkge1xuICAgICAgcmV0dXJuIHNoYWxsb3dFcXVhbChjb250YWluZXIsIGNvbnRhaW5lZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29udGFpbmVyXG4gICAqIEBwYXJhbSB7P30gY29udGFpbmVlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBlcXVhbFNlZ21lbnRHcm91cHMoY29udGFpbmVyLCBjb250YWluZWUpIHtcbiAgICAgIGlmICghZXF1YWxQYXRoKGNvbnRhaW5lci5zZWdtZW50cywgY29udGFpbmVlLnNlZ21lbnRzKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoY29udGFpbmVyLm51bWJlck9mQ2hpbGRyZW4gIT09IGNvbnRhaW5lZS5udW1iZXJPZkNoaWxkcmVuKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGMgaW4gY29udGFpbmVlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKCFjb250YWluZXIuY2hpbGRyZW5bY10pXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoIWVxdWFsU2VnbWVudEdyb3Vwcyhjb250YWluZXIuY2hpbGRyZW5bY10sIGNvbnRhaW5lZS5jaGlsZHJlbltjXSkpXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lclxuICAgKiBAcGFyYW0gez99IGNvbnRhaW5lZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY29udGFpbnNRdWVyeVBhcmFtcyhjb250YWluZXIsIGNvbnRhaW5lZSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbnRhaW5lZSkgPD0gT2JqZWN0LmtleXMoY29udGFpbmVyKSAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKGNvbnRhaW5lZSkuZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY29udGFpbmVlW2tleV0gPT09IGNvbnRhaW5lcltrZXldOyB9KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb250YWluZXJcbiAgICogQHBhcmFtIHs/fSBjb250YWluZWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnRhaW5zU2VnbWVudEdyb3VwKGNvbnRhaW5lciwgY29udGFpbmVlKSB7XG4gICAgICByZXR1cm4gY29udGFpbnNTZWdtZW50R3JvdXBIZWxwZXIoY29udGFpbmVyLCBjb250YWluZWUsIGNvbnRhaW5lZS5zZWdtZW50cyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29udGFpbmVyXG4gICAqIEBwYXJhbSB7P30gY29udGFpbmVlXG4gICAqIEBwYXJhbSB7P30gY29udGFpbmVlUGF0aHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnRhaW5zU2VnbWVudEdyb3VwSGVscGVyKGNvbnRhaW5lciwgY29udGFpbmVlLCBjb250YWluZWVQYXRocykge1xuICAgICAgaWYgKGNvbnRhaW5lci5zZWdtZW50cy5sZW5ndGggPiBjb250YWluZWVQYXRocy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50ID0gY29udGFpbmVyLnNlZ21lbnRzLnNsaWNlKDAsIGNvbnRhaW5lZVBhdGhzLmxlbmd0aCk7XG4gICAgICAgICAgaWYgKCFlcXVhbFBhdGgoY3VycmVudCwgY29udGFpbmVlUGF0aHMpKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKGNvbnRhaW5lZS5oYXNDaGlsZHJlbigpKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChjb250YWluZXIuc2VnbWVudHMubGVuZ3RoID09PSBjb250YWluZWVQYXRocy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoIWVxdWFsUGF0aChjb250YWluZXIuc2VnbWVudHMsIGNvbnRhaW5lZVBhdGhzKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGZvciAodmFyIGMgaW4gY29udGFpbmVlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgIGlmICghY29udGFpbmVyLmNoaWxkcmVuW2NdKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zU2VnbWVudEdyb3VwKGNvbnRhaW5lci5jaGlsZHJlbltjXSwgY29udGFpbmVlLmNoaWxkcmVuW2NdKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50ID0gY29udGFpbmVlUGF0aHMuc2xpY2UoMCwgY29udGFpbmVyLnNlZ21lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IGNvbnRhaW5lZVBhdGhzLnNsaWNlKGNvbnRhaW5lci5zZWdtZW50cy5sZW5ndGgpO1xuICAgICAgICAgIGlmICghZXF1YWxQYXRoKGNvbnRhaW5lci5zZWdtZW50cywgY3VycmVudCkpXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoIWNvbnRhaW5lci5jaGlsZHJlbltQUklNQVJZX09VVExFVF0pXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gY29udGFpbnNTZWdtZW50R3JvdXBIZWxwZXIoY29udGFpbmVyLmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXSwgY29udGFpbmVlLCBuZXh0KTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICogY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAqIGNvbnN0IHRyZWU6IFVybFRyZWUgPVxuICAgICogcm91dGVyLnBhcnNlVXJsKCcvdGVhbS8zMy8odXNlci92aWN0b3IvL3N1cHBvcnQ6aGVscCk/ZGVidWc9dHJ1ZSNmcmFnbWVudCcpO1xuICAgICogY29uc3QgZiA9IHRyZWUuZnJhZ21lbnQ7IC8vIHJldHVybiAnZnJhZ21lbnQnXG4gICAgKiBjb25zdCBxID0gdHJlZS5xdWVyeVBhcmFtczsgLy8gcmV0dXJucyB7ZGVidWc6ICd0cnVlJ31cbiAgICAqIGNvbnN0IGc6IFVybFNlZ21lbnRHcm91cCA9IHRyZWUucm9vdC5jaGlsZHJlbltQUklNQVJZX09VVExFVF07XG4gICAgKiBjb25zdCBzOiBVcmxTZWdtZW50W10gPSBnLnNlZ21lbnRzOyAvLyByZXR1cm5zIDIgc2VnbWVudHMgJ3RlYW0nIGFuZCAnMzMnXG4gICAgKiBnLmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXS5zZWdtZW50czsgLy8gcmV0dXJucyAyIHNlZ21lbnRzICd1c2VyJyBhbmQgJ3ZpY3RvcidcbiAgICAqIGcuY2hpbGRyZW5bJ3N1cHBvcnQnXS5zZWdtZW50czsgLy8gcmV0dXJuIDEgc2VnbWVudCAnaGVscCdcbiAgICAqIH1cbiAgICAqIH1cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogKlxuICAgICogU2luY2UgYSByb3V0ZXIgc3RhdGUgaXMgYSB0cmVlLCBhbmQgdGhlIFVSTCBpcyBub3RoaW5nIGJ1dCBhIHNlcmlhbGl6ZWQgc3RhdGUsIHRoZSBVUkwgaXMgYVxuICAgICogc2VyaWFsaXplZCB0cmVlLlxuICAgICogVXJsVHJlZSBpcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgYSBsb3Qgb2YgYWZmb3JkYW5jZXMgaW4gZGVhbGluZyB3aXRoIFVSTHNcbiAgICAqICpcbiAgICovXG4gIHZhciBVcmxUcmVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByb290XG4gICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zXG4gICAgICAgKiBAcGFyYW0gez99IGZyYWdtZW50XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFVybFRyZWUocm9vdCwgcXVlcnlQYXJhbXMsIGZyYWdtZW50KSB7XG4gICAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcbiAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7XG4gICAgICAgICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBVcmxUcmVlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEZWZhdWx0VXJsU2VyaWFsaXplcigpLnNlcmlhbGl6ZSh0aGlzKTsgfTtcbiAgICAgIHJldHVybiBVcmxUcmVlO1xuICB9KCkpO1xuICAvKipcbiAgICogICpcbiAgICAqIFNlZSB7QGxpbmsgVXJsVHJlZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgKiAqXG4gICAqL1xuICB2YXIgVXJsU2VnbWVudEdyb3VwID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBjaGlsZHJlblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBVcmxTZWdtZW50R3JvdXAoc2VnbWVudHMsIGNoaWxkcmVuKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgIC8qKiBUaGUgcGFyZW50IG5vZGUgaW4gdGhlIHVybCB0cmVlICovXG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgIGZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiB2LnBhcmVudCA9IF90aGlzOyB9KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIFdldGhlciB0aGUgc2VnbWVudCBoYXMgY2hpbGQgc2VnbWVudHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFNlZ21lbnRHcm91cC5wcm90b3R5cGUuaGFzQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm51bWJlck9mQ2hpbGRyZW4gPiAwOyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFVybFNlZ21lbnRHcm91cC5wcm90b3R5cGUsIFwibnVtYmVyT2ZDaGlsZHJlblwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIE51bWJlciBvZiBjaGlsZCBzZWdtZW50c1xuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNoaWxkcmVuKS5sZW5ndGg7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBVcmxTZWdtZW50R3JvdXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VyaWFsaXplUGF0aHModGhpcyk7IH07XG4gICAgICByZXR1cm4gVXJsU2VnbWVudEdyb3VwO1xuICB9KCkpO1xuICAvKipcbiAgICogICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICogY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAqIGNvbnN0IHRyZWU6IFVybFRyZWUgPSByb3V0ZXIucGFyc2VVcmwoJy90ZWFtO2lkPTMzJyk7XG4gICAgKiBjb25zdCBnOiBVcmxTZWdtZW50R3JvdXAgPSB0cmVlLnJvb3QuY2hpbGRyZW5bUFJJTUFSWV9PVVRMRVRdO1xuICAgICogY29uc3QgczogVXJsU2VnbWVudFtdID0gZy5zZWdtZW50cztcbiAgICAqIHNbMF0ucGF0aDsgLy8gcmV0dXJucyAndGVhbSdcbiAgICAqIHNbMF0ucGFyYW1ldGVyczsgLy8gcmV0dXJucyB7aWQ6IDMzfVxuICAgICogfVxuICAgICogfVxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiAqXG4gICAgKiBBIFVybFNlZ21lbnQgaXMgYSBwYXJ0IG9mIGEgVVJMIGJldHdlZW4gdGhlIHR3byBzbGFzaGVzLiBJdCBjb250YWlucyBhIHBhdGggYW5kIHRoZSBtYXRyaXhcbiAgICAqIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWdtZW50LlxuICAgICogKlxuICAgKi9cbiAgdmFyIFVybFNlZ21lbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhdGhcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1ldGVyc1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBVcmxTZWdtZW50KHBhdGgsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFNlZ21lbnQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VyaWFsaXplUGF0aCh0aGlzKTsgfTtcbiAgICAgIHJldHVybiBVcmxTZWdtZW50O1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXF1YWxTZWdtZW50cyhhLCBiKSB7XG4gICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGFbaV0ucGF0aCAhPT0gYltpXS5wYXRoKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwoYVtpXS5wYXJhbWV0ZXJzLCBiW2ldLnBhcmFtZXRlcnMpKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBhXG4gICAqIEBwYXJhbSB7P30gYlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZXF1YWxQYXRoKGEsIGIpIHtcbiAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoYVtpXS5wYXRoICE9PSBiW2ldLnBhdGgpXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRcbiAgICogQHBhcmFtIHs/fSBmblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFwQ2hpbGRyZW5JbnRvQXJyYXkoc2VnbWVudCwgZm4pIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IFtdO1xuICAgICAgZm9yRWFjaChzZWdtZW50LmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGNoaWxkT3V0bGV0KSB7XG4gICAgICAgICAgaWYgKGNoaWxkT3V0bGV0ID09PSBQUklNQVJZX09VVExFVCkge1xuICAgICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGZuKGNoaWxkLCBjaGlsZE91dGxldCkpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZm9yRWFjaChzZWdtZW50LmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGNoaWxkT3V0bGV0KSB7XG4gICAgICAgICAgaWYgKGNoaWxkT3V0bGV0ICE9PSBQUklNQVJZX09VVExFVCkge1xuICAgICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGZuKGNoaWxkLCBjaGlsZE91dGxldCkpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogICpcbiAgICAqIG1ha2UgYWxsIFVSTHMgY2FzZSBpbnNlbnNpdGl2ZSBieSBwcm92aWRpbmcgYSBjdXN0b20gVXJsU2VyaWFsaXplci5cbiAgICAqICpcbiAgICAqIFNlZSB7QGxpbmsgRGVmYXVsdFVybFNlcmlhbGl6ZXJ9IGZvciBhbiBleGFtcGxlIG9mIGEgVVJMIHNlcmlhbGl6ZXIuXG4gICAgKiAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgdmFyIFVybFNlcmlhbGl6ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVXJsU2VyaWFsaXplcigpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIFBhcnNlIGEgdXJsIGludG8gYSB7QGxpbmsgVXJsVHJlZX1cbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFNlcmlhbGl6ZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgQ29udmVydHMgYSB7QGxpbmsgVXJsVHJlZX0gaW50byBhIHVybFxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHRyZWVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh0cmVlKSB7IH07XG4gICAgICByZXR1cm4gVXJsU2VyaWFsaXplcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICAqXG4gICAgKiAqXG4gICAgKiBFeGFtcGxlIFVSTHM6XG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIC9pbmJveC8zMyhwb3B1cDpjb21wb3NlKVxuICAgICogL2luYm94LzMzO29wZW49dHJ1ZS9tZXNzYWdlcy80NFxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiBEZWZhdWx0VXJsU2VyaWFsaXplciB1c2VzIHBhcmVudGhlc2VzIHRvIHNlcmlhbGl6ZSBzZWNvbmRhcnkgc2VnbWVudHMgKGUuZy4sIHBvcHVwOmNvbXBvc2UpLCB0aGVcbiAgICAqIGNvbG9uIHN5bnRheCB0byBzcGVjaWZ5IHRoZSBvdXRsZXQsIGFuZCB0aGUgJztwYXJhbWV0ZXI9dmFsdWUnIHN5bnRheCAoZS5nLiwgb3Blbj10cnVlKSB0b1xuICAgICogc3BlY2lmeSByb3V0ZSBzcGVjaWZpYyBwYXJhbWV0ZXJzLlxuICAgICogKlxuICAgKi9cbiAgdmFyIERlZmF1bHRVcmxTZXJpYWxpemVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIERlZmF1bHRVcmxTZXJpYWxpemVyKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgUGFyc2VzIGEgdXJsIGludG8gYSB7QGxpbmsgVXJsVHJlZX1cbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0VXJsU2VyaWFsaXplci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IG5ldyBVcmxQYXJzZXIodXJsKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFVybFRyZWUocC5wYXJzZVJvb3RTZWdtZW50KCksIHAucGFyc2VRdWVyeVBhcmFtcygpLCBwLnBhcnNlRnJhZ21lbnQoKSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgQ29udmVydHMgYSB7QGxpbmsgVXJsVHJlZX0gaW50byBhIHVybFxuICAgICAgICogQHBhcmFtIHs/fSB0cmVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0VXJsU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKHRyZWUpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzZWdtZW50ID0gXCIvXCIgKyBzZXJpYWxpemVTZWdtZW50KHRyZWUucm9vdCwgdHJ1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcXVlcnkgPSBzZXJpYWxpemVRdWVyeVBhcmFtcyh0cmVlLnF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmcmFnbWVudCA9IHRyZWUuZnJhZ21lbnQgIT09IG51bGwgJiYgdHJlZS5mcmFnbWVudCAhPT0gdW5kZWZpbmVkID8gXCIjXCIgKyBlbmNvZGVVUkkodHJlZS5mcmFnbWVudCkgOiAnJztcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHNlZ21lbnQgKyBxdWVyeSArIGZyYWdtZW50O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBEZWZhdWx0VXJsU2VyaWFsaXplcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2VyaWFsaXplUGF0aHMoc2VnbWVudCkge1xuICAgICAgcmV0dXJuIHNlZ21lbnQuc2VnbWVudHMubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBzZXJpYWxpemVQYXRoKHApOyB9KS5qb2luKCcvJyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudFxuICAgKiBAcGFyYW0gez99IHJvb3RcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVNlZ21lbnQoc2VnbWVudCwgcm9vdCkge1xuICAgICAgaWYgKHNlZ21lbnQuaGFzQ2hpbGRyZW4oKSAmJiByb290KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJpbWFyeSA9IHNlZ21lbnQuY2hpbGRyZW5bUFJJTUFSWV9PVVRMRVRdID9cbiAgICAgICAgICAgICAgc2VyaWFsaXplU2VnbWVudChzZWdtZW50LmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXSwgZmFsc2UpIDpcbiAgICAgICAgICAgICAgJyc7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW5fMSA9IFtdO1xuICAgICAgICAgIGZvckVhY2goc2VnbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICAgICAgaWYgKGsgIT09IFBSSU1BUllfT1VUTEVUKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZHJlbl8xLnB1c2goayArIFwiOlwiICsgc2VyaWFsaXplU2VnbWVudCh2LCBmYWxzZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuXzEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJpbWFyeSArIFwiKFwiICsgY2hpbGRyZW5fMS5qb2luKCcvLycpICsgXCIpXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIHByaW1hcnk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc2VnbWVudC5oYXNDaGlsZHJlbigpICYmICFyb290KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSBtYXBDaGlsZHJlbkludG9BcnJheShzZWdtZW50LCBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgICAgICBpZiAoayA9PT0gUFJJTUFSWV9PVVRMRVQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBbc2VyaWFsaXplU2VnbWVudChzZWdtZW50LmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXSwgZmFsc2UpXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBbKGsgKyBcIjpcIiArIHNlcmlhbGl6ZVNlZ21lbnQodiwgZmFsc2UpKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplUGF0aHMoc2VnbWVudCkgKyBcIi8oXCIgKyBjaGlsZHJlbi5qb2luKCcvLycpICsgXCIpXCI7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplUGF0aHMoc2VnbWVudCk7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlKHMpIHtcbiAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZGVjb2RlKHMpIHtcbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcGF0aFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2VyaWFsaXplUGF0aChwYXRoKSB7XG4gICAgICByZXR1cm4gXCJcIiArIGVuY29kZShwYXRoLnBhdGgpICsgc2VyaWFsaXplUGFyYW1zKHBhdGgucGFyYW1ldGVycyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcGFyYW1zXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzZXJpYWxpemVQYXJhbXMocGFyYW1zKSB7XG4gICAgICByZXR1cm4gcGFpcnMocGFyYW1zKS5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIChcIjtcIiArIGVuY29kZShwLmZpcnN0KSArIFwiPVwiICsgZW5jb2RlKHAuc2Vjb25kKSk7IH0pLmpvaW4oJycpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2VyaWFsaXplUXVlcnlQYXJhbXMocGFyYW1zKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdHJQYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gcGFyYW1zW25hbWVdO1xuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gKGVuY29kZShuYW1lKSArIFwiPVwiICsgZW5jb2RlKHYpKTsgfSkuam9pbignJicpIDpcbiAgICAgICAgICAgICAgZW5jb2RlKG5hbWUpICsgXCI9XCIgKyBlbmNvZGUodmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RyUGFyYW1zLmxlbmd0aCA/IFwiP1wiICsgc3RyUGFyYW1zLmpvaW4oXCImXCIpIDogJyc7XG4gIH1cbiAgdmFyIFBhaXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZpcnN0XG4gICAgICAgKiBAcGFyYW0gez99IHNlY29uZFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBQYWlyKGZpcnN0LCBzZWNvbmQpIHtcbiAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG4gICAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gUGFpcjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2JqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBwYWlycyhvYmopIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgIHJlcy5wdXNoKG5ldyBQYWlyKHByb3AsIG9ialtwcm9wXSkpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gU0VHTUVOVF9SRSA9IC9eW15cXC8oKT87PSYjXSsvO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdHJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoU2VnbWVudHMoc3RyKSB7XG4gICAgICBTRUdNRU5UX1JFLmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXRjaCA9IHN0ci5tYXRjaChTRUdNRU5UX1JFKTtcbiAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG4gIH1cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUVVFUllfUEFSQU1fUkUgPSAvXltePT8mI10rLztcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc3RyXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaFF1ZXJ5UGFyYW1zKHN0cikge1xuICAgICAgUVVFUllfUEFSQU1fUkUubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG1hdGNoID0gc3RyLm1hdGNoKFNFR01FTlRfUkUpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMF0gOiAnJztcbiAgfVxuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBRVUVSWV9QQVJBTV9WQUxVRV9SRSA9IC9eW14/JiNdKy87XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHN0clxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hVcmxRdWVyeVBhcmFtVmFsdWUoc3RyKSB7XG4gICAgICBRVUVSWV9QQVJBTV9WQUxVRV9SRS5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2ggPSBzdHIubWF0Y2goUVVFUllfUEFSQU1fVkFMVUVfUkUpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMF0gOiAnJztcbiAgfVxuICB2YXIgVXJsUGFyc2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gVXJsUGFyc2VyKHVybCkge1xuICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICAgIHRoaXMucmVtYWluaW5nID0gdXJsO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHN0clxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVXJsUGFyc2VyLnByb3RvdHlwZS5wZWVrU3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHRoaXMucmVtYWluaW5nLnN0YXJ0c1dpdGgoc3RyKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzdHJcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUuY2FwdHVyZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMucmVtYWluaW5nLnN0YXJ0c1dpdGgoc3RyKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBcXFwiXCIgKyBzdHIgKyBcIlxcXCIuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMucmVtYWluaW5nLnN1YnN0cmluZyhzdHIubGVuZ3RoKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUucGFyc2VSb290U2VnbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5yZW1haW5pbmcuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5yZW1haW5pbmcgPT09ICcnIHx8IHRoaXMucmVtYWluaW5nLnN0YXJ0c1dpdGgoJz8nKSB8fCB0aGlzLnJlbWFpbmluZy5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHRoaXMucGFyc2VDaGlsZHJlbigpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUucGFyc2VDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5yZW1haW5pbmcubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXRocyA9IFtdO1xuICAgICAgICAgIGlmICghdGhpcy5wZWVrU3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICAgICAgICAgIHBhdGhzLnB1c2godGhpcy5wYXJzZVNlZ21lbnRzKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpICYmICF0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpICYmICF0aGlzLnBlZWtTdGFydHNXaXRoKCcvKCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnLycpO1xuICAgICAgICAgICAgICBwYXRocy5wdXNoKHRoaXMucGFyc2VTZWdtZW50cygpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLygnKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLnBhcnNlUGFyZW5zKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICAgICAgICAgIHJlcyA9IHRoaXMucGFyc2VQYXJlbnMoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID4gMCB8fCBPYmplY3Qua2V5cyhjaGlsZHJlbikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXNbUFJJTUFSWV9PVVRMRVRdID0gbmV3IFVybFNlZ21lbnRHcm91cChwYXRocywgY2hpbGRyZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVXJsUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNlZ21lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSBtYXRjaFNlZ21lbnRzKHRoaXMucmVtYWluaW5nKTtcbiAgICAgICAgICBpZiAocGF0aCA9PT0gJycgJiYgdGhpcy5wZWVrU3RhcnRzV2l0aCgnOycpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IHBhdGggdXJsIHNlZ21lbnQgY2Fubm90IGhhdmUgcGFyYW1ldGVyczogJ1wiICsgdGhpcy5yZW1haW5pbmcgKyBcIicuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNhcHR1cmUocGF0aCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0cml4UGFyYW1zID0ge307XG4gICAgICAgICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJzsnKSkge1xuICAgICAgICAgICAgICBtYXRyaXhQYXJhbXMgPSB0aGlzLnBhcnNlTWF0cml4UGFyYW1zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgVXJsU2VnbWVudChkZWNvZGUocGF0aCksIG1hdHJpeFBhcmFtcyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBVcmxQYXJzZXIucHJvdG90eXBlLnBhcnNlUXVlcnlQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1zID0ge307XG4gICAgICAgICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJz8nKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUoJz8nKTtcbiAgICAgICAgICAgICAgdGhpcy5wYXJzZVF1ZXJ5UGFyYW0ocGFyYW1zKTtcbiAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucmVtYWluaW5nLmxlbmd0aCA+IDAgJiYgdGhpcy5wZWVrU3RhcnRzV2l0aCgnJicpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUoJyYnKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VRdWVyeVBhcmFtKHBhcmFtcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUucGFyc2VGcmFnbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUkkodGhpcy5yZW1haW5pbmcuc3Vic3RyaW5nKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBVcmxQYXJzZXIucHJvdG90eXBlLnBhcnNlTWF0cml4UGFyYW1zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtcyA9IHt9O1xuICAgICAgICAgIHdoaWxlICh0aGlzLnJlbWFpbmluZy5sZW5ndGggPiAwICYmIHRoaXMucGVla1N0YXJ0c1dpdGgoJzsnKSkge1xuICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUoJzsnKTtcbiAgICAgICAgICAgICAgdGhpcy5wYXJzZVBhcmFtKHBhcmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVXJsUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBhcmFtID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IG1hdGNoU2VnbWVudHModGhpcy5yZW1haW5pbmcpO1xuICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jYXB0dXJlKGtleSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnPScpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZU1hdGNoID0gbWF0Y2hTZWdtZW50cyh0aGlzLnJlbWFpbmluZyk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlTWF0Y2g7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmFtc1tkZWNvZGUoa2V5KV0gPSBkZWNvZGUodmFsdWUpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUucGFyc2VRdWVyeVBhcmFtID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGtleSA9IG1hdGNoUXVlcnlQYXJhbXModGhpcy5yZW1haW5pbmcpO1xuICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jYXB0dXJlKGtleSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSAnJztcbiAgICAgICAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnPScpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZU1hdGNoID0gbWF0Y2hVcmxRdWVyeVBhcmFtVmFsdWUodGhpcy5yZW1haW5pbmcpO1xuICAgICAgICAgICAgICBpZiAodmFsdWVNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZU1hdGNoO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jYXB0dXJlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBkZWNvZGVkS2V5ID0gZGVjb2RlKGtleSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGVjb2RlZFZhbCA9IGRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShkZWNvZGVkS2V5KSkge1xuICAgICAgICAgICAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgdmFsdWVzXG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnRWYWwgPSBwYXJhbXNbZGVjb2RlZEtleV07XG4gICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50VmFsKSkge1xuICAgICAgICAgICAgICAgICAgY3VycmVudFZhbCA9IFtjdXJyZW50VmFsXTtcbiAgICAgICAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVkS2V5XSA9IGN1cnJlbnRWYWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3VycmVudFZhbC5wdXNoKGRlY29kZWRWYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZhbHVlXG4gICAgICAgICAgICAgIHBhcmFtc1tkZWNvZGVkS2V5XSA9IGRlY29kZWRWYWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhbGxvd1ByaW1hcnlcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybFBhcnNlci5wcm90b3R5cGUucGFyc2VQYXJlbnMgPSBmdW5jdGlvbiAoYWxsb3dQcmltYXJ5KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2VnbWVudHMgPSB7fTtcbiAgICAgICAgICB0aGlzLmNhcHR1cmUoJygnKTtcbiAgICAgICAgICB3aGlsZSAoIXRoaXMucGVla1N0YXJ0c1dpdGgoJyknKSAmJiB0aGlzLnJlbWFpbmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSBtYXRjaFNlZ21lbnRzKHRoaXMucmVtYWluaW5nKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmV4dCA9IHRoaXMucmVtYWluaW5nW3BhdGgubGVuZ3RoXTtcbiAgICAgICAgICAgICAgLy8gaWYgaXMgaXMgbm90IG9uZSBvZiB0aGVzZSBjaGFyYWN0ZXJzLCB0aGVuIHRoZSBzZWdtZW50IHdhcyB1bmVzY2FwZWRcbiAgICAgICAgICAgICAgLy8gb3IgdGhlIGdyb3VwIHdhcyBub3QgY2xvc2VkXG4gICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnLycgJiYgbmV4dCAhPT0gJyknICYmIG5leHQgIT09ICc7Jykge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBhcnNlIHVybCAnXCIgKyB0aGlzLnVybCArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRsZXROYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCc6JykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgb3V0bGV0TmFtZSA9IHBhdGguc3Vic3RyKDAsIHBhdGguaW5kZXhPZignOicpKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FwdHVyZShvdXRsZXROYW1lKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2FwdHVyZSgnOicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGFsbG93UHJpbWFyeSkge1xuICAgICAgICAgICAgICAgICAgb3V0bGV0TmFtZSA9IFBSSU1BUllfT1VUTEVUO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuID0gdGhpcy5wYXJzZUNoaWxkcmVuKCk7XG4gICAgICAgICAgICAgIHNlZ21lbnRzW291dGxldE5hbWVdID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pLmxlbmd0aCA9PT0gMSA/IGNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXSA6XG4gICAgICAgICAgICAgICAgICBuZXcgVXJsU2VnbWVudEdyb3VwKFtdLCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmUoJy8vJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jYXB0dXJlKCcpJyk7XG4gICAgICAgICAgcmV0dXJuIHNlZ21lbnRzO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBVcmxQYXJzZXI7XG4gIH0oKSk7XG5cbiAgdmFyIE5vTWF0Y2ggPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez89fSBzZWdtZW50R3JvdXBcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTm9NYXRjaChzZWdtZW50R3JvdXApIHtcbiAgICAgICAgICBpZiAoc2VnbWVudEdyb3VwID09PSB2b2lkIDApIHsgc2VnbWVudEdyb3VwID0gbnVsbDsgfVxuICAgICAgICAgIHRoaXMuc2VnbWVudEdyb3VwID0gc2VnbWVudEdyb3VwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE5vTWF0Y2g7XG4gIH0oKSk7XG4gIHZhciBBYnNvbHV0ZVJlZGlyZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB1cmxUcmVlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFic29sdXRlUmVkaXJlY3QodXJsVHJlZSkge1xuICAgICAgICAgIHRoaXMudXJsVHJlZSA9IHVybFRyZWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gQWJzb2x1dGVSZWRpcmVjdDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBub01hdGNoKHNlZ21lbnRHcm91cCkge1xuICAgICAgcmV0dXJuIG5ldyByeGpzX09ic2VydmFibGUuT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzKSB7IHJldHVybiBvYnMuZXJyb3IobmV3IE5vTWF0Y2goc2VnbWVudEdyb3VwKSk7IH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5ld1RyZWVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFic29sdXRlUmVkaXJlY3QobmV3VHJlZSkge1xuICAgICAgcmV0dXJuIG5ldyByeGpzX09ic2VydmFibGUuT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzKSB7IHJldHVybiBvYnMuZXJyb3IobmV3IEFic29sdXRlUmVkaXJlY3QobmV3VHJlZSkpOyB9KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBuYW1lZE91dGxldHNSZWRpcmVjdChyZWRpcmVjdFRvKSB7XG4gICAgICByZXR1cm4gbmV3IHJ4anNfT2JzZXJ2YWJsZS5PYnNlcnZhYmxlKGZ1bmN0aW9uIChvYnMpIHsgcmV0dXJuIG9icy5lcnJvcihuZXcgRXJyb3IoXCJPbmx5IGFic29sdXRlIHJlZGlyZWN0cyBjYW4gaGF2ZSBuYW1lZCBvdXRsZXRzLiByZWRpcmVjdFRvOiAnXCIgKyByZWRpcmVjdFRvICsgXCInXCIpKTsgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkxvYWRGYWlscyhyb3V0ZSkge1xuICAgICAgcmV0dXJuIG5ldyByeGpzX09ic2VydmFibGUuT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzKSB7IHJldHVybiBvYnMuZXJyb3IobmV3IE5hdmlnYXRpb25DYW5jZWxpbmdFcnJvcihcIkNhbm5vdCBsb2FkIGNoaWxkcmVuIGJlY2F1c2UgdGhlIGd1YXJkIG9mIHRoZSByb3V0ZSBcXFwicGF0aDogJ1wiICsgcm91dGUucGF0aCArIFwiJ1xcXCIgcmV0dXJuZWQgZmFsc2VcIikpOyB9KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgKiBAcGFyYW0gez99IGNvbmZpZ0xvYWRlclxuICAgKiBAcGFyYW0gez99IHVybFNlcmlhbGl6ZXJcbiAgICogQHBhcmFtIHs/fSB1cmxUcmVlXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhcHBseVJlZGlyZWN0cyhpbmplY3RvciwgY29uZmlnTG9hZGVyLCB1cmxTZXJpYWxpemVyLCB1cmxUcmVlLCBjb25maWcpIHtcbiAgICAgIHJldHVybiBuZXcgQXBwbHlSZWRpcmVjdHMoaW5qZWN0b3IsIGNvbmZpZ0xvYWRlciwgdXJsU2VyaWFsaXplciwgdXJsVHJlZSwgY29uZmlnKS5hcHBseSgpO1xuICB9XG4gIHZhciBBcHBseVJlZGlyZWN0cyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnTG9hZGVyXG4gICAgICAgKiBAcGFyYW0gez99IHVybFNlcmlhbGl6ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsVHJlZVxuICAgICAgICogQHBhcmFtIHs/fSBjb25maWdcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQXBwbHlSZWRpcmVjdHMoaW5qZWN0b3IsIGNvbmZpZ0xvYWRlciwgdXJsU2VyaWFsaXplciwgdXJsVHJlZSwgY29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICAgIHRoaXMuY29uZmlnTG9hZGVyID0gY29uZmlnTG9hZGVyO1xuICAgICAgICAgIHRoaXMudXJsU2VyaWFsaXplciA9IHVybFNlcmlhbGl6ZXI7XG4gICAgICAgICAgdGhpcy51cmxUcmVlID0gdXJsVHJlZTtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICB0aGlzLmFsbG93UmVkaXJlY3RzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwYW5kZWQkID0gdGhpcy5leHBhbmRTZWdtZW50R3JvdXAodGhpcy5pbmplY3RvciwgdGhpcy5jb25maWcsIHRoaXMudXJsVHJlZS5yb290LCBQUklNQVJZX09VVExFVCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsVHJlZXMkID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwoZXhwYW5kZWQkLCBmdW5jdGlvbiAocm9vdFNlZ21lbnRHcm91cCkgeyByZXR1cm4gX3RoaXMuY3JlYXRlVXJsVHJlZShyb290U2VnbWVudEdyb3VwLCBfdGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zLCBfdGhpcy51cmxUcmVlLmZyYWdtZW50KTsgfSk7XG4gICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfY2F0Y2guX2NhdGNoLmNhbGwodXJsVHJlZXMkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFic29sdXRlUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIGFuIGFic29sdXRlIHJlZGlyZWN0IHdlIGRvIG5vdCBhcHBseSBhbnkgbW9yZSByZWRpcmVjdHMhXG4gICAgICAgICAgICAgICAgICBfdGhpcy5hbGxvd1JlZGlyZWN0cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBydW4gbWF0Y2hpbmcsIHNvIHdlIGNhbiBmZXRjaCBhbGwgbGF6eS1sb2FkZWQgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoKGUudXJsVHJlZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE5vTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IF90aGlzLm5vTWF0Y2hFcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdHJlZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHRyZWUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cGFuZGVkJCA9IHRoaXMuZXhwYW5kU2VnbWVudEdyb3VwKHRoaXMuaW5qZWN0b3IsIHRoaXMuY29uZmlnLCB0cmVlLnJvb3QsIFBSSU1BUllfT1VUTEVUKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXBwZWQkID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwoZXhwYW5kZWQkLCBmdW5jdGlvbiAocm9vdFNlZ21lbnRHcm91cCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY3JlYXRlVXJsVHJlZShyb290U2VnbWVudEdyb3VwLCB0cmVlLnF1ZXJ5UGFyYW1zLCB0cmVlLmZyYWdtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9jYXRjaC5fY2F0Y2guY2FsbChtYXBwZWQkLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IF90aGlzLm5vTWF0Y2hFcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLm5vTWF0Y2hFcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIkNhbm5vdCBtYXRjaCBhbnkgcm91dGVzLiBVUkwgU2VnbWVudDogJ1wiICsgZS5zZWdtZW50R3JvdXAgKyBcIidcIik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvb3RDYW5kaWRhdGVcbiAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7P30gZnJhZ21lbnRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5jcmVhdGVVcmxUcmVlID0gZnVuY3Rpb24gKHJvb3RDYW5kaWRhdGUsIHF1ZXJ5UGFyYW1zLCBmcmFnbWVudCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvb3QgPSByb290Q2FuZGlkYXRlLnNlZ21lbnRzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICBuZXcgVXJsU2VnbWVudEdyb3VwKFtdLCAoX2EgPSB7fSwgX2FbUFJJTUFSWV9PVVRMRVRdID0gcm9vdENhbmRpZGF0ZSwgX2EpKSA6XG4gICAgICAgICAgICAgIHJvb3RDYW5kaWRhdGU7XG4gICAgICAgICAgcmV0dXJuIG5ldyBVcmxUcmVlKHJvb3QsIHF1ZXJ5UGFyYW1zLCBmcmFnbWVudCk7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmV4cGFuZFNlZ21lbnRHcm91cCA9IGZ1bmN0aW9uIChpbmplY3Rvciwgcm91dGVzLCBzZWdtZW50R3JvdXAsIG91dGxldCkge1xuICAgICAgICAgIGlmIChzZWdtZW50R3JvdXAuc2VnbWVudHMubGVuZ3RoID09PSAwICYmIHNlZ21lbnRHcm91cC5oYXNDaGlsZHJlbigpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbCh0aGlzLmV4cGFuZENoaWxkcmVuKGluamVjdG9yLCByb3V0ZXMsIHNlZ21lbnRHcm91cCksIGZ1bmN0aW9uIChjaGlsZHJlbikgeyByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChbXSwgY2hpbGRyZW4pOyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGFuZFNlZ21lbnQoaW5qZWN0b3IsIHNlZ21lbnRHcm91cCwgcm91dGVzLCBzZWdtZW50R3JvdXAuc2VnbWVudHMsIG91dGxldCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcHBseVJlZGlyZWN0cy5wcm90b3R5cGUuZXhwYW5kQ2hpbGRyZW4gPSBmdW5jdGlvbiAoaW5qZWN0b3IsIHJvdXRlcywgc2VnbWVudEdyb3VwKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gd2FpdEZvck1hcChzZWdtZW50R3JvdXAuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZE91dGxldCwgY2hpbGQpIHsgcmV0dXJuIF90aGlzLmV4cGFuZFNlZ21lbnRHcm91cChpbmplY3Rvciwgcm91dGVzLCBjaGlsZCwgY2hpbGRPdXRsZXQpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEBwYXJhbSB7P30gYWxsb3dSZWRpcmVjdHNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5leHBhbmRTZWdtZW50ID0gZnVuY3Rpb24gKGluamVjdG9yLCBzZWdtZW50R3JvdXAsIHJvdXRlcywgc2VnbWVudHMsIG91dGxldCwgYWxsb3dSZWRpcmVjdHMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvdXRlcyQgPSByeGpzX29ic2VydmFibGVfb2Yub2YuYXBwbHkodm9pZCAwLCByb3V0ZXMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByb2Nlc3NlZFJvdXRlcyQgPSByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbChyb3V0ZXMkLCBmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHBhbmRlZCQgPSBfdGhpcy5leHBhbmRTZWdtZW50QWdhaW5zdFJvdXRlKGluamVjdG9yLCBzZWdtZW50R3JvdXAsIHJvdXRlcywgciwgc2VnbWVudHMsIG91dGxldCwgYWxsb3dSZWRpcmVjdHMpO1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9jYXRjaC5fY2F0Y2guY2FsbChleHBhbmRlZCQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vTWF0Y2gpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihudWxsKTtcbiAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb25jYXR0ZWRQcm9jZXNzZWRSb3V0ZXMkID0gcnhqc19vcGVyYXRvcl9jb25jYXRBbGwuY29uY2F0QWxsLmNhbGwocHJvY2Vzc2VkUm91dGVzJCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZmlyc3QkID0gcnhqc19vcGVyYXRvcl9maXJzdC5maXJzdC5jYWxsKGNvbmNhdHRlZFByb2Nlc3NlZFJvdXRlcyQsIGZ1bmN0aW9uIChzKSB7IHJldHVybiAhIXM7IH0pO1xuICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX2NhdGNoLl9jYXRjaC5jYWxsKGZpcnN0JCwgZnVuY3Rpb24gKGUsIF8pIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiByeGpzX3V0aWxfRW1wdHlFcnJvci5FbXB0eUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoX3RoaXMubm9MZWZ0b3ZlcnNJblVybChzZWdtZW50R3JvdXAsIHNlZ21lbnRzLCBvdXRsZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihuZXcgVXJsU2VnbWVudEdyb3VwKFtdLCB7fSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vTWF0Y2goc2VnbWVudEdyb3VwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLm5vTGVmdG92ZXJzSW5VcmwgPSBmdW5jdGlvbiAoc2VnbWVudEdyb3VwLCBzZWdtZW50cywgb3V0bGV0KSB7XG4gICAgICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJiAhc2VnbWVudEdyb3VwLmNoaWxkcmVuW291dGxldF07XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEBwYXJhbSB7P30gcGF0aHNcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0XG4gICAgICAgKiBAcGFyYW0gez99IGFsbG93UmVkaXJlY3RzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcHBseVJlZGlyZWN0cy5wcm90b3R5cGUuZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZSA9IGZ1bmN0aW9uIChpbmplY3Rvciwgc2VnbWVudEdyb3VwLCByb3V0ZXMsIHJvdXRlLCBwYXRocywgb3V0bGV0LCBhbGxvd1JlZGlyZWN0cykge1xuICAgICAgICAgIGlmIChnZXRPdXRsZXQkMShyb3V0ZSkgIT09IG91dGxldClcbiAgICAgICAgICAgICAgcmV0dXJuIG5vTWF0Y2goc2VnbWVudEdyb3VwKTtcbiAgICAgICAgICBpZiAocm91dGUucmVkaXJlY3RUbyAhPT0gdW5kZWZpbmVkICYmICEoYWxsb3dSZWRpcmVjdHMgJiYgdGhpcy5hbGxvd1JlZGlyZWN0cykpXG4gICAgICAgICAgICAgIHJldHVybiBub01hdGNoKHNlZ21lbnRHcm91cCk7XG4gICAgICAgICAgaWYgKHJvdXRlLnJlZGlyZWN0VG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFNlZ21lbnRBZ2FpbnN0Um91dGUoaW5qZWN0b3IsIHNlZ21lbnRHcm91cCwgcm91dGUsIHBhdGhzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGFuZFNlZ21lbnRBZ2FpbnN0Um91dGVVc2luZ1JlZGlyZWN0KGluamVjdG9yLCBzZWdtZW50R3JvdXAsIHJvdXRlcywgcm91dGUsIHBhdGhzLCBvdXRsZXQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5leHBhbmRTZWdtZW50QWdhaW5zdFJvdXRlVXNpbmdSZWRpcmVjdCA9IGZ1bmN0aW9uIChpbmplY3Rvciwgc2VnbWVudEdyb3VwLCByb3V0ZXMsIHJvdXRlLCBzZWdtZW50cywgb3V0bGV0KSB7XG4gICAgICAgICAgaWYgKHJvdXRlLnBhdGggPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kV2lsZENhcmRXaXRoUGFyYW1zQWdhaW5zdFJvdXRlVXNpbmdSZWRpcmVjdChpbmplY3Rvciwgcm91dGVzLCByb3V0ZSwgb3V0bGV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGFuZFJlZ3VsYXJTZWdtZW50QWdhaW5zdFJvdXRlVXNpbmdSZWRpcmVjdChpbmplY3Rvciwgc2VnbWVudEdyb3VwLCByb3V0ZXMsIHJvdXRlLCBzZWdtZW50cywgb3V0bGV0KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5leHBhbmRXaWxkQ2FyZFdpdGhQYXJhbXNBZ2FpbnN0Um91dGVVc2luZ1JlZGlyZWN0ID0gZnVuY3Rpb24gKGluamVjdG9yLCByb3V0ZXMsIHJvdXRlLCBvdXRsZXQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5ld1RyZWUgPSB0aGlzLmFwcGx5UmVkaXJlY3RDb21tYW5kcyhbXSwgcm91dGUucmVkaXJlY3RUbywge30pO1xuICAgICAgICAgIGlmIChyb3V0ZS5yZWRpcmVjdFRvLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVSZWRpcmVjdChuZXdUcmVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21lcmdlTWFwLm1lcmdlTWFwLmNhbGwodGhpcy5saW5lcmFsaXplU2VnbWVudHMocm91dGUsIG5ld1RyZWUpLCBmdW5jdGlvbiAobmV3U2VnbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGdyb3VwID0gbmV3IFVybFNlZ21lbnRHcm91cChuZXdTZWdtZW50cywge30pO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmV4cGFuZFNlZ21lbnQoaW5qZWN0b3IsIGdyb3VwLCByb3V0ZXMsIG5ld1NlZ21lbnRzLCBvdXRsZXQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmV4cGFuZFJlZ3VsYXJTZWdtZW50QWdhaW5zdFJvdXRlVXNpbmdSZWRpcmVjdCA9IGZ1bmN0aW9uIChpbmplY3Rvciwgc2VnbWVudEdyb3VwLCByb3V0ZXMsIHJvdXRlLCBzZWdtZW50cywgb3V0bGV0KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgX2EgPSBtYXRjaChzZWdtZW50R3JvdXAsIHJvdXRlLCBzZWdtZW50cyksIG1hdGNoZWQgPSBfYS5tYXRjaGVkLCBjb25zdW1lZFNlZ21lbnRzID0gX2EuY29uc3VtZWRTZWdtZW50cywgbGFzdENoaWxkID0gX2EubGFzdENoaWxkLCBwb3NpdGlvbmFsUGFyYW1TZWdtZW50cyA9IF9hLnBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzO1xuICAgICAgICAgIGlmICghbWF0Y2hlZClcbiAgICAgICAgICAgICAgcmV0dXJuIG5vTWF0Y2goc2VnbWVudEdyb3VwKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdUcmVlID0gdGhpcy5hcHBseVJlZGlyZWN0Q29tbWFuZHMoY29uc3VtZWRTZWdtZW50cywgcm91dGUucmVkaXJlY3RUbywgLyoqIEB0eXBlIHs/fSAqLyAocG9zaXRpb25hbFBhcmFtU2VnbWVudHMpKTtcbiAgICAgICAgICBpZiAocm91dGUucmVkaXJlY3RUby5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFic29sdXRlUmVkaXJlY3QobmV3VHJlZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKHRoaXMubGluZXJhbGl6ZVNlZ21lbnRzKHJvdXRlLCBuZXdUcmVlKSwgZnVuY3Rpb24gKG5ld1NlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuZXhwYW5kU2VnbWVudChpbmplY3Rvciwgc2VnbWVudEdyb3VwLCByb3V0ZXMsIG5ld1NlZ21lbnRzLmNvbmNhdChzZWdtZW50cy5zbGljZShsYXN0Q2hpbGQpKSwgb3V0bGV0LCBmYWxzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gcmF3U2VnbWVudEdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcHBseVJlZGlyZWN0cy5wcm90b3R5cGUubWF0Y2hTZWdtZW50QWdhaW5zdFJvdXRlID0gZnVuY3Rpb24gKGluamVjdG9yLCByYXdTZWdtZW50R3JvdXAsIHJvdXRlLCBzZWdtZW50cykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKHJvdXRlLnBhdGggPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgaWYgKHJvdXRlLmxvYWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfbWFwLm1hcC5jYWxsKHRoaXMuY29uZmlnTG9hZGVyLmxvYWQoaW5qZWN0b3IsIHJvdXRlLmxvYWRDaGlsZHJlbiksIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgKChyb3V0ZSkpLl9sb2FkZWRDb25maWcgPSByO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YobmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50cywge30pKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihuZXcgVXJsU2VnbWVudEdyb3VwKHNlZ21lbnRzLCB7fSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgX2EgPSBtYXRjaChyYXdTZWdtZW50R3JvdXAsIHJvdXRlLCBzZWdtZW50cyksIG1hdGNoZWQgPSBfYS5tYXRjaGVkLCBjb25zdW1lZFNlZ21lbnRzXzEgPSBfYS5jb25zdW1lZFNlZ21lbnRzLCBsYXN0Q2hpbGQgPSBfYS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgIGlmICghbWF0Y2hlZClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBub01hdGNoKHJhd1NlZ21lbnRHcm91cCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJhd1NsaWNlZFNlZ21lbnRzXzEgPSBzZWdtZW50cy5zbGljZShsYXN0Q2hpbGQpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZENvbmZpZyQgPSB0aGlzLmdldENoaWxkQ29uZmlnKGluamVjdG9yLCByb3V0ZSk7XG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21lcmdlTWFwLm1lcmdlTWFwLmNhbGwoY2hpbGRDb25maWckLCBmdW5jdGlvbiAocm91dGVyQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZEluamVjdG9yID0gcm91dGVyQ29uZmlnLmluamVjdG9yO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRDb25maWcgPSByb3V0ZXJDb25maWcucm91dGVzO1xuICAgICAgICAgICAgICAgICAgdmFyIF9hID0gc3BsaXQocmF3U2VnbWVudEdyb3VwLCBjb25zdW1lZFNlZ21lbnRzXzEsIHJhd1NsaWNlZFNlZ21lbnRzXzEsIGNoaWxkQ29uZmlnKSwgc2VnbWVudEdyb3VwID0gX2Euc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cyA9IF9hLnNsaWNlZFNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgaWYgKHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJiBzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cGFuZGVkJCA9IF90aGlzLmV4cGFuZENoaWxkcmVuKGNoaWxkSW5qZWN0b3IsIGNoaWxkQ29uZmlnLCBzZWdtZW50R3JvdXApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbChleHBhbmRlZCQsIGZ1bmN0aW9uIChjaGlsZHJlbikgeyByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChjb25zdW1lZFNlZ21lbnRzXzEsIGNoaWxkcmVuKTsgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGlsZENvbmZpZy5sZW5ndGggPT09IDAgJiYgc2xpY2VkU2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihuZXcgVXJsU2VnbWVudEdyb3VwKGNvbnN1bWVkU2VnbWVudHNfMSwge30pKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGV4cGFuZGVkJCA9IF90aGlzLmV4cGFuZFNlZ21lbnQoY2hpbGRJbmplY3Rvciwgc2VnbWVudEdyb3VwLCBjaGlsZENvbmZpZywgc2xpY2VkU2VnbWVudHMsIFBSSU1BUllfT1VUTEVULCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwoZXhwYW5kZWQkLCBmdW5jdGlvbiAoY3MpIHsgcmV0dXJuIG5ldyBVcmxTZWdtZW50R3JvdXAoY29uc3VtZWRTZWdtZW50c18xLmNvbmNhdChjcy5zZWdtZW50cyksIGNzLmNoaWxkcmVuKTsgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5nZXRDaGlsZENvbmZpZyA9IGZ1bmN0aW9uIChpbmplY3Rvciwgcm91dGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vYnNlcnZhYmxlX29mLm9mKG5ldyBMb2FkZWRSb3V0ZXJDb25maWcocm91dGUuY2hpbGRyZW4sIGluamVjdG9yLCBudWxsLCBudWxsKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHJvdXRlLmxvYWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKHJ1bkd1YXJkcyhpbmplY3Rvciwgcm91dGUpLCBmdW5jdGlvbiAoc2hvdWxkTG9hZCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZExvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoKChyb3V0ZSkpLl9sb2FkZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZigoKHJvdXRlKSkuX2xvYWRlZENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwoX3RoaXMuY29uZmlnTG9hZGVyLmxvYWQoaW5qZWN0b3IsIHJvdXRlLmxvYWRDaGlsZHJlbiksIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJvdXRlKSkuX2xvYWRlZENvbmZpZyA9IHI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbkxvYWRGYWlscyhyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihuZXcgTG9hZGVkUm91dGVyQ29uZmlnKFtdLCBpbmplY3RvciwgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsVHJlZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmxpbmVyYWxpemVTZWdtZW50cyA9IGZ1bmN0aW9uIChyb3V0ZSwgdXJsVHJlZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IFtdO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGMgPSB1cmxUcmVlLnJvb3Q7XG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChjLnNlZ21lbnRzKTtcbiAgICAgICAgICAgICAgaWYgKGMubnVtYmVyT2ZDaGlsZHJlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihyZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGMubnVtYmVyT2ZDaGlsZHJlbiA+IDEgfHwgIWMuY2hpbGRyZW5bUFJJTUFSWV9PVVRMRVRdKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRPdXRsZXRzUmVkaXJlY3Qocm91dGUucmVkaXJlY3RUbyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjID0gYy5jaGlsZHJlbltQUklNQVJZX09VVExFVF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IHJlZGlyZWN0VG9cbiAgICAgICAqIEBwYXJhbSB7P30gcG9zUGFyYW1zXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcHBseVJlZGlyZWN0cy5wcm90b3R5cGUuYXBwbHlSZWRpcmVjdENvbW1hbmRzID0gZnVuY3Rpb24gKHNlZ21lbnRzLCByZWRpcmVjdFRvLCBwb3NQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0ID0gdGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHJlZGlyZWN0VG8pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5UmVkaXJlY3RDcmVhdHJlVXJsVHJlZShyZWRpcmVjdFRvLCB0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UocmVkaXJlY3RUbyksIHNlZ21lbnRzLCBwb3NQYXJhbXMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvXG4gICAgICAgKiBAcGFyYW0gez99IHVybFRyZWVcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gcG9zUGFyYW1zXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBcHBseVJlZGlyZWN0cy5wcm90b3R5cGUuYXBwbHlSZWRpcmVjdENyZWF0cmVVcmxUcmVlID0gZnVuY3Rpb24gKHJlZGlyZWN0VG8sIHVybFRyZWUsIHNlZ21lbnRzLCBwb3NQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXdSb290ID0gdGhpcy5jcmVhdGVTZWdtZW50R3JvdXAocmVkaXJlY3RUbywgdXJsVHJlZS5yb290LCBzZWdtZW50cywgcG9zUGFyYW1zKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFVybFRyZWUobmV3Um9vdCwgdGhpcy5jcmVhdGVRdWVyeVBhcmFtcyh1cmxUcmVlLnF1ZXJ5UGFyYW1zLCB0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMpLCB1cmxUcmVlLmZyYWdtZW50KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVkaXJlY3RUb1BhcmFtc1xuICAgICAgICogQHBhcmFtIHs/fSBhY3R1YWxQYXJhbXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5jcmVhdGVRdWVyeVBhcmFtcyA9IGZ1bmN0aW9uIChyZWRpcmVjdFRvUGFyYW1zLCBhY3R1YWxQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgICAgICBmb3JFYWNoKHJlZGlyZWN0VG9QYXJhbXMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgIGlmICh2LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgICAgICAgcmVzW2tdID0gYWN0dWFsUGFyYW1zW3Yuc3Vic3RyaW5nKDEpXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJlc1trXSA9IHY7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvXG4gICAgICAgKiBAcGFyYW0gez99IGdyb3VwXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IHBvc1BhcmFtc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmNyZWF0ZVNlZ21lbnRHcm91cCA9IGZ1bmN0aW9uIChyZWRpcmVjdFRvLCBncm91cCwgc2VnbWVudHMsIHBvc1BhcmFtcykge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXBkYXRlZFNlZ21lbnRzID0gdGhpcy5jcmVhdGVTZWdtZW50cyhyZWRpcmVjdFRvLCBncm91cC5zZWdtZW50cywgc2VnbWVudHMsIHBvc1BhcmFtcyk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSB7fTtcbiAgICAgICAgICBmb3JFYWNoKGdyb3VwLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIG5hbWUpIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5bbmFtZV0gPSBfdGhpcy5jcmVhdGVTZWdtZW50R3JvdXAocmVkaXJlY3RUbywgY2hpbGQsIHNlZ21lbnRzLCBwb3NQYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgVXJsU2VnbWVudEdyb3VwKHVwZGF0ZWRTZWdtZW50cywgY2hpbGRyZW4pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvXG4gICAgICAgKiBAcGFyYW0gez99IHJlZGlyZWN0VG9TZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBhY3R1YWxTZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBwb3NQYXJhbXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5jcmVhdGVTZWdtZW50cyA9IGZ1bmN0aW9uIChyZWRpcmVjdFRvLCByZWRpcmVjdFRvU2VnbWVudHMsIGFjdHVhbFNlZ21lbnRzLCBwb3NQYXJhbXMpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiByZWRpcmVjdFRvU2VnbWVudHMubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnBhdGguc3RhcnRzV2l0aCgnOicpID8gX3RoaXMuZmluZFBvc1BhcmFtKHJlZGlyZWN0VG8sIHMsIHBvc1BhcmFtcykgOlxuICAgICAgICAgICAgICBfdGhpcy5maW5kT3JSZXR1cm4ocywgYWN0dWFsU2VnbWVudHMpOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcmVkaXJlY3RUb1xuICAgICAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvVXJsU2VnbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBwb3NQYXJhbXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFwcGx5UmVkaXJlY3RzLnByb3RvdHlwZS5maW5kUG9zUGFyYW0gPSBmdW5jdGlvbiAocmVkaXJlY3RUbywgcmVkaXJlY3RUb1VybFNlZ21lbnQsIHBvc1BhcmFtcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBvcyA9IHBvc1BhcmFtc1tyZWRpcmVjdFRvVXJsU2VnbWVudC5wYXRoLnN1YnN0cmluZygxKV07XG4gICAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWRpcmVjdCB0byAnXCIgKyByZWRpcmVjdFRvICsgXCInLiBDYW5ub3QgZmluZCAnXCIgKyByZWRpcmVjdFRvVXJsU2VnbWVudC5wYXRoICsgXCInLlwiKTtcbiAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWRpcmVjdFRvVXJsU2VnbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBhY3R1YWxTZWdtZW50c1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQXBwbHlSZWRpcmVjdHMucHJvdG90eXBlLmZpbmRPclJldHVybiA9IGZ1bmN0aW9uIChyZWRpcmVjdFRvVXJsU2VnbWVudCwgYWN0dWFsU2VnbWVudHMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZHggPSAwO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgYWN0dWFsU2VnbWVudHNfMSA9IGFjdHVhbFNlZ21lbnRzOyBfaSA8IGFjdHVhbFNlZ21lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBzID0gYWN0dWFsU2VnbWVudHNfMVtfaV07XG4gICAgICAgICAgICAgIGlmIChzLnBhdGggPT09IHJlZGlyZWN0VG9VcmxTZWdtZW50LnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIGFjdHVhbFNlZ21lbnRzLnNwbGljZShpZHgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWRpcmVjdFRvVXJsU2VnbWVudDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQXBwbHlSZWRpcmVjdHM7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGluamVjdG9yXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHJ1bkd1YXJkcyhpbmplY3Rvciwgcm91dGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhbkxvYWQgPSByb3V0ZS5jYW5Mb2FkO1xuICAgICAgaWYgKCFjYW5Mb2FkIHx8IGNhbkxvYWQubGVuZ3RoID09PSAwKVxuICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YodHJ1ZSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvYnMgPSByeGpzX29wZXJhdG9yX21hcC5tYXAuY2FsbChyeGpzX29ic2VydmFibGVfZnJvbS5mcm9tKGNhbkxvYWQpLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGd1YXJkID0gaW5qZWN0b3IuZ2V0KGMpO1xuICAgICAgICAgIGlmIChndWFyZC5jYW5Mb2FkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB3cmFwSW50b09ic2VydmFibGUoZ3VhcmQuY2FuTG9hZChyb3V0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdyYXBJbnRvT2JzZXJ2YWJsZShndWFyZChyb3V0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFuZE9ic2VydmFibGVzKG9icyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2goc2VnbWVudEdyb3VwLCByb3V0ZSwgc2VnbWVudHMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5vTWF0Y2ggPSB7IG1hdGNoZWQ6IGZhbHNlLCBjb25zdW1lZFNlZ21lbnRzOiAvKiogQHR5cGUgez99ICovIChbXSksIGxhc3RDaGlsZDogMCwgcG9zaXRpb25hbFBhcmFtU2VnbWVudHM6IHt9IH07XG4gICAgICBpZiAocm91dGUucGF0aCA9PT0gJycpIHtcbiAgICAgICAgICBpZiAoKHJvdXRlLnBhdGhNYXRjaCA9PT0gJ2Z1bGwnKSAmJiAoc2VnbWVudEdyb3VwLmhhc0NoaWxkcmVuKCkgfHwgc2VnbWVudHMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogZmFsc2UsIGNvbnN1bWVkU2VnbWVudHM6IFtdLCBsYXN0Q2hpbGQ6IDAsIHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOiB7fSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hlZDogdHJ1ZSwgY29uc3VtZWRTZWdtZW50czogW10sIGxhc3RDaGlsZDogMCwgcG9zaXRpb25hbFBhcmFtU2VnbWVudHM6IHt9IH07XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbWF0Y2hlciA9IHJvdXRlLm1hdGNoZXIgfHwgZGVmYXVsdFVybE1hdGNoZXI7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSBtYXRjaGVyKHNlZ21lbnRzLCBzZWdtZW50R3JvdXAsIHJvdXRlKTtcbiAgICAgIGlmICghcmVzKVxuICAgICAgICAgIHJldHVybiBub01hdGNoO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXRjaGVkOiB0cnVlLFxuICAgICAgICAgIGNvbnN1bWVkU2VnbWVudHM6IHJlcy5jb25zdW1lZCxcbiAgICAgICAgICBsYXN0Q2hpbGQ6IHJlcy5jb25zdW1lZC5sZW5ndGgsXG4gICAgICAgICAgcG9zaXRpb25hbFBhcmFtU2VnbWVudHM6IHJlcy5wb3NQYXJhbXNcbiAgICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gY29uc3VtZWRTZWdtZW50c1xuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdChzZWdtZW50R3JvdXAsIGNvbnN1bWVkU2VnbWVudHMsIHNsaWNlZFNlZ21lbnRzLCBjb25maWcpIHtcbiAgICAgIGlmIChzbGljZWRTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgY29udGFpbnNFbXB0eVBhdGhSZWRpcmVjdHNXaXRoTmFtZWRPdXRsZXRzKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIGNvbmZpZykpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gbmV3IFVybFNlZ21lbnRHcm91cChjb25zdW1lZFNlZ21lbnRzLCBjcmVhdGVDaGlsZHJlbkZvckVtcHR5U2VnbWVudHMoY29uZmlnLCBuZXcgVXJsU2VnbWVudEdyb3VwKHNsaWNlZFNlZ21lbnRzLCBzZWdtZW50R3JvdXAuY2hpbGRyZW4pKSk7XG4gICAgICAgICAgcmV0dXJuIHsgc2VnbWVudEdyb3VwOiBtZXJnZVRyaXZpYWxDaGlsZHJlbihzKSwgc2xpY2VkU2VnbWVudHM6IFtdIH07XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzbGljZWRTZWdtZW50cy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICBjb250YWluc0VtcHR5UGF0aFJlZGlyZWN0cyhzZWdtZW50R3JvdXAsIHNsaWNlZFNlZ21lbnRzLCBjb25maWcpKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IG5ldyBVcmxTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLnNlZ21lbnRzLCBhZGRFbXB0eVNlZ21lbnRzVG9DaGlsZHJlbklmTmVlZGVkKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIGNvbmZpZywgc2VnbWVudEdyb3VwLmNoaWxkcmVuKSk7XG4gICAgICAgICAgcmV0dXJuIHsgc2VnbWVudEdyb3VwOiBtZXJnZVRyaXZpYWxDaGlsZHJlbihzKSwgc2xpY2VkU2VnbWVudHM6IHNsaWNlZFNlZ21lbnRzIH07XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBzZWdtZW50R3JvdXA6IHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHM6IHNsaWNlZFNlZ21lbnRzIH07XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VUcml2aWFsQ2hpbGRyZW4ocykge1xuICAgICAgaWYgKHMubnVtYmVyT2ZDaGlsZHJlbiA9PT0gMSAmJiBzLmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGMgPSBzLmNoaWxkcmVuW1BSSU1BUllfT1VUTEVUXTtcbiAgICAgICAgICByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChzLnNlZ21lbnRzLmNvbmNhdChjLnNlZ21lbnRzKSwgYy5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcztcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICogQHBhcmFtIHs/fSBzbGljZWRTZWdtZW50c1xuICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgKiBAcGFyYW0gez99IGNoaWxkcmVuXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFbXB0eVNlZ21lbnRzVG9DaGlsZHJlbklmTmVlZGVkKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHJvdXRlcywgY2hpbGRyZW4pIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IHt9O1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCByb3V0ZXNfMSA9IHJvdXRlczsgX2kgPCByb3V0ZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgciA9IHJvdXRlc18xW19pXTtcbiAgICAgICAgICBpZiAoZW1wdHlQYXRoUmVkaXJlY3Qoc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcikgJiYgIWNoaWxkcmVuW2dldE91dGxldCQxKHIpXSkge1xuICAgICAgICAgICAgICByZXNbZ2V0T3V0bGV0JDEocildID0gbmV3IFVybFNlZ21lbnRHcm91cChbXSwge30pO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXJnZShjaGlsZHJlbiwgcmVzKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICogQHBhcmFtIHs/fSBwcmltYXJ5U2VnbWVudEdyb3VwXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbkZvckVtcHR5U2VnbWVudHMocm91dGVzLCBwcmltYXJ5U2VnbWVudEdyb3VwKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgIHJlc1tQUklNQVJZX09VVExFVF0gPSBwcmltYXJ5U2VnbWVudEdyb3VwO1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCByb3V0ZXNfMiA9IHJvdXRlczsgX2kgPCByb3V0ZXNfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgciA9IHJvdXRlc18yW19pXTtcbiAgICAgICAgICBpZiAoci5wYXRoID09PSAnJyAmJiBnZXRPdXRsZXQkMShyKSAhPT0gUFJJTUFSWV9PVVRMRVQpIHtcbiAgICAgICAgICAgICAgcmVzW2dldE91dGxldCQxKHIpXSA9IG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb250YWluc0VtcHR5UGF0aFJlZGlyZWN0c1dpdGhOYW1lZE91dGxldHMoc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcm91dGVzKSB7XG4gICAgICByZXR1cm4gcm91dGVzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gZW1wdHlQYXRoUmVkaXJlY3Qoc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcikgJiZcbiAgICAgICAgICBnZXRPdXRsZXQkMShyKSAhPT0gUFJJTUFSWV9PVVRMRVQ7IH0pXG4gICAgICAgICAgLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gc2xpY2VkU2VnbWVudHNcbiAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnRhaW5zRW1wdHlQYXRoUmVkaXJlY3RzKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHJvdXRlcykge1xuICAgICAgcmV0dXJuIHJvdXRlcy5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIGVtcHR5UGF0aFJlZGlyZWN0KHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHIpOyB9KS5sZW5ndGggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZW1wdHlQYXRoUmVkaXJlY3Qoc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcikge1xuICAgICAgaWYgKChzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSB8fCBzbGljZWRTZWdtZW50cy5sZW5ndGggPiAwKSAmJiByLnBhdGhNYXRjaCA9PT0gJ2Z1bGwnKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByLnBhdGggPT09ICcnICYmIHIucmVkaXJlY3RUbyAhPT0gdW5kZWZpbmVkO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRPdXRsZXQkMShyb3V0ZSkge1xuICAgICAgcmV0dXJuIHJvdXRlLm91dGxldCA/IHJvdXRlLm91dGxldCA6IFBSSU1BUllfT1VUTEVUO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEBwYXJhbSB7Pz19IHBhcmVudFBhdGhcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnKGNvbmZpZywgcGFyZW50UGF0aCkge1xuICAgICAgaWYgKHBhcmVudFBhdGggPT09IHZvaWQgMCkgeyBwYXJlbnRQYXRoID0gJyc7IH1cbiAgICAgIC8vIGZvckVhY2ggZG9lc24ndCBpdGVyYXRlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7IGkgPCBjb25maWcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb3V0ZSA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKHBhcmVudFBhdGgsIHJvdXRlKTtcbiAgICAgICAgICB2YWxpZGF0ZU5vZGUocm91dGUsIGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgKiBAcGFyYW0gez99IGZ1bGxQYXRoXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZU5vZGUocm91dGUsIGZ1bGxQYXRoKSB7XG4gICAgICBpZiAoIXJvdXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXFxuICAgICAgSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICdcIiArIGZ1bGxQYXRoICsgXCInOiBFbmNvdW50ZXJlZCB1bmRlZmluZWQgcm91dGUuXFxuICAgICAgVGhlIHJlYXNvbiBtaWdodCBiZSBhbiBleHRyYSBjb21tYS5cXG4gICAgICAgXFxuICAgICAgRXhhbXBsZTogXFxuICAgICAgY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXFxuICAgICAgICB7IHBhdGg6ICcnLCByZWRpcmVjdFRvOiAnL2Rhc2hib2FyZCcsIHBhdGhNYXRjaDogJ2Z1bGwnIH0sXFxuICAgICAgICB7IHBhdGg6ICdkYXNoYm9hcmQnLCAgY29tcG9uZW50OiBEYXNoYm9hcmRDb21wb25lbnQgfSwsIDw8IHR3byBjb21tYXNcXG4gICAgICAgIHsgcGF0aDogJ2RldGFpbC86aWQnLCBjb21wb25lbnQ6IEhlcm9EZXRhaWxDb21wb25lbnQgfVxcbiAgICAgIF07XFxuICAgIFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvdXRlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnXCIgKyBmdWxsUGF0aCArIFwiJzogQXJyYXkgY2Fubm90IGJlIHNwZWNpZmllZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUuY29tcG9uZW50ICYmIChyb3V0ZS5vdXRsZXQgJiYgcm91dGUub3V0bGV0ICE9PSBQUklNQVJZX09VVExFVCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IGEgY29tcG9uZW50bGVzcyByb3V0ZSBjYW5ub3QgaGF2ZSBhIG5hbWVkIG91dGxldCBzZXRcIik7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUucmVkaXJlY3RUbyAmJiByb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnXCIgKyBmdWxsUGF0aCArIFwiJzogcmVkaXJlY3RUbyBhbmQgY2hpbGRyZW4gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUucmVkaXJlY3RUbyAmJiByb3V0ZS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IHJlZGlyZWN0VG8gYW5kIGxvYWRDaGlsZHJlbiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbiAmJiByb3V0ZS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IGNoaWxkcmVuIGFuZCBsb2FkQ2hpbGRyZW4gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUucmVkaXJlY3RUbyAmJiByb3V0ZS5jb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IHJlZGlyZWN0VG8gYW5kIGNvbXBvbmVudCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5wYXRoICYmIHJvdXRlLm1hdGNoZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IHBhdGggYW5kIG1hdGNoZXIgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUucmVkaXJlY3RUbyA9PT0gdm9pZCAwICYmICFyb3V0ZS5jb21wb25lbnQgJiYgIXJvdXRlLmNoaWxkcmVuICYmICFyb3V0ZS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIicuIE9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgcHJvdmlkZWQ6IGNvbXBvbmVudCwgcmVkaXJlY3RUbywgY2hpbGRyZW4gb3IgbG9hZENoaWxkcmVuXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGggPT09IHZvaWQgMCAmJiByb3V0ZS5tYXRjaGVyID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IHJvdXRlcyBtdXN0IGhhdmUgZWl0aGVyIGEgcGF0aCBvciBhIG1hdGNoZXIgc3BlY2lmaWVkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByb3V0ZS5wYXRoID09PSAnc3RyaW5nJyAmJiByb3V0ZS5wYXRoLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICdcIiArIGZ1bGxQYXRoICsgXCInOiBwYXRoIGNhbm5vdCBzdGFydCB3aXRoIGEgc2xhc2hcIik7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUucGF0aCA9PT0gJycgJiYgcm91dGUucmVkaXJlY3RUbyAhPT0gdm9pZCAwICYmIHJvdXRlLnBhdGhNYXRjaCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXhwID0gXCJUaGUgZGVmYXVsdCB2YWx1ZSBvZiAncGF0aE1hdGNoJyBpcyAncHJlZml4JywgYnV0IG9mdGVuIHRoZSBpbnRlbnQgaXMgdG8gdXNlICdmdWxsJy5cIjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ3twYXRoOiBcXFwiXCIgKyBmdWxsUGF0aCArIFwiXFxcIiwgcmVkaXJlY3RUbzogXFxcIlwiICsgcm91dGUucmVkaXJlY3RUbyArIFwiXFxcIn0nOiBwbGVhc2UgcHJvdmlkZSAncGF0aE1hdGNoJy4gXCIgKyBleHApO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGhNYXRjaCAhPT0gdm9pZCAwICYmIHJvdXRlLnBhdGhNYXRjaCAhPT0gJ2Z1bGwnICYmIHJvdXRlLnBhdGhNYXRjaCAhPT0gJ3ByZWZpeCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJ1wiICsgZnVsbFBhdGggKyBcIic6IHBhdGhNYXRjaCBjYW4gb25seSBiZSBzZXQgdG8gJ3ByZWZpeCcgb3IgJ2Z1bGwnXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb25maWcocm91dGUuY2hpbGRyZW4sIGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBwYXJlbnRQYXRoXG4gICAqIEBwYXJhbSB7P30gY3VycmVudFJvdXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRGdWxsUGF0aChwYXJlbnRQYXRoLCBjdXJyZW50Um91dGUpIHtcbiAgICAgIGlmICghY3VycmVudFJvdXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcmVudFBhdGg7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmVudFBhdGggJiYgIWN1cnJlbnRSb3V0ZS5wYXRoKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAocGFyZW50UGF0aCAmJiAhY3VycmVudFJvdXRlLnBhdGgpIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50UGF0aCArIFwiL1wiO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIXBhcmVudFBhdGggJiYgY3VycmVudFJvdXRlLnBhdGgpIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVudFJvdXRlLnBhdGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50UGF0aCArIFwiL1wiICsgY3VycmVudFJvdXRlLnBhdGg7XG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGxpY2Vuc2UgdW5kZWZpbmVkXG4gICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAqICpcbiAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICB2YXIgVHJlZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm9vdFxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUcmVlKHJvb3QpIHtcbiAgICAgICAgICB0aGlzLl9yb290ID0gcm9vdDtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmVlLnByb3RvdHlwZSwgXCJyb290XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm9vdC52YWx1ZTsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJlZS5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwID0gdGhpcy5wYXRoRnJvbVJvb3QodCk7XG4gICAgICAgICAgcmV0dXJuIHAubGVuZ3RoID4gMSA/IHBbcC5sZW5ndGggLSAyXSA6IG51bGw7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFRyZWUucHJvdG90eXBlLmNoaWxkcmVuID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuID0gZmluZE5vZGUodCwgdGhpcy5fcm9vdCk7XG4gICAgICAgICAgcmV0dXJuIG4gPyBuLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gdC52YWx1ZTsgfSkgOiBbXTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJlZS5wcm90b3R5cGUuZmlyc3RDaGlsZCA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbiA9IGZpbmROb2RlKHQsIHRoaXMuX3Jvb3QpO1xuICAgICAgICAgIHJldHVybiBuICYmIG4uY2hpbGRyZW4ubGVuZ3RoID4gMCA/IG4uY2hpbGRyZW5bMF0udmFsdWUgOiBudWxsO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmVlLnByb3RvdHlwZS5zaWJsaW5ncyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IGZpbmRQYXRoKHQsIHRoaXMuX3Jvb3QsIFtdKTtcbiAgICAgICAgICBpZiAocC5sZW5ndGggPCAyKVxuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYyA9IHBbcC5sZW5ndGggLSAyXS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMudmFsdWU7IH0pO1xuICAgICAgICAgIHJldHVybiBjLmZpbHRlcihmdW5jdGlvbiAoY2MpIHsgcmV0dXJuIGNjICE9PSB0OyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgVHJlZS5wcm90b3R5cGUucGF0aEZyb21Sb290ID0gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIGZpbmRQYXRoKHQsIHRoaXMuX3Jvb3QsIFtdKS5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMudmFsdWU7IH0pOyB9O1xuICAgICAgcmV0dXJuIFRyZWU7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7P30gY1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZE5vZGUoZXhwZWN0ZWQsIGMpIHtcbiAgICAgIGlmIChleHBlY3RlZCA9PT0gYy52YWx1ZSlcbiAgICAgICAgICByZXR1cm4gYztcbiAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjLmNoaWxkcmVuOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBjYyA9IF9hW19pXTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByID0gZmluZE5vZGUoZXhwZWN0ZWQsIGNjKTtcbiAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBleHBlY3RlZFxuICAgKiBAcGFyYW0gez99IGNcbiAgICogQHBhcmFtIHs/fSBjb2xsZWN0ZWRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRQYXRoKGV4cGVjdGVkLCBjLCBjb2xsZWN0ZWQpIHtcbiAgICAgIGNvbGxlY3RlZC5wdXNoKGMpO1xuICAgICAgaWYgKGV4cGVjdGVkID09PSBjLnZhbHVlKVxuICAgICAgICAgIHJldHVybiBjb2xsZWN0ZWQ7XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gYy5jaGlsZHJlbjsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgY2MgPSBfYVtfaV07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xvbmVkID0gY29sbGVjdGVkLnNsaWNlKDApO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHIgPSBmaW5kUGF0aChleHBlY3RlZCwgY2MsIGNsb25lZCk7XG4gICAgICAgICAgaWYgKHIubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIFRyZWVOb2RlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZVxuICAgICAgICogQHBhcmFtIHs/fSBjaGlsZHJlblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBUcmVlTm9kZSh2YWx1ZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBUcmVlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIlRyZWVOb2RlKFwiICsgdGhpcy52YWx1ZSArIFwiKVwiOyB9O1xuICAgICAgcmV0dXJuIFRyZWVOb2RlO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgdmFyIF9fZXh0ZW5kcyQxID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xuICAvKipcbiAgICogICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICogY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAqIGNvbnN0IHN0YXRlOiBSb3V0ZXJTdGF0ZSA9IHJvdXRlci5yb3V0ZXJTdGF0ZTtcbiAgICAqIGNvbnN0IHJvb3Q6IEFjdGl2YXRlZFJvdXRlID0gc3RhdGUucm9vdDtcbiAgICAqIGNvbnN0IGNoaWxkID0gcm9vdC5maXJzdENoaWxkO1xuICAgICogY29uc3QgaWQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IGNoaWxkLnBhcmFtcy5tYXAocCA9PiBwLmlkKTtcbiAgICAqIC8vLi4uXG4gICAgKiB9XG4gICAgKiB9XG4gICAgKiBgYGBcbiAgICAqICpcbiAgICAqIFJvdXRlclN0YXRlIGlzIGEgdHJlZSBvZiBhY3RpdmF0ZWQgcm91dGVzLiBFdmVyeSBub2RlIGluIHRoaXMgdHJlZSBrbm93cyBhYm91dCB0aGUgXCJjb25zdW1lZFwiIFVSTFxuICAgICogc2VnbWVudHMsXG4gICAgKiB0aGUgZXh0cmFjdGVkIHBhcmFtZXRlcnMsIGFuZCB0aGUgcmVzb2x2ZWQgZGF0YS5cbiAgICAqICpcbiAgICAqIFNlZSB7QGxpbmsgQWN0aXZhdGVkUm91dGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICogKlxuICAgKi9cbiAgdmFyIFJvdXRlclN0YXRlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyQxKFJvdXRlclN0YXRlLCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvb3RcbiAgICAgICAqIEBwYXJhbSB7P30gc25hcHNob3RcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUm91dGVyU3RhdGUocm9vdCwgc25hcHNob3QpIHtcbiAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCByb290KTtcbiAgICAgICAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7XG4gICAgICAgICAgc2V0Um91dGVyU3RhdGVTbmFwc2hvdCh0aGlzLCByb290KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyU3RhdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zbmFwc2hvdC50b1N0cmluZygpOyB9O1xuICAgICAgcmV0dXJuIFJvdXRlclN0YXRlO1xuICB9KFRyZWUpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gdXJsVHJlZVxuICAgKiBAcGFyYW0gez99IHJvb3RDb21wb25lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUVtcHR5U3RhdGUodXJsVHJlZSwgcm9vdENvbXBvbmVudCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc25hcHNob3QgPSBjcmVhdGVFbXB0eVN0YXRlU25hcHNob3QodXJsVHJlZSwgcm9vdENvbXBvbmVudCk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbXB0eVVybCA9IG5ldyByeGpzX0JlaGF2aW9yU3ViamVjdC5CZWhhdmlvclN1YmplY3QoW25ldyBVcmxTZWdtZW50KCcnLCB7fSldKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVtcHR5UGFyYW1zID0gbmV3IHJ4anNfQmVoYXZpb3JTdWJqZWN0LkJlaGF2aW9yU3ViamVjdCh7fSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbXB0eURhdGEgPSBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVtcHR5UXVlcnlQYXJhbXMgPSBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZyYWdtZW50ID0gbmV3IHJ4anNfQmVoYXZpb3JTdWJqZWN0LkJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhY3RpdmF0ZWQgPSBuZXcgQWN0aXZhdGVkUm91dGUoZW1wdHlVcmwsIGVtcHR5UGFyYW1zLCBlbXB0eVF1ZXJ5UGFyYW1zLCBmcmFnbWVudCwgZW1wdHlEYXRhLCBQUklNQVJZX09VVExFVCwgcm9vdENvbXBvbmVudCwgc25hcHNob3Qucm9vdCk7XG4gICAgICBhY3RpdmF0ZWQuc25hcHNob3QgPSBzbmFwc2hvdC5yb290O1xuICAgICAgcmV0dXJuIG5ldyBSb3V0ZXJTdGF0ZShuZXcgVHJlZU5vZGUoYWN0aXZhdGVkLCBbXSksIHNuYXBzaG90KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSB1cmxUcmVlXG4gICAqIEBwYXJhbSB7P30gcm9vdENvbXBvbmVudFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlRW1wdHlTdGF0ZVNuYXBzaG90KHVybFRyZWUsIHJvb3RDb21wb25lbnQpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVtcHR5UGFyYW1zID0ge307XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlbXB0eURhdGEgPSB7fTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGVtcHR5UXVlcnlQYXJhbXMgPSB7fTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZyYWdtZW50ID0gJyc7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBhY3RpdmF0ZWQgPSBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdChbXSwgZW1wdHlQYXJhbXMsIGVtcHR5UXVlcnlQYXJhbXMsIGZyYWdtZW50LCBlbXB0eURhdGEsIFBSSU1BUllfT1VUTEVULCByb290Q29tcG9uZW50LCBudWxsLCB1cmxUcmVlLnJvb3QsIC0xLCB7fSk7XG4gICAgICByZXR1cm4gbmV3IFJvdXRlclN0YXRlU25hcHNob3QoJycsIG5ldyBUcmVlTm9kZShhY3RpdmF0ZWQsIFtdKSk7XG4gIH1cbiAgLyoqXG4gICAqICBvdXRsZXQuXG4gICAgKiBBbiBgQWN0aXZhdGVkUm91dGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIHJvdXRlciBzdGF0ZSB0cmVlLlxuICAgICogKlxuICAgICogKlxuICAgICogYGBgXG4gICAgKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gICAgKiBjb25zdHJ1Y3Rvcihyb3V0ZTogQWN0aXZhdGVkUm91dGUpIHtcbiAgICAqIGNvbnN0IGlkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSByb3V0ZS5wYXJhbXMubWFwKHAgPT4gcC5pZCk7XG4gICAgKiBjb25zdCB1cmw6IE9ic2VydmFibGU8c3RyaW5nPiA9IHJvdXRlLnVybC5tYXAoc2VnbWVudHMgPT4gc2VnbWVudHMuam9pbignJykpO1xuICAgICogLy8gcm91dGUuZGF0YSBpbmNsdWRlcyBib3RoIGBkYXRhYCBhbmQgYHJlc29sdmVgXG4gICAgKiBjb25zdCB1c2VyID0gcm91dGUuZGF0YS5tYXAoZCA9PiBkLnVzZXIpO1xuICAgICogfVxuICAgICogfVxuICAgICogYGBgXG4gICAgKiAqXG4gICAqL1xuICB2YXIgQWN0aXZhdGVkUm91dGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXNcbiAgICAgICAqIEBwYXJhbSB7P30gZnJhZ21lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gZGF0YVxuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZVNuYXBzaG90XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIEFjdGl2YXRlZFJvdXRlKHVybCwgcGFyYW1zLCBxdWVyeVBhcmFtcywgZnJhZ21lbnQsIGRhdGEsIG91dGxldCwgY29tcG9uZW50LCBmdXR1cmVTbmFwc2hvdCkge1xuICAgICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtcztcbiAgICAgICAgICB0aGlzLmZyYWdtZW50ID0gZnJhZ21lbnQ7XG4gICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgICB0aGlzLm91dGxldCA9IG91dGxldDtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgICB0aGlzLl9mdXR1cmVTbmFwc2hvdCA9IGZ1dHVyZVNuYXBzaG90O1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFjdGl2YXRlZFJvdXRlLnByb3RvdHlwZSwgXCJyb3V0ZUNvbmZpZ1wiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIFRoZSBjb25maWd1cmF0aW9uIHVzZWQgdG8gbWF0Y2ggdGhpcyByb3V0ZVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9mdXR1cmVTbmFwc2hvdC5yb3V0ZUNvbmZpZzsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGUucHJvdG90eXBlLCBcInJvb3RcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICBUaGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnJvb3Q7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFjdGl2YXRlZFJvdXRlLnByb3RvdHlwZSwgXCJwYXJlbnRcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICBUaGUgcGFyZW50IG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnBhcmVudCh0aGlzKTsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGUucHJvdG90eXBlLCBcImZpcnN0Q2hpbGRcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuZmlyc3RDaGlsZCh0aGlzKTsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGUucHJvdG90eXBlLCBcImNoaWxkcmVuXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgVGhlIGNoaWxkcmVuIG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLmNoaWxkcmVuKHRoaXMpOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBY3RpdmF0ZWRSb3V0ZS5wcm90b3R5cGUsIFwicGF0aEZyb21Sb290XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgdG8gdGhpcyByb3V0ZVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXRoRnJvbVJvb3QodGhpcyk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBY3RpdmF0ZWRSb3V0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3QgPyB0aGlzLnNuYXBzaG90LnRvU3RyaW5nKCkgOiBcIkZ1dHVyZShcIiArIHRoaXMuX2Z1dHVyZVNuYXBzaG90ICsgXCIpXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFjdGl2YXRlZFJvdXRlO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gaW5oZXJpdGVkUGFyYW1zRGF0YVJlc29sdmUocm91dGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGhUb1Jvb3QgPSByb3V0ZS5wYXRoRnJvbVJvb3Q7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmhlcnRpbmdTdGFydGluZ0Zyb20gPSBwYXRoVG9Sb290Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAoaW5oZXJ0aW5nU3RhcnRpbmdGcm9tID49IDEpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyZW50ID0gcGF0aFRvUm9vdFtpbmhlcnRpbmdTdGFydGluZ0Zyb21dO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmVudF8xID0gcGF0aFRvUm9vdFtpbmhlcnRpbmdTdGFydGluZ0Zyb20gLSAxXTtcbiAgICAgICAgICAvLyBjdXJyZW50IHJvdXRlIGlzIGFuIGVtcHR5IHBhdGggPT4gaW5oZXJpdHMgaXRzIHBhcmVudCdzIHBhcmFtcyBhbmQgZGF0YVxuICAgICAgICAgIGlmIChjdXJyZW50LnJvdXRlQ29uZmlnICYmIGN1cnJlbnQucm91dGVDb25maWcucGF0aCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgaW5oZXJ0aW5nU3RhcnRpbmdGcm9tLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFwYXJlbnRfMS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgaW5oZXJ0aW5nU3RhcnRpbmdGcm9tLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFRvUm9vdC5zbGljZShpbmhlcnRpbmdTdGFydGluZ0Zyb20pLnJlZHVjZShmdW5jdGlvbiAocmVzLCBjdXJyKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1zID0gbWVyZ2UocmVzLnBhcmFtcywgY3Vyci5wYXJhbXMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRhdGEgPSBtZXJnZShyZXMuZGF0YSwgY3Vyci5kYXRhKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNvbHZlID0gbWVyZ2UocmVzLnJlc29sdmUsIGN1cnIuX3Jlc29sdmVkRGF0YSk7XG4gICAgICAgICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMsIGRhdGE6IGRhdGEsIHJlc29sdmU6IHJlc29sdmUgfTtcbiAgICAgIH0sIC8qKiBAdHlwZSB7P30gKi8gKHsgcGFyYW1zOiB7fSwgZGF0YToge30sIHJlc29sdmU6IHt9IH0pKTtcbiAgfVxuICAvKipcbiAgICogIG91dGxldFxuICAgICogYXQgYSBwYXJ0aWN1bGFyIG1vbWVudCBpbiB0aW1lLiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IGNhbiBhbHNvIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIHJvdXRlclxuICAgICogc3RhdGUgdHJlZS5cbiAgICAqICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICogY29uc3RydWN0b3Iocm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgKiBjb25zdCBpZDogc3RyaW5nID0gcm91dGUuc25hcHNob3QucGFyYW1zLmlkO1xuICAgICogY29uc3QgdXJsOiBzdHJpbmcgPSByb3V0ZS5zbmFwc2hvdC51cmwuam9pbignJyk7XG4gICAgKiBjb25zdCB1c2VyID0gcm91dGUuc25hcHNob3QuZGF0YS51c2VyO1xuICAgICogfVxuICAgICogfVxuICAgICogYGBgXG4gICAgKiAqXG4gICAqL1xuICB2YXIgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtc1xuICAgICAgICogQHBhcmFtIHs/fSBmcmFnbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBkYXRhXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVDb25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsU2VnbWVudFxuICAgICAgICogQHBhcmFtIHs/fSBsYXN0UGF0aEluZGV4XG4gICAgICAgKiBAcGFyYW0gez99IHJlc29sdmVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQWN0aXZhdGVkUm91dGVTbmFwc2hvdCh1cmwsIHBhcmFtcywgcXVlcnlQYXJhbXMsIGZyYWdtZW50LCBkYXRhLCBvdXRsZXQsIGNvbXBvbmVudCwgcm91dGVDb25maWcsIHVybFNlZ21lbnQsIGxhc3RQYXRoSW5kZXgsIHJlc29sdmUpIHtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7XG4gICAgICAgICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50O1xuICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgdGhpcy5vdXRsZXQgPSBvdXRsZXQ7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgdGhpcy5fcm91dGVDb25maWcgPSByb3V0ZUNvbmZpZztcbiAgICAgICAgICB0aGlzLl91cmxTZWdtZW50ID0gdXJsU2VnbWVudDtcbiAgICAgICAgICB0aGlzLl9sYXN0UGF0aEluZGV4ID0gbGFzdFBhdGhJbmRleDtcbiAgICAgICAgICB0aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LnByb3RvdHlwZSwgXCJyb3V0ZUNvbmZpZ1wiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIFRoZSBjb25maWd1cmF0aW9uIHVzZWQgdG8gbWF0Y2ggdGhpcyByb3V0ZVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yb3V0ZUNvbmZpZzsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wcm90b3R5cGUsIFwicm9vdFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIFRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUucm9vdDsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wcm90b3R5cGUsIFwicGFyZW50XCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgVGhlIHBhcmVudCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXJlbnQodGhpcyk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFjdGl2YXRlZFJvdXRlU25hcHNob3QucHJvdG90eXBlLCBcImZpcnN0Q2hpbGRcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuZmlyc3RDaGlsZCh0aGlzKTsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wcm90b3R5cGUsIFwiY2hpbGRyZW5cIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqICBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuY2hpbGRyZW4odGhpcyk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFjdGl2YXRlZFJvdXRlU25hcHNob3QucHJvdG90eXBlLCBcInBhdGhGcm9tUm9vdFwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIFRoZSBwYXRoIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHJvdXRlciBzdGF0ZSB0cmVlIHRvIHRoaXMgcm91dGVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUucGF0aEZyb21Sb290KHRoaXMpOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsID0gdGhpcy51cmwubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7IHJldHVybiBzZWdtZW50LnRvU3RyaW5nKCk7IH0pLmpvaW4oJy8nKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXRjaGVkID0gdGhpcy5fcm91dGVDb25maWcgPyB0aGlzLl9yb3V0ZUNvbmZpZy5wYXRoIDogJyc7XG4gICAgICAgICAgcmV0dXJuIFwiUm91dGUodXJsOidcIiArIHVybCArIFwiJywgcGF0aDonXCIgKyBtYXRjaGVkICsgXCInKVwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICB9KCkpO1xuICAvKipcbiAgICogICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICogY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAqIGNvbnN0IHN0YXRlOiBSb3V0ZXJTdGF0ZSA9IHJvdXRlci5yb3V0ZXJTdGF0ZTtcbiAgICAqIGNvbnN0IHNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90ID0gc3RhdGUuc25hcHNob3Q7XG4gICAgKiBjb25zdCByb290OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90ID0gc25hcHNob3Qucm9vdDtcbiAgICAqIGNvbnN0IGNoaWxkID0gcm9vdC5maXJzdENoaWxkO1xuICAgICogY29uc3QgaWQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IGNoaWxkLnBhcmFtcy5tYXAocCA9PiBwLmlkKTtcbiAgICAqIC8vLi4uXG4gICAgKiB9XG4gICAgKiB9XG4gICAgKiBgYGBcbiAgICAqICpcbiAgICAqIFJvdXRlclN0YXRlU25hcHNob3QgaXMgYSB0cmVlIG9mIGFjdGl2YXRlZCByb3V0ZSBzbmFwc2hvdHMuIEV2ZXJ5IG5vZGUgaW4gdGhpcyB0cmVlIGtub3dzIGFib3V0XG4gICAgKiB0aGUgXCJjb25zdW1lZFwiIFVSTCBzZWdtZW50cywgdGhlIGV4dHJhY3RlZCBwYXJhbWV0ZXJzLCBhbmQgdGhlIHJlc29sdmVkIGRhdGEuXG4gICAgKiAqXG4gICAqL1xuICB2YXIgUm91dGVyU3RhdGVTbmFwc2hvdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMkMShSb3V0ZXJTdGF0ZVNuYXBzaG90LCBfc3VwZXIpO1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHBhcmFtIHs/fSByb290XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJvdXRlclN0YXRlU25hcHNob3QodXJsLCByb290KSB7XG4gICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgcm9vdCk7XG4gICAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgICAgc2V0Um91dGVyU3RhdGVTbmFwc2hvdCh0aGlzLCByb290KTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyU3RhdGVTbmFwc2hvdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXJpYWxpemVOb2RlKHRoaXMuX3Jvb3QpOyB9O1xuICAgICAgcmV0dXJuIFJvdXRlclN0YXRlU25hcHNob3Q7XG4gIH0oVHJlZSkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBzdGF0ZVxuICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHNldFJvdXRlclN0YXRlU25hcHNob3Qoc3RhdGUsIG5vZGUpIHtcbiAgICAgIG5vZGUudmFsdWUuX3JvdXRlclN0YXRlID0gc3RhdGU7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIHNldFJvdXRlclN0YXRlU25hcHNob3Qoc3RhdGUsIGMpOyB9KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBub2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzZXJpYWxpemVOb2RlKG5vZGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGMgPSBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDAgPyBcIiB7IFwiICsgbm9kZS5jaGlsZHJlbi5tYXAoc2VyaWFsaXplTm9kZSkuam9pbihcIiwgXCIpICsgXCIgfSBcIiA6ICcnO1xuICAgICAgcmV0dXJuIFwiXCIgKyBub2RlLnZhbHVlICsgYztcbiAgfVxuICAvKipcbiAgICogIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBhY3RpdmF0ZSByb3V0ZSBpcyBjcmVhdGVkIHdpdGggdGhlIHJpZ2h0IHNldCBvZiBwYXJhbWV0ZXJzLlxuICAgICogU28gd2UgcHVzaCBuZXcgdmFsdWVzIGludG8gdGhlIG9ic2VydmFibGVzIG9ubHkgd2hlbiB0aGV5IGFyZSBub3QgdGhlIGluaXRpYWwgdmFsdWVzLlxuICAgICogQW5kIHdlIGRldGVjdCB0aGF0IGJ5IGNoZWNraW5nIGlmIHRoZSBzbmFwc2hvdCBmaWVsZCBpcyBzZXQuXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGFkdmFuY2VBY3RpdmF0ZWRSb3V0ZShyb3V0ZSkge1xuICAgICAgaWYgKHJvdXRlLnNuYXBzaG90KSB7XG4gICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwocm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMsIHJvdXRlLl9mdXR1cmVTbmFwc2hvdC5xdWVyeVBhcmFtcykpIHtcbiAgICAgICAgICAgICAgKChyb3V0ZS5xdWVyeVBhcmFtcykpLm5leHQocm91dGUuX2Z1dHVyZVNuYXBzaG90LnF1ZXJ5UGFyYW1zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJvdXRlLnNuYXBzaG90LmZyYWdtZW50ICE9PSByb3V0ZS5fZnV0dXJlU25hcHNob3QuZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgKChyb3V0ZS5mcmFnbWVudCkpLm5leHQocm91dGUuX2Z1dHVyZVNuYXBzaG90LmZyYWdtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzaGFsbG93RXF1YWwocm91dGUuc25hcHNob3QucGFyYW1zLCByb3V0ZS5fZnV0dXJlU25hcHNob3QucGFyYW1zKSkge1xuICAgICAgICAgICAgICAoKHJvdXRlLnBhcmFtcykpLm5leHQocm91dGUuX2Z1dHVyZVNuYXBzaG90LnBhcmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2hhbGxvd0VxdWFsQXJyYXlzKHJvdXRlLnNuYXBzaG90LnVybCwgcm91dGUuX2Z1dHVyZVNuYXBzaG90LnVybCkpIHtcbiAgICAgICAgICAgICAgKChyb3V0ZS51cmwpKS5uZXh0KHJvdXRlLl9mdXR1cmVTbmFwc2hvdC51cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWVxdWFsUGFyYW1zQW5kVXJsU2VnbWVudHMocm91dGUuc25hcHNob3QsIHJvdXRlLl9mdXR1cmVTbmFwc2hvdCkpIHtcbiAgICAgICAgICAgICAgKChyb3V0ZS5kYXRhKSkubmV4dChyb3V0ZS5fZnV0dXJlU25hcHNob3QuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJvdXRlLnNuYXBzaG90ID0gcm91dGUuX2Z1dHVyZVNuYXBzaG90O1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcm91dGUuc25hcHNob3QgPSByb3V0ZS5fZnV0dXJlU25hcHNob3Q7XG4gICAgICAgICAgLy8gdGhpcyBpcyBmb3IgcmVzb2x2ZWQgZGF0YVxuICAgICAgICAgICgocm91dGUuZGF0YSkpLm5leHQocm91dGUuX2Z1dHVyZVNuYXBzaG90LmRhdGEpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGFcbiAgICogQHBhcmFtIHs/fSBiXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBlcXVhbFBhcmFtc0FuZFVybFNlZ21lbnRzKGEsIGIpIHtcbiAgICAgIHJldHVybiBzaGFsbG93RXF1YWwoYS5wYXJhbXMsIGIucGFyYW1zKSAmJiBlcXVhbFNlZ21lbnRzKGEudXJsLCBiLnVybCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZVJldXNlU3RyYXRlZ3lcbiAgICogQHBhcmFtIHs/fSBjdXJyXG4gICAqIEBwYXJhbSB7P30gcHJldlN0YXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVSb3V0ZXJTdGF0ZShyb3V0ZVJldXNlU3RyYXRlZ3ksIGN1cnIsIHByZXZTdGF0ZSkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcm9vdCA9IGNyZWF0ZU5vZGUocm91dGVSZXVzZVN0cmF0ZWd5LCBjdXJyLl9yb290LCBwcmV2U3RhdGUgPyBwcmV2U3RhdGUuX3Jvb3QgOiB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIG5ldyBSb3V0ZXJTdGF0ZShyb290LCBjdXJyKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZVJldXNlU3RyYXRlZ3lcbiAgICogQHBhcmFtIHs/fSBjdXJyXG4gICAqIEBwYXJhbSB7Pz19IHByZXZTdGF0ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZShyb3V0ZVJldXNlU3RyYXRlZ3ksIGN1cnIsIHByZXZTdGF0ZSkge1xuICAgICAgLy8gcmV1c2UgYW4gYWN0aXZhdGVkIHJvdXRlIHRoYXQgaXMgY3VycmVudGx5IGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuXG4gICAgICBpZiAocHJldlN0YXRlICYmIHJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlKGN1cnIudmFsdWUsIHByZXZTdGF0ZS52YWx1ZS5zbmFwc2hvdCkpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IHByZXZTdGF0ZS52YWx1ZTtcbiAgICAgICAgICB2YWx1ZS5fZnV0dXJlU25hcHNob3QgPSBjdXJyLnZhbHVlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuID0gY3JlYXRlT3JSZXVzZUNoaWxkcmVuKHJvdXRlUmV1c2VTdHJhdGVneSwgY3VyciwgcHJldlN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKHZhbHVlLCBjaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChyb3V0ZVJldXNlU3RyYXRlZ3kucmV0cmlldmUoY3Vyci52YWx1ZSkpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB0cmVlID0gKChyb3V0ZVJldXNlU3RyYXRlZ3kucmV0cmlldmUoY3Vyci52YWx1ZSkpKS5yb3V0ZTtcbiAgICAgICAgICBzZXRGdXR1cmVTbmFwc2hvdHNPZkFjdGl2YXRlZFJvdXRlcyhjdXJyLCB0cmVlKTtcbiAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlID0gY3JlYXRlQWN0aXZhdGVkUm91dGUoY3Vyci52YWx1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSBjdXJyLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gY3JlYXRlTm9kZShyb3V0ZVJldXNlU3RyYXRlZ3ksIGMpOyB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFRyZWVOb2RlKHZhbHVlLCBjaGlsZHJlbik7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY3VyclxuICAgKiBAcGFyYW0gez99IHJlc3VsdFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc2V0RnV0dXJlU25hcHNob3RzT2ZBY3RpdmF0ZWRSb3V0ZXMoY3VyciwgcmVzdWx0KSB7XG4gICAgICBpZiAoY3Vyci52YWx1ZS5yb3V0ZUNvbmZpZyAhPT0gcmVzdWx0LnZhbHVlLnJvdXRlQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhdHRhY2ggQWN0aXZhdGVkUm91dGVTbmFwc2hvdCBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgcm91dGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyLmNoaWxkcmVuLmxlbmd0aCAhPT0gcmVzdWx0LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYXR0YWNoIEFjdGl2YXRlZFJvdXRlU25hcHNob3Qgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgY2hpbGRyZW4nKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC52YWx1ZS5fZnV0dXJlU25hcHNob3QgPSBjdXJyLnZhbHVlO1xuICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IGN1cnIuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBzZXRGdXR1cmVTbmFwc2hvdHNPZkFjdGl2YXRlZFJvdXRlcyhjdXJyLmNoaWxkcmVuW2ldLCByZXN1bHQuY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvdXRlUmV1c2VTdHJhdGVneVxuICAgKiBAcGFyYW0gez99IGN1cnJcbiAgICogQHBhcmFtIHs/fSBwcmV2U3RhdGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZU9yUmV1c2VDaGlsZHJlbihyb3V0ZVJldXNlU3RyYXRlZ3ksIGN1cnIsIHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIGN1cnIuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBwcmV2U3RhdGUuY2hpbGRyZW47IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBwID0gX2FbX2ldO1xuICAgICAgICAgICAgICBpZiAocm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUocC52YWx1ZS5zbmFwc2hvdCwgY2hpbGQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTm9kZShyb3V0ZVJldXNlU3RyYXRlZ3ksIGNoaWxkLCBwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY3JlYXRlTm9kZShyb3V0ZVJldXNlU3RyYXRlZ3ksIGNoaWxkKTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZUFjdGl2YXRlZFJvdXRlKGMpIHtcbiAgICAgIHJldHVybiBuZXcgQWN0aXZhdGVkUm91dGUobmV3IHJ4anNfQmVoYXZpb3JTdWJqZWN0LkJlaGF2aW9yU3ViamVjdChjLnVybCksIG5ldyByeGpzX0JlaGF2aW9yU3ViamVjdC5CZWhhdmlvclN1YmplY3QoYy5wYXJhbXMpLCBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KGMucXVlcnlQYXJhbXMpLCBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KGMuZnJhZ21lbnQpLCBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KGMuZGF0YSksIGMub3V0bGV0LCBjLmNvbXBvbmVudCwgYyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgKiBAcGFyYW0gez99IHVybFRyZWVcbiAgICogQHBhcmFtIHs/fSBjb21tYW5kc1xuICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zXG4gICAqIEBwYXJhbSB7P30gZnJhZ21lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVVybFRyZWUocm91dGUsIHVybFRyZWUsIGNvbW1hbmRzLCBxdWVyeVBhcmFtcywgZnJhZ21lbnQpIHtcbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdHJlZSh1cmxUcmVlLnJvb3QsIHVybFRyZWUucm9vdCwgdXJsVHJlZSwgcXVlcnlQYXJhbXMsIGZyYWdtZW50KTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hdiA9IGNvbXB1dGVOYXZpZ2F0aW9uKGNvbW1hbmRzKTtcbiAgICAgIGlmIChuYXYudG9Sb290KCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJlZSh1cmxUcmVlLnJvb3QsIG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KSwgdXJsVHJlZSwgcXVlcnlQYXJhbXMsIGZyYWdtZW50KTtcbiAgICAgIH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0YXJ0aW5nUG9zaXRpb24gPSBmaW5kU3RhcnRpbmdQb3NpdGlvbihuYXYsIHVybFRyZWUsIHJvdXRlKTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlZ21lbnRHcm91cCA9IHN0YXJ0aW5nUG9zaXRpb24ucHJvY2Vzc0NoaWxkcmVuID9cbiAgICAgICAgICB1cGRhdGVTZWdtZW50R3JvdXBDaGlsZHJlbihzdGFydGluZ1Bvc2l0aW9uLnNlZ21lbnRHcm91cCwgc3RhcnRpbmdQb3NpdGlvbi5pbmRleCwgbmF2LmNvbW1hbmRzKSA6XG4gICAgICAgICAgdXBkYXRlU2VnbWVudEdyb3VwKHN0YXJ0aW5nUG9zaXRpb24uc2VnbWVudEdyb3VwLCBzdGFydGluZ1Bvc2l0aW9uLmluZGV4LCBuYXYuY29tbWFuZHMpO1xuICAgICAgcmV0dXJuIHRyZWUoc3RhcnRpbmdQb3NpdGlvbi5zZWdtZW50R3JvdXAsIHNlZ21lbnRHcm91cCwgdXJsVHJlZSwgcXVlcnlQYXJhbXMsIGZyYWdtZW50KTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBjb21tYW5kXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBpc01hdHJpeFBhcmFtcyhjb21tYW5kKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGNvbW1hbmQgPT09ICdvYmplY3QnICYmICFjb21tYW5kLm91dGxldHMgJiYgIWNvbW1hbmQuc2VnbWVudFBhdGg7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gb2xkU2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gbmV3U2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gdXJsVHJlZVxuICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zXG4gICAqIEBwYXJhbSB7P30gZnJhZ21lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHRyZWUob2xkU2VnbWVudEdyb3VwLCBuZXdTZWdtZW50R3JvdXAsIHVybFRyZWUsIHF1ZXJ5UGFyYW1zLCBmcmFnbWVudCkge1xuICAgICAgaWYgKHVybFRyZWUucm9vdCA9PT0gb2xkU2VnbWVudEdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBVcmxUcmVlKG5ld1NlZ21lbnRHcm91cCwgc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKSwgZnJhZ21lbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBVcmxUcmVlKHJlcGxhY2VTZWdtZW50KHVybFRyZWUucm9vdCwgb2xkU2VnbWVudEdyb3VwLCBuZXdTZWdtZW50R3JvdXApLCBzdHJpbmdpZnkocXVlcnlQYXJhbXMpLCBmcmFnbWVudCk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY3VycmVudFxuICAgKiBAcGFyYW0gez99IG9sZFNlZ21lbnRcbiAgICogQHBhcmFtIHs/fSBuZXdTZWdtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlU2VnbWVudChjdXJyZW50LCBvbGRTZWdtZW50LCBuZXdTZWdtZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZHJlbiA9IHt9O1xuICAgICAgZm9yRWFjaChjdXJyZW50LmNoaWxkcmVuLCBmdW5jdGlvbiAoYywgb3V0bGV0TmFtZSkge1xuICAgICAgICAgIGlmIChjID09PSBvbGRTZWdtZW50KSB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuW291dGxldE5hbWVdID0gbmV3U2VnbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuW291dGxldE5hbWVdID0gcmVwbGFjZVNlZ21lbnQoYywgb2xkU2VnbWVudCwgbmV3U2VnbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChjdXJyZW50LnNlZ21lbnRzLCBjaGlsZHJlbik7XG4gIH1cbiAgdmFyIE5hdmlnYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlzQWJzb2x1dGVcbiAgICAgICAqIEBwYXJhbSB7P30gbnVtYmVyT2ZEb3VibGVEb3RzXG4gICAgICAgKiBAcGFyYW0gez99IGNvbW1hbmRzXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5hdmlnYXRpb24oaXNBYnNvbHV0ZSwgbnVtYmVyT2ZEb3VibGVEb3RzLCBjb21tYW5kcykge1xuICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSA9IGlzQWJzb2x1dGU7XG4gICAgICAgICAgdGhpcy5udW1iZXJPZkRvdWJsZURvdHMgPSBudW1iZXJPZkRvdWJsZURvdHM7XG4gICAgICAgICAgdGhpcy5jb21tYW5kcyA9IGNvbW1hbmRzO1xuICAgICAgICAgIGlmIChpc0Fic29sdXRlICYmIGNvbW1hbmRzLmxlbmd0aCA+IDAgJiYgaXNNYXRyaXhQYXJhbXMoY29tbWFuZHNbMF0pKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBzZWdtZW50IGNhbm5vdCBoYXZlIG1hdHJpeCBwYXJhbWV0ZXJzJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBjbWRXaXRoT3V0bGV0ID0gY29tbWFuZHMuZmluZChmdW5jdGlvbiAoYykgeyByZXR1cm4gdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIGMub3V0bGV0czsgfSk7XG4gICAgICAgICAgaWYgKGNtZFdpdGhPdXRsZXQgJiYgY21kV2l0aE91dGxldCAhPT0gbGFzdChjb21tYW5kcykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd7b3V0bGV0czp7fX0gaGFzIHRvIGJlIHRoZSBsYXN0IGNvbW1hbmQnKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5hdmlnYXRpb24ucHJvdG90eXBlLnRvUm9vdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0Fic29sdXRlICYmIHRoaXMuY29tbWFuZHMubGVuZ3RoID09PSAxICYmIHRoaXMuY29tbWFuZHNbMF0gPT0gJy8nO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBOYXZpZ2F0aW9uO1xuICB9KCkpO1xuICAvKipcbiAgICogIFRyYW5zZm9ybXMgY29tbWFuZHMgdG8gYSBub3JtYWxpemVkIGBOYXZpZ2F0aW9uYFxuICAgKiBAcGFyYW0gez99IGNvbW1hbmRzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb21wdXRlTmF2aWdhdGlvbihjb21tYW5kcykge1xuICAgICAgaWYgKCh0eXBlb2YgY29tbWFuZHNbMF0gPT09ICdzdHJpbmcnKSAmJiBjb21tYW5kcy5sZW5ndGggPT09IDEgJiYgY29tbWFuZHNbMF0gPT09ICcvJykge1xuICAgICAgICAgIHJldHVybiBuZXcgTmF2aWdhdGlvbih0cnVlLCAwLCBjb21tYW5kcyk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBudW1iZXJPZkRvdWJsZURvdHMgPSAwO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNBYnNvbHV0ZSA9IGZhbHNlO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0gY29tbWFuZHMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGNtZCwgY21kSWR4KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjbWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIGlmIChjbWQub3V0bGV0cykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3V0bGV0c18xID0ge307XG4gICAgICAgICAgICAgICAgICBmb3JFYWNoKGNtZC5vdXRsZXRzLCBmdW5jdGlvbiAoY29tbWFuZHMsIG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRzXzFbbmFtZV0gPSB0eXBlb2YgY29tbWFuZHMgPT09ICdzdHJpbmcnID8gY29tbWFuZHMuc3BsaXQoJy8nKSA6IGNvbW1hbmRzO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChbeyBvdXRsZXRzOiBvdXRsZXRzXzEgfV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjbWQuc2VnbWVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KFtjbWQuc2VnbWVudFBhdGhdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoISh0eXBlb2YgY21kID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoW2NtZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY21kSWR4ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNtZC5zcGxpdCgnLycpLmZvckVhY2goZnVuY3Rpb24gKHVybFBhcnQsIHBhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHBhcnRJbmRleCA9PSAwICYmIHVybFBhcnQgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFydEluZGV4ID09IDAgJiYgdXJsUGFydCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVybFBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkRvdWJsZURvdHMrKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVybFBhcnQgIT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh1cmxQYXJ0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KFtjbWRdKTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHJldHVybiBuZXcgTmF2aWdhdGlvbihpc0Fic29sdXRlLCBudW1iZXJPZkRvdWJsZURvdHMsIHJlcyk7XG4gIH1cbiAgdmFyIFBvc2l0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICAgICAqIEBwYXJhbSB7P30gcHJvY2Vzc0NoaWxkcmVuXG4gICAgICAgKiBAcGFyYW0gez99IGluZGV4XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFBvc2l0aW9uKHNlZ21lbnRHcm91cCwgcHJvY2Vzc0NoaWxkcmVuLCBpbmRleCkge1xuICAgICAgICAgIHRoaXMuc2VnbWVudEdyb3VwID0gc2VnbWVudEdyb3VwO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkcmVuID0gcHJvY2Vzc0NoaWxkcmVuO1xuICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQb3NpdGlvbjtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gbmF2XG4gICAqIEBwYXJhbSB7P30gdHJlZVxuICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kU3RhcnRpbmdQb3NpdGlvbihuYXYsIHRyZWUsIHJvdXRlKSB7XG4gICAgICBpZiAobmF2LmlzQWJzb2x1dGUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uKHRyZWUucm9vdCwgdHJ1ZSwgMCk7XG4gICAgICB9XG4gICAgICBpZiAocm91dGUuc25hcHNob3QuX2xhc3RQYXRoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbihyb3V0ZS5zbmFwc2hvdC5fdXJsU2VnbWVudCwgdHJ1ZSwgMCk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtb2RpZmllciA9IGlzTWF0cml4UGFyYW1zKG5hdi5jb21tYW5kc1swXSkgPyAwIDogMTtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluZGV4ID0gcm91dGUuc25hcHNob3QuX2xhc3RQYXRoSW5kZXggKyBtb2RpZmllcjtcbiAgICAgIHJldHVybiBjcmVhdGVQb3NpdGlvbkFwcGx5aW5nRG91YmxlRG90cyhyb3V0ZS5zbmFwc2hvdC5fdXJsU2VnbWVudCwgaW5kZXgsIG5hdi5udW1iZXJPZkRvdWJsZURvdHMpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGdyb3VwXG4gICAqIEBwYXJhbSB7P30gaW5kZXhcbiAgICogQHBhcmFtIHs/fSBudW1iZXJPZkRvdWJsZURvdHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uQXBwbHlpbmdEb3VibGVEb3RzKGdyb3VwLCBpbmRleCwgbnVtYmVyT2ZEb3VibGVEb3RzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBnID0gZ3JvdXA7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaSA9IGluZGV4O1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZGQgPSBudW1iZXJPZkRvdWJsZURvdHM7XG4gICAgICB3aGlsZSAoZGQgPiBjaSkge1xuICAgICAgICAgIGRkIC09IGNpO1xuICAgICAgICAgIGcgPSBnLnBhcmVudDtcbiAgICAgICAgICBpZiAoIWcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG51bWJlciBvZiBcXCcuLi9cXCcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2kgPSBnLnNlZ21lbnRzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUG9zaXRpb24oZywgZmFsc2UsIGNpIC0gZGQpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IGNvbW1hbmRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGgoY29tbWFuZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kID09PSAnb2JqZWN0JyAmJiBjb21tYW5kLm91dGxldHMpXG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmQub3V0bGV0c1tQUklNQVJZX09VVExFVF07XG4gICAgICByZXR1cm4gXCJcIiArIGNvbW1hbmQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gY29tbWFuZHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldE91dGxldHMoY29tbWFuZHMpIHtcbiAgICAgIGlmICghKHR5cGVvZiBjb21tYW5kc1swXSA9PT0gJ29iamVjdCcpKVxuICAgICAgICAgIHJldHVybiAoX2EgPSB7fSwgX2FbUFJJTUFSWV9PVVRMRVRdID0gY29tbWFuZHMsIF9hKTtcbiAgICAgIGlmIChjb21tYW5kc1swXS5vdXRsZXRzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuIChfYiA9IHt9LCBfYltQUklNQVJZX09VVExFVF0gPSBjb21tYW5kcywgX2IpO1xuICAgICAgcmV0dXJuIGNvbW1hbmRzWzBdLm91dGxldHM7XG4gICAgICB2YXIgX2EsIF9iO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHN0YXJ0SW5kZXhcbiAgICogQHBhcmFtIHs/fSBjb21tYW5kc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2VnbWVudEdyb3VwKHNlZ21lbnRHcm91cCwgc3RhcnRJbmRleCwgY29tbWFuZHMpIHtcbiAgICAgIGlmICghc2VnbWVudEdyb3VwKSB7XG4gICAgICAgICAgc2VnbWVudEdyb3VwID0gbmV3IFVybFNlZ21lbnRHcm91cChbXSwge30pO1xuICAgICAgfVxuICAgICAgaWYgKHNlZ21lbnRHcm91cC5zZWdtZW50cy5sZW5ndGggPT09IDAgJiYgc2VnbWVudEdyb3VwLmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU2VnbWVudEdyb3VwQ2hpbGRyZW4oc2VnbWVudEdyb3VwLCBzdGFydEluZGV4LCBjb21tYW5kcyk7XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtID0gcHJlZml4ZWRXaXRoKHNlZ21lbnRHcm91cCwgc3RhcnRJbmRleCwgY29tbWFuZHMpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc2xpY2VkQ29tbWFuZHMgPSBjb21tYW5kcy5zbGljZShtLmNvbW1hbmRJbmRleCk7XG4gICAgICBpZiAobS5tYXRjaCAmJiBtLnBhdGhJbmRleCA8IHNlZ21lbnRHcm91cC5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBnID0gbmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50R3JvdXAuc2VnbWVudHMuc2xpY2UoMCwgbS5wYXRoSW5kZXgpLCB7fSk7XG4gICAgICAgICAgZy5jaGlsZHJlbltQUklNQVJZX09VVExFVF0gPVxuICAgICAgICAgICAgICBuZXcgVXJsU2VnbWVudEdyb3VwKHNlZ21lbnRHcm91cC5zZWdtZW50cy5zbGljZShtLnBhdGhJbmRleCksIHNlZ21lbnRHcm91cC5jaGlsZHJlbik7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZVNlZ21lbnRHcm91cENoaWxkcmVuKGcsIDAsIHNsaWNlZENvbW1hbmRzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG0ubWF0Y2ggJiYgc2xpY2VkQ29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBVcmxTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLnNlZ21lbnRzLCB7fSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtLm1hdGNoICYmICFzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVOZXdTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLCBzdGFydEluZGV4LCBjb21tYW5kcyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtLm1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZVNlZ21lbnRHcm91cENoaWxkcmVuKHNlZ21lbnRHcm91cCwgMCwgc2xpY2VkQ29tbWFuZHMpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZU5ld1NlZ21lbnRHcm91cChzZWdtZW50R3JvdXAsIHN0YXJ0SW5kZXgsIGNvbW1hbmRzKTtcbiAgICAgIH1cbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4XG4gICAqIEBwYXJhbSB7P30gY29tbWFuZHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlZ21lbnRHcm91cENoaWxkcmVuKHNlZ21lbnRHcm91cCwgc3RhcnRJbmRleCwgY29tbWFuZHMpIHtcbiAgICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50R3JvdXAuc2VnbWVudHMsIHt9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dGxldHNfMiA9IGdldE91dGxldHMoY29tbWFuZHMpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuXzEgPSB7fTtcbiAgICAgICAgICBmb3JFYWNoKG91dGxldHNfMiwgZnVuY3Rpb24gKGNvbW1hbmRzLCBvdXRsZXQpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbW1hbmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZHJlbl8xW291dGxldF0gPSB1cGRhdGVTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLmNoaWxkcmVuW291dGxldF0sIHN0YXJ0SW5kZXgsIGNvbW1hbmRzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvckVhY2goc2VnbWVudEdyb3VwLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGNoaWxkT3V0bGV0KSB7XG4gICAgICAgICAgICAgIGlmIChvdXRsZXRzXzJbY2hpbGRPdXRsZXRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuXzFbY2hpbGRPdXRsZXRdID0gY2hpbGQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50R3JvdXAuc2VnbWVudHMsIGNoaWxkcmVuXzEpO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHN0YXJ0SW5kZXhcbiAgICogQHBhcmFtIHs/fSBjb21tYW5kc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcHJlZml4ZWRXaXRoKHNlZ21lbnRHcm91cCwgc3RhcnRJbmRleCwgY29tbWFuZHMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJlbnRDb21tYW5kSW5kZXggPSAwO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VycmVudFBhdGhJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBub01hdGNoID0geyBtYXRjaDogZmFsc2UsIHBhdGhJbmRleDogMCwgY29tbWFuZEluZGV4OiAwIH07XG4gICAgICB3aGlsZSAoY3VycmVudFBhdGhJbmRleCA8IHNlZ21lbnRHcm91cC5zZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoY3VycmVudENvbW1hbmRJbmRleCA+PSBjb21tYW5kcy5sZW5ndGgpXG4gICAgICAgICAgICAgIHJldHVybiBub01hdGNoO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSBzZWdtZW50R3JvdXAuc2VnbWVudHNbY3VycmVudFBhdGhJbmRleF07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyciA9IGdldFBhdGgoY29tbWFuZHNbY3VycmVudENvbW1hbmRJbmRleF0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5leHQgPSBjdXJyZW50Q29tbWFuZEluZGV4IDwgY29tbWFuZHMubGVuZ3RoIC0gMSA/IGNvbW1hbmRzW2N1cnJlbnRDb21tYW5kSW5kZXggKyAxXSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnJlbnRQYXRoSW5kZXggPiAwICYmIGN1cnIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgaWYgKGN1cnIgJiYgbmV4dCAmJiAodHlwZW9mIG5leHQgPT09ICdvYmplY3QnKSAmJiBuZXh0Lm91dGxldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAoIWNvbXBhcmUoY3VyciwgbmV4dCwgcGF0aCkpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gbm9NYXRjaDtcbiAgICAgICAgICAgICAgY3VycmVudENvbW1hbmRJbmRleCArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFjb21wYXJlKGN1cnIsIHt9LCBwYXRoKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBub01hdGNoO1xuICAgICAgICAgICAgICBjdXJyZW50Q29tbWFuZEluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQYXRoSW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1hdGNoOiB0cnVlLCBwYXRoSW5kZXg6IGN1cnJlbnRQYXRoSW5kZXgsIGNvbW1hbmRJbmRleDogY3VycmVudENvbW1hbmRJbmRleCB9O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHN0YXJ0SW5kZXhcbiAgICogQHBhcmFtIHs/fSBjb21tYW5kc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlTmV3U2VnbWVudEdyb3VwKHNlZ21lbnRHcm91cCwgc3RhcnRJbmRleCwgY29tbWFuZHMpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGhzID0gc2VnbWVudEdyb3VwLnNlZ21lbnRzLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IGNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29tbWFuZHNbaV0gPT09ICdvYmplY3QnICYmIGNvbW1hbmRzW2ldLm91dGxldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZHJlbiA9IGNyZWF0ZU5ld1NlZ21lbnRDaGlsZHJlbihjb21tYW5kc1tpXS5vdXRsZXRzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmxTZWdtZW50R3JvdXAocGF0aHMsIGNoaWxkcmVuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgd2Ugc3RhcnQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbCwgd2UgbmVlZCB0byByZXVzZSB0aGUgcGF0aCBwYXJ0IGZyb20gdGhlIHNlZ21lbnRcbiAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBpc01hdHJpeFBhcmFtcyhjb21tYW5kc1swXSkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IHNlZ21lbnRHcm91cC5zZWdtZW50c1tzdGFydEluZGV4XTtcbiAgICAgICAgICAgICAgcGF0aHMucHVzaChuZXcgVXJsU2VnbWVudChwLnBhdGgsIGNvbW1hbmRzWzBdKSk7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnIgPSBnZXRQYXRoKGNvbW1hbmRzW2ldKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuZXh0ID0gKGkgPCBjb21tYW5kcy5sZW5ndGggLSAxKSA/IGNvbW1hbmRzW2kgKyAxXSA6IG51bGw7XG4gICAgICAgICAgaWYgKGN1cnIgJiYgbmV4dCAmJiBpc01hdHJpeFBhcmFtcyhuZXh0KSkge1xuICAgICAgICAgICAgICBwYXRocy5wdXNoKG5ldyBVcmxTZWdtZW50KGN1cnIsIHN0cmluZ2lmeShuZXh0KSkpO1xuICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBwYXRocy5wdXNoKG5ldyBVcmxTZWdtZW50KGN1cnIsIHt9KSk7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFVybFNlZ21lbnRHcm91cChwYXRocywge30pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG91dGxldHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZU5ld1NlZ21lbnRDaGlsZHJlbihvdXRsZXRzKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZHJlbiA9IHt9O1xuICAgICAgZm9yRWFjaChvdXRsZXRzLCBmdW5jdGlvbiAoY29tbWFuZHMsIG91dGxldCkge1xuICAgICAgICAgIGlmIChjb21tYW5kcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjaGlsZHJlbltvdXRsZXRdID0gY3JlYXRlTmV3U2VnbWVudEdyb3VwKG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KSwgMCwgY29tbWFuZHMpO1xuICAgICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5KHBhcmFtcykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzID0ge307XG4gICAgICBmb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24gKHYsIGspIHsgcmV0dXJuIHJlc1trXSA9IFwiXCIgKyB2OyB9KTtcbiAgICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcGF0aFxuICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgKiBAcGFyYW0gez99IHNlZ21lbnRcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmUocGF0aCwgcGFyYW1zLCBzZWdtZW50KSB7XG4gICAgICByZXR1cm4gcGF0aCA9PSBzZWdtZW50LnBhdGggJiYgc2hhbGxvd0VxdWFsKHBhcmFtcywgc2VnbWVudC5wYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHZhciBOb01hdGNoJDEgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTm9NYXRjaCgpIHtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOb01hdGNoO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSByb290Q29tcG9uZW50VHlwZVxuICAgKiBAcGFyYW0gez99IGNvbmZpZ1xuICAgKiBAcGFyYW0gez99IHVybFRyZWVcbiAgICogQHBhcmFtIHs/fSB1cmxcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHJlY29nbml6ZShyb290Q29tcG9uZW50VHlwZSwgY29uZmlnLCB1cmxUcmVlLCB1cmwpIHtcbiAgICAgIHJldHVybiBuZXcgUmVjb2duaXplcihyb290Q29tcG9uZW50VHlwZSwgY29uZmlnLCB1cmxUcmVlLCB1cmwpLnJlY29nbml6ZSgpO1xuICB9XG4gIHZhciBSZWNvZ25pemVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByb290Q29tcG9uZW50VHlwZVxuICAgICAgICogQHBhcmFtIHs/fSBjb25maWdcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsVHJlZVxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUmVjb2duaXplcihyb290Q29tcG9uZW50VHlwZSwgY29uZmlnLCB1cmxUcmVlLCB1cmwpIHtcbiAgICAgICAgICB0aGlzLnJvb3RDb21wb25lbnRUeXBlID0gcm9vdENvbXBvbmVudFR5cGU7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgdGhpcy51cmxUcmVlID0gdXJsVHJlZTtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjb2duaXplci5wcm90b3R5cGUucmVjb2duaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvb3RTZWdtZW50R3JvdXAgPSBzcGxpdCQxKHRoaXMudXJsVHJlZS5yb290LCBbXSwgW10sIHRoaXMuY29uZmlnKS5zZWdtZW50R3JvdXA7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuID0gdGhpcy5wcm9jZXNzU2VnbWVudEdyb3VwKHRoaXMuY29uZmlnLCByb290U2VnbWVudEdyb3VwLCBQUklNQVJZX09VVExFVCk7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvb3QgPSBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdChbXSwgT2JqZWN0LmZyZWV6ZSh7fSksIE9iamVjdC5mcmVlemUodGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zKSwgdGhpcy51cmxUcmVlLmZyYWdtZW50LCB7fSwgUFJJTUFSWV9PVVRMRVQsIHRoaXMucm9vdENvbXBvbmVudFR5cGUsIG51bGwsIHRoaXMudXJsVHJlZS5yb290LCAtMSwge30pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb290Tm9kZSA9IG5ldyBUcmVlTm9kZShyb290LCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvdXRlU3RhdGUgPSBuZXcgUm91dGVyU3RhdGVTbmFwc2hvdCh0aGlzLnVybCwgcm9vdE5vZGUpO1xuICAgICAgICAgICAgICB0aGlzLmluaGVyaXRlUGFyYW1zQW5kRGF0YShyb3V0ZVN0YXRlLl9yb290KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihyb3V0ZVN0YXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyByeGpzX09ic2VydmFibGUuT2JzZXJ2YWJsZShmdW5jdGlvbiAob2JzKSB7IHJldHVybiBvYnMuZXJyb3IoZSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVOb2RlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWNvZ25pemVyLnByb3RvdHlwZS5pbmhlcml0ZVBhcmFtc0FuZERhdGEgPSBmdW5jdGlvbiAocm91dGVOb2RlKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb3V0ZSA9IHJvdXRlTm9kZS52YWx1ZTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gaW5oZXJpdGVkUGFyYW1zRGF0YVJlc29sdmUocm91dGUpO1xuICAgICAgICAgIHJvdXRlLnBhcmFtcyA9IE9iamVjdC5mcmVlemUoaS5wYXJhbXMpO1xuICAgICAgICAgIHJvdXRlLmRhdGEgPSBPYmplY3QuZnJlZXplKGkuZGF0YSk7XG4gICAgICAgICAgcm91dGVOb2RlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG4pIHsgcmV0dXJuIF90aGlzLmluaGVyaXRlUGFyYW1zQW5kRGF0YShuKTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbmZpZ1xuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWNvZ25pemVyLnByb3RvdHlwZS5wcm9jZXNzU2VnbWVudEdyb3VwID0gZnVuY3Rpb24gKGNvbmZpZywgc2VnbWVudEdyb3VwLCBvdXRsZXQpIHtcbiAgICAgICAgICBpZiAoc2VnbWVudEdyb3VwLnNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJiBzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ2hpbGRyZW4oY29uZmlnLCBzZWdtZW50R3JvdXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NlZ21lbnQoY29uZmlnLCBzZWdtZW50R3JvdXAsIHNlZ21lbnRHcm91cC5zZWdtZW50cywgb3V0bGV0KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGNvbmZpZ1xuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY29nbml6ZXIucHJvdG90eXBlLnByb2Nlc3NDaGlsZHJlbiA9IGZ1bmN0aW9uIChjb25maWcsIHNlZ21lbnRHcm91cCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRyZW4gPSBtYXBDaGlsZHJlbkludG9BcnJheShzZWdtZW50R3JvdXAsIGZ1bmN0aW9uIChjaGlsZCwgY2hpbGRPdXRsZXQpIHsgcmV0dXJuIF90aGlzLnByb2Nlc3NTZWdtZW50R3JvdXAoY29uZmlnLCBjaGlsZCwgY2hpbGRPdXRsZXQpOyB9KTtcbiAgICAgICAgICBjaGVja091dGxldE5hbWVVbmlxdWVuZXNzKGNoaWxkcmVuKTtcbiAgICAgICAgICBzb3J0QWN0aXZhdGVkUm91dGVTbmFwc2hvdHMoY2hpbGRyZW4pO1xuICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50c1xuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJlY29nbml6ZXIucHJvdG90eXBlLnByb2Nlc3NTZWdtZW50ID0gZnVuY3Rpb24gKGNvbmZpZywgc2VnbWVudEdyb3VwLCBzZWdtZW50cywgb3V0bGV0KSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBjb25maWdfMSA9IGNvbmZpZzsgX2kgPCBjb25maWdfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgdmFyIHIgPSBjb25maWdfMVtfaV07XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2VnbWVudEFnYWluc3RSb3V0ZShyLCBzZWdtZW50R3JvdXAsIHNlZ21lbnRzLCBvdXRsZXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm9NYXRjaCQxKSlcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm5vTGVmdG92ZXJzSW5Vcmwoc2VnbWVudEdyb3VwLCBzZWdtZW50cywgb3V0bGV0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9NYXRjaCQxKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICAgICAqIEBwYXJhbSB7P30gc2VnbWVudHNcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSZWNvZ25pemVyLnByb3RvdHlwZS5ub0xlZnRvdmVyc0luVXJsID0gZnVuY3Rpb24gKHNlZ21lbnRHcm91cCwgc2VnbWVudHMsIG91dGxldCkge1xuICAgICAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPT09IDAgJiYgIXNlZ21lbnRHcm91cC5jaGlsZHJlbltvdXRsZXRdO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgICAgICogQHBhcmFtIHs/fSByYXdTZWdtZW50XG4gICAgICAgKiBAcGFyYW0gez99IHNlZ21lbnRzXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUmVjb2duaXplci5wcm90b3R5cGUucHJvY2Vzc1NlZ21lbnRBZ2FpbnN0Um91dGUgPSBmdW5jdGlvbiAocm91dGUsIHJhd1NlZ21lbnQsIHNlZ21lbnRzLCBvdXRsZXQpIHtcbiAgICAgICAgICBpZiAocm91dGUucmVkaXJlY3RUbylcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vTWF0Y2gkMSgpO1xuICAgICAgICAgIGlmICgocm91dGUub3V0bGV0ID8gcm91dGUub3V0bGV0IDogUFJJTUFSWV9PVVRMRVQpICE9PSBvdXRsZXQpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb01hdGNoJDEoKTtcbiAgICAgICAgICBpZiAocm91dGUucGF0aCA9PT0gJyoqJykge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbXMgPSBzZWdtZW50cy5sZW5ndGggPiAwID8gbGFzdChzZWdtZW50cykucGFyYW1ldGVycyA6IHt9O1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzbmFwc2hvdF8xID0gbmV3IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qoc2VnbWVudHMsIHBhcmFtcywgT2JqZWN0LmZyZWV6ZSh0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMpLCB0aGlzLnVybFRyZWUuZnJhZ21lbnQsIGdldERhdGEocm91dGUpLCBvdXRsZXQsIHJvdXRlLmNvbXBvbmVudCwgcm91dGUsIGdldFNvdXJjZVNlZ21lbnRHcm91cChyYXdTZWdtZW50KSwgZ2V0UGF0aEluZGV4U2hpZnQocmF3U2VnbWVudCkgKyBzZWdtZW50cy5sZW5ndGgsIGdldFJlc29sdmUocm91dGUpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVHJlZU5vZGUoc25hcHNob3RfMSwgW10pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIF9hID0gbWF0Y2gkMShyYXdTZWdtZW50LCByb3V0ZSwgc2VnbWVudHMpLCBjb25zdW1lZFNlZ21lbnRzID0gX2EuY29uc3VtZWRTZWdtZW50cywgcGFyYW1ldGVycyA9IF9hLnBhcmFtZXRlcnMsIGxhc3RDaGlsZCA9IF9hLmxhc3RDaGlsZDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByYXdTbGljZWRTZWdtZW50cyA9IHNlZ21lbnRzLnNsaWNlKGxhc3RDaGlsZCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hpbGRDb25maWcgPSBnZXRDaGlsZENvbmZpZyhyb3V0ZSk7XG4gICAgICAgICAgdmFyIF9iID0gc3BsaXQkMShyYXdTZWdtZW50LCBjb25zdW1lZFNlZ21lbnRzLCByYXdTbGljZWRTZWdtZW50cywgY2hpbGRDb25maWcpLCBzZWdtZW50R3JvdXAgPSBfYi5zZWdtZW50R3JvdXAsIHNsaWNlZFNlZ21lbnRzID0gX2Iuc2xpY2VkU2VnbWVudHM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc25hcHNob3QgPSBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdChjb25zdW1lZFNlZ21lbnRzLCBwYXJhbWV0ZXJzLCBPYmplY3QuZnJlZXplKHRoaXMudXJsVHJlZS5xdWVyeVBhcmFtcyksIHRoaXMudXJsVHJlZS5mcmFnbWVudCwgZ2V0RGF0YShyb3V0ZSksIG91dGxldCwgcm91dGUuY29tcG9uZW50LCByb3V0ZSwgZ2V0U291cmNlU2VnbWVudEdyb3VwKHJhd1NlZ21lbnQpLCBnZXRQYXRoSW5kZXhTaGlmdChyYXdTZWdtZW50KSArIGNvbnN1bWVkU2VnbWVudHMubGVuZ3RoLCBnZXRSZXNvbHZlKHJvdXRlKSk7XG4gICAgICAgICAgaWYgKHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJiBzZWdtZW50R3JvdXAuaGFzQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZHJlbiA9IHRoaXMucHJvY2Vzc0NoaWxkcmVuKGNoaWxkQ29uZmlnLCBzZWdtZW50R3JvdXApO1xuICAgICAgICAgICAgICByZXR1cm4gW25ldyBUcmVlTm9kZShzbmFwc2hvdCwgY2hpbGRyZW4pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoY2hpbGRDb25maWcubGVuZ3RoID09PSAwICYmIHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gW25ldyBUcmVlTm9kZShzbmFwc2hvdCwgW10pXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkcmVuID0gdGhpcy5wcm9jZXNzU2VnbWVudChjaGlsZENvbmZpZywgc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgUFJJTUFSWV9PVVRMRVQpO1xuICAgICAgICAgICAgICByZXR1cm4gW25ldyBUcmVlTm9kZShzbmFwc2hvdCwgY2hpbGRyZW4pXTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFJlY29nbml6ZXI7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5vZGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzb3J0QWN0aXZhdGVkUm91dGVTbmFwc2hvdHMobm9kZXMpIHtcbiAgICAgIG5vZGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICBpZiAoYS52YWx1ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKVxuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgaWYgKGIudmFsdWUub3V0bGV0ID09PSBQUklNQVJZX09VVExFVClcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgcmV0dXJuIGEudmFsdWUub3V0bGV0LmxvY2FsZUNvbXBhcmUoYi52YWx1ZS5vdXRsZXQpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldENoaWxkQ29uZmlnKHJvdXRlKSB7XG4gICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICByZXR1cm4gcm91dGUuY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChyb3V0ZS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICByZXR1cm4gKChyb3V0ZSkpLl9sb2FkZWRDb25maWcucm91dGVzO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoJDEoc2VnbWVudEdyb3VwLCByb3V0ZSwgc2VnbWVudHMpIHtcbiAgICAgIGlmIChyb3V0ZS5wYXRoID09PSAnJykge1xuICAgICAgICAgIGlmIChyb3V0ZS5wYXRoTWF0Y2ggPT09ICdmdWxsJyAmJiAoc2VnbWVudEdyb3VwLmhhc0NoaWxkcmVuKCkgfHwgc2VnbWVudHMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vTWF0Y2gkMSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgY29uc3VtZWRTZWdtZW50czogW10sIGxhc3RDaGlsZDogMCwgcGFyYW1ldGVyczoge30gfTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXRjaGVyID0gcm91dGUubWF0Y2hlciB8fCBkZWZhdWx0VXJsTWF0Y2hlcjtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IG1hdGNoZXIoc2VnbWVudHMsIHNlZ21lbnRHcm91cCwgcm91dGUpO1xuICAgICAgaWYgKCFyZXMpXG4gICAgICAgICAgdGhyb3cgbmV3IE5vTWF0Y2gkMSgpO1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcG9zUGFyYW1zID0ge307XG4gICAgICBmb3JFYWNoKHJlcy5wb3NQYXJhbXMsIGZ1bmN0aW9uICh2LCBrKSB7IHBvc1BhcmFtc1trXSA9IHYucGF0aDsgfSk7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwYXJhbWV0ZXJzID0gbWVyZ2UocG9zUGFyYW1zLCByZXMuY29uc3VtZWRbcmVzLmNvbnN1bWVkLmxlbmd0aCAtIDFdLnBhcmFtZXRlcnMpO1xuICAgICAgcmV0dXJuIHsgY29uc3VtZWRTZWdtZW50czogcmVzLmNvbnN1bWVkLCBsYXN0Q2hpbGQ6IHJlcy5jb25zdW1lZC5sZW5ndGgsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBub2Rlc1xuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2tPdXRsZXROYW1lVW5pcXVlbmVzcyhub2Rlcykge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbmFtZXMgPSB7fTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByb3V0ZVdpdGhTYW1lT3V0bGV0TmFtZSA9IG5hbWVzW24udmFsdWUub3V0bGV0XTtcbiAgICAgICAgICBpZiAocm91dGVXaXRoU2FtZU91dGxldE5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcCA9IHJvdXRlV2l0aFNhbWVPdXRsZXROYW1lLnVybC5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMudG9TdHJpbmcoKTsgfSkuam9pbignLycpO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjID0gbi52YWx1ZS51cmwubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnRvU3RyaW5nKCk7IH0pLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHdvIHNlZ21lbnRzIGNhbm5vdCBoYXZlIHRoZSBzYW1lIG91dGxldCBuYW1lOiAnXCIgKyBwICsgXCInIGFuZCAnXCIgKyBjICsgXCInLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmFtZXNbbi52YWx1ZS5vdXRsZXRdID0gbi52YWx1ZTtcbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U291cmNlU2VnbWVudEdyb3VwKHNlZ21lbnRHcm91cCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IHNlZ21lbnRHcm91cDtcbiAgICAgIHdoaWxlIChzLl9zb3VyY2VTZWdtZW50KSB7XG4gICAgICAgICAgcyA9IHMuX3NvdXJjZVNlZ21lbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcztcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBzZWdtZW50R3JvdXBcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhJbmRleFNoaWZ0KHNlZ21lbnRHcm91cCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IHNlZ21lbnRHcm91cDtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IChzLl9zZWdtZW50SW5kZXhTaGlmdCA/IHMuX3NlZ21lbnRJbmRleFNoaWZ0IDogMCk7XG4gICAgICB3aGlsZSAocy5fc291cmNlU2VnbWVudCkge1xuICAgICAgICAgIHMgPSBzLl9zb3VyY2VTZWdtZW50O1xuICAgICAgICAgIHJlcyArPSAocy5fc2VnbWVudEluZGV4U2hpZnQgPyBzLl9zZWdtZW50SW5kZXhTaGlmdCA6IDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcyAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gY29uc3VtZWRTZWdtZW50c1xuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gY29uZmlnXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdCQxKHNlZ21lbnRHcm91cCwgY29uc3VtZWRTZWdtZW50cywgc2xpY2VkU2VnbWVudHMsIGNvbmZpZykge1xuICAgICAgaWYgKHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBjb250YWluc0VtcHR5UGF0aE1hdGNoZXNXaXRoTmFtZWRPdXRsZXRzKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIGNvbmZpZykpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gbmV3IFVybFNlZ21lbnRHcm91cChjb25zdW1lZFNlZ21lbnRzLCBjcmVhdGVDaGlsZHJlbkZvckVtcHR5UGF0aHMoc2VnbWVudEdyb3VwLCBjb25zdW1lZFNlZ21lbnRzLCBjb25maWcsIG5ldyBVcmxTZWdtZW50R3JvdXAoc2xpY2VkU2VnbWVudHMsIHNlZ21lbnRHcm91cC5jaGlsZHJlbikpKTtcbiAgICAgICAgICBzLl9zb3VyY2VTZWdtZW50ID0gc2VnbWVudEdyb3VwO1xuICAgICAgICAgIHMuX3NlZ21lbnRJbmRleFNoaWZ0ID0gY29uc3VtZWRTZWdtZW50cy5sZW5ndGg7XG4gICAgICAgICAgcmV0dXJuIHsgc2VnbWVudEdyb3VwOiBzLCBzbGljZWRTZWdtZW50czogW10gfTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIGNvbnRhaW5zRW1wdHlQYXRoTWF0Y2hlcyhzZWdtZW50R3JvdXAsIHNsaWNlZFNlZ21lbnRzLCBjb25maWcpKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IG5ldyBVcmxTZWdtZW50R3JvdXAoc2VnbWVudEdyb3VwLnNlZ21lbnRzLCBhZGRFbXB0eVBhdGhzVG9DaGlsZHJlbklmTmVlZGVkKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIGNvbmZpZywgc2VnbWVudEdyb3VwLmNoaWxkcmVuKSk7XG4gICAgICAgICAgcy5fc291cmNlU2VnbWVudCA9IHNlZ21lbnRHcm91cDtcbiAgICAgICAgICBzLl9zZWdtZW50SW5kZXhTaGlmdCA9IGNvbnN1bWVkU2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgIHJldHVybiB7IHNlZ21lbnRHcm91cDogcywgc2xpY2VkU2VnbWVudHM6IHNsaWNlZFNlZ21lbnRzIH07XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gbmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50R3JvdXAuc2VnbWVudHMsIHNlZ21lbnRHcm91cC5jaGlsZHJlbik7XG4gICAgICAgICAgcy5fc291cmNlU2VnbWVudCA9IHNlZ21lbnRHcm91cDtcbiAgICAgICAgICBzLl9zZWdtZW50SW5kZXhTaGlmdCA9IGNvbnN1bWVkU2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgIHJldHVybiB7IHNlZ21lbnRHcm91cDogcywgc2xpY2VkU2VnbWVudHM6IHNsaWNlZFNlZ21lbnRzIH07XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gc2xpY2VkU2VnbWVudHNcbiAgICogQHBhcmFtIHs/fSByb3V0ZXNcbiAgICogQHBhcmFtIHs/fSBjaGlsZHJlblxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRW1wdHlQYXRoc1RvQ2hpbGRyZW5JZk5lZWRlZChzZWdtZW50R3JvdXAsIHNsaWNlZFNlZ21lbnRzLCByb3V0ZXMsIGNoaWxkcmVuKSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgIGZvciAodmFyIF9pID0gMCwgcm91dGVzXzEgPSByb3V0ZXM7IF9pIDwgcm91dGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgdmFyIHIgPSByb3V0ZXNfMVtfaV07XG4gICAgICAgICAgaWYgKGVtcHR5UGF0aE1hdGNoKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHIpICYmICFjaGlsZHJlbltnZXRPdXRsZXQkMihyKV0pIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IG5ldyBVcmxTZWdtZW50R3JvdXAoW10sIHt9KTtcbiAgICAgICAgICAgICAgcy5fc291cmNlU2VnbWVudCA9IHNlZ21lbnRHcm91cDtcbiAgICAgICAgICAgICAgcy5fc2VnbWVudEluZGV4U2hpZnQgPSBzZWdtZW50R3JvdXAuc2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICByZXNbZ2V0T3V0bGV0JDIocildID0gcztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2UoY2hpbGRyZW4sIHJlcyk7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gY29uc3VtZWRTZWdtZW50c1xuICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgKiBAcGFyYW0gez99IHByaW1hcnlTZWdtZW50XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbkZvckVtcHR5UGF0aHMoc2VnbWVudEdyb3VwLCBjb25zdW1lZFNlZ21lbnRzLCByb3V0ZXMsIHByaW1hcnlTZWdtZW50KSB7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXMgPSB7fTtcbiAgICAgIHJlc1tQUklNQVJZX09VVExFVF0gPSBwcmltYXJ5U2VnbWVudDtcbiAgICAgIHByaW1hcnlTZWdtZW50Ll9zb3VyY2VTZWdtZW50ID0gc2VnbWVudEdyb3VwO1xuICAgICAgcHJpbWFyeVNlZ21lbnQuX3NlZ21lbnRJbmRleFNoaWZ0ID0gY29uc3VtZWRTZWdtZW50cy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBfaSA9IDAsIHJvdXRlc18yID0gcm91dGVzOyBfaSA8IHJvdXRlc18yLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciByID0gcm91dGVzXzJbX2ldO1xuICAgICAgICAgIGlmIChyLnBhdGggPT09ICcnICYmIGdldE91dGxldCQyKHIpICE9PSBQUklNQVJZX09VVExFVCkge1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gbmV3IFVybFNlZ21lbnRHcm91cChbXSwge30pO1xuICAgICAgICAgICAgICBzLl9zb3VyY2VTZWdtZW50ID0gc2VnbWVudEdyb3VwO1xuICAgICAgICAgICAgICBzLl9zZWdtZW50SW5kZXhTaGlmdCA9IGNvbnN1bWVkU2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICByZXNbZ2V0T3V0bGV0JDIocildID0gcztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb250YWluc0VtcHR5UGF0aE1hdGNoZXNXaXRoTmFtZWRPdXRsZXRzKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHJvdXRlcykge1xuICAgICAgcmV0dXJuIHJvdXRlc1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIGVtcHR5UGF0aE1hdGNoKHNlZ21lbnRHcm91cCwgc2xpY2VkU2VnbWVudHMsIHIpICYmXG4gICAgICAgICAgZ2V0T3V0bGV0JDIocikgIT09IFBSSU1BUllfT1VUTEVUOyB9KVxuICAgICAgICAgIC5sZW5ndGggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNlZ21lbnRHcm91cFxuICAgKiBAcGFyYW0gez99IHNsaWNlZFNlZ21lbnRzXG4gICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBjb250YWluc0VtcHR5UGF0aE1hdGNoZXMoc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcm91dGVzKSB7XG4gICAgICByZXR1cm4gcm91dGVzLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gZW1wdHlQYXRoTWF0Y2goc2VnbWVudEdyb3VwLCBzbGljZWRTZWdtZW50cywgcik7IH0pLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc2VnbWVudEdyb3VwXG4gICAqIEBwYXJhbSB7P30gc2xpY2VkU2VnbWVudHNcbiAgICogQHBhcmFtIHs/fSByXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBlbXB0eVBhdGhNYXRjaChzZWdtZW50R3JvdXAsIHNsaWNlZFNlZ21lbnRzLCByKSB7XG4gICAgICBpZiAoKHNlZ21lbnRHcm91cC5oYXNDaGlsZHJlbigpIHx8IHNsaWNlZFNlZ21lbnRzLmxlbmd0aCA+IDApICYmIHIucGF0aE1hdGNoID09PSAnZnVsbCcpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHIucGF0aCA9PT0gJycgJiYgci5yZWRpcmVjdFRvID09PSB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldE91dGxldCQyKHJvdXRlKSB7XG4gICAgICByZXR1cm4gcm91dGUub3V0bGV0ID8gcm91dGUub3V0bGV0IDogUFJJTUFSWV9PVVRMRVQ7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGdldERhdGEocm91dGUpIHtcbiAgICAgIHJldHVybiByb3V0ZS5kYXRhID8gcm91dGUuZGF0YSA6IHt9O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZXNvbHZlKHJvdXRlKSB7XG4gICAgICByZXR1cm4gcm91dGUucmVzb2x2ZSA/IHJvdXRlLnJlc29sdmUgOiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbGljZW5zZVxuICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICpcbiAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgKi9cbiAgLyoqXG4gICAqICAqXG4gICAqL1xuICB2YXIgUm91dGVyT3V0bGV0TWFwID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFJvdXRlck91dGxldE1hcCgpIHtcbiAgICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgICAgdGhpcy5fb3V0bGV0cyA9IHt9O1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgQWRkcyBhbiBvdXRsZXQgdG8gdGhpcyBtYXAuXG4gICAgICAgKiBAcGFyYW0gez99IG5hbWVcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJPdXRsZXRNYXAucHJvdG90eXBlLnJlZ2lzdGVyT3V0bGV0ID0gZnVuY3Rpb24gKG5hbWUsIG91dGxldCkgeyB0aGlzLl9vdXRsZXRzW25hbWVdID0gb3V0bGV0OyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUmVtb3ZlcyBhbiBvdXRsZXQgZnJvbSB0aGlzIG1hcC5cbiAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyT3V0bGV0TWFwLnByb3RvdHlwZS5yZW1vdmVPdXRsZXQgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLl9vdXRsZXRzW25hbWVdID0gdW5kZWZpbmVkOyB9O1xuICAgICAgcmV0dXJuIFJvdXRlck91dGxldE1hcDtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQGxpY2Vuc2VcbiAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAqXG4gICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICovXG4gIC8qKlxuICAgKiAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHZhciBVcmxIYW5kbGluZ1N0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFVybEhhbmRsaW5nU3RyYXRlZ3koKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqICBUZWxscyB0aGUgcm91dGVyIGlmIHRoaXMgVVJMIHNob3VsZCBiZSBwcm9jZXNzZWQuXG4gICAgICAgICogKlxuICAgICAgICAqIFdoZW4gaXQgcmV0dXJucyB0cnVlLCB0aGUgcm91dGVyIHdpbGwgZXhlY3V0ZSB0aGUgcmVndWxhciBuYXZpZ2F0aW9uLlxuICAgICAgICAqIFdoZW4gaXQgcmV0dXJucyBmYWxzZSwgdGhlIHJvdXRlciB3aWxsIHNldCB0aGUgcm91dGVyIHN0YXRlIHRvIGFuIGVtcHR5IHN0YXRlLlxuICAgICAgICAqIEFzIGEgcmVzdWx0LCBhbGwgdGhlIGFjdGl2ZSBjb21wb25lbnRzIHdpbGwgYmUgZGVzdHJveWVkLlxuICAgICAgICAqICpcbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybEhhbmRsaW5nU3RyYXRlZ3kucHJvdG90eXBlLnNob3VsZFByb2Nlc3NVcmwgPSBmdW5jdGlvbiAodXJsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBFeHRyYWN0cyB0aGUgcGFydCBvZiB0aGUgVVJMIHRoYXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHJvdXRlci5cbiAgICAgICAgKiBUaGUgcmVzdCBvZiB0aGUgVVJMIHdpbGwgcmVtYWluIHVudG91Y2hlZC5cbiAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybEhhbmRsaW5nU3RyYXRlZ3kucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAodXJsKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBNZXJnZXMgdGhlIFVSTCBmcmFnbWVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSBVUkwuXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gbmV3VXJsUGFydFxuICAgICAgICogQHBhcmFtIHs/fSByYXdVcmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFVybEhhbmRsaW5nU3RyYXRlZ3kucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKG5ld1VybFBhcnQsIHJhd1VybCkgeyB9O1xuICAgICAgcmV0dXJuIFVybEhhbmRsaW5nU3RyYXRlZ3k7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2YXIgRGVmYXVsdFVybEhhbmRsaW5nU3RyYXRlZ3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gRGVmYXVsdFVybEhhbmRsaW5nU3RyYXRlZ3koKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0VXJsSGFuZGxpbmdTdHJhdGVneS5wcm90b3R5cGUuc2hvdWxkUHJvY2Vzc1VybCA9IGZ1bmN0aW9uICh1cmwpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0VXJsSGFuZGxpbmdTdHJhdGVneS5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uICh1cmwpIHsgcmV0dXJuIHVybDsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBuZXdVcmxQYXJ0XG4gICAgICAgKiBAcGFyYW0gez99IHdob2xlVXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0VXJsSGFuZGxpbmdTdHJhdGVneS5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbiAobmV3VXJsUGFydCwgd2hvbGVVcmwpIHsgcmV0dXJuIG5ld1VybFBhcnQ7IH07XG4gICAgICByZXR1cm4gRGVmYXVsdFVybEhhbmRsaW5nU3RyYXRlZ3k7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqICAqXG4gICAqL1xuICB2YXIgTmF2aWdhdGlvblN0YXJ0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTmF2aWdhdGlvblN0YXJ0KGlkLCB1cmwpIHtcbiAgICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5hdmlnYXRpb25TdGFydC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIk5hdmlnYXRpb25TdGFydChpZDogXCIgKyB0aGlzLmlkICsgXCIsIHVybDogJ1wiICsgdGhpcy51cmwgKyBcIicpXCI7IH07XG4gICAgICByZXR1cm4gTmF2aWdhdGlvblN0YXJ0O1xuICB9KCkpO1xuICAvKipcbiAgICogICpcbiAgICovXG4gIHZhciBOYXZpZ2F0aW9uRW5kID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsQWZ0ZXJSZWRpcmVjdHNcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gTmF2aWdhdGlvbkVuZChpZCwgdXJsLCB1cmxBZnRlclJlZGlyZWN0cykge1xuICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICB0aGlzLnVybEFmdGVyUmVkaXJlY3RzID0gdXJsQWZ0ZXJSZWRpcmVjdHM7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5hdmlnYXRpb25FbmQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBcIk5hdmlnYXRpb25FbmQoaWQ6IFwiICsgdGhpcy5pZCArIFwiLCB1cmw6ICdcIiArIHRoaXMudXJsICsgXCInLCB1cmxBZnRlclJlZGlyZWN0czogJ1wiICsgdGhpcy51cmxBZnRlclJlZGlyZWN0cyArIFwiJylcIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gTmF2aWdhdGlvbkVuZDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqICAqXG4gICAqL1xuICB2YXIgTmF2aWdhdGlvbkNhbmNlbCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez99IHJlYXNvblxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBOYXZpZ2F0aW9uQ2FuY2VsKGlkLCB1cmwsIHJlYXNvbikge1xuICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgTmF2aWdhdGlvbkNhbmNlbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIk5hdmlnYXRpb25DYW5jZWwoaWQ6IFwiICsgdGhpcy5pZCArIFwiLCB1cmw6ICdcIiArIHRoaXMudXJsICsgXCInKVwiOyB9O1xuICAgICAgcmV0dXJuIE5hdmlnYXRpb25DYW5jZWw7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgKlxuICAgKi9cbiAgdmFyIE5hdmlnYXRpb25FcnJvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez99IGVycm9yXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIE5hdmlnYXRpb25FcnJvcihpZCwgdXJsLCBlcnJvcikge1xuICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIE5hdmlnYXRpb25FcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiTmF2aWdhdGlvbkVycm9yKGlkOiBcIiArIHRoaXMuaWQgKyBcIiwgdXJsOiAnXCIgKyB0aGlzLnVybCArIFwiJywgZXJyb3I6IFwiICsgdGhpcy5lcnJvciArIFwiKVwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBOYXZpZ2F0aW9uRXJyb3I7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgKlxuICAgKi9cbiAgdmFyIFJvdXRlc1JlY29nbml6ZWQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICogQHBhcmFtIHs/fSB1cmxBZnRlclJlZGlyZWN0c1xuICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSb3V0ZXNSZWNvZ25pemVkKGlkLCB1cmwsIHVybEFmdGVyUmVkaXJlY3RzLCBzdGF0ZSkge1xuICAgICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICB0aGlzLnVybEFmdGVyUmVkaXJlY3RzID0gdXJsQWZ0ZXJSZWRpcmVjdHM7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXNSZWNvZ25pemVkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gXCJSb3V0ZXNSZWNvZ25pemVkKGlkOiBcIiArIHRoaXMuaWQgKyBcIiwgdXJsOiAnXCIgKyB0aGlzLnVybCArIFwiJywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICdcIiArIHRoaXMudXJsQWZ0ZXJSZWRpcmVjdHMgKyBcIicsIHN0YXRlOiBcIiArIHRoaXMuc3RhdGUgKyBcIilcIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gUm91dGVzUmVjb2duaXplZDtcbiAgfSgpKTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gZXJyb3JcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICB9XG4gIC8qKlxuICAgKiAgRG9lcyBub3QgZGV0YWNoIGFueSBzdWJ0cmVlcy4gUmV1c2VzIHJvdXRlcyBhcyBsb25nIGFzIHRoZWlyIHJvdXRlIGNvbmZpZyBpcyB0aGUgc2FtZS5cbiAgICovXG4gIHZhciBEZWZhdWx0Um91dGVSZXVzZVN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIERlZmF1bHRSb3V0ZVJldXNlU3RyYXRlZ3koKSB7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERlZmF1bHRSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnNob3VsZERldGFjaCA9IGZ1bmN0aW9uIChyb3V0ZSkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEBwYXJhbSB7P30gZGV0YWNoZWRUcmVlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0Um91dGVSZXVzZVN0cmF0ZWd5LnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uIChyb3V0ZSwgZGV0YWNoZWRUcmVlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERlZmF1bHRSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnNob3VsZEF0dGFjaCA9IGZ1bmN0aW9uIChyb3V0ZSkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIERlZmF1bHRSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnJldHJpZXZlID0gZnVuY3Rpb24gKHJvdXRlKSB7IHJldHVybiBudWxsOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZVxuICAgICAgICogQHBhcmFtIHs/fSBjdXJyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBEZWZhdWx0Um91dGVSZXVzZVN0cmF0ZWd5LnByb3RvdHlwZS5zaG91bGRSZXVzZVJvdXRlID0gZnVuY3Rpb24gKGZ1dHVyZSwgY3Vycikge1xuICAgICAgICAgIHJldHVybiBmdXR1cmUucm91dGVDb25maWcgPT09IGN1cnIucm91dGVDb25maWc7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIERlZmF1bHRSb3V0ZVJldXNlU3RyYXRlZ3k7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgKlxuICAgICogU2VlIHtAbGluayBSb3V0ZXN9IGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzLlxuICAgICogKlxuICAgICogKlxuICAgKi9cbiAgdmFyIFJvdXRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm9vdENvbXBvbmVudFR5cGVcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsU2VyaWFsaXplclxuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRNYXBcbiAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb25cbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gbG9hZGVyXG4gICAgICAgKiBAcGFyYW0gez99IGNvbXBpbGVyXG4gICAgICAgKiBAcGFyYW0gez99IGNvbmZpZ1xuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSb3V0ZXIocm9vdENvbXBvbmVudFR5cGUsIHVybFNlcmlhbGl6ZXIsIG91dGxldE1hcCwgbG9jYXRpb24sIGluamVjdG9yLCBsb2FkZXIsIGNvbXBpbGVyLCBjb25maWcpIHtcbiAgICAgICAgICB0aGlzLnJvb3RDb21wb25lbnRUeXBlID0gcm9vdENvbXBvbmVudFR5cGU7XG4gICAgICAgICAgdGhpcy51cmxTZXJpYWxpemVyID0gdXJsU2VyaWFsaXplcjtcbiAgICAgICAgICB0aGlzLm91dGxldE1hcCA9IG91dGxldE1hcDtcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgIHRoaXMubmF2aWdhdGlvbnMgPSBuZXcgcnhqc19CZWhhdmlvclN1YmplY3QuQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgICAgICAgIHRoaXMucm91dGVyRXZlbnRzID0gbmV3IHJ4anNfU3ViamVjdC5TdWJqZWN0KCk7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSWQgPSAwO1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVycm9yIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkIHdoZW4gYSBuYXZpZ2F0aW9uIGVycm9ycy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFNlZSB7QGxpbmsgRXJyb3JIYW5kbGVyfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXI7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSW5kaWNhdGVzIGlmIGF0IGxlYXN0IG9uZSBuYXZpZ2F0aW9uIGhhcHBlbmVkLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMubmF2aWdhdGVkID0gZmFsc2U7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRXh0cmFjdHMgYW5kIG1lcmdlcyBVUkxzLiBVc2VkIGZvciBBbmd1bGFyIDEgdG8gQW5ndWxhciAyIG1pZ3JhdGlvbnMuXG4gICAgICAgICAgICovXG4gICAgICAgICAgdGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5ID0gbmV3IERlZmF1bHRVcmxIYW5kbGluZ1N0cmF0ZWd5KCk7XG4gICAgICAgICAgdGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kgPSBuZXcgRGVmYXVsdFJvdXRlUmV1c2VTdHJhdGVneSgpO1xuICAgICAgICAgIHRoaXMucmVzZXRDb25maWcoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRVcmxUcmVlID0gY3JlYXRlRW1wdHlVcmxUcmVlKCk7XG4gICAgICAgICAgdGhpcy5yYXdVcmxUcmVlID0gdGhpcy5jdXJyZW50VXJsVHJlZTtcbiAgICAgICAgICB0aGlzLmNvbmZpZ0xvYWRlciA9IG5ldyBSb3V0ZXJDb25maWdMb2FkZXIobG9hZGVyLCBjb21waWxlcik7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Um91dGVyU3RhdGUgPSBjcmVhdGVFbXB0eVN0YXRlKHRoaXMuY3VycmVudFVybFRyZWUsIHRoaXMucm9vdENvbXBvbmVudFR5cGUpO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc05hdmlnYXRpb25zKCk7XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAqICBUT0RPOiB0aGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByb3V0ZXIgbWFkZSBpbnRlcm5hbFxuICAgICAgICogQHBhcmFtIHs/fSByb290Q29tcG9uZW50VHlwZVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5yZXNldFJvb3RDb21wb25lbnRUeXBlID0gZnVuY3Rpb24gKHJvb3RDb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgdGhpcy5yb290Q29tcG9uZW50VHlwZSA9IHJvb3RDb21wb25lbnRUeXBlO1xuICAgICAgICAgIC8vIFRPRE86IHZzYXZraW4gcm91dGVyIDQuMCBzaG91bGQgbWFrZSB0aGUgcm9vdCBjb21wb25lbnQgc2V0IHRvIG51bGxcbiAgICAgICAgICAvLyB0aGlzIHdpbGwgc2ltcGxpZnkgdGhlIGxpZmVjeWNsZSBvZiB0aGUgcm91dGVyLlxuICAgICAgICAgIHRoaXMuY3VycmVudFJvdXRlclN0YXRlLnJvb3QuY29tcG9uZW50ID0gdGhpcy5yb290Q29tcG9uZW50VHlwZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBTZXRzIHVwIHRoZSBsb2NhdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIHBlcmZvcm1zIHRoZSBpbml0aWFsIG5hdmlnYXRpb24uXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXIucHJvdG90eXBlLmluaXRpYWxOYXZpZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuc2V0VXBMb2NhdGlvbkNoYW5nZUxpc3RlbmVyKCk7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0ZUJ5VXJsKHRoaXMubG9jYXRpb24ucGF0aCh0cnVlKSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFNldHMgdXAgdGhlIGxvY2F0aW9uIGNoYW5nZSBsaXN0ZW5lci5cbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUuc2V0VXBMb2NhdGlvbkNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgLy8gWm9uZS5jdXJyZW50LndyYXAgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGlzc3VlIHdpdGggUnhKUyBzY2hlZHVsZXIsXG4gICAgICAgICAgLy8gd2hpY2ggZG9lcyBub3Qgd29yayBwcm9wZXJseSB3aXRoIHpvbmUuanMgaW4gSUUgYW5kIFNhZmFyaVxuICAgICAgICAgIGlmICghdGhpcy5sb2NhdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uU3Vic2NyaXB0aW9uID0gKHRoaXMubG9jYXRpb24uc3Vic2NyaWJlKFpvbmUuY3VycmVudC53cmFwKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJhd1VybFRyZWUgPSBfdGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKGNoYW5nZVsndXJsJ10pO1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc291cmNlID0gY2hhbmdlWyd0eXBlJ10gPT09ICdwb3BzdGF0ZScgPyAncG9wc3RhdGUnIDogJ2hhc2hjaGFuZ2UnO1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IF90aGlzLnNjaGVkdWxlTmF2aWdhdGlvbihyYXdVcmxUcmVlLCBzb3VyY2UsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTsgfSwgMCk7XG4gICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb3V0ZXIucHJvdG90eXBlLCBcInJvdXRlclN0YXRlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgVGhlIGN1cnJlbnQgcm91dGUgc3RhdGVcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jdXJyZW50Um91dGVyU3RhdGU7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlci5wcm90b3R5cGUsIFwidXJsXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiAgVGhlIGN1cnJlbnQgdXJsXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc2VyaWFsaXplVXJsKHRoaXMuY3VycmVudFVybFRyZWUpOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb3V0ZXIucHJvdG90eXBlLCBcImV2ZW50c1wiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogIEFuIG9ic2VydmFibGUgb2Ygcm91dGVyIGV2ZW50c1xuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJvdXRlckV2ZW50czsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqICBSZXNldHMgdGhlIGNvbmZpZ3VyYXRpb24gdXNlZCBmb3IgbmF2aWdhdGlvbiBhbmQgZ2VuZXJhdGluZyBsaW5rcy5cbiAgICAgICAgKiAqXG4gICAgICAgICogIyMjIFVzYWdlXG4gICAgICAgICogKlxuICAgICAgICAqIGBgYFxuICAgICAgICAqIHJvdXRlci5yZXNldENvbmZpZyhbXG4gICAgICAgICogeyBwYXRoOiAndGVhbS86aWQnLCBjb21wb25lbnQ6IFRlYW1DbXAsIGNoaWxkcmVuOiBbXG4gICAgICAgICogeyBwYXRoOiAnc2ltcGxlJywgY29tcG9uZW50OiBTaW1wbGVDbXAgfSxcbiAgICAgICAgKiB7IHBhdGg6ICd1c2VyLzpuYW1lJywgY29tcG9uZW50OiBVc2VyQ21wIH1cbiAgICAgICAgKiBdfVxuICAgICAgICAqIF0pO1xuICAgICAgICAqIGBgYFxuICAgICAgICogQHBhcmFtIHs/fSBjb25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUucmVzZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuZGlzcG9zZSgpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgRGlzcG9zZXMgb2YgdGhlIHJvdXRlclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLmxvY2F0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMubG9jYXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvblN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIEFwcGxpZXMgYW4gYXJyYXkgb2YgY29tbWFuZHMgdG8gdGhlIGN1cnJlbnQgdXJsIHRyZWUgYW5kIGNyZWF0ZXMgYSBuZXcgdXJsIHRyZWUuXG4gICAgICAgICogKlxuICAgICAgICAqIFdoZW4gZ2l2ZW4gYW4gYWN0aXZhdGUgcm91dGUsIGFwcGxpZXMgdGhlIGdpdmVuIGNvbW1hbmRzIHN0YXJ0aW5nIGZyb20gdGhlIHJvdXRlLlxuICAgICAgICAqIFdoZW4gbm90IGdpdmVuIGEgcm91dGUsIGFwcGxpZXMgdGhlIGdpdmVuIGNvbW1hbmQgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdC5cbiAgICAgICAgKiAqXG4gICAgICAgICogIyMjIFVzYWdlXG4gICAgICAgICogKlxuICAgICAgICAqIGBgYFxuICAgICAgICAqIC8vIGNyZWF0ZSAvdGVhbS8zMy91c2VyLzExXG4gICAgICAgICogcm91dGVyLmNyZWF0ZVVybFRyZWUoWycvdGVhbScsIDMzLCAndXNlcicsIDExXSk7XG4gICAgICAgICogKlxuICAgICAgICAqIC8vIGNyZWF0ZSAvdGVhbS8zMztleHBhbmQ9dHJ1ZS91c2VyLzExXG4gICAgICAgICogcm91dGVyLmNyZWF0ZVVybFRyZWUoWycvdGVhbScsIDMzLCB7ZXhwYW5kOiB0cnVlfSwgJ3VzZXInLCAxMV0pO1xuICAgICAgICAqICpcbiAgICAgICAgKiAvLyB5b3UgY2FuIGNvbGxhcHNlIHN0YXRpYyBzZWdtZW50cyBsaWtlIHRoaXMgKHRoaXMgd29ya3Mgb25seSB3aXRoIHRoZSBmaXJzdCBwYXNzZWQtaW4gdmFsdWUpOlxuICAgICAgICAqIHJvdXRlci5jcmVhdGVVcmxUcmVlKFsnL3RlYW0vMzMvdXNlcicsIHVzZXJJZF0pO1xuICAgICAgICAqICpcbiAgICAgICAgKiAvLyBJZiB0aGUgZmlyc3Qgc2VnbWVudCBjYW4gY29udGFpbiBzbGFzaGVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSByb3V0ZXIgdG8gc3BsaXQgaXQsIHlvdVxuICAgICAgICAqIC8vIGNhbiBkbyB0aGUgZm9sbG93aW5nOlxuICAgICAgICAqICpcbiAgICAgICAgKiByb3V0ZXIuY3JlYXRlVXJsVHJlZShbe3NlZ21lbnRQYXRoOiAnL29uZS90d28nfV0pO1xuICAgICAgICAqICpcbiAgICAgICAgKiAvLyBjcmVhdGUgL3RlYW0vMzMvKHVzZXIvMTEvL3JpZ2h0OmNoYXQpXG4gICAgICAgICogcm91dGVyLmNyZWF0ZVVybFRyZWUoWycvdGVhbScsIDMzLCB7b3V0bGV0czoge3ByaW1hcnk6ICd1c2VyLzExJywgcmlnaHQ6ICdjaGF0J319XSk7XG4gICAgICAgICogKlxuICAgICAgICAqIC8vIHJlbW92ZSB0aGUgcmlnaHQgc2Vjb25kYXJ5IG5vZGVcbiAgICAgICAgKiByb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy90ZWFtJywgMzMsIHtvdXRsZXRzOiB7cHJpbWFyeTogJ3VzZXIvMTEnLCByaWdodDogbnVsbH19XSk7XG4gICAgICAgICogKlxuICAgICAgICAqIC8vIGFzc3VtaW5nIHRoZSBjdXJyZW50IHVybCBpcyBgL3RlYW0vMzMvdXNlci8xMWAgYW5kIHRoZSByb3V0ZSBwb2ludHMgdG8gYHVzZXIvMTFgXG4gICAgICAgICogKlxuICAgICAgICAqIC8vIG5hdmlnYXRlIHRvIC90ZWFtLzMzL3VzZXIvMTEvZGV0YWlsc1xuICAgICAgICAqIHJvdXRlci5jcmVhdGVVcmxUcmVlKFsnZGV0YWlscyddLCB7cmVsYXRpdmVUbzogcm91dGV9KTtcbiAgICAgICAgKiAqXG4gICAgICAgICogLy8gbmF2aWdhdGUgdG8gL3RlYW0vMzMvdXNlci8yMlxuICAgICAgICAqIHJvdXRlci5jcmVhdGVVcmxUcmVlKFsnLi4vMjInXSwge3JlbGF0aXZlVG86IHJvdXRlfSk7XG4gICAgICAgICogKlxuICAgICAgICAqIC8vIG5hdmlnYXRlIHRvIC90ZWFtLzQ0L3VzZXIvMjJcbiAgICAgICAgKiByb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy4uLy4uL3RlYW0vNDQvdXNlci8yMiddLCB7cmVsYXRpdmVUbzogcm91dGV9KTtcbiAgICAgICAgKiBgYGBcbiAgICAgICAqIEBwYXJhbSB7P30gY29tbWFuZHNcbiAgICAgICAqIEBwYXJhbSB7Pz19IF9fMVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5jcmVhdGVVcmxUcmVlID0gZnVuY3Rpb24gKGNvbW1hbmRzLCBfYSkge1xuICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCByZWxhdGl2ZVRvID0gX2IucmVsYXRpdmVUbywgcXVlcnlQYXJhbXMgPSBfYi5xdWVyeVBhcmFtcywgZnJhZ21lbnQgPSBfYi5mcmFnbWVudCwgcHJlc2VydmVRdWVyeVBhcmFtcyA9IF9iLnByZXNlcnZlUXVlcnlQYXJhbXMsIHByZXNlcnZlRnJhZ21lbnQgPSBfYi5wcmVzZXJ2ZUZyYWdtZW50O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGEgPSByZWxhdGl2ZVRvIHx8IHRoaXMucm91dGVyU3RhdGUucm9vdDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBxID0gcHJlc2VydmVRdWVyeVBhcmFtcyA/IHRoaXMuY3VycmVudFVybFRyZWUucXVlcnlQYXJhbXMgOiBxdWVyeVBhcmFtcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmID0gcHJlc2VydmVGcmFnbWVudCA/IHRoaXMuY3VycmVudFVybFRyZWUuZnJhZ21lbnQgOiBmcmFnbWVudDtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlVXJsVHJlZShhLCB0aGlzLmN1cnJlbnRVcmxUcmVlLCBjb21tYW5kcywgcSwgZik7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgTmF2aWdhdGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHVybC4gVGhpcyBuYXZpZ2F0aW9uIGlzIGFsd2F5cyBhYnNvbHV0ZS5cbiAgICAgICAgKiAqXG4gICAgICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdDpcbiAgICAgICAgKiAtIHJlc29sdmVzIHRvICd0cnVlJyB3aGVuIG5hdmlnYXRpb24gc3VjY2VlZHMsXG4gICAgICAgICogLSByZXNvbHZlcyB0byAnZmFsc2UnIHdoZW4gbmF2aWdhdGlvbiBmYWlscyxcbiAgICAgICAgKiAtIGlzIHJlamVjdGVkIHdoZW4gYW4gZXJyb3IgaGFwcGVucy5cbiAgICAgICAgKiAqXG4gICAgICAgICogIyMjIFVzYWdlXG4gICAgICAgICogKlxuICAgICAgICAqIGBgYFxuICAgICAgICAqIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL3RlYW0vMzMvdXNlci8xMVwiKTtcbiAgICAgICAgKiAqXG4gICAgICAgICogLy8gTmF2aWdhdGUgd2l0aG91dCB1cGRhdGluZyB0aGUgVVJMXG4gICAgICAgICogcm91dGVyLm5hdmlnYXRlQnlVcmwoXCIvdGVhbS8zMy91c2VyLzExXCIsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pO1xuICAgICAgICAqIGBgYFxuICAgICAgICAqICpcbiAgICAgICAgKiBJbiBvcHBvc2l0ZSB0byBgbmF2aWdhdGVgLCBgbmF2aWdhdGVCeVVybGAgdGFrZXMgYSB3aG9sZSBVUkxcbiAgICAgICAgKiBhbmQgZG9lcyBub3QgYXBwbHkgYW55IGRlbHRhIHRvIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez89fSBleHRyYXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUubmF2aWdhdGVCeVVybCA9IGZ1bmN0aW9uICh1cmwsIGV4dHJhcykge1xuICAgICAgICAgIGlmIChleHRyYXMgPT09IHZvaWQgMCkgeyBleHRyYXMgPSB7IHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2UgfTsgfVxuICAgICAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBVcmxUcmVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlTmF2aWdhdGlvbih0aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kubWVyZ2UodXJsLCB0aGlzLnJhd1VybFRyZWUpLCAnaW1wZXJhdGl2ZScsIGV4dHJhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVybFRyZWUgPSB0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UodXJsKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZU5hdmlnYXRpb24odGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5Lm1lcmdlKHVybFRyZWUsIHRoaXMucmF3VXJsVHJlZSksICdpbXBlcmF0aXZlJywgZXh0cmFzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBOYXZpZ2F0ZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgY29tbWFuZHMgYW5kIGEgc3RhcnRpbmcgcG9pbnQuXG4gICAgICAgICogSWYgbm8gc3RhcnRpbmcgcm91dGUgaXMgcHJvdmlkZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGFic29sdXRlLlxuICAgICAgICAqICpcbiAgICAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0OlxuICAgICAgICAqIC0gcmVzb2x2ZXMgdG8gJ3RydWUnIHdoZW4gbmF2aWdhdGlvbiBzdWNjZWVkcyxcbiAgICAgICAgKiAtIHJlc29sdmVzIHRvICdmYWxzZScgd2hlbiBuYXZpZ2F0aW9uIGZhaWxzLFxuICAgICAgICAqIC0gaXMgcmVqZWN0ZWQgd2hlbiBhbiBlcnJvciBoYXBwZW5zLlxuICAgICAgICAqICpcbiAgICAgICAgKiAjIyMgVXNhZ2VcbiAgICAgICAgKiAqXG4gICAgICAgICogYGBgXG4gICAgICAgICogcm91dGVyLm5hdmlnYXRlKFsndGVhbScsIDMzLCAndXNlcicsIDExXSwge3JlbGF0aXZlVG86IHJvdXRlfSk7XG4gICAgICAgICogKlxuICAgICAgICAqIC8vIE5hdmlnYXRlIHdpdGhvdXQgdXBkYXRpbmcgdGhlIFVSTFxuICAgICAgICAqIHJvdXRlci5uYXZpZ2F0ZShbJ3RlYW0nLCAzMywgJ3VzZXInLCAxMV0sIHtyZWxhdGl2ZVRvOiByb3V0ZSwgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlfSk7XG4gICAgICAgICogYGBgXG4gICAgICAgICogKlxuICAgICAgICAqIEluIG9wcG9zaXRlIHRvIGBuYXZpZ2F0ZUJ5VXJsYCwgYG5hdmlnYXRlYCBhbHdheXMgdGFrZXMgYSBkZWx0YSB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRcbiAgICAgICAgKiBVUkwuXG4gICAgICAgKiBAcGFyYW0gez99IGNvbW1hbmRzXG4gICAgICAgKiBAcGFyYW0gez89fSBleHRyYXNcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUubmF2aWdhdGUgPSBmdW5jdGlvbiAoY29tbWFuZHMsIGV4dHJhcykge1xuICAgICAgICAgIGlmIChleHRyYXMgPT09IHZvaWQgMCkgeyBleHRyYXMgPSB7IHNraXBMb2NhdGlvbkNoYW5nZTogZmFsc2UgfTsgfVxuICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmFzLnF1ZXJ5UGFyYW1zID09PSAnb2JqZWN0JyAmJiBleHRyYXMucXVlcnlQYXJhbXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZXh0cmFzLnF1ZXJ5UGFyYW1zID0gdGhpcy5yZW1vdmVFbXB0eVByb3BzKGV4dHJhcy5xdWVyeVBhcmFtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlQnlVcmwodGhpcy5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzLCBleHRyYXMpLCBleHRyYXMpO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogIFNlcmlhbGl6ZXMgYSB7QGxpbmsgVXJsVHJlZX0gaW50byBhIHN0cmluZ1xuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUuc2VyaWFsaXplVXJsID0gZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZSh1cmwpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUGFyc2VzIGEgc3RyaW5nIGludG8gYSB7QGxpbmsgVXJsVHJlZX1cbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXIucHJvdG90eXBlLnBhcnNlVXJsID0gZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gdGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHVybCk7IH07XG4gICAgICAvKipcbiAgICAgICAqICBSZXR1cm5zIHdoZXRoZXIgdGhlIHVybCBpcyBhY3RpdmF0ZWRcbiAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgKiBAcGFyYW0gez99IGV4YWN0XG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXIucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKHVybCwgZXhhY3QpIHtcbiAgICAgICAgICBpZiAodXJsIGluc3RhbmNlb2YgVXJsVHJlZSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUcmVlKHRoaXMuY3VycmVudFVybFRyZWUsIHVybCwgZXhhY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsVHJlZSA9IHRoaXMudXJsU2VyaWFsaXplci5wYXJzZSh1cmwpO1xuICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUcmVlKHRoaXMuY3VycmVudFVybFRyZWUsIHVybFRyZWUsIGV4YWN0KTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmFtc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5yZW1vdmVFbXB0eVByb3BzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhwYXJhbXMpLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdmFsdWUgPSBwYXJhbXNba2V5XTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9LCB7fSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXIucHJvdG90eXBlLnByb2Nlc3NOYXZpZ2F0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJ4anNfb3BlcmF0b3JfY29uY2F0TWFwLmNvbmNhdE1hcFxuICAgICAgICAgICAgICAuY2FsbCh0aGlzLm5hdmlnYXRpb25zLCBmdW5jdGlvbiAobmF2KSB7XG4gICAgICAgICAgICAgIGlmIChuYXYpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmV4ZWN1dGVTY2hlZHVsZWROYXZpZ2F0aW9uKG5hdik7XG4gICAgICAgICAgICAgICAgICAvLyBhIGZhaWxlZCBuYXZpZ2F0aW9uIHNob3VsZCBub3Qgc3RvcCB0aGUgcm91dGVyIGZyb20gcHJvY2Vzc2luZ1xuICAgICAgICAgICAgICAgICAgLy8gZnVydGhlciBuYXZpZ2F0aW9ucyA9PiB0aGUgY2F0Y2hcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuYXYucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChyeGpzX29ic2VydmFibGVfb2Yub2YobnVsbCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByYXdVcmxcbiAgICAgICAqIEBwYXJhbSB7P30gc291cmNlXG4gICAgICAgKiBAcGFyYW0gez99IGV4dHJhc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5zY2hlZHVsZU5hdmlnYXRpb24gPSBmdW5jdGlvbiAocmF3VXJsLCBzb3VyY2UsIGV4dHJhcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxhc3ROYXZpZ2F0aW9uID0gdGhpcy5uYXZpZ2F0aW9ucy52YWx1ZTtcbiAgICAgICAgICAvLyBJZiB0aGUgdXNlciB0cmlnZ2VycyBhIG5hdmlnYXRpb24gaW1wZXJhdGl2ZWx5IChlLmcuLCBieSB1c2luZyBuYXZpZ2F0ZUJ5VXJsKSxcbiAgICAgICAgICAvLyBhbmQgdGhhdCBuYXZpZ2F0aW9uIHJlc3VsdHMgaW4gJ3JlcGxhY2VTdGF0ZScgdGhhdCBsZWFkcyB0byB0aGUgc2FtZSBVUkwsXG4gICAgICAgICAgLy8gd2Ugc2hvdWxkIHNraXAgdGhvc2UuXG4gICAgICAgICAgaWYgKGxhc3ROYXZpZ2F0aW9uICYmIHNvdXJjZSAhPT0gJ2ltcGVyYXRpdmUnICYmIGxhc3ROYXZpZ2F0aW9uLnNvdXJjZSA9PT0gJ2ltcGVyYXRpdmUnICYmXG4gICAgICAgICAgICAgIGxhc3ROYXZpZ2F0aW9uLnJhd1VybC50b1N0cmluZygpID09PSByYXdVcmwudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gcmV0dXJuIHZhbHVlIGlzIG5vdCB1c2VkXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgYSBidWcgaW4gSUUgYW5kIEVkZ2UsIHRoZSBsb2NhdGlvbiBjbGFzcyBmaXJlcyB0d28gZXZlbnRzIChwb3BzdGF0ZSBhbmRcbiAgICAgICAgICAvLyBoYXNoY2hhbmdlKVxuICAgICAgICAgIC8vIGV2ZXJ5IHNpbmdsZSB0aW1lLiBUaGUgc2Vjb25kIG9uZSBzaG91bGQgYmUgaWdub3JlZC4gT3RoZXJ3aXNlLCB0aGUgVVJMIHdpbGwgZmxpY2tlci5cbiAgICAgICAgICBpZiAobGFzdE5hdmlnYXRpb24gJiYgc291cmNlID09ICdoYXNoY2hhbmdlJyAmJiBsYXN0TmF2aWdhdGlvbi5zb3VyY2UgPT09ICdwb3BzdGF0ZScgJiZcbiAgICAgICAgICAgICAgbGFzdE5hdmlnYXRpb24ucmF3VXJsLnRvU3RyaW5nKCkgPT09IHJhd1VybC50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyByZXR1cm4gdmFsdWUgaXMgbm90IHVzZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzb2x2ZSA9IG51bGw7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVqZWN0ID0gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpZCA9ICsrdGhpcy5uYXZpZ2F0aW9uSWQ7XG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9ucy5uZXh0KHsgaWQ6IGlkLCBzb3VyY2U6IHNvdXJjZSwgcmF3VXJsOiByYXdVcmwsIGV4dHJhczogZXh0cmFzLCByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCwgcHJvbWlzZTogcHJvbWlzZSB9KTtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXJyb3IgaXMgcHJvcGFnYXRlZCBldmVuIHRob3VnaCBgcHJvY2Vzc05hdmlnYXRpb25zYCBjYXRjaFxuICAgICAgICAgIC8vIGhhbmRsZXIgZG9lcyBub3QgcmV0aHJvd1xuICAgICAgICAgIHJldHVybiBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IF9fMFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyLnByb3RvdHlwZS5leGVjdXRlU2NoZWR1bGVkTmF2aWdhdGlvbiA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIGlkID0gX2EuaWQsIHJhd1VybCA9IF9hLnJhd1VybCwgZXh0cmFzID0gX2EuZXh0cmFzLCByZXNvbHZlID0gX2EucmVzb2x2ZSwgcmVqZWN0ID0gX2EucmVqZWN0O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHVybCA9IHRoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5leHRyYWN0KHJhd1VybCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdXJsVHJhbnNpdGlvbiA9ICF0aGlzLm5hdmlnYXRlZCB8fCB1cmwudG9TdHJpbmcoKSAhPT0gdGhpcy5jdXJyZW50VXJsVHJlZS50b1N0cmluZygpO1xuICAgICAgICAgIGlmICh1cmxUcmFuc2l0aW9uICYmIHRoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5zaG91bGRQcm9jZXNzVXJsKHJhd1VybCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJFdmVudHMubmV4dChuZXcgTmF2aWdhdGlvblN0YXJ0KGlkLCB0aGlzLnNlcmlhbGl6ZVVybCh1cmwpKSk7XG4gICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoXykgeyByZXR1cm4gX3RoaXMucnVuTmF2aWdhdGUodXJsLCByYXdVcmwsIGV4dHJhcy5za2lwTG9jYXRpb25DaGFuZ2UsIGV4dHJhcy5yZXBsYWNlVXJsLCBpZCwgbnVsbCk7IH0pXG4gICAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh1cmxUcmFuc2l0aW9uICYmIHRoaXMucmF3VXJsVHJlZSAmJlxuICAgICAgICAgICAgICB0aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kuc2hvdWxkUHJvY2Vzc1VybCh0aGlzLnJhd1VybFRyZWUpKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyRXZlbnRzLm5leHQobmV3IE5hdmlnYXRpb25TdGFydChpZCwgdGhpcy5zZXJpYWxpemVVcmwodXJsKSkpO1xuICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKF8pIHsgcmV0dXJuIF90aGlzLnJ1bk5hdmlnYXRlKHVybCwgcmF3VXJsLCBmYWxzZSwgZmFsc2UsIGlkLCBjcmVhdGVFbXB0eVN0YXRlKHVybCwgX3RoaXMucm9vdENvbXBvbmVudFR5cGUpLnNuYXBzaG90KTsgfSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnJhd1VybFRyZWUgPSByYXdVcmw7XG4gICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAqIEBwYXJhbSB7P30gcmF3VXJsXG4gICAgICAgKiBAcGFyYW0gez99IHNob3VsZFByZXZlbnRQdXNoU3RhdGVcbiAgICAgICAqIEBwYXJhbSB7P30gc2hvdWxkUmVwbGFjZVVybFxuICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICogQHBhcmFtIHs/fSBwcmVjcmVhdGVkU3RhdGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUucnVuTmF2aWdhdGUgPSBmdW5jdGlvbiAodXJsLCByYXdVcmwsIHNob3VsZFByZXZlbnRQdXNoU3RhdGUsIHNob3VsZFJlcGxhY2VVcmwsIGlkLCBwcmVjcmVhdGVkU3RhdGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmIChpZCAhPT0gdGhpcy5uYXZpZ2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5nbyh0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuY3VycmVudFVybFRyZWUpKTtcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJFdmVudHMubmV4dChuZXcgTmF2aWdhdGlvbkNhbmNlbChpZCwgdGhpcy5zZXJpYWxpemVVcmwodXJsKSwgXCJOYXZpZ2F0aW9uIElEIFwiICsgaWQgKyBcIiBpcyBub3QgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBpZCBcIiArIHRoaXMubmF2aWdhdGlvbklkKSk7XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlKSB7XG4gICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYnNlcnZhYmxlIG9mIHRoZSB1cmwgYW5kIHJvdXRlIHN0YXRlIHNuYXBzaG90XG4gICAgICAgICAgICAgIC8vIHRoaXMgb3BlcmF0aW9uIGRvIG5vdCByZXN1bHQgaW4gYW55IHNpZGUgZWZmZWN0c1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB1cmxBbmRTbmFwc2hvdCQ7XG4gICAgICAgICAgICAgIGlmICghcHJlY3JlYXRlZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZWRpcmVjdHNBcHBsaWVkJCA9IGFwcGx5UmVkaXJlY3RzKF90aGlzLmluamVjdG9yLCBfdGhpcy5jb25maWdMb2FkZXIsIF90aGlzLnVybFNlcmlhbGl6ZXIsIHVybCwgX3RoaXMuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgIHVybEFuZFNuYXBzaG90JCA9IHJ4anNfb3BlcmF0b3JfbWVyZ2VNYXAubWVyZ2VNYXAuY2FsbChyZWRpcmVjdHNBcHBsaWVkJCwgZnVuY3Rpb24gKGFwcGxpZWRVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocmVjb2duaXplKF90aGlzLnJvb3RDb21wb25lbnRUeXBlLCBfdGhpcy5jb25maWcsIGFwcGxpZWRVcmwsIF90aGlzLnNlcmlhbGl6ZVVybChhcHBsaWVkVXJsKSksIGZ1bmN0aW9uIChzbmFwc2hvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yb3V0ZXJFdmVudHMubmV4dChuZXcgUm91dGVzUmVjb2duaXplZChpZCwgX3RoaXMuc2VyaWFsaXplVXJsKHVybCksIF90aGlzLnNlcmlhbGl6ZVVybChhcHBsaWVkVXJsKSwgc25hcHNob3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYXBwbGllZFVybDogYXBwbGllZFVybCwgc25hcHNob3Q6IHNuYXBzaG90IH07XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHVybEFuZFNuYXBzaG90JCA9IHJ4anNfb2JzZXJ2YWJsZV9vZi5vZih7IGFwcGxpZWRVcmw6IHVybCwgc25hcHNob3Q6IHByZWNyZWF0ZWRTdGF0ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBydW4gcHJlYWN0aXZhdGlvbjogZ3VhcmRzIGFuZCBkYXRhIHJlc29sdmVyc1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVBY3RpdmF0aW9uO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVhY3RpdmF0aW9uVHJhdmVyc2UkID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwodXJsQW5kU25hcHNob3QkLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhcHBsaWVkVXJsID0gX2EuYXBwbGllZFVybCwgc25hcHNob3QgPSBfYS5zbmFwc2hvdDtcbiAgICAgICAgICAgICAgICAgIHByZUFjdGl2YXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcmVBY3RpdmF0aW9uKHNuYXBzaG90LCBfdGhpcy5jdXJyZW50Um91dGVyU3RhdGUuc25hcHNob3QsIF90aGlzLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICAgIHByZUFjdGl2YXRpb24udHJhdmVyc2UoX3RoaXMub3V0bGV0TWFwKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IGFwcGxpZWRVcmw6IGFwcGxpZWRVcmwsIHNuYXBzaG90OiBzbmFwc2hvdCB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJlYWN0aXZhdGlvbkNoZWNrR3VhcmRzID0gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKHByZWFjdGl2YXRpb25UcmF2ZXJzZSQsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgdmFyIGFwcGxpZWRVcmwgPSBfYS5hcHBsaWVkVXJsLCBzbmFwc2hvdCA9IF9hLnNuYXBzaG90O1xuICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLm5hdmlnYXRpb25JZCAhPT0gaWQpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb2JzZXJ2YWJsZV9vZi5vZihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocHJlQWN0aXZhdGlvbi5jaGVja0d1YXJkcygpLCBmdW5jdGlvbiAoc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhcHBsaWVkVXJsOiBhcHBsaWVkVXJsLCBzbmFwc2hvdDogc25hcHNob3QsIHNob3VsZEFjdGl2YXRlOiBzaG91bGRBY3RpdmF0ZSB9O1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmVhY3RpdmF0aW9uUmVzb2x2ZURhdGEkID0gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKHByZWFjdGl2YXRpb25DaGVja0d1YXJkcywgZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5uYXZpZ2F0aW9uSWQgIT09IGlkKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgaWYgKHAuc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocHJlQWN0aXZhdGlvbi5yZXNvbHZlRGF0YSgpLCBmdW5jdGlvbiAoKSB7IHJldHVybiBwOyB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YocCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBjcmVhdGUgcm91dGVyIHN0YXRlXG4gICAgICAgICAgICAgIC8vIHRoaXMgb3BlcmF0aW9uIGhhcyBzaWRlIGVmZmVjdHMgPT4gcm91dGUgc3RhdGUgaXMgYmVpbmcgYWZmZWN0ZWRcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcm91dGVyU3RhdGUkID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocHJlYWN0aXZhdGlvblJlc29sdmVEYXRhJCwgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYXBwbGllZFVybCA9IF9hLmFwcGxpZWRVcmwsIHNuYXBzaG90ID0gX2Euc25hcHNob3QsIHNob3VsZEFjdGl2YXRlID0gX2Euc2hvdWxkQWN0aXZhdGU7XG4gICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdGF0ZSA9IGNyZWF0ZVJvdXRlclN0YXRlKF90aGlzLnJvdXRlUmV1c2VTdHJhdGVneSwgc25hcHNob3QsIF90aGlzLmN1cnJlbnRSb3V0ZXJTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYXBwbGllZFVybDogYXBwbGllZFVybCwgc3RhdGU6IHN0YXRlLCBzaG91bGRBY3RpdmF0ZTogc2hvdWxkQWN0aXZhdGUgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGFwcGxpZWRVcmw6IGFwcGxpZWRVcmwsIHN0YXRlOiBudWxsLCBzaG91bGRBY3RpdmF0ZTogc2hvdWxkQWN0aXZhdGUgfTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIC8vIGFwcGxpZWQgdGhlIG5ldyByb3V0ZXIgc3RhdGVcbiAgICAgICAgICAgICAgLy8gdGhpcyBvcGVyYXRpb24gaGFzIHNpZGUgZWZmZWN0c1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBuYXZpZ2F0aW9uSXNTdWNjZXNzZnVsO1xuICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdG9yZWRTdGF0ZSA9IF90aGlzLmN1cnJlbnRSb3V0ZXJTdGF0ZTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3RvcmVkVXJsID0gX3RoaXMuY3VycmVudFVybFRyZWU7XG4gICAgICAgICAgICAgIHJvdXRlclN0YXRlJFxuICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYXBwbGllZFVybCA9IF9hLmFwcGxpZWRVcmwsIHN0YXRlID0gX2Euc3RhdGUsIHNob3VsZEFjdGl2YXRlID0gX2Euc2hvdWxkQWN0aXZhdGU7XG4gICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZEFjdGl2YXRlIHx8IGlkICE9PSBfdGhpcy5uYXZpZ2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uSXNTdWNjZXNzZnVsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgX3RoaXMuY3VycmVudFVybFRyZWUgPSBhcHBsaWVkVXJsO1xuICAgICAgICAgICAgICAgICAgX3RoaXMucmF3VXJsVHJlZSA9IF90aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kubWVyZ2UoX3RoaXMuY3VycmVudFVybFRyZWUsIHJhd1VybCk7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50Um91dGVyU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkUHJldmVudFB1c2hTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSBfdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShfdGhpcy5yYXdVcmxUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMubG9jYXRpb24uaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aCkgfHwgc2hvdWxkUmVwbGFjZVVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5sb2NhdGlvbi5nbyhwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBuZXcgQWN0aXZhdGVSb3V0ZXMoX3RoaXMucm91dGVSZXVzZVN0cmF0ZWd5LCBzdGF0ZSwgc3RvcmVkU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgLmFjdGl2YXRlKF90aGlzLm91dGxldE1hcCk7XG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uSXNTdWNjZXNzZnVsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLm5hdmlnYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdGlvbklzU3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJvdXRlckV2ZW50cy5uZXh0KG5ldyBOYXZpZ2F0aW9uRW5kKGlkLCBfdGhpcy5zZXJpYWxpemVVcmwodXJsKSwgX3RoaXMuc2VyaWFsaXplVXJsKF90aGlzLmN1cnJlbnRVcmxUcmVlKSkpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzZXRVcmxUb0N1cnJlbnRVcmxUcmVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMucm91dGVyRXZlbnRzLm5leHQobmV3IE5hdmlnYXRpb25DYW5jZWwoaWQsIF90aGlzLnNlcmlhbGl6ZVVybCh1cmwpLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzZXRVcmxUb0N1cnJlbnRVcmxUcmVlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMubmF2aWdhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yb3V0ZXJFdmVudHMubmV4dChuZXcgTmF2aWdhdGlvbkNhbmNlbChpZCwgX3RoaXMuc2VyaWFsaXplVXJsKHVybCksIGUubWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJvdXRlckV2ZW50cy5uZXh0KG5ldyBOYXZpZ2F0aW9uRXJyb3IoaWQsIF90aGlzLnNlcmlhbGl6ZVVybCh1cmwpLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoX3RoaXMuZXJyb3JIYW5kbGVyKGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFByb21pc2UoZWUpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF90aGlzLmN1cnJlbnRSb3V0ZXJTdGF0ZSA9IHN0b3JlZFN0YXRlO1xuICAgICAgICAgICAgICAgICAgX3RoaXMuY3VycmVudFVybFRyZWUgPSBzdG9yZWRVcmw7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5yYXdVcmxUcmVlID0gX3RoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5tZXJnZShfdGhpcy5jdXJyZW50VXJsVHJlZSwgcmF3VXJsKTtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZShfdGhpcy5zZXJpYWxpemVVcmwoX3RoaXMucmF3VXJsVHJlZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlci5wcm90b3R5cGUucmVzZXRVcmxUb0N1cnJlbnRVcmxUcmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhdGggPSB0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMucmF3VXJsVHJlZSk7XG4gICAgICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUocGF0aCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIFJvdXRlcjtcbiAgfSgpKTtcbiAgdmFyIENhbkFjdGl2YXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXRoXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENhbkFjdGl2YXRlKHBhdGgpIHtcbiAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENhbkFjdGl2YXRlLnByb3RvdHlwZSwgXCJyb3V0ZVwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIENhbkFjdGl2YXRlO1xuICB9KCkpO1xuICB2YXIgQ2FuRGVhY3RpdmF0ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50XG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIENhbkRlYWN0aXZhdGUoY29tcG9uZW50LCByb3V0ZSkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICAgIHRoaXMucm91dGUgPSByb3V0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDYW5EZWFjdGl2YXRlO1xuICB9KCkpO1xuICB2YXIgUHJlQWN0aXZhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZnV0dXJlXG4gICAgICAgKiBAcGFyYW0gez99IGN1cnJcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gUHJlQWN0aXZhdGlvbihmdXR1cmUsIGN1cnIsIGluamVjdG9yKSB7XG4gICAgICAgICAgdGhpcy5mdXR1cmUgPSBmdXR1cmU7XG4gICAgICAgICAgdGhpcy5jdXJyID0gY3VycjtcbiAgICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgICAgdGhpcy5jaGVja3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRPdXRsZXRNYXBcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFByZUFjdGl2YXRpb24ucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gKHBhcmVudE91dGxldE1hcCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZ1dHVyZVJvb3QgPSB0aGlzLmZ1dHVyZS5fcm9vdDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyUm9vdCA9IHRoaXMuY3VyciA/IHRoaXMuY3Vyci5fcm9vdCA6IG51bGw7XG4gICAgICAgICAgdGhpcy50cmF2ZXJzZUNoaWxkUm91dGVzKGZ1dHVyZVJvb3QsIGN1cnJSb290LCBwYXJlbnRPdXRsZXRNYXAsIFtmdXR1cmVSb290LnZhbHVlXSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVBY3RpdmF0aW9uLnByb3RvdHlwZS5jaGVja0d1YXJkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aGlzLmNoZWNrcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YodHJ1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hlY2tzJCA9IHJ4anNfb2JzZXJ2YWJsZV9mcm9tLmZyb20odGhpcy5jaGVja3MpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJ1bm5pbmdDaGVja3MkID0gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKGNoZWNrcyQsIGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgIGlmIChzIGluc3RhbmNlb2YgQ2FuQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhbmRPYnNlcnZhYmxlcyhyeGpzX29ic2VydmFibGVfZnJvbS5mcm9tKFtfdGhpcy5ydW5DYW5BY3RpdmF0ZUNoaWxkKHMucGF0aCksIF90aGlzLnJ1bkNhbkFjdGl2YXRlKHMucm91dGUpXSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHMgaW5zdGFuY2VvZiBDYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNzI3MVxuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gczIgPSAocyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMucnVuQ2FuRGVhY3RpdmF0ZShzMi5jb21wb25lbnQsIHMyLnJvdXRlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJlIHJlYWNoZWQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX2V2ZXJ5LmV2ZXJ5LmNhbGwocnVubmluZ0NoZWNrcyQsIGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCA9PT0gdHJ1ZTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVBY3RpdmF0aW9uLnByb3RvdHlwZS5yZXNvbHZlRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIGlmICh0aGlzLmNoZWNrcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YobnVsbCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2hlY2tzJCA9IHJ4anNfb2JzZXJ2YWJsZV9mcm9tLmZyb20odGhpcy5jaGVja3MpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJ1bm5pbmdDaGVja3MkID0gcnhqc19vcGVyYXRvcl9jb25jYXRNYXAuY29uY2F0TWFwLmNhbGwoY2hlY2tzJCwgZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBDYW5BY3RpdmF0ZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnJ1blJlc29sdmUocy5yb3V0ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcnhqc19vYnNlcnZhYmxlX29mLm9mKG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfcmVkdWNlLnJlZHVjZS5jYWxsKHJ1bm5pbmdDaGVja3MkLCBmdW5jdGlvbiAoXywgX18pIHsgcmV0dXJuIF87IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IGN1cnJOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldE1hcFxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVQYXRoXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVBY3RpdmF0aW9uLnByb3RvdHlwZS50cmF2ZXJzZUNoaWxkUm91dGVzID0gZnVuY3Rpb24gKGZ1dHVyZU5vZGUsIGN1cnJOb2RlLCBvdXRsZXRNYXAsIGZ1dHVyZVBhdGgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZDaGlsZHJlbiA9IG5vZGVDaGlsZHJlbkFzTWFwKGN1cnJOb2RlKTtcbiAgICAgICAgICBmdXR1cmVOb2RlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VSb3V0ZXMoYywgcHJldkNoaWxkcmVuW2MudmFsdWUub3V0bGV0XSwgb3V0bGV0TWFwLCBmdXR1cmVQYXRoLmNvbmNhdChbYy52YWx1ZV0pKTtcbiAgICAgICAgICAgICAgZGVsZXRlIHByZXZDaGlsZHJlbltjLnZhbHVlLm91dGxldF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yRWFjaChwcmV2Q2hpbGRyZW4sIGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBfdGhpcy5kZWFjdGl2ZVJvdXRlQW5kSXRzQ2hpbGRyZW4odiwgb3V0bGV0TWFwLl9vdXRsZXRzW2tdKTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZU5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gY3Vyck5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50T3V0bGV0TWFwXG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZVBhdGhcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFByZUFjdGl2YXRpb24ucHJvdG90eXBlLnRyYXZlcnNlUm91dGVzID0gZnVuY3Rpb24gKGZ1dHVyZU5vZGUsIGN1cnJOb2RlLCBwYXJlbnRPdXRsZXRNYXAsIGZ1dHVyZVBhdGgpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdXR1cmUgPSBmdXR1cmVOb2RlLnZhbHVlO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnIgPSBjdXJyTm9kZSA/IGN1cnJOb2RlLnZhbHVlIDogbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRsZXQgPSBwYXJlbnRPdXRsZXRNYXAgPyBwYXJlbnRPdXRsZXRNYXAuX291dGxldHNbZnV0dXJlTm9kZS52YWx1ZS5vdXRsZXRdIDogbnVsbDtcbiAgICAgICAgICAvLyByZXVzaW5nIHRoZSBub2RlXG4gICAgICAgICAgaWYgKGN1cnIgJiYgZnV0dXJlLl9yb3V0ZUNvbmZpZyA9PT0gY3Vyci5fcm91dGVDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKCFlcXVhbFBhcmFtc0FuZFVybFNlZ21lbnRzKGZ1dHVyZSwgY3VycikpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tzLnB1c2gobmV3IENhbkRlYWN0aXZhdGUob3V0bGV0LmNvbXBvbmVudCwgY3VyciksIG5ldyBDYW5BY3RpdmF0ZShmdXR1cmVQYXRoKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHNldCB0aGUgZGF0YVxuICAgICAgICAgICAgICAgICAgZnV0dXJlLmRhdGEgPSBjdXJyLmRhdGE7XG4gICAgICAgICAgICAgICAgICBmdXR1cmUuX3Jlc29sdmVkRGF0YSA9IGN1cnIuX3Jlc29sdmVkRGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY29tcG9uZW50LCB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggYW4gb3V0bGV0LlxuICAgICAgICAgICAgICBpZiAoZnV0dXJlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZUNoaWxkUm91dGVzKGZ1dHVyZU5vZGUsIGN1cnJOb2RlLCBvdXRsZXQgPyBvdXRsZXQub3V0bGV0TWFwIDogbnVsbCwgZnV0dXJlUGF0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgY3Vyck5vZGUsIHBhcmVudE91dGxldE1hcCwgZnV0dXJlUGF0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZlUm91dGVBbmRJdHNDaGlsZHJlbihjdXJyTm9kZSwgb3V0bGV0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNoZWNrcy5wdXNoKG5ldyBDYW5BY3RpdmF0ZShmdXR1cmVQYXRoKSk7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjb21wb25lbnQsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBhbiBvdXRsZXQuXG4gICAgICAgICAgICAgIGlmIChmdXR1cmUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgbnVsbCwgb3V0bGV0ID8gb3V0bGV0Lm91dGxldE1hcCA6IG51bGwsIGZ1dHVyZVBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZUNoaWxkUm91dGVzKGZ1dHVyZU5vZGUsIG51bGwsIHBhcmVudE91dGxldE1hcCwgZnV0dXJlUGF0aCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJlQWN0aXZhdGlvbi5wcm90b3R5cGUuZGVhY3RpdmVSb3V0ZUFuZEl0c0NoaWxkcmVuID0gZnVuY3Rpb24gKHJvdXRlLCBvdXRsZXQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHByZXZDaGlsZHJlbiA9IG5vZGVDaGlsZHJlbkFzTWFwKHJvdXRlKTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByID0gcm91dGUudmFsdWU7XG4gICAgICAgICAgZm9yRWFjaChwcmV2Q2hpbGRyZW4sIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgIGlmICghci5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmRlYWN0aXZlUm91dGVBbmRJdHNDaGlsZHJlbih2LCBvdXRsZXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKCEhb3V0bGV0KSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5kZWFjdGl2ZVJvdXRlQW5kSXRzQ2hpbGRyZW4odiwgb3V0bGV0Lm91dGxldE1hcC5fb3V0bGV0c1trXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5kZWFjdGl2ZVJvdXRlQW5kSXRzQ2hpbGRyZW4odiwgbnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXIuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tzLnB1c2gobmV3IENhbkRlYWN0aXZhdGUobnVsbCwgcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChvdXRsZXQgJiYgb3V0bGV0LmlzQWN0aXZhdGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tzLnB1c2gobmV3IENhbkRlYWN0aXZhdGUob3V0bGV0LmNvbXBvbmVudCwgcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja3MucHVzaChuZXcgQ2FuRGVhY3RpdmF0ZShudWxsLCByKSk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFByZUFjdGl2YXRpb24ucHJvdG90eXBlLnJ1bkNhbkFjdGl2YXRlID0gZnVuY3Rpb24gKGZ1dHVyZSkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2FuQWN0aXZhdGUgPSBmdXR1cmUuX3JvdXRlQ29uZmlnID8gZnV0dXJlLl9yb3V0ZUNvbmZpZy5jYW5BY3RpdmF0ZSA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjYW5BY3RpdmF0ZSB8fCBjYW5BY3RpdmF0ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YodHJ1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JzID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocnhqc19vYnNlcnZhYmxlX2Zyb20uZnJvbShjYW5BY3RpdmF0ZSksIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGd1YXJkID0gX3RoaXMuZ2V0VG9rZW4oYywgZnV0dXJlKTtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JzZXJ2YWJsZTtcbiAgICAgICAgICAgICAgaWYgKGd1YXJkLmNhbkFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlID0gd3JhcEludG9PYnNlcnZhYmxlKGd1YXJkLmNhbkFjdGl2YXRlKGZ1dHVyZSwgX3RoaXMuZnV0dXJlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlID0gd3JhcEludG9PYnNlcnZhYmxlKGd1YXJkKGZ1dHVyZSwgX3RoaXMuZnV0dXJlKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfZmlyc3QuZmlyc3QuY2FsbChvYnNlcnZhYmxlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYW5kT2JzZXJ2YWJsZXMob2JzKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcGF0aFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJlQWN0aXZhdGlvbi5wcm90b3R5cGUucnVuQ2FuQWN0aXZhdGVDaGlsZCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBmdXR1cmUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2FuQWN0aXZhdGVDaGlsZEd1YXJkcyA9IHBhdGguc2xpY2UoMCwgcGF0aC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIF90aGlzLmV4dHJhY3RDYW5BY3RpdmF0ZUNoaWxkKHApOyB9KVxuICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfICE9PSBudWxsOyB9KTtcbiAgICAgICAgICByZXR1cm4gYW5kT2JzZXJ2YWJsZXMocnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocnhqc19vYnNlcnZhYmxlX2Zyb20uZnJvbShjYW5BY3RpdmF0ZUNoaWxkR3VhcmRzKSwgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb2JzID0gcnhqc19vcGVyYXRvcl9tYXAubWFwLmNhbGwocnhqc19vYnNlcnZhYmxlX2Zyb20uZnJvbShkLmd1YXJkcyksIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBndWFyZCA9IF90aGlzLmdldFRva2VuKGMsIGMubm9kZSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvYnNlcnZhYmxlO1xuICAgICAgICAgICAgICAgICAgaWYgKGd1YXJkLmNhbkFjdGl2YXRlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlID0gd3JhcEludG9PYnNlcnZhYmxlKGd1YXJkLmNhbkFjdGl2YXRlQ2hpbGQoZnV0dXJlLCBfdGhpcy5mdXR1cmUpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUgPSB3cmFwSW50b09ic2VydmFibGUoZ3VhcmQoZnV0dXJlLCBfdGhpcy5mdXR1cmUpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX2ZpcnN0LmZpcnN0LmNhbGwob2JzZXJ2YWJsZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gYW5kT2JzZXJ2YWJsZXMob2JzKTtcbiAgICAgICAgICB9KSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFByZUFjdGl2YXRpb24ucHJvdG90eXBlLmV4dHJhY3RDYW5BY3RpdmF0ZUNoaWxkID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjYW5BY3RpdmF0ZUNoaWxkID0gcC5fcm91dGVDb25maWcgPyBwLl9yb3V0ZUNvbmZpZy5jYW5BY3RpdmF0ZUNoaWxkIDogbnVsbDtcbiAgICAgICAgICBpZiAoIWNhbkFjdGl2YXRlQ2hpbGQgfHwgY2FuQWN0aXZhdGVDaGlsZC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIHJldHVybiB7IG5vZGU6IHAsIGd1YXJkczogY2FuQWN0aXZhdGVDaGlsZCB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRcbiAgICAgICAqIEBwYXJhbSB7P30gY3VyclxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJlQWN0aXZhdGlvbi5wcm90b3R5cGUucnVuQ2FuRGVhY3RpdmF0ZSA9IGZ1bmN0aW9uIChjb21wb25lbnQsIGN1cnIpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhbkRlYWN0aXZhdGUgPSBjdXJyICYmIGN1cnIuX3JvdXRlQ29uZmlnID8gY3Vyci5fcm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSA6IG51bGw7XG4gICAgICAgICAgaWYgKCFjYW5EZWFjdGl2YXRlIHx8IGNhbkRlYWN0aXZhdGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vYnNlcnZhYmxlX29mLm9mKHRydWUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNhbkRlYWN0aXZhdGUkID0gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKHJ4anNfb2JzZXJ2YWJsZV9mcm9tLmZyb20oY2FuRGVhY3RpdmF0ZSksIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGd1YXJkID0gX3RoaXMuZ2V0VG9rZW4oYywgY3Vycik7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG9ic2VydmFibGU7XG4gICAgICAgICAgICAgIGlmIChndWFyZC5jYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlID0gd3JhcEludG9PYnNlcnZhYmxlKGd1YXJkLmNhbkRlYWN0aXZhdGUoY29tcG9uZW50LCBjdXJyLCBfdGhpcy5jdXJyKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZhYmxlID0gd3JhcEludG9PYnNlcnZhYmxlKGd1YXJkKGNvbXBvbmVudCwgY3VyciwgX3RoaXMuY3VycikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX2ZpcnN0LmZpcnN0LmNhbGwob2JzZXJ2YWJsZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfZXZlcnkuZXZlcnkuY2FsbChjYW5EZWFjdGl2YXRlJCwgZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ID09PSB0cnVlOyB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZnV0dXJlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVBY3RpdmF0aW9uLnByb3RvdHlwZS5ydW5SZXNvbHZlID0gZnVuY3Rpb24gKGZ1dHVyZSkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmUgPSBmdXR1cmUuX3Jlc29sdmU7XG4gICAgICAgICAgcmV0dXJuIHJ4anNfb3BlcmF0b3JfbWFwLm1hcC5jYWxsKHRoaXMucmVzb2x2ZU5vZGUocmVzb2x2ZSwgZnV0dXJlKSwgZnVuY3Rpb24gKHJlc29sdmVkRGF0YSkge1xuICAgICAgICAgICAgICBmdXR1cmUuX3Jlc29sdmVkRGF0YSA9IHJlc29sdmVkRGF0YTtcbiAgICAgICAgICAgICAgZnV0dXJlLmRhdGEgPSBtZXJnZShmdXR1cmUuZGF0YSwgaW5oZXJpdGVkUGFyYW1zRGF0YVJlc29sdmUoZnV0dXJlKS5yZXNvbHZlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJlc29sdmVcbiAgICAgICAqIEBwYXJhbSB7P30gZnV0dXJlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVBY3RpdmF0aW9uLnByb3RvdHlwZS5yZXNvbHZlTm9kZSA9IGZ1bmN0aW9uIChyZXNvbHZlLCBmdXR1cmUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiB3YWl0Rm9yTWFwKHJlc29sdmUsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVyID0gX3RoaXMuZ2V0VG9rZW4odiwgZnV0dXJlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyLnJlc29sdmUgPyB3cmFwSW50b09ic2VydmFibGUocmVzb2x2ZXIucmVzb2x2ZShmdXR1cmUsIF90aGlzLmZ1dHVyZSkpIDpcbiAgICAgICAgICAgICAgICAgIHdyYXBJbnRvT2JzZXJ2YWJsZShyZXNvbHZlcihmdXR1cmUsIF90aGlzLmZ1dHVyZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSB0b2tlblxuICAgICAgICogQHBhcmFtIHs/fSBzbmFwc2hvdFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUHJlQWN0aXZhdGlvbi5wcm90b3R5cGUuZ2V0VG9rZW4gPSBmdW5jdGlvbiAodG9rZW4sIHNuYXBzaG90KSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29uZmlnID0gY2xvc2VzdExvYWRlZENvbmZpZyhzbmFwc2hvdCk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5qZWN0b3IgPSBjb25maWcgPyBjb25maWcuaW5qZWN0b3IgOiB0aGlzLmluamVjdG9yO1xuICAgICAgICAgIHJldHVybiBpbmplY3Rvci5nZXQodG9rZW4pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQcmVBY3RpdmF0aW9uO1xuICB9KCkpO1xuICB2YXIgQWN0aXZhdGVSb3V0ZXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlUmV1c2VTdHJhdGVneVxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVTdGF0ZVxuICAgICAgICogQHBhcmFtIHs/fSBjdXJyU3RhdGVcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gQWN0aXZhdGVSb3V0ZXMocm91dGVSZXVzZVN0cmF0ZWd5LCBmdXR1cmVTdGF0ZSwgY3VyclN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kgPSByb3V0ZVJldXNlU3RyYXRlZ3k7XG4gICAgICAgICAgdGhpcy5mdXR1cmVTdGF0ZSA9IGZ1dHVyZVN0YXRlO1xuICAgICAgICAgIHRoaXMuY3VyclN0YXRlID0gY3VyclN0YXRlO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24gKHBhcmVudE91dGxldE1hcCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZ1dHVyZVJvb3QgPSB0aGlzLmZ1dHVyZVN0YXRlLl9yb290O1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGN1cnJSb290ID0gdGhpcy5jdXJyU3RhdGUgPyB0aGlzLmN1cnJTdGF0ZS5fcm9vdCA6IG51bGw7XG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMoZnV0dXJlUm9vdCwgY3VyclJvb3QsIHBhcmVudE91dGxldE1hcCk7XG4gICAgICAgICAgYWR2YW5jZUFjdGl2YXRlZFJvdXRlKHRoaXMuZnV0dXJlU3RhdGUucm9vdCk7XG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKGZ1dHVyZVJvb3QsIGN1cnJSb290LCBwYXJlbnRPdXRsZXRNYXApO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IGN1cnJOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IG91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmRlYWN0aXZhdGVDaGlsZFJvdXRlcyA9IGZ1bmN0aW9uIChmdXR1cmVOb2RlLCBjdXJyTm9kZSwgb3V0bGV0TWFwKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2Q2hpbGRyZW4gPSBub2RlQ2hpbGRyZW5Bc01hcChjdXJyTm9kZSk7XG4gICAgICAgICAgZnV0dXJlTm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIF90aGlzLmRlYWN0aXZhdGVSb3V0ZXMoYywgcHJldkNoaWxkcmVuW2MudmFsdWUub3V0bGV0XSwgb3V0bGV0TWFwKTtcbiAgICAgICAgICAgICAgZGVsZXRlIHByZXZDaGlsZHJlbltjLnZhbHVlLm91dGxldF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yRWFjaChwcmV2Q2hpbGRyZW4sIGZ1bmN0aW9uICh2LCBrKSB7IHJldHVybiBfdGhpcy5kZWFjdGl2ZVJvdXRlQW5kSXRzQ2hpbGRyZW4odiwgb3V0bGV0TWFwKTsgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZU5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gY3Vyck5vZGVcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0TWFwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBBY3RpdmF0ZVJvdXRlcy5wcm90b3R5cGUuYWN0aXZhdGVDaGlsZFJvdXRlcyA9IGZ1bmN0aW9uIChmdXR1cmVOb2RlLCBjdXJyTm9kZSwgb3V0bGV0TWFwKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBwcmV2Q2hpbGRyZW4gPSBub2RlQ2hpbGRyZW5Bc01hcChjdXJyTm9kZSk7XG4gICAgICAgICAgZnV0dXJlTm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IF90aGlzLmFjdGl2YXRlUm91dGVzKGMsIHByZXZDaGlsZHJlbltjLnZhbHVlLm91dGxldF0sIG91dGxldE1hcCk7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBmdXR1cmVOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IGN1cnJOb2RlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmRlYWN0aXZhdGVSb3V0ZXMgPSBmdW5jdGlvbiAoZnV0dXJlTm9kZSwgY3Vyck5vZGUsIHBhcmVudE91dGxldE1hcCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZ1dHVyZSA9IGZ1dHVyZU5vZGUudmFsdWU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY3VyciA9IGN1cnJOb2RlID8gY3Vyck5vZGUudmFsdWUgOiBudWxsO1xuICAgICAgICAgIC8vIHJldXNpbmcgdGhlIG5vZGVcbiAgICAgICAgICBpZiAoZnV0dXJlID09PSBjdXJyKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBub3JtYWwgcm91dGUsIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCBhbiBvdXRsZXQuXG4gICAgICAgICAgICAgIGlmIChmdXR1cmUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRsZXQgPSBnZXRPdXRsZXQocGFyZW50T3V0bGV0TWFwLCBmdXR1cmUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgY3Vyck5vZGUsIG91dGxldC5vdXRsZXRNYXApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgY3Vyck5vZGUsIHBhcmVudE91dGxldE1hcCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmRlYWN0aXZlUm91dGVBbmRJdHNDaGlsZHJlbihjdXJyTm9kZSwgcGFyZW50T3V0bGV0TWFwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gZnV0dXJlTm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBjdXJyTm9kZVxuICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRPdXRsZXRNYXBcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFjdGl2YXRlUm91dGVzLnByb3RvdHlwZS5hY3RpdmF0ZVJvdXRlcyA9IGZ1bmN0aW9uIChmdXR1cmVOb2RlLCBjdXJyTm9kZSwgcGFyZW50T3V0bGV0TWFwKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZnV0dXJlID0gZnV0dXJlTm9kZS52YWx1ZTtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjdXJyID0gY3Vyck5vZGUgPyBjdXJyTm9kZS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgLy8gcmV1c2luZyB0aGUgbm9kZVxuICAgICAgICAgIGlmIChmdXR1cmUgPT09IGN1cnIpIHtcbiAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgcm91dGUgdG8gcHVzaCB0aGUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICBhZHZhbmNlQWN0aXZhdGVkUm91dGUoZnV0dXJlKTtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG5vcm1hbCByb3V0ZSwgd2UgbmVlZCB0byBnbyB0aHJvdWdoIGFuIG91dGxldC5cbiAgICAgICAgICAgICAgaWYgKGZ1dHVyZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dGxldCA9IGdldE91dGxldChwYXJlbnRPdXRsZXRNYXAsIGZ1dHVyZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgY3Vyck5vZGUsIG91dGxldC5vdXRsZXRNYXApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKGZ1dHVyZU5vZGUsIGN1cnJOb2RlLCBwYXJlbnRPdXRsZXRNYXApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbm9ybWFsIHJvdXRlLCB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIHJvdXRlXG4gICAgICAgICAgICAgIC8vIGFuZCBwbGFjZSB0aGUgY29tcG9uZW50IGludG8gdGhlIG91dGxldC4gQWZ0ZXIgdGhhdCByZWN1cnNlLlxuICAgICAgICAgICAgICBpZiAoZnV0dXJlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgYWR2YW5jZUFjdGl2YXRlZFJvdXRlKGZ1dHVyZSk7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRsZXQgPSBnZXRPdXRsZXQocGFyZW50T3V0bGV0TWFwLCBmdXR1cmVOb2RlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRBdHRhY2goZnV0dXJlLnNuYXBzaG90KSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHN0b3JlZCA9ICgodGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kucmV0cmlldmUoZnV0dXJlLnNuYXBzaG90KSkpO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVSZXVzZVN0cmF0ZWd5LnN0b3JlKGZ1dHVyZS5zbmFwc2hvdCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0bGV0LmF0dGFjaChzdG9yZWQuY29tcG9uZW50UmVmLCBzdG9yZWQucm91dGUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VBY3RpdmF0ZWRSb3V0ZU5vZGVBbmRJdHNDaGlsZHJlbihzdG9yZWQucm91dGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gb3V0bGV0TWFwID0gbmV3IFJvdXRlck91dGxldE1hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VDb21wb25lbnRJbnRvT3V0bGV0KG91dGxldE1hcCwgZnV0dXJlLCBvdXRsZXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVDaGlsZFJvdXRlcyhmdXR1cmVOb2RlLCBudWxsLCBvdXRsZXRNYXApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYWR2YW5jZUFjdGl2YXRlZFJvdXRlKGZ1dHVyZSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQ2hpbGRSb3V0ZXMoZnV0dXJlTm9kZSwgbnVsbCwgcGFyZW50T3V0bGV0TWFwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0TWFwXG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZVxuICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIEFjdGl2YXRlUm91dGVzLnByb3RvdHlwZS5wbGFjZUNvbXBvbmVudEludG9PdXRsZXQgPSBmdW5jdGlvbiAob3V0bGV0TWFwLCBmdXR1cmUsIG91dGxldCkge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVkID0gKFt7IHByb3ZpZGU6IEFjdGl2YXRlZFJvdXRlLCB1c2VWYWx1ZTogZnV0dXJlIH0sIHtcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFJvdXRlck91dGxldE1hcCxcbiAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBvdXRsZXRNYXBcbiAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbmZpZyA9IHBhcmVudExvYWRlZENvbmZpZyhmdXR1cmUuc25hcHNob3QpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlc29sdmVyID0gbnVsbDtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpbmplY3RvciA9IG51bGw7XG4gICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICBpbmplY3RvciA9IGNvbmZpZy5pbmplY3RvckZhY3Rvcnkob3V0bGV0LmxvY2F0aW9uSW5qZWN0b3IpO1xuICAgICAgICAgICAgICByZXNvbHZlciA9IGNvbmZpZy5mYWN0b3J5UmVzb2x2ZXI7XG4gICAgICAgICAgICAgIHJlc29sdmVkLnB1c2goeyBwcm92aWRlOiBfYW5ndWxhcl9jb3JlLkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdXNlVmFsdWU6IHJlc29sdmVyIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaW5qZWN0b3IgPSBvdXRsZXQubG9jYXRpb25JbmplY3RvcjtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIgPSBvdXRsZXQubG9jYXRpb25GYWN0b3J5UmVzb2x2ZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dGxldC5hY3RpdmF0ZShmdXR1cmUsIHJlc29sdmVyLCBpbmplY3RvciwgX2FuZ3VsYXJfY29yZS5SZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShyZXNvbHZlZCksIG91dGxldE1hcCk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmRlYWN0aXZlUm91dGVBbmRJdHNDaGlsZHJlbiA9IGZ1bmN0aW9uIChyb3V0ZSwgcGFyZW50T3V0bGV0TWFwKSB7XG4gICAgICAgICAgaWYgKHRoaXMucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZERldGFjaChyb3V0ZS52YWx1ZS5zbmFwc2hvdCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kZXRhY2hBbmRTdG9yZVJvdXRlU3VidHJlZShyb3V0ZSwgcGFyZW50T3V0bGV0TWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVhY3RpdmVSb3V0ZUFuZE91dGxldChyb3V0ZSwgcGFyZW50T3V0bGV0TWFwKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmRldGFjaEFuZFN0b3JlUm91dGVTdWJ0cmVlID0gZnVuY3Rpb24gKHJvdXRlLCBwYXJlbnRPdXRsZXRNYXApIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBvdXRsZXQgPSBnZXRPdXRsZXQocGFyZW50T3V0bGV0TWFwLCByb3V0ZS52YWx1ZSk7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50UmVmID0gb3V0bGV0LmRldGFjaCgpO1xuICAgICAgICAgIHRoaXMucm91dGVSZXVzZVN0cmF0ZWd5LnN0b3JlKHJvdXRlLnZhbHVlLnNuYXBzaG90LCB7IGNvbXBvbmVudFJlZjogY29tcG9uZW50UmVmLCByb3V0ZTogcm91dGUgfSk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgQWN0aXZhdGVSb3V0ZXMucHJvdG90eXBlLmRlYWN0aXZlUm91dGVBbmRPdXRsZXQgPSBmdW5jdGlvbiAocm91dGUsIHBhcmVudE91dGxldE1hcCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcHJldkNoaWxkcmVuID0gbm9kZUNoaWxkcmVuQXNNYXAocm91dGUpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dGxldCA9IG51bGw7XG4gICAgICAgICAgLy8gZ2V0T3V0bGV0IHRocm93cyB3aGVuIGNhbm5vdCBmaW5kIHRoZSByaWdodCBvdXRsZXQsXG4gICAgICAgICAgLy8gd2hpY2ggY2FuIGhhcHBlbiBpZiBhbiBvdXRsZXQgd2FzIGluIGFuIE5nSWYgYW5kIHdhcyByZW1vdmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgb3V0bGV0ID0gZ2V0T3V0bGV0KHBhcmVudE91dGxldE1hcCwgcm91dGUudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNoaWxkT3V0bGV0TWFwID0gb3V0bGV0Lm91dGxldE1hcDtcbiAgICAgICAgICBmb3JFYWNoKHByZXZDaGlsZHJlbiwgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgICAgICAgaWYgKHJvdXRlLnZhbHVlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuZGVhY3RpdmVSb3V0ZUFuZEl0c0NoaWxkcmVuKHYsIGNoaWxkT3V0bGV0TWFwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmRlYWN0aXZlUm91dGVBbmRJdHNDaGlsZHJlbih2LCBwYXJlbnRPdXRsZXRNYXApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG91dGxldCAmJiBvdXRsZXQuaXNBY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgICAgb3V0bGV0LmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEFjdGl2YXRlUm91dGVzO1xuICB9KCkpO1xuICAvKipcbiAgICogQHBhcmFtIHs/fSBub2RlXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBhZHZhbmNlQWN0aXZhdGVkUm91dGVOb2RlQW5kSXRzQ2hpbGRyZW4obm9kZSkge1xuICAgICAgYWR2YW5jZUFjdGl2YXRlZFJvdXRlKG5vZGUudmFsdWUpO1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGFkdmFuY2VBY3RpdmF0ZWRSb3V0ZU5vZGVBbmRJdHNDaGlsZHJlbik7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc25hcHNob3RcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudExvYWRlZENvbmZpZyhzbmFwc2hvdCkge1xuICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcyA9IHNuYXBzaG90LnBhcmVudDtcbiAgICAgIHdoaWxlIChzKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYyA9IHMuX3JvdXRlQ29uZmlnO1xuICAgICAgICAgIGlmIChjICYmIGMuX2xvYWRlZENvbmZpZylcbiAgICAgICAgICAgICAgcmV0dXJuIGMuX2xvYWRlZENvbmZpZztcbiAgICAgICAgICBpZiAoYyAmJiBjLmNvbXBvbmVudClcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgcyA9IHMucGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gc25hcHNob3RcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3RMb2FkZWRDb25maWcoc25hcHNob3QpIHtcbiAgICAgIGlmICghc25hcHNob3QpXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzID0gc25hcHNob3QucGFyZW50O1xuICAgICAgd2hpbGUgKHMpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjID0gcy5fcm91dGVDb25maWc7XG4gICAgICAgICAgaWYgKGMgJiYgYy5fbG9hZGVkQ29uZmlnKVxuICAgICAgICAgICAgICByZXR1cm4gYy5fbG9hZGVkQ29uZmlnO1xuICAgICAgICAgIHMgPSBzLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIG5vZGVDaGlsZHJlbkFzTWFwKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlID8gbm9kZS5jaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKG0sIGMpIHtcbiAgICAgICAgICBtW2MudmFsdWUub3V0bGV0XSA9IGM7XG4gICAgICAgICAgcmV0dXJuIG07XG4gICAgICB9LCB7fSkgOiB7fTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSBvdXRsZXRNYXBcbiAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T3V0bGV0KG91dGxldE1hcCwgcm91dGUpIHtcbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG91dGxldCA9IG91dGxldE1hcC5fb3V0bGV0c1tyb3V0ZS5vdXRsZXRdO1xuICAgICAgaWYgKCFvdXRsZXQpIHtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjb21wb25lbnROYW1lID0gKChyb3V0ZS5jb21wb25lbnQpKS5uYW1lO1xuICAgICAgICAgIGlmIChyb3V0ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHByaW1hcnkgb3V0bGV0IHRvIGxvYWQgJ1wiICsgY29tcG9uZW50TmFtZSArIFwiJ1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHRoZSBvdXRsZXQgXCIgKyByb3V0ZS5vdXRsZXQgKyBcIiB0byBsb2FkICdcIiArIGNvbXBvbmVudE5hbWUgKyBcIidcIik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgKlxuICAgICogKlxuICAgICogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyByb3V0ZSBjb25maWd1cmF0aW9uOlxuICAgICogYFt7IHBhdGg6ICd1c2VyLzpuYW1lJywgY29tcG9uZW50OiBVc2VyQ21wIH1dYFxuICAgICogKlxuICAgICogV2hlbiBsaW5raW5nIHRvIHRoaXMgYHVzZXIvOm5hbWVgIHJvdXRlLCB5b3UgY2FuIHdyaXRlOlxuICAgICogYDxhIHJvdXRlckxpbms9Jy91c2VyL2JvYic+bGluayB0byB1c2VyIGNvbXBvbmVudDwvYT5gXG4gICAgKiAqXG4gICAgKiAqXG4gICAgKiBUaGUgUm91dGVyTGluayBkaXJlY3RpdmVzIGxldCB5b3UgbGluayB0byBzcGVjaWZpYyBwYXJ0cyBvZiB5b3VyIGFwcC5cbiAgICAqICpcbiAgICAqIFdoZW4gdGhlIGxpbmsgaXMgc3RhdGljLCB5b3UgY2FuIHVzZSB0aGUgZGlyZWN0aXZlIGFzIGZvbGxvd3M6XG4gICAgKiBgPGEgcm91dGVyTGluaz1cIi91c2VyL2JvYlwiPmxpbmsgdG8gdXNlciBjb21wb25lbnQ8L2E+YFxuICAgICogKlxuICAgICogSWYgeW91IHVzZSBkeW5hbWljIHZhbHVlcyB0byBnZW5lcmF0ZSB0aGUgbGluaywgeW91IGNhbiBwYXNzIGFuIGFycmF5IG9mIHBhdGhcbiAgICAqIHNlZ21lbnRzLCBmb2xsb3dlZCBieSB0aGUgcGFyYW1zIGZvciBlYWNoIHNlZ21lbnQuXG4gICAgKiAqXG4gICAgKiBGb3IgaW5zdGFuY2UgYFsnL3RlYW0nLCB0ZWFtSWQsICd1c2VyJywgdXNlck5hbWUsIHtkZXRhaWxzOiB0cnVlfV1gXG4gICAgKiBtZWFucyB0aGF0IHdlIHdhbnQgdG8gZ2VuZXJhdGUgYSBsaW5rIHRvIGAvdGVhbS8xMS91c2VyL2JvYjtkZXRhaWxzPXRydWVgLlxuICAgICogKlxuICAgICogTXVsdGlwbGUgc3RhdGljIHNlZ21lbnRzIGNhbiBiZSBtZXJnZWQgaW50byBvbmVcbiAgICAqIChlLmcuLCBgWycvdGVhbS8xMS91c2VyJywgdXNlck5hbWUsIHtkZXRhaWxzOiB0cnVlfV1gKS5cbiAgICAqICpcbiAgICAqIFRoZSBmaXJzdCBzZWdtZW50IG5hbWUgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGAvYCwgYC4vYCwgb3IgYC4uL2A6XG4gICAgKiAqIElmIHRoZSBmaXJzdCBzZWdtZW50IGJlZ2lucyB3aXRoIGAvYCwgdGhlIHJvdXRlciB3aWxsIGxvb2sgdXAgdGhlIHJvdXRlIGZyb20gdGhlIHJvb3Qgb2YgdGhlXG4gICAgKiBhcHAuXG4gICAgKiAqIElmIHRoZSBmaXJzdCBzZWdtZW50IGJlZ2lucyB3aXRoIGAuL2AsIG9yIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIHNsYXNoLCB0aGUgcm91dGVyIHdpbGxcbiAgICAqIGluc3RlYWQgbG9vayBpbiB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgYWN0aXZhdGVkIHJvdXRlLlxuICAgICogKiBBbmQgaWYgdGhlIGZpcnN0IHNlZ21lbnQgYmVnaW5zIHdpdGggYC4uL2AsIHRoZSByb3V0ZXIgd2lsbCBnbyB1cCBvbmUgbGV2ZWwuXG4gICAgKiAqXG4gICAgKiBZb3UgY2FuIHNldCBxdWVyeSBwYXJhbXMgYW5kIGZyYWdtZW50IGFzIGZvbGxvd3M6XG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIDxhIFtyb3V0ZXJMaW5rXT1cIlsnL3VzZXIvYm9iJ11cIiBbcXVlcnlQYXJhbXNdPVwie2RlYnVnOiB0cnVlfVwiIGZyYWdtZW50PVwiZWR1Y2F0aW9uXCI+XG4gICAgKiBsaW5rIHRvIHVzZXIgY29tcG9uZW50XG4gICAgKiA8L2E+XG4gICAgKiBgYGBcbiAgICAqIFJvdXRlckxpbmsgd2lsbCB1c2UgdGhlc2UgdG8gZ2VuZXJhdGUgdGhpcyBsaW5rOiBgL3VzZXIvYm9iI2VkdWNhdGlvbj9kZWJ1Zz10cnVlYC5cbiAgICAqICpcbiAgICAqIFlvdSBjYW4gYWxzbyB0ZWxsIHRoZSBkaXJlY3RpdmUgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcXVlcnkgcGFyYW1zIGFuZCBmcmFnbWVudDpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogPGEgW3JvdXRlckxpbmtdPVwiWycvdXNlci9ib2InXVwiIHByZXNlcnZlUXVlcnlQYXJhbXMgcHJlc2VydmVGcmFnbWVudD5cbiAgICAqIGxpbmsgdG8gdXNlciBjb21wb25lbnRcbiAgICAqIDwvYT5cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogVGhlIHJvdXRlciBsaW5rIGRpcmVjdGl2ZSBhbHdheXMgdHJlYXRzIHRoZSBwcm92aWRlZCBpbnB1dCBhcyBhIGRlbHRhIHRvIHRoZSBjdXJyZW50IHVybC5cbiAgICAqICpcbiAgICAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGN1cnJlbnQgdXJsIGlzIGAvdXNlci8oYm94Ly9hdXg6dGVhbSlgLlxuICAgICogKlxuICAgICogVGhlbiB0aGUgZm9sbG93aW5nIGxpbmsgYDxhIFtyb3V0ZXJMaW5rXT1cIlsnL3VzZXIvamltJ11cIj5KaW08L2E+YCB3aWxsIGdlbmVyYXRlIHRoZSBsaW5rXG4gICAgKiBgL3VzZXIvKGppbS8vYXV4OnRlYW0pYC5cbiAgICAqICpcbiAgICAqICpcbiAgICAqIFNlZSB7QGxpbmsgUm91dGVyLmNyZWF0ZVVybFRyZWV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICogKlxuICAgKi9cbiAgdmFyIFJvdXRlckxpbmsgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlclxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSb3V0ZXJMaW5rKHJvdXRlciwgcm91dGUpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlcjtcbiAgICAgICAgICB0aGlzLnJvdXRlID0gcm91dGU7XG4gICAgICAgICAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlckxpbmsucHJvdG90eXBlLCBcInJvdXRlckxpbmtcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0YVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kcyA9IGRhdGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzID0gW2RhdGFdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlckxpbmsucHJvdG90eXBlLm9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gZXh0cmFzID0ge1xuICAgICAgICAgICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IGF0dHJCb29sVmFsdWUodGhpcy5za2lwTG9jYXRpb25DaGFuZ2UpLFxuICAgICAgICAgICAgICByZXBsYWNlVXJsOiBhdHRyQm9vbFZhbHVlKHRoaXMucmVwbGFjZVVybCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMudXJsVHJlZSwgZXh0cmFzKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUm91dGVyTGluay5wcm90b3R5cGUsIFwidXJsVHJlZVwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUodGhpcy5jb21tYW5kcywge1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICAgICAgZnJhZ21lbnQ6IHRoaXMuZnJhZ21lbnQsXG4gICAgICAgICAgICAgICAgICBwcmVzZXJ2ZVF1ZXJ5UGFyYW1zOiBhdHRyQm9vbFZhbHVlKHRoaXMucHJlc2VydmVRdWVyeVBhcmFtcyksXG4gICAgICAgICAgICAgICAgICBwcmVzZXJ2ZUZyYWdtZW50OiBhdHRyQm9vbFZhbHVlKHRoaXMucHJlc2VydmVGcmFnbWVudCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgUm91dGVyTGluay5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7IHNlbGVjdG9yOiAnOm5vdChhKVtyb3V0ZXJMaW5rXScgfSxdIH0sXG4gICAgICBdO1xuICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICBSb3V0ZXJMaW5rLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogUm91dGVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogQWN0aXZhdGVkUm91dGUsIH0sXG4gICAgICBdOyB9O1xuICAgICAgUm91dGVyTGluay5wcm9wRGVjb3JhdG9ycyA9IHtcbiAgICAgICAgICAncXVlcnlQYXJhbXMnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAnZnJhZ21lbnQnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAncHJlc2VydmVRdWVyeVBhcmFtcyc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICdwcmVzZXJ2ZUZyYWdtZW50JzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgICAgJ3NraXBMb2NhdGlvbkNoYW5nZSc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICdyZXBsYWNlVXJsJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgICAgJ3JvdXRlckxpbmsnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAnb25DbGljayc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgW10sXSB9LF0sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFJvdXRlckxpbms7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiAgKlxuICAgICogU2VlIHtAbGluayBSb3V0ZXJMaW5rfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAqICpcbiAgICAqICpcbiAgICovXG4gIHZhciBSb3V0ZXJMaW5rV2l0aEhyZWYgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlclxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZVxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblN0cmF0ZWd5XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJvdXRlckxpbmtXaXRoSHJlZihyb3V0ZXIsIHJvdXRlLCBsb2NhdGlvblN0cmF0ZWd5KSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlcjtcbiAgICAgICAgICB0aGlzLnJvdXRlID0gcm91dGU7XG4gICAgICAgICAgdGhpcy5sb2NhdGlvblN0cmF0ZWd5ID0gbG9jYXRpb25TdHJhdGVneTtcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzID0gW107XG4gICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSByb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICBpZiAocyBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZVRhcmdldFVybEFuZEhyZWYoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlckxpbmtXaXRoSHJlZi5wcm90b3R5cGUsIFwicm91dGVyTGlua1wiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzID0gZGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZHMgPSBbZGF0YV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJMaW5rV2l0aEhyZWYucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHsgdGhpcy51cGRhdGVUYXJnZXRVcmxBbmRIcmVmKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlckxpbmtXaXRoSHJlZi5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gYnV0dG9uXG4gICAgICAgKiBAcGFyYW0gez99IGN0cmxLZXlcbiAgICAgICAqIEBwYXJhbSB7P30gbWV0YUtleVxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyTGlua1dpdGhIcmVmLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gKGJ1dHRvbiwgY3RybEtleSwgbWV0YUtleSkge1xuICAgICAgICAgIGlmIChidXR0b24gIT09IDAgfHwgY3RybEtleSB8fCBtZXRhS2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMudGFyZ2V0ID09PSAnc3RyaW5nJyAmJiB0aGlzLnRhcmdldCAhPSAnX3NlbGYnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBleHRyYXMgPSB7XG4gICAgICAgICAgICAgIHNraXBMb2NhdGlvbkNoYW5nZTogYXR0ckJvb2xWYWx1ZSh0aGlzLnNraXBMb2NhdGlvbkNoYW5nZSksXG4gICAgICAgICAgICAgIHJlcGxhY2VVcmw6IGF0dHJCb29sVmFsdWUodGhpcy5yZXBsYWNlVXJsKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy51cmxUcmVlLCBleHRyYXMpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlckxpbmtXaXRoSHJlZi5wcm90b3R5cGUudXBkYXRlVGFyZ2V0VXJsQW5kSHJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGlzLmhyZWYgPSB0aGlzLmxvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsKHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh0aGlzLnVybFRyZWUpKTtcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUm91dGVyTGlua1dpdGhIcmVmLnByb3RvdHlwZSwgXCJ1cmxUcmVlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZSh0aGlzLmNvbW1hbmRzLCB7XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgICBmcmFnbWVudDogdGhpcy5mcmFnbWVudCxcbiAgICAgICAgICAgICAgICAgIHByZXNlcnZlUXVlcnlQYXJhbXM6IGF0dHJCb29sVmFsdWUodGhpcy5wcmVzZXJ2ZVF1ZXJ5UGFyYW1zKSxcbiAgICAgICAgICAgICAgICAgIHByZXNlcnZlRnJhZ21lbnQ6IGF0dHJCb29sVmFsdWUodGhpcy5wcmVzZXJ2ZUZyYWdtZW50KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBSb3V0ZXJMaW5rV2l0aEhyZWYuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuRGlyZWN0aXZlLCBhcmdzOiBbeyBzZWxlY3RvcjogJ2Fbcm91dGVyTGlua10nIH0sXSB9LFxuICAgICAgXTtcbiAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgUm91dGVyTGlua1dpdGhIcmVmLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogUm91dGVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogQWN0aXZhdGVkUm91dGUsIH0sXG4gICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb21tb24uTG9jYXRpb25TdHJhdGVneSwgfSxcbiAgICAgIF07IH07XG4gICAgICBSb3V0ZXJMaW5rV2l0aEhyZWYucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgJ3RhcmdldCc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICdxdWVyeVBhcmFtcyc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICdmcmFnbWVudCc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgICAgICdwcmVzZXJ2ZVF1ZXJ5UGFyYW1zJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgICAgJ3ByZXNlcnZlRnJhZ21lbnQnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAnc2tpcExvY2F0aW9uQ2hhbmdlJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgICAgJ3JlcGxhY2VVcmwnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAnaHJlZic6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSG9zdEJpbmRpbmcgfSxdLFxuICAgICAgICAgICdyb3V0ZXJMaW5rJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5JbnB1dCB9LF0sXG4gICAgICAgICAgJ29uQ2xpY2snOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkhvc3RMaXN0ZW5lciwgYXJnczogWydjbGljaycsIFsnJGV2ZW50LmJ1dHRvbicsICckZXZlbnQuY3RybEtleScsICckZXZlbnQubWV0YUtleSddLF0gfSxdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBSb3V0ZXJMaW5rV2l0aEhyZWY7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJCb29sVmFsdWUocykge1xuICAgICAgcmV0dXJuIHMgPT09ICcnIHx8ICEhcztcbiAgfVxuXG4gIC8qKlxuICAgKiAgKlxuICAgICogKlxuICAgICogYGBgXG4gICAgKiA8YSByb3V0ZXJMaW5rPVwiL3VzZXIvYm9iXCIgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZS1saW5rXCI+Qm9iPC9hPlxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiAqXG4gICAgKiBUaGUgUm91dGVyTGlua0FjdGl2ZSBkaXJlY3RpdmUgbGV0cyB5b3UgYWRkIGEgQ1NTIGNsYXNzIHRvIGFuIGVsZW1lbnQgd2hlbiB0aGUgbGluaydzIHJvdXRlXG4gICAgKiBiZWNvbWVzIGFjdGl2ZS5cbiAgICAqICpcbiAgICAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogPGEgcm91dGVyTGluaz1cIi91c2VyL2JvYlwiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmUtbGlua1wiPkJvYjwvYT5cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogV2hlbiB0aGUgdXJsIGlzIGVpdGhlciAnL3VzZXInIG9yICcvdXNlci9ib2InLCB0aGUgYWN0aXZlLWxpbmsgY2xhc3Mgd2lsbFxuICAgICogYmUgYWRkZWQgdG8gdGhlIGBhYCB0YWcuIElmIHRoZSB1cmwgY2hhbmdlcywgdGhlIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAqICpcbiAgICAqIFlvdSBjYW4gc2V0IG1vcmUgdGhhbiBvbmUgY2xhc3MsIGFzIGZvbGxvd3M6XG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIDxhIHJvdXRlckxpbms9XCIvdXNlci9ib2JcIiByb3V0ZXJMaW5rQWN0aXZlPVwiY2xhc3MxIGNsYXNzMlwiPkJvYjwvYT5cbiAgICAqIDxhIHJvdXRlckxpbms9XCIvdXNlci9ib2JcIiBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ2NsYXNzMScsICdjbGFzczInXVwiPkJvYjwvYT5cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogWW91IGNhbiBjb25maWd1cmUgUm91dGVyTGlua0FjdGl2ZSBieSBwYXNzaW5nIGBleGFjdDogdHJ1ZWAuIFRoaXMgd2lsbCBhZGQgdGhlIGNsYXNzZXNcbiAgICAqIG9ubHkgd2hlbiB0aGUgdXJsIG1hdGNoZXMgdGhlIGxpbmsgZXhhY3RseS5cbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogPGEgcm91dGVyTGluaz1cIi91c2VyL2JvYlwiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmUtbGlua1wiIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7ZXhhY3Q6XG4gICAgKiB0cnVlfVwiPkJvYjwvYT5cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogWW91IGNhbiBhc3NpZ24gdGhlIFJvdXRlckxpbmtBY3RpdmUgaW5zdGFuY2UgdG8gYSB0ZW1wbGF0ZSB2YXJpYWJsZSBhbmQgZGlyZWN0bHkgY2hlY2tcbiAgICAqIHRoZSBgaXNBY3RpdmVgIHN0YXR1cy5cbiAgICAqIGBgYFxuICAgICogPGEgcm91dGVyTGluaz1cIi91c2VyL2JvYlwiIHJvdXRlckxpbmtBY3RpdmUgI3JsYT1cInJvdXRlckxpbmtBY3RpdmVcIj5cbiAgICAqIEJvYiB7eyBybGEuaXNBY3RpdmUgPyAnKGFscmVhZHkgb3BlbiknIDogJyd9fVxuICAgICogPC9hPlxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiBGaW5hbGx5LCB5b3UgY2FuIGFwcGx5IHRoZSBSb3V0ZXJMaW5rQWN0aXZlIGRpcmVjdGl2ZSB0byBhbiBhbmNlc3RvciBvZiBhIFJvdXRlckxpbmsuXG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIDxkaXYgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZS1saW5rXCIgW3JvdXRlckxpbmtBY3RpdmVPcHRpb25zXT1cIntleGFjdDogdHJ1ZX1cIj5cbiAgICAqIDxhIHJvdXRlckxpbms9XCIvdXNlci9qaW1cIj5KaW08L2E+XG4gICAgKiA8YSByb3V0ZXJMaW5rPVwiL3VzZXIvYm9iXCI+Qm9iPC9hPlxuICAgICogPC9kaXY+XG4gICAgKiBgYGBcbiAgICAqICpcbiAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIGFjdGl2ZS1saW5rIGNsYXNzIG9uIHRoZSBkaXYgdGFnIGlmIHRoZSB1cmwgaXMgZWl0aGVyICcvdXNlci9qaW0nIG9yXG4gICAgKiAnL3VzZXIvYm9iJy5cbiAgICAqICpcbiAgICAqICpcbiAgICovXG4gIHZhciBSb3V0ZXJMaW5rQWN0aXZlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByb3V0ZXJcbiAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFxuICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJlclxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBSb3V0ZXJMaW5rQWN0aXZlKHJvdXRlciwgZWxlbWVudCwgcmVuZGVyZXIpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHRoaXMucm91dGVyID0gcm91dGVyO1xuICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IFtdO1xuICAgICAgICAgIHRoaXMucm91dGVyTGlua0FjdGl2ZU9wdGlvbnMgPSB7IGV4YWN0OiBmYWxzZSB9O1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlckxpbmtBY3RpdmUucHJvdG90eXBlLCBcImlzQWN0aXZlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5oYXNBY3RpdmVMaW5rKCk7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJMaW5rQWN0aXZlLnByb3RvdHlwZS5uZ0FmdGVyQ29udGVudEluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICB0aGlzLmxpbmtzLmNoYW5nZXMuc3Vic2NyaWJlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBfdGhpcy51cGRhdGUoKTsgfSk7XG4gICAgICAgICAgdGhpcy5saW5rc1dpdGhIcmVmcy5jaGFuZ2VzLnN1YnNjcmliZShmdW5jdGlvbiAocykgeyByZXR1cm4gX3RoaXMudXBkYXRlKCk7IH0pO1xuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlckxpbmtBY3RpdmUucHJvdG90eXBlLCBcInJvdXRlckxpbmtBY3RpdmVcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0YVxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gKGRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzID0gZGF0YS5zcGxpdCgnICcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyTGlua0FjdGl2ZS5wcm90b3R5cGUubmdPbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykgeyB0aGlzLnVwZGF0ZSgpOyB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJMaW5rQWN0aXZlLnByb3RvdHlwZS5uZ09uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyTGlua0FjdGl2ZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgaWYgKCF0aGlzLmxpbmtzIHx8ICF0aGlzLmxpbmtzV2l0aEhyZWZzIHx8ICF0aGlzLnJvdXRlci5uYXZpZ2F0ZWQpXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBpc0FjdGl2ZSA9IHRoaXMuaGFzQWN0aXZlTGluaygpO1xuICAgICAgICAgIHRoaXMuY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MoX3RoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBjLCBpc0FjdGl2ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJMaW5rQWN0aXZlLnByb3RvdHlwZS5pc0xpbmtBY3RpdmUgPSBmdW5jdGlvbiAocm91dGVyKSB7XG4gICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5pc0FjdGl2ZShsaW5rLnVybFRyZWUsIF90aGlzLnJvdXRlckxpbmtBY3RpdmVPcHRpb25zLmV4YWN0KTtcbiAgICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyTGlua0FjdGl2ZS5wcm90b3R5cGUuaGFzQWN0aXZlTGluayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5saW5rcy5zb21lKHRoaXMuaXNMaW5rQWN0aXZlKHRoaXMucm91dGVyKSkgfHxcbiAgICAgICAgICAgICAgdGhpcy5saW5rc1dpdGhIcmVmcy5zb21lKHRoaXMuaXNMaW5rQWN0aXZlKHRoaXMucm91dGVyKSk7XG4gICAgICB9O1xuICAgICAgUm91dGVyTGlua0FjdGl2ZS5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5EaXJlY3RpdmUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdbcm91dGVyTGlua0FjdGl2ZV0nLFxuICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydEFzOiAncm91dGVyTGlua0FjdGl2ZScsXG4gICAgICAgICAgICAgICAgICB9LF0gfSxcbiAgICAgIF07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIFJvdXRlckxpbmtBY3RpdmUuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgeyB0eXBlOiBSb3V0ZXIsIH0sXG4gICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkVsZW1lbnRSZWYsIH0sXG4gICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLlJlbmRlcmVyLCB9LFxuICAgICAgXTsgfTtcbiAgICAgIFJvdXRlckxpbmtBY3RpdmUucHJvcERlY29yYXRvcnMgPSB7XG4gICAgICAgICAgJ2xpbmtzJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5Db250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtSb3V0ZXJMaW5rLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9LF0sXG4gICAgICAgICAgJ2xpbmtzV2l0aEhyZWZzJzogW3sgdHlwZTogX2FuZ3VsYXJfY29yZS5Db250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtSb3V0ZXJMaW5rV2l0aEhyZWYsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH0sXSxcbiAgICAgICAgICAncm91dGVyTGlua0FjdGl2ZU9wdGlvbnMnOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLklucHV0IH0sXSxcbiAgICAgICAgICAncm91dGVyTGlua0FjdGl2ZSc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5wdXQgfSxdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBSb3V0ZXJMaW5rQWN0aXZlO1xuICB9KCkpO1xuXG4gIC8qKlxuICAgKiAgc3RhdGUuXG4gICAgKiAqXG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cbiAgICAqIDxyb3V0ZXItb3V0bGV0IG5hbWU9J2xlZnQnPjwvcm91dGVyLW91dGxldD5cbiAgICAqIDxyb3V0ZXItb3V0bGV0IG5hbWU9J3JpZ2h0Jz48L3JvdXRlci1vdXRsZXQ+XG4gICAgKiBgYGBcbiAgICAqICpcbiAgICAqIEEgcm91dGVyIG91dGxldCB3aWxsIGVtaXQgYW4gYWN0aXZhdGUgZXZlbnQgYW55IHRpbWUgYSBuZXcgY29tcG9uZW50IGlzIGJlaW5nIGluc3RhbnRpYXRlZCxcbiAgICAqIGFuZCBhIGRlYWN0aXZhdGUgZXZlbnQgd2hlbiBpdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIDxyb3V0ZXItb3V0bGV0XG4gICAgKiAoYWN0aXZhdGUpPSdvbkFjdGl2YXRlKCRldmVudCknXG4gICAgKiAoZGVhY3RpdmF0ZSk9J29uRGVhY3RpdmF0ZSgkZXZlbnQpJz48L3JvdXRlci1vdXRsZXQ+XG4gICAgKiBgYGBcbiAgICAqICpcbiAgICovXG4gIHZhciBSb3V0ZXJPdXRsZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHBhcmVudE91dGxldE1hcFxuICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvblxuICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlclxuICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJvdXRlck91dGxldChwYXJlbnRPdXRsZXRNYXAsIGxvY2F0aW9uLCByZXNvbHZlciwgbmFtZSkge1xuICAgICAgICAgIHRoaXMucGFyZW50T3V0bGV0TWFwID0gcGFyZW50T3V0bGV0TWFwO1xuICAgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7XG4gICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlRXZlbnRzID0gbmV3IF9hbmd1bGFyX2NvcmUuRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRXZlbnRzID0gbmV3IF9hbmd1bGFyX2NvcmUuRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgICAgcGFyZW50T3V0bGV0TWFwLnJlZ2lzdGVyT3V0bGV0KG5hbWUgPyBuYW1lIDogUFJJTUFSWV9PVVRMRVQsIHRoaXMpO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJPdXRsZXQucHJvdG90eXBlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB0aGlzLnBhcmVudE91dGxldE1hcC5yZW1vdmVPdXRsZXQodGhpcy5uYW1lID8gdGhpcy5uYW1lIDogUFJJTUFSWV9PVVRMRVQpOyB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlck91dGxldC5wcm90b3R5cGUsIFwibG9jYXRpb25JbmplY3RvclwiLCB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubG9jYXRpb24uaW5qZWN0b3I7IH0sXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJvdXRlck91dGxldC5wcm90b3R5cGUsIFwibG9jYXRpb25GYWN0b3J5UmVzb2x2ZXJcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnJlc29sdmVyOyB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb3V0ZXJPdXRsZXQucHJvdG90eXBlLCBcImlzQWN0aXZhdGVkXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gISF0aGlzLmFjdGl2YXRlZDsgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUm91dGVyT3V0bGV0LnByb3RvdHlwZSwgXCJjb21wb25lbnRcIiwge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5hY3RpdmF0ZWQpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dGxldCBpcyBub3QgYWN0aXZhdGVkJyk7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlZC5pbnN0YW5jZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb3V0ZXJPdXRsZXQucHJvdG90eXBlLCBcImFjdGl2YXRlZFJvdXRlXCIsIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZhdGVkKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdXRsZXQgaXMgbm90IGFjdGl2YXRlZCcpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGVkUm91dGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlck91dGxldC5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghdGhpcy5hY3RpdmF0ZWQpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3V0bGV0IGlzIG5vdCBhY3RpdmF0ZWQnKTtcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uLmRldGFjaCgpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHIgPSB0aGlzLmFjdGl2YXRlZDtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fYWN0aXZhdGVkUm91dGUgPSBudWxsO1xuICAgICAgICAgIHJldHVybiByO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSByZWZcbiAgICAgICAqIEBwYXJhbSB7P30gYWN0aXZhdGVkUm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlck91dGxldC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKHJlZiwgYWN0aXZhdGVkUm91dGUpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IHJlZjtcbiAgICAgICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZSA9IGFjdGl2YXRlZFJvdXRlO1xuICAgICAgICAgIHRoaXMubG9jYXRpb24uaW5zZXJ0KHJlZi5ob3N0Vmlldyk7XG4gICAgICB9O1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJPdXRsZXQucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGVkKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGMgPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZWQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRXZlbnRzLmVtaXQoYyk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHs/fSBhY3RpdmF0ZWRSb3V0ZVxuICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlclxuICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvclxuICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnNcbiAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0TWFwXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJPdXRsZXQucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24gKGFjdGl2YXRlZFJvdXRlLCByZXNvbHZlciwgaW5qZWN0b3IsIHByb3ZpZGVycywgb3V0bGV0TWFwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWN0aXZhdGUgYW4gYWxyZWFkeSBhY3RpdmF0ZWQgb3V0bGV0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3V0bGV0TWFwID0gb3V0bGV0TWFwO1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gYWN0aXZhdGVkUm91dGU7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc25hcHNob3QgPSBhY3RpdmF0ZWRSb3V0ZS5fZnV0dXJlU25hcHNob3Q7XG4gICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY29tcG9uZW50ID0gKHNuYXBzaG90Ll9yb3V0ZUNvbmZpZy5jb21wb25lbnQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGZhY3RvcnkgPSByZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGluaiA9IF9hbmd1bGFyX2NvcmUuUmVmbGVjdGl2ZUluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhwcm92aWRlcnMsIGluamVjdG9yKTtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IHRoaXMubG9jYXRpb24uY3JlYXRlQ29tcG9uZW50KGZhY3RvcnksIHRoaXMubG9jYXRpb24ubGVuZ3RoLCBpbmosIFtdKTtcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlZC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZUV2ZW50cy5lbWl0KHRoaXMuYWN0aXZhdGVkLmluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgICBSb3V0ZXJPdXRsZXQuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuRGlyZWN0aXZlLCBhcmdzOiBbeyBzZWxlY3RvcjogJ3JvdXRlci1vdXRsZXQnIH0sXSB9LFxuICAgICAgXTtcbiAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgUm91dGVyT3V0bGV0LmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogUm91dGVyT3V0bGV0TWFwLCB9LFxuICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5WaWV3Q29udGFpbmVyUmVmLCB9LFxuICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIH0sXG4gICAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuQXR0cmlidXRlLCBhcmdzOiBbJ25hbWUnLF0gfSxdIH0sXG4gICAgICBdOyB9O1xuICAgICAgUm91dGVyT3V0bGV0LnByb3BEZWNvcmF0b3JzID0ge1xuICAgICAgICAgICdhY3RpdmF0ZUV2ZW50cyc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuT3V0cHV0LCBhcmdzOiBbJ2FjdGl2YXRlJyxdIH0sXSxcbiAgICAgICAgICAnZGVhY3RpdmF0ZUV2ZW50cyc6IFt7IHR5cGU6IF9hbmd1bGFyX2NvcmUuT3V0cHV0LCBhcmdzOiBbJ2RlYWN0aXZhdGUnLF0gfSxdLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBSb3V0ZXJPdXRsZXQ7XG4gIH0oKSk7XG5cbiAgLyoqXG4gICAqIEBsaWNlbnNlXG4gICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgKlxuICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAqL1xuICAvKipcbiAgICogICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgUm91dGVSZXVzZVN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFJvdXRlUmV1c2VTdHJhdGVneSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogIERldGVybWluZXMgaWYgdGhpcyByb3V0ZSAoYW5kIGl0cyBzdWJ0cmVlKSBzaG91bGQgYmUgZGV0YWNoZWQgdG8gYmUgcmV1c2VkIGxhdGVyXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlUmV1c2VTdHJhdGVneS5wcm90b3R5cGUuc2hvdWxkRGV0YWNoID0gZnVuY3Rpb24gKHJvdXRlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBTdG9yZXMgdGhlIGRldGFjaGVkIHJvdXRlXG4gICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnN0b3JlID0gZnVuY3Rpb24gKHJvdXRlLCBoYW5kbGUpIHsgfTtcbiAgICAgIC8qKlxuICAgICAgICogIERldGVybWluZXMgaWYgdGhpcyByb3V0ZSAoYW5kIGl0cyBzdWJ0cmVlKSBzaG91bGQgYmUgcmVhdHRhY2hlZFxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnNob3VsZEF0dGFjaCA9IGZ1bmN0aW9uIChyb3V0ZSkgeyB9O1xuICAgICAgLyoqXG4gICAgICAgKiAgUmV0cmlldmVzIHRoZSBwcmV2aW91c2x5IHN0b3JlZCByb3V0ZVxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnJldHJpZXZlID0gZnVuY3Rpb24gKHJvdXRlKSB7IH07XG4gICAgICAvKipcbiAgICAgICAqICBEZXRlcm1pbmVzIGlmIGEgcm91dGUgc2hvdWxkIGJlIHJldXNlZFxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IGZ1dHVyZVxuICAgICAgICogQHBhcmFtIHs/fSBjdXJyXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZVJldXNlU3RyYXRlZ3kucHJvdG90eXBlLnNob3VsZFJldXNlUm91dGUgPSBmdW5jdGlvbiAoZnV0dXJlLCBjdXJyKSB7IH07XG4gICAgICByZXR1cm4gUm91dGVSZXVzZVN0cmF0ZWd5O1xuICB9KCkpO1xuXG4gIHZhciAvKiogQHR5cGUgez99ICovIGdldERPTSA9IF9hbmd1bGFyX3BsYXRmb3JtQnJvd3Nlci5fX3BsYXRmb3JtX2Jyb3dzZXJfcHJpdmF0ZV9fLmdldERPTTtcblxuICAvKipcbiAgICogICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICB2YXIgUHJlbG9hZGluZ1N0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFByZWxvYWRpbmdTdHJhdGVneSgpIHtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQGFic3RyYWN0XG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVsb2FkaW5nU3RyYXRlZ3kucHJvdG90eXBlLnByZWxvYWQgPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7IH07XG4gICAgICByZXR1cm4gUHJlbG9hZGluZ1N0cmF0ZWd5O1xuICB9KCkpO1xuICAvKipcbiAgICogICpcbiAgICAqICpcbiAgICAqIGBgYFxuICAgICogUm91dGVNb2R1bGUuZm9yUm9vdChST1VURVMsIHtwcmVsb2FkaW5nU3RyYXRlZ3k6IFByZWxvYWRBbGxNb2R1bGVzfSlcbiAgICAqIGBgYFxuICAgICogKlxuICAgKi9cbiAgdmFyIFByZWxvYWRBbGxNb2R1bGVzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFByZWxvYWRBbGxNb2R1bGVzKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBQcmVsb2FkQWxsTW9kdWxlcy5wcm90b3R5cGUucHJlbG9hZCA9IGZ1bmN0aW9uIChyb3V0ZSwgZm4pIHtcbiAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9jYXRjaC5fY2F0Y2guY2FsbChmbigpLCBmdW5jdGlvbiAoKSB7IHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YobnVsbCk7IH0pO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQcmVsb2FkQWxsTW9kdWxlcztcbiAgfSgpKTtcbiAgLyoqXG4gICAqICAqXG4gICAgKiAqXG4gICAgKiBUaGlzIHN0cmF0ZWd5IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cbiAgICAqICpcbiAgICovXG4gIHZhciBOb1ByZWxvYWRpbmcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTm9QcmVsb2FkaW5nKCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlXG4gICAgICAgKiBAcGFyYW0gez99IGZuXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBOb1ByZWxvYWRpbmcucHJvdG90eXBlLnByZWxvYWQgPSBmdW5jdGlvbiAocm91dGUsIGZuKSB7IHJldHVybiByeGpzX29ic2VydmFibGVfb2Yub2YobnVsbCk7IH07XG4gICAgICByZXR1cm4gTm9QcmVsb2FkaW5nO1xuICB9KCkpO1xuICAvKipcbiAgICogIFRoZSBwcmVsb2FkZXIgb3B0aW1pc3RpY2FsbHkgbG9hZHMgYWxsIHJvdXRlciBjb25maWd1cmF0aW9ucyB0b1xuICAgICogbWFrZSBuYXZpZ2F0aW9ucyBpbnRvIGxhemlseS1sb2FkZWQgc2VjdGlvbnMgb2YgdGhlIGFwcGxpY2F0aW9uIGZhc3Rlci5cbiAgICAqICpcbiAgICAqIFRoZSBwcmVsb2FkZXIgcnVucyBpbiB0aGUgYmFja2dyb3VuZC4gV2hlbiB0aGUgcm91dGVyIGJvb3RzdHJhcHMsIHRoZSBwcmVsb2FkZXJcbiAgICAqIHN0YXJ0cyBsaXN0ZW5pbmcgdG8gYWxsIG5hdmlnYXRpb24gZXZlbnRzLiBBZnRlciBldmVyeSBzdWNoIGV2ZW50LCB0aGUgcHJlbG9hZGVyXG4gICAgKiB3aWxsIGNoZWNrIGlmIGFueSBjb25maWd1cmF0aW9ucyBjYW4gYmUgbG9hZGVkIGxhemlseS5cbiAgICAqICpcbiAgICAqIElmIGEgcm91dGUgaXMgcHJvdGVjdGVkIGJ5IGBjYW5Mb2FkYCBndWFyZHMsIHRoZSBwcmVsb2FkZWQgd2lsbCBub3QgbG9hZCBpdC5cbiAgICAqICpcbiAgICovXG4gIHZhciBSb3V0ZXJQcmVsb2FkZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlclxuICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVMb2FkZXJcbiAgICAgICAqIEBwYXJhbSB7P30gY29tcGlsZXJcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gcHJlbG9hZGluZ1N0cmF0ZWd5XG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJvdXRlclByZWxvYWRlcihyb3V0ZXIsIG1vZHVsZUxvYWRlciwgY29tcGlsZXIsIGluamVjdG9yLCBwcmVsb2FkaW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlcjtcbiAgICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgICAgdGhpcy5wcmVsb2FkaW5nU3RyYXRlZ3kgPSBwcmVsb2FkaW5nU3RyYXRlZ3k7XG4gICAgICAgICAgdGhpcy5sb2FkZXIgPSBuZXcgUm91dGVyQ29uZmlnTG9hZGVyKG1vZHVsZUxvYWRlciwgY29tcGlsZXIpO1xuICAgICAgfVxuICAgICAgO1xuICAgICAgLyoqXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJQcmVsb2FkZXIucHJvdG90eXBlLnNldFVwUHJlbG9hZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hdmlnYXRpb25zID0gcnhqc19vcGVyYXRvcl9maWx0ZXIuZmlsdGVyLmNhbGwodGhpcy5yb3V0ZXIuZXZlbnRzLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQ7IH0pO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gcnhqc19vcGVyYXRvcl9jb25jYXRNYXAuY29uY2F0TWFwLmNhbGwobmF2aWdhdGlvbnMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnByZWxvYWQoKTsgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uICh2KSB7IH0pO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyUHJlbG9hZGVyLnByb3RvdHlwZS5wcmVsb2FkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5wcm9jZXNzUm91dGVzKHRoaXMuaW5qZWN0b3IsIHRoaXMucm91dGVyLmNvbmZpZyk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlclByZWxvYWRlci5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICovXG4gICAgICBSb3V0ZXJQcmVsb2FkZXIucHJvdG90eXBlLnByb2Nlc3NSb3V0ZXMgPSBmdW5jdGlvbiAoaW5qZWN0b3IsIHJvdXRlcykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJlcyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgcm91dGVzXzEgPSByb3V0ZXM7IF9pIDwgcm91dGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBjID0gcm91dGVzXzFbX2ldO1xuICAgICAgICAgICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgdGhlIGNvbmZpZyBsb2FkZWQsIGp1c3QgcmVjdXJjZVxuICAgICAgICAgICAgICBpZiAoYy5sb2FkQ2hpbGRyZW4gJiYgIWMuY2FuTG9hZCAmJiAoKGMpKS5fbG9hZGVkQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBjaGlsZENvbmZpZyA9ICgoYykpLl9sb2FkZWRDb25maWc7XG4gICAgICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLnByb2Nlc3NSb3V0ZXMoY2hpbGRDb25maWcuaW5qZWN0b3IsIGNoaWxkQ29uZmlnLnJvdXRlcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGMubG9hZENoaWxkcmVuICYmICFjLmNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMucHJlbG9hZENvbmZpZyhpbmplY3RvciwgYykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGMuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMucHJvY2Vzc1JvdXRlcyhpbmplY3RvciwgYy5jaGlsZHJlbikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByeGpzX29wZXJhdG9yX21lcmdlQWxsLm1lcmdlQWxsLmNhbGwocnhqc19vYnNlcnZhYmxlX2Zyb20uZnJvbShyZXMpKTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlclByZWxvYWRlci5wcm90b3R5cGUucHJlbG9hZENvbmZpZyA9IGZ1bmN0aW9uIChpbmplY3Rvciwgcm91dGUpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRpbmdTdHJhdGVneS5wcmVsb2FkKHJvdXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGxvYWRlZCA9IF90aGlzLmxvYWRlci5sb2FkKGluamVjdG9yLCByb3V0ZS5sb2FkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICByZXR1cm4gcnhqc19vcGVyYXRvcl9tZXJnZU1hcC5tZXJnZU1hcC5jYWxsKGxvYWRlZCwgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gYyA9IHJvdXRlO1xuICAgICAgICAgICAgICAgICAgYy5fbG9hZGVkQ29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnByb2Nlc3NSb3V0ZXMoY29uZmlnLmluamVjdG9yLCBjb25maWcucm91dGVzKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgUm91dGVyUHJlbG9hZGVyLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdGFibGUgfSxcbiAgICAgIF07XG4gICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgIFJvdXRlclByZWxvYWRlci5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtcbiAgICAgICAgICB7IHR5cGU6IFJvdXRlciwgfSxcbiAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuTmdNb2R1bGVGYWN0b3J5TG9hZGVyLCB9LFxuICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5Db21waWxlciwgfSxcbiAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0b3IsIH0sXG4gICAgICAgICAgeyB0eXBlOiBQcmVsb2FkaW5nU3RyYXRlZ3ksIH0sXG4gICAgICBdOyB9O1xuICAgICAgcmV0dXJuIFJvdXRlclByZWxvYWRlcjtcbiAgfSgpKTtcblxuICAvKipcbiAgICogQHdoYXRJdERvZXMgQ29udGFpbnMgYSBsaXN0IG9mIGRpcmVjdGl2ZXNcbiAgICogQHN0YWJsZVxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUk9VVEVSX0RJUkVDVElWRVMgPSBbUm91dGVyT3V0bGV0LCBSb3V0ZXJMaW5rLCBSb3V0ZXJMaW5rV2l0aEhyZWYsIFJvdXRlckxpbmtBY3RpdmVdO1xuICAvKipcbiAgICogQHdoYXRJdERvZXMgSXMgdXNlZCBpbiBESSB0byBjb25maWd1cmUgdGhlIHJvdXRlci5cbiAgICogQHN0YWJsZVxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gUk9VVEVSX0NPTkZJR1VSQVRJT04gPSBuZXcgX2FuZ3VsYXJfY29yZS5PcGFxdWVUb2tlbignUk9VVEVSX0NPTkZJR1VSQVRJT04nKTtcbiAgLyoqXG4gICAqIEBkb2NzTm90UmVxdWlyZWRcbiAgICovXG4gIHZhciAvKiogQHR5cGUgez99ICovIFJPVVRFUl9GT1JST09UX0dVQVJEID0gbmV3IF9hbmd1bGFyX2NvcmUuT3BhcXVlVG9rZW4oJ1JPVVRFUl9GT1JST09UX0dVQVJEJyk7XG4gIHZhciAvKiogQHR5cGUgez99ICovIFJPVVRFUl9QUk9WSURFUlMgPSBbXG4gICAgICBfYW5ndWxhcl9jb21tb24uTG9jYXRpb24sXG4gICAgICB7IHByb3ZpZGU6IFVybFNlcmlhbGl6ZXIsIHVzZUNsYXNzOiBEZWZhdWx0VXJsU2VyaWFsaXplciB9LFxuICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJvdXRlcixcbiAgICAgICAgICB1c2VGYWN0b3J5OiBzZXR1cFJvdXRlcixcbiAgICAgICAgICBkZXBzOiBbXG4gICAgICAgICAgICAgIF9hbmd1bGFyX2NvcmUuQXBwbGljYXRpb25SZWYsIFVybFNlcmlhbGl6ZXIsIFJvdXRlck91dGxldE1hcCwgX2FuZ3VsYXJfY29tbW9uLkxvY2F0aW9uLCBfYW5ndWxhcl9jb3JlLkluamVjdG9yLCBfYW5ndWxhcl9jb3JlLk5nTW9kdWxlRmFjdG9yeUxvYWRlcixcbiAgICAgICAgICAgICAgX2FuZ3VsYXJfY29yZS5Db21waWxlciwgUk9VVEVTLCBST1VURVJfQ09ORklHVVJBVElPTiwgW1VybEhhbmRsaW5nU3RyYXRlZ3ksIG5ldyBfYW5ndWxhcl9jb3JlLk9wdGlvbmFsKCldLFxuICAgICAgICAgICAgICBbUm91dGVSZXVzZVN0cmF0ZWd5LCBuZXcgX2FuZ3VsYXJfY29yZS5PcHRpb25hbCgpXVxuICAgICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBSb3V0ZXJPdXRsZXRNYXAsXG4gICAgICB7IHByb3ZpZGU6IEFjdGl2YXRlZFJvdXRlLCB1c2VGYWN0b3J5OiByb290Um91dGUsIGRlcHM6IFtSb3V0ZXJdIH0sXG4gICAgICB7IHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuTmdNb2R1bGVGYWN0b3J5TG9hZGVyLCB1c2VDbGFzczogX2FuZ3VsYXJfY29yZS5TeXN0ZW1Kc05nTW9kdWxlTG9hZGVyIH0sXG4gICAgICBSb3V0ZXJQcmVsb2FkZXIsXG4gICAgICBOb1ByZWxvYWRpbmcsXG4gICAgICBQcmVsb2FkQWxsTW9kdWxlcyxcbiAgICAgIHsgcHJvdmlkZTogUk9VVEVSX0NPTkZJR1VSQVRJT04sIHVzZVZhbHVlOiB7IGVuYWJsZVRyYWNpbmc6IGZhbHNlIH0gfSxcbiAgXTtcbiAgLyoqXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiByb3V0ZXJOZ1Byb2JlVG9rZW4oKSB7XG4gICAgICByZXR1cm4gbmV3IF9hbmd1bGFyX2NvcmUuTmdQcm9iZVRva2VuKCdSb3V0ZXInLCBSb3V0ZXIpO1xuICB9XG4gIC8qKlxuICAgKiAgKlxuICAgICogKlxuICAgICogUm91dGVyTW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lczogb25jZSBwZXIgbGF6aWx5LWxvYWRlZCBidW5kbGUuXG4gICAgKiBTaW5jZSB0aGUgcm91dGVyIGRlYWxzIHdpdGggYSBnbG9iYWwgc2hhcmVkIHJlc291cmNlLS1sb2NhdGlvbiwgd2UgY2Fubm90IGhhdmVcbiAgICAqIG1vcmUgdGhhbiBvbmUgcm91dGVyIHNlcnZpY2UgYWN0aXZlLlxuICAgICogKlxuICAgICogVGhhdCBpcyB3aHkgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGNyZWF0ZSB0aGUgbW9kdWxlOiBgUm91dGVyTW9kdWxlLmZvclJvb3RgIGFuZFxuICAgICogYFJvdXRlck1vZHVsZS5mb3JDaGlsZGAuXG4gICAgKiAqXG4gICAgKiAqIGBmb3JSb290YCBjcmVhdGVzIGEgbW9kdWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBkaXJlY3RpdmVzLCB0aGUgZ2l2ZW4gcm91dGVzLCBhbmQgdGhlIHJvdXRlclxuICAgICogc2VydmljZSBpdHNlbGYuXG4gICAgKiAqIGBmb3JDaGlsZGAgY3JlYXRlcyBhIG1vZHVsZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZGlyZWN0aXZlcyBhbmQgdGhlIGdpdmVuIHJvdXRlcywgYnV0IGRvZXMgbm90XG4gICAgKiBpbmNsdWRlIHRoZSByb3V0ZXIgc2VydmljZS5cbiAgICAqICpcbiAgICAqIFdoZW4gcmVnaXN0ZXJlZCBhdCB0aGUgcm9vdCwgdGhlIG1vZHVsZSBzaG91bGQgYmUgdXNlZCBhcyBmb2xsb3dzXG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yUm9vdChST1VURVMpXVxuICAgICogfSlcbiAgICAqIGNsYXNzIE15TmdNb2R1bGUge31cbiAgICAqIGBgYFxuICAgICogKlxuICAgICogRm9yIHN1Ym1vZHVsZXMgYW5kIGxhenkgbG9hZGVkIHN1Ym1vZHVsZXMgdGhlIG1vZHVsZSBzaG91bGQgYmUgdXNlZCBhcyBmb2xsb3dzOlxuICAgICogKlxuICAgICogYGBgXG4gICAgKiBpbXBvcnRzOiBbUm91dGVyTW9kdWxlLmZvckNoaWxkKFJPVVRFUyldXG4gICAgKiB9KVxuICAgICogY2xhc3MgTXlOZ01vZHVsZSB7fVxuICAgICogYGBgXG4gICAgKiAqXG4gICAgKiAqXG4gICAgKiBNYW5hZ2luZyBzdGF0ZSB0cmFuc2l0aW9ucyBpcyBvbmUgb2YgdGhlIGhhcmRlc3QgcGFydHMgb2YgYnVpbGRpbmcgYXBwbGljYXRpb25zLiBUaGlzIGlzXG4gICAgKiBlc3BlY2lhbGx5IHRydWUgb24gdGhlIHdlYiwgd2hlcmUgeW91IGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgc3RhdGUgaXMgcmVmbGVjdGVkIGluIHRoZSBVUkwuXG4gICAgKiBJbiBhZGRpdGlvbiwgd2Ugb2Z0ZW4gd2FudCB0byBzcGxpdCBhcHBsaWNhdGlvbnMgaW50byBtdWx0aXBsZSBidW5kbGVzIGFuZCBsb2FkIHRoZW0gb24gZGVtYW5kLlxuICAgICogRG9pbmcgdGhpcyB0cmFuc3BhcmVudGx5IGlzIG5vdCB0cml2aWFsLlxuICAgICogKlxuICAgICogVGhlIEFuZ3VsYXIgMiByb3V0ZXIgc29sdmVzIHRoZXNlIHByb2JsZW1zLiBVc2luZyB0aGUgcm91dGVyLCB5b3UgY2FuIGRlY2xhcmF0aXZlbHkgc3BlY2lmeVxuICAgICogYXBwbGljYXRpb24gc3RhdGVzLCBtYW5hZ2Ugc3RhdGUgdHJhbnNpdGlvbnMgd2hpbGUgdGFraW5nIGNhcmUgb2YgdGhlIFVSTCwgYW5kIGxvYWQgYnVuZGxlcyBvblxuICAgICogZGVtYW5kLlxuICAgICogKlxuICAgICogW1JlYWQgdGhpcyBkZXZlbG9wZXIgZ3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9kb2NzL3RzL2xhdGVzdC9ndWlkZS9yb3V0ZXIuaHRtbCkgdG8gZ2V0IGFuXG4gICAgKiBvdmVydmlldyBvZiBob3cgdGhlIHJvdXRlciBzaG91bGQgYmUgdXNlZC5cbiAgICAqICpcbiAgICovXG4gIHZhciBSb3V0ZXJNb2R1bGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gez99IGd1YXJkXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIFJvdXRlck1vZHVsZShndWFyZCkge1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiAgQ3JlYXRlcyBhIG1vZHVsZSB3aXRoIGFsbCB0aGUgcm91dGVyIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcy4gSXQgYWxzbyBvcHRpb25hbGx5IHNldHMgdXAgYW5cbiAgICAgICAgKiBhcHBsaWNhdGlvbiBsaXN0ZW5lciB0byBwZXJmb3JtIGFuIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICAgICAgKiAqXG4gICAgICAgICogT3B0aW9uczpcbiAgICAgICAgKiAqIGBlbmFibGVUcmFjaW5nYCBtYWtlcyB0aGUgcm91dGVyIGxvZyBhbGwgaXRzIGludGVybmFsIGV2ZW50cyB0byB0aGUgY29uc29sZS5cbiAgICAgICAgKiAqIGB1c2VIYXNoYCBlbmFibGVzIHRoZSBsb2NhdGlvbiBzdHJhdGVneSB0aGF0IHVzZXMgdGhlIFVSTCBmcmFnbWVudCBpbnN0ZWFkIG9mIHRoZSBoaXN0b3J5XG4gICAgICAgICogQVBJLlxuICAgICAgICAqICogYGluaXRpYWxOYXZpZ2F0aW9uYCBkaXNhYmxlcyB0aGUgaW5pdGlhbCBuYXZpZ2F0aW9uLlxuICAgICAgICAqICogYGVycm9ySGFuZGxlcmAgcHJvdmlkZXMgYSBjdXN0b20gZXJyb3IgaGFuZGxlci5cbiAgICAgICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAgICAgKiBAcGFyYW0gez89fSBjb25maWdcbiAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgKi9cbiAgICAgIFJvdXRlck1vZHVsZS5mb3JSb290ID0gZnVuY3Rpb24gKHJvdXRlcywgY29uZmlnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbmdNb2R1bGU6IFJvdXRlck1vZHVsZSxcbiAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICBST1VURVJfUFJPVklERVJTLFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZVJvdXRlcyhyb3V0ZXMpLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFJPVVRFUl9GT1JST09UX0dVQVJELFxuICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IHByb3ZpZGVGb3JSb290R3VhcmQsXG4gICAgICAgICAgICAgICAgICAgICAgZGVwczogW1tSb3V0ZXIsIG5ldyBfYW5ndWxhcl9jb3JlLk9wdGlvbmFsKCksIG5ldyBfYW5ndWxhcl9jb3JlLlNraXBTZWxmKCldXVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogUk9VVEVSX0NPTkZJR1VSQVRJT04sIHVzZVZhbHVlOiBjb25maWcgPyBjb25maWcgOiB7fSB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9hbmd1bGFyX2NvbW1vbi5Mb2NhdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IHByb3ZpZGVMb2NhdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2FuZ3VsYXJfY29tbW9uLlBsYXRmb3JtTG9jYXRpb24sIFtuZXcgX2FuZ3VsYXJfY29yZS5JbmplY3QoX2FuZ3VsYXJfY29tbW9uLkFQUF9CQVNFX0hSRUYpLCBuZXcgX2FuZ3VsYXJfY29yZS5PcHRpb25hbCgpXSwgUk9VVEVSX0NPTkZJR1VSQVRJT05cbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFByZWxvYWRpbmdTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogY29uZmlnICYmIGNvbmZpZy5wcmVsb2FkaW5nU3RyYXRlZ3kgPyBjb25maWcucHJlbG9hZGluZ1N0cmF0ZWd5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTm9QcmVsb2FkaW5nXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBfYW5ndWxhcl9jb3JlLk5nUHJvYmVUb2tlbiwgbXVsdGk6IHRydWUsIHVzZUZhY3Rvcnk6IHJvdXRlck5nUHJvYmVUb2tlbiB9LFxuICAgICAgICAgICAgICAgICAgcHJvdmlkZVJvdXRlckluaXRpYWxpemVyKCksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqICBDcmVhdGVzIGEgbW9kdWxlIHdpdGggYWxsIHRoZSByb3V0ZXIgZGlyZWN0aXZlcyBhbmQgYSBwcm92aWRlciByZWdpc3RlcmluZyByb3V0ZXMuXG4gICAgICAgKiBAcGFyYW0gez99IHJvdXRlc1xuICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAqL1xuICAgICAgUm91dGVyTW9kdWxlLmZvckNoaWxkID0gZnVuY3Rpb24gKHJvdXRlcykge1xuICAgICAgICAgIHJldHVybiB7IG5nTW9kdWxlOiBSb3V0ZXJNb2R1bGUsIHByb3ZpZGVyczogW3Byb3ZpZGVSb3V0ZXMocm91dGVzKV0gfTtcbiAgICAgIH07XG4gICAgICBSb3V0ZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuTmdNb2R1bGUsIGFyZ3M6IFt7IGRlY2xhcmF0aW9uczogUk9VVEVSX0RJUkVDVElWRVMsIGV4cG9ydHM6IFJPVVRFUl9ESVJFQ1RJVkVTIH0sXSB9LFxuICAgICAgXTtcbiAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgUm91dGVyTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBfYW5ndWxhcl9jb3JlLk9wdGlvbmFsIH0sIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3QsIGFyZ3M6IFtST1VURVJfRk9SUk9PVF9HVUFSRCxdIH0sXSB9LFxuICAgICAgXTsgfTtcbiAgICAgIHJldHVybiBSb3V0ZXJNb2R1bGU7XG4gIH0oKSk7XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHBsYXRmb3JtTG9jYXRpb25TdHJhdGVneVxuICAgKiBAcGFyYW0gez99IGJhc2VIcmVmXG4gICAqIEBwYXJhbSB7Pz19IG9wdGlvbnNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHByb3ZpZGVMb2NhdGlvblN0cmF0ZWd5KHBsYXRmb3JtTG9jYXRpb25TdHJhdGVneSwgYmFzZUhyZWYsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICByZXR1cm4gb3B0aW9ucy51c2VIYXNoID8gbmV3IF9hbmd1bGFyX2NvbW1vbi5IYXNoTG9jYXRpb25TdHJhdGVneShwbGF0Zm9ybUxvY2F0aW9uU3RyYXRlZ3ksIGJhc2VIcmVmKSA6XG4gICAgICAgICAgbmV3IF9hbmd1bGFyX2NvbW1vbi5QYXRoTG9jYXRpb25TdHJhdGVneShwbGF0Zm9ybUxvY2F0aW9uU3RyYXRlZ3ksIGJhc2VIcmVmKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHs/fSByb3V0ZXJcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIHByb3ZpZGVGb3JSb290R3VhcmQocm91dGVyKSB7XG4gICAgICBpZiAocm91dGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUm91dGVyTW9kdWxlLmZvclJvb3QoKSBjYWxsZWQgdHdpY2UuIExhenkgbG9hZGVkIG1vZHVsZXMgc2hvdWxkIHVzZSBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoKSBpbnN0ZWFkLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnZ3VhcmRlZCc7XG4gIH1cbiAgLyoqXG4gICAqICAqXG4gICAgKiAqXG4gICAgKiBgYGBcbiAgICAqIGltcG9ydHM6IFtSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoUk9VVEVTKV0sXG4gICAgKiBwcm92aWRlcnM6IFtwcm92aWRlUm91dGVzKEVYVFJBX1JPVVRFUyldXG4gICAgKiB9KVxuICAgICogY2xhc3MgTXlOZ01vZHVsZSB7fVxuICAgICogYGBgXG4gICAgKiAqXG4gICAqIEBwYXJhbSB7P30gcm91dGVzXG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBwcm92aWRlUm91dGVzKHJvdXRlcykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7IHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUywgbXVsdGk6IHRydWUsIHVzZVZhbHVlOiByb3V0ZXMgfSxcbiAgICAgICAgICB7IHByb3ZpZGU6IFJPVVRFUywgbXVsdGk6IHRydWUsIHVzZVZhbHVlOiByb3V0ZXMgfSxcbiAgICAgIF07XG4gIH1cbiAgLyoqXG4gICAqIEBwYXJhbSB7P30gcmVmXG4gICAqIEBwYXJhbSB7P30gdXJsU2VyaWFsaXplclxuICAgKiBAcGFyYW0gez99IG91dGxldE1hcFxuICAgKiBAcGFyYW0gez99IGxvY2F0aW9uXG4gICAqIEBwYXJhbSB7P30gaW5qZWN0b3JcbiAgICogQHBhcmFtIHs/fSBsb2FkZXJcbiAgICogQHBhcmFtIHs/fSBjb21waWxlclxuICAgKiBAcGFyYW0gez99IGNvbmZpZ1xuICAgKiBAcGFyYW0gez89fSBvcHRzXG4gICAqIEBwYXJhbSB7Pz19IHVybEhhbmRsaW5nU3RyYXRlZ3lcbiAgICogQHBhcmFtIHs/PX0gcm91dGVSZXVzZVN0cmF0ZWd5XG4gICAqIEByZXR1cm4gez99XG4gICAqL1xuICBmdW5jdGlvbiBzZXR1cFJvdXRlcihyZWYsIHVybFNlcmlhbGl6ZXIsIG91dGxldE1hcCwgbG9jYXRpb24sIGluamVjdG9yLCBsb2FkZXIsIGNvbXBpbGVyLCBjb25maWcsIG9wdHMsIHVybEhhbmRsaW5nU3RyYXRlZ3ksIHJvdXRlUmV1c2VTdHJhdGVneSkge1xuICAgICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHJvdXRlciA9IG5ldyBSb3V0ZXIobnVsbCwgdXJsU2VyaWFsaXplciwgb3V0bGV0TWFwLCBsb2NhdGlvbiwgaW5qZWN0b3IsIGxvYWRlciwgY29tcGlsZXIsIGZsYXR0ZW4oY29uZmlnKSk7XG4gICAgICBpZiAodXJsSGFuZGxpbmdTdHJhdGVneSkge1xuICAgICAgICAgIHJvdXRlci51cmxIYW5kbGluZ1N0cmF0ZWd5ID0gdXJsSGFuZGxpbmdTdHJhdGVneTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZVJldXNlU3RyYXRlZ3kpIHtcbiAgICAgICAgICByb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5ID0gcm91dGVSZXVzZVN0cmF0ZWd5O1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMuZXJyb3JIYW5kbGVyKSB7XG4gICAgICAgICAgcm91dGVyLmVycm9ySGFuZGxlciA9IG9wdHMuZXJyb3JIYW5kbGVyO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMuZW5hYmxlVHJhY2luZykge1xuICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGRvbV8xID0gZ2V0RE9NKCk7XG4gICAgICAgICAgcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgZG9tXzEubG9nR3JvdXAoXCJSb3V0ZXIgRXZlbnQ6IFwiICsgKChlLmNvbnN0cnVjdG9yKSkubmFtZSk7XG4gICAgICAgICAgICAgIGRvbV8xLmxvZyhlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICBkb21fMS5sb2coZSk7XG4gICAgICAgICAgICAgIGRvbV8xLmxvZ0dyb3VwRW5kKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm91dGVyO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvdXRlclxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcm9vdFJvdXRlKHJvdXRlcikge1xuICAgICAgcmV0dXJuIHJvdXRlci5yb3V0ZXJTdGF0ZS5yb290O1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0gez99IHJvdXRlclxuICAgKiBAcGFyYW0gez99IHJlZlxuICAgKiBAcGFyYW0gez99IHByZWxvYWRlclxuICAgKiBAcGFyYW0gez99IG9wdHNcbiAgICogQHJldHVybiB7P31cbiAgICovXG4gIGZ1bmN0aW9uIGluaXRpYWxSb3V0ZXJOYXZpZ2F0aW9uKHJvdXRlciwgcmVmLCBwcmVsb2FkZXIsIG9wdHMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYm9vdHN0cmFwcGVkQ29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgaWYgKGJvb3RzdHJhcHBlZENvbXBvbmVudFJlZiAhPT0gcmVmLmNvbXBvbmVudHNbMF0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb3V0ZXIucmVzZXRSb290Q29tcG9uZW50VHlwZShyZWYuY29tcG9uZW50VHlwZXNbMF0pO1xuICAgICAgICAgIHByZWxvYWRlci5zZXRVcFByZWxvYWRpbmcoKTtcbiAgICAgICAgICBpZiAob3B0cy5pbml0aWFsTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgcm91dGVyLnNldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcm91dGVyLmluaXRpYWxOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQSB0b2tlbiBmb3IgdGhlIHJvdXRlciBpbml0aWFsaXplciB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhcHAgaXMgYm9vdHN0cmFwcGVkLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBST1VURVJfSU5JVElBTElaRVIgPSBuZXcgX2FuZ3VsYXJfY29yZS5PcGFxdWVUb2tlbignUm91dGVyIEluaXRpYWxpemVyJyk7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHs/fVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvdmlkZVJvdXRlckluaXRpYWxpemVyKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByb3ZpZGU6IFJPVVRFUl9JTklUSUFMSVpFUixcbiAgICAgICAgICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbFJvdXRlck5hdmlnYXRpb24sXG4gICAgICAgICAgICAgIGRlcHM6IFtSb3V0ZXIsIF9hbmd1bGFyX2NvcmUuQXBwbGljYXRpb25SZWYsIFJvdXRlclByZWxvYWRlciwgUk9VVEVSX0NPTkZJR1VSQVRJT05dXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHByb3ZpZGU6IF9hbmd1bGFyX2NvcmUuQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgbXVsdGk6IHRydWUsIHVzZUV4aXN0aW5nOiBST1VURVJfSU5JVElBTElaRVIgfSxcbiAgICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQHN0YWJsZVxuICAgKi9cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gVkVSU0lPTiA9IG5ldyBfYW5ndWxhcl9jb3JlLlZlcnNpb24oJzMuNC4xJyk7XG5cbiAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX19yb3V0ZXJfcHJpdmF0ZV9fID0ge1xuICAgICAgUk9VVEVSX1BST1ZJREVSUzogUk9VVEVSX1BST1ZJREVSUyxcbiAgICAgIFJPVVRFUzogUk9VVEVTLFxuICAgICAgZmxhdHRlbjogZmxhdHRlbixcbiAgfTtcblxuICBleHBvcnRzLlJvdXRlckxpbmsgPSBSb3V0ZXJMaW5rO1xuICBleHBvcnRzLlJvdXRlckxpbmtXaXRoSHJlZiA9IFJvdXRlckxpbmtXaXRoSHJlZjtcbiAgZXhwb3J0cy5Sb3V0ZXJMaW5rQWN0aXZlID0gUm91dGVyTGlua0FjdGl2ZTtcbiAgZXhwb3J0cy5Sb3V0ZXJPdXRsZXQgPSBSb3V0ZXJPdXRsZXQ7XG4gIGV4cG9ydHMuUm91dGVSZXVzZVN0cmF0ZWd5ID0gUm91dGVSZXVzZVN0cmF0ZWd5O1xuICBleHBvcnRzLk5hdmlnYXRpb25DYW5jZWwgPSBOYXZpZ2F0aW9uQ2FuY2VsO1xuICBleHBvcnRzLk5hdmlnYXRpb25FbmQgPSBOYXZpZ2F0aW9uRW5kO1xuICBleHBvcnRzLk5hdmlnYXRpb25FcnJvciA9IE5hdmlnYXRpb25FcnJvcjtcbiAgZXhwb3J0cy5OYXZpZ2F0aW9uU3RhcnQgPSBOYXZpZ2F0aW9uU3RhcnQ7XG4gIGV4cG9ydHMuUm91dGVyID0gUm91dGVyO1xuICBleHBvcnRzLlJvdXRlc1JlY29nbml6ZWQgPSBSb3V0ZXNSZWNvZ25pemVkO1xuICBleHBvcnRzLlJPVVRFUl9DT05GSUdVUkFUSU9OID0gUk9VVEVSX0NPTkZJR1VSQVRJT047XG4gIGV4cG9ydHMuUk9VVEVSX0lOSVRJQUxJWkVSID0gUk9VVEVSX0lOSVRJQUxJWkVSO1xuICBleHBvcnRzLlJvdXRlck1vZHVsZSA9IFJvdXRlck1vZHVsZTtcbiAgZXhwb3J0cy5wcm92aWRlUm91dGVzID0gcHJvdmlkZVJvdXRlcztcbiAgZXhwb3J0cy5Sb3V0ZXJPdXRsZXRNYXAgPSBSb3V0ZXJPdXRsZXRNYXA7XG4gIGV4cG9ydHMuTm9QcmVsb2FkaW5nID0gTm9QcmVsb2FkaW5nO1xuICBleHBvcnRzLlByZWxvYWRBbGxNb2R1bGVzID0gUHJlbG9hZEFsbE1vZHVsZXM7XG4gIGV4cG9ydHMuUHJlbG9hZGluZ1N0cmF0ZWd5ID0gUHJlbG9hZGluZ1N0cmF0ZWd5O1xuICBleHBvcnRzLlJvdXRlclByZWxvYWRlciA9IFJvdXRlclByZWxvYWRlcjtcbiAgZXhwb3J0cy5BY3RpdmF0ZWRSb3V0ZSA9IEFjdGl2YXRlZFJvdXRlO1xuICBleHBvcnRzLkFjdGl2YXRlZFJvdXRlU25hcHNob3QgPSBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICBleHBvcnRzLlJvdXRlclN0YXRlID0gUm91dGVyU3RhdGU7XG4gIGV4cG9ydHMuUm91dGVyU3RhdGVTbmFwc2hvdCA9IFJvdXRlclN0YXRlU25hcHNob3Q7XG4gIGV4cG9ydHMuUFJJTUFSWV9PVVRMRVQgPSBQUklNQVJZX09VVExFVDtcbiAgZXhwb3J0cy5VcmxIYW5kbGluZ1N0cmF0ZWd5ID0gVXJsSGFuZGxpbmdTdHJhdGVneTtcbiAgZXhwb3J0cy5EZWZhdWx0VXJsU2VyaWFsaXplciA9IERlZmF1bHRVcmxTZXJpYWxpemVyO1xuICBleHBvcnRzLlVybFNlZ21lbnQgPSBVcmxTZWdtZW50O1xuICBleHBvcnRzLlVybFNlZ21lbnRHcm91cCA9IFVybFNlZ21lbnRHcm91cDtcbiAgZXhwb3J0cy5VcmxTZXJpYWxpemVyID0gVXJsU2VyaWFsaXplcjtcbiAgZXhwb3J0cy5VcmxUcmVlID0gVXJsVHJlZTtcbiAgZXhwb3J0cy5WRVJTSU9OID0gVkVSU0lPTjtcbiAgZXhwb3J0cy5fX3JvdXRlcl9wcml2YXRlX18gPSBfX3JvdXRlcl9wcml2YXRlX187XG5cbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vQGFuZ3VsYXIvcm91dGVyL2J1bmRsZXMvcm91dGVyLnVtZC5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  115. /***/ },
  116. /* 33 */
  117. /***/ function(module, exports, __webpack_require__) {
  118. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar ObjectUnsubscribedError_1 = __webpack_require__(20);\n/**\n * @class BehaviorSubject<T>\n */\nvar BehaviorSubject = (function (_super) {\n __extends(BehaviorSubject, _super);\n function BehaviorSubject(_value) {\n _super.call(this);\n this._value = _value;\n }\n Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n get: function () {\n return this.getValue();\n },\n enumerable: true,\n configurable: true\n });\n BehaviorSubject.prototype._subscribe = function (subscriber) {\n var subscription = _super.prototype._subscribe.call(this, subscriber);\n if (subscription && !subscription.closed) {\n subscriber.next(this._value);\n }\n return subscription;\n };\n BehaviorSubject.prototype.getValue = function () {\n if (this.hasError) {\n throw this.thrownError;\n }\n else if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n else {\n return this._value;\n }\n };\n BehaviorSubject.prototype.next = function (value) {\n _super.prototype.next.call(this, this._value = value);\n };\n return BehaviorSubject;\n}(Subject_1.Subject));\nexports.BehaviorSubject = BehaviorSubject;\n//# sourceMappingURL=BehaviorSubject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvQmVoYXZpb3JTdWJqZWN0LmpzPzg0Y2IiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJqZWN0XzEgPSByZXF1aXJlKCcuL1N1YmplY3QnKTtcbnZhciBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xID0gcmVxdWlyZSgnLi91dGlsL09iamVjdFVuc3Vic2NyaWJlZEVycm9yJyk7XG4vKipcbiAqIEBjbGFzcyBCZWhhdmlvclN1YmplY3Q8VD5cbiAqL1xudmFyIEJlaGF2aW9yU3ViamVjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJlaGF2aW9yU3ViamVjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCZWhhdmlvclN1YmplY3QoX3ZhbHVlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJlaGF2aW9yU3ViamVjdC5wcm90b3R5cGUsIFwidmFsdWVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIEJlaGF2aW9yU3ViamVjdC5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBfc3VwZXIucHJvdG90eXBlLl9zdWJzY3JpYmUuY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH07XG4gICAgQmVoYXZpb3JTdWJqZWN0LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMudGhyb3duRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xLk9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJlaGF2aW9yU3ViamVjdC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB0aGlzLl92YWx1ZSA9IHZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBCZWhhdmlvclN1YmplY3Q7XG59KFN1YmplY3RfMS5TdWJqZWN0KSk7XG5leHBvcnRzLkJlaGF2aW9yU3ViamVjdCA9IEJlaGF2aW9yU3ViamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJlaGF2aW9yU3ViamVjdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9CZWhhdmlvclN1YmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  119. /***/ },
  120. /* 34 */
  121. /***/ function(module, exports, __webpack_require__) {
  122. eval("\"use strict\";\nvar FromObservable_1 = __webpack_require__(35);\nexports.from = FromObservable_1.FromObservable.create;\n//# sourceMappingURL=from.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9mcm9tLmpzP2JkMTAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgRnJvbU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRnJvbU9ic2VydmFibGUnKTtcbmV4cG9ydHMuZnJvbSA9IEZyb21PYnNlcnZhYmxlXzEuRnJvbU9ic2VydmFibGUuY3JlYXRlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJvbS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2Zyb20uanNcbi8vIG1vZHVsZSBpZCA9IDM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  123. /***/ },
  124. /* 35 */
  125. /***/ function(module, exports, __webpack_require__) {
  126. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isArray_1 = __webpack_require__(12);\nvar isPromise_1 = __webpack_require__(36);\nvar PromiseObservable_1 = __webpack_require__(28);\nvar IteratorObservable_1 = __webpack_require__(37);\nvar ArrayObservable_1 = __webpack_require__(39);\nvar ArrayLikeObservable_1 = __webpack_require__(43);\nvar iterator_1 = __webpack_require__(38);\nvar Observable_1 = __webpack_require__(6);\nvar observeOn_1 = __webpack_require__(44);\nvar observable_1 = __webpack_require__(19);\nvar isArrayLike = (function (x) { return x && typeof x.length === 'number'; });\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromObservable = (function (_super) {\n __extends(FromObservable, _super);\n function FromObservable(ish, scheduler) {\n _super.call(this, null);\n this.ish = ish;\n this.scheduler = scheduler;\n }\n /**\n * Creates an Observable from an Array, an array-like object, a Promise, an\n * iterable object, or an Observable-like object.\n *\n * <span class=\"informal\">Converts almost anything to an Observable.</span>\n *\n * <img src=\"./img/from.png\" width=\"100%\">\n *\n * Convert various other objects and data types into Observables. `from`\n * converts a Promise or an array-like or an\n * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)\n * object into an Observable that emits the items in that promise or array or\n * iterable. A String, in this context, is treated as an array of characters.\n * Observable-like objects (contains a function named with the ES2015 Symbol\n * for Observable) can also be converted through this operator.\n *\n * @example <caption>Converts an array to an Observable</caption>\n * var array = [10, 20, 30];\n * var result = Rx.Observable.from(array);\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // 10 20 30\n *\n * @example <caption>Convert an infinite iterable (from a generator) to an Observable</caption>\n * function* generateDoubles(seed) {\n * var i = seed;\n * while (true) {\n * yield i;\n * i = 2 * i; // double it\n * }\n * }\n *\n * var iterator = generateDoubles(3);\n * var result = Rx.Observable.from(iterator).take(10);\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // 3 6 12 24 48 96 192 384 768 1536\n *\n * @see {@link create}\n * @see {@link fromEvent}\n * @see {@link fromEventPattern}\n * @see {@link fromPromise}\n *\n * @param {ObservableInput<T>} ish A subscribable object, a Promise, an\n * Observable-like, an Array, an iterable or an array-like object to be\n * converted.\n * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n * emissions of values.\n * @return {Observable<T>} The Observable whose values are originally from the\n * input object that was converted.\n * @static true\n * @name from\n * @owner Observable\n */\n FromObservable.create = function (ish, scheduler) {\n if (ish != null) {\n if (typeof ish[observable_1.$$observable] === 'function') {\n if (ish instanceof Observable_1.Observable && !scheduler) {\n return ish;\n }\n return new FromObservable(ish, scheduler);\n }\n else if (isArray_1.isArray(ish)) {\n return new ArrayObservable_1.ArrayObservable(ish, scheduler);\n }\n else if (isPromise_1.isPromise(ish)) {\n return new PromiseObservable_1.PromiseObservable(ish, scheduler);\n }\n else if (typeof ish[iterator_1.$$iterator] === 'function' || typeof ish === 'string') {\n return new IteratorObservable_1.IteratorObservable(ish, scheduler);\n }\n else if (isArrayLike(ish)) {\n return new ArrayLikeObservable_1.ArrayLikeObservable(ish, scheduler);\n }\n }\n throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');\n };\n FromObservable.prototype._subscribe = function (subscriber) {\n var ish = this.ish;\n var scheduler = this.scheduler;\n if (scheduler == null) {\n return ish[observable_1.$$observable]().subscribe(subscriber);\n }\n else {\n return ish[observable_1.$$observable]().subscribe(new observeOn_1.ObserveOnSubscriber(subscriber, scheduler, 0));\n }\n };\n return FromObservable;\n}(Observable_1.Observable));\nexports.FromObservable = FromObservable;\n//# sourceMappingURL=FromObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9Gcm9tT2JzZXJ2YWJsZS5qcz81ZGUwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgaXNBcnJheV8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc0FycmF5Jyk7XG52YXIgaXNQcm9taXNlXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzUHJvbWlzZScpO1xudmFyIFByb21pc2VPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL1Byb21pc2VPYnNlcnZhYmxlJyk7XG52YXIgSXRlcmF0b3JPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0l0ZXJhdG9yT2JzZXJ2YWJsZScpO1xudmFyIEFycmF5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9BcnJheU9ic2VydmFibGUnKTtcbnZhciBBcnJheUxpa2VPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0FycmF5TGlrZU9ic2VydmFibGUnKTtcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZSgnLi4vc3ltYm9sL2l0ZXJhdG9yJyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIG9ic2VydmVPbl8xID0gcmVxdWlyZSgnLi4vb3BlcmF0b3Ivb2JzZXJ2ZU9uJyk7XG52YXIgb2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vc3ltYm9sL29ic2VydmFibGUnKTtcbnZhciBpc0FycmF5TGlrZSA9IChmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAmJiB0eXBlb2YgeC5sZW5ndGggPT09ICdudW1iZXInOyB9KTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgRnJvbU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGcm9tT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGcm9tT2JzZXJ2YWJsZShpc2gsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBudWxsKTtcbiAgICAgICAgdGhpcy5pc2ggPSBpc2g7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgZnJvbSBhbiBBcnJheSwgYW4gYXJyYXktbGlrZSBvYmplY3QsIGEgUHJvbWlzZSwgYW5cbiAgICAgKiBpdGVyYWJsZSBvYmplY3QsIG9yIGFuIE9ic2VydmFibGUtbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+Q29udmVydHMgYWxtb3N0IGFueXRoaW5nIHRvIGFuIE9ic2VydmFibGUuPC9zcGFuPlxuICAgICAqXG4gICAgICogPGltZyBzcmM9XCIuL2ltZy9mcm9tLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICAgICAqXG4gICAgICogQ29udmVydCB2YXJpb3VzIG90aGVyIG9iamVjdHMgYW5kIGRhdGEgdHlwZXMgaW50byBPYnNlcnZhYmxlcy4gYGZyb21gXG4gICAgICogY29udmVydHMgYSBQcm9taXNlIG9yIGFuIGFycmF5LWxpa2Ugb3IgYW5cbiAgICAgKiBbaXRlcmFibGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0l0ZXJhdGlvbl9wcm90b2NvbHMjaXRlcmFibGUpXG4gICAgICogb2JqZWN0IGludG8gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpdGVtcyBpbiB0aGF0IHByb21pc2Ugb3IgYXJyYXkgb3JcbiAgICAgKiBpdGVyYWJsZS4gQSBTdHJpbmcsIGluIHRoaXMgY29udGV4dCwgaXMgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLlxuICAgICAqIE9ic2VydmFibGUtbGlrZSBvYmplY3RzIChjb250YWlucyBhIGZ1bmN0aW9uIG5hbWVkIHdpdGggdGhlIEVTMjAxNSBTeW1ib2xcbiAgICAgKiBmb3IgT2JzZXJ2YWJsZSkgY2FuIGFsc28gYmUgY29udmVydGVkIHRocm91Z2ggdGhpcyBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkNvbnZlcnRzIGFuIGFycmF5IHRvIGFuIE9ic2VydmFibGU8L2NhcHRpb24+XG4gICAgICogdmFyIGFycmF5ID0gWzEwLCAyMCwgMzBdO1xuICAgICAqIHZhciByZXN1bHQgPSBSeC5PYnNlcnZhYmxlLmZyb20oYXJyYXkpO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6XG4gICAgICogLy8gMTAgMjAgMzBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkNvbnZlcnQgYW4gaW5maW5pdGUgaXRlcmFibGUgKGZyb20gYSBnZW5lcmF0b3IpIHRvIGFuIE9ic2VydmFibGU8L2NhcHRpb24+XG4gICAgICogZnVuY3Rpb24qIGdlbmVyYXRlRG91YmxlcyhzZWVkKSB7XG4gICAgICogICB2YXIgaSA9IHNlZWQ7XG4gICAgICogICB3aGlsZSAodHJ1ZSkge1xuICAgICAqICAgICB5aWVsZCBpO1xuICAgICAqICAgICBpID0gMiAqIGk7IC8vIGRvdWJsZSBpdFxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBpdGVyYXRvciA9IGdlbmVyYXRlRG91YmxlcygzKTtcbiAgICAgKiB2YXIgcmVzdWx0ID0gUnguT2JzZXJ2YWJsZS5mcm9tKGl0ZXJhdG9yKS50YWtlKDEwKTtcbiAgICAgKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICAgICAqIC8vIDMgNiAxMiAyNCA0OCA5NiAxOTIgMzg0IDc2OCAxNTM2XG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBjcmVhdGV9XG4gICAgICogQHNlZSB7QGxpbmsgZnJvbUV2ZW50fVxuICAgICAqIEBzZWUge0BsaW5rIGZyb21FdmVudFBhdHRlcm59XG4gICAgICogQHNlZSB7QGxpbmsgZnJvbVByb21pc2V9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09ic2VydmFibGVJbnB1dDxUPn0gaXNoIEEgc3Vic2NyaWJhYmxlIG9iamVjdCwgYSBQcm9taXNlLCBhblxuICAgICAqIE9ic2VydmFibGUtbGlrZSwgYW4gQXJyYXksIGFuIGl0ZXJhYmxlIG9yIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGJlXG4gICAgICogY29udmVydGVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBUaGUgc2NoZWR1bGVyIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZVxuICAgICAqIGVtaXNzaW9ucyBvZiB2YWx1ZXMuXG4gICAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gVGhlIE9ic2VydmFibGUgd2hvc2UgdmFsdWVzIGFyZSBvcmlnaW5hbGx5IGZyb20gdGhlXG4gICAgICogaW5wdXQgb2JqZWN0IHRoYXQgd2FzIGNvbnZlcnRlZC5cbiAgICAgKiBAc3RhdGljIHRydWVcbiAgICAgKiBAbmFtZSBmcm9tXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBGcm9tT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoaXNoLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKGlzaCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzaFtvYnNlcnZhYmxlXzEuJCRvYnNlcnZhYmxlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmIChpc2ggaW5zdGFuY2VvZiBPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSAmJiAhc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc2g7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnJvbU9ic2VydmFibGUoaXNoLCBzY2hlZHVsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheV8xLmlzQXJyYXkoaXNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlPYnNlcnZhYmxlXzEuQXJyYXlPYnNlcnZhYmxlKGlzaCwgc2NoZWR1bGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzUHJvbWlzZV8xLmlzUHJvbWlzZShpc2gpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlT2JzZXJ2YWJsZV8xLlByb21pc2VPYnNlcnZhYmxlKGlzaCwgc2NoZWR1bGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpc2hbaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaXNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3JPYnNlcnZhYmxlXzEuSXRlcmF0b3JPYnNlcnZhYmxlKGlzaCwgc2NoZWR1bGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGlzaCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlrZU9ic2VydmFibGVfMS5BcnJheUxpa2VPYnNlcnZhYmxlKGlzaCwgc2NoZWR1bGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKChpc2ggIT09IG51bGwgJiYgdHlwZW9mIGlzaCB8fCBpc2gpICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICAgIH07XG4gICAgRnJvbU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgaXNoID0gdGhpcy5pc2g7XG4gICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjtcbiAgICAgICAgaWYgKHNjaGVkdWxlciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNoW29ic2VydmFibGVfMS4kJG9ic2VydmFibGVdKCkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzaFtvYnNlcnZhYmxlXzEuJCRvYnNlcnZhYmxlXSgpLnN1YnNjcmliZShuZXcgb2JzZXJ2ZU9uXzEuT2JzZXJ2ZU9uU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIDApKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEZyb21PYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5Gcm9tT2JzZXJ2YWJsZSA9IEZyb21PYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJvbU9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9Gcm9tT2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  127. /***/ },
  128. /* 36 */
  129. /***/ function(module, exports) {
  130. eval("\"use strict\";\nfunction isPromise(value) {\n return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';\n}\nexports.isPromise = isPromise;\n//# sourceMappingURL=isPromise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9pc1Byb21pc2UuanM/NjhkNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc1Byb21pc2UgPSBpc1Byb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Byb21pc2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9pc1Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  131. /***/ },
  132. /* 37 */
  133. /***/ function(module, exports, __webpack_require__) {
  134. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = __webpack_require__(7);\nvar Observable_1 = __webpack_require__(6);\nvar iterator_1 = __webpack_require__(38);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar IteratorObservable = (function (_super) {\n __extends(IteratorObservable, _super);\n function IteratorObservable(iterator, scheduler) {\n _super.call(this);\n this.scheduler = scheduler;\n if (iterator == null) {\n throw new Error('iterator cannot be null.');\n }\n this.iterator = getIterator(iterator);\n }\n IteratorObservable.create = function (iterator, scheduler) {\n return new IteratorObservable(iterator, scheduler);\n };\n IteratorObservable.dispatch = function (state) {\n var index = state.index, hasError = state.hasError, iterator = state.iterator, subscriber = state.subscriber;\n if (hasError) {\n subscriber.error(state.error);\n return;\n }\n var result = iterator.next();\n if (result.done) {\n subscriber.complete();\n return;\n }\n subscriber.next(result.value);\n state.index = index + 1;\n if (subscriber.closed) {\n if (typeof iterator.return === 'function') {\n iterator.return();\n }\n return;\n }\n this.schedule(state);\n };\n IteratorObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var _a = this, iterator = _a.iterator, scheduler = _a.scheduler;\n if (scheduler) {\n return scheduler.schedule(IteratorObservable.dispatch, 0, {\n index: index, iterator: iterator, subscriber: subscriber\n });\n }\n else {\n do {\n var result = iterator.next();\n if (result.done) {\n subscriber.complete();\n break;\n }\n else {\n subscriber.next(result.value);\n }\n if (subscriber.closed) {\n if (typeof iterator.return === 'function') {\n iterator.return();\n }\n break;\n }\n } while (true);\n }\n };\n return IteratorObservable;\n}(Observable_1.Observable));\nexports.IteratorObservable = IteratorObservable;\nvar StringIterator = (function () {\n function StringIterator(str, idx, len) {\n if (idx === void 0) { idx = 0; }\n if (len === void 0) { len = str.length; }\n this.str = str;\n this.idx = idx;\n this.len = len;\n }\n StringIterator.prototype[iterator_1.$$iterator] = function () { return (this); };\n StringIterator.prototype.next = function () {\n return this.idx < this.len ? {\n done: false,\n value: this.str.charAt(this.idx++)\n } : {\n done: true,\n value: undefined\n };\n };\n return StringIterator;\n}());\nvar ArrayIterator = (function () {\n function ArrayIterator(arr, idx, len) {\n if (idx === void 0) { idx = 0; }\n if (len === void 0) { len = toLength(arr); }\n this.arr = arr;\n this.idx = idx;\n this.len = len;\n }\n ArrayIterator.prototype[iterator_1.$$iterator] = function () { return this; };\n ArrayIterator.prototype.next = function () {\n return this.idx < this.len ? {\n done: false,\n value: this.arr[this.idx++]\n } : {\n done: true,\n value: undefined\n };\n };\n return ArrayIterator;\n}());\nfunction getIterator(obj) {\n var i = obj[iterator_1.$$iterator];\n if (!i && typeof obj === 'string') {\n return new StringIterator(obj);\n }\n if (!i && obj.length !== undefined) {\n return new ArrayIterator(obj);\n }\n if (!i) {\n throw new TypeError('object is not iterable');\n }\n return obj[iterator_1.$$iterator]();\n}\nvar maxSafeInteger = Math.pow(2, 53) - 1;\nfunction toLength(o) {\n var len = +o.length;\n if (isNaN(len)) {\n return 0;\n }\n if (len === 0 || !numberIsFinite(len)) {\n return len;\n }\n len = sign(len) * Math.floor(Math.abs(len));\n if (len <= 0) {\n return 0;\n }\n if (len > maxSafeInteger) {\n return maxSafeInteger;\n }\n return len;\n}\nfunction numberIsFinite(value) {\n return typeof value === 'number' && root_1.root.isFinite(value);\n}\nfunction sign(value) {\n var valueAsNumber = +value;\n if (valueAsNumber === 0) {\n return valueAsNumber;\n }\n if (isNaN(valueAsNumber)) {\n return valueAsNumber;\n }\n return valueAsNumber < 0 ? -1 : 1;\n}\n//# sourceMappingURL=IteratorObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9JdGVyYXRvck9ic2VydmFibGUuanM/MDg3NyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIHJvb3RfMSA9IHJlcXVpcmUoJy4uL3V0aWwvcm9vdCcpO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZSgnLi4vc3ltYm9sL2l0ZXJhdG9yJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIEl0ZXJhdG9yT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEl0ZXJhdG9yT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJdGVyYXRvck9ic2VydmFibGUoaXRlcmF0b3IsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2l0ZXJhdG9yIGNhbm5vdCBiZSBudWxsLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihpdGVyYXRvcik7XG4gICAgfVxuICAgIEl0ZXJhdG9yT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIHNjaGVkdWxlcikge1xuICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yT2JzZXJ2YWJsZShpdGVyYXRvciwgc2NoZWR1bGVyKTtcbiAgICB9O1xuICAgIEl0ZXJhdG9yT2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCwgaGFzRXJyb3IgPSBzdGF0ZS5oYXNFcnJvciwgaXRlcmF0b3IgPSBzdGF0ZS5pdGVyYXRvciwgc3Vic2NyaWJlciA9IHN0YXRlLnN1YnNjcmliZXI7XG4gICAgICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihzdGF0ZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHN0YXRlLmluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZShzdGF0ZSk7XG4gICAgfTtcbiAgICBJdGVyYXRvck9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBpdGVyYXRvciA9IF9hLml0ZXJhdG9yLCBzY2hlZHVsZXIgPSBfYS5zY2hlZHVsZXI7XG4gICAgICAgIGlmIChzY2hlZHVsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoSXRlcmF0b3JPYnNlcnZhYmxlLmRpc3BhdGNoLCAwLCB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LCBpdGVyYXRvcjogaXRlcmF0b3IsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3IucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEl0ZXJhdG9yT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuSXRlcmF0b3JPYnNlcnZhYmxlID0gSXRlcmF0b3JPYnNlcnZhYmxlO1xudmFyIFN0cmluZ0l0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJpbmdJdGVyYXRvcihzdHIsIGlkeCwgbGVuKSB7XG4gICAgICAgIGlmIChpZHggPT09IHZvaWQgMCkgeyBpZHggPSAwOyB9XG4gICAgICAgIGlmIChsZW4gPT09IHZvaWQgMCkgeyBsZW4gPSBzdHIubGVuZ3RoOyB9XG4gICAgICAgIHRoaXMuc3RyID0gc3RyO1xuICAgICAgICB0aGlzLmlkeCA9IGlkeDtcbiAgICAgICAgdGhpcy5sZW4gPSBsZW47XG4gICAgfVxuICAgIFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvcl8xLiQkaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMpOyB9O1xuICAgIFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZHggPCB0aGlzLmxlbiA/IHtcbiAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuc3RyLmNoYXJBdCh0aGlzLmlkeCsrKVxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBTdHJpbmdJdGVyYXRvcjtcbn0oKSk7XG52YXIgQXJyYXlJdGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXJyYXlJdGVyYXRvcihhcnIsIGlkeCwgbGVuKSB7XG4gICAgICAgIGlmIChpZHggPT09IHZvaWQgMCkgeyBpZHggPSAwOyB9XG4gICAgICAgIGlmIChsZW4gPT09IHZvaWQgMCkgeyBsZW4gPSB0b0xlbmd0aChhcnIpOyB9XG4gICAgICAgIHRoaXMuYXJyID0gYXJyO1xuICAgICAgICB0aGlzLmlkeCA9IGlkeDtcbiAgICAgICAgdGhpcy5sZW4gPSBsZW47XG4gICAgfVxuICAgIEFycmF5SXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yXzEuJCRpdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgIEFycmF5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkeCA8IHRoaXMubGVuID8ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5hcnJbdGhpcy5pZHgrK11cbiAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXlJdGVyYXRvcjtcbn0oKSk7XG5mdW5jdGlvbiBnZXRJdGVyYXRvcihvYmopIHtcbiAgICB2YXIgaSA9IG9ialtpdGVyYXRvcl8xLiQkaXRlcmF0b3JdO1xuICAgIGlmICghaSAmJiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKG9iaik7XG4gICAgfVxuICAgIGlmICghaSAmJiBvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKG9iaik7XG4gICAgfVxuICAgIGlmICghaSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvYmplY3QgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBvYmpbaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXSgpO1xufVxudmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbmZ1bmN0aW9uIHRvTGVuZ3RoKG8pIHtcbiAgICB2YXIgbGVuID0gK28ubGVuZ3RoO1xuICAgIGlmIChpc05hTihsZW4pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAobGVuID09PSAwIHx8ICFudW1iZXJJc0Zpbml0ZShsZW4pKSB7XG4gICAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIGxlbiA9IHNpZ24obGVuKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobGVuKSk7XG4gICAgaWYgKGxlbiA8PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAobGVuID4gbWF4U2FmZUludGVnZXIpIHtcbiAgICAgICAgcmV0dXJuIG1heFNhZmVJbnRlZ2VyO1xuICAgIH1cbiAgICByZXR1cm4gbGVuO1xufVxuZnVuY3Rpb24gbnVtYmVySXNGaW5pdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiByb290XzEucm9vdC5pc0Zpbml0ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBzaWduKHZhbHVlKSB7XG4gICAgdmFyIHZhbHVlQXNOdW1iZXIgPSArdmFsdWU7XG4gICAgaWYgKHZhbHVlQXNOdW1iZXIgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlQXNOdW1iZXI7XG4gICAgfVxuICAgIGlmIChpc05hTih2YWx1ZUFzTnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gdmFsdWVBc051bWJlcjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlQXNOdW1iZXIgPCAwID8gLTEgOiAxO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXRlcmF0b3JPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvSXRlcmF0b3JPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  135. /***/ },
  136. /* 38 */
  137. /***/ function(module, exports, __webpack_require__) {
  138. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nfunction symbolIteratorPonyfill(root) {\n var Symbol = root.Symbol;\n if (typeof Symbol === 'function') {\n if (!Symbol.iterator) {\n Symbol.iterator = Symbol('iterator polyfill');\n }\n return Symbol.iterator;\n }\n else {\n // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC)\n var Set_1 = root.Set;\n if (Set_1 && typeof new Set_1()['@@iterator'] === 'function') {\n return '@@iterator';\n }\n var Map_1 = root.Map;\n // required for compatability with es6-shim\n if (Map_1) {\n var keys = Object.getOwnPropertyNames(Map_1.prototype);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal.\n if (key !== 'entries' && key !== 'size' && Map_1.prototype[key] === Map_1.prototype['entries']) {\n return key;\n }\n }\n }\n return '@@iterator';\n }\n}\nexports.symbolIteratorPonyfill = symbolIteratorPonyfill;\nexports.$$iterator = symbolIteratorPonyfill(root_1.root);\n//# sourceMappingURL=iterator.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvc3ltYm9sL2l0ZXJhdG9yLmpzPzZiNDQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9yb290Jyk7XG5mdW5jdGlvbiBzeW1ib2xJdGVyYXRvclBvbnlmaWxsKHJvb3QpIHtcbiAgICB2YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIFN5bWJvbC5pdGVyYXRvciA9IFN5bWJvbCgnaXRlcmF0b3IgcG9seWZpbGwnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gW2ZvciBNb3ppbGxhIEdlY2tvIDI3LTM1Ol0oaHR0cHM6Ly9temwubGEvMmV3RTF6QylcbiAgICAgICAgdmFyIFNldF8xID0gcm9vdC5TZXQ7XG4gICAgICAgIGlmIChTZXRfMSAmJiB0eXBlb2YgbmV3IFNldF8xKClbJ0BAaXRlcmF0b3InXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuICdAQGl0ZXJhdG9yJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgTWFwXzEgPSByb290Lk1hcDtcbiAgICAgICAgLy8gcmVxdWlyZWQgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBlczYtc2hpbVxuICAgICAgICBpZiAoTWFwXzEpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwXzEucHJvdG90eXBlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBzcGVjLCBNYXAucHJvdG90eXBlW0BAaXRlcmF0b3JdIGFuZCBNYXAub3JvdG90eXBlLmVudHJpZXMgbXVzdCBiZSBlcXVhbC5cbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSAnZW50cmllcycgJiYga2V5ICE9PSAnc2l6ZScgJiYgTWFwXzEucHJvdG90eXBlW2tleV0gPT09IE1hcF8xLnByb3RvdHlwZVsnZW50cmllcyddKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnQEBpdGVyYXRvcic7XG4gICAgfVxufVxuZXhwb3J0cy5zeW1ib2xJdGVyYXRvclBvbnlmaWxsID0gc3ltYm9sSXRlcmF0b3JQb255ZmlsbDtcbmV4cG9ydHMuJCRpdGVyYXRvciA9IHN5bWJvbEl0ZXJhdG9yUG9ueWZpbGwocm9vdF8xLnJvb3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXRlcmF0b3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvc3ltYm9sL2l0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  139. /***/ },
  140. /* 39 */
  141. /***/ function(module, exports, __webpack_require__) {
  142. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar ScalarObservable_1 = __webpack_require__(40);\nvar EmptyObservable_1 = __webpack_require__(41);\nvar isScheduler_1 = __webpack_require__(42);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayObservable = (function (_super) {\n __extends(ArrayObservable, _super);\n function ArrayObservable(array, scheduler) {\n _super.call(this);\n this.array = array;\n this.scheduler = scheduler;\n if (!scheduler && array.length === 1) {\n this._isScalar = true;\n this.value = array[0];\n }\n }\n ArrayObservable.create = function (array, scheduler) {\n return new ArrayObservable(array, scheduler);\n };\n /**\n * Creates an Observable that emits some values you specify as arguments,\n * immediately one after the other, and then emits a complete notification.\n *\n * <span class=\"informal\">Emits the arguments you provide, then completes.\n * </span>\n *\n * <img src=\"./img/of.png\" width=\"100%\">\n *\n * This static operator is useful for creating a simple Observable that only\n * emits the arguments given, and the complete notification thereafter. It can\n * be used for composing with other Observables, such as with {@link concat}.\n * By default, it uses a `null` Scheduler, which means the `next`\n * notifications are sent synchronously, although with a different Scheduler\n * it is possible to determine when those notifications will be delivered.\n *\n * @example <caption>Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.</caption>\n * var numbers = Rx.Observable.of(10, 20, 30);\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var interval = Rx.Observable.interval(1000);\n * var result = numbers.concat(letters).concat(interval);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link create}\n * @see {@link empty}\n * @see {@link never}\n * @see {@link throw}\n *\n * @param {...T} values Arguments that represent `next` values to be emitted.\n * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n * the emissions of the `next` notifications.\n * @return {Observable<T>} An Observable that emits each given input value.\n * @static true\n * @name of\n * @owner Observable\n */\n ArrayObservable.of = function () {\n var array = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n array[_i - 0] = arguments[_i];\n }\n var scheduler = array[array.length - 1];\n if (isScheduler_1.isScheduler(scheduler)) {\n array.pop();\n }\n else {\n scheduler = null;\n }\n var len = array.length;\n if (len > 1) {\n return new ArrayObservable(array, scheduler);\n }\n else if (len === 1) {\n return new ScalarObservable_1.ScalarObservable(array[0], scheduler);\n }\n else {\n return new EmptyObservable_1.EmptyObservable(scheduler);\n }\n };\n ArrayObservable.dispatch = function (state) {\n var array = state.array, index = state.index, count = state.count, subscriber = state.subscriber;\n if (index >= count) {\n subscriber.complete();\n return;\n }\n subscriber.next(array[index]);\n if (subscriber.closed) {\n return;\n }\n state.index = index + 1;\n this.schedule(state);\n };\n ArrayObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var array = this.array;\n var count = array.length;\n var scheduler = this.scheduler;\n if (scheduler) {\n return scheduler.schedule(ArrayObservable.dispatch, 0, {\n array: array, index: index, count: count, subscriber: subscriber\n });\n }\n else {\n for (var i = 0; i < count && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n }\n };\n return ArrayObservable;\n}(Observable_1.Observable));\nexports.ArrayObservable = ArrayObservable;\n//# sourceMappingURL=ArrayObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9BcnJheU9ic2VydmFibGUuanM/N2E2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBTY2FsYXJPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL1NjYWxhck9ic2VydmFibGUnKTtcbnZhciBFbXB0eU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRW1wdHlPYnNlcnZhYmxlJyk7XG52YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNTY2hlZHVsZXInKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgQXJyYXlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXJyYXlPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFycmF5T2JzZXJ2YWJsZShhcnJheSwgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICBpZiAoIXNjaGVkdWxlciAmJiBhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2NhbGFyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBhcnJheVswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBBcnJheU9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGFycmF5LCBzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheU9ic2VydmFibGUoYXJyYXksIHNjaGVkdWxlcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBzb21lIHZhbHVlcyB5b3Ugc3BlY2lmeSBhcyBhcmd1bWVudHMsXG4gICAgICogaW1tZWRpYXRlbHkgb25lIGFmdGVyIHRoZSBvdGhlciwgYW5kIHRoZW4gZW1pdHMgYSBjb21wbGV0ZSBub3RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+RW1pdHMgdGhlIGFyZ3VtZW50cyB5b3UgcHJvdmlkZSwgdGhlbiBjb21wbGV0ZXMuXG4gICAgICogPC9zcGFuPlxuICAgICAqXG4gICAgICogPGltZyBzcmM9XCIuL2ltZy9vZi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgKlxuICAgICAqIFRoaXMgc3RhdGljIG9wZXJhdG9yIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYSBzaW1wbGUgT2JzZXJ2YWJsZSB0aGF0IG9ubHlcbiAgICAgKiBlbWl0cyB0aGUgYXJndW1lbnRzIGdpdmVuLCBhbmQgdGhlIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiB0aGVyZWFmdGVyLiBJdCBjYW5cbiAgICAgKiBiZSB1c2VkIGZvciBjb21wb3Npbmcgd2l0aCBvdGhlciBPYnNlcnZhYmxlcywgc3VjaCBhcyB3aXRoIHtAbGluayBjb25jYXR9LlxuICAgICAqIEJ5IGRlZmF1bHQsIGl0IHVzZXMgYSBgbnVsbGAgU2NoZWR1bGVyLCB3aGljaCBtZWFucyB0aGUgYG5leHRgXG4gICAgICogbm90aWZpY2F0aW9ucyBhcmUgc2VudCBzeW5jaHJvbm91c2x5LCBhbHRob3VnaCB3aXRoIGEgZGlmZmVyZW50IFNjaGVkdWxlclxuICAgICAqIGl0IGlzIHBvc3NpYmxlIHRvIGRldGVybWluZSB3aGVuIHRob3NlIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBkZWxpdmVyZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5FbWl0IDEwLCAyMCwgMzAsIHRoZW4gJ2EnLCAnYicsICdjJywgdGhlbiBzdGFydCB0aWNraW5nIGV2ZXJ5IHNlY29uZC48L2NhcHRpb24+XG4gICAgICogdmFyIG51bWJlcnMgPSBSeC5PYnNlcnZhYmxlLm9mKDEwLCAyMCwgMzApO1xuICAgICAqIHZhciBsZXR0ZXJzID0gUnguT2JzZXJ2YWJsZS5vZignYScsICdiJywgJ2MnKTtcbiAgICAgKiB2YXIgaW50ZXJ2YWwgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICAgICAqIHZhciByZXN1bHQgPSBudW1iZXJzLmNvbmNhdChsZXR0ZXJzKS5jb25jYXQoaW50ZXJ2YWwpO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBjcmVhdGV9XG4gICAgICogQHNlZSB7QGxpbmsgZW1wdHl9XG4gICAgICogQHNlZSB7QGxpbmsgbmV2ZXJ9XG4gICAgICogQHNlZSB7QGxpbmsgdGhyb3d9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gey4uLlR9IHZhbHVlcyBBcmd1bWVudHMgdGhhdCByZXByZXNlbnQgYG5leHRgIHZhbHVlcyB0byBiZSBlbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBBIHtAbGluayBTY2hlZHVsZXJ9IHRvIHVzZSBmb3Igc2NoZWR1bGluZ1xuICAgICAqIHRoZSBlbWlzc2lvbnMgb2YgdGhlIGBuZXh0YCBub3RpZmljYXRpb25zLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBlYWNoIGdpdmVuIGlucHV0IHZhbHVlLlxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIG9mXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBBcnJheU9ic2VydmFibGUub2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJyYXlbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoaXNTY2hlZHVsZXJfMS5pc1NjaGVkdWxlcihzY2hlZHVsZXIpKSB7XG4gICAgICAgICAgICBhcnJheS5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjaGVkdWxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlPYnNlcnZhYmxlKGFycmF5LCBzY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2FsYXJPYnNlcnZhYmxlXzEuU2NhbGFyT2JzZXJ2YWJsZShhcnJheVswXSwgc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlPYnNlcnZhYmxlXzEuRW1wdHlPYnNlcnZhYmxlKHNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFycmF5T2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBzdGF0ZS5hcnJheSwgaW5kZXggPSBzdGF0ZS5pbmRleCwgY291bnQgPSBzdGF0ZS5jb3VudCwgc3Vic2NyaWJlciA9IHN0YXRlLnN1YnNjcmliZXI7XG4gICAgICAgIGlmIChpbmRleCA+PSBjb3VudCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChhcnJheVtpbmRleF0pO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5pbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZShzdGF0ZSk7XG4gICAgfTtcbiAgICBBcnJheU9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5O1xuICAgICAgICB2YXIgY291bnQgPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjtcbiAgICAgICAgaWYgKHNjaGVkdWxlcikge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShBcnJheU9ic2VydmFibGUuZGlzcGF0Y2gsIDAsIHtcbiAgICAgICAgICAgICAgICBhcnJheTogYXJyYXksIGluZGV4OiBpbmRleCwgY291bnQ6IGNvdW50LCBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXlPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5BcnJheU9ic2VydmFibGUgPSBBcnJheU9ic2VydmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcnJheU9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9BcnJheU9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  143. /***/ },
  144. /* 40 */
  145. /***/ function(module, exports, __webpack_require__) {
  146. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ScalarObservable = (function (_super) {\n __extends(ScalarObservable, _super);\n function ScalarObservable(value, scheduler) {\n _super.call(this);\n this.value = value;\n this.scheduler = scheduler;\n this._isScalar = true;\n if (scheduler) {\n this._isScalar = false;\n }\n }\n ScalarObservable.create = function (value, scheduler) {\n return new ScalarObservable(value, scheduler);\n };\n ScalarObservable.dispatch = function (state) {\n var done = state.done, value = state.value, subscriber = state.subscriber;\n if (done) {\n subscriber.complete();\n return;\n }\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n state.done = true;\n this.schedule(state);\n };\n ScalarObservable.prototype._subscribe = function (subscriber) {\n var value = this.value;\n var scheduler = this.scheduler;\n if (scheduler) {\n return scheduler.schedule(ScalarObservable.dispatch, 0, {\n done: false, value: value, subscriber: subscriber\n });\n }\n else {\n subscriber.next(value);\n if (!subscriber.closed) {\n subscriber.complete();\n }\n }\n };\n return ScalarObservable;\n}(Observable_1.Observable));\nexports.ScalarObservable = ScalarObservable;\n//# sourceMappingURL=ScalarObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9TY2FsYXJPYnNlcnZhYmxlLmpzP2QwOTciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIFNjYWxhck9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTY2FsYXJPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNjYWxhck9ic2VydmFibGUodmFsdWUsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5faXNTY2FsYXIgPSB0cnVlO1xuICAgICAgICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9pc1NjYWxhciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFNjYWxhck9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKHZhbHVlLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2FsYXJPYnNlcnZhYmxlKHZhbHVlLCBzY2hlZHVsZXIpO1xuICAgIH07XG4gICAgU2NhbGFyT2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgZG9uZSA9IHN0YXRlLmRvbmUsIHZhbHVlID0gc3RhdGUudmFsdWUsIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyO1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlKHN0YXRlKTtcbiAgICB9O1xuICAgIFNjYWxhck9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIGlmIChzY2hlZHVsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoU2NhbGFyT2JzZXJ2YWJsZS5kaXNwYXRjaCwgMCwge1xuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTY2FsYXJPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5TY2FsYXJPYnNlcnZhYmxlID0gU2NhbGFyT2JzZXJ2YWJsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNjYWxhck9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9TY2FsYXJPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  147. /***/ },
  148. /* 41 */
  149. /***/ function(module, exports, __webpack_require__) {
  150. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar EmptyObservable = (function (_super) {\n __extends(EmptyObservable, _super);\n function EmptyObservable(scheduler) {\n _super.call(this);\n this.scheduler = scheduler;\n }\n /**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * <span class=\"informal\">Just emits 'complete', and nothing else.\n * </span>\n *\n * <img src=\"./img/empty.png\" width=\"100%\">\n *\n * This static operator is useful for creating a simple Observable that only\n * emits the complete notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * @example <caption>Emit the number 7, then complete.</caption>\n * var result = Rx.Observable.empty().startWith(7);\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Map and flatten only odd numbers to the sequence 'a', 'b', 'c'</caption>\n * var interval = Rx.Observable.interval(1000);\n * var result = interval.mergeMap(x =>\n * x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval eg(0,1,2,3,...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1 print abc\n * // if x % 2 is not equal to 1 nothing will be output\n *\n * @see {@link create}\n * @see {@link never}\n * @see {@link of}\n * @see {@link throw}\n *\n * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n * the emission of the complete notification.\n * @return {Observable} An \"empty\" Observable: emits only the complete\n * notification.\n * @static true\n * @name empty\n * @owner Observable\n */\n EmptyObservable.create = function (scheduler) {\n return new EmptyObservable(scheduler);\n };\n EmptyObservable.dispatch = function (arg) {\n var subscriber = arg.subscriber;\n subscriber.complete();\n };\n EmptyObservable.prototype._subscribe = function (subscriber) {\n var scheduler = this.scheduler;\n if (scheduler) {\n return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber: subscriber });\n }\n else {\n subscriber.complete();\n }\n };\n return EmptyObservable;\n}(Observable_1.Observable));\nexports.EmptyObservable = EmptyObservable;\n//# sourceMappingURL=EmptyObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9FbXB0eU9ic2VydmFibGUuanM/ZGQzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgRW1wdHlPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRW1wdHlPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVtcHR5T2JzZXJ2YWJsZShzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBubyBpdGVtcyB0byB0aGUgT2JzZXJ2ZXIgYW5kIGltbWVkaWF0ZWx5XG4gICAgICogZW1pdHMgYSBjb21wbGV0ZSBub3RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SnVzdCBlbWl0cyAnY29tcGxldGUnLCBhbmQgbm90aGluZyBlbHNlLlxuICAgICAqIDwvc3Bhbj5cbiAgICAgKlxuICAgICAqIDxpbWcgc3JjPVwiLi9pbWcvZW1wdHkucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICpcbiAgICAgKiBUaGlzIHN0YXRpYyBvcGVyYXRvciBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGEgc2ltcGxlIE9ic2VydmFibGUgdGhhdCBvbmx5XG4gICAgICogZW1pdHMgdGhlIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4gSXQgY2FuIGJlIHVzZWQgZm9yIGNvbXBvc2luZyB3aXRoIG90aGVyXG4gICAgICogT2JzZXJ2YWJsZXMsIHN1Y2ggYXMgaW4gYSB7QGxpbmsgbWVyZ2VNYXB9LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCB0aGUgbnVtYmVyIDcsIHRoZW4gY29tcGxldGUuPC9jYXB0aW9uPlxuICAgICAqIHZhciByZXN1bHQgPSBSeC5PYnNlcnZhYmxlLmVtcHR5KCkuc3RhcnRXaXRoKDcpO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5NYXAgYW5kIGZsYXR0ZW4gb25seSBvZGQgbnVtYmVycyB0byB0aGUgc2VxdWVuY2UgJ2EnLCAnYicsICdjJzwvY2FwdGlvbj5cbiAgICAgKiB2YXIgaW50ZXJ2YWwgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICAgICAqIHZhciByZXN1bHQgPSBpbnRlcnZhbC5tZXJnZU1hcCh4ID0+XG4gICAgICogICB4ICUgMiA9PT0gMSA/IFJ4Lk9ic2VydmFibGUub2YoJ2EnLCAnYicsICdjJykgOiBSeC5PYnNlcnZhYmxlLmVtcHR5KClcbiAgICAgKiApO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGNvbnNvbGU6XG4gICAgICogLy8geCBpcyBlcXVhbCB0byB0aGUgY291bnQgb24gdGhlIGludGVydmFsIGVnKDAsMSwyLDMsLi4uKVxuICAgICAqIC8vIHggd2lsbCBvY2N1ciBldmVyeSAxMDAwbXNcbiAgICAgKiAvLyBpZiB4ICUgMiBpcyBlcXVhbCB0byAxIHByaW50IGFiY1xuICAgICAqIC8vIGlmIHggJSAyIGlzIG5vdCBlcXVhbCB0byAxIG5vdGhpbmcgd2lsbCBiZSBvdXRwdXRcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGNyZWF0ZX1cbiAgICAgKiBAc2VlIHtAbGluayBuZXZlcn1cbiAgICAgKiBAc2VlIHtAbGluayBvZn1cbiAgICAgKiBAc2VlIHtAbGluayB0aHJvd31cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBBIHtAbGluayBTY2hlZHVsZXJ9IHRvIHVzZSBmb3Igc2NoZWR1bGluZ1xuICAgICAqIHRoZSBlbWlzc2lvbiBvZiB0aGUgY29tcGxldGUgbm90aWZpY2F0aW9uLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIFwiZW1wdHlcIiBPYnNlcnZhYmxlOiBlbWl0cyBvbmx5IHRoZSBjb21wbGV0ZVxuICAgICAqIG5vdGlmaWNhdGlvbi5cbiAgICAgKiBAc3RhdGljIHRydWVcbiAgICAgKiBAbmFtZSBlbXB0eVxuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgRW1wdHlPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbXB0eU9ic2VydmFibGUoc2NoZWR1bGVyKTtcbiAgICB9O1xuICAgIEVtcHR5T2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXIgPSBhcmcuc3Vic2NyaWJlcjtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgRW1wdHlPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKEVtcHR5T2JzZXJ2YWJsZS5kaXNwYXRjaCwgMCwgeyBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRW1wdHlPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5FbXB0eU9ic2VydmFibGUgPSBFbXB0eU9ic2VydmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbXB0eU9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9FbXB0eU9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  151. /***/ },
  152. /* 42 */
  153. /***/ function(module, exports) {
  154. eval("\"use strict\";\nfunction isScheduler(value) {\n return value && typeof value.schedule === 'function';\n}\nexports.isScheduler = isScheduler;\n//# sourceMappingURL=isScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9pc1NjaGVkdWxlci5qcz9hMmQ1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnNjaGVkdWxlID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc1NjaGVkdWxlciA9IGlzU2NoZWR1bGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNTY2hlZHVsZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9pc1NjaGVkdWxlci5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  155. /***/ },
  156. /* 43 */
  157. /***/ function(module, exports, __webpack_require__) {
  158. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar ScalarObservable_1 = __webpack_require__(40);\nvar EmptyObservable_1 = __webpack_require__(41);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ArrayLikeObservable = (function (_super) {\n __extends(ArrayLikeObservable, _super);\n function ArrayLikeObservable(arrayLike, scheduler) {\n _super.call(this);\n this.arrayLike = arrayLike;\n this.scheduler = scheduler;\n if (!scheduler && arrayLike.length === 1) {\n this._isScalar = true;\n this.value = arrayLike[0];\n }\n }\n ArrayLikeObservable.create = function (arrayLike, scheduler) {\n var length = arrayLike.length;\n if (length === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n else if (length === 1) {\n return new ScalarObservable_1.ScalarObservable(arrayLike[0], scheduler);\n }\n else {\n return new ArrayLikeObservable(arrayLike, scheduler);\n }\n };\n ArrayLikeObservable.dispatch = function (state) {\n var arrayLike = state.arrayLike, index = state.index, length = state.length, subscriber = state.subscriber;\n if (subscriber.closed) {\n return;\n }\n if (index >= length) {\n subscriber.complete();\n return;\n }\n subscriber.next(arrayLike[index]);\n state.index = index + 1;\n this.schedule(state);\n };\n ArrayLikeObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var _a = this, arrayLike = _a.arrayLike, scheduler = _a.scheduler;\n var length = arrayLike.length;\n if (scheduler) {\n return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {\n arrayLike: arrayLike, index: index, length: length, subscriber: subscriber\n });\n }\n else {\n for (var i = 0; i < length && !subscriber.closed; i++) {\n subscriber.next(arrayLike[i]);\n }\n subscriber.complete();\n }\n };\n return ArrayLikeObservable;\n}(Observable_1.Observable));\nexports.ArrayLikeObservable = ArrayLikeObservable;\n//# sourceMappingURL=ArrayLikeObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9BcnJheUxpa2VPYnNlcnZhYmxlLmpzPzU5ZDQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgU2NhbGFyT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9TY2FsYXJPYnNlcnZhYmxlJyk7XG52YXIgRW1wdHlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0VtcHR5T2JzZXJ2YWJsZScpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBBcnJheUxpa2VPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXJyYXlMaWtlT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBcnJheUxpa2VPYnNlcnZhYmxlKGFycmF5TGlrZSwgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5TGlrZSA9IGFycmF5TGlrZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIGlmICghc2NoZWR1bGVyICYmIGFycmF5TGlrZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzU2NhbGFyID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBhcnJheUxpa2VbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgQXJyYXlMaWtlT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoYXJyYXlMaWtlLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlPYnNlcnZhYmxlXzEuRW1wdHlPYnNlcnZhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNjYWxhck9ic2VydmFibGVfMS5TY2FsYXJPYnNlcnZhYmxlKGFycmF5TGlrZVswXSwgc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaWtlT2JzZXJ2YWJsZShhcnJheUxpa2UsIHNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFycmF5TGlrZU9ic2VydmFibGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIGFycmF5TGlrZSA9IHN0YXRlLmFycmF5TGlrZSwgaW5kZXggPSBzdGF0ZS5pbmRleCwgbGVuZ3RoID0gc3RhdGUubGVuZ3RoLCBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4ID49IGxlbmd0aCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChhcnJheUxpa2VbaW5kZXhdKTtcbiAgICAgICAgc3RhdGUuaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHRoaXMuc2NoZWR1bGUoc3RhdGUpO1xuICAgIH07XG4gICAgQXJyYXlMaWtlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGFycmF5TGlrZSA9IF9hLmFycmF5TGlrZSwgc2NoZWR1bGVyID0gX2Euc2NoZWR1bGVyO1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXlMaWtlLmxlbmd0aDtcbiAgICAgICAgaWYgKHNjaGVkdWxlcikge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShBcnJheUxpa2VPYnNlcnZhYmxlLmRpc3BhdGNoLCAwLCB7XG4gICAgICAgICAgICAgICAgYXJyYXlMaWtlOiBhcnJheUxpa2UsIGluZGV4OiBpbmRleCwgbGVuZ3RoOiBsZW5ndGgsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGggJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlMaWtlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFycmF5TGlrZU9ic2VydmFibGU7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLkFycmF5TGlrZU9ic2VydmFibGUgPSBBcnJheUxpa2VPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJyYXlMaWtlT2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL0FycmF5TGlrZU9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  159. /***/ },
  160. /* 44 */
  161. /***/ function(module, exports, __webpack_require__) {
  162. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Notification_1 = __webpack_require__(45);\n/**\n * @see {@link Notification}\n *\n * @param scheduler\n * @param delay\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method observeOn\n * @owner Observable\n */\nfunction observeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return this.lift(new ObserveOnOperator(scheduler, delay));\n}\nexports.observeOn = observeOn;\nvar ObserveOnOperator = (function () {\n function ObserveOnOperator(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n this.scheduler = scheduler;\n this.delay = delay;\n }\n ObserveOnOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n };\n return ObserveOnOperator;\n}());\nexports.ObserveOnOperator = ObserveOnOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ObserveOnSubscriber = (function (_super) {\n __extends(ObserveOnSubscriber, _super);\n function ObserveOnSubscriber(destination, scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n _super.call(this, destination);\n this.scheduler = scheduler;\n this.delay = delay;\n }\n ObserveOnSubscriber.dispatch = function (arg) {\n var notification = arg.notification, destination = arg.destination;\n notification.observe(destination);\n };\n ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n this.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n };\n ObserveOnSubscriber.prototype._next = function (value) {\n this.scheduleMessage(Notification_1.Notification.createNext(value));\n };\n ObserveOnSubscriber.prototype._error = function (err) {\n this.scheduleMessage(Notification_1.Notification.createError(err));\n };\n ObserveOnSubscriber.prototype._complete = function () {\n this.scheduleMessage(Notification_1.Notification.createComplete());\n };\n return ObserveOnSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ObserveOnSubscriber = ObserveOnSubscriber;\nvar ObserveOnMessage = (function () {\n function ObserveOnMessage(notification, destination) {\n this.notification = notification;\n this.destination = destination;\n }\n return ObserveOnMessage;\n}());\nexports.ObserveOnMessage = ObserveOnMessage;\n//# sourceMappingURL=observeOn.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3Ivb2JzZXJ2ZU9uLmpzPzY2YjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgTm90aWZpY2F0aW9uXzEgPSByZXF1aXJlKCcuLi9Ob3RpZmljYXRpb24nKTtcbi8qKlxuICogQHNlZSB7QGxpbmsgTm90aWZpY2F0aW9ufVxuICpcbiAqIEBwYXJhbSBzY2hlZHVsZXJcbiAqIEBwYXJhbSBkZWxheVxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPnxXZWJTb2NrZXRTdWJqZWN0PFQ+fE9ic2VydmFibGU8VD59XG4gKiBAbWV0aG9kIG9ic2VydmVPblxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkpIHtcbiAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBPYnNlcnZlT25PcGVyYXRvcihzY2hlZHVsZXIsIGRlbGF5KSk7XG59XG5leHBvcnRzLm9ic2VydmVPbiA9IG9ic2VydmVPbjtcbnZhciBPYnNlcnZlT25PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2ZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICB9XG4gICAgT2JzZXJ2ZU9uT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBPYnNlcnZlT25TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuc2NoZWR1bGVyLCB0aGlzLmRlbGF5KSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2ZU9uT3BlcmF0b3I7XG59KCkpO1xuZXhwb3J0cy5PYnNlcnZlT25PcGVyYXRvciA9IE9ic2VydmVPbk9wZXJhdG9yO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBPYnNlcnZlT25TdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT2JzZXJ2ZU9uU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYnNlcnZlT25TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBzY2hlZHVsZXIsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgfVxuICAgIE9ic2VydmVPblN1YnNjcmliZXIuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBhcmcubm90aWZpY2F0aW9uLCBkZXN0aW5hdGlvbiA9IGFyZy5kZXN0aW5hdGlvbjtcbiAgICAgICAgbm90aWZpY2F0aW9uLm9ic2VydmUoZGVzdGluYXRpb24pO1xuICAgIH07XG4gICAgT2JzZXJ2ZU9uU3Vic2NyaWJlci5wcm90b3R5cGUuc2NoZWR1bGVNZXNzYWdlID0gZnVuY3Rpb24gKG5vdGlmaWNhdGlvbikge1xuICAgICAgICB0aGlzLmFkZCh0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShPYnNlcnZlT25TdWJzY3JpYmVyLmRpc3BhdGNoLCB0aGlzLmRlbGF5LCBuZXcgT2JzZXJ2ZU9uTWVzc2FnZShub3RpZmljYXRpb24sIHRoaXMuZGVzdGluYXRpb24pKSk7XG4gICAgfTtcbiAgICBPYnNlcnZlT25TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpO1xuICAgIH07XG4gICAgT2JzZXJ2ZU9uU3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlRXJyb3IoZXJyKSk7XG4gICAgfTtcbiAgICBPYnNlcnZlT25TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVNZXNzYWdlKE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpKTtcbiAgICB9O1xuICAgIHJldHVybiBPYnNlcnZlT25TdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5PYnNlcnZlT25TdWJzY3JpYmVyID0gT2JzZXJ2ZU9uU3Vic2NyaWJlcjtcbnZhciBPYnNlcnZlT25NZXNzYWdlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPYnNlcnZlT25NZXNzYWdlKG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24pIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE9ic2VydmVPbk1lc3NhZ2U7XG59KCkpO1xuZXhwb3J0cy5PYnNlcnZlT25NZXNzYWdlID0gT2JzZXJ2ZU9uTWVzc2FnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9ic2VydmVPbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9vYnNlcnZlT24uanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  163. /***/ },
  164. /* 45 */
  165. /***/ function(module, exports, __webpack_require__) {
  166. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\n/**\n * Represents a push-based event or value that an {@link Observable} can emit.\n * This class is particularly useful for operators that manage notifications,\n * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and\n * others. Besides wrapping the actual delivered value, it also annotates it\n * with metadata of, for instance, what type of push message it is (`next`,\n * `error`, or `complete`).\n *\n * @see {@link materialize}\n * @see {@link dematerialize}\n * @see {@link observeOn}\n *\n * @class Notification<T>\n */\nvar Notification = (function () {\n function Notification(kind, value, error) {\n this.kind = kind;\n this.value = value;\n this.error = error;\n this.hasValue = kind === 'N';\n }\n /**\n * Delivers to the given `observer` the value wrapped by this Notification.\n * @param {Observer} observer\n * @return\n */\n Notification.prototype.observe = function (observer) {\n switch (this.kind) {\n case 'N':\n return observer.next && observer.next(this.value);\n case 'E':\n return observer.error && observer.error(this.error);\n case 'C':\n return observer.complete && observer.complete();\n }\n };\n /**\n * Given some {@link Observer} callbacks, deliver the value represented by the\n * current Notification to the correctly corresponding callback.\n * @param {function(value: T): void} next An Observer `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n Notification.prototype.do = function (next, error, complete) {\n var kind = this.kind;\n switch (kind) {\n case 'N':\n return next && next(this.value);\n case 'E':\n return error && error(this.error);\n case 'C':\n return complete && complete();\n }\n };\n /**\n * Takes an Observer or its individual callback functions, and calls `observe`\n * or `do` methods accordingly.\n * @param {Observer|function(value: T): void} nextOrObserver An Observer or\n * the `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n Notification.prototype.accept = function (nextOrObserver, error, complete) {\n if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n return this.observe(nextOrObserver);\n }\n else {\n return this.do(nextOrObserver, error, complete);\n }\n };\n /**\n * Returns a simple Observable that just delivers the notification represented\n * by this Notification instance.\n * @return {any}\n */\n Notification.prototype.toObservable = function () {\n var kind = this.kind;\n switch (kind) {\n case 'N':\n return Observable_1.Observable.of(this.value);\n case 'E':\n return Observable_1.Observable.throw(this.error);\n case 'C':\n return Observable_1.Observable.empty();\n }\n throw new Error('unexpected notification kind value');\n };\n /**\n * A shortcut to create a Notification instance of the type `next` from a\n * given value.\n * @param {T} value The `next` value.\n * @return {Notification<T>} The \"next\" Notification representing the\n * argument.\n */\n Notification.createNext = function (value) {\n if (typeof value !== 'undefined') {\n return new Notification('N', value);\n }\n return this.undefinedValueNotification;\n };\n /**\n * A shortcut to create a Notification instance of the type `error` from a\n * given error.\n * @param {any} [err] The `error` error.\n * @return {Notification<T>} The \"error\" Notification representing the\n * argument.\n */\n Notification.createError = function (err) {\n return new Notification('E', undefined, err);\n };\n /**\n * A shortcut to create a Notification instance of the type `complete`.\n * @return {Notification<any>} The valueless \"complete\" Notification.\n */\n Notification.createComplete = function () {\n return this.completeNotification;\n };\n Notification.completeNotification = new Notification('C');\n Notification.undefinedValueNotification = new Notification('N', undefined);\n return Notification;\n}());\nexports.Notification = Notification;\n//# sourceMappingURL=Notification.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvTm90aWZpY2F0aW9uLmpzPzZkMWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9PYnNlcnZhYmxlJyk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBwdXNoLWJhc2VkIGV2ZW50IG9yIHZhbHVlIHRoYXQgYW4ge0BsaW5rIE9ic2VydmFibGV9IGNhbiBlbWl0LlxuICogVGhpcyBjbGFzcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBvcGVyYXRvcnMgdGhhdCBtYW5hZ2Ugbm90aWZpY2F0aW9ucyxcbiAqIGxpa2Uge0BsaW5rIG1hdGVyaWFsaXplfSwge0BsaW5rIGRlbWF0ZXJpYWxpemV9LCB7QGxpbmsgb2JzZXJ2ZU9ufSwgYW5kXG4gKiBvdGhlcnMuIEJlc2lkZXMgd3JhcHBpbmcgdGhlIGFjdHVhbCBkZWxpdmVyZWQgdmFsdWUsIGl0IGFsc28gYW5ub3RhdGVzIGl0XG4gKiB3aXRoIG1ldGFkYXRhIG9mLCBmb3IgaW5zdGFuY2UsIHdoYXQgdHlwZSBvZiBwdXNoIG1lc3NhZ2UgaXQgaXMgKGBuZXh0YCxcbiAqIGBlcnJvcmAsIG9yIGBjb21wbGV0ZWApLlxuICpcbiAqIEBzZWUge0BsaW5rIG1hdGVyaWFsaXplfVxuICogQHNlZSB7QGxpbmsgZGVtYXRlcmlhbGl6ZX1cbiAqIEBzZWUge0BsaW5rIG9ic2VydmVPbn1cbiAqXG4gKiBAY2xhc3MgTm90aWZpY2F0aW9uPFQ+XG4gKi9cbnZhciBOb3RpZmljYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vdGlmaWNhdGlvbihraW5kLCB2YWx1ZSwgZXJyb3IpIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBraW5kID09PSAnTic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGl2ZXJzIHRvIHRoZSBnaXZlbiBgb2JzZXJ2ZXJgIHRoZSB2YWx1ZSB3cmFwcGVkIGJ5IHRoaXMgTm90aWZpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ9IG9ic2VydmVyXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICAgICAgICAgICAgY2FzZSAnTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQgJiYgb2JzZXJ2ZXIubmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvciAmJiBvYnNlcnZlci5lcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5jb21wbGV0ZSAmJiBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHaXZlbiBzb21lIHtAbGluayBPYnNlcnZlcn0gY2FsbGJhY2tzLCBkZWxpdmVyIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGVcbiAgICAgKiBjdXJyZW50IE5vdGlmaWNhdGlvbiB0byB0aGUgY29ycmVjdGx5IGNvcnJlc3BvbmRpbmcgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCk6IHZvaWR9IG5leHQgQW4gT2JzZXJ2ZXIgYG5leHRgIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXJyOiBhbnkpOiB2b2lkfSBbZXJyb3JdIEFuIE9ic2VydmVyIGBlcnJvcmAgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB2b2lkfSBbY29tcGxldGVdIEFuIE9ic2VydmVyIGBjb21wbGV0ZWAgY2FsbGJhY2suXG4gICAgICogQHJldHVybiB7YW55fVxuICAgICAqL1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuZG8gPSBmdW5jdGlvbiAobmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBraW5kID0gdGhpcy5raW5kO1xuICAgICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ICYmIG5leHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjYXNlICdFJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgJiYgZXJyb3IodGhpcy5lcnJvcik7XG4gICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGUgJiYgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogVGFrZXMgYW4gT2JzZXJ2ZXIgb3IgaXRzIGluZGl2aWR1YWwgY2FsbGJhY2sgZnVuY3Rpb25zLCBhbmQgY2FsbHMgYG9ic2VydmVgXG4gICAgICogb3IgYGRvYCBtZXRob2RzIGFjY29yZGluZ2x5LlxuICAgICAqIEBwYXJhbSB7T2JzZXJ2ZXJ8ZnVuY3Rpb24odmFsdWU6IFQpOiB2b2lkfSBuZXh0T3JPYnNlcnZlciBBbiBPYnNlcnZlciBvclxuICAgICAqIHRoZSBgbmV4dGAgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihlcnI6IGFueSk6IHZvaWR9IFtlcnJvcl0gQW4gT2JzZXJ2ZXIgYGVycm9yYCBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHZvaWR9IFtjb21wbGV0ZV0gQW4gT2JzZXJ2ZXIgYGNvbXBsZXRlYCBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHthbnl9XG4gICAgICovXG4gICAgTm90aWZpY2F0aW9uLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICBpZiAobmV4dE9yT2JzZXJ2ZXIgJiYgdHlwZW9mIG5leHRPck9ic2VydmVyLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmUobmV4dE9yT2JzZXJ2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG8obmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzaW1wbGUgT2JzZXJ2YWJsZSB0aGF0IGp1c3QgZGVsaXZlcnMgdGhlIG5vdGlmaWNhdGlvbiByZXByZXNlbnRlZFxuICAgICAqIGJ5IHRoaXMgTm90aWZpY2F0aW9uIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm4ge2FueX1cbiAgICAgKi9cbiAgICBOb3RpZmljYXRpb24ucHJvdG90eXBlLnRvT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtpbmQgPSB0aGlzLmtpbmQ7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSAnTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlLm9mKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAnRSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnRocm93KHRoaXMuZXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlLmVtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIG5vdGlmaWNhdGlvbiBraW5kIHZhbHVlJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBIHNob3J0Y3V0IHRvIGNyZWF0ZSBhIE5vdGlmaWNhdGlvbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBgbmV4dGAgZnJvbSBhXG4gICAgICogZ2l2ZW4gdmFsdWUuXG4gICAgICogQHBhcmFtIHtUfSB2YWx1ZSBUaGUgYG5leHRgIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge05vdGlmaWNhdGlvbjxUPn0gVGhlIFwibmV4dFwiIE5vdGlmaWNhdGlvbiByZXByZXNlbnRpbmcgdGhlXG4gICAgICogYXJndW1lbnQuXG4gICAgICovXG4gICAgTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uKCdOJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnVuZGVmaW5lZFZhbHVlTm90aWZpY2F0aW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQSBzaG9ydGN1dCB0byBjcmVhdGUgYSBOb3RpZmljYXRpb24gaW5zdGFuY2Ugb2YgdGhlIHR5cGUgYGVycm9yYCBmcm9tIGFcbiAgICAgKiBnaXZlbiBlcnJvci5cbiAgICAgKiBAcGFyYW0ge2FueX0gW2Vycl0gVGhlIGBlcnJvcmAgZXJyb3IuXG4gICAgICogQHJldHVybiB7Tm90aWZpY2F0aW9uPFQ+fSBUaGUgXCJlcnJvclwiIE5vdGlmaWNhdGlvbiByZXByZXNlbnRpbmcgdGhlXG4gICAgICogYXJndW1lbnQuXG4gICAgICovXG4gICAgTm90aWZpY2F0aW9uLmNyZWF0ZUVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbignRScsIHVuZGVmaW5lZCwgZXJyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEEgc2hvcnRjdXQgdG8gY3JlYXRlIGEgTm90aWZpY2F0aW9uIGluc3RhbmNlIG9mIHRoZSB0eXBlIGBjb21wbGV0ZWAuXG4gICAgICogQHJldHVybiB7Tm90aWZpY2F0aW9uPGFueT59IFRoZSB2YWx1ZWxlc3MgXCJjb21wbGV0ZVwiIE5vdGlmaWNhdGlvbi5cbiAgICAgKi9cbiAgICBOb3RpZmljYXRpb24uY3JlYXRlQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlTm90aWZpY2F0aW9uO1xuICAgIH07XG4gICAgTm90aWZpY2F0aW9uLmNvbXBsZXRlTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbignQycpO1xuICAgIE5vdGlmaWNhdGlvbi51bmRlZmluZWRWYWx1ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oJ04nLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBOb3RpZmljYXRpb247XG59KCkpO1xuZXhwb3J0cy5Ob3RpZmljYXRpb24gPSBOb3RpZmljYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob3RpZmljYXRpb24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvTm90aWZpY2F0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  167. /***/ },
  168. /* 46 */
  169. /***/ function(module, exports, __webpack_require__) {
  170. eval("\"use strict\";\nvar ArrayObservable_1 = __webpack_require__(39);\nexports.of = ArrayObservable_1.ArrayObservable.of;\n//# sourceMappingURL=of.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb2JzZXJ2YWJsZS9vZi5qcz9kZGY3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEFycmF5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9BcnJheU9ic2VydmFibGUnKTtcbmV4cG9ydHMub2YgPSBBcnJheU9ic2VydmFibGVfMS5BcnJheU9ic2VydmFibGUub2Y7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vZi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL29mLmpzXG4vLyBtb2R1bGUgaWQgPSA0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  171. /***/ },
  172. /* 47 */
  173. /***/ function(module, exports, __webpack_require__) {
  174. eval("\"use strict\";\nvar mergeMap_1 = __webpack_require__(48);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, in a serialized fashion waiting for each one to complete before\n * merging the next.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link concatAll}.</span>\n *\n * <img src=\"./img/concatMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each new inner Observable is\n * concatenated with the previous inner Observable.\n *\n * __Warning:__ if source values arrive endlessly and faster than their\n * corresponding inner Observables can complete, it will result in memory issues\n * as inner Observables amass in an unbounded buffer waiting for their turn to\n * be subscribed to.\n *\n * Note: `concatMap` is equivalent to `mergeMap` with concurrency parameter set\n * to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.concatMap(ev => Rx.Observable.interval(1000).take(4));\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link concat}\n * @see {@link concatAll}\n * @see {@link concatMapTo}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} an observable of values merged from the projected\n * Observables as they were subscribed to, one at a time. Optionally, these\n * values may have been projected from a passed `projectResult` argument.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking values from each projected inner\n * Observable sequentially.\n * @method concatMap\n * @owner Observable\n */\nfunction concatMap(project, resultSelector) {\n return this.lift(new mergeMap_1.MergeMapOperator(project, resultSelector, 1));\n}\nexports.concatMap = concatMap;\n//# sourceMappingURL=concatMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvY29uY2F0TWFwLmpzPzVjYWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbWVyZ2VNYXBfMSA9IHJlcXVpcmUoJy4vbWVyZ2VNYXAnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBQcm9qZWN0cyBlYWNoIHNvdXJjZSB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlIHdoaWNoIGlzIG1lcmdlZCBpbiB0aGUgb3V0cHV0XG4gKiBPYnNlcnZhYmxlLCBpbiBhIHNlcmlhbGl6ZWQgZmFzaGlvbiB3YWl0aW5nIGZvciBlYWNoIG9uZSB0byBjb21wbGV0ZSBiZWZvcmVcbiAqIG1lcmdpbmcgdGhlIG5leHQuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPk1hcHMgZWFjaCB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlLCB0aGVuIGZsYXR0ZW5zIGFsbCBvZlxuICogdGhlc2UgaW5uZXIgT2JzZXJ2YWJsZXMgdXNpbmcge0BsaW5rIGNvbmNhdEFsbH0uPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvY29uY2F0TWFwLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW1zIGJhc2VkIG9uIGFwcGx5aW5nIGEgZnVuY3Rpb24gdGhhdCB5b3VcbiAqIHN1cHBseSB0byBlYWNoIGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUsIHdoZXJlIHRoYXQgZnVuY3Rpb25cbiAqIHJldHVybnMgYW4gKHNvLWNhbGxlZCBcImlubmVyXCIpIE9ic2VydmFibGUuIEVhY2ggbmV3IGlubmVyIE9ic2VydmFibGUgaXNcbiAqIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBwcmV2aW91cyBpbm5lciBPYnNlcnZhYmxlLlxuICpcbiAqIF9fV2FybmluZzpfXyBpZiBzb3VyY2UgdmFsdWVzIGFycml2ZSBlbmRsZXNzbHkgYW5kIGZhc3RlciB0aGFuIHRoZWlyXG4gKiBjb3JyZXNwb25kaW5nIGlubmVyIE9ic2VydmFibGVzIGNhbiBjb21wbGV0ZSwgaXQgd2lsbCByZXN1bHQgaW4gbWVtb3J5IGlzc3Vlc1xuICogYXMgaW5uZXIgT2JzZXJ2YWJsZXMgYW1hc3MgaW4gYW4gdW5ib3VuZGVkIGJ1ZmZlciB3YWl0aW5nIGZvciB0aGVpciB0dXJuIHRvXG4gKiBiZSBzdWJzY3JpYmVkIHRvLlxuICpcbiAqIE5vdGU6IGBjb25jYXRNYXBgIGlzIGVxdWl2YWxlbnQgdG8gYG1lcmdlTWFwYCB3aXRoIGNvbmN1cnJlbmN5IHBhcmFtZXRlciBzZXRcbiAqIHRvIGAxYC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Gb3IgZWFjaCBjbGljayBldmVudCwgdGljayBldmVyeSBzZWNvbmQgZnJvbSAwIHRvIDMsIHdpdGggbm8gY29uY3VycmVuY3k8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5jb25jYXRNYXAoZXYgPT4gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKS50YWtlKDQpKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gKHJlc3VsdHMgYXJlIG5vdCBjb25jdXJyZW50KVxuICogLy8gRm9yIGV2ZXJ5IGNsaWNrIG9uIHRoZSBcImRvY3VtZW50XCIgaXQgd2lsbCBlbWl0IHZhbHVlcyAwIHRvIDMgc3BhY2VkXG4gKiAvLyBvbiBhIDEwMDBtcyBpbnRlcnZhbFxuICogLy8gb25lIGNsaWNrID0gMTAwMG1zLT4gMCAtMTAwMG1zLT4gMSAtMTAwMG1zLT4gMiAtMTAwMG1zLT4gM1xuICpcbiAqIEBzZWUge0BsaW5rIGNvbmNhdH1cbiAqIEBzZWUge0BsaW5rIGNvbmNhdEFsbH1cbiAqIEBzZWUge0BsaW5rIGNvbmNhdE1hcFRvfVxuICogQHNlZSB7QGxpbmsgZXhoYXVzdE1hcH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlTWFwfVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwfVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24odmFsdWU6IFQsID9pbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZX0gcHJvamVjdCBBIGZ1bmN0aW9uXG4gKiB0aGF0LCB3aGVuIGFwcGxpZWQgdG8gYW4gaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgcmV0dXJucyBhblxuICogT2JzZXJ2YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ob3V0ZXJWYWx1ZTogVCwgaW5uZXJWYWx1ZTogSSwgb3V0ZXJJbmRleDogbnVtYmVyLCBpbm5lckluZGV4OiBudW1iZXIpOiBhbnl9IFtyZXN1bHRTZWxlY3Rvcl1cbiAqIEEgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdmFsdWUgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZXNcbiAqIGFuZCB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIChvdXRlcikgZW1pc3Npb24gYW5kIHRoZSBpbm5lciBPYnNlcnZhYmxlXG4gKiBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBhcmU6XG4gKiAtIGBvdXRlclZhbHVlYDogdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBzb3VyY2VcbiAqIC0gYGlubmVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiAtIGBvdXRlckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJJbmRleGA6IHRoZSBcImluZGV4XCIgb2YgdGhlIHZhbHVlIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBvYnNlcnZhYmxlIG9mIHZhbHVlcyBtZXJnZWQgZnJvbSB0aGUgcHJvamVjdGVkXG4gKiBPYnNlcnZhYmxlcyBhcyB0aGV5IHdlcmUgc3Vic2NyaWJlZCB0bywgb25lIGF0IGEgdGltZS4gT3B0aW9uYWxseSwgdGhlc2VcbiAqIHZhbHVlcyBtYXkgaGF2ZSBiZWVuIHByb2plY3RlZCBmcm9tIGEgcGFzc2VkIGBwcm9qZWN0UmVzdWx0YCBhcmd1bWVudC5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZVxuICogcHJvamVjdGlvbiBmdW5jdGlvbiAoYW5kIHRoZSBvcHRpb25hbCBgcmVzdWx0U2VsZWN0b3JgKSB0byBlYWNoIGl0ZW0gZW1pdHRlZFxuICogYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFuZCB0YWtpbmcgdmFsdWVzIGZyb20gZWFjaCBwcm9qZWN0ZWQgaW5uZXJcbiAqIE9ic2VydmFibGUgc2VxdWVudGlhbGx5LlxuICogQG1ldGhvZCBjb25jYXRNYXBcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IG1lcmdlTWFwXzEuTWVyZ2VNYXBPcGVyYXRvcihwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkpO1xufVxuZXhwb3J0cy5jb25jYXRNYXAgPSBjb25jYXRNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRNYXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvY29uY2F0TWFwLmpzXG4vLyBtb2R1bGUgaWQgPSA0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  175. /***/ },
  176. /* 48 */
  177. /***/ function(module, exports, __webpack_require__) {
  178. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.</span>\n *\n * <img src=\"./img/mergeMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example <caption>Map and flatten each letter to an Observable ticking every 1 second</caption>\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n * Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nfunction mergeMap(project, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n resultSelector = null;\n }\n return this.lift(new MergeMapOperator(project, resultSelector, concurrent));\n}\nexports.mergeMap = mergeMap;\nvar MergeMapOperator = (function () {\n function MergeMapOperator(project, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n this.project = project;\n this.resultSelector = resultSelector;\n this.concurrent = concurrent;\n }\n MergeMapOperator.prototype.call = function (observer, source) {\n return source.subscribe(new MergeMapSubscriber(observer, this.project, this.resultSelector, this.concurrent));\n };\n return MergeMapOperator;\n}());\nexports.MergeMapOperator = MergeMapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeMapSubscriber = (function (_super) {\n __extends(MergeMapSubscriber, _super);\n function MergeMapSubscriber(destination, project, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n _super.call(this, destination);\n this.project = project;\n this.resultSelector = resultSelector;\n this.concurrent = concurrent;\n this.hasCompleted = false;\n this.buffer = [];\n this.active = 0;\n this.index = 0;\n }\n MergeMapSubscriber.prototype._next = function (value) {\n if (this.active < this.concurrent) {\n this._tryNext(value);\n }\n else {\n this.buffer.push(value);\n }\n };\n MergeMapSubscriber.prototype._tryNext = function (value) {\n var result;\n var index = this.index++;\n try {\n result = this.project(value, index);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.active++;\n this._innerSub(result, value, index);\n };\n MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n };\n MergeMapSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete();\n }\n };\n MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n if (this.resultSelector) {\n this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n else {\n this.destination.next(innerValue);\n }\n };\n MergeMapSubscriber.prototype._notifyResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {\n var result;\n try {\n result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n var buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n }\n else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete();\n }\n };\n return MergeMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeMapSubscriber = MergeMapSubscriber;\n//# sourceMappingURL=mergeMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvbWVyZ2VNYXAuanM/YTBkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBQcm9qZWN0cyBlYWNoIHNvdXJjZSB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlIHdoaWNoIGlzIG1lcmdlZCBpbiB0aGUgb3V0cHV0XG4gKiBPYnNlcnZhYmxlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5NYXBzIGVhY2ggdmFsdWUgdG8gYW4gT2JzZXJ2YWJsZSwgdGhlbiBmbGF0dGVucyBhbGwgb2ZcbiAqIHRoZXNlIGlubmVyIE9ic2VydmFibGVzIHVzaW5nIHtAbGluayBtZXJnZUFsbH0uPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbWVyZ2VNYXAucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaXRlbXMgYmFzZWQgb24gYXBwbHlpbmcgYSBmdW5jdGlvbiB0aGF0IHlvdVxuICogc3VwcGx5IHRvIGVhY2ggaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgd2hlcmUgdGhhdCBmdW5jdGlvblxuICogcmV0dXJucyBhbiBPYnNlcnZhYmxlLCBhbmQgdGhlbiBtZXJnaW5nIHRob3NlIHJlc3VsdGluZyBPYnNlcnZhYmxlcyBhbmRcbiAqIGVtaXR0aW5nIHRoZSByZXN1bHRzIG9mIHRoaXMgbWVyZ2VyLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPk1hcCBhbmQgZmxhdHRlbiBlYWNoIGxldHRlciB0byBhbiBPYnNlcnZhYmxlIHRpY2tpbmcgZXZlcnkgMSBzZWNvbmQ8L2NhcHRpb24+XG4gKiB2YXIgbGV0dGVycyA9IFJ4Lk9ic2VydmFibGUub2YoJ2EnLCAnYicsICdjJyk7XG4gKiB2YXIgcmVzdWx0ID0gbGV0dGVycy5tZXJnZU1hcCh4ID0+XG4gKiAgIFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCkubWFwKGkgPT4geCtpKVxuICogKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gYTBcbiAqIC8vIGIwXG4gKiAvLyBjMFxuICogLy8gYTFcbiAqIC8vIGIxXG4gKiAvLyBjMVxuICogLy8gY29udGludWVzIHRvIGxpc3QgYSxiLGMgd2l0aCByZXNwZWN0aXZlIGFzY2VuZGluZyBpbnRlZ2Vyc1xuICpcbiAqIEBzZWUge0BsaW5rIGNvbmNhdE1hcH1cbiAqIEBzZWUge0BsaW5rIGV4aGF1c3RNYXB9XG4gKiBAc2VlIHtAbGluayBtZXJnZX1cbiAqIEBzZWUge0BsaW5rIG1lcmdlQWxsfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VNYXBUb31cbiAqIEBzZWUge0BsaW5rIG1lcmdlU2Nhbn1cbiAqIEBzZWUge0BsaW5rIHN3aXRjaE1hcH1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCA/aW5kZXg6IG51bWJlcik6IE9ic2VydmFibGV9IHByb2plY3QgQSBmdW5jdGlvblxuICogdGhhdCwgd2hlbiBhcHBsaWVkIHRvIGFuIGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUsIHJldHVybnMgYW5cbiAqIE9ic2VydmFibGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKG91dGVyVmFsdWU6IFQsIGlubmVyVmFsdWU6IEksIG91dGVySW5kZXg6IG51bWJlciwgaW5uZXJJbmRleDogbnVtYmVyKTogYW55fSBbcmVzdWx0U2VsZWN0b3JdXG4gKiBBIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHZhbHVlIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBiYXNlZCBvbiB0aGUgdmFsdWVzXG4gKiBhbmQgdGhlIGluZGljZXMgb2YgdGhlIHNvdXJjZSAob3V0ZXIpIGVtaXNzaW9uIGFuZCB0aGUgaW5uZXIgT2JzZXJ2YWJsZVxuICogZW1pc3Npb24uIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gYXJlOlxuICogLSBgb3V0ZXJWYWx1ZWA6IHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSB0aGUgc291cmNlXG4gKiAtIGBpbm5lclZhbHVlYDogdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBwcm9qZWN0ZWQgT2JzZXJ2YWJsZVxuICogLSBgb3V0ZXJJbmRleGA6IHRoZSBcImluZGV4XCIgb2YgdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBzb3VyY2VcbiAqIC0gYGlubmVySW5kZXhgOiB0aGUgXCJpbmRleFwiIG9mIHRoZSB2YWx1ZSBmcm9tIHRoZSBwcm9qZWN0ZWQgT2JzZXJ2YWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW50PU51bWJlci5QT1NJVElWRV9JTkZJTklUWV0gTWF4aW11bSBudW1iZXIgb2YgaW5wdXRcbiAqIE9ic2VydmFibGVzIGJlaW5nIHN1YnNjcmliZWQgdG8gY29uY3VycmVudGx5LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlXG4gKiBwcm9qZWN0aW9uIGZ1bmN0aW9uIChhbmQgdGhlIG9wdGlvbmFsIGByZXN1bHRTZWxlY3RvcmApIHRvIGVhY2ggaXRlbSBlbWl0dGVkXG4gKiBieSB0aGUgc291cmNlIE9ic2VydmFibGUgYW5kIG1lcmdpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIE9ic2VydmFibGVzIG9idGFpbmVkXG4gKiBmcm9tIHRoaXMgdHJhbnNmb3JtYXRpb24uXG4gKiBAbWV0aG9kIG1lcmdlTWFwXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkge1xuICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0U2VsZWN0b3IgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmN1cnJlbnQgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgcmVzdWx0U2VsZWN0b3IgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBNZXJnZU1hcE9wZXJhdG9yKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSk7XG59XG5leHBvcnRzLm1lcmdlTWFwID0gbWVyZ2VNYXA7XG52YXIgTWVyZ2VNYXBPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVyZ2VNYXBPcGVyYXRvcihwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkge1xuICAgICAgICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7IH1cbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgIH1cbiAgICBNZXJnZU1hcE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlTWFwU3Vic2NyaWJlcihvYnNlcnZlciwgdGhpcy5wcm9qZWN0LCB0aGlzLnJlc3VsdFNlbGVjdG9yLCB0aGlzLmNvbmN1cnJlbnQpKTtcbiAgICB9O1xuICAgIHJldHVybiBNZXJnZU1hcE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuTWVyZ2VNYXBPcGVyYXRvciA9IE1lcmdlTWFwT3BlcmF0b3I7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIE1lcmdlTWFwU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1lcmdlTWFwU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNZXJnZU1hcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gICAgICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgPCB0aGlzLmNvbmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyeU5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lcmdlTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX3RyeU5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleCsrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0KHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlKys7XG4gICAgICAgIHRoaXMuX2lubmVyU3ViKHJlc3VsdCwgdmFsdWUsIGluZGV4KTtcbiAgICB9O1xuICAgIE1lcmdlTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX2lubmVyU3ViID0gZnVuY3Rpb24gKGlzaCwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgaXNoLCB2YWx1ZSwgaW5kZXgpKTtcbiAgICB9O1xuICAgIE1lcmdlTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnlSZXN1bHRTZWxlY3RvcihvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbm90aWZ5UmVzdWx0U2VsZWN0b3IgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5yZXN1bHRTZWxlY3RvcihvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7XG4gICAgfTtcbiAgICBNZXJnZU1hcFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWIpO1xuICAgICAgICB0aGlzLmFjdGl2ZS0tO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX25leHQoYnVmZmVyLnNoaWZ0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlID09PSAwICYmIHRoaXMuaGFzQ29tcGxldGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNZXJnZU1hcFN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5NZXJnZU1hcFN1YnNjcmliZXIgPSBNZXJnZU1hcFN1YnNjcmliZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZU1hcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9tZXJnZU1hcC5qc1xuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  179. /***/ },
  180. /* 49 */
  181. /***/ function(module, exports, __webpack_require__) {
  182. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar isArray_1 = __webpack_require__(12);\nvar isPromise_1 = __webpack_require__(36);\nvar isObject_1 = __webpack_require__(13);\nvar Observable_1 = __webpack_require__(6);\nvar iterator_1 = __webpack_require__(38);\nvar InnerSubscriber_1 = __webpack_require__(50);\nvar observable_1 = __webpack_require__(19);\nfunction subscribeToResult(outerSubscriber, result, outerValue, outerIndex) {\n var destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex);\n if (destination.closed) {\n return null;\n }\n if (result instanceof Observable_1.Observable) {\n if (result._isScalar) {\n destination.next(result.value);\n destination.complete();\n return null;\n }\n else {\n return result.subscribe(destination);\n }\n }\n else if (isArray_1.isArray(result)) {\n for (var i = 0, len = result.length; i < len && !destination.closed; i++) {\n destination.next(result[i]);\n }\n if (!destination.closed) {\n destination.complete();\n }\n }\n else if (isPromise_1.isPromise(result)) {\n result.then(function (value) {\n if (!destination.closed) {\n destination.next(value);\n destination.complete();\n }\n }, function (err) { return destination.error(err); })\n .then(null, function (err) {\n // Escaping the Promise trap: globally throw unhandled errors\n root_1.root.setTimeout(function () { throw err; });\n });\n return destination;\n }\n else if (result && typeof result[iterator_1.$$iterator] === 'function') {\n var iterator = result[iterator_1.$$iterator]();\n do {\n var item = iterator.next();\n if (item.done) {\n destination.complete();\n break;\n }\n destination.next(item.value);\n if (destination.closed) {\n break;\n }\n } while (true);\n }\n else if (result && typeof result[observable_1.$$observable] === 'function') {\n var obs = result[observable_1.$$observable]();\n if (typeof obs.subscribe !== 'function') {\n destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));\n }\n else {\n return obs.subscribe(new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex));\n }\n }\n else {\n var value = isObject_1.isObject(result) ? 'an invalid object' : \"'\" + result + \"'\";\n var msg = (\"You provided \" + value + \" where a stream was expected.\")\n + ' You can provide an Observable, Promise, Array, or Iterable.';\n destination.error(new TypeError(msg));\n }\n return null;\n}\nexports.subscribeToResult = subscribeToResult;\n//# sourceMappingURL=subscribeToResult.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdC5qcz9jMDExIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIHJvb3RfMSA9IHJlcXVpcmUoJy4vcm9vdCcpO1xudmFyIGlzQXJyYXlfMSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xudmFyIGlzUHJvbWlzZV8xID0gcmVxdWlyZSgnLi9pc1Byb21pc2UnKTtcbnZhciBpc09iamVjdF8xID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZSgnLi4vc3ltYm9sL2l0ZXJhdG9yJyk7XG52YXIgSW5uZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9Jbm5lclN1YnNjcmliZXInKTtcbnZhciBvYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9zeW1ib2wvb2JzZXJ2YWJsZScpO1xuZnVuY3Rpb24gc3Vic2NyaWJlVG9SZXN1bHQob3V0ZXJTdWJzY3JpYmVyLCByZXN1bHQsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpIHtcbiAgICB2YXIgZGVzdGluYXRpb24gPSBuZXcgSW5uZXJTdWJzY3JpYmVyXzEuSW5uZXJTdWJzY3JpYmVyKG91dGVyU3Vic2NyaWJlciwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCk7XG4gICAgaWYgKGRlc3RpbmF0aW9uLmNsb3NlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSB7XG4gICAgICAgIGlmIChyZXN1bHQuX2lzU2NhbGFyKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnNjcmliZShkZXN0aW5hdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheV8xLmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbiAmJiAhZGVzdGluYXRpb24uY2xvc2VkOyBpKyspIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQocmVzdWx0W2ldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlc3RpbmF0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1Byb21pc2VfMS5pc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICByZXN1bHQudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZGVzdGluYXRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gZGVzdGluYXRpb24uZXJyb3IoZXJyKTsgfSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIC8vIEVzY2FwaW5nIHRoZSBQcm9taXNlIHRyYXA6IGdsb2JhbGx5IHRocm93IHVuaGFuZGxlZCBlcnJvcnNcbiAgICAgICAgICAgIHJvb3RfMS5yb290LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdFtpdGVyYXRvcl8xLiQkaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IHJlc3VsdFtpdGVyYXRvcl8xLiQkaXRlcmF0b3JdKCk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZG9uZSkge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHRbb2JzZXJ2YWJsZV8xLiQkb2JzZXJ2YWJsZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIG9icyA9IHJlc3VsdFtvYnNlcnZhYmxlXzEuJCRvYnNlcnZhYmxlXSgpO1xuICAgICAgICBpZiAodHlwZW9mIG9icy5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKG5ldyBUeXBlRXJyb3IoJ1Byb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9icy5zdWJzY3JpYmUobmV3IElubmVyU3Vic2NyaWJlcl8xLklubmVyU3Vic2NyaWJlcihvdXRlclN1YnNjcmliZXIsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXNPYmplY3RfMS5pc09iamVjdChyZXN1bHQpID8gJ2FuIGludmFsaWQgb2JqZWN0JyA6IFwiJ1wiICsgcmVzdWx0ICsgXCInXCI7XG4gICAgICAgIHZhciBtc2cgPSAoXCJZb3UgcHJvdmlkZWQgXCIgKyB2YWx1ZSArIFwiIHdoZXJlIGEgc3RyZWFtIHdhcyBleHBlY3RlZC5cIilcbiAgICAgICAgICAgICsgJyBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgQXJyYXksIG9yIEl0ZXJhYmxlLic7XG4gICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKG5ldyBUeXBlRXJyb3IobXNnKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZXhwb3J0cy5zdWJzY3JpYmVUb1Jlc3VsdCA9IHN1YnNjcmliZVRvUmVzdWx0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Vic2NyaWJlVG9SZXN1bHQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdC5qc1xuLy8gbW9kdWxlIGlkID0gNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  183. /***/ },
  184. /* 50 */
  185. /***/ function(module, exports, __webpack_require__) {
  186. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar InnerSubscriber = (function (_super) {\n __extends(InnerSubscriber, _super);\n function InnerSubscriber(parent, outerValue, outerIndex) {\n _super.call(this);\n this.parent = parent;\n this.outerValue = outerValue;\n this.outerIndex = outerIndex;\n this.index = 0;\n }\n InnerSubscriber.prototype._next = function (value) {\n this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n };\n InnerSubscriber.prototype._error = function (error) {\n this.parent.notifyError(error, this);\n this.unsubscribe();\n };\n InnerSubscriber.prototype._complete = function () {\n this.parent.notifyComplete(this);\n this.unsubscribe();\n };\n return InnerSubscriber;\n}(Subscriber_1.Subscriber));\nexports.InnerSubscriber = InnerSubscriber;\n//# sourceMappingURL=InnerSubscriber.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvSW5uZXJTdWJzY3JpYmVyLmpzPzcyNTkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuL1N1YnNjcmliZXInKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgSW5uZXJTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW5uZXJTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyU3Vic2NyaWJlcihwYXJlbnQsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm91dGVyVmFsdWUgPSBvdXRlclZhbHVlO1xuICAgICAgICB0aGlzLm91dGVySW5kZXggPSBvdXRlckluZGV4O1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgSW5uZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlOZXh0KHRoaXMub3V0ZXJWYWx1ZSwgdmFsdWUsIHRoaXMub3V0ZXJJbmRleCwgdGhpcy5pbmRleCsrLCB0aGlzKTtcbiAgICB9O1xuICAgIElubmVyU3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUVycm9yKGVycm9yLCB0aGlzKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgSW5uZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUNvbXBsZXRlKHRoaXMpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gSW5uZXJTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5Jbm5lclN1YnNjcmliZXIgPSBJbm5lclN1YnNjcmliZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Jbm5lclN1YnNjcmliZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvSW5uZXJTdWJzY3JpYmVyLmpzXG4vLyBtb2R1bGUgaWQgPSA1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  187. /***/ },
  188. /* 51 */
  189. /***/ function(module, exports, __webpack_require__) {
  190. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar OuterSubscriber = (function (_super) {\n __extends(OuterSubscriber, _super);\n function OuterSubscriber() {\n _super.apply(this, arguments);\n }\n OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.destination.next(innerValue);\n };\n OuterSubscriber.prototype.notifyError = function (error, innerSub) {\n this.destination.error(error);\n };\n OuterSubscriber.prototype.notifyComplete = function (innerSub) {\n this.destination.complete();\n };\n return OuterSubscriber;\n}(Subscriber_1.Subscriber));\nexports.OuterSubscriber = OuterSubscriber;\n//# sourceMappingURL=OuterSubscriber.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvT3V0ZXJTdWJzY3JpYmVyLmpzPzQxOTciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuL1N1YnNjcmliZXInKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgT3V0ZXJTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoT3V0ZXJTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE91dGVyU3Vic2NyaWJlcigpIHtcbiAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIE91dGVyU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgfTtcbiAgICBPdXRlclN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycm9yKTtcbiAgICB9O1xuICAgIE91dGVyU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIE91dGVyU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmV4cG9ydHMuT3V0ZXJTdWJzY3JpYmVyID0gT3V0ZXJTdWJzY3JpYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3V0ZXJTdWJzY3JpYmVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL091dGVyU3Vic2NyaWJlci5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  191. /***/ },
  192. /* 52 */
  193. /***/ function(module, exports, __webpack_require__) {
  194. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.\n * @param {function} predicate a function for determining if an item meets a specified condition.\n * @param {any} [thisArg] optional object to use for `this` in the callback\n * @return {Observable} an Observable of booleans that determines if all items of the source Observable meet the condition specified.\n * @method every\n * @owner Observable\n */\nfunction every(predicate, thisArg) {\n return this.lift(new EveryOperator(predicate, thisArg, this));\n}\nexports.every = every;\nvar EveryOperator = (function () {\n function EveryOperator(predicate, thisArg, source) {\n this.predicate = predicate;\n this.thisArg = thisArg;\n this.source = source;\n }\n EveryOperator.prototype.call = function (observer, source) {\n return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));\n };\n return EveryOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar EverySubscriber = (function (_super) {\n __extends(EverySubscriber, _super);\n function EverySubscriber(destination, predicate, thisArg, source) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.thisArg = thisArg;\n this.source = source;\n this.index = 0;\n this.thisArg = thisArg || this;\n }\n EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {\n this.destination.next(everyValueMatch);\n this.destination.complete();\n };\n EverySubscriber.prototype._next = function (value) {\n var result = false;\n try {\n result = this.predicate.call(this.thisArg, value, this.index++, this.source);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n if (!result) {\n this.notifyComplete(false);\n }\n };\n EverySubscriber.prototype._complete = function () {\n this.notifyComplete(true);\n };\n return EverySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=every.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvZXZlcnkuanM/MzdiNiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hldGhlciBvciBub3QgZXZlcnkgaXRlbSBvZiB0aGUgc291cmNlIHNhdGlzZmllcyB0aGUgY29uZGl0aW9uIHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHByZWRpY2F0ZSBhIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyBpZiBhbiBpdGVtIG1lZXRzIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAqIEBwYXJhbSB7YW55fSBbdGhpc0FyZ10gb3B0aW9uYWwgb2JqZWN0IHRvIHVzZSBmb3IgYHRoaXNgIGluIHRoZSBjYWxsYmFja1xuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gYW4gT2JzZXJ2YWJsZSBvZiBib29sZWFucyB0aGF0IGRldGVybWluZXMgaWYgYWxsIGl0ZW1zIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBtZWV0IHRoZSBjb25kaXRpb24gc3BlY2lmaWVkLlxuICogQG1ldGhvZCBldmVyeVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZXZlcnkocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgRXZlcnlPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXNBcmcsIHRoaXMpKTtcbn1cbmV4cG9ydHMuZXZlcnkgPSBldmVyeTtcbnZhciBFdmVyeU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVyeU9wZXJhdG9yKHByZWRpY2F0ZSwgdGhpc0FyZywgc291cmNlKSB7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgRXZlcnlPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChvYnNlcnZlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBFdmVyeVN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnRoaXNBcmcsIHRoaXMuc291cmNlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRXZlcnlPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEV2ZXJ5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEV2ZXJ5U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFdmVyeVN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByZWRpY2F0ZSwgdGhpc0FyZywgc291cmNlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZyB8fCB0aGlzO1xuICAgIH1cbiAgICBFdmVyeVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGV2ZXJ5VmFsdWVNYXRjaCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoZXZlcnlWYWx1ZU1hdGNoKTtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgRXZlcnlTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuaW5kZXgrKywgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDb21wbGV0ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZXJ5U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeUNvbXBsZXRlKHRydWUpO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZXJ5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZXJ5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2V2ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSA1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  195. /***/ },
  196. /* 53 */
  197. /***/ function(module, exports, __webpack_require__) {
  198. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar EmptyError_1 = __webpack_require__(54);\n/**\n * Emits only the first value (or the first value that meets some condition)\n * emitted by the source Observable.\n *\n * <span class=\"informal\">Emits only the first value. Or emits only the first\n * value that passes some test.</span>\n *\n * <img src=\"./img/first.png\" width=\"100%\">\n *\n * If called with no arguments, `first` emits the first value of the source\n * Observable, then completes. If called with a `predicate` function, `first`\n * emits the first value of the source that matches the specified condition. It\n * may also take a `resultSelector` function to produce the output value from\n * the input value, and a `defaultValue` to emit in case the source completes\n * before it is able to emit a valid value. Throws an error if `defaultValue`\n * was not provided and a matching element is not found.\n *\n * @example <caption>Emit only the first click that happens on the DOM</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Emits the first click that happens on a DIV</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.first(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link take}\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]\n * An optional function called with each item to test for condition matching.\n * @param {function(value: T, index: number): R} [resultSelector] A function to\n * produce the value on the output Observable based on the values\n * and the indices of the source Observable. The arguments passed to this\n * function are:\n * - `value`: the value that was emitted on the source.\n * - `index`: the \"index\" of the value from the source.\n * @param {R} [defaultValue] The default value emitted in case no valid value\n * was found on the source.\n * @return {Observable<T|R>} an Observable of the first item that matches the\n * condition.\n * @method first\n * @owner Observable\n */\nfunction first(predicate, resultSelector, defaultValue) {\n return this.lift(new FirstOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.first = first;\nvar FirstOperator = (function () {\n function FirstOperator(predicate, resultSelector, defaultValue, source) {\n this.predicate = predicate;\n this.resultSelector = resultSelector;\n this.defaultValue = defaultValue;\n this.source = source;\n }\n FirstOperator.prototype.call = function (observer, source) {\n return source.subscribe(new FirstSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n };\n return FirstOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FirstSubscriber = (function (_super) {\n __extends(FirstSubscriber, _super);\n function FirstSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.resultSelector = resultSelector;\n this.defaultValue = defaultValue;\n this.source = source;\n this.index = 0;\n this.hasCompleted = false;\n this._emitted = false;\n }\n FirstSubscriber.prototype._next = function (value) {\n var index = this.index++;\n if (this.predicate) {\n this._tryPredicate(value, index);\n }\n else {\n this._emit(value, index);\n }\n };\n FirstSubscriber.prototype._tryPredicate = function (value, index) {\n var result;\n try {\n result = this.predicate(value, index, this.source);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n this._emit(value, index);\n }\n };\n FirstSubscriber.prototype._emit = function (value, index) {\n if (this.resultSelector) {\n this._tryResultSelector(value, index);\n return;\n }\n this._emitFinal(value);\n };\n FirstSubscriber.prototype._tryResultSelector = function (value, index) {\n var result;\n try {\n result = this.resultSelector(value, index);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this._emitFinal(result);\n };\n FirstSubscriber.prototype._emitFinal = function (value) {\n var destination = this.destination;\n if (!this._emitted) {\n this._emitted = true;\n destination.next(value);\n destination.complete();\n this.hasCompleted = true;\n }\n };\n FirstSubscriber.prototype._complete = function () {\n var destination = this.destination;\n if (!this.hasCompleted && typeof this.defaultValue !== 'undefined') {\n destination.next(this.defaultValue);\n destination.complete();\n }\n else if (!this.hasCompleted) {\n destination.error(new EmptyError_1.EmptyError);\n }\n };\n return FirstSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=first.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvZmlyc3QuanM/YzY2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBFbXB0eUVycm9yXzEgPSByZXF1aXJlKCcuLi91dGlsL0VtcHR5RXJyb3InKTtcbi8qKlxuICogRW1pdHMgb25seSB0aGUgZmlyc3QgdmFsdWUgKG9yIHRoZSBmaXJzdCB2YWx1ZSB0aGF0IG1lZXRzIHNvbWUgY29uZGl0aW9uKVxuICogZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkVtaXRzIG9ubHkgdGhlIGZpcnN0IHZhbHVlLiBPciBlbWl0cyBvbmx5IHRoZSBmaXJzdFxuICogdmFsdWUgdGhhdCBwYXNzZXMgc29tZSB0ZXN0Ljwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2ZpcnN0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgYGZpcnN0YCBlbWl0cyB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZSwgdGhlbiBjb21wbGV0ZXMuIElmIGNhbGxlZCB3aXRoIGEgYHByZWRpY2F0ZWAgZnVuY3Rpb24sIGBmaXJzdGBcbiAqIGVtaXRzIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgc291cmNlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbi4gSXRcbiAqIG1heSBhbHNvIHRha2UgYSBgcmVzdWx0U2VsZWN0b3JgIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIG91dHB1dCB2YWx1ZSBmcm9tXG4gKiB0aGUgaW5wdXQgdmFsdWUsIGFuZCBhIGBkZWZhdWx0VmFsdWVgIHRvIGVtaXQgaW4gY2FzZSB0aGUgc291cmNlIGNvbXBsZXRlc1xuICogYmVmb3JlIGl0IGlzIGFibGUgdG8gZW1pdCBhIHZhbGlkIHZhbHVlLiBUaHJvd3MgYW4gZXJyb3IgaWYgYGRlZmF1bHRWYWx1ZWBcbiAqIHdhcyBub3QgcHJvdmlkZWQgYW5kIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBub3QgZm91bmQuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCBvbmx5IHRoZSBmaXJzdCBjbGljayB0aGF0IGhhcHBlbnMgb24gdGhlIERPTTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLmZpcnN0KCk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXRzIHRoZSBmaXJzdCBjbGljayB0aGF0IGhhcHBlbnMgb24gYSBESVY8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5maXJzdChldiA9PiBldi50YXJnZXQudGFnTmFtZSA9PT0gJ0RJVicpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBmaWx0ZXJ9XG4gKiBAc2VlIHtAbGluayBmaW5kfVxuICogQHNlZSB7QGxpbmsgdGFrZX1cbiAqXG4gKiBAdGhyb3dzIHtFbXB0eUVycm9yfSBEZWxpdmVycyBhbiBFbXB0eUVycm9yIHRvIHRoZSBPYnNlcnZlcidzIGBlcnJvcmBcbiAqIGNhbGxiYWNrIGlmIHRoZSBPYnNlcnZhYmxlIGNvbXBsZXRlcyBiZWZvcmUgYW55IGBuZXh0YCBub3RpZmljYXRpb24gd2FzIHNlbnQuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgc291cmNlOiBPYnNlcnZhYmxlPFQ+KTogYm9vbGVhbn0gW3ByZWRpY2F0ZV1cbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIGVhY2ggaXRlbSB0byB0ZXN0IGZvciBjb25kaXRpb24gbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKTogUn0gW3Jlc3VsdFNlbGVjdG9yXSBBIGZ1bmN0aW9uIHRvXG4gKiBwcm9kdWNlIHRoZSB2YWx1ZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgYmFzZWQgb24gdGhlIHZhbHVlc1xuICogYW5kIHRoZSBpbmRpY2VzIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpc1xuICogZnVuY3Rpb24gYXJlOlxuICogLSBgdmFsdWVgOiB0aGUgdmFsdWUgdGhhdCB3YXMgZW1pdHRlZCBvbiB0aGUgc291cmNlLlxuICogLSBgaW5kZXhgOiB0aGUgXCJpbmRleFwiIG9mIHRoZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAcGFyYW0ge1J9IFtkZWZhdWx0VmFsdWVdIFRoZSBkZWZhdWx0IHZhbHVlIGVtaXR0ZWQgaW4gY2FzZSBubyB2YWxpZCB2YWx1ZVxuICogd2FzIGZvdW5kIG9uIHRoZSBzb3VyY2UuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFR8Uj59IGFuIE9ic2VydmFibGUgb2YgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZVxuICogY29uZGl0aW9uLlxuICogQG1ldGhvZCBmaXJzdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZmlyc3QocHJlZGljYXRlLCByZXN1bHRTZWxlY3RvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgRmlyc3RPcGVyYXRvcihwcmVkaWNhdGUsIHJlc3VsdFNlbGVjdG9yLCBkZWZhdWx0VmFsdWUsIHRoaXMpKTtcbn1cbmV4cG9ydHMuZmlyc3QgPSBmaXJzdDtcbnZhciBGaXJzdE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaXJzdE9wZXJhdG9yKHByZWRpY2F0ZSwgcmVzdWx0U2VsZWN0b3IsIGRlZmF1bHRWYWx1ZSwgc291cmNlKSB7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgRmlyc3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChvYnNlcnZlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBGaXJzdFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnJlc3VsdFNlbGVjdG9yLCB0aGlzLmRlZmF1bHRWYWx1ZSwgdGhpcy5zb3VyY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBGaXJzdE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRmlyc3RTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmlyc3RTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpcnN0U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlLCByZXN1bHRTZWxlY3RvciwgZGVmYXVsdFZhbHVlLCBzb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lbWl0dGVkID0gZmFsc2U7XG4gICAgfVxuICAgIEZpcnN0U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleCsrO1xuICAgICAgICBpZiAodGhpcy5wcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyeVByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdCh2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBGaXJzdFN1YnNjcmliZXIucHJvdG90eXBlLl90cnlQcmVkaWNhdGUgPSBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdCh2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBGaXJzdFN1YnNjcmliZXIucHJvdG90eXBlLl9lbWl0ID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5yZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5fdHJ5UmVzdWx0U2VsZWN0b3IodmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0RmluYWwodmFsdWUpO1xuICAgIH07XG4gICAgRmlyc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5UmVzdWx0U2VsZWN0b3IgPSBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlc3VsdFNlbGVjdG9yKHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXRGaW5hbChyZXN1bHQpO1xuICAgIH07XG4gICAgRmlyc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fZW1pdEZpbmFsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlZCkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlZCA9IHRydWU7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZpcnN0U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICBpZiAoIXRoaXMuaGFzQ29tcGxldGVkICYmIHR5cGVvZiB0aGlzLmRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQodGhpcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5oYXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKG5ldyBFbXB0eUVycm9yXzEuRW1wdHlFcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBGaXJzdFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXJzdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9maXJzdC5qc1xuLy8gbW9kdWxlIGlkID0gNTNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  199. /***/ },
  200. /* 54 */
  201. /***/ function(module, exports) {
  202. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an Observable or a sequence was queried but has no\n * elements.\n *\n * @see {@link first}\n * @see {@link last}\n * @see {@link single}\n *\n * @class EmptyError\n */\nvar EmptyError = (function (_super) {\n __extends(EmptyError, _super);\n function EmptyError() {\n var err = _super.call(this, 'no elements in sequence');\n this.name = err.name = 'EmptyError';\n this.stack = err.stack;\n this.message = err.message;\n }\n return EmptyError;\n}(Error));\nexports.EmptyError = EmptyError;\n//# sourceMappingURL=EmptyError.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvdXRpbC9FbXB0eUVycm9yLmpzP2JhNWMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gYW4gT2JzZXJ2YWJsZSBvciBhIHNlcXVlbmNlIHdhcyBxdWVyaWVkIGJ1dCBoYXMgbm9cbiAqIGVsZW1lbnRzLlxuICpcbiAqIEBzZWUge0BsaW5rIGZpcnN0fVxuICogQHNlZSB7QGxpbmsgbGFzdH1cbiAqIEBzZWUge0BsaW5rIHNpbmdsZX1cbiAqXG4gKiBAY2xhc3MgRW1wdHlFcnJvclxuICovXG52YXIgRW1wdHlFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVtcHR5RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW1wdHlFcnJvcigpIHtcbiAgICAgICAgdmFyIGVyciA9IF9zdXBlci5jYWxsKHRoaXMsICdubyBlbGVtZW50cyBpbiBzZXF1ZW5jZScpO1xuICAgICAgICB0aGlzLm5hbWUgPSBlcnIubmFtZSA9ICdFbXB0eUVycm9yJztcbiAgICAgICAgdGhpcy5zdGFjayA9IGVyci5zdGFjaztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gZXJyLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBFbXB0eUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5FbXB0eUVycm9yID0gRW1wdHlFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVtcHR5RXJyb3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9FbXB0eUVycm9yLmpzXG4vLyBtb2R1bGUgaWQgPSA1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  203. /***/ },
  204. /* 55 */
  205. /***/ function(module, exports, __webpack_require__) {
  206. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * <span class=\"informal\">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.</span>\n *\n * <img src=\"./img/map.png\" width=\"100%\">\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example <caption>Map every every click to the clientX position of that click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable<R>} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nfunction map(project, thisArg) {\n if (typeof project !== 'function') {\n throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n }\n return this.lift(new MapOperator(project, thisArg));\n}\nexports.map = map;\nvar MapOperator = (function () {\n function MapOperator(project, thisArg) {\n this.project = project;\n this.thisArg = thisArg;\n }\n MapOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n };\n return MapOperator;\n}());\nexports.MapOperator = MapOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MapSubscriber = (function (_super) {\n __extends(MapSubscriber, _super);\n function MapSubscriber(destination, project, thisArg) {\n _super.call(this, destination);\n this.project = project;\n this.count = 0;\n this.thisArg = thisArg || this;\n }\n // NOTE: This looks unoptimized, but it's actually purposefully NOT\n // using try/catch optimizations.\n MapSubscriber.prototype._next = function (value) {\n var result;\n try {\n result = this.project.call(this.thisArg, value, this.count++);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n return MapSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=map.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvbWFwLmpzPzljZjgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIEFwcGxpZXMgYSBnaXZlbiBgcHJvamVjdGAgZnVuY3Rpb24gdG8gZWFjaCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUsIGFuZCBlbWl0cyB0aGUgcmVzdWx0aW5nIHZhbHVlcyBhcyBhbiBPYnNlcnZhYmxlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5MaWtlIFtBcnJheS5wcm90b3R5cGUubWFwKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCksXG4gKiBpdCBwYXNzZXMgZWFjaCBzb3VyY2UgdmFsdWUgdGhyb3VnaCBhIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRvIGdldFxuICogY29ycmVzcG9uZGluZyBvdXRwdXQgdmFsdWVzLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL21hcC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBTaW1pbGFyIHRvIHRoZSB3ZWxsIGtub3duIGBBcnJheS5wcm90b3R5cGUubWFwYCBmdW5jdGlvbiwgdGhpcyBvcGVyYXRvclxuICogYXBwbGllcyBhIHByb2plY3Rpb24gdG8gZWFjaCB2YWx1ZSBhbmQgZW1pdHMgdGhhdCBwcm9qZWN0aW9uIGluIHRoZSBvdXRwdXRcbiAqIE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+TWFwIGV2ZXJ5IGV2ZXJ5IGNsaWNrIHRvIHRoZSBjbGllbnRYIHBvc2l0aW9uIG9mIHRoYXQgY2xpY2s8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHBvc2l0aW9ucyA9IGNsaWNrcy5tYXAoZXYgPT4gZXYuY2xpZW50WCk7XG4gKiBwb3NpdGlvbnMuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIG1hcFRvfVxuICogQHNlZSB7QGxpbmsgcGx1Y2t9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCwgaW5kZXg6IG51bWJlcik6IFJ9IHByb2plY3QgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5XG4gKiB0byBlYWNoIGB2YWx1ZWAgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuIFRoZSBgaW5kZXhgIHBhcmFtZXRlciBpc1xuICogdGhlIG51bWJlciBgaWAgZm9yIHRoZSBpLXRoIGVtaXNzaW9uIHRoYXQgaGFzIGhhcHBlbmVkIHNpbmNlIHRoZVxuICogc3Vic2NyaXB0aW9uLCBzdGFydGluZyBmcm9tIHRoZSBudW1iZXIgYDBgLlxuICogQHBhcmFtIHthbnl9IFt0aGlzQXJnXSBBbiBvcHRpb25hbCBhcmd1bWVudCB0byBkZWZpbmUgd2hhdCBgdGhpc2AgaXMgaW4gdGhlXG4gKiBgcHJvamVjdGAgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFI+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgdHJhbnNmb3JtZWQgYnkgdGhlIGdpdmVuIGBwcm9qZWN0YCBmdW5jdGlvbi5cbiAqIEBtZXRob2QgbWFwXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykge1xuICAgIGlmICh0eXBlb2YgcHJvamVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE1hcE9wZXJhdG9yKHByb2plY3QsIHRoaXNBcmcpKTtcbn1cbmV4cG9ydHMubWFwID0gbWFwO1xudmFyIE1hcE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNYXBPcGVyYXRvcihwcm9qZWN0LCB0aGlzQXJnKSB7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgfVxuICAgIE1hcE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpO1xuICAgIH07XG4gICAgcmV0dXJuIE1hcE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuTWFwT3BlcmF0b3IgPSBNYXBPcGVyYXRvcjtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgTWFwU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1hcFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWFwU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJvamVjdCwgdGhpc0FyZykge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIE5PVEU6IFRoaXMgbG9va3MgdW5vcHRpbWl6ZWQsIGJ1dCBpdCdzIGFjdHVhbGx5IHB1cnBvc2VmdWxseSBOT1RcbiAgICAvLyB1c2luZyB0cnkvY2F0Y2ggb3B0aW1pemF0aW9ucy5cbiAgICBNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0LmNhbGwodGhpcy50aGlzQXJnLCB2YWx1ZSwgdGhpcy5jb3VudCsrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7XG4gICAgfTtcbiAgICByZXR1cm4gTWFwU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9tYXAuanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  207. /***/ },
  208. /* 56 */
  209. /***/ function(module, exports, __webpack_require__) {
  210. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns the\n * accumulated result when the source completes, given an optional seed value.\n *\n * <span class=\"informal\">Combines together all values emitted on the source,\n * using an accumulator function that knows how to join a new source value into\n * the accumulation from the past.</span>\n *\n * <img src=\"./img/reduce.png\" width=\"100%\">\n *\n * Like\n * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),\n * `reduce` applies an `accumulator` function against an accumulation and each\n * value of the source Observable (from the past) to reduce it to a single\n * value, emitted on the output Observable. Note that `reduce` will only emit\n * one value, only when the source Observable completes. It is equivalent to\n * applying operator {@link scan} followed by operator {@link last}.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events that happened in 5 seconds</caption>\n * var clicksInFiveSeconds = Rx.Observable.fromEvent(document, 'click')\n * .takeUntil(Rx.Observable.interval(5000));\n * var ones = clicksInFiveSeconds.mapTo(1);\n * var seed = 0;\n * var count = ones.reduce((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link count}\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link scan}\n *\n * @param {function(acc: R, value: T): R} accumulator The accumulator function\n * called on each source value.\n * @param {R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @return {Observable<R>} An Observable that emits a single value that is the\n * result of accumulating the values emitted by the source Observable.\n * @method reduce\n * @owner Observable\n */\nfunction reduce(accumulator, seed) {\n var hasSeed = false;\n // providing a seed of `undefined` *should* be valid and trigger\n // hasSeed! so don't use `seed !== undefined` checks!\n // For this reason, we have to check it here at the original call site\n // otherwise inside Operator/Subscriber we won't know if `undefined`\n // means they didn't provide anything or if they literally provided `undefined`\n if (arguments.length >= 2) {\n hasSeed = true;\n }\n return this.lift(new ReduceOperator(accumulator, seed, hasSeed));\n}\nexports.reduce = reduce;\nvar ReduceOperator = (function () {\n function ReduceOperator(accumulator, seed, hasSeed) {\n if (hasSeed === void 0) { hasSeed = false; }\n this.accumulator = accumulator;\n this.seed = seed;\n this.hasSeed = hasSeed;\n }\n ReduceOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ReduceSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n };\n return ReduceOperator;\n}());\nexports.ReduceOperator = ReduceOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ReduceSubscriber = (function (_super) {\n __extends(ReduceSubscriber, _super);\n function ReduceSubscriber(destination, accumulator, seed, hasSeed) {\n _super.call(this, destination);\n this.accumulator = accumulator;\n this.hasSeed = hasSeed;\n this.hasValue = false;\n this.acc = seed;\n }\n ReduceSubscriber.prototype._next = function (value) {\n if (this.hasValue || (this.hasValue = this.hasSeed)) {\n this._tryReduce(value);\n }\n else {\n this.acc = value;\n this.hasValue = true;\n }\n };\n ReduceSubscriber.prototype._tryReduce = function (value) {\n var result;\n try {\n result = this.accumulator(this.acc, value);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.acc = result;\n };\n ReduceSubscriber.prototype._complete = function () {\n if (this.hasValue || this.hasSeed) {\n this.destination.next(this.acc);\n }\n this.destination.complete();\n };\n return ReduceSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ReduceSubscriber = ReduceSubscriber;\n//# sourceMappingURL=reduce.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvcmVkdWNlLmpzP2IwMWIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogQXBwbGllcyBhbiBhY2N1bXVsYXRvciBmdW5jdGlvbiBvdmVyIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgYW5kIHJldHVybnMgdGhlXG4gKiBhY2N1bXVsYXRlZCByZXN1bHQgd2hlbiB0aGUgc291cmNlIGNvbXBsZXRlcywgZ2l2ZW4gYW4gb3B0aW9uYWwgc2VlZCB2YWx1ZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+Q29tYmluZXMgdG9nZXRoZXIgYWxsIHZhbHVlcyBlbWl0dGVkIG9uIHRoZSBzb3VyY2UsXG4gKiB1c2luZyBhbiBhY2N1bXVsYXRvciBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBqb2luIGEgbmV3IHNvdXJjZSB2YWx1ZSBpbnRvXG4gKiB0aGUgYWNjdW11bGF0aW9uIGZyb20gdGhlIHBhc3QuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvcmVkdWNlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIExpa2VcbiAqIFtBcnJheS5wcm90b3R5cGUucmVkdWNlKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZSksXG4gKiBgcmVkdWNlYCBhcHBsaWVzIGFuIGBhY2N1bXVsYXRvcmAgZnVuY3Rpb24gYWdhaW5zdCBhbiBhY2N1bXVsYXRpb24gYW5kIGVhY2hcbiAqIHZhbHVlIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSAoZnJvbSB0aGUgcGFzdCkgdG8gcmVkdWNlIGl0IHRvIGEgc2luZ2xlXG4gKiB2YWx1ZSwgZW1pdHRlZCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuIE5vdGUgdGhhdCBgcmVkdWNlYCB3aWxsIG9ubHkgZW1pdFxuICogb25lIHZhbHVlLCBvbmx5IHdoZW4gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGNvbXBsZXRlcy4gSXQgaXMgZXF1aXZhbGVudCB0b1xuICogYXBwbHlpbmcgb3BlcmF0b3Ige0BsaW5rIHNjYW59IGZvbGxvd2VkIGJ5IG9wZXJhdG9yIHtAbGluayBsYXN0fS5cbiAqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBhcHBsaWVzIGEgc3BlY2lmaWVkIGBhY2N1bXVsYXRvcmAgZnVuY3Rpb24gdG8gZWFjaFxuICogaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gSWYgYSBgc2VlZGAgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGVuXG4gKiB0aGF0IHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9yLiBJZiBubyBzZWVkXG4gKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBzb3VyY2UgaXMgdXNlZCBhcyB0aGUgc2VlZC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Db3VudCB0aGUgbnVtYmVyIG9mIGNsaWNrIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGluIDUgc2Vjb25kczwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3NJbkZpdmVTZWNvbmRzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpXG4gKiAgIC50YWtlVW50aWwoUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCg1MDAwKSk7XG4gKiB2YXIgb25lcyA9IGNsaWNrc0luRml2ZVNlY29uZHMubWFwVG8oMSk7XG4gKiB2YXIgc2VlZCA9IDA7XG4gKiB2YXIgY291bnQgPSBvbmVzLnJlZHVjZSgoYWNjLCBvbmUpID0+IGFjYyArIG9uZSwgc2VlZCk7XG4gKiBjb3VudC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY291bnR9XG4gKiBAc2VlIHtAbGluayBleHBhbmR9XG4gKiBAc2VlIHtAbGluayBtZXJnZVNjYW59XG4gKiBAc2VlIHtAbGluayBzY2FufVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oYWNjOiBSLCB2YWx1ZTogVCk6IFJ9IGFjY3VtdWxhdG9yIFRoZSBhY2N1bXVsYXRvciBmdW5jdGlvblxuICogY2FsbGVkIG9uIGVhY2ggc291cmNlIHZhbHVlLlxuICogQHBhcmFtIHtSfSBbc2VlZF0gVGhlIGluaXRpYWwgYWNjdW11bGF0aW9uIHZhbHVlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPn0gQW4gb2JzZXJ2YWJsZSBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgc2luZ2xlIHZhbHVlIHRoYXQgaXMgdGhlXG4gKiByZXN1bHQgb2YgYWNjdW11bGF0aW5nIHRoZSB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIHJlZHVjZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gcmVkdWNlKGFjY3VtdWxhdG9yLCBzZWVkKSB7XG4gICAgdmFyIGhhc1NlZWQgPSBmYWxzZTtcbiAgICAvLyBwcm92aWRpbmcgYSBzZWVkIG9mIGB1bmRlZmluZWRgICpzaG91bGQqIGJlIHZhbGlkIGFuZCB0cmlnZ2VyXG4gICAgLy8gaGFzU2VlZCEgc28gZG9uJ3QgdXNlIGBzZWVkICE9PSB1bmRlZmluZWRgIGNoZWNrcyFcbiAgICAvLyBGb3IgdGhpcyByZWFzb24sIHdlIGhhdmUgdG8gY2hlY2sgaXQgaGVyZSBhdCB0aGUgb3JpZ2luYWwgY2FsbCBzaXRlXG4gICAgLy8gb3RoZXJ3aXNlIGluc2lkZSBPcGVyYXRvci9TdWJzY3JpYmVyIHdlIHdvbid0IGtub3cgaWYgYHVuZGVmaW5lZGBcbiAgICAvLyBtZWFucyB0aGV5IGRpZG4ndCBwcm92aWRlIGFueXRoaW5nIG9yIGlmIHRoZXkgbGl0ZXJhbGx5IHByb3ZpZGVkIGB1bmRlZmluZWRgXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICBoYXNTZWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgUmVkdWNlT3BlcmF0b3IoYWNjdW11bGF0b3IsIHNlZWQsIGhhc1NlZWQpKTtcbn1cbmV4cG9ydHMucmVkdWNlID0gcmVkdWNlO1xudmFyIFJlZHVjZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWR1Y2VPcGVyYXRvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCkge1xuICAgICAgICBpZiAoaGFzU2VlZCA9PT0gdm9pZCAwKSB7IGhhc1NlZWQgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3I7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgfVxuICAgIFJlZHVjZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVkdWNlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmFjY3VtdWxhdG9yLCB0aGlzLnNlZWQsIHRoaXMuaGFzU2VlZCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlZHVjZU9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuUmVkdWNlT3BlcmF0b3IgPSBSZWR1Y2VPcGVyYXRvcjtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgUmVkdWNlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlZHVjZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVkdWNlU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgYWNjdW11bGF0b3IsIHNlZWQsIGhhc1NlZWQpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3I7XG4gICAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2MgPSBzZWVkO1xuICAgIH1cbiAgICBSZWR1Y2VTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSB8fCAodGhpcy5oYXNWYWx1ZSA9IHRoaXMuaGFzU2VlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyeVJlZHVjZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjYyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlZHVjZVN1YnNjcmliZXIucHJvdG90eXBlLl90cnlSZWR1Y2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWNjdW11bGF0b3IodGhpcy5hY2MsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY2MgPSByZXN1bHQ7XG4gICAgfTtcbiAgICBSZWR1Y2VTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlIHx8IHRoaXMuaGFzU2VlZCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHRoaXMuYWNjKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVkdWNlU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmV4cG9ydHMuUmVkdWNlU3Vic2NyaWJlciA9IFJlZHVjZVN1YnNjcmliZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcmVkdWNlLmpzXG4vLyBtb2R1bGUgaWQgPSA1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  211. /***/ },
  212. /* 57 */
  213. /***/ function(module, exports, __webpack_require__) {
  214. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n * is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n * is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} an observable that originates from either the source or the observable returned by the\n * catch `selector` function.\n * @method catch\n * @name catch\n * @owner Observable\n */\nfunction _catch(selector) {\n var operator = new CatchOperator(selector);\n var caught = this.lift(operator);\n return (operator.caught = caught);\n}\nexports._catch = _catch;\nvar CatchOperator = (function () {\n function CatchOperator(selector) {\n this.selector = selector;\n }\n CatchOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n };\n return CatchOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CatchSubscriber = (function (_super) {\n __extends(CatchSubscriber, _super);\n function CatchSubscriber(destination, selector, caught) {\n _super.call(this, destination);\n this.selector = selector;\n this.caught = caught;\n }\n // NOTE: overriding `error` instead of `_error` because we don't want\n // to have this flag this subscriber as `isStopped`.\n CatchSubscriber.prototype.error = function (err) {\n if (!this.isStopped) {\n var result = void 0;\n try {\n result = this.selector(err, this.caught);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.unsubscribe();\n this.destination.remove(this);\n subscribeToResult_1.subscribeToResult(this, result);\n }\n };\n return CatchSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=catch.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvY2F0Y2guanM/NzVjNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQ2F0Y2hlcyBlcnJvcnMgb24gdGhlIG9ic2VydmFibGUgdG8gYmUgaGFuZGxlZCBieSByZXR1cm5pbmcgYSBuZXcgb2JzZXJ2YWJsZSBvciB0aHJvd2luZyBhbiBlcnJvci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHNlbGVjdG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhcyBhcmd1bWVudHMgYGVycmAsIHdoaWNoIGlzIHRoZSBlcnJvciwgYW5kIGBjYXVnaHRgLCB3aGljaFxuICogIGlzIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSwgaW4gY2FzZSB5b3UnZCBsaWtlIHRvIFwicmV0cnlcIiB0aGF0IG9ic2VydmFibGUgYnkgcmV0dXJuaW5nIGl0IGFnYWluLiBXaGF0ZXZlciBvYnNlcnZhYmxlXG4gKiAgaXMgcmV0dXJuZWQgYnkgdGhlIGBzZWxlY3RvcmAgd2lsbCBiZSB1c2VkIHRvIGNvbnRpbnVlIHRoZSBvYnNlcnZhYmxlIGNoYWluLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gYW4gb2JzZXJ2YWJsZSB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgb2JzZXJ2YWJsZSByZXR1cm5lZCBieSB0aGVcbiAqICBjYXRjaCBgc2VsZWN0b3JgIGZ1bmN0aW9uLlxuICogQG1ldGhvZCBjYXRjaFxuICogQG5hbWUgY2F0Y2hcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIF9jYXRjaChzZWxlY3Rvcikge1xuICAgIHZhciBvcGVyYXRvciA9IG5ldyBDYXRjaE9wZXJhdG9yKHNlbGVjdG9yKTtcbiAgICB2YXIgY2F1Z2h0ID0gdGhpcy5saWZ0KG9wZXJhdG9yKTtcbiAgICByZXR1cm4gKG9wZXJhdG9yLmNhdWdodCA9IGNhdWdodCk7XG59XG5leHBvcnRzLl9jYXRjaCA9IF9jYXRjaDtcbnZhciBDYXRjaE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYXRjaE9wZXJhdG9yKHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG4gICAgQ2F0Y2hPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IENhdGNoU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNlbGVjdG9yLCB0aGlzLmNhdWdodCkpO1xuICAgIH07XG4gICAgcmV0dXJuIENhdGNoT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBDYXRjaFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYXRjaFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2F0Y2hTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBzZWxlY3RvciwgY2F1Z2h0KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB0aGlzLmNhdWdodCA9IGNhdWdodDtcbiAgICB9XG4gICAgLy8gTk9URTogb3ZlcnJpZGluZyBgZXJyb3JgIGluc3RlYWQgb2YgYF9lcnJvcmAgYmVjYXVzZSB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaGF2ZSB0aGlzIGZsYWcgdGhpcyBzdWJzY3JpYmVyIGFzIGBpc1N0b3BwZWRgLlxuICAgIENhdGNoU3Vic2NyaWJlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuc2VsZWN0b3IoZXJyLCB0aGlzLmNhdWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ucmVtb3ZlKHRoaXMpO1xuICAgICAgICAgICAgc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2F0Y2hTdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhdGNoLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2NhdGNoLmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  215. /***/ },
  216. /* 58 */
  217. /***/ function(module, exports, __webpack_require__) {
  218. eval("\"use strict\";\nvar mergeAll_1 = __webpack_require__(59);\n/* tslint:disable:max-line-length */\n/**\n * Converts a higher-order Observable into a first-order Observable by\n * concatenating the inner Observables in order.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by putting one\n * inner Observable after the other.</span>\n *\n * <img src=\"./img/concatAll.png\" width=\"100%\">\n *\n * Joins every Observable emitted by the source (a higher-order Observable), in\n * a serial fashion. It subscribes to each inner Observable only after the\n * previous inner Observable has completed, and merges all of their values into\n * the returned observable.\n *\n * __Warning:__ If the source Observable emits Observables quickly and\n * endlessly, and the inner Observables it emits generally complete slower than\n * the source emits, you can run into memory issues as the incoming Observables\n * collect in an unbounded buffer.\n *\n * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set\n * to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map(ev => Rx.Observable.interval(1000).take(4));\n * var firstOrder = higherOrder.concatAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link combineAll}\n * @see {@link concat}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n * @see {@link exhaust}\n * @see {@link mergeAll}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @return {Observable} An Observable emitting values from all the inner\n * Observables concatenated.\n * @method concatAll\n * @owner Observable\n */\nfunction concatAll() {\n return this.lift(new mergeAll_1.MergeAllOperator(1));\n}\nexports.concatAll = concatAll;\n//# sourceMappingURL=concatAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvY29uY2F0QWxsLmpzP2ZjNjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbWVyZ2VBbGxfMSA9IHJlcXVpcmUoJy4vbWVyZ2VBbGwnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBDb252ZXJ0cyBhIGhpZ2hlci1vcmRlciBPYnNlcnZhYmxlIGludG8gYSBmaXJzdC1vcmRlciBPYnNlcnZhYmxlIGJ5XG4gKiBjb25jYXRlbmF0aW5nIHRoZSBpbm5lciBPYnNlcnZhYmxlcyBpbiBvcmRlci5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+RmxhdHRlbnMgYW4gT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlcyBieSBwdXR0aW5nIG9uZVxuICogaW5uZXIgT2JzZXJ2YWJsZSBhZnRlciB0aGUgb3RoZXIuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvY29uY2F0QWxsLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEpvaW5zIGV2ZXJ5IE9ic2VydmFibGUgZW1pdHRlZCBieSB0aGUgc291cmNlIChhIGhpZ2hlci1vcmRlciBPYnNlcnZhYmxlKSwgaW5cbiAqIGEgc2VyaWFsIGZhc2hpb24uIEl0IHN1YnNjcmliZXMgdG8gZWFjaCBpbm5lciBPYnNlcnZhYmxlIG9ubHkgYWZ0ZXIgdGhlXG4gKiBwcmV2aW91cyBpbm5lciBPYnNlcnZhYmxlIGhhcyBjb21wbGV0ZWQsIGFuZCBtZXJnZXMgYWxsIG9mIHRoZWlyIHZhbHVlcyBpbnRvXG4gKiB0aGUgcmV0dXJuZWQgb2JzZXJ2YWJsZS5cbiAqXG4gKiBfX1dhcm5pbmc6X18gSWYgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGVtaXRzIE9ic2VydmFibGVzIHF1aWNrbHkgYW5kXG4gKiBlbmRsZXNzbHksIGFuZCB0aGUgaW5uZXIgT2JzZXJ2YWJsZXMgaXQgZW1pdHMgZ2VuZXJhbGx5IGNvbXBsZXRlIHNsb3dlciB0aGFuXG4gKiB0aGUgc291cmNlIGVtaXRzLCB5b3UgY2FuIHJ1biBpbnRvIG1lbW9yeSBpc3N1ZXMgYXMgdGhlIGluY29taW5nIE9ic2VydmFibGVzXG4gKiBjb2xsZWN0IGluIGFuIHVuYm91bmRlZCBidWZmZXIuXG4gKlxuICogTm90ZTogYGNvbmNhdEFsbGAgaXMgZXF1aXZhbGVudCB0byBgbWVyZ2VBbGxgIHdpdGggY29uY3VycmVuY3kgcGFyYW1ldGVyIHNldFxuICogdG8gYDFgLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkZvciBlYWNoIGNsaWNrIGV2ZW50LCB0aWNrIGV2ZXJ5IHNlY29uZCBmcm9tIDAgdG8gMywgd2l0aCBubyBjb25jdXJyZW5jeTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgaGlnaGVyT3JkZXIgPSBjbGlja3MubWFwKGV2ID0+IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCkudGFrZSg0KSk7XG4gKiB2YXIgZmlyc3RPcmRlciA9IGhpZ2hlck9yZGVyLmNvbmNhdEFsbCgpO1xuICogZmlyc3RPcmRlci5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gKHJlc3VsdHMgYXJlIG5vdCBjb25jdXJyZW50KVxuICogLy8gRm9yIGV2ZXJ5IGNsaWNrIG9uIHRoZSBcImRvY3VtZW50XCIgaXQgd2lsbCBlbWl0IHZhbHVlcyAwIHRvIDMgc3BhY2VkXG4gKiAvLyBvbiBhIDEwMDBtcyBpbnRlcnZhbFxuICogLy8gb25lIGNsaWNrID0gMTAwMG1zLT4gMCAtMTAwMG1zLT4gMSAtMTAwMG1zLT4gMiAtMTAwMG1zLT4gM1xuICpcbiAqIEBzZWUge0BsaW5rIGNvbWJpbmVBbGx9XG4gKiBAc2VlIHtAbGluayBjb25jYXR9XG4gKiBAc2VlIHtAbGluayBjb25jYXRNYXB9XG4gKiBAc2VlIHtAbGluayBjb25jYXRNYXBUb31cbiAqIEBzZWUge0BsaW5rIGV4aGF1c3R9XG4gKiBAc2VlIHtAbGluayBtZXJnZUFsbH1cbiAqIEBzZWUge0BsaW5rIHN3aXRjaH1cbiAqIEBzZWUge0BsaW5rIHppcEFsbH1cbiAqXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHZhbHVlcyBmcm9tIGFsbCB0aGUgaW5uZXJcbiAqIE9ic2VydmFibGVzIGNvbmNhdGVuYXRlZC5cbiAqIEBtZXRob2QgY29uY2F0QWxsXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBjb25jYXRBbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgbWVyZ2VBbGxfMS5NZXJnZUFsbE9wZXJhdG9yKDEpKTtcbn1cbmV4cG9ydHMuY29uY2F0QWxsID0gY29uY2F0QWxsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2F0QWxsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2NvbmNhdEFsbC5qc1xuLy8gbW9kdWxlIGlkID0gNThcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  219. /***/ },
  220. /* 59 */
  221. /***/ function(module, exports, __webpack_require__) {
  222. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables.</span>\n *\n * <img src=\"./img/mergeAll.png\" width=\"100%\">\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Spawn a new interval Observable for each click event, and blend their outputs as one Observable</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var firstOrder = higherOrder.mergeAll();\n * firstOrder.subscribe(x => console.log(x));\n *\n * @example <caption>Count from 0 to 9 every second for each click, but only allow 2 concurrent timers</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000).take(10));\n * var firstOrder = higherOrder.mergeAll(2);\n * firstOrder.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switch}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nfunction mergeAll(concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n return this.lift(new MergeAllOperator(concurrent));\n}\nexports.mergeAll = mergeAll;\nvar MergeAllOperator = (function () {\n function MergeAllOperator(concurrent) {\n this.concurrent = concurrent;\n }\n MergeAllOperator.prototype.call = function (observer, source) {\n return source.subscribe(new MergeAllSubscriber(observer, this.concurrent));\n };\n return MergeAllOperator;\n}());\nexports.MergeAllOperator = MergeAllOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeAllSubscriber = (function (_super) {\n __extends(MergeAllSubscriber, _super);\n function MergeAllSubscriber(destination, concurrent) {\n _super.call(this, destination);\n this.concurrent = concurrent;\n this.hasCompleted = false;\n this.buffer = [];\n this.active = 0;\n }\n MergeAllSubscriber.prototype._next = function (observable) {\n if (this.active < this.concurrent) {\n this.active++;\n this.add(subscribeToResult_1.subscribeToResult(this, observable));\n }\n else {\n this.buffer.push(observable);\n }\n };\n MergeAllSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete();\n }\n };\n MergeAllSubscriber.prototype.notifyComplete = function (innerSub) {\n var buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n }\n else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete();\n }\n };\n return MergeAllSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeAllSubscriber = MergeAllSubscriber;\n//# sourceMappingURL=mergeAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvbWVyZ2VBbGwuanM/MzQxYSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQ29udmVydHMgYSBoaWdoZXItb3JkZXIgT2JzZXJ2YWJsZSBpbnRvIGEgZmlyc3Qtb3JkZXIgT2JzZXJ2YWJsZSB3aGljaFxuICogY29uY3VycmVudGx5IGRlbGl2ZXJzIGFsbCB2YWx1ZXMgdGhhdCBhcmUgZW1pdHRlZCBvbiB0aGUgaW5uZXIgT2JzZXJ2YWJsZXMuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkZsYXR0ZW5zIGFuIE9ic2VydmFibGUtb2YtT2JzZXJ2YWJsZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbWVyZ2VBbGwucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYG1lcmdlQWxsYCBzdWJzY3JpYmVzIHRvIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBPYnNlcnZhYmxlcywgYWxzbyBrbm93biBhc1xuICogYSBoaWdoZXItb3JkZXIgT2JzZXJ2YWJsZS4gRWFjaCB0aW1lIGl0IG9ic2VydmVzIG9uZSBvZiB0aGVzZSBlbWl0dGVkIGlubmVyXG4gKiBPYnNlcnZhYmxlcywgaXQgc3Vic2NyaWJlcyB0byB0aGF0IGFuZCBkZWxpdmVycyBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZVxuICogaW5uZXIgT2JzZXJ2YWJsZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuIFRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBvbmx5XG4gKiBjb21wbGV0ZXMgb25jZSBhbGwgaW5uZXIgT2JzZXJ2YWJsZXMgaGF2ZSBjb21wbGV0ZWQuIEFueSBlcnJvciBkZWxpdmVyZWQgYnlcbiAqIGEgaW5uZXIgT2JzZXJ2YWJsZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGVtaXR0ZWQgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlNwYXduIGEgbmV3IGludGVydmFsIE9ic2VydmFibGUgZm9yIGVhY2ggY2xpY2sgZXZlbnQsIGFuZCBibGVuZCB0aGVpciBvdXRwdXRzIGFzIG9uZSBPYnNlcnZhYmxlPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBoaWdoZXJPcmRlciA9IGNsaWNrcy5tYXAoKGV2KSA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHZhciBmaXJzdE9yZGVyID0gaGlnaGVyT3JkZXIubWVyZ2VBbGwoKTtcbiAqIGZpcnN0T3JkZXIuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNvdW50IGZyb20gMCB0byA5IGV2ZXJ5IHNlY29uZCBmb3IgZWFjaCBjbGljaywgYnV0IG9ubHkgYWxsb3cgMiBjb25jdXJyZW50IHRpbWVyczwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgaGlnaGVyT3JkZXIgPSBjbGlja3MubWFwKChldikgPT4gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKS50YWtlKDEwKSk7XG4gKiB2YXIgZmlyc3RPcmRlciA9IGhpZ2hlck9yZGVyLm1lcmdlQWxsKDIpO1xuICogZmlyc3RPcmRlci5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29tYmluZUFsbH1cbiAqIEBzZWUge0BsaW5rIGNvbmNhdEFsbH1cbiAqIEBzZWUge0BsaW5rIGV4aGF1c3R9XG4gKiBAc2VlIHtAbGluayBtZXJnZX1cbiAqIEBzZWUge0BsaW5rIG1lcmdlTWFwfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VNYXBUb31cbiAqIEBzZWUge0BsaW5rIG1lcmdlU2Nhbn1cbiAqIEBzZWUge0BsaW5rIHN3aXRjaH1cbiAqIEBzZWUge0BsaW5rIHppcEFsbH1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmN1cnJlbnQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXSBNYXhpbXVtIG51bWJlciBvZiBpbm5lclxuICogT2JzZXJ2YWJsZXMgYmVpbmcgc3Vic2NyaWJlZCB0byBjb25jdXJyZW50bHkuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdmFsdWVzIGNvbWluZyBmcm9tIGFsbCB0aGVcbiAqIGlubmVyIE9ic2VydmFibGVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBtZXJnZUFsbFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE1lcmdlQWxsT3BlcmF0b3IoY29uY3VycmVudCkpO1xufVxuZXhwb3J0cy5tZXJnZUFsbCA9IG1lcmdlQWxsO1xudmFyIE1lcmdlQWxsT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lcmdlQWxsT3BlcmF0b3IoY29uY3VycmVudCkge1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgIH1cbiAgICBNZXJnZUFsbE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlQWxsU3Vic2NyaWJlcihvYnNlcnZlciwgdGhpcy5jb25jdXJyZW50KSk7XG4gICAgfTtcbiAgICByZXR1cm4gTWVyZ2VBbGxPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLk1lcmdlQWxsT3BlcmF0b3IgPSBNZXJnZUFsbE9wZXJhdG9yO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBNZXJnZUFsbFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNZXJnZUFsbFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWVyZ2VBbGxTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25jdXJyZW50KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIH1cbiAgICBNZXJnZUFsbFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKG9ic2VydmFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlIDwgdGhpcy5jb25jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSsrO1xuICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBvYnNlcnZhYmxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKG9ic2VydmFibGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNZXJnZUFsbFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgPT09IDAgJiYgdGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lcmdlQWxsU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLnJlbW92ZShpbm5lclN1Yik7XG4gICAgICAgIHRoaXMuYWN0aXZlLS07XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dChidWZmZXIuc2hpZnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY3RpdmUgPT09IDAgJiYgdGhpcy5oYXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lcmdlQWxsU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnRzLk1lcmdlQWxsU3Vic2NyaWJlciA9IE1lcmdlQWxsU3Vic2NyaWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlQWxsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL21lcmdlQWxsLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  223. /***/ },
  224. /* 60 */
  225. /***/ function(module, exports, __webpack_require__) {
  226. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar EmptyError_1 = __webpack_require__(54);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits only the last item emitted by the source Observable.\n * It optionally takes a predicate function as a parameter, in which case, rather than emitting\n * the last item from the source Observable, the resulting Observable will emit the last item\n * from the source Observable that satisfies the predicate.\n *\n * <img src=\"./img/last.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {function} predicate - the condition any source emitted item has to satisfy.\n * @return {Observable} an Observable that emits only the last item satisfying the given condition\n * from the source, or an NoSuchElementException if no such items are emitted.\n * @throws - Throws if no items that match the predicate are emitted by the source Observable.\n * @method last\n * @owner Observable\n */\nfunction last(predicate, resultSelector, defaultValue) {\n return this.lift(new LastOperator(predicate, resultSelector, defaultValue, this));\n}\nexports.last = last;\nvar LastOperator = (function () {\n function LastOperator(predicate, resultSelector, defaultValue, source) {\n this.predicate = predicate;\n this.resultSelector = resultSelector;\n this.defaultValue = defaultValue;\n this.source = source;\n }\n LastOperator.prototype.call = function (observer, source) {\n return source.subscribe(new LastSubscriber(observer, this.predicate, this.resultSelector, this.defaultValue, this.source));\n };\n return LastOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar LastSubscriber = (function (_super) {\n __extends(LastSubscriber, _super);\n function LastSubscriber(destination, predicate, resultSelector, defaultValue, source) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.resultSelector = resultSelector;\n this.defaultValue = defaultValue;\n this.source = source;\n this.hasValue = false;\n this.index = 0;\n if (typeof defaultValue !== 'undefined') {\n this.lastValue = defaultValue;\n this.hasValue = true;\n }\n }\n LastSubscriber.prototype._next = function (value) {\n var index = this.index++;\n if (this.predicate) {\n this._tryPredicate(value, index);\n }\n else {\n if (this.resultSelector) {\n this._tryResultSelector(value, index);\n return;\n }\n this.lastValue = value;\n this.hasValue = true;\n }\n };\n LastSubscriber.prototype._tryPredicate = function (value, index) {\n var result;\n try {\n result = this.predicate(value, index, this.source);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n if (this.resultSelector) {\n this._tryResultSelector(value, index);\n return;\n }\n this.lastValue = value;\n this.hasValue = true;\n }\n };\n LastSubscriber.prototype._tryResultSelector = function (value, index) {\n var result;\n try {\n result = this.resultSelector(value, index);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.lastValue = result;\n this.hasValue = true;\n };\n LastSubscriber.prototype._complete = function () {\n var destination = this.destination;\n if (this.hasValue) {\n destination.next(this.lastValue);\n destination.complete();\n }\n else {\n destination.error(new EmptyError_1.EmptyError);\n }\n };\n return LastSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=last.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvbGFzdC5qcz80ZTYwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmUoJy4uL3V0aWwvRW1wdHlFcnJvcicpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG9ubHkgdGhlIGxhc3QgaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEl0IG9wdGlvbmFsbHkgdGFrZXMgYSBwcmVkaWNhdGUgZnVuY3Rpb24gYXMgYSBwYXJhbWV0ZXIsIGluIHdoaWNoIGNhc2UsIHJhdGhlciB0aGFuIGVtaXR0aW5nXG4gKiB0aGUgbGFzdCBpdGVtIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCB0aGUgcmVzdWx0aW5nIE9ic2VydmFibGUgd2lsbCBlbWl0IHRoZSBsYXN0IGl0ZW1cbiAqIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHRoYXQgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9sYXN0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEB0aHJvd3Mge0VtcHR5RXJyb3J9IERlbGl2ZXJzIGFuIEVtcHR5RXJyb3IgdG8gdGhlIE9ic2VydmVyJ3MgYGVycm9yYFxuICogY2FsbGJhY2sgaWYgdGhlIE9ic2VydmFibGUgY29tcGxldGVzIGJlZm9yZSBhbnkgYG5leHRgIG5vdGlmaWNhdGlvbiB3YXMgc2VudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHByZWRpY2F0ZSAtIHRoZSBjb25kaXRpb24gYW55IHNvdXJjZSBlbWl0dGVkIGl0ZW0gaGFzIHRvIHNhdGlzZnkuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgb25seSB0aGUgbGFzdCBpdGVtIHNhdGlzZnlpbmcgdGhlIGdpdmVuIGNvbmRpdGlvblxuICogZnJvbSB0aGUgc291cmNlLCBvciBhbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIG5vIHN1Y2ggaXRlbXMgYXJlIGVtaXR0ZWQuXG4gKiBAdGhyb3dzIC0gVGhyb3dzIGlmIG5vIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZSBhcmUgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIGxhc3RcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGxhc3QocHJlZGljYXRlLCByZXN1bHRTZWxlY3RvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgTGFzdE9wZXJhdG9yKHByZWRpY2F0ZSwgcmVzdWx0U2VsZWN0b3IsIGRlZmF1bHRWYWx1ZSwgdGhpcykpO1xufVxuZXhwb3J0cy5sYXN0ID0gbGFzdDtcbnZhciBMYXN0T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExhc3RPcGVyYXRvcihwcmVkaWNhdGUsIHJlc3VsdFNlbGVjdG9yLCBkZWZhdWx0VmFsdWUsIHNvdXJjZSkge1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIExhc3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChvYnNlcnZlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBMYXN0U3Vic2NyaWJlcihvYnNlcnZlciwgdGhpcy5wcmVkaWNhdGUsIHRoaXMucmVzdWx0U2VsZWN0b3IsIHRoaXMuZGVmYXVsdFZhbHVlLCB0aGlzLnNvdXJjZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIExhc3RPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIExhc3RTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTGFzdFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGFzdFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByZWRpY2F0ZSwgcmVzdWx0U2VsZWN0b3IsIGRlZmF1bHRWYWx1ZSwgc291cmNlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgTGFzdFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXgrKztcbiAgICAgICAgaWYgKHRoaXMucHJlZGljYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl90cnlQcmVkaWNhdGUodmFsdWUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJ5UmVzdWx0U2VsZWN0b3IodmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExhc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5UHJlZGljYXRlID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUodmFsdWUsIGluZGV4LCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJ5UmVzdWx0U2VsZWN0b3IodmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExhc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5UmVzdWx0U2VsZWN0b3IgPSBmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlc3VsdFNlbGVjdG9yKHZhbHVlLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gcmVzdWx0O1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9O1xuICAgIExhc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHRoaXMubGFzdFZhbHVlKTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihuZXcgRW1wdHlFcnJvcl8xLkVtcHR5RXJyb3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTGFzdFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2xhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  227. /***/ },
  228. /* 61 */
  229. /***/ function(module, exports, __webpack_require__) {
  230. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * <span class=\"informal\">Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.</span>\n *\n * <img src=\"./img/filter.png\" width=\"100%\">\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example <caption>Emit only click events whose target was a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nfunction filter(predicate, thisArg) {\n return this.lift(new FilterOperator(predicate, thisArg));\n}\nexports.filter = filter;\nvar FilterOperator = (function () {\n function FilterOperator(predicate, thisArg) {\n this.predicate = predicate;\n this.thisArg = thisArg;\n }\n FilterOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n };\n return FilterOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FilterSubscriber = (function (_super) {\n __extends(FilterSubscriber, _super);\n function FilterSubscriber(destination, predicate, thisArg) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.thisArg = thisArg;\n this.count = 0;\n this.predicate = predicate;\n }\n // the try catch block below is left specifically for\n // optimization and perf reasons. a tryCatcher is not necessary here.\n FilterSubscriber.prototype._next = function (value) {\n var result;\n try {\n result = this.predicate.call(this.thisArg, value, this.count++);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n this.destination.next(value);\n }\n };\n return FilterSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=filter.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3J4anMvb3BlcmF0b3IvZmlsdGVyLmpzPzBjYjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogRmlsdGVyIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGJ5IG9ubHkgZW1pdHRpbmcgdGhvc2UgdGhhdFxuICogc2F0aXNmeSBhIHNwZWNpZmllZCBwcmVkaWNhdGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkxpa2VcbiAqIFtBcnJheS5wcm90b3R5cGUuZmlsdGVyKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlciksXG4gKiBpdCBvbmx5IGVtaXRzIGEgdmFsdWUgZnJvbSB0aGUgc291cmNlIGlmIGl0IHBhc3NlcyBhIGNyaXRlcmlvbiBmdW5jdGlvbi48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9maWx0ZXIucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogU2ltaWxhciB0byB0aGUgd2VsbC1rbm93biBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kLCB0aGlzIG9wZXJhdG9yXG4gKiB0YWtlcyB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUsIHBhc3NlcyB0aGVtIHRocm91Z2ggYSBgcHJlZGljYXRlYFxuICogZnVuY3Rpb24gYW5kIG9ubHkgZW1pdHMgdGhvc2UgdmFsdWVzIHRoYXQgeWllbGRlZCBgdHJ1ZWAuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCBvbmx5IGNsaWNrIGV2ZW50cyB3aG9zZSB0YXJnZXQgd2FzIGEgRElWIGVsZW1lbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIGNsaWNrc09uRGl2cyA9IGNsaWNrcy5maWx0ZXIoZXYgPT4gZXYudGFyZ2V0LnRhZ05hbWUgPT09ICdESVYnKTtcbiAqIGNsaWNrc09uRGl2cy5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgZGlzdGluY3R9XG4gKiBAc2VlIHtAbGluayBkaXN0aW5jdFVudGlsQ2hhbmdlZH1cbiAqIEBzZWUge0BsaW5rIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkfVxuICogQHNlZSB7QGxpbmsgaWdub3JlRWxlbWVudHN9XG4gKiBAc2VlIHtAbGluayBwYXJ0aXRpb259XG4gKiBAc2VlIHtAbGluayBza2lwfVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24odmFsdWU6IFQsIGluZGV4OiBudW1iZXIpOiBib29sZWFufSBwcmVkaWNhdGUgQSBmdW5jdGlvbiB0aGF0XG4gKiBldmFsdWF0ZXMgZWFjaCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gSWYgaXQgcmV0dXJucyBgdHJ1ZWAsXG4gKiB0aGUgdmFsdWUgaXMgZW1pdHRlZCwgaWYgYGZhbHNlYCB0aGUgdmFsdWUgaXMgbm90IHBhc3NlZCB0byB0aGUgb3V0cHV0XG4gKiBPYnNlcnZhYmxlLiBUaGUgYGluZGV4YCBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBgaWAgZm9yIHRoZSBpLXRoIHNvdXJjZVxuICogZW1pc3Npb24gdGhhdCBoYXMgaGFwcGVuZWQgc2luY2UgdGhlIHN1YnNjcmlwdGlvbiwgc3RhcnRpbmcgZnJvbSB0aGUgbnVtYmVyXG4gKiBgMGAuXG4gKiBAcGFyYW0ge2FueX0gW3RoaXNBcmddIEFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgYHRoaXNgXG4gKiBpbiB0aGUgYHByZWRpY2F0ZWAgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIG9mIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2UgdGhhdCB3ZXJlXG4gKiBhbGxvd2VkIGJ5IHRoZSBgcHJlZGljYXRlYCBmdW5jdGlvbi5cbiAqIEBtZXRob2QgZmlsdGVyXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgRmlsdGVyT3BlcmF0b3IocHJlZGljYXRlLCB0aGlzQXJnKSk7XG59XG5leHBvcnRzLmZpbHRlciA9IGZpbHRlcjtcbnZhciBGaWx0ZXJPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmlsdGVyT3BlcmF0b3IocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnO1xuICAgIH1cbiAgICBGaWx0ZXJPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbHRlclN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcmVkaWNhdGUsIHRoaXMudGhpc0FyZykpO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbHRlck9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRmlsdGVyU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpbHRlclN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmlsdGVyU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICB9XG4gICAgLy8gdGhlIHRyeSBjYXRjaCBibG9jayBiZWxvdyBpcyBsZWZ0IHNwZWNpZmljYWxseSBmb3JcbiAgICAvLyBvcHRpbWl6YXRpb24gYW5kIHBlcmYgcmVhc29ucy4gYSB0cnlDYXRjaGVyIGlzIG5vdCBuZWNlc3NhcnkgaGVyZS5cbiAgICBGaWx0ZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUuY2FsbCh0aGlzLnRoaXNBcmcsIHZhbHVlLCB0aGlzLmNvdW50KyspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRmlsdGVyU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbHRlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9maWx0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  231. /***/ },
  232. /* 62 */,
  233. /* 63 */,
  234. /* 64 */,
  235. /* 65 */,
  236. /* 66 */,
  237. /* 67 */,
  238. /* 68 */,
  239. /* 69 */,
  240. /* 70 */,
  241. /* 71 */,
  242. /* 72 */,
  243. /* 73 */,
  244. /* 74 */,
  245. /* 75 */,
  246. /* 76 */,
  247. /* 77 */,
  248. /* 78 */,
  249. /* 79 */,
  250. /* 80 */,
  251. /* 81 */,
  252. /* 82 */
  253. /***/ function(module, exports, __webpack_require__) {
  254. eval("var apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(83);\nexports.setImmediate = setImmediate;\nexports.clearImmediate = clearImmediate;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3RpbWVycy1icm93c2VyaWZ5L21haW4uanM/YjA4OCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG5leHBvcnRzLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi90aW1lcnMtYnJvd3NlcmlmeS9tYWluLmpzXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");
  255. /***/ },
  256. /* 83 */
  257. /***/ function(module, exports, __webpack_require__) {
  258. eval("/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement(\"script\");\n script.onreadystatechange = function () {\n runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n };\n }\n\n function installSetTimeoutImplementation() {\n registerImmediate = function(handle) {\n setTimeout(runIfPresent, 0, handle);\n };\n }\n\n // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n // Don't get fooled by e.g. browserify environments.\n if ({}.toString.call(global.process) === \"[object process]\") {\n // For Node.js before 0.9\n installNextTickImplementation();\n\n } else if (canUsePostMessage()) {\n // For non-IE10 modern browsers\n installPostMessageImplementation();\n\n } else if (global.MessageChannel) {\n // For web workers, where supported\n installMessageChannelImplementation();\n\n } else if (doc && \"onreadystatechange\" in doc.createElement(\"script\")) {\n // For IE 6–8\n installReadyStateChangeImplementation();\n\n } else {\n // For older browsers\n installSetTimeoutImplementation();\n }\n\n attachTo.setImmediate = setImmediate;\n attachTo.clearImmediate = clearImmediate;\n}(typeof self === \"undefined\" ? typeof global === \"undefined\" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(1)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanM/NGE4MCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  259. /***/ },
  260. /* 84 */,
  261. /* 85 */,
  262. /* 86 */,
  263. /* 87 */,
  264. /* 88 */,
  265. /* 89 */,
  266. /* 90 */,
  267. /* 91 */,
  268. /* 92 */,
  269. /* 93 */,
  270. /* 94 */,
  271. /* 95 */,
  272. /* 96 */,
  273. /* 97 */,
  274. /* 98 */,
  275. /* 99 */,
  276. /* 100 */,
  277. /* 101 */,
  278. /* 102 */,
  279. /* 103 */,
  280. /* 104 */,
  281. /* 105 */,
  282. /* 106 */,
  283. /* 107 */,
  284. /* 108 */,
  285. /* 109 */,
  286. /* 110 */,
  287. /* 111 */,
  288. /* 112 */,
  289. /* 113 */,
  290. /* 114 */,
  291. /* 115 */,
  292. /* 116 */,
  293. /* 117 */,
  294. /* 118 */,
  295. /* 119 */,
  296. /* 120 */,
  297. /* 121 */,
  298. /* 122 */,
  299. /* 123 */,
  300. /* 124 */,
  301. /* 125 */,
  302. /* 126 */,
  303. /* 127 */,
  304. /* 128 */,
  305. /* 129 */,
  306. /* 130 */,
  307. /* 131 */,
  308. /* 132 */,
  309. /* 133 */,
  310. /* 134 */,
  311. /* 135 */,
  312. /* 136 */,
  313. /* 137 */,
  314. /* 138 */,
  315. /* 139 */,
  316. /* 140 */,
  317. /* 141 */,
  318. /* 142 */,
  319. /* 143 */,
  320. /* 144 */,
  321. /* 145 */,
  322. /* 146 */,
  323. /* 147 */,
  324. /* 148 */,
  325. /* 149 */,
  326. /* 150 */,
  327. /* 151 */,
  328. /* 152 */,
  329. /* 153 */,
  330. /* 154 */,
  331. /* 155 */,
  332. /* 156 */,
  333. /* 157 */,
  334. /* 158 */,
  335. /* 159 */,
  336. /* 160 */,
  337. /* 161 */,
  338. /* 162 */,
  339. /* 163 */,
  340. /* 164 */,
  341. /* 165 */,
  342. /* 166 */,
  343. /* 167 */,
  344. /* 168 */,
  345. /* 169 */,
  346. /* 170 */,
  347. /* 171 */,
  348. /* 172 */,
  349. /* 173 */,
  350. /* 174 */,
  351. /* 175 */,
  352. /* 176 */,
  353. /* 177 */,
  354. /* 178 */,
  355. /* 179 */,
  356. /* 180 */,
  357. /* 181 */,
  358. /* 182 */,
  359. /* 183 */,
  360. /* 184 */,
  361. /* 185 */,
  362. /* 186 */,
  363. /* 187 */,
  364. /* 188 */,
  365. /* 189 */,
  366. /* 190 */,
  367. /* 191 */,
  368. /* 192 */,
  369. /* 193 */,
  370. /* 194 */,
  371. /* 195 */,
  372. /* 196 */,
  373. /* 197 */,
  374. /* 198 */,
  375. /* 199 */,
  376. /* 200 */,
  377. /* 201 */,
  378. /* 202 */,
  379. /* 203 */,
  380. /* 204 */,
  381. /* 205 */,
  382. /* 206 */,
  383. /* 207 */,
  384. /* 208 */,
  385. /* 209 */,
  386. /* 210 */,
  387. /* 211 */,
  388. /* 212 */,
  389. /* 213 */,
  390. /* 214 */,
  391. /* 215 */,
  392. /* 216 */,
  393. /* 217 */,
  394. /* 218 */,
  395. /* 219 */,
  396. /* 220 */,
  397. /* 221 */,
  398. /* 222 */,
  399. /* 223 */,
  400. /* 224 */,
  401. /* 225 */,
  402. /* 226 */,
  403. /* 227 */,
  404. /* 228 */,
  405. /* 229 */,
  406. /* 230 */,
  407. /* 231 */,
  408. /* 232 */,
  409. /* 233 */,
  410. /* 234 */,
  411. /* 235 */,
  412. /* 236 */,
  413. /* 237 */,
  414. /* 238 */,
  415. /* 239 */,
  416. /* 240 */,
  417. /* 241 */,
  418. /* 242 */,
  419. /* 243 */,
  420. /* 244 */,
  421. /* 245 */,
  422. /* 246 */,
  423. /* 247 */,
  424. /* 248 */,
  425. /* 249 */,
  426. /* 250 */,
  427. /* 251 */,
  428. /* 252 */,
  429. /* 253 */,
  430. /* 254 */,
  431. /* 255 */,
  432. /* 256 */,
  433. /* 257 */,
  434. /* 258 */,
  435. /* 259 */,
  436. /* 260 */,
  437. /* 261 */,
  438. /* 262 */,
  439. /* 263 */,
  440. /* 264 */,
  441. /* 265 */,
  442. /* 266 */,
  443. /* 267 */,
  444. /* 268 */,
  445. /* 269 */,
  446. /* 270 */,
  447. /* 271 */,
  448. /* 272 */,
  449. /* 273 */,
  450. /* 274 */,
  451. /* 275 */,
  452. /* 276 */,
  453. /* 277 */,
  454. /* 278 */,
  455. /* 279 */,
  456. /* 280 */,
  457. /* 281 */,
  458. /* 282 */,
  459. /* 283 */,
  460. /* 284 */,
  461. /* 285 */,
  462. /* 286 */,
  463. /* 287 */,
  464. /* 288 */,
  465. /* 289 */,
  466. /* 290 */,
  467. /* 291 */,
  468. /* 292 */,
  469. /* 293 */,
  470. /* 294 */,
  471. /* 295 */,
  472. /* 296 */,
  473. /* 297 */,
  474. /* 298 */,
  475. /* 299 */,
  476. /* 300 */,
  477. /* 301 */,
  478. /* 302 */,
  479. /* 303 */,
  480. /* 304 */,
  481. /* 305 */,
  482. /* 306 */,
  483. /* 307 */,
  484. /* 308 */,
  485. /* 309 */,
  486. /* 310 */,
  487. /* 311 */,
  488. /* 312 */,
  489. /* 313 */,
  490. /* 314 */,
  491. /* 315 */,
  492. /* 316 */,
  493. /* 317 */,
  494. /* 318 */,
  495. /* 319 */,
  496. /* 320 */,
  497. /* 321 */,
  498. /* 322 */,
  499. /* 323 */,
  500. /* 324 */,
  501. /* 325 */,
  502. /* 326 */,
  503. /* 327 */,
  504. /* 328 */,
  505. /* 329 */,
  506. /* 330 */,
  507. /* 331 */,
  508. /* 332 */,
  509. /* 333 */,
  510. /* 334 */,
  511. /* 335 */,
  512. /* 336 */,
  513. /* 337 */,
  514. /* 338 */,
  515. /* 339 */,
  516. /* 340 */,
  517. /* 341 */,
  518. /* 342 */,
  519. /* 343 */,
  520. /* 344 */,
  521. /* 345 */,
  522. /* 346 */,
  523. /* 347 */,
  524. /* 348 */,
  525. /* 349 */,
  526. /* 350 */,
  527. /* 351 */,
  528. /* 352 */,
  529. /* 353 */,
  530. /* 354 */,
  531. /* 355 */,
  532. /* 356 */,
  533. /* 357 */,
  534. /* 358 */,
  535. /* 359 */,
  536. /* 360 */,
  537. /* 361 */,
  538. /* 362 */,
  539. /* 363 */,
  540. /* 364 */,
  541. /* 365 */,
  542. /* 366 */,
  543. /* 367 */,
  544. /* 368 */,
  545. /* 369 */,
  546. /* 370 */,
  547. /* 371 */,
  548. /* 372 */,
  549. /* 373 */,
  550. /* 374 */
  551. /***/ function(module, exports, __webpack_require__) {
  552. eval("/**\n * @license Angular v2.4.1\n * (c) 2010-2016 Google, Inc. https://angular.io/\n * License: MIT\n */\n(function (global, factory) {\n true ? factory(exports, __webpack_require__(4), __webpack_require__(6), __webpack_require__(22)) :\n typeof define === 'function' && define.amd ? define(['exports', '@angular/core', 'rxjs/Observable', '@angular/platform-browser'], factory) :\n (factory((global.ng = global.ng || {}, global.ng.http = global.ng.http || {}),global.ng.core,global.Rx,global.ng.platformBrowser));\n}(this, function (exports,_angular_core,rxjs_Observable,_angular_platformBrowser) { 'use strict';\n\n /**\n * A backend for http that uses the `XMLHttpRequest` browser API.\n * *\n * Take care not to evaluate this in non-browser contexts.\n * *\n */\n var BrowserXhr = (function () {\n function BrowserXhr() {\n }\n /**\n * @return {?}\n */\n BrowserXhr.prototype.build = function () { return ((new XMLHttpRequest())); };\n BrowserXhr.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n BrowserXhr.ctorParameters = function () { return []; };\n return BrowserXhr;\n }());\n\n var RequestMethod = {};\n RequestMethod.Get = 0;\n RequestMethod.Post = 1;\n RequestMethod.Put = 2;\n RequestMethod.Delete = 3;\n RequestMethod.Options = 4;\n RequestMethod.Head = 5;\n RequestMethod.Patch = 6;\n RequestMethod[RequestMethod.Get] = \"Get\";\n RequestMethod[RequestMethod.Post] = \"Post\";\n RequestMethod[RequestMethod.Put] = \"Put\";\n RequestMethod[RequestMethod.Delete] = \"Delete\";\n RequestMethod[RequestMethod.Options] = \"Options\";\n RequestMethod[RequestMethod.Head] = \"Head\";\n RequestMethod[RequestMethod.Patch] = \"Patch\";\n var ReadyState = {};\n ReadyState.Unsent = 0;\n ReadyState.Open = 1;\n ReadyState.HeadersReceived = 2;\n ReadyState.Loading = 3;\n ReadyState.Done = 4;\n ReadyState.Cancelled = 5;\n ReadyState[ReadyState.Unsent] = \"Unsent\";\n ReadyState[ReadyState.Open] = \"Open\";\n ReadyState[ReadyState.HeadersReceived] = \"HeadersReceived\";\n ReadyState[ReadyState.Loading] = \"Loading\";\n ReadyState[ReadyState.Done] = \"Done\";\n ReadyState[ReadyState.Cancelled] = \"Cancelled\";\n var ResponseType = {};\n ResponseType.Basic = 0;\n ResponseType.Cors = 1;\n ResponseType.Default = 2;\n ResponseType.Error = 3;\n ResponseType.Opaque = 4;\n ResponseType[ResponseType.Basic] = \"Basic\";\n ResponseType[ResponseType.Cors] = \"Cors\";\n ResponseType[ResponseType.Default] = \"Default\";\n ResponseType[ResponseType.Error] = \"Error\";\n ResponseType[ResponseType.Opaque] = \"Opaque\";\n var ContentType = {};\n ContentType.NONE = 0;\n ContentType.JSON = 1;\n ContentType.FORM = 2;\n ContentType.FORM_DATA = 3;\n ContentType.TEXT = 4;\n ContentType.BLOB = 5;\n ContentType.ARRAY_BUFFER = 6;\n ContentType[ContentType.NONE] = \"NONE\";\n ContentType[ContentType.JSON] = \"JSON\";\n ContentType[ContentType.FORM] = \"FORM\";\n ContentType[ContentType.FORM_DATA] = \"FORM_DATA\";\n ContentType[ContentType.TEXT] = \"TEXT\";\n ContentType[ContentType.BLOB] = \"BLOB\";\n ContentType[ContentType.ARRAY_BUFFER] = \"ARRAY_BUFFER\";\n var ResponseContentType = {};\n ResponseContentType.Text = 0;\n ResponseContentType.Json = 1;\n ResponseContentType.ArrayBuffer = 2;\n ResponseContentType.Blob = 3;\n ResponseContentType[ResponseContentType.Text] = \"Text\";\n ResponseContentType[ResponseContentType.Json] = \"Json\";\n ResponseContentType[ResponseContentType.ArrayBuffer] = \"ArrayBuffer\";\n ResponseContentType[ResponseContentType.Blob] = \"Blob\";\n\n /**\n * Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as\n * specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).\n * *\n * The only known difference between this `Headers` implementation and the spec is the\n * lack of an `entries` method.\n * *\n * ### Example\n * *\n * ```\n * import {Headers} from '@angular/http';\n * *\n * var firstHeaders = new Headers();\n * firstHeaders.append('Content-Type', 'image/jpeg');\n * console.log(firstHeaders.get('Content-Type')) //'image/jpeg'\n * *\n * // Create headers from Plain Old JavaScript Object\n * var secondHeaders = new Headers({\n * 'X-My-Custom-Header': 'Angular'\n * });\n * console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'\n * *\n * var thirdHeaders = new Headers(secondHeaders);\n * console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'\n * ```\n * *\n */\n var Headers = (function () {\n /**\n * @param {?=} headers\n */\n function Headers(headers) {\n var _this = this;\n /** @internal header names are lower case */\n this._headers = new Map();\n /** @internal map lower case names to actual names */\n this._normalizedNames = new Map();\n if (!headers) {\n return;\n }\n if (headers instanceof Headers) {\n headers.forEach(function (values, name) {\n values.forEach(function (value) { return _this.append(name, value); });\n });\n return;\n }\n Object.keys(headers).forEach(function (name) {\n var values = Array.isArray(headers[name]) ? headers[name] : [headers[name]];\n _this.delete(name);\n values.forEach(function (value) { return _this.append(name, value); });\n });\n }\n /**\n * Returns a new Headers instance from the given DOMString of Response Headers\n * @param {?} headersString\n * @return {?}\n */\n Headers.fromResponseHeaderString = function (headersString) {\n var /** @type {?} */ headers = new Headers();\n headersString.split('\\n').forEach(function (line) {\n var /** @type {?} */ index = line.indexOf(':');\n if (index > 0) {\n var /** @type {?} */ name_1 = line.slice(0, index);\n var /** @type {?} */ value = line.slice(index + 1).trim();\n headers.set(name_1, value);\n }\n });\n return headers;\n };\n /**\n * Appends a header to existing list of header values for a given header name.\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n Headers.prototype.append = function (name, value) {\n var /** @type {?} */ values = this.getAll(name);\n if (values === null) {\n this.set(name, value);\n }\n else {\n values.push(value);\n }\n };\n /**\n * Deletes all header values for the given name.\n * @param {?} name\n * @return {?}\n */\n Headers.prototype.delete = function (name) {\n var /** @type {?} */ lcName = name.toLowerCase();\n this._normalizedNames.delete(lcName);\n this._headers.delete(lcName);\n };\n /**\n * @param {?} fn\n * @return {?}\n */\n Headers.prototype.forEach = function (fn) {\n var _this = this;\n this._headers.forEach(function (values, lcName) { return fn(values, _this._normalizedNames.get(lcName), _this._headers); });\n };\n /**\n * Returns first header that matches given name.\n * @param {?} name\n * @return {?}\n */\n Headers.prototype.get = function (name) {\n var /** @type {?} */ values = this.getAll(name);\n if (values === null) {\n return null;\n }\n return values.length > 0 ? values[0] : null;\n };\n /**\n * Checks for existence of header by given name.\n * @param {?} name\n * @return {?}\n */\n Headers.prototype.has = function (name) { return this._headers.has(name.toLowerCase()); };\n /**\n * Returns the names of the headers\n * @return {?}\n */\n Headers.prototype.keys = function () { return Array.from(this._normalizedNames.values()); };\n /**\n * Sets or overrides header value for given name.\n * @param {?} name\n * @param {?} value\n * @return {?}\n */\n Headers.prototype.set = function (name, value) {\n if (Array.isArray(value)) {\n if (value.length) {\n this._headers.set(name.toLowerCase(), [value.join(',')]);\n }\n }\n else {\n this._headers.set(name.toLowerCase(), [value]);\n }\n this.mayBeSetNormalizedName(name);\n };\n /**\n * Returns values of all headers.\n * @return {?}\n */\n Headers.prototype.values = function () { return Array.from(this._headers.values()); };\n /**\n * @return {?}\n */\n Headers.prototype.toJSON = function () {\n var _this = this;\n var /** @type {?} */ serialized = {};\n this._headers.forEach(function (values, name) {\n var /** @type {?} */ split = [];\n values.forEach(function (v) { return split.push.apply(split, v.split(',')); });\n serialized[_this._normalizedNames.get(name)] = split;\n });\n return serialized;\n };\n /**\n * Returns list of header values for a given name.\n * @param {?} name\n * @return {?}\n */\n Headers.prototype.getAll = function (name) {\n return this.has(name) ? this._headers.get(name.toLowerCase()) : null;\n };\n /**\n * This method is not implemented.\n * @return {?}\n */\n Headers.prototype.entries = function () { throw new Error('\"entries\" method is not implemented on Headers class'); };\n /**\n * @param {?} name\n * @return {?}\n */\n Headers.prototype.mayBeSetNormalizedName = function (name) {\n var /** @type {?} */ lcName = name.toLowerCase();\n if (!this._normalizedNames.has(lcName)) {\n this._normalizedNames.set(lcName, name);\n }\n };\n return Headers;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$1 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Creates a response options object to be optionally provided when instantiating a\n * {@link Response}.\n * *\n * This class is based on the `ResponseInit` description in the [Fetch\n * Spec](https://fetch.spec.whatwg.org/#responseinit).\n * *\n * All values are null by default. Typical defaults can be found in the\n * {@link BaseResponseOptions} class, which sub-classes `ResponseOptions`.\n * *\n * This class may be used in tests to build {@link Response Responses} for\n * mock responses (see {@link MockBackend}).\n * *\n * ### Example ([live demo](http://plnkr.co/edit/P9Jkk8e8cz6NVzbcxEsD?p=preview))\n * *\n * ```typescript\n * import {ResponseOptions, Response} from '@angular/http';\n * *\n * var options = new ResponseOptions({\n * body: '{\"name\":\"Jeff\"}'\n * });\n * var res = new Response(options);\n * *\n * console.log('res.json():', res.json()); // Object {name: \"Jeff\"}\n * ```\n * *\n */\n var ResponseOptions = (function () {\n /**\n * @param {?=} __0\n */\n function ResponseOptions(_a) {\n var _b = _a === void 0 ? {} : _a, body = _b.body, status = _b.status, headers = _b.headers, statusText = _b.statusText, type = _b.type, url = _b.url;\n this.body = body != null ? body : null;\n this.status = status != null ? status : null;\n this.headers = headers != null ? headers : null;\n this.statusText = statusText != null ? statusText : null;\n this.type = type != null ? type : null;\n this.url = url != null ? url : null;\n }\n /**\n * Creates a copy of the `ResponseOptions` instance, using the optional input as values to\n * override\n * existing values. This method will not change the values of the instance on which it is being\n * called.\n * *\n * This may be useful when sharing a base `ResponseOptions` object inside tests,\n * where certain properties may change from test to test.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/1lXquqFfgduTFBWjNoRE?p=preview))\n * *\n * ```typescript\n * import {ResponseOptions, Response} from '@angular/http';\n * *\n * var options = new ResponseOptions({\n * body: {name: 'Jeff'}\n * });\n * var res = new Response(options.merge({\n * url: 'https://google.com'\n * }));\n * console.log('options.url:', options.url); // null\n * console.log('res.json():', res.json()); // Object {name: \"Jeff\"}\n * console.log('res.url:', res.url); // https://google.com\n * ```\n * @param {?=} options\n * @return {?}\n */\n ResponseOptions.prototype.merge = function (options) {\n return new ResponseOptions({\n body: options && options.body != null ? options.body : this.body,\n status: options && options.status != null ? options.status : this.status,\n headers: options && options.headers != null ? options.headers : this.headers,\n statusText: options && options.statusText != null ? options.statusText : this.statusText,\n type: options && options.type != null ? options.type : this.type,\n url: options && options.url != null ? options.url : this.url,\n });\n };\n return ResponseOptions;\n }());\n /**\n * Subclass of {@link ResponseOptions}, with default values.\n * *\n * Default values:\n * * status: 200\n * * headers: empty {@link Headers} object\n * *\n * This class could be extended and bound to the {@link ResponseOptions} class\n * when configuring an {@link Injector}, in order to override the default options\n * used by {@link Http} to create {@link Response Responses}.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/qv8DLT?p=preview))\n * *\n * ```typescript\n * import {provide} from '@angular/core';\n * import {bootstrap} from '@angular/platform-browser/browser';\n * import {HTTP_PROVIDERS, Headers, Http, BaseResponseOptions, ResponseOptions} from\n * '@angular/http';\n * import {App} from './myapp';\n * *\n * class MyOptions extends BaseResponseOptions {\n * headers:Headers = new Headers({network: 'github'});\n * }\n * *\n * bootstrap(App, [HTTP_PROVIDERS, {provide: ResponseOptions, useClass: MyOptions}]);\n * ```\n * *\n * The options could also be extended when manually creating a {@link Response}\n * object.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/VngosOWiaExEtbstDoix?p=preview))\n * *\n * ```\n * import {BaseResponseOptions, Response} from '@angular/http';\n * *\n * var options = new BaseResponseOptions();\n * var res = new Response(options.merge({\n * body: 'Angular',\n * headers: new Headers({framework: 'angular'})\n * }));\n * console.log('res.headers.get(\"framework\"):', res.headers.get('framework')); // angular\n * console.log('res.text():', res.text()); // Angular;\n * ```\n * *\n */\n var BaseResponseOptions = (function (_super) {\n __extends$1(BaseResponseOptions, _super);\n function BaseResponseOptions() {\n _super.call(this, { status: 200, statusText: 'Ok', type: ResponseType.Default, headers: new Headers() });\n }\n BaseResponseOptions.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n BaseResponseOptions.ctorParameters = function () { return []; };\n return BaseResponseOptions;\n }(ResponseOptions));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n /**\n * Abstract class from which real backends are derived.\n * *\n * The primary purpose of a `ConnectionBackend` is to create new connections to fulfill a given\n * {@link Request}.\n * *\n * @abstract\n */\n var ConnectionBackend = (function () {\n function ConnectionBackend() {\n }\n /**\n * @abstract\n * @param {?} request\n * @return {?}\n */\n ConnectionBackend.prototype.createConnection = function (request) { };\n return ConnectionBackend;\n }());\n /**\n * Abstract class from which real connections are derived.\n * *\n * @abstract\n */\n var Connection = (function () {\n function Connection() {\n }\n return Connection;\n }());\n /**\n * An XSRFStrategy configures XSRF protection (e.g. via headers) on an HTTP request.\n * *\n * @abstract\n */\n var XSRFStrategy = (function () {\n function XSRFStrategy() {\n }\n /**\n * @abstract\n * @param {?} req\n * @return {?}\n */\n XSRFStrategy.prototype.configureRequest = function (req) { };\n return XSRFStrategy;\n }());\n\n /**\n * @param {?} method\n * @return {?}\n */\n function normalizeMethodName(method) {\n if (typeof method !== 'string')\n return method;\n switch (method.toUpperCase()) {\n case 'GET':\n return RequestMethod.Get;\n case 'POST':\n return RequestMethod.Post;\n case 'PUT':\n return RequestMethod.Put;\n case 'DELETE':\n return RequestMethod.Delete;\n case 'OPTIONS':\n return RequestMethod.Options;\n case 'HEAD':\n return RequestMethod.Head;\n case 'PATCH':\n return RequestMethod.Patch;\n }\n throw new Error(\"Invalid request method. The method \\\"\" + method + \"\\\" is not supported.\");\n }\n var /** @type {?} */ isSuccess = function (status) { return (status >= 200 && status < 300); };\n /**\n * @param {?} xhr\n * @return {?}\n */\n function getResponseURL(xhr) {\n if ('responseURL' in xhr) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n return;\n }\n /**\n * @param {?} input\n * @return {?}\n */\n function stringToArrayBuffer(input) {\n var /** @type {?} */ view = new Uint16Array(input.length);\n for (var /** @type {?} */ i = 0, /** @type {?} */ strLen = input.length; i < strLen; i++) {\n view[i] = input.charCodeAt(i);\n }\n return view.buffer;\n }\n\n /**\n * @license undefined\n * Copyright Google Inc. All Rights Reserved.\n * *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n * @param {?=} rawParams\n * @return {?}\n */\n function paramParser(rawParams) {\n if (rawParams === void 0) { rawParams = ''; }\n var /** @type {?} */ map = new Map();\n if (rawParams.length > 0) {\n var /** @type {?} */ params = rawParams.split('&');\n params.forEach(function (param) {\n var /** @type {?} */ eqIdx = param.indexOf('=');\n var _a = eqIdx == -1 ? [param, ''] : [param.slice(0, eqIdx), param.slice(eqIdx + 1)], key = _a[0], val = _a[1];\n var /** @type {?} */ list = map.get(key) || [];\n list.push(val);\n map.set(key, list);\n });\n }\n return map;\n }\n /**\n * *\n */\n var QueryEncoder = (function () {\n function QueryEncoder() {\n }\n /**\n * @param {?} k\n * @return {?}\n */\n QueryEncoder.prototype.encodeKey = function (k) { return standardEncoding(k); };\n /**\n * @param {?} v\n * @return {?}\n */\n QueryEncoder.prototype.encodeValue = function (v) { return standardEncoding(v); };\n return QueryEncoder;\n }());\n /**\n * @param {?} v\n * @return {?}\n */\n function standardEncoding(v) {\n return encodeURIComponent(v)\n .replace(/%40/gi, '@')\n .replace(/%3A/gi, ':')\n .replace(/%24/gi, '$')\n .replace(/%2C/gi, ',')\n .replace(/%3B/gi, ';')\n .replace(/%2B/gi, '+')\n .replace(/%3D/gi, '=')\n .replace(/%3F/gi, '?')\n .replace(/%2F/gi, '/');\n }\n /**\n * Map-like representation of url search parameters, based on\n * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,\n * with several extensions for merging URLSearchParams objects:\n * - setAll()\n * - appendAll()\n * - replaceAll()\n * *\n * This class accepts an optional second parameter of ${@link QueryEncoder},\n * which is used to serialize parameters before making a request. By default,\n * `QueryEncoder` encodes keys and values of parameters using `encodeURIComponent`,\n * and then un-encodes certain characters that are allowed to be part of the query\n * according to IETF RFC 3986: https://tools.ietf.org/html/rfc3986.\n * *\n * These are the characters that are not encoded: `! $ \\' ( ) * + , ; A 9 - . _ ~ ? /`\n * *\n * If the set of allowed query characters is not acceptable for a particular backend,\n * `QueryEncoder` can be subclassed and provided as the 2nd argument to URLSearchParams.\n * *\n * ```\n * import {URLSearchParams, QueryEncoder} from '@angular/http';\n * class MyQueryEncoder extends QueryEncoder {\n * encodeKey(k: string): string {\n * return myEncodingFunction(k);\n * }\n * *\n * encodeValue(v: string): string {\n * return myEncodingFunction(v);\n * }\n * }\n * *\n * let params = new URLSearchParams('', new MyQueryEncoder());\n * ```\n */\n var URLSearchParams = (function () {\n /**\n * @param {?=} rawParams\n * @param {?=} queryEncoder\n */\n function URLSearchParams(rawParams, queryEncoder) {\n if (rawParams === void 0) { rawParams = ''; }\n if (queryEncoder === void 0) { queryEncoder = new QueryEncoder(); }\n this.rawParams = rawParams;\n this.queryEncoder = queryEncoder;\n this.paramsMap = paramParser(rawParams);\n }\n /**\n * @return {?}\n */\n URLSearchParams.prototype.clone = function () {\n var /** @type {?} */ clone = new URLSearchParams('', this.queryEncoder);\n clone.appendAll(this);\n return clone;\n };\n /**\n * @param {?} param\n * @return {?}\n */\n URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); };\n /**\n * @param {?} param\n * @return {?}\n */\n URLSearchParams.prototype.get = function (param) {\n var /** @type {?} */ storedParam = this.paramsMap.get(param);\n return Array.isArray(storedParam) ? storedParam[0] : null;\n };\n /**\n * @param {?} param\n * @return {?}\n */\n URLSearchParams.prototype.getAll = function (param) { return this.paramsMap.get(param) || []; };\n /**\n * @param {?} param\n * @param {?} val\n * @return {?}\n */\n URLSearchParams.prototype.set = function (param, val) {\n if (val === void 0 || val === null) {\n this.delete(param);\n return;\n }\n var /** @type {?} */ list = this.paramsMap.get(param) || [];\n list.length = 0;\n list.push(val);\n this.paramsMap.set(param, list);\n };\n /**\n * @param {?} searchParams\n * @return {?}\n */\n URLSearchParams.prototype.setAll = function (searchParams) {\n var _this = this;\n searchParams.paramsMap.forEach(function (value, param) {\n var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n list.length = 0;\n list.push(value[0]);\n _this.paramsMap.set(param, list);\n });\n };\n /**\n * @param {?} param\n * @param {?} val\n * @return {?}\n */\n URLSearchParams.prototype.append = function (param, val) {\n if (val === void 0 || val === null)\n return;\n var /** @type {?} */ list = this.paramsMap.get(param) || [];\n list.push(val);\n this.paramsMap.set(param, list);\n };\n /**\n * @param {?} searchParams\n * @return {?}\n */\n URLSearchParams.prototype.appendAll = function (searchParams) {\n var _this = this;\n searchParams.paramsMap.forEach(function (value, param) {\n var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n for (var /** @type {?} */ i = 0; i < value.length; ++i) {\n list.push(value[i]);\n }\n _this.paramsMap.set(param, list);\n });\n };\n /**\n * @param {?} searchParams\n * @return {?}\n */\n URLSearchParams.prototype.replaceAll = function (searchParams) {\n var _this = this;\n searchParams.paramsMap.forEach(function (value, param) {\n var /** @type {?} */ list = _this.paramsMap.get(param) || [];\n list.length = 0;\n for (var /** @type {?} */ i = 0; i < value.length; ++i) {\n list.push(value[i]);\n }\n _this.paramsMap.set(param, list);\n });\n };\n /**\n * @return {?}\n */\n URLSearchParams.prototype.toString = function () {\n var _this = this;\n var /** @type {?} */ paramsList = [];\n this.paramsMap.forEach(function (values, k) {\n values.forEach(function (v) { return paramsList.push(_this.queryEncoder.encodeKey(k) + '=' + _this.queryEncoder.encodeValue(v)); });\n });\n return paramsList.join('&');\n };\n /**\n * @param {?} param\n * @return {?}\n */\n URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); };\n return URLSearchParams;\n }());\n\n /**\n * HTTP request body used by both {@link Request} and {@link Response}\n * https://fetch.spec.whatwg.org/#body\n * @abstract\n */\n var Body = (function () {\n function Body() {\n }\n /**\n * Attempts to return body as parsed `JSON` object, or raises an exception.\n * @return {?}\n */\n Body.prototype.json = function () {\n if (typeof this._body === 'string') {\n return JSON.parse(/** @type {?} */ (this._body));\n }\n if (this._body instanceof ArrayBuffer) {\n return JSON.parse(this.text());\n }\n return this._body;\n };\n /**\n * Returns the body as a string, presuming `toString()` can be called on the response body.\n * @return {?}\n */\n Body.prototype.text = function () {\n if (this._body instanceof URLSearchParams) {\n return this._body.toString();\n }\n if (this._body instanceof ArrayBuffer) {\n return String.fromCharCode.apply(null, new Uint16Array(/** @type {?} */ (this._body)));\n }\n if (this._body == null) {\n return '';\n }\n if (typeof this._body === 'object') {\n return JSON.stringify(this._body, null, 2);\n }\n return this._body.toString();\n };\n /**\n * Return the body as an ArrayBuffer\n * @return {?}\n */\n Body.prototype.arrayBuffer = function () {\n if (this._body instanceof ArrayBuffer) {\n return (this._body);\n }\n return stringToArrayBuffer(this.text());\n };\n /**\n * Returns the request's body as a Blob, assuming that body exists.\n * @return {?}\n */\n Body.prototype.blob = function () {\n if (this._body instanceof Blob) {\n return (this._body);\n }\n if (this._body instanceof ArrayBuffer) {\n return new Blob([this._body]);\n }\n throw new Error('The request body isn\\'t either a blob or an array buffer');\n };\n return Body;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$2 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Creates `Response` instances from provided values.\n * *\n * Though this object isn't\n * usually instantiated by end-users, it is the primary object interacted with when it comes time to\n * add data to a view.\n * *\n * ### Example\n * *\n * ```\n * http.request('my-friends.txt').subscribe(response => this.friends = response.text());\n * ```\n * *\n * The Response's interface is inspired by the Response constructor defined in the [Fetch\n * Spec](https://fetch.spec.whatwg.org/#response-class), but is considered a static value whose body\n * can be accessed many times. There are other differences in the implementation, but this is the\n * most significant.\n * *\n */\n var Response = (function (_super) {\n __extends$2(Response, _super);\n /**\n * @param {?} responseOptions\n */\n function Response(responseOptions) {\n _super.call(this);\n this._body = responseOptions.body;\n this.status = responseOptions.status;\n this.ok = (this.status >= 200 && this.status <= 299);\n this.statusText = responseOptions.statusText;\n this.headers = responseOptions.headers;\n this.type = responseOptions.type;\n this.url = responseOptions.url;\n }\n /**\n * @return {?}\n */\n Response.prototype.toString = function () {\n return \"Response with status: \" + this.status + \" \" + this.statusText + \" for URL: \" + this.url;\n };\n return Response;\n }(Body));\n\n var /** @type {?} */ _nextRequestId = 0;\n var /** @type {?} */ JSONP_HOME = '__ng_jsonp__';\n var /** @type {?} */ _jsonpConnections = null;\n /**\n * @return {?}\n */\n function _getJsonpConnections() {\n var /** @type {?} */ w = typeof window == 'object' ? window : {};\n if (_jsonpConnections === null) {\n _jsonpConnections = w[JSONP_HOME] = {};\n }\n return _jsonpConnections;\n }\n // Make sure not to evaluate this in a non-browser environment!\n var BrowserJsonp = (function () {\n function BrowserJsonp() {\n }\n /**\n * @param {?} url\n * @return {?}\n */\n BrowserJsonp.prototype.build = function (url) {\n var /** @type {?} */ node = document.createElement('script');\n node.src = url;\n return node;\n };\n /**\n * @return {?}\n */\n BrowserJsonp.prototype.nextRequestID = function () { return \"__req\" + _nextRequestId++; };\n /**\n * @param {?} id\n * @return {?}\n */\n BrowserJsonp.prototype.requestCallback = function (id) { return JSONP_HOME + \".\" + id + \".finished\"; };\n /**\n * @param {?} id\n * @param {?} connection\n * @return {?}\n */\n BrowserJsonp.prototype.exposeConnection = function (id, connection) {\n var /** @type {?} */ connections = _getJsonpConnections();\n connections[id] = connection;\n };\n /**\n * @param {?} id\n * @return {?}\n */\n BrowserJsonp.prototype.removeConnection = function (id) {\n var /** @type {?} */ connections = _getJsonpConnections();\n connections[id] = null;\n };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserJsonp.prototype.send = function (node) { document.body.appendChild(/** @type {?} */ ((node))); };\n /**\n * @param {?} node\n * @return {?}\n */\n BrowserJsonp.prototype.cleanup = function (node) {\n if (node.parentNode) {\n node.parentNode.removeChild(/** @type {?} */ ((node)));\n }\n };\n BrowserJsonp.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n BrowserJsonp.ctorParameters = function () { return []; };\n return BrowserJsonp;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n var /** @type {?} */ JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';\n var /** @type {?} */ JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';\n /**\n * Abstract base class for an in-flight JSONP request.\n * *\n * @abstract\n */\n var JSONPConnection = (function () {\n function JSONPConnection() {\n }\n /**\n * Callback called when the JSONP request completes, to notify the application\n * of the new data.\n * @abstract\n * @param {?=} data\n * @return {?}\n */\n JSONPConnection.prototype.finished = function (data) { };\n return JSONPConnection;\n }());\n var JSONPConnection_ = (function (_super) {\n __extends(JSONPConnection_, _super);\n /**\n * @param {?} req\n * @param {?} _dom\n * @param {?=} baseResponseOptions\n */\n function JSONPConnection_(req, _dom, baseResponseOptions) {\n var _this = this;\n _super.call(this);\n this._dom = _dom;\n this.baseResponseOptions = baseResponseOptions;\n this._finished = false;\n if (req.method !== RequestMethod.Get) {\n throw new TypeError(JSONP_ERR_WRONG_METHOD);\n }\n this.request = req;\n this.response = new rxjs_Observable.Observable(function (responseObserver) {\n _this.readyState = ReadyState.Loading;\n var id = _this._id = _dom.nextRequestID();\n _dom.exposeConnection(id, _this);\n // Workaround Dart\n // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);\n var callback = _dom.requestCallback(_this._id);\n var url = req.url;\n if (url.indexOf('=JSONP_CALLBACK&') > -1) {\n url = url.replace('=JSONP_CALLBACK&', \"=\" + callback + \"&\");\n }\n else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {\n url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + (\"=\" + callback);\n }\n var script = _this._script = _dom.build(url);\n var onLoad = function (event) {\n if (_this.readyState === ReadyState.Cancelled)\n return;\n _this.readyState = ReadyState.Done;\n _dom.cleanup(script);\n if (!_this._finished) {\n var responseOptions_1 = new ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: ResponseType.Error, url: url });\n if (baseResponseOptions) {\n responseOptions_1 = baseResponseOptions.merge(responseOptions_1);\n }\n responseObserver.error(new Response(responseOptions_1));\n return;\n }\n var responseOptions = new ResponseOptions({ body: _this._responseData, url: url });\n if (_this.baseResponseOptions) {\n responseOptions = _this.baseResponseOptions.merge(responseOptions);\n }\n responseObserver.next(new Response(responseOptions));\n responseObserver.complete();\n };\n var onError = function (error) {\n if (_this.readyState === ReadyState.Cancelled)\n return;\n _this.readyState = ReadyState.Done;\n _dom.cleanup(script);\n var responseOptions = new ResponseOptions({ body: error.message, type: ResponseType.Error });\n if (baseResponseOptions) {\n responseOptions = baseResponseOptions.merge(responseOptions);\n }\n responseObserver.error(new Response(responseOptions));\n };\n script.addEventListener('load', onLoad);\n script.addEventListener('error', onError);\n _dom.send(script);\n return function () {\n _this.readyState = ReadyState.Cancelled;\n script.removeEventListener('load', onLoad);\n script.removeEventListener('error', onError);\n _this._dom.cleanup(script);\n };\n });\n }\n /**\n * @param {?=} data\n * @return {?}\n */\n JSONPConnection_.prototype.finished = function (data) {\n // Don't leak connections\n this._finished = true;\n this._dom.removeConnection(this._id);\n if (this.readyState === ReadyState.Cancelled)\n return;\n this._responseData = data;\n };\n return JSONPConnection_;\n }(JSONPConnection));\n /**\n * A {@link ConnectionBackend} that uses the JSONP strategy of making requests.\n * *\n * @abstract\n */\n var JSONPBackend = (function (_super) {\n __extends(JSONPBackend, _super);\n function JSONPBackend() {\n _super.apply(this, arguments);\n }\n return JSONPBackend;\n }(ConnectionBackend));\n var JSONPBackend_ = (function (_super) {\n __extends(JSONPBackend_, _super);\n /**\n * @param {?} _browserJSONP\n * @param {?} _baseResponseOptions\n */\n function JSONPBackend_(_browserJSONP, _baseResponseOptions) {\n _super.call(this);\n this._browserJSONP = _browserJSONP;\n this._baseResponseOptions = _baseResponseOptions;\n }\n /**\n * @param {?} request\n * @return {?}\n */\n JSONPBackend_.prototype.createConnection = function (request) {\n return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions);\n };\n JSONPBackend_.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n JSONPBackend_.ctorParameters = function () { return [\n { type: BrowserJsonp, },\n { type: ResponseOptions, },\n ]; };\n return JSONPBackend_;\n }(JSONPBackend));\n\n var /** @type {?} */ XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n /**\n * Creates connections using `XMLHttpRequest`. Given a fully-qualified\n * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the\n * request.\n * *\n * This class would typically not be created or interacted with directly inside applications, though\n * the {@link MockConnection} may be interacted with in tests.\n * *\n */\n var XHRConnection = (function () {\n /**\n * @param {?} req\n * @param {?} browserXHR\n * @param {?=} baseResponseOptions\n */\n function XHRConnection(req, browserXHR, baseResponseOptions) {\n var _this = this;\n this.request = req;\n this.response = new rxjs_Observable.Observable(function (responseObserver) {\n var _xhr = browserXHR.build();\n _xhr.open(RequestMethod[req.method].toUpperCase(), req.url);\n if (req.withCredentials != null) {\n _xhr.withCredentials = req.withCredentials;\n }\n // load event handler\n var onLoad = function () {\n // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n var status = _xhr.status === 1223 ? 204 : _xhr.status;\n var body = null;\n // HTTP 204 means no content\n if (status !== 204) {\n // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n // response/responseType properties were introduced in ResourceLoader Level2 spec\n // (supported by IE10)\n body = (typeof _xhr.response === 'undefined') ? _xhr.responseText : _xhr.response;\n // Implicitly strip a potential XSSI prefix.\n if (typeof body === 'string') {\n body = body.replace(XSSI_PREFIX, '');\n }\n }\n // fix status code when it is 0 (0 status is undocumented).\n // Occurs when accessing file resources or on Android 4.1 stock browser\n // while retrieving files from application cache.\n if (status === 0) {\n status = body ? 200 : 0;\n }\n var headers = Headers.fromResponseHeaderString(_xhr.getAllResponseHeaders());\n // IE 9 does not provide the way to get URL of response\n var url = getResponseURL(_xhr) || req.url;\n var statusText = _xhr.statusText || 'OK';\n var responseOptions = new ResponseOptions({ body: body, status: status, headers: headers, statusText: statusText, url: url });\n if (baseResponseOptions != null) {\n responseOptions = baseResponseOptions.merge(responseOptions);\n }\n var response = new Response(responseOptions);\n response.ok = isSuccess(status);\n if (response.ok) {\n responseObserver.next(response);\n // TODO(gdi2290): defer complete if array buffer until done\n responseObserver.complete();\n return;\n }\n responseObserver.error(response);\n };\n // error event handler\n var onError = function (err) {\n var responseOptions = new ResponseOptions({\n body: err,\n type: ResponseType.Error,\n status: _xhr.status,\n statusText: _xhr.statusText,\n });\n if (baseResponseOptions != null) {\n responseOptions = baseResponseOptions.merge(responseOptions);\n }\n responseObserver.error(new Response(responseOptions));\n };\n _this.setDetectedContentType(req, _xhr);\n if (req.headers == null) {\n req.headers = new Headers();\n }\n if (!req.headers.has('Accept')) {\n req.headers.append('Accept', 'application/json, text/plain, */*');\n }\n req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });\n // Select the correct buffer type to store the response\n if (req.responseType != null && _xhr.responseType != null) {\n switch (req.responseType) {\n case ResponseContentType.ArrayBuffer:\n _xhr.responseType = 'arraybuffer';\n break;\n case ResponseContentType.Json:\n _xhr.responseType = 'json';\n break;\n case ResponseContentType.Text:\n _xhr.responseType = 'text';\n break;\n case ResponseContentType.Blob:\n _xhr.responseType = 'blob';\n break;\n default:\n throw new Error('The selected responseType is not supported');\n }\n }\n _xhr.addEventListener('load', onLoad);\n _xhr.addEventListener('error', onError);\n _xhr.send(_this.request.getBody());\n return function () {\n _xhr.removeEventListener('load', onLoad);\n _xhr.removeEventListener('error', onError);\n _xhr.abort();\n };\n });\n }\n /**\n * @param {?} req\n * @param {?} _xhr\n * @return {?}\n */\n XHRConnection.prototype.setDetectedContentType = function (req /** TODO Request */, _xhr /** XMLHttpRequest */) {\n // Skip if a custom Content-Type header is provided\n if (req.headers != null && req.headers.get('Content-Type') != null) {\n return;\n }\n // Set the detected content type\n switch (req.contentType) {\n case ContentType.NONE:\n break;\n case ContentType.JSON:\n _xhr.setRequestHeader('content-type', 'application/json');\n break;\n case ContentType.FORM:\n _xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n break;\n case ContentType.TEXT:\n _xhr.setRequestHeader('content-type', 'text/plain');\n break;\n case ContentType.BLOB:\n var /** @type {?} */ blob = req.blob();\n if (blob.type) {\n _xhr.setRequestHeader('content-type', blob.type);\n }\n break;\n }\n };\n return XHRConnection;\n }());\n /**\n * `XSRFConfiguration` sets up Cross Site Request Forgery (XSRF) protection for the application\n * using a cookie. See {@link https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)}\n * for more information on XSRF.\n * *\n * Applications can configure custom cookie and header names by binding an instance of this class\n * with different `cookieName` and `headerName` values. See the main HTTP documentation for more\n * details.\n * *\n */\n var CookieXSRFStrategy = (function () {\n /**\n * @param {?=} _cookieName\n * @param {?=} _headerName\n */\n function CookieXSRFStrategy(_cookieName, _headerName) {\n if (_cookieName === void 0) { _cookieName = 'XSRF-TOKEN'; }\n if (_headerName === void 0) { _headerName = 'X-XSRF-TOKEN'; }\n this._cookieName = _cookieName;\n this._headerName = _headerName;\n }\n /**\n * @param {?} req\n * @return {?}\n */\n CookieXSRFStrategy.prototype.configureRequest = function (req) {\n var /** @type {?} */ xsrfToken = _angular_platformBrowser.__platform_browser_private__.getDOM().getCookie(this._cookieName);\n if (xsrfToken) {\n req.headers.set(this._headerName, xsrfToken);\n }\n };\n return CookieXSRFStrategy;\n }());\n /**\n * Creates {@link XHRConnection} instances.\n * *\n * This class would typically not be used by end users, but could be\n * overridden if a different backend implementation should be used,\n * such as in a node backend.\n * *\n * ### Example\n * *\n * ```\n * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from '@angular/http';\n * viewProviders: [\n * HTTP_PROVIDERS,\n * {provide: Http, useFactory: (backend, options) => {\n * return new Http(backend, options);\n * }, deps: [MyNodeBackend, BaseRequestOptions]}]\n * })\n * class MyComponent {\n * constructor(http:Http) {\n * http.request('people.json').subscribe(res => this.people = res.json());\n * }\n * }\n * ```\n */\n var XHRBackend = (function () {\n /**\n * @param {?} _browserXHR\n * @param {?} _baseResponseOptions\n * @param {?} _xsrfStrategy\n */\n function XHRBackend(_browserXHR, _baseResponseOptions, _xsrfStrategy) {\n this._browserXHR = _browserXHR;\n this._baseResponseOptions = _baseResponseOptions;\n this._xsrfStrategy = _xsrfStrategy;\n }\n /**\n * @param {?} request\n * @return {?}\n */\n XHRBackend.prototype.createConnection = function (request) {\n this._xsrfStrategy.configureRequest(request);\n return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);\n };\n XHRBackend.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n XHRBackend.ctorParameters = function () { return [\n { type: BrowserXhr, },\n { type: ResponseOptions, },\n { type: XSRFStrategy, },\n ]; };\n return XHRBackend;\n }());\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$3 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Creates a request options object to be optionally provided when instantiating a\n * {@link Request}.\n * *\n * This class is based on the `RequestInit` description in the [Fetch\n * Spec](https://fetch.spec.whatwg.org/#requestinit).\n * *\n * All values are null by default. Typical defaults can be found in the {@link BaseRequestOptions}\n * class, which sub-classes `RequestOptions`.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/7Wvi3lfLq41aQPKlxB4O?p=preview))\n * *\n * ```typescript\n * import {RequestOptions, Request, RequestMethod} from '@angular/http';\n * *\n * var options = new RequestOptions({\n * method: RequestMethod.Post,\n * url: 'https://google.com'\n * });\n * var req = new Request(options);\n * console.log('req.method:', RequestMethod[req.method]); // Post\n * console.log('options.url:', options.url); // https://google.com\n * ```\n * *\n */\n var RequestOptions = (function () {\n /**\n * @param {?=} __0\n */\n function RequestOptions(_a) {\n var _b = _a === void 0 ? {} : _a, method = _b.method, headers = _b.headers, body = _b.body, url = _b.url, search = _b.search, withCredentials = _b.withCredentials, responseType = _b.responseType;\n this.method = method != null ? normalizeMethodName(method) : null;\n this.headers = headers != null ? headers : null;\n this.body = body != null ? body : null;\n this.url = url != null ? url : null;\n this.search =\n search != null ? (typeof search === 'string' ? new URLSearchParams(search) : search) : null;\n this.withCredentials = withCredentials != null ? withCredentials : null;\n this.responseType = responseType != null ? responseType : null;\n }\n /**\n * Creates a copy of the `RequestOptions` instance, using the optional input as values to override\n * existing values. This method will not change the values of the instance on which it is being\n * called.\n * *\n * Note that `headers` and `search` will override existing values completely if present in\n * the `options` object. If these values should be merged, it should be done prior to calling\n * `merge` on the `RequestOptions` instance.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/6w8XA8YTkDRcPYpdB9dk?p=preview))\n * *\n * ```typescript\n * import {RequestOptions, Request, RequestMethod} from '@angular/http';\n * *\n * var options = new RequestOptions({\n * method: RequestMethod.Post\n * });\n * var req = new Request(options.merge({\n * url: 'https://google.com'\n * }));\n * console.log('req.method:', RequestMethod[req.method]); // Post\n * console.log('options.url:', options.url); // null\n * console.log('req.url:', req.url); // https://google.com\n * ```\n * @param {?=} options\n * @return {?}\n */\n RequestOptions.prototype.merge = function (options) {\n return new RequestOptions({\n method: options && options.method != null ? options.method : this.method,\n headers: options && options.headers != null ? options.headers : new Headers(this.headers),\n body: options && options.body != null ? options.body : this.body,\n url: options && options.url != null ? options.url : this.url,\n search: options && options.search != null ?\n (typeof options.search === 'string' ? new URLSearchParams(options.search) :\n options.search.clone()) :\n this.search,\n withCredentials: options && options.withCredentials != null ? options.withCredentials :\n this.withCredentials,\n responseType: options && options.responseType != null ? options.responseType :\n this.responseType\n });\n };\n return RequestOptions;\n }());\n /**\n * Subclass of {@link RequestOptions}, with default values.\n * *\n * Default values:\n * * method: {@link RequestMethod RequestMethod.Get}\n * * headers: empty {@link Headers} object\n * *\n * This class could be extended and bound to the {@link RequestOptions} class\n * when configuring an {@link Injector}, in order to override the default options\n * used by {@link Http} to create and send {@link Request Requests}.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/LEKVSx?p=preview))\n * *\n * ```typescript\n * import {provide} from '@angular/core';\n * import {bootstrap} from '@angular/platform-browser/browser';\n * import {HTTP_PROVIDERS, Http, BaseRequestOptions, RequestOptions} from '@angular/http';\n * import {App} from './myapp';\n * *\n * class MyOptions extends BaseRequestOptions {\n * search: string = 'coreTeam=true';\n * }\n * *\n * bootstrap(App, [HTTP_PROVIDERS, {provide: RequestOptions, useClass: MyOptions}]);\n * ```\n * *\n * The options could also be extended when manually creating a {@link Request}\n * object.\n * *\n * ### Example ([live demo](http://plnkr.co/edit/oyBoEvNtDhOSfi9YxaVb?p=preview))\n * *\n * ```\n * import {BaseRequestOptions, Request, RequestMethod} from '@angular/http';\n * *\n * var options = new BaseRequestOptions();\n * var req = new Request(options.merge({\n * method: RequestMethod.Post,\n * url: 'https://google.com'\n * }));\n * console.log('req.method:', RequestMethod[req.method]); // Post\n * console.log('options.url:', options.url); // null\n * console.log('req.url:', req.url); // https://google.com\n * ```\n * *\n */\n var BaseRequestOptions = (function (_super) {\n __extends$3(BaseRequestOptions, _super);\n function BaseRequestOptions() {\n _super.call(this, { method: RequestMethod.Get, headers: new Headers() });\n }\n BaseRequestOptions.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n BaseRequestOptions.ctorParameters = function () { return []; };\n return BaseRequestOptions;\n }(RequestOptions));\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$5 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * Creates `Request` instances from provided values.\n * *\n * The Request's interface is inspired by the Request constructor defined in the [Fetch\n * Spec](https://fetch.spec.whatwg.org/#request-class),\n * but is considered a static value whose body can be accessed many times. There are other\n * differences in the implementation, but this is the most significant.\n * *\n * `Request` instances are typically created by higher-level classes, like {@link Http} and\n * {@link Jsonp}, but it may occasionally be useful to explicitly create `Request` instances.\n * One such example is when creating services that wrap higher-level services, like {@link Http},\n * where it may be useful to generate a `Request` with arbitrary headers and search params.\n * *\n * ```typescript\n * import {Injectable, Injector} from '@angular/core';\n * import {HTTP_PROVIDERS, Http, Request, RequestMethod} from '@angular/http';\n * *\n * class AutoAuthenticator {\n * constructor(public http:Http) {}\n * request(url:string) {\n * return this.http.request(new Request({\n * method: RequestMethod.Get,\n * url: url,\n * search: 'password=123'\n * }));\n * }\n * }\n * *\n * var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AutoAuthenticator]);\n * var authenticator = injector.get(AutoAuthenticator);\n * authenticator.request('people.json').subscribe(res => {\n * //URL should have included '?password=123'\n * console.log('people', res.json());\n * });\n * ```\n * *\n */\n var Request = (function (_super) {\n __extends$5(Request, _super);\n /**\n * @param {?} requestOptions\n */\n function Request(requestOptions) {\n _super.call(this);\n // TODO: assert that url is present\n var url = requestOptions.url;\n this.url = requestOptions.url;\n if (requestOptions.search) {\n var search = requestOptions.search.toString();\n if (search.length > 0) {\n var prefix = '?';\n if (this.url.indexOf('?') != -1) {\n prefix = (this.url[this.url.length - 1] == '&') ? '' : '&';\n }\n // TODO: just delete search-query-looking string in url?\n this.url = url + prefix + search;\n }\n }\n this._body = requestOptions.body;\n this.method = normalizeMethodName(requestOptions.method);\n // TODO(jeffbcross): implement behavior\n // Defaults to 'omit', consistent with browser\n this.headers = new Headers(requestOptions.headers);\n this.contentType = this.detectContentType();\n this.withCredentials = requestOptions.withCredentials;\n this.responseType = requestOptions.responseType;\n }\n /**\n * Returns the content type enum based on header options.\n * @return {?}\n */\n Request.prototype.detectContentType = function () {\n switch (this.headers.get('content-type')) {\n case 'application/json':\n return ContentType.JSON;\n case 'application/x-www-form-urlencoded':\n return ContentType.FORM;\n case 'multipart/form-data':\n return ContentType.FORM_DATA;\n case 'text/plain':\n case 'text/html':\n return ContentType.TEXT;\n case 'application/octet-stream':\n return ContentType.BLOB;\n default:\n return this.detectContentTypeFromBody();\n }\n };\n /**\n * Returns the content type of request's body based on its type.\n * @return {?}\n */\n Request.prototype.detectContentTypeFromBody = function () {\n if (this._body == null) {\n return ContentType.NONE;\n }\n else if (this._body instanceof URLSearchParams) {\n return ContentType.FORM;\n }\n else if (this._body instanceof FormData) {\n return ContentType.FORM_DATA;\n }\n else if (this._body instanceof Blob$1) {\n return ContentType.BLOB;\n }\n else if (this._body instanceof ArrayBuffer$1) {\n return ContentType.ARRAY_BUFFER;\n }\n else if (this._body && typeof this._body == 'object') {\n return ContentType.JSON;\n }\n else {\n return ContentType.TEXT;\n }\n };\n /**\n * Returns the request's body according to its type. If body is undefined, return\n * null.\n * @return {?}\n */\n Request.prototype.getBody = function () {\n switch (this.contentType) {\n case ContentType.JSON:\n return this.text();\n case ContentType.FORM:\n return this.text();\n case ContentType.FORM_DATA:\n return this._body;\n case ContentType.TEXT:\n return this.text();\n case ContentType.BLOB:\n return this.blob();\n case ContentType.ARRAY_BUFFER:\n return this.arrayBuffer();\n default:\n return null;\n }\n };\n return Request;\n }(Body));\n var /** @type {?} */ noop = function () { };\n var /** @type {?} */ w = typeof window == 'object' ? window : noop;\n var /** @type {?} */ FormData = ((w) /** TODO #9100 */)['FormData'] || noop;\n var /** @type {?} */ Blob$1 = ((w) /** TODO #9100 */)['Blob'] || noop;\n var /** @type {?} */ ArrayBuffer$1 = ((w) /** TODO #9100 */)['ArrayBuffer'] || noop;\n\n /**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n var __extends$4 = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n /**\n * @param {?} backend\n * @param {?} request\n * @return {?}\n */\n function httpRequest(backend, request) {\n return backend.createConnection(request).response;\n }\n /**\n * @param {?} defaultOpts\n * @param {?} providedOpts\n * @param {?} method\n * @param {?} url\n * @return {?}\n */\n function mergeOptions(defaultOpts, providedOpts, method, url) {\n var /** @type {?} */ newOptions = defaultOpts;\n if (providedOpts) {\n // Hack so Dart can used named parameters\n return newOptions.merge(new RequestOptions({\n method: providedOpts.method || method,\n url: providedOpts.url || url,\n search: providedOpts.search,\n headers: providedOpts.headers,\n body: providedOpts.body,\n withCredentials: providedOpts.withCredentials,\n responseType: providedOpts.responseType\n }));\n }\n return newOptions.merge(new RequestOptions({ method: method, url: url }));\n }\n /**\n * Performs http requests using `XMLHttpRequest` as the default backend.\n * *\n * `Http` is available as an injectable class, with methods to perform http requests. Calling\n * `request` returns an `Observable` which will emit a single {@link Response} when a\n * response is received.\n * *\n * ### Example\n * *\n * ```typescript\n * import {Http, HTTP_PROVIDERS} from '@angular/http';\n * import 'rxjs/add/operator/map'\n * selector: 'http-app',\n * viewProviders: [HTTP_PROVIDERS],\n * templateUrl: 'people.html'\n * })\n * class PeopleComponent {\n * constructor(http: Http) {\n * http.get('people.json')\n * // Call map on the response observable to get the parsed people object\n * .map(res => res.json())\n * // Subscribe to the observable to get the parsed people object and attach it to the\n * // component\n * .subscribe(people => this.people = people);\n * }\n * }\n * ```\n * *\n * *\n * ### Example\n * *\n * ```\n * http.get('people.json').subscribe((res:Response) => this.people = res.json());\n * ```\n * *\n * The default construct used to perform requests, `XMLHttpRequest`, is abstracted as a \"Backend\" (\n * {@link XHRBackend} in this case), which could be mocked with dependency injection by replacing\n * the {@link XHRBackend} provider, as in the following example:\n * *\n * ### Example\n * *\n * ```typescript\n * import {BaseRequestOptions, Http} from '@angular/http';\n * import {MockBackend} from '@angular/http/testing';\n * var injector = Injector.resolveAndCreate([\n * BaseRequestOptions,\n * MockBackend,\n * {provide: Http, useFactory:\n * function(backend, defaultOptions) {\n * return new Http(backend, defaultOptions);\n * },\n * deps: [MockBackend, BaseRequestOptions]}\n * ]);\n * var http = injector.get(Http);\n * http.get('request-from-mock-backend.json').subscribe((res:Response) => doSomething(res));\n * ```\n * *\n */\n var Http = (function () {\n /**\n * @param {?} _backend\n * @param {?} _defaultOptions\n */\n function Http(_backend, _defaultOptions) {\n this._backend = _backend;\n this._defaultOptions = _defaultOptions;\n }\n /**\n * Performs any type of http request. First argument is required, and can either be a url or\n * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}\n * object can be provided as the 2nd argument. The options object will be merged with the values\n * of {@link BaseRequestOptions} before performing the request.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.request = function (url, options) {\n var /** @type {?} */ responseObservable;\n if (typeof url === 'string') {\n responseObservable = httpRequest(this._backend, new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, /** @type {?} */ (url))));\n }\n else if (url instanceof Request) {\n responseObservable = httpRequest(this._backend, url);\n }\n else {\n throw new Error('First argument must be a url string or Request instance.');\n }\n return responseObservable;\n };\n /**\n * Performs a request with `get` http method.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.get = function (url, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, url)));\n };\n /**\n * Performs a request with `post` http method.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.post = function (url, body, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Post, url)));\n };\n /**\n * Performs a request with `put` http method.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.put = function (url, body, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Put, url)));\n };\n /**\n * Performs a request with `delete` http method.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.delete = function (url, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Delete, url)));\n };\n /**\n * Performs a request with `patch` http method.\n * @param {?} url\n * @param {?} body\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.patch = function (url, body, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions.merge(new RequestOptions({ body: body })), options, RequestMethod.Patch, url)));\n };\n /**\n * Performs a request with `head` http method.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.head = function (url, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Head, url)));\n };\n /**\n * Performs a request with `options` http method.\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Http.prototype.options = function (url, options) {\n return this.request(new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Options, url)));\n };\n Http.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n Http.ctorParameters = function () { return [\n { type: ConnectionBackend, },\n { type: RequestOptions, },\n ]; };\n return Http;\n }());\n /**\n * @experimental\n */\n var Jsonp = (function (_super) {\n __extends$4(Jsonp, _super);\n /**\n * @param {?} backend\n * @param {?} defaultOptions\n */\n function Jsonp(backend, defaultOptions) {\n _super.call(this, backend, defaultOptions);\n }\n /**\n * Performs any type of http request. First argument is required, and can either be a url or\n * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}\n * object can be provided as the 2nd argument. The options object will be merged with the values\n * of {@link BaseRequestOptions} before performing the request.\n * *\n * supported by all current browsers. Because JSONP creates a `<script>` element with\n * contents retrieved from a remote source, attacker-controlled data introduced by an untrusted\n * source could expose your application to XSS risks. Data exposed by JSONP may also be\n * readable by malicious third-party websites. In addition, JSONP introduces potential risk for\n * future security issues (e.g. content sniffing). For more detail, see the\n * [Security Guide](http://g.co/ng/security).\n * @param {?} url\n * @param {?=} options\n * @return {?}\n */\n Jsonp.prototype.request = function (url, options) {\n var /** @type {?} */ responseObservable;\n if (typeof url === 'string') {\n url =\n new Request(mergeOptions(this._defaultOptions, options, RequestMethod.Get, /** @type {?} */ (url)));\n }\n if (url instanceof Request) {\n if (url.method !== RequestMethod.Get) {\n throw new Error('JSONP requests must use GET request method.');\n }\n responseObservable = httpRequest(this._backend, url);\n }\n else {\n throw new Error('First argument must be a url string or Request instance.');\n }\n return responseObservable;\n };\n Jsonp.decorators = [\n { type: _angular_core.Injectable },\n ];\n /** @nocollapse */\n Jsonp.ctorParameters = function () { return [\n { type: ConnectionBackend, },\n { type: RequestOptions, },\n ]; };\n return Jsonp;\n }(Http));\n\n /**\n * @return {?}\n */\n function _createDefaultCookieXSRFStrategy() {\n return new CookieXSRFStrategy();\n }\n /**\n * @param {?} xhrBackend\n * @param {?} requestOptions\n * @return {?}\n */\n function httpFactory(xhrBackend, requestOptions) {\n return new Http(xhrBackend, requestOptions);\n }\n /**\n * @param {?} jsonpBackend\n * @param {?} requestOptions\n * @return {?}\n */\n function jsonpFactory(jsonpBackend, requestOptions) {\n return new Jsonp(jsonpBackend, requestOptions);\n }\n /**\n * The module that includes http's providers\n * *\n */\n var HttpModule = (function () {\n function HttpModule() {\n }\n HttpModule.decorators = [\n { type: _angular_core.NgModule, args: [{\n providers: [\n // TODO(pascal): use factory type annotations once supported in DI\n // issue: https://github.com/angular/angular/issues/3183\n { provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions] },\n BrowserXhr,\n { provide: RequestOptions, useClass: BaseRequestOptions },\n { provide: ResponseOptions, useClass: BaseResponseOptions },\n XHRBackend,\n { provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy },\n ],\n },] },\n ];\n /** @nocollapse */\n HttpModule.ctorParameters = function () { return []; };\n return HttpModule;\n }());\n /**\n * The module that includes jsonp's providers\n * *\n */\n var JsonpModule = (function () {\n function JsonpModule() {\n }\n JsonpModule.decorators = [\n { type: _angular_core.NgModule, args: [{\n providers: [\n // TODO(pascal): use factory type annotations once supported in DI\n // issue: https://github.com/angular/angular/issues/3183\n { provide: Jsonp, useFactory: jsonpFactory, deps: [JSONPBackend, RequestOptions] },\n BrowserJsonp,\n { provide: RequestOptions, useClass: BaseRequestOptions },\n { provide: ResponseOptions, useClass: BaseResponseOptions },\n { provide: JSONPBackend, useClass: JSONPBackend_ },\n ],\n },] },\n ];\n /** @nocollapse */\n JsonpModule.ctorParameters = function () { return []; };\n return JsonpModule;\n }());\n\n /**\n * @stable\n */\n var /** @type {?} */ VERSION = new _angular_core.Version('2.4.1');\n\n exports.BrowserXhr = BrowserXhr;\n exports.JSONPBackend = JSONPBackend;\n exports.JSONPConnection = JSONPConnection;\n exports.CookieXSRFStrategy = CookieXSRFStrategy;\n exports.XHRBackend = XHRBackend;\n exports.XHRConnection = XHRConnection;\n exports.BaseRequestOptions = BaseRequestOptions;\n exports.RequestOptions = RequestOptions;\n exports.BaseResponseOptions = BaseResponseOptions;\n exports.ResponseOptions = ResponseOptions;\n exports.ReadyState = ReadyState;\n exports.RequestMethod = RequestMethod;\n exports.ResponseContentType = ResponseContentType;\n exports.ResponseType = ResponseType;\n exports.Headers = Headers;\n exports.Http = Http;\n exports.Jsonp = Jsonp;\n exports.HttpModule = HttpModule;\n exports.JsonpModule = JsonpModule;\n exports.Connection = Connection;\n exports.ConnectionBackend = ConnectionBackend;\n exports.XSRFStrategy = XSRFStrategy;\n exports.Request = Request;\n exports.Response = Response;\n exports.QueryEncoder = QueryEncoder;\n exports.URLSearchParams = URLSearchParams;\n exports.VERSION = VERSION;\n\n}));//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9AYW5ndWxhci9odHRwL2J1bmRsZXMvaHR0cC51bWQuanM/ZGRkOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjIuNC4xXG4gKiAoYykgMjAxMC0yMDE2IEdvb2dsZSwgSW5jLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ0Bhbmd1bGFyL2NvcmUnKSwgcmVxdWlyZSgncnhqcy9PYnNlcnZhYmxlJyksIHJlcXVpcmUoJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInKSkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnQGFuZ3VsYXIvY29yZScsICdyeGpzL09ic2VydmFibGUnLCAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlciddLCBmYWN0b3J5KSA6XG4gICAgKGZhY3RvcnkoKGdsb2JhbC5uZyA9IGdsb2JhbC5uZyB8fCB7fSwgZ2xvYmFsLm5nLmh0dHAgPSBnbG9iYWwubmcuaHR0cCB8fCB7fSksZ2xvYmFsLm5nLmNvcmUsZ2xvYmFsLlJ4LGdsb2JhbC5uZy5wbGF0Zm9ybUJyb3dzZXIpKTtcbn0odGhpcywgZnVuY3Rpb24gKGV4cG9ydHMsX2FuZ3VsYXJfY29yZSxyeGpzX09ic2VydmFibGUsX2FuZ3VsYXJfcGxhdGZvcm1Ccm93c2VyKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8qKlxuICAgICAqICBBIGJhY2tlbmQgZm9yIGh0dHAgdGhhdCB1c2VzIHRoZSBgWE1MSHR0cFJlcXVlc3RgIGJyb3dzZXIgQVBJLlxuICAgICAgKiAqXG4gICAgICAqIFRha2UgY2FyZSBub3QgdG8gZXZhbHVhdGUgdGhpcyBpbiBub24tYnJvd3NlciBjb250ZXh0cy5cbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBCcm93c2VyWGhyID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQnJvd3NlclhocigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEJyb3dzZXJYaHIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKChuZXcgWE1MSHR0cFJlcXVlc3QoKSkpOyB9O1xuICAgICAgICBCcm93c2VyWGhyLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgQnJvd3Nlclhoci5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gQnJvd3NlclhocjtcbiAgICB9KCkpO1xuXG4gICAgdmFyIFJlcXVlc3RNZXRob2QgPSB7fTtcbiAgICBSZXF1ZXN0TWV0aG9kLkdldCA9IDA7XG4gICAgUmVxdWVzdE1ldGhvZC5Qb3N0ID0gMTtcbiAgICBSZXF1ZXN0TWV0aG9kLlB1dCA9IDI7XG4gICAgUmVxdWVzdE1ldGhvZC5EZWxldGUgPSAzO1xuICAgIFJlcXVlc3RNZXRob2QuT3B0aW9ucyA9IDQ7XG4gICAgUmVxdWVzdE1ldGhvZC5IZWFkID0gNTtcbiAgICBSZXF1ZXN0TWV0aG9kLlBhdGNoID0gNjtcbiAgICBSZXF1ZXN0TWV0aG9kW1JlcXVlc3RNZXRob2QuR2V0XSA9IFwiR2V0XCI7XG4gICAgUmVxdWVzdE1ldGhvZFtSZXF1ZXN0TWV0aG9kLlBvc3RdID0gXCJQb3N0XCI7XG4gICAgUmVxdWVzdE1ldGhvZFtSZXF1ZXN0TWV0aG9kLlB1dF0gPSBcIlB1dFwiO1xuICAgIFJlcXVlc3RNZXRob2RbUmVxdWVzdE1ldGhvZC5EZWxldGVdID0gXCJEZWxldGVcIjtcbiAgICBSZXF1ZXN0TWV0aG9kW1JlcXVlc3RNZXRob2QuT3B0aW9uc10gPSBcIk9wdGlvbnNcIjtcbiAgICBSZXF1ZXN0TWV0aG9kW1JlcXVlc3RNZXRob2QuSGVhZF0gPSBcIkhlYWRcIjtcbiAgICBSZXF1ZXN0TWV0aG9kW1JlcXVlc3RNZXRob2QuUGF0Y2hdID0gXCJQYXRjaFwiO1xuICAgIHZhciBSZWFkeVN0YXRlID0ge307XG4gICAgUmVhZHlTdGF0ZS5VbnNlbnQgPSAwO1xuICAgIFJlYWR5U3RhdGUuT3BlbiA9IDE7XG4gICAgUmVhZHlTdGF0ZS5IZWFkZXJzUmVjZWl2ZWQgPSAyO1xuICAgIFJlYWR5U3RhdGUuTG9hZGluZyA9IDM7XG4gICAgUmVhZHlTdGF0ZS5Eb25lID0gNDtcbiAgICBSZWFkeVN0YXRlLkNhbmNlbGxlZCA9IDU7XG4gICAgUmVhZHlTdGF0ZVtSZWFkeVN0YXRlLlVuc2VudF0gPSBcIlVuc2VudFwiO1xuICAgIFJlYWR5U3RhdGVbUmVhZHlTdGF0ZS5PcGVuXSA9IFwiT3BlblwiO1xuICAgIFJlYWR5U3RhdGVbUmVhZHlTdGF0ZS5IZWFkZXJzUmVjZWl2ZWRdID0gXCJIZWFkZXJzUmVjZWl2ZWRcIjtcbiAgICBSZWFkeVN0YXRlW1JlYWR5U3RhdGUuTG9hZGluZ10gPSBcIkxvYWRpbmdcIjtcbiAgICBSZWFkeVN0YXRlW1JlYWR5U3RhdGUuRG9uZV0gPSBcIkRvbmVcIjtcbiAgICBSZWFkeVN0YXRlW1JlYWR5U3RhdGUuQ2FuY2VsbGVkXSA9IFwiQ2FuY2VsbGVkXCI7XG4gICAgdmFyIFJlc3BvbnNlVHlwZSA9IHt9O1xuICAgIFJlc3BvbnNlVHlwZS5CYXNpYyA9IDA7XG4gICAgUmVzcG9uc2VUeXBlLkNvcnMgPSAxO1xuICAgIFJlc3BvbnNlVHlwZS5EZWZhdWx0ID0gMjtcbiAgICBSZXNwb25zZVR5cGUuRXJyb3IgPSAzO1xuICAgIFJlc3BvbnNlVHlwZS5PcGFxdWUgPSA0O1xuICAgIFJlc3BvbnNlVHlwZVtSZXNwb25zZVR5cGUuQmFzaWNdID0gXCJCYXNpY1wiO1xuICAgIFJlc3BvbnNlVHlwZVtSZXNwb25zZVR5cGUuQ29yc10gPSBcIkNvcnNcIjtcbiAgICBSZXNwb25zZVR5cGVbUmVzcG9uc2VUeXBlLkRlZmF1bHRdID0gXCJEZWZhdWx0XCI7XG4gICAgUmVzcG9uc2VUeXBlW1Jlc3BvbnNlVHlwZS5FcnJvcl0gPSBcIkVycm9yXCI7XG4gICAgUmVzcG9uc2VUeXBlW1Jlc3BvbnNlVHlwZS5PcGFxdWVdID0gXCJPcGFxdWVcIjtcbiAgICB2YXIgQ29udGVudFR5cGUgPSB7fTtcbiAgICBDb250ZW50VHlwZS5OT05FID0gMDtcbiAgICBDb250ZW50VHlwZS5KU09OID0gMTtcbiAgICBDb250ZW50VHlwZS5GT1JNID0gMjtcbiAgICBDb250ZW50VHlwZS5GT1JNX0RBVEEgPSAzO1xuICAgIENvbnRlbnRUeXBlLlRFWFQgPSA0O1xuICAgIENvbnRlbnRUeXBlLkJMT0IgPSA1O1xuICAgIENvbnRlbnRUeXBlLkFSUkFZX0JVRkZFUiA9IDY7XG4gICAgQ29udGVudFR5cGVbQ29udGVudFR5cGUuTk9ORV0gPSBcIk5PTkVcIjtcbiAgICBDb250ZW50VHlwZVtDb250ZW50VHlwZS5KU09OXSA9IFwiSlNPTlwiO1xuICAgIENvbnRlbnRUeXBlW0NvbnRlbnRUeXBlLkZPUk1dID0gXCJGT1JNXCI7XG4gICAgQ29udGVudFR5cGVbQ29udGVudFR5cGUuRk9STV9EQVRBXSA9IFwiRk9STV9EQVRBXCI7XG4gICAgQ29udGVudFR5cGVbQ29udGVudFR5cGUuVEVYVF0gPSBcIlRFWFRcIjtcbiAgICBDb250ZW50VHlwZVtDb250ZW50VHlwZS5CTE9CXSA9IFwiQkxPQlwiO1xuICAgIENvbnRlbnRUeXBlW0NvbnRlbnRUeXBlLkFSUkFZX0JVRkZFUl0gPSBcIkFSUkFZX0JVRkZFUlwiO1xuICAgIHZhciBSZXNwb25zZUNvbnRlbnRUeXBlID0ge307XG4gICAgUmVzcG9uc2VDb250ZW50VHlwZS5UZXh0ID0gMDtcbiAgICBSZXNwb25zZUNvbnRlbnRUeXBlLkpzb24gPSAxO1xuICAgIFJlc3BvbnNlQ29udGVudFR5cGUuQXJyYXlCdWZmZXIgPSAyO1xuICAgIFJlc3BvbnNlQ29udGVudFR5cGUuQmxvYiA9IDM7XG4gICAgUmVzcG9uc2VDb250ZW50VHlwZVtSZXNwb25zZUNvbnRlbnRUeXBlLlRleHRdID0gXCJUZXh0XCI7XG4gICAgUmVzcG9uc2VDb250ZW50VHlwZVtSZXNwb25zZUNvbnRlbnRUeXBlLkpzb25dID0gXCJKc29uXCI7XG4gICAgUmVzcG9uc2VDb250ZW50VHlwZVtSZXNwb25zZUNvbnRlbnRUeXBlLkFycmF5QnVmZmVyXSA9IFwiQXJyYXlCdWZmZXJcIjtcbiAgICBSZXNwb25zZUNvbnRlbnRUeXBlW1Jlc3BvbnNlQ29udGVudFR5cGUuQmxvYl0gPSBcIkJsb2JcIjtcblxuICAgIC8qKlxuICAgICAqICBQb2x5ZmlsbCBmb3IgW0hlYWRlcnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IZWFkZXJzL0hlYWRlcnMpLCBhc1xuICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIFtGZXRjaCBTcGVjXShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVycy1jbGFzcykuXG4gICAgICAqICpcbiAgICAgICogVGhlIG9ubHkga25vd24gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYEhlYWRlcnNgIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgc3BlYyBpcyB0aGVcbiAgICAgICogbGFjayBvZiBhbiBgZW50cmllc2AgbWV0aG9kLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGltcG9ydCB7SGVhZGVyc30gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG4gICAgICAqICpcbiAgICAgICogdmFyIGZpcnN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAqIGZpcnN0SGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdpbWFnZS9qcGVnJyk7XG4gICAgICAqIGNvbnNvbGUubG9nKGZpcnN0SGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpKSAvLydpbWFnZS9qcGVnJ1xuICAgICAgKiAqXG4gICAgICAqIC8vIENyZWF0ZSBoZWFkZXJzIGZyb20gUGxhaW4gT2xkIEphdmFTY3JpcHQgT2JqZWN0XG4gICAgICAqIHZhciBzZWNvbmRIZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICAgICAgKiAnWC1NeS1DdXN0b20tSGVhZGVyJzogJ0FuZ3VsYXInXG4gICAgICAqIH0pO1xuICAgICAgKiBjb25zb2xlLmxvZyhzZWNvbmRIZWFkZXJzLmdldCgnWC1NeS1DdXN0b20tSGVhZGVyJykpOyAvLydBbmd1bGFyJ1xuICAgICAgKiAqXG4gICAgICAqIHZhciB0aGlyZEhlYWRlcnMgPSBuZXcgSGVhZGVycyhzZWNvbmRIZWFkZXJzKTtcbiAgICAgICogY29uc29sZS5sb2codGhpcmRIZWFkZXJzLmdldCgnWC1NeS1DdXN0b20tSGVhZGVyJykpOyAvLydBbmd1bGFyJ1xuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBIZWFkZXJzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IGhlYWRlcnNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgaGVhZGVyIG5hbWVzIGFyZSBsb3dlciBjYXNlICovXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCBtYXAgbG93ZXIgY2FzZSBuYW1lcyB0byBhY3R1YWwgbmFtZXMgKi9cbiAgICAgICAgICAgIHRoaXMuX25vcm1hbGl6ZWROYW1lcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGlmICghaGVhZGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgICAgICAgICAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVzLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gX3RoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKTsgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KGhlYWRlcnNbbmFtZV0pID8gaGVhZGVyc1tuYW1lXSA6IFtoZWFkZXJzW25hbWVdXTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kZWxldGUobmFtZSk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBfdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpOyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyBhIG5ldyBIZWFkZXJzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIERPTVN0cmluZyBvZiBSZXNwb25zZSBIZWFkZXJzXG4gICAgICAgICAqIEBwYXJhbSB7P30gaGVhZGVyc1N0cmluZ1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5mcm9tUmVzcG9uc2VIZWFkZXJTdHJpbmcgPSBmdW5jdGlvbiAoaGVhZGVyc1N0cmluZykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgICAgICBoZWFkZXJzU3RyaW5nLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaW5kZXggPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5hbWVfMSA9IGxpbmUuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2YWx1ZSA9IGxpbmUuc2xpY2UoaW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0KG5hbWVfMSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQXBwZW5kcyBhIGhlYWRlciB0byBleGlzdGluZyBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm9yIGEgZ2l2ZW4gaGVhZGVyIG5hbWUuXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBEZWxldGVzIGFsbCBoZWFkZXIgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGNOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplZE5hbWVzLmRlbGV0ZShsY05hbWUpO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVycy5kZWxldGUobGNOYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gZm5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlcywgbGNOYW1lKSB7IHJldHVybiBmbih2YWx1ZXMsIF90aGlzLl9ub3JtYWxpemVkTmFtZXMuZ2V0KGxjTmFtZSksIF90aGlzLl9oZWFkZXJzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyBmaXJzdCBoZWFkZXIgdGhhdCBtYXRjaGVzIGdpdmVuIG5hbWUuXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHZhbHVlcyA9IHRoaXMuZ2V0QWxsKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDaGVja3MgZm9yIGV4aXN0ZW5jZSBvZiBoZWFkZXIgYnkgZ2l2ZW4gbmFtZS5cbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gdGhpcy5faGVhZGVycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fbm9ybWFsaXplZE5hbWVzLnZhbHVlcygpKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBTZXRzIG9yIG92ZXJyaWRlcyBoZWFkZXIgdmFsdWUgZm9yIGdpdmVuIG5hbWUuXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVycy5zZXQobmFtZS50b0xvd2VyQ2FzZSgpLCBbdmFsdWUuam9pbignLCcpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGVhZGVycy5zZXQobmFtZS50b0xvd2VyQ2FzZSgpLCBbdmFsdWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF5QmVTZXROb3JtYWxpemVkTmFtZShuYW1lKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZXR1cm5zIHZhbHVlcyBvZiBhbGwgaGVhZGVycy5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faGVhZGVycy52YWx1ZXMoKSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHNlcmlhbGl6ZWQgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVzLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gc3BsaXQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikgeyByZXR1cm4gc3BsaXQucHVzaC5hcHBseShzcGxpdCwgdi5zcGxpdCgnLCcpKTsgfSk7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZFtfdGhpcy5fbm9ybWFsaXplZE5hbWVzLmdldChuYW1lKV0gPSBzcGxpdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIZWFkZXJzLnByb3RvdHlwZS5nZXRBbGwgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5faGVhZGVycy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCdcImVudHJpZXNcIiBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIG9uIEhlYWRlcnMgY2xhc3MnKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gbmFtZVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSGVhZGVycy5wcm90b3R5cGUubWF5QmVTZXROb3JtYWxpemVkTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsY05hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX25vcm1hbGl6ZWROYW1lcy5oYXMobGNOYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vcm1hbGl6ZWROYW1lcy5zZXQobGNOYW1lLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEhlYWRlcnM7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDEgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIHJlc3BvbnNlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIG9wdGlvbmFsbHkgcHJvdmlkZWQgd2hlbiBpbnN0YW50aWF0aW5nIGFcbiAgICAgICoge0BsaW5rIFJlc3BvbnNlfS5cbiAgICAgICogKlxuICAgICAgKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBgUmVzcG9uc2VJbml0YCBkZXNjcmlwdGlvbiBpbiB0aGUgW0ZldGNoXG4gICAgICAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZWluaXQpLlxuICAgICAgKiAqXG4gICAgICAqIEFsbCB2YWx1ZXMgYXJlIG51bGwgYnkgZGVmYXVsdC4gVHlwaWNhbCBkZWZhdWx0cyBjYW4gYmUgZm91bmQgaW4gdGhlXG4gICAgICAqIHtAbGluayBCYXNlUmVzcG9uc2VPcHRpb25zfSBjbGFzcywgd2hpY2ggc3ViLWNsYXNzZXMgYFJlc3BvbnNlT3B0aW9uc2AuXG4gICAgICAqICpcbiAgICAgICogVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCBpbiB0ZXN0cyB0byBidWlsZCB7QGxpbmsgUmVzcG9uc2UgUmVzcG9uc2VzfSBmb3JcbiAgICAgICogbW9jayByZXNwb25zZXMgKHNlZSB7QGxpbmsgTW9ja0JhY2tlbmR9KS5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUDlKa2s4ZThjejZOVnpiY3hFc0Q/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGltcG9ydCB7UmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG4gICAgICAqICpcbiAgICAgICogdmFyIG9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtcbiAgICAgICogYm9keTogJ3tcIm5hbWVcIjpcIkplZmZcIn0nXG4gICAgICAqIH0pO1xuICAgICAgKiB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKG9wdGlvbnMpO1xuICAgICAgKiAqXG4gICAgICAqIGNvbnNvbGUubG9nKCdyZXMuanNvbigpOicsIHJlcy5qc29uKCkpOyAvLyBPYmplY3Qge25hbWU6IFwiSmVmZlwifVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBSZXNwb25zZU9wdGlvbnMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gX18wXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBSZXNwb25zZU9wdGlvbnMoX2EpIHtcbiAgICAgICAgICAgIHZhciBfYiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hLCBib2R5ID0gX2IuYm9keSwgc3RhdHVzID0gX2Iuc3RhdHVzLCBoZWFkZXJzID0gX2IuaGVhZGVycywgc3RhdHVzVGV4dCA9IF9iLnN0YXR1c1RleHQsIHR5cGUgPSBfYi50eXBlLCB1cmwgPSBfYi51cmw7XG4gICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5ICE9IG51bGwgPyBib2R5IDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzICE9IG51bGwgPyBzdGF0dXMgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0ICE9IG51bGwgPyBzdGF0dXNUZXh0IDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGUgIT0gbnVsbCA/IHR5cGUgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy51cmwgPSB1cmwgIT0gbnVsbCA/IHVybCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqICBDcmVhdGVzIGEgY29weSBvZiB0aGUgYFJlc3BvbnNlT3B0aW9uc2AgaW5zdGFuY2UsIHVzaW5nIHRoZSBvcHRpb25hbCBpbnB1dCBhcyB2YWx1ZXMgdG9cbiAgICAgICAgICAqIG92ZXJyaWRlXG4gICAgICAgICAgKiBleGlzdGluZyB2YWx1ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCBpcyBiZWluZ1xuICAgICAgICAgICogY2FsbGVkLlxuICAgICAgICAgICogKlxuICAgICAgICAgICogVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gc2hhcmluZyBhIGJhc2UgYFJlc3BvbnNlT3B0aW9uc2Agb2JqZWN0IGluc2lkZSB0ZXN0cyxcbiAgICAgICAgICAqIHdoZXJlIGNlcnRhaW4gcHJvcGVydGllcyBtYXkgY2hhbmdlIGZyb20gdGVzdCB0byB0ZXN0LlxuICAgICAgICAgICogKlxuICAgICAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzFsWHF1cUZmZ2R1VEZCV2pOb1JFP3A9cHJldmlldykpXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAgICAgKiBpbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuICAgICAgICAgICogKlxuICAgICAgICAgICogdmFyIG9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtcbiAgICAgICAgICAqIGJvZHk6IHtuYW1lOiAnSmVmZid9XG4gICAgICAgICAgKiB9KTtcbiAgICAgICAgICAqIHZhciByZXMgPSBuZXcgUmVzcG9uc2Uob3B0aW9ucy5tZXJnZSh7XG4gICAgICAgICAgKiB1cmw6ICdodHRwczovL2dvb2dsZS5jb20nXG4gICAgICAgICAgKiB9KSk7XG4gICAgICAgICAgKiBjb25zb2xlLmxvZygnb3B0aW9ucy51cmw6Jywgb3B0aW9ucy51cmwpOyAvLyBudWxsXG4gICAgICAgICAgKiBjb25zb2xlLmxvZygncmVzLmpzb24oKTonLCByZXMuanNvbigpKTsgLy8gT2JqZWN0IHtuYW1lOiBcIkplZmZcIn1cbiAgICAgICAgICAqIGNvbnNvbGUubG9nKCdyZXMudXJsOicsIHJlcy51cmwpOyAvLyBodHRwczovL2dvb2dsZS5jb21cbiAgICAgICAgICAqIGBgYFxuICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZXNwb25zZU9wdGlvbnMucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBib2R5OiBvcHRpb25zICYmIG9wdGlvbnMuYm9keSAhPSBudWxsID8gb3B0aW9ucy5ib2R5IDogdGhpcy5ib2R5LFxuICAgICAgICAgICAgICAgIHN0YXR1czogb3B0aW9ucyAmJiBvcHRpb25zLnN0YXR1cyAhPSBudWxsID8gb3B0aW9ucy5zdGF0dXMgOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycyAhPSBudWxsID8gb3B0aW9ucy5oZWFkZXJzIDogdGhpcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IG9wdGlvbnMgJiYgb3B0aW9ucy5zdGF0dXNUZXh0ICE9IG51bGwgPyBvcHRpb25zLnN0YXR1c1RleHQgOiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogb3B0aW9ucyAmJiBvcHRpb25zLnR5cGUgIT0gbnVsbCA/IG9wdGlvbnMudHlwZSA6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICB1cmw6IG9wdGlvbnMgJiYgb3B0aW9ucy51cmwgIT0gbnVsbCA/IG9wdGlvbnMudXJsIDogdGhpcy51cmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlc3BvbnNlT3B0aW9ucztcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBTdWJjbGFzcyBvZiB7QGxpbmsgUmVzcG9uc2VPcHRpb25zfSwgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICogKlxuICAgICAgKiBEZWZhdWx0IHZhbHVlczpcbiAgICAgICogKiBzdGF0dXM6IDIwMFxuICAgICAgKiAqIGhlYWRlcnM6IGVtcHR5IHtAbGluayBIZWFkZXJzfSBvYmplY3RcbiAgICAgICogKlxuICAgICAgKiBUaGlzIGNsYXNzIGNvdWxkIGJlIGV4dGVuZGVkIGFuZCBib3VuZCB0byB0aGUge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30gY2xhc3NcbiAgICAgICogd2hlbiBjb25maWd1cmluZyBhbiB7QGxpbmsgSW5qZWN0b3J9LCBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zXG4gICAgICAqIHVzZWQgYnkge0BsaW5rIEh0dHB9IHRvIGNyZWF0ZSB7QGxpbmsgUmVzcG9uc2UgUmVzcG9uc2VzfS5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvcXY4RExUP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBpbXBvcnQge3Byb3ZpZGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICAgICAgKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci9icm93c2VyJztcbiAgICAgICogaW1wb3J0IHtIVFRQX1BST1ZJREVSUywgSGVhZGVycywgSHR0cCwgQmFzZVJlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2VPcHRpb25zfSBmcm9tXG4gICAgICAqICdAYW5ndWxhci9odHRwJztcbiAgICAgICogaW1wb3J0IHtBcHB9IGZyb20gJy4vbXlhcHAnO1xuICAgICAgKiAqXG4gICAgICAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXNwb25zZU9wdGlvbnMge1xuICAgICAgKiBoZWFkZXJzOkhlYWRlcnMgPSBuZXcgSGVhZGVycyh7bmV0d29yazogJ2dpdGh1Yid9KTtcbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIGJvb3RzdHJhcChBcHAsIFtIVFRQX1BST1ZJREVSUywge3Byb3ZpZGU6IFJlc3BvbnNlT3B0aW9ucywgdXNlQ2xhc3M6IE15T3B0aW9uc31dKTtcbiAgICAgICogYGBgXG4gICAgICAqICpcbiAgICAgICogVGhlIG9wdGlvbnMgY291bGQgYWxzbyBiZSBleHRlbmRlZCB3aGVuIG1hbnVhbGx5IGNyZWF0aW5nIGEge0BsaW5rIFJlc3BvbnNlfVxuICAgICAgKiBvYmplY3QuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1ZuZ29zT1dpYUV4RXRic3REb2l4P3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGltcG9ydCB7QmFzZVJlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuICAgICAgKiAqXG4gICAgICAqIHZhciBvcHRpb25zID0gbmV3IEJhc2VSZXNwb25zZU9wdGlvbnMoKTtcbiAgICAgICogdmFyIHJlcyA9IG5ldyBSZXNwb25zZShvcHRpb25zLm1lcmdlKHtcbiAgICAgICogYm9keTogJ0FuZ3VsYXInLFxuICAgICAgKiBoZWFkZXJzOiBuZXcgSGVhZGVycyh7ZnJhbWV3b3JrOiAnYW5ndWxhcid9KVxuICAgICAgKiB9KSk7XG4gICAgICAqIGNvbnNvbGUubG9nKCdyZXMuaGVhZGVycy5nZXQoXCJmcmFtZXdvcmtcIik6JywgcmVzLmhlYWRlcnMuZ2V0KCdmcmFtZXdvcmsnKSk7IC8vIGFuZ3VsYXJcbiAgICAgICogY29uc29sZS5sb2coJ3Jlcy50ZXh0KCk6JywgcmVzLnRleHQoKSk7IC8vIEFuZ3VsYXI7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEJhc2VSZXNwb25zZU9wdGlvbnMgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMShCYXNlUmVzcG9uc2VPcHRpb25zLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBCYXNlUmVzcG9uc2VPcHRpb25zKCkge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgeyBzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJ09rJywgdHlwZTogUmVzcG9uc2VUeXBlLkRlZmF1bHQsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgQmFzZVJlc3BvbnNlT3B0aW9ucy5kZWNvcmF0b3JzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiBfYW5ndWxhcl9jb3JlLkluamVjdGFibGUgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgIEJhc2VSZXNwb25zZU9wdGlvbnMuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgICAgcmV0dXJuIEJhc2VSZXNwb25zZU9wdGlvbnM7XG4gICAgfShSZXNwb25zZU9wdGlvbnMpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiAgQWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCByZWFsIGJhY2tlbmRzIGFyZSBkZXJpdmVkLlxuICAgICAgKiAqXG4gICAgICAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBgQ29ubmVjdGlvbkJhY2tlbmRgIGlzIHRvIGNyZWF0ZSBuZXcgY29ubmVjdGlvbnMgdG8gZnVsZmlsbCBhIGdpdmVuXG4gICAgICAqIHtAbGluayBSZXF1ZXN0fS5cbiAgICAgICogKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBDb25uZWN0aW9uQmFja2VuZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbm5lY3Rpb25CYWNrZW5kKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZXF1ZXN0XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBDb25uZWN0aW9uQmFja2VuZC5wcm90b3R5cGUuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7IH07XG4gICAgICAgIHJldHVybiBDb25uZWN0aW9uQmFja2VuZDtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBBYnN0cmFjdCBjbGFzcyBmcm9tIHdoaWNoIHJlYWwgY29ubmVjdGlvbnMgYXJlIGRlcml2ZWQuXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgQ29ubmVjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbm5lY3Rpb24oKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbm5lY3Rpb247XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiAgQW4gWFNSRlN0cmF0ZWd5IGNvbmZpZ3VyZXMgWFNSRiBwcm90ZWN0aW9uIChlLmcuIHZpYSBoZWFkZXJzKSBvbiBhbiBIVFRQIHJlcXVlc3QuXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgWFNSRlN0cmF0ZWd5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gWFNSRlN0cmF0ZWd5KCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAYWJzdHJhY3RcbiAgICAgICAgICogQHBhcmFtIHs/fSByZXFcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFhTUkZTdHJhdGVneS5wcm90b3R5cGUuY29uZmlndXJlUmVxdWVzdCA9IGZ1bmN0aW9uIChyZXEpIHsgfTtcbiAgICAgICAgcmV0dXJuIFhTUkZTdHJhdGVneTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBtZXRob2RcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZE5hbWUobWV0aG9kKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICAgIHN3aXRjaCAobWV0aG9kLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXRob2QuR2V0O1xuICAgICAgICAgICAgY2FzZSAnUE9TVCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXRob2QuUG9zdDtcbiAgICAgICAgICAgIGNhc2UgJ1BVVCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXRob2QuUHV0O1xuICAgICAgICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdE1ldGhvZC5EZWxldGU7XG4gICAgICAgICAgICBjYXNlICdPUFRJT05TJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdE1ldGhvZC5PcHRpb25zO1xuICAgICAgICAgICAgY2FzZSAnSEVBRCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RNZXRob2QuSGVhZDtcbiAgICAgICAgICAgIGNhc2UgJ1BBVENIJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVxdWVzdE1ldGhvZC5QYXRjaDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlcXVlc3QgbWV0aG9kLiBUaGUgbWV0aG9kIFxcXCJcIiArIG1ldGhvZCArIFwiXFxcIiBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICB9XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gaXNTdWNjZXNzID0gZnVuY3Rpb24gKHN0YXR1cykgeyByZXR1cm4gKHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwKTsgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHhoclxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UmVzcG9uc2VVUkwoeGhyKSB7XG4gICAgICAgIGlmICgncmVzcG9uc2VVUkwnIGluIHhocikge1xuICAgICAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVVSTDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoL15YLVJlcXVlc3QtVVJMOi9tLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHhoci5nZXRSZXNwb25zZUhlYWRlcignWC1SZXF1ZXN0LVVSTCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBpbnB1dFxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RyaW5nVG9BcnJheUJ1ZmZlcihpbnB1dCkge1xuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB2aWV3ID0gbmV3IFVpbnQxNkFycmF5KGlucHV0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIC8qKiBAdHlwZSB7P30gKi8gaSA9IDAsIC8qKiBAdHlwZSB7P30gKi8gc3RyTGVuID0gaW5wdXQubGVuZ3RoOyBpIDwgc3RyTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZpZXdbaV0gPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3LmJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZSB1bmRlZmluZWRcbiAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICAqICpcbiAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqIEBwYXJhbSB7Pz19IHJhd1BhcmFtc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyYW1QYXJzZXIocmF3UGFyYW1zKSB7XG4gICAgICAgIGlmIChyYXdQYXJhbXMgPT09IHZvaWQgMCkgeyByYXdQYXJhbXMgPSAnJzsgfVxuICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChyYXdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcGFyYW1zID0gcmF3UGFyYW1zLnNwbGl0KCcmJyk7XG4gICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBlcUlkeCA9IHBhcmFtLmluZGV4T2YoJz0nKTtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlcUlkeCA9PSAtMSA/IFtwYXJhbSwgJyddIDogW3BhcmFtLnNsaWNlKDAsIGVxSWR4KSwgcGFyYW0uc2xpY2UoZXFJZHggKyAxKV0sIGtleSA9IF9hWzBdLCB2YWwgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXN0ID0gbWFwLmdldChrZXkpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBsaXN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqICAqXG4gICAgICovXG4gICAgdmFyIFF1ZXJ5RW5jb2RlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFF1ZXJ5RW5jb2RlcigpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBrXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBRdWVyeUVuY29kZXIucHJvdG90eXBlLmVuY29kZUtleSA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBzdGFuZGFyZEVuY29kaW5nKGspOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSB2XG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBRdWVyeUVuY29kZXIucHJvdG90eXBlLmVuY29kZVZhbHVlID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0YW5kYXJkRW5jb2Rpbmcodik7IH07XG4gICAgICAgIHJldHVybiBRdWVyeUVuY29kZXI7XG4gICAgfSgpKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IHZcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YW5kYXJkRW5jb2Rpbmcodikge1xuICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHYpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTQwL2dpLCAnQCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTNBL2dpLCAnOicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTI0L2dpLCAnJCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTJDL2dpLCAnLCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTNCL2dpLCAnOycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTJCL2dpLCAnKycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTNEL2dpLCAnPScpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTNGL2dpLCAnPycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJTJGL2dpLCAnLycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgTWFwLWxpa2UgcmVwcmVzZW50YXRpb24gb2YgdXJsIHNlYXJjaCBwYXJhbWV0ZXJzLCBiYXNlZCBvblxuICAgICAgKiBbVVJMU2VhcmNoUGFyYW1zXShodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcykgaW4gdGhlIHVybCBsaXZpbmcgc3RhbmRhcmQsXG4gICAgICAqIHdpdGggc2V2ZXJhbCBleHRlbnNpb25zIGZvciBtZXJnaW5nIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RzOlxuICAgICAgKiAtIHNldEFsbCgpXG4gICAgICAqIC0gYXBwZW5kQWxsKClcbiAgICAgICogLSByZXBsYWNlQWxsKClcbiAgICAgICogKlxuICAgICAgKiBUaGlzIGNsYXNzIGFjY2VwdHMgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBvZiAke0BsaW5rIFF1ZXJ5RW5jb2Rlcn0sXG4gICAgICAqIHdoaWNoIGlzIHVzZWQgdG8gc2VyaWFsaXplIHBhcmFtZXRlcnMgYmVmb3JlIG1ha2luZyBhIHJlcXVlc3QuIEJ5IGRlZmF1bHQsXG4gICAgICAqIGBRdWVyeUVuY29kZXJgIGVuY29kZXMga2V5cyBhbmQgdmFsdWVzIG9mIHBhcmFtZXRlcnMgdXNpbmcgYGVuY29kZVVSSUNvbXBvbmVudGAsXG4gICAgICAqIGFuZCB0aGVuIHVuLWVuY29kZXMgY2VydGFpbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGFydCBvZiB0aGUgcXVlcnlcbiAgICAgICogYWNjb3JkaW5nIHRvIElFVEYgUkZDIDM5ODY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2LlxuICAgICAgKiAqXG4gICAgICAqIFRoZXNlIGFyZSB0aGUgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgZW5jb2RlZDogYCEgJCBcXCcgKCApICogKyAsIDsgQSA5IC0gLiBfIH4gPyAvYFxuICAgICAgKiAqXG4gICAgICAqIElmIHRoZSBzZXQgb2YgYWxsb3dlZCBxdWVyeSBjaGFyYWN0ZXJzIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBhIHBhcnRpY3VsYXIgYmFja2VuZCxcbiAgICAgICogYFF1ZXJ5RW5jb2RlcmAgY2FuIGJlIHN1YmNsYXNzZWQgYW5kIHByb3ZpZGVkIGFzIHRoZSAybmQgYXJndW1lbnQgdG8gVVJMU2VhcmNoUGFyYW1zLlxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBpbXBvcnQge1VSTFNlYXJjaFBhcmFtcywgUXVlcnlFbmNvZGVyfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogY2xhc3MgTXlRdWVyeUVuY29kZXIgZXh0ZW5kcyBRdWVyeUVuY29kZXIge1xuICAgICAgKiBlbmNvZGVLZXkoazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICogcmV0dXJuIG15RW5jb2RpbmdGdW5jdGlvbihrKTtcbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIGVuY29kZVZhbHVlKHY6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAqIHJldHVybiBteUVuY29kaW5nRnVuY3Rpb24odik7XG4gICAgICAqIH1cbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIGxldCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCcnLCBuZXcgTXlRdWVyeUVuY29kZXIoKSk7XG4gICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhciBVUkxTZWFyY2hQYXJhbXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gcmF3UGFyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IHF1ZXJ5RW5jb2RlclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKHJhd1BhcmFtcywgcXVlcnlFbmNvZGVyKSB7XG4gICAgICAgICAgICBpZiAocmF3UGFyYW1zID09PSB2b2lkIDApIHsgcmF3UGFyYW1zID0gJyc7IH1cbiAgICAgICAgICAgIGlmIChxdWVyeUVuY29kZXIgPT09IHZvaWQgMCkgeyBxdWVyeUVuY29kZXIgPSBuZXcgUXVlcnlFbmNvZGVyKCk7IH1cbiAgICAgICAgICAgIHRoaXMucmF3UGFyYW1zID0gcmF3UGFyYW1zO1xuICAgICAgICAgICAgdGhpcy5xdWVyeUVuY29kZXIgPSBxdWVyeUVuY29kZXI7XG4gICAgICAgICAgICB0aGlzLnBhcmFtc01hcCA9IHBhcmFtUGFyc2VyKHJhd1BhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gY2xvbmUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCcnLCB0aGlzLnF1ZXJ5RW5jb2Rlcik7XG4gICAgICAgICAgICBjbG9uZS5hcHBlbmRBbGwodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gdGhpcy5wYXJhbXNNYXAuaGFzKHBhcmFtKTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBzdG9yZWRQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzdG9yZWRQYXJhbSkgPyBzdG9yZWRQYXJhbVswXSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gdGhpcy5wYXJhbXNNYXAuZ2V0KHBhcmFtKSB8fCBbXTsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1cbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBhcmFtLCB2YWwpIHtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IHZvaWQgMCB8fCB2YWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZShwYXJhbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGlzdCA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSkgfHwgW107XG4gICAgICAgICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBsaXN0LnB1c2godmFsKTtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHNlYXJjaFBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zZXRBbGwgPSBmdW5jdGlvbiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgc2VhcmNoUGFyYW1zLnBhcmFtc01hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgcGFyYW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXN0ID0gX3RoaXMucGFyYW1zTWFwLmdldChwYXJhbSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaCh2YWx1ZVswXSk7XG4gICAgICAgICAgICAgICAgX3RoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1cbiAgICAgICAgICogQHBhcmFtIHs/fSB2YWxcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHBhcmFtLCB2YWwpIHtcbiAgICAgICAgICAgIGlmICh2YWwgPT09IHZvaWQgMCB8fCB2YWwgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGlzdCA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSkgfHwgW107XG4gICAgICAgICAgICBsaXN0LnB1c2godmFsKTtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHNlYXJjaFBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5hcHBlbmRBbGwgPSBmdW5jdGlvbiAoc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgc2VhcmNoUGFyYW1zLnBhcmFtc01hcC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgcGFyYW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBsaXN0ID0gX3RoaXMucGFyYW1zTWFwLmdldChwYXJhbSkgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgLyoqIEB0eXBlIHs/fSAqLyBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaCh2YWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHNlYXJjaFBhcmFtc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHNlYXJjaFBhcmFtcykge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5wYXJhbXNNYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbGlzdCA9IF90aGlzLnBhcmFtc01hcC5nZXQocGFyYW0pIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciAvKiogQHR5cGUgez99ICovIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3RoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHBhcmFtc0xpc3QgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucGFyYW1zTWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlcywgaykge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7IHJldHVybiBwYXJhbXNMaXN0LnB1c2goX3RoaXMucXVlcnlFbmNvZGVyLmVuY29kZUtleShrKSArICc9JyArIF90aGlzLnF1ZXJ5RW5jb2Rlci5lbmNvZGVWYWx1ZSh2KSk7IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zTGlzdC5qb2luKCcmJyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChwYXJhbSkgeyB0aGlzLnBhcmFtc01hcC5kZWxldGUocGFyYW0pOyB9O1xuICAgICAgICByZXR1cm4gVVJMU2VhcmNoUGFyYW1zO1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiAgSFRUUCByZXF1ZXN0IGJvZHkgdXNlZCBieSBib3RoIHtAbGluayBSZXF1ZXN0fSBhbmQge0BsaW5rIFJlc3BvbnNlfVxuICAgICAgKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keVxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIHZhciBCb2R5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gQm9keSgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogIEF0dGVtcHRzIHRvIHJldHVybiBib2R5IGFzIHBhcnNlZCBgSlNPTmAgb2JqZWN0LCBvciByYWlzZXMgYW4gZXhjZXB0aW9uLlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQm9keS5wcm90b3R5cGUuanNvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSgvKiogQHR5cGUgez99ICovICh0aGlzLl9ib2R5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy50ZXh0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvZHk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUgYm9keSBhcyBhIHN0cmluZywgcHJlc3VtaW5nIGB0b1N0cmluZygpYCBjYW4gYmUgY2FsbGVkIG9uIHRoZSByZXNwb25zZSBib2R5LlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQm9keS5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvZHkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fYm9keSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2JvZHkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX2JvZHksIG51bGwsIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JvZHkudG9TdHJpbmcoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBSZXR1cm4gdGhlIGJvZHkgYXMgYW4gQXJyYXlCdWZmZXJcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEJvZHkucHJvdG90eXBlLmFycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5fYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUJ1ZmZlcih0aGlzLnRleHQoKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUgcmVxdWVzdCdzIGJvZHkgYXMgYSBCbG9iLCBhc3N1bWluZyB0aGF0IGJvZHkgZXhpc3RzLlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQm9keS5wcm90b3R5cGUuYmxvYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib2R5IGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5fYm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFt0aGlzLl9ib2R5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IGJvZHkgaXNuXFwndCBlaXRoZXIgYSBibG9iIG9yIGFuIGFycmF5IGJ1ZmZlcicpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gQm9keTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMkMiA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGBSZXNwb25zZWAgaW5zdGFuY2VzIGZyb20gcHJvdmlkZWQgdmFsdWVzLlxuICAgICAgKiAqXG4gICAgICAqIFRob3VnaCB0aGlzIG9iamVjdCBpc24ndFxuICAgICAgKiB1c3VhbGx5IGluc3RhbnRpYXRlZCBieSBlbmQtdXNlcnMsIGl0IGlzIHRoZSBwcmltYXJ5IG9iamVjdCBpbnRlcmFjdGVkIHdpdGggd2hlbiBpdCBjb21lcyB0aW1lIHRvXG4gICAgICAqIGFkZCBkYXRhIHRvIGEgdmlldy5cbiAgICAgICogKlxuICAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAgKiAqXG4gICAgICAqIGBgYFxuICAgICAgKiBodHRwLnJlcXVlc3QoJ215LWZyaWVuZHMudHh0Jykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHRoaXMuZnJpZW5kcyA9IHJlc3BvbnNlLnRleHQoKSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIFRoZSBSZXNwb25zZSdzIGludGVyZmFjZSBpcyBpbnNwaXJlZCBieSB0aGUgUmVzcG9uc2UgY29uc3RydWN0b3IgZGVmaW5lZCBpbiB0aGUgW0ZldGNoXG4gICAgICAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZS1jbGFzcyksIGJ1dCBpcyBjb25zaWRlcmVkIGEgc3RhdGljIHZhbHVlIHdob3NlIGJvZHlcbiAgICAgICogY2FuIGJlIGFjY2Vzc2VkIG1hbnkgdGltZXMuIFRoZXJlIGFyZSBvdGhlciBkaWZmZXJlbmNlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCB0aGlzIGlzIHRoZVxuICAgICAgKiBtb3N0IHNpZ25pZmljYW50LlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIFJlc3BvbnNlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzJDIoUmVzcG9uc2UsIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlc3BvbnNlT3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVzcG9uc2UocmVzcG9uc2VPcHRpb25zKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2JvZHkgPSByZXNwb25zZU9wdGlvbnMuYm9keTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2VPcHRpb25zLnN0YXR1cztcbiAgICAgICAgICAgIHRoaXMub2sgPSAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDw9IDI5OSk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSByZXNwb25zZU9wdGlvbnMuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IHJlc3BvbnNlT3B0aW9ucy5oZWFkZXJzO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gcmVzcG9uc2VPcHRpb25zLnR5cGU7XG4gICAgICAgICAgICB0aGlzLnVybCA9IHJlc3BvbnNlT3B0aW9ucy51cmw7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZXNwb25zZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJSZXNwb25zZSB3aXRoIHN0YXR1czogXCIgKyB0aGlzLnN0YXR1cyArIFwiIFwiICsgdGhpcy5zdGF0dXNUZXh0ICsgXCIgZm9yIFVSTDogXCIgKyB0aGlzLnVybDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlc3BvbnNlO1xuICAgIH0oQm9keSkpO1xuXG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gX25leHRSZXF1ZXN0SWQgPSAwO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEpTT05QX0hPTUUgPSAnX19uZ19qc29ucF9fJztcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBfanNvbnBDb25uZWN0aW9ucyA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfZ2V0SnNvbnBDb25uZWN0aW9ucygpIHtcbiAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gdyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgPyB3aW5kb3cgOiB7fTtcbiAgICAgICAgaWYgKF9qc29ucENvbm5lY3Rpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgICBfanNvbnBDb25uZWN0aW9ucyA9IHdbSlNPTlBfSE9NRV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2pzb25wQ29ubmVjdGlvbnM7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gZXZhbHVhdGUgdGhpcyBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50IVxuICAgIHZhciBCcm93c2VySnNvbnAgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBCcm93c2VySnNvbnAoKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBCcm93c2VySnNvbnAucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgbm9kZS5zcmMgPSB1cmw7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBCcm93c2VySnNvbnAucHJvdG90eXBlLm5leHRSZXF1ZXN0SUQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIl9fcmVxXCIgKyBfbmV4dFJlcXVlc3RJZCsrOyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBpZFxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgQnJvd3Nlckpzb25wLnByb3RvdHlwZS5yZXF1ZXN0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIEpTT05QX0hPTUUgKyBcIi5cIiArIGlkICsgXCIuZmluaXNoZWRcIjsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gaWRcbiAgICAgICAgICogQHBhcmFtIHs/fSBjb25uZWN0aW9uXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBCcm93c2VySnNvbnAucHJvdG90eXBlLmV4cG9zZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoaWQsIGNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2lkXSA9IGNvbm5lY3Rpb247XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IGlkXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBCcm93c2VySnNvbnAucHJvdG90eXBlLnJlbW92ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25zW2lkXSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEJyb3dzZXJKc29ucC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChub2RlKSB7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoLyoqIEB0eXBlIHs/fSAqLyAoKG5vZGUpKSk7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEJyb3dzZXJKc29ucC5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKC8qKiBAdHlwZSB7P30gKi8gKChub2RlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBCcm93c2VySnNvbnAuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBCcm93c2VySnNvbnAuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgICAgcmV0dXJuIEJyb3dzZXJKc29ucDtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICAgICAqL1xuICAgIHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBKU09OUF9FUlJfTk9fQ0FMTEJBQ0sgPSAnSlNPTlAgaW5qZWN0ZWQgc2NyaXB0IGRpZCBub3QgaW52b2tlIGNhbGxiYWNrLic7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gSlNPTlBfRVJSX1dST05HX01FVEhPRCA9ICdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBHRVQgcmVxdWVzdCBtZXRob2QuJztcbiAgICAvKipcbiAgICAgKiAgQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYW4gaW4tZmxpZ2h0IEpTT05QIHJlcXVlc3QuXG4gICAgICAqICpcbiAgICAgKiBAYWJzdHJhY3RcbiAgICAgKi9cbiAgICB2YXIgSlNPTlBDb25uZWN0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSlNPTlBDb25uZWN0aW9uKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIEpTT05QIHJlcXVlc3QgY29tcGxldGVzLCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uXG4gICAgICAgICAgKiBvZiB0aGUgbmV3IGRhdGEuXG4gICAgICAgICAqIEBhYnN0cmFjdFxuICAgICAgICAgKiBAcGFyYW0gez89fSBkYXRhXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBKU09OUENvbm5lY3Rpb24ucHJvdG90eXBlLmZpbmlzaGVkID0gZnVuY3Rpb24gKGRhdGEpIHsgfTtcbiAgICAgICAgcmV0dXJuIEpTT05QQ29ubmVjdGlvbjtcbiAgICB9KCkpO1xuICAgIHZhciBKU09OUENvbm5lY3Rpb25fID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKEpTT05QQ29ubmVjdGlvbl8sIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlcVxuICAgICAgICAgKiBAcGFyYW0gez99IF9kb21cbiAgICAgICAgICogQHBhcmFtIHs/PX0gYmFzZVJlc3BvbnNlT3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSlNPTlBDb25uZWN0aW9uXyhyZXEsIF9kb20sIGJhc2VSZXNwb25zZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2RvbSA9IF9kb207XG4gICAgICAgICAgICB0aGlzLmJhc2VSZXNwb25zZU9wdGlvbnMgPSBiYXNlUmVzcG9uc2VPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kICE9PSBSZXF1ZXN0TWV0aG9kLkdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoSlNPTlBfRVJSX1dST05HX01FVEhPRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXE7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gbmV3IHJ4anNfT2JzZXJ2YWJsZS5PYnNlcnZhYmxlKGZ1bmN0aW9uIChyZXNwb25zZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuTG9hZGluZztcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBfdGhpcy5faWQgPSBfZG9tLm5leHRSZXF1ZXN0SUQoKTtcbiAgICAgICAgICAgICAgICBfZG9tLmV4cG9zZUNvbm5lY3Rpb24oaWQsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIERhcnRcbiAgICAgICAgICAgICAgICAvLyB1cmwgPSB1cmwucmVwbGFjZSgvPUpTT05QX0NBTExCQUNLKCZ8JCkvLCBgZ2VuZXJhdGVkIG1ldGhvZGApO1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IF9kb20ucmVxdWVzdENhbGxiYWNrKF90aGlzLl9pZCk7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IHJlcS51cmw7XG4gICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc9SlNPTlBfQ0FMTEJBQ0smJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnPUpTT05QX0NBTExCQUNLJicsIFwiPVwiICsgY2FsbGJhY2sgKyBcIiZcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVybC5sYXN0SW5kZXhPZignPUpTT05QX0NBTExCQUNLJykgPT09IHVybC5sZW5ndGggLSAnPUpTT05QX0NBTExCQUNLJy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gJz1KU09OUF9DQUxMQkFDSycubGVuZ3RoKSArIChcIj1cIiArIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNjcmlwdCA9IF90aGlzLl9zY3JpcHQgPSBfZG9tLmJ1aWxkKHVybCk7XG4gICAgICAgICAgICAgICAgdmFyIG9uTG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucmVhZHlTdGF0ZSA9PT0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLkRvbmU7XG4gICAgICAgICAgICAgICAgICAgIF9kb20uY2xlYW51cChzY3JpcHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLl9maW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlT3B0aW9uc18xID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7IGJvZHk6IEpTT05QX0VSUl9OT19DQUxMQkFDSywgdHlwZTogUmVzcG9uc2VUeXBlLkVycm9yLCB1cmw6IHVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUmVzcG9uc2VPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VPcHRpb25zXzEgPSBiYXNlUmVzcG9uc2VPcHRpb25zLm1lcmdlKHJlc3BvbnNlT3B0aW9uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuZXJyb3IobmV3IFJlc3BvbnNlKHJlc3BvbnNlT3B0aW9uc18xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlT3B0aW9ucyA9IG5ldyBSZXNwb25zZU9wdGlvbnMoeyBib2R5OiBfdGhpcy5fcmVzcG9uc2VEYXRhLCB1cmw6IHVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmJhc2VSZXNwb25zZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IF90aGlzLmJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZU9ic2VydmVyLm5leHQobmV3IFJlc3BvbnNlKHJlc3BvbnNlT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZU9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgb25FcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucmVhZHlTdGF0ZSA9PT0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLkRvbmU7XG4gICAgICAgICAgICAgICAgICAgIF9kb20uY2xlYW51cChzY3JpcHQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2VPcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7IGJvZHk6IGVycm9yLm1lc3NhZ2UsIHR5cGU6IFJlc3BvbnNlVHlwZS5FcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VSZXNwb25zZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZU9ic2VydmVyLmVycm9yKG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBfZG9tLnNlbmQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWFkeVN0YXRlID0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQ7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kb20uY2xlYW51cChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/PX0gZGF0YVxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSlNPTlBDb25uZWN0aW9uXy5wcm90b3R5cGUuZmluaXNoZWQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgbGVhayBjb25uZWN0aW9uc1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZG9tLnJlbW92ZUNvbm5lY3Rpb24odGhpcy5faWQpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VEYXRhID0gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIEpTT05QQ29ubmVjdGlvbl87XG4gICAgfShKU09OUENvbm5lY3Rpb24pKTtcbiAgICAvKipcbiAgICAgKiAgQSB7QGxpbmsgQ29ubmVjdGlvbkJhY2tlbmR9IHRoYXQgdXNlcyB0aGUgSlNPTlAgc3RyYXRlZ3kgb2YgbWFraW5nIHJlcXVlc3RzLlxuICAgICAgKiAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgdmFyIEpTT05QQmFja2VuZCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyhKU09OUEJhY2tlbmQsIF9zdXBlcik7XG4gICAgICAgIGZ1bmN0aW9uIEpTT05QQmFja2VuZCgpIHtcbiAgICAgICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OUEJhY2tlbmQ7XG4gICAgfShDb25uZWN0aW9uQmFja2VuZCkpO1xuICAgIHZhciBKU09OUEJhY2tlbmRfID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgX19leHRlbmRzKEpTT05QQmFja2VuZF8sIF9zdXBlcik7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IF9icm93c2VySlNPTlBcbiAgICAgICAgICogQHBhcmFtIHs/fSBfYmFzZVJlc3BvbnNlT3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSlNPTlBCYWNrZW5kXyhfYnJvd3NlckpTT05QLCBfYmFzZVJlc3BvbnNlT3B0aW9ucykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9icm93c2VySlNPTlAgPSBfYnJvd3NlckpTT05QO1xuICAgICAgICAgICAgdGhpcy5fYmFzZVJlc3BvbnNlT3B0aW9ucyA9IF9iYXNlUmVzcG9uc2VPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEpTT05QQmFja2VuZF8ucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OUENvbm5lY3Rpb25fKHJlcXVlc3QsIHRoaXMuX2Jyb3dzZXJKU09OUCwgdGhpcy5fYmFzZVJlc3BvbnNlT3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIEpTT05QQmFja2VuZF8uZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBKU09OUEJhY2tlbmRfLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBCcm93c2VySnNvbnAsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFJlc3BvbnNlT3B0aW9ucywgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIEpTT05QQmFja2VuZF87XG4gICAgfShKU09OUEJhY2tlbmQpKTtcblxuICAgIHZhciAvKiogQHR5cGUgez99ICovIFhTU0lfUFJFRklYID0gL15cXClcXF1cXH0nLD9cXG4vO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIGNvbm5lY3Rpb25zIHVzaW5nIGBYTUxIdHRwUmVxdWVzdGAuIEdpdmVuIGEgZnVsbHktcXVhbGlmaWVkXG4gICAgICAqIHJlcXVlc3QsIGFuIGBYSFJDb25uZWN0aW9uYCB3aWxsIGltbWVkaWF0ZWx5IGNyZWF0ZSBhbiBgWE1MSHR0cFJlcXVlc3RgIG9iamVjdCBhbmQgc2VuZCB0aGVcbiAgICAgICogcmVxdWVzdC5cbiAgICAgICogKlxuICAgICAgKiBUaGlzIGNsYXNzIHdvdWxkIHR5cGljYWxseSBub3QgYmUgY3JlYXRlZCBvciBpbnRlcmFjdGVkIHdpdGggZGlyZWN0bHkgaW5zaWRlIGFwcGxpY2F0aW9ucywgdGhvdWdoXG4gICAgICAqIHRoZSB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259IG1heSBiZSBpbnRlcmFjdGVkIHdpdGggaW4gdGVzdHMuXG4gICAgICAqICpcbiAgICAgKi9cbiAgICB2YXIgWEhSQ29ubmVjdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlcVxuICAgICAgICAgKiBAcGFyYW0gez99IGJyb3dzZXJYSFJcbiAgICAgICAgICogQHBhcmFtIHs/PX0gYmFzZVJlc3BvbnNlT3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gWEhSQ29ubmVjdGlvbihyZXEsIGJyb3dzZXJYSFIsIGJhc2VSZXNwb25zZU9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXE7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gbmV3IHJ4anNfT2JzZXJ2YWJsZS5PYnNlcnZhYmxlKGZ1bmN0aW9uIChyZXNwb25zZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIF94aHIgPSBicm93c2VyWEhSLmJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgX3hoci5vcGVuKFJlcXVlc3RNZXRob2RbcmVxLm1ldGhvZF0udG9VcHBlckNhc2UoKSwgcmVxLnVybCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcS53aXRoQ3JlZGVudGlhbHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcS53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGxvYWQgZXZlbnQgaGFuZGxlclxuICAgICAgICAgICAgICAgIHZhciBvbkxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKVxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gX3hoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiBfeGhyLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBIVFRQIDIwNCBtZWFucyBubyBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2VUZXh0IGlzIHRoZSBvbGQtc2Nob29sIHdheSBvZiByZXRyaWV2aW5nIHJlc3BvbnNlIChzdXBwb3J0ZWQgYnkgSUU4ICYgOSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBSZXNvdXJjZUxvYWRlciBMZXZlbDIgc3BlY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHN1cHBvcnRlZCBieSBJRTEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9ICh0eXBlb2YgX3hoci5yZXNwb25zZSA9PT0gJ3VuZGVmaW5lZCcpID8gX3hoci5yZXNwb25zZVRleHQgOiBfeGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGljaXRseSBzdHJpcCBhIHBvdGVudGlhbCBYU1NJIHByZWZpeC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5yZXBsYWNlKFhTU0lfUFJFRklYLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gT2NjdXJzIHdoZW4gYWNjZXNzaW5nIGZpbGUgcmVzb3VyY2VzIG9yIG9uIEFuZHJvaWQgNC4xIHN0b2NrIGJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpbGUgcmV0cmlldmluZyBmaWxlcyBmcm9tIGFwcGxpY2F0aW9uIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBib2R5ID8gMjAwIDogMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGVycyA9IEhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nKF94aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJRSA5IGRvZXMgbm90IHByb3ZpZGUgdGhlIHdheSB0byBnZXQgVVJMIG9mIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSBnZXRSZXNwb25zZVVSTChfeGhyKSB8fCByZXEudXJsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzVGV4dCA9IF94aHIuc3RhdHVzVGV4dCB8fCAnT0snO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2VPcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7IGJvZHk6IGJvZHksIHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiBoZWFkZXJzLCBzdGF0dXNUZXh0OiBzdGF0dXNUZXh0LCB1cmw6IHVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VSZXNwb25zZU9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VPcHRpb25zID0gYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5vayA9IGlzU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIubmV4dChyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGdkaTIyOTApOiBkZWZlciBjb21wbGV0ZSBpZiBhcnJheSBidWZmZXIgdW50aWwgZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuZXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgZXZlbnQgaGFuZGxlclxuICAgICAgICAgICAgICAgIHZhciBvbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2VPcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBSZXNwb25zZVR5cGUuRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IF94aHIuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogX3hoci5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VSZXNwb25zZU9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VPcHRpb25zID0gYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuZXJyb3IobmV3IFJlc3BvbnNlKHJlc3BvbnNlT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0RGV0ZWN0ZWRDb250ZW50VHlwZShyZXEsIF94aHIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXEuaGVhZGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5oZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5oYXMoJ0FjY2VwdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5oZWFkZXJzLmFwcGVuZCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXEuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZXMsIG5hbWUpIHsgcmV0dXJuIF94aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZXMuam9pbignLCcpKTsgfSk7XG4gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBjb3JyZWN0IGJ1ZmZlciB0eXBlIHRvIHN0b3JlIHRoZSByZXNwb25zZVxuICAgICAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlICE9IG51bGwgJiYgX3hoci5yZXNwb25zZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcS5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzcG9uc2VDb250ZW50VHlwZS5BcnJheUJ1ZmZlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3BvbnNlQ29udGVudFR5cGUuSnNvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzcG9uc2VDb250ZW50VHlwZS5UZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF94aHIucmVzcG9uc2VUeXBlID0gJ3RleHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXNwb25zZUNvbnRlbnRUeXBlLkJsb2I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hoci5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlbGVjdGVkIHJlc3BvbnNlVHlwZSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3hoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgICAgICAgICBfeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgX3hoci5zZW5kKF90aGlzLnJlcXVlc3QuZ2V0Qm9keSgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfeGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgICAgICAgICAgICAgICBfeGhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIF94aHIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gcmVxXG4gICAgICAgICAqIEBwYXJhbSB7P30gX3hoclxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuc2V0RGV0ZWN0ZWRDb250ZW50VHlwZSA9IGZ1bmN0aW9uIChyZXEgLyoqIFRPRE8gUmVxdWVzdCAqLywgX3hociAvKiogWE1MSHR0cFJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgIC8vIFNraXAgaWYgYSBjdXN0b20gQ29udGVudC1UeXBlIGhlYWRlciBpcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKHJlcS5oZWFkZXJzICE9IG51bGwgJiYgcmVxLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0IHRoZSBkZXRlY3RlZCBjb250ZW50IHR5cGVcbiAgICAgICAgICAgIHN3aXRjaCAocmVxLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDb250ZW50VHlwZS5OT05FOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRlbnRUeXBlLkpTT046XG4gICAgICAgICAgICAgICAgICAgIF94aHIuc2V0UmVxdWVzdEhlYWRlcignY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDb250ZW50VHlwZS5GT1JNOlxuICAgICAgICAgICAgICAgICAgICBfeGhyLnNldFJlcXVlc3RIZWFkZXIoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRlbnRUeXBlLlRFWFQ6XG4gICAgICAgICAgICAgICAgICAgIF94aHIuc2V0UmVxdWVzdEhlYWRlcignY29udGVudC10eXBlJywgJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBDb250ZW50VHlwZS5CTE9COlxuICAgICAgICAgICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBibG9iID0gcmVxLmJsb2IoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2IudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3hoci5zZXRSZXF1ZXN0SGVhZGVyKCdjb250ZW50LXR5cGUnLCBibG9iLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gWEhSQ29ubmVjdGlvbjtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBgWFNSRkNvbmZpZ3VyYXRpb25gIHNldHMgdXAgQ3Jvc3MgU2l0ZSBSZXF1ZXN0IEZvcmdlcnkgKFhTUkYpIHByb3RlY3Rpb24gZm9yIHRoZSBhcHBsaWNhdGlvblxuICAgICAgKiB1c2luZyBhIGNvb2tpZS4gU2VlIHtAbGluayBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL0Nyb3NzLVNpdGVfUmVxdWVzdF9Gb3JnZXJ5XyhDU1JGKX1cbiAgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gWFNSRi5cbiAgICAgICogKlxuICAgICAgKiBBcHBsaWNhdGlvbnMgY2FuIGNvbmZpZ3VyZSBjdXN0b20gY29va2llIGFuZCBoZWFkZXIgbmFtZXMgYnkgYmluZGluZyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzXG4gICAgICAqIHdpdGggZGlmZmVyZW50IGBjb29raWVOYW1lYCBhbmQgYGhlYWRlck5hbWVgIHZhbHVlcy4gU2VlIHRoZSBtYWluIEhUVFAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZVxuICAgICAgKiBkZXRhaWxzLlxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIENvb2tpZVhTUkZTdHJhdGVneSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez89fSBfY29va2llTmFtZVxuICAgICAgICAgKiBAcGFyYW0gez89fSBfaGVhZGVyTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ29va2llWFNSRlN0cmF0ZWd5KF9jb29raWVOYW1lLCBfaGVhZGVyTmFtZSkge1xuICAgICAgICAgICAgaWYgKF9jb29raWVOYW1lID09PSB2b2lkIDApIHsgX2Nvb2tpZU5hbWUgPSAnWFNSRi1UT0tFTic7IH1cbiAgICAgICAgICAgIGlmIChfaGVhZGVyTmFtZSA9PT0gdm9pZCAwKSB7IF9oZWFkZXJOYW1lID0gJ1gtWFNSRi1UT0tFTic7IH1cbiAgICAgICAgICAgIHRoaXMuX2Nvb2tpZU5hbWUgPSBfY29va2llTmFtZTtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlck5hbWUgPSBfaGVhZGVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZXFcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIENvb2tpZVhTUkZTdHJhdGVneS5wcm90b3R5cGUuY29uZmlndXJlUmVxdWVzdCA9IGZ1bmN0aW9uIChyZXEpIHtcbiAgICAgICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIHhzcmZUb2tlbiA9IF9hbmd1bGFyX3BsYXRmb3JtQnJvd3Nlci5fX3BsYXRmb3JtX2Jyb3dzZXJfcHJpdmF0ZV9fLmdldERPTSgpLmdldENvb2tpZSh0aGlzLl9jb29raWVOYW1lKTtcbiAgICAgICAgICAgIGlmICh4c3JmVG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXEuaGVhZGVycy5zZXQodGhpcy5faGVhZGVyTmFtZSwgeHNyZlRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvb2tpZVhTUkZTdHJhdGVneTtcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBDcmVhdGVzIHtAbGluayBYSFJDb25uZWN0aW9ufSBpbnN0YW5jZXMuXG4gICAgICAqICpcbiAgICAgICogVGhpcyBjbGFzcyB3b3VsZCB0eXBpY2FsbHkgbm90IGJlIHVzZWQgYnkgZW5kIHVzZXJzLCBidXQgY291bGQgYmVcbiAgICAgICogb3ZlcnJpZGRlbiBpZiBhIGRpZmZlcmVudCBiYWNrZW5kIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkLFxuICAgICAgKiBzdWNoIGFzIGluIGEgbm9kZSBiYWNrZW5kLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGltcG9ydCB7SHR0cCwgTXlOb2RlQmFja2VuZCwgSFRUUF9QUk9WSURFUlMsIEJhc2VSZXF1ZXN0T3B0aW9uc30gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG4gICAgICAqIHZpZXdQcm92aWRlcnM6IFtcbiAgICAgICogSFRUUF9QUk9WSURFUlMsXG4gICAgICAqIHtwcm92aWRlOiBIdHRwLCB1c2VGYWN0b3J5OiAoYmFja2VuZCwgb3B0aW9ucykgPT4ge1xuICAgICAgKiByZXR1cm4gbmV3IEh0dHAoYmFja2VuZCwgb3B0aW9ucyk7XG4gICAgICAqIH0sIGRlcHM6IFtNeU5vZGVCYWNrZW5kLCBCYXNlUmVxdWVzdE9wdGlvbnNdfV1cbiAgICAgICogfSlcbiAgICAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgICAgKiBjb25zdHJ1Y3RvcihodHRwOkh0dHApIHtcbiAgICAgICogaHR0cC5yZXF1ZXN0KCdwZW9wbGUuanNvbicpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wZW9wbGUgPSByZXMuanNvbigpKTtcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhciBYSFJCYWNrZW5kID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7P30gX2Jyb3dzZXJYSFJcbiAgICAgICAgICogQHBhcmFtIHs/fSBfYmFzZVJlc3BvbnNlT3B0aW9uc1xuICAgICAgICAgKiBAcGFyYW0gez99IF94c3JmU3RyYXRlZ3lcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFhIUkJhY2tlbmQoX2Jyb3dzZXJYSFIsIF9iYXNlUmVzcG9uc2VPcHRpb25zLCBfeHNyZlN0cmF0ZWd5KSB7XG4gICAgICAgICAgICB0aGlzLl9icm93c2VyWEhSID0gX2Jyb3dzZXJYSFI7XG4gICAgICAgICAgICB0aGlzLl9iYXNlUmVzcG9uc2VPcHRpb25zID0gX2Jhc2VSZXNwb25zZU9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLl94c3JmU3RyYXRlZ3kgPSBfeHNyZlN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFhIUkJhY2tlbmQucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb24gPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5feHNyZlN0cmF0ZWd5LmNvbmZpZ3VyZVJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhIUkNvbm5lY3Rpb24ocmVxdWVzdCwgdGhpcy5fYnJvd3NlclhIUiwgdGhpcy5fYmFzZVJlc3BvbnNlT3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIFhIUkJhY2tlbmQuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBYSFJCYWNrZW5kLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBCcm93c2VyWGhyLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBSZXNwb25zZU9wdGlvbnMsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFhTUkZTdHJhdGVneSwgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIFhIUkJhY2tlbmQ7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiAgQ3JlYXRlcyBhIHJlcXVlc3Qgb3B0aW9ucyBvYmplY3QgdG8gYmUgb3B0aW9uYWxseSBwcm92aWRlZCB3aGVuIGluc3RhbnRpYXRpbmcgYVxuICAgICAgKiB7QGxpbmsgUmVxdWVzdH0uXG4gICAgICAqICpcbiAgICAgICogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiB0aGUgYFJlcXVlc3RJbml0YCBkZXNjcmlwdGlvbiBpbiB0aGUgW0ZldGNoXG4gICAgICAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdCkuXG4gICAgICAqICpcbiAgICAgICogQWxsIHZhbHVlcyBhcmUgbnVsbCBieSBkZWZhdWx0LiBUeXBpY2FsIGRlZmF1bHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUge0BsaW5rIEJhc2VSZXF1ZXN0T3B0aW9uc31cbiAgICAgICogY2xhc3MsIHdoaWNoIHN1Yi1jbGFzc2VzIGBSZXF1ZXN0T3B0aW9uc2AuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzdXdmkzbGZMcTQxYVFQS2x4QjRPP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBpbXBvcnQge1JlcXVlc3RPcHRpb25zLCBSZXF1ZXN0LCBSZXF1ZXN0TWV0aG9kfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogKlxuICAgICAgKiB2YXIgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7XG4gICAgICAqIG1ldGhvZDogUmVxdWVzdE1ldGhvZC5Qb3N0LFxuICAgICAgKiB1cmw6ICdodHRwczovL2dvb2dsZS5jb20nXG4gICAgICAqIH0pO1xuICAgICAgKiB2YXIgcmVxID0gbmV3IFJlcXVlc3Qob3B0aW9ucyk7XG4gICAgICAqIGNvbnNvbGUubG9nKCdyZXEubWV0aG9kOicsIFJlcXVlc3RNZXRob2RbcmVxLm1ldGhvZF0pOyAvLyBQb3N0XG4gICAgICAqIGNvbnNvbGUubG9nKCdvcHRpb25zLnVybDonLCBvcHRpb25zLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBSZXF1ZXN0T3B0aW9ucyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gez89fSBfXzBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIFJlcXVlc3RPcHRpb25zKF9hKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgbWV0aG9kID0gX2IubWV0aG9kLCBoZWFkZXJzID0gX2IuaGVhZGVycywgYm9keSA9IF9iLmJvZHksIHVybCA9IF9iLnVybCwgc2VhcmNoID0gX2Iuc2VhcmNoLCB3aXRoQ3JlZGVudGlhbHMgPSBfYi53aXRoQ3JlZGVudGlhbHMsIHJlc3BvbnNlVHlwZSA9IF9iLnJlc3BvbnNlVHlwZTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kICE9IG51bGwgPyBub3JtYWxpemVNZXRob2ROYW1lKG1ldGhvZCkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycyAhPSBudWxsID8gaGVhZGVycyA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLmJvZHkgPSBib2R5ICE9IG51bGwgPyBib2R5IDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXJsID0gdXJsICE9IG51bGwgPyB1cmwgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2ggPVxuICAgICAgICAgICAgICAgIHNlYXJjaCAhPSBudWxsID8gKHR5cGVvZiBzZWFyY2ggPT09ICdzdHJpbmcnID8gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpIDogc2VhcmNoKSA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyAhPSBudWxsID8gd2l0aENyZWRlbnRpYWxzIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlICE9IG51bGwgPyByZXNwb25zZVR5cGUgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIGBSZXF1ZXN0T3B0aW9uc2AgaW5zdGFuY2UsIHVzaW5nIHRoZSBvcHRpb25hbCBpbnB1dCBhcyB2YWx1ZXMgdG8gb3ZlcnJpZGVcbiAgICAgICAgICAqIGV4aXN0aW5nIHZhbHVlcy4gVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hhbmdlIHRoZSB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlIG9uIHdoaWNoIGl0IGlzIGJlaW5nXG4gICAgICAgICAgKiBjYWxsZWQuXG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiBOb3RlIHRoYXQgYGhlYWRlcnNgIGFuZCBgc2VhcmNoYCB3aWxsIG92ZXJyaWRlIGV4aXN0aW5nIHZhbHVlcyBjb21wbGV0ZWx5IGlmIHByZXNlbnQgaW5cbiAgICAgICAgICAqIHRoZSBgb3B0aW9uc2Agb2JqZWN0LiBJZiB0aGVzZSB2YWx1ZXMgc2hvdWxkIGJlIG1lcmdlZCwgaXQgc2hvdWxkIGJlIGRvbmUgcHJpb3IgdG8gY2FsbGluZ1xuICAgICAgICAgICogYG1lcmdlYCBvbiB0aGUgYFJlcXVlc3RPcHRpb25zYCBpbnN0YW5jZS5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC82dzhYQThZVGtEUmNQWXBkQjlkaz9wPXByZXZpZXcpKVxuICAgICAgICAgICogKlxuICAgICAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgICAgICogaW1wb3J0IHtSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdCwgUmVxdWVzdE1ldGhvZH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG4gICAgICAgICAgKiAqXG4gICAgICAgICAgKiB2YXIgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7XG4gICAgICAgICAgKiBtZXRob2Q6IFJlcXVlc3RNZXRob2QuUG9zdFxuICAgICAgICAgICogfSk7XG4gICAgICAgICAgKiB2YXIgcmVxID0gbmV3IFJlcXVlc3Qob3B0aW9ucy5tZXJnZSh7XG4gICAgICAgICAgKiB1cmw6ICdodHRwczovL2dvb2dsZS5jb20nXG4gICAgICAgICAgKiB9KSk7XG4gICAgICAgICAgKiBjb25zb2xlLmxvZygncmVxLm1ldGhvZDonLCBSZXF1ZXN0TWV0aG9kW3JlcS5tZXRob2RdKTsgLy8gUG9zdFxuICAgICAgICAgICogY29uc29sZS5sb2coJ29wdGlvbnMudXJsOicsIG9wdGlvbnMudXJsKTsgLy8gbnVsbFxuICAgICAgICAgICogY29uc29sZS5sb2coJ3JlcS51cmw6JywgcmVxLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICAgICAgICAgICogYGBgXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlcXVlc3RPcHRpb25zLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMgJiYgb3B0aW9ucy5tZXRob2QgIT0gbnVsbCA/IG9wdGlvbnMubWV0aG9kIDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnMgIT0gbnVsbCA/IG9wdGlvbnMuaGVhZGVycyA6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgICAgICAgICAgICAgYm9keTogb3B0aW9ucyAmJiBvcHRpb25zLmJvZHkgIT0gbnVsbCA/IG9wdGlvbnMuYm9keSA6IHRoaXMuYm9keSxcbiAgICAgICAgICAgICAgICB1cmw6IG9wdGlvbnMgJiYgb3B0aW9ucy51cmwgIT0gbnVsbCA/IG9wdGlvbnMudXJsIDogdGhpcy51cmwsXG4gICAgICAgICAgICAgICAgc2VhcmNoOiBvcHRpb25zICYmIG9wdGlvbnMuc2VhcmNoICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG9wdGlvbnMuc2VhcmNoID09PSAnc3RyaW5nJyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy5zZWFyY2gpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoLmNsb25lKCkpIDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2gsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zICYmIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICE9IG51bGwgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucyAmJiBvcHRpb25zLnJlc3BvbnNlVHlwZSAhPSBudWxsID8gb3B0aW9ucy5yZXNwb25zZVR5cGUgOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlVHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBSZXF1ZXN0T3B0aW9ucztcbiAgICB9KCkpO1xuICAgIC8qKlxuICAgICAqICBTdWJjbGFzcyBvZiB7QGxpbmsgUmVxdWVzdE9wdGlvbnN9LCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgICAgKiAqXG4gICAgICAqIERlZmF1bHQgdmFsdWVzOlxuICAgICAgKiAqIG1ldGhvZDoge0BsaW5rIFJlcXVlc3RNZXRob2QgUmVxdWVzdE1ldGhvZC5HZXR9XG4gICAgICAqICogaGVhZGVyczogZW1wdHkge0BsaW5rIEhlYWRlcnN9IG9iamVjdFxuICAgICAgKiAqXG4gICAgICAqIFRoaXMgY2xhc3MgY291bGQgYmUgZXh0ZW5kZWQgYW5kIGJvdW5kIHRvIHRoZSB7QGxpbmsgUmVxdWVzdE9wdGlvbnN9IGNsYXNzXG4gICAgICAqIHdoZW4gY29uZmlndXJpbmcgYW4ge0BsaW5rIEluamVjdG9yfSwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgICAgKiB1c2VkIGJ5IHtAbGluayBIdHRwfSB0byBjcmVhdGUgYW5kIHNlbmQge0BsaW5rIFJlcXVlc3QgUmVxdWVzdHN9LlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9MRUtWU3g/cD1wcmV2aWV3KSlcbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gICAgICAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2Jyb3dzZXInO1xuICAgICAgKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBIdHRwLCBCYXNlUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RPcHRpb25zfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogaW1wb3J0IHtBcHB9IGZyb20gJy4vbXlhcHAnO1xuICAgICAgKiAqXG4gICAgICAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXF1ZXN0T3B0aW9ucyB7XG4gICAgICAqIHNlYXJjaDogc3RyaW5nID0gJ2NvcmVUZWFtPXRydWUnO1xuICAgICAgKiB9XG4gICAgICAqICpcbiAgICAgICogYm9vdHN0cmFwKEFwcCwgW0hUVFBfUFJPVklERVJTLCB7cHJvdmlkZTogUmVxdWVzdE9wdGlvbnMsIHVzZUNsYXNzOiBNeU9wdGlvbnN9XSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIFRoZSBvcHRpb25zIGNvdWxkIGFsc28gYmUgZXh0ZW5kZWQgd2hlbiBtYW51YWxseSBjcmVhdGluZyBhIHtAbGluayBSZXF1ZXN0fVxuICAgICAgKiBvYmplY3QuXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L295Qm9Fdk50RGhPU2ZpOVl4YVZiP3A9cHJldmlldykpXG4gICAgICAqICpcbiAgICAgICogYGBgXG4gICAgICAqIGltcG9ydCB7QmFzZVJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0LCBSZXF1ZXN0TWV0aG9kfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogKlxuICAgICAgKiB2YXIgb3B0aW9ucyA9IG5ldyBCYXNlUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgICogdmFyIHJlcSA9IG5ldyBSZXF1ZXN0KG9wdGlvbnMubWVyZ2Uoe1xuICAgICAgKiBtZXRob2Q6IFJlcXVlc3RNZXRob2QuUG9zdCxcbiAgICAgICogdXJsOiAnaHR0cHM6Ly9nb29nbGUuY29tJ1xuICAgICAgKiB9KSk7XG4gICAgICAqIGNvbnNvbGUubG9nKCdyZXEubWV0aG9kOicsIFJlcXVlc3RNZXRob2RbcmVxLm1ldGhvZF0pOyAvLyBQb3N0XG4gICAgICAqIGNvbnNvbGUubG9nKCdvcHRpb25zLnVybDonLCBvcHRpb25zLnVybCk7IC8vIG51bGxcbiAgICAgICogY29uc29sZS5sb2coJ3JlcS51cmw6JywgcmVxLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICAgICAgKiBgYGBcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBCYXNlUmVxdWVzdE9wdGlvbnMgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkMyhCYXNlUmVxdWVzdE9wdGlvbnMsIF9zdXBlcik7XG4gICAgICAgIGZ1bmN0aW9uIEJhc2VSZXF1ZXN0T3B0aW9ucygpIHtcbiAgICAgICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHsgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kLkdldCwgaGVhZGVyczogbmV3IEhlYWRlcnMoKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBCYXNlUmVxdWVzdE9wdGlvbnMuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBCYXNlUmVxdWVzdE9wdGlvbnMuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfTtcbiAgICAgICAgcmV0dXJuIEJhc2VSZXF1ZXN0T3B0aW9ucztcbiAgICB9KFJlcXVlc3RPcHRpb25zKSk7XG5cbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgICAqXG4gICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gICAgICovXG4gICAgdmFyIF9fZXh0ZW5kcyQ1ID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogIENyZWF0ZXMgYFJlcXVlc3RgIGluc3RhbmNlcyBmcm9tIHByb3ZpZGVkIHZhbHVlcy5cbiAgICAgICogKlxuICAgICAgKiBUaGUgUmVxdWVzdCdzIGludGVyZmFjZSBpcyBpbnNwaXJlZCBieSB0aGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBkZWZpbmVkIGluIHRoZSBbRmV0Y2hcbiAgICAgICogU3BlY10oaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtY2xhc3MpLFxuICAgICAgKiBidXQgaXMgY29uc2lkZXJlZCBhIHN0YXRpYyB2YWx1ZSB3aG9zZSBib2R5IGNhbiBiZSBhY2Nlc3NlZCBtYW55IHRpbWVzLiBUaGVyZSBhcmUgb3RoZXJcbiAgICAgICogZGlmZmVyZW5jZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBzaWduaWZpY2FudC5cbiAgICAgICogKlxuICAgICAgKiBgUmVxdWVzdGAgaW5zdGFuY2VzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBoaWdoZXItbGV2ZWwgY2xhc3NlcywgbGlrZSB7QGxpbmsgSHR0cH0gYW5kXG4gICAgICAqIHtAbGluayBKc29ucH0sIGJ1dCBpdCBtYXkgb2NjYXNpb25hbGx5IGJlIHVzZWZ1bCB0byBleHBsaWNpdGx5IGNyZWF0ZSBgUmVxdWVzdGAgaW5zdGFuY2VzLlxuICAgICAgKiBPbmUgc3VjaCBleGFtcGxlIGlzIHdoZW4gY3JlYXRpbmcgc2VydmljZXMgdGhhdCB3cmFwIGhpZ2hlci1sZXZlbCBzZXJ2aWNlcywgbGlrZSB7QGxpbmsgSHR0cH0sXG4gICAgICAqIHdoZXJlIGl0IG1heSBiZSB1c2VmdWwgdG8gZ2VuZXJhdGUgYSBgUmVxdWVzdGAgd2l0aCBhcmJpdHJhcnkgaGVhZGVycyBhbmQgc2VhcmNoIHBhcmFtcy5cbiAgICAgICogKlxuICAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICAqIGltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0b3J9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICAgICAgKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBIdHRwLCBSZXF1ZXN0LCBSZXF1ZXN0TWV0aG9kfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogKlxuICAgICAgKiBjbGFzcyBBdXRvQXV0aGVudGljYXRvciB7XG4gICAgICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOkh0dHApIHt9XG4gICAgICAqIHJlcXVlc3QodXJsOnN0cmluZykge1xuICAgICAgKiByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QobmV3IFJlcXVlc3Qoe1xuICAgICAgKiBtZXRob2Q6IFJlcXVlc3RNZXRob2QuR2V0LFxuICAgICAgKiB1cmw6IHVybCxcbiAgICAgICogc2VhcmNoOiAncGFzc3dvcmQ9MTIzJ1xuICAgICAgKiB9KSk7XG4gICAgICAqIH1cbiAgICAgICogfVxuICAgICAgKiAqXG4gICAgICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0hUVFBfUFJPVklERVJTLCBBdXRvQXV0aGVudGljYXRvcl0pO1xuICAgICAgKiB2YXIgYXV0aGVudGljYXRvciA9IGluamVjdG9yLmdldChBdXRvQXV0aGVudGljYXRvcik7XG4gICAgICAqIGF1dGhlbnRpY2F0b3IucmVxdWVzdCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICogLy9VUkwgc2hvdWxkIGhhdmUgaW5jbHVkZWQgJz9wYXNzd29yZD0xMjMnXG4gICAgICAqIGNvbnNvbGUubG9nKCdwZW9wbGUnLCByZXMuanNvbigpKTtcbiAgICAgICogfSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIFJlcXVlc3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICBfX2V4dGVuZHMkNShSZXF1ZXN0LCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSByZXF1ZXN0T3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gUmVxdWVzdChyZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAvLyBUT0RPOiBhc3NlcnQgdGhhdCB1cmwgaXMgcHJlc2VudFxuICAgICAgICAgICAgdmFyIHVybCA9IHJlcXVlc3RPcHRpb25zLnVybDtcbiAgICAgICAgICAgIHRoaXMudXJsID0gcmVxdWVzdE9wdGlvbnMudXJsO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHZhciBzZWFyY2ggPSByZXF1ZXN0T3B0aW9ucy5zZWFyY2gudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9ICc/JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXJsLmluZGV4T2YoJz8nKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gKHRoaXMudXJsW3RoaXMudXJsLmxlbmd0aCAtIDFdID09ICcmJykgPyAnJyA6ICcmJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBqdXN0IGRlbGV0ZSBzZWFyY2gtcXVlcnktbG9va2luZyBzdHJpbmcgaW4gdXJsP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVybCA9IHVybCArIHByZWZpeCArIHNlYXJjaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ib2R5ID0gcmVxdWVzdE9wdGlvbnMuYm9keTtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kTmFtZShyZXF1ZXN0T3B0aW9ucy5tZXRob2QpO1xuICAgICAgICAgICAgLy8gVE9ETyhqZWZmYmNyb3NzKTogaW1wbGVtZW50IGJlaGF2aW9yXG4gICAgICAgICAgICAvLyBEZWZhdWx0cyB0byAnb21pdCcsIGNvbnNpc3RlbnQgd2l0aCBicm93c2VyXG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSB0aGlzLmRldGVjdENvbnRlbnRUeXBlKCk7XG4gICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RPcHRpb25zLndpdGhDcmVkZW50aWFscztcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VUeXBlID0gcmVxdWVzdE9wdGlvbnMucmVzcG9uc2VUeXBlO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUgY29udGVudCB0eXBlIGVudW0gYmFzZWQgb24gaGVhZGVyIG9wdGlvbnMuXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBSZXF1ZXN0LnByb3RvdHlwZS5kZXRlY3RDb250ZW50VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLkpTT047XG4gICAgICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLkZPUk07XG4gICAgICAgICAgICAgICAgY2FzZSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb250ZW50VHlwZS5GT1JNX0RBVEE7XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dC9wbGFpbic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dC9odG1sJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLlRFWFQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLkJMT0I7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0ZWN0Q29udGVudFR5cGVGcm9tQm9keSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiByZXF1ZXN0J3MgYm9keSBiYXNlZCBvbiBpdHMgdHlwZS5cbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIFJlcXVlc3QucHJvdG90eXBlLmRldGVjdENvbnRlbnRUeXBlRnJvbUJvZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm9keSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLk5PTkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLkZPUk07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29udGVudFR5cGUuRk9STV9EQVRBO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fYm9keSBpbnN0YW5jZW9mIEJsb2IkMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDb250ZW50VHlwZS5CTE9CO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fYm9keSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29udGVudFR5cGUuQVJSQVlfQlVGRkVSO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fYm9keSAmJiB0eXBlb2YgdGhpcy5fYm9keSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBDb250ZW50VHlwZS5KU09OO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRUeXBlLlRFWFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUmV0dXJucyB0aGUgcmVxdWVzdCdzIGJvZHkgYWNjb3JkaW5nIHRvIGl0cyB0eXBlLiBJZiBib2R5IGlzIHVuZGVmaW5lZCwgcmV0dXJuXG4gICAgICAgICAgKiBudWxsLlxuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgUmVxdWVzdC5wcm90b3R5cGUuZ2V0Qm9keSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ29udGVudFR5cGUuSlNPTjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dCgpO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29udGVudFR5cGUuRk9STTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dCgpO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29udGVudFR5cGUuRk9STV9EQVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYm9keTtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRlbnRUeXBlLlRFWFQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQoKTtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRlbnRUeXBlLkJMT0I6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKTtcbiAgICAgICAgICAgICAgICBjYXNlIENvbnRlbnRUeXBlLkFSUkFZX0JVRkZFUjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFJlcXVlc3Q7XG4gICAgfShCb2R5KSk7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyB3ID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyA/IHdpbmRvdyA6IG5vb3A7XG4gICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gRm9ybURhdGEgPSAoKHcpIC8qKiBUT0RPICM5MTAwICovKVsnRm9ybURhdGEnXSB8fCBub29wO1xuICAgIHZhciAvKiogQHR5cGUgez99ICovIEJsb2IkMSA9ICgodykgLyoqIFRPRE8gIzkxMDAgKi8pWydCbG9iJ10gfHwgbm9vcDtcbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBBcnJheUJ1ZmZlciQxID0gKCh3KSAvKiogVE9ETyAjOTEwMCAqLylbJ0FycmF5QnVmZmVyJ10gfHwgbm9vcDtcblxuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgICAgKi9cbiAgICB2YXIgX19leHRlbmRzJDQgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez99IGJhY2tlbmRcbiAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RcbiAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KGJhY2tlbmQsIHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQuY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0KS5yZXNwb25zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBkZWZhdWx0T3B0c1xuICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZWRPcHRzXG4gICAgICogQHBhcmFtIHs/fSBtZXRob2RcbiAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGRlZmF1bHRPcHRzLCBwcm92aWRlZE9wdHMsIG1ldGhvZCwgdXJsKSB7XG4gICAgICAgIHZhciAvKiogQHR5cGUgez99ICovIG5ld09wdGlvbnMgPSBkZWZhdWx0T3B0cztcbiAgICAgICAgaWYgKHByb3ZpZGVkT3B0cykge1xuICAgICAgICAgICAgLy8gSGFjayBzbyBEYXJ0IGNhbiB1c2VkIG5hbWVkIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIHJldHVybiBuZXdPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBwcm92aWRlZE9wdHMubWV0aG9kIHx8IG1ldGhvZCxcbiAgICAgICAgICAgICAgICB1cmw6IHByb3ZpZGVkT3B0cy51cmwgfHwgdXJsLFxuICAgICAgICAgICAgICAgIHNlYXJjaDogcHJvdmlkZWRPcHRzLnNlYXJjaCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBwcm92aWRlZE9wdHMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBwcm92aWRlZE9wdHMuYm9keSxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHByb3ZpZGVkT3B0cy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBwcm92aWRlZE9wdHMucmVzcG9uc2VUeXBlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld09wdGlvbnMubWVyZ2UobmV3IFJlcXVlc3RPcHRpb25zKHsgbWV0aG9kOiBtZXRob2QsIHVybDogdXJsIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogIFBlcmZvcm1zIGh0dHAgcmVxdWVzdHMgdXNpbmcgYFhNTEh0dHBSZXF1ZXN0YCBhcyB0aGUgZGVmYXVsdCBiYWNrZW5kLlxuICAgICAgKiAqXG4gICAgICAqIGBIdHRwYCBpcyBhdmFpbGFibGUgYXMgYW4gaW5qZWN0YWJsZSBjbGFzcywgd2l0aCBtZXRob2RzIHRvIHBlcmZvcm0gaHR0cCByZXF1ZXN0cy4gQ2FsbGluZ1xuICAgICAgKiBgcmVxdWVzdGAgcmV0dXJucyBhbiBgT2JzZXJ2YWJsZWAgd2hpY2ggd2lsbCBlbWl0IGEgc2luZ2xlIHtAbGluayBSZXNwb25zZX0gd2hlbiBhXG4gICAgICAqIHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBpbXBvcnQge0h0dHAsIEhUVFBfUFJPVklERVJTfSBmcm9tICdAYW5ndWxhci9odHRwJztcbiAgICAgICogaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnXG4gICAgICAqIHNlbGVjdG9yOiAnaHR0cC1hcHAnLFxuICAgICAgKiB2aWV3UHJvdmlkZXJzOiBbSFRUUF9QUk9WSURFUlNdLFxuICAgICAgKiB0ZW1wbGF0ZVVybDogJ3Blb3BsZS5odG1sJ1xuICAgICAgKiB9KVxuICAgICAgKiBjbGFzcyBQZW9wbGVDb21wb25lbnQge1xuICAgICAgKiBjb25zdHJ1Y3RvcihodHRwOiBIdHRwKSB7XG4gICAgICAqIGh0dHAuZ2V0KCdwZW9wbGUuanNvbicpXG4gICAgICAqIC8vIENhbGwgbWFwIG9uIHRoZSByZXNwb25zZSBvYnNlcnZhYmxlIHRvIGdldCB0aGUgcGFyc2VkIHBlb3BsZSBvYmplY3RcbiAgICAgICogLm1hcChyZXMgPT4gcmVzLmpzb24oKSlcbiAgICAgICogLy8gU3Vic2NyaWJlIHRvIHRoZSBvYnNlcnZhYmxlIHRvIGdldCB0aGUgcGFyc2VkIHBlb3BsZSBvYmplY3QgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAgICAgICogLy8gY29tcG9uZW50XG4gICAgICAqIC5zdWJzY3JpYmUocGVvcGxlID0+IHRoaXMucGVvcGxlID0gcGVvcGxlKTtcbiAgICAgICogfVxuICAgICAgKiB9XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqICpcbiAgICAgICogIyMjIEV4YW1wbGVcbiAgICAgICogKlxuICAgICAgKiBgYGBcbiAgICAgICogaHR0cC5nZXQoJ3Blb3BsZS5qc29uJykuc3Vic2NyaWJlKChyZXM6UmVzcG9uc2UpID0+IHRoaXMucGVvcGxlID0gcmVzLmpzb24oKSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdCB1c2VkIHRvIHBlcmZvcm0gcmVxdWVzdHMsIGBYTUxIdHRwUmVxdWVzdGAsIGlzIGFic3RyYWN0ZWQgYXMgYSBcIkJhY2tlbmRcIiAoXG4gICAgICAqIHtAbGluayBYSFJCYWNrZW5kfSBpbiB0aGlzIGNhc2UpLCB3aGljaCBjb3VsZCBiZSBtb2NrZWQgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbiBieSByZXBsYWNpbmdcbiAgICAgICogdGhlIHtAbGluayBYSFJCYWNrZW5kfSBwcm92aWRlciwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOlxuICAgICAgKiAqXG4gICAgICAqICMjIyBFeGFtcGxlXG4gICAgICAqICpcbiAgICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAgKiBpbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgSHR0cH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG4gICAgICAqIGltcG9ydCB7TW9ja0JhY2tlbmR9IGZyb20gJ0Bhbmd1bGFyL2h0dHAvdGVzdGluZyc7XG4gICAgICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgICAgKiBCYXNlUmVxdWVzdE9wdGlvbnMsXG4gICAgICAqIE1vY2tCYWNrZW5kLFxuICAgICAgKiB7cHJvdmlkZTogSHR0cCwgdXNlRmFjdG9yeTpcbiAgICAgICogZnVuY3Rpb24oYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgICogcmV0dXJuIG5ldyBIdHRwKGJhY2tlbmQsIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgICogfSxcbiAgICAgICogZGVwczogW01vY2tCYWNrZW5kLCBCYXNlUmVxdWVzdE9wdGlvbnNdfVxuICAgICAgKiBdKTtcbiAgICAgICogdmFyIGh0dHAgPSBpbmplY3Rvci5nZXQoSHR0cCk7XG4gICAgICAqIGh0dHAuZ2V0KCdyZXF1ZXN0LWZyb20tbW9jay1iYWNrZW5kLmpzb24nKS5zdWJzY3JpYmUoKHJlczpSZXNwb25zZSkgPT4gZG9Tb21ldGhpbmcocmVzKSk7XG4gICAgICAqIGBgYFxuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEh0dHAgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBfYmFja2VuZFxuICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0T3B0aW9uc1xuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gSHR0cChfYmFja2VuZCwgX2RlZmF1bHRPcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLl9iYWNrZW5kID0gX2JhY2tlbmQ7XG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogIFBlcmZvcm1zIGFueSB0eXBlIG9mIGh0dHAgcmVxdWVzdC4gRmlyc3QgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCBjYW4gZWl0aGVyIGJlIGEgdXJsIG9yXG4gICAgICAgICAgKiBhIHtAbGluayBSZXF1ZXN0fSBpbnN0YW5jZS4gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgdXJsLCBhbiBvcHRpb25hbCB7QGxpbmsgUmVxdWVzdE9wdGlvbnN9XG4gICAgICAgICAgKiBvYmplY3QgY2FuIGJlIHByb3ZpZGVkIGFzIHRoZSAybmQgYXJndW1lbnQuIFRoZSBvcHRpb25zIG9iamVjdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSB2YWx1ZXNcbiAgICAgICAgICAqIG9mIHtAbGluayBCYXNlUmVxdWVzdE9wdGlvbnN9IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIdHRwLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIC8qKiBAdHlwZSB7P30gKi8gcmVzcG9uc2VPYnNlcnZhYmxlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VPYnNlcnZhYmxlID0gaHR0cFJlcXVlc3QodGhpcy5fYmFja2VuZCwgbmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLCBvcHRpb25zLCBSZXF1ZXN0TWV0aG9kLkdldCwgLyoqIEB0eXBlIHs/fSAqLyAodXJsKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVybCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZU9ic2VydmFibGUgPSBodHRwUmVxdWVzdCh0aGlzLl9iYWNrZW5kLCB1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdXJsIHN0cmluZyBvciBSZXF1ZXN0IGluc3RhbmNlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JzZXJ2YWJsZTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgZ2V0YCBodHRwIG1ldGhvZC5cbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSHR0cC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuR2V0LCB1cmwpKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBvc3RgIGh0dHAgbWV0aG9kLlxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez99IGJvZHlcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSHR0cC5wcm90b3R5cGUucG9zdCA9IGZ1bmN0aW9uICh1cmwsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGJvZHk6IGJvZHkgfSkpLCBvcHRpb25zLCBSZXF1ZXN0TWV0aG9kLlBvc3QsIHVybCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgcHV0YCBodHRwIG1ldGhvZC5cbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHBhcmFtIHs/fSBib2R5XG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEh0dHAucHJvdG90eXBlLnB1dCA9IGZ1bmN0aW9uICh1cmwsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGJvZHk6IGJvZHkgfSkpLCBvcHRpb25zLCBSZXF1ZXN0TWV0aG9kLlB1dCwgdXJsKSkpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBkZWxldGVgIGh0dHAgbWV0aG9kLlxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zXG4gICAgICAgICAqIEByZXR1cm4gez99XG4gICAgICAgICAqL1xuICAgICAgICBIdHRwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5EZWxldGUsIHVybCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgcGF0Y2hgIGh0dHAgbWV0aG9kLlxuICAgICAgICAgKiBAcGFyYW0gez99IHVybFxuICAgICAgICAgKiBAcGFyYW0gez99IGJvZHlcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSHR0cC5wcm90b3R5cGUucGF0Y2ggPSBmdW5jdGlvbiAodXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucy5tZXJnZShuZXcgUmVxdWVzdE9wdGlvbnMoeyBib2R5OiBib2R5IH0pKSwgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5QYXRjaCwgdXJsKSkpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBoZWFkYCBodHRwIG1ldGhvZC5cbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSHR0cC5wcm90b3R5cGUuaGVhZCA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLCBvcHRpb25zLCBSZXF1ZXN0TWV0aG9kLkhlYWQsIHVybCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgb3B0aW9uc2AgaHR0cCBtZXRob2QuXG4gICAgICAgICAqIEBwYXJhbSB7P30gdXJsXG4gICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnNcbiAgICAgICAgICogQHJldHVybiB7P31cbiAgICAgICAgICovXG4gICAgICAgIEh0dHAucHJvdG90eXBlLm9wdGlvbnMgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5PcHRpb25zLCB1cmwpKSk7XG4gICAgICAgIH07XG4gICAgICAgIEh0dHAuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5JbmplY3RhYmxlIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBIdHRwLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW1xuICAgICAgICAgICAgeyB0eXBlOiBDb25uZWN0aW9uQmFja2VuZCwgfSxcbiAgICAgICAgICAgIHsgdHlwZTogUmVxdWVzdE9wdGlvbnMsIH0sXG4gICAgICAgIF07IH07XG4gICAgICAgIHJldHVybiBIdHRwO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHZhciBKc29ucCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyQ0KEpzb25wLCBfc3VwZXIpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQHBhcmFtIHs/fSBiYWNrZW5kXG4gICAgICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdE9wdGlvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEpzb25wKGJhY2tlbmQsIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBiYWNrZW5kLCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqICBQZXJmb3JtcyBhbnkgdHlwZSBvZiBodHRwIHJlcXVlc3QuIEZpcnN0IGFyZ3VtZW50IGlzIHJlcXVpcmVkLCBhbmQgY2FuIGVpdGhlciBiZSBhIHVybCBvclxuICAgICAgICAgICogYSB7QGxpbmsgUmVxdWVzdH0gaW5zdGFuY2UuIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHVybCwgYW4gb3B0aW9uYWwge0BsaW5rIFJlcXVlc3RPcHRpb25zfVxuICAgICAgICAgICogb2JqZWN0IGNhbiBiZSBwcm92aWRlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LiBUaGUgb3B0aW9ucyBvYmplY3Qgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgdmFsdWVzXG4gICAgICAgICAgKiBvZiB7QGxpbmsgQmFzZVJlcXVlc3RPcHRpb25zfSBiZWZvcmUgcGVyZm9ybWluZyB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAqICpcbiAgICAgICAgICAqIHN1cHBvcnRlZCBieSBhbGwgY3VycmVudCBicm93c2Vycy4gQmVjYXVzZSBKU09OUCBjcmVhdGVzIGEgYDxzY3JpcHQ+YCBlbGVtZW50IHdpdGhcbiAgICAgICAgICAqIGNvbnRlbnRzIHJldHJpZXZlZCBmcm9tIGEgcmVtb3RlIHNvdXJjZSwgYXR0YWNrZXItY29udHJvbGxlZCBkYXRhIGludHJvZHVjZWQgYnkgYW4gdW50cnVzdGVkXG4gICAgICAgICAgKiBzb3VyY2UgY291bGQgZXhwb3NlIHlvdXIgYXBwbGljYXRpb24gdG8gWFNTIHJpc2tzLiBEYXRhIGV4cG9zZWQgYnkgSlNPTlAgbWF5IGFsc28gYmVcbiAgICAgICAgICAqIHJlYWRhYmxlIGJ5IG1hbGljaW91cyB0aGlyZC1wYXJ0eSB3ZWJzaXRlcy4gSW4gYWRkaXRpb24sIEpTT05QIGludHJvZHVjZXMgcG90ZW50aWFsIHJpc2sgZm9yXG4gICAgICAgICAgKiBmdXR1cmUgc2VjdXJpdHkgaXNzdWVzIChlLmcuIGNvbnRlbnQgc25pZmZpbmcpLiAgRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlXG4gICAgICAgICAgKiBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS5cbiAgICAgICAgICogQHBhcmFtIHs/fSB1cmxcbiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9uc1xuICAgICAgICAgKiBAcmV0dXJuIHs/fVxuICAgICAgICAgKi9cbiAgICAgICAgSnNvbnAucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyByZXNwb25zZU9ic2VydmFibGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuR2V0LCAvKiogQHR5cGUgez99ICovICh1cmwpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXJsIGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGlmICh1cmwubWV0aG9kICE9PSBSZXF1ZXN0TWV0aG9kLkdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTT05QIHJlcXVlc3RzIG11c3QgdXNlIEdFVCByZXF1ZXN0IG1ldGhvZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VPYnNlcnZhYmxlID0gaHR0cFJlcXVlc3QodGhpcy5fYmFja2VuZCwgdXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHVybCBzdHJpbmcgb3IgUmVxdWVzdCBpbnN0YW5jZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9ic2VydmFibGU7XG4gICAgICAgIH07XG4gICAgICAgIEpzb25wLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuSW5qZWN0YWJsZSB9LFxuICAgICAgICBdO1xuICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgSnNvbnAuY3RvclBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbXG4gICAgICAgICAgICB7IHR5cGU6IENvbm5lY3Rpb25CYWNrZW5kLCB9LFxuICAgICAgICAgICAgeyB0eXBlOiBSZXF1ZXN0T3B0aW9ucywgfSxcbiAgICAgICAgXTsgfTtcbiAgICAgICAgcmV0dXJuIEpzb25wO1xuICAgIH0oSHR0cCkpO1xuXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBfY3JlYXRlRGVmYXVsdENvb2tpZVhTUkZTdHJhdGVneSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29raWVYU1JGU3RyYXRlZ3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSB4aHJCYWNrZW5kXG4gICAgICogQHBhcmFtIHs/fSByZXF1ZXN0T3B0aW9uc1xuICAgICAqIEByZXR1cm4gez99XG4gICAgICovXG4gICAgZnVuY3Rpb24gaHR0cEZhY3RvcnkoeGhyQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwKHhockJhY2tlbmQsIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/fSBqc29ucEJhY2tlbmRcbiAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RPcHRpb25zXG4gICAgICogQHJldHVybiB7P31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBqc29ucEZhY3RvcnkoanNvbnBCYWNrZW5kLCByZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEpzb25wKGpzb25wQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgVGhlIG1vZHVsZSB0aGF0IGluY2x1ZGVzIGh0dHAncyBwcm92aWRlcnNcbiAgICAgICogKlxuICAgICAqL1xuICAgIHZhciBIdHRwTW9kdWxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSHR0cE1vZHVsZSgpIHtcbiAgICAgICAgfVxuICAgICAgICBIdHRwTW9kdWxlLmRlY29yYXRvcnMgPSBbXG4gICAgICAgICAgICB7IHR5cGU6IF9hbmd1bGFyX2NvcmUuTmdNb2R1bGUsIGFyZ3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKHBhc2NhbCk6IHVzZSBmYWN0b3J5IHR5cGUgYW5ub3RhdGlvbnMgb25jZSBzdXBwb3J0ZWQgaW4gRElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE4M1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogSHR0cCwgdXNlRmFjdG9yeTogaHR0cEZhY3RvcnksIGRlcHM6IFtYSFJCYWNrZW5kLCBSZXF1ZXN0T3B0aW9uc10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyWGhyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogUmVxdWVzdE9wdGlvbnMsIHVzZUNsYXNzOiBCYXNlUmVxdWVzdE9wdGlvbnMgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IFJlc3BvbnNlT3B0aW9ucywgdXNlQ2xhc3M6IEJhc2VSZXNwb25zZU9wdGlvbnMgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSFJCYWNrZW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogWFNSRlN0cmF0ZWd5LCB1c2VGYWN0b3J5OiBfY3JlYXRlRGVmYXVsdENvb2tpZVhTUkZTdHJhdGVneSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBIdHRwTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgICAgIHJldHVybiBIdHRwTW9kdWxlO1xuICAgIH0oKSk7XG4gICAgLyoqXG4gICAgICogIFRoZSBtb2R1bGUgdGhhdCBpbmNsdWRlcyBqc29ucCdzIHByb3ZpZGVyc1xuICAgICAgKiAqXG4gICAgICovXG4gICAgdmFyIEpzb25wTW9kdWxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSnNvbnBNb2R1bGUoKSB7XG4gICAgICAgIH1cbiAgICAgICAgSnNvbnBNb2R1bGUuZGVjb3JhdG9ycyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogX2FuZ3VsYXJfY29yZS5OZ01vZHVsZSwgYXJnczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8ocGFzY2FsKTogdXNlIGZhY3RvcnkgdHlwZSBhbm5vdGF0aW9ucyBvbmNlIHN1cHBvcnRlZCBpbiBESVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMTgzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBKc29ucCwgdXNlRmFjdG9yeToganNvbnBGYWN0b3J5LCBkZXBzOiBbSlNPTlBCYWNrZW5kLCBSZXF1ZXN0T3B0aW9uc10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VySnNvbnAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBSZXF1ZXN0T3B0aW9ucywgdXNlQ2xhc3M6IEJhc2VSZXF1ZXN0T3B0aW9ucyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogUmVzcG9uc2VPcHRpb25zLCB1c2VDbGFzczogQmFzZVJlc3BvbnNlT3B0aW9ucyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogSlNPTlBCYWNrZW5kLCB1c2VDbGFzczogSlNPTlBCYWNrZW5kXyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxdIH0sXG4gICAgICAgIF07XG4gICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgICAgICBKc29ucE1vZHVsZS5jdG9yUGFyYW1ldGVycyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9O1xuICAgICAgICByZXR1cm4gSnNvbnBNb2R1bGU7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIEBzdGFibGVcbiAgICAgKi9cbiAgICB2YXIgLyoqIEB0eXBlIHs/fSAqLyBWRVJTSU9OID0gbmV3IF9hbmd1bGFyX2NvcmUuVmVyc2lvbignMi40LjEnKTtcblxuICAgIGV4cG9ydHMuQnJvd3NlclhociA9IEJyb3dzZXJYaHI7XG4gICAgZXhwb3J0cy5KU09OUEJhY2tlbmQgPSBKU09OUEJhY2tlbmQ7XG4gICAgZXhwb3J0cy5KU09OUENvbm5lY3Rpb24gPSBKU09OUENvbm5lY3Rpb247XG4gICAgZXhwb3J0cy5Db29raWVYU1JGU3RyYXRlZ3kgPSBDb29raWVYU1JGU3RyYXRlZ3k7XG4gICAgZXhwb3J0cy5YSFJCYWNrZW5kID0gWEhSQmFja2VuZDtcbiAgICBleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSBYSFJDb25uZWN0aW9uO1xuICAgIGV4cG9ydHMuQmFzZVJlcXVlc3RPcHRpb25zID0gQmFzZVJlcXVlc3RPcHRpb25zO1xuICAgIGV4cG9ydHMuUmVxdWVzdE9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucztcbiAgICBleHBvcnRzLkJhc2VSZXNwb25zZU9wdGlvbnMgPSBCYXNlUmVzcG9uc2VPcHRpb25zO1xuICAgIGV4cG9ydHMuUmVzcG9uc2VPcHRpb25zID0gUmVzcG9uc2VPcHRpb25zO1xuICAgIGV4cG9ydHMuUmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGU7XG4gICAgZXhwb3J0cy5SZXF1ZXN0TWV0aG9kID0gUmVxdWVzdE1ldGhvZDtcbiAgICBleHBvcnRzLlJlc3BvbnNlQ29udGVudFR5cGUgPSBSZXNwb25zZUNvbnRlbnRUeXBlO1xuICAgIGV4cG9ydHMuUmVzcG9uc2VUeXBlID0gUmVzcG9uc2VUeXBlO1xuICAgIGV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnM7XG4gICAgZXhwb3J0cy5IdHRwID0gSHR0cDtcbiAgICBleHBvcnRzLkpzb25wID0gSnNvbnA7XG4gICAgZXhwb3J0cy5IdHRwTW9kdWxlID0gSHR0cE1vZHVsZTtcbiAgICBleHBvcnRzLkpzb25wTW9kdWxlID0gSnNvbnBNb2R1bGU7XG4gICAgZXhwb3J0cy5Db25uZWN0aW9uID0gQ29ubmVjdGlvbjtcbiAgICBleHBvcnRzLkNvbm5lY3Rpb25CYWNrZW5kID0gQ29ubmVjdGlvbkJhY2tlbmQ7XG4gICAgZXhwb3J0cy5YU1JGU3RyYXRlZ3kgPSBYU1JGU3RyYXRlZ3k7XG4gICAgZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgICBleHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG4gICAgZXhwb3J0cy5RdWVyeUVuY29kZXIgPSBRdWVyeUVuY29kZXI7XG4gICAgZXhwb3J0cy5VUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXM7XG4gICAgZXhwb3J0cy5WRVJTSU9OID0gVkVSU0lPTjtcblxufSkpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9AYW5ndWxhci9odHRwL2J1bmRsZXMvaHR0cC51bWQuanNcbi8vIG1vZHVsZSBpZCA9IDM3NFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  553. /***/ },
  554. /* 375 */
  555. /***/ function(module, exports, __webpack_require__) {
  556. eval("\"use strict\";\n/* tslint:disable:no-unused-variable */\n// Subject imported before Observable to bypass circular dependency issue since\n// Subject extends Observable and Observable references Subject in it's\n// definition\nvar Subject_1 = __webpack_require__(5);\nexports.Subject = Subject_1.Subject;\nexports.AnonymousSubject = Subject_1.AnonymousSubject;\n/* tslint:enable:no-unused-variable */\nvar Observable_1 = __webpack_require__(6);\nexports.Observable = Observable_1.Observable;\n// statics\n/* tslint:disable:no-use-before-declare */\n__webpack_require__(376);\n__webpack_require__(380);\n__webpack_require__(383);\n__webpack_require__(386);\n__webpack_require__(389);\n__webpack_require__(392);\n__webpack_require__(394);\n__webpack_require__(397);\n__webpack_require__(398);\n__webpack_require__(401);\n__webpack_require__(404);\n__webpack_require__(405);\n__webpack_require__(407);\n__webpack_require__(410);\n__webpack_require__(419);\n__webpack_require__(422);\n__webpack_require__(424);\n__webpack_require__(428);\n__webpack_require__(429);\n__webpack_require__(431);\n__webpack_require__(434);\n__webpack_require__(437);\n__webpack_require__(440);\n__webpack_require__(443);\n__webpack_require__(447);\n//dom\n__webpack_require__(450);\n__webpack_require__(453);\n//operators\n__webpack_require__(461);\n__webpack_require__(463);\n__webpack_require__(465);\n__webpack_require__(467);\n__webpack_require__(469);\n__webpack_require__(471);\n__webpack_require__(472);\n__webpack_require__(474);\n__webpack_require__(475);\n__webpack_require__(476);\n__webpack_require__(477);\n__webpack_require__(478);\n__webpack_require__(481);\n__webpack_require__(483);\n__webpack_require__(485);\n__webpack_require__(487);\n__webpack_require__(489);\n__webpack_require__(491);\n__webpack_require__(493);\n__webpack_require__(495);\n__webpack_require__(498);\n__webpack_require__(500);\n__webpack_require__(502);\n__webpack_require__(504);\n__webpack_require__(506);\n__webpack_require__(508);\n__webpack_require__(510);\n__webpack_require__(513);\n__webpack_require__(514);\n__webpack_require__(516);\n__webpack_require__(518);\n__webpack_require__(520);\n__webpack_require__(521);\n__webpack_require__(526);\n__webpack_require__(528);\n__webpack_require__(530);\n__webpack_require__(532);\n__webpack_require__(534);\n__webpack_require__(535);\n__webpack_require__(537);\n__webpack_require__(538);\n__webpack_require__(539);\n__webpack_require__(541);\n__webpack_require__(543);\n__webpack_require__(545);\n__webpack_require__(546);\n__webpack_require__(547);\n__webpack_require__(548);\n__webpack_require__(549);\n__webpack_require__(551);\n__webpack_require__(553);\n__webpack_require__(556);\n__webpack_require__(557);\n__webpack_require__(558);\n__webpack_require__(560);\n__webpack_require__(563);\n__webpack_require__(565);\n__webpack_require__(567);\n__webpack_require__(569);\n__webpack_require__(571);\n__webpack_require__(573);\n__webpack_require__(574);\n__webpack_require__(575);\n__webpack_require__(577);\n__webpack_require__(579);\n__webpack_require__(581);\n__webpack_require__(583);\n__webpack_require__(585);\n__webpack_require__(587);\n__webpack_require__(589);\n__webpack_require__(591);\n__webpack_require__(593);\n__webpack_require__(595);\n__webpack_require__(597);\n__webpack_require__(599);\n__webpack_require__(601);\n__webpack_require__(603);\n__webpack_require__(610);\n__webpack_require__(612);\n__webpack_require__(614);\n__webpack_require__(616);\n__webpack_require__(618);\n__webpack_require__(620);\n__webpack_require__(622);\n__webpack_require__(624);\n__webpack_require__(626);\n__webpack_require__(628);\n__webpack_require__(630);\n__webpack_require__(633);\n__webpack_require__(635);\n__webpack_require__(637);\n__webpack_require__(639);\n__webpack_require__(640);\n__webpack_require__(642);\n__webpack_require__(644);\n__webpack_require__(646);\n__webpack_require__(648);\n__webpack_require__(650);\n__webpack_require__(652);\n__webpack_require__(653);\n/* tslint:disable:no-unused-variable */\nvar Subscription_1 = __webpack_require__(11);\nexports.Subscription = Subscription_1.Subscription;\nvar Subscriber_1 = __webpack_require__(9);\nexports.Subscriber = Subscriber_1.Subscriber;\nvar AsyncSubject_1 = __webpack_require__(379);\nexports.AsyncSubject = AsyncSubject_1.AsyncSubject;\nvar ReplaySubject_1 = __webpack_require__(456);\nexports.ReplaySubject = ReplaySubject_1.ReplaySubject;\nvar BehaviorSubject_1 = __webpack_require__(33);\nexports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;\nvar ConnectableObservable_1 = __webpack_require__(555);\nexports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;\nvar Notification_1 = __webpack_require__(45);\nexports.Notification = Notification_1.Notification;\nvar EmptyError_1 = __webpack_require__(54);\nexports.EmptyError = EmptyError_1.EmptyError;\nvar ArgumentOutOfRangeError_1 = __webpack_require__(512);\nexports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\nvar ObjectUnsubscribedError_1 = __webpack_require__(20);\nexports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;\nvar TimeoutError_1 = __webpack_require__(632);\nexports.TimeoutError = TimeoutError_1.TimeoutError;\nvar UnsubscriptionError_1 = __webpack_require__(16);\nexports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;\nvar timeInterval_1 = __webpack_require__(629);\nexports.TimeInterval = timeInterval_1.TimeInterval;\nvar timestamp_1 = __webpack_require__(636);\nexports.Timestamp = timestamp_1.Timestamp;\nvar TestScheduler_1 = __webpack_require__(655);\nexports.TestScheduler = TestScheduler_1.TestScheduler;\nvar VirtualTimeScheduler_1 = __webpack_require__(661);\nexports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;\nvar AjaxObservable_1 = __webpack_require__(452);\nexports.AjaxResponse = AjaxObservable_1.AjaxResponse;\nexports.AjaxError = AjaxObservable_1.AjaxError;\nexports.AjaxTimeoutError = AjaxObservable_1.AjaxTimeoutError;\nvar asap_1 = __webpack_require__(606);\nvar async_1 = __webpack_require__(414);\nvar queue_1 = __webpack_require__(457);\nvar animationFrame_1 = __webpack_require__(662);\nvar rxSubscriber_1 = __webpack_require__(18);\nvar iterator_1 = __webpack_require__(38);\nvar observable_1 = __webpack_require__(19);\n/* tslint:enable:no-unused-variable */\n/**\n * @typedef {Object} Rx.Scheduler\n * @property {Scheduler} queue Schedules on a queue in the current event frame\n * (trampoline scheduler). Use this for iteration operations.\n * @property {Scheduler} asap Schedules on the micro task queue, which uses the\n * fastest transport mechanism available, either Node.js' `process.nextTick()`\n * or Web Worker MessageChannel or setTimeout or others. Use this for\n * asynchronous conversions.\n * @property {Scheduler} async Schedules work with `setInterval`. Use this for\n * time-based operations.\n * @property {Scheduler} animationFrame Schedules work with `requestAnimationFrame`.\n * Use this for synchronizing with the platform's painting\n */\nvar Scheduler = {\n asap: asap_1.asap,\n queue: queue_1.queue,\n animationFrame: animationFrame_1.animationFrame,\n async: async_1.async\n};\nexports.Scheduler = Scheduler;\n/**\n * @typedef {Object} Rx.Symbol\n * @property {Symbol|string} rxSubscriber A symbol to use as a property name to\n * retrieve an \"Rx safe\" Observer from an object. \"Rx safety\" can be defined as\n * an object that has all of the traits of an Rx Subscriber, including the\n * ability to add and remove subscriptions to the subscription chain and\n * guarantees involving event triggering (can't \"next\" after unsubscription,\n * etc).\n * @property {Symbol|string} observable A symbol to use as a property name to\n * retrieve an Observable as defined by the [ECMAScript \"Observable\" spec](https://github.com/zenparsing/es-observable).\n * @property {Symbol|string} iterator The ES6 symbol to use as a property name\n * to retrieve an iterator from an object.\n */\nvar Symbol = {\n rxSubscriber: rxSubscriber_1.$$rxSubscriber,\n observable: observable_1.$$observable,\n iterator: iterator_1.$$iterator\n};\nexports.Symbol = Symbol;\n//# sourceMappingURL=Rx.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL1J4LmpzP2IyNzkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgKi9cbi8vIFN1YmplY3QgaW1wb3J0ZWQgYmVmb3JlIE9ic2VydmFibGUgdG8gYnlwYXNzIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgc2luY2Vcbi8vIFN1YmplY3QgZXh0ZW5kcyBPYnNlcnZhYmxlIGFuZCBPYnNlcnZhYmxlIHJlZmVyZW5jZXMgU3ViamVjdCBpbiBpdCdzXG4vLyBkZWZpbml0aW9uXG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi9TdWJqZWN0Jyk7XG5leHBvcnRzLlN1YmplY3QgPSBTdWJqZWN0XzEuU3ViamVjdDtcbmV4cG9ydHMuQW5vbnltb3VzU3ViamVjdCA9IFN1YmplY3RfMS5Bbm9ueW1vdXNTdWJqZWN0O1xuLyogdHNsaW50OmVuYWJsZTpuby11bnVzZWQtdmFyaWFibGUgKi9cbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL09ic2VydmFibGUnKTtcbmV4cG9ydHMuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGVfMS5PYnNlcnZhYmxlO1xuLy8gc3RhdGljc1xuLyogdHNsaW50OmRpc2FibGU6bm8tdXNlLWJlZm9yZS1kZWNsYXJlICovXG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2JpbmRDYWxsYmFjaycpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9iaW5kTm9kZUNhbGxiYWNrJyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvY29uY2F0Jyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2RlZmVyJyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2VtcHR5Jyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2ZvcmtKb2luJyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2Zyb20nKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvZnJvbUV2ZW50Jyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2Zyb21FdmVudFBhdHRlcm4nKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvZnJvbVByb21pc2UnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvZ2VuZXJhdGUnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvaWYnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvaW50ZXJ2YWwnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvbWVyZ2UnKTtcbnJlcXVpcmUoJy4vYWRkL29ic2VydmFibGUvcmFjZScpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9uZXZlcicpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9vZicpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9vbkVycm9yUmVzdW1lTmV4dCcpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9wYWlycycpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS9yYW5nZScpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS91c2luZycpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS90aHJvdycpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS90aW1lcicpO1xucmVxdWlyZSgnLi9hZGQvb2JzZXJ2YWJsZS96aXAnKTtcbi8vZG9tXG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2RvbS9hamF4Jyk7XG5yZXF1aXJlKCcuL2FkZC9vYnNlcnZhYmxlL2RvbS93ZWJTb2NrZXQnKTtcbi8vb3BlcmF0b3JzXG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9idWZmZXInKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2J1ZmZlckNvdW50Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9idWZmZXJUaW1lJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9idWZmZXJUb2dnbGUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2J1ZmZlcldoZW4nKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2NhdGNoJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9jb21iaW5lQWxsJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9jb21iaW5lTGF0ZXN0Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9jb25jYXQnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2NvbmNhdEFsbCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvY29uY2F0TWFwJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9jb25jYXRNYXBUbycpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvY291bnQnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2RlbWF0ZXJpYWxpemUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2RlYm91bmNlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9kZWJvdW5jZVRpbWUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2RlZmF1bHRJZkVtcHR5Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9kZWxheScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZGVsYXlXaGVuJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9kaXN0aW5jdCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZGlzdGluY3RVbnRpbENoYW5nZWQnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9kbycpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZXhoYXVzdCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZXhoYXVzdE1hcCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZXhwYW5kJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9lbGVtZW50QXQnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2ZpbHRlcicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZmluYWxseScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZmluZCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZmluZEluZGV4Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9maXJzdCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZ3JvdXBCeScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvaWdub3JlRWxlbWVudHMnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2lzRW1wdHknKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2F1ZGl0Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9hdWRpdFRpbWUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2xhc3QnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL2xldCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvZXZlcnknKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL21hcCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvbWFwVG8nKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL21hdGVyaWFsaXplJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9tYXgnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL21lcmdlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9tZXJnZUFsbCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvbWVyZ2VNYXAnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL21lcmdlTWFwVG8nKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL21lcmdlU2NhbicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvbWluJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9tdWx0aWNhc3QnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL29ic2VydmVPbicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3Ivb25FcnJvclJlc3VtZU5leHQnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3BhaXJ3aXNlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9wYXJ0aXRpb24nKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3BsdWNrJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9wdWJsaXNoJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9wdWJsaXNoQmVoYXZpb3InKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3B1Ymxpc2hSZXBsYXknKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3B1Ymxpc2hMYXN0Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9yYWNlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9yZWR1Y2UnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3JlcGVhdCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvcmVwZWF0V2hlbicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvcmV0cnknKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3JldHJ5V2hlbicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3Ivc2FtcGxlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zYW1wbGVUaW1lJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zY2FuJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zZXF1ZW5jZUVxdWFsJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zaGFyZScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3Ivc2luZ2xlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9za2lwJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9za2lwVW50aWwnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3NraXBXaGlsZScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3Ivc3RhcnRXaXRoJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zdWJzY3JpYmVPbicpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3Ivc3dpdGNoJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci9zd2l0Y2hNYXAnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3N3aXRjaE1hcFRvJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci90YWtlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci90YWtlTGFzdCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvdGFrZVVudGlsJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci90YWtlV2hpbGUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3Rocm90dGxlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci90aHJvdHRsZVRpbWUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3RpbWVJbnRlcnZhbCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvdGltZW91dCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvdGltZW91dFdpdGgnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3RpbWVzdGFtcCcpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvdG9BcnJheScpO1xucmVxdWlyZSgnLi9hZGQvb3BlcmF0b3IvdG9Qcm9taXNlJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci93aW5kb3cnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3dpbmRvd0NvdW50Jyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci93aW5kb3dUaW1lJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci93aW5kb3dUb2dnbGUnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3dpbmRvd1doZW4nKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3dpdGhMYXRlc3RGcm9tJyk7XG5yZXF1aXJlKCcuL2FkZC9vcGVyYXRvci96aXAnKTtcbnJlcXVpcmUoJy4vYWRkL29wZXJhdG9yL3ppcEFsbCcpO1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlICovXG52YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlKCcuL1N1YnNjcmlwdGlvbicpO1xuZXhwb3J0cy5TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb247XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi9TdWJzY3JpYmVyJyk7XG5leHBvcnRzLlN1YnNjcmliZXIgPSBTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcjtcbnZhciBBc3luY1N1YmplY3RfMSA9IHJlcXVpcmUoJy4vQXN5bmNTdWJqZWN0Jyk7XG5leHBvcnRzLkFzeW5jU3ViamVjdCA9IEFzeW5jU3ViamVjdF8xLkFzeW5jU3ViamVjdDtcbnZhciBSZXBsYXlTdWJqZWN0XzEgPSByZXF1aXJlKCcuL1JlcGxheVN1YmplY3QnKTtcbmV4cG9ydHMuUmVwbGF5U3ViamVjdCA9IFJlcGxheVN1YmplY3RfMS5SZXBsYXlTdWJqZWN0O1xudmFyIEJlaGF2aW9yU3ViamVjdF8xID0gcmVxdWlyZSgnLi9CZWhhdmlvclN1YmplY3QnKTtcbmV4cG9ydHMuQmVoYXZpb3JTdWJqZWN0ID0gQmVoYXZpb3JTdWJqZWN0XzEuQmVoYXZpb3JTdWJqZWN0O1xudmFyIENvbm5lY3RhYmxlT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9vYnNlcnZhYmxlL0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZScpO1xuZXhwb3J0cy5Db25uZWN0YWJsZU9ic2VydmFibGUgPSBDb25uZWN0YWJsZU9ic2VydmFibGVfMS5Db25uZWN0YWJsZU9ic2VydmFibGU7XG52YXIgTm90aWZpY2F0aW9uXzEgPSByZXF1aXJlKCcuL05vdGlmaWNhdGlvbicpO1xuZXhwb3J0cy5Ob3RpZmljYXRpb24gPSBOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb247XG52YXIgRW1wdHlFcnJvcl8xID0gcmVxdWlyZSgnLi91dGlsL0VtcHR5RXJyb3InKTtcbmV4cG9ydHMuRW1wdHlFcnJvciA9IEVtcHR5RXJyb3JfMS5FbXB0eUVycm9yO1xudmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yXzEgPSByZXF1aXJlKCcuL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3InKTtcbmV4cG9ydHMuQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yO1xudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yXzEgPSByZXF1aXJlKCcuL3V0aWwvT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3InKTtcbmV4cG9ydHMuT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IgPSBPYmplY3RVbnN1YnNjcmliZWRFcnJvcl8xLk9iamVjdFVuc3Vic2NyaWJlZEVycm9yO1xudmFyIFRpbWVvdXRFcnJvcl8xID0gcmVxdWlyZSgnLi91dGlsL1RpbWVvdXRFcnJvcicpO1xuZXhwb3J0cy5UaW1lb3V0RXJyb3IgPSBUaW1lb3V0RXJyb3JfMS5UaW1lb3V0RXJyb3I7XG52YXIgVW5zdWJzY3JpcHRpb25FcnJvcl8xID0gcmVxdWlyZSgnLi91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3InKTtcbmV4cG9ydHMuVW5zdWJzY3JpcHRpb25FcnJvciA9IFVuc3Vic2NyaXB0aW9uRXJyb3JfMS5VbnN1YnNjcmlwdGlvbkVycm9yO1xudmFyIHRpbWVJbnRlcnZhbF8xID0gcmVxdWlyZSgnLi9vcGVyYXRvci90aW1lSW50ZXJ2YWwnKTtcbmV4cG9ydHMuVGltZUludGVydmFsID0gdGltZUludGVydmFsXzEuVGltZUludGVydmFsO1xudmFyIHRpbWVzdGFtcF8xID0gcmVxdWlyZSgnLi9vcGVyYXRvci90aW1lc3RhbXAnKTtcbmV4cG9ydHMuVGltZXN0YW1wID0gdGltZXN0YW1wXzEuVGltZXN0YW1wO1xudmFyIFRlc3RTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vdGVzdGluZy9UZXN0U2NoZWR1bGVyJyk7XG5leHBvcnRzLlRlc3RTY2hlZHVsZXIgPSBUZXN0U2NoZWR1bGVyXzEuVGVzdFNjaGVkdWxlcjtcbnZhciBWaXJ0dWFsVGltZVNjaGVkdWxlcl8xID0gcmVxdWlyZSgnLi9zY2hlZHVsZXIvVmlydHVhbFRpbWVTY2hlZHVsZXInKTtcbmV4cG9ydHMuVmlydHVhbFRpbWVTY2hlZHVsZXIgPSBWaXJ0dWFsVGltZVNjaGVkdWxlcl8xLlZpcnR1YWxUaW1lU2NoZWR1bGVyO1xudmFyIEFqYXhPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL29ic2VydmFibGUvZG9tL0FqYXhPYnNlcnZhYmxlJyk7XG5leHBvcnRzLkFqYXhSZXNwb25zZSA9IEFqYXhPYnNlcnZhYmxlXzEuQWpheFJlc3BvbnNlO1xuZXhwb3J0cy5BamF4RXJyb3IgPSBBamF4T2JzZXJ2YWJsZV8xLkFqYXhFcnJvcjtcbmV4cG9ydHMuQWpheFRpbWVvdXRFcnJvciA9IEFqYXhPYnNlcnZhYmxlXzEuQWpheFRpbWVvdXRFcnJvcjtcbnZhciBhc2FwXzEgPSByZXF1aXJlKCcuL3NjaGVkdWxlci9hc2FwJyk7XG52YXIgYXN5bmNfMSA9IHJlcXVpcmUoJy4vc2NoZWR1bGVyL2FzeW5jJyk7XG52YXIgcXVldWVfMSA9IHJlcXVpcmUoJy4vc2NoZWR1bGVyL3F1ZXVlJyk7XG52YXIgYW5pbWF0aW9uRnJhbWVfMSA9IHJlcXVpcmUoJy4vc2NoZWR1bGVyL2FuaW1hdGlvbkZyYW1lJyk7XG52YXIgcnhTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuL3N5bWJvbC9yeFN1YnNjcmliZXInKTtcbnZhciBpdGVyYXRvcl8xID0gcmVxdWlyZSgnLi9zeW1ib2wvaXRlcmF0b3InKTtcbnZhciBvYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL3N5bWJvbC9vYnNlcnZhYmxlJyk7XG4vKiB0c2xpbnQ6ZW5hYmxlOm5vLXVudXNlZC12YXJpYWJsZSAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSeC5TY2hlZHVsZXJcbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGVyfSBxdWV1ZSBTY2hlZHVsZXMgb24gYSBxdWV1ZSBpbiB0aGUgY3VycmVudCBldmVudCBmcmFtZVxuICogKHRyYW1wb2xpbmUgc2NoZWR1bGVyKS4gVXNlIHRoaXMgZm9yIGl0ZXJhdGlvbiBvcGVyYXRpb25zLlxuICogQHByb3BlcnR5IHtTY2hlZHVsZXJ9IGFzYXAgU2NoZWR1bGVzIG9uIHRoZSBtaWNybyB0YXNrIHF1ZXVlLCB3aGljaCB1c2VzIHRoZVxuICogZmFzdGVzdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGF2YWlsYWJsZSwgZWl0aGVyIE5vZGUuanMnIGBwcm9jZXNzLm5leHRUaWNrKClgXG4gKiBvciBXZWIgV29ya2VyIE1lc3NhZ2VDaGFubmVsIG9yIHNldFRpbWVvdXQgb3Igb3RoZXJzLiBVc2UgdGhpcyBmb3JcbiAqIGFzeW5jaHJvbm91cyBjb252ZXJzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGVyfSBhc3luYyBTY2hlZHVsZXMgd29yayB3aXRoIGBzZXRJbnRlcnZhbGAuIFVzZSB0aGlzIGZvclxuICogdGltZS1iYXNlZCBvcGVyYXRpb25zLlxuICogQHByb3BlcnR5IHtTY2hlZHVsZXJ9IGFuaW1hdGlvbkZyYW1lIFNjaGVkdWxlcyB3b3JrIHdpdGggYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuXG4gKiBVc2UgdGhpcyBmb3Igc3luY2hyb25pemluZyB3aXRoIHRoZSBwbGF0Zm9ybSdzIHBhaW50aW5nXG4gKi9cbnZhciBTY2hlZHVsZXIgPSB7XG4gICAgYXNhcDogYXNhcF8xLmFzYXAsXG4gICAgcXVldWU6IHF1ZXVlXzEucXVldWUsXG4gICAgYW5pbWF0aW9uRnJhbWU6IGFuaW1hdGlvbkZyYW1lXzEuYW5pbWF0aW9uRnJhbWUsXG4gICAgYXN5bmM6IGFzeW5jXzEuYXN5bmNcbn07XG5leHBvcnRzLlNjaGVkdWxlciA9IFNjaGVkdWxlcjtcbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUnguU3ltYm9sXG4gKiBAcHJvcGVydHkge1N5bWJvbHxzdHJpbmd9IHJ4U3Vic2NyaWJlciBBIHN5bWJvbCB0byB1c2UgYXMgYSBwcm9wZXJ0eSBuYW1lIHRvXG4gKiByZXRyaWV2ZSBhbiBcIlJ4IHNhZmVcIiBPYnNlcnZlciBmcm9tIGFuIG9iamVjdC4gXCJSeCBzYWZldHlcIiBjYW4gYmUgZGVmaW5lZCBhc1xuICogYW4gb2JqZWN0IHRoYXQgaGFzIGFsbCBvZiB0aGUgdHJhaXRzIG9mIGFuIFJ4IFN1YnNjcmliZXIsIGluY2x1ZGluZyB0aGVcbiAqIGFiaWxpdHkgdG8gYWRkIGFuZCByZW1vdmUgc3Vic2NyaXB0aW9ucyB0byB0aGUgc3Vic2NyaXB0aW9uIGNoYWluIGFuZFxuICogZ3VhcmFudGVlcyBpbnZvbHZpbmcgZXZlbnQgdHJpZ2dlcmluZyAoY2FuJ3QgXCJuZXh0XCIgYWZ0ZXIgdW5zdWJzY3JpcHRpb24sXG4gKiBldGMpLlxuICogQHByb3BlcnR5IHtTeW1ib2x8c3RyaW5nfSBvYnNlcnZhYmxlIEEgc3ltYm9sIHRvIHVzZSBhcyBhIHByb3BlcnR5IG5hbWUgdG9cbiAqIHJldHJpZXZlIGFuIE9ic2VydmFibGUgYXMgZGVmaW5lZCBieSB0aGUgW0VDTUFTY3JpcHQgXCJPYnNlcnZhYmxlXCIgc3BlY10oaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZSkuXG4gKiBAcHJvcGVydHkge1N5bWJvbHxzdHJpbmd9IGl0ZXJhdG9yIFRoZSBFUzYgc3ltYm9sIHRvIHVzZSBhcyBhIHByb3BlcnR5IG5hbWVcbiAqIHRvIHJldHJpZXZlIGFuIGl0ZXJhdG9yIGZyb20gYW4gb2JqZWN0LlxuICovXG52YXIgU3ltYm9sID0ge1xuICAgIHJ4U3Vic2NyaWJlcjogcnhTdWJzY3JpYmVyXzEuJCRyeFN1YnNjcmliZXIsXG4gICAgb2JzZXJ2YWJsZTogb2JzZXJ2YWJsZV8xLiQkb2JzZXJ2YWJsZSxcbiAgICBpdGVyYXRvcjogaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXG59O1xuZXhwb3J0cy5TeW1ib2wgPSBTeW1ib2w7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SeC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9SeC5qc1xuLy8gbW9kdWxlIGlkID0gMzc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  557. /***/ },
  558. /* 376 */
  559. /***/ function(module, exports, __webpack_require__) {
  560. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bindCallback_1 = __webpack_require__(377);\nObservable_1.Observable.bindCallback = bindCallback_1.bindCallback;\n//# sourceMappingURL=bindCallback.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2JpbmRDYWxsYmFjay5qcz83YWRjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBiaW5kQ2FsbGJhY2tfMSA9IHJlcXVpcmUoJy4uLy4uL29ic2VydmFibGUvYmluZENhbGxiYWNrJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5iaW5kQ2FsbGJhY2sgPSBiaW5kQ2FsbGJhY2tfMS5iaW5kQ2FsbGJhY2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kQ2FsbGJhY2suanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzXG4vLyBtb2R1bGUgaWQgPSAzNzZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  561. /***/ },
  562. /* 377 */
  563. /***/ function(module, exports, __webpack_require__) {
  564. eval("\"use strict\";\nvar BoundCallbackObservable_1 = __webpack_require__(378);\nexports.bindCallback = BoundCallbackObservable_1.BoundCallbackObservable.create;\n//# sourceMappingURL=bindCallback.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvYmluZENhbGxiYWNrLmpzPzg4OGMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQm91bmRDYWxsYmFja09ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vQm91bmRDYWxsYmFja09ic2VydmFibGUnKTtcbmV4cG9ydHMuYmluZENhbGxiYWNrID0gQm91bmRDYWxsYmFja09ic2VydmFibGVfMS5Cb3VuZENhbGxiYWNrT2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kQ2FsbGJhY2suanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9iaW5kQ2FsbGJhY2suanNcbi8vIG1vZHVsZSBpZCA9IDM3N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  565. /***/ },
  566. /* 378 */
  567. /***/ function(module, exports, __webpack_require__) {
  568. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar AsyncSubject_1 = __webpack_require__(379);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar BoundCallbackObservable = (function (_super) {\n __extends(BoundCallbackObservable, _super);\n function BoundCallbackObservable(callbackFunc, selector, args, scheduler) {\n _super.call(this);\n this.callbackFunc = callbackFunc;\n this.selector = selector;\n this.args = args;\n this.scheduler = scheduler;\n }\n /* tslint:enable:max-line-length */\n /**\n * Converts a callback API to a function that returns an Observable.\n *\n * <span class=\"informal\">Give it a function `f` of type `f(x, callback)` and\n * it will return a function `g` that when called as `g(x)` will output an\n * Observable.</span>\n *\n * `bindCallback` is not an operator because its input and output are not\n * Observables. The input is a function `func` with some parameters, but the\n * last parameter must be a callback function that `func` calls when it is\n * done. The output of `bindCallback` is a function that takes the same\n * parameters as `func`, except the last one (the callback). When the output\n * function is called with arguments, it will return an Observable where the\n * results will be delivered to.\n *\n * @example <caption>Convert jQuery's getJSON to an Observable API</caption>\n * // Suppose we have jQuery.getJSON('/my/url', callback)\n * var getJSONAsObservable = Rx.Observable.bindCallback(jQuery.getJSON);\n * var result = getJSONAsObservable('/my/url');\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link bindNodeCallback}\n * @see {@link from}\n * @see {@link fromPromise}\n *\n * @param {function} func Function with a callback as the last parameter.\n * @param {function} [selector] A function which takes the arguments from the\n * callback and maps those a value to emit on the output Observable.\n * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n * callbacks.\n * @return {function(...params: *): Observable} A function which returns the\n * Observable that delivers the same values the callback would deliver.\n * @static true\n * @name bindCallback\n * @owner Observable\n */\n BoundCallbackObservable.create = function (func, selector, scheduler) {\n if (selector === void 0) { selector = undefined; }\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return new BoundCallbackObservable(func, selector, args, scheduler);\n };\n };\n BoundCallbackObservable.prototype._subscribe = function (subscriber) {\n var callbackFunc = this.callbackFunc;\n var args = this.args;\n var scheduler = this.scheduler;\n var subject = this.subject;\n if (!scheduler) {\n if (!subject) {\n subject = this.subject = new AsyncSubject_1.AsyncSubject();\n var handler = function handlerFn() {\n var innerArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n innerArgs[_i - 0] = arguments[_i];\n }\n var source = handlerFn.source;\n var selector = source.selector, subject = source.subject;\n if (selector) {\n var result_1 = tryCatch_1.tryCatch(selector).apply(this, innerArgs);\n if (result_1 === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n else {\n subject.next(result_1);\n subject.complete();\n }\n }\n else {\n subject.next(innerArgs.length === 1 ? innerArgs[0] : innerArgs);\n subject.complete();\n }\n };\n // use named function instance to avoid closure.\n handler.source = this;\n var result = tryCatch_1.tryCatch(callbackFunc).apply(this, args.concat(handler));\n if (result === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n }\n return subject.subscribe(subscriber);\n }\n else {\n return scheduler.schedule(BoundCallbackObservable.dispatch, 0, { source: this, subscriber: subscriber });\n }\n };\n BoundCallbackObservable.dispatch = function (state) {\n var self = this;\n var source = state.source, subscriber = state.subscriber;\n var callbackFunc = source.callbackFunc, args = source.args, scheduler = source.scheduler;\n var subject = source.subject;\n if (!subject) {\n subject = source.subject = new AsyncSubject_1.AsyncSubject();\n var handler = function handlerFn() {\n var innerArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n innerArgs[_i - 0] = arguments[_i];\n }\n var source = handlerFn.source;\n var selector = source.selector, subject = source.subject;\n if (selector) {\n var result_2 = tryCatch_1.tryCatch(selector).apply(this, innerArgs);\n if (result_2 === errorObject_1.errorObject) {\n self.add(scheduler.schedule(dispatchError, 0, { err: errorObject_1.errorObject.e, subject: subject }));\n }\n else {\n self.add(scheduler.schedule(dispatchNext, 0, { value: result_2, subject: subject }));\n }\n }\n else {\n var value = innerArgs.length === 1 ? innerArgs[0] : innerArgs;\n self.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n }\n };\n // use named function to pass values in without closure\n handler.source = source;\n var result = tryCatch_1.tryCatch(callbackFunc).apply(this, args.concat(handler));\n if (result === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n }\n self.add(subject.subscribe(subscriber));\n };\n return BoundCallbackObservable;\n}(Observable_1.Observable));\nexports.BoundCallbackObservable = BoundCallbackObservable;\nfunction dispatchNext(arg) {\n var value = arg.value, subject = arg.subject;\n subject.next(value);\n subject.complete();\n}\nfunction dispatchError(arg) {\n var err = arg.err, subject = arg.subject;\n subject.error(err);\n}\n//# sourceMappingURL=BoundCallbackObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvQm91bmRDYWxsYmFja09ic2VydmFibGUuanM/YzljNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG52YXIgQXN5bmNTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9Bc3luY1N1YmplY3QnKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgQm91bmRDYWxsYmFja09ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCb3VuZENhbGxiYWNrT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCb3VuZENhbGxiYWNrT2JzZXJ2YWJsZShjYWxsYmFja0Z1bmMsIHNlbGVjdG9yLCBhcmdzLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tGdW5jID0gY2FsbGJhY2tGdW5jO1xuICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICAvKiB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgY2FsbGJhY2sgQVBJIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIE9ic2VydmFibGUuXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+R2l2ZSBpdCBhIGZ1bmN0aW9uIGBmYCBvZiB0eXBlIGBmKHgsIGNhbGxiYWNrKWAgYW5kXG4gICAgICogaXQgd2lsbCByZXR1cm4gYSBmdW5jdGlvbiBgZ2AgdGhhdCB3aGVuIGNhbGxlZCBhcyBgZyh4KWAgd2lsbCBvdXRwdXQgYW5cbiAgICAgKiBPYnNlcnZhYmxlLjwvc3Bhbj5cbiAgICAgKlxuICAgICAqIGBiaW5kQ2FsbGJhY2tgIGlzIG5vdCBhbiBvcGVyYXRvciBiZWNhdXNlIGl0cyBpbnB1dCBhbmQgb3V0cHV0IGFyZSBub3RcbiAgICAgKiBPYnNlcnZhYmxlcy4gVGhlIGlucHV0IGlzIGEgZnVuY3Rpb24gYGZ1bmNgIHdpdGggc29tZSBwYXJhbWV0ZXJzLCBidXQgdGhlXG4gICAgICogbGFzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYGZ1bmNgIGNhbGxzIHdoZW4gaXQgaXNcbiAgICAgKiBkb25lLiBUaGUgb3V0cHV0IG9mIGBiaW5kQ2FsbGJhY2tgIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgc2FtZVxuICAgICAqIHBhcmFtZXRlcnMgYXMgYGZ1bmNgLCBleGNlcHQgdGhlIGxhc3Qgb25lICh0aGUgY2FsbGJhY2spLiBXaGVuIHRoZSBvdXRwdXRcbiAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudHMsIGl0IHdpbGwgcmV0dXJuIGFuIE9ic2VydmFibGUgd2hlcmUgdGhlXG4gICAgICogcmVzdWx0cyB3aWxsIGJlIGRlbGl2ZXJlZCB0by5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkNvbnZlcnQgalF1ZXJ5J3MgZ2V0SlNPTiB0byBhbiBPYnNlcnZhYmxlIEFQSTwvY2FwdGlvbj5cbiAgICAgKiAvLyBTdXBwb3NlIHdlIGhhdmUgalF1ZXJ5LmdldEpTT04oJy9teS91cmwnLCBjYWxsYmFjaylcbiAgICAgKiB2YXIgZ2V0SlNPTkFzT2JzZXJ2YWJsZSA9IFJ4Lk9ic2VydmFibGUuYmluZENhbGxiYWNrKGpRdWVyeS5nZXRKU09OKTtcbiAgICAgKiB2YXIgcmVzdWx0ID0gZ2V0SlNPTkFzT2JzZXJ2YWJsZSgnL215L3VybCcpO1xuICAgICAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSwgZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGJpbmROb2RlQ2FsbGJhY2t9XG4gICAgICogQHNlZSB7QGxpbmsgZnJvbX1cbiAgICAgKiBAc2VlIHtAbGluayBmcm9tUHJvbWlzZX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZVxuICAgICAqIGNhbGxiYWNrIGFuZCBtYXBzIHRob3NlIGEgdmFsdWUgdG8gZW1pdCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFRoZSBzY2hlZHVsZXIgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlXG4gICAgICogY2FsbGJhY2tzLlxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKC4uLnBhcmFtczogKik6IE9ic2VydmFibGV9IEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGVcbiAgICAgKiBPYnNlcnZhYmxlIHRoYXQgZGVsaXZlcnMgdGhlIHNhbWUgdmFsdWVzIHRoZSBjYWxsYmFjayB3b3VsZCBkZWxpdmVyLlxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIGJpbmRDYWxsYmFja1xuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgQm91bmRDYWxsYmFja09ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGZ1bmMsIHNlbGVjdG9yLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB2b2lkIDApIHsgc2VsZWN0b3IgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJvdW5kQ2FsbGJhY2tPYnNlcnZhYmxlKGZ1bmMsIHNlbGVjdG9yLCBhcmdzLCBzY2hlZHVsZXIpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgQm91bmRDYWxsYmFja09ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgY2FsbGJhY2tGdW5jID0gdGhpcy5jYWxsYmFja0Z1bmM7XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy5hcmdzO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0O1xuICAgICAgICBpZiAoIXNjaGVkdWxlcikge1xuICAgICAgICAgICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdCA9IHRoaXMuc3ViamVjdCA9IG5ldyBBc3luY1N1YmplY3RfMS5Bc3luY1N1YmplY3QoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXJGbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlubmVyQXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJBcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBoYW5kbGVyRm4uc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzb3VyY2Uuc2VsZWN0b3IsIHN1YmplY3QgPSBzb3VyY2Uuc3ViamVjdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0XzEgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKHNlbGVjdG9yKS5hcHBseSh0aGlzLCBpbm5lckFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5lcnJvcihlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5uZXh0KHJlc3VsdF8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0Lm5leHQoaW5uZXJBcmdzLmxlbmd0aCA9PT0gMSA/IGlubmVyQXJnc1swXSA6IGlubmVyQXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIHVzZSBuYW1lZCBmdW5jdGlvbiBpbnN0YW5jZSB0byBhdm9pZCBjbG9zdXJlLlxuICAgICAgICAgICAgICAgIGhhbmRsZXIuc291cmNlID0gdGhpcztcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChjYWxsYmFja0Z1bmMpLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KGhhbmRsZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3ViamVjdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKEJvdW5kQ2FsbGJhY2tPYnNlcnZhYmxlLmRpc3BhdGNoLCAwLCB7IHNvdXJjZTogdGhpcywgc3Vic2NyaWJlcjogc3Vic2NyaWJlciB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQm91bmRDYWxsYmFja09ic2VydmFibGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgc291cmNlID0gc3RhdGUuc291cmNlLCBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgdmFyIGNhbGxiYWNrRnVuYyA9IHNvdXJjZS5jYWxsYmFja0Z1bmMsIGFyZ3MgPSBzb3VyY2UuYXJncywgc2NoZWR1bGVyID0gc291cmNlLnNjaGVkdWxlcjtcbiAgICAgICAgdmFyIHN1YmplY3QgPSBzb3VyY2Uuc3ViamVjdDtcbiAgICAgICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICAgICAgICBzdWJqZWN0ID0gc291cmNlLnN1YmplY3QgPSBuZXcgQXN5bmNTdWJqZWN0XzEuQXN5bmNTdWJqZWN0KCk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXJGbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJBcmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJBcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gaGFuZGxlckZuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzb3VyY2Uuc2VsZWN0b3IsIHN1YmplY3QgPSBzb3VyY2Uuc3ViamVjdDtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdF8yID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChzZWxlY3RvcikuYXBwbHkodGhpcywgaW5uZXJBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8yID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hFcnJvciwgMCwgeyBlcnI6IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSwgc3ViamVjdDogc3ViamVjdCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hOZXh0LCAwLCB7IHZhbHVlOiByZXN1bHRfMiwgc3ViamVjdDogc3ViamVjdCB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGlubmVyQXJncy5sZW5ndGggPT09IDEgPyBpbm5lckFyZ3NbMF0gOiBpbm5lckFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaE5leHQsIDAsIHsgdmFsdWU6IHZhbHVlLCBzdWJqZWN0OiBzdWJqZWN0IH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gdXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHBhc3MgdmFsdWVzIGluIHdpdGhvdXQgY2xvc3VyZVxuICAgICAgICAgICAgaGFuZGxlci5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChjYWxsYmFja0Z1bmMpLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KGhhbmRsZXIpKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5hZGQoc3ViamVjdC5zdWJzY3JpYmUoc3Vic2NyaWJlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIEJvdW5kQ2FsbGJhY2tPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5Cb3VuZENhbGxiYWNrT2JzZXJ2YWJsZSA9IEJvdW5kQ2FsbGJhY2tPYnNlcnZhYmxlO1xuZnVuY3Rpb24gZGlzcGF0Y2hOZXh0KGFyZykge1xuICAgIHZhciB2YWx1ZSA9IGFyZy52YWx1ZSwgc3ViamVjdCA9IGFyZy5zdWJqZWN0O1xuICAgIHN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgc3ViamVjdC5jb21wbGV0ZSgpO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hFcnJvcihhcmcpIHtcbiAgICB2YXIgZXJyID0gYXJnLmVyciwgc3ViamVjdCA9IGFyZy5zdWJqZWN0O1xuICAgIHN1YmplY3QuZXJyb3IoZXJyKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJvdW5kQ2FsbGJhY2tPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvQm91bmRDYWxsYmFja09ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDM3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  569. /***/ },
  570. /* 379 */
  571. /***/ function(module, exports, __webpack_require__) {
  572. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar Subscription_1 = __webpack_require__(11);\n/**\n * @class AsyncSubject<T>\n */\nvar AsyncSubject = (function (_super) {\n __extends(AsyncSubject, _super);\n function AsyncSubject() {\n _super.apply(this, arguments);\n this.value = null;\n this.hasNext = false;\n this.hasCompleted = false;\n }\n AsyncSubject.prototype._subscribe = function (subscriber) {\n if (this.hasCompleted && this.hasNext) {\n subscriber.next(this.value);\n subscriber.complete();\n return Subscription_1.Subscription.EMPTY;\n }\n else if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription_1.Subscription.EMPTY;\n }\n return _super.prototype._subscribe.call(this, subscriber);\n };\n AsyncSubject.prototype.next = function (value) {\n if (!this.hasCompleted) {\n this.value = value;\n this.hasNext = true;\n }\n };\n AsyncSubject.prototype.complete = function () {\n this.hasCompleted = true;\n if (this.hasNext) {\n _super.prototype.next.call(this, this.value);\n }\n _super.prototype.complete.call(this);\n };\n return AsyncSubject;\n}(Subject_1.Subject));\nexports.AsyncSubject = AsyncSubject;\n//# sourceMappingURL=AsyncSubject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL0FzeW5jU3ViamVjdC5qcz84MDliIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi9TdWJqZWN0Jyk7XG52YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlKCcuL1N1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBAY2xhc3MgQXN5bmNTdWJqZWN0PFQ+XG4gKi9cbnZhciBBc3luY1N1YmplY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBc3luY1N1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXN5bmNTdWJqZWN0KCkge1xuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzTmV4dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBBc3luY1N1YmplY3QucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQgJiYgdGhpcy5oYXNOZXh0KSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaGFzRXJyb3IpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhpcy50aHJvd25FcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9zdWJzY3JpYmUuY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTtcbiAgICB9O1xuICAgIEFzeW5jU3ViamVjdC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzQ29tcGxldGVkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmhhc05leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBc3luY1N1YmplY3QucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmhhc05leHQpIHtcbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIHRoaXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBBc3luY1N1YmplY3Q7XG59KFN1YmplY3RfMS5TdWJqZWN0KSk7XG5leHBvcnRzLkFzeW5jU3ViamVjdCA9IEFzeW5jU3ViamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzeW5jU3ViamVjdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9Bc3luY1N1YmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDM3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  573. /***/ },
  574. /* 380 */
  575. /***/ function(module, exports, __webpack_require__) {
  576. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bindNodeCallback_1 = __webpack_require__(381);\nObservable_1.Observable.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;\n//# sourceMappingURL=bindNodeCallback.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2JpbmROb2RlQ2FsbGJhY2suanM/MmY4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgYmluZE5vZGVDYWxsYmFja18xID0gcmVxdWlyZSgnLi4vLi4vb2JzZXJ2YWJsZS9iaW5kTm9kZUNhbGxiYWNrJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5iaW5kTm9kZUNhbGxiYWNrID0gYmluZE5vZGVDYWxsYmFja18xLmJpbmROb2RlQ2FsbGJhY2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kTm9kZUNhbGxiYWNrLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2JpbmROb2RlQ2FsbGJhY2suanNcbi8vIG1vZHVsZSBpZCA9IDM4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  577. /***/ },
  578. /* 381 */
  579. /***/ function(module, exports, __webpack_require__) {
  580. eval("\"use strict\";\nvar BoundNodeCallbackObservable_1 = __webpack_require__(382);\nexports.bindNodeCallback = BoundNodeCallbackObservable_1.BoundNodeCallbackObservable.create;\n//# sourceMappingURL=bindNodeCallback.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvYmluZE5vZGVDYWxsYmFjay5qcz85ODM3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9Cb3VuZE5vZGVDYWxsYmFja09ic2VydmFibGUnKTtcbmV4cG9ydHMuYmluZE5vZGVDYWxsYmFjayA9IEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZV8xLkJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kTm9kZUNhbGxiYWNrLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvYmluZE5vZGVDYWxsYmFjay5qc1xuLy8gbW9kdWxlIGlkID0gMzgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  581. /***/ },
  582. /* 382 */
  583. /***/ function(module, exports, __webpack_require__) {
  584. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar AsyncSubject_1 = __webpack_require__(379);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar BoundNodeCallbackObservable = (function (_super) {\n __extends(BoundNodeCallbackObservable, _super);\n function BoundNodeCallbackObservable(callbackFunc, selector, args, scheduler) {\n _super.call(this);\n this.callbackFunc = callbackFunc;\n this.selector = selector;\n this.args = args;\n this.scheduler = scheduler;\n }\n /* tslint:enable:max-line-length */\n /**\n * Converts a Node.js-style callback API to a function that returns an\n * Observable.\n *\n * <span class=\"informal\">It's just like {@link bindCallback}, but the\n * callback is expected to be of type `callback(error, result)`.</span>\n *\n * `bindNodeCallback` is not an operator because its input and output are not\n * Observables. The input is a function `func` with some parameters, but the\n * last parameter must be a callback function that `func` calls when it is\n * done. The callback function is expected to follow Node.js conventions,\n * where the first argument to the callback is an error, while remaining\n * arguments are the callback result. The output of `bindNodeCallback` is a\n * function that takes the same parameters as `func`, except the last one (the\n * callback). When the output function is called with arguments, it will\n * return an Observable where the results will be delivered to.\n *\n * @example <caption>Read a file from the filesystem and get the data as an Observable</caption>\n * import * as fs from 'fs';\n * var readFileAsObservable = Rx.Observable.bindNodeCallback(fs.readFile);\n * var result = readFileAsObservable('./roadNames.txt', 'utf8');\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link bindCallback}\n * @see {@link from}\n * @see {@link fromPromise}\n *\n * @param {function} func Function with a callback as the last parameter.\n * @param {function} [selector] A function which takes the arguments from the\n * callback and maps those a value to emit on the output Observable.\n * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n * callbacks.\n * @return {function(...params: *): Observable} A function which returns the\n * Observable that delivers the same values the Node.js callback would\n * deliver.\n * @static true\n * @name bindNodeCallback\n * @owner Observable\n */\n BoundNodeCallbackObservable.create = function (func, selector, scheduler) {\n if (selector === void 0) { selector = undefined; }\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return new BoundNodeCallbackObservable(func, selector, args, scheduler);\n };\n };\n BoundNodeCallbackObservable.prototype._subscribe = function (subscriber) {\n var callbackFunc = this.callbackFunc;\n var args = this.args;\n var scheduler = this.scheduler;\n var subject = this.subject;\n if (!scheduler) {\n if (!subject) {\n subject = this.subject = new AsyncSubject_1.AsyncSubject();\n var handler = function handlerFn() {\n var innerArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n innerArgs[_i - 0] = arguments[_i];\n }\n var source = handlerFn.source;\n var selector = source.selector, subject = source.subject;\n var err = innerArgs.shift();\n if (err) {\n subject.error(err);\n }\n else if (selector) {\n var result_1 = tryCatch_1.tryCatch(selector).apply(this, innerArgs);\n if (result_1 === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n else {\n subject.next(result_1);\n subject.complete();\n }\n }\n else {\n subject.next(innerArgs.length === 1 ? innerArgs[0] : innerArgs);\n subject.complete();\n }\n };\n // use named function instance to avoid closure.\n handler.source = this;\n var result = tryCatch_1.tryCatch(callbackFunc).apply(this, args.concat(handler));\n if (result === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n }\n return subject.subscribe(subscriber);\n }\n else {\n return scheduler.schedule(dispatch, 0, { source: this, subscriber: subscriber });\n }\n };\n return BoundNodeCallbackObservable;\n}(Observable_1.Observable));\nexports.BoundNodeCallbackObservable = BoundNodeCallbackObservable;\nfunction dispatch(state) {\n var self = this;\n var source = state.source, subscriber = state.subscriber;\n // XXX: cast to `any` to access to the private field in `source`.\n var _a = source, callbackFunc = _a.callbackFunc, args = _a.args, scheduler = _a.scheduler;\n var subject = source.subject;\n if (!subject) {\n subject = source.subject = new AsyncSubject_1.AsyncSubject();\n var handler = function handlerFn() {\n var innerArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n innerArgs[_i - 0] = arguments[_i];\n }\n var source = handlerFn.source;\n var selector = source.selector, subject = source.subject;\n var err = innerArgs.shift();\n if (err) {\n subject.error(err);\n }\n else if (selector) {\n var result_2 = tryCatch_1.tryCatch(selector).apply(this, innerArgs);\n if (result_2 === errorObject_1.errorObject) {\n self.add(scheduler.schedule(dispatchError, 0, { err: errorObject_1.errorObject.e, subject: subject }));\n }\n else {\n self.add(scheduler.schedule(dispatchNext, 0, { value: result_2, subject: subject }));\n }\n }\n else {\n var value = innerArgs.length === 1 ? innerArgs[0] : innerArgs;\n self.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n }\n };\n // use named function to pass values in without closure\n handler.source = source;\n var result = tryCatch_1.tryCatch(callbackFunc).apply(this, args.concat(handler));\n if (result === errorObject_1.errorObject) {\n subject.error(errorObject_1.errorObject.e);\n }\n }\n self.add(subject.subscribe(subscriber));\n}\nfunction dispatchNext(arg) {\n var value = arg.value, subject = arg.subject;\n subject.next(value);\n subject.complete();\n}\nfunction dispatchError(arg) {\n var err = arg.err, subject = arg.subject;\n subject.error(err);\n}\n//# sourceMappingURL=BoundNodeCallbackObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvQm91bmROb2RlQ2FsbGJhY2tPYnNlcnZhYmxlLmpzPzUyN2YiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIEFzeW5jU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vQXN5bmNTdWJqZWN0Jyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCb3VuZE5vZGVDYWxsYmFja09ic2VydmFibGUoY2FsbGJhY2tGdW5jLCBzZWxlY3RvciwgYXJncywgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrRnVuYyA9IGNhbGxiYWNrRnVuYztcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG4gICAgLyogdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIE5vZGUuanMtc3R5bGUgY2FsbGJhY2sgQVBJIHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuXG4gICAgICogT2JzZXJ2YWJsZS5cbiAgICAgKlxuICAgICAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5JdCdzIGp1c3QgbGlrZSB7QGxpbmsgYmluZENhbGxiYWNrfSwgYnV0IHRoZVxuICAgICAqIGNhbGxiYWNrIGlzIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgYGNhbGxiYWNrKGVycm9yLCByZXN1bHQpYC48L3NwYW4+XG4gICAgICpcbiAgICAgKiBgYmluZE5vZGVDYWxsYmFja2AgaXMgbm90IGFuIG9wZXJhdG9yIGJlY2F1c2UgaXRzIGlucHV0IGFuZCBvdXRwdXQgYXJlIG5vdFxuICAgICAqIE9ic2VydmFibGVzLiBUaGUgaW5wdXQgaXMgYSBmdW5jdGlvbiBgZnVuY2Agd2l0aCBzb21lIHBhcmFtZXRlcnMsIGJ1dCB0aGVcbiAgICAgKiBsYXN0IHBhcmFtZXRlciBtdXN0IGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBgZnVuY2AgY2FsbHMgd2hlbiBpdCBpc1xuICAgICAqIGRvbmUuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBmb2xsb3cgTm9kZS5qcyBjb252ZW50aW9ucyxcbiAgICAgKiB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrIGlzIGFuIGVycm9yLCB3aGlsZSByZW1haW5pbmdcbiAgICAgKiBhcmd1bWVudHMgYXJlIHRoZSBjYWxsYmFjayByZXN1bHQuIFRoZSBvdXRwdXQgb2YgYGJpbmROb2RlQ2FsbGJhY2tgIGlzIGFcbiAgICAgKiBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgYGZ1bmNgLCBleGNlcHQgdGhlIGxhc3Qgb25lICh0aGVcbiAgICAgKiBjYWxsYmFjaykuIFdoZW4gdGhlIG91dHB1dCBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudHMsIGl0IHdpbGxcbiAgICAgKiByZXR1cm4gYW4gT2JzZXJ2YWJsZSB3aGVyZSB0aGUgcmVzdWx0cyB3aWxsIGJlIGRlbGl2ZXJlZCB0by5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPlJlYWQgYSBmaWxlIGZyb20gdGhlIGZpbGVzeXN0ZW0gYW5kIGdldCB0aGUgZGF0YSBhcyBhbiBPYnNlcnZhYmxlPC9jYXB0aW9uPlxuICAgICAqIGltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbiAgICAgKiB2YXIgcmVhZEZpbGVBc09ic2VydmFibGUgPSBSeC5PYnNlcnZhYmxlLmJpbmROb2RlQ2FsbGJhY2soZnMucmVhZEZpbGUpO1xuICAgICAqIHZhciByZXN1bHQgPSByZWFkRmlsZUFzT2JzZXJ2YWJsZSgnLi9yb2FkTmFtZXMudHh0JywgJ3V0ZjgnKTtcbiAgICAgKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCksIGUgPT4gY29uc29sZS5lcnJvcihlKSk7XG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBiaW5kQ2FsbGJhY2t9XG4gICAgICogQHNlZSB7QGxpbmsgZnJvbX1cbiAgICAgKiBAc2VlIHtAbGluayBmcm9tUHJvbWlzZX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGZ1bmMgRnVuY3Rpb24gd2l0aCBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc2VsZWN0b3JdIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIGFyZ3VtZW50cyBmcm9tIHRoZVxuICAgICAqIGNhbGxiYWNrIGFuZCBtYXBzIHRob3NlIGEgdmFsdWUgdG8gZW1pdCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdIFRoZSBzY2hlZHVsZXIgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlXG4gICAgICogY2FsbGJhY2tzLlxuICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKC4uLnBhcmFtczogKik6IE9ic2VydmFibGV9IEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGVcbiAgICAgKiBPYnNlcnZhYmxlIHRoYXQgZGVsaXZlcnMgdGhlIHNhbWUgdmFsdWVzIHRoZSBOb2RlLmpzIGNhbGxiYWNrIHdvdWxkXG4gICAgICogZGVsaXZlci5cbiAgICAgKiBAc3RhdGljIHRydWVcbiAgICAgKiBAbmFtZSBiaW5kTm9kZUNhbGxiYWNrXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBCb3VuZE5vZGVDYWxsYmFja09ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGZ1bmMsIHNlbGVjdG9yLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB2b2lkIDApIHsgc2VsZWN0b3IgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZShmdW5jLCBzZWxlY3RvciwgYXJncywgc2NoZWR1bGVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBjYWxsYmFja0Z1bmMgPSB0aGlzLmNhbGxiYWNrRnVuYztcbiAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLmFyZ3M7XG4gICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLnN1YmplY3Q7XG4gICAgICAgIGlmICghc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0ID0gbmV3IEFzeW5jU3ViamVjdF8xLkFzeW5jU3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlckZuKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5uZXJBcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckFyZ3NbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGhhbmRsZXJGbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHNvdXJjZS5zZWxlY3Rvciwgc3ViamVjdCA9IHNvdXJjZS5zdWJqZWN0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gaW5uZXJBcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdF8xID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChzZWxlY3RvcikuYXBwbHkodGhpcywgaW5uZXJBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRfMSA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QubmV4dChyZXN1bHRfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5uZXh0KGlubmVyQXJncy5sZW5ndGggPT09IDEgPyBpbm5lckFyZ3NbMF0gOiBpbm5lckFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyB1c2UgbmFtZWQgZnVuY3Rpb24gaW5zdGFuY2UgdG8gYXZvaWQgY2xvc3VyZS5cbiAgICAgICAgICAgICAgICBoYW5kbGVyLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goY2FsbGJhY2tGdW5jKS5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChoYW5kbGVyKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaCwgMCwgeyBzb3VyY2U6IHRoaXMsIHN1YnNjcmliZXI6IHN1YnNjcmliZXIgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBCb3VuZE5vZGVDYWxsYmFja09ic2VydmFibGU7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLkJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZSA9IEJvdW5kTm9kZUNhbGxiYWNrT2JzZXJ2YWJsZTtcbmZ1bmN0aW9uIGRpc3BhdGNoKHN0YXRlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzb3VyY2UgPSBzdGF0ZS5zb3VyY2UsIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyO1xuICAgIC8vIFhYWDogY2FzdCB0byBgYW55YCB0byBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgZmllbGQgaW4gYHNvdXJjZWAuXG4gICAgdmFyIF9hID0gc291cmNlLCBjYWxsYmFja0Z1bmMgPSBfYS5jYWxsYmFja0Z1bmMsIGFyZ3MgPSBfYS5hcmdzLCBzY2hlZHVsZXIgPSBfYS5zY2hlZHVsZXI7XG4gICAgdmFyIHN1YmplY3QgPSBzb3VyY2Uuc3ViamVjdDtcbiAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgICAgc3ViamVjdCA9IHNvdXJjZS5zdWJqZWN0ID0gbmV3IEFzeW5jU3ViamVjdF8xLkFzeW5jU3ViamVjdCgpO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXJGbigpIHtcbiAgICAgICAgICAgIHZhciBpbm5lckFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJBcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGhhbmRsZXJGbi5zb3VyY2U7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBzb3VyY2Uuc2VsZWN0b3IsIHN1YmplY3QgPSBzb3VyY2Uuc3ViamVjdDtcbiAgICAgICAgICAgIHZhciBlcnIgPSBpbm5lckFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0LmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHRfMiA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goc2VsZWN0b3IpLmFwcGx5KHRoaXMsIGlubmVyQXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8yID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaEVycm9yLCAwLCB7IGVycjogZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lLCBzdWJqZWN0OiBzdWJqZWN0IH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaE5leHQsIDAsIHsgdmFsdWU6IHJlc3VsdF8yLCBzdWJqZWN0OiBzdWJqZWN0IH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbm5lckFyZ3MubGVuZ3RoID09PSAxID8gaW5uZXJBcmdzWzBdIDogaW5uZXJBcmdzO1xuICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaE5leHQsIDAsIHsgdmFsdWU6IHZhbHVlLCBzdWJqZWN0OiBzdWJqZWN0IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gdXNlIG5hbWVkIGZ1bmN0aW9uIHRvIHBhc3MgdmFsdWVzIGluIHdpdGhvdXQgY2xvc3VyZVxuICAgICAgICBoYW5kbGVyLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goY2FsbGJhY2tGdW5jKS5hcHBseSh0aGlzLCBhcmdzLmNvbmNhdChoYW5kbGVyKSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxmLmFkZChzdWJqZWN0LnN1YnNjcmliZShzdWJzY3JpYmVyKSk7XG59XG5mdW5jdGlvbiBkaXNwYXRjaE5leHQoYXJnKSB7XG4gICAgdmFyIHZhbHVlID0gYXJnLnZhbHVlLCBzdWJqZWN0ID0gYXJnLnN1YmplY3Q7XG4gICAgc3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG59XG5mdW5jdGlvbiBkaXNwYXRjaEVycm9yKGFyZykge1xuICAgIHZhciBlcnIgPSBhcmcuZXJyLCBzdWJqZWN0ID0gYXJnLnN1YmplY3Q7XG4gICAgc3ViamVjdC5lcnJvcihlcnIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm91bmROb2RlQ2FsbGJhY2tPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvQm91bmROb2RlQ2FsbGJhY2tPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAzODJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  585. /***/ },
  586. /* 383 */
  587. /***/ function(module, exports, __webpack_require__) {
  588. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar combineLatest_1 = __webpack_require__(384);\nObservable_1.Observable.combineLatest = combineLatest_1.combineLatest;\n//# sourceMappingURL=combineLatest.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanM/NzIyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgY29tYmluZUxhdGVzdF8xID0gcmVxdWlyZSgnLi4vLi4vb2JzZXJ2YWJsZS9jb21iaW5lTGF0ZXN0Jyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0ID0gY29tYmluZUxhdGVzdF8xLmNvbWJpbmVMYXRlc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5lTGF0ZXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanNcbi8vIG1vZHVsZSBpZCA9IDM4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  589. /***/ },
  590. /* 384 */
  591. /***/ function(module, exports, __webpack_require__) {
  592. eval("\"use strict\";\nvar isScheduler_1 = __webpack_require__(42);\nvar isArray_1 = __webpack_require__(12);\nvar ArrayObservable_1 = __webpack_require__(39);\nvar combineLatest_1 = __webpack_require__(385);\n/* tslint:enable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from all the Observables passed as\n * arguments. This is done by subscribing to each Observable, in order, and\n * collecting an array of each of the most recent values any time any of the\n * input Observables emits, then either taking that array and passing it as\n * arguments to an optional `project` function and emitting the return value of\n * that, or just emitting the array of recent values directly if there is no\n * `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = Rx.Observable.combineLatest(weight, height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {Observable} observable1 An input Observable to combine with the\n * source Observable.\n * @param {Observable} observable2 An input Observable to combine with the\n * source Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to\n * each input Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @static true\n * @name combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n var project = null;\n var scheduler = null;\n if (isScheduler_1.isScheduler(observables[observables.length - 1])) {\n scheduler = observables.pop();\n }\n if (typeof observables[observables.length - 1] === 'function') {\n project = observables.pop();\n }\n // if the first and only other argument besides the resultSelector is an array\n // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n observables = observables[0];\n }\n return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new combineLatest_1.CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\n//# sourceMappingURL=combineLatest.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qcz8yMTBmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIGlzU2NoZWR1bGVyXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzU2NoZWR1bGVyJyk7XG52YXIgaXNBcnJheV8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc0FycmF5Jyk7XG52YXIgQXJyYXlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0FycmF5T2JzZXJ2YWJsZScpO1xudmFyIGNvbWJpbmVMYXRlc3RfMSA9IHJlcXVpcmUoJy4uL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QnKTtcbi8qIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIE9ic2VydmFibGVzIHRvIGNyZWF0ZSBhbiBPYnNlcnZhYmxlIHdob3NlIHZhbHVlcyBhcmVcbiAqIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbGF0ZXN0IHZhbHVlcyBvZiBlYWNoIG9mIGl0cyBpbnB1dCBPYnNlcnZhYmxlcy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+V2hlbmV2ZXIgYW55IGlucHV0IE9ic2VydmFibGUgZW1pdHMgYSB2YWx1ZSwgaXRcbiAqIGNvbXB1dGVzIGEgZm9ybXVsYSB1c2luZyB0aGUgbGF0ZXN0IHZhbHVlcyBmcm9tIGFsbCB0aGUgaW5wdXRzLCB0aGVuIGVtaXRzXG4gKiB0aGUgb3V0cHV0IG9mIHRoYXQgZm9ybXVsYS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9jb21iaW5lTGF0ZXN0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBjb21iaW5lTGF0ZXN0YCBjb21iaW5lcyB0aGUgdmFsdWVzIGZyb20gYWxsIHRoZSBPYnNlcnZhYmxlcyBwYXNzZWQgYXNcbiAqIGFyZ3VtZW50cy4gVGhpcyBpcyBkb25lIGJ5IHN1YnNjcmliaW5nIHRvIGVhY2ggT2JzZXJ2YWJsZSwgaW4gb3JkZXIsIGFuZFxuICogY29sbGVjdGluZyBhbiBhcnJheSBvZiBlYWNoIG9mIHRoZSBtb3N0IHJlY2VudCB2YWx1ZXMgYW55IHRpbWUgYW55IG9mIHRoZVxuICogaW5wdXQgT2JzZXJ2YWJsZXMgZW1pdHMsIHRoZW4gZWl0aGVyIHRha2luZyB0aGF0IGFycmF5IGFuZCBwYXNzaW5nIGl0IGFzXG4gKiBhcmd1bWVudHMgdG8gYW4gb3B0aW9uYWwgYHByb2plY3RgIGZ1bmN0aW9uIGFuZCBlbWl0dGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mXG4gKiB0aGF0LCBvciBqdXN0IGVtaXR0aW5nIHRoZSBhcnJheSBvZiByZWNlbnQgdmFsdWVzIGRpcmVjdGx5IGlmIHRoZXJlIGlzIG5vXG4gKiBgcHJvamVjdGAgZnVuY3Rpb24uXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RHluYW1pY2FsbHkgY2FsY3VsYXRlIHRoZSBCb2R5LU1hc3MgSW5kZXggZnJvbSBhbiBPYnNlcnZhYmxlIG9mIHdlaWdodCBhbmQgb25lIGZvciBoZWlnaHQ8L2NhcHRpb24+XG4gKiB2YXIgd2VpZ2h0ID0gUnguT2JzZXJ2YWJsZS5vZig3MCwgNzIsIDc2LCA3OSwgNzUpO1xuICogdmFyIGhlaWdodCA9IFJ4Lk9ic2VydmFibGUub2YoMS43NiwgMS43NywgMS43OCk7XG4gKiB2YXIgYm1pID0gUnguT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KHdlaWdodCwgaGVpZ2h0LCAodywgaCkgPT4gdyAvIChoICogaCkpO1xuICogYm1pLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKCdCTUkgaXMgJyArIHgpKTtcbiAqXG4gKiAvLyBXaXRoIG91dHB1dCB0byBjb25zb2xlOlxuICogLy8gQk1JIGlzIDI0LjIxMjI5MzM4ODQyOTc1M1xuICogLy8gQk1JIGlzIDIzLjkzOTQ4MDk5MjA1MjA5XG4gKiAvLyBCTUkgaXMgMjMuNjcxMjUzNjI5NTkyMjIyXG4gKlxuICogQHNlZSB7QGxpbmsgY29tYmluZUFsbH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlfVxuICogQHNlZSB7QGxpbmsgd2l0aExhdGVzdEZyb219XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlMSBBbiBpbnB1dCBPYnNlcnZhYmxlIHRvIGNvbWJpbmUgd2l0aCB0aGVcbiAqIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlMiBBbiBpbnB1dCBPYnNlcnZhYmxlIHRvIGNvbWJpbmUgd2l0aCB0aGVcbiAqIHNvdXJjZSBPYnNlcnZhYmxlLiBNb3JlIHRoYW4gb25lIGlucHV0IE9ic2VydmFibGVzIG1heSBiZSBnaXZlbiBhcyBhcmd1bWVudC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwcm9qZWN0XSBBbiBvcHRpb25hbCBmdW5jdGlvbiB0byBwcm9qZWN0IHRoZSB2YWx1ZXMgZnJvbVxuICogdGhlIGNvbWJpbmVkIGxhdGVzdCB2YWx1ZXMgaW50byBhIG5ldyB2YWx1ZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1udWxsXSBUaGUgU2NoZWR1bGVyIHRvIHVzZSBmb3Igc3Vic2NyaWJpbmcgdG9cbiAqIGVhY2ggaW5wdXQgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgb2YgcHJvamVjdGVkIHZhbHVlcyBmcm9tIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWVzIGZyb20gZWFjaCBpbnB1dCBPYnNlcnZhYmxlLCBvciBhbiBhcnJheSBvZiB0aGUgbW9zdCByZWNlbnQgdmFsdWVzIGZyb21cbiAqIGVhY2ggaW5wdXQgT2JzZXJ2YWJsZS5cbiAqIEBzdGF0aWMgdHJ1ZVxuICogQG5hbWUgY29tYmluZUxhdGVzdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gY29tYmluZUxhdGVzdCgpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBvYnNlcnZhYmxlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHByb2plY3QgPSBudWxsO1xuICAgIHZhciBzY2hlZHVsZXIgPSBudWxsO1xuICAgIGlmIChpc1NjaGVkdWxlcl8xLmlzU2NoZWR1bGVyKG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYnNlcnZhYmxlc1tvYnNlcnZhYmxlcy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9qZWN0ID0gb2JzZXJ2YWJsZXMucG9wKCk7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBmaXJzdCBhbmQgb25seSBvdGhlciBhcmd1bWVudCBiZXNpZGVzIHRoZSByZXN1bHRTZWxlY3RvciBpcyBhbiBhcnJheVxuICAgIC8vIGFzc3VtZSBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYGNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBwcm9qZWN0KWBcbiAgICBpZiAob2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxICYmIGlzQXJyYXlfMS5pc0FycmF5KG9ic2VydmFibGVzWzBdKSkge1xuICAgICAgICBvYnNlcnZhYmxlcyA9IG9ic2VydmFibGVzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5T2JzZXJ2YWJsZV8xLkFycmF5T2JzZXJ2YWJsZShvYnNlcnZhYmxlcywgc2NoZWR1bGVyKS5saWZ0KG5ldyBjb21iaW5lTGF0ZXN0XzEuQ29tYmluZUxhdGVzdE9wZXJhdG9yKHByb2plY3QpKTtcbn1cbmV4cG9ydHMuY29tYmluZUxhdGVzdCA9IGNvbWJpbmVMYXRlc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5lTGF0ZXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvY29tYmluZUxhdGVzdC5qc1xuLy8gbW9kdWxlIGlkID0gMzg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  593. /***/ },
  594. /* 385 */
  595. /***/ function(module, exports, __webpack_require__) {
  596. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = __webpack_require__(39);\nvar isArray_1 = __webpack_require__(12);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar none = {};\n/* tslint:disable:max-line-length */\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * <span class=\"informal\">Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.</span>\n *\n * <img src=\"./img/combineLatest.png\" width=\"100%\">\n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example <caption>Dynamically calculate the Body-Mass Index from an Observable of weight and one for height</caption>\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {Observable} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nfunction combineLatest() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n var project = null;\n if (typeof observables[observables.length - 1] === 'function') {\n project = observables.pop();\n }\n // if the first and only other argument besides the resultSelector is an array\n // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n observables = observables[0];\n }\n observables.unshift(this);\n return this.lift.call(new ArrayObservable_1.ArrayObservable(observables), new CombineLatestOperator(project));\n}\nexports.combineLatest = combineLatest;\nvar CombineLatestOperator = (function () {\n function CombineLatestOperator(project) {\n this.project = project;\n }\n CombineLatestOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));\n };\n return CombineLatestOperator;\n}());\nexports.CombineLatestOperator = CombineLatestOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CombineLatestSubscriber = (function (_super) {\n __extends(CombineLatestSubscriber, _super);\n function CombineLatestSubscriber(destination, project) {\n _super.call(this, destination);\n this.project = project;\n this.active = 0;\n this.values = [];\n this.observables = [];\n }\n CombineLatestSubscriber.prototype._next = function (observable) {\n this.values.push(none);\n this.observables.push(observable);\n };\n CombineLatestSubscriber.prototype._complete = function () {\n var observables = this.observables;\n var len = observables.length;\n if (len === 0) {\n this.destination.complete();\n }\n else {\n this.active = len;\n this.toRespond = len;\n for (var i = 0; i < len; i++) {\n var observable = observables[i];\n this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n }\n }\n };\n CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n if ((this.active -= 1) === 0) {\n this.destination.complete();\n }\n };\n CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var values = this.values;\n var oldVal = values[outerIndex];\n var toRespond = !this.toRespond\n ? 0\n : oldVal === none ? --this.toRespond : this.toRespond;\n values[outerIndex] = innerValue;\n if (toRespond === 0) {\n if (this.project) {\n this._tryProject(values);\n }\n else {\n this.destination.next(values.slice());\n }\n }\n };\n CombineLatestSubscriber.prototype._tryProject = function (values) {\n var result;\n try {\n result = this.project.apply(this, values);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n return CombineLatestSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.CombineLatestSubscriber = CombineLatestSubscriber;\n//# sourceMappingURL=combineLatest.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QuanM/YzA3MSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIEFycmF5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9BcnJheU9ic2VydmFibGUnKTtcbnZhciBpc0FycmF5XzEgPSByZXF1aXJlKCcuLi91dGlsL2lzQXJyYXknKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgbm9uZSA9IHt9O1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIENvbWJpbmVzIG11bHRpcGxlIE9ic2VydmFibGVzIHRvIGNyZWF0ZSBhbiBPYnNlcnZhYmxlIHdob3NlIHZhbHVlcyBhcmVcbiAqIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbGF0ZXN0IHZhbHVlcyBvZiBlYWNoIG9mIGl0cyBpbnB1dCBPYnNlcnZhYmxlcy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+V2hlbmV2ZXIgYW55IGlucHV0IE9ic2VydmFibGUgZW1pdHMgYSB2YWx1ZSwgaXRcbiAqIGNvbXB1dGVzIGEgZm9ybXVsYSB1c2luZyB0aGUgbGF0ZXN0IHZhbHVlcyBmcm9tIGFsbCB0aGUgaW5wdXRzLCB0aGVuIGVtaXRzXG4gKiB0aGUgb3V0cHV0IG9mIHRoYXQgZm9ybXVsYS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9jb21iaW5lTGF0ZXN0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBjb21iaW5lTGF0ZXN0YCBjb21iaW5lcyB0aGUgdmFsdWVzIGZyb20gdGhpcyBPYnNlcnZhYmxlIHdpdGggdmFsdWVzIGZyb21cbiAqIE9ic2VydmFibGVzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoaXMgaXMgZG9uZSBieSBzdWJzY3JpYmluZyB0byBlYWNoXG4gKiBPYnNlcnZhYmxlLCBpbiBvcmRlciwgYW5kIGNvbGxlY3RpbmcgYW4gYXJyYXkgb2YgZWFjaCBvZiB0aGUgbW9zdCByZWNlbnRcbiAqIHZhbHVlcyBhbnkgdGltZSBhbnkgb2YgdGhlIGlucHV0IE9ic2VydmFibGVzIGVtaXRzLCB0aGVuIGVpdGhlciB0YWtpbmcgdGhhdFxuICogYXJyYXkgYW5kIHBhc3NpbmcgaXQgYXMgYXJndW1lbnRzIHRvIGFuIG9wdGlvbmFsIGBwcm9qZWN0YCBmdW5jdGlvbiBhbmRcbiAqIGVtaXR0aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhhdCwgb3IganVzdCBlbWl0dGluZyB0aGUgYXJyYXkgb2YgcmVjZW50XG4gKiB2YWx1ZXMgZGlyZWN0bHkgaWYgdGhlcmUgaXMgbm8gYHByb2plY3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkR5bmFtaWNhbGx5IGNhbGN1bGF0ZSB0aGUgQm9keS1NYXNzIEluZGV4IGZyb20gYW4gT2JzZXJ2YWJsZSBvZiB3ZWlnaHQgYW5kIG9uZSBmb3IgaGVpZ2h0PC9jYXB0aW9uPlxuICogdmFyIHdlaWdodCA9IFJ4Lk9ic2VydmFibGUub2YoNzAsIDcyLCA3NiwgNzksIDc1KTtcbiAqIHZhciBoZWlnaHQgPSBSeC5PYnNlcnZhYmxlLm9mKDEuNzYsIDEuNzcsIDEuNzgpO1xuICogdmFyIGJtaSA9IHdlaWdodC5jb21iaW5lTGF0ZXN0KGhlaWdodCwgKHcsIGgpID0+IHcgLyAoaCAqIGgpKTtcbiAqIGJtaS5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZygnQk1JIGlzICcgKyB4KSk7XG4gKlxuICogLy8gV2l0aCBvdXRwdXQgdG8gY29uc29sZTpcbiAqIC8vIEJNSSBpcyAyNC4yMTIyOTMzODg0Mjk3NTNcbiAqIC8vIEJNSSBpcyAyMy45Mzk0ODA5OTIwNTIwOVxuICogLy8gQk1JIGlzIDIzLjY3MTI1MzYyOTU5MjIyMlxuICpcbiAqIEBzZWUge0BsaW5rIGNvbWJpbmVBbGx9XG4gKiBAc2VlIHtAbGluayBtZXJnZX1cbiAqIEBzZWUge0BsaW5rIHdpdGhMYXRlc3RGcm9tfVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb3RoZXIgQW4gaW5wdXQgT2JzZXJ2YWJsZSB0byBjb21iaW5lIHdpdGggdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gTW9yZSB0aGFuIG9uZSBpbnB1dCBPYnNlcnZhYmxlcyBtYXkgYmUgZ2l2ZW4gYXMgYXJndW1lbnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcHJvamVjdF0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gcHJvamVjdCB0aGUgdmFsdWVzIGZyb21cbiAqIHRoZSBjb21iaW5lZCBsYXRlc3QgdmFsdWVzIGludG8gYSBuZXcgdmFsdWUgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBvZiBwcm9qZWN0ZWQgdmFsdWVzIGZyb20gdGhlIG1vc3QgcmVjZW50XG4gKiB2YWx1ZXMgZnJvbSBlYWNoIGlucHV0IE9ic2VydmFibGUsIG9yIGFuIGFycmF5IG9mIHRoZSBtb3N0IHJlY2VudCB2YWx1ZXMgZnJvbVxuICogZWFjaCBpbnB1dCBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBjb21iaW5lTGF0ZXN0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBjb21iaW5lTGF0ZXN0KCkge1xuICAgIHZhciBvYnNlcnZhYmxlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIG9ic2VydmFibGVzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgcHJvamVjdCA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiBvYnNlcnZhYmxlc1tvYnNlcnZhYmxlcy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9qZWN0ID0gb2JzZXJ2YWJsZXMucG9wKCk7XG4gICAgfVxuICAgIC8vIGlmIHRoZSBmaXJzdCBhbmQgb25seSBvdGhlciBhcmd1bWVudCBiZXNpZGVzIHRoZSByZXN1bHRTZWxlY3RvciBpcyBhbiBhcnJheVxuICAgIC8vIGFzc3VtZSBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYGNvbWJpbmVMYXRlc3QoW29iczEsIG9iczIsIG9iczNdLCBwcm9qZWN0KWBcbiAgICBpZiAob2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxICYmIGlzQXJyYXlfMS5pc0FycmF5KG9ic2VydmFibGVzWzBdKSkge1xuICAgICAgICBvYnNlcnZhYmxlcyA9IG9ic2VydmFibGVzWzBdO1xuICAgIH1cbiAgICBvYnNlcnZhYmxlcy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLmxpZnQuY2FsbChuZXcgQXJyYXlPYnNlcnZhYmxlXzEuQXJyYXlPYnNlcnZhYmxlKG9ic2VydmFibGVzKSwgbmV3IENvbWJpbmVMYXRlc3RPcGVyYXRvcihwcm9qZWN0KSk7XG59XG5leHBvcnRzLmNvbWJpbmVMYXRlc3QgPSBjb21iaW5lTGF0ZXN0O1xudmFyIENvbWJpbmVMYXRlc3RPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tYmluZUxhdGVzdE9wZXJhdG9yKHByb2plY3QpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gICAgQ29tYmluZUxhdGVzdE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQ29tYmluZUxhdGVzdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcm9qZWN0KSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tYmluZUxhdGVzdE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuQ29tYmluZUxhdGVzdE9wZXJhdG9yID0gQ29tYmluZUxhdGVzdE9wZXJhdG9yO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBDb21iaW5lTGF0ZXN0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBwcm9qZWN0KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLm9ic2VydmFibGVzID0gW107XG4gICAgfVxuICAgIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnB1c2gobm9uZSk7XG4gICAgICAgIHRoaXMub2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTtcbiAgICB9O1xuICAgIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvYnNlcnZhYmxlcyA9IHRoaXMub2JzZXJ2YWJsZXM7XG4gICAgICAgIHZhciBsZW4gPSBvYnNlcnZhYmxlcy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gbGVuO1xuICAgICAgICAgICAgdGhpcy50b1Jlc3BvbmQgPSBsZW47XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmFibGUgPSBvYnNlcnZhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIG9ic2VydmFibGUsIG9ic2VydmFibGUsIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29tYmluZUxhdGVzdFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKHVudXNlZCkge1xuICAgICAgICBpZiAoKHRoaXMuYWN0aXZlIC09IDEpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgdmFyIG9sZFZhbCA9IHZhbHVlc1tvdXRlckluZGV4XTtcbiAgICAgICAgdmFyIHRvUmVzcG9uZCA9ICF0aGlzLnRvUmVzcG9uZFxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IG9sZFZhbCA9PT0gbm9uZSA/IC0tdGhpcy50b1Jlc3BvbmQgOiB0aGlzLnRvUmVzcG9uZDtcbiAgICAgICAgdmFsdWVzW291dGVySW5kZXhdID0gaW5uZXJWYWx1ZTtcbiAgICAgICAgaWYgKHRvUmVzcG9uZCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyeVByb2plY3QodmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZXMuc2xpY2UoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5UHJvamVjdCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdC5hcHBseSh0aGlzLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTtcbiAgICB9O1xuICAgIHJldHVybiBDb21iaW5lTGF0ZXN0U3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnRzLkNvbWJpbmVMYXRlc3RTdWJzY3JpYmVyID0gQ29tYmluZUxhdGVzdFN1YnNjcmliZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5lTGF0ZXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QuanNcbi8vIG1vZHVsZSBpZCA9IDM4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  597. /***/ },
  598. /* 386 */
  599. /***/ function(module, exports, __webpack_require__) {
  600. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar concat_1 = __webpack_require__(387);\nObservable_1.Observable.concat = concat_1.concat;\n//# sourceMappingURL=concat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2NvbmNhdC5qcz9mMWJmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBjb25jYXRfMSA9IHJlcXVpcmUoJy4uLy4uL29ic2VydmFibGUvY29uY2F0Jyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5jb25jYXQgPSBjb25jYXRfMS5jb25jYXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvY29uY2F0LmpzXG4vLyBtb2R1bGUgaWQgPSAzODZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  601. /***/ },
  602. /* 387 */
  603. /***/ function(module, exports, __webpack_require__) {
  604. eval("\"use strict\";\nvar concat_1 = __webpack_require__(388);\nexports.concat = concat_1.concatStatic;\n//# sourceMappingURL=concat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvY29uY2F0LmpzP2FjYzUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgY29uY2F0XzEgPSByZXF1aXJlKCcuLi9vcGVyYXRvci9jb25jYXQnKTtcbmV4cG9ydHMuY29uY2F0ID0gY29uY2F0XzEuY29uY2F0U3RhdGljO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2F0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvY29uY2F0LmpzXG4vLyBtb2R1bGUgaWQgPSAzODdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  605. /***/ },
  606. /* 388 */
  607. /***/ function(module, exports, __webpack_require__) {
  608. eval("\"use strict\";\nvar isScheduler_1 = __webpack_require__(42);\nvar ArrayObservable_1 = __webpack_require__(39);\nvar mergeAll_1 = __webpack_require__(59);\n/* tslint:disable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from every\n * given input Observable after the current Observable.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * Joins this Observable with multiple other Observables by subscribing to them\n * one at a time, starting with the source, and merging their results into the\n * output Observable. Will wait for each Observable to complete before moving\n * on to the next.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = timer.concat(sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n * @example <caption>Concatenate 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = timer1.concat(timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {Observable} other An input Observable to concatenate after the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional Scheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @method concat\n * @owner Observable\n */\nfunction concat() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n return this.lift.call(concatStatic.apply(void 0, [this].concat(observables)));\n}\nexports.concat = concat;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from every\n * given input Observable after the current Observable.\n *\n * <span class=\"informal\">Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.</span>\n *\n * <img src=\"./img/concat.png\" width=\"100%\">\n *\n * Joins multiple Observables together by subscribing to them one at a time and\n * merging their results into the output Observable. Will wait for each\n * Observable to complete before moving on to the next.\n *\n * @example <caption>Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10</caption>\n * var timer = Rx.Observable.interval(1000).take(4);\n * var sequence = Rx.Observable.range(1, 10);\n * var result = Rx.Observable.concat(timer, sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n *\n * @example <caption>Concatenate 3 Observables</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var result = Rx.Observable.concat(timer1, timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {Observable} input1 An input Observable to concatenate with others.\n * @param {Observable} input2 An input Observable to concatenate with others.\n * More than one input Observables may be given as argument.\n * @param {Scheduler} [scheduler=null] An optional Scheduler to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @static true\n * @name concat\n * @owner Observable\n */\nfunction concatStatic() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n var scheduler = null;\n var args = observables;\n if (isScheduler_1.isScheduler(args[observables.length - 1])) {\n scheduler = args.pop();\n }\n if (scheduler === null && observables.length === 1) {\n return observables[0];\n }\n return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(1));\n}\nexports.concatStatic = concatStatic;\n//# sourceMappingURL=concat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2NvbmNhdC5qcz9hNTVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIGlzU2NoZWR1bGVyXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzU2NoZWR1bGVyJyk7XG52YXIgQXJyYXlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9vYnNlcnZhYmxlL0FycmF5T2JzZXJ2YWJsZScpO1xudmFyIG1lcmdlQWxsXzEgPSByZXF1aXJlKCcuL21lcmdlQWxsJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogQ3JlYXRlcyBhbiBvdXRwdXQgT2JzZXJ2YWJsZSB3aGljaCBzZXF1ZW50aWFsbHkgZW1pdHMgYWxsIHZhbHVlcyBmcm9tIGV2ZXJ5XG4gKiBnaXZlbiBpbnB1dCBPYnNlcnZhYmxlIGFmdGVyIHRoZSBjdXJyZW50IE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNvbmNhdGVuYXRlcyBtdWx0aXBsZSBPYnNlcnZhYmxlcyB0b2dldGhlciBieVxuICogc2VxdWVudGlhbGx5IGVtaXR0aW5nIHRoZWlyIHZhbHVlcywgb25lIE9ic2VydmFibGUgYWZ0ZXIgdGhlIG90aGVyLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2NvbmNhdC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBKb2lucyB0aGlzIE9ic2VydmFibGUgd2l0aCBtdWx0aXBsZSBvdGhlciBPYnNlcnZhYmxlcyBieSBzdWJzY3JpYmluZyB0byB0aGVtXG4gKiBvbmUgYXQgYSB0aW1lLCBzdGFydGluZyB3aXRoIHRoZSBzb3VyY2UsIGFuZCBtZXJnaW5nIHRoZWlyIHJlc3VsdHMgaW50byB0aGVcbiAqIG91dHB1dCBPYnNlcnZhYmxlLiBXaWxsIHdhaXQgZm9yIGVhY2ggT2JzZXJ2YWJsZSB0byBjb21wbGV0ZSBiZWZvcmUgbW92aW5nXG4gKiBvbiB0byB0aGUgbmV4dC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Db25jYXRlbmF0ZSBhIHRpbWVyIGNvdW50aW5nIGZyb20gMCB0byAzIHdpdGggYSBzeW5jaHJvbm91cyBzZXF1ZW5jZSBmcm9tIDEgdG8gMTA8L2NhcHRpb24+XG4gKiB2YXIgdGltZXIgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApLnRha2UoNCk7XG4gKiB2YXIgc2VxdWVuY2UgPSBSeC5PYnNlcnZhYmxlLnJhbmdlKDEsIDEwKTtcbiAqIHZhciByZXN1bHQgPSB0aW1lci5jb25jYXQoc2VxdWVuY2UpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiAvLyByZXN1bHRzIGluOlxuICogLy8gMTAwMG1zLT4gMCAtMTAwMG1zLT4gMSAtMTAwMG1zLT4gMiAtMTAwMG1zLT4gMyAtaW1tZWRpYXRlLT4gMSAuLi4gMTBcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Db25jYXRlbmF0ZSAzIE9ic2VydmFibGVzPC9jYXB0aW9uPlxuICogdmFyIHRpbWVyMSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCkudGFrZSgxMCk7XG4gKiB2YXIgdGltZXIyID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgyMDAwKS50YWtlKDYpO1xuICogdmFyIHRpbWVyMyA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoNTAwKS50YWtlKDEwKTtcbiAqIHZhciByZXN1bHQgPSB0aW1lcjEuY29uY2F0KHRpbWVyMiwgdGltZXIzKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gKFByaW50cyB0byBjb25zb2xlIHNlcXVlbnRpYWxseSlcbiAqIC8vIC0xMDAwbXMtPiAwIC0xMDAwbXMtPiAxIC0xMDAwbXMtPiAuLi4gOVxuICogLy8gLTIwMDBtcy0+IDAgLTIwMDBtcy0+IDEgLTIwMDBtcy0+IC4uLiA1XG4gKiAvLyAtNTAwbXMtPiAwIC01MDBtcy0+IDEgLTUwMG1zLT4gLi4uIDlcbiAqXG4gKiBAc2VlIHtAbGluayBjb25jYXRBbGx9XG4gKiBAc2VlIHtAbGluayBjb25jYXRNYXB9XG4gKiBAc2VlIHtAbGluayBjb25jYXRNYXBUb31cbiAqXG4gKiBAcGFyYW0ge09ic2VydmFibGV9IG90aGVyIEFuIGlucHV0IE9ic2VydmFibGUgdG8gY29uY2F0ZW5hdGUgYWZ0ZXIgdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gTW9yZSB0aGFuIG9uZSBpbnB1dCBPYnNlcnZhYmxlcyBtYXkgYmUgZ2l2ZW4gYXMgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1udWxsXSBBbiBvcHRpb25hbCBTY2hlZHVsZXIgdG8gc2NoZWR1bGUgZWFjaFxuICogT2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gb24uXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbGwgdmFsdWVzIG9mIGVhY2ggcGFzc2VkIE9ic2VydmFibGUgbWVyZ2VkIGludG8gYVxuICogc2luZ2xlIE9ic2VydmFibGUsIGluIG9yZGVyLCBpbiBzZXJpYWwgZmFzaGlvbi5cbiAqIEBtZXRob2QgY29uY2F0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBjb25jYXQoKSB7XG4gICAgdmFyIG9ic2VydmFibGVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgb2JzZXJ2YWJsZXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQuY2FsbChjb25jYXRTdGF0aWMuYXBwbHkodm9pZCAwLCBbdGhpc10uY29uY2F0KG9ic2VydmFibGVzKSkpO1xufVxuZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7XG4vKiB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIG91dHB1dCBPYnNlcnZhYmxlIHdoaWNoIHNlcXVlbnRpYWxseSBlbWl0cyBhbGwgdmFsdWVzIGZyb20gZXZlcnlcbiAqIGdpdmVuIGlucHV0IE9ic2VydmFibGUgYWZ0ZXIgdGhlIGN1cnJlbnQgT2JzZXJ2YWJsZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+Q29uY2F0ZW5hdGVzIG11bHRpcGxlIE9ic2VydmFibGVzIHRvZ2V0aGVyIGJ5XG4gKiBzZXF1ZW50aWFsbHkgZW1pdHRpbmcgdGhlaXIgdmFsdWVzLCBvbmUgT2JzZXJ2YWJsZSBhZnRlciB0aGUgb3RoZXIuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvY29uY2F0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEpvaW5zIG11bHRpcGxlIE9ic2VydmFibGVzIHRvZ2V0aGVyIGJ5IHN1YnNjcmliaW5nIHRvIHRoZW0gb25lIGF0IGEgdGltZSBhbmRcbiAqIG1lcmdpbmcgdGhlaXIgcmVzdWx0cyBpbnRvIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS4gV2lsbCB3YWl0IGZvciBlYWNoXG4gKiBPYnNlcnZhYmxlIHRvIGNvbXBsZXRlIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Q29uY2F0ZW5hdGUgYSB0aW1lciBjb3VudGluZyBmcm9tIDAgdG8gMyB3aXRoIGEgc3luY2hyb25vdXMgc2VxdWVuY2UgZnJvbSAxIHRvIDEwPC9jYXB0aW9uPlxuICogdmFyIHRpbWVyID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKS50YWtlKDQpO1xuICogdmFyIHNlcXVlbmNlID0gUnguT2JzZXJ2YWJsZS5yYW5nZSgxLCAxMCk7XG4gKiB2YXIgcmVzdWx0ID0gUnguT2JzZXJ2YWJsZS5jb25jYXQodGltZXIsIHNlcXVlbmNlKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gcmVzdWx0cyBpbjpcbiAqIC8vIDAgLTEwMDBtcy0+IDEgLTEwMDBtcy0+IDIgLTEwMDBtcy0+IDMgLWltbWVkaWF0ZS0+IDEgLi4uIDEwXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Q29uY2F0ZW5hdGUgMyBPYnNlcnZhYmxlczwvY2FwdGlvbj5cbiAqIHZhciB0aW1lcjEgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApLnRha2UoMTApO1xuICogdmFyIHRpbWVyMiA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMjAwMCkudGFrZSg2KTtcbiAqIHZhciB0aW1lcjMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDUwMCkudGFrZSgxMCk7XG4gKiB2YXIgcmVzdWx0ID0gUnguT2JzZXJ2YWJsZS5jb25jYXQodGltZXIxLCB0aW1lcjIsIHRpbWVyMyk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIC8vIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZzpcbiAqIC8vIChQcmludHMgdG8gY29uc29sZSBzZXF1ZW50aWFsbHkpXG4gKiAvLyAtMTAwMG1zLT4gMCAtMTAwMG1zLT4gMSAtMTAwMG1zLT4gLi4uIDlcbiAqIC8vIC0yMDAwbXMtPiAwIC0yMDAwbXMtPiAxIC0yMDAwbXMtPiAuLi4gNVxuICogLy8gLTUwMG1zLT4gMCAtNTAwbXMtPiAxIC01MDBtcy0+IC4uLiA5XG4gKlxuICogQHNlZSB7QGxpbmsgY29uY2F0QWxsfVxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwfVxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwVG99XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSBpbnB1dDEgQW4gaW5wdXQgT2JzZXJ2YWJsZSB0byBjb25jYXRlbmF0ZSB3aXRoIG90aGVycy5cbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gaW5wdXQyIEFuIGlucHV0IE9ic2VydmFibGUgdG8gY29uY2F0ZW5hdGUgd2l0aCBvdGhlcnMuXG4gKiBNb3JlIHRoYW4gb25lIGlucHV0IE9ic2VydmFibGVzIG1heSBiZSBnaXZlbiBhcyBhcmd1bWVudC5cbiAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyPW51bGxdIEFuIG9wdGlvbmFsIFNjaGVkdWxlciB0byBzY2hlZHVsZSBlYWNoXG4gKiBPYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBvbi5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFsbCB2YWx1ZXMgb2YgZWFjaCBwYXNzZWQgT2JzZXJ2YWJsZSBtZXJnZWQgaW50byBhXG4gKiBzaW5nbGUgT2JzZXJ2YWJsZSwgaW4gb3JkZXIsIGluIHNlcmlhbCBmYXNoaW9uLlxuICogQHN0YXRpYyB0cnVlXG4gKiBAbmFtZSBjb25jYXRcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdFN0YXRpYygpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBvYnNlcnZhYmxlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHNjaGVkdWxlciA9IG51bGw7XG4gICAgdmFyIGFyZ3MgPSBvYnNlcnZhYmxlcztcbiAgICBpZiAoaXNTY2hlZHVsZXJfMS5pc1NjaGVkdWxlcihhcmdzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICBzY2hlZHVsZXIgPSBhcmdzLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoc2NoZWR1bGVyID09PSBudWxsICYmIG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZXNbMF07XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXJyYXlPYnNlcnZhYmxlXzEuQXJyYXlPYnNlcnZhYmxlKG9ic2VydmFibGVzLCBzY2hlZHVsZXIpLmxpZnQobmV3IG1lcmdlQWxsXzEuTWVyZ2VBbGxPcGVyYXRvcigxKSk7XG59XG5leHBvcnRzLmNvbmNhdFN0YXRpYyA9IGNvbmNhdFN0YXRpYztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmNhdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9jb25jYXQuanNcbi8vIG1vZHVsZSBpZCA9IDM4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  609. /***/ },
  610. /* 389 */
  611. /***/ function(module, exports, __webpack_require__) {
  612. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar defer_1 = __webpack_require__(390);\nObservable_1.Observable.defer = defer_1.defer;\n//# sourceMappingURL=defer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2RlZmVyLmpzP2Y2OTYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGRlZmVyXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2RlZmVyJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5kZWZlciA9IGRlZmVyXzEuZGVmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9kZWZlci5qc1xuLy8gbW9kdWxlIGlkID0gMzg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  613. /***/ },
  614. /* 390 */
  615. /***/ function(module, exports, __webpack_require__) {
  616. eval("\"use strict\";\nvar DeferObservable_1 = __webpack_require__(391);\nexports.defer = DeferObservable_1.DeferObservable.create;\n//# sourceMappingURL=defer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZGVmZXIuanM/NGNmMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBEZWZlck9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRGVmZXJPYnNlcnZhYmxlJyk7XG5leHBvcnRzLmRlZmVyID0gRGVmZXJPYnNlcnZhYmxlXzEuRGVmZXJPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvZGVmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDM5MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  617. /***/ },
  618. /* 391 */
  619. /***/ function(module, exports, __webpack_require__) {
  620. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar DeferObservable = (function (_super) {\n __extends(DeferObservable, _super);\n function DeferObservable(observableFactory) {\n _super.call(this);\n this.observableFactory = observableFactory;\n }\n /**\n * Creates an Observable that, on subscribe, calls an Observable factory to\n * make an Observable for each new Observer.\n *\n * <span class=\"informal\">Creates the Observable lazily, that is, only when it\n * is subscribed.\n * </span>\n *\n * <img src=\"./img/defer.png\" width=\"100%\">\n *\n * `defer` allows you to create the Observable only when the Observer\n * subscribes, and create a fresh Observable for each Observer. It waits until\n * an Observer subscribes to it, and then it generates an Observable,\n * typically with an Observable factory function. It does this afresh for each\n * subscriber, so although each subscriber may think it is subscribing to the\n * same Observable, in fact each subscriber gets its own individual\n * Observable.\n *\n * @example <caption>Subscribe to either an Observable of clicks or an Observable of interval, at random</caption>\n * var clicksOrInterval = Rx.Observable.defer(function () {\n * if (Math.random() > 0.5) {\n * return Rx.Observable.fromEvent(document, 'click');\n * } else {\n * return Rx.Observable.interval(1000);\n * }\n * });\n * clicksOrInterval.subscribe(x => console.log(x));\n *\n * // Results in the following behavior:\n * // If the result of Math.random() is greater than 0.5 it will listen\n * // for clicks anywhere on the \"document\"; when document is clicked it\n * // will log a MouseEvent object to the console. If the result is less\n * // than 0.5 it will emit ascending numbers, one every second(1000ms).\n *\n * @see {@link create}\n *\n * @param {function(): Observable|Promise} observableFactory The Observable\n * factory function to invoke for each Observer that subscribes to the output\n * Observable. May also return a Promise, which will be converted on the fly\n * to an Observable.\n * @return {Observable} An Observable whose Observers' subscriptions trigger\n * an invocation of the given Observable factory function.\n * @static true\n * @name defer\n * @owner Observable\n */\n DeferObservable.create = function (observableFactory) {\n return new DeferObservable(observableFactory);\n };\n DeferObservable.prototype._subscribe = function (subscriber) {\n return new DeferSubscriber(subscriber, this.observableFactory);\n };\n return DeferObservable;\n}(Observable_1.Observable));\nexports.DeferObservable = DeferObservable;\nvar DeferSubscriber = (function (_super) {\n __extends(DeferSubscriber, _super);\n function DeferSubscriber(destination, factory) {\n _super.call(this, destination);\n this.factory = factory;\n this.tryDefer();\n }\n DeferSubscriber.prototype.tryDefer = function () {\n try {\n this._callFactory();\n }\n catch (err) {\n this._error(err);\n }\n };\n DeferSubscriber.prototype._callFactory = function () {\n var result = this.factory();\n if (result) {\n this.add(subscribeToResult_1.subscribeToResult(this, result));\n }\n };\n return DeferSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=DeferObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvRGVmZXJPYnNlcnZhYmxlLmpzP2M2OWUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBEZWZlck9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWZlck9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVmZXJPYnNlcnZhYmxlKG9ic2VydmFibGVGYWN0b3J5KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLm9ic2VydmFibGVGYWN0b3J5ID0gb2JzZXJ2YWJsZUZhY3Rvcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gT2JzZXJ2YWJsZSB0aGF0LCBvbiBzdWJzY3JpYmUsIGNhbGxzIGFuIE9ic2VydmFibGUgZmFjdG9yeSB0b1xuICAgICAqIG1ha2UgYW4gT2JzZXJ2YWJsZSBmb3IgZWFjaCBuZXcgT2JzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+Q3JlYXRlcyB0aGUgT2JzZXJ2YWJsZSBsYXppbHksIHRoYXQgaXMsIG9ubHkgd2hlbiBpdFxuICAgICAqIGlzIHN1YnNjcmliZWQuXG4gICAgICogPC9zcGFuPlxuICAgICAqXG4gICAgICogPGltZyBzcmM9XCIuL2ltZy9kZWZlci5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgKlxuICAgICAqIGBkZWZlcmAgYWxsb3dzIHlvdSB0byBjcmVhdGUgdGhlIE9ic2VydmFibGUgb25seSB3aGVuIHRoZSBPYnNlcnZlclxuICAgICAqIHN1YnNjcmliZXMsIGFuZCBjcmVhdGUgYSBmcmVzaCBPYnNlcnZhYmxlIGZvciBlYWNoIE9ic2VydmVyLiBJdCB3YWl0cyB1bnRpbFxuICAgICAqIGFuIE9ic2VydmVyIHN1YnNjcmliZXMgdG8gaXQsIGFuZCB0aGVuIGl0IGdlbmVyYXRlcyBhbiBPYnNlcnZhYmxlLFxuICAgICAqIHR5cGljYWxseSB3aXRoIGFuIE9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbi4gSXQgZG9lcyB0aGlzIGFmcmVzaCBmb3IgZWFjaFxuICAgICAqIHN1YnNjcmliZXIsIHNvIGFsdGhvdWdoIGVhY2ggc3Vic2NyaWJlciBtYXkgdGhpbmsgaXQgaXMgc3Vic2NyaWJpbmcgdG8gdGhlXG4gICAgICogc2FtZSBPYnNlcnZhYmxlLCBpbiBmYWN0IGVhY2ggc3Vic2NyaWJlciBnZXRzIGl0cyBvd24gaW5kaXZpZHVhbFxuICAgICAqIE9ic2VydmFibGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5TdWJzY3JpYmUgdG8gZWl0aGVyIGFuIE9ic2VydmFibGUgb2YgY2xpY2tzIG9yIGFuIE9ic2VydmFibGUgb2YgaW50ZXJ2YWwsIGF0IHJhbmRvbTwvY2FwdGlvbj5cbiAgICAgKiB2YXIgY2xpY2tzT3JJbnRlcnZhbCA9IFJ4Lk9ic2VydmFibGUuZGVmZXIoZnVuY3Rpb24gKCkge1xuICAgICAqICAgaWYgKE1hdGgucmFuZG9tKCkgPiAwLjUpIHtcbiAgICAgKiAgICAgcmV0dXJuIFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAgICAgKiAgIH0gZWxzZSB7XG4gICAgICogICAgIHJldHVybiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqIGNsaWNrc09ySW50ZXJ2YWwuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOlxuICAgICAqIC8vIElmIHRoZSByZXN1bHQgb2YgTWF0aC5yYW5kb20oKSBpcyBncmVhdGVyIHRoYW4gMC41IGl0IHdpbGwgbGlzdGVuXG4gICAgICogLy8gZm9yIGNsaWNrcyBhbnl3aGVyZSBvbiB0aGUgXCJkb2N1bWVudFwiOyB3aGVuIGRvY3VtZW50IGlzIGNsaWNrZWQgaXRcbiAgICAgKiAvLyB3aWxsIGxvZyBhIE1vdXNlRXZlbnQgb2JqZWN0IHRvIHRoZSBjb25zb2xlLiBJZiB0aGUgcmVzdWx0IGlzIGxlc3NcbiAgICAgKiAvLyB0aGFuIDAuNSBpdCB3aWxsIGVtaXQgYXNjZW5kaW5nIG51bWJlcnMsIG9uZSBldmVyeSBzZWNvbmQoMTAwMG1zKS5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGNyZWF0ZX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogT2JzZXJ2YWJsZXxQcm9taXNlfSBvYnNlcnZhYmxlRmFjdG9yeSBUaGUgT2JzZXJ2YWJsZVxuICAgICAqIGZhY3RvcnkgZnVuY3Rpb24gdG8gaW52b2tlIGZvciBlYWNoIE9ic2VydmVyIHRoYXQgc3Vic2NyaWJlcyB0byB0aGUgb3V0cHV0XG4gICAgICogT2JzZXJ2YWJsZS4gTWF5IGFsc28gcmV0dXJuIGEgUHJvbWlzZSwgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgb24gdGhlIGZseVxuICAgICAqIHRvIGFuIE9ic2VydmFibGUuXG4gICAgICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB3aG9zZSBPYnNlcnZlcnMnIHN1YnNjcmlwdGlvbnMgdHJpZ2dlclxuICAgICAqIGFuIGludm9jYXRpb24gb2YgdGhlIGdpdmVuIE9ic2VydmFibGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICAgKiBAc3RhdGljIHRydWVcbiAgICAgKiBAbmFtZSBkZWZlclxuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgRGVmZXJPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlRmFjdG9yeSkge1xuICAgICAgICByZXR1cm4gbmV3IERlZmVyT2JzZXJ2YWJsZShvYnNlcnZhYmxlRmFjdG9yeSk7XG4gICAgfTtcbiAgICBEZWZlck9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmVyU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm9ic2VydmFibGVGYWN0b3J5KTtcbiAgICB9O1xuICAgIHJldHVybiBEZWZlck9ic2VydmFibGU7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLkRlZmVyT2JzZXJ2YWJsZSA9IERlZmVyT2JzZXJ2YWJsZTtcbnZhciBEZWZlclN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWZlclN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVmZXJTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBmYWN0b3J5KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgdGhpcy50cnlEZWZlcigpO1xuICAgIH1cbiAgICBEZWZlclN1YnNjcmliZXIucHJvdG90eXBlLnRyeURlZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbEZhY3RvcnkoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZlclN1YnNjcmliZXIucHJvdG90eXBlLl9jYWxsRmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZmFjdG9yeSgpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJTdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZmVyT2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL0RlZmVyT2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gMzkxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  621. /***/ },
  622. /* 392 */
  623. /***/ function(module, exports, __webpack_require__) {
  624. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar empty_1 = __webpack_require__(393);\nObservable_1.Observable.empty = empty_1.empty;\n//# sourceMappingURL=empty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2VtcHR5LmpzPzY4OTIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGVtcHR5XzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2VtcHR5Jyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5lbXB0eSA9IGVtcHR5XzEuZW1wdHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbXB0eS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9lbXB0eS5qc1xuLy8gbW9kdWxlIGlkID0gMzkyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  625. /***/ },
  626. /* 393 */
  627. /***/ function(module, exports, __webpack_require__) {
  628. eval("\"use strict\";\nvar EmptyObservable_1 = __webpack_require__(41);\nexports.empty = EmptyObservable_1.EmptyObservable.create;\n//# sourceMappingURL=empty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZW1wdHkuanM/ZjcyMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBFbXB0eU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRW1wdHlPYnNlcnZhYmxlJyk7XG5leHBvcnRzLmVtcHR5ID0gRW1wdHlPYnNlcnZhYmxlXzEuRW1wdHlPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVtcHR5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvZW1wdHkuanNcbi8vIG1vZHVsZSBpZCA9IDM5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  629. /***/ },
  630. /* 394 */
  631. /***/ function(module, exports, __webpack_require__) {
  632. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar forkJoin_1 = __webpack_require__(395);\nObservable_1.Observable.forkJoin = forkJoin_1.forkJoin;\n//# sourceMappingURL=forkJoin.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2ZvcmtKb2luLmpzPzA3OTciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGZvcmtKb2luXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2ZvcmtKb2luJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5mb3JrSm9pbiA9IGZvcmtKb2luXzEuZm9ya0pvaW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JrSm9pbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9mb3JrSm9pbi5qc1xuLy8gbW9kdWxlIGlkID0gMzk0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  633. /***/ },
  634. /* 395 */
  635. /***/ function(module, exports, __webpack_require__) {
  636. eval("\"use strict\";\nvar ForkJoinObservable_1 = __webpack_require__(396);\nexports.forkJoin = ForkJoinObservable_1.ForkJoinObservable.create;\n//# sourceMappingURL=forkJoin.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZm9ya0pvaW4uanM/Y2Q2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBGb3JrSm9pbk9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRm9ya0pvaW5PYnNlcnZhYmxlJyk7XG5leHBvcnRzLmZvcmtKb2luID0gRm9ya0pvaW5PYnNlcnZhYmxlXzEuRm9ya0pvaW5PYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcmtKb2luLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvZm9ya0pvaW4uanNcbi8vIG1vZHVsZSBpZCA9IDM5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  637. /***/ },
  638. /* 396 */
  639. /***/ function(module, exports, __webpack_require__) {
  640. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar EmptyObservable_1 = __webpack_require__(41);\nvar isArray_1 = __webpack_require__(12);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ForkJoinObservable = (function (_super) {\n __extends(ForkJoinObservable, _super);\n function ForkJoinObservable(sources, resultSelector) {\n _super.call(this);\n this.sources = sources;\n this.resultSelector = resultSelector;\n }\n /* tslint:enable:max-line-length */\n /**\n * @param sources\n * @return {any}\n * @static true\n * @name forkJoin\n * @owner Observable\n */\n ForkJoinObservable.create = function () {\n var sources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i - 0] = arguments[_i];\n }\n if (sources === null || arguments.length === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n var resultSelector = null;\n if (typeof sources[sources.length - 1] === 'function') {\n resultSelector = sources.pop();\n }\n // if the first and only other argument besides the resultSelector is an array\n // assume it's been called with `forkJoin([obs1, obs2, obs3], resultSelector)`\n if (sources.length === 1 && isArray_1.isArray(sources[0])) {\n sources = sources[0];\n }\n if (sources.length === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n return new ForkJoinObservable(sources, resultSelector);\n };\n ForkJoinObservable.prototype._subscribe = function (subscriber) {\n return new ForkJoinSubscriber(subscriber, this.sources, this.resultSelector);\n };\n return ForkJoinObservable;\n}(Observable_1.Observable));\nexports.ForkJoinObservable = ForkJoinObservable;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ForkJoinSubscriber = (function (_super) {\n __extends(ForkJoinSubscriber, _super);\n function ForkJoinSubscriber(destination, sources, resultSelector) {\n _super.call(this, destination);\n this.sources = sources;\n this.resultSelector = resultSelector;\n this.completed = 0;\n this.haveValues = 0;\n var len = sources.length;\n this.total = len;\n this.values = new Array(len);\n for (var i = 0; i < len; i++) {\n var source = sources[i];\n var innerSubscription = subscribeToResult_1.subscribeToResult(this, source, null, i);\n if (innerSubscription) {\n innerSubscription.outerIndex = i;\n this.add(innerSubscription);\n }\n }\n }\n ForkJoinSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.values[outerIndex] = innerValue;\n if (!innerSub._hasValue) {\n innerSub._hasValue = true;\n this.haveValues++;\n }\n };\n ForkJoinSubscriber.prototype.notifyComplete = function (innerSub) {\n var destination = this.destination;\n var _a = this, haveValues = _a.haveValues, resultSelector = _a.resultSelector, values = _a.values;\n var len = values.length;\n if (!innerSub._hasValue) {\n destination.complete();\n return;\n }\n this.completed++;\n if (this.completed !== len) {\n return;\n }\n if (haveValues === len) {\n var value = resultSelector ? resultSelector.apply(this, values) : values;\n destination.next(value);\n }\n destination.complete();\n };\n return ForkJoinSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=ForkJoinObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvRm9ya0pvaW5PYnNlcnZhYmxlLmpzP2QzODIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgRW1wdHlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0VtcHR5T2JzZXJ2YWJsZScpO1xudmFyIGlzQXJyYXlfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNBcnJheScpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgRm9ya0pvaW5PYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ya0pvaW5PYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcmtKb2luT2JzZXJ2YWJsZShzb3VyY2VzLCByZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgIH1cbiAgICAvKiB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzb3VyY2VzXG4gICAgICogQHJldHVybiB7YW55fVxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIGZvcmtKb2luXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBGb3JrSm9pbk9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc291cmNlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlcyA9PT0gbnVsbCB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5T2JzZXJ2YWJsZV8xLkVtcHR5T2JzZXJ2YWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHRTZWxlY3RvciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlc1tzb3VyY2VzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXN1bHRTZWxlY3RvciA9IHNvdXJjZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IGFuZCBvbmx5IG90aGVyIGFyZ3VtZW50IGJlc2lkZXMgdGhlIHJlc3VsdFNlbGVjdG9yIGlzIGFuIGFycmF5XG4gICAgICAgIC8vIGFzc3VtZSBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYGZvcmtKb2luKFtvYnMxLCBvYnMyLCBvYnMzXSwgcmVzdWx0U2VsZWN0b3IpYFxuICAgICAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheV8xLmlzQXJyYXkoc291cmNlc1swXSkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eU9ic2VydmFibGVfMS5FbXB0eU9ic2VydmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZvcmtKb2luT2JzZXJ2YWJsZShzb3VyY2VzLCByZXN1bHRTZWxlY3Rvcik7XG4gICAgfTtcbiAgICBGb3JrSm9pbk9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmtKb2luU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNvdXJjZXMsIHRoaXMucmVzdWx0U2VsZWN0b3IpO1xuICAgIH07XG4gICAgcmV0dXJuIEZvcmtKb2luT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuRm9ya0pvaW5PYnNlcnZhYmxlID0gRm9ya0pvaW5PYnNlcnZhYmxlO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBGb3JrSm9pblN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb3JrSm9pblN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9ya0pvaW5TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBzb3VyY2VzLCByZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSAwO1xuICAgICAgICB0aGlzLmhhdmVWYWx1ZXMgPSAwO1xuICAgICAgICB2YXIgbGVuID0gc291cmNlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudG90YWwgPSBsZW47XG4gICAgICAgIHRoaXMudmFsdWVzID0gbmV3IEFycmF5KGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2ldO1xuICAgICAgICAgICAgdmFyIGlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBzb3VyY2UsIG51bGwsIGkpO1xuICAgICAgICAgICAgaWYgKGlubmVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJTdWJzY3JpcHRpb24ub3V0ZXJJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoaW5uZXJTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIEZvcmtKb2luU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLnZhbHVlc1tvdXRlckluZGV4XSA9IGlubmVyVmFsdWU7XG4gICAgICAgIGlmICghaW5uZXJTdWIuX2hhc1ZhbHVlKSB7XG4gICAgICAgICAgICBpbm5lclN1Yi5faGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5oYXZlVmFsdWVzKys7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZvcmtKb2luU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgaGF2ZVZhbHVlcyA9IF9hLmhhdmVWYWx1ZXMsIHJlc3VsdFNlbGVjdG9yID0gX2EucmVzdWx0U2VsZWN0b3IsIHZhbHVlcyA9IF9hLnZhbHVlcztcbiAgICAgICAgdmFyIGxlbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICAgIGlmICghaW5uZXJTdWIuX2hhc1ZhbHVlKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGxldGVkKys7XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCAhPT0gbGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhdmVWYWx1ZXMgPT09IGxlbikge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0U2VsZWN0b3IgPyByZXN1bHRTZWxlY3Rvci5hcHBseSh0aGlzLCB2YWx1ZXMpIDogdmFsdWVzO1xuICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIHJldHVybiBGb3JrSm9pblN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9ya0pvaW5PYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvRm9ya0pvaW5PYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAzOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  641. /***/ },
  642. /* 397 */
  643. /***/ function(module, exports, __webpack_require__) {
  644. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar from_1 = __webpack_require__(34);\nObservable_1.Observable.from = from_1.from;\n//# sourceMappingURL=from.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb20uanM/OTg1YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZnJvbV8xID0gcmVxdWlyZSgnLi4vLi4vb2JzZXJ2YWJsZS9mcm9tJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5mcm9tID0gZnJvbV8xLmZyb207XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb20uanNcbi8vIG1vZHVsZSBpZCA9IDM5N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  645. /***/ },
  646. /* 398 */
  647. /***/ function(module, exports, __webpack_require__) {
  648. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar fromEvent_1 = __webpack_require__(399);\nObservable_1.Observable.fromEvent = fromEvent_1.fromEvent;\n//# sourceMappingURL=fromEvent.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb21FdmVudC5qcz9iM2Y5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBmcm9tRXZlbnRfMSA9IHJlcXVpcmUoJy4uLy4uL29ic2VydmFibGUvZnJvbUV2ZW50Jyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5mcm9tRXZlbnQgPSBmcm9tRXZlbnRfMS5mcm9tRXZlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tRXZlbnQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvZnJvbUV2ZW50LmpzXG4vLyBtb2R1bGUgaWQgPSAzOThcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  649. /***/ },
  650. /* 399 */
  651. /***/ function(module, exports, __webpack_require__) {
  652. eval("\"use strict\";\nvar FromEventObservable_1 = __webpack_require__(400);\nexports.fromEvent = FromEventObservable_1.FromEventObservable.create;\n//# sourceMappingURL=fromEvent.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZnJvbUV2ZW50LmpzPzM4OTUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgRnJvbUV2ZW50T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9Gcm9tRXZlbnRPYnNlcnZhYmxlJyk7XG5leHBvcnRzLmZyb21FdmVudCA9IEZyb21FdmVudE9ic2VydmFibGVfMS5Gcm9tRXZlbnRPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21FdmVudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2Zyb21FdmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMzk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  653. /***/ },
  654. /* 400 */
  655. /***/ function(module, exports, __webpack_require__) {
  656. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar tryCatch_1 = __webpack_require__(14);\nvar isFunction_1 = __webpack_require__(10);\nvar errorObject_1 = __webpack_require__(15);\nvar Subscription_1 = __webpack_require__(11);\nvar toString = Object.prototype.toString;\nfunction isNodeStyleEventEmmitter(sourceObj) {\n return !!sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\nfunction isJQueryStyleEventEmitter(sourceObj) {\n return !!sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\nfunction isNodeList(sourceObj) {\n return !!sourceObj && toString.call(sourceObj) === '[object NodeList]';\n}\nfunction isHTMLCollection(sourceObj) {\n return !!sourceObj && toString.call(sourceObj) === '[object HTMLCollection]';\n}\nfunction isEventTarget(sourceObj) {\n return !!sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromEventObservable = (function (_super) {\n __extends(FromEventObservable, _super);\n function FromEventObservable(sourceObj, eventName, selector, options) {\n _super.call(this);\n this.sourceObj = sourceObj;\n this.eventName = eventName;\n this.selector = selector;\n this.options = options;\n }\n /* tslint:enable:max-line-length */\n /**\n * Creates an Observable that emits events of a specific type coming from the\n * given event target.\n *\n * <span class=\"informal\">Creates an Observable from DOM events, or Node\n * EventEmitter events or others.</span>\n *\n * <img src=\"./img/fromEvent.png\" width=\"100%\">\n *\n * Creates an Observable by attaching an event listener to an \"event target\",\n * which may be an object with `addEventListener` and `removeEventListener`,\n * a Node.js EventEmitter, a jQuery style EventEmitter, a NodeList from the\n * DOM, or an HTMLCollection from the DOM. The event handler is attached when\n * the output Observable is subscribed, and removed when the Subscription is\n * unsubscribed.\n *\n * @example <caption>Emits clicks happening on the DOM document</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * clicks.subscribe(x => console.log(x));\n *\n * // Results in:\n * // MouseEvent object logged to console everytime a click\n * // occurs on the document.\n *\n * @see {@link from}\n * @see {@link fromEventPattern}\n *\n * @param {EventTargetLike} target The DOMElement, event target, Node.js\n * EventEmitter, NodeList or HTMLCollection to attach the event handler to.\n * @param {string} eventName The event name of interest, being emitted by the\n * `target`.\n * @param {EventListenerOptions} [options] Options to pass through to addEventListener\n * @param {SelectorMethodSignature<T>} [selector] An optional function to\n * post-process results. It takes the arguments from the event handler and\n * should return a single value.\n * @return {Observable<T>}\n * @static true\n * @name fromEvent\n * @owner Observable\n */\n FromEventObservable.create = function (target, eventName, options, selector) {\n if (isFunction_1.isFunction(options)) {\n selector = options;\n options = undefined;\n }\n return new FromEventObservable(target, eventName, selector, options);\n };\n FromEventObservable.setupSubscription = function (sourceObj, eventName, handler, subscriber, options) {\n var unsubscribe;\n if (isNodeList(sourceObj) || isHTMLCollection(sourceObj)) {\n for (var i = 0, len = sourceObj.length; i < len; i++) {\n FromEventObservable.setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n }\n }\n else if (isEventTarget(sourceObj)) {\n var source_1 = sourceObj;\n sourceObj.addEventListener(eventName, handler, options);\n unsubscribe = function () { return source_1.removeEventListener(eventName, handler); };\n }\n else if (isJQueryStyleEventEmitter(sourceObj)) {\n var source_2 = sourceObj;\n sourceObj.on(eventName, handler);\n unsubscribe = function () { return source_2.off(eventName, handler); };\n }\n else if (isNodeStyleEventEmmitter(sourceObj)) {\n var source_3 = sourceObj;\n sourceObj.addListener(eventName, handler);\n unsubscribe = function () { return source_3.removeListener(eventName, handler); };\n }\n else {\n throw new TypeError('Invalid event target');\n }\n subscriber.add(new Subscription_1.Subscription(unsubscribe));\n };\n FromEventObservable.prototype._subscribe = function (subscriber) {\n var sourceObj = this.sourceObj;\n var eventName = this.eventName;\n var options = this.options;\n var selector = this.selector;\n var handler = selector ? function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n var result = tryCatch_1.tryCatch(selector).apply(void 0, args);\n if (result === errorObject_1.errorObject) {\n subscriber.error(errorObject_1.errorObject.e);\n }\n else {\n subscriber.next(result);\n }\n } : function (e) { return subscriber.next(e); };\n FromEventObservable.setupSubscription(sourceObj, eventName, handler, subscriber, options);\n };\n return FromEventObservable;\n}(Observable_1.Observable));\nexports.FromEventObservable = FromEventObservable;\n//# sourceMappingURL=FromEventObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvRnJvbUV2ZW50T2JzZXJ2YWJsZS5qcz81NDgxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRyeUNhdGNoXzEgPSByZXF1aXJlKCcuLi91dGlsL3RyeUNhdGNoJyk7XG52YXIgaXNGdW5jdGlvbl8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc0Z1bmN0aW9uJyk7XG52YXIgZXJyb3JPYmplY3RfMSA9IHJlcXVpcmUoJy4uL3V0aWwvZXJyb3JPYmplY3QnKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmZ1bmN0aW9uIGlzTm9kZVN0eWxlRXZlbnRFbW1pdHRlcihzb3VyY2VPYmopIHtcbiAgICByZXR1cm4gISFzb3VyY2VPYmogJiYgdHlwZW9mIHNvdXJjZU9iai5hZGRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopIHtcbiAgICByZXR1cm4gISFzb3VyY2VPYmogJiYgdHlwZW9mIHNvdXJjZU9iai5vbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLm9mZiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzTm9kZUxpc3Qoc291cmNlT2JqKSB7XG4gICAgcmV0dXJuICEhc291cmNlT2JqICYmIHRvU3RyaW5nLmNhbGwoc291cmNlT2JqKSA9PT0gJ1tvYmplY3QgTm9kZUxpc3RdJztcbn1cbmZ1bmN0aW9uIGlzSFRNTENvbGxlY3Rpb24oc291cmNlT2JqKSB7XG4gICAgcmV0dXJuICEhc291cmNlT2JqICYmIHRvU3RyaW5nLmNhbGwoc291cmNlT2JqKSA9PT0gJ1tvYmplY3QgSFRNTENvbGxlY3Rpb25dJztcbn1cbmZ1bmN0aW9uIGlzRXZlbnRUYXJnZXQoc291cmNlT2JqKSB7XG4gICAgcmV0dXJuICEhc291cmNlT2JqICYmIHR5cGVvZiBzb3VyY2VPYmouYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbic7XG59XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIEZyb21FdmVudE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGcm9tRXZlbnRPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZyb21FdmVudE9ic2VydmFibGUoc291cmNlT2JqLCBldmVudE5hbWUsIHNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnNvdXJjZU9iaiA9IHNvdXJjZU9iajtcbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLyogdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBldmVudHMgb2YgYSBzcGVjaWZpYyB0eXBlIGNvbWluZyBmcm9tIHRoZVxuICAgICAqIGdpdmVuIGV2ZW50IHRhcmdldC5cbiAgICAgKlxuICAgICAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5DcmVhdGVzIGFuIE9ic2VydmFibGUgZnJvbSBET00gZXZlbnRzLCBvciBOb2RlXG4gICAgICogRXZlbnRFbWl0dGVyIGV2ZW50cyBvciBvdGhlcnMuPC9zcGFuPlxuICAgICAqXG4gICAgICogPGltZyBzcmM9XCIuL2ltZy9mcm9tRXZlbnQucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgYnkgYXR0YWNoaW5nIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIFwiZXZlbnQgdGFyZ2V0XCIsXG4gICAgICogd2hpY2ggbWF5IGJlIGFuIG9iamVjdCB3aXRoIGBhZGRFdmVudExpc3RlbmVyYCBhbmQgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLFxuICAgICAqIGEgTm9kZS5qcyBFdmVudEVtaXR0ZXIsIGEgalF1ZXJ5IHN0eWxlIEV2ZW50RW1pdHRlciwgYSBOb2RlTGlzdCBmcm9tIHRoZVxuICAgICAqIERPTSwgb3IgYW4gSFRNTENvbGxlY3Rpb24gZnJvbSB0aGUgRE9NLiBUaGUgZXZlbnQgaGFuZGxlciBpcyBhdHRhY2hlZCB3aGVuXG4gICAgICogdGhlIG91dHB1dCBPYnNlcnZhYmxlIGlzIHN1YnNjcmliZWQsIGFuZCByZW1vdmVkIHdoZW4gdGhlIFN1YnNjcmlwdGlvbiBpc1xuICAgICAqIHVuc3Vic2NyaWJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXRzIGNsaWNrcyBoYXBwZW5pbmcgb24gdGhlIERPTSBkb2N1bWVudDwvY2FwdGlvbj5cbiAgICAgKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICAgICAqIGNsaWNrcy5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXN1bHRzIGluOlxuICAgICAqIC8vIE1vdXNlRXZlbnQgb2JqZWN0IGxvZ2dlZCB0byBjb25zb2xlIGV2ZXJ5dGltZSBhIGNsaWNrXG4gICAgICogLy8gb2NjdXJzIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGZyb219XG4gICAgICogQHNlZSB7QGxpbmsgZnJvbUV2ZW50UGF0dGVybn1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RXZlbnRUYXJnZXRMaWtlfSB0YXJnZXQgVGhlIERPTUVsZW1lbnQsIGV2ZW50IHRhcmdldCwgTm9kZS5qc1xuICAgICAqIEV2ZW50RW1pdHRlciwgTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gdG8gYXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIHRvLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgb2YgaW50ZXJlc3QsIGJlaW5nIGVtaXR0ZWQgYnkgdGhlXG4gICAgICogYHRhcmdldGAuXG4gICAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0aHJvdWdoIHRvIGFkZEV2ZW50TGlzdGVuZXJcbiAgICAgKiBAcGFyYW0ge1NlbGVjdG9yTWV0aG9kU2lnbmF0dXJlPFQ+fSBbc2VsZWN0b3JdIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvXG4gICAgICogcG9zdC1wcm9jZXNzIHJlc3VsdHMuIEl0IHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciBhbmRcbiAgICAgKiBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59XG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgZnJvbUV2ZW50XG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBGcm9tRXZlbnRPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucywgc2VsZWN0b3IpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb25fMS5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBzZWxlY3RvciA9IG9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJvbUV2ZW50T2JzZXJ2YWJsZSh0YXJnZXQsIGV2ZW50TmFtZSwgc2VsZWN0b3IsIG9wdGlvbnMpO1xuICAgIH07XG4gICAgRnJvbUV2ZW50T2JzZXJ2YWJsZS5zZXR1cFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzb3VyY2VPYmosIGV2ZW50TmFtZSwgaGFuZGxlciwgc3Vic2NyaWJlciwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmU7XG4gICAgICAgIGlmIChpc05vZGVMaXN0KHNvdXJjZU9iaikgfHwgaXNIVE1MQ29sbGVjdGlvbihzb3VyY2VPYmopKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc291cmNlT2JqLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgRnJvbUV2ZW50T2JzZXJ2YWJsZS5zZXR1cFN1YnNjcmlwdGlvbihzb3VyY2VPYmpbaV0sIGV2ZW50TmFtZSwgaGFuZGxlciwgc3Vic2NyaWJlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNFdmVudFRhcmdldChzb3VyY2VPYmopKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlXzEgPSBzb3VyY2VPYmo7XG4gICAgICAgICAgICBzb3VyY2VPYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzb3VyY2VfMS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlXzIgPSBzb3VyY2VPYmo7XG4gICAgICAgICAgICBzb3VyY2VPYmoub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gc291cmNlXzIub2ZmKGV2ZW50TmFtZSwgaGFuZGxlcik7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOb2RlU3R5bGVFdmVudEVtbWl0dGVyKHNvdXJjZU9iaikpIHtcbiAgICAgICAgICAgIHZhciBzb3VyY2VfMyA9IHNvdXJjZU9iajtcbiAgICAgICAgICAgIHNvdXJjZU9iai5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzb3VyY2VfMy5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBldmVudCB0YXJnZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLmFkZChuZXcgU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKHVuc3Vic2NyaWJlKSk7XG4gICAgfTtcbiAgICBGcm9tRXZlbnRPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIHNvdXJjZU9iaiA9IHRoaXMuc291cmNlT2JqO1xuICAgICAgICB2YXIgZXZlbnROYW1lID0gdGhpcy5ldmVudE5hbWU7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yO1xuICAgICAgICB2YXIgaGFuZGxlciA9IHNlbGVjdG9yID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKHNlbGVjdG9yKS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHN1YnNjcmliZXIubmV4dChlKTsgfTtcbiAgICAgICAgRnJvbUV2ZW50T2JzZXJ2YWJsZS5zZXR1cFN1YnNjcmlwdGlvbihzb3VyY2VPYmosIGV2ZW50TmFtZSwgaGFuZGxlciwgc3Vic2NyaWJlciwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICByZXR1cm4gRnJvbUV2ZW50T2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuRnJvbUV2ZW50T2JzZXJ2YWJsZSA9IEZyb21FdmVudE9ic2VydmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gcm9tRXZlbnRPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvRnJvbUV2ZW50T2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNDAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  657. /***/ },
  658. /* 401 */
  659. /***/ function(module, exports, __webpack_require__) {
  660. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar fromEventPattern_1 = __webpack_require__(402);\nObservable_1.Observable.fromEventPattern = fromEventPattern_1.fromEventPattern;\n//# sourceMappingURL=fromEventPattern.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb21FdmVudFBhdHRlcm4uanM/N2JkYSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZnJvbUV2ZW50UGF0dGVybl8xID0gcmVxdWlyZSgnLi4vLi4vb2JzZXJ2YWJsZS9mcm9tRXZlbnRQYXR0ZXJuJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuID0gZnJvbUV2ZW50UGF0dGVybl8xLmZyb21FdmVudFBhdHRlcm47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tRXZlbnRQYXR0ZXJuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb21FdmVudFBhdHRlcm4uanNcbi8vIG1vZHVsZSBpZCA9IDQwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  661. /***/ },
  662. /* 402 */
  663. /***/ function(module, exports, __webpack_require__) {
  664. eval("\"use strict\";\nvar FromEventPatternObservable_1 = __webpack_require__(403);\nexports.fromEventPattern = FromEventPatternObservable_1.FromEventPatternObservable.create;\n//# sourceMappingURL=fromEventPattern.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZnJvbUV2ZW50UGF0dGVybi5qcz9lYzhiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEZyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0Zyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlJyk7XG5leHBvcnRzLmZyb21FdmVudFBhdHRlcm4gPSBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZV8xLkZyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21FdmVudFBhdHRlcm4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9mcm9tRXZlbnRQYXR0ZXJuLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  665. /***/ },
  666. /* 403 */
  667. /***/ function(module, exports, __webpack_require__) {
  668. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar Subscription_1 = __webpack_require__(11);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar FromEventPatternObservable = (function (_super) {\n __extends(FromEventPatternObservable, _super);\n function FromEventPatternObservable(addHandler, removeHandler, selector) {\n _super.call(this);\n this.addHandler = addHandler;\n this.removeHandler = removeHandler;\n this.selector = selector;\n }\n /**\n * Creates an Observable from an API based on addHandler/removeHandler\n * functions.\n *\n * <span class=\"informal\">Converts any addHandler/removeHandler API to an\n * Observable.</span>\n *\n * <img src=\"./img/fromEventPattern.png\" width=\"100%\">\n *\n * Creates an Observable by using the `addHandler` and `removeHandler`\n * functions to add and remove the handlers, with an optional selector\n * function to project the event arguments to a result. The `addHandler` is\n * called when the output Observable is subscribed, and `removeHandler` is\n * called when the Subscription is unsubscribed.\n *\n * @example <caption>Emits clicks happening on the DOM document</caption>\n * function addClickHandler(handler) {\n * document.addEventListener('click', handler);\n * }\n *\n * function removeClickHandler(handler) {\n * document.removeEventListener('click', handler);\n * }\n *\n * var clicks = Rx.Observable.fromEventPattern(\n * addClickHandler,\n * removeClickHandler\n * );\n * clicks.subscribe(x => console.log(x));\n *\n * @see {@link from}\n * @see {@link fromEvent}\n *\n * @param {function(handler: Function): any} addHandler A function that takes\n * a `handler` function as argument and attaches it somehow to the actual\n * source of events.\n * @param {function(handler: Function): void} removeHandler A function that\n * takes a `handler` function as argument and removes it in case it was\n * previously attached using `addHandler`.\n * @param {function(...args: any): T} [selector] An optional function to\n * post-process results. It takes the arguments from the event handler and\n * should return a single value.\n * @return {Observable<T>}\n * @static true\n * @name fromEventPattern\n * @owner Observable\n */\n FromEventPatternObservable.create = function (addHandler, removeHandler, selector) {\n return new FromEventPatternObservable(addHandler, removeHandler, selector);\n };\n FromEventPatternObservable.prototype._subscribe = function (subscriber) {\n var _this = this;\n var removeHandler = this.removeHandler;\n var handler = !!this.selector ? function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n _this._callSelector(subscriber, args);\n } : function (e) { subscriber.next(e); };\n this._callAddHandler(handler, subscriber);\n subscriber.add(new Subscription_1.Subscription(function () {\n //TODO: determine whether or not to forward to error handler\n removeHandler(handler);\n }));\n };\n FromEventPatternObservable.prototype._callSelector = function (subscriber, args) {\n try {\n var result = this.selector.apply(this, args);\n subscriber.next(result);\n }\n catch (e) {\n subscriber.error(e);\n }\n };\n FromEventPatternObservable.prototype._callAddHandler = function (handler, errorSubscriber) {\n try {\n this.addHandler(handler);\n }\n catch (e) {\n errorSubscriber.error(e);\n }\n };\n return FromEventPatternObservable;\n}(Observable_1.Observable));\nexports.FromEventPatternObservable = FromEventPatternObservable;\n//# sourceMappingURL=FromEventPatternObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUuanM/ZDU3MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmFkZEhhbmRsZXIgPSBhZGRIYW5kbGVyO1xuICAgICAgICB0aGlzLnJlbW92ZUhhbmRsZXIgPSByZW1vdmVIYW5kbGVyO1xuICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gT2JzZXJ2YWJsZSBmcm9tIGFuIEFQSSBiYXNlZCBvbiBhZGRIYW5kbGVyL3JlbW92ZUhhbmRsZXJcbiAgICAgKiBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+Q29udmVydHMgYW55IGFkZEhhbmRsZXIvcmVtb3ZlSGFuZGxlciBBUEkgdG8gYW5cbiAgICAgKiBPYnNlcnZhYmxlLjwvc3Bhbj5cbiAgICAgKlxuICAgICAqIDxpbWcgc3JjPVwiLi9pbWcvZnJvbUV2ZW50UGF0dGVybi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gT2JzZXJ2YWJsZSBieSB1c2luZyB0aGUgYGFkZEhhbmRsZXJgIGFuZCBgcmVtb3ZlSGFuZGxlcmBcbiAgICAgKiBmdW5jdGlvbnMgdG8gYWRkIGFuZCByZW1vdmUgdGhlIGhhbmRsZXJzLCB3aXRoIGFuIG9wdGlvbmFsIHNlbGVjdG9yXG4gICAgICogZnVuY3Rpb24gdG8gcHJvamVjdCB0aGUgZXZlbnQgYXJndW1lbnRzIHRvIGEgcmVzdWx0LiBUaGUgYGFkZEhhbmRsZXJgIGlzXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGlzIHN1YnNjcmliZWQsIGFuZCBgcmVtb3ZlSGFuZGxlcmAgaXNcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgU3Vic2NyaXB0aW9uIGlzIHVuc3Vic2NyaWJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXRzIGNsaWNrcyBoYXBwZW5pbmcgb24gdGhlIERPTSBkb2N1bWVudDwvY2FwdGlvbj5cbiAgICAgKiBmdW5jdGlvbiBhZGRDbGlja0hhbmRsZXIoaGFuZGxlcikge1xuICAgICAqICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiByZW1vdmVDbGlja0hhbmRsZXIoaGFuZGxlcikge1xuICAgICAqICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAqICAgYWRkQ2xpY2tIYW5kbGVyLFxuICAgICAqICAgcmVtb3ZlQ2xpY2tIYW5kbGVyXG4gICAgICogKTtcbiAgICAgKiBjbGlja3Muc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgZnJvbX1cbiAgICAgKiBAc2VlIHtAbGluayBmcm9tRXZlbnR9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGhhbmRsZXI6IEZ1bmN0aW9uKTogYW55fSBhZGRIYW5kbGVyIEEgZnVuY3Rpb24gdGhhdCB0YWtlc1xuICAgICAqIGEgYGhhbmRsZXJgIGZ1bmN0aW9uIGFzIGFyZ3VtZW50IGFuZCBhdHRhY2hlcyBpdCBzb21laG93IHRvIHRoZSBhY3R1YWxcbiAgICAgKiBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkfSByZW1vdmVIYW5kbGVyIEEgZnVuY3Rpb24gdGhhdFxuICAgICAqIHRha2VzIGEgYGhhbmRsZXJgIGZ1bmN0aW9uIGFzIGFyZ3VtZW50IGFuZCByZW1vdmVzIGl0IGluIGNhc2UgaXQgd2FzXG4gICAgICogcHJldmlvdXNseSBhdHRhY2hlZCB1c2luZyBgYWRkSGFuZGxlcmAuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbiguLi5hcmdzOiBhbnkpOiBUfSBbc2VsZWN0b3JdIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvXG4gICAgICogcG9zdC1wcm9jZXNzIHJlc3VsdHMuIEl0IHRha2VzIHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgZXZlbnQgaGFuZGxlciBhbmRcbiAgICAgKiBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHZhbHVlLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGU8VD59XG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgZnJvbUV2ZW50UGF0dGVyblxuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIsIHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUoYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlciwgc2VsZWN0b3IpO1xuICAgIH07XG4gICAgRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVtb3ZlSGFuZGxlciA9IHRoaXMucmVtb3ZlSGFuZGxlcjtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSAhIXRoaXMuc2VsZWN0b3IgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuX2NhbGxTZWxlY3RvcihzdWJzY3JpYmVyLCBhcmdzKTtcbiAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7IHN1YnNjcmliZXIubmV4dChlKTsgfTtcbiAgICAgICAgdGhpcy5fY2FsbEFkZEhhbmRsZXIoaGFuZGxlciwgc3Vic2NyaWJlcik7XG4gICAgICAgIHN1YnNjcmliZXIuYWRkKG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy9UT0RPOiBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdG8gZm9yd2FyZCB0byBlcnJvciBoYW5kbGVyXG4gICAgICAgICAgICByZW1vdmVIYW5kbGVyKGhhbmRsZXIpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZS5wcm90b3R5cGUuX2NhbGxTZWxlY3RvciA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBhcmdzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5zZWxlY3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZS5wcm90b3R5cGUuX2NhbGxBZGRIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIsIGVycm9yU3Vic2NyaWJlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvclN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUgPSBGcm9tRXZlbnRQYXR0ZXJuT2JzZXJ2YWJsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyb21FdmVudFBhdHRlcm5PYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvRnJvbUV2ZW50UGF0dGVybk9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDQwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  669. /***/ },
  670. /* 404 */
  671. /***/ function(module, exports, __webpack_require__) {
  672. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar fromPromise_1 = __webpack_require__(27);\nObservable_1.Observable.fromPromise = fromPromise_1.fromPromise;\n//# sourceMappingURL=fromPromise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlLmpzPzdhYjIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGZyb21Qcm9taXNlXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5mcm9tUHJvbWlzZSA9IGZyb21Qcm9taXNlXzEuZnJvbVByb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tUHJvbWlzZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gNDA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  673. /***/ },
  674. /* 405 */
  675. /***/ function(module, exports, __webpack_require__) {
  676. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar GenerateObservable_1 = __webpack_require__(406);\nObservable_1.Observable.generate = GenerateObservable_1.GenerateObservable.create;\n//# sourceMappingURL=generate.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2dlbmVyYXRlLmpzP2EwNzIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIEdlbmVyYXRlT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vb2JzZXJ2YWJsZS9HZW5lcmF0ZU9ic2VydmFibGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLmdlbmVyYXRlID0gR2VuZXJhdGVPYnNlcnZhYmxlXzEuR2VuZXJhdGVPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdlbmVyYXRlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2dlbmVyYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  677. /***/ },
  678. /* 406 */
  679. /***/ function(module, exports, __webpack_require__) {
  680. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar isScheduler_1 = __webpack_require__(42);\nvar selfSelector = function (value) { return value; };\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar GenerateObservable = (function (_super) {\n __extends(GenerateObservable, _super);\n function GenerateObservable(initialState, condition, iterate, resultSelector, scheduler) {\n _super.call(this);\n this.initialState = initialState;\n this.condition = condition;\n this.iterate = iterate;\n this.resultSelector = resultSelector;\n this.scheduler = scheduler;\n }\n GenerateObservable.create = function (initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {\n if (arguments.length == 1) {\n return new GenerateObservable(initialStateOrOptions.initialState, initialStateOrOptions.condition, initialStateOrOptions.iterate, initialStateOrOptions.resultSelector || selfSelector, initialStateOrOptions.scheduler);\n }\n if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {\n return new GenerateObservable(initialStateOrOptions, condition, iterate, selfSelector, resultSelectorOrObservable);\n }\n return new GenerateObservable(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler);\n };\n GenerateObservable.prototype._subscribe = function (subscriber) {\n var state = this.initialState;\n if (this.scheduler) {\n return this.scheduler.schedule(GenerateObservable.dispatch, 0, {\n subscriber: subscriber,\n iterate: this.iterate,\n condition: this.condition,\n resultSelector: this.resultSelector,\n state: state });\n }\n var _a = this, condition = _a.condition, resultSelector = _a.resultSelector, iterate = _a.iterate;\n do {\n if (condition) {\n var conditionResult = void 0;\n try {\n conditionResult = condition(state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (!conditionResult) {\n subscriber.complete();\n break;\n }\n }\n var value = void 0;\n try {\n value = resultSelector(state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n subscriber.next(value);\n if (subscriber.closed) {\n break;\n }\n try {\n state = iterate(state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n } while (true);\n };\n GenerateObservable.dispatch = function (state) {\n var subscriber = state.subscriber, condition = state.condition;\n if (subscriber.closed) {\n return;\n }\n if (state.needIterate) {\n try {\n state.state = state.iterate(state.state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n }\n else {\n state.needIterate = true;\n }\n if (condition) {\n var conditionResult = void 0;\n try {\n conditionResult = condition(state.state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (!conditionResult) {\n subscriber.complete();\n return;\n }\n if (subscriber.closed) {\n return;\n }\n }\n var value;\n try {\n value = state.resultSelector(state.state);\n }\n catch (err) {\n subscriber.error(err);\n return;\n }\n if (subscriber.closed) {\n return;\n }\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n return this.schedule(state);\n };\n return GenerateObservable;\n}(Observable_1.Observable));\nexports.GenerateObservable = GenerateObservable;\n//# sourceMappingURL=GenerateObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvR2VuZXJhdGVPYnNlcnZhYmxlLmpzPzU0NGUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNTY2hlZHVsZXInKTtcbnZhciBzZWxmU2VsZWN0b3IgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBHZW5lcmF0ZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhHZW5lcmF0ZU9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gR2VuZXJhdGVPYnNlcnZhYmxlKGluaXRpYWxTdGF0ZSwgY29uZGl0aW9uLCBpdGVyYXRlLCByZXN1bHRTZWxlY3Rvciwgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgIHRoaXMuaXRlcmF0ZSA9IGl0ZXJhdGU7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIEdlbmVyYXRlT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlT3JPcHRpb25zLCBjb25kaXRpb24sIGl0ZXJhdGUsIHJlc3VsdFNlbGVjdG9yT3JPYnNlcnZhYmxlLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZU9ic2VydmFibGUoaW5pdGlhbFN0YXRlT3JPcHRpb25zLmluaXRpYWxTdGF0ZSwgaW5pdGlhbFN0YXRlT3JPcHRpb25zLmNvbmRpdGlvbiwgaW5pdGlhbFN0YXRlT3JPcHRpb25zLml0ZXJhdGUsIGluaXRpYWxTdGF0ZU9yT3B0aW9ucy5yZXN1bHRTZWxlY3RvciB8fCBzZWxmU2VsZWN0b3IsIGluaXRpYWxTdGF0ZU9yT3B0aW9ucy5zY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHRTZWxlY3Rvck9yT2JzZXJ2YWJsZSA9PT0gdW5kZWZpbmVkIHx8IGlzU2NoZWR1bGVyXzEuaXNTY2hlZHVsZXIocmVzdWx0U2VsZWN0b3JPck9ic2VydmFibGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlT2JzZXJ2YWJsZShpbml0aWFsU3RhdGVPck9wdGlvbnMsIGNvbmRpdGlvbiwgaXRlcmF0ZSwgc2VsZlNlbGVjdG9yLCByZXN1bHRTZWxlY3Rvck9yT2JzZXJ2YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZU9ic2VydmFibGUoaW5pdGlhbFN0YXRlT3JPcHRpb25zLCBjb25kaXRpb24sIGl0ZXJhdGUsIHJlc3VsdFNlbGVjdG9yT3JPYnNlcnZhYmxlLCBzY2hlZHVsZXIpO1xuICAgIH07XG4gICAgR2VuZXJhdGVPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgICAgIGlmICh0aGlzLnNjaGVkdWxlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKEdlbmVyYXRlT2JzZXJ2YWJsZS5kaXNwYXRjaCwgMCwge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXI6IHN1YnNjcmliZXIsXG4gICAgICAgICAgICAgICAgaXRlcmF0ZTogdGhpcy5pdGVyYXRlLFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb24sXG4gICAgICAgICAgICAgICAgcmVzdWx0U2VsZWN0b3I6IHRoaXMucmVzdWx0U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHN0YXRlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbmRpdGlvbiA9IF9hLmNvbmRpdGlvbiwgcmVzdWx0U2VsZWN0b3IgPSBfYS5yZXN1bHRTZWxlY3RvciwgaXRlcmF0ZSA9IF9hLml0ZXJhdGU7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uUmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9IGNvbmRpdGlvbihzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdFNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IGl0ZXJhdGUoc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIH07XG4gICAgR2VuZXJhdGVPYnNlcnZhYmxlLmRpc3BhdGNoID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlciwgY29uZGl0aW9uID0gc3RhdGUuY29uZGl0aW9uO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubmVlZEl0ZXJhdGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc3RhdGUgPSBzdGF0ZS5pdGVyYXRlKHN0YXRlLnN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUubmVlZEl0ZXJhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb25SZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9IGNvbmRpdGlvbihzdGF0ZS5zdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHN0YXRlLnJlc3VsdFNlbGVjdG9yKHN0YXRlLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUoc3RhdGUpO1xuICAgIH07XG4gICAgcmV0dXJuIEdlbmVyYXRlT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuR2VuZXJhdGVPYnNlcnZhYmxlID0gR2VuZXJhdGVPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2VuZXJhdGVPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvR2VuZXJhdGVPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  681. /***/ },
  682. /* 407 */
  683. /***/ function(module, exports, __webpack_require__) {
  684. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar if_1 = __webpack_require__(408);\nObservable_1.Observable.if = if_1._if;\n//# sourceMappingURL=if.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2lmLmpzP2NlMjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGlmXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2lmJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5pZiA9IGlmXzEuX2lmO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWYuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvaWYuanNcbi8vIG1vZHVsZSBpZCA9IDQwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  685. /***/ },
  686. /* 408 */
  687. /***/ function(module, exports, __webpack_require__) {
  688. eval("\"use strict\";\nvar IfObservable_1 = __webpack_require__(409);\nexports._if = IfObservable_1.IfObservable.create;\n//# sourceMappingURL=if.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvaWYuanM/Yjk5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBJZk9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vSWZPYnNlcnZhYmxlJyk7XG5leHBvcnRzLl9pZiA9IElmT2JzZXJ2YWJsZV8xLklmT2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2lmLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  689. /***/ },
  690. /* 409 */
  691. /***/ function(module, exports, __webpack_require__) {
  692. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar IfObservable = (function (_super) {\n __extends(IfObservable, _super);\n function IfObservable(condition, thenSource, elseSource) {\n _super.call(this);\n this.condition = condition;\n this.thenSource = thenSource;\n this.elseSource = elseSource;\n }\n IfObservable.create = function (condition, thenSource, elseSource) {\n return new IfObservable(condition, thenSource, elseSource);\n };\n IfObservable.prototype._subscribe = function (subscriber) {\n var _a = this, condition = _a.condition, thenSource = _a.thenSource, elseSource = _a.elseSource;\n return new IfSubscriber(subscriber, condition, thenSource, elseSource);\n };\n return IfObservable;\n}(Observable_1.Observable));\nexports.IfObservable = IfObservable;\nvar IfSubscriber = (function (_super) {\n __extends(IfSubscriber, _super);\n function IfSubscriber(destination, condition, thenSource, elseSource) {\n _super.call(this, destination);\n this.condition = condition;\n this.thenSource = thenSource;\n this.elseSource = elseSource;\n this.tryIf();\n }\n IfSubscriber.prototype.tryIf = function () {\n var _a = this, condition = _a.condition, thenSource = _a.thenSource, elseSource = _a.elseSource;\n var result;\n try {\n result = condition();\n var source = result ? thenSource : elseSource;\n if (source) {\n this.add(subscribeToResult_1.subscribeToResult(this, source));\n }\n else {\n this._complete();\n }\n }\n catch (err) {\n this._error(err);\n }\n };\n return IfSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=IfObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvSWZPYnNlcnZhYmxlLmpzPzVjMDMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBJZk9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJZk9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSWZPYnNlcnZhYmxlKGNvbmRpdGlvbiwgdGhlblNvdXJjZSwgZWxzZVNvdXJjZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgIHRoaXMudGhlblNvdXJjZSA9IHRoZW5Tb3VyY2U7XG4gICAgICAgIHRoaXMuZWxzZVNvdXJjZSA9IGVsc2VTb3VyY2U7XG4gICAgfVxuICAgIElmT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCB0aGVuU291cmNlLCBlbHNlU291cmNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSWZPYnNlcnZhYmxlKGNvbmRpdGlvbiwgdGhlblNvdXJjZSwgZWxzZVNvdXJjZSk7XG4gICAgfTtcbiAgICBJZk9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBjb25kaXRpb24gPSBfYS5jb25kaXRpb24sIHRoZW5Tb3VyY2UgPSBfYS50aGVuU291cmNlLCBlbHNlU291cmNlID0gX2EuZWxzZVNvdXJjZTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZlN1YnNjcmliZXIoc3Vic2NyaWJlciwgY29uZGl0aW9uLCB0aGVuU291cmNlLCBlbHNlU291cmNlKTtcbiAgICB9O1xuICAgIHJldHVybiBJZk9ic2VydmFibGU7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLklmT2JzZXJ2YWJsZSA9IElmT2JzZXJ2YWJsZTtcbnZhciBJZlN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJZlN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSWZTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25kaXRpb24sIHRoZW5Tb3VyY2UsIGVsc2VTb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICAgICAgdGhpcy50aGVuU291cmNlID0gdGhlblNvdXJjZTtcbiAgICAgICAgdGhpcy5lbHNlU291cmNlID0gZWxzZVNvdXJjZTtcbiAgICAgICAgdGhpcy50cnlJZigpO1xuICAgIH1cbiAgICBJZlN1YnNjcmliZXIucHJvdG90eXBlLnRyeUlmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBjb25kaXRpb24gPSBfYS5jb25kaXRpb24sIHRoZW5Tb3VyY2UgPSBfYS50aGVuU291cmNlLCBlbHNlU291cmNlID0gX2EuZWxzZVNvdXJjZTtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbigpO1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHJlc3VsdCA/IHRoZW5Tb3VyY2UgOiBlbHNlU291cmNlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgc291cmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBJZlN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SWZPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvSWZPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MDlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  693. /***/ },
  694. /* 410 */
  695. /***/ function(module, exports, __webpack_require__) {
  696. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar interval_1 = __webpack_require__(411);\nObservable_1.Observable.interval = interval_1.interval;\n//# sourceMappingURL=interval.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2ludGVydmFsLmpzPzJkNmYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGludGVydmFsXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL2ludGVydmFsJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5pbnRlcnZhbCA9IGludGVydmFsXzEuaW50ZXJ2YWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcnZhbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9pbnRlcnZhbC5qc1xuLy8gbW9kdWxlIGlkID0gNDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  697. /***/ },
  698. /* 411 */
  699. /***/ function(module, exports, __webpack_require__) {
  700. eval("\"use strict\";\nvar IntervalObservable_1 = __webpack_require__(412);\nexports.interval = IntervalObservable_1.IntervalObservable.create;\n//# sourceMappingURL=interval.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvaW50ZXJ2YWwuanM/ZmQ0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBJbnRlcnZhbE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vSW50ZXJ2YWxPYnNlcnZhYmxlJyk7XG5leHBvcnRzLmludGVydmFsID0gSW50ZXJ2YWxPYnNlcnZhYmxlXzEuSW50ZXJ2YWxPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVydmFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvaW50ZXJ2YWwuanNcbi8vIG1vZHVsZSBpZCA9IDQxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  701. /***/ },
  702. /* 412 */
  703. /***/ function(module, exports, __webpack_require__) {
  704. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isNumeric_1 = __webpack_require__(413);\nvar Observable_1 = __webpack_require__(6);\nvar async_1 = __webpack_require__(414);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar IntervalObservable = (function (_super) {\n __extends(IntervalObservable, _super);\n function IntervalObservable(period, scheduler) {\n if (period === void 0) { period = 0; }\n if (scheduler === void 0) { scheduler = async_1.async; }\n _super.call(this);\n this.period = period;\n this.scheduler = scheduler;\n if (!isNumeric_1.isNumeric(period) || period < 0) {\n this.period = 0;\n }\n if (!scheduler || typeof scheduler.schedule !== 'function') {\n this.scheduler = async_1.async;\n }\n }\n /**\n * Creates an Observable that emits sequential numbers every specified\n * interval of time, on a specified Scheduler.\n *\n * <span class=\"informal\">Emits incremental numbers periodically in time.\n * </span>\n *\n * <img src=\"./img/interval.png\" width=\"100%\">\n *\n * `interval` returns an Observable that emits an infinite sequence of\n * ascending integers, with a constant interval of time of your choosing\n * between those emissions. The first emission is not sent immediately, but\n * only after the first period has passed. By default, this operator uses the\n * `async` Scheduler to provide a notion of time, but you may pass any\n * Scheduler to it.\n *\n * @example <caption>Emits ascending numbers, one every second (1000ms)</caption>\n * var numbers = Rx.Observable.interval(1000);\n * numbers.subscribe(x => console.log(x));\n *\n * @see {@link timer}\n * @see {@link delay}\n *\n * @param {number} [period=0] The interval size in milliseconds (by default)\n * or the time unit determined by the scheduler's clock.\n * @param {Scheduler} [scheduler=async] The Scheduler to use for scheduling\n * the emission of values, and providing a notion of \"time\".\n * @return {Observable} An Observable that emits a sequential number each time\n * interval.\n * @static true\n * @name interval\n * @owner Observable\n */\n IntervalObservable.create = function (period, scheduler) {\n if (period === void 0) { period = 0; }\n if (scheduler === void 0) { scheduler = async_1.async; }\n return new IntervalObservable(period, scheduler);\n };\n IntervalObservable.dispatch = function (state) {\n var index = state.index, subscriber = state.subscriber, period = state.period;\n subscriber.next(index);\n if (subscriber.closed) {\n return;\n }\n state.index += 1;\n this.schedule(state, period);\n };\n IntervalObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var period = this.period;\n var scheduler = this.scheduler;\n subscriber.add(scheduler.schedule(IntervalObservable.dispatch, period, {\n index: index, subscriber: subscriber, period: period\n }));\n };\n return IntervalObservable;\n}(Observable_1.Observable));\nexports.IntervalObservable = IntervalObservable;\n//# sourceMappingURL=IntervalObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvSW50ZXJ2YWxPYnNlcnZhYmxlLmpzP2E3MjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBpc051bWVyaWNfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNOdW1lcmljJyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgSW50ZXJ2YWxPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW50ZXJ2YWxPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludGVydmFsT2JzZXJ2YWJsZShwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgICAgICBpZiAocGVyaW9kID09PSB2b2lkIDApIHsgcGVyaW9kID0gMDsgfVxuICAgICAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wZXJpb2QgPSBwZXJpb2Q7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICBpZiAoIWlzTnVtZXJpY18xLmlzTnVtZXJpYyhwZXJpb2QpIHx8IHBlcmlvZCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjaGVkdWxlciB8fCB0eXBlb2Ygc2NoZWR1bGVyLnNjaGVkdWxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgc2VxdWVudGlhbCBudW1iZXJzIGV2ZXJ5IHNwZWNpZmllZFxuICAgICAqIGludGVydmFsIG9mIHRpbWUsIG9uIGEgc3BlY2lmaWVkIFNjaGVkdWxlci5cbiAgICAgKlxuICAgICAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5FbWl0cyBpbmNyZW1lbnRhbCBudW1iZXJzIHBlcmlvZGljYWxseSBpbiB0aW1lLlxuICAgICAqIDwvc3Bhbj5cbiAgICAgKlxuICAgICAqIDxpbWcgc3JjPVwiLi9pbWcvaW50ZXJ2YWwucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICpcbiAgICAgKiBgaW50ZXJ2YWxgIHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGluZmluaXRlIHNlcXVlbmNlIG9mXG4gICAgICogYXNjZW5kaW5nIGludGVnZXJzLCB3aXRoIGEgY29uc3RhbnQgaW50ZXJ2YWwgb2YgdGltZSBvZiB5b3VyIGNob29zaW5nXG4gICAgICogYmV0d2VlbiB0aG9zZSBlbWlzc2lvbnMuIFRoZSBmaXJzdCBlbWlzc2lvbiBpcyBub3Qgc2VudCBpbW1lZGlhdGVseSwgYnV0XG4gICAgICogb25seSBhZnRlciB0aGUgZmlyc3QgcGVyaW9kIGhhcyBwYXNzZWQuIEJ5IGRlZmF1bHQsIHRoaXMgb3BlcmF0b3IgdXNlcyB0aGVcbiAgICAgKiBgYXN5bmNgIFNjaGVkdWxlciB0byBwcm92aWRlIGEgbm90aW9uIG9mIHRpbWUsIGJ1dCB5b3UgbWF5IHBhc3MgYW55XG4gICAgICogU2NoZWR1bGVyIHRvIGl0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdHMgYXNjZW5kaW5nIG51bWJlcnMsIG9uZSBldmVyeSBzZWNvbmQgKDEwMDBtcyk8L2NhcHRpb24+XG4gICAgICogdmFyIG51bWJlcnMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICAgICAqIG51bWJlcnMuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgdGltZXJ9XG4gICAgICogQHNlZSB7QGxpbmsgZGVsYXl9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BlcmlvZD0wXSBUaGUgaW50ZXJ2YWwgc2l6ZSBpbiBtaWxsaXNlY29uZHMgKGJ5IGRlZmF1bHQpXG4gICAgICogb3IgdGhlIHRpbWUgdW5pdCBkZXRlcm1pbmVkIGJ5IHRoZSBzY2hlZHVsZXIncyBjbG9jay5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1hc3luY10gVGhlIFNjaGVkdWxlciB0byB1c2UgZm9yIHNjaGVkdWxpbmdcbiAgICAgKiB0aGUgZW1pc3Npb24gb2YgdmFsdWVzLCBhbmQgcHJvdmlkaW5nIGEgbm90aW9uIG9mIFwidGltZVwiLlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhIHNlcXVlbnRpYWwgbnVtYmVyIGVhY2ggdGltZVxuICAgICAqIGludGVydmFsLlxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIGludGVydmFsXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBJbnRlcnZhbE9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKHBlcmlvZCwgc2NoZWR1bGVyKSB7XG4gICAgICAgIGlmIChwZXJpb2QgPT09IHZvaWQgMCkgeyBwZXJpb2QgPSAwOyB9XG4gICAgICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgeyBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jOyB9XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJ2YWxPYnNlcnZhYmxlKHBlcmlvZCwgc2NoZWR1bGVyKTtcbiAgICB9O1xuICAgIEludGVydmFsT2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCwgc3Vic2NyaWJlciA9IHN0YXRlLnN1YnNjcmliZXIsIHBlcmlvZCA9IHN0YXRlLnBlcmlvZDtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGluZGV4KTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuaW5kZXggKz0gMTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgcGVyaW9kKTtcbiAgICB9O1xuICAgIEludGVydmFsT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBwZXJpb2QgPSB0aGlzLnBlcmlvZDtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICBzdWJzY3JpYmVyLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoSW50ZXJ2YWxPYnNlcnZhYmxlLmRpc3BhdGNoLCBwZXJpb2QsIHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCwgc3Vic2NyaWJlcjogc3Vic2NyaWJlciwgcGVyaW9kOiBwZXJpb2RcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIEludGVydmFsT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuSW50ZXJ2YWxPYnNlcnZhYmxlID0gSW50ZXJ2YWxPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW50ZXJ2YWxPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvSW50ZXJ2YWxPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  705. /***/ },
  706. /* 413 */
  707. /***/ function(module, exports, __webpack_require__) {
  708. eval("\"use strict\";\nvar isArray_1 = __webpack_require__(12);\nfunction isNumeric(val) {\n // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n // subtraction forces infinities to NaN\n // adding 1 corrects loss of precision from parseFloat (#15100)\n return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;\n}\nexports.isNumeric = isNumeric;\n;\n//# sourceMappingURL=isNumeric.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvaXNOdW1lcmljLmpzP2JlYzQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgaXNBcnJheV8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc0FycmF5Jyk7XG5mdW5jdGlvbiBpc051bWVyaWModmFsKSB7XG4gICAgLy8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuICAgIC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcbiAgICAvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cbiAgICAvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcbiAgICByZXR1cm4gIWlzQXJyYXlfMS5pc0FycmF5KHZhbCkgJiYgKHZhbCAtIHBhcnNlRmxvYXQodmFsKSArIDEpID49IDA7XG59XG5leHBvcnRzLmlzTnVtZXJpYyA9IGlzTnVtZXJpYztcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzTnVtZXJpYy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL2lzTnVtZXJpYy5qc1xuLy8gbW9kdWxlIGlkID0gNDEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  709. /***/ },
  710. /* 414 */
  711. /***/ function(module, exports, __webpack_require__) {
  712. eval("\"use strict\";\nvar AsyncAction_1 = __webpack_require__(415);\nvar AsyncScheduler_1 = __webpack_require__(417);\nexports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);\n//# sourceMappingURL=async.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9hc3luYy5qcz82MTc4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEFzeW5jQWN0aW9uXzEgPSByZXF1aXJlKCcuL0FzeW5jQWN0aW9uJyk7XG52YXIgQXN5bmNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vQXN5bmNTY2hlZHVsZXInKTtcbmV4cG9ydHMuYXN5bmMgPSBuZXcgQXN5bmNTY2hlZHVsZXJfMS5Bc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbl8xLkFzeW5jQWN0aW9uKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9hc3luYy5qc1xuLy8gbW9kdWxlIGlkID0gNDE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  713. /***/ },
  714. /* 415 */
  715. /***/ function(module, exports, __webpack_require__) {
  716. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = __webpack_require__(7);\nvar Action_1 = __webpack_require__(416);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AsyncAction = (function (_super) {\n __extends(AsyncAction, _super);\n function AsyncAction(scheduler, work) {\n _super.call(this, scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n this.pending = false;\n }\n AsyncAction.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n if (this.closed) {\n return this;\n }\n // Always replace the current state with the new state.\n this.state = state;\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n var id = this.id;\n var scheduler = this.scheduler;\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n return this;\n };\n AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n return root_1.root.setInterval(scheduler.flush.bind(scheduler, this), delay);\n };\n AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay !== null && this.delay === delay) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // clear the interval id\n return root_1.root.clearInterval(id) && undefined || undefined;\n };\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n AsyncAction.prototype.execute = function (state, delay) {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n this.pending = false;\n var error = this._execute(state, delay);\n if (error) {\n return error;\n }\n else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n };\n AsyncAction.prototype._execute = function (state, delay) {\n var errored = false;\n var errorValue = undefined;\n try {\n this.work(state);\n }\n catch (e) {\n errored = true;\n errorValue = !!e && e || new Error(e);\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n };\n AsyncAction.prototype._unsubscribe = function () {\n var id = this.id;\n var scheduler = this.scheduler;\n var actions = scheduler.actions;\n var index = actions.indexOf(this);\n this.work = null;\n this.delay = null;\n this.state = null;\n this.pending = false;\n this.scheduler = null;\n if (index !== -1) {\n actions.splice(index, 1);\n }\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n };\n return AsyncAction;\n}(Action_1.Action));\nexports.AsyncAction = AsyncAction;\n//# sourceMappingURL=AsyncAction.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9Bc3luY0FjdGlvbi5qcz9lNDE0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9yb290Jyk7XG52YXIgQWN0aW9uXzEgPSByZXF1aXJlKCcuL0FjdGlvbicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBBc3luY0FjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzeW5jQWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzeW5jQWN0aW9uKHNjaGVkdWxlciwgd29yaykge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy53b3JrID0gd29yaztcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIHJlcGxhY2UgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aCB0aGUgbmV3IHN0YXRlLlxuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIC8vIFNldCB0aGUgcGVuZGluZyBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGFjdGlvbiBoYXMgYmVlbiBzY2hlZHVsZWQsIG9yXG4gICAgICAgIC8vIGhhcyByZWN1cnNpdmVseSByZXNjaGVkdWxlZCBpdHNlbGYuXG4gICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7XG4gICAgICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgICAgIHZhciBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW1wb3J0YW50IGltcGxlbWVudGF0aW9uIG5vdGU6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFjdGlvbnMgb25seSBleGVjdXRlIG9uY2UgYnkgZGVmYXVsdCwgdW5sZXNzIHJlc2NoZWR1bGVkIGZyb20gd2l0aGluIHRoZVxuICAgICAgICAvLyBzY2hlZHVsZWQgY2FsbGJhY2suIFRoaXMgYWxsb3dzIHVzIHRvIGltcGxlbWVudCBzaW5nbGUgYW5kIHJlcGVhdFxuICAgICAgICAvLyBhY3Rpb25zIHZpYSB0aGUgc2FtZSBjb2RlIHBhdGgsIHdpdGhvdXQgYWRkaW5nIEFQSSBzdXJmYWNlIGFyZWEsIGFzIHdlbGxcbiAgICAgICAgLy8gYXMgbWltaWMgdHJhZGl0aW9uYWwgcmVjdXJzaW9uIGJ1dCBhY3Jvc3MgYXN5bmNocm9ub3VzIGJvdW5kYXJpZXMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhvd2V2ZXIsIEpTIHJ1bnRpbWVzIGFuZCB0aW1lcnMgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbnRlcnZhbHMgYWNoaWV2ZWQgYnlcbiAgICAgICAgLy8gc2VyaWFsIGBzZXRUaW1lb3V0YCBjYWxscyB2cy4gYSBzaW5nbGUgYHNldEludGVydmFsYCBjYWxsLiBBbiBpbnRlcnZhbCBvZlxuICAgICAgICAvLyBzZXJpYWwgYHNldFRpbWVvdXRgIGNhbGxzIGNhbiBiZSBpbmRpdmlkdWFsbHkgZGVsYXllZCwgd2hpY2ggZGVsYXlzXG4gICAgICAgIC8vIHNjaGVkdWxpbmcgdGhlIG5leHQgYHNldFRpbWVvdXRgLCBhbmQgc28gb24uIGBzZXRJbnRlcnZhbGAgYXR0ZW1wdHMgdG9cbiAgICAgICAgLy8gZ3VhcmFudGVlIHRoZSBpbnRlcnZhbCBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgbW9yZSBwcmVjaXNlbHkgdG8gdGhlXG4gICAgICAgIC8vIGludGVydmFsIHBlcmlvZCwgcmVnYXJkbGVzcyBvZiBsb2FkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIHVzZSBgc2V0SW50ZXJ2YWxgIHRvIHNjaGVkdWxlIHNpbmdsZSBhbmQgcmVwZWF0IGFjdGlvbnMuXG4gICAgICAgIC8vIElmIHRoZSBhY3Rpb24gcmVzY2hlZHVsZXMgaXRzZWxmIHdpdGggdGhlIHNhbWUgZGVsYXksIHRoZSBpbnRlcnZhbCBpcyBub3RcbiAgICAgICAgLy8gY2FuY2VsZWQuIElmIHRoZSBhY3Rpb24gZG9lc24ndCByZXNjaGVkdWxlLCBvciByZXNjaGVkdWxlcyB3aXRoIGFcbiAgICAgICAgLy8gZGlmZmVyZW50IGRlbGF5LCB0aGUgaW50ZXJ2YWwgd2lsbCBiZSBjYW5jZWxlZCBhZnRlciBzY2hlZHVsZWQgY2FsbGJhY2tcbiAgICAgICAgLy8gZXhlY3V0aW9uLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICAgICAgLy8gSWYgdGhpcyBhY3Rpb24gaGFzIGFscmVhZHkgYW4gYXN5bmMgSWQsIGRvbid0IHJlcXVlc3QgYSBuZXcgb25lLlxuICAgICAgICB0aGlzLmlkID0gdGhpcy5pZCB8fCB0aGlzLnJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgdGhpcy5pZCwgZGVsYXkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgcmV0dXJuIHJvb3RfMS5yb290LnNldEludGVydmFsKHNjaGVkdWxlci5mbHVzaC5iaW5kKHNjaGVkdWxlciwgdGhpcyksIGRlbGF5KTtcbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgLy8gSWYgdGhpcyBhY3Rpb24gaXMgcmVzY2hlZHVsZWQgd2l0aCB0aGUgc2FtZSBkZWxheSB0aW1lLCBkb24ndCBjbGVhciB0aGUgaW50ZXJ2YWwgaWQuXG4gICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheSkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFjdGlvbidzIGRlbGF5IHRpbWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgZGVsYXksXG4gICAgICAgIC8vIGNsZWFyIHRoZSBpbnRlcnZhbCBpZFxuICAgICAgICByZXR1cm4gcm9vdF8xLnJvb3QuY2xlYXJJbnRlcnZhbChpZCkgJiYgdW5kZWZpbmVkIHx8IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEltbWVkaWF0ZWx5IGV4ZWN1dGVzIHRoaXMgYWN0aW9uIGFuZCB0aGUgYHdvcmtgIGl0IGNvbnRhaW5zLlxuICAgICAqIEByZXR1cm4ge2FueX1cbiAgICAgKi9cbiAgICBBc3luY0FjdGlvbi5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wZW5kaW5nID09PSBmYWxzZSAmJiB0aGlzLmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERlcXVldWUgaWYgdGhlIGFjdGlvbiBkaWRuJ3QgcmVzY2hlZHVsZSBpdHNlbGYuIERvbid0IGNhbGxcbiAgICAgICAgICAgIC8vIHVuc3Vic2NyaWJlKCksIGJlY2F1c2UgdGhlIGFjdGlvbiBjb3VsZCByZXNjaGVkdWxlIGxhdGVyLlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6XG4gICAgICAgICAgICAvLyBgYGBcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiBkb1dvcmsoY291bnRlcikge1xuICAgICAgICAgICAgLy8gICAvKiAuLi4gSSdtIGEgYnVzeSB3b3JrZXIgYmVlIC4uLiAqL1xuICAgICAgICAgICAgLy8gICB2YXIgb3JpZ2luYWxBY3Rpb24gPSB0aGlzO1xuICAgICAgICAgICAgLy8gICAvKiB3YWl0IDEwMG1zIGJlZm9yZSByZXNjaGVkdWxpbmcgdGhlIGFjdGlvbiAqL1xuICAgICAgICAgICAgLy8gICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vICAgICBvcmlnaW5hbEFjdGlvbi5zY2hlZHVsZShjb3VudGVyICsgMSk7XG4gICAgICAgICAgICAvLyAgIH0sIDEwMCk7XG4gICAgICAgICAgICAvLyB9LCAxMDAwKTtcbiAgICAgICAgICAgIC8vIGBgYFxuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBc3luY0FjdGlvbi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIHZhciBlcnJvcmVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvclZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53b3JrKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXJyb3JlZCA9IHRydWU7XG4gICAgICAgICAgICBlcnJvclZhbHVlID0gISFlICYmIGUgfHwgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcmVkKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JWYWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXN5bmNBY3Rpb24ucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zO1xuICAgICAgICB2YXIgaW5kZXggPSBhY3Rpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICAgIHRoaXMud29yayA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gbnVsbDtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFzeW5jQWN0aW9uO1xufShBY3Rpb25fMS5BY3Rpb24pKTtcbmV4cG9ydHMuQXN5bmNBY3Rpb24gPSBBc3luY0FjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzeW5jQWN0aW9uLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9Bc3luY0FjdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  717. /***/ },
  718. /* 416 */
  719. /***/ function(module, exports, __webpack_require__) {
  720. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = __webpack_require__(11);\n/**\n * A unit of work to be executed in a {@link Scheduler}. An action is typically\n * created from within a Scheduler and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action<T> extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action<T>\n */\nvar Action = (function (_super) {\n __extends(Action, _super);\n function Action(scheduler, work) {\n _super.call(this);\n }\n /**\n * Schedules this action on its parent Scheduler for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n Action.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return this;\n };\n return Action;\n}(Subscription_1.Subscription));\nexports.Action = Action;\n//# sourceMappingURL=Action.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9BY3Rpb24uanM/NzI5NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaXB0aW9uJyk7XG4vKipcbiAqIEEgdW5pdCBvZiB3b3JrIHRvIGJlIGV4ZWN1dGVkIGluIGEge0BsaW5rIFNjaGVkdWxlcn0uIEFuIGFjdGlvbiBpcyB0eXBpY2FsbHlcbiAqIGNyZWF0ZWQgZnJvbSB3aXRoaW4gYSBTY2hlZHVsZXIgYW5kIGFuIFJ4SlMgdXNlciBkb2VzIG5vdCBuZWVkIHRvIGNvbmNlcm5cbiAqIHRoZW1zZWx2ZXMgYWJvdXQgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBhbiBBY3Rpb24uXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIEFjdGlvbjxUPiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7XG4gKiAgIG5ldyAoc2NoZWR1bGVyOiBTY2hlZHVsZXIsIHdvcms6IChzdGF0ZT86IFQpID0+IHZvaWQpO1xuICogICBzY2hlZHVsZShzdGF0ZT86IFQsIGRlbGF5OiBudW1iZXIgPSAwKTogU3Vic2NyaXB0aW9uO1xuICogfVxuICogYGBgXG4gKlxuICogQGNsYXNzIEFjdGlvbjxUPlxuICovXG52YXIgQWN0aW9uID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFjdGlvbihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyB0aGlzIGFjdGlvbiBvbiBpdHMgcGFyZW50IFNjaGVkdWxlciBmb3IgZXhlY3V0aW9uLiBNYXkgYmUgcGFzc2VkXG4gICAgICogc29tZSBjb250ZXh0IG9iamVjdCwgYHN0YXRlYC4gTWF5IGhhcHBlbiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBgZGVsYXlgIHBhcmFtZXRlciwgaWYgc3BlY2lmaWVkLlxuICAgICAqIEBwYXJhbSB7VH0gW3N0YXRlXSBTb21lIGNvbnRleHR1YWwgZGF0YSB0aGF0IHRoZSBgd29ya2AgZnVuY3Rpb24gdXNlcyB3aGVuXG4gICAgICogY2FsbGVkIGJ5IHRoZSBTY2hlZHVsZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gVGltZSB0byB3YWl0IGJlZm9yZSBleGVjdXRpbmcgdGhlIHdvcmssIHdoZXJlIHRoZVxuICAgICAqIHRpbWUgdW5pdCBpcyBpbXBsaWNpdCBhbmQgZGVmaW5lZCBieSB0aGUgU2NoZWR1bGVyLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgQWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIEFjdGlvbjtcbn0oU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKSk7XG5leHBvcnRzLkFjdGlvbiA9IEFjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjdGlvbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zY2hlZHVsZXIvQWN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA0MTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  721. /***/ },
  722. /* 417 */
  723. /***/ function(module, exports, __webpack_require__) {
  724. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Scheduler_1 = __webpack_require__(418);\nvar AsyncScheduler = (function (_super) {\n __extends(AsyncScheduler, _super);\n function AsyncScheduler() {\n _super.apply(this, arguments);\n this.actions = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n */\n this.active = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n */\n this.scheduled = undefined;\n }\n AsyncScheduler.prototype.flush = function (action) {\n var actions = this.actions;\n if (this.active) {\n actions.push(action);\n return;\n }\n var error;\n this.active = true;\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (action = actions.shift()); // exhaust the scheduler queue\n this.active = false;\n if (error) {\n while (action = actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsyncScheduler;\n}(Scheduler_1.Scheduler));\nexports.AsyncScheduler = AsyncScheduler;\n//# sourceMappingURL=AsyncScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qcz9hZTY5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU2NoZWR1bGVyXzEgPSByZXF1aXJlKCcuLi9TY2hlZHVsZXInKTtcbnZhciBBc3luY1NjaGVkdWxlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzeW5jU2NoZWR1bGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyKCkge1xuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgU2NoZWR1bGVyIGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYSBiYXRjaCBvZlxuICAgICAgICAgKiBxdWV1ZWQgYWN0aW9ucy5cbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW50ZXJuYWwgSUQgdXNlZCB0byB0cmFjayB0aGUgbGF0ZXN0IGFzeW5jaHJvbm91cyB0YXNrIHN1Y2ggYXMgdGhvc2VcbiAgICAgICAgICogY29taW5nIGZyb20gYHNldFRpbWVvdXRgLCBgc2V0SW50ZXJ2YWxgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYW5kXG4gICAgICAgICAqIG90aGVycy5cbiAgICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBBc3luY1NjaGVkdWxlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTsgLy8gZXhoYXVzdCB0aGUgc2NoZWR1bGVyIHF1ZXVlXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBBc3luY1NjaGVkdWxlcjtcbn0oU2NoZWR1bGVyXzEuU2NoZWR1bGVyKSk7XG5leHBvcnRzLkFzeW5jU2NoZWR1bGVyID0gQXN5bmNTY2hlZHVsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY1NjaGVkdWxlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zY2hlZHVsZXIvQXN5bmNTY2hlZHVsZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  725. /***/ },
  726. /* 418 */
  727. /***/ function(module, exports) {
  728. eval("\"use strict\";\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an {@link Action}.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n */\nvar Scheduler = (function () {\n function Scheduler(SchedulerAction, now) {\n if (now === void 0) { now = Scheduler.now; }\n this.SchedulerAction = SchedulerAction;\n this.now = now;\n }\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n Scheduler.prototype.schedule = function (work, delay, state) {\n if (delay === void 0) { delay = 0; }\n return new this.SchedulerAction(this, work).schedule(state, delay);\n };\n Scheduler.now = Date.now ? Date.now : function () { return +new Date(); };\n return Scheduler;\n}());\nexports.Scheduler = Scheduler;\n//# sourceMappingURL=Scheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL1NjaGVkdWxlci5qcz9iYjUyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBBbiBleGVjdXRpb24gY29udGV4dCBhbmQgYSBkYXRhIHN0cnVjdHVyZSB0byBvcmRlciB0YXNrcyBhbmQgc2NoZWR1bGUgdGhlaXJcbiAqIGV4ZWN1dGlvbi4gUHJvdmlkZXMgYSBub3Rpb24gb2YgKHBvdGVudGlhbGx5IHZpcnR1YWwpIHRpbWUsIHRocm91Z2ggdGhlXG4gKiBgbm93KClgIGdldHRlciBtZXRob2QuXG4gKlxuICogRWFjaCB1bml0IG9mIHdvcmsgaW4gYSBTY2hlZHVsZXIgaXMgY2FsbGVkIGFuIHtAbGluayBBY3Rpb259LlxuICpcbiAqIGBgYHRzXG4gKiBjbGFzcyBTY2hlZHVsZXIge1xuICogICBub3coKTogbnVtYmVyO1xuICogICBzY2hlZHVsZSh3b3JrLCBkZWxheT8sIHN0YXRlPyk6IFN1YnNjcmlwdGlvbjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBjbGFzcyBTY2hlZHVsZXJcbiAqL1xudmFyIFNjaGVkdWxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2NoZWR1bGVyKFNjaGVkdWxlckFjdGlvbiwgbm93KSB7XG4gICAgICAgIGlmIChub3cgPT09IHZvaWQgMCkgeyBub3cgPSBTY2hlZHVsZXIubm93OyB9XG4gICAgICAgIHRoaXMuU2NoZWR1bGVyQWN0aW9uID0gU2NoZWR1bGVyQWN0aW9uO1xuICAgICAgICB0aGlzLm5vdyA9IG5vdztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGEgZnVuY3Rpb24sIGB3b3JrYCwgZm9yIGV4ZWN1dGlvbi4gTWF5IGhhcHBlbiBhdCBzb21lIHBvaW50IGluXG4gICAgICogdGhlIGZ1dHVyZSwgYWNjb3JkaW5nIHRvIHRoZSBgZGVsYXlgIHBhcmFtZXRlciwgaWYgc3BlY2lmaWVkLiBNYXkgYmUgcGFzc2VkXG4gICAgICogc29tZSBjb250ZXh0IG9iamVjdCwgYHN0YXRlYCwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGB3b3JrYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBnaXZlbiBhcmd1bWVudHMgd2lsbCBiZSBwcm9jZXNzZWQgYW4gc3RvcmVkIGFzIGFuIEFjdGlvbiBvYmplY3QgaW4gYVxuICAgICAqIHF1ZXVlIG9mIGFjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0YXRlOiA/VCk6ID9TdWJzY3JpcHRpb259IHdvcmsgQSBmdW5jdGlvbiByZXByZXNlbnRpbmcgYVxuICAgICAqIHRhc2ssIG9yIHNvbWUgdW5pdCBvZiB3b3JrIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBTY2hlZHVsZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gVGltZSB0byB3YWl0IGJlZm9yZSBleGVjdXRpbmcgdGhlIHdvcmssIHdoZXJlIHRoZVxuICAgICAqIHRpbWUgdW5pdCBpcyBpbXBsaWNpdCBhbmQgZGVmaW5lZCBieSB0aGUgU2NoZWR1bGVyIGl0c2VsZi5cbiAgICAgKiBAcGFyYW0ge1R9IFtzdGF0ZV0gU29tZSBjb250ZXh0dWFsIGRhdGEgdGhhdCB0aGUgYHdvcmtgIGZ1bmN0aW9uIHVzZXMgd2hlblxuICAgICAqIGNhbGxlZCBieSB0aGUgU2NoZWR1bGVyLlxuICAgICAqIEByZXR1cm4ge1N1YnNjcmlwdGlvbn0gQSBzdWJzY3JpcHRpb24gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1bnN1YnNjcmliZVxuICAgICAqIHRoZSBzY2hlZHVsZWQgd29yay5cbiAgICAgKi9cbiAgICBTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHdvcmssIGRlbGF5LCBzdGF0ZSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLlNjaGVkdWxlckFjdGlvbih0aGlzLCB3b3JrKS5zY2hlZHVsZShzdGF0ZSwgZGVsYXkpO1xuICAgIH07XG4gICAgU2NoZWR1bGVyLm5vdyA9IERhdGUubm93ID8gRGF0ZS5ub3cgOiBmdW5jdGlvbiAoKSB7IHJldHVybiArbmV3IERhdGUoKTsgfTtcbiAgICByZXR1cm4gU2NoZWR1bGVyO1xufSgpKTtcbmV4cG9ydHMuU2NoZWR1bGVyID0gU2NoZWR1bGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NoZWR1bGVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL1NjaGVkdWxlci5qc1xuLy8gbW9kdWxlIGlkID0gNDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  729. /***/ },
  730. /* 419 */
  731. /***/ function(module, exports, __webpack_require__) {
  732. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar merge_1 = __webpack_require__(420);\nObservable_1.Observable.merge = merge_1.merge;\n//# sourceMappingURL=merge.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL21lcmdlLmpzPzQ3OGQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIG1lcmdlXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL21lcmdlJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5tZXJnZSA9IG1lcmdlXzEubWVyZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9tZXJnZS5qc1xuLy8gbW9kdWxlIGlkID0gNDE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  733. /***/ },
  734. /* 420 */
  735. /***/ function(module, exports, __webpack_require__) {
  736. eval("\"use strict\";\nvar merge_1 = __webpack_require__(421);\nexports.merge = merge_1.mergeStatic;\n//# sourceMappingURL=merge.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvbWVyZ2UuanM/YWM3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBtZXJnZV8xID0gcmVxdWlyZSgnLi4vb3BlcmF0b3IvbWVyZ2UnKTtcbmV4cG9ydHMubWVyZ2UgPSBtZXJnZV8xLm1lcmdlU3RhdGljO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVyZ2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9tZXJnZS5qc1xuLy8gbW9kdWxlIGlkID0gNDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  737. /***/ },
  738. /* 421 */
  739. /***/ function(module, exports, __webpack_require__) {
  740. eval("\"use strict\";\nvar ArrayObservable_1 = __webpack_require__(39);\nvar mergeAll_1 = __webpack_require__(59);\nvar isScheduler_1 = __webpack_require__(42);\n/* tslint:disable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (either the source or an\n * Observable given as argument), and simply forwards (without doing any\n * transformation) all the values from all the input Observables to the output\n * Observable. The output Observable only completes once all input Observables\n * have completed. Any error delivered by an input Observable will be immediately\n * emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = clicks.merge(timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = timer1.merge(timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {Observable} other An input Observable to merge with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @method merge\n * @owner Observable\n */\nfunction merge() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n return this.lift.call(mergeStatic.apply(void 0, [this].concat(observables)));\n}\nexports.merge = merge;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * <span class=\"informal\">Flattens multiple Observables together by blending\n * their values into one Observable.</span>\n *\n * <img src=\"./img/merge.png\" width=\"100%\">\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * @example <caption>Merge together two Observables: 1s interval and clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var clicksOrTimer = Rx.Observable.merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n *\n * @example <caption>Merge together 3 Observables, but only 2 run concurrently</caption>\n * var timer1 = Rx.Observable.interval(1000).take(10);\n * var timer2 = Rx.Observable.interval(2000).take(6);\n * var timer3 = Rx.Observable.interval(500).take(10);\n * var concurrent = 2; // the argument\n * var merged = Rx.Observable.merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits it's max iteration, timer2 will\n * // continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits it's max iteration it terminates, and\n * // timer3 will continue to emit a value every 500ms until it is complete\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...Observable} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nfunction mergeStatic() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n var concurrent = Number.POSITIVE_INFINITY;\n var scheduler = null;\n var last = observables[observables.length - 1];\n if (isScheduler_1.isScheduler(last)) {\n scheduler = observables.pop();\n if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n concurrent = observables.pop();\n }\n }\n else if (typeof last === 'number') {\n concurrent = observables.pop();\n }\n if (scheduler === null && observables.length === 1) {\n return observables[0];\n }\n return new ArrayObservable_1.ArrayObservable(observables, scheduler).lift(new mergeAll_1.MergeAllOperator(concurrent));\n}\nexports.mergeStatic = mergeStatic;\n//# sourceMappingURL=merge.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21lcmdlLmpzP2FiMjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQXJyYXlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9vYnNlcnZhYmxlL0FycmF5T2JzZXJ2YWJsZScpO1xudmFyIG1lcmdlQWxsXzEgPSByZXF1aXJlKCcuL21lcmdlQWxsJyk7XG52YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNTY2hlZHVsZXInKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIG91dHB1dCBPYnNlcnZhYmxlIHdoaWNoIGNvbmN1cnJlbnRseSBlbWl0cyBhbGwgdmFsdWVzIGZyb20gZXZlcnlcbiAqIGdpdmVuIGlucHV0IE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkZsYXR0ZW5zIG11bHRpcGxlIE9ic2VydmFibGVzIHRvZ2V0aGVyIGJ5IGJsZW5kaW5nXG4gKiB0aGVpciB2YWx1ZXMgaW50byBvbmUgT2JzZXJ2YWJsZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9tZXJnZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgbWVyZ2VgIHN1YnNjcmliZXMgdG8gZWFjaCBnaXZlbiBpbnB1dCBPYnNlcnZhYmxlIChlaXRoZXIgdGhlIHNvdXJjZSBvciBhblxuICogT2JzZXJ2YWJsZSBnaXZlbiBhcyBhcmd1bWVudCksIGFuZCBzaW1wbHkgZm9yd2FyZHMgKHdpdGhvdXQgZG9pbmcgYW55XG4gKiB0cmFuc2Zvcm1hdGlvbikgYWxsIHRoZSB2YWx1ZXMgZnJvbSBhbGwgdGhlIGlucHV0IE9ic2VydmFibGVzIHRvIHRoZSBvdXRwdXRcbiAqIE9ic2VydmFibGUuIFRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBvbmx5IGNvbXBsZXRlcyBvbmNlIGFsbCBpbnB1dCBPYnNlcnZhYmxlc1xuICogaGF2ZSBjb21wbGV0ZWQuIEFueSBlcnJvciBkZWxpdmVyZWQgYnkgYW4gaW5wdXQgT2JzZXJ2YWJsZSB3aWxsIGJlIGltbWVkaWF0ZWx5XG4gKiBlbWl0dGVkIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5NZXJnZSB0b2dldGhlciB0d28gT2JzZXJ2YWJsZXM6IDFzIGludGVydmFsIGFuZCBjbGlja3M8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHRpbWVyID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAqIHZhciBjbGlja3NPclRpbWVyID0gY2xpY2tzLm1lcmdlKHRpbWVyKTtcbiAqIGNsaWNrc09yVGltZXIuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPk1lcmdlIHRvZ2V0aGVyIDMgT2JzZXJ2YWJsZXMsIGJ1dCBvbmx5IDIgcnVuIGNvbmN1cnJlbnRseTwvY2FwdGlvbj5cbiAqIHZhciB0aW1lcjEgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApLnRha2UoMTApO1xuICogdmFyIHRpbWVyMiA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMjAwMCkudGFrZSg2KTtcbiAqIHZhciB0aW1lcjMgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDUwMCkudGFrZSgxMCk7XG4gKiB2YXIgY29uY3VycmVudCA9IDI7IC8vIHRoZSBhcmd1bWVudFxuICogdmFyIG1lcmdlZCA9IHRpbWVyMS5tZXJnZSh0aW1lcjIsIHRpbWVyMywgY29uY3VycmVudCk7XG4gKiBtZXJnZWQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIG1lcmdlQWxsfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VNYXB9XG4gKiBAc2VlIHtAbGluayBtZXJnZU1hcFRvfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VTY2FufVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb3RoZXIgQW4gaW5wdXQgT2JzZXJ2YWJsZSB0byBtZXJnZSB3aXRoIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIE1vcmUgdGhhbiBvbmUgaW5wdXQgT2JzZXJ2YWJsZXMgbWF5IGJlIGdpdmVuIGFzIGFyZ3VtZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW50PU51bWJlci5QT1NJVElWRV9JTkZJTklUWV0gTWF4aW11bSBudW1iZXIgb2YgaW5wdXRcbiAqIE9ic2VydmFibGVzIGJlaW5nIHN1YnNjcmliZWQgdG8gY29uY3VycmVudGx5LlxuICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXI9bnVsbF0gVGhlIFNjaGVkdWxlciB0byB1c2UgZm9yIG1hbmFnaW5nXG4gKiBjb25jdXJyZW5jeSBvZiBpbnB1dCBPYnNlcnZhYmxlcy5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBpdGVtcyB0aGF0IGFyZSB0aGUgcmVzdWx0IG9mXG4gKiBldmVyeSBpbnB1dCBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBtZXJnZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIG9ic2VydmFibGVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgb2JzZXJ2YWJsZXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQuY2FsbChtZXJnZVN0YXRpYy5hcHBseSh2b2lkIDAsIFt0aGlzXS5jb25jYXQob2JzZXJ2YWJsZXMpKSk7XG59XG5leHBvcnRzLm1lcmdlID0gbWVyZ2U7XG4vKiB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIG91dHB1dCBPYnNlcnZhYmxlIHdoaWNoIGNvbmN1cnJlbnRseSBlbWl0cyBhbGwgdmFsdWVzIGZyb20gZXZlcnlcbiAqIGdpdmVuIGlucHV0IE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkZsYXR0ZW5zIG11bHRpcGxlIE9ic2VydmFibGVzIHRvZ2V0aGVyIGJ5IGJsZW5kaW5nXG4gKiB0aGVpciB2YWx1ZXMgaW50byBvbmUgT2JzZXJ2YWJsZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9tZXJnZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgbWVyZ2VgIHN1YnNjcmliZXMgdG8gZWFjaCBnaXZlbiBpbnB1dCBPYnNlcnZhYmxlIChhcyBhcmd1bWVudHMpLCBhbmQgc2ltcGx5XG4gKiBmb3J3YXJkcyAod2l0aG91dCBkb2luZyBhbnkgdHJhbnNmb3JtYXRpb24pIGFsbCB0aGUgdmFsdWVzIGZyb20gYWxsIHRoZSBpbnB1dFxuICogT2JzZXJ2YWJsZXMgdG8gdGhlIG91dHB1dCBPYnNlcnZhYmxlLiBUaGUgb3V0cHV0IE9ic2VydmFibGUgb25seSBjb21wbGV0ZXNcbiAqIG9uY2UgYWxsIGlucHV0IE9ic2VydmFibGVzIGhhdmUgY29tcGxldGVkLiBBbnkgZXJyb3IgZGVsaXZlcmVkIGJ5IGFuIGlucHV0XG4gKiBPYnNlcnZhYmxlIHdpbGwgYmUgaW1tZWRpYXRlbHkgZW1pdHRlZCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+TWVyZ2UgdG9nZXRoZXIgdHdvIE9ic2VydmFibGVzOiAxcyBpbnRlcnZhbCBhbmQgY2xpY2tzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciB0aW1lciA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG4gKiB2YXIgY2xpY2tzT3JUaW1lciA9IFJ4Lk9ic2VydmFibGUubWVyZ2UoY2xpY2tzLCB0aW1lcik7XG4gKiBjbGlja3NPclRpbWVyLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiAvLyBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6XG4gKiAvLyB0aW1lciB3aWxsIGVtaXQgYXNjZW5kaW5nIHZhbHVlcywgb25lIGV2ZXJ5IHNlY29uZCgxMDAwbXMpIHRvIGNvbnNvbGVcbiAqIC8vIGNsaWNrcyBsb2dzIE1vdXNlRXZlbnRzIHRvIGNvbnNvbGUgZXZlcnl0aW1lIHRoZSBcImRvY3VtZW50XCIgaXMgY2xpY2tlZFxuICogLy8gU2luY2UgdGhlIHR3byBzdHJlYW1zIGFyZSBtZXJnZWQgeW91IHNlZSB0aGVzZSBoYXBwZW5pbmdcbiAqIC8vIGFzIHRoZXkgb2NjdXIuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+TWVyZ2UgdG9nZXRoZXIgMyBPYnNlcnZhYmxlcywgYnV0IG9ubHkgMiBydW4gY29uY3VycmVudGx5PC9jYXB0aW9uPlxuICogdmFyIHRpbWVyMSA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCkudGFrZSgxMCk7XG4gKiB2YXIgdGltZXIyID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgyMDAwKS50YWtlKDYpO1xuICogdmFyIHRpbWVyMyA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoNTAwKS50YWtlKDEwKTtcbiAqIHZhciBjb25jdXJyZW50ID0gMjsgLy8gdGhlIGFyZ3VtZW50XG4gKiB2YXIgbWVyZ2VkID0gUnguT2JzZXJ2YWJsZS5tZXJnZSh0aW1lcjEsIHRpbWVyMiwgdGltZXIzLCBjb25jdXJyZW50KTtcbiAqIG1lcmdlZC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gLSBGaXJzdCB0aW1lcjEgYW5kIHRpbWVyMiB3aWxsIHJ1biBjb25jdXJyZW50bHlcbiAqIC8vIC0gdGltZXIxIHdpbGwgZW1pdCBhIHZhbHVlIGV2ZXJ5IDEwMDBtcyBmb3IgMTAgaXRlcmF0aW9uc1xuICogLy8gLSB0aW1lcjIgd2lsbCBlbWl0IGEgdmFsdWUgZXZlcnkgMjAwMG1zIGZvciA2IGl0ZXJhdGlvbnNcbiAqIC8vIC0gYWZ0ZXIgdGltZXIxIGhpdHMgaXQncyBtYXggaXRlcmF0aW9uLCB0aW1lcjIgd2lsbFxuICogLy8gICBjb250aW51ZSwgYW5kIHRpbWVyMyB3aWxsIHN0YXJ0IHRvIHJ1biBjb25jdXJyZW50bHkgd2l0aCB0aW1lcjJcbiAqIC8vIC0gd2hlbiB0aW1lcjIgaGl0cyBpdCdzIG1heCBpdGVyYXRpb24gaXQgdGVybWluYXRlcywgYW5kXG4gKiAvLyAgIHRpbWVyMyB3aWxsIGNvbnRpbnVlIHRvIGVtaXQgYSB2YWx1ZSBldmVyeSA1MDBtcyB1bnRpbCBpdCBpcyBjb21wbGV0ZVxuICpcbiAqIEBzZWUge0BsaW5rIG1lcmdlQWxsfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VNYXB9XG4gKiBAc2VlIHtAbGluayBtZXJnZU1hcFRvfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VTY2FufVxuICpcbiAqIEBwYXJhbSB7Li4uT2JzZXJ2YWJsZX0gb2JzZXJ2YWJsZXMgSW5wdXQgT2JzZXJ2YWJsZXMgdG8gbWVyZ2UgdG9nZXRoZXIuXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmN1cnJlbnQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXSBNYXhpbXVtIG51bWJlciBvZiBpbnB1dFxuICogT2JzZXJ2YWJsZXMgYmVpbmcgc3Vic2NyaWJlZCB0byBjb25jdXJyZW50bHkuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1udWxsXSBUaGUgU2NoZWR1bGVyIHRvIHVzZSBmb3IgbWFuYWdpbmdcbiAqIGNvbmN1cnJlbmN5IG9mIGlucHV0IE9ic2VydmFibGVzLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW1zIHRoYXQgYXJlIHRoZSByZXN1bHQgb2ZcbiAqIGV2ZXJ5IGlucHV0IE9ic2VydmFibGUuXG4gKiBAc3RhdGljIHRydWVcbiAqIEBuYW1lIG1lcmdlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBtZXJnZVN0YXRpYygpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBvYnNlcnZhYmxlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgdmFyIHNjaGVkdWxlciA9IG51bGw7XG4gICAgdmFyIGxhc3QgPSBvYnNlcnZhYmxlc1tvYnNlcnZhYmxlcy5sZW5ndGggLSAxXTtcbiAgICBpZiAoaXNTY2hlZHVsZXJfMS5pc1NjaGVkdWxlcihsYXN0KSkge1xuICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTtcbiAgICAgICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uY3VycmVudCA9IG9ic2VydmFibGVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25jdXJyZW50ID0gb2JzZXJ2YWJsZXMucG9wKCk7XG4gICAgfVxuICAgIGlmIChzY2hlZHVsZXIgPT09IG51bGwgJiYgb2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheU9ic2VydmFibGVfMS5BcnJheU9ic2VydmFibGUob2JzZXJ2YWJsZXMsIHNjaGVkdWxlcikubGlmdChuZXcgbWVyZ2VBbGxfMS5NZXJnZUFsbE9wZXJhdG9yKGNvbmN1cnJlbnQpKTtcbn1cbmV4cG9ydHMubWVyZ2VTdGF0aWMgPSBtZXJnZVN0YXRpYztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL21lcmdlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MjFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  741. /***/ },
  742. /* 422 */
  743. /***/ function(module, exports, __webpack_require__) {
  744. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar race_1 = __webpack_require__(423);\nObservable_1.Observable.race = race_1.raceStatic;\n//# sourceMappingURL=race.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3JhY2UuanM/ZjA3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcmFjZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvcmFjZScpO1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUucmFjZSA9IHJhY2VfMS5yYWNlU3RhdGljO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFjZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9yYWNlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MjJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  745. /***/ },
  746. /* 423 */
  747. /***/ function(module, exports, __webpack_require__) {
  748. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isArray_1 = __webpack_require__(12);\nvar ArrayObservable_1 = __webpack_require__(39);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that mirrors the first source Observable to emit an item\n * from the combination of this Observable and supplied Observables\n * @param {...Observables} ...observables sources used to race for which Observable emits first.\n * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.\n * @method race\n * @owner Observable\n */\nfunction race() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n // if the only argument is an array, it was most likely called with\n // `pair([obs1, obs2, ...])`\n if (observables.length === 1 && isArray_1.isArray(observables[0])) {\n observables = observables[0];\n }\n return this.lift.call(raceStatic.apply(void 0, [this].concat(observables)));\n}\nexports.race = race;\nfunction raceStatic() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n // if the only argument is an array, it was most likely called with\n // `pair([obs1, obs2, ...])`\n if (observables.length === 1) {\n if (isArray_1.isArray(observables[0])) {\n observables = observables[0];\n }\n else {\n return observables[0];\n }\n }\n return new ArrayObservable_1.ArrayObservable(observables).lift(new RaceOperator());\n}\nexports.raceStatic = raceStatic;\nvar RaceOperator = (function () {\n function RaceOperator() {\n }\n RaceOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new RaceSubscriber(subscriber));\n };\n return RaceOperator;\n}());\nexports.RaceOperator = RaceOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RaceSubscriber = (function (_super) {\n __extends(RaceSubscriber, _super);\n function RaceSubscriber(destination) {\n _super.call(this, destination);\n this.hasFirst = false;\n this.observables = [];\n this.subscriptions = [];\n }\n RaceSubscriber.prototype._next = function (observable) {\n this.observables.push(observable);\n };\n RaceSubscriber.prototype._complete = function () {\n var observables = this.observables;\n var len = observables.length;\n if (len === 0) {\n this.destination.complete();\n }\n else {\n for (var i = 0; i < len && !this.hasFirst; i++) {\n var observable = observables[i];\n var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);\n if (this.subscriptions) {\n this.subscriptions.push(subscription);\n }\n this.add(subscription);\n }\n this.observables = null;\n }\n };\n RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n if (!this.hasFirst) {\n this.hasFirst = true;\n for (var i = 0; i < this.subscriptions.length; i++) {\n if (i !== outerIndex) {\n var subscription = this.subscriptions[i];\n subscription.unsubscribe();\n this.remove(subscription);\n }\n }\n this.subscriptions = null;\n }\n this.destination.next(innerValue);\n };\n return RaceSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.RaceSubscriber = RaceSubscriber;\n//# sourceMappingURL=race.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3JhY2UuanM/YWQ5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIGlzQXJyYXlfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNBcnJheScpO1xudmFyIEFycmF5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9BcnJheU9ic2VydmFibGUnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgbWlycm9ycyB0aGUgZmlyc3Qgc291cmNlIE9ic2VydmFibGUgdG8gZW1pdCBhbiBpdGVtXG4gKiBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiB0aGlzIE9ic2VydmFibGUgYW5kIHN1cHBsaWVkIE9ic2VydmFibGVzXG4gKiBAcGFyYW0gey4uLk9ic2VydmFibGVzfSAuLi5vYnNlcnZhYmxlcyBzb3VyY2VzIHVzZWQgdG8gcmFjZSBmb3Igd2hpY2ggT2JzZXJ2YWJsZSBlbWl0cyBmaXJzdC5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBtaXJyb3JzIHRoZSBvdXRwdXQgb2YgdGhlIGZpcnN0IE9ic2VydmFibGUgdG8gZW1pdCBhbiBpdGVtLlxuICogQG1ldGhvZCByYWNlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiByYWNlKCkge1xuICAgIHZhciBvYnNlcnZhYmxlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIG9ic2VydmFibGVzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgb25seSBhcmd1bWVudCBpcyBhbiBhcnJheSwgaXQgd2FzIG1vc3QgbGlrZWx5IGNhbGxlZCB3aXRoXG4gICAgLy8gYHBhaXIoW29iczEsIG9iczIsIC4uLl0pYFxuICAgIGlmIChvYnNlcnZhYmxlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheV8xLmlzQXJyYXkob2JzZXJ2YWJsZXNbMF0pKSB7XG4gICAgICAgIG9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXNbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQuY2FsbChyYWNlU3RhdGljLmFwcGx5KHZvaWQgMCwgW3RoaXNdLmNvbmNhdChvYnNlcnZhYmxlcykpKTtcbn1cbmV4cG9ydHMucmFjZSA9IHJhY2U7XG5mdW5jdGlvbiByYWNlU3RhdGljKCkge1xuICAgIHZhciBvYnNlcnZhYmxlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIG9ic2VydmFibGVzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgb25seSBhcmd1bWVudCBpcyBhbiBhcnJheSwgaXQgd2FzIG1vc3QgbGlrZWx5IGNhbGxlZCB3aXRoXG4gICAgLy8gYHBhaXIoW29iczEsIG9iczIsIC4uLl0pYFxuICAgIGlmIChvYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKGlzQXJyYXlfMS5pc0FycmF5KG9ic2VydmFibGVzWzBdKSkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlc1swXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlc1swXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5T2JzZXJ2YWJsZV8xLkFycmF5T2JzZXJ2YWJsZShvYnNlcnZhYmxlcykubGlmdChuZXcgUmFjZU9wZXJhdG9yKCkpO1xufVxuZXhwb3J0cy5yYWNlU3RhdGljID0gcmFjZVN0YXRpYztcbnZhciBSYWNlT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJhY2VPcGVyYXRvcigpIHtcbiAgICB9XG4gICAgUmFjZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmFjZVN1YnNjcmliZXIoc3Vic2NyaWJlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFJhY2VPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLlJhY2VPcGVyYXRvciA9IFJhY2VPcGVyYXRvcjtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgUmFjZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSYWNlU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSYWNlU3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaGFzRmlyc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlcyA9IFtdO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgUmFjZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKG9ic2VydmFibGUpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlcy5wdXNoKG9ic2VydmFibGUpO1xuICAgIH07XG4gICAgUmFjZVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGVzID0gdGhpcy5vYnNlcnZhYmxlcztcbiAgICAgICAgdmFyIGxlbiA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4gJiYgIXRoaXMuaGFzRmlyc3Q7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgb2JzZXJ2YWJsZSwgb2JzZXJ2YWJsZSwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJhY2VTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNGaXJzdCkge1xuICAgICAgICAgICAgdGhpcy5oYXNGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSBvdXRlckluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShzdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGlubmVyVmFsdWUpO1xuICAgIH07XG4gICAgcmV0dXJuIFJhY2VTdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbmV4cG9ydHMuUmFjZVN1YnNjcmliZXIgPSBSYWNlU3Vic2NyaWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhY2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcmFjZS5qc1xuLy8gbW9kdWxlIGlkID0gNDIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  749. /***/ },
  750. /* 424 */
  751. /***/ function(module, exports, __webpack_require__) {
  752. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar never_1 = __webpack_require__(425);\nObservable_1.Observable.never = never_1.never;\n//# sourceMappingURL=never.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL25ldmVyLmpzPzBkYjAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIG5ldmVyXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL25ldmVyJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5uZXZlciA9IG5ldmVyXzEubmV2ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZXZlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9uZXZlci5qc1xuLy8gbW9kdWxlIGlkID0gNDI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  753. /***/ },
  754. /* 425 */
  755. /***/ function(module, exports, __webpack_require__) {
  756. eval("\"use strict\";\nvar NeverObservable_1 = __webpack_require__(426);\nexports.never = NeverObservable_1.NeverObservable.create;\n//# sourceMappingURL=never.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvbmV2ZXIuanM/ODRhMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBOZXZlck9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vTmV2ZXJPYnNlcnZhYmxlJyk7XG5leHBvcnRzLm5ldmVyID0gTmV2ZXJPYnNlcnZhYmxlXzEuTmV2ZXJPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5ldmVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvbmV2ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  757. /***/ },
  758. /* 426 */
  759. /***/ function(module, exports, __webpack_require__) {
  760. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar noop_1 = __webpack_require__(427);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar NeverObservable = (function (_super) {\n __extends(NeverObservable, _super);\n function NeverObservable() {\n _super.call(this);\n }\n /**\n * Creates an Observable that emits no items to the Observer.\n *\n * <span class=\"informal\">An Observable that never emits anything.</span>\n *\n * <img src=\"./img/never.png\" width=\"100%\">\n *\n * This static operator is useful for creating a simple Observable that emits\n * neither values nor errors nor the completion notification. It can be used\n * for testing purposes or for composing with other Observables. Please not\n * that by never emitting a complete notification, this Observable keeps the\n * subscription from being disposed automatically. Subscriptions need to be\n * manually disposed.\n *\n * @example <caption>Emit the number 7, then never emit anything else (not even complete).</caption>\n * function info() {\n * console.log('Will not be called');\n * }\n * var result = Rx.Observable.never().startWith(7);\n * result.subscribe(x => console.log(x), info, info);\n *\n * @see {@link create}\n * @see {@link empty}\n * @see {@link of}\n * @see {@link throw}\n *\n * @return {Observable} A \"never\" Observable: never emits anything.\n * @static true\n * @name never\n * @owner Observable\n */\n NeverObservable.create = function () {\n return new NeverObservable();\n };\n NeverObservable.prototype._subscribe = function (subscriber) {\n noop_1.noop();\n };\n return NeverObservable;\n}(Observable_1.Observable));\nexports.NeverObservable = NeverObservable;\n//# sourceMappingURL=NeverObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvTmV2ZXJPYnNlcnZhYmxlLmpzP2NkN2QiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgbm9vcF8xID0gcmVxdWlyZSgnLi4vdXRpbC9ub29wJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIE5ldmVyT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5ldmVyT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXZlck9ic2VydmFibGUoKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBubyBpdGVtcyB0byB0aGUgT2JzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+QW4gT2JzZXJ2YWJsZSB0aGF0IG5ldmVyIGVtaXRzIGFueXRoaW5nLjwvc3Bhbj5cbiAgICAgKlxuICAgICAqIDxpbWcgc3JjPVwiLi9pbWcvbmV2ZXIucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICpcbiAgICAgKiBUaGlzIHN0YXRpYyBvcGVyYXRvciBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIGEgc2ltcGxlIE9ic2VydmFibGUgdGhhdCBlbWl0c1xuICAgICAqIG5laXRoZXIgdmFsdWVzIG5vciBlcnJvcnMgbm9yIHRoZSBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbi4gSXQgY2FuIGJlIHVzZWRcbiAgICAgKiBmb3IgdGVzdGluZyBwdXJwb3NlcyBvciBmb3IgY29tcG9zaW5nIHdpdGggb3RoZXIgT2JzZXJ2YWJsZXMuIFBsZWFzZSBub3RcbiAgICAgKiB0aGF0IGJ5IG5ldmVyIGVtaXR0aW5nIGEgY29tcGxldGUgbm90aWZpY2F0aW9uLCB0aGlzIE9ic2VydmFibGUga2VlcHMgdGhlXG4gICAgICogc3Vic2NyaXB0aW9uIGZyb20gYmVpbmcgZGlzcG9zZWQgYXV0b21hdGljYWxseS4gU3Vic2NyaXB0aW9ucyBuZWVkIHRvIGJlXG4gICAgICogbWFudWFsbHkgZGlzcG9zZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5FbWl0IHRoZSBudW1iZXIgNywgdGhlbiBuZXZlciBlbWl0IGFueXRoaW5nIGVsc2UgKG5vdCBldmVuIGNvbXBsZXRlKS48L2NhcHRpb24+XG4gICAgICogZnVuY3Rpb24gaW5mbygpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdXaWxsIG5vdCBiZSBjYWxsZWQnKTtcbiAgICAgKiB9XG4gICAgICogdmFyIHJlc3VsdCA9IFJ4Lk9ic2VydmFibGUubmV2ZXIoKS5zdGFydFdpdGgoNyk7XG4gICAgICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpLCBpbmZvLCBpbmZvKTtcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGNyZWF0ZX1cbiAgICAgKiBAc2VlIHtAbGluayBlbXB0eX1cbiAgICAgKiBAc2VlIHtAbGluayBvZn1cbiAgICAgKiBAc2VlIHtAbGluayB0aHJvd31cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGV9IEEgXCJuZXZlclwiIE9ic2VydmFibGU6IG5ldmVyIGVtaXRzIGFueXRoaW5nLlxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIG5ldmVyXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBOZXZlck9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IE5ldmVyT2JzZXJ2YWJsZSgpO1xuICAgIH07XG4gICAgTmV2ZXJPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgbm9vcF8xLm5vb3AoKTtcbiAgICB9O1xuICAgIHJldHVybiBOZXZlck9ic2VydmFibGU7XG59KE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSk7XG5leHBvcnRzLk5ldmVyT2JzZXJ2YWJsZSA9IE5ldmVyT2JzZXJ2YWJsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5ldmVyT2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL05ldmVyT2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  761. /***/ },
  762. /* 427 */
  763. /***/ function(module, exports) {
  764. eval("\"use strict\";\n/* tslint:disable:no-empty */\nfunction noop() { }\nexports.noop = noop;\n//# sourceMappingURL=noop.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvbm9vcC5qcz83MTY4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLyogdHNsaW50OmRpc2FibGU6bm8tZW1wdHkgKi9cbmZ1bmN0aW9uIG5vb3AoKSB7IH1cbmV4cG9ydHMubm9vcCA9IG5vb3A7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3V0aWwvbm9vcC5qc1xuLy8gbW9kdWxlIGlkID0gNDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  765. /***/ },
  766. /* 428 */
  767. /***/ function(module, exports, __webpack_require__) {
  768. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar of_1 = __webpack_require__(46);\nObservable_1.Observable.of = of_1.of;\n//# sourceMappingURL=of.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL29mLmpzPzQxNTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIG9mXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL29mJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5vZiA9IG9mXzEub2Y7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vZi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9vZi5qc1xuLy8gbW9kdWxlIGlkID0gNDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  769. /***/ },
  770. /* 429 */
  771. /***/ function(module, exports, __webpack_require__) {
  772. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar onErrorResumeNext_1 = __webpack_require__(430);\nObservable_1.Observable.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNextStatic;\n//# sourceMappingURL=onErrorResumeNext.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL29uRXJyb3JSZXN1bWVOZXh0LmpzPzAwYjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIG9uRXJyb3JSZXN1bWVOZXh0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9vbkVycm9yUmVzdW1lTmV4dCcpO1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUub25FcnJvclJlc3VtZU5leHQgPSBvbkVycm9yUmVzdW1lTmV4dF8xLm9uRXJyb3JSZXN1bWVOZXh0U3RhdGljO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25FcnJvclJlc3VtZU5leHQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvb25FcnJvclJlc3VtZU5leHQuanNcbi8vIG1vZHVsZSBpZCA9IDQyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  773. /***/ },
  774. /* 430 */
  775. /***/ function(module, exports, __webpack_require__) {
  776. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar FromObservable_1 = __webpack_require__(35);\nvar isArray_1 = __webpack_require__(12);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\nfunction onErrorResumeNext() {\n var nextSources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n nextSources[_i - 0] = arguments[_i];\n }\n if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {\n nextSources = nextSources[0];\n }\n return this.lift(new OnErrorResumeNextOperator(nextSources));\n}\nexports.onErrorResumeNext = onErrorResumeNext;\n/* tslint:enable:max-line-length */\nfunction onErrorResumeNextStatic() {\n var nextSources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n nextSources[_i - 0] = arguments[_i];\n }\n var source = null;\n if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {\n nextSources = nextSources[0];\n }\n source = nextSources.shift();\n return new FromObservable_1.FromObservable(source, null).lift(new OnErrorResumeNextOperator(nextSources));\n}\nexports.onErrorResumeNextStatic = onErrorResumeNextStatic;\nvar OnErrorResumeNextOperator = (function () {\n function OnErrorResumeNextOperator(nextSources) {\n this.nextSources = nextSources;\n }\n OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));\n };\n return OnErrorResumeNextOperator;\n}());\nvar OnErrorResumeNextSubscriber = (function (_super) {\n __extends(OnErrorResumeNextSubscriber, _super);\n function OnErrorResumeNextSubscriber(destination, nextSources) {\n _super.call(this, destination);\n this.destination = destination;\n this.nextSources = nextSources;\n }\n OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {\n this.subscribeToNextSource();\n };\n OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {\n this.subscribeToNextSource();\n };\n OnErrorResumeNextSubscriber.prototype._error = function (err) {\n this.subscribeToNextSource();\n };\n OnErrorResumeNextSubscriber.prototype._complete = function () {\n this.subscribeToNextSource();\n };\n OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {\n var next = this.nextSources.shift();\n if (next) {\n this.add(subscribeToResult_1.subscribeToResult(this, next));\n }\n else {\n this.destination.complete();\n }\n };\n return OnErrorResumeNextSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=onErrorResumeNext.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL29uRXJyb3JSZXN1bWVOZXh0LmpzPzU4MTMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBGcm9tT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9Gcm9tT2JzZXJ2YWJsZScpO1xudmFyIGlzQXJyYXlfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNBcnJheScpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuZnVuY3Rpb24gb25FcnJvclJlc3VtZU5leHQoKSB7XG4gICAgdmFyIG5leHRTb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgbmV4dFNvdXJjZXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIGlmIChuZXh0U291cmNlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheV8xLmlzQXJyYXkobmV4dFNvdXJjZXNbMF0pKSB7XG4gICAgICAgIG5leHRTb3VyY2VzID0gbmV4dFNvdXJjZXNbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE9uRXJyb3JSZXN1bWVOZXh0T3BlcmF0b3IobmV4dFNvdXJjZXMpKTtcbn1cbmV4cG9ydHMub25FcnJvclJlc3VtZU5leHQgPSBvbkVycm9yUmVzdW1lTmV4dDtcbi8qIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoICovXG5mdW5jdGlvbiBvbkVycm9yUmVzdW1lTmV4dFN0YXRpYygpIHtcbiAgICB2YXIgbmV4dFNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBuZXh0U291cmNlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHNvdXJjZSA9IG51bGw7XG4gICAgaWYgKG5leHRTb3VyY2VzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5XzEuaXNBcnJheShuZXh0U291cmNlc1swXSkpIHtcbiAgICAgICAgbmV4dFNvdXJjZXMgPSBuZXh0U291cmNlc1swXTtcbiAgICB9XG4gICAgc291cmNlID0gbmV4dFNvdXJjZXMuc2hpZnQoKTtcbiAgICByZXR1cm4gbmV3IEZyb21PYnNlcnZhYmxlXzEuRnJvbU9ic2VydmFibGUoc291cmNlLCBudWxsKS5saWZ0KG5ldyBPbkVycm9yUmVzdW1lTmV4dE9wZXJhdG9yKG5leHRTb3VyY2VzKSk7XG59XG5leHBvcnRzLm9uRXJyb3JSZXN1bWVOZXh0U3RhdGljID0gb25FcnJvclJlc3VtZU5leHRTdGF0aWM7XG52YXIgT25FcnJvclJlc3VtZU5leHRPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT25FcnJvclJlc3VtZU5leHRPcGVyYXRvcihuZXh0U291cmNlcykge1xuICAgICAgICB0aGlzLm5leHRTb3VyY2VzID0gbmV4dFNvdXJjZXM7XG4gICAgfVxuICAgIE9uRXJyb3JSZXN1bWVOZXh0T3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBPbkVycm9yUmVzdW1lTmV4dFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5uZXh0U291cmNlcykpO1xuICAgIH07XG4gICAgcmV0dXJuIE9uRXJyb3JSZXN1bWVOZXh0T3BlcmF0b3I7XG59KCkpO1xudmFyIE9uRXJyb3JSZXN1bWVOZXh0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE9uRXJyb3JSZXN1bWVOZXh0U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPbkVycm9yUmVzdW1lTmV4dFN1YnNjcmliZXIoZGVzdGluYXRpb24sIG5leHRTb3VyY2VzKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgICAgICB0aGlzLm5leHRTb3VyY2VzID0gbmV4dFNvdXJjZXM7XG4gICAgfVxuICAgIE9uRXJyb3JSZXN1bWVOZXh0U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5RXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9OZXh0U291cmNlKCk7XG4gICAgfTtcbiAgICBPbkVycm9yUmVzdW1lTmV4dFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9OZXh0U291cmNlKCk7XG4gICAgfTtcbiAgICBPbkVycm9yUmVzdW1lTmV4dFN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb05leHRTb3VyY2UoKTtcbiAgICB9O1xuICAgIE9uRXJyb3JSZXN1bWVOZXh0U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvTmV4dFNvdXJjZSgpO1xuICAgIH07XG4gICAgT25FcnJvclJlc3VtZU5leHRTdWJzY3JpYmVyLnByb3RvdHlwZS5zdWJzY3JpYmVUb05leHRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5uZXh0U291cmNlcy5zaGlmdCgpO1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBuZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBPbkVycm9yUmVzdW1lTmV4dFN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b25FcnJvclJlc3VtZU5leHQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivb25FcnJvclJlc3VtZU5leHQuanNcbi8vIG1vZHVsZSBpZCA9IDQzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  777. /***/ },
  778. /* 431 */
  779. /***/ function(module, exports, __webpack_require__) {
  780. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar pairs_1 = __webpack_require__(432);\nObservable_1.Observable.pairs = pairs_1.pairs;\n//# sourceMappingURL=pairs.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3BhaXJzLmpzPzU1MjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHBhaXJzXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL3BhaXJzJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5wYWlycyA9IHBhaXJzXzEucGFpcnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWlycy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9wYWlycy5qc1xuLy8gbW9kdWxlIGlkID0gNDMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  781. /***/ },
  782. /* 432 */
  783. /***/ function(module, exports, __webpack_require__) {
  784. eval("\"use strict\";\nvar PairsObservable_1 = __webpack_require__(433);\nexports.pairs = PairsObservable_1.PairsObservable.create;\n//# sourceMappingURL=pairs.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvcGFpcnMuanM/ZGZkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBQYWlyc09ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vUGFpcnNPYnNlcnZhYmxlJyk7XG5leHBvcnRzLnBhaXJzID0gUGFpcnNPYnNlcnZhYmxlXzEuUGFpcnNPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhaXJzLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvcGFpcnMuanNcbi8vIG1vZHVsZSBpZCA9IDQzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  785. /***/ },
  786. /* 433 */
  787. /***/ function(module, exports, __webpack_require__) {
  788. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nfunction dispatch(state) {\n var obj = state.obj, keys = state.keys, length = state.length, index = state.index, subscriber = state.subscriber;\n if (index === length) {\n subscriber.complete();\n return;\n }\n var key = keys[index];\n subscriber.next([key, obj[key]]);\n state.index = index + 1;\n this.schedule(state);\n}\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar PairsObservable = (function (_super) {\n __extends(PairsObservable, _super);\n function PairsObservable(obj, scheduler) {\n _super.call(this);\n this.obj = obj;\n this.scheduler = scheduler;\n this.keys = Object.keys(obj);\n }\n /**\n * Convert an object into an observable sequence of [key, value] pairs\n * using an optional Scheduler to enumerate the object.\n *\n * @example <caption>Converts a javascript object to an Observable</caption>\n * var obj = {\n * foo: 42,\n * bar: 56,\n * baz: 78\n * };\n *\n * var source = Rx.Observable.pairs(obj);\n *\n * var subscription = source.subscribe(\n * function (x) {\n * console.log('Next: %s', x);\n * },\n * function (err) {\n * console.log('Error: %s', err);\n * },\n * function () {\n * console.log('Completed');\n * });\n *\n * @param {Object} obj The object to inspect and turn into an\n * Observable sequence.\n * @param {Scheduler} [scheduler] An optional Scheduler to run the\n * enumeration of the input sequence on.\n * @returns {(Observable<Array<string | T>>)} An observable sequence of\n * [key, value] pairs from the object.\n */\n PairsObservable.create = function (obj, scheduler) {\n return new PairsObservable(obj, scheduler);\n };\n PairsObservable.prototype._subscribe = function (subscriber) {\n var _a = this, keys = _a.keys, scheduler = _a.scheduler;\n var length = keys.length;\n if (scheduler) {\n return scheduler.schedule(dispatch, 0, {\n obj: this.obj, keys: keys, length: length, index: 0, subscriber: subscriber\n });\n }\n else {\n for (var idx = 0; idx < length; idx++) {\n var key = keys[idx];\n subscriber.next([key, this.obj[key]]);\n }\n subscriber.complete();\n }\n };\n return PairsObservable;\n}(Observable_1.Observable));\nexports.PairsObservable = PairsObservable;\n//# sourceMappingURL=PairsObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvUGFpcnNPYnNlcnZhYmxlLmpzP2Q5ZmMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG5mdW5jdGlvbiBkaXNwYXRjaChzdGF0ZSkge1xuICAgIHZhciBvYmogPSBzdGF0ZS5vYmosIGtleXMgPSBzdGF0ZS5rZXlzLCBsZW5ndGggPSBzdGF0ZS5sZW5ndGgsIGluZGV4ID0gc3RhdGUuaW5kZXgsIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyO1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgc3Vic2NyaWJlci5uZXh0KFtrZXksIG9ialtrZXldXSk7XG4gICAgc3RhdGUuaW5kZXggPSBpbmRleCArIDE7XG4gICAgdGhpcy5zY2hlZHVsZShzdGF0ZSk7XG59XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIFBhaXJzT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBhaXJzT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQYWlyc09ic2VydmFibGUob2JqLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMub2JqID0gb2JqO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5rZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhbiBvYmplY3QgaW50byBhbiBvYnNlcnZhYmxlIHNlcXVlbmNlIG9mIFtrZXksIHZhbHVlXSBwYWlyc1xuICAgICAqIHVzaW5nIGFuIG9wdGlvbmFsIFNjaGVkdWxlciB0byBlbnVtZXJhdGUgdGhlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkNvbnZlcnRzIGEgamF2YXNjcmlwdCBvYmplY3QgdG8gYW4gT2JzZXJ2YWJsZTwvY2FwdGlvbj5cbiAgICAgKiB2YXIgb2JqID0ge1xuICAgICAqICAgZm9vOiA0MixcbiAgICAgKiAgIGJhcjogNTYsXG4gICAgICogICBiYXo6IDc4XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBzb3VyY2UgPSBSeC5PYnNlcnZhYmxlLnBhaXJzKG9iaik7XG4gICAgICpcbiAgICAgKiB2YXIgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShcbiAgICAgKiAgIGZ1bmN0aW9uICh4KSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdOZXh0OiAlcycsIHgpO1xuICAgICAqICAgfSxcbiAgICAgKiAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Vycm9yOiAlcycsIGVycik7XG4gICAgICogICB9LFxuICAgICAqICAgZnVuY3Rpb24gKCkge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQ29tcGxldGVkJyk7XG4gICAgICogICB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0IGFuZCB0dXJuIGludG8gYW5cbiAgICAgKiBPYnNlcnZhYmxlIHNlcXVlbmNlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBBbiBvcHRpb25hbCBTY2hlZHVsZXIgdG8gcnVuIHRoZVxuICAgICAqIGVudW1lcmF0aW9uIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZSBvbi5cbiAgICAgKiBAcmV0dXJucyB7KE9ic2VydmFibGU8QXJyYXk8c3RyaW5nIHwgVD4+KX0gQW4gb2JzZXJ2YWJsZSBzZXF1ZW5jZSBvZlxuICAgICAqIFtrZXksIHZhbHVlXSBwYWlycyBmcm9tIHRoZSBvYmplY3QuXG4gICAgICovXG4gICAgUGFpcnNPYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChvYmosIHNjaGVkdWxlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBhaXJzT2JzZXJ2YWJsZShvYmosIHNjaGVkdWxlcik7XG4gICAgfTtcbiAgICBQYWlyc09ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBrZXlzID0gX2Eua2V5cywgc2NoZWR1bGVyID0gX2Euc2NoZWR1bGVyO1xuICAgICAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGlmIChzY2hlZHVsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gsIDAsIHtcbiAgICAgICAgICAgICAgICBvYmo6IHRoaXMub2JqLCBrZXlzOiBrZXlzLCBsZW5ndGg6IGxlbmd0aCwgaW5kZXg6IDAsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2lkeF07XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KFtrZXksIHRoaXMub2JqW2tleV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFBhaXJzT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuUGFpcnNPYnNlcnZhYmxlID0gUGFpcnNPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGFpcnNPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvUGFpcnNPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MzNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  789. /***/ },
  790. /* 434 */
  791. /***/ function(module, exports, __webpack_require__) {
  792. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar range_1 = __webpack_require__(435);\nObservable_1.Observable.range = range_1.range;\n//# sourceMappingURL=range.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3JhbmdlLmpzPzQyOWIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHJhbmdlXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL3JhbmdlJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5yYW5nZSA9IHJhbmdlXzEucmFuZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYW5nZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9yYW5nZS5qc1xuLy8gbW9kdWxlIGlkID0gNDM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  793. /***/ },
  794. /* 435 */
  795. /***/ function(module, exports, __webpack_require__) {
  796. eval("\"use strict\";\nvar RangeObservable_1 = __webpack_require__(436);\nexports.range = RangeObservable_1.RangeObservable.create;\n//# sourceMappingURL=range.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvcmFuZ2UuanM/YmI5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBSYW5nZU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vUmFuZ2VPYnNlcnZhYmxlJyk7XG5leHBvcnRzLnJhbmdlID0gUmFuZ2VPYnNlcnZhYmxlXzEuUmFuZ2VPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmdlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvcmFuZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDQzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  797. /***/ },
  798. /* 436 */
  799. /***/ function(module, exports, __webpack_require__) {
  800. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar RangeObservable = (function (_super) {\n __extends(RangeObservable, _super);\n function RangeObservable(start, count, scheduler) {\n _super.call(this);\n this.start = start;\n this._count = count;\n this.scheduler = scheduler;\n }\n /**\n * Creates an Observable that emits a sequence of numbers within a specified\n * range.\n *\n * <span class=\"informal\">Emits a sequence of numbers in a range.</span>\n *\n * <img src=\"./img/range.png\" width=\"100%\">\n *\n * `range` operator emits a range of sequential integers, in order, where you\n * select the `start` of the range and its `length`. By default, uses no\n * Scheduler and just delivers the notifications synchronously, but may use\n * an optional Scheduler to regulate those deliveries.\n *\n * @example <caption>Emits the numbers 1 to 10</caption>\n * var numbers = Rx.Observable.range(1, 10);\n * numbers.subscribe(x => console.log(x));\n *\n * @see {@link timer}\n * @see {@link interval}\n *\n * @param {number} [start=0] The value of the first integer in the sequence.\n * @param {number} [count=0] The number of sequential integers to generate.\n * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n * the emissions of the notifications.\n * @return {Observable} An Observable of numbers that emits a finite range of\n * sequential integers.\n * @static true\n * @name range\n * @owner Observable\n */\n RangeObservable.create = function (start, count, scheduler) {\n if (start === void 0) { start = 0; }\n if (count === void 0) { count = 0; }\n return new RangeObservable(start, count, scheduler);\n };\n RangeObservable.dispatch = function (state) {\n var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;\n if (index >= count) {\n subscriber.complete();\n return;\n }\n subscriber.next(start);\n if (subscriber.closed) {\n return;\n }\n state.index = index + 1;\n state.start = start + 1;\n this.schedule(state);\n };\n RangeObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var start = this.start;\n var count = this._count;\n var scheduler = this.scheduler;\n if (scheduler) {\n return scheduler.schedule(RangeObservable.dispatch, 0, {\n index: index, count: count, start: start, subscriber: subscriber\n });\n }\n else {\n do {\n if (index++ >= count) {\n subscriber.complete();\n break;\n }\n subscriber.next(start++);\n if (subscriber.closed) {\n break;\n }\n } while (true);\n }\n };\n return RangeObservable;\n}(Observable_1.Observable));\nexports.RangeObservable = RangeObservable;\n//# sourceMappingURL=RangeObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvUmFuZ2VPYnNlcnZhYmxlLmpzPzc0NGQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIFJhbmdlT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJhbmdlT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSYW5nZU9ic2VydmFibGUoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5fY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgc2VxdWVuY2Ugb2YgbnVtYmVycyB3aXRoaW4gYSBzcGVjaWZpZWRcbiAgICAgKiByYW5nZS5cbiAgICAgKlxuICAgICAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5FbWl0cyBhIHNlcXVlbmNlIG9mIG51bWJlcnMgaW4gYSByYW5nZS48L3NwYW4+XG4gICAgICpcbiAgICAgKiA8aW1nIHNyYz1cIi4vaW1nL3JhbmdlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICAgICAqXG4gICAgICogYHJhbmdlYCBvcGVyYXRvciBlbWl0cyBhIHJhbmdlIG9mIHNlcXVlbnRpYWwgaW50ZWdlcnMsIGluIG9yZGVyLCB3aGVyZSB5b3VcbiAgICAgKiBzZWxlY3QgdGhlIGBzdGFydGAgb2YgdGhlIHJhbmdlIGFuZCBpdHMgYGxlbmd0aGAuIEJ5IGRlZmF1bHQsIHVzZXMgbm9cbiAgICAgKiBTY2hlZHVsZXIgYW5kIGp1c3QgZGVsaXZlcnMgdGhlIG5vdGlmaWNhdGlvbnMgc3luY2hyb25vdXNseSwgYnV0IG1heSB1c2VcbiAgICAgKiBhbiBvcHRpb25hbCBTY2hlZHVsZXIgdG8gcmVndWxhdGUgdGhvc2UgZGVsaXZlcmllcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXRzIHRoZSBudW1iZXJzIDEgdG8gMTA8L2NhcHRpb24+XG4gICAgICogdmFyIG51bWJlcnMgPSBSeC5PYnNlcnZhYmxlLnJhbmdlKDEsIDEwKTtcbiAgICAgKiBudW1iZXJzLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIHRpbWVyfVxuICAgICAqIEBzZWUge0BsaW5rIGludGVydmFsfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnQ9MF0gVGhlIG51bWJlciBvZiBzZXF1ZW50aWFsIGludGVnZXJzIHRvIGdlbmVyYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSBBIHtAbGluayBTY2hlZHVsZXJ9IHRvIHVzZSBmb3Igc2NoZWR1bGluZ1xuICAgICAqIHRoZSBlbWlzc2lvbnMgb2YgdGhlIG5vdGlmaWNhdGlvbnMuXG4gICAgICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBvZiBudW1iZXJzIHRoYXQgZW1pdHMgYSBmaW5pdGUgcmFuZ2Ugb2ZcbiAgICAgKiBzZXF1ZW50aWFsIGludGVnZXJzLlxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIHJhbmdlXG4gICAgICogQG93bmVyIE9ic2VydmFibGVcbiAgICAgKi9cbiAgICBSYW5nZU9ic2VydmFibGUuY3JlYXRlID0gZnVuY3Rpb24gKHN0YXJ0LCBjb3VudCwgc2NoZWR1bGVyKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7IHN0YXJ0ID0gMDsgfVxuICAgICAgICBpZiAoY291bnQgPT09IHZvaWQgMCkgeyBjb3VudCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZU9ic2VydmFibGUoc3RhcnQsIGNvdW50LCBzY2hlZHVsZXIpO1xuICAgIH07XG4gICAgUmFuZ2VPYnNlcnZhYmxlLmRpc3BhdGNoID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHN0YXRlLnN0YXJ0LCBpbmRleCA9IHN0YXRlLmluZGV4LCBjb3VudCA9IHN0YXRlLmNvdW50LCBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgaWYgKGluZGV4ID49IGNvdW50KSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHN0YXJ0KTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHN0YXRlLnN0YXJ0ID0gc3RhcnQgKyAxO1xuICAgICAgICB0aGlzLnNjaGVkdWxlKHN0YXRlKTtcbiAgICB9O1xuICAgIFJhbmdlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIHZhciBjb3VudCA9IHRoaXMuX2NvdW50O1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIGlmIChzY2hlZHVsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoUmFuZ2VPYnNlcnZhYmxlLmRpc3BhdGNoLCAwLCB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LCBjb3VudDogY291bnQsIHN0YXJ0OiBzdGFydCwgc3Vic2NyaWJlcjogc3Vic2NyaWJlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4KysgPj0gY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHN0YXJ0KyspO1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFJhbmdlT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuUmFuZ2VPYnNlcnZhYmxlID0gUmFuZ2VPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmFuZ2VPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvUmFuZ2VPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0MzZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  801. /***/ },
  802. /* 437 */
  803. /***/ function(module, exports, __webpack_require__) {
  804. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar using_1 = __webpack_require__(438);\nObservable_1.Observable.using = using_1.using;\n//# sourceMappingURL=using.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3VzaW5nLmpzPzhjODAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHVzaW5nXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL3VzaW5nJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS51c2luZyA9IHVzaW5nXzEudXNpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2luZy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS91c2luZy5qc1xuLy8gbW9kdWxlIGlkID0gNDM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  805. /***/ },
  806. /* 438 */
  807. /***/ function(module, exports, __webpack_require__) {
  808. eval("\"use strict\";\nvar UsingObservable_1 = __webpack_require__(439);\nexports.using = UsingObservable_1.UsingObservable.create;\n//# sourceMappingURL=using.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvdXNpbmcuanM/YjYwOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBVc2luZ09ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vVXNpbmdPYnNlcnZhYmxlJyk7XG5leHBvcnRzLnVzaW5nID0gVXNpbmdPYnNlcnZhYmxlXzEuVXNpbmdPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzaW5nLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvdXNpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDQzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  809. /***/ },
  810. /* 439 */
  811. /***/ function(module, exports, __webpack_require__) {
  812. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar UsingObservable = (function (_super) {\n __extends(UsingObservable, _super);\n function UsingObservable(resourceFactory, observableFactory) {\n _super.call(this);\n this.resourceFactory = resourceFactory;\n this.observableFactory = observableFactory;\n }\n UsingObservable.create = function (resourceFactory, observableFactory) {\n return new UsingObservable(resourceFactory, observableFactory);\n };\n UsingObservable.prototype._subscribe = function (subscriber) {\n var _a = this, resourceFactory = _a.resourceFactory, observableFactory = _a.observableFactory;\n var resource;\n try {\n resource = resourceFactory();\n return new UsingSubscriber(subscriber, resource, observableFactory);\n }\n catch (err) {\n subscriber.error(err);\n }\n };\n return UsingObservable;\n}(Observable_1.Observable));\nexports.UsingObservable = UsingObservable;\nvar UsingSubscriber = (function (_super) {\n __extends(UsingSubscriber, _super);\n function UsingSubscriber(destination, resource, observableFactory) {\n _super.call(this, destination);\n this.resource = resource;\n this.observableFactory = observableFactory;\n destination.add(resource);\n this.tryUse();\n }\n UsingSubscriber.prototype.tryUse = function () {\n try {\n var source = this.observableFactory.call(this, this.resource);\n if (source) {\n this.add(subscribeToResult_1.subscribeToResult(this, source));\n }\n }\n catch (err) {\n this._error(err);\n }\n };\n return UsingSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=UsingObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvVXNpbmdPYnNlcnZhYmxlLmpzPzA0NTEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKiBAaGlkZSB0cnVlXG4gKi9cbnZhciBVc2luZ09ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVc2luZ09ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVXNpbmdPYnNlcnZhYmxlKHJlc291cmNlRmFjdG9yeSwgb2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucmVzb3VyY2VGYWN0b3J5ID0gcmVzb3VyY2VGYWN0b3J5O1xuICAgICAgICB0aGlzLm9ic2VydmFibGVGYWN0b3J5ID0gb2JzZXJ2YWJsZUZhY3Rvcnk7XG4gICAgfVxuICAgIFVzaW5nT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAocmVzb3VyY2VGYWN0b3J5LCBvYnNlcnZhYmxlRmFjdG9yeSkge1xuICAgICAgICByZXR1cm4gbmV3IFVzaW5nT2JzZXJ2YWJsZShyZXNvdXJjZUZhY3RvcnksIG9ic2VydmFibGVGYWN0b3J5KTtcbiAgICB9O1xuICAgIFVzaW5nT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHJlc291cmNlRmFjdG9yeSA9IF9hLnJlc291cmNlRmFjdG9yeSwgb2JzZXJ2YWJsZUZhY3RvcnkgPSBfYS5vYnNlcnZhYmxlRmFjdG9yeTtcbiAgICAgICAgdmFyIHJlc291cmNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZUZhY3RvcnkoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVXNpbmdTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHJlc291cmNlLCBvYnNlcnZhYmxlRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVXNpbmdPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5Vc2luZ09ic2VydmFibGUgPSBVc2luZ09ic2VydmFibGU7XG52YXIgVXNpbmdTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVXNpbmdTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVzaW5nU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcmVzb3VyY2UsIG9ic2VydmFibGVGYWN0b3J5KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICB0aGlzLm9ic2VydmFibGVGYWN0b3J5ID0gb2JzZXJ2YWJsZUZhY3Rvcnk7XG4gICAgICAgIGRlc3RpbmF0aW9uLmFkZChyZXNvdXJjZSk7XG4gICAgICAgIHRoaXMudHJ5VXNlKCk7XG4gICAgfVxuICAgIFVzaW5nU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5VXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMub2JzZXJ2YWJsZUZhY3RvcnkuY2FsbCh0aGlzLCB0aGlzLnJlc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHNvdXJjZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBVc2luZ1N1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VXNpbmdPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvVXNpbmdPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0Mzlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  813. /***/ },
  814. /* 440 */
  815. /***/ function(module, exports, __webpack_require__) {
  816. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar throw_1 = __webpack_require__(441);\nObservable_1.Observable.throw = throw_1._throw;\n//# sourceMappingURL=throw.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3Rocm93LmpzPzJhZDEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRocm93XzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL3Rocm93Jyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS50aHJvdyA9IHRocm93XzEuX3Rocm93O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3cuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvdGhyb3cuanNcbi8vIG1vZHVsZSBpZCA9IDQ0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  817. /***/ },
  818. /* 441 */
  819. /***/ function(module, exports, __webpack_require__) {
  820. eval("\"use strict\";\nvar ErrorObservable_1 = __webpack_require__(442);\nexports._throw = ErrorObservable_1.ErrorObservable.create;\n//# sourceMappingURL=throw.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvdGhyb3cuanM/ODEyOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBFcnJvck9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vRXJyb3JPYnNlcnZhYmxlJyk7XG5leHBvcnRzLl90aHJvdyA9IEVycm9yT2JzZXJ2YWJsZV8xLkVycm9yT2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL3Rocm93LmpzXG4vLyBtb2R1bGUgaWQgPSA0NDFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  821. /***/ },
  822. /* 442 */
  823. /***/ function(module, exports, __webpack_require__) {
  824. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar ErrorObservable = (function (_super) {\n __extends(ErrorObservable, _super);\n function ErrorObservable(error, scheduler) {\n _super.call(this);\n this.error = error;\n this.scheduler = scheduler;\n }\n /**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits an error notification.\n *\n * <span class=\"informal\">Just emits 'error', and nothing else.\n * </span>\n *\n * <img src=\"./img/throw.png\" width=\"100%\">\n *\n * This static operator is useful for creating a simple Observable that only\n * emits the error notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * @example <caption>Emit the number 7, then emit an error.</caption>\n * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @example <caption>Map and flattens numbers to the sequence 'a', 'b', 'c', but throw an error for 13</caption>\n * var interval = Rx.Observable.interval(1000);\n * var result = interval.mergeMap(x =>\n * x === 13 ?\n * Rx.Observable.throw('Thirteens are bad') :\n * Rx.Observable.of('a', 'b', 'c')\n * );\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link create}\n * @see {@link empty}\n * @see {@link never}\n * @see {@link of}\n *\n * @param {any} error The particular Error to pass to the error notification.\n * @param {Scheduler} [scheduler] A {@link Scheduler} to use for scheduling\n * the emission of the error notification.\n * @return {Observable} An error Observable: emits only the error notification\n * using the given error argument.\n * @static true\n * @name throw\n * @owner Observable\n */\n ErrorObservable.create = function (error, scheduler) {\n return new ErrorObservable(error, scheduler);\n };\n ErrorObservable.dispatch = function (arg) {\n var error = arg.error, subscriber = arg.subscriber;\n subscriber.error(error);\n };\n ErrorObservable.prototype._subscribe = function (subscriber) {\n var error = this.error;\n var scheduler = this.scheduler;\n if (scheduler) {\n return scheduler.schedule(ErrorObservable.dispatch, 0, {\n error: error, subscriber: subscriber\n });\n }\n else {\n subscriber.error(error);\n }\n };\n return ErrorObservable;\n}(Observable_1.Observable));\nexports.ErrorObservable = ErrorObservable;\n//# sourceMappingURL=ErrorObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvRXJyb3JPYnNlcnZhYmxlLmpzP2YxZmUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIEVycm9yT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVycm9yT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFcnJvck9ic2VydmFibGUoZXJyb3IsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgbm8gaXRlbXMgdG8gdGhlIE9ic2VydmVyIGFuZCBpbW1lZGlhdGVseVxuICAgICAqIGVtaXRzIGFuIGVycm9yIG5vdGlmaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5KdXN0IGVtaXRzICdlcnJvcicsIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICogPC9zcGFuPlxuICAgICAqXG4gICAgICogPGltZyBzcmM9XCIuL2ltZy90aHJvdy5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAgICAgKlxuICAgICAqIFRoaXMgc3RhdGljIG9wZXJhdG9yIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYSBzaW1wbGUgT2JzZXJ2YWJsZSB0aGF0IG9ubHlcbiAgICAgKiBlbWl0cyB0aGUgZXJyb3Igbm90aWZpY2F0aW9uLiBJdCBjYW4gYmUgdXNlZCBmb3IgY29tcG9zaW5nIHdpdGggb3RoZXJcbiAgICAgKiBPYnNlcnZhYmxlcywgc3VjaCBhcyBpbiBhIHtAbGluayBtZXJnZU1hcH0uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5FbWl0IHRoZSBudW1iZXIgNywgdGhlbiBlbWl0IGFuIGVycm9yLjwvY2FwdGlvbj5cbiAgICAgKiB2YXIgcmVzdWx0ID0gUnguT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ29vcHMhJykpLnN0YXJ0V2l0aCg3KTtcbiAgICAgKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCksIGUgPT4gY29uc29sZS5lcnJvcihlKSk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5NYXAgYW5kIGZsYXR0ZW5zIG51bWJlcnMgdG8gdGhlIHNlcXVlbmNlICdhJywgJ2InLCAnYycsIGJ1dCB0aHJvdyBhbiBlcnJvciBmb3IgMTM8L2NhcHRpb24+XG4gICAgICogdmFyIGludGVydmFsID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAgICAgKiB2YXIgcmVzdWx0ID0gaW50ZXJ2YWwubWVyZ2VNYXAoeCA9PlxuICAgICAqICAgeCA9PT0gMTMgP1xuICAgICAqICAgICBSeC5PYnNlcnZhYmxlLnRocm93KCdUaGlydGVlbnMgYXJlIGJhZCcpIDpcbiAgICAgKiAgICAgUnguT2JzZXJ2YWJsZS5vZignYScsICdiJywgJ2MnKVxuICAgICAqICk7XG4gICAgICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpLCBlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgY3JlYXRlfVxuICAgICAqIEBzZWUge0BsaW5rIGVtcHR5fVxuICAgICAqIEBzZWUge0BsaW5rIG5ldmVyfVxuICAgICAqIEBzZWUge0BsaW5rIG9mfVxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGVycm9yIFRoZSBwYXJ0aWN1bGFyIEVycm9yIHRvIHBhc3MgdG8gdGhlIGVycm9yIG5vdGlmaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcl0gQSB7QGxpbmsgU2NoZWR1bGVyfSB0byB1c2UgZm9yIHNjaGVkdWxpbmdcbiAgICAgKiB0aGUgZW1pc3Npb24gb2YgdGhlIGVycm9yIG5vdGlmaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBlcnJvciBPYnNlcnZhYmxlOiBlbWl0cyBvbmx5IHRoZSBlcnJvciBub3RpZmljYXRpb25cbiAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gZXJyb3IgYXJndW1lbnQuXG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgdGhyb3dcbiAgICAgKiBAb3duZXIgT2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIEVycm9yT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoZXJyb3IsIHNjaGVkdWxlcikge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yT2JzZXJ2YWJsZShlcnJvciwgc2NoZWR1bGVyKTtcbiAgICB9O1xuICAgIEVycm9yT2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgdmFyIGVycm9yID0gYXJnLmVycm9yLCBzdWJzY3JpYmVyID0gYXJnLnN1YnNjcmliZXI7XG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgRXJyb3JPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIGVycm9yID0gdGhpcy5lcnJvcjtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKEVycm9yT2JzZXJ2YWJsZS5kaXNwYXRjaCwgMCwge1xuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciwgc3Vic2NyaWJlcjogc3Vic2NyaWJlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEVycm9yT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuRXJyb3JPYnNlcnZhYmxlID0gRXJyb3JPYnNlcnZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JPYnNlcnZhYmxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvRXJyb3JPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  825. /***/ },
  826. /* 443 */
  827. /***/ function(module, exports, __webpack_require__) {
  828. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar timer_1 = __webpack_require__(444);\nObservable_1.Observable.timer = timer_1.timer;\n//# sourceMappingURL=timer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3RpbWVyLmpzPzg1MzAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRpbWVyXzEgPSByZXF1aXJlKCcuLi8uLi9vYnNlcnZhYmxlL3RpbWVyJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS50aW1lciA9IHRpbWVyXzEudGltZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS90aW1lci5qc1xuLy8gbW9kdWxlIGlkID0gNDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  829. /***/ },
  830. /* 444 */
  831. /***/ function(module, exports, __webpack_require__) {
  832. eval("\"use strict\";\nvar TimerObservable_1 = __webpack_require__(445);\nexports.timer = TimerObservable_1.TimerObservable.create;\n//# sourceMappingURL=timer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvdGltZXIuanM/MzQ1MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBUaW1lck9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vVGltZXJPYnNlcnZhYmxlJyk7XG5leHBvcnRzLnRpbWVyID0gVGltZXJPYnNlcnZhYmxlXzEuVGltZXJPYnNlcnZhYmxlLmNyZWF0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvdGltZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  833. /***/ },
  834. /* 445 */
  835. /***/ function(module, exports, __webpack_require__) {
  836. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar isNumeric_1 = __webpack_require__(413);\nvar Observable_1 = __webpack_require__(6);\nvar async_1 = __webpack_require__(414);\nvar isScheduler_1 = __webpack_require__(42);\nvar isDate_1 = __webpack_require__(446);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar TimerObservable = (function (_super) {\n __extends(TimerObservable, _super);\n function TimerObservable(dueTime, period, scheduler) {\n if (dueTime === void 0) { dueTime = 0; }\n _super.call(this);\n this.period = -1;\n this.dueTime = 0;\n if (isNumeric_1.isNumeric(period)) {\n this.period = Number(period) < 1 && 1 || Number(period);\n }\n else if (isScheduler_1.isScheduler(period)) {\n scheduler = period;\n }\n if (!isScheduler_1.isScheduler(scheduler)) {\n scheduler = async_1.async;\n }\n this.scheduler = scheduler;\n this.dueTime = isDate_1.isDate(dueTime) ?\n (+dueTime - this.scheduler.now()) :\n dueTime;\n }\n /**\n * Creates an Observable that starts emitting after an `initialDelay` and\n * emits ever increasing numbers after each `period` of time thereafter.\n *\n * <span class=\"informal\">Its like {@link interval}, but you can specify when\n * should the emissions start.</span>\n *\n * <img src=\"./img/timer.png\" width=\"100%\">\n *\n * `timer` returns an Observable that emits an infinite sequence of ascending\n * integers, with a constant interval of time, `period` of your choosing\n * between those emissions. The first emission happens after the specified\n * `initialDelay`. The initial delay may be a {@link Date}. By default, this\n * operator uses the `async` Scheduler to provide a notion of time, but you\n * may pass any Scheduler to it. If `period` is not specified, the output\n * Observable emits only one value, `0`. Otherwise, it emits an infinite\n * sequence.\n *\n * @example <caption>Emits ascending numbers, one every second (1000ms), starting after 3 seconds</caption>\n * var numbers = Rx.Observable.timer(3000, 1000);\n * numbers.subscribe(x => console.log(x));\n *\n * @example <caption>Emits one number after five seconds</caption>\n * var numbers = Rx.Observable.timer(5000);\n * numbers.subscribe(x => console.log(x));\n *\n * @see {@link interval}\n * @see {@link delay}\n *\n * @param {number|Date} initialDelay The initial delay time to wait before\n * emitting the first value of `0`.\n * @param {number} [period] The period of time between emissions of the\n * subsequent numbers.\n * @param {Scheduler} [scheduler=async] The Scheduler to use for scheduling\n * the emission of values, and providing a notion of \"time\".\n * @return {Observable} An Observable that emits a `0` after the\n * `initialDelay` and ever increasing numbers after each `period` of time\n * thereafter.\n * @static true\n * @name timer\n * @owner Observable\n */\n TimerObservable.create = function (initialDelay, period, scheduler) {\n if (initialDelay === void 0) { initialDelay = 0; }\n return new TimerObservable(initialDelay, period, scheduler);\n };\n TimerObservable.dispatch = function (state) {\n var index = state.index, period = state.period, subscriber = state.subscriber;\n var action = this;\n subscriber.next(index);\n if (subscriber.closed) {\n return;\n }\n else if (period === -1) {\n return subscriber.complete();\n }\n state.index = index + 1;\n action.schedule(state, period);\n };\n TimerObservable.prototype._subscribe = function (subscriber) {\n var index = 0;\n var _a = this, period = _a.period, dueTime = _a.dueTime, scheduler = _a.scheduler;\n return scheduler.schedule(TimerObservable.dispatch, dueTime, {\n index: index, period: period, subscriber: subscriber\n });\n };\n return TimerObservable;\n}(Observable_1.Observable));\nexports.TimerObservable = TimerObservable;\n//# sourceMappingURL=TimerObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvVGltZXJPYnNlcnZhYmxlLmpzP2QwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBpc051bWVyaWNfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNOdW1lcmljJyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbnZhciBpc1NjaGVkdWxlcl8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc1NjaGVkdWxlcicpO1xudmFyIGlzRGF0ZV8xID0gcmVxdWlyZSgnLi4vdXRpbC9pc0RhdGUnKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICogQGhpZGUgdHJ1ZVxuICovXG52YXIgVGltZXJPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGltZXJPYnNlcnZhYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVyT2JzZXJ2YWJsZShkdWVUaW1lLCBwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgICAgICBpZiAoZHVlVGltZSA9PT0gdm9pZCAwKSB7IGR1ZVRpbWUgPSAwOyB9XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnBlcmlvZCA9IC0xO1xuICAgICAgICB0aGlzLmR1ZVRpbWUgPSAwO1xuICAgICAgICBpZiAoaXNOdW1lcmljXzEuaXNOdW1lcmljKHBlcmlvZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kID0gTnVtYmVyKHBlcmlvZCkgPCAxICYmIDEgfHwgTnVtYmVyKHBlcmlvZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNTY2hlZHVsZXJfMS5pc1NjaGVkdWxlcihwZXJpb2QpKSB7XG4gICAgICAgICAgICBzY2hlZHVsZXIgPSBwZXJpb2Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1NjaGVkdWxlcl8xLmlzU2NoZWR1bGVyKHNjaGVkdWxlcikpIHtcbiAgICAgICAgICAgIHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuZHVlVGltZSA9IGlzRGF0ZV8xLmlzRGF0ZShkdWVUaW1lKSA/XG4gICAgICAgICAgICAoK2R1ZVRpbWUgLSB0aGlzLnNjaGVkdWxlci5ub3coKSkgOlxuICAgICAgICAgICAgZHVlVGltZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBPYnNlcnZhYmxlIHRoYXQgc3RhcnRzIGVtaXR0aW5nIGFmdGVyIGFuIGBpbml0aWFsRGVsYXlgIGFuZFxuICAgICAqIGVtaXRzIGV2ZXIgaW5jcmVhc2luZyBudW1iZXJzIGFmdGVyIGVhY2ggYHBlcmlvZGAgb2YgdGltZSB0aGVyZWFmdGVyLlxuICAgICAqXG4gICAgICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0cyBsaWtlIHtAbGluayBpbnRlcnZhbH0sIGJ1dCB5b3UgY2FuIHNwZWNpZnkgd2hlblxuICAgICAqIHNob3VsZCB0aGUgZW1pc3Npb25zIHN0YXJ0Ljwvc3Bhbj5cbiAgICAgKlxuICAgICAqIDxpbWcgc3JjPVwiLi9pbWcvdGltZXIucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICpcbiAgICAgKiBgdGltZXJgIHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGluZmluaXRlIHNlcXVlbmNlIG9mIGFzY2VuZGluZ1xuICAgICAqIGludGVnZXJzLCB3aXRoIGEgY29uc3RhbnQgaW50ZXJ2YWwgb2YgdGltZSwgYHBlcmlvZGAgb2YgeW91ciBjaG9vc2luZ1xuICAgICAqIGJldHdlZW4gdGhvc2UgZW1pc3Npb25zLiBUaGUgZmlyc3QgZW1pc3Npb24gaGFwcGVucyBhZnRlciB0aGUgc3BlY2lmaWVkXG4gICAgICogYGluaXRpYWxEZWxheWAuIFRoZSBpbml0aWFsIGRlbGF5IG1heSBiZSBhIHtAbGluayBEYXRlfS4gQnkgZGVmYXVsdCwgdGhpc1xuICAgICAqIG9wZXJhdG9yIHVzZXMgdGhlIGBhc3luY2AgU2NoZWR1bGVyIHRvIHByb3ZpZGUgYSBub3Rpb24gb2YgdGltZSwgYnV0IHlvdVxuICAgICAqIG1heSBwYXNzIGFueSBTY2hlZHVsZXIgdG8gaXQuIElmIGBwZXJpb2RgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBvdXRwdXRcbiAgICAgKiBPYnNlcnZhYmxlIGVtaXRzIG9ubHkgb25lIHZhbHVlLCBgMGAuIE90aGVyd2lzZSwgaXQgZW1pdHMgYW4gaW5maW5pdGVcbiAgICAgKiBzZXF1ZW5jZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXRzIGFzY2VuZGluZyBudW1iZXJzLCBvbmUgZXZlcnkgc2Vjb25kICgxMDAwbXMpLCBzdGFydGluZyBhZnRlciAzIHNlY29uZHM8L2NhcHRpb24+XG4gICAgICogdmFyIG51bWJlcnMgPSBSeC5PYnNlcnZhYmxlLnRpbWVyKDMwMDAsIDEwMDApO1xuICAgICAqIG51bWJlcnMuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdHMgb25lIG51bWJlciBhZnRlciBmaXZlIHNlY29uZHM8L2NhcHRpb24+XG4gICAgICogdmFyIG51bWJlcnMgPSBSeC5PYnNlcnZhYmxlLnRpbWVyKDUwMDApO1xuICAgICAqIG51bWJlcnMuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaW50ZXJ2YWx9XG4gICAgICogQHNlZSB7QGxpbmsgZGVsYXl9XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcnxEYXRlfSBpbml0aWFsRGVsYXkgVGhlIGluaXRpYWwgZGVsYXkgdGltZSB0byB3YWl0IGJlZm9yZVxuICAgICAqIGVtaXR0aW5nIHRoZSBmaXJzdCB2YWx1ZSBvZiBgMGAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwZXJpb2RdIFRoZSBwZXJpb2Qgb2YgdGltZSBiZXR3ZWVuIGVtaXNzaW9ucyBvZiB0aGVcbiAgICAgKiBzdWJzZXF1ZW50IG51bWJlcnMuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXI9YXN5bmNdIFRoZSBTY2hlZHVsZXIgdG8gdXNlIGZvciBzY2hlZHVsaW5nXG4gICAgICogdGhlIGVtaXNzaW9uIG9mIHZhbHVlcywgYW5kIHByb3ZpZGluZyBhIG5vdGlvbiBvZiBcInRpbWVcIi5cbiAgICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYSBgMGAgYWZ0ZXIgdGhlXG4gICAgICogYGluaXRpYWxEZWxheWAgYW5kIGV2ZXIgaW5jcmVhc2luZyBudW1iZXJzIGFmdGVyIGVhY2ggYHBlcmlvZGAgb2YgdGltZVxuICAgICAqIHRoZXJlYWZ0ZXIuXG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgdGltZXJcbiAgICAgKiBAb3duZXIgT2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIFRpbWVyT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoaW5pdGlhbERlbGF5LCBwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgICAgICBpZiAoaW5pdGlhbERlbGF5ID09PSB2b2lkIDApIHsgaW5pdGlhbERlbGF5ID0gMDsgfVxuICAgICAgICByZXR1cm4gbmV3IFRpbWVyT2JzZXJ2YWJsZShpbml0aWFsRGVsYXksIHBlcmlvZCwgc2NoZWR1bGVyKTtcbiAgICB9O1xuICAgIFRpbWVyT2JzZXJ2YWJsZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCwgcGVyaW9kID0gc3RhdGUucGVyaW9kLCBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgdmFyIGFjdGlvbiA9IHRoaXM7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpbmRleCk7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBlcmlvZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIGFjdGlvbi5zY2hlZHVsZShzdGF0ZSwgcGVyaW9kKTtcbiAgICB9O1xuICAgIFRpbWVyT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHBlcmlvZCA9IF9hLnBlcmlvZCwgZHVlVGltZSA9IF9hLmR1ZVRpbWUsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShUaW1lck9ic2VydmFibGUuZGlzcGF0Y2gsIGR1ZVRpbWUsIHtcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCwgcGVyaW9kOiBwZXJpb2QsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZXJPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5UaW1lck9ic2VydmFibGUgPSBUaW1lck9ic2VydmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UaW1lck9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9UaW1lck9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDQ0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  837. /***/ },
  838. /* 446 */
  839. /***/ function(module, exports) {
  840. eval("\"use strict\";\nfunction isDate(value) {\n return value instanceof Date && !isNaN(+value);\n}\nexports.isDate = isDate;\n//# sourceMappingURL=isDate.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvaXNEYXRlLmpzPzhlOWUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTigrdmFsdWUpO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0RhdGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9pc0RhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDQ0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  841. /***/ },
  842. /* 447 */
  843. /***/ function(module, exports, __webpack_require__) {
  844. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar zip_1 = __webpack_require__(448);\nObservable_1.Observable.zip = zip_1.zip;\n//# sourceMappingURL=zip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL3ppcC5qcz9hNmI3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB6aXBfMSA9IHJlcXVpcmUoJy4uLy4uL29ic2VydmFibGUvemlwJyk7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS56aXAgPSB6aXBfMS56aXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD16aXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvemlwLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  845. /***/ },
  846. /* 448 */
  847. /***/ function(module, exports, __webpack_require__) {
  848. eval("\"use strict\";\nvar zip_1 = __webpack_require__(449);\nexports.zip = zip_1.zipStatic;\n//# sourceMappingURL=zip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvemlwLmpzP2ZjNjkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgemlwXzEgPSByZXF1aXJlKCcuLi9vcGVyYXRvci96aXAnKTtcbmV4cG9ydHMuemlwID0gemlwXzEuemlwU3RhdGljO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9emlwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvemlwLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  849. /***/ },
  850. /* 449 */
  851. /***/ function(module, exports, __webpack_require__) {
  852. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar ArrayObservable_1 = __webpack_require__(39);\nvar isArray_1 = __webpack_require__(12);\nvar Subscriber_1 = __webpack_require__(9);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar iterator_1 = __webpack_require__(38);\n/* tslint:disable:max-line-length */\n/**\n * @param observables\n * @return {Observable<R>}\n * @method zip\n * @owner Observable\n */\nfunction zipProto() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n return this.lift.call(zipStatic.apply(void 0, [this].concat(observables)));\n}\nexports.zipProto = zipProto;\n/* tslint:enable:max-line-length */\n/**\n * @param observables\n * @return {Observable<R>}\n * @static true\n * @name zip\n * @owner Observable\n */\nfunction zipStatic() {\n var observables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n observables[_i - 0] = arguments[_i];\n }\n var project = observables[observables.length - 1];\n if (typeof project === 'function') {\n observables.pop();\n }\n return new ArrayObservable_1.ArrayObservable(observables).lift(new ZipOperator(project));\n}\nexports.zipStatic = zipStatic;\nvar ZipOperator = (function () {\n function ZipOperator(project) {\n this.project = project;\n }\n ZipOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ZipSubscriber(subscriber, this.project));\n };\n return ZipOperator;\n}());\nexports.ZipOperator = ZipOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipSubscriber = (function (_super) {\n __extends(ZipSubscriber, _super);\n function ZipSubscriber(destination, project, values) {\n if (values === void 0) { values = Object.create(null); }\n _super.call(this, destination);\n this.iterators = [];\n this.active = 0;\n this.project = (typeof project === 'function') ? project : null;\n this.values = values;\n }\n ZipSubscriber.prototype._next = function (value) {\n var iterators = this.iterators;\n if (isArray_1.isArray(value)) {\n iterators.push(new StaticArrayIterator(value));\n }\n else if (typeof value[iterator_1.$$iterator] === 'function') {\n iterators.push(new StaticIterator(value[iterator_1.$$iterator]()));\n }\n else {\n iterators.push(new ZipBufferIterator(this.destination, this, value));\n }\n };\n ZipSubscriber.prototype._complete = function () {\n var iterators = this.iterators;\n var len = iterators.length;\n this.active = len;\n for (var i = 0; i < len; i++) {\n var iterator = iterators[i];\n if (iterator.stillUnsubscribed) {\n this.add(iterator.subscribe(iterator, i));\n }\n else {\n this.active--; // not an observable\n }\n }\n };\n ZipSubscriber.prototype.notifyInactive = function () {\n this.active--;\n if (this.active === 0) {\n this.destination.complete();\n }\n };\n ZipSubscriber.prototype.checkIterators = function () {\n var iterators = this.iterators;\n var len = iterators.length;\n var destination = this.destination;\n // abort if not all of them have values\n for (var i = 0; i < len; i++) {\n var iterator = iterators[i];\n if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n return;\n }\n }\n var shouldComplete = false;\n var args = [];\n for (var i = 0; i < len; i++) {\n var iterator = iterators[i];\n var result = iterator.next();\n // check to see if it's completed now that you've gotten\n // the next value.\n if (iterator.hasCompleted()) {\n shouldComplete = true;\n }\n if (result.done) {\n destination.complete();\n return;\n }\n args.push(result.value);\n }\n if (this.project) {\n this._tryProject(args);\n }\n else {\n destination.next(args);\n }\n if (shouldComplete) {\n destination.complete();\n }\n };\n ZipSubscriber.prototype._tryProject = function (args) {\n var result;\n try {\n result = this.project.apply(this, args);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n return ZipSubscriber;\n}(Subscriber_1.Subscriber));\nexports.ZipSubscriber = ZipSubscriber;\nvar StaticIterator = (function () {\n function StaticIterator(iterator) {\n this.iterator = iterator;\n this.nextResult = iterator.next();\n }\n StaticIterator.prototype.hasValue = function () {\n return true;\n };\n StaticIterator.prototype.next = function () {\n var result = this.nextResult;\n this.nextResult = this.iterator.next();\n return result;\n };\n StaticIterator.prototype.hasCompleted = function () {\n var nextResult = this.nextResult;\n return nextResult && nextResult.done;\n };\n return StaticIterator;\n}());\nvar StaticArrayIterator = (function () {\n function StaticArrayIterator(array) {\n this.array = array;\n this.index = 0;\n this.length = 0;\n this.length = array.length;\n }\n StaticArrayIterator.prototype[iterator_1.$$iterator] = function () {\n return this;\n };\n StaticArrayIterator.prototype.next = function (value) {\n var i = this.index++;\n var array = this.array;\n return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n };\n StaticArrayIterator.prototype.hasValue = function () {\n return this.array.length > this.index;\n };\n StaticArrayIterator.prototype.hasCompleted = function () {\n return this.array.length === this.index;\n };\n return StaticArrayIterator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ZipBufferIterator = (function (_super) {\n __extends(ZipBufferIterator, _super);\n function ZipBufferIterator(destination, parent, observable) {\n _super.call(this, destination);\n this.parent = parent;\n this.observable = observable;\n this.stillUnsubscribed = true;\n this.buffer = [];\n this.isComplete = false;\n }\n ZipBufferIterator.prototype[iterator_1.$$iterator] = function () {\n return this;\n };\n // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next\n // this is legit because `next()` will never be called by a subscription in this case.\n ZipBufferIterator.prototype.next = function () {\n var buffer = this.buffer;\n if (buffer.length === 0 && this.isComplete) {\n return { value: null, done: true };\n }\n else {\n return { value: buffer.shift(), done: false };\n }\n };\n ZipBufferIterator.prototype.hasValue = function () {\n return this.buffer.length > 0;\n };\n ZipBufferIterator.prototype.hasCompleted = function () {\n return this.buffer.length === 0 && this.isComplete;\n };\n ZipBufferIterator.prototype.notifyComplete = function () {\n if (this.buffer.length > 0) {\n this.isComplete = true;\n this.parent.notifyInactive();\n }\n else {\n this.destination.complete();\n }\n };\n ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.buffer.push(innerValue);\n this.parent.checkIterators();\n };\n ZipBufferIterator.prototype.subscribe = function (value, index) {\n return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);\n };\n return ZipBufferIterator;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=zip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3ppcC5qcz82NWEyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXJyYXlPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9vYnNlcnZhYmxlL0FycmF5T2JzZXJ2YWJsZScpO1xudmFyIGlzQXJyYXlfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNBcnJheScpO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgaXRlcmF0b3JfMSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9pdGVyYXRvcicpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIEBwYXJhbSBvYnNlcnZhYmxlc1xuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPn1cbiAqIEBtZXRob2QgemlwXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiB6aXBQcm90bygpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBvYnNlcnZhYmxlc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGlmdC5jYWxsKHppcFN0YXRpYy5hcHBseSh2b2lkIDAsIFt0aGlzXS5jb25jYXQob2JzZXJ2YWJsZXMpKSk7XG59XG5leHBvcnRzLnppcFByb3RvID0gemlwUHJvdG87XG4vKiB0c2xpbnQ6ZW5hYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBAcGFyYW0gb2JzZXJ2YWJsZXNcbiAqIEByZXR1cm4ge09ic2VydmFibGU8Uj59XG4gKiBAc3RhdGljIHRydWVcbiAqIEBuYW1lIHppcFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gemlwU3RhdGljKCkge1xuICAgIHZhciBvYnNlcnZhYmxlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIG9ic2VydmFibGVzW19pIC0gMF0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgcHJvamVjdCA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0eXBlb2YgcHJvamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYnNlcnZhYmxlcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheU9ic2VydmFibGVfMS5BcnJheU9ic2VydmFibGUob2JzZXJ2YWJsZXMpLmxpZnQobmV3IFppcE9wZXJhdG9yKHByb2plY3QpKTtcbn1cbmV4cG9ydHMuemlwU3RhdGljID0gemlwU3RhdGljO1xudmFyIFppcE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBaaXBPcGVyYXRvcihwcm9qZWN0KSB7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICAgIFppcE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgWmlwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QpKTtcbiAgICB9O1xuICAgIHJldHVybiBaaXBPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLlppcE9wZXJhdG9yID0gWmlwT3BlcmF0b3I7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFppcFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhaaXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFppcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByb2plY3QsIHZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWVzID09PSB2b2lkIDApIHsgdmFsdWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaXRlcmF0b3JzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gKHR5cGVvZiBwcm9qZWN0ID09PSAnZnVuY3Rpb24nKSA/IHByb2plY3QgOiBudWxsO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG4gICAgWmlwU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9ycyA9IHRoaXMuaXRlcmF0b3JzO1xuICAgICAgICBpZiAoaXNBcnJheV8xLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgU3RhdGljQXJyYXlJdGVyYXRvcih2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZVtpdGVyYXRvcl8xLiQkaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgU3RhdGljSXRlcmF0b3IodmFsdWVbaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXSgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgWmlwQnVmZmVySXRlcmF0b3IodGhpcy5kZXN0aW5hdGlvbiwgdGhpcywgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgWmlwU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7XG4gICAgICAgIHZhciBsZW4gPSBpdGVyYXRvcnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGxlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JzW2ldO1xuICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLnN0aWxsVW5zdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQoaXRlcmF0b3Iuc3Vic2NyaWJlKGl0ZXJhdG9yLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZS0tOyAvLyBub3QgYW4gb2JzZXJ2YWJsZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBaaXBTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlJbmFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUtLTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFppcFN1YnNjcmliZXIucHJvdG90eXBlLmNoZWNrSXRlcmF0b3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7XG4gICAgICAgIHZhciBsZW4gPSBpdGVyYXRvcnMubGVuZ3RoO1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICAvLyBhYm9ydCBpZiBub3QgYWxsIG9mIHRoZW0gaGF2ZSB2YWx1ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvci5oYXNWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXRlcmF0b3IuaGFzVmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc2hvdWxkQ29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JzW2ldO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBpdCdzIGNvbXBsZXRlZCBub3cgdGhhdCB5b3UndmUgZ290dGVuXG4gICAgICAgICAgICAvLyB0aGUgbmV4dCB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNDb21wbGV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHNob3VsZENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvamVjdCkge1xuICAgICAgICAgICAgdGhpcy5fdHJ5UHJvamVjdChhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZENvbXBsZXRlKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBaaXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5UHJvamVjdCA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChyZXN1bHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFppcFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG5leHBvcnRzLlppcFN1YnNjcmliZXIgPSBaaXBTdWJzY3JpYmVyO1xudmFyIFN0YXRpY0l0ZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdGF0aWNJdGVyYXRvcihpdGVyYXRvcikge1xuICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7XG4gICAgICAgIHRoaXMubmV4dFJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgU3RhdGljSXRlcmF0b3IucHJvdG90eXBlLmhhc1ZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFN0YXRpY0l0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0O1xuICAgICAgICB0aGlzLm5leHRSZXN1bHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFN0YXRpY0l0ZXJhdG9yLnByb3RvdHlwZS5oYXNDb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXh0UmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV4dFJlc3VsdCAmJiBuZXh0UmVzdWx0LmRvbmU7XG4gICAgfTtcbiAgICByZXR1cm4gU3RhdGljSXRlcmF0b3I7XG59KCkpO1xudmFyIFN0YXRpY0FycmF5SXRlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0YXRpY0FycmF5SXRlcmF0b3IoYXJyYXkpIHtcbiAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5O1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB9XG4gICAgU3RhdGljQXJyYXlJdGVyYXRvci5wcm90b3R5cGVbaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTdGF0aWNBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5pbmRleCsrO1xuICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLmFycmF5O1xuICAgICAgICByZXR1cm4gaSA8IHRoaXMubGVuZ3RoID8geyB2YWx1ZTogYXJyYXlbaV0sIGRvbmU6IGZhbHNlIH0gOiB7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH07XG4gICAgfTtcbiAgICBTdGF0aWNBcnJheUl0ZXJhdG9yLnByb3RvdHlwZS5oYXNWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoID4gdGhpcy5pbmRleDtcbiAgICB9O1xuICAgIFN0YXRpY0FycmF5SXRlcmF0b3IucHJvdG90eXBlLmhhc0NvbXBsZXRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoID09PSB0aGlzLmluZGV4O1xuICAgIH07XG4gICAgcmV0dXJuIFN0YXRpY0FycmF5SXRlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBaaXBCdWZmZXJJdGVyYXRvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFppcEJ1ZmZlckl0ZXJhdG9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFppcEJ1ZmZlckl0ZXJhdG9yKGRlc3RpbmF0aW9uLCBwYXJlbnQsIG9ic2VydmFibGUpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTtcbiAgICAgICAgdGhpcy5zdGlsbFVuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBaaXBCdWZmZXJJdGVyYXRvci5wcm90b3R5cGVbaXRlcmF0b3JfMS4kJGl0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBOT1RFOiB0aGVyZSBpcyBhY3R1YWxseSBhIG5hbWUgY29sbGlzaW9uIGhlcmUgd2l0aCBTdWJzY3JpYmVyLm5leHQgYW5kIEl0ZXJhdG9yLm5leHRcbiAgICAvLyAgICB0aGlzIGlzIGxlZ2l0IGJlY2F1c2UgYG5leHQoKWAgd2lsbCBuZXZlciBiZSBjYWxsZWQgYnkgYSBzdWJzY3JpcHRpb24gaW4gdGhpcyBjYXNlLlxuICAgIFppcEJ1ZmZlckl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwICYmIHRoaXMuaXNDb21wbGV0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBidWZmZXIuc2hpZnQoKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgWmlwQnVmZmVySXRlcmF0b3IucHJvdG90eXBlLmhhc1ZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIubGVuZ3RoID4gMDtcbiAgICB9O1xuICAgIFppcEJ1ZmZlckl0ZXJhdG9yLnByb3RvdHlwZS5oYXNDb21wbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0NvbXBsZXRlO1xuICAgIH07XG4gICAgWmlwQnVmZmVySXRlcmF0b3IucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUluYWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFppcEJ1ZmZlckl0ZXJhdG9yLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2goaW5uZXJWYWx1ZSk7XG4gICAgICAgIHRoaXMucGFyZW50LmNoZWNrSXRlcmF0b3JzKCk7XG4gICAgfTtcbiAgICBaaXBCdWZmZXJJdGVyYXRvci5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCB0aGlzLm9ic2VydmFibGUsIHRoaXMsIGluZGV4KTtcbiAgICB9O1xuICAgIHJldHVybiBaaXBCdWZmZXJJdGVyYXRvcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD16aXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvemlwLmpzXG4vLyBtb2R1bGUgaWQgPSA0NDlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  853. /***/ },
  854. /* 450 */
  855. /***/ function(module, exports, __webpack_require__) {
  856. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar ajax_1 = __webpack_require__(451);\nObservable_1.Observable.ajax = ajax_1.ajax;\n//# sourceMappingURL=ajax.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2RvbS9hamF4LmpzPzc3NjQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGFqYXhfMSA9IHJlcXVpcmUoJy4uLy4uLy4uL29ic2VydmFibGUvZG9tL2FqYXgnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLmFqYXggPSBhamF4XzEuYWpheDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFqYXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29ic2VydmFibGUvZG9tL2FqYXguanNcbi8vIG1vZHVsZSBpZCA9IDQ1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  857. /***/ },
  858. /* 451 */
  859. /***/ function(module, exports, __webpack_require__) {
  860. eval("\"use strict\";\nvar AjaxObservable_1 = __webpack_require__(452);\nexports.ajax = AjaxObservable_1.AjaxObservable.create;\n//# sourceMappingURL=ajax.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZG9tL2FqYXguanM/YjhkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBBamF4T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi9BamF4T2JzZXJ2YWJsZScpO1xuZXhwb3J0cy5hamF4ID0gQWpheE9ic2VydmFibGVfMS5BamF4T2JzZXJ2YWJsZS5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hamF4LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29ic2VydmFibGUvZG9tL2FqYXguanNcbi8vIG1vZHVsZSBpZCA9IDQ1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  861. /***/ },
  862. /* 452 */
  863. /***/ function(module, exports, __webpack_require__) {
  864. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar root_1 = __webpack_require__(7);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar Observable_1 = __webpack_require__(6);\nvar Subscriber_1 = __webpack_require__(9);\nvar map_1 = __webpack_require__(55);\nfunction getCORSRequest() {\n if (root_1.root.XMLHttpRequest) {\n var xhr = new root_1.root.XMLHttpRequest();\n if ('withCredentials' in xhr) {\n xhr.withCredentials = !!this.withCredentials;\n }\n return xhr;\n }\n else if (!!root_1.root.XDomainRequest) {\n return new root_1.root.XDomainRequest();\n }\n else {\n throw new Error('CORS is not supported by your browser');\n }\n}\nfunction getXMLHttpRequest() {\n if (root_1.root.XMLHttpRequest) {\n return new root_1.root.XMLHttpRequest();\n }\n else {\n var progId = void 0;\n try {\n var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];\n for (var i = 0; i < 3; i++) {\n try {\n progId = progIds[i];\n if (new root_1.root.ActiveXObject(progId)) {\n break;\n }\n }\n catch (e) {\n }\n }\n return new root_1.root.ActiveXObject(progId);\n }\n catch (e) {\n throw new Error('XMLHttpRequest is not supported by your browser');\n }\n }\n}\nfunction ajaxGet(url, headers) {\n if (headers === void 0) { headers = null; }\n return new AjaxObservable({ method: 'GET', url: url, headers: headers });\n}\nexports.ajaxGet = ajaxGet;\n;\nfunction ajaxPost(url, body, headers) {\n return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });\n}\nexports.ajaxPost = ajaxPost;\n;\nfunction ajaxDelete(url, headers) {\n return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });\n}\nexports.ajaxDelete = ajaxDelete;\n;\nfunction ajaxPut(url, body, headers) {\n return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });\n}\nexports.ajaxPut = ajaxPut;\n;\nfunction ajaxGetJSON(url, headers) {\n return new AjaxObservable({ method: 'GET', url: url, responseType: 'json', headers: headers })\n .lift(new map_1.MapOperator(function (x, index) { return x.response; }, null));\n}\nexports.ajaxGetJSON = ajaxGetJSON;\n;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar AjaxObservable = (function (_super) {\n __extends(AjaxObservable, _super);\n function AjaxObservable(urlOrRequest) {\n _super.call(this);\n var request = {\n async: true,\n createXHR: function () {\n return this.crossDomain ? getCORSRequest.call(this) : getXMLHttpRequest();\n },\n crossDomain: false,\n withCredentials: false,\n headers: {},\n method: 'GET',\n responseType: 'json',\n timeout: 0\n };\n if (typeof urlOrRequest === 'string') {\n request.url = urlOrRequest;\n }\n else {\n for (var prop in urlOrRequest) {\n if (urlOrRequest.hasOwnProperty(prop)) {\n request[prop] = urlOrRequest[prop];\n }\n }\n }\n this.request = request;\n }\n AjaxObservable.prototype._subscribe = function (subscriber) {\n return new AjaxSubscriber(subscriber, this.request);\n };\n /**\n * Creates an observable for an Ajax request with either a request object with\n * url, headers, etc or a string for a URL.\n *\n * @example\n * source = Rx.Observable.ajax('/products');\n * source = Rx.Observable.ajax({ url: 'products', method: 'GET' });\n *\n * @param {string|Object} request Can be one of the following:\n * A string of the URL to make the Ajax call.\n * An object with the following properties\n * - url: URL of the request\n * - body: The body of the request\n * - method: Method of the request, such as GET, POST, PUT, PATCH, DELETE\n * - async: Whether the request is async\n * - headers: Optional headers\n * - crossDomain: true if a cross domain request, else false\n * - createXHR: a function to override if you need to use an alternate\n * XMLHttpRequest implementation.\n * - resultSelector: a function to use to alter the output value type of\n * the Observable. Gets {@link AjaxResponse} as an argument.\n * @return {Observable} An observable sequence containing the XMLHttpRequest.\n * @static true\n * @name ajax\n * @owner Observable\n */\n AjaxObservable.create = (function () {\n var create = function (urlOrRequest) {\n return new AjaxObservable(urlOrRequest);\n };\n create.get = ajaxGet;\n create.post = ajaxPost;\n create.delete = ajaxDelete;\n create.put = ajaxPut;\n create.getJSON = ajaxGetJSON;\n return create;\n })();\n return AjaxObservable;\n}(Observable_1.Observable));\nexports.AjaxObservable = AjaxObservable;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AjaxSubscriber = (function (_super) {\n __extends(AjaxSubscriber, _super);\n function AjaxSubscriber(destination, request) {\n _super.call(this, destination);\n this.request = request;\n this.done = false;\n var headers = request.headers = request.headers || {};\n // force CORS if requested\n if (!request.crossDomain && !headers['X-Requested-With']) {\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n // ensure content type is set\n if (!('Content-Type' in headers) && !(root_1.root.FormData && request.body instanceof root_1.root.FormData) && typeof request.body !== 'undefined') {\n headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';\n }\n // properly serialize body\n request.body = this.serializeBody(request.body, request.headers['Content-Type']);\n this.send();\n }\n AjaxSubscriber.prototype.next = function (e) {\n this.done = true;\n var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;\n var response = new AjaxResponse(e, xhr, request);\n destination.next(response);\n };\n AjaxSubscriber.prototype.send = function () {\n var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;\n var createXHR = request.createXHR;\n var xhr = tryCatch_1.tryCatch(createXHR).call(request);\n if (xhr === errorObject_1.errorObject) {\n this.error(errorObject_1.errorObject.e);\n }\n else {\n this.xhr = xhr;\n // open XHR first\n var result = void 0;\n if (user) {\n result = tryCatch_1.tryCatch(xhr.open).call(xhr, method, url, async, user, password);\n }\n else {\n result = tryCatch_1.tryCatch(xhr.open).call(xhr, method, url, async);\n }\n if (result === errorObject_1.errorObject) {\n this.error(errorObject_1.errorObject.e);\n return null;\n }\n // timeout and responseType can be set once the XHR is open\n xhr.timeout = request.timeout;\n xhr.responseType = request.responseType;\n // set headers\n this.setHeaders(xhr, headers);\n // now set up the events\n this.setupEvents(xhr, request);\n // finally send the request\n result = body ? tryCatch_1.tryCatch(xhr.send).call(xhr, body) : tryCatch_1.tryCatch(xhr.send).call(xhr);\n if (result === errorObject_1.errorObject) {\n this.error(errorObject_1.errorObject.e);\n return null;\n }\n }\n return xhr;\n };\n AjaxSubscriber.prototype.serializeBody = function (body, contentType) {\n if (!body || typeof body === 'string') {\n return body;\n }\n else if (root_1.root.FormData && body instanceof root_1.root.FormData) {\n return body;\n }\n if (contentType) {\n var splitIndex = contentType.indexOf(';');\n if (splitIndex !== -1) {\n contentType = contentType.substring(0, splitIndex);\n }\n }\n switch (contentType) {\n case 'application/x-www-form-urlencoded':\n return Object.keys(body).map(function (key) { return (encodeURI(key) + \"=\" + encodeURI(body[key])); }).join('&');\n case 'application/json':\n return JSON.stringify(body);\n default:\n return body;\n }\n };\n AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {\n for (var key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n };\n AjaxSubscriber.prototype.setupEvents = function (xhr, request) {\n var progressSubscriber = request.progressSubscriber;\n function xhrTimeout(e) {\n var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxTimeoutError(this, request)); //TODO: Make betterer.\n }\n ;\n xhr.ontimeout = xhrTimeout;\n xhrTimeout.request = request;\n xhrTimeout.subscriber = this;\n xhrTimeout.progressSubscriber = progressSubscriber;\n if (xhr.upload && 'withCredentials' in xhr && root_1.root.XDomainRequest) {\n if (progressSubscriber) {\n var xhrProgress_1;\n xhrProgress_1 = function (e) {\n var progressSubscriber = xhrProgress_1.progressSubscriber;\n progressSubscriber.next(e);\n };\n xhr.onprogress = xhrProgress_1;\n xhrProgress_1.progressSubscriber = progressSubscriber;\n }\n var xhrError_1;\n xhrError_1 = function (e) {\n var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxError('ajax error', this, request));\n };\n xhr.onerror = xhrError_1;\n xhrError_1.request = request;\n xhrError_1.subscriber = this;\n xhrError_1.progressSubscriber = progressSubscriber;\n }\n function xhrReadyStateChange(e) {\n var _a = xhrReadyStateChange, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;\n if (this.readyState === 4) {\n // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n var status_1 = this.status === 1223 ? 204 : this.status;\n var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);\n // fix status code when it is 0 (0 status is undocumented).\n // Occurs when accessing file resources or on Android 4.1 stock browser\n // while retrieving files from application cache.\n if (status_1 === 0) {\n status_1 = response ? 200 : 0;\n }\n if (200 <= status_1 && status_1 < 300) {\n if (progressSubscriber) {\n progressSubscriber.complete();\n }\n subscriber.next(e);\n subscriber.complete();\n }\n else {\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxError('ajax error ' + status_1, this, request));\n }\n }\n }\n ;\n xhr.onreadystatechange = xhrReadyStateChange;\n xhrReadyStateChange.subscriber = this;\n xhrReadyStateChange.progressSubscriber = progressSubscriber;\n xhrReadyStateChange.request = request;\n };\n AjaxSubscriber.prototype.unsubscribe = function () {\n var _a = this, done = _a.done, xhr = _a.xhr;\n if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {\n xhr.abort();\n }\n _super.prototype.unsubscribe.call(this);\n };\n return AjaxSubscriber;\n}(Subscriber_1.Subscriber));\nexports.AjaxSubscriber = AjaxSubscriber;\n/**\n * A normalized AJAX response.\n *\n * @see {@link ajax}\n *\n * @class AjaxResponse\n */\nvar AjaxResponse = (function () {\n function AjaxResponse(originalEvent, xhr, request) {\n this.originalEvent = originalEvent;\n this.xhr = xhr;\n this.request = request;\n this.status = xhr.status;\n this.responseType = xhr.responseType || request.responseType;\n switch (this.responseType) {\n case 'json':\n if ('response' in xhr) {\n //IE does not support json as responseType, parse it internally\n this.response = xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');\n }\n else {\n this.response = JSON.parse(xhr.responseText || 'null');\n }\n break;\n case 'xml':\n this.response = xhr.responseXML;\n break;\n case 'text':\n default:\n this.response = ('response' in xhr) ? xhr.response : xhr.responseText;\n break;\n }\n }\n return AjaxResponse;\n}());\nexports.AjaxResponse = AjaxResponse;\n/**\n * A normalized AJAX error.\n *\n * @see {@link ajax}\n *\n * @class AjaxError\n */\nvar AjaxError = (function (_super) {\n __extends(AjaxError, _super);\n function AjaxError(message, xhr, request) {\n _super.call(this, message);\n this.message = message;\n this.xhr = xhr;\n this.request = request;\n this.status = xhr.status;\n }\n return AjaxError;\n}(Error));\nexports.AjaxError = AjaxError;\n/**\n * @see {@link ajax}\n *\n * @class AjaxTimeoutError\n */\nvar AjaxTimeoutError = (function (_super) {\n __extends(AjaxTimeoutError, _super);\n function AjaxTimeoutError(xhr, request) {\n _super.call(this, 'ajax timeout', xhr, request);\n }\n return AjaxTimeoutError;\n}(AjaxError));\nexports.AjaxTimeoutError = AjaxTimeoutError;\n//# sourceMappingURL=AjaxObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZG9tL0FqYXhPYnNlcnZhYmxlLmpzPzg3YzIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciByb290XzEgPSByZXF1aXJlKCcuLi8uLi91dGlsL3Jvb3QnKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi8uLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uLy4uL1N1YnNjcmliZXInKTtcbnZhciBtYXBfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL21hcCcpO1xuZnVuY3Rpb24gZ2V0Q09SU1JlcXVlc3QoKSB7XG4gICAgaWYgKHJvb3RfMS5yb290LlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgcm9vdF8xLnJvb3QuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgaWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocikge1xuICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHhocjtcbiAgICB9XG4gICAgZWxzZSBpZiAoISFyb290XzEucm9vdC5YRG9tYWluUmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IHJvb3RfMS5yb290LlhEb21haW5SZXF1ZXN0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NPUlMgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXInKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRYTUxIdHRwUmVxdWVzdCgpIHtcbiAgICBpZiAocm9vdF8xLnJvb3QuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyByb290XzEucm9vdC5YTUxIdHRwUmVxdWVzdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHByb2dJZCA9IHZvaWQgMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwcm9nSWRzID0gWydNc3htbDIuWE1MSFRUUCcsICdNaWNyb3NvZnQuWE1MSFRUUCcsICdNc3htbDIuWE1MSFRUUC40LjAnXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ0lkID0gcHJvZ0lkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyByb290XzEucm9vdC5BY3RpdmVYT2JqZWN0KHByb2dJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyByb290XzEucm9vdC5BY3RpdmVYT2JqZWN0KHByb2dJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWE1MSHR0cFJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXInKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFqYXhHZXQodXJsLCBoZWFkZXJzKSB7XG4gICAgaWYgKGhlYWRlcnMgPT09IHZvaWQgMCkgeyBoZWFkZXJzID0gbnVsbDsgfVxuICAgIHJldHVybiBuZXcgQWpheE9ic2VydmFibGUoeyBtZXRob2Q6ICdHRVQnLCB1cmw6IHVybCwgaGVhZGVyczogaGVhZGVycyB9KTtcbn1cbmV4cG9ydHMuYWpheEdldCA9IGFqYXhHZXQ7XG47XG5mdW5jdGlvbiBhamF4UG9zdCh1cmwsIGJvZHksIGhlYWRlcnMpIHtcbiAgICByZXR1cm4gbmV3IEFqYXhPYnNlcnZhYmxlKHsgbWV0aG9kOiAnUE9TVCcsIHVybDogdXJsLCBib2R5OiBib2R5LCBoZWFkZXJzOiBoZWFkZXJzIH0pO1xufVxuZXhwb3J0cy5hamF4UG9zdCA9IGFqYXhQb3N0O1xuO1xuZnVuY3Rpb24gYWpheERlbGV0ZSh1cmwsIGhlYWRlcnMpIHtcbiAgICByZXR1cm4gbmV3IEFqYXhPYnNlcnZhYmxlKHsgbWV0aG9kOiAnREVMRVRFJywgdXJsOiB1cmwsIGhlYWRlcnM6IGhlYWRlcnMgfSk7XG59XG5leHBvcnRzLmFqYXhEZWxldGUgPSBhamF4RGVsZXRlO1xuO1xuZnVuY3Rpb24gYWpheFB1dCh1cmwsIGJvZHksIGhlYWRlcnMpIHtcbiAgICByZXR1cm4gbmV3IEFqYXhPYnNlcnZhYmxlKHsgbWV0aG9kOiAnUFVUJywgdXJsOiB1cmwsIGJvZHk6IGJvZHksIGhlYWRlcnM6IGhlYWRlcnMgfSk7XG59XG5leHBvcnRzLmFqYXhQdXQgPSBhamF4UHV0O1xuO1xuZnVuY3Rpb24gYWpheEdldEpTT04odXJsLCBoZWFkZXJzKSB7XG4gICAgcmV0dXJuIG5ldyBBamF4T2JzZXJ2YWJsZSh7IG1ldGhvZDogJ0dFVCcsIHVybDogdXJsLCByZXNwb25zZVR5cGU6ICdqc29uJywgaGVhZGVyczogaGVhZGVycyB9KVxuICAgICAgICAubGlmdChuZXcgbWFwXzEuTWFwT3BlcmF0b3IoZnVuY3Rpb24gKHgsIGluZGV4KSB7IHJldHVybiB4LnJlc3BvbnNlOyB9LCBudWxsKSk7XG59XG5leHBvcnRzLmFqYXhHZXRKU09OID0gYWpheEdldEpTT047XG47XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIEFqYXhPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQWpheE9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWpheE9ic2VydmFibGUodXJsT3JSZXF1ZXN0KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlWEhSOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3Jvc3NEb21haW4gPyBnZXRDT1JTUmVxdWVzdC5jYWxsKHRoaXMpIDogZ2V0WE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcm9zc0RvbWFpbjogZmFsc2UsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgICAgICB0aW1lb3V0OiAwXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlb2YgdXJsT3JSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVxdWVzdC51cmwgPSB1cmxPclJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHVybE9yUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGlmICh1cmxPclJlcXVlc3QuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFtwcm9wXSA9IHVybE9yUmVxdWVzdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB9XG4gICAgQWpheE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IEFqYXhTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucmVxdWVzdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9ic2VydmFibGUgZm9yIGFuIEFqYXggcmVxdWVzdCB3aXRoIGVpdGhlciBhIHJlcXVlc3Qgb2JqZWN0IHdpdGhcbiAgICAgKiB1cmwsIGhlYWRlcnMsIGV0YyBvciBhIHN0cmluZyBmb3IgYSBVUkwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvdXJjZSA9IFJ4Lk9ic2VydmFibGUuYWpheCgnL3Byb2R1Y3RzJyk7XG4gICAgICogc291cmNlID0gUnguT2JzZXJ2YWJsZS5hamF4KHsgdXJsOiAncHJvZHVjdHMnLCBtZXRob2Q6ICdHRVQnIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSByZXF1ZXN0IENhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAgIEEgc3RyaW5nIG9mIHRoZSBVUkwgdG8gbWFrZSB0aGUgQWpheCBjYWxsLlxuICAgICAqICAgQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzXG4gICAgICogICAtIHVybDogVVJMIG9mIHRoZSByZXF1ZXN0XG4gICAgICogICAtIGJvZHk6IFRoZSBib2R5IG9mIHRoZSByZXF1ZXN0XG4gICAgICogICAtIG1ldGhvZDogTWV0aG9kIG9mIHRoZSByZXF1ZXN0LCBzdWNoIGFzIEdFVCwgUE9TVCwgUFVULCBQQVRDSCwgREVMRVRFXG4gICAgICogICAtIGFzeW5jOiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFzeW5jXG4gICAgICogICAtIGhlYWRlcnM6IE9wdGlvbmFsIGhlYWRlcnNcbiAgICAgKiAgIC0gY3Jvc3NEb21haW46IHRydWUgaWYgYSBjcm9zcyBkb21haW4gcmVxdWVzdCwgZWxzZSBmYWxzZVxuICAgICAqICAgLSBjcmVhdGVYSFI6IGEgZnVuY3Rpb24gdG8gb3ZlcnJpZGUgaWYgeW91IG5lZWQgdG8gdXNlIGFuIGFsdGVybmF0ZVxuICAgICAqICAgWE1MSHR0cFJlcXVlc3QgaW1wbGVtZW50YXRpb24uXG4gICAgICogICAtIHJlc3VsdFNlbGVjdG9yOiBhIGZ1bmN0aW9uIHRvIHVzZSB0byBhbHRlciB0aGUgb3V0cHV0IHZhbHVlIHR5cGUgb2ZcbiAgICAgKiAgIHRoZSBPYnNlcnZhYmxlLiBHZXRzIHtAbGluayBBamF4UmVzcG9uc2V9IGFzIGFuIGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIG9ic2VydmFibGUgc2VxdWVuY2UgY29udGFpbmluZyB0aGUgWE1MSHR0cFJlcXVlc3QuXG4gICAgICogQHN0YXRpYyB0cnVlXG4gICAgICogQG5hbWUgYWpheFxuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgKi9cbiAgICBBamF4T2JzZXJ2YWJsZS5jcmVhdGUgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRlID0gZnVuY3Rpb24gKHVybE9yUmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBamF4T2JzZXJ2YWJsZSh1cmxPclJlcXVlc3QpO1xuICAgICAgICB9O1xuICAgICAgICBjcmVhdGUuZ2V0ID0gYWpheEdldDtcbiAgICAgICAgY3JlYXRlLnBvc3QgPSBhamF4UG9zdDtcbiAgICAgICAgY3JlYXRlLmRlbGV0ZSA9IGFqYXhEZWxldGU7XG4gICAgICAgIGNyZWF0ZS5wdXQgPSBhamF4UHV0O1xuICAgICAgICBjcmVhdGUuZ2V0SlNPTiA9IGFqYXhHZXRKU09OO1xuICAgICAgICByZXR1cm4gY3JlYXRlO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIEFqYXhPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5BamF4T2JzZXJ2YWJsZSA9IEFqYXhPYnNlcnZhYmxlO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBBamF4U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFqYXhTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFqYXhTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCByZXF1ZXN0KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHZhciBoZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzID0gcmVxdWVzdC5oZWFkZXJzIHx8IHt9O1xuICAgICAgICAvLyBmb3JjZSBDT1JTIGlmIHJlcXVlc3RlZFxuICAgICAgICBpZiAoIXJlcXVlc3QuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbJ1gtUmVxdWVzdGVkLVdpdGgnXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JztcbiAgICAgICAgfVxuICAgICAgICAvLyBlbnN1cmUgY29udGVudCB0eXBlIGlzIHNldFxuICAgICAgICBpZiAoISgnQ29udGVudC1UeXBlJyBpbiBoZWFkZXJzKSAmJiAhKHJvb3RfMS5yb290LkZvcm1EYXRhICYmIHJlcXVlc3QuYm9keSBpbnN0YW5jZW9mIHJvb3RfMS5yb290LkZvcm1EYXRhKSAmJiB0eXBlb2YgcmVxdWVzdC5ib2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JztcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm9wZXJseSBzZXJpYWxpemUgYm9keVxuICAgICAgICByZXF1ZXN0LmJvZHkgPSB0aGlzLnNlcmlhbGl6ZUJvZHkocmVxdWVzdC5ib2R5LCByZXF1ZXN0LmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKTtcbiAgICAgICAgdGhpcy5zZW5kKCk7XG4gICAgfVxuICAgIEFqYXhTdWJzY3JpYmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgeGhyID0gX2EueGhyLCByZXF1ZXN0ID0gX2EucmVxdWVzdCwgZGVzdGluYXRpb24gPSBfYS5kZXN0aW5hdGlvbjtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gbmV3IEFqYXhSZXNwb25zZShlLCB4aHIsIHJlcXVlc3QpO1xuICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHJlc3BvbnNlKTtcbiAgICB9O1xuICAgIEFqYXhTdWJzY3JpYmVyLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCByZXF1ZXN0ID0gX2EucmVxdWVzdCwgX2IgPSBfYS5yZXF1ZXN0LCB1c2VyID0gX2IudXNlciwgbWV0aG9kID0gX2IubWV0aG9kLCB1cmwgPSBfYi51cmwsIGFzeW5jID0gX2IuYXN5bmMsIHBhc3N3b3JkID0gX2IucGFzc3dvcmQsIGhlYWRlcnMgPSBfYi5oZWFkZXJzLCBib2R5ID0gX2IuYm9keTtcbiAgICAgICAgdmFyIGNyZWF0ZVhIUiA9IHJlcXVlc3QuY3JlYXRlWEhSO1xuICAgICAgICB2YXIgeGhyID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChjcmVhdGVYSFIpLmNhbGwocmVxdWVzdCk7XG4gICAgICAgIGlmICh4aHIgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMueGhyID0geGhyO1xuICAgICAgICAgICAgLy8gb3BlbiBYSFIgZmlyc3RcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goeGhyLm9wZW4pLmNhbGwoeGhyLCBtZXRob2QsIHVybCwgYXN5bmMsIHVzZXIsIHBhc3N3b3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2goeGhyLm9wZW4pLmNhbGwoeGhyLCBtZXRob2QsIHVybCwgYXN5bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRpbWVvdXQgYW5kIHJlc3BvbnNlVHlwZSBjYW4gYmUgc2V0IG9uY2UgdGhlIFhIUiBpcyBvcGVuXG4gICAgICAgICAgICB4aHIudGltZW91dCA9IHJlcXVlc3QudGltZW91dDtcbiAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSByZXF1ZXN0LnJlc3BvbnNlVHlwZTtcbiAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzXG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlcnMoeGhyLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIC8vIG5vdyBzZXQgdXAgdGhlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5zZXR1cEV2ZW50cyh4aHIsIHJlcXVlc3QpO1xuICAgICAgICAgICAgLy8gZmluYWxseSBzZW5kIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICByZXN1bHQgPSBib2R5ID8gdHJ5Q2F0Y2hfMS50cnlDYXRjaCh4aHIuc2VuZCkuY2FsbCh4aHIsIGJvZHkpIDogdHJ5Q2F0Y2hfMS50cnlDYXRjaCh4aHIuc2VuZCkuY2FsbCh4aHIpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geGhyO1xuICAgIH07XG4gICAgQWpheFN1YnNjcmliZXIucHJvdG90eXBlLnNlcmlhbGl6ZUJvZHkgPSBmdW5jdGlvbiAoYm9keSwgY29udGVudFR5cGUpIHtcbiAgICAgICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocm9vdF8xLnJvb3QuRm9ybURhdGEgJiYgYm9keSBpbnN0YW5jZW9mIHJvb3RfMS5yb290LkZvcm1EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gYm9keTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBzcGxpdEluZGV4ID0gY29udGVudFR5cGUuaW5kZXhPZignOycpO1xuICAgICAgICAgICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYm9keSkubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIChlbmNvZGVVUkkoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJKGJvZHlba2V5XSkpOyB9KS5qb2luKCcmJyk7XG4gICAgICAgICAgICBjYXNlICdhcHBsaWNhdGlvbi9qc29uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBib2R5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBamF4U3Vic2NyaWJlci5wcm90b3R5cGUuc2V0SGVhZGVycyA9IGZ1bmN0aW9uICh4aHIsIGhlYWRlcnMpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFqYXhTdWJzY3JpYmVyLnByb3RvdHlwZS5zZXR1cEV2ZW50cyA9IGZ1bmN0aW9uICh4aHIsIHJlcXVlc3QpIHtcbiAgICAgICAgdmFyIHByb2dyZXNzU3Vic2NyaWJlciA9IHJlcXVlc3QucHJvZ3Jlc3NTdWJzY3JpYmVyO1xuICAgICAgICBmdW5jdGlvbiB4aHJUaW1lb3V0KGUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHhoclRpbWVvdXQsIHN1YnNjcmliZXIgPSBfYS5zdWJzY3JpYmVyLCBwcm9ncmVzc1N1YnNjcmliZXIgPSBfYS5wcm9ncmVzc1N1YnNjcmliZXIsIHJlcXVlc3QgPSBfYS5yZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKHByb2dyZXNzU3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzU3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEFqYXhUaW1lb3V0RXJyb3IodGhpcywgcmVxdWVzdCkpOyAvL1RPRE86IE1ha2UgYmV0dGVyZXIuXG4gICAgICAgIH1cbiAgICAgICAgO1xuICAgICAgICB4aHIub250aW1lb3V0ID0geGhyVGltZW91dDtcbiAgICAgICAgeGhyVGltZW91dC5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgICAgeGhyVGltZW91dC5zdWJzY3JpYmVyID0gdGhpcztcbiAgICAgICAgeGhyVGltZW91dC5wcm9ncmVzc1N1YnNjcmliZXIgPSBwcm9ncmVzc1N1YnNjcmliZXI7XG4gICAgICAgIGlmICh4aHIudXBsb2FkICYmICd3aXRoQ3JlZGVudGlhbHMnIGluIHhociAmJiByb290XzEucm9vdC5YRG9tYWluUmVxdWVzdCkge1xuICAgICAgICAgICAgaWYgKHByb2dyZXNzU3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgIHZhciB4aHJQcm9ncmVzc18xO1xuICAgICAgICAgICAgICAgIHhoclByb2dyZXNzXzEgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3NTdWJzY3JpYmVyID0geGhyUHJvZ3Jlc3NfMS5wcm9ncmVzc1N1YnNjcmliZXI7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzU3Vic2NyaWJlci5uZXh0KGUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSB4aHJQcm9ncmVzc18xO1xuICAgICAgICAgICAgICAgIHhoclByb2dyZXNzXzEucHJvZ3Jlc3NTdWJzY3JpYmVyID0gcHJvZ3Jlc3NTdWJzY3JpYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHhockVycm9yXzE7XG4gICAgICAgICAgICB4aHJFcnJvcl8xID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSB4aHJFcnJvcl8xLCBwcm9ncmVzc1N1YnNjcmliZXIgPSBfYS5wcm9ncmVzc1N1YnNjcmliZXIsIHN1YnNjcmliZXIgPSBfYS5zdWJzY3JpYmVyLCByZXF1ZXN0ID0gX2EucmVxdWVzdDtcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NTdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzU3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgQWpheEVycm9yKCdhamF4IGVycm9yJywgdGhpcywgcmVxdWVzdCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHhoci5vbmVycm9yID0geGhyRXJyb3JfMTtcbiAgICAgICAgICAgIHhockVycm9yXzEucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgICAgICB4aHJFcnJvcl8xLnN1YnNjcmliZXIgPSB0aGlzO1xuICAgICAgICAgICAgeGhyRXJyb3JfMS5wcm9ncmVzc1N1YnNjcmliZXIgPSBwcm9ncmVzc1N1YnNjcmliZXI7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24geGhyUmVhZHlTdGF0ZUNoYW5nZShlKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB4aHJSZWFkeVN0YXRlQ2hhbmdlLCBzdWJzY3JpYmVyID0gX2Euc3Vic2NyaWJlciwgcHJvZ3Jlc3NTdWJzY3JpYmVyID0gX2EucHJvZ3Jlc3NTdWJzY3JpYmVyLCByZXF1ZXN0ID0gX2EucmVxdWVzdDtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MClcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzXzEgPSB0aGlzLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHRoaXMuc3RhdHVzO1xuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9ICh0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnID8gKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5yZXNwb25zZVRleHQpIDogdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS5cbiAgICAgICAgICAgICAgICAvLyBPY2N1cnMgd2hlbiBhY2Nlc3NpbmcgZmlsZSByZXNvdXJjZXMgb3Igb24gQW5kcm9pZCA0LjEgc3RvY2sgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIHdoaWxlIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBhcHBsaWNhdGlvbiBjYWNoZS5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzXzEgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzXzEgPSByZXNwb25zZSA/IDIwMCA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgyMDAgPD0gc3RhdHVzXzEgJiYgc3RhdHVzXzEgPCAzMDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzU3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGUpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NTdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1N1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgQWpheEVycm9yKCdhamF4IGVycm9yICcgKyBzdGF0dXNfMSwgdGhpcywgcmVxdWVzdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB4aHJSZWFkeVN0YXRlQ2hhbmdlO1xuICAgICAgICB4aHJSZWFkeVN0YXRlQ2hhbmdlLnN1YnNjcmliZXIgPSB0aGlzO1xuICAgICAgICB4aHJSZWFkeVN0YXRlQ2hhbmdlLnByb2dyZXNzU3Vic2NyaWJlciA9IHByb2dyZXNzU3Vic2NyaWJlcjtcbiAgICAgICAgeGhyUmVhZHlTdGF0ZUNoYW5nZS5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB9O1xuICAgIEFqYXhTdWJzY3JpYmVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZG9uZSA9IF9hLmRvbmUsIHhociA9IF9hLnhocjtcbiAgICAgICAgaWYgKCFkb25lICYmIHhociAmJiB4aHIucmVhZHlTdGF0ZSAhPT0gNCAmJiB0eXBlb2YgeGhyLmFib3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB4aHIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQWpheFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG5leHBvcnRzLkFqYXhTdWJzY3JpYmVyID0gQWpheFN1YnNjcmliZXI7XG4vKipcbiAqIEEgbm9ybWFsaXplZCBBSkFYIHJlc3BvbnNlLlxuICpcbiAqIEBzZWUge0BsaW5rIGFqYXh9XG4gKlxuICogQGNsYXNzIEFqYXhSZXNwb25zZVxuICovXG52YXIgQWpheFJlc3BvbnNlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBamF4UmVzcG9uc2Uob3JpZ2luYWxFdmVudCwgeGhyLCByZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gICAgICAgIHRoaXMueGhyID0geGhyO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHhoci5zdGF0dXM7XG4gICAgICAgIHRoaXMucmVzcG9uc2VUeXBlID0geGhyLnJlc3BvbnNlVHlwZSB8fCByZXF1ZXN0LnJlc3BvbnNlVHlwZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICAgICAgaWYgKCdyZXNwb25zZScgaW4geGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vSUUgZG9lcyBub3Qgc3VwcG9ydCBqc29uIGFzIHJlc3BvbnNlVHlwZSwgcGFyc2UgaXQgaW50ZXJuYWxseVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0geGhyLnJlc3BvbnNlVHlwZSA/IHhoci5yZXNwb25zZSA6IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlIHx8IHhoci5yZXNwb25zZVRleHQgfHwgJ251bGwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQgfHwgJ251bGwnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd4bWwnOlxuICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB4aHIucmVzcG9uc2VYTUw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9ICgncmVzcG9uc2UnIGluIHhocikgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBBamF4UmVzcG9uc2U7XG59KCkpO1xuZXhwb3J0cy5BamF4UmVzcG9uc2UgPSBBamF4UmVzcG9uc2U7XG4vKipcbiAqIEEgbm9ybWFsaXplZCBBSkFYIGVycm9yLlxuICpcbiAqIEBzZWUge0BsaW5rIGFqYXh9XG4gKlxuICogQGNsYXNzIEFqYXhFcnJvclxuICovXG52YXIgQWpheEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQWpheEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFqYXhFcnJvcihtZXNzYWdlLCB4aHIsIHJlcXVlc3QpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMueGhyID0geGhyO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHhoci5zdGF0dXM7XG4gICAgfVxuICAgIHJldHVybiBBamF4RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnRzLkFqYXhFcnJvciA9IEFqYXhFcnJvcjtcbi8qKlxuICogQHNlZSB7QGxpbmsgYWpheH1cbiAqXG4gKiBAY2xhc3MgQWpheFRpbWVvdXRFcnJvclxuICovXG52YXIgQWpheFRpbWVvdXRFcnJvciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFqYXhUaW1lb3V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWpheFRpbWVvdXRFcnJvcih4aHIsIHJlcXVlc3QpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgJ2FqYXggdGltZW91dCcsIHhociwgcmVxdWVzdCk7XG4gICAgfVxuICAgIHJldHVybiBBamF4VGltZW91dEVycm9yO1xufShBamF4RXJyb3IpKTtcbmV4cG9ydHMuQWpheFRpbWVvdXRFcnJvciA9IEFqYXhUaW1lb3V0RXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BamF4T2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2RvbS9BamF4T2JzZXJ2YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNDUyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  865. /***/ },
  866. /* 453 */
  867. /***/ function(module, exports, __webpack_require__) {
  868. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar webSocket_1 = __webpack_require__(454);\nObservable_1.Observable.webSocket = webSocket_1.webSocket;\n//# sourceMappingURL=webSocket.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vYnNlcnZhYmxlL2RvbS93ZWJTb2NrZXQuanM/MDllZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgd2ViU29ja2V0XzEgPSByZXF1aXJlKCcuLi8uLi8uLi9vYnNlcnZhYmxlL2RvbS93ZWJTb2NrZXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLndlYlNvY2tldCA9IHdlYlNvY2tldF8xLndlYlNvY2tldDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYlNvY2tldC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb2JzZXJ2YWJsZS9kb20vd2ViU29ja2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA0NTNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  869. /***/ },
  870. /* 454 */
  871. /***/ function(module, exports, __webpack_require__) {
  872. eval("\"use strict\";\nvar WebSocketSubject_1 = __webpack_require__(455);\nexports.webSocket = WebSocketSubject_1.WebSocketSubject.create;\n//# sourceMappingURL=webSocket.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZG9tL3dlYlNvY2tldC5qcz8yOTJiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIFdlYlNvY2tldFN1YmplY3RfMSA9IHJlcXVpcmUoJy4vV2ViU29ja2V0U3ViamVjdCcpO1xuZXhwb3J0cy53ZWJTb2NrZXQgPSBXZWJTb2NrZXRTdWJqZWN0XzEuV2ViU29ja2V0U3ViamVjdC5jcmVhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJTb2NrZXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9kb20vd2ViU29ja2V0LmpzXG4vLyBtb2R1bGUgaWQgPSA0NTRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  873. /***/ },
  874. /* 455 */
  875. /***/ function(module, exports, __webpack_require__) {
  876. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar Subscriber_1 = __webpack_require__(9);\nvar Observable_1 = __webpack_require__(6);\nvar Subscription_1 = __webpack_require__(11);\nvar root_1 = __webpack_require__(7);\nvar ReplaySubject_1 = __webpack_require__(456);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar assign_1 = __webpack_require__(460);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar WebSocketSubject = (function (_super) {\n __extends(WebSocketSubject, _super);\n function WebSocketSubject(urlConfigOrSource, destination) {\n if (urlConfigOrSource instanceof Observable_1.Observable) {\n _super.call(this, destination, urlConfigOrSource);\n }\n else {\n _super.call(this);\n this.WebSocketCtor = root_1.root.WebSocket;\n this._output = new Subject_1.Subject();\n if (typeof urlConfigOrSource === 'string') {\n this.url = urlConfigOrSource;\n }\n else {\n // WARNING: config object could override important members here.\n assign_1.assign(this, urlConfigOrSource);\n }\n if (!this.WebSocketCtor) {\n throw new Error('no WebSocket constructor can be found');\n }\n this.destination = new ReplaySubject_1.ReplaySubject();\n }\n }\n WebSocketSubject.prototype.resultSelector = function (e) {\n return JSON.parse(e.data);\n };\n /**\n * @param urlConfigOrSource\n * @return {WebSocketSubject}\n * @static true\n * @name webSocket\n * @owner Observable\n */\n WebSocketSubject.create = function (urlConfigOrSource) {\n return new WebSocketSubject(urlConfigOrSource);\n };\n WebSocketSubject.prototype.lift = function (operator) {\n var sock = new WebSocketSubject(this, this.destination);\n sock.operator = operator;\n return sock;\n };\n WebSocketSubject.prototype._resetState = function () {\n this.socket = null;\n if (!this.source) {\n this.destination = new ReplaySubject_1.ReplaySubject();\n }\n this._output = new Subject_1.Subject();\n };\n // TODO: factor this out to be a proper Operator/Subscriber implementation and eliminate closures\n WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {\n var self = this;\n return new Observable_1.Observable(function (observer) {\n var result = tryCatch_1.tryCatch(subMsg)();\n if (result === errorObject_1.errorObject) {\n observer.error(errorObject_1.errorObject.e);\n }\n else {\n self.next(result);\n }\n var subscription = self.subscribe(function (x) {\n var result = tryCatch_1.tryCatch(messageFilter)(x);\n if (result === errorObject_1.errorObject) {\n observer.error(errorObject_1.errorObject.e);\n }\n else if (result) {\n observer.next(x);\n }\n }, function (err) { return observer.error(err); }, function () { return observer.complete(); });\n return function () {\n var result = tryCatch_1.tryCatch(unsubMsg)();\n if (result === errorObject_1.errorObject) {\n observer.error(errorObject_1.errorObject.e);\n }\n else {\n self.next(result);\n }\n subscription.unsubscribe();\n };\n });\n };\n WebSocketSubject.prototype._connectSocket = function () {\n var _this = this;\n var WebSocketCtor = this.WebSocketCtor;\n var observer = this._output;\n var socket = null;\n try {\n socket = this.protocol ?\n new WebSocketCtor(this.url, this.protocol) :\n new WebSocketCtor(this.url);\n this.socket = socket;\n }\n catch (e) {\n observer.error(e);\n return;\n }\n var subscription = new Subscription_1.Subscription(function () {\n _this.socket = null;\n if (socket && socket.readyState === 1) {\n socket.close();\n }\n });\n socket.onopen = function (e) {\n var openObserver = _this.openObserver;\n if (openObserver) {\n openObserver.next(e);\n }\n var queue = _this.destination;\n _this.destination = Subscriber_1.Subscriber.create(function (x) { return socket.readyState === 1 && socket.send(x); }, function (e) {\n var closingObserver = _this.closingObserver;\n if (closingObserver) {\n closingObserver.next(undefined);\n }\n if (e && e.code) {\n socket.close(e.code, e.reason);\n }\n else {\n observer.error(new TypeError('WebSocketSubject.error must be called with an object with an error code, ' +\n 'and an optional reason: { code: number, reason: string }'));\n }\n _this._resetState();\n }, function () {\n var closingObserver = _this.closingObserver;\n if (closingObserver) {\n closingObserver.next(undefined);\n }\n socket.close();\n _this._resetState();\n });\n if (queue && queue instanceof ReplaySubject_1.ReplaySubject) {\n subscription.add(queue.subscribe(_this.destination));\n }\n };\n socket.onerror = function (e) {\n _this._resetState();\n observer.error(e);\n };\n socket.onclose = function (e) {\n _this._resetState();\n var closeObserver = _this.closeObserver;\n if (closeObserver) {\n closeObserver.next(e);\n }\n if (e.wasClean) {\n observer.complete();\n }\n else {\n observer.error(e);\n }\n };\n socket.onmessage = function (e) {\n var result = tryCatch_1.tryCatch(_this.resultSelector)(e);\n if (result === errorObject_1.errorObject) {\n observer.error(errorObject_1.errorObject.e);\n }\n else {\n observer.next(result);\n }\n };\n };\n WebSocketSubject.prototype._subscribe = function (subscriber) {\n var _this = this;\n var source = this.source;\n if (source) {\n return source.subscribe(subscriber);\n }\n if (!this.socket) {\n this._connectSocket();\n }\n var subscription = new Subscription_1.Subscription();\n subscription.add(this._output.subscribe(subscriber));\n subscription.add(function () {\n var socket = _this.socket;\n if (_this._output.observers.length === 0) {\n if (socket && socket.readyState === 1) {\n socket.close();\n }\n _this._resetState();\n }\n });\n return subscription;\n };\n WebSocketSubject.prototype.unsubscribe = function () {\n var _a = this, source = _a.source, socket = _a.socket;\n if (socket && socket.readyState === 1) {\n socket.close();\n this._resetState();\n }\n _super.prototype.unsubscribe.call(this);\n if (!source) {\n this.destination = new ReplaySubject_1.ReplaySubject();\n }\n };\n return WebSocketSubject;\n}(Subject_1.AnonymousSubject));\nexports.WebSocketSubject = WebSocketSubject;\n//# sourceMappingURL=WebSocketSubject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvZG9tL1dlYlNvY2tldFN1YmplY3QuanM/Yzg3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4uLy4uL1N1YmplY3QnKTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi8uLi9TdWJzY3JpYmVyJyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi4vLi4vU3Vic2NyaXB0aW9uJyk7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9yb290Jyk7XG52YXIgUmVwbGF5U3ViamVjdF8xID0gcmVxdWlyZSgnLi4vLi4vUmVwbGF5U3ViamVjdCcpO1xudmFyIHRyeUNhdGNoXzEgPSByZXF1aXJlKCcuLi8uLi91dGlsL3RyeUNhdGNoJyk7XG52YXIgZXJyb3JPYmplY3RfMSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZXJyb3JPYmplY3QnKTtcbnZhciBhc3NpZ25fMSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvYXNzaWduJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIFdlYlNvY2tldFN1YmplY3QgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXZWJTb2NrZXRTdWJqZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFdlYlNvY2tldFN1YmplY3QodXJsQ29uZmlnT3JTb3VyY2UsIGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIGlmICh1cmxDb25maWdPclNvdXJjZSBpbnN0YW5jZW9mIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbiwgdXJsQ29uZmlnT3JTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB0aGlzLldlYlNvY2tldEN0b3IgPSByb290XzEucm9vdC5XZWJTb2NrZXQ7XG4gICAgICAgICAgICB0aGlzLl9vdXRwdXQgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsQ29uZmlnT3JTb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSB1cmxDb25maWdPclNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IGNvbmZpZyBvYmplY3QgY291bGQgb3ZlcnJpZGUgaW1wb3J0YW50IG1lbWJlcnMgaGVyZS5cbiAgICAgICAgICAgICAgICBhc3NpZ25fMS5hc3NpZ24odGhpcywgdXJsQ29uZmlnT3JTb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLldlYlNvY2tldEN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIFdlYlNvY2tldCBjb25zdHJ1Y3RvciBjYW4gYmUgZm91bmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgUmVwbGF5U3ViamVjdF8xLlJlcGxheVN1YmplY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBXZWJTb2NrZXRTdWJqZWN0LnByb3RvdHlwZS5yZXN1bHRTZWxlY3RvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdXJsQ29uZmlnT3JTb3VyY2VcbiAgICAgKiBAcmV0dXJuIHtXZWJTb2NrZXRTdWJqZWN0fVxuICAgICAqIEBzdGF0aWMgdHJ1ZVxuICAgICAqIEBuYW1lIHdlYlNvY2tldFxuICAgICAqIEBvd25lciBPYnNlcnZhYmxlXG4gICAgICovXG4gICAgV2ViU29ja2V0U3ViamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAodXJsQ29uZmlnT3JTb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXZWJTb2NrZXRTdWJqZWN0KHVybENvbmZpZ09yU291cmNlKTtcbiAgICB9O1xuICAgIFdlYlNvY2tldFN1YmplY3QucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAob3BlcmF0b3IpIHtcbiAgICAgICAgdmFyIHNvY2sgPSBuZXcgV2ViU29ja2V0U3ViamVjdCh0aGlzLCB0aGlzLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgc29jay5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICByZXR1cm4gc29jaztcbiAgICB9O1xuICAgIFdlYlNvY2tldFN1YmplY3QucHJvdG90eXBlLl9yZXNldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgUmVwbGF5U3ViamVjdF8xLlJlcGxheVN1YmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vdXRwdXQgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICB9O1xuICAgIC8vIFRPRE86IGZhY3RvciB0aGlzIG91dCB0byBiZSBhIHByb3BlciBPcGVyYXRvci9TdWJzY3JpYmVyIGltcGxlbWVudGF0aW9uIGFuZCBlbGltaW5hdGUgY2xvc3VyZXNcbiAgICBXZWJTb2NrZXRTdWJqZWN0LnByb3RvdHlwZS5tdWx0aXBsZXggPSBmdW5jdGlvbiAoc3ViTXNnLCB1bnN1Yk1zZywgbWVzc2FnZUZpbHRlcikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChzdWJNc2cpKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHNlbGYuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2gobWVzc2FnZUZpbHRlcikoeCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBvYnNlcnZlci5lcnJvcihlcnIpOyB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBvYnNlcnZlci5jb21wbGV0ZSgpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godW5zdWJNc2cpKCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXh0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBXZWJTb2NrZXRTdWJqZWN0LnByb3RvdHlwZS5fY29ubmVjdFNvY2tldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIFdlYlNvY2tldEN0b3IgPSB0aGlzLldlYlNvY2tldEN0b3I7XG4gICAgICAgIHZhciBvYnNlcnZlciA9IHRoaXMuX291dHB1dDtcbiAgICAgICAgdmFyIHNvY2tldCA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb2NrZXQgPSB0aGlzLnByb3RvY29sID9cbiAgICAgICAgICAgICAgICBuZXcgV2ViU29ja2V0Q3Rvcih0aGlzLnVybCwgdGhpcy5wcm90b2NvbCkgOlxuICAgICAgICAgICAgICAgIG5ldyBXZWJTb2NrZXRDdG9yKHRoaXMudXJsKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHNvY2tldCAmJiBzb2NrZXQucmVhZHlTdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgb3Blbk9ic2VydmVyID0gX3RoaXMub3Blbk9ic2VydmVyO1xuICAgICAgICAgICAgaWYgKG9wZW5PYnNlcnZlcikge1xuICAgICAgICAgICAgICAgIG9wZW5PYnNlcnZlci5uZXh0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHF1ZXVlID0gX3RoaXMuZGVzdGluYXRpb247XG4gICAgICAgICAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyLmNyZWF0ZShmdW5jdGlvbiAoeCkgeyByZXR1cm4gc29ja2V0LnJlYWR5U3RhdGUgPT09IDEgJiYgc29ja2V0LnNlbmQoeCk7IH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsb3NpbmdPYnNlcnZlciA9IF90aGlzLmNsb3NpbmdPYnNlcnZlcjtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2luZ09ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdPYnNlcnZlci5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlICYmIGUuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoZS5jb2RlLCBlLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgVHlwZUVycm9yKCdXZWJTb2NrZXRTdWJqZWN0LmVycm9yIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gb2JqZWN0IHdpdGggYW4gZXJyb3IgY29kZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW5kIGFuIG9wdGlvbmFsIHJlYXNvbjogeyBjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nIH0nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldFN0YXRlKCk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsb3NpbmdPYnNlcnZlciA9IF90aGlzLmNsb3NpbmdPYnNlcnZlcjtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2luZ09ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdPYnNlcnZlci5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldFN0YXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChxdWV1ZSAmJiBxdWV1ZSBpbnN0YW5jZW9mIFJlcGxheVN1YmplY3RfMS5SZXBsYXlTdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChxdWV1ZS5zdWJzY3JpYmUoX3RoaXMuZGVzdGluYXRpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgX3RoaXMuX3Jlc2V0U3RhdGUoKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQub25jbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpcy5fcmVzZXRTdGF0ZSgpO1xuICAgICAgICAgICAgdmFyIGNsb3NlT2JzZXJ2ZXIgPSBfdGhpcy5jbG9zZU9ic2VydmVyO1xuICAgICAgICAgICAgaWYgKGNsb3NlT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICBjbG9zZU9ic2VydmVyLm5leHQoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS53YXNDbGVhbikge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChfdGhpcy5yZXN1bHRTZWxlY3RvcikoZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFdlYlNvY2tldFN1YmplY3QucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RTb2NrZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbigpO1xuICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHRoaXMuX291dHB1dC5zdWJzY3JpYmUoc3Vic2NyaWJlcikpO1xuICAgICAgICBzdWJzY3JpcHRpb24uYWRkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzb2NrZXQgPSBfdGhpcy5zb2NrZXQ7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX291dHB1dC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvY2tldCAmJiBzb2NrZXQucmVhZHlTdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3RoaXMuX3Jlc2V0U3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICBXZWJTb2NrZXRTdWJqZWN0LnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgc291cmNlID0gX2Euc291cmNlLCBzb2NrZXQgPSBfYS5zb2NrZXQ7XG4gICAgICAgIGlmIChzb2NrZXQgJiYgc29ja2V0LnJlYWR5U3RhdGUgPT09IDEpIHtcbiAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgUmVwbGF5U3ViamVjdF8xLlJlcGxheVN1YmplY3QoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFdlYlNvY2tldFN1YmplY3Q7XG59KFN1YmplY3RfMS5Bbm9ueW1vdXNTdWJqZWN0KSk7XG5leHBvcnRzLldlYlNvY2tldFN1YmplY3QgPSBXZWJTb2NrZXRTdWJqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViU29ja2V0U3ViamVjdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vYnNlcnZhYmxlL2RvbS9XZWJTb2NrZXRTdWJqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA0NTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  877. /***/ },
  878. /* 456 */
  879. /***/ function(module, exports, __webpack_require__) {
  880. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar queue_1 = __webpack_require__(457);\nvar Subscription_1 = __webpack_require__(11);\nvar observeOn_1 = __webpack_require__(44);\nvar ObjectUnsubscribedError_1 = __webpack_require__(20);\nvar SubjectSubscription_1 = __webpack_require__(21);\n/**\n * @class ReplaySubject<T>\n */\nvar ReplaySubject = (function (_super) {\n __extends(ReplaySubject, _super);\n function ReplaySubject(bufferSize, windowTime, scheduler) {\n if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n _super.call(this);\n this.scheduler = scheduler;\n this._events = [];\n this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n this._windowTime = windowTime < 1 ? 1 : windowTime;\n }\n ReplaySubject.prototype.next = function (value) {\n var now = this._getNow();\n this._events.push(new ReplayEvent(now, value));\n this._trimBufferThenGetEvents();\n _super.prototype.next.call(this, value);\n };\n ReplaySubject.prototype._subscribe = function (subscriber) {\n var _events = this._trimBufferThenGetEvents();\n var scheduler = this.scheduler;\n var subscription;\n if (this.closed) {\n throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();\n }\n else if (this.hasError) {\n subscription = Subscription_1.Subscription.EMPTY;\n }\n else if (this.isStopped) {\n subscription = Subscription_1.Subscription.EMPTY;\n }\n else {\n this.observers.push(subscriber);\n subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);\n }\n if (scheduler) {\n subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));\n }\n var len = _events.length;\n for (var i = 0; i < len && !subscriber.closed; i++) {\n subscriber.next(_events[i].value);\n }\n if (this.hasError) {\n subscriber.error(this.thrownError);\n }\n else if (this.isStopped) {\n subscriber.complete();\n }\n return subscription;\n };\n ReplaySubject.prototype._getNow = function () {\n return (this.scheduler || queue_1.queue).now();\n };\n ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n var now = this._getNow();\n var _bufferSize = this._bufferSize;\n var _windowTime = this._windowTime;\n var _events = this._events;\n var eventsCount = _events.length;\n var spliceCount = 0;\n // Trim events that fall out of the time window.\n // Start at the front of the list. Break early once\n // we encounter an event that falls within the window.\n while (spliceCount < eventsCount) {\n if ((now - _events[spliceCount].time) < _windowTime) {\n break;\n }\n spliceCount++;\n }\n if (eventsCount > _bufferSize) {\n spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n }\n if (spliceCount > 0) {\n _events.splice(0, spliceCount);\n }\n return _events;\n };\n return ReplaySubject;\n}(Subject_1.Subject));\nexports.ReplaySubject = ReplaySubject;\nvar ReplayEvent = (function () {\n function ReplayEvent(time, value) {\n this.time = time;\n this.value = value;\n }\n return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL1JlcGxheVN1YmplY3QuanM/ZDQ4MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4vU3ViamVjdCcpO1xudmFyIHF1ZXVlXzEgPSByZXF1aXJlKCcuL3NjaGVkdWxlci9xdWV1ZScpO1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi9TdWJzY3JpcHRpb24nKTtcbnZhciBvYnNlcnZlT25fMSA9IHJlcXVpcmUoJy4vb3BlcmF0b3Ivb2JzZXJ2ZU9uJyk7XG52YXIgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JfMSA9IHJlcXVpcmUoJy4vdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvcicpO1xudmFyIFN1YmplY3RTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4vU3ViamVjdFN1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBAY2xhc3MgUmVwbGF5U3ViamVjdDxUPlxuICovXG52YXIgUmVwbGF5U3ViamVjdCA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlcGxheVN1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT09IHZvaWQgMCkgeyBidWZmZXJTaXplID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOyB9XG4gICAgICAgIGlmICh3aW5kb3dUaW1lID09PSB2b2lkIDApIHsgd2luZG93VGltZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gYnVmZmVyU2l6ZSA8IDEgPyAxIDogYnVmZmVyU2l6ZTtcbiAgICAgICAgdGhpcy5fd2luZG93VGltZSA9IHdpbmRvd1RpbWUgPCAxID8gMSA6IHdpbmRvd1RpbWU7XG4gICAgfVxuICAgIFJlcGxheVN1YmplY3QucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIG5vdyA9IHRoaXMuX2dldE5vdygpO1xuICAgICAgICB0aGlzLl9ldmVudHMucHVzaChuZXcgUmVwbGF5RXZlbnQobm93LCB2YWx1ZSkpO1xuICAgICAgICB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBSZXBsYXlTdWJqZWN0LnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIF9ldmVudHMgPSB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb247XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yXzEuT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24uRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbl8xLlN1YmplY3RTdWJzY3JpcHRpb24odGhpcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVkdWxlcikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoc3Vic2NyaWJlciA9IG5ldyBvYnNlcnZlT25fMS5PYnNlcnZlT25TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHNjaGVkdWxlcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW4gPSBfZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcih0aGlzLnRocm93bkVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICBSZXBsYXlTdWJqZWN0LnByb3RvdHlwZS5fZ2V0Tm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2NoZWR1bGVyIHx8IHF1ZXVlXzEucXVldWUpLm5vdygpO1xuICAgIH07XG4gICAgUmVwbGF5U3ViamVjdC5wcm90b3R5cGUuX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm93ID0gdGhpcy5fZ2V0Tm93KCk7XG4gICAgICAgIHZhciBfYnVmZmVyU2l6ZSA9IHRoaXMuX2J1ZmZlclNpemU7XG4gICAgICAgIHZhciBfd2luZG93VGltZSA9IHRoaXMuX3dpbmRvd1RpbWU7XG4gICAgICAgIHZhciBfZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgICB2YXIgZXZlbnRzQ291bnQgPSBfZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIHNwbGljZUNvdW50ID0gMDtcbiAgICAgICAgLy8gVHJpbSBldmVudHMgdGhhdCBmYWxsIG91dCBvZiB0aGUgdGltZSB3aW5kb3cuXG4gICAgICAgIC8vIFN0YXJ0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gQnJlYWsgZWFybHkgb25jZVxuICAgICAgICAvLyB3ZSBlbmNvdW50ZXIgYW4gZXZlbnQgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHdpbmRvdy5cbiAgICAgICAgd2hpbGUgKHNwbGljZUNvdW50IDwgZXZlbnRzQ291bnQpIHtcbiAgICAgICAgICAgIGlmICgobm93IC0gX2V2ZW50c1tzcGxpY2VDb3VudF0udGltZSkgPCBfd2luZG93VGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BsaWNlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRzQ291bnQgPiBfYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgc3BsaWNlQ291bnQgPSBNYXRoLm1heChzcGxpY2VDb3VudCwgZXZlbnRzQ291bnQgLSBfYnVmZmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwbGljZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgX2V2ZW50cy5zcGxpY2UoMCwgc3BsaWNlQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfZXZlbnRzO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcGxheVN1YmplY3Q7XG59KFN1YmplY3RfMS5TdWJqZWN0KSk7XG5leHBvcnRzLlJlcGxheVN1YmplY3QgPSBSZXBsYXlTdWJqZWN0O1xudmFyIFJlcGxheUV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBsYXlFdmVudCh0aW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBSZXBsYXlFdmVudDtcbn0oKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXBsYXlTdWJqZWN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL1JlcGxheVN1YmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQ1NlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  881. /***/ },
  882. /* 457 */
  883. /***/ function(module, exports, __webpack_require__) {
  884. eval("\"use strict\";\nvar QueueAction_1 = __webpack_require__(458);\nvar QueueScheduler_1 = __webpack_require__(459);\nexports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);\n//# sourceMappingURL=queue.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9xdWV1ZS5qcz85Y2IxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIFF1ZXVlQWN0aW9uXzEgPSByZXF1aXJlKCcuL1F1ZXVlQWN0aW9uJyk7XG52YXIgUXVldWVTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vUXVldWVTY2hlZHVsZXInKTtcbmV4cG9ydHMucXVldWUgPSBuZXcgUXVldWVTY2hlZHVsZXJfMS5RdWV1ZVNjaGVkdWxlcihRdWV1ZUFjdGlvbl8xLlF1ZXVlQWN0aW9uKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXVlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9xdWV1ZS5qc1xuLy8gbW9kdWxlIGlkID0gNDU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  885. /***/ },
  886. /* 458 */
  887. /***/ function(module, exports, __webpack_require__) {
  888. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncAction_1 = __webpack_require__(415);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar QueueAction = (function (_super) {\n __extends(QueueAction, _super);\n function QueueAction(scheduler, work) {\n _super.call(this, scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n QueueAction.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n if (delay > 0) {\n return _super.prototype.schedule.call(this, state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n };\n QueueAction.prototype.execute = function (state, delay) {\n return (delay > 0 || this.closed) ?\n _super.prototype.execute.call(this, state, delay) :\n this._execute(state, delay);\n };\n QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n }\n // Otherwise flush the scheduler starting with this action.\n return scheduler.flush(this);\n };\n return QueueAction;\n}(AsyncAction_1.AsyncAction));\nexports.QueueAction = QueueAction;\n//# sourceMappingURL=QueueAction.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9RdWV1ZUFjdGlvbi5qcz9lNGQwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXN5bmNBY3Rpb25fMSA9IHJlcXVpcmUoJy4vQXN5bmNBY3Rpb24nKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgUXVldWVBY3Rpb24gPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWV1ZUFjdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBRdWV1ZUFjdGlvbihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMud29yayA9IHdvcms7XG4gICAgfVxuICAgIFF1ZXVlQWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcywgc3RhdGUsIGRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIuZmx1c2godGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUXVldWVBY3Rpb24ucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIHJldHVybiAoZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkKSA/XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmV4ZWN1dGUuY2FsbCh0aGlzLCBzdGF0ZSwgZGVsYXkpIDpcbiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTtcbiAgICB9O1xuICAgIFF1ZXVlQWN0aW9uLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgLy8gSWYgZGVsYXkgZXhpc3RzIGFuZCBpcyBncmVhdGVyIHRoYW4gMCwgb3IgaWYgdGhlIGRlbGF5IGlzIG51bGwgKHRoZVxuICAgICAgICAvLyBhY3Rpb24gd2Fzbid0IHJlc2NoZWR1bGVkKSBidXQgd2FzIG9yaWdpbmFsbHkgc2NoZWR1bGVkIGFzIGFuIGFzeW5jXG4gICAgICAgIC8vIGFjdGlvbiwgdGhlbiByZWN5Y2xlIGFzIGFuIGFzeW5jIGFjdGlvbi5cbiAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBmbHVzaCB0aGUgc2NoZWR1bGVyIHN0YXJ0aW5nIHdpdGggdGhpcyBhY3Rpb24uXG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuZmx1c2godGhpcyk7XG4gICAgfTtcbiAgICByZXR1cm4gUXVldWVBY3Rpb247XG59KEFzeW5jQWN0aW9uXzEuQXN5bmNBY3Rpb24pKTtcbmV4cG9ydHMuUXVldWVBY3Rpb24gPSBRdWV1ZUFjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXVlQWN0aW9uLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9RdWV1ZUFjdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  889. /***/ },
  890. /* 459 */
  891. /***/ function(module, exports, __webpack_require__) {
  892. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncScheduler_1 = __webpack_require__(417);\nvar QueueScheduler = (function (_super) {\n __extends(QueueScheduler, _super);\n function QueueScheduler() {\n _super.apply(this, arguments);\n }\n return QueueScheduler;\n}(AsyncScheduler_1.AsyncScheduler));\nexports.QueueScheduler = QueueScheduler;\n//# sourceMappingURL=QueueScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9RdWV1ZVNjaGVkdWxlci5qcz80ODJmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXN5bmNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vQXN5bmNTY2hlZHVsZXInKTtcbnZhciBRdWV1ZVNjaGVkdWxlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFF1ZXVlU2NoZWR1bGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXVlU2NoZWR1bGVyKCkge1xuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXVlU2NoZWR1bGVyO1xufShBc3luY1NjaGVkdWxlcl8xLkFzeW5jU2NoZWR1bGVyKSk7XG5leHBvcnRzLlF1ZXVlU2NoZWR1bGVyID0gUXVldWVTY2hlZHVsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWV1ZVNjaGVkdWxlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  893. /***/ },
  894. /* 460 */
  895. /***/ function(module, exports, __webpack_require__) {
  896. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nfunction assignImpl(target) {\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n var len = sources.length;\n for (var i = 0; i < len; i++) {\n var source = sources[i];\n for (var k in source) {\n if (source.hasOwnProperty(k)) {\n target[k] = source[k];\n }\n }\n }\n return target;\n}\nexports.assignImpl = assignImpl;\n;\nfunction getAssign(root) {\n return root.Object.assign || assignImpl;\n}\nexports.getAssign = getAssign;\nexports.assign = getAssign(root_1.root);\n//# sourceMappingURL=assign.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvYXNzaWduLmpzP2NhN2YiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi9yb290Jyk7XG5mdW5jdGlvbiBhc3NpZ25JbXBsKHRhcmdldCkge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgc291cmNlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGxlbiA9IHNvdXJjZXMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgIGZvciAodmFyIGsgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tdID0gc291cmNlW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5leHBvcnRzLmFzc2lnbkltcGwgPSBhc3NpZ25JbXBsO1xuO1xuZnVuY3Rpb24gZ2V0QXNzaWduKHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC5PYmplY3QuYXNzaWduIHx8IGFzc2lnbkltcGw7XG59XG5leHBvcnRzLmdldEFzc2lnbiA9IGdldEFzc2lnbjtcbmV4cG9ydHMuYXNzaWduID0gZ2V0QXNzaWduKHJvb3RfMS5yb290KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzc2lnbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL2Fzc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gNDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  897. /***/ },
  898. /* 461 */
  899. /***/ function(module, exports, __webpack_require__) {
  900. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar buffer_1 = __webpack_require__(462);\nObservable_1.Observable.prototype.buffer = buffer_1.buffer;\n//# sourceMappingURL=buffer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXIuanM/MzI3OCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgYnVmZmVyXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9idWZmZXInKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5idWZmZXIgPSBidWZmZXJfMS5idWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2J1ZmZlci5qc1xuLy8gbW9kdWxlIGlkID0gNDYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  901. /***/ },
  902. /* 462 */
  903. /***/ function(module, exports, __webpack_require__) {
  904. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Buffers the source Observable values until `closingNotifier` emits.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when another Observable emits.</span>\n *\n * <img src=\"./img/buffer.png\" width=\"100%\">\n *\n * Buffers the incoming Observable values until the given `closingNotifier`\n * Observable emits a value, at which point it emits the buffer on the output\n * Observable and starts a new buffer internally, awaiting the next time\n * `closingNotifier` emits.\n *\n * @example <caption>On every click, emit array of most recent interval events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var interval = Rx.Observable.interval(1000);\n * var buffered = interval.buffer(clicks);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link window}\n *\n * @param {Observable<any>} closingNotifier An Observable that signals the\n * buffer to be emitted on the output Observable.\n * @return {Observable<T[]>} An Observable of buffers, which are arrays of\n * values.\n * @method buffer\n * @owner Observable\n */\nfunction buffer(closingNotifier) {\n return this.lift(new BufferOperator(closingNotifier));\n}\nexports.buffer = buffer;\nvar BufferOperator = (function () {\n function BufferOperator(closingNotifier) {\n this.closingNotifier = closingNotifier;\n }\n BufferOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));\n };\n return BufferOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferSubscriber = (function (_super) {\n __extends(BufferSubscriber, _super);\n function BufferSubscriber(destination, closingNotifier) {\n _super.call(this, destination);\n this.buffer = [];\n this.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n }\n BufferSubscriber.prototype._next = function (value) {\n this.buffer.push(value);\n };\n BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var buffer = this.buffer;\n this.buffer = [];\n this.destination.next(buffer);\n };\n return BufferSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=buffer.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlci5qcz84N2U0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBCdWZmZXJzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB2YWx1ZXMgdW50aWwgYGNsb3NpbmdOb3RpZmllcmAgZW1pdHMuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNvbGxlY3RzIHZhbHVlcyBmcm9tIHRoZSBwYXN0IGFzIGFuIGFycmF5LCBhbmQgZW1pdHNcbiAqIHRoYXQgYXJyYXkgb25seSB3aGVuIGFub3RoZXIgT2JzZXJ2YWJsZSBlbWl0cy48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9idWZmZXIucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQnVmZmVycyB0aGUgaW5jb21pbmcgT2JzZXJ2YWJsZSB2YWx1ZXMgdW50aWwgdGhlIGdpdmVuIGBjbG9zaW5nTm90aWZpZXJgXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUsIGF0IHdoaWNoIHBvaW50IGl0IGVtaXRzIHRoZSBidWZmZXIgb24gdGhlIG91dHB1dFxuICogT2JzZXJ2YWJsZSBhbmQgc3RhcnRzIGEgbmV3IGJ1ZmZlciBpbnRlcm5hbGx5LCBhd2FpdGluZyB0aGUgbmV4dCB0aW1lXG4gKiBgY2xvc2luZ05vdGlmaWVyYCBlbWl0cy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5PbiBldmVyeSBjbGljaywgZW1pdCBhcnJheSBvZiBtb3N0IHJlY2VudCBpbnRlcnZhbCBldmVudHM8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIGludGVydmFsID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAqIHZhciBidWZmZXJlZCA9IGludGVydmFsLmJ1ZmZlcihjbGlja3MpO1xuICogYnVmZmVyZWQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGJ1ZmZlckNvdW50fVxuICogQHNlZSB7QGxpbmsgYnVmZmVyVGltZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlclRvZ2dsZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcldoZW59XG4gKiBAc2VlIHtAbGluayB3aW5kb3d9XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlPGFueT59IGNsb3NpbmdOb3RpZmllciBBbiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB0aGVcbiAqIGJ1ZmZlciB0byBiZSBlbWl0dGVkIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8VFtdPn0gQW4gT2JzZXJ2YWJsZSBvZiBidWZmZXJzLCB3aGljaCBhcmUgYXJyYXlzIG9mXG4gKiB2YWx1ZXMuXG4gKiBAbWV0aG9kIGJ1ZmZlclxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gYnVmZmVyKGNsb3NpbmdOb3RpZmllcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEJ1ZmZlck9wZXJhdG9yKGNsb3NpbmdOb3RpZmllcikpO1xufVxuZXhwb3J0cy5idWZmZXIgPSBidWZmZXI7XG52YXIgQnVmZmVyT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1ZmZlck9wZXJhdG9yKGNsb3NpbmdOb3RpZmllcikge1xuICAgICAgICB0aGlzLmNsb3NpbmdOb3RpZmllciA9IGNsb3NpbmdOb3RpZmllcjtcbiAgICB9XG4gICAgQnVmZmVyT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBCdWZmZXJTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY2xvc2luZ05vdGlmaWVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBCdWZmZXJTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQnVmZmVyU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWZmZXJTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjbG9zaW5nTm90aWZpZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGNsb3NpbmdOb3RpZmllcikpO1xuICAgIH1cbiAgICBCdWZmZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICB9O1xuICAgIEJ1ZmZlclN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoYnVmZmVyKTtcbiAgICB9O1xuICAgIHJldHVybiBCdWZmZXJTdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ1ZmZlci5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9idWZmZXIuanNcbi8vIG1vZHVsZSBpZCA9IDQ2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  905. /***/ },
  906. /* 463 */
  907. /***/ function(module, exports, __webpack_require__) {
  908. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bufferCount_1 = __webpack_require__(464);\nObservable_1.Observable.prototype.bufferCount = bufferCount_1.bufferCount;\n//# sourceMappingURL=bufferCount.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJDb3VudC5qcz84YTk5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBidWZmZXJDb3VudF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvYnVmZmVyQ291bnQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5idWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50XzEuYnVmZmVyQ291bnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXJDb3VudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvYnVmZmVyQ291bnQuanNcbi8vIG1vZHVsZSBpZCA9IDQ2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  909. /***/ },
  910. /* 464 */
  911. /***/ function(module, exports, __webpack_require__) {
  912. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Buffers the source Observable values until the size hits the maximum\n * `bufferSize` given.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * that array only when its size reaches `bufferSize`.</span>\n *\n * <img src=\"./img/bufferCount.png\" width=\"100%\">\n *\n * Buffers a number of values from the source Observable by `bufferSize` then\n * emits the buffer and clears it, and starts a new buffer each\n * `startBufferEvery` values. If `startBufferEvery` is not provided or is\n * `null`, then new buffers are started immediately at the start of the source\n * and when each buffer closes and is emitted.\n *\n * @example <caption>Emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2);\n * buffered.subscribe(x => console.log(x));\n *\n * @example <caption>On every click, emit the last two click events as an array</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferCount(2, 1);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link pairwise}\n * @see {@link windowCount}\n *\n * @param {number} bufferSize The maximum size of the buffer emitted.\n * @param {number} [startBufferEvery] Interval at which to start a new buffer.\n * For example if `startBufferEvery` is `2`, then a new buffer will be started\n * on every other value from the source. A new buffer is started at the\n * beginning of the source by default.\n * @return {Observable<T[]>} An Observable of arrays of buffered values.\n * @method bufferCount\n * @owner Observable\n */\nfunction bufferCount(bufferSize, startBufferEvery) {\n if (startBufferEvery === void 0) { startBufferEvery = null; }\n return this.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n}\nexports.bufferCount = bufferCount;\nvar BufferCountOperator = (function () {\n function BufferCountOperator(bufferSize, startBufferEvery) {\n this.bufferSize = bufferSize;\n this.startBufferEvery = startBufferEvery;\n }\n BufferCountOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new BufferCountSubscriber(subscriber, this.bufferSize, this.startBufferEvery));\n };\n return BufferCountOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferCountSubscriber = (function (_super) {\n __extends(BufferCountSubscriber, _super);\n function BufferCountSubscriber(destination, bufferSize, startBufferEvery) {\n _super.call(this, destination);\n this.bufferSize = bufferSize;\n this.startBufferEvery = startBufferEvery;\n this.buffers = [];\n this.count = 0;\n }\n BufferCountSubscriber.prototype._next = function (value) {\n var count = this.count++;\n var _a = this, destination = _a.destination, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers;\n var startOn = (startBufferEvery == null) ? bufferSize : startBufferEvery;\n if (count % startOn === 0) {\n buffers.push([]);\n }\n for (var i = buffers.length; i--;) {\n var buffer = buffers[i];\n buffer.push(value);\n if (buffer.length === bufferSize) {\n buffers.splice(i, 1);\n destination.next(buffer);\n }\n }\n };\n BufferCountSubscriber.prototype._complete = function () {\n var destination = this.destination;\n var buffers = this.buffers;\n while (buffers.length > 0) {\n var buffer = buffers.shift();\n if (buffer.length > 0) {\n destination.next(buffer);\n }\n }\n _super.prototype._complete.call(this);\n };\n return BufferCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=bufferCount.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlckNvdW50LmpzPzQyYmIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIEJ1ZmZlcnMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHZhbHVlcyB1bnRpbCB0aGUgc2l6ZSBoaXRzIHRoZSBtYXhpbXVtXG4gKiBgYnVmZmVyU2l6ZWAgZ2l2ZW4uXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNvbGxlY3RzIHZhbHVlcyBmcm9tIHRoZSBwYXN0IGFzIGFuIGFycmF5LCBhbmQgZW1pdHNcbiAqIHRoYXQgYXJyYXkgb25seSB3aGVuIGl0cyBzaXplIHJlYWNoZXMgYGJ1ZmZlclNpemVgLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2J1ZmZlckNvdW50LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEJ1ZmZlcnMgYSBudW1iZXIgb2YgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGJ5IGBidWZmZXJTaXplYCB0aGVuXG4gKiBlbWl0cyB0aGUgYnVmZmVyIGFuZCBjbGVhcnMgaXQsIGFuZCBzdGFydHMgYSBuZXcgYnVmZmVyIGVhY2hcbiAqIGBzdGFydEJ1ZmZlckV2ZXJ5YCB2YWx1ZXMuIElmIGBzdGFydEJ1ZmZlckV2ZXJ5YCBpcyBub3QgcHJvdmlkZWQgb3IgaXNcbiAqIGBudWxsYCwgdGhlbiBuZXcgYnVmZmVycyBhcmUgc3RhcnRlZCBpbW1lZGlhdGVseSBhdCB0aGUgc3RhcnQgb2YgdGhlIHNvdXJjZVxuICogYW5kIHdoZW4gZWFjaCBidWZmZXIgY2xvc2VzIGFuZCBpcyBlbWl0dGVkLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgdGhlIGxhc3QgdHdvIGNsaWNrIGV2ZW50cyBhcyBhbiBhcnJheTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgYnVmZmVyZWQgPSBjbGlja3MuYnVmZmVyQ291bnQoMik7XG4gKiBidWZmZXJlZC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+T24gZXZlcnkgY2xpY2ssIGVtaXQgdGhlIGxhc3QgdHdvIGNsaWNrIGV2ZW50cyBhcyBhbiBhcnJheTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgYnVmZmVyZWQgPSBjbGlja3MuYnVmZmVyQ291bnQoMiwgMSk7XG4gKiBidWZmZXJlZC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgYnVmZmVyfVxuICogQHNlZSB7QGxpbmsgYnVmZmVyVGltZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlclRvZ2dsZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcldoZW59XG4gKiBAc2VlIHtAbGluayBwYWlyd2lzZX1cbiAqIEBzZWUge0BsaW5rIHdpbmRvd0NvdW50fVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBidWZmZXJTaXplIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBlbWl0dGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydEJ1ZmZlckV2ZXJ5XSBJbnRlcnZhbCBhdCB3aGljaCB0byBzdGFydCBhIG5ldyBidWZmZXIuXG4gKiBGb3IgZXhhbXBsZSBpZiBgc3RhcnRCdWZmZXJFdmVyeWAgaXMgYDJgLCB0aGVuIGEgbmV3IGJ1ZmZlciB3aWxsIGJlIHN0YXJ0ZWRcbiAqIG9uIGV2ZXJ5IG90aGVyIHZhbHVlIGZyb20gdGhlIHNvdXJjZS4gQSBuZXcgYnVmZmVyIGlzIHN0YXJ0ZWQgYXQgdGhlXG4gKiBiZWdpbm5pbmcgb2YgdGhlIHNvdXJjZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUW10+fSBBbiBPYnNlcnZhYmxlIG9mIGFycmF5cyBvZiBidWZmZXJlZCB2YWx1ZXMuXG4gKiBAbWV0aG9kIGJ1ZmZlckNvdW50XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBidWZmZXJDb3VudChidWZmZXJTaXplLCBzdGFydEJ1ZmZlckV2ZXJ5KSB7XG4gICAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkgeyBzdGFydEJ1ZmZlckV2ZXJ5ID0gbnVsbDsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEJ1ZmZlckNvdW50T3BlcmF0b3IoYnVmZmVyU2l6ZSwgc3RhcnRCdWZmZXJFdmVyeSkpO1xufVxuZXhwb3J0cy5idWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50O1xudmFyIEJ1ZmZlckNvdW50T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1ZmZlckNvdW50T3BlcmF0b3IoYnVmZmVyU2l6ZSwgc3RhcnRCdWZmZXJFdmVyeSkge1xuICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplO1xuICAgICAgICB0aGlzLnN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5O1xuICAgIH1cbiAgICBCdWZmZXJDb3VudE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQnVmZmVyQ291bnRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYnVmZmVyU2l6ZSwgdGhpcy5zdGFydEJ1ZmZlckV2ZXJ5KSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyQ291bnRPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEJ1ZmZlckNvdW50U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJ1ZmZlckNvdW50U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWZmZXJDb3VudFN1YnNjcmliZXIoZGVzdGluYXRpb24sIGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplO1xuICAgICAgICB0aGlzLnN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5O1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIEJ1ZmZlckNvdW50U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gdGhpcy5jb3VudCsrO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBkZXN0aW5hdGlvbiA9IF9hLmRlc3RpbmF0aW9uLCBidWZmZXJTaXplID0gX2EuYnVmZmVyU2l6ZSwgc3RhcnRCdWZmZXJFdmVyeSA9IF9hLnN0YXJ0QnVmZmVyRXZlcnksIGJ1ZmZlcnMgPSBfYS5idWZmZXJzO1xuICAgICAgICB2YXIgc3RhcnRPbiA9IChzdGFydEJ1ZmZlckV2ZXJ5ID09IG51bGwpID8gYnVmZmVyU2l6ZSA6IHN0YXJ0QnVmZmVyRXZlcnk7XG4gICAgICAgIGlmIChjb3VudCAlIHN0YXJ0T24gPT09IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IGJ1ZmZlcnMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc1tpXTtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09PSBidWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dChidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBCdWZmZXJDb3VudFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgdmFyIGJ1ZmZlcnMgPSB0aGlzLmJ1ZmZlcnM7XG4gICAgICAgIHdoaWxlIChidWZmZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBidWZmZXIgPSBidWZmZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBCdWZmZXJDb3VudFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXJDb3VudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9idWZmZXJDb3VudC5qc1xuLy8gbW9kdWxlIGlkID0gNDY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  913. /***/ },
  914. /* 465 */
  915. /***/ function(module, exports, __webpack_require__) {
  916. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bufferTime_1 = __webpack_require__(466);\nObservable_1.Observable.prototype.bufferTime = bufferTime_1.bufferTime;\n//# sourceMappingURL=bufferTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJUaW1lLmpzPzI4NTUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGJ1ZmZlclRpbWVfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2J1ZmZlclRpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5idWZmZXJUaW1lID0gYnVmZmVyVGltZV8xLmJ1ZmZlclRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXJUaW1lLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA0NjVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  917. /***/ },
  918. /* 466 */
  919. /***/ function(module, exports, __webpack_require__) {
  920. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = __webpack_require__(414);\nvar Subscriber_1 = __webpack_require__(9);\nvar isScheduler_1 = __webpack_require__(42);\n/* tslint:disable:max-line-length */\n/**\n * Buffers the source Observable values for a specific time period.\n *\n * <span class=\"informal\">Collects values from the past as an array, and emits\n * those arrays periodically in time.</span>\n *\n * <img src=\"./img/bufferTime.png\" width=\"100%\">\n *\n * Buffers values from the source for a specific time duration `bufferTimeSpan`.\n * Unless the optional argument `bufferCreationInterval` is given, it emits and\n * resets the buffer every `bufferTimeSpan` milliseconds. If\n * `bufferCreationInterval` is given, this operator opens the buffer every\n * `bufferCreationInterval` milliseconds and closes (emits and resets) the\n * buffer every `bufferTimeSpan` milliseconds. When the optional argument\n * `maxBufferSize` is specified, the buffer will be closed either after\n * `bufferTimeSpan` milliseconds or when it contains `maxBufferSize` elements.\n *\n * @example <caption>Every second, emit an array of the recent click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferTime(1000);\n * buffered.subscribe(x => console.log(x));\n *\n * @example <caption>Every 5 seconds, emit the click events from the next 2 seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferTime(2000, 5000);\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferToggle}\n * @see {@link bufferWhen}\n * @see {@link windowTime}\n *\n * @param {number} bufferTimeSpan The amount of time to fill each buffer array.\n * @param {number} [bufferCreationInterval] The interval at which to start new\n * buffers.\n * @param {number} [maxBufferSize] The maximum buffer size.\n * @param {Scheduler} [scheduler=async] The scheduler on which to schedule the\n * intervals that determine buffer boundaries.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferTime\n * @owner Observable\n */\nfunction bufferTime(bufferTimeSpan) {\n var length = arguments.length;\n var scheduler = async_1.async;\n if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {\n scheduler = arguments[arguments.length - 1];\n length--;\n }\n var bufferCreationInterval = null;\n if (length >= 2) {\n bufferCreationInterval = arguments[1];\n }\n var maxBufferSize = Number.POSITIVE_INFINITY;\n if (length >= 3) {\n maxBufferSize = arguments[2];\n }\n return this.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));\n}\nexports.bufferTime = bufferTime;\nvar BufferTimeOperator = (function () {\n function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n this.bufferTimeSpan = bufferTimeSpan;\n this.bufferCreationInterval = bufferCreationInterval;\n this.maxBufferSize = maxBufferSize;\n this.scheduler = scheduler;\n }\n BufferTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));\n };\n return BufferTimeOperator;\n}());\nvar Context = (function () {\n function Context() {\n this.buffer = [];\n }\n return Context;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferTimeSubscriber = (function (_super) {\n __extends(BufferTimeSubscriber, _super);\n function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n _super.call(this, destination);\n this.bufferTimeSpan = bufferTimeSpan;\n this.bufferCreationInterval = bufferCreationInterval;\n this.maxBufferSize = maxBufferSize;\n this.scheduler = scheduler;\n this.contexts = [];\n var context = this.openContext();\n this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;\n if (this.timespanOnly) {\n var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };\n this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n }\n else {\n var closeState = { subscriber: this, context: context };\n var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: this, scheduler: scheduler };\n this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));\n this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));\n }\n }\n BufferTimeSubscriber.prototype._next = function (value) {\n var contexts = this.contexts;\n var len = contexts.length;\n var filledBufferContext;\n for (var i = 0; i < len; i++) {\n var context = contexts[i];\n var buffer = context.buffer;\n buffer.push(value);\n if (buffer.length == this.maxBufferSize) {\n filledBufferContext = context;\n }\n }\n if (filledBufferContext) {\n this.onBufferFull(filledBufferContext);\n }\n };\n BufferTimeSubscriber.prototype._error = function (err) {\n this.contexts.length = 0;\n _super.prototype._error.call(this, err);\n };\n BufferTimeSubscriber.prototype._complete = function () {\n var _a = this, contexts = _a.contexts, destination = _a.destination;\n while (contexts.length > 0) {\n var context = contexts.shift();\n destination.next(context.buffer);\n }\n _super.prototype._complete.call(this);\n };\n BufferTimeSubscriber.prototype._unsubscribe = function () {\n this.contexts = null;\n };\n BufferTimeSubscriber.prototype.onBufferFull = function (context) {\n this.closeContext(context);\n var closeAction = context.closeAction;\n closeAction.unsubscribe();\n this.remove(closeAction);\n if (!this.closed && this.timespanOnly) {\n context = this.openContext();\n var bufferTimeSpan = this.bufferTimeSpan;\n var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };\n this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n }\n };\n BufferTimeSubscriber.prototype.openContext = function () {\n var context = new Context();\n this.contexts.push(context);\n return context;\n };\n BufferTimeSubscriber.prototype.closeContext = function (context) {\n this.destination.next(context.buffer);\n var contexts = this.contexts;\n var spliceIndex = contexts ? contexts.indexOf(context) : -1;\n if (spliceIndex >= 0) {\n contexts.splice(contexts.indexOf(context), 1);\n }\n };\n return BufferTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchBufferTimeSpanOnly(state) {\n var subscriber = state.subscriber;\n var prevContext = state.context;\n if (prevContext) {\n subscriber.closeContext(prevContext);\n }\n if (!subscriber.closed) {\n state.context = subscriber.openContext();\n state.context.closeAction = this.schedule(state, state.bufferTimeSpan);\n }\n}\nfunction dispatchBufferCreation(state) {\n var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;\n var context = subscriber.openContext();\n var action = this;\n if (!subscriber.closed) {\n subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));\n action.schedule(state, bufferCreationInterval);\n }\n}\nfunction dispatchBufferClose(arg) {\n var subscriber = arg.subscriber, context = arg.context;\n subscriber.closeContext(context);\n}\n//# sourceMappingURL=bufferTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlclRpbWUuanM/ZjgzMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgaXNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNTY2hlZHVsZXInKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBCdWZmZXJzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgdGltZSBwZXJpb2QuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNvbGxlY3RzIHZhbHVlcyBmcm9tIHRoZSBwYXN0IGFzIGFuIGFycmF5LCBhbmQgZW1pdHNcbiAqIHRob3NlIGFycmF5cyBwZXJpb2RpY2FsbHkgaW4gdGltZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9idWZmZXJUaW1lLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEJ1ZmZlcnMgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBmb3IgYSBzcGVjaWZpYyB0aW1lIGR1cmF0aW9uIGBidWZmZXJUaW1lU3BhbmAuXG4gKiBVbmxlc3MgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBidWZmZXJDcmVhdGlvbkludGVydmFsYCBpcyBnaXZlbiwgaXQgZW1pdHMgYW5kXG4gKiByZXNldHMgdGhlIGJ1ZmZlciBldmVyeSBgYnVmZmVyVGltZVNwYW5gIG1pbGxpc2Vjb25kcy4gSWZcbiAqIGBidWZmZXJDcmVhdGlvbkludGVydmFsYCBpcyBnaXZlbiwgdGhpcyBvcGVyYXRvciBvcGVucyB0aGUgYnVmZmVyIGV2ZXJ5XG4gKiBgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbGAgbWlsbGlzZWNvbmRzIGFuZCBjbG9zZXMgKGVtaXRzIGFuZCByZXNldHMpIHRoZVxuICogYnVmZmVyIGV2ZXJ5IGBidWZmZXJUaW1lU3BhbmAgbWlsbGlzZWNvbmRzLiBXaGVuIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogYG1heEJ1ZmZlclNpemVgIGlzIHNwZWNpZmllZCwgdGhlIGJ1ZmZlciB3aWxsIGJlIGNsb3NlZCBlaXRoZXIgYWZ0ZXJcbiAqIGBidWZmZXJUaW1lU3BhbmAgbWlsbGlzZWNvbmRzIG9yIHdoZW4gaXQgY29udGFpbnMgYG1heEJ1ZmZlclNpemVgIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV2ZXJ5IHNlY29uZCwgZW1pdCBhbiBhcnJheSBvZiB0aGUgcmVjZW50IGNsaWNrIGV2ZW50czwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgYnVmZmVyZWQgPSBjbGlja3MuYnVmZmVyVGltZSgxMDAwKTtcbiAqIGJ1ZmZlcmVkLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FdmVyeSA1IHNlY29uZHMsIGVtaXQgdGhlIGNsaWNrIGV2ZW50cyBmcm9tIHRoZSBuZXh0IDIgc2Vjb25kczwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgYnVmZmVyZWQgPSBjbGlja3MuYnVmZmVyVGltZSgyMDAwLCA1MDAwKTtcbiAqIGJ1ZmZlcmVkLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBidWZmZXJ9XG4gKiBAc2VlIHtAbGluayBidWZmZXJDb3VudH1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlclRvZ2dsZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcldoZW59XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUaW1lfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBidWZmZXJUaW1lU3BhbiBUaGUgYW1vdW50IG9mIHRpbWUgdG8gZmlsbCBlYWNoIGJ1ZmZlciBhcnJheS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYnVmZmVyQ3JlYXRpb25JbnRlcnZhbF0gVGhlIGludGVydmFsIGF0IHdoaWNoIHRvIHN0YXJ0IG5ld1xuICogYnVmZmVycy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4QnVmZmVyU2l6ZV0gVGhlIG1heGltdW0gYnVmZmVyIHNpemUuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1hc3luY10gVGhlIHNjaGVkdWxlciBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGVcbiAqIGludGVydmFscyB0aGF0IGRldGVybWluZSBidWZmZXIgYm91bmRhcmllcy5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8VFtdPn0gQW4gb2JzZXJ2YWJsZSBvZiBhcnJheXMgb2YgYnVmZmVyZWQgdmFsdWVzLlxuICogQG1ldGhvZCBidWZmZXJUaW1lXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBidWZmZXJUaW1lKGJ1ZmZlclRpbWVTcGFuKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7XG4gICAgaWYgKGlzU2NoZWR1bGVyXzEuaXNTY2hlZHVsZXIoYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgc2NoZWR1bGVyID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGVuZ3RoLS07XG4gICAgfVxuICAgIHZhciBidWZmZXJDcmVhdGlvbkludGVydmFsID0gbnVsbDtcbiAgICBpZiAobGVuZ3RoID49IDIpIHtcbiAgICAgICAgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gICAgdmFyIG1heEJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKGxlbmd0aCA+PSAzKSB7XG4gICAgICAgIG1heEJ1ZmZlclNpemUgPSBhcmd1bWVudHNbMl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEJ1ZmZlclRpbWVPcGVyYXRvcihidWZmZXJUaW1lU3BhbiwgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCwgbWF4QnVmZmVyU2l6ZSwgc2NoZWR1bGVyKSk7XG59XG5leHBvcnRzLmJ1ZmZlclRpbWUgPSBidWZmZXJUaW1lO1xudmFyIEJ1ZmZlclRpbWVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnVmZmVyVGltZU9wZXJhdG9yKGJ1ZmZlclRpbWVTcGFuLCBidWZmZXJDcmVhdGlvbkludGVydmFsLCBtYXhCdWZmZXJTaXplLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5idWZmZXJUaW1lU3BhbiA9IGJ1ZmZlclRpbWVTcGFuO1xuICAgICAgICB0aGlzLmJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgPSBidWZmZXJDcmVhdGlvbkludGVydmFsO1xuICAgICAgICB0aGlzLm1heEJ1ZmZlclNpemUgPSBtYXhCdWZmZXJTaXplO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG4gICAgQnVmZmVyVGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQnVmZmVyVGltZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5idWZmZXJUaW1lU3BhbiwgdGhpcy5idWZmZXJDcmVhdGlvbkludGVydmFsLCB0aGlzLm1heEJ1ZmZlclNpemUsIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyVGltZU9wZXJhdG9yO1xufSgpKTtcbnZhciBDb250ZXh0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gQ29udGV4dDtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEJ1ZmZlclRpbWVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQnVmZmVyVGltZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnVmZmVyVGltZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGJ1ZmZlclRpbWVTcGFuLCBidWZmZXJDcmVhdGlvbkludGVydmFsLCBtYXhCdWZmZXJTaXplLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmJ1ZmZlclRpbWVTcGFuID0gYnVmZmVyVGltZVNwYW47XG4gICAgICAgIHRoaXMuYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWw7XG4gICAgICAgIHRoaXMubWF4QnVmZmVyU2l6ZSA9IG1heEJ1ZmZlclNpemU7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLmNvbnRleHRzID0gW107XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5vcGVuQ29udGV4dCgpO1xuICAgICAgICB0aGlzLnRpbWVzcGFuT25seSA9IGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwgPT0gbnVsbCB8fCBidWZmZXJDcmVhdGlvbkludGVydmFsIDwgMDtcbiAgICAgICAgaWYgKHRoaXMudGltZXNwYW5Pbmx5KSB7XG4gICAgICAgICAgICB2YXIgdGltZVNwYW5Pbmx5U3RhdGUgPSB7IHN1YnNjcmliZXI6IHRoaXMsIGNvbnRleHQ6IGNvbnRleHQsIGJ1ZmZlclRpbWVTcGFuOiBidWZmZXJUaW1lU3BhbiB9O1xuICAgICAgICAgICAgdGhpcy5hZGQoY29udGV4dC5jbG9zZUFjdGlvbiA9IHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaEJ1ZmZlclRpbWVTcGFuT25seSwgYnVmZmVyVGltZVNwYW4sIHRpbWVTcGFuT25seVN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY2xvc2VTdGF0ZSA9IHsgc3Vic2NyaWJlcjogdGhpcywgY29udGV4dDogY29udGV4dCB9O1xuICAgICAgICAgICAgdmFyIGNyZWF0aW9uU3RhdGUgPSB7IGJ1ZmZlclRpbWVTcGFuOiBidWZmZXJUaW1lU3BhbiwgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbDogYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCwgc3Vic2NyaWJlcjogdGhpcywgc2NoZWR1bGVyOiBzY2hlZHVsZXIgfTtcbiAgICAgICAgICAgIHRoaXMuYWRkKGNvbnRleHQuY2xvc2VBY3Rpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hCdWZmZXJDbG9zZSwgYnVmZmVyVGltZVNwYW4sIGNsb3NlU3RhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaEJ1ZmZlckNyZWF0aW9uLCBidWZmZXJDcmVhdGlvbkludGVydmFsLCBjcmVhdGlvblN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQnVmZmVyVGltZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG4gICAgICAgIHZhciBmaWxsZWRCdWZmZXJDb250ZXh0O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2ldO1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGNvbnRleHQuYnVmZmVyO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gdGhpcy5tYXhCdWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgZmlsbGVkQnVmZmVyQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGxlZEJ1ZmZlckNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMub25CdWZmZXJGdWxsKGZpbGxlZEJ1ZmZlckNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCdWZmZXJUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLmNvbnRleHRzLmxlbmd0aCA9IDA7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2Vycm9yLmNhbGwodGhpcywgZXJyKTtcbiAgICB9O1xuICAgIEJ1ZmZlclRpbWVTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbnRleHRzID0gX2EuY29udGV4dHMsIGRlc3RpbmF0aW9uID0gX2EuZGVzdGluYXRpb247XG4gICAgICAgIHdoaWxlIChjb250ZXh0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KGNvbnRleHQuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgQnVmZmVyVGltZVN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG51bGw7XG4gICAgfTtcbiAgICBCdWZmZXJUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUub25CdWZmZXJGdWxsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jbG9zZUNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHZhciBjbG9zZUFjdGlvbiA9IGNvbnRleHQuY2xvc2VBY3Rpb247XG4gICAgICAgIGNsb3NlQWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlKGNsb3NlQWN0aW9uKTtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiB0aGlzLnRpbWVzcGFuT25seSkge1xuICAgICAgICAgICAgY29udGV4dCA9IHRoaXMub3BlbkNvbnRleHQoKTtcbiAgICAgICAgICAgIHZhciBidWZmZXJUaW1lU3BhbiA9IHRoaXMuYnVmZmVyVGltZVNwYW47XG4gICAgICAgICAgICB2YXIgdGltZVNwYW5Pbmx5U3RhdGUgPSB7IHN1YnNjcmliZXI6IHRoaXMsIGNvbnRleHQ6IGNvbnRleHQsIGJ1ZmZlclRpbWVTcGFuOiBidWZmZXJUaW1lU3BhbiB9O1xuICAgICAgICAgICAgdGhpcy5hZGQoY29udGV4dC5jbG9zZUFjdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoQnVmZmVyVGltZVNwYW5Pbmx5LCBidWZmZXJUaW1lU3BhbiwgdGltZVNwYW5Pbmx5U3RhdGUpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQnVmZmVyVGltZVN1YnNjcmliZXIucHJvdG90eXBlLm9wZW5Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfTtcbiAgICBCdWZmZXJUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuY2xvc2VDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGNvbnRleHQuYnVmZmVyKTtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdmFyIHNwbGljZUluZGV4ID0gY29udGV4dHMgPyBjb250ZXh0cy5pbmRleE9mKGNvbnRleHQpIDogLTE7XG4gICAgICAgIGlmIChzcGxpY2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb250ZXh0cy5zcGxpY2UoY29udGV4dHMuaW5kZXhPZihjb250ZXh0KSwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBCdWZmZXJUaW1lU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmZ1bmN0aW9uIGRpc3BhdGNoQnVmZmVyVGltZVNwYW5Pbmx5KHN0YXRlKSB7XG4gICAgdmFyIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyO1xuICAgIHZhciBwcmV2Q29udGV4dCA9IHN0YXRlLmNvbnRleHQ7XG4gICAgaWYgKHByZXZDb250ZXh0KSB7XG4gICAgICAgIHN1YnNjcmliZXIuY2xvc2VDb250ZXh0KHByZXZDb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdGF0ZS5jb250ZXh0ID0gc3Vic2NyaWJlci5vcGVuQ29udGV4dCgpO1xuICAgICAgICBzdGF0ZS5jb250ZXh0LmNsb3NlQWN0aW9uID0gdGhpcy5zY2hlZHVsZShzdGF0ZSwgc3RhdGUuYnVmZmVyVGltZVNwYW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoQnVmZmVyQ3JlYXRpb24oc3RhdGUpIHtcbiAgICB2YXIgYnVmZmVyQ3JlYXRpb25JbnRlcnZhbCA9IHN0YXRlLmJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwsIGJ1ZmZlclRpbWVTcGFuID0gc3RhdGUuYnVmZmVyVGltZVNwYW4sIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyLCBzY2hlZHVsZXIgPSBzdGF0ZS5zY2hlZHVsZXI7XG4gICAgdmFyIGNvbnRleHQgPSBzdWJzY3JpYmVyLm9wZW5Db250ZXh0KCk7XG4gICAgdmFyIGFjdGlvbiA9IHRoaXM7XG4gICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdWJzY3JpYmVyLmFkZChjb250ZXh0LmNsb3NlQWN0aW9uID0gc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoQnVmZmVyQ2xvc2UsIGJ1ZmZlclRpbWVTcGFuLCB7IHN1YnNjcmliZXI6IHN1YnNjcmliZXIsIGNvbnRleHQ6IGNvbnRleHQgfSkpO1xuICAgICAgICBhY3Rpb24uc2NoZWR1bGUoc3RhdGUsIGJ1ZmZlckNyZWF0aW9uSW50ZXJ2YWwpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoQnVmZmVyQ2xvc2UoYXJnKSB7XG4gICAgdmFyIHN1YnNjcmliZXIgPSBhcmcuc3Vic2NyaWJlciwgY29udGV4dCA9IGFyZy5jb250ZXh0O1xuICAgIHN1YnNjcmliZXIuY2xvc2VDb250ZXh0KGNvbnRleHQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyVGltZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9idWZmZXJUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA0NjZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  921. /***/ },
  922. /* 467 */
  923. /***/ function(module, exports, __webpack_require__) {
  924. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bufferToggle_1 = __webpack_require__(468);\nObservable_1.Observable.prototype.bufferToggle = bufferToggle_1.bufferToggle;\n//# sourceMappingURL=bufferToggle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJUb2dnbGUuanM/NmVhMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgYnVmZmVyVG9nZ2xlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9idWZmZXJUb2dnbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5idWZmZXJUb2dnbGUgPSBidWZmZXJUb2dnbGVfMS5idWZmZXJUb2dnbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXJUb2dnbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2J1ZmZlclRvZ2dsZS5qc1xuLy8gbW9kdWxlIGlkID0gNDY3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  925. /***/ },
  926. /* 468 */
  927. /***/ function(module, exports, __webpack_require__) {
  928. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = __webpack_require__(11);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * Buffers the source Observable values starting from an emission from\n * `openings` and ending when the output of `closingSelector` emits.\n *\n * <span class=\"informal\">Collects values from the past as an array. Starts\n * collecting only when `opening` emits, and calls the `closingSelector`\n * function to get an Observable that tells when to close the buffer.</span>\n *\n * <img src=\"./img/bufferToggle.png\" width=\"100%\">\n *\n * Buffers values from the source by opening the buffer via signals from an\n * Observable provided to `openings`, and closing and sending the buffers when\n * a Subscribable or Promise returned by the `closingSelector` function emits.\n *\n * @example <caption>Every other second, emit the click events from the next 500ms</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var openings = Rx.Observable.interval(1000);\n * var buffered = clicks.bufferToggle(openings, i =>\n * i % 2 ? Rx.Observable.interval(500) : Rx.Observable.empty()\n * );\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferWhen}\n * @see {@link windowToggle}\n *\n * @param {SubscribableOrPromise<O>} openings A Subscribable or Promise of notifications to start new\n * buffers.\n * @param {function(value: O): SubscribableOrPromise} closingSelector A function that takes\n * the value emitted by the `openings` observable and returns a Subscribable or Promise,\n * which, when it emits, signals that the associated buffer should be emitted\n * and cleared.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferToggle\n * @owner Observable\n */\nfunction bufferToggle(openings, closingSelector) {\n return this.lift(new BufferToggleOperator(openings, closingSelector));\n}\nexports.bufferToggle = bufferToggle;\nvar BufferToggleOperator = (function () {\n function BufferToggleOperator(openings, closingSelector) {\n this.openings = openings;\n this.closingSelector = closingSelector;\n }\n BufferToggleOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));\n };\n return BufferToggleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferToggleSubscriber = (function (_super) {\n __extends(BufferToggleSubscriber, _super);\n function BufferToggleSubscriber(destination, openings, closingSelector) {\n _super.call(this, destination);\n this.openings = openings;\n this.closingSelector = closingSelector;\n this.contexts = [];\n this.add(subscribeToResult_1.subscribeToResult(this, openings));\n }\n BufferToggleSubscriber.prototype._next = function (value) {\n var contexts = this.contexts;\n var len = contexts.length;\n for (var i = 0; i < len; i++) {\n contexts[i].buffer.push(value);\n }\n };\n BufferToggleSubscriber.prototype._error = function (err) {\n var contexts = this.contexts;\n while (contexts.length > 0) {\n var context = contexts.shift();\n context.subscription.unsubscribe();\n context.buffer = null;\n context.subscription = null;\n }\n this.contexts = null;\n _super.prototype._error.call(this, err);\n };\n BufferToggleSubscriber.prototype._complete = function () {\n var contexts = this.contexts;\n while (contexts.length > 0) {\n var context = contexts.shift();\n this.destination.next(context.buffer);\n context.subscription.unsubscribe();\n context.buffer = null;\n context.subscription = null;\n }\n this.contexts = null;\n _super.prototype._complete.call(this);\n };\n BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);\n };\n BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {\n this.closeBuffer(innerSub.context);\n };\n BufferToggleSubscriber.prototype.openBuffer = function (value) {\n try {\n var closingSelector = this.closingSelector;\n var closingNotifier = closingSelector.call(this, value);\n if (closingNotifier) {\n this.trySubscribe(closingNotifier);\n }\n }\n catch (err) {\n this._error(err);\n }\n };\n BufferToggleSubscriber.prototype.closeBuffer = function (context) {\n var contexts = this.contexts;\n if (contexts && context) {\n var buffer = context.buffer, subscription = context.subscription;\n this.destination.next(buffer);\n contexts.splice(contexts.indexOf(context), 1);\n this.remove(subscription);\n subscription.unsubscribe();\n }\n };\n BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {\n var contexts = this.contexts;\n var buffer = [];\n var subscription = new Subscription_1.Subscription();\n var context = { buffer: buffer, subscription: subscription };\n contexts.push(context);\n var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);\n if (!innerSubscription || innerSubscription.closed) {\n this.closeBuffer(context);\n }\n else {\n innerSubscription.context = context;\n this.add(innerSubscription);\n subscription.add(innerSubscription);\n }\n };\n return BufferToggleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=bufferToggle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlclRvZ2dsZS5qcz8zMjRhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaXB0aW9uXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpcHRpb24nKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG4vKipcbiAqIEJ1ZmZlcnMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHZhbHVlcyBzdGFydGluZyBmcm9tIGFuIGVtaXNzaW9uIGZyb21cbiAqIGBvcGVuaW5nc2AgYW5kIGVuZGluZyB3aGVuIHRoZSBvdXRwdXQgb2YgYGNsb3NpbmdTZWxlY3RvcmAgZW1pdHMuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNvbGxlY3RzIHZhbHVlcyBmcm9tIHRoZSBwYXN0IGFzIGFuIGFycmF5LiBTdGFydHNcbiAqIGNvbGxlY3Rpbmcgb25seSB3aGVuIGBvcGVuaW5nYCBlbWl0cywgYW5kIGNhbGxzIHRoZSBgY2xvc2luZ1NlbGVjdG9yYFxuICogZnVuY3Rpb24gdG8gZ2V0IGFuIE9ic2VydmFibGUgdGhhdCB0ZWxscyB3aGVuIHRvIGNsb3NlIHRoZSBidWZmZXIuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvYnVmZmVyVG9nZ2xlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEJ1ZmZlcnMgdmFsdWVzIGZyb20gdGhlIHNvdXJjZSBieSBvcGVuaW5nIHRoZSBidWZmZXIgdmlhIHNpZ25hbHMgZnJvbSBhblxuICogT2JzZXJ2YWJsZSBwcm92aWRlZCB0byBgb3BlbmluZ3NgLCBhbmQgY2xvc2luZyBhbmQgc2VuZGluZyB0aGUgYnVmZmVycyB3aGVuXG4gKiBhIFN1YnNjcmliYWJsZSBvciBQcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgY2xvc2luZ1NlbGVjdG9yYCBmdW5jdGlvbiBlbWl0cy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FdmVyeSBvdGhlciBzZWNvbmQsIGVtaXQgdGhlIGNsaWNrIGV2ZW50cyBmcm9tIHRoZSBuZXh0IDUwMG1zPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBvcGVuaW5ncyA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG4gKiB2YXIgYnVmZmVyZWQgPSBjbGlja3MuYnVmZmVyVG9nZ2xlKG9wZW5pbmdzLCBpID0+XG4gKiAgIGkgJSAyID8gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCg1MDApIDogUnguT2JzZXJ2YWJsZS5lbXB0eSgpXG4gKiApO1xuICogYnVmZmVyZWQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcn1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlckNvdW50fVxuICogQHNlZSB7QGxpbmsgYnVmZmVyVGltZX1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcldoZW59XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUb2dnbGV9XG4gKlxuICogQHBhcmFtIHtTdWJzY3JpYmFibGVPclByb21pc2U8Tz59IG9wZW5pbmdzIEEgU3Vic2NyaWJhYmxlIG9yIFByb21pc2Ugb2Ygbm90aWZpY2F0aW9ucyB0byBzdGFydCBuZXdcbiAqIGJ1ZmZlcnMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBPKTogU3Vic2NyaWJhYmxlT3JQcm9taXNlfSBjbG9zaW5nU2VsZWN0b3IgQSBmdW5jdGlvbiB0aGF0IHRha2VzXG4gKiB0aGUgdmFsdWUgZW1pdHRlZCBieSB0aGUgYG9wZW5pbmdzYCBvYnNlcnZhYmxlIGFuZCByZXR1cm5zIGEgU3Vic2NyaWJhYmxlIG9yIFByb21pc2UsXG4gKiB3aGljaCwgd2hlbiBpdCBlbWl0cywgc2lnbmFscyB0aGF0IHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBzaG91bGQgYmUgZW1pdHRlZFxuICogYW5kIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFRbXT59IEFuIG9ic2VydmFibGUgb2YgYXJyYXlzIG9mIGJ1ZmZlcmVkIHZhbHVlcy5cbiAqIEBtZXRob2QgYnVmZmVyVG9nZ2xlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBidWZmZXJUb2dnbGUob3BlbmluZ3MsIGNsb3NpbmdTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEJ1ZmZlclRvZ2dsZU9wZXJhdG9yKG9wZW5pbmdzLCBjbG9zaW5nU2VsZWN0b3IpKTtcbn1cbmV4cG9ydHMuYnVmZmVyVG9nZ2xlID0gYnVmZmVyVG9nZ2xlO1xudmFyIEJ1ZmZlclRvZ2dsZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCdWZmZXJUb2dnbGVPcGVyYXRvcihvcGVuaW5ncywgY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMub3BlbmluZ3MgPSBvcGVuaW5ncztcbiAgICAgICAgdGhpcy5jbG9zaW5nU2VsZWN0b3IgPSBjbG9zaW5nU2VsZWN0b3I7XG4gICAgfVxuICAgIEJ1ZmZlclRvZ2dsZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQnVmZmVyVG9nZ2xlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm9wZW5pbmdzLCB0aGlzLmNsb3NpbmdTZWxlY3RvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIEJ1ZmZlclRvZ2dsZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQnVmZmVyVG9nZ2xlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJ1ZmZlclRvZ2dsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnVmZmVyVG9nZ2xlU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb3BlbmluZ3MsIGNsb3NpbmdTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMub3BlbmluZ3MgPSBvcGVuaW5ncztcbiAgICAgICAgdGhpcy5jbG9zaW5nU2VsZWN0b3IgPSBjbG9zaW5nU2VsZWN0b3I7XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBvcGVuaW5ncykpO1xuICAgIH1cbiAgICBCdWZmZXJUb2dnbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgbGVuID0gY29udGV4dHMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb250ZXh0c1tpXS5idWZmZXIucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJ1ZmZlclRvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgd2hpbGUgKGNvbnRleHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGNvbnRleHQuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlciA9IG51bGw7XG4gICAgICAgICAgICBjb250ZXh0LnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG51bGw7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2Vycm9yLmNhbGwodGhpcywgZXJyKTtcbiAgICB9O1xuICAgIEJ1ZmZlclRvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgd2hpbGUgKGNvbnRleHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY29udGV4dHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChjb250ZXh0LmJ1ZmZlcik7XG4gICAgICAgICAgICBjb250ZXh0LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXIgPSBudWxsO1xuICAgICAgICAgICAgY29udGV4dC5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBudWxsO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgQnVmZmVyVG9nZ2xlU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICBvdXRlclZhbHVlID8gdGhpcy5jbG9zZUJ1ZmZlcihvdXRlclZhbHVlKSA6IHRoaXMub3BlbkJ1ZmZlcihpbm5lclZhbHVlKTtcbiAgICB9O1xuICAgIEJ1ZmZlclRvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdWZmZXIoaW5uZXJTdWIuY29udGV4dCk7XG4gICAgfTtcbiAgICBCdWZmZXJUb2dnbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5vcGVuQnVmZmVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY2xvc2luZ1NlbGVjdG9yID0gdGhpcy5jbG9zaW5nU2VsZWN0b3I7XG4gICAgICAgICAgICB2YXIgY2xvc2luZ05vdGlmaWVyID0gY2xvc2luZ1NlbGVjdG9yLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNsb3NpbmdOb3RpZmllcikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJ5U3Vic2NyaWJlKGNsb3NpbmdOb3RpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQnVmZmVyVG9nZ2xlU3Vic2NyaWJlci5wcm90b3R5cGUuY2xvc2VCdWZmZXIgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICBpZiAoY29udGV4dHMgJiYgY29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGNvbnRleHQuYnVmZmVyLCBzdWJzY3JpcHRpb24gPSBjb250ZXh0LnN1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChidWZmZXIpO1xuICAgICAgICAgICAgY29udGV4dHMuc3BsaWNlKGNvbnRleHRzLmluZGV4T2YoY29udGV4dCksIDEpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCdWZmZXJUb2dnbGVTdWJzY3JpYmVyLnByb3RvdHlwZS50cnlTdWJzY3JpYmUgPSBmdW5jdGlvbiAoY2xvc2luZ05vdGlmaWVyKSB7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHZhciBidWZmZXIgPSBbXTtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7IGJ1ZmZlcjogYnVmZmVyLCBzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbiB9O1xuICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICB2YXIgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGNsb3NpbmdOb3RpZmllciwgY29udGV4dCk7XG4gICAgICAgIGlmICghaW5uZXJTdWJzY3JpcHRpb24gfHwgaW5uZXJTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQnVmZmVyKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5uZXJTdWJzY3JpcHRpb24uY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgICAgICB0aGlzLmFkZChpbm5lclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKGlubmVyU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJ1ZmZlclRvZ2dsZVN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyVG9nZ2xlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlclRvZ2dsZS5qc1xuLy8gbW9kdWxlIGlkID0gNDY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  929. /***/ },
  930. /* 469 */
  931. /***/ function(module, exports, __webpack_require__) {
  932. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar bufferWhen_1 = __webpack_require__(470);\nObservable_1.Observable.prototype.bufferWhen = bufferWhen_1.bufferWhen;\n//# sourceMappingURL=bufferWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJXaGVuLmpzPzJhYjEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGJ1ZmZlcldoZW5fMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2J1ZmZlcldoZW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5idWZmZXJXaGVuID0gYnVmZmVyV2hlbl8xLmJ1ZmZlcldoZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idWZmZXJXaGVuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9idWZmZXJXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA0Njlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  933. /***/ },
  934. /* 470 */
  935. /***/ function(module, exports, __webpack_require__) {
  936. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscription_1 = __webpack_require__(11);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Buffers the source Observable values, using a factory function of closing\n * Observables to determine when to close, emit, and reset the buffer.\n *\n * <span class=\"informal\">Collects values from the past as an array. When it\n * starts collecting values, it calls a function that returns an Observable that\n * tells when to close the buffer and restart collecting.</span>\n *\n * <img src=\"./img/bufferWhen.png\" width=\"100%\">\n *\n * Opens a buffer immediately, then closes the buffer when the observable\n * returned by calling `closingSelector` function emits a value. When it closes\n * the buffer, it immediately opens a new buffer and repeats the process.\n *\n * @example <caption>Emit an array of the last clicks every [1-5] random seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var buffered = clicks.bufferWhen(() =>\n * Rx.Observable.interval(1000 + Math.random() * 4000)\n * );\n * buffered.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n * @see {@link bufferTime}\n * @see {@link bufferToggle}\n * @see {@link windowWhen}\n *\n * @param {function(): Observable} closingSelector A function that takes no\n * arguments and returns an Observable that signals buffer closure.\n * @return {Observable<T[]>} An observable of arrays of buffered values.\n * @method bufferWhen\n * @owner Observable\n */\nfunction bufferWhen(closingSelector) {\n return this.lift(new BufferWhenOperator(closingSelector));\n}\nexports.bufferWhen = bufferWhen;\nvar BufferWhenOperator = (function () {\n function BufferWhenOperator(closingSelector) {\n this.closingSelector = closingSelector;\n }\n BufferWhenOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));\n };\n return BufferWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar BufferWhenSubscriber = (function (_super) {\n __extends(BufferWhenSubscriber, _super);\n function BufferWhenSubscriber(destination, closingSelector) {\n _super.call(this, destination);\n this.closingSelector = closingSelector;\n this.subscribing = false;\n this.openBuffer();\n }\n BufferWhenSubscriber.prototype._next = function (value) {\n this.buffer.push(value);\n };\n BufferWhenSubscriber.prototype._complete = function () {\n var buffer = this.buffer;\n if (buffer) {\n this.destination.next(buffer);\n }\n _super.prototype._complete.call(this);\n };\n BufferWhenSubscriber.prototype._unsubscribe = function () {\n this.buffer = null;\n this.subscribing = false;\n };\n BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.openBuffer();\n };\n BufferWhenSubscriber.prototype.notifyComplete = function () {\n if (this.subscribing) {\n this.complete();\n }\n else {\n this.openBuffer();\n }\n };\n BufferWhenSubscriber.prototype.openBuffer = function () {\n var closingSubscription = this.closingSubscription;\n if (closingSubscription) {\n this.remove(closingSubscription);\n closingSubscription.unsubscribe();\n }\n var buffer = this.buffer;\n if (this.buffer) {\n this.destination.next(buffer);\n }\n this.buffer = [];\n var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();\n if (closingNotifier === errorObject_1.errorObject) {\n this.error(errorObject_1.errorObject.e);\n }\n else {\n closingSubscription = new Subscription_1.Subscription();\n this.closingSubscription = closingSubscription;\n this.add(closingSubscription);\n this.subscribing = true;\n closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));\n this.subscribing = false;\n }\n };\n return BufferWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=bufferWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2J1ZmZlcldoZW4uanM/MDZmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaXB0aW9uJyk7XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQnVmZmVycyB0aGUgc291cmNlIE9ic2VydmFibGUgdmFsdWVzLCB1c2luZyBhIGZhY3RvcnkgZnVuY3Rpb24gb2YgY2xvc2luZ1xuICogT2JzZXJ2YWJsZXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gY2xvc2UsIGVtaXQsIGFuZCByZXNldCB0aGUgYnVmZmVyLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5Db2xsZWN0cyB2YWx1ZXMgZnJvbSB0aGUgcGFzdCBhcyBhbiBhcnJheS4gV2hlbiBpdFxuICogc3RhcnRzIGNvbGxlY3RpbmcgdmFsdWVzLCBpdCBjYWxscyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXRcbiAqIHRlbGxzIHdoZW4gdG8gY2xvc2UgdGhlIGJ1ZmZlciBhbmQgcmVzdGFydCBjb2xsZWN0aW5nLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2J1ZmZlcldoZW4ucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogT3BlbnMgYSBidWZmZXIgaW1tZWRpYXRlbHksIHRoZW4gY2xvc2VzIHRoZSBidWZmZXIgd2hlbiB0aGUgb2JzZXJ2YWJsZVxuICogcmV0dXJuZWQgYnkgY2FsbGluZyBgY2xvc2luZ1NlbGVjdG9yYCBmdW5jdGlvbiBlbWl0cyBhIHZhbHVlLiBXaGVuIGl0IGNsb3Nlc1xuICogdGhlIGJ1ZmZlciwgaXQgaW1tZWRpYXRlbHkgb3BlbnMgYSBuZXcgYnVmZmVyIGFuZCByZXBlYXRzIHRoZSBwcm9jZXNzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgYW4gYXJyYXkgb2YgdGhlIGxhc3QgY2xpY2tzIGV2ZXJ5IFsxLTVdIHJhbmRvbSBzZWNvbmRzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBidWZmZXJlZCA9IGNsaWNrcy5idWZmZXJXaGVuKCgpID0+XG4gKiAgIFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCArIE1hdGgucmFuZG9tKCkgKiA0MDAwKVxuICogKTtcbiAqIGJ1ZmZlcmVkLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBidWZmZXJ9XG4gKiBAc2VlIHtAbGluayBidWZmZXJDb3VudH1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlclRpbWV9XG4gKiBAc2VlIHtAbGluayBidWZmZXJUb2dnbGV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dXaGVufVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogT2JzZXJ2YWJsZX0gY2xvc2luZ1NlbGVjdG9yIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIGJ1ZmZlciBjbG9zdXJlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUW10+fSBBbiBvYnNlcnZhYmxlIG9mIGFycmF5cyBvZiBidWZmZXJlZCB2YWx1ZXMuXG4gKiBAbWV0aG9kIGJ1ZmZlcldoZW5cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGJ1ZmZlcldoZW4oY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgQnVmZmVyV2hlbk9wZXJhdG9yKGNsb3NpbmdTZWxlY3RvcikpO1xufVxuZXhwb3J0cy5idWZmZXJXaGVuID0gYnVmZmVyV2hlbjtcbnZhciBCdWZmZXJXaGVuT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1ZmZlcldoZW5PcGVyYXRvcihjbG9zaW5nU2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5jbG9zaW5nU2VsZWN0b3IgPSBjbG9zaW5nU2VsZWN0b3I7XG4gICAgfVxuICAgIEJ1ZmZlcldoZW5PcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEJ1ZmZlcldoZW5TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY2xvc2luZ1NlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyV2hlbk9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQnVmZmVyV2hlblN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCdWZmZXJXaGVuU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWZmZXJXaGVuU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5jbG9zaW5nU2VsZWN0b3IgPSBjbG9zaW5nU2VsZWN0b3I7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuQnVmZmVyKCk7XG4gICAgfVxuICAgIEJ1ZmZlcldoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICB9O1xuICAgIEJ1ZmZlcldoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIEJ1ZmZlcldoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmluZyA9IGZhbHNlO1xuICAgIH07XG4gICAgQnVmZmVyV2hlblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5vcGVuQnVmZmVyKCk7XG4gICAgfTtcbiAgICBCdWZmZXJXaGVuU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmliaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5CdWZmZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQnVmZmVyV2hlblN1YnNjcmliZXIucHJvdG90eXBlLm9wZW5CdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbG9zaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5jbG9zaW5nU3Vic2NyaXB0aW9uO1xuICAgICAgICBpZiAoY2xvc2luZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoY2xvc2luZ1N1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBjbG9zaW5nU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChidWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHZhciBjbG9zaW5nTm90aWZpZXIgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKHRoaXMuY2xvc2luZ1NlbGVjdG9yKSgpO1xuICAgICAgICBpZiAoY2xvc2luZ05vdGlmaWVyID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjbG9zaW5nU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zaW5nU3Vic2NyaXB0aW9uID0gY2xvc2luZ1N1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYWRkKGNsb3NpbmdTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmluZyA9IHRydWU7XG4gICAgICAgICAgICBjbG9zaW5nU3Vic2NyaXB0aW9uLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGNsb3NpbmdOb3RpZmllcikpO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQnVmZmVyV2hlblN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnVmZmVyV2hlbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9idWZmZXJXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA0NzBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  937. /***/ },
  938. /* 471 */
  939. /***/ function(module, exports, __webpack_require__) {
  940. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar catch_1 = __webpack_require__(57);\nObservable_1.Observable.prototype.catch = catch_1._catch;\nObservable_1.Observable.prototype._catch = catch_1._catch;\n//# sourceMappingURL=catch.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jYXRjaC5qcz8zM2MzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBjYXRjaF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvY2F0Y2gnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jYXRjaCA9IGNhdGNoXzEuX2NhdGNoO1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUucHJvdG90eXBlLl9jYXRjaCA9IGNhdGNoXzEuX2NhdGNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2F0Y2guanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2NhdGNoLmpzXG4vLyBtb2R1bGUgaWQgPSA0NzFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  941. /***/ },
  942. /* 472 */
  943. /***/ function(module, exports, __webpack_require__) {
  944. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar combineAll_1 = __webpack_require__(473);\nObservable_1.Observable.prototype.combineAll = combineAll_1.combineAll;\n//# sourceMappingURL=combineAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb21iaW5lQWxsLmpzP2E3NGMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGNvbWJpbmVBbGxfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2NvbWJpbmVBbGwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb21iaW5lQWxsID0gY29tYmluZUFsbF8xLmNvbWJpbmVBbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5lQWxsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb21iaW5lQWxsLmpzXG4vLyBtb2R1bGUgaWQgPSA0NzJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  945. /***/ },
  946. /* 473 */
  947. /***/ function(module, exports, __webpack_require__) {
  948. eval("\"use strict\";\nvar combineLatest_1 = __webpack_require__(385);\n/**\n * Converts a higher-order Observable into a first-order Observable by waiting\n * for the outer Observable to complete, then applying {@link combineLatest}.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by applying\n * {@link combineLatest} when the Observable-of-Observables completes.</span>\n *\n * <img src=\"./img/combineAll.png\" width=\"100%\">\n *\n * Takes an Observable of Observables, and collects all Observables from it.\n * Once the outer Observable completes, it subscribes to all collected\n * Observables and combines their values using the {@link combineLatest}\n * strategy, such that:\n * - Every time an inner Observable emits, the output Observable emits.\n * - When the returned observable emits, it emits all of the latest values by:\n * - If a `project` function is provided, it is called with each recent value\n * from each inner Observable in whatever order they arrived, and the result\n * of the `project` function is what is emitted by the output Observable.\n * - If there is no `project` function, an array of all of the most recent\n * values is emitted by the output Observable.\n *\n * @example <caption>Map two click events to a finite interval Observable, then apply combineAll</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map(ev =>\n * Rx.Observable.interval(Math.random()*2000).take(3)\n * ).take(2);\n * var result = higherOrder.combineAll();\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n * @see {@link mergeAll}\n *\n * @param {function} [project] An optional function to map the most recent\n * values from each inner Observable into a new result. Takes each of the most\n * recent values from each collected inner Observable as arguments, in order.\n * @return {Observable} An Observable of projected results or arrays of recent\n * values.\n * @method combineAll\n * @owner Observable\n */\nfunction combineAll(project) {\n return this.lift(new combineLatest_1.CombineLatestOperator(project));\n}\nexports.combineAll = combineAll;\n//# sourceMappingURL=combineAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2NvbWJpbmVBbGwuanM/M2Y1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBjb21iaW5lTGF0ZXN0XzEgPSByZXF1aXJlKCcuL2NvbWJpbmVMYXRlc3QnKTtcbi8qKlxuICogQ29udmVydHMgYSBoaWdoZXItb3JkZXIgT2JzZXJ2YWJsZSBpbnRvIGEgZmlyc3Qtb3JkZXIgT2JzZXJ2YWJsZSBieSB3YWl0aW5nXG4gKiBmb3IgdGhlIG91dGVyIE9ic2VydmFibGUgdG8gY29tcGxldGUsIHRoZW4gYXBwbHlpbmcge0BsaW5rIGNvbWJpbmVMYXRlc3R9LlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5GbGF0dGVucyBhbiBPYnNlcnZhYmxlLW9mLU9ic2VydmFibGVzIGJ5IGFwcGx5aW5nXG4gKiB7QGxpbmsgY29tYmluZUxhdGVzdH0gd2hlbiB0aGUgT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlcyBjb21wbGV0ZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvY29tYmluZUFsbC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBUYWtlcyBhbiBPYnNlcnZhYmxlIG9mIE9ic2VydmFibGVzLCBhbmQgY29sbGVjdHMgYWxsIE9ic2VydmFibGVzIGZyb20gaXQuXG4gKiBPbmNlIHRoZSBvdXRlciBPYnNlcnZhYmxlIGNvbXBsZXRlcywgaXQgc3Vic2NyaWJlcyB0byBhbGwgY29sbGVjdGVkXG4gKiBPYnNlcnZhYmxlcyBhbmQgY29tYmluZXMgdGhlaXIgdmFsdWVzIHVzaW5nIHRoZSB7QGxpbmsgY29tYmluZUxhdGVzdH1cbiAqIHN0cmF0ZWd5LCBzdWNoIHRoYXQ6XG4gKiAtIEV2ZXJ5IHRpbWUgYW4gaW5uZXIgT2JzZXJ2YWJsZSBlbWl0cywgdGhlIG91dHB1dCBPYnNlcnZhYmxlIGVtaXRzLlxuICogLSBXaGVuIHRoZSByZXR1cm5lZCBvYnNlcnZhYmxlIGVtaXRzLCBpdCBlbWl0cyBhbGwgb2YgdGhlIGxhdGVzdCB2YWx1ZXMgYnk6XG4gKiAgIC0gSWYgYSBgcHJvamVjdGAgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IGlzIGNhbGxlZCB3aXRoIGVhY2ggcmVjZW50IHZhbHVlXG4gKiAgICAgZnJvbSBlYWNoIGlubmVyIE9ic2VydmFibGUgaW4gd2hhdGV2ZXIgb3JkZXIgdGhleSBhcnJpdmVkLCBhbmQgdGhlIHJlc3VsdFxuICogICAgIG9mIHRoZSBgcHJvamVjdGAgZnVuY3Rpb24gaXMgd2hhdCBpcyBlbWl0dGVkIGJ5IHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqICAgLSBJZiB0aGVyZSBpcyBubyBgcHJvamVjdGAgZnVuY3Rpb24sIGFuIGFycmF5IG9mIGFsbCBvZiB0aGUgbW9zdCByZWNlbnRcbiAqICAgICB2YWx1ZXMgaXMgZW1pdHRlZCBieSB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+TWFwIHR3byBjbGljayBldmVudHMgdG8gYSBmaW5pdGUgaW50ZXJ2YWwgT2JzZXJ2YWJsZSwgdGhlbiBhcHBseSBjb21iaW5lQWxsPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBoaWdoZXJPcmRlciA9IGNsaWNrcy5tYXAoZXYgPT5cbiAqICAgUnguT2JzZXJ2YWJsZS5pbnRlcnZhbChNYXRoLnJhbmRvbSgpKjIwMDApLnRha2UoMylcbiAqICkudGFrZSgyKTtcbiAqIHZhciByZXN1bHQgPSBoaWdoZXJPcmRlci5jb21iaW5lQWxsKCk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGNvbWJpbmVMYXRlc3R9XG4gKiBAc2VlIHtAbGluayBtZXJnZUFsbH1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcHJvamVjdF0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gbWFwIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWVzIGZyb20gZWFjaCBpbm5lciBPYnNlcnZhYmxlIGludG8gYSBuZXcgcmVzdWx0LiBUYWtlcyBlYWNoIG9mIHRoZSBtb3N0XG4gKiByZWNlbnQgdmFsdWVzIGZyb20gZWFjaCBjb2xsZWN0ZWQgaW5uZXIgT2JzZXJ2YWJsZSBhcyBhcmd1bWVudHMsIGluIG9yZGVyLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBvZiBwcm9qZWN0ZWQgcmVzdWx0cyBvciBhcnJheXMgb2YgcmVjZW50XG4gKiB2YWx1ZXMuXG4gKiBAbWV0aG9kIGNvbWJpbmVBbGxcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVBbGwocHJvamVjdCkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IGNvbWJpbmVMYXRlc3RfMS5Db21iaW5lTGF0ZXN0T3BlcmF0b3IocHJvamVjdCkpO1xufVxuZXhwb3J0cy5jb21iaW5lQWxsID0gY29tYmluZUFsbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbWJpbmVBbGwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvY29tYmluZUFsbC5qc1xuLy8gbW9kdWxlIGlkID0gNDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  949. /***/ },
  950. /* 474 */
  951. /***/ function(module, exports, __webpack_require__) {
  952. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar combineLatest_1 = __webpack_require__(385);\nObservable_1.Observable.prototype.combineLatest = combineLatest_1.combineLatest;\n//# sourceMappingURL=combineLatest.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb21iaW5lTGF0ZXN0LmpzPzdjNWIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGNvbWJpbmVMYXRlc3RfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2NvbWJpbmVMYXRlc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb21iaW5lTGF0ZXN0ID0gY29tYmluZUxhdGVzdF8xLmNvbWJpbmVMYXRlc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21iaW5lTGF0ZXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb21iaW5lTGF0ZXN0LmpzXG4vLyBtb2R1bGUgaWQgPSA0NzRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  953. /***/ },
  954. /* 475 */
  955. /***/ function(module, exports, __webpack_require__) {
  956. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar concat_1 = __webpack_require__(388);\nObservable_1.Observable.prototype.concat = concat_1.concat;\n//# sourceMappingURL=concat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb25jYXQuanM/OTc3NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgY29uY2F0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9jb25jYXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb25jYXQgPSBjb25jYXRfMS5jb25jYXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2NvbmNhdC5qc1xuLy8gbW9kdWxlIGlkID0gNDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  957. /***/ },
  958. /* 476 */
  959. /***/ function(module, exports, __webpack_require__) {
  960. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar concatAll_1 = __webpack_require__(58);\nObservable_1.Observable.prototype.concatAll = concatAll_1.concatAll;\n//# sourceMappingURL=concatAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb25jYXRBbGwuanM/YjVjZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgY29uY2F0QWxsXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9jb25jYXRBbGwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb25jYXRBbGwgPSBjb25jYXRBbGxfMS5jb25jYXRBbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRBbGwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2NvbmNhdEFsbC5qc1xuLy8gbW9kdWxlIGlkID0gNDc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  961. /***/ },
  962. /* 477 */
  963. /***/ function(module, exports, __webpack_require__) {
  964. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar concatMap_1 = __webpack_require__(47);\nObservable_1.Observable.prototype.concatMap = concatMap_1.concatMap;\n//# sourceMappingURL=concatMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb25jYXRNYXAuanM/ZTBjMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgY29uY2F0TWFwXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9jb25jYXRNYXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb25jYXRNYXAgPSBjb25jYXRNYXBfMS5jb25jYXRNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRNYXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2NvbmNhdE1hcC5qc1xuLy8gbW9kdWxlIGlkID0gNDc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  965. /***/ },
  966. /* 478 */
  967. /***/ function(module, exports, __webpack_require__) {
  968. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar concatMapTo_1 = __webpack_require__(479);\nObservable_1.Observable.prototype.concatMapTo = concatMapTo_1.concatMapTo;\n//# sourceMappingURL=concatMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb25jYXRNYXBUby5qcz9kZmZhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBjb25jYXRNYXBUb18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvY29uY2F0TWFwVG8nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb25jYXRNYXBUbyA9IGNvbmNhdE1hcFRvXzEuY29uY2F0TWFwVG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRNYXBUby5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvY29uY2F0TWFwVG8uanNcbi8vIG1vZHVsZSBpZCA9IDQ3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  969. /***/ },
  970. /* 479 */
  971. /***/ function(module, exports, __webpack_require__) {
  972. eval("\"use strict\";\nvar mergeMapTo_1 = __webpack_require__(480);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to the same Observable which is merged multiple\n * times in a serialized fashion on the output Observable.\n *\n * <span class=\"informal\">It's like {@link concatMap}, but maps each value\n * always to the same inner Observable.</span>\n *\n * <img src=\"./img/concatMapTo.png\" width=\"100%\">\n *\n * Maps each source value to the given Observable `innerObservable` regardless\n * of the source value, and then flattens those resulting Observables into one\n * single Observable, which is the output Observable. Each new `innerObservable`\n * instance emitted on the output Observable is concatenated with the previous\n * `innerObservable` instance.\n *\n * __Warning:__ if source values arrive endlessly and faster than their\n * corresponding inner Observables can complete, it will result in memory issues\n * as inner Observables amass in an unbounded buffer waiting for their turn to\n * be subscribed to.\n *\n * Note: `concatMapTo` is equivalent to `mergeMapTo` with concurrency parameter\n * set to `1`.\n *\n * @example <caption>For each click event, tick every second from 0 to 3, with no concurrency</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.concatMapTo(Rx.Observable.interval(1000).take(4));\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n *\n * @see {@link concat}\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link mergeMapTo}\n * @see {@link switchMapTo}\n *\n * @param {Observable} innerObservable An Observable to replace each value from\n * the source Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An observable of values merged together by joining the\n * passed observable with itself, one after the other, for each value emitted\n * from the source.\n * @method concatMapTo\n * @owner Observable\n */\nfunction concatMapTo(innerObservable, resultSelector) {\n return this.lift(new mergeMapTo_1.MergeMapToOperator(innerObservable, resultSelector, 1));\n}\nexports.concatMapTo = concatMapTo;\n//# sourceMappingURL=concatMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2NvbmNhdE1hcFRvLmpzPzBlNDMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbWVyZ2VNYXBUb18xID0gcmVxdWlyZSgnLi9tZXJnZU1hcFRvJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUHJvamVjdHMgZWFjaCBzb3VyY2UgdmFsdWUgdG8gdGhlIHNhbWUgT2JzZXJ2YWJsZSB3aGljaCBpcyBtZXJnZWQgbXVsdGlwbGVcbiAqIHRpbWVzIGluIGEgc2VyaWFsaXplZCBmYXNoaW9uIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBjb25jYXRNYXB9LCBidXQgbWFwcyBlYWNoIHZhbHVlXG4gKiBhbHdheXMgdG8gdGhlIHNhbWUgaW5uZXIgT2JzZXJ2YWJsZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9jb25jYXRNYXBUby5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBNYXBzIGVhY2ggc291cmNlIHZhbHVlIHRvIHRoZSBnaXZlbiBPYnNlcnZhYmxlIGBpbm5lck9ic2VydmFibGVgIHJlZ2FyZGxlc3NcbiAqIG9mIHRoZSBzb3VyY2UgdmFsdWUsIGFuZCB0aGVuIGZsYXR0ZW5zIHRob3NlIHJlc3VsdGluZyBPYnNlcnZhYmxlcyBpbnRvIG9uZVxuICogc2luZ2xlIE9ic2VydmFibGUsIHdoaWNoIGlzIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS4gRWFjaCBuZXcgYGlubmVyT2JzZXJ2YWJsZWBcbiAqIGluc3RhbmNlIGVtaXR0ZWQgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBwcmV2aW91c1xuICogYGlubmVyT2JzZXJ2YWJsZWAgaW5zdGFuY2UuXG4gKlxuICogX19XYXJuaW5nOl9fIGlmIHNvdXJjZSB2YWx1ZXMgYXJyaXZlIGVuZGxlc3NseSBhbmQgZmFzdGVyIHRoYW4gdGhlaXJcbiAqIGNvcnJlc3BvbmRpbmcgaW5uZXIgT2JzZXJ2YWJsZXMgY2FuIGNvbXBsZXRlLCBpdCB3aWxsIHJlc3VsdCBpbiBtZW1vcnkgaXNzdWVzXG4gKiBhcyBpbm5lciBPYnNlcnZhYmxlcyBhbWFzcyBpbiBhbiB1bmJvdW5kZWQgYnVmZmVyIHdhaXRpbmcgZm9yIHRoZWlyIHR1cm4gdG9cbiAqIGJlIHN1YnNjcmliZWQgdG8uXG4gKlxuICogTm90ZTogYGNvbmNhdE1hcFRvYCBpcyBlcXVpdmFsZW50IHRvIGBtZXJnZU1hcFRvYCB3aXRoIGNvbmN1cnJlbmN5IHBhcmFtZXRlclxuICogc2V0IHRvIGAxYC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Gb3IgZWFjaCBjbGljayBldmVudCwgdGljayBldmVyeSBzZWNvbmQgZnJvbSAwIHRvIDMsIHdpdGggbm8gY29uY3VycmVuY3k8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5jb25jYXRNYXBUbyhSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApLnRha2UoNCkpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiAvLyBSZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6XG4gKiAvLyAocmVzdWx0cyBhcmUgbm90IGNvbmN1cnJlbnQpXG4gKiAvLyBGb3IgZXZlcnkgY2xpY2sgb24gdGhlIFwiZG9jdW1lbnRcIiBpdCB3aWxsIGVtaXQgdmFsdWVzIDAgdG8gMyBzcGFjZWRcbiAqIC8vIG9uIGEgMTAwMG1zIGludGVydmFsXG4gKiAvLyBvbmUgY2xpY2sgPSAxMDAwbXMtPiAwIC0xMDAwbXMtPiAxIC0xMDAwbXMtPiAyIC0xMDAwbXMtPiAzXG4gKlxuICogQHNlZSB7QGxpbmsgY29uY2F0fVxuICogQHNlZSB7QGxpbmsgY29uY2F0QWxsfVxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VNYXBUb31cbiAqIEBzZWUge0BsaW5rIHN3aXRjaE1hcFRvfVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gaW5uZXJPYnNlcnZhYmxlIEFuIE9ic2VydmFibGUgdG8gcmVwbGFjZSBlYWNoIHZhbHVlIGZyb21cbiAqIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ob3V0ZXJWYWx1ZTogVCwgaW5uZXJWYWx1ZTogSSwgb3V0ZXJJbmRleDogbnVtYmVyLCBpbm5lckluZGV4OiBudW1iZXIpOiBhbnl9IFtyZXN1bHRTZWxlY3Rvcl1cbiAqIEEgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdmFsdWUgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZXNcbiAqIGFuZCB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIChvdXRlcikgZW1pc3Npb24gYW5kIHRoZSBpbm5lciBPYnNlcnZhYmxlXG4gKiBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBhcmU6XG4gKiAtIGBvdXRlclZhbHVlYDogdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBzb3VyY2VcbiAqIC0gYGlubmVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiAtIGBvdXRlckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJJbmRleGA6IHRoZSBcImluZGV4XCIgb2YgdGhlIHZhbHVlIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBvYnNlcnZhYmxlIG9mIHZhbHVlcyBtZXJnZWQgdG9nZXRoZXIgYnkgam9pbmluZyB0aGVcbiAqIHBhc3NlZCBvYnNlcnZhYmxlIHdpdGggaXRzZWxmLCBvbmUgYWZ0ZXIgdGhlIG90aGVyLCBmb3IgZWFjaCB2YWx1ZSBlbWl0dGVkXG4gKiBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAbWV0aG9kIGNvbmNhdE1hcFRvXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBjb25jYXRNYXBUbyhpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgbWVyZ2VNYXBUb18xLk1lcmdlTWFwVG9PcGVyYXRvcihpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yLCAxKSk7XG59XG5leHBvcnRzLmNvbmNhdE1hcFRvID0gY29uY2F0TWFwVG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25jYXRNYXBUby5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9jb25jYXRNYXBUby5qc1xuLy8gbW9kdWxlIGlkID0gNDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  973. /***/ },
  974. /* 480 */
  975. /***/ function(module, exports, __webpack_require__) {
  976. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to the same Observable which is merged multiple\n * times in the output Observable.\n *\n * <span class=\"informal\">It's like {@link mergeMap}, but maps each value always\n * to the same inner Observable.</span>\n *\n * <img src=\"./img/mergeMapTo.png\" width=\"100%\">\n *\n * Maps each source value to the given Observable `innerObservable` regardless\n * of the source value, and then merges those resulting Observables into one\n * single Observable, which is the output Observable.\n *\n * @example <caption>For each click event, start an interval Observable ticking every 1 second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.mergeMapTo(Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMapTo}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeScan}\n * @see {@link switchMapTo}\n *\n * @param {Observable} innerObservable An Observable to replace each value from\n * the source Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits items from the given\n * `innerObservable` (and optionally transformed through `resultSelector`) every\n * time a value is emitted on the source Observable.\n * @method mergeMapTo\n * @owner Observable\n */\nfunction mergeMapTo(innerObservable, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n resultSelector = null;\n }\n return this.lift(new MergeMapToOperator(innerObservable, resultSelector, concurrent));\n}\nexports.mergeMapTo = mergeMapTo;\n// TODO: Figure out correct signature here: an Operator<Observable<T>, R>\n// needs to implement call(observer: Subscriber<R>): Subscriber<Observable<T>>\nvar MergeMapToOperator = (function () {\n function MergeMapToOperator(ish, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n this.ish = ish;\n this.resultSelector = resultSelector;\n this.concurrent = concurrent;\n }\n MergeMapToOperator.prototype.call = function (observer, source) {\n return source.subscribe(new MergeMapToSubscriber(observer, this.ish, this.resultSelector, this.concurrent));\n };\n return MergeMapToOperator;\n}());\nexports.MergeMapToOperator = MergeMapToOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeMapToSubscriber = (function (_super) {\n __extends(MergeMapToSubscriber, _super);\n function MergeMapToSubscriber(destination, ish, resultSelector, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n _super.call(this, destination);\n this.ish = ish;\n this.resultSelector = resultSelector;\n this.concurrent = concurrent;\n this.hasCompleted = false;\n this.buffer = [];\n this.active = 0;\n this.index = 0;\n }\n MergeMapToSubscriber.prototype._next = function (value) {\n if (this.active < this.concurrent) {\n var resultSelector = this.resultSelector;\n var index = this.index++;\n var ish = this.ish;\n var destination = this.destination;\n this.active++;\n this._innerSub(ish, destination, resultSelector, value, index);\n }\n else {\n this.buffer.push(value);\n }\n };\n MergeMapToSubscriber.prototype._innerSub = function (ish, destination, resultSelector, value, index) {\n this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n };\n MergeMapToSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete();\n }\n };\n MergeMapToSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n if (resultSelector) {\n this.trySelectResult(outerValue, innerValue, outerIndex, innerIndex);\n }\n else {\n destination.next(innerValue);\n }\n };\n MergeMapToSubscriber.prototype.trySelectResult = function (outerValue, innerValue, outerIndex, innerIndex) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n var result;\n try {\n result = resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n catch (err) {\n destination.error(err);\n return;\n }\n destination.next(result);\n };\n MergeMapToSubscriber.prototype.notifyError = function (err) {\n this.destination.error(err);\n };\n MergeMapToSubscriber.prototype.notifyComplete = function (innerSub) {\n var buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n }\n else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete();\n }\n };\n return MergeMapToSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeMapToSubscriber = MergeMapToSubscriber;\n//# sourceMappingURL=mergeMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21lcmdlTWFwVG8uanM/ZGFlMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBQcm9qZWN0cyBlYWNoIHNvdXJjZSB2YWx1ZSB0byB0aGUgc2FtZSBPYnNlcnZhYmxlIHdoaWNoIGlzIG1lcmdlZCBtdWx0aXBsZVxuICogdGltZXMgaW4gdGhlIG91dHB1dCBPYnNlcnZhYmxlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5JdCdzIGxpa2Uge0BsaW5rIG1lcmdlTWFwfSwgYnV0IG1hcHMgZWFjaCB2YWx1ZSBhbHdheXNcbiAqIHRvIHRoZSBzYW1lIGlubmVyIE9ic2VydmFibGUuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbWVyZ2VNYXBUby5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBNYXBzIGVhY2ggc291cmNlIHZhbHVlIHRvIHRoZSBnaXZlbiBPYnNlcnZhYmxlIGBpbm5lck9ic2VydmFibGVgIHJlZ2FyZGxlc3NcbiAqIG9mIHRoZSBzb3VyY2UgdmFsdWUsIGFuZCB0aGVuIG1lcmdlcyB0aG9zZSByZXN1bHRpbmcgT2JzZXJ2YWJsZXMgaW50byBvbmVcbiAqIHNpbmdsZSBPYnNlcnZhYmxlLCB3aGljaCBpcyB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Rm9yIGVhY2ggY2xpY2sgZXZlbnQsIHN0YXJ0IGFuIGludGVydmFsIE9ic2VydmFibGUgdGlja2luZyBldmVyeSAxIHNlY29uZDwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLm1lcmdlTWFwVG8oUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKSk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGNvbmNhdE1hcFRvfVxuICogQHNlZSB7QGxpbmsgbWVyZ2V9XG4gKiBAc2VlIHtAbGluayBtZXJnZUFsbH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlTWFwfVxuICogQHNlZSB7QGxpbmsgbWVyZ2VTY2FufVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwVG99XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSBpbm5lck9ic2VydmFibGUgQW4gT2JzZXJ2YWJsZSB0byByZXBsYWNlIGVhY2ggdmFsdWUgZnJvbVxuICogdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQHBhcmFtIHtmdW5jdGlvbihvdXRlclZhbHVlOiBULCBpbm5lclZhbHVlOiBJLCBvdXRlckluZGV4OiBudW1iZXIsIGlubmVySW5kZXg6IG51bWJlcik6IGFueX0gW3Jlc3VsdFNlbGVjdG9yXVxuICogQSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB2YWx1ZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgYmFzZWQgb24gdGhlIHZhbHVlc1xuICogYW5kIHRoZSBpbmRpY2VzIG9mIHRoZSBzb3VyY2UgKG91dGVyKSBlbWlzc2lvbiBhbmQgdGhlIGlubmVyIE9ic2VydmFibGVcbiAqIGVtaXNzaW9uLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGFyZTpcbiAqIC0gYG91dGVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJWYWx1ZWA6IHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSB0aGUgcHJvamVjdGVkIE9ic2VydmFibGVcbiAqIC0gYG91dGVySW5kZXhgOiB0aGUgXCJpbmRleFwiIG9mIHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSB0aGUgc291cmNlXG4gKiAtIGBpbm5lckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgZnJvbSB0aGUgcHJvamVjdGVkIE9ic2VydmFibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uY3VycmVudD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldIE1heGltdW0gbnVtYmVyIG9mIGlucHV0XG4gKiBPYnNlcnZhYmxlcyBiZWluZyBzdWJzY3JpYmVkIHRvIGNvbmN1cnJlbnRseS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBpdGVtcyBmcm9tIHRoZSBnaXZlblxuICogYGlubmVyT2JzZXJ2YWJsZWAgKGFuZCBvcHRpb25hbGx5IHRyYW5zZm9ybWVkIHRocm91Z2ggYHJlc3VsdFNlbGVjdG9yYCkgZXZlcnlcbiAqIHRpbWUgYSB2YWx1ZSBpcyBlbWl0dGVkIG9uIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2QgbWVyZ2VNYXBUb1xuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbWVyZ2VNYXBUbyhpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkgeyBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOyB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgICByZXN1bHRTZWxlY3RvciA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE1lcmdlTWFwVG9PcGVyYXRvcihpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSk7XG59XG5leHBvcnRzLm1lcmdlTWFwVG8gPSBtZXJnZU1hcFRvO1xuLy8gVE9ETzogRmlndXJlIG91dCBjb3JyZWN0IHNpZ25hdHVyZSBoZXJlOiBhbiBPcGVyYXRvcjxPYnNlcnZhYmxlPFQ+LCBSPlxuLy8gICAgICAgbmVlZHMgdG8gaW1wbGVtZW50IGNhbGwob2JzZXJ2ZXI6IFN1YnNjcmliZXI8Uj4pOiBTdWJzY3JpYmVyPE9ic2VydmFibGU8VD4+XG52YXIgTWVyZ2VNYXBUb09wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZXJnZU1hcFRvT3BlcmF0b3IoaXNoLCByZXN1bHRTZWxlY3RvciwgY29uY3VycmVudCkge1xuICAgICAgICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7IH1cbiAgICAgICAgdGhpcy5pc2ggPSBpc2g7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICB9XG4gICAgTWVyZ2VNYXBUb09wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlTWFwVG9TdWJzY3JpYmVyKG9ic2VydmVyLCB0aGlzLmlzaCwgdGhpcy5yZXN1bHRTZWxlY3RvciwgdGhpcy5jb25jdXJyZW50KSk7XG4gICAgfTtcbiAgICByZXR1cm4gTWVyZ2VNYXBUb09wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuTWVyZ2VNYXBUb09wZXJhdG9yID0gTWVyZ2VNYXBUb09wZXJhdG9yO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBNZXJnZU1hcFRvU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1lcmdlTWFwVG9TdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1lcmdlTWFwVG9TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBpc2gsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gICAgICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaXNoID0gaXNoO1xuICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7XG4gICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuICAgIE1lcmdlTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgPCB0aGlzLmNvbmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHRTZWxlY3RvciA9IHRoaXMucmVzdWx0U2VsZWN0b3I7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICB2YXIgaXNoID0gdGhpcy5pc2g7XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmUrKztcbiAgICAgICAgICAgIHRoaXMuX2lubmVyU3ViKGlzaCwgZGVzdGluYXRpb24sIHJlc3VsdFNlbGVjdG9yLCB2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lcmdlTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5faW5uZXJTdWIgPSBmdW5jdGlvbiAoaXNoLCBkZXN0aW5hdGlvbiwgcmVzdWx0U2VsZWN0b3IsIHZhbHVlLCBpbmRleCkge1xuICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGlzaCwgdmFsdWUsIGluZGV4KSk7XG4gICAgfTtcbiAgICBNZXJnZU1hcFRvU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTWVyZ2VNYXBUb1N1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcmVzdWx0U2VsZWN0b3IgPSBfYS5yZXN1bHRTZWxlY3RvciwgZGVzdGluYXRpb24gPSBfYS5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnRyeVNlbGVjdFJlc3VsdChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lcmdlTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS50cnlTZWxlY3RSZXN1bHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCByZXN1bHRTZWxlY3RvciA9IF9hLnJlc3VsdFNlbGVjdG9yLCBkZXN0aW5hdGlvbiA9IF9hLmRlc3RpbmF0aW9uO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0U2VsZWN0b3Iob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7XG4gICAgfTtcbiAgICBNZXJnZU1hcFRvU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5RXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIE1lcmdlTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uIChpbm5lclN1Yikge1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIHRoaXMucmVtb3ZlKGlubmVyU3ViKTtcbiAgICAgICAgdGhpcy5hY3RpdmUtLTtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0KGJ1ZmZlci5zaGlmdCgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmhhc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTWVyZ2VNYXBUb1N1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5NZXJnZU1hcFRvU3Vic2NyaWJlciA9IE1lcmdlTWFwVG9TdWJzY3JpYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVyZ2VNYXBUby5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9tZXJnZU1hcFRvLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  977. /***/ },
  978. /* 481 */
  979. /***/ function(module, exports, __webpack_require__) {
  980. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar count_1 = __webpack_require__(482);\nObservable_1.Observable.prototype.count = count_1.count;\n//# sourceMappingURL=count.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9jb3VudC5qcz84Y2U1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBjb3VudF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvY291bnQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5jb3VudCA9IGNvdW50XzEuY291bnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3VudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvY291bnQuanNcbi8vIG1vZHVsZSBpZCA9IDQ4MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  981. /***/ },
  982. /* 482 */
  983. /***/ function(module, exports, __webpack_require__) {
  984. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Counts the number of emissions on the source and emits that number when the\n * source completes.\n *\n * <span class=\"informal\">Tells how many values were emitted, when the source\n * completes.</span>\n *\n * <img src=\"./img/count.png\" width=\"100%\">\n *\n * `count` transforms an Observable that emits values into an Observable that\n * emits a single value that represents the number of values emitted by the\n * source Observable. If the source Observable terminates with an error, `count`\n * will pass this error notification along without emitting an value first. If\n * the source Observable does not terminate at all, `count` will neither emit\n * a value nor terminate. This operator takes an optional `predicate` function\n * as argument, in which case the output emission will represent the number of\n * source values that matched `true` with the `predicate`.\n *\n * @example <caption>Counts how many seconds have passed before the first click happened</caption>\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var secondsBeforeClick = seconds.takeUntil(clicks);\n * var result = secondsBeforeClick.count();\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Counts how many odd numbers are there between 1 and 7</caption>\n * var numbers = Rx.Observable.range(1, 7);\n * var result = numbers.count(i => i % 2 === 1);\n * result.subscribe(x => console.log(x));\n *\n * // Results in:\n * // 4\n *\n * @see {@link max}\n * @see {@link min}\n * @see {@link reduce}\n *\n * @param {function(value: T, i: number, source: Observable<T>): boolean} [predicate] A\n * boolean function to select what values are to be counted. It is provided with\n * arguments of:\n * - `value`: the value from the source Observable.\n * - `index`: the (zero-based) \"index\" of the value from the source Observable.\n * - `source`: the source Observable instance itself.\n * @return {Observable} An Observable of one number that represents the count as\n * described above.\n * @method count\n * @owner Observable\n */\nfunction count(predicate) {\n return this.lift(new CountOperator(predicate, this));\n}\nexports.count = count;\nvar CountOperator = (function () {\n function CountOperator(predicate, source) {\n this.predicate = predicate;\n this.source = source;\n }\n CountOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));\n };\n return CountOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar CountSubscriber = (function (_super) {\n __extends(CountSubscriber, _super);\n function CountSubscriber(destination, predicate, source) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.source = source;\n this.count = 0;\n this.index = 0;\n }\n CountSubscriber.prototype._next = function (value) {\n if (this.predicate) {\n this._tryPredicate(value);\n }\n else {\n this.count++;\n }\n };\n CountSubscriber.prototype._tryPredicate = function (value) {\n var result;\n try {\n result = this.predicate(value, this.index++, this.source);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n this.count++;\n }\n };\n CountSubscriber.prototype._complete = function () {\n this.destination.next(this.count);\n this.destination.complete();\n };\n return CountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=count.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2NvdW50LmpzPzI3YzQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVtaXNzaW9ucyBvbiB0aGUgc291cmNlIGFuZCBlbWl0cyB0aGF0IG51bWJlciB3aGVuIHRoZVxuICogc291cmNlIGNvbXBsZXRlcy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+VGVsbHMgaG93IG1hbnkgdmFsdWVzIHdlcmUgZW1pdHRlZCwgd2hlbiB0aGUgc291cmNlXG4gKiBjb21wbGV0ZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvY291bnQucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYGNvdW50YCB0cmFuc2Zvcm1zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB2YWx1ZXMgaW50byBhbiBPYnNlcnZhYmxlIHRoYXRcbiAqIGVtaXRzIGEgc2luZ2xlIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBlbWl0dGVkIGJ5IHRoZVxuICogc291cmNlIE9ic2VydmFibGUuIElmIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0ZXJtaW5hdGVzIHdpdGggYW4gZXJyb3IsIGBjb3VudGBcbiAqIHdpbGwgcGFzcyB0aGlzIGVycm9yIG5vdGlmaWNhdGlvbiBhbG9uZyB3aXRob3V0IGVtaXR0aW5nIGFuIHZhbHVlIGZpcnN0LiBJZlxuICogdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGRvZXMgbm90IHRlcm1pbmF0ZSBhdCBhbGwsIGBjb3VudGAgd2lsbCBuZWl0aGVyIGVtaXRcbiAqIGEgdmFsdWUgbm9yIHRlcm1pbmF0ZS4gVGhpcyBvcGVyYXRvciB0YWtlcyBhbiBvcHRpb25hbCBgcHJlZGljYXRlYCBmdW5jdGlvblxuICogYXMgYXJndW1lbnQsIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dCBlbWlzc2lvbiB3aWxsIHJlcHJlc2VudCB0aGUgbnVtYmVyIG9mXG4gKiBzb3VyY2UgdmFsdWVzIHRoYXQgbWF0Y2hlZCBgdHJ1ZWAgd2l0aCB0aGUgYHByZWRpY2F0ZWAuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Q291bnRzIGhvdyBtYW55IHNlY29uZHMgaGF2ZSBwYXNzZWQgYmVmb3JlIHRoZSBmaXJzdCBjbGljayBoYXBwZW5lZDwvY2FwdGlvbj5cbiAqIHZhciBzZWNvbmRzID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgc2Vjb25kc0JlZm9yZUNsaWNrID0gc2Vjb25kcy50YWtlVW50aWwoY2xpY2tzKTtcbiAqIHZhciByZXN1bHQgPSBzZWNvbmRzQmVmb3JlQ2xpY2suY291bnQoKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Q291bnRzIGhvdyBtYW55IG9kZCBudW1iZXJzIGFyZSB0aGVyZSBiZXR3ZWVuIDEgYW5kIDc8L2NhcHRpb24+XG4gKiB2YXIgbnVtYmVycyA9IFJ4Lk9ic2VydmFibGUucmFuZ2UoMSwgNyk7XG4gKiB2YXIgcmVzdWx0ID0gbnVtYmVycy5jb3VudChpID0+IGkgJSAyID09PSAxKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbjpcbiAqIC8vIDRcbiAqXG4gKiBAc2VlIHtAbGluayBtYXh9XG4gKiBAc2VlIHtAbGluayBtaW59XG4gKiBAc2VlIHtAbGluayByZWR1Y2V9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCwgaTogbnVtYmVyLCBzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBib29sZWFufSBbcHJlZGljYXRlXSBBXG4gKiBib29sZWFuIGZ1bmN0aW9uIHRvIHNlbGVjdCB3aGF0IHZhbHVlcyBhcmUgdG8gYmUgY291bnRlZC4gSXQgaXMgcHJvdmlkZWQgd2l0aFxuICogYXJndW1lbnRzIG9mOlxuICogLSBgdmFsdWVgOiB0aGUgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiAtIGBpbmRleGA6IHRoZSAoemVyby1iYXNlZCkgXCJpbmRleFwiIG9mIHRoZSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIC0gYHNvdXJjZWA6IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBpbnN0YW5jZSBpdHNlbGYuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIG9mIG9uZSBudW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBjb3VudCBhc1xuICogZGVzY3JpYmVkIGFib3ZlLlxuICogQG1ldGhvZCBjb3VudFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gY291bnQocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgQ291bnRPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXMpKTtcbn1cbmV4cG9ydHMuY291bnQgPSBjb3VudDtcbnZhciBDb3VudE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb3VudE9wZXJhdG9yKHByZWRpY2F0ZSwgc291cmNlKSB7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgQ291bnRPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IENvdW50U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByZWRpY2F0ZSwgdGhpcy5zb3VyY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBDb3VudE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQ291bnRTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ291bnRTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvdW50U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlLCBzb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgQ291bnRTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5wcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyeVByZWRpY2F0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvdW50U3Vic2NyaWJlci5wcm90b3R5cGUuX3RyeVByZWRpY2F0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUodmFsdWUsIHRoaXMuaW5kZXgrKywgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvdW50U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodGhpcy5jb3VudCk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb3VudFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3VudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9jb3VudC5qc1xuLy8gbW9kdWxlIGlkID0gNDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  985. /***/ },
  986. /* 483 */
  987. /***/ function(module, exports, __webpack_require__) {
  988. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar dematerialize_1 = __webpack_require__(484);\nObservable_1.Observable.prototype.dematerialize = dematerialize_1.dematerialize;\n//# sourceMappingURL=dematerialize.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZW1hdGVyaWFsaXplLmpzPzY4ZWUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGRlbWF0ZXJpYWxpemVfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2RlbWF0ZXJpYWxpemUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZW1hdGVyaWFsaXplID0gZGVtYXRlcmlhbGl6ZV8xLmRlbWF0ZXJpYWxpemU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZW1hdGVyaWFsaXplLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZW1hdGVyaWFsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  989. /***/ },
  990. /* 484 */
  991. /***/ function(module, exports, __webpack_require__) {
  992. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Converts an Observable of {@link Notification} objects into the emissions\n * that they represent.\n *\n * <span class=\"informal\">Unwraps {@link Notification} objects as actual `next`,\n * `error` and `complete` emissions. The opposite of {@link materialize}.</span>\n *\n * <img src=\"./img/dematerialize.png\" width=\"100%\">\n *\n * `dematerialize` is assumed to operate an Observable that only emits\n * {@link Notification} objects as `next` emissions, and does not emit any\n * `error`. Such Observable is the output of a `materialize` operation. Those\n * notifications are then unwrapped using the metadata they contain, and emitted\n * as `next`, `error`, and `complete` on the output Observable.\n *\n * Use this operator in conjunction with {@link materialize}.\n *\n * @example <caption>Convert an Observable of Notifications to an actual Observable</caption>\n * var notifA = new Rx.Notification('N', 'A');\n * var notifB = new Rx.Notification('N', 'B');\n * var notifE = new Rx.Notification('E', void 0,\n * new TypeError('x.toUpperCase is not a function')\n * );\n * var materialized = Rx.Observable.of(notifA, notifB, notifE);\n * var upperCase = materialized.dematerialize();\n * upperCase.subscribe(x => console.log(x), e => console.error(e));\n *\n * // Results in:\n * // A\n * // B\n * // TypeError: x.toUpperCase is not a function\n *\n * @see {@link Notification}\n * @see {@link materialize}\n *\n * @return {Observable} An Observable that emits items and notifications\n * embedded in Notification objects emitted by the source Observable.\n * @method dematerialize\n * @owner Observable\n */\nfunction dematerialize() {\n return this.lift(new DeMaterializeOperator());\n}\nexports.dematerialize = dematerialize;\nvar DeMaterializeOperator = (function () {\n function DeMaterializeOperator() {\n }\n DeMaterializeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DeMaterializeSubscriber(subscriber));\n };\n return DeMaterializeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DeMaterializeSubscriber = (function (_super) {\n __extends(DeMaterializeSubscriber, _super);\n function DeMaterializeSubscriber(destination) {\n _super.call(this, destination);\n }\n DeMaterializeSubscriber.prototype._next = function (value) {\n value.observe(this.destination);\n };\n return DeMaterializeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=dematerialize.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlbWF0ZXJpYWxpemUuanM/MTg4NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogQ29udmVydHMgYW4gT2JzZXJ2YWJsZSBvZiB7QGxpbmsgTm90aWZpY2F0aW9ufSBvYmplY3RzIGludG8gdGhlIGVtaXNzaW9uc1xuICogdGhhdCB0aGV5IHJlcHJlc2VudC5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+VW53cmFwcyB7QGxpbmsgTm90aWZpY2F0aW9ufSBvYmplY3RzIGFzIGFjdHVhbCBgbmV4dGAsXG4gKiBgZXJyb3JgIGFuZCBgY29tcGxldGVgIGVtaXNzaW9ucy4gVGhlIG9wcG9zaXRlIG9mIHtAbGluayBtYXRlcmlhbGl6ZX0uPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZGVtYXRlcmlhbGl6ZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgZGVtYXRlcmlhbGl6ZWAgaXMgYXNzdW1lZCB0byBvcGVyYXRlIGFuIE9ic2VydmFibGUgdGhhdCBvbmx5IGVtaXRzXG4gKiB7QGxpbmsgTm90aWZpY2F0aW9ufSBvYmplY3RzIGFzIGBuZXh0YCBlbWlzc2lvbnMsIGFuZCBkb2VzIG5vdCBlbWl0IGFueVxuICogYGVycm9yYC4gU3VjaCBPYnNlcnZhYmxlIGlzIHRoZSBvdXRwdXQgb2YgYSBgbWF0ZXJpYWxpemVgIG9wZXJhdGlvbi4gVGhvc2VcbiAqIG5vdGlmaWNhdGlvbnMgYXJlIHRoZW4gdW53cmFwcGVkIHVzaW5nIHRoZSBtZXRhZGF0YSB0aGV5IGNvbnRhaW4sIGFuZCBlbWl0dGVkXG4gKiBhcyBgbmV4dGAsIGBlcnJvcmAsIGFuZCBgY29tcGxldGVgIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqXG4gKiBVc2UgdGhpcyBvcGVyYXRvciBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayBtYXRlcmlhbGl6ZX0uXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+Q29udmVydCBhbiBPYnNlcnZhYmxlIG9mIE5vdGlmaWNhdGlvbnMgdG8gYW4gYWN0dWFsIE9ic2VydmFibGU8L2NhcHRpb24+XG4gKiB2YXIgbm90aWZBID0gbmV3IFJ4Lk5vdGlmaWNhdGlvbignTicsICdBJyk7XG4gKiB2YXIgbm90aWZCID0gbmV3IFJ4Lk5vdGlmaWNhdGlvbignTicsICdCJyk7XG4gKiB2YXIgbm90aWZFID0gbmV3IFJ4Lk5vdGlmaWNhdGlvbignRScsIHZvaWQgMCxcbiAqICAgbmV3IFR5cGVFcnJvcigneC50b1VwcGVyQ2FzZSBpcyBub3QgYSBmdW5jdGlvbicpXG4gKiApO1xuICogdmFyIG1hdGVyaWFsaXplZCA9IFJ4Lk9ic2VydmFibGUub2Yobm90aWZBLCBub3RpZkIsIG5vdGlmRSk7XG4gKiB2YXIgdXBwZXJDYXNlID0gbWF0ZXJpYWxpemVkLmRlbWF0ZXJpYWxpemUoKTtcbiAqIHVwcGVyQ2FzZS5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSwgZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAqXG4gKiAvLyBSZXN1bHRzIGluOlxuICogLy8gQVxuICogLy8gQlxuICogLy8gVHlwZUVycm9yOiB4LnRvVXBwZXJDYXNlIGlzIG5vdCBhIGZ1bmN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgTm90aWZpY2F0aW9ufVxuICogQHNlZSB7QGxpbmsgbWF0ZXJpYWxpemV9XG4gKlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW1zIGFuZCBub3RpZmljYXRpb25zXG4gKiBlbWJlZGRlZCBpbiBOb3RpZmljYXRpb24gb2JqZWN0cyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2QgZGVtYXRlcmlhbGl6ZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZGVtYXRlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBEZU1hdGVyaWFsaXplT3BlcmF0b3IoKSk7XG59XG5leHBvcnRzLmRlbWF0ZXJpYWxpemUgPSBkZW1hdGVyaWFsaXplO1xudmFyIERlTWF0ZXJpYWxpemVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVNYXRlcmlhbGl6ZU9wZXJhdG9yKCkge1xuICAgIH1cbiAgICBEZU1hdGVyaWFsaXplT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZU1hdGVyaWFsaXplU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVNYXRlcmlhbGl6ZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRGVNYXRlcmlhbGl6ZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZU1hdGVyaWFsaXplU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZU1hdGVyaWFsaXplU3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgfVxuICAgIERlTWF0ZXJpYWxpemVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZS5vYnNlcnZlKHRoaXMuZGVzdGluYXRpb24pO1xuICAgIH07XG4gICAgcmV0dXJuIERlTWF0ZXJpYWxpemVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVtYXRlcmlhbGl6ZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9kZW1hdGVyaWFsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  993. /***/ },
  994. /* 485 */
  995. /***/ function(module, exports, __webpack_require__) {
  996. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar debounce_1 = __webpack_require__(486);\nObservable_1.Observable.prototype.debounce = debounce_1.debounce;\n//# sourceMappingURL=debounce.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZWJvdW5jZS5qcz9hZDczIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkZWJvdW5jZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGVib3VuY2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZWJvdW5jZSA9IGRlYm91bmNlXzEuZGVib3VuY2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJvdW5jZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGVib3VuY2UuanNcbi8vIG1vZHVsZSBpZCA9IDQ4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  997. /***/ },
  998. /* 486 */
  999. /***/ function(module, exports, __webpack_require__) {
  1000. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Emits a value from the source Observable only after a particular time span\n * determined by another Observable has passed without another source emission.\n *\n * <span class=\"informal\">It's like {@link debounceTime}, but the time span of\n * emission silence is determined by a second Observable.</span>\n *\n * <img src=\"./img/debounce.png\" width=\"100%\">\n *\n * `debounce` delays values emitted by the source Observable, but drops previous\n * pending delayed emissions if a new value arrives on the source Observable.\n * This operator keeps track of the most recent value from the source\n * Observable, and spawns a duration Observable by calling the\n * `durationSelector` function. The value is emitted only when the duration\n * Observable emits a value or completes, and if no other value was emitted on\n * the source Observable since the duration Observable was spawned. If a new\n * value appears before the duration Observable emits, the previous value will\n * be dropped and will not be emitted on the output Observable.\n *\n * Like {@link debounceTime}, this is a rate-limiting operator, and also a\n * delay-like operator since output emissions do not necessarily occur at the\n * same time as they did on the source Observable.\n *\n * @example <caption>Emit the most recent click after a burst of clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.debounce(() => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n * @see {@link throttle}\n *\n * @param {function(value: T): Observable|Promise} durationSelector A function\n * that receives a value from the source Observable, for computing the timeout\n * duration for each source value, returned as an Observable or a Promise.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified duration Observable returned by\n * `durationSelector`, and may drop some values if they occur too frequently.\n * @method debounce\n * @owner Observable\n */\nfunction debounce(durationSelector) {\n return this.lift(new DebounceOperator(durationSelector));\n}\nexports.debounce = debounce;\nvar DebounceOperator = (function () {\n function DebounceOperator(durationSelector) {\n this.durationSelector = durationSelector;\n }\n DebounceOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));\n };\n return DebounceOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DebounceSubscriber = (function (_super) {\n __extends(DebounceSubscriber, _super);\n function DebounceSubscriber(destination, durationSelector) {\n _super.call(this, destination);\n this.durationSelector = durationSelector;\n this.hasValue = false;\n this.durationSubscription = null;\n }\n DebounceSubscriber.prototype._next = function (value) {\n try {\n var result = this.durationSelector.call(this, value);\n if (result) {\n this._tryNext(value, result);\n }\n }\n catch (err) {\n this.destination.error(err);\n }\n };\n DebounceSubscriber.prototype._complete = function () {\n this.emitValue();\n this.destination.complete();\n };\n DebounceSubscriber.prototype._tryNext = function (value, duration) {\n var subscription = this.durationSubscription;\n this.value = value;\n this.hasValue = true;\n if (subscription) {\n subscription.unsubscribe();\n this.remove(subscription);\n }\n subscription = subscribeToResult_1.subscribeToResult(this, duration);\n if (!subscription.closed) {\n this.add(this.durationSubscription = subscription);\n }\n };\n DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.emitValue();\n };\n DebounceSubscriber.prototype.notifyComplete = function () {\n this.emitValue();\n };\n DebounceSubscriber.prototype.emitValue = function () {\n if (this.hasValue) {\n var value = this.value;\n var subscription = this.durationSubscription;\n if (subscription) {\n this.durationSubscription = null;\n subscription.unsubscribe();\n this.remove(subscription);\n }\n this.value = null;\n this.hasValue = false;\n _super.prototype._next.call(this, value);\n }\n };\n return DebounceSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=debounce.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlYm91bmNlLmpzP2E2ODEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKipcbiAqIEVtaXRzIGEgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgb25seSBhZnRlciBhIHBhcnRpY3VsYXIgdGltZSBzcGFuXG4gKiBkZXRlcm1pbmVkIGJ5IGFub3RoZXIgT2JzZXJ2YWJsZSBoYXMgcGFzc2VkIHdpdGhvdXQgYW5vdGhlciBzb3VyY2UgZW1pc3Npb24uXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgZGVib3VuY2VUaW1lfSwgYnV0IHRoZSB0aW1lIHNwYW4gb2ZcbiAqIGVtaXNzaW9uIHNpbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSBhIHNlY29uZCBPYnNlcnZhYmxlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2RlYm91bmNlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBkZWJvdW5jZWAgZGVsYXlzIHZhbHVlcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgYnV0IGRyb3BzIHByZXZpb3VzXG4gKiBwZW5kaW5nIGRlbGF5ZWQgZW1pc3Npb25zIGlmIGEgbmV3IHZhbHVlIGFycml2ZXMgb24gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogVGhpcyBvcGVyYXRvciBrZWVwcyB0cmFjayBvZiB0aGUgbW9zdCByZWNlbnQgdmFsdWUgZnJvbSB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlLCBhbmQgc3Bhd25zIGEgZHVyYXRpb24gT2JzZXJ2YWJsZSBieSBjYWxsaW5nIHRoZVxuICogYGR1cmF0aW9uU2VsZWN0b3JgIGZ1bmN0aW9uLiBUaGUgdmFsdWUgaXMgZW1pdHRlZCBvbmx5IHdoZW4gdGhlIGR1cmF0aW9uXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUgb3IgY29tcGxldGVzLCBhbmQgaWYgbm8gb3RoZXIgdmFsdWUgd2FzIGVtaXR0ZWQgb25cbiAqIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBzaW5jZSB0aGUgZHVyYXRpb24gT2JzZXJ2YWJsZSB3YXMgc3Bhd25lZC4gSWYgYSBuZXdcbiAqIHZhbHVlIGFwcGVhcnMgYmVmb3JlIHRoZSBkdXJhdGlvbiBPYnNlcnZhYmxlIGVtaXRzLCB0aGUgcHJldmlvdXMgdmFsdWUgd2lsbFxuICogYmUgZHJvcHBlZCBhbmQgd2lsbCBub3QgYmUgZW1pdHRlZCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogTGlrZSB7QGxpbmsgZGVib3VuY2VUaW1lfSwgdGhpcyBpcyBhIHJhdGUtbGltaXRpbmcgb3BlcmF0b3IsIGFuZCBhbHNvIGFcbiAqIGRlbGF5LWxpa2Ugb3BlcmF0b3Igc2luY2Ugb3V0cHV0IGVtaXNzaW9ucyBkbyBub3QgbmVjZXNzYXJpbHkgb2NjdXIgYXQgdGhlXG4gKiBzYW1lIHRpbWUgYXMgdGhleSBkaWQgb24gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgdGhlIG1vc3QgcmVjZW50IGNsaWNrIGFmdGVyIGEgYnVyc3Qgb2YgY2xpY2tzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciByZXN1bHQgPSBjbGlja3MuZGVib3VuY2UoKCkgPT4gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKSk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGF1ZGl0fVxuICogQHNlZSB7QGxpbmsgZGVib3VuY2VUaW1lfVxuICogQHNlZSB7QGxpbmsgZGVsYXlXaGVufVxuICogQHNlZSB7QGxpbmsgdGhyb3R0bGV9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCk6IE9ic2VydmFibGV8UHJvbWlzZX0gZHVyYXRpb25TZWxlY3RvciBBIGZ1bmN0aW9uXG4gKiB0aGF0IHJlY2VpdmVzIGEgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUsIGZvciBjb21wdXRpbmcgdGhlIHRpbWVvdXRcbiAqIGR1cmF0aW9uIGZvciBlYWNoIHNvdXJjZSB2YWx1ZSwgcmV0dXJuZWQgYXMgYW4gT2JzZXJ2YWJsZSBvciBhIFByb21pc2UuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZGVsYXlzIHRoZSBlbWlzc2lvbnMgb2YgdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZSBieSB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uIE9ic2VydmFibGUgcmV0dXJuZWQgYnlcbiAqIGBkdXJhdGlvblNlbGVjdG9yYCwgYW5kIG1heSBkcm9wIHNvbWUgdmFsdWVzIGlmIHRoZXkgb2NjdXIgdG9vIGZyZXF1ZW50bHkuXG4gKiBAbWV0aG9kIGRlYm91bmNlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZShkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgRGVib3VuY2VPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7XG59XG5leHBvcnRzLmRlYm91bmNlID0gZGVib3VuY2U7XG52YXIgRGVib3VuY2VPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVib3VuY2VPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7XG4gICAgfVxuICAgIERlYm91bmNlT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWJvdW5jZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVib3VuY2VPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIERlYm91bmNlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlYm91bmNlU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWJvdW5jZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cbiAgICBEZWJvdW5jZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5kdXJhdGlvblNlbGVjdG9yLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyeU5leHQodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWJvdW5jZVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgRGVib3VuY2VTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5TmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSwgZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGR1cmF0aW9uKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVib3VuY2VTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfTtcbiAgICBEZWJvdW5jZVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgIH07XG4gICAgRGVib3VuY2VTdWJzY3JpYmVyLnByb3RvdHlwZS5lbWl0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb247XG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kdXJhdGlvblN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fbmV4dC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERlYm91bmNlU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJvdW5jZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9kZWJvdW5jZS5qc1xuLy8gbW9kdWxlIGlkID0gNDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1001. /***/ },
  1002. /* 487 */
  1003. /***/ function(module, exports, __webpack_require__) {
  1004. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar debounceTime_1 = __webpack_require__(488);\nObservable_1.Observable.prototype.debounceTime = debounceTime_1.debounceTime;\n//# sourceMappingURL=debounceTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZWJvdW5jZVRpbWUuanM/OWQ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZGVib3VuY2VUaW1lXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9kZWJvdW5jZVRpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZWJvdW5jZVRpbWUgPSBkZWJvdW5jZVRpbWVfMS5kZWJvdW5jZVRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJvdW5jZVRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2RlYm91bmNlVGltZS5qc1xuLy8gbW9kdWxlIGlkID0gNDg3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1005. /***/ },
  1006. /* 488 */
  1007. /***/ function(module, exports, __webpack_require__) {
  1008. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar async_1 = __webpack_require__(414);\n/**\n * Emits a value from the source Observable only after a particular time span\n * has passed without another source emission.\n *\n * <span class=\"informal\">It's like {@link delay}, but passes only the most\n * recent value from each burst of emissions.</span>\n *\n * <img src=\"./img/debounceTime.png\" width=\"100%\">\n *\n * `debounceTime` delays values emitted by the source Observable, but drops\n * previous pending delayed emissions if a new value arrives on the source\n * Observable. This operator keeps track of the most recent value from the\n * source Observable, and emits that only when `dueTime` enough time has passed\n * without any other value appearing on the source Observable. If a new value\n * appears before `dueTime` silence occurs, the previous value will be dropped\n * and will not be emitted on the output Observable.\n *\n * This is a rate-limiting operator, because it is impossible for more than one\n * value to be emitted in any time window of duration `dueTime`, but it is also\n * a delay-like operator since output emissions do not occur at the same time as\n * they did on the source Observable. Optionally takes a {@link Scheduler} for\n * managing timers.\n *\n * @example <caption>Emit the most recent click after a burst of clicks</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.debounceTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounce}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttleTime}\n *\n * @param {number} dueTime The timeout duration in milliseconds (or the time\n * unit determined internally by the optional `scheduler`) for the window of\n * time required to wait for emission silence before emitting the most recent\n * source value.\n * @param {Scheduler} [scheduler=async] The {@link Scheduler} to use for\n * managing the timers that handle the timeout for each value.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified `dueTime`, and may drop some values if they occur\n * too frequently.\n * @method debounceTime\n * @owner Observable\n */\nfunction debounceTime(dueTime, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new DebounceTimeOperator(dueTime, scheduler));\n}\nexports.debounceTime = debounceTime;\nvar DebounceTimeOperator = (function () {\n function DebounceTimeOperator(dueTime, scheduler) {\n this.dueTime = dueTime;\n this.scheduler = scheduler;\n }\n DebounceTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));\n };\n return DebounceTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DebounceTimeSubscriber = (function (_super) {\n __extends(DebounceTimeSubscriber, _super);\n function DebounceTimeSubscriber(destination, dueTime, scheduler) {\n _super.call(this, destination);\n this.dueTime = dueTime;\n this.scheduler = scheduler;\n this.debouncedSubscription = null;\n this.lastValue = null;\n this.hasValue = false;\n }\n DebounceTimeSubscriber.prototype._next = function (value) {\n this.clearDebounce();\n this.lastValue = value;\n this.hasValue = true;\n this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));\n };\n DebounceTimeSubscriber.prototype._complete = function () {\n this.debouncedNext();\n this.destination.complete();\n };\n DebounceTimeSubscriber.prototype.debouncedNext = function () {\n this.clearDebounce();\n if (this.hasValue) {\n this.destination.next(this.lastValue);\n this.lastValue = null;\n this.hasValue = false;\n }\n };\n DebounceTimeSubscriber.prototype.clearDebounce = function () {\n var debouncedSubscription = this.debouncedSubscription;\n if (debouncedSubscription !== null) {\n this.remove(debouncedSubscription);\n debouncedSubscription.unsubscribe();\n this.debouncedSubscription = null;\n }\n };\n return DebounceTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(subscriber) {\n subscriber.debouncedNext();\n}\n//# sourceMappingURL=debounceTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlYm91bmNlVGltZS5qcz81MDBjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbi8qKlxuICogRW1pdHMgYSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBvbmx5IGFmdGVyIGEgcGFydGljdWxhciB0aW1lIHNwYW5cbiAqIGhhcyBwYXNzZWQgd2l0aG91dCBhbm90aGVyIHNvdXJjZSBlbWlzc2lvbi5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBkZWxheX0sIGJ1dCBwYXNzZXMgb25seSB0aGUgbW9zdFxuICogcmVjZW50IHZhbHVlIGZyb20gZWFjaCBidXJzdCBvZiBlbWlzc2lvbnMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZGVib3VuY2VUaW1lLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBkZWJvdW5jZVRpbWVgIGRlbGF5cyB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUsIGJ1dCBkcm9wc1xuICogcHJldmlvdXMgcGVuZGluZyBkZWxheWVkIGVtaXNzaW9ucyBpZiBhIG5ldyB2YWx1ZSBhcnJpdmVzIG9uIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIFRoaXMgb3BlcmF0b3Iga2VlcHMgdHJhY2sgb2YgdGhlIG1vc3QgcmVjZW50IHZhbHVlIGZyb20gdGhlXG4gKiBzb3VyY2UgT2JzZXJ2YWJsZSwgYW5kIGVtaXRzIHRoYXQgb25seSB3aGVuIGBkdWVUaW1lYCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkXG4gKiB3aXRob3V0IGFueSBvdGhlciB2YWx1ZSBhcHBlYXJpbmcgb24gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLiBJZiBhIG5ldyB2YWx1ZVxuICogYXBwZWFycyBiZWZvcmUgYGR1ZVRpbWVgIHNpbGVuY2Ugb2NjdXJzLCB0aGUgcHJldmlvdXMgdmFsdWUgd2lsbCBiZSBkcm9wcGVkXG4gKiBhbmQgd2lsbCBub3QgYmUgZW1pdHRlZCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogVGhpcyBpcyBhIHJhdGUtbGltaXRpbmcgb3BlcmF0b3IsIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSBmb3IgbW9yZSB0aGFuIG9uZVxuICogdmFsdWUgdG8gYmUgZW1pdHRlZCBpbiBhbnkgdGltZSB3aW5kb3cgb2YgZHVyYXRpb24gYGR1ZVRpbWVgLCBidXQgaXQgaXMgYWxzb1xuICogYSBkZWxheS1saWtlIG9wZXJhdG9yIHNpbmNlIG91dHB1dCBlbWlzc2lvbnMgZG8gbm90IG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUgYXNcbiAqIHRoZXkgZGlkIG9uIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gT3B0aW9uYWxseSB0YWtlcyBhIHtAbGluayBTY2hlZHVsZXJ9IGZvclxuICogbWFuYWdpbmcgdGltZXJzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgdGhlIG1vc3QgcmVjZW50IGNsaWNrIGFmdGVyIGEgYnVyc3Qgb2YgY2xpY2tzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciByZXN1bHQgPSBjbGlja3MuZGVib3VuY2VUaW1lKDEwMDApO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBhdWRpdFRpbWV9XG4gKiBAc2VlIHtAbGluayBkZWJvdW5jZX1cbiAqIEBzZWUge0BsaW5rIGRlbGF5fVxuICogQHNlZSB7QGxpbmsgc2FtcGxlVGltZX1cbiAqIEBzZWUge0BsaW5rIHRocm90dGxlVGltZX1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZHVlVGltZSBUaGUgdGltZW91dCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKG9yIHRoZSB0aW1lXG4gKiB1bml0IGRldGVybWluZWQgaW50ZXJuYWxseSBieSB0aGUgb3B0aW9uYWwgYHNjaGVkdWxlcmApIGZvciB0aGUgd2luZG93IG9mXG4gKiB0aW1lIHJlcXVpcmVkIHRvIHdhaXQgZm9yIGVtaXNzaW9uIHNpbGVuY2UgYmVmb3JlIGVtaXR0aW5nIHRoZSBtb3N0IHJlY2VudFxuICogc291cmNlIHZhbHVlLlxuICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXI9YXN5bmNdIFRoZSB7QGxpbmsgU2NoZWR1bGVyfSB0byB1c2UgZm9yXG4gKiBtYW5hZ2luZyB0aGUgdGltZXJzIHRoYXQgaGFuZGxlIHRoZSB0aW1lb3V0IGZvciBlYWNoIHZhbHVlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGRlbGF5cyB0aGUgZW1pc3Npb25zIG9mIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgYnkgdGhlIHNwZWNpZmllZCBgZHVlVGltZWAsIGFuZCBtYXkgZHJvcCBzb21lIHZhbHVlcyBpZiB0aGV5IG9jY3VyXG4gKiB0b28gZnJlcXVlbnRseS5cbiAqIEBtZXRob2QgZGVib3VuY2VUaW1lXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyKSB7XG4gICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7IHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7IH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBEZWJvdW5jZVRpbWVPcGVyYXRvcihkdWVUaW1lLCBzY2hlZHVsZXIpKTtcbn1cbmV4cG9ydHMuZGVib3VuY2VUaW1lID0gZGVib3VuY2VUaW1lO1xudmFyIERlYm91bmNlVGltZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWJvdW5jZVRpbWVPcGVyYXRvcihkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIERlYm91bmNlVGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVib3VuY2VUaW1lU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmR1ZVRpbWUsIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVib3VuY2VUaW1lT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBEZWJvdW5jZVRpbWVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRGVib3VuY2VUaW1lU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWJvdW5jZVRpbWVTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmR1ZVRpbWUgPSBkdWVUaW1lO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gICAgRGVib3VuY2VUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCk7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkZCh0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCwgdGhpcy5kdWVUaW1lLCB0aGlzKSk7XG4gICAgfTtcbiAgICBEZWJvdW5jZVRpbWVTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGVib3VuY2VkTmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBEZWJvdW5jZVRpbWVTdWJzY3JpYmVyLnByb3RvdHlwZS5kZWJvdW5jZWROZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNsZWFyRGVib3VuY2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmxhc3RWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlYm91bmNlVGltZVN1YnNjcmliZXIucHJvdG90eXBlLmNsZWFyRGVib3VuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZWJvdW5jZWRTdWJzY3JpcHRpb24gPSB0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGRlYm91bmNlZFN1YnNjcmlwdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoZGVib3VuY2VkU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGRlYm91bmNlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGVib3VuY2VUaW1lU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmZ1bmN0aW9uIGRpc3BhdGNoTmV4dChzdWJzY3JpYmVyKSB7XG4gICAgc3Vic2NyaWJlci5kZWJvdW5jZWROZXh0KCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJvdW5jZVRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvZGVib3VuY2VUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA0ODhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1009. /***/ },
  1010. /* 489 */
  1011. /***/ function(module, exports, __webpack_require__) {
  1012. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar defaultIfEmpty_1 = __webpack_require__(490);\nObservable_1.Observable.prototype.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;\n//# sourceMappingURL=defaultIfEmpty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZWZhdWx0SWZFbXB0eS5qcz9kZjI0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkZWZhdWx0SWZFbXB0eV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGVmYXVsdElmRW1wdHknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZWZhdWx0SWZFbXB0eSA9IGRlZmF1bHRJZkVtcHR5XzEuZGVmYXVsdElmRW1wdHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0SWZFbXB0eS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGVmYXVsdElmRW1wdHkuanNcbi8vIG1vZHVsZSBpZCA9IDQ4OVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1013. /***/ },
  1014. /* 490 */
  1015. /***/ function(module, exports, __webpack_require__) {
  1016. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Emits a given value if the source Observable completes without emitting any\n * `next` value, otherwise mirrors the source Observable.\n *\n * <span class=\"informal\">If the source Observable turns out to be empty, then\n * this operator will emit a default value.</span>\n *\n * <img src=\"./img/defaultIfEmpty.png\" width=\"100%\">\n *\n * `defaultIfEmpty` emits the values emitted by the source Observable or a\n * specified default value if the source Observable is empty (completes without\n * having emitted any `next` value).\n *\n * @example <caption>If no clicks happen in 5 seconds, then emit \"no clicks\"</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksBeforeFive = clicks.takeUntil(Rx.Observable.interval(5000));\n * var result = clicksBeforeFive.defaultIfEmpty('no clicks');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link empty}\n * @see {@link last}\n *\n * @param {any} [defaultValue=null] The default value used if the source\n * Observable is empty.\n * @return {Observable} An Observable that emits either the specified\n * `defaultValue` if the source Observable emits no items, or the values emitted\n * by the source Observable.\n * @method defaultIfEmpty\n * @owner Observable\n */\nfunction defaultIfEmpty(defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n return this.lift(new DefaultIfEmptyOperator(defaultValue));\n}\nexports.defaultIfEmpty = defaultIfEmpty;\nvar DefaultIfEmptyOperator = (function () {\n function DefaultIfEmptyOperator(defaultValue) {\n this.defaultValue = defaultValue;\n }\n DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));\n };\n return DefaultIfEmptyOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DefaultIfEmptySubscriber = (function (_super) {\n __extends(DefaultIfEmptySubscriber, _super);\n function DefaultIfEmptySubscriber(destination, defaultValue) {\n _super.call(this, destination);\n this.defaultValue = defaultValue;\n this.isEmpty = true;\n }\n DefaultIfEmptySubscriber.prototype._next = function (value) {\n this.isEmpty = false;\n this.destination.next(value);\n };\n DefaultIfEmptySubscriber.prototype._complete = function () {\n if (this.isEmpty) {\n this.destination.next(this.defaultValue);\n }\n this.destination.complete();\n };\n return DefaultIfEmptySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=defaultIfEmpty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlZmF1bHRJZkVtcHR5LmpzPzY4MDgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogRW1pdHMgYSBnaXZlbiB2YWx1ZSBpZiB0aGUgc291cmNlIE9ic2VydmFibGUgY29tcGxldGVzIHdpdGhvdXQgZW1pdHRpbmcgYW55XG4gKiBgbmV4dGAgdmFsdWUsIG90aGVyd2lzZSBtaXJyb3JzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SWYgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHR1cm5zIG91dCB0byBiZSBlbXB0eSwgdGhlblxuICogdGhpcyBvcGVyYXRvciB3aWxsIGVtaXQgYSBkZWZhdWx0IHZhbHVlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2RlZmF1bHRJZkVtcHR5LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBkZWZhdWx0SWZFbXB0eWAgZW1pdHMgdGhlIHZhbHVlcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBvciBhXG4gKiBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgc291cmNlIE9ic2VydmFibGUgaXMgZW1wdHkgKGNvbXBsZXRlcyB3aXRob3V0XG4gKiBoYXZpbmcgZW1pdHRlZCBhbnkgYG5leHRgIHZhbHVlKS5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5JZiBubyBjbGlja3MgaGFwcGVuIGluIDUgc2Vjb25kcywgdGhlbiBlbWl0IFwibm8gY2xpY2tzXCI8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIGNsaWNrc0JlZm9yZUZpdmUgPSBjbGlja3MudGFrZVVudGlsKFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoNTAwMCkpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrc0JlZm9yZUZpdmUuZGVmYXVsdElmRW1wdHkoJ25vIGNsaWNrcycpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBlbXB0eX1cbiAqIEBzZWUge0BsaW5rIGxhc3R9XG4gKlxuICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWU9bnVsbF0gVGhlIGRlZmF1bHQgdmFsdWUgdXNlZCBpZiB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlIGlzIGVtcHR5LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGVpdGhlciB0aGUgc3BlY2lmaWVkXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiB0aGUgc291cmNlIE9ic2VydmFibGUgZW1pdHMgbm8gaXRlbXMsIG9yIHRoZSB2YWx1ZXMgZW1pdHRlZFxuICogYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBkZWZhdWx0SWZFbXB0eVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdm9pZCAwKSB7IGRlZmF1bHRWYWx1ZSA9IG51bGw7IH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBEZWZhdWx0SWZFbXB0eU9wZXJhdG9yKGRlZmF1bHRWYWx1ZSkpO1xufVxuZXhwb3J0cy5kZWZhdWx0SWZFbXB0eSA9IGRlZmF1bHRJZkVtcHR5O1xudmFyIERlZmF1bHRJZkVtcHR5T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHRJZkVtcHR5T3BlcmF0b3IoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBEZWZhdWx0SWZFbXB0eU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVmYXVsdElmRW1wdHlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmYXVsdElmRW1wdHlPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIERlZmF1bHRJZkVtcHR5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlZmF1bHRJZkVtcHR5U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLmlzRW1wdHkgPSB0cnVlO1xuICAgIH1cbiAgICBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgIH07XG4gICAgRGVmYXVsdElmRW1wdHlTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmF1bHRJZkVtcHR5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHRJZkVtcHR5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2RlZmF1bHRJZkVtcHR5LmpzXG4vLyBtb2R1bGUgaWQgPSA0OTBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1017. /***/ },
  1018. /* 491 */
  1019. /***/ function(module, exports, __webpack_require__) {
  1020. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar delay_1 = __webpack_require__(492);\nObservable_1.Observable.prototype.delay = delay_1.delay;\n//# sourceMappingURL=delay.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZWxheS5qcz9kZDgxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkZWxheV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGVsYXknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZWxheSA9IGRlbGF5XzEuZGVsYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxheS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGVsYXkuanNcbi8vIG1vZHVsZSBpZCA9IDQ5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1021. /***/ },
  1022. /* 492 */
  1023. /***/ function(module, exports, __webpack_require__) {
  1024. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = __webpack_require__(414);\nvar isDate_1 = __webpack_require__(446);\nvar Subscriber_1 = __webpack_require__(9);\nvar Notification_1 = __webpack_require__(45);\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * <span class=\"informal\">Time shifts each item by some specified amount of\n * milliseconds.</span>\n *\n * <img src=\"./img/delay.png\" width=\"100%\">\n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example <caption>Delay each click by one second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example <caption>Delay all clicks until a future date happens</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The Scheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nfunction delay(delay, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n var absoluteDelay = isDate_1.isDate(delay);\n var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n return this.lift(new DelayOperator(delayFor, scheduler));\n}\nexports.delay = delay;\nvar DelayOperator = (function () {\n function DelayOperator(delay, scheduler) {\n this.delay = delay;\n this.scheduler = scheduler;\n }\n DelayOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n };\n return DelayOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DelaySubscriber = (function (_super) {\n __extends(DelaySubscriber, _super);\n function DelaySubscriber(destination, delay, scheduler) {\n _super.call(this, destination);\n this.delay = delay;\n this.scheduler = scheduler;\n this.queue = [];\n this.active = false;\n this.errored = false;\n }\n DelaySubscriber.dispatch = function (state) {\n var source = state.source;\n var queue = source.queue;\n var scheduler = state.scheduler;\n var destination = state.destination;\n while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n queue.shift().notification.observe(destination);\n }\n if (queue.length > 0) {\n var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n this.schedule(state, delay_1);\n }\n else {\n source.active = false;\n }\n };\n DelaySubscriber.prototype._schedule = function (scheduler) {\n this.active = true;\n this.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n source: this, destination: this.destination, scheduler: scheduler\n }));\n };\n DelaySubscriber.prototype.scheduleNotification = function (notification) {\n if (this.errored === true) {\n return;\n }\n var scheduler = this.scheduler;\n var message = new DelayMessage(scheduler.now() + this.delay, notification);\n this.queue.push(message);\n if (this.active === false) {\n this._schedule(scheduler);\n }\n };\n DelaySubscriber.prototype._next = function (value) {\n this.scheduleNotification(Notification_1.Notification.createNext(value));\n };\n DelaySubscriber.prototype._error = function (err) {\n this.errored = true;\n this.queue = [];\n this.destination.error(err);\n };\n DelaySubscriber.prototype._complete = function () {\n this.scheduleNotification(Notification_1.Notification.createComplete());\n };\n return DelaySubscriber;\n}(Subscriber_1.Subscriber));\nvar DelayMessage = (function () {\n function DelayMessage(time, notification) {\n this.time = time;\n this.notification = notification;\n }\n return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlbGF5LmpzP2Y2OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBhc3luY18xID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL2FzeW5jJyk7XG52YXIgaXNEYXRlXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzRGF0ZScpO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBOb3RpZmljYXRpb25fMSA9IHJlcXVpcmUoJy4uL05vdGlmaWNhdGlvbicpO1xuLyoqXG4gKiBEZWxheXMgdGhlIGVtaXNzaW9uIG9mIGl0ZW1zIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGJ5IGEgZ2l2ZW4gdGltZW91dCBvclxuICogdW50aWwgYSBnaXZlbiBEYXRlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5UaW1lIHNoaWZ0cyBlYWNoIGl0ZW0gYnkgc29tZSBzcGVjaWZpZWQgYW1vdW50IG9mXG4gKiBtaWxsaXNlY29uZHMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZGVsYXkucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogSWYgdGhlIGRlbGF5IGFyZ3VtZW50IGlzIGEgTnVtYmVyLCB0aGlzIG9wZXJhdG9yIHRpbWUgc2hpZnRzIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgYnkgdGhhdCBhbW91bnQgb2YgdGltZSBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLiBUaGUgcmVsYXRpdmVcbiAqIHRpbWUgaW50ZXJ2YWxzIGJldHdlZW4gdGhlIHZhbHVlcyBhcmUgcHJlc2VydmVkLlxuICpcbiAqIElmIHRoZSBkZWxheSBhcmd1bWVudCBpcyBhIERhdGUsIHRoaXMgb3BlcmF0b3IgdGltZSBzaGlmdHMgdGhlIHN0YXJ0IG9mIHRoZVxuICogT2JzZXJ2YWJsZSBleGVjdXRpb24gdW50aWwgdGhlIGdpdmVuIGRhdGUgb2NjdXJzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkRlbGF5IGVhY2ggY2xpY2sgYnkgb25lIHNlY29uZDwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgZGVsYXllZENsaWNrcyA9IGNsaWNrcy5kZWxheSgxMDAwKTsgLy8gZWFjaCBjbGljayBlbWl0dGVkIGFmdGVyIDEgc2Vjb25kXG4gKiBkZWxheWVkQ2xpY2tzLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5EZWxheSBhbGwgY2xpY2tzIHVudGlsIGEgZnV0dXJlIGRhdGUgaGFwcGVuczwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgZGF0ZSA9IG5ldyBEYXRlKCdNYXJjaCAxNSwgMjA1MCAxMjowMDowMCcpOyAvLyBpbiB0aGUgZnV0dXJlXG4gKiB2YXIgZGVsYXllZENsaWNrcyA9IGNsaWNrcy5kZWxheShkYXRlKTsgLy8gY2xpY2sgZW1pdHRlZCBvbmx5IGFmdGVyIHRoYXQgZGF0ZVxuICogZGVsYXllZENsaWNrcy5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgZGVib3VuY2VUaW1lfVxuICogQHNlZSB7QGxpbmsgZGVsYXlXaGVufVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfERhdGV9IGRlbGF5IFRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKGEgYG51bWJlcmApIG9yXG4gKiBhIGBEYXRlYCB1bnRpbCB3aGljaCB0aGUgZW1pc3Npb24gb2YgdGhlIHNvdXJjZSBpdGVtcyBpcyBkZWxheWVkLlxuICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXI9YXN5bmNdIFRoZSBTY2hlZHVsZXIgdG8gdXNlIGZvclxuICogbWFuYWdpbmcgdGhlIHRpbWVycyB0aGF0IGhhbmRsZSB0aGUgdGltZS1zaGlmdCBmb3IgZWFjaCBpdGVtLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGRlbGF5cyB0aGUgZW1pc3Npb25zIG9mIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgYnkgdGhlIHNwZWNpZmllZCB0aW1lb3V0IG9yIERhdGUuXG4gKiBAbWV0aG9kIGRlbGF5XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBkZWxheShkZWxheSwgc2NoZWR1bGVyKSB7XG4gICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7IHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7IH1cbiAgICB2YXIgYWJzb2x1dGVEZWxheSA9IGlzRGF0ZV8xLmlzRGF0ZShkZWxheSk7XG4gICAgdmFyIGRlbGF5Rm9yID0gYWJzb2x1dGVEZWxheSA/ICgrZGVsYXkgLSBzY2hlZHVsZXIubm93KCkpIDogTWF0aC5hYnMoZGVsYXkpO1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IERlbGF5T3BlcmF0b3IoZGVsYXlGb3IsIHNjaGVkdWxlcikpO1xufVxuZXhwb3J0cy5kZWxheSA9IGRlbGF5O1xudmFyIERlbGF5T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlbGF5T3BlcmF0b3IoZGVsYXksIHNjaGVkdWxlcikge1xuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICBEZWxheU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVsYXlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuZGVsYXksIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVsYXlPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIERlbGF5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlbGF5U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWxheVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGRlbGF5LCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3JlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBEZWxheVN1YnNjcmliZXIuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHN0YXRlLnNvdXJjZTtcbiAgICAgICAgdmFyIHF1ZXVlID0gc291cmNlLnF1ZXVlO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gc3RhdGUuc2NoZWR1bGVyO1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjtcbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDAgJiYgKHF1ZXVlWzBdLnRpbWUgLSBzY2hlZHVsZXIubm93KCkpIDw9IDApIHtcbiAgICAgICAgICAgIHF1ZXVlLnNoaWZ0KCkubm90aWZpY2F0aW9uLm9ic2VydmUoZGVzdGluYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZGVsYXlfMSA9IE1hdGgubWF4KDAsIHF1ZXVlWzBdLnRpbWUgLSBzY2hlZHVsZXIubm93KCkpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgZGVsYXlfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlbGF5U3Vic2NyaWJlci5wcm90b3R5cGUuX3NjaGVkdWxlID0gZnVuY3Rpb24gKHNjaGVkdWxlcikge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShEZWxheVN1YnNjcmliZXIuZGlzcGF0Y2gsIHRoaXMuZGVsYXksIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcywgZGVzdGluYXRpb246IHRoaXMuZGVzdGluYXRpb24sIHNjaGVkdWxlcjogc2NoZWR1bGVyXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIERlbGF5U3Vic2NyaWJlci5wcm90b3R5cGUuc2NoZWR1bGVOb3RpZmljYXRpb24gPSBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIHZhciBtZXNzYWdlID0gbmV3IERlbGF5TWVzc2FnZShzY2hlZHVsZXIubm93KCkgKyB0aGlzLmRlbGF5LCBub3RpZmljYXRpb24pO1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlKHNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlbGF5U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpO1xuICAgIH07XG4gICAgRGVsYXlTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuZXJyb3JlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgIH07XG4gICAgRGVsYXlTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZUNvbXBsZXRlKCkpO1xuICAgIH07XG4gICAgcmV0dXJuIERlbGF5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbnZhciBEZWxheU1lc3NhZ2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlbGF5TWVzc2FnZSh0aW1lLCBub3RpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy50aW1lID0gdGltZTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247XG4gICAgfVxuICAgIHJldHVybiBEZWxheU1lc3NhZ2U7XG59KCkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVsYXkuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvZGVsYXkuanNcbi8vIG1vZHVsZSBpZCA9IDQ5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1025. /***/ },
  1026. /* 493 */
  1027. /***/ function(module, exports, __webpack_require__) {
  1028. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar delayWhen_1 = __webpack_require__(494);\nObservable_1.Observable.prototype.delayWhen = delayWhen_1.delayWhen;\n//# sourceMappingURL=delayWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kZWxheVdoZW4uanM/N2ZiMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZGVsYXlXaGVuXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9kZWxheVdoZW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kZWxheVdoZW4gPSBkZWxheVdoZW5fMS5kZWxheVdoZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxheVdoZW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2RlbGF5V2hlbi5qc1xuLy8gbW9kdWxlIGlkID0gNDkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1029. /***/ },
  1030. /* 494 */
  1031. /***/ function(module, exports, __webpack_require__) {
  1032. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Observable_1 = __webpack_require__(6);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Delays the emission of items from the source Observable by a given time span\n * determined by the emissions of another Observable.\n *\n * <span class=\"informal\">It's like {@link delay}, but the time span of the\n * delay duration is determined by a second Observable.</span>\n *\n * <img src=\"./img/delayWhen.png\" width=\"100%\">\n *\n * `delayWhen` time shifts each emitted value from the source Observable by a\n * time span determined by another Observable. When the source emits a value,\n * the `delayDurationSelector` function is called with the source value as\n * argument, and should return an Observable, called the \"duration\" Observable.\n * The source value is emitted on the output Observable only when the duration\n * Observable emits a value or completes.\n *\n * Optionally, `delayWhen` takes a second argument, `subscriptionDelay`, which\n * is an Observable. When `subscriptionDelay` emits its first value or\n * completes, the source Observable is subscribed to and starts behaving like\n * described in the previous paragraph. If `subscriptionDelay` is not provided,\n * `delayWhen` will subscribe to the source Observable as soon as the output\n * Observable is subscribed.\n *\n * @example <caption>Delay each click by a random amount of time, between 0 and 5 seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delayWhen(event =>\n * Rx.Observable.interval(Math.random() * 5000)\n * );\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounce}\n * @see {@link delay}\n *\n * @param {function(value: T): Observable} delayDurationSelector A function that\n * returns an Observable for each value emitted by the source Observable, which\n * is then used to delay the emission of that item on the output Observable\n * until the Observable returned from this function emits a value.\n * @param {Observable} subscriptionDelay An Observable that triggers the\n * subscription to the source Observable once it emits any value.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by an amount of time specified by the Observable returned by\n * `delayDurationSelector`.\n * @method delayWhen\n * @owner Observable\n */\nfunction delayWhen(delayDurationSelector, subscriptionDelay) {\n if (subscriptionDelay) {\n return new SubscriptionDelayObservable(this, subscriptionDelay)\n .lift(new DelayWhenOperator(delayDurationSelector));\n }\n return this.lift(new DelayWhenOperator(delayDurationSelector));\n}\nexports.delayWhen = delayWhen;\nvar DelayWhenOperator = (function () {\n function DelayWhenOperator(delayDurationSelector) {\n this.delayDurationSelector = delayDurationSelector;\n }\n DelayWhenOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));\n };\n return DelayWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DelayWhenSubscriber = (function (_super) {\n __extends(DelayWhenSubscriber, _super);\n function DelayWhenSubscriber(destination, delayDurationSelector) {\n _super.call(this, destination);\n this.delayDurationSelector = delayDurationSelector;\n this.completed = false;\n this.delayNotifierSubscriptions = [];\n this.values = [];\n }\n DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.destination.next(outerValue);\n this.removeSubscription(innerSub);\n this.tryComplete();\n };\n DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {\n this._error(error);\n };\n DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {\n var value = this.removeSubscription(innerSub);\n if (value) {\n this.destination.next(value);\n }\n this.tryComplete();\n };\n DelayWhenSubscriber.prototype._next = function (value) {\n try {\n var delayNotifier = this.delayDurationSelector(value);\n if (delayNotifier) {\n this.tryDelay(delayNotifier, value);\n }\n }\n catch (err) {\n this.destination.error(err);\n }\n };\n DelayWhenSubscriber.prototype._complete = function () {\n this.completed = true;\n this.tryComplete();\n };\n DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {\n subscription.unsubscribe();\n var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);\n var value = null;\n if (subscriptionIdx !== -1) {\n value = this.values[subscriptionIdx];\n this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);\n this.values.splice(subscriptionIdx, 1);\n }\n return value;\n };\n DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {\n var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);\n this.add(notifierSubscription);\n this.delayNotifierSubscriptions.push(notifierSubscription);\n this.values.push(value);\n };\n DelayWhenSubscriber.prototype.tryComplete = function () {\n if (this.completed && this.delayNotifierSubscriptions.length === 0) {\n this.destination.complete();\n }\n };\n return DelayWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SubscriptionDelayObservable = (function (_super) {\n __extends(SubscriptionDelayObservable, _super);\n function SubscriptionDelayObservable(source, subscriptionDelay) {\n _super.call(this);\n this.source = source;\n this.subscriptionDelay = subscriptionDelay;\n }\n SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {\n this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));\n };\n return SubscriptionDelayObservable;\n}(Observable_1.Observable));\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SubscriptionDelaySubscriber = (function (_super) {\n __extends(SubscriptionDelaySubscriber, _super);\n function SubscriptionDelaySubscriber(parent, source) {\n _super.call(this);\n this.parent = parent;\n this.source = source;\n this.sourceSubscribed = false;\n }\n SubscriptionDelaySubscriber.prototype._next = function (unused) {\n this.subscribeToSource();\n };\n SubscriptionDelaySubscriber.prototype._error = function (err) {\n this.unsubscribe();\n this.parent.error(err);\n };\n SubscriptionDelaySubscriber.prototype._complete = function () {\n this.subscribeToSource();\n };\n SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {\n if (!this.sourceSubscribed) {\n this.sourceSubscribed = true;\n this.unsubscribe();\n this.source.subscribe(this.parent);\n }\n };\n return SubscriptionDelaySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=delayWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RlbGF5V2hlbi5qcz82NzUzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKipcbiAqIERlbGF5cyB0aGUgZW1pc3Npb24gb2YgaXRlbXMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgYnkgYSBnaXZlbiB0aW1lIHNwYW5cbiAqIGRldGVybWluZWQgYnkgdGhlIGVtaXNzaW9ucyBvZiBhbm90aGVyIE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgZGVsYXl9LCBidXQgdGhlIHRpbWUgc3BhbiBvZiB0aGVcbiAqIGRlbGF5IGR1cmF0aW9uIGlzIGRldGVybWluZWQgYnkgYSBzZWNvbmQgT2JzZXJ2YWJsZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9kZWxheVdoZW4ucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYGRlbGF5V2hlbmAgdGltZSBzaGlmdHMgZWFjaCBlbWl0dGVkIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGJ5IGFcbiAqIHRpbWUgc3BhbiBkZXRlcm1pbmVkIGJ5IGFub3RoZXIgT2JzZXJ2YWJsZS4gV2hlbiB0aGUgc291cmNlIGVtaXRzIGEgdmFsdWUsXG4gKiB0aGUgYGRlbGF5RHVyYXRpb25TZWxlY3RvcmAgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHNvdXJjZSB2YWx1ZSBhc1xuICogYXJndW1lbnQsIGFuZCBzaG91bGQgcmV0dXJuIGFuIE9ic2VydmFibGUsIGNhbGxlZCB0aGUgXCJkdXJhdGlvblwiIE9ic2VydmFibGUuXG4gKiBUaGUgc291cmNlIHZhbHVlIGlzIGVtaXR0ZWQgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIG9ubHkgd2hlbiB0aGUgZHVyYXRpb25cbiAqIE9ic2VydmFibGUgZW1pdHMgYSB2YWx1ZSBvciBjb21wbGV0ZXMuXG4gKlxuICogT3B0aW9uYWxseSwgYGRlbGF5V2hlbmAgdGFrZXMgYSBzZWNvbmQgYXJndW1lbnQsIGBzdWJzY3JpcHRpb25EZWxheWAsIHdoaWNoXG4gKiBpcyBhbiBPYnNlcnZhYmxlLiBXaGVuIGBzdWJzY3JpcHRpb25EZWxheWAgZW1pdHMgaXRzIGZpcnN0IHZhbHVlIG9yXG4gKiBjb21wbGV0ZXMsIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBpcyBzdWJzY3JpYmVkIHRvIGFuZCBzdGFydHMgYmVoYXZpbmcgbGlrZVxuICogZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguIElmIGBzdWJzY3JpcHRpb25EZWxheWAgaXMgbm90IHByb3ZpZGVkLFxuICogYGRlbGF5V2hlbmAgd2lsbCBzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFzIHNvb24gYXMgdGhlIG91dHB1dFxuICogT2JzZXJ2YWJsZSBpcyBzdWJzY3JpYmVkLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkRlbGF5IGVhY2ggY2xpY2sgYnkgYSByYW5kb20gYW1vdW50IG9mIHRpbWUsIGJldHdlZW4gMCBhbmQgNSBzZWNvbmRzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBkZWxheWVkQ2xpY2tzID0gY2xpY2tzLmRlbGF5V2hlbihldmVudCA9PlxuICogICBSeC5PYnNlcnZhYmxlLmludGVydmFsKE1hdGgucmFuZG9tKCkgKiA1MDAwKVxuICogKTtcbiAqIGRlbGF5ZWRDbGlja3Muc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGRlYm91bmNlfVxuICogQHNlZSB7QGxpbmsgZGVsYXl9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCk6IE9ic2VydmFibGV9IGRlbGF5RHVyYXRpb25TZWxlY3RvciBBIGZ1bmN0aW9uIHRoYXRcbiAqIHJldHVybnMgYW4gT2JzZXJ2YWJsZSBmb3IgZWFjaCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgd2hpY2hcbiAqIGlzIHRoZW4gdXNlZCB0byBkZWxheSB0aGUgZW1pc3Npb24gb2YgdGhhdCBpdGVtIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZVxuICogdW50aWwgdGhlIE9ic2VydmFibGUgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIGVtaXRzIGEgdmFsdWUuXG4gKiBAcGFyYW0ge09ic2VydmFibGV9IHN1YnNjcmlwdGlvbkRlbGF5IEFuIE9ic2VydmFibGUgdGhhdCB0cmlnZ2VycyB0aGVcbiAqIHN1YnNjcmlwdGlvbiB0byB0aGUgc291cmNlIE9ic2VydmFibGUgb25jZSBpdCBlbWl0cyBhbnkgdmFsdWUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZGVsYXlzIHRoZSBlbWlzc2lvbnMgb2YgdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZSBieSBhbiBhbW91bnQgb2YgdGltZSBzcGVjaWZpZWQgYnkgdGhlIE9ic2VydmFibGUgcmV0dXJuZWQgYnlcbiAqIGBkZWxheUR1cmF0aW9uU2VsZWN0b3JgLlxuICogQG1ldGhvZCBkZWxheVdoZW5cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGRlbGF5V2hlbihkZWxheUR1cmF0aW9uU2VsZWN0b3IsIHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uRGVsYXlPYnNlcnZhYmxlKHRoaXMsIHN1YnNjcmlwdGlvbkRlbGF5KVxuICAgICAgICAgICAgLmxpZnQobmV3IERlbGF5V2hlbk9wZXJhdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBEZWxheVdoZW5PcGVyYXRvcihkZWxheUR1cmF0aW9uU2VsZWN0b3IpKTtcbn1cbmV4cG9ydHMuZGVsYXlXaGVuID0gZGVsYXlXaGVuO1xudmFyIERlbGF5V2hlbk9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWxheVdoZW5PcGVyYXRvcihkZWxheUR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5kZWxheUR1cmF0aW9uU2VsZWN0b3IgPSBkZWxheUR1cmF0aW9uU2VsZWN0b3I7XG4gICAgfVxuICAgIERlbGF5V2hlbk9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVsYXlXaGVuU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIERlbGF5V2hlbk9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRGVsYXlXaGVuU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlbGF5V2hlblN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVsYXlXaGVuU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgZGVsYXlEdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5kZWxheUR1cmF0aW9uU2VsZWN0b3IgPSBkZWxheUR1cmF0aW9uU2VsZWN0b3I7XG4gICAgICAgIHRoaXMuY29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBbXTtcbiAgICB9XG4gICAgRGVsYXlXaGVuU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQob3V0ZXJWYWx1ZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGlubmVyU3ViKTtcbiAgICAgICAgdGhpcy50cnlDb21wbGV0ZSgpO1xuICAgIH07XG4gICAgRGVsYXlXaGVuU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5RXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yKGVycm9yKTtcbiAgICB9O1xuICAgIERlbGF5V2hlblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGlubmVyU3ViKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTtcbiAgICB9O1xuICAgIERlbGF5V2hlblN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgZGVsYXlOb3RpZmllciA9IHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkZWxheU5vdGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlEZWxheShkZWxheU5vdGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWxheVdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlDb21wbGV0ZSgpO1xuICAgIH07XG4gICAgRGVsYXlXaGVuU3Vic2NyaWJlci5wcm90b3R5cGUucmVtb3ZlU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbklkeCA9IHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pO1xuICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uSWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlc1tzdWJzY3JpcHRpb25JZHhdO1xuICAgICAgICAgICAgdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5zcGxpY2Uoc3Vic2NyaXB0aW9uSWR4LCAxKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNwbGljZShzdWJzY3JpcHRpb25JZHgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIERlbGF5V2hlblN1YnNjcmliZXIucHJvdG90eXBlLnRyeURlbGF5ID0gZnVuY3Rpb24gKGRlbGF5Tm90aWZpZXIsIHZhbHVlKSB7XG4gICAgICAgIHZhciBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgZGVsYXlOb3RpZmllciwgdmFsdWUpO1xuICAgICAgICB0aGlzLmFkZChub3RpZmllclN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMucHVzaChub3RpZmllclN1YnNjcmlwdGlvbik7XG4gICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH07XG4gICAgRGVsYXlXaGVuU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5Q29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCAmJiB0aGlzLmRlbGF5Tm90aWZpZXJTdWJzY3JpcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGVsYXlXaGVuU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJzY3JpcHRpb25EZWxheU9ic2VydmFibGUoc291cmNlLCBzdWJzY3JpcHRpb25EZWxheSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uRGVsYXkgPSBzdWJzY3JpcHRpb25EZWxheTtcbiAgICB9XG4gICAgU3Vic2NyaXB0aW9uRGVsYXlPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25EZWxheS5zdWJzY3JpYmUobmV3IFN1YnNjcmlwdGlvbkRlbGF5U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNvdXJjZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbkRlbGF5U3Vic2NyaWJlcihwYXJlbnQsIHNvdXJjZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnNvdXJjZVN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh1bnVzZWQpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1NvdXJjZSgpO1xuICAgIH07XG4gICAgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQuZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbkRlbGF5U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvU291cmNlKCk7XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb25EZWxheVN1YnNjcmliZXIucHJvdG90eXBlLnN1YnNjcmliZVRvU291cmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuc291cmNlU3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlLnN1YnNjcmliZSh0aGlzLnBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTdWJzY3JpcHRpb25EZWxheVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxheVdoZW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvZGVsYXlXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA0OTRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1033. /***/ },
  1034. /* 495 */
  1035. /***/ function(module, exports, __webpack_require__) {
  1036. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar distinct_1 = __webpack_require__(496);\nObservable_1.Observable.prototype.distinct = distinct_1.distinct;\n//# sourceMappingURL=distinct.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kaXN0aW5jdC5qcz82NjlkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkaXN0aW5jdF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGlzdGluY3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kaXN0aW5jdCA9IGRpc3RpbmN0XzEuZGlzdGluY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXN0aW5jdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGlzdGluY3QuanNcbi8vIG1vZHVsZSBpZCA9IDQ5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1037. /***/ },
  1038. /* 496 */
  1039. /***/ function(module, exports, __webpack_require__) {
  1040. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar Set_1 = __webpack_require__(497);\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.\n * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will\n * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the\n * source observable directly with an equality check against previous values.\n * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.\n * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the\n * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`\n * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so\n * that the internal `Set` can be \"flushed\", basically clearing it of values.\n * @param {function} [keySelector] optional function to select which value you want to check as distinct.\n * @param {Observable} [flushes] optional Observable for flushing the internal HashSet of the operator.\n * @return {Observable} an Observable that emits items from the source Observable with distinct values.\n * @method distinct\n * @owner Observable\n */\nfunction distinct(keySelector, flushes) {\n return this.lift(new DistinctOperator(keySelector, flushes));\n}\nexports.distinct = distinct;\nvar DistinctOperator = (function () {\n function DistinctOperator(keySelector, flushes) {\n this.keySelector = keySelector;\n this.flushes = flushes;\n }\n DistinctOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));\n };\n return DistinctOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctSubscriber = (function (_super) {\n __extends(DistinctSubscriber, _super);\n function DistinctSubscriber(destination, keySelector, flushes) {\n _super.call(this, destination);\n this.keySelector = keySelector;\n this.values = new Set_1.Set();\n if (flushes) {\n this.add(subscribeToResult_1.subscribeToResult(this, flushes));\n }\n }\n DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.values.clear();\n };\n DistinctSubscriber.prototype.notifyError = function (error, innerSub) {\n this._error(error);\n };\n DistinctSubscriber.prototype._next = function (value) {\n if (this.keySelector) {\n this._useKeySelector(value);\n }\n else {\n this._finalizeNext(value, value);\n }\n };\n DistinctSubscriber.prototype._useKeySelector = function (value) {\n var key;\n var destination = this.destination;\n try {\n key = this.keySelector(value);\n }\n catch (err) {\n destination.error(err);\n return;\n }\n this._finalizeNext(key, value);\n };\n DistinctSubscriber.prototype._finalizeNext = function (key, value) {\n var values = this.values;\n if (!values.has(key)) {\n values.add(key);\n this.destination.next(value);\n }\n };\n return DistinctSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.DistinctSubscriber = DistinctSubscriber;\n//# sourceMappingURL=distinct.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2Rpc3RpbmN0LmpzPzVmODAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgU2V0XzEgPSByZXF1aXJlKCcuLi91dGlsL1NldCcpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbGwgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgdGhhdCBhcmUgZGlzdGluY3QgYnkgY29tcGFyaXNvbiBmcm9tIHByZXZpb3VzIGl0ZW1zLlxuICogSWYgYSBrZXlTZWxlY3RvciBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdGhlbiBpdCB3aWxsIHByb2plY3QgZWFjaCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2Ugb2JzZXJ2YWJsZSBpbnRvIGEgbmV3IHZhbHVlIHRoYXQgaXQgd2lsbFxuICogY2hlY2sgZm9yIGVxdWFsaXR5IHdpdGggcHJldmlvdXNseSBwcm9qZWN0ZWQgdmFsdWVzLiBJZiBhIGtleVNlbGVjdG9yIGZ1bmN0aW9uIGlzIG5vdCBwcm92aWRlZCwgaXQgd2lsbCB1c2UgZWFjaCB2YWx1ZSBmcm9tIHRoZVxuICogc291cmNlIG9ic2VydmFibGUgZGlyZWN0bHkgd2l0aCBhbiBlcXVhbGl0eSBjaGVjayBhZ2FpbnN0IHByZXZpb3VzIHZhbHVlcy5cbiAqIEluIEphdmFTY3JpcHQgcnVudGltZXMgdGhhdCBzdXBwb3J0IGBTZXRgLCB0aGlzIG9wZXJhdG9yIHdpbGwgdXNlIGEgYFNldGAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiB0aGUgZGlzdGluY3QgdmFsdWUgY2hlY2tpbmcuXG4gKiBJbiBvdGhlciBydW50aW1lcywgdGhpcyBvcGVyYXRvciB3aWxsIHVzZSBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgYFNldGAgdGhhdCByZWxpZXMgb24gYW4gYEFycmF5YCBhbmQgYGluZGV4T2ZgIHVuZGVyIHRoZVxuICogaG9vZCwgc28gcGVyZm9ybWFuY2Ugd2lsbCBkZWdyYWRlIGFzIG1vcmUgdmFsdWVzIGFyZSBjaGVja2VkIGZvciBkaXN0aW5jdGlvbi4gRXZlbiBpbiBuZXdlciBicm93c2VycywgYSBsb25nLXJ1bm5pbmcgYGRpc3RpbmN0YFxuICogdXNlIG1pZ2h0IHJlc3VsdCBpbiBtZW1vcnkgbGVha3MuIFRvIGhlbHAgYWxsZXZpYXRlIHRoaXMgaW4gc29tZSBzY2VuYXJpb3MsIGFuIG9wdGlvbmFsIGBmbHVzaGVzYCBwYXJhbWV0ZXIgaXMgYWxzbyBwcm92aWRlZCBzb1xuICogdGhhdCB0aGUgaW50ZXJuYWwgYFNldGAgY2FuIGJlIFwiZmx1c2hlZFwiLCBiYXNpY2FsbHkgY2xlYXJpbmcgaXQgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2tleVNlbGVjdG9yXSBvcHRpb25hbCBmdW5jdGlvbiB0byBzZWxlY3Qgd2hpY2ggdmFsdWUgeW91IHdhbnQgdG8gY2hlY2sgYXMgZGlzdGluY3QuXG4gKiBAcGFyYW0ge09ic2VydmFibGV9IFtmbHVzaGVzXSBvcHRpb25hbCBPYnNlcnZhYmxlIGZvciBmbHVzaGluZyB0aGUgaW50ZXJuYWwgSGFzaFNldCBvZiB0aGUgb3BlcmF0b3IuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaXRlbXMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgd2l0aCBkaXN0aW5jdCB2YWx1ZXMuXG4gKiBAbWV0aG9kIGRpc3RpbmN0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBkaXN0aW5jdChrZXlTZWxlY3RvciwgZmx1c2hlcykge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IERpc3RpbmN0T3BlcmF0b3Ioa2V5U2VsZWN0b3IsIGZsdXNoZXMpKTtcbn1cbmV4cG9ydHMuZGlzdGluY3QgPSBkaXN0aW5jdDtcbnZhciBEaXN0aW5jdE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaXN0aW5jdE9wZXJhdG9yKGtleVNlbGVjdG9yLCBmbHVzaGVzKSB7XG4gICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5mbHVzaGVzID0gZmx1c2hlcztcbiAgICB9XG4gICAgRGlzdGluY3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IERpc3RpbmN0U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmtleVNlbGVjdG9yLCB0aGlzLmZsdXNoZXMpKTtcbiAgICB9O1xuICAgIHJldHVybiBEaXN0aW5jdE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRGlzdGluY3RTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRGlzdGluY3RTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERpc3RpbmN0U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwga2V5U2VsZWN0b3IsIGZsdXNoZXMpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0ga2V5U2VsZWN0b3I7XG4gICAgICAgIHRoaXMudmFsdWVzID0gbmV3IFNldF8xLlNldCgpO1xuICAgICAgICBpZiAoZmx1c2hlcykge1xuICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBmbHVzaGVzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgRGlzdGluY3RTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLmNsZWFyKCk7XG4gICAgfTtcbiAgICBEaXN0aW5jdFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUVycm9yID0gZnVuY3Rpb24gKGVycm9yLCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLl9lcnJvcihlcnJvcik7XG4gICAgfTtcbiAgICBEaXN0aW5jdFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmtleVNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VLZXlTZWxlY3Rvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9maW5hbGl6ZU5leHQodmFsdWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGlzdGluY3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fdXNlS2V5U2VsZWN0b3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleSA9IHRoaXMua2V5U2VsZWN0b3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmluYWxpemVOZXh0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgRGlzdGluY3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fZmluYWxpemVOZXh0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgICAgICBpZiAoIXZhbHVlcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdmFsdWVzLmFkZChrZXkpO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERpc3RpbmN0U3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnRzLkRpc3RpbmN0U3Vic2NyaWJlciA9IERpc3RpbmN0U3Vic2NyaWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpc3RpbmN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2Rpc3RpbmN0LmpzXG4vLyBtb2R1bGUgaWQgPSA0OTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1041. /***/ },
  1042. /* 497 */
  1043. /***/ function(module, exports, __webpack_require__) {
  1044. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nfunction minimalSetImpl() {\n // THIS IS NOT a full impl of Set, this is just the minimum\n // bits of functionality we need for this library.\n return (function () {\n function MinimalSet() {\n this._values = [];\n }\n MinimalSet.prototype.add = function (value) {\n if (!this.has(value)) {\n this._values.push(value);\n }\n };\n MinimalSet.prototype.has = function (value) {\n return this._values.indexOf(value) !== -1;\n };\n Object.defineProperty(MinimalSet.prototype, \"size\", {\n get: function () {\n return this._values.length;\n },\n enumerable: true,\n configurable: true\n });\n MinimalSet.prototype.clear = function () {\n this._values.length = 0;\n };\n return MinimalSet;\n }());\n}\nexports.minimalSetImpl = minimalSetImpl;\nexports.Set = root_1.root.Set || minimalSetImpl();\n//# sourceMappingURL=Set.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvU2V0LmpzPzc1ZDEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi9yb290Jyk7XG5mdW5jdGlvbiBtaW5pbWFsU2V0SW1wbCgpIHtcbiAgICAvLyBUSElTIElTIE5PVCBhIGZ1bGwgaW1wbCBvZiBTZXQsIHRoaXMgaXMganVzdCB0aGUgbWluaW11bVxuICAgIC8vIGJpdHMgb2YgZnVuY3Rpb25hbGl0eSB3ZSBuZWVkIGZvciB0aGlzIGxpYnJhcnkuXG4gICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIE1pbmltYWxTZXQoKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBNaW5pbWFsU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBNaW5pbWFsU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXMuaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWluaW1hbFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBNaW5pbWFsU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gTWluaW1hbFNldDtcbiAgICB9KCkpO1xufVxuZXhwb3J0cy5taW5pbWFsU2V0SW1wbCA9IG1pbmltYWxTZXRJbXBsO1xuZXhwb3J0cy5TZXQgPSByb290XzEucm9vdC5TZXQgfHwgbWluaW1hbFNldEltcGwoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL1NldC5qc1xuLy8gbW9kdWxlIGlkID0gNDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1045. /***/ },
  1046. /* 498 */
  1047. /***/ function(module, exports, __webpack_require__) {
  1048. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar distinctUntilChanged_1 = __webpack_require__(499);\nObservable_1.Observable.prototype.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;\n//# sourceMappingURL=distinctUntilChanged.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kaXN0aW5jdFVudGlsQ2hhbmdlZC5qcz9lNzUwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkaXN0aW5jdFVudGlsQ2hhbmdlZF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGlzdGluY3RVbnRpbENoYW5nZWQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kaXN0aW5jdFVudGlsQ2hhbmdlZCA9IGRpc3RpbmN0VW50aWxDaGFuZ2VkXzEuZGlzdGluY3RVbnRpbENoYW5nZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXN0aW5jdFVudGlsQ2hhbmdlZC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGlzdGluY3RVbnRpbENoYW5nZWQuanNcbi8vIG1vZHVsZSBpZCA9IDQ5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1049. /***/ },
  1050. /* 499 */
  1051. /***/ function(module, exports, __webpack_require__) {
  1052. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n * If a comparator function is not provided, an equality check is used by default.\n * @param {function} [compare] optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} an Observable that emits items from the source Observable with distinct values.\n * @method distinctUntilChanged\n * @owner Observable\n */\nfunction distinctUntilChanged(compare, keySelector) {\n return this.lift(new DistinctUntilChangedOperator(compare, keySelector));\n}\nexports.distinctUntilChanged = distinctUntilChanged;\nvar DistinctUntilChangedOperator = (function () {\n function DistinctUntilChangedOperator(compare, keySelector) {\n this.compare = compare;\n this.keySelector = keySelector;\n }\n DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n };\n return DistinctUntilChangedOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DistinctUntilChangedSubscriber = (function (_super) {\n __extends(DistinctUntilChangedSubscriber, _super);\n function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n _super.call(this, destination);\n this.keySelector = keySelector;\n this.hasKey = false;\n if (typeof compare === 'function') {\n this.compare = compare;\n }\n }\n DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n return x === y;\n };\n DistinctUntilChangedSubscriber.prototype._next = function (value) {\n var keySelector = this.keySelector;\n var key = value;\n if (keySelector) {\n key = tryCatch_1.tryCatch(this.keySelector)(value);\n if (key === errorObject_1.errorObject) {\n return this.destination.error(errorObject_1.errorObject.e);\n }\n }\n var result = false;\n if (this.hasKey) {\n result = tryCatch_1.tryCatch(this.compare)(this.key, key);\n if (result === errorObject_1.errorObject) {\n return this.destination.error(errorObject_1.errorObject.e);\n }\n }\n else {\n this.hasKey = true;\n }\n if (Boolean(result) === false) {\n this.key = key;\n this.destination.next(value);\n }\n };\n return DistinctUntilChangedSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=distinctUntilChanged.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2Rpc3RpbmN0VW50aWxDaGFuZ2VkLmpzPzdjOWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFsbCBpdGVtcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0aGF0IGFyZSBkaXN0aW5jdCBieSBjb21wYXJpc29uIGZyb20gdGhlIHByZXZpb3VzIGl0ZW0uXG4gKiBJZiBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaXRlbSB0byB0ZXN0IGZvciB3aGV0aGVyIG9yIG5vdCB0aGF0IHZhbHVlIHNob3VsZCBiZSBlbWl0dGVkLlxuICogSWYgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIGlzIG5vdCBwcm92aWRlZCwgYW4gZXF1YWxpdHkgY2hlY2sgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbXBhcmVdIG9wdGlvbmFsIGNvbXBhcmlzb24gZnVuY3Rpb24gY2FsbGVkIHRvIHRlc3QgaWYgYW4gaXRlbSBpcyBkaXN0aW5jdCBmcm9tIHRoZSBwcmV2aW91cyBpdGVtIGluIHRoZSBzb3VyY2UuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaXRlbXMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgd2l0aCBkaXN0aW5jdCB2YWx1ZXMuXG4gKiBAbWV0aG9kIGRpc3RpbmN0VW50aWxDaGFuZ2VkXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBkaXN0aW5jdFVudGlsQ2hhbmdlZChjb21wYXJlLCBrZXlTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IERpc3RpbmN0VW50aWxDaGFuZ2VkT3BlcmF0b3IoY29tcGFyZSwga2V5U2VsZWN0b3IpKTtcbn1cbmV4cG9ydHMuZGlzdGluY3RVbnRpbENoYW5nZWQgPSBkaXN0aW5jdFVudGlsQ2hhbmdlZDtcbnZhciBEaXN0aW5jdFVudGlsQ2hhbmdlZE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaXN0aW5jdFVudGlsQ2hhbmdlZE9wZXJhdG9yKGNvbXBhcmUsIGtleVNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG4gICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjtcbiAgICB9XG4gICAgRGlzdGluY3RVbnRpbENoYW5nZWRPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmNvbXBhcmUsIHRoaXMua2V5U2VsZWN0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBEaXN0aW5jdFVudGlsQ2hhbmdlZE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRGlzdGluY3RVbnRpbENoYW5nZWRTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRGlzdGluY3RVbnRpbENoYW5nZWRTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgY29tcGFyZSwga2V5U2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0ga2V5U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuaGFzS2V5ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcGFyZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBEaXN0aW5jdFVudGlsQ2hhbmdlZFN1YnNjcmliZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICByZXR1cm4geCA9PT0geTtcbiAgICB9O1xuICAgIERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGtleVNlbGVjdG9yID0gdGhpcy5rZXlTZWxlY3RvcjtcbiAgICAgICAgdmFyIGtleSA9IHZhbHVlO1xuICAgICAgICBpZiAoa2V5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGtleSA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godGhpcy5rZXlTZWxlY3RvcikodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5oYXNLZXkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godGhpcy5jb21wYXJlKSh0aGlzLmtleSwga2V5KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYXNLZXkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChCb29sZWFuKHJlc3VsdCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEaXN0aW5jdFVudGlsQ2hhbmdlZFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXN0aW5jdFVudGlsQ2hhbmdlZC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9kaXN0aW5jdFVudGlsQ2hhbmdlZC5qc1xuLy8gbW9kdWxlIGlkID0gNDk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1053. /***/ },
  1054. /* 500 */
  1055. /***/ function(module, exports, __webpack_require__) {
  1056. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar distinctUntilKeyChanged_1 = __webpack_require__(501);\nObservable_1.Observable.prototype.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;\n//# sourceMappingURL=distinctUntilKeyChanged.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qcz82YTExIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZGlzdGluY3RVbnRpbEtleUNoYW5nZWQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCA9IGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkXzEuZGlzdGluY3RVbnRpbEtleUNoYW5nZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZGlzdGluY3RVbnRpbEtleUNoYW5nZWQuanNcbi8vIG1vZHVsZSBpZCA9IDUwMFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1057. /***/ },
  1058. /* 501 */
  1059. /***/ function(module, exports, __webpack_require__) {
  1060. eval("\"use strict\";\nvar distinctUntilChanged_1 = __webpack_require__(499);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item,\n * using a property accessed by using the key provided to check if the two items are distinct.\n * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.\n * If a comparator function is not provided, an equality check is used by default.\n * @param {string} key string key for object property lookup on each item.\n * @param {function} [compare] optional comparison function called to test if an item is distinct from the previous item in the source.\n * @return {Observable} an Observable that emits items from the source Observable with distinct values based on the key specified.\n * @method distinctUntilKeyChanged\n * @owner Observable\n */\nfunction distinctUntilKeyChanged(key, compare) {\n return distinctUntilChanged_1.distinctUntilChanged.call(this, function (x, y) {\n if (compare) {\n return compare(x[key], y[key]);\n }\n return x[key] === y[key];\n });\n}\nexports.distinctUntilKeyChanged = distinctUntilKeyChanged;\n//# sourceMappingURL=distinctUntilKeyChanged.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2Rpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLmpzPzk3YjgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgZGlzdGluY3RVbnRpbENoYW5nZWRfMSA9IHJlcXVpcmUoJy4vZGlzdGluY3RVbnRpbENoYW5nZWQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbGwgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgdGhhdCBhcmUgZGlzdGluY3QgYnkgY29tcGFyaXNvbiBmcm9tIHRoZSBwcmV2aW91cyBpdGVtLFxuICogdXNpbmcgYSBwcm9wZXJ0eSBhY2Nlc3NlZCBieSB1c2luZyB0aGUga2V5IHByb3ZpZGVkIHRvIGNoZWNrIGlmIHRoZSB0d28gaXRlbXMgYXJlIGRpc3RpbmN0LlxuICogSWYgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGl0ZW0gdG8gdGVzdCBmb3Igd2hldGhlciBvciBub3QgdGhhdCB2YWx1ZSBzaG91bGQgYmUgZW1pdHRlZC5cbiAqIElmIGEgY29tcGFyYXRvciBmdW5jdGlvbiBpcyBub3QgcHJvdmlkZWQsIGFuIGVxdWFsaXR5IGNoZWNrIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3RyaW5nIGtleSBmb3Igb2JqZWN0IHByb3BlcnR5IGxvb2t1cCBvbiBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29tcGFyZV0gb3B0aW9uYWwgY29tcGFyaXNvbiBmdW5jdGlvbiBjYWxsZWQgdG8gdGVzdCBpZiBhbiBpdGVtIGlzIGRpc3RpbmN0IGZyb20gdGhlIHByZXZpb3VzIGl0ZW0gaW4gdGhlIHNvdXJjZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBpdGVtcyBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB3aXRoIGRpc3RpbmN0IHZhbHVlcyBiYXNlZCBvbiB0aGUga2V5IHNwZWNpZmllZC5cbiAqIEBtZXRob2QgZGlzdGluY3RVbnRpbEtleUNoYW5nZWRcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKGtleSwgY29tcGFyZSkge1xuICAgIHJldHVybiBkaXN0aW5jdFVudGlsQ2hhbmdlZF8xLmRpc3RpbmN0VW50aWxDaGFuZ2VkLmNhbGwodGhpcywgZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKGNvbXBhcmUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlKHhba2V5XSwgeVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geFtrZXldID09PSB5W2tleV07XG4gICAgfSk7XG59XG5leHBvcnRzLmRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkID0gZGlzdGluY3RVbnRpbEtleUNoYW5nZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9kaXN0aW5jdFVudGlsS2V5Q2hhbmdlZC5qc1xuLy8gbW9kdWxlIGlkID0gNTAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1061. /***/ },
  1062. /* 502 */
  1063. /***/ function(module, exports, __webpack_require__) {
  1064. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar do_1 = __webpack_require__(503);\nObservable_1.Observable.prototype.do = do_1._do;\nObservable_1.Observable.prototype._do = do_1._do;\n//# sourceMappingURL=do.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9kby5qcz8zN2VjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBkb18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZG8nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5kbyA9IGRvXzEuX2RvO1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUucHJvdG90eXBlLl9kbyA9IGRvXzEuX2RvO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG8uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2RvLmpzXG4vLyBtb2R1bGUgaWQgPSA1MDJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1065. /***/ },
  1066. /* 503 */
  1067. /***/ function(module, exports, __webpack_require__) {
  1068. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * <span class=\"informal\">Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source.</span>\n *\n * <img src=\"./img/do.png\" width=\"100%\">\n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example <caption>Map every every click to the clientX position of that click, while also logging the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n * .do(ev => console.log(ev))\n * .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @method do\n * @name do\n * @owner Observable\n */\nfunction _do(nextOrObserver, error, complete) {\n return this.lift(new DoOperator(nextOrObserver, error, complete));\n}\nexports._do = _do;\nvar DoOperator = (function () {\n function DoOperator(nextOrObserver, error, complete) {\n this.nextOrObserver = nextOrObserver;\n this.error = error;\n this.complete = complete;\n }\n DoOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n };\n return DoOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar DoSubscriber = (function (_super) {\n __extends(DoSubscriber, _super);\n function DoSubscriber(destination, nextOrObserver, error, complete) {\n _super.call(this, destination);\n var safeSubscriber = new Subscriber_1.Subscriber(nextOrObserver, error, complete);\n safeSubscriber.syncErrorThrowable = true;\n this.add(safeSubscriber);\n this.safeSubscriber = safeSubscriber;\n }\n DoSubscriber.prototype._next = function (value) {\n var safeSubscriber = this.safeSubscriber;\n safeSubscriber.next(value);\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n }\n else {\n this.destination.next(value);\n }\n };\n DoSubscriber.prototype._error = function (err) {\n var safeSubscriber = this.safeSubscriber;\n safeSubscriber.error(err);\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n }\n else {\n this.destination.error(err);\n }\n };\n DoSubscriber.prototype._complete = function () {\n var safeSubscriber = this.safeSubscriber;\n safeSubscriber.complete();\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n }\n else {\n this.destination.complete();\n }\n };\n return DoSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=do.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2RvLmpzPzg5OTkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUGVyZm9ybSBhIHNpZGUgZWZmZWN0IGZvciBldmVyeSBlbWlzc2lvbiBvbiB0aGUgc291cmNlIE9ic2VydmFibGUsIGJ1dCByZXR1cm5cbiAqIGFuIE9ic2VydmFibGUgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SW50ZXJjZXB0cyBlYWNoIGVtaXNzaW9uIG9uIHRoZSBzb3VyY2UgYW5kIHJ1bnMgYVxuICogZnVuY3Rpb24sIGJ1dCByZXR1cm5zIGFuIG91dHB1dCB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9kby5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBSZXR1cm5zIGEgbWlycm9yZWQgT2JzZXJ2YWJsZSBvZiB0aGUgc291cmNlIE9ic2VydmFibGUsIGJ1dCBtb2RpZmllZCBzbyB0aGF0XG4gKiB0aGUgcHJvdmlkZWQgT2JzZXJ2ZXIgaXMgY2FsbGVkIHRvIHBlcmZvcm0gYSBzaWRlIGVmZmVjdCBmb3IgZXZlcnkgdmFsdWUsXG4gKiBlcnJvciwgYW5kIGNvbXBsZXRpb24gZW1pdHRlZCBieSB0aGUgc291cmNlLiBBbnkgZXJyb3JzIHRoYXQgYXJlIHRocm93biBpblxuICogdGhlIGFmb3JlbWVudGlvbmVkIE9ic2VydmVyIG9yIGhhbmRsZXJzIGFyZSBzYWZlbHkgc2VudCBkb3duIHRoZSBlcnJvciBwYXRoXG4gKiBvZiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogVGhpcyBvcGVyYXRvciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyB5b3VyIE9ic2VydmFibGVzIGZvciB0aGUgY29ycmVjdCB2YWx1ZXNcbiAqIG9yIHBlcmZvcm1pbmcgb3RoZXIgc2lkZSBlZmZlY3RzLlxuICpcbiAqIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IHRvIGEgYHN1YnNjcmliZWAgb24gdGhlIE9ic2VydmFibGUuIElmIHRoZSBPYnNlcnZhYmxlXG4gKiByZXR1cm5lZCBieSBgZG9gIGlzIG5vdCBzdWJzY3JpYmVkLCB0aGUgc2lkZSBlZmZlY3RzIHNwZWNpZmllZCBieSB0aGVcbiAqIE9ic2VydmVyIHdpbGwgbmV2ZXIgaGFwcGVuLiBgZG9gIHRoZXJlZm9yZSBzaW1wbHkgc3BpZXMgb24gZXhpc3RpbmdcbiAqIGV4ZWN1dGlvbiwgaXQgZG9lcyBub3QgdHJpZ2dlciBhbiBleGVjdXRpb24gdG8gaGFwcGVuIGxpa2UgYHN1YnNjcmliZWAgZG9lcy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5NYXAgZXZlcnkgZXZlcnkgY2xpY2sgdG8gdGhlIGNsaWVudFggcG9zaXRpb24gb2YgdGhhdCBjbGljaywgd2hpbGUgYWxzbyBsb2dnaW5nIHRoZSBjbGljayBldmVudDwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcG9zaXRpb25zID0gY2xpY2tzXG4gKiAgIC5kbyhldiA9PiBjb25zb2xlLmxvZyhldikpXG4gKiAgIC5tYXAoZXYgPT4gZXYuY2xpZW50WCk7XG4gKiBwb3NpdGlvbnMuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIG1hcH1cbiAqIEBzZWUge0BsaW5rIHN1YnNjcmliZX1cbiAqXG4gKiBAcGFyYW0ge09ic2VydmVyfGZ1bmN0aW9ufSBbbmV4dE9yT2JzZXJ2ZXJdIEEgbm9ybWFsIE9ic2VydmVyIG9iamVjdCBvciBhXG4gKiBjYWxsYmFjayBmb3IgYG5leHRgLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2Vycm9yXSBDYWxsYmFjayBmb3IgZXJyb3JzIGluIHRoZSBzb3VyY2UuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29tcGxldGVdIENhbGxiYWNrIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgc291cmNlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSwgYnV0IHJ1bnMgdGhlXG4gKiBzcGVjaWZpZWQgT2JzZXJ2ZXIgb3IgY2FsbGJhY2socykgZm9yIGVhY2ggaXRlbS5cbiAqIEBtZXRob2QgZG9cbiAqIEBuYW1lIGRvXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBfZG8obmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IERvT3BlcmF0b3IobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkpO1xufVxuZXhwb3J0cy5fZG8gPSBfZG87XG52YXIgRG9PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRG9PcGVyYXRvcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMubmV4dE9yT2JzZXJ2ZXIgPSBuZXh0T3JPYnNlcnZlcjtcbiAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLmNvbXBsZXRlID0gY29tcGxldGU7XG4gICAgfVxuICAgIERvT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEb1N1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5uZXh0T3JPYnNlcnZlciwgdGhpcy5lcnJvciwgdGhpcy5jb21wbGV0ZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERvT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBEb1N1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEb1N1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRG9TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdmFyIHNhZmVTdWJzY3JpYmVyID0gbmV3IFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpO1xuICAgICAgICBzYWZlU3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkZChzYWZlU3Vic2NyaWJlcik7XG4gICAgICAgIHRoaXMuc2FmZVN1YnNjcmliZXIgPSBzYWZlU3Vic2NyaWJlcjtcbiAgICB9XG4gICAgRG9TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgc2FmZVN1YnNjcmliZXIgPSB0aGlzLnNhZmVTdWJzY3JpYmVyO1xuICAgICAgICBzYWZlU3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKHNhZmVTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93bikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihzYWZlU3Vic2NyaWJlci5zeW5jRXJyb3JWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb1N1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIHNhZmVTdWJzY3JpYmVyID0gdGhpcy5zYWZlU3Vic2NyaWJlcjtcbiAgICAgICAgc2FmZVN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgaWYgKHNhZmVTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93bikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihzYWZlU3Vic2NyaWJlci5zeW5jRXJyb3JWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERvU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2FmZVN1YnNjcmliZXIgPSB0aGlzLnNhZmVTdWJzY3JpYmVyO1xuICAgICAgICBzYWZlU3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAoc2FmZVN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3duKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHNhZmVTdWJzY3JpYmVyLnN5bmNFcnJvclZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERvU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2RvLmpzXG4vLyBtb2R1bGUgaWQgPSA1MDNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1069. /***/ },
  1070. /* 504 */
  1071. /***/ function(module, exports, __webpack_require__) {
  1072. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar exhaust_1 = __webpack_require__(505);\nObservable_1.Observable.prototype.exhaust = exhaust_1.exhaust;\n//# sourceMappingURL=exhaust.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9leGhhdXN0LmpzPzIzMWEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGV4aGF1c3RfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2V4aGF1c3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5leGhhdXN0ID0gZXhoYXVzdF8xLmV4aGF1c3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGhhdXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9leGhhdXN0LmpzXG4vLyBtb2R1bGUgaWQgPSA1MDRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1073. /***/ },
  1074. /* 505 */
  1075. /***/ function(module, exports, __webpack_require__) {
  1076. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Converts a higher-order Observable into a first-order Observable by dropping\n * inner Observables while the previous inner Observable has not yet completed.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by dropping the\n * next inner Observables while the current inner is still executing.</span>\n *\n * <img src=\"./img/exhaust.png\" width=\"100%\">\n *\n * `exhaust` subscribes to an Observable that emits Observables, also known as a\n * higher-order Observable. Each time it observes one of these emitted inner\n * Observables, the output Observable begins emitting the items emitted by that\n * inner Observable. So far, it behaves like {@link mergeAll}. However,\n * `exhaust` ignores every new inner Observable if the previous Observable has\n * not yet completed. Once that one completes, it will accept and flatten the\n * next inner Observable and repeat this process.\n *\n * @example <caption>Run a finite timer for each click, only if there is no currently active timer</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var result = higherOrder.exhaust();\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link switch}\n * @see {@link mergeAll}\n * @see {@link exhaustMap}\n * @see {@link zipAll}\n *\n * @return {Observable} Returns an Observable that takes a source of Observables\n * and propagates the first observable exclusively until it completes before\n * subscribing to the next.\n * @method exhaust\n * @owner Observable\n */\nfunction exhaust() {\n return this.lift(new SwitchFirstOperator());\n}\nexports.exhaust = exhaust;\nvar SwitchFirstOperator = (function () {\n function SwitchFirstOperator() {\n }\n SwitchFirstOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SwitchFirstSubscriber(subscriber));\n };\n return SwitchFirstOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchFirstSubscriber = (function (_super) {\n __extends(SwitchFirstSubscriber, _super);\n function SwitchFirstSubscriber(destination) {\n _super.call(this, destination);\n this.hasCompleted = false;\n this.hasSubscription = false;\n }\n SwitchFirstSubscriber.prototype._next = function (value) {\n if (!this.hasSubscription) {\n this.hasSubscription = true;\n this.add(subscribeToResult_1.subscribeToResult(this, value));\n }\n };\n SwitchFirstSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (!this.hasSubscription) {\n this.destination.complete();\n }\n };\n SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {\n this.remove(innerSub);\n this.hasSubscription = false;\n if (this.hasCompleted) {\n this.destination.complete();\n }\n };\n return SwitchFirstSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=exhaust.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2V4aGF1c3QuanM/NDg2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQ29udmVydHMgYSBoaWdoZXItb3JkZXIgT2JzZXJ2YWJsZSBpbnRvIGEgZmlyc3Qtb3JkZXIgT2JzZXJ2YWJsZSBieSBkcm9wcGluZ1xuICogaW5uZXIgT2JzZXJ2YWJsZXMgd2hpbGUgdGhlIHByZXZpb3VzIGlubmVyIE9ic2VydmFibGUgaGFzIG5vdCB5ZXQgY29tcGxldGVkLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5GbGF0dGVucyBhbiBPYnNlcnZhYmxlLW9mLU9ic2VydmFibGVzIGJ5IGRyb3BwaW5nIHRoZVxuICogbmV4dCBpbm5lciBPYnNlcnZhYmxlcyB3aGlsZSB0aGUgY3VycmVudCBpbm5lciBpcyBzdGlsbCBleGVjdXRpbmcuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZXhoYXVzdC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgZXhoYXVzdGAgc3Vic2NyaWJlcyB0byBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgT2JzZXJ2YWJsZXMsIGFsc28ga25vd24gYXMgYVxuICogaGlnaGVyLW9yZGVyIE9ic2VydmFibGUuIEVhY2ggdGltZSBpdCBvYnNlcnZlcyBvbmUgb2YgdGhlc2UgZW1pdHRlZCBpbm5lclxuICogT2JzZXJ2YWJsZXMsIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBiZWdpbnMgZW1pdHRpbmcgdGhlIGl0ZW1zIGVtaXR0ZWQgYnkgdGhhdFxuICogaW5uZXIgT2JzZXJ2YWJsZS4gU28gZmFyLCBpdCBiZWhhdmVzIGxpa2Uge0BsaW5rIG1lcmdlQWxsfS4gSG93ZXZlcixcbiAqIGBleGhhdXN0YCBpZ25vcmVzIGV2ZXJ5IG5ldyBpbm5lciBPYnNlcnZhYmxlIGlmIHRoZSBwcmV2aW91cyBPYnNlcnZhYmxlIGhhc1xuICogbm90IHlldCBjb21wbGV0ZWQuIE9uY2UgdGhhdCBvbmUgY29tcGxldGVzLCBpdCB3aWxsIGFjY2VwdCBhbmQgZmxhdHRlbiB0aGVcbiAqIG5leHQgaW5uZXIgT2JzZXJ2YWJsZSBhbmQgcmVwZWF0IHRoaXMgcHJvY2Vzcy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5SdW4gYSBmaW5pdGUgdGltZXIgZm9yIGVhY2ggY2xpY2ssIG9ubHkgaWYgdGhlcmUgaXMgbm8gY3VycmVudGx5IGFjdGl2ZSB0aW1lcjwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgaGlnaGVyT3JkZXIgPSBjbGlja3MubWFwKChldikgPT4gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKSk7XG4gKiB2YXIgcmVzdWx0ID0gaGlnaGVyT3JkZXIuZXhoYXVzdCgpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBjb21iaW5lQWxsfVxuICogQHNlZSB7QGxpbmsgY29uY2F0QWxsfVxuICogQHNlZSB7QGxpbmsgc3dpdGNofVxuICogQHNlZSB7QGxpbmsgbWVyZ2VBbGx9XG4gKiBAc2VlIHtAbGluayBleGhhdXN0TWFwfVxuICogQHNlZSB7QGxpbmsgemlwQWxsfVxuICpcbiAqIEByZXR1cm4ge09ic2VydmFibGV9IFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IHRha2VzIGEgc291cmNlIG9mIE9ic2VydmFibGVzXG4gKiBhbmQgcHJvcGFnYXRlcyB0aGUgZmlyc3Qgb2JzZXJ2YWJsZSBleGNsdXNpdmVseSB1bnRpbCBpdCBjb21wbGV0ZXMgYmVmb3JlXG4gKiBzdWJzY3JpYmluZyB0byB0aGUgbmV4dC5cbiAqIEBtZXRob2QgZXhoYXVzdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZXhoYXVzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBTd2l0Y2hGaXJzdE9wZXJhdG9yKCkpO1xufVxuZXhwb3J0cy5leGhhdXN0ID0gZXhoYXVzdDtcbnZhciBTd2l0Y2hGaXJzdE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTd2l0Y2hGaXJzdE9wZXJhdG9yKCkge1xuICAgIH1cbiAgICBTd2l0Y2hGaXJzdE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgU3dpdGNoRmlyc3RTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTtcbiAgICB9O1xuICAgIHJldHVybiBTd2l0Y2hGaXJzdE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU3dpdGNoRmlyc3RTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3dpdGNoRmlyc3RTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN3aXRjaEZpcnN0U3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzU3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgfVxuICAgIFN3aXRjaEZpcnN0U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTd2l0Y2hGaXJzdFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN3aXRjaEZpcnN0U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWIpO1xuICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFN3aXRjaEZpcnN0U3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGhhdXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2V4aGF1c3QuanNcbi8vIG1vZHVsZSBpZCA9IDUwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1077. /***/ },
  1078. /* 506 */
  1079. /***/ function(module, exports, __webpack_require__) {
  1080. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar exhaustMap_1 = __webpack_require__(507);\nObservable_1.Observable.prototype.exhaustMap = exhaustMap_1.exhaustMap;\n//# sourceMappingURL=exhaustMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9leGhhdXN0TWFwLmpzP2YzYmQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGV4aGF1c3RNYXBfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2V4aGF1c3RNYXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5leGhhdXN0TWFwID0gZXhoYXVzdE1hcF8xLmV4aGF1c3RNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGhhdXN0TWFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9leGhhdXN0TWFwLmpzXG4vLyBtb2R1bGUgaWQgPSA1MDZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1081. /***/ },
  1082. /* 507 */
  1083. /***/ function(module, exports, __webpack_require__) {
  1084. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable only if the previous projected Observable has completed.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link exhaust}.</span>\n *\n * <img src=\"./img/exhaustMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. When it projects a source value to\n * an Observable, the output Observable begins emitting the items emitted by\n * that projected Observable. However, `exhaustMap` ignores every new projected\n * Observable if the previous projected Observable has not yet completed. Once\n * that one completes, it will accept and flatten the next projected Observable\n * and repeat this process.\n *\n * @example <caption>Run a finite timer for each click, only if there is no currently active timer</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.exhaustMap((ev) => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMap}\n * @see {@link exhaust}\n * @see {@link mergeMap}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable containing projected Observables\n * of each item of the source, ignoring projected Observables that start before\n * their preceding Observable has completed.\n * @method exhaustMap\n * @owner Observable\n */\nfunction exhaustMap(project, resultSelector) {\n return this.lift(new SwitchFirstMapOperator(project, resultSelector));\n}\nexports.exhaustMap = exhaustMap;\nvar SwitchFirstMapOperator = (function () {\n function SwitchFirstMapOperator(project, resultSelector) {\n this.project = project;\n this.resultSelector = resultSelector;\n }\n SwitchFirstMapOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SwitchFirstMapSubscriber(subscriber, this.project, this.resultSelector));\n };\n return SwitchFirstMapOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchFirstMapSubscriber = (function (_super) {\n __extends(SwitchFirstMapSubscriber, _super);\n function SwitchFirstMapSubscriber(destination, project, resultSelector) {\n _super.call(this, destination);\n this.project = project;\n this.resultSelector = resultSelector;\n this.hasSubscription = false;\n this.hasCompleted = false;\n this.index = 0;\n }\n SwitchFirstMapSubscriber.prototype._next = function (value) {\n if (!this.hasSubscription) {\n this.tryNext(value);\n }\n };\n SwitchFirstMapSubscriber.prototype.tryNext = function (value) {\n var index = this.index++;\n var destination = this.destination;\n try {\n var result = this.project(value, index);\n this.hasSubscription = true;\n this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));\n }\n catch (err) {\n destination.error(err);\n }\n };\n SwitchFirstMapSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (!this.hasSubscription) {\n this.destination.complete();\n }\n };\n SwitchFirstMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n if (resultSelector) {\n this.trySelectResult(outerValue, innerValue, outerIndex, innerIndex);\n }\n else {\n destination.next(innerValue);\n }\n };\n SwitchFirstMapSubscriber.prototype.trySelectResult = function (outerValue, innerValue, outerIndex, innerIndex) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n try {\n var result = resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n destination.next(result);\n }\n catch (err) {\n destination.error(err);\n }\n };\n SwitchFirstMapSubscriber.prototype.notifyError = function (err) {\n this.destination.error(err);\n };\n SwitchFirstMapSubscriber.prototype.notifyComplete = function (innerSub) {\n this.remove(innerSub);\n this.hasSubscription = false;\n if (this.hasCompleted) {\n this.destination.complete();\n }\n };\n return SwitchFirstMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=exhaustMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2V4aGF1c3RNYXAuanM/YmRjOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBQcm9qZWN0cyBlYWNoIHNvdXJjZSB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlIHdoaWNoIGlzIG1lcmdlZCBpbiB0aGUgb3V0cHV0XG4gKiBPYnNlcnZhYmxlIG9ubHkgaWYgdGhlIHByZXZpb3VzIHByb2plY3RlZCBPYnNlcnZhYmxlIGhhcyBjb21wbGV0ZWQuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPk1hcHMgZWFjaCB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlLCB0aGVuIGZsYXR0ZW5zIGFsbCBvZlxuICogdGhlc2UgaW5uZXIgT2JzZXJ2YWJsZXMgdXNpbmcge0BsaW5rIGV4aGF1c3R9Ljwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2V4aGF1c3RNYXAucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaXRlbXMgYmFzZWQgb24gYXBwbHlpbmcgYSBmdW5jdGlvbiB0aGF0IHlvdVxuICogc3VwcGx5IHRvIGVhY2ggaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgd2hlcmUgdGhhdCBmdW5jdGlvblxuICogcmV0dXJucyBhbiAoc28tY2FsbGVkIFwiaW5uZXJcIikgT2JzZXJ2YWJsZS4gV2hlbiBpdCBwcm9qZWN0cyBhIHNvdXJjZSB2YWx1ZSB0b1xuICogYW4gT2JzZXJ2YWJsZSwgdGhlIG91dHB1dCBPYnNlcnZhYmxlIGJlZ2lucyBlbWl0dGluZyB0aGUgaXRlbXMgZW1pdHRlZCBieVxuICogdGhhdCBwcm9qZWN0ZWQgT2JzZXJ2YWJsZS4gSG93ZXZlciwgYGV4aGF1c3RNYXBgIGlnbm9yZXMgZXZlcnkgbmV3IHByb2plY3RlZFxuICogT2JzZXJ2YWJsZSBpZiB0aGUgcHJldmlvdXMgcHJvamVjdGVkIE9ic2VydmFibGUgaGFzIG5vdCB5ZXQgY29tcGxldGVkLiBPbmNlXG4gKiB0aGF0IG9uZSBjb21wbGV0ZXMsIGl0IHdpbGwgYWNjZXB0IGFuZCBmbGF0dGVuIHRoZSBuZXh0IHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiBhbmQgcmVwZWF0IHRoaXMgcHJvY2Vzcy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5SdW4gYSBmaW5pdGUgdGltZXIgZm9yIGVhY2ggY2xpY2ssIG9ubHkgaWYgdGhlcmUgaXMgbm8gY3VycmVudGx5IGFjdGl2ZSB0aW1lcjwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLmV4aGF1c3RNYXAoKGV2KSA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwfVxuICogQHNlZSB7QGxpbmsgZXhoYXVzdH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlTWFwfVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwfVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24odmFsdWU6IFQsID9pbmRleDogbnVtYmVyKTogT2JzZXJ2YWJsZX0gcHJvamVjdCBBIGZ1bmN0aW9uXG4gKiB0aGF0LCB3aGVuIGFwcGxpZWQgdG8gYW4gaXRlbSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgcmV0dXJucyBhblxuICogT2JzZXJ2YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ob3V0ZXJWYWx1ZTogVCwgaW5uZXJWYWx1ZTogSSwgb3V0ZXJJbmRleDogbnVtYmVyLCBpbm5lckluZGV4OiBudW1iZXIpOiBhbnl9IFtyZXN1bHRTZWxlY3Rvcl1cbiAqIEEgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdmFsdWUgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZXNcbiAqIGFuZCB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIChvdXRlcikgZW1pc3Npb24gYW5kIHRoZSBpbm5lciBPYnNlcnZhYmxlXG4gKiBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBhcmU6XG4gKiAtIGBvdXRlclZhbHVlYDogdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBzb3VyY2VcbiAqIC0gYGlubmVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiAtIGBvdXRlckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJJbmRleGA6IHRoZSBcImluZGV4XCIgb2YgdGhlIHZhbHVlIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIGNvbnRhaW5pbmcgcHJvamVjdGVkIE9ic2VydmFibGVzXG4gKiBvZiBlYWNoIGl0ZW0gb2YgdGhlIHNvdXJjZSwgaWdub3JpbmcgcHJvamVjdGVkIE9ic2VydmFibGVzIHRoYXQgc3RhcnQgYmVmb3JlXG4gKiB0aGVpciBwcmVjZWRpbmcgT2JzZXJ2YWJsZSBoYXMgY29tcGxldGVkLlxuICogQG1ldGhvZCBleGhhdXN0TWFwXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBleGhhdXN0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgU3dpdGNoRmlyc3RNYXBPcGVyYXRvcihwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikpO1xufVxuZXhwb3J0cy5leGhhdXN0TWFwID0gZXhoYXVzdE1hcDtcbnZhciBTd2l0Y2hGaXJzdE1hcE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTd2l0Y2hGaXJzdE1hcE9wZXJhdG9yKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICB9XG4gICAgU3dpdGNoRmlyc3RNYXBPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaEZpcnN0TWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMucmVzdWx0U2VsZWN0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBTd2l0Y2hGaXJzdE1hcE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU3dpdGNoRmlyc3RNYXBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3dpdGNoRmlyc3RNYXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN3aXRjaEZpcnN0TWFwU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJvamVjdCwgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuaGFzU3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBTd2l0Y2hGaXJzdE1hcFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudHJ5TmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN3aXRjaEZpcnN0TWFwU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5TmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wcm9qZWN0KHZhbHVlLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCwgdmFsdWUsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3dpdGNoRmlyc3RNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTd2l0Y2hGaXJzdE1hcFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcmVzdWx0U2VsZWN0b3IgPSBfYS5yZXN1bHRTZWxlY3RvciwgZGVzdGluYXRpb24gPSBfYS5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnRyeVNlbGVjdFJlc3VsdChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN3aXRjaEZpcnN0TWFwU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5U2VsZWN0UmVzdWx0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcmVzdWx0U2VsZWN0b3IgPSBfYS5yZXN1bHRTZWxlY3RvciwgZGVzdGluYXRpb24gPSBfYS5kZXN0aW5hdGlvbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRTZWxlY3RvcihvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTd2l0Y2hGaXJzdE1hcFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfTtcbiAgICBTd2l0Y2hGaXJzdE1hcFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGlubmVyU3ViKTtcbiAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29tcGxldGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTd2l0Y2hGaXJzdE1hcFN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhoYXVzdE1hcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9leGhhdXN0TWFwLmpzXG4vLyBtb2R1bGUgaWQgPSA1MDdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1085. /***/ },
  1086. /* 508 */
  1087. /***/ function(module, exports, __webpack_require__) {
  1088. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar expand_1 = __webpack_require__(509);\nObservable_1.Observable.prototype.expand = expand_1.expand;\n//# sourceMappingURL=expand.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9leHBhbmQuanM/NGNmOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZXhwYW5kXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9leHBhbmQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5leHBhbmQgPSBleHBhbmRfMS5leHBhbmQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBhbmQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2V4cGFuZC5qc1xuLy8gbW9kdWxlIGlkID0gNTA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1089. /***/ },
  1090. /* 509 */
  1091. /***/ function(module, exports, __webpack_require__) {
  1092. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Recursively projects each source value to an Observable which is merged in\n * the output Observable.\n *\n * <span class=\"informal\">It's similar to {@link mergeMap}, but applies the\n * projection function to every source value as well as every output value.\n * It's recursive.</span>\n *\n * <img src=\"./img/expand.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger. *Expand* will re-emit on the output\n * Observable every source value. Then, each output value is given to the\n * `project` function which returns an inner Observable to be merged on the\n * output Observable. Those output values resulting from the projection are also\n * given to the `project` function to produce new output values. This is how\n * *expand* behaves recursively.\n *\n * @example <caption>Start emitting the powers of two on every click, at most 10 of them</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var powersOfTwo = clicks\n * .mapTo(1)\n * .expand(x => Rx.Observable.of(2 * x).delay(1000))\n * .take(10);\n * powersOfTwo.subscribe(x => console.log(x));\n *\n * @see {@link mergeMap}\n * @see {@link mergeScan}\n *\n * @param {function(value: T, index: number) => Observable} project A function\n * that, when applied to an item emitted by the source or the output Observable,\n * returns an Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {Scheduler} [scheduler=null] The Scheduler to use for subscribing to\n * each projected inner Observable.\n * @return {Observable} An Observable that emits the source values and also\n * result of applying the projection function to each value emitted on the\n * output Observable and and merging the results of the Observables obtained\n * from this transformation.\n * @method expand\n * @owner Observable\n */\nfunction expand(project, concurrent, scheduler) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n if (scheduler === void 0) { scheduler = undefined; }\n concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n return this.lift(new ExpandOperator(project, concurrent, scheduler));\n}\nexports.expand = expand;\nvar ExpandOperator = (function () {\n function ExpandOperator(project, concurrent, scheduler) {\n this.project = project;\n this.concurrent = concurrent;\n this.scheduler = scheduler;\n }\n ExpandOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));\n };\n return ExpandOperator;\n}());\nexports.ExpandOperator = ExpandOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ExpandSubscriber = (function (_super) {\n __extends(ExpandSubscriber, _super);\n function ExpandSubscriber(destination, project, concurrent, scheduler) {\n _super.call(this, destination);\n this.project = project;\n this.concurrent = concurrent;\n this.scheduler = scheduler;\n this.index = 0;\n this.active = 0;\n this.hasCompleted = false;\n if (concurrent < Number.POSITIVE_INFINITY) {\n this.buffer = [];\n }\n }\n ExpandSubscriber.dispatch = function (arg) {\n var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;\n subscriber.subscribeToProjection(result, value, index);\n };\n ExpandSubscriber.prototype._next = function (value) {\n var destination = this.destination;\n if (destination.closed) {\n this._complete();\n return;\n }\n var index = this.index++;\n if (this.active < this.concurrent) {\n destination.next(value);\n var result = tryCatch_1.tryCatch(this.project)(value, index);\n if (result === errorObject_1.errorObject) {\n destination.error(errorObject_1.errorObject.e);\n }\n else if (!this.scheduler) {\n this.subscribeToProjection(result, value, index);\n }\n else {\n var state = { subscriber: this, result: result, value: value, index: index };\n this.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));\n }\n }\n else {\n this.buffer.push(value);\n }\n };\n ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {\n this.active++;\n this.add(subscribeToResult_1.subscribeToResult(this, result, value, index));\n };\n ExpandSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.hasCompleted && this.active === 0) {\n this.destination.complete();\n }\n };\n ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this._next(innerValue);\n };\n ExpandSubscriber.prototype.notifyComplete = function (innerSub) {\n var buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer && buffer.length > 0) {\n this._next(buffer.shift());\n }\n if (this.hasCompleted && this.active === 0) {\n this.destination.complete();\n }\n };\n return ExpandSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.ExpandSubscriber = ExpandSubscriber;\n//# sourceMappingURL=expand.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2V4cGFuZC5qcz80YTMwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBSZWN1cnNpdmVseSBwcm9qZWN0cyBlYWNoIHNvdXJjZSB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlIHdoaWNoIGlzIG1lcmdlZCBpblxuICogdGhlIG91dHB1dCBPYnNlcnZhYmxlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5JdCdzIHNpbWlsYXIgdG8ge0BsaW5rIG1lcmdlTWFwfSwgYnV0IGFwcGxpZXMgdGhlXG4gKiBwcm9qZWN0aW9uIGZ1bmN0aW9uIHRvIGV2ZXJ5IHNvdXJjZSB2YWx1ZSBhcyB3ZWxsIGFzIGV2ZXJ5IG91dHB1dCB2YWx1ZS5cbiAqIEl0J3MgcmVjdXJzaXZlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2V4cGFuZC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBpdGVtcyBiYXNlZCBvbiBhcHBseWluZyBhIGZ1bmN0aW9uIHRoYXQgeW91XG4gKiBzdXBwbHkgdG8gZWFjaCBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCB3aGVyZSB0aGF0IGZ1bmN0aW9uXG4gKiByZXR1cm5zIGFuIE9ic2VydmFibGUsIGFuZCB0aGVuIG1lcmdpbmcgdGhvc2UgcmVzdWx0aW5nIE9ic2VydmFibGVzIGFuZFxuICogZW1pdHRpbmcgdGhlIHJlc3VsdHMgb2YgdGhpcyBtZXJnZXIuICpFeHBhbmQqIHdpbGwgcmUtZW1pdCBvbiB0aGUgb3V0cHV0XG4gKiBPYnNlcnZhYmxlIGV2ZXJ5IHNvdXJjZSB2YWx1ZS4gVGhlbiwgZWFjaCBvdXRwdXQgdmFsdWUgaXMgZ2l2ZW4gdG8gdGhlXG4gKiBgcHJvamVjdGAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBpbm5lciBPYnNlcnZhYmxlIHRvIGJlIG1lcmdlZCBvbiB0aGVcbiAqIG91dHB1dCBPYnNlcnZhYmxlLiBUaG9zZSBvdXRwdXQgdmFsdWVzIHJlc3VsdGluZyBmcm9tIHRoZSBwcm9qZWN0aW9uIGFyZSBhbHNvXG4gKiBnaXZlbiB0byB0aGUgYHByb2plY3RgIGZ1bmN0aW9uIHRvIHByb2R1Y2UgbmV3IG91dHB1dCB2YWx1ZXMuIFRoaXMgaXMgaG93XG4gKiAqZXhwYW5kKiBiZWhhdmVzIHJlY3Vyc2l2ZWx5LlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlN0YXJ0IGVtaXR0aW5nIHRoZSBwb3dlcnMgb2YgdHdvIG9uIGV2ZXJ5IGNsaWNrLCBhdCBtb3N0IDEwIG9mIHRoZW08L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHBvd2Vyc09mVHdvID0gY2xpY2tzXG4gKiAgIC5tYXBUbygxKVxuICogICAuZXhwYW5kKHggPT4gUnguT2JzZXJ2YWJsZS5vZigyICogeCkuZGVsYXkoMTAwMCkpXG4gKiAgIC50YWtlKDEwKTtcbiAqIHBvd2Vyc09mVHdvLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBtZXJnZU1hcH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlU2Nhbn1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBPYnNlcnZhYmxlfSBwcm9qZWN0IEEgZnVuY3Rpb25cbiAqIHRoYXQsIHdoZW4gYXBwbGllZCB0byBhbiBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBvciB0aGUgb3V0cHV0IE9ic2VydmFibGUsXG4gKiByZXR1cm5zIGFuIE9ic2VydmFibGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmN1cnJlbnQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXSBNYXhpbXVtIG51bWJlciBvZiBpbnB1dFxuICogT2JzZXJ2YWJsZXMgYmVpbmcgc3Vic2NyaWJlZCB0byBjb25jdXJyZW50bHkuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1udWxsXSBUaGUgU2NoZWR1bGVyIHRvIHVzZSBmb3Igc3Vic2NyaWJpbmcgdG9cbiAqIGVhY2ggcHJvamVjdGVkIGlubmVyIE9ic2VydmFibGUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHNvdXJjZSB2YWx1ZXMgYW5kIGFsc29cbiAqIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgcHJvamVjdGlvbiBmdW5jdGlvbiB0byBlYWNoIHZhbHVlIGVtaXR0ZWQgb24gdGhlXG4gKiBvdXRwdXQgT2JzZXJ2YWJsZSBhbmQgYW5kIG1lcmdpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIE9ic2VydmFibGVzIG9idGFpbmVkXG4gKiBmcm9tIHRoaXMgdHJhbnNmb3JtYXRpb24uXG4gKiBAbWV0aG9kIGV4cGFuZFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZXhwYW5kKHByb2plY3QsIGNvbmN1cnJlbnQsIHNjaGVkdWxlcikge1xuICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHsgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgeyBzY2hlZHVsZXIgPSB1bmRlZmluZWQ7IH1cbiAgICBjb25jdXJyZW50ID0gKGNvbmN1cnJlbnQgfHwgMCkgPCAxID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogY29uY3VycmVudDtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBFeHBhbmRPcGVyYXRvcihwcm9qZWN0LCBjb25jdXJyZW50LCBzY2hlZHVsZXIpKTtcbn1cbmV4cG9ydHMuZXhwYW5kID0gZXhwYW5kO1xudmFyIEV4cGFuZE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHBhbmRPcGVyYXRvcihwcm9qZWN0LCBjb25jdXJyZW50LCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIEV4cGFuZE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRXhwYW5kU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMuY29uY3VycmVudCwgdGhpcy5zY2hlZHVsZXIpKTtcbiAgICB9O1xuICAgIHJldHVybiBFeHBhbmRPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLkV4cGFuZE9wZXJhdG9yID0gRXhwYW5kT3BlcmF0b3I7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEV4cGFuZFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHBhbmRTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEV4cGFuZFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByb2plY3QsIGNvbmN1cnJlbnQsIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoY29uY3VycmVudCA8IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBFeHBhbmRTdWJzY3JpYmVyLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICB2YXIgc3Vic2NyaWJlciA9IGFyZy5zdWJzY3JpYmVyLCByZXN1bHQgPSBhcmcucmVzdWx0LCB2YWx1ZSA9IGFyZy52YWx1ZSwgaW5kZXggPSBhcmcuaW5kZXg7XG4gICAgICAgIHN1YnNjcmliZXIuc3Vic2NyaWJlVG9Qcm9qZWN0aW9uKHJlc3VsdCwgdmFsdWUsIGluZGV4KTtcbiAgICB9O1xuICAgIEV4cGFuZFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleCsrO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgPCB0aGlzLmNvbmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godGhpcy5wcm9qZWN0KSh2YWx1ZSwgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zY2hlZHVsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvUHJvamVjdGlvbihyZXN1bHQsIHZhbHVlLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSB7IHN1YnNjcmliZXI6IHRoaXMsIHJlc3VsdDogcmVzdWx0LCB2YWx1ZTogdmFsdWUsIGluZGV4OiBpbmRleCB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKEV4cGFuZFN1YnNjcmliZXIuZGlzcGF0Y2gsIDAsIHN0YXRlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXhwYW5kU3Vic2NyaWJlci5wcm90b3R5cGUuc3Vic2NyaWJlVG9Qcm9qZWN0aW9uID0gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuYWN0aXZlKys7XG4gICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgcmVzdWx0LCB2YWx1ZSwgaW5kZXgpKTtcbiAgICB9O1xuICAgIEV4cGFuZFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQgJiYgdGhpcy5hY3RpdmUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXhwYW5kU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLl9uZXh0KGlubmVyVmFsdWUpO1xuICAgIH07XG4gICAgRXhwYW5kU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLnJlbW92ZShpbm5lclN1Yik7XG4gICAgICAgIHRoaXMuYWN0aXZlLS07XG4gICAgICAgIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX25leHQoYnVmZmVyLnNoaWZ0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBsZXRlZCAmJiB0aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRXhwYW5kU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnRzLkV4cGFuZFN1YnNjcmliZXIgPSBFeHBhbmRTdWJzY3JpYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwYW5kLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2V4cGFuZC5qc1xuLy8gbW9kdWxlIGlkID0gNTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1093. /***/ },
  1094. /* 510 */
  1095. /***/ function(module, exports, __webpack_require__) {
  1096. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar elementAt_1 = __webpack_require__(511);\nObservable_1.Observable.prototype.elementAt = elementAt_1.elementAt;\n//# sourceMappingURL=elementAt.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9lbGVtZW50QXQuanM/NzQwOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZWxlbWVudEF0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9lbGVtZW50QXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5lbGVtZW50QXQgPSBlbGVtZW50QXRfMS5lbGVtZW50QXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbGVtZW50QXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2VsZW1lbnRBdC5qc1xuLy8gbW9kdWxlIGlkID0gNTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1097. /***/ },
  1098. /* 511 */
  1099. /***/ function(module, exports, __webpack_require__) {
  1100. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar ArgumentOutOfRangeError_1 = __webpack_require__(512);\n/**\n * Emits the single value at the specified `index` in a sequence of emissions\n * from the source Observable.\n *\n * <span class=\"informal\">Emits only the i-th value, then completes.</span>\n *\n * <img src=\"./img/elementAt.png\" width=\"100%\">\n *\n * `elementAt` returns an Observable that emits the item at the specified\n * `index` in the source Observable, or a default value if that `index` is out\n * of range and the `default` argument is provided. If the `default` argument is\n * not given and the `index` is out of range, the output Observable will emit an\n * `ArgumentOutOfRangeError` error.\n *\n * @example <caption>Emit only the third click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.elementAt(2);\n * result.subscribe(x => console.log(x));\n *\n * // Results in:\n * // click 1 = nothing\n * // click 2 = nothing\n * // click 3 = MouseEvent object logged to console\n *\n * @see {@link first}\n * @see {@link last}\n * @see {@link skip}\n * @see {@link single}\n * @see {@link take}\n *\n * @throws {ArgumentOutOfRangeError} When using `elementAt(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0` or the\n * Observable has completed before emitting the i-th `next` notification.\n *\n * @param {number} index Is the number `i` for the i-th source emission that has\n * happened since the subscription, starting from the number `0`.\n * @param {T} [defaultValue] The default value returned for missing indices.\n * @return {Observable} An Observable that emits a single item, if it is found.\n * Otherwise, will emit the default value if given. If not, then emits an error.\n * @method elementAt\n * @owner Observable\n */\nfunction elementAt(index, defaultValue) {\n return this.lift(new ElementAtOperator(index, defaultValue));\n}\nexports.elementAt = elementAt;\nvar ElementAtOperator = (function () {\n function ElementAtOperator(index, defaultValue) {\n this.index = index;\n this.defaultValue = defaultValue;\n if (index < 0) {\n throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n }\n }\n ElementAtOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ElementAtSubscriber(subscriber, this.index, this.defaultValue));\n };\n return ElementAtOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ElementAtSubscriber = (function (_super) {\n __extends(ElementAtSubscriber, _super);\n function ElementAtSubscriber(destination, index, defaultValue) {\n _super.call(this, destination);\n this.index = index;\n this.defaultValue = defaultValue;\n }\n ElementAtSubscriber.prototype._next = function (x) {\n if (this.index-- === 0) {\n this.destination.next(x);\n this.destination.complete();\n }\n };\n ElementAtSubscriber.prototype._complete = function () {\n var destination = this.destination;\n if (this.index >= 0) {\n if (typeof this.defaultValue !== 'undefined') {\n destination.next(this.defaultValue);\n }\n else {\n destination.error(new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError);\n }\n }\n destination.complete();\n };\n return ElementAtSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=elementAt.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2VsZW1lbnRBdC5qcz8yYWQ2Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yXzEgPSByZXF1aXJlKCcuLi91dGlsL0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJyk7XG4vKipcbiAqIEVtaXRzIHRoZSBzaW5nbGUgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgIGluIGEgc2VxdWVuY2Ugb2YgZW1pc3Npb25zXG4gKiBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+RW1pdHMgb25seSB0aGUgaS10aCB2YWx1ZSwgdGhlbiBjb21wbGV0ZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZWxlbWVudEF0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBlbGVtZW50QXRgIHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWRcbiAqIGBpbmRleGAgaW4gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCBvciBhIGRlZmF1bHQgdmFsdWUgaWYgdGhhdCBgaW5kZXhgIGlzIG91dFxuICogb2YgcmFuZ2UgYW5kIHRoZSBgZGVmYXVsdGAgYXJndW1lbnQgaXMgcHJvdmlkZWQuIElmIHRoZSBgZGVmYXVsdGAgYXJndW1lbnQgaXNcbiAqIG5vdCBnaXZlbiBhbmQgdGhlIGBpbmRleGAgaXMgb3V0IG9mIHJhbmdlLCB0aGUgb3V0cHV0IE9ic2VydmFibGUgd2lsbCBlbWl0IGFuXG4gKiBgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JgIGVycm9yLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgb25seSB0aGUgdGhpcmQgY2xpY2sgZXZlbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5lbGVtZW50QXQoMik7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIC8vIFJlc3VsdHMgaW46XG4gKiAvLyBjbGljayAxID0gbm90aGluZ1xuICogLy8gY2xpY2sgMiA9IG5vdGhpbmdcbiAqIC8vIGNsaWNrIDMgPSBNb3VzZUV2ZW50IG9iamVjdCBsb2dnZWQgdG8gY29uc29sZVxuICpcbiAqIEBzZWUge0BsaW5rIGZpcnN0fVxuICogQHNlZSB7QGxpbmsgbGFzdH1cbiAqIEBzZWUge0BsaW5rIHNraXB9XG4gKiBAc2VlIHtAbGluayBzaW5nbGV9XG4gKiBAc2VlIHtAbGluayB0YWtlfVxuICpcbiAqIEB0aHJvd3Mge0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yfSBXaGVuIHVzaW5nIGBlbGVtZW50QXQoaSlgLCBpdCBkZWxpdmVycyBhblxuICogQXJndW1lbnRPdXRPclJhbmdlRXJyb3IgdG8gdGhlIE9ic2VydmVyJ3MgYGVycm9yYCBjYWxsYmFjayBpZiBgaSA8IDBgIG9yIHRoZVxuICogT2JzZXJ2YWJsZSBoYXMgY29tcGxldGVkIGJlZm9yZSBlbWl0dGluZyB0aGUgaS10aCBgbmV4dGAgbm90aWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJcyB0aGUgbnVtYmVyIGBpYCBmb3IgdGhlIGktdGggc291cmNlIGVtaXNzaW9uIHRoYXQgaGFzXG4gKiBoYXBwZW5lZCBzaW5jZSB0aGUgc3Vic2NyaXB0aW9uLCBzdGFydGluZyBmcm9tIHRoZSBudW1iZXIgYDBgLlxuICogQHBhcmFtIHtUfSBbZGVmYXVsdFZhbHVlXSBUaGUgZGVmYXVsdCB2YWx1ZSByZXR1cm5lZCBmb3IgbWlzc2luZyBpbmRpY2VzLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgc2luZ2xlIGl0ZW0sIGlmIGl0IGlzIGZvdW5kLlxuICogT3RoZXJ3aXNlLCB3aWxsIGVtaXQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgZ2l2ZW4uIElmIG5vdCwgdGhlbiBlbWl0cyBhbiBlcnJvci5cbiAqIEBtZXRob2QgZWxlbWVudEF0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBlbGVtZW50QXQoaW5kZXgsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEVsZW1lbnRBdE9wZXJhdG9yKGluZGV4LCBkZWZhdWx0VmFsdWUpKTtcbn1cbmV4cG9ydHMuZWxlbWVudEF0ID0gZWxlbWVudEF0O1xudmFyIEVsZW1lbnRBdE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbGVtZW50QXRPcGVyYXRvcihpbmRleCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIEVsZW1lbnRBdE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRWxlbWVudEF0U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmluZGV4LCB0aGlzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRBdE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgRWxlbWVudEF0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVsZW1lbnRBdFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRWxlbWVudEF0U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgaW5kZXgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIEVsZW1lbnRBdFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXgtLSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHgpO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbGVtZW50QXRTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGlmICh0aGlzLmluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JfMS5Bcmd1bWVudE91dE9mUmFuZ2VFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIHJldHVybiBFbGVtZW50QXRTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxlbWVudEF0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2VsZW1lbnRBdC5qc1xuLy8gbW9kdWxlIGlkID0gNTExXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1101. /***/ },
  1102. /* 512 */
  1103. /***/ function(module, exports) {
  1104. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when an element was queried at a certain index of an\n * Observable, but no such index or position exists in that sequence.\n *\n * @see {@link elementAt}\n * @see {@link take}\n * @see {@link takeLast}\n *\n * @class ArgumentOutOfRangeError\n */\nvar ArgumentOutOfRangeError = (function (_super) {\n __extends(ArgumentOutOfRangeError, _super);\n function ArgumentOutOfRangeError() {\n var err = _super.call(this, 'argument out of range');\n this.name = err.name = 'ArgumentOutOfRangeError';\n this.stack = err.stack;\n this.message = err.message;\n }\n return ArgumentOutOfRangeError;\n}(Error));\nexports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;\n//# sourceMappingURL=ArgumentOutOfRangeError.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IuanM/MTM5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhbiBlbGVtZW50IHdhcyBxdWVyaWVkIGF0IGEgY2VydGFpbiBpbmRleCBvZiBhblxuICogT2JzZXJ2YWJsZSwgYnV0IG5vIHN1Y2ggaW5kZXggb3IgcG9zaXRpb24gZXhpc3RzIGluIHRoYXQgc2VxdWVuY2UuXG4gKlxuICogQHNlZSB7QGxpbmsgZWxlbWVudEF0fVxuICogQHNlZSB7QGxpbmsgdGFrZX1cbiAqIEBzZWUge0BsaW5rIHRha2VMYXN0fVxuICpcbiAqIEBjbGFzcyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvclxuICovXG52YXIgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBcmd1bWVudE91dE9mUmFuZ2VFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcigpIHtcbiAgICAgICAgdmFyIGVyciA9IF9zdXBlci5jYWxsKHRoaXMsICdhcmd1bWVudCBvdXQgb2YgcmFuZ2UnKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZXJyLm5hbWUgPSAnQXJndW1lbnRPdXRPZlJhbmdlRXJyb3InO1xuICAgICAgICB0aGlzLnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0cy5Bcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXJndW1lbnRPdXRPZlJhbmdlRXJyb3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvci5qc1xuLy8gbW9kdWxlIGlkID0gNTEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1105. /***/ },
  1106. /* 513 */
  1107. /***/ function(module, exports, __webpack_require__) {
  1108. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar filter_1 = __webpack_require__(61);\nObservable_1.Observable.prototype.filter = filter_1.filter;\n//# sourceMappingURL=filter.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9maWx0ZXIuanM/NWFmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZmlsdGVyXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9maWx0ZXInKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5maWx0ZXIgPSBmaWx0ZXJfMS5maWx0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWx0ZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2ZpbHRlci5qc1xuLy8gbW9kdWxlIGlkID0gNTEzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1109. /***/ },
  1110. /* 514 */
  1111. /***/ function(module, exports, __webpack_require__) {
  1112. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar finally_1 = __webpack_require__(515);\nObservable_1.Observable.prototype.finally = finally_1._finally;\nObservable_1.Observable.prototype._finally = finally_1._finally;\n//# sourceMappingURL=finally.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9maW5hbGx5LmpzP2E5ZDAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGZpbmFsbHlfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2ZpbmFsbHknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5maW5hbGx5ID0gZmluYWxseV8xLl9maW5hbGx5O1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUucHJvdG90eXBlLl9maW5hbGx5ID0gZmluYWxseV8xLl9maW5hbGx5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmluYWxseS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZmluYWxseS5qc1xuLy8gbW9kdWxlIGlkID0gNTE0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1113. /***/ },
  1114. /* 515 */
  1115. /***/ function(module, exports, __webpack_require__) {
  1116. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Subscription_1 = __webpack_require__(11);\n/**\n * Returns an Observable that mirrors the source Observable, but will call a specified function when\n * the source terminates on complete or error.\n * @param {function} callback function to be called when source terminates.\n * @return {Observable} an Observable that mirrors the source, but will call the specified function on termination.\n * @method finally\n * @owner Observable\n */\nfunction _finally(callback) {\n return this.lift(new FinallyOperator(callback));\n}\nexports._finally = _finally;\nvar FinallyOperator = (function () {\n function FinallyOperator(callback) {\n this.callback = callback;\n }\n FinallyOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new FinallySubscriber(subscriber, this.callback));\n };\n return FinallyOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FinallySubscriber = (function (_super) {\n __extends(FinallySubscriber, _super);\n function FinallySubscriber(destination, callback) {\n _super.call(this, destination);\n this.add(new Subscription_1.Subscription(callback));\n }\n return FinallySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=finally.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2ZpbmFsbHkuanM/NDU5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBtaXJyb3JzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgYnV0IHdpbGwgY2FsbCBhIHNwZWNpZmllZCBmdW5jdGlvbiB3aGVuXG4gKiB0aGUgc291cmNlIHRlcm1pbmF0ZXMgb24gY29tcGxldGUgb3IgZXJyb3IuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBzb3VyY2UgdGVybWluYXRlcy5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBtaXJyb3JzIHRoZSBzb3VyY2UsIGJ1dCB3aWxsIGNhbGwgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvbiB0ZXJtaW5hdGlvbi5cbiAqIEBtZXRob2QgZmluYWxseVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gX2ZpbmFsbHkoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBGaW5hbGx5T3BlcmF0b3IoY2FsbGJhY2spKTtcbn1cbmV4cG9ydHMuX2ZpbmFsbHkgPSBfZmluYWxseTtcbnZhciBGaW5hbGx5T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpbmFsbHlPcGVyYXRvcihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIEZpbmFsbHlPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbmFsbHlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY2FsbGJhY2spKTtcbiAgICB9O1xuICAgIHJldHVybiBGaW5hbGx5T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBGaW5hbGx5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpbmFsbHlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbmFsbHlTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjYWxsYmFjaykge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuYWRkKG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oY2FsbGJhY2spKTtcbiAgICB9XG4gICAgcmV0dXJuIEZpbmFsbHlTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmluYWxseS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9maW5hbGx5LmpzXG4vLyBtb2R1bGUgaWQgPSA1MTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1117. /***/ },
  1118. /* 516 */
  1119. /***/ function(module, exports, __webpack_require__) {
  1120. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar find_1 = __webpack_require__(517);\nObservable_1.Observable.prototype.find = find_1.find;\n//# sourceMappingURL=find.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9maW5kLmpzPzdkNDciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGZpbmRfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2ZpbmQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5maW5kID0gZmluZF8xLmZpbmQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maW5kLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9maW5kLmpzXG4vLyBtb2R1bGUgaWQgPSA1MTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1121. /***/ },
  1122. /* 517 */
  1123. /***/ function(module, exports, __webpack_require__) {
  1124. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Emits only the first value emitted by the source Observable that meets some\n * condition.\n *\n * <span class=\"informal\">Finds the first value that passes some test and emits\n * that.</span>\n *\n * <img src=\"./img/find.png\" width=\"100%\">\n *\n * `find` searches for the first item in the source Observable that matches the\n * specified condition embodied by the `predicate`, and returns the first\n * occurrence in the source. Unlike {@link first}, the `predicate` is required\n * in `find`, and does not emit an error if a valid value is not found.\n *\n * @example <caption>Find and emit the first click that happens on a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.find(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link first}\n * @see {@link findIndex}\n * @see {@link take}\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate\n * A function called with each item to test for condition matching.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable<T>} An Observable of the first item that matches the\n * condition.\n * @method find\n * @owner Observable\n */\nfunction find(predicate, thisArg) {\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate is not a function');\n }\n return this.lift(new FindValueOperator(predicate, this, false, thisArg));\n}\nexports.find = find;\nvar FindValueOperator = (function () {\n function FindValueOperator(predicate, source, yieldIndex, thisArg) {\n this.predicate = predicate;\n this.source = source;\n this.yieldIndex = yieldIndex;\n this.thisArg = thisArg;\n }\n FindValueOperator.prototype.call = function (observer, source) {\n return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));\n };\n return FindValueOperator;\n}());\nexports.FindValueOperator = FindValueOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar FindValueSubscriber = (function (_super) {\n __extends(FindValueSubscriber, _super);\n function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.source = source;\n this.yieldIndex = yieldIndex;\n this.thisArg = thisArg;\n this.index = 0;\n }\n FindValueSubscriber.prototype.notifyComplete = function (value) {\n var destination = this.destination;\n destination.next(value);\n destination.complete();\n };\n FindValueSubscriber.prototype._next = function (value) {\n var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;\n var index = this.index++;\n try {\n var result = predicate.call(thisArg || this, value, index, this.source);\n if (result) {\n this.notifyComplete(this.yieldIndex ? index : value);\n }\n }\n catch (err) {\n this.destination.error(err);\n }\n };\n FindValueSubscriber.prototype._complete = function () {\n this.notifyComplete(this.yieldIndex ? -1 : undefined);\n };\n return FindValueSubscriber;\n}(Subscriber_1.Subscriber));\nexports.FindValueSubscriber = FindValueSubscriber;\n//# sourceMappingURL=find.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2ZpbmQuanM/NWFhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBFbWl0cyBvbmx5IHRoZSBmaXJzdCB2YWx1ZSBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0aGF0IG1lZXRzIHNvbWVcbiAqIGNvbmRpdGlvbi5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+RmluZHMgdGhlIGZpcnN0IHZhbHVlIHRoYXQgcGFzc2VzIHNvbWUgdGVzdCBhbmQgZW1pdHNcbiAqIHRoYXQuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZmluZC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgZmluZGAgc2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0aGF0IG1hdGNoZXMgdGhlXG4gKiBzcGVjaWZpZWQgY29uZGl0aW9uIGVtYm9kaWVkIGJ5IHRoZSBgcHJlZGljYXRlYCwgYW5kIHJldHVybnMgdGhlIGZpcnN0XG4gKiBvY2N1cnJlbmNlIGluIHRoZSBzb3VyY2UuIFVubGlrZSB7QGxpbmsgZmlyc3R9LCB0aGUgYHByZWRpY2F0ZWAgaXMgcmVxdWlyZWRcbiAqIGluIGBmaW5kYCwgYW5kIGRvZXMgbm90IGVtaXQgYW4gZXJyb3IgaWYgYSB2YWxpZCB2YWx1ZSBpcyBub3QgZm91bmQuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RmluZCBhbmQgZW1pdCB0aGUgZmlyc3QgY2xpY2sgdGhhdCBoYXBwZW5zIG9uIGEgRElWIGVsZW1lbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5maW5kKGV2ID0+IGV2LnRhcmdldC50YWdOYW1lID09PSAnRElWJyk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGZpbHRlcn1cbiAqIEBzZWUge0BsaW5rIGZpcnN0fVxuICogQHNlZSB7QGxpbmsgZmluZEluZGV4fVxuICogQHNlZSB7QGxpbmsgdGFrZX1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBib29sZWFufSBwcmVkaWNhdGVcbiAqIEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggZWFjaCBpdGVtIHRvIHRlc3QgZm9yIGNvbmRpdGlvbiBtYXRjaGluZy5cbiAqIEBwYXJhbSB7YW55fSBbdGhpc0FyZ10gQW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBgdGhpc2BcbiAqIGluIHRoZSBgcHJlZGljYXRlYCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgb2YgdGhlIGZpcnN0IGl0ZW0gdGhhdCBtYXRjaGVzIHRoZVxuICogY29uZGl0aW9uLlxuICogQG1ldGhvZCBmaW5kXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBGaW5kVmFsdWVPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXMsIGZhbHNlLCB0aGlzQXJnKSk7XG59XG5leHBvcnRzLmZpbmQgPSBmaW5kO1xudmFyIEZpbmRWYWx1ZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaW5kVmFsdWVPcGVyYXRvcihwcmVkaWNhdGUsIHNvdXJjZSwgeWllbGRJbmRleCwgdGhpc0FyZykge1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMueWllbGRJbmRleCA9IHlpZWxkSW5kZXg7XG4gICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgfVxuICAgIEZpbmRWYWx1ZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbmRWYWx1ZVN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnNvdXJjZSwgdGhpcy55aWVsZEluZGV4LCB0aGlzLnRoaXNBcmcpKTtcbiAgICB9O1xuICAgIHJldHVybiBGaW5kVmFsdWVPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLkZpbmRWYWx1ZU9wZXJhdG9yID0gRmluZFZhbHVlT3BlcmF0b3I7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEZpbmRWYWx1ZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaW5kVmFsdWVTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbmRWYWx1ZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByZWRpY2F0ZSwgc291cmNlLCB5aWVsZEluZGV4LCB0aGlzQXJnKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnlpZWxkSW5kZXggPSB5aWVsZEluZGV4O1xuICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgRmluZFZhbHVlU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBGaW5kVmFsdWVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcmVkaWNhdGUgPSBfYS5wcmVkaWNhdGUsIHRoaXNBcmcgPSBfYS50aGlzQXJnO1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gcHJlZGljYXRlLmNhbGwodGhpc0FyZyB8fCB0aGlzLCB2YWx1ZSwgaW5kZXgsIHRoaXMuc291cmNlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNvbXBsZXRlKHRoaXMueWllbGRJbmRleCA/IGluZGV4IDogdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRmluZFZhbHVlU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeUNvbXBsZXRlKHRoaXMueWllbGRJbmRleCA/IC0xIDogdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIHJldHVybiBGaW5kVmFsdWVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5GaW5kVmFsdWVTdWJzY3JpYmVyID0gRmluZFZhbHVlU3Vic2NyaWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbmQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvZmluZC5qc1xuLy8gbW9kdWxlIGlkID0gNTE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1125. /***/ },
  1126. /* 518 */
  1127. /***/ function(module, exports, __webpack_require__) {
  1128. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar findIndex_1 = __webpack_require__(519);\nObservable_1.Observable.prototype.findIndex = findIndex_1.findIndex;\n//# sourceMappingURL=findIndex.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9maW5kSW5kZXguanM/OTViMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgZmluZEluZGV4XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9maW5kSW5kZXgnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5maW5kSW5kZXggPSBmaW5kSW5kZXhfMS5maW5kSW5kZXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maW5kSW5kZXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2ZpbmRJbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1129. /***/ },
  1130. /* 519 */
  1131. /***/ function(module, exports, __webpack_require__) {
  1132. eval("\"use strict\";\nvar find_1 = __webpack_require__(517);\n/**\n * Emits only the index of the first value emitted by the source Observable that\n * meets some condition.\n *\n * <span class=\"informal\">It's like {@link find}, but emits the index of the\n * found value, not the value itself.</span>\n *\n * <img src=\"./img/findIndex.png\" width=\"100%\">\n *\n * `findIndex` searches for the first item in the source Observable that matches\n * the specified condition embodied by the `predicate`, and returns the\n * (zero-based) index of the first occurrence in the source. Unlike\n * {@link first}, the `predicate` is required in `findIndex`, and does not emit\n * an error if a valid value is not found.\n *\n * @example <caption>Emit the index of first click that happens on a DIV element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.findIndex(ev => ev.target.tagName === 'DIV');\n * result.subscribe(x => console.log(x));\n *\n * @see {@link filter}\n * @see {@link find}\n * @see {@link first}\n * @see {@link take}\n *\n * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate\n * A function called with each item to test for condition matching.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of the index of the first item that\n * matches the condition.\n * @method find\n * @owner Observable\n */\nfunction findIndex(predicate, thisArg) {\n return this.lift(new find_1.FindValueOperator(predicate, this, true, thisArg));\n}\nexports.findIndex = findIndex;\n//# sourceMappingURL=findIndex.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2ZpbmRJbmRleC5qcz8xYjI0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIGZpbmRfMSA9IHJlcXVpcmUoJy4vZmluZCcpO1xuLyoqXG4gKiBFbWl0cyBvbmx5IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdmFsdWUgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgdGhhdFxuICogbWVldHMgc29tZSBjb25kaXRpb24uXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgZmluZH0sIGJ1dCBlbWl0cyB0aGUgaW5kZXggb2YgdGhlXG4gKiBmb3VuZCB2YWx1ZSwgbm90IHRoZSB2YWx1ZSBpdHNlbGYuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvZmluZEluZGV4LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBmaW5kSW5kZXhgIHNlYXJjaGVzIGZvciB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgc291cmNlIE9ic2VydmFibGUgdGhhdCBtYXRjaGVzXG4gKiB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBlbWJvZGllZCBieSB0aGUgYHByZWRpY2F0ZWAsIGFuZCByZXR1cm5zIHRoZVxuICogKHplcm8tYmFzZWQpIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGluIHRoZSBzb3VyY2UuIFVubGlrZVxuICoge0BsaW5rIGZpcnN0fSwgdGhlIGBwcmVkaWNhdGVgIGlzIHJlcXVpcmVkIGluIGBmaW5kSW5kZXhgLCBhbmQgZG9lcyBub3QgZW1pdFxuICogYW4gZXJyb3IgaWYgYSB2YWxpZCB2YWx1ZSBpcyBub3QgZm91bmQuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCB0aGUgaW5kZXggb2YgZmlyc3QgY2xpY2sgdGhhdCBoYXBwZW5zIG9uIGEgRElWIGVsZW1lbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5maW5kSW5kZXgoZXYgPT4gZXYudGFyZ2V0LnRhZ05hbWUgPT09ICdESVYnKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgZmlsdGVyfVxuICogQHNlZSB7QGxpbmsgZmluZH1cbiAqIEBzZWUge0BsaW5rIGZpcnN0fVxuICogQHNlZSB7QGxpbmsgdGFrZX1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBib29sZWFufSBwcmVkaWNhdGVcbiAqIEEgZnVuY3Rpb24gY2FsbGVkIHdpdGggZWFjaCBpdGVtIHRvIHRlc3QgZm9yIGNvbmRpdGlvbiBtYXRjaGluZy5cbiAqIEBwYXJhbSB7YW55fSBbdGhpc0FyZ10gQW4gb3B0aW9uYWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSBvZiBgdGhpc2BcbiAqIGluIHRoZSBgcHJlZGljYXRlYCBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgb2YgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtIHRoYXRcbiAqIG1hdGNoZXMgdGhlIGNvbmRpdGlvbi5cbiAqIEBtZXRob2QgZmluZFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IGZpbmRfMS5GaW5kVmFsdWVPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXMsIHRydWUsIHRoaXNBcmcpKTtcbn1cbmV4cG9ydHMuZmluZEluZGV4ID0gZmluZEluZGV4O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmluZEluZGV4LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2ZpbmRJbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1133. /***/ },
  1134. /* 520 */
  1135. /***/ function(module, exports, __webpack_require__) {
  1136. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar first_1 = __webpack_require__(53);\nObservable_1.Observable.prototype.first = first_1.first;\n//# sourceMappingURL=first.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9maXJzdC5qcz84M2U0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBmaXJzdF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZmlyc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5maXJzdCA9IGZpcnN0XzEuZmlyc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXJzdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZmlyc3QuanNcbi8vIG1vZHVsZSBpZCA9IDUyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1137. /***/ },
  1138. /* 521 */
  1139. /***/ function(module, exports, __webpack_require__) {
  1140. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar groupBy_1 = __webpack_require__(522);\nObservable_1.Observable.prototype.groupBy = groupBy_1.groupBy;\n//# sourceMappingURL=groupBy.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9ncm91cEJ5LmpzPzFjNDEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGdyb3VwQnlfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2dyb3VwQnknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5ncm91cEJ5ID0gZ3JvdXBCeV8xLmdyb3VwQnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncm91cEJ5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9ncm91cEJ5LmpzXG4vLyBtb2R1bGUgaWQgPSA1MjFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1141. /***/ },
  1142. /* 522 */
  1143. /***/ function(module, exports, __webpack_require__) {
  1144. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Subscription_1 = __webpack_require__(11);\nvar Observable_1 = __webpack_require__(6);\nvar Subject_1 = __webpack_require__(5);\nvar Map_1 = __webpack_require__(523);\nvar FastMap_1 = __webpack_require__(525);\n/* tslint:disable:max-line-length */\n/**\n * Groups the items emitted by an Observable according to a specified criterion,\n * and emits these grouped items as `GroupedObservables`, one\n * {@link GroupedObservable} per group.\n *\n * <img src=\"./img/groupBy.png\" width=\"100%\">\n *\n * @param {function(value: T): K} keySelector a function that extracts the key\n * for each item.\n * @param {function(value: T): R} [elementSelector] a function that extracts the\n * return element for each item.\n * @param {function(grouped: GroupedObservable<K,R>): Observable<any>} [durationSelector]\n * a function that returns an Observable to determine how long each group should\n * exist.\n * @return {Observable<GroupedObservable<K,R>>} an Observable that emits\n * GroupedObservables, each of which corresponds to a unique key value and each\n * of which emits those items from the source Observable that share that key\n * value.\n * @method groupBy\n * @owner Observable\n */\nfunction groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {\n return this.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));\n}\nexports.groupBy = groupBy;\nvar GroupByOperator = (function () {\n function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {\n this.keySelector = keySelector;\n this.elementSelector = elementSelector;\n this.durationSelector = durationSelector;\n this.subjectSelector = subjectSelector;\n }\n GroupByOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));\n };\n return GroupByOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar GroupBySubscriber = (function (_super) {\n __extends(GroupBySubscriber, _super);\n function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {\n _super.call(this, destination);\n this.keySelector = keySelector;\n this.elementSelector = elementSelector;\n this.durationSelector = durationSelector;\n this.subjectSelector = subjectSelector;\n this.groups = null;\n this.attemptedToUnsubscribe = false;\n this.count = 0;\n }\n GroupBySubscriber.prototype._next = function (value) {\n var key;\n try {\n key = this.keySelector(value);\n }\n catch (err) {\n this.error(err);\n return;\n }\n this._group(value, key);\n };\n GroupBySubscriber.prototype._group = function (value, key) {\n var groups = this.groups;\n if (!groups) {\n groups = this.groups = typeof key === 'string' ? new FastMap_1.FastMap() : new Map_1.Map();\n }\n var group = groups.get(key);\n var element;\n if (this.elementSelector) {\n try {\n element = this.elementSelector(value);\n }\n catch (err) {\n this.error(err);\n }\n }\n else {\n element = value;\n }\n if (!group) {\n group = this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject();\n groups.set(key, group);\n var groupedObservable = new GroupedObservable(key, group, this);\n this.destination.next(groupedObservable);\n if (this.durationSelector) {\n var duration = void 0;\n try {\n duration = this.durationSelector(new GroupedObservable(key, group));\n }\n catch (err) {\n this.error(err);\n return;\n }\n this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));\n }\n }\n if (!group.closed) {\n group.next(element);\n }\n };\n GroupBySubscriber.prototype._error = function (err) {\n var groups = this.groups;\n if (groups) {\n groups.forEach(function (group, key) {\n group.error(err);\n });\n groups.clear();\n }\n this.destination.error(err);\n };\n GroupBySubscriber.prototype._complete = function () {\n var groups = this.groups;\n if (groups) {\n groups.forEach(function (group, key) {\n group.complete();\n });\n groups.clear();\n }\n this.destination.complete();\n };\n GroupBySubscriber.prototype.removeGroup = function (key) {\n this.groups.delete(key);\n };\n GroupBySubscriber.prototype.unsubscribe = function () {\n if (!this.closed && !this.attemptedToUnsubscribe) {\n this.attemptedToUnsubscribe = true;\n if (this.count === 0) {\n _super.prototype.unsubscribe.call(this);\n }\n }\n };\n return GroupBySubscriber;\n}(Subscriber_1.Subscriber));\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar GroupDurationSubscriber = (function (_super) {\n __extends(GroupDurationSubscriber, _super);\n function GroupDurationSubscriber(key, group, parent) {\n _super.call(this);\n this.key = key;\n this.group = group;\n this.parent = parent;\n }\n GroupDurationSubscriber.prototype._next = function (value) {\n this._complete();\n };\n GroupDurationSubscriber.prototype._error = function (err) {\n var group = this.group;\n if (!group.closed) {\n group.error(err);\n }\n this.parent.removeGroup(this.key);\n };\n GroupDurationSubscriber.prototype._complete = function () {\n var group = this.group;\n if (!group.closed) {\n group.complete();\n }\n this.parent.removeGroup(this.key);\n };\n return GroupDurationSubscriber;\n}(Subscriber_1.Subscriber));\n/**\n * An Observable representing values belonging to the same group represented by\n * a common key. The values emitted by a GroupedObservable come from the source\n * Observable. The common key is available as the field `key` on a\n * GroupedObservable instance.\n *\n * @class GroupedObservable<K, T>\n */\nvar GroupedObservable = (function (_super) {\n __extends(GroupedObservable, _super);\n function GroupedObservable(key, groupSubject, refCountSubscription) {\n _super.call(this);\n this.key = key;\n this.groupSubject = groupSubject;\n this.refCountSubscription = refCountSubscription;\n }\n GroupedObservable.prototype._subscribe = function (subscriber) {\n var subscription = new Subscription_1.Subscription();\n var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;\n if (refCountSubscription && !refCountSubscription.closed) {\n subscription.add(new InnerRefCountSubscription(refCountSubscription));\n }\n subscription.add(groupSubject.subscribe(subscriber));\n return subscription;\n };\n return GroupedObservable;\n}(Observable_1.Observable));\nexports.GroupedObservable = GroupedObservable;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar InnerRefCountSubscription = (function (_super) {\n __extends(InnerRefCountSubscription, _super);\n function InnerRefCountSubscription(parent) {\n _super.call(this);\n this.parent = parent;\n parent.count++;\n }\n InnerRefCountSubscription.prototype.unsubscribe = function () {\n var parent = this.parent;\n if (!parent.closed && !this.closed) {\n _super.prototype.unsubscribe.call(this);\n parent.count -= 1;\n if (parent.count === 0 && parent.attemptedToUnsubscribe) {\n parent.unsubscribe();\n }\n }\n };\n return InnerRefCountSubscription;\n}(Subscription_1.Subscription));\n//# sourceMappingURL=groupBy.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2dyb3VwQnkuanM/YjE2MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9TdWJqZWN0Jyk7XG52YXIgTWFwXzEgPSByZXF1aXJlKCcuLi91dGlsL01hcCcpO1xudmFyIEZhc3RNYXBfMSA9IHJlcXVpcmUoJy4uL3V0aWwvRmFzdE1hcCcpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIEdyb3VwcyB0aGUgaXRlbXMgZW1pdHRlZCBieSBhbiBPYnNlcnZhYmxlIGFjY29yZGluZyB0byBhIHNwZWNpZmllZCBjcml0ZXJpb24sXG4gKiBhbmQgZW1pdHMgdGhlc2UgZ3JvdXBlZCBpdGVtcyBhcyBgR3JvdXBlZE9ic2VydmFibGVzYCwgb25lXG4gKiB7QGxpbmsgR3JvdXBlZE9ic2VydmFibGV9IHBlciBncm91cC5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2dyb3VwQnkucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCk6IEt9IGtleVNlbGVjdG9yIGEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB0aGUga2V5XG4gKiBmb3IgZWFjaCBpdGVtLlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCk6IFJ9IFtlbGVtZW50U2VsZWN0b3JdIGEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyB0aGVcbiAqIHJldHVybiBlbGVtZW50IGZvciBlYWNoIGl0ZW0uXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKGdyb3VwZWQ6IEdyb3VwZWRPYnNlcnZhYmxlPEssUj4pOiBPYnNlcnZhYmxlPGFueT59IFtkdXJhdGlvblNlbGVjdG9yXVxuICogYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0byBkZXRlcm1pbmUgaG93IGxvbmcgZWFjaCBncm91cCBzaG91bGRcbiAqIGV4aXN0LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxHcm91cGVkT2JzZXJ2YWJsZTxLLFI+Pn0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzXG4gKiBHcm91cGVkT2JzZXJ2YWJsZXMsIGVhY2ggb2Ygd2hpY2ggY29ycmVzcG9uZHMgdG8gYSB1bmlxdWUga2V5IHZhbHVlIGFuZCBlYWNoXG4gKiBvZiB3aGljaCBlbWl0cyB0aG9zZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0aGF0IHNoYXJlIHRoYXQga2V5XG4gKiB2YWx1ZS5cbiAqIEBtZXRob2QgZ3JvdXBCeVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gZ3JvdXBCeShrZXlTZWxlY3RvciwgZWxlbWVudFNlbGVjdG9yLCBkdXJhdGlvblNlbGVjdG9yLCBzdWJqZWN0U2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBHcm91cEJ5T3BlcmF0b3Ioa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSk7XG59XG5leHBvcnRzLmdyb3VwQnkgPSBncm91cEJ5O1xudmFyIEdyb3VwQnlPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gR3JvdXBCeU9wZXJhdG9yKGtleVNlbGVjdG9yLCBlbGVtZW50U2VsZWN0b3IsIGR1cmF0aW9uU2VsZWN0b3IsIHN1YmplY3RTZWxlY3Rvcikge1xuICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0ga2V5U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yID0gZWxlbWVudFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yO1xuICAgICAgICB0aGlzLnN1YmplY3RTZWxlY3RvciA9IHN1YmplY3RTZWxlY3RvcjtcbiAgICB9XG4gICAgR3JvdXBCeU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgR3JvdXBCeVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5rZXlTZWxlY3RvciwgdGhpcy5lbGVtZW50U2VsZWN0b3IsIHRoaXMuZHVyYXRpb25TZWxlY3RvciwgdGhpcy5zdWJqZWN0U2VsZWN0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cEJ5T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBHcm91cEJ5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEdyb3VwQnlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEdyb3VwQnlTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBrZXlTZWxlY3RvciwgZWxlbWVudFNlbGVjdG9yLCBkdXJhdGlvblNlbGVjdG9yLCBzdWJqZWN0U2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0ga2V5U2VsZWN0b3I7XG4gICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yID0gZWxlbWVudFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yO1xuICAgICAgICB0aGlzLnN1YmplY3RTZWxlY3RvciA9IHN1YmplY3RTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBudWxsO1xuICAgICAgICB0aGlzLmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIEdyb3VwQnlTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5ID0gdGhpcy5rZXlTZWxlY3Rvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2dyb3VwKHZhbHVlLCBrZXkpO1xuICAgIH07XG4gICAgR3JvdXBCeVN1YnNjcmliZXIucHJvdG90eXBlLl9ncm91cCA9IGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgIHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcbiAgICAgICAgaWYgKCFncm91cHMpIHtcbiAgICAgICAgICAgIGdyb3VwcyA9IHRoaXMuZ3JvdXBzID0gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBuZXcgRmFzdE1hcF8xLkZhc3RNYXAoKSA6IG5ldyBNYXBfMS5NYXAoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JvdXAgPSBncm91cHMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudFNlbGVjdG9yKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICAgICAgZ3JvdXAgPSB0aGlzLnN1YmplY3RTZWxlY3RvciA/IHRoaXMuc3ViamVjdFNlbGVjdG9yKCkgOiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICAgICAgICAgIGdyb3Vwcy5zZXQoa2V5LCBncm91cCk7XG4gICAgICAgICAgICB2YXIgZ3JvdXBlZE9ic2VydmFibGUgPSBuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoZ3JvdXBlZE9ic2VydmFibGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHVyYXRpb25TZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb25TZWxlY3RvcihuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZChkdXJhdGlvbi5zdWJzY3JpYmUobmV3IEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyKGtleSwgZ3JvdXAsIHRoaXMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFncm91cC5jbG9zZWQpIHtcbiAgICAgICAgICAgIGdyb3VwLm5leHQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEdyb3VwQnlTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcbiAgICAgICAgaWYgKGdyb3Vwcykge1xuICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24gKGdyb3VwLCBrZXkpIHtcbiAgICAgICAgICAgICAgICBncm91cC5lcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBncm91cHMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfTtcbiAgICBHcm91cEJ5U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG4gICAgICAgIGlmIChncm91cHMpIHtcbiAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uIChncm91cCwga2V5KSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgR3JvdXBCeVN1YnNjcmliZXIucHJvdG90eXBlLnJlbW92ZUdyb3VwID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0aGlzLmdyb3Vwcy5kZWxldGUoa2V5KTtcbiAgICB9O1xuICAgIEdyb3VwQnlTdWJzY3JpYmVyLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCAmJiAhdGhpcy5hdHRlbXB0ZWRUb1Vuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICB0aGlzLmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBHcm91cEJ5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgR3JvdXBEdXJhdGlvblN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhHcm91cER1cmF0aW9uU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBHcm91cER1cmF0aW9uU3Vic2NyaWJlcihrZXksIGdyb3VwLCBwYXJlbnQpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICBHcm91cER1cmF0aW9uU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tcGxldGUoKTtcbiAgICB9O1xuICAgIEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBncm91cCA9IHRoaXMuZ3JvdXA7XG4gICAgICAgIGlmICghZ3JvdXAuY2xvc2VkKSB7XG4gICAgICAgICAgICBncm91cC5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUdyb3VwKHRoaXMua2V5KTtcbiAgICB9O1xuICAgIEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBncm91cCA9IHRoaXMuZ3JvdXA7XG4gICAgICAgIGlmICghZ3JvdXAuY2xvc2VkKSB7XG4gICAgICAgICAgICBncm91cC5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUdyb3VwKHRoaXMua2V5KTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cER1cmF0aW9uU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8qKlxuICogQW4gT2JzZXJ2YWJsZSByZXByZXNlbnRpbmcgdmFsdWVzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBncm91cCByZXByZXNlbnRlZCBieVxuICogYSBjb21tb24ga2V5LiBUaGUgdmFsdWVzIGVtaXR0ZWQgYnkgYSBHcm91cGVkT2JzZXJ2YWJsZSBjb21lIGZyb20gdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gVGhlIGNvbW1vbiBrZXkgaXMgYXZhaWxhYmxlIGFzIHRoZSBmaWVsZCBga2V5YCBvbiBhXG4gKiBHcm91cGVkT2JzZXJ2YWJsZSBpbnN0YW5jZS5cbiAqXG4gKiBAY2xhc3MgR3JvdXBlZE9ic2VydmFibGU8SywgVD5cbiAqL1xudmFyIEdyb3VwZWRPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoR3JvdXBlZE9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cFN1YmplY3QsIHJlZkNvdW50U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5ncm91cFN1YmplY3QgPSBncm91cFN1YmplY3Q7XG4gICAgICAgIHRoaXMucmVmQ291bnRTdWJzY3JpcHRpb24gPSByZWZDb3VudFN1YnNjcmlwdGlvbjtcbiAgICB9XG4gICAgR3JvdXBlZE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbigpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCByZWZDb3VudFN1YnNjcmlwdGlvbiA9IF9hLnJlZkNvdW50U3Vic2NyaXB0aW9uLCBncm91cFN1YmplY3QgPSBfYS5ncm91cFN1YmplY3Q7XG4gICAgICAgIGlmIChyZWZDb3VudFN1YnNjcmlwdGlvbiAmJiAhcmVmQ291bnRTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKG5ldyBJbm5lclJlZkNvdW50U3Vic2NyaXB0aW9uKHJlZkNvdW50U3Vic2NyaXB0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChncm91cFN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cGVkT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuR3JvdXBlZE9ic2VydmFibGUgPSBHcm91cGVkT2JzZXJ2YWJsZTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgSW5uZXJSZWZDb3VudFN1YnNjcmlwdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElubmVyUmVmQ291bnRTdWJzY3JpcHRpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW5uZXJSZWZDb3VudFN1YnNjcmlwdGlvbihwYXJlbnQpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBwYXJlbnQuY291bnQrKztcbiAgICB9XG4gICAgSW5uZXJSZWZDb3VudFN1YnNjcmlwdGlvbi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgaWYgKCFwYXJlbnQuY2xvc2VkICYmICF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgcGFyZW50LmNvdW50IC09IDE7XG4gICAgICAgICAgICBpZiAocGFyZW50LmNvdW50ID09PSAwICYmIHBhcmVudC5hdHRlbXB0ZWRUb1Vuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBJbm5lclJlZkNvdW50U3Vic2NyaXB0aW9uO1xufShTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyb3VwQnkuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvZ3JvdXBCeS5qc1xuLy8gbW9kdWxlIGlkID0gNTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1145. /***/ },
  1146. /* 523 */
  1147. /***/ function(module, exports, __webpack_require__) {
  1148. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar MapPolyfill_1 = __webpack_require__(524);\nexports.Map = root_1.root.Map || (function () { return MapPolyfill_1.MapPolyfill; })();\n//# sourceMappingURL=Map.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvTWFwLmpzP2U3NzEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi9yb290Jyk7XG52YXIgTWFwUG9seWZpbGxfMSA9IHJlcXVpcmUoJy4vTWFwUG9seWZpbGwnKTtcbmV4cG9ydHMuTWFwID0gcm9vdF8xLnJvb3QuTWFwIHx8IChmdW5jdGlvbiAoKSB7IHJldHVybiBNYXBQb2x5ZmlsbF8xLk1hcFBvbHlmaWxsOyB9KSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWFwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3V0aWwvTWFwLmpzXG4vLyBtb2R1bGUgaWQgPSA1MjNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1149. /***/ },
  1150. /* 524 */
  1151. /***/ function(module, exports) {
  1152. eval("\"use strict\";\nvar MapPolyfill = (function () {\n function MapPolyfill() {\n this.size = 0;\n this._values = [];\n this._keys = [];\n }\n MapPolyfill.prototype.get = function (key) {\n var i = this._keys.indexOf(key);\n return i === -1 ? undefined : this._values[i];\n };\n MapPolyfill.prototype.set = function (key, value) {\n var i = this._keys.indexOf(key);\n if (i === -1) {\n this._keys.push(key);\n this._values.push(value);\n this.size++;\n }\n else {\n this._values[i] = value;\n }\n return this;\n };\n MapPolyfill.prototype.delete = function (key) {\n var i = this._keys.indexOf(key);\n if (i === -1) {\n return false;\n }\n this._values.splice(i, 1);\n this._keys.splice(i, 1);\n this.size--;\n return true;\n };\n MapPolyfill.prototype.clear = function () {\n this._keys.length = 0;\n this._values.length = 0;\n this.size = 0;\n };\n MapPolyfill.prototype.forEach = function (cb, thisArg) {\n for (var i = 0; i < this.size; i++) {\n cb.call(thisArg, this._values[i], this._keys[i]);\n }\n };\n return MapPolyfill;\n}());\nexports.MapPolyfill = MapPolyfill;\n//# sourceMappingURL=MapPolyfill.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvTWFwUG9seWZpbGwuanM/NDFhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBNYXBQb2x5ZmlsbCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWFwUG9seWZpbGwoKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgfVxuICAgIE1hcFBvbHlmaWxsLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fa2V5cy5pbmRleE9mKGtleSk7XG4gICAgICAgIHJldHVybiBpID09PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlc1tpXTtcbiAgICB9O1xuICAgIE1hcFBvbHlmaWxsLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuX2tleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5zaXplKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbaV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIE1hcFBvbHlmaWxsLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBpID0gdGhpcy5fa2V5cy5pbmRleE9mKGtleSk7XG4gICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuX2tleXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB0aGlzLnNpemUtLTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBNYXBQb2x5ZmlsbC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfTtcbiAgICBNYXBQb2x5ZmlsbC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYiwgdGhpc0FyZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHRoaXMuX3ZhbHVlc1tpXSwgdGhpcy5fa2V5c1tpXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNYXBQb2x5ZmlsbDtcbn0oKSk7XG5leHBvcnRzLk1hcFBvbHlmaWxsID0gTWFwUG9seWZpbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXBQb2x5ZmlsbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL01hcFBvbHlmaWxsLmpzXG4vLyBtb2R1bGUgaWQgPSA1MjRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1153. /***/ },
  1154. /* 525 */
  1155. /***/ function(module, exports) {
  1156. eval("\"use strict\";\nvar FastMap = (function () {\n function FastMap() {\n this.values = {};\n }\n FastMap.prototype.delete = function (key) {\n this.values[key] = null;\n return true;\n };\n FastMap.prototype.set = function (key, value) {\n this.values[key] = value;\n return this;\n };\n FastMap.prototype.get = function (key) {\n return this.values[key];\n };\n FastMap.prototype.forEach = function (cb, thisArg) {\n var values = this.values;\n for (var key in values) {\n if (values.hasOwnProperty(key) && values[key] !== null) {\n cb.call(thisArg, values[key], key);\n }\n }\n };\n FastMap.prototype.clear = function () {\n this.values = {};\n };\n return FastMap;\n}());\nexports.FastMap = FastMap;\n//# sourceMappingURL=FastMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvRmFzdE1hcC5qcz8zNDNmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEZhc3RNYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZhc3RNYXAoKSB7XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgfVxuICAgIEZhc3RNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNba2V5XSA9IG51bGw7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRmFzdE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIEZhc3RNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07XG4gICAgfTtcbiAgICBGYXN0TWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNiLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlcykge1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlc1trZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCB2YWx1ZXNba2V5XSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRmFzdE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgfTtcbiAgICByZXR1cm4gRmFzdE1hcDtcbn0oKSk7XG5leHBvcnRzLkZhc3RNYXAgPSBGYXN0TWFwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmFzdE1hcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL0Zhc3RNYXAuanNcbi8vIG1vZHVsZSBpZCA9IDUyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1157. /***/ },
  1158. /* 526 */
  1159. /***/ function(module, exports, __webpack_require__) {
  1160. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar ignoreElements_1 = __webpack_require__(527);\nObservable_1.Observable.prototype.ignoreElements = ignoreElements_1.ignoreElements;\n//# sourceMappingURL=ignoreElements.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9pZ25vcmVFbGVtZW50cy5qcz85ZjlmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBpZ25vcmVFbGVtZW50c18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvaWdub3JlRWxlbWVudHMnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5pZ25vcmVFbGVtZW50cyA9IGlnbm9yZUVsZW1lbnRzXzEuaWdub3JlRWxlbWVudHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZ25vcmVFbGVtZW50cy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvaWdub3JlRWxlbWVudHMuanNcbi8vIG1vZHVsZSBpZCA9IDUyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1161. /***/ },
  1162. /* 527 */
  1163. /***/ function(module, exports, __webpack_require__) {
  1164. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar noop_1 = __webpack_require__(427);\n/**\n * Ignores all items emitted by the source Observable and only passes calls of `complete` or `error`.\n *\n * <img src=\"./img/ignoreElements.png\" width=\"100%\">\n *\n * @return {Observable} an empty Observable that only calls `complete`\n * or `error`, based on which one is called by the source Observable.\n * @method ignoreElements\n * @owner Observable\n */\nfunction ignoreElements() {\n return this.lift(new IgnoreElementsOperator());\n}\nexports.ignoreElements = ignoreElements;\n;\nvar IgnoreElementsOperator = (function () {\n function IgnoreElementsOperator() {\n }\n IgnoreElementsOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new IgnoreElementsSubscriber(subscriber));\n };\n return IgnoreElementsOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar IgnoreElementsSubscriber = (function (_super) {\n __extends(IgnoreElementsSubscriber, _super);\n function IgnoreElementsSubscriber() {\n _super.apply(this, arguments);\n }\n IgnoreElementsSubscriber.prototype._next = function (unused) {\n noop_1.noop();\n };\n return IgnoreElementsSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=ignoreElements.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2lnbm9yZUVsZW1lbnRzLmpzPzczNTciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgbm9vcF8xID0gcmVxdWlyZSgnLi4vdXRpbC9ub29wJyk7XG4vKipcbiAqIElnbm9yZXMgYWxsIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFuZCBvbmx5IHBhc3NlcyBjYWxscyBvZiBgY29tcGxldGVgIG9yIGBlcnJvcmAuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9pZ25vcmVFbGVtZW50cy5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBlbXB0eSBPYnNlcnZhYmxlIHRoYXQgb25seSBjYWxscyBgY29tcGxldGVgXG4gKiBvciBgZXJyb3JgLCBiYXNlZCBvbiB3aGljaCBvbmUgaXMgY2FsbGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2QgaWdub3JlRWxlbWVudHNcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIGlnbm9yZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IElnbm9yZUVsZW1lbnRzT3BlcmF0b3IoKSk7XG59XG5leHBvcnRzLmlnbm9yZUVsZW1lbnRzID0gaWdub3JlRWxlbWVudHM7XG47XG52YXIgSWdub3JlRWxlbWVudHNPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSWdub3JlRWxlbWVudHNPcGVyYXRvcigpIHtcbiAgICB9XG4gICAgSWdub3JlRWxlbWVudHNPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gSWdub3JlRWxlbWVudHNPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJZ25vcmVFbGVtZW50c1N1YnNjcmliZXIoKSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBJZ25vcmVFbGVtZW50c1N1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHVudXNlZCkge1xuICAgICAgICBub29wXzEubm9vcCgpO1xuICAgIH07XG4gICAgcmV0dXJuIElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlnbm9yZUVsZW1lbnRzLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2lnbm9yZUVsZW1lbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSA1Mjdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1165. /***/ },
  1166. /* 528 */
  1167. /***/ function(module, exports, __webpack_require__) {
  1168. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar isEmpty_1 = __webpack_require__(529);\nObservable_1.Observable.prototype.isEmpty = isEmpty_1.isEmpty;\n//# sourceMappingURL=isEmpty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9pc0VtcHR5LmpzPzQ1MDgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGlzRW1wdHlfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2lzRW1wdHknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5pc0VtcHR5ID0gaXNFbXB0eV8xLmlzRW1wdHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0VtcHR5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9pc0VtcHR5LmpzXG4vLyBtb2R1bGUgaWQgPSA1Mjhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1169. /***/ },
  1170. /* 529 */
  1171. /***/ function(module, exports, __webpack_require__) {
  1172. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * If the source Observable is empty it returns an Observable that emits true, otherwise it emits false.\n *\n * <img src=\"./img/isEmpty.png\" width=\"100%\">\n *\n * @return {Observable} an Observable that emits a Boolean.\n * @method isEmpty\n * @owner Observable\n */\nfunction isEmpty() {\n return this.lift(new IsEmptyOperator());\n}\nexports.isEmpty = isEmpty;\nvar IsEmptyOperator = (function () {\n function IsEmptyOperator() {\n }\n IsEmptyOperator.prototype.call = function (observer, source) {\n return source.subscribe(new IsEmptySubscriber(observer));\n };\n return IsEmptyOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar IsEmptySubscriber = (function (_super) {\n __extends(IsEmptySubscriber, _super);\n function IsEmptySubscriber(destination) {\n _super.call(this, destination);\n }\n IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {\n var destination = this.destination;\n destination.next(isEmpty);\n destination.complete();\n };\n IsEmptySubscriber.prototype._next = function (value) {\n this.notifyComplete(false);\n };\n IsEmptySubscriber.prototype._complete = function () {\n this.notifyComplete(true);\n };\n return IsEmptySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=isEmpty.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2lzRW1wdHkuanM/MDc4NyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogSWYgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGlzIGVtcHR5IGl0IHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRydWUsIG90aGVyd2lzZSBpdCBlbWl0cyBmYWxzZS5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2lzRW1wdHkucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgQm9vbGVhbi5cbiAqIEBtZXRob2QgaXNFbXB0eVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBJc0VtcHR5T3BlcmF0b3IoKSk7XG59XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xudmFyIElzRW1wdHlPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSXNFbXB0eU9wZXJhdG9yKCkge1xuICAgIH1cbiAgICBJc0VtcHR5T3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAob2JzZXJ2ZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgSXNFbXB0eVN1YnNjcmliZXIob2JzZXJ2ZXIpKTtcbiAgICB9O1xuICAgIHJldHVybiBJc0VtcHR5T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBJc0VtcHR5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElzRW1wdHlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElzRW1wdHlTdWJzY3JpYmVyKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICB9XG4gICAgSXNFbXB0eVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlzRW1wdHkpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dChpc0VtcHR5KTtcbiAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIElzRW1wdHlTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5vdGlmeUNvbXBsZXRlKGZhbHNlKTtcbiAgICB9O1xuICAgIElzRW1wdHlTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5Q29tcGxldGUodHJ1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gSXNFbXB0eVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0VtcHR5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL2lzRW1wdHkuanNcbi8vIG1vZHVsZSBpZCA9IDUyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1173. /***/ },
  1174. /* 530 */
  1175. /***/ function(module, exports, __webpack_require__) {
  1176. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar audit_1 = __webpack_require__(531);\nObservable_1.Observable.prototype.audit = audit_1.audit;\n//# sourceMappingURL=audit.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9hdWRpdC5qcz8yMDA1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBhdWRpdF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvYXVkaXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5hdWRpdCA9IGF1ZGl0XzEuYXVkaXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdWRpdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvYXVkaXQuanNcbi8vIG1vZHVsZSBpZCA9IDUzMFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1177. /***/ },
  1178. /* 531 */
  1179. /***/ function(module, exports, __webpack_require__) {
  1180. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Ignores source values for a duration determined by another Observable, then\n * emits the most recent value from the source Observable, then repeats this\n * process.\n *\n * <span class=\"informal\">It's like {@link auditTime}, but the silencing\n * duration is determined by a second Observable.</span>\n *\n * <img src=\"./img/audit.png\" width=\"100%\">\n *\n * `audit` is similar to `throttle`, but emits the last value from the silenced\n * time window, instead of the first value. `audit` emits the most recent value\n * from the source Observable on the output Observable as soon as its internal\n * timer becomes disabled, and ignores source values while the timer is enabled.\n * Initially, the timer is disabled. As soon as the first source value arrives,\n * the timer is enabled by calling the `durationSelector` function with the\n * source value, which returns the \"duration\" Observable. When the duration\n * Observable emits a value or completes, the timer is disabled, then the most\n * recent source value is emitted on the output Observable, and this process\n * repeats for the next source value.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.audit(ev => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounce}\n * @see {@link delayWhen}\n * @see {@link sample}\n * @see {@link throttle}\n *\n * @param {function(value: T): Observable|Promise} durationSelector A function\n * that receives a value from the source Observable, for computing the silencing\n * duration, returned as an Observable or a Promise.\n * @return {Observable<T>} An Observable that performs rate-limiting of\n * emissions from the source Observable.\n * @method audit\n * @owner Observable\n */\nfunction audit(durationSelector) {\n return this.lift(new AuditOperator(durationSelector));\n}\nexports.audit = audit;\nvar AuditOperator = (function () {\n function AuditOperator(durationSelector) {\n this.durationSelector = durationSelector;\n }\n AuditOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));\n };\n return AuditOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AuditSubscriber = (function (_super) {\n __extends(AuditSubscriber, _super);\n function AuditSubscriber(destination, durationSelector) {\n _super.call(this, destination);\n this.durationSelector = durationSelector;\n this.hasValue = false;\n }\n AuditSubscriber.prototype._next = function (value) {\n this.value = value;\n this.hasValue = true;\n if (!this.throttled) {\n var duration = tryCatch_1.tryCatch(this.durationSelector)(value);\n if (duration === errorObject_1.errorObject) {\n this.destination.error(errorObject_1.errorObject.e);\n }\n else {\n this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration));\n }\n }\n };\n AuditSubscriber.prototype.clearThrottle = function () {\n var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;\n if (throttled) {\n this.remove(throttled);\n this.throttled = null;\n throttled.unsubscribe();\n }\n if (hasValue) {\n this.value = null;\n this.hasValue = false;\n this.destination.next(value);\n }\n };\n AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n this.clearThrottle();\n };\n AuditSubscriber.prototype.notifyComplete = function () {\n this.clearThrottle();\n };\n return AuditSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=audit.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2F1ZGl0LmpzPzNlMGQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBJZ25vcmVzIHNvdXJjZSB2YWx1ZXMgZm9yIGEgZHVyYXRpb24gZGV0ZXJtaW5lZCBieSBhbm90aGVyIE9ic2VydmFibGUsIHRoZW5cbiAqIGVtaXRzIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgdGhlbiByZXBlYXRzIHRoaXNcbiAqIHByb2Nlc3MuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgYXVkaXRUaW1lfSwgYnV0IHRoZSBzaWxlbmNpbmdcbiAqIGR1cmF0aW9uIGlzIGRldGVybWluZWQgYnkgYSBzZWNvbmQgT2JzZXJ2YWJsZS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9hdWRpdC5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgYXVkaXRgIGlzIHNpbWlsYXIgdG8gYHRocm90dGxlYCwgYnV0IGVtaXRzIHRoZSBsYXN0IHZhbHVlIGZyb20gdGhlIHNpbGVuY2VkXG4gKiB0aW1lIHdpbmRvdywgaW5zdGVhZCBvZiB0aGUgZmlyc3QgdmFsdWUuIGBhdWRpdGAgZW1pdHMgdGhlIG1vc3QgcmVjZW50IHZhbHVlXG4gKiBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgYXMgc29vbiBhcyBpdHMgaW50ZXJuYWxcbiAqIHRpbWVyIGJlY29tZXMgZGlzYWJsZWQsIGFuZCBpZ25vcmVzIHNvdXJjZSB2YWx1ZXMgd2hpbGUgdGhlIHRpbWVyIGlzIGVuYWJsZWQuXG4gKiBJbml0aWFsbHksIHRoZSB0aW1lciBpcyBkaXNhYmxlZC4gQXMgc29vbiBhcyB0aGUgZmlyc3Qgc291cmNlIHZhbHVlIGFycml2ZXMsXG4gKiB0aGUgdGltZXIgaXMgZW5hYmxlZCBieSBjYWxsaW5nIHRoZSBgZHVyYXRpb25TZWxlY3RvcmAgZnVuY3Rpb24gd2l0aCB0aGVcbiAqIHNvdXJjZSB2YWx1ZSwgd2hpY2ggcmV0dXJucyB0aGUgXCJkdXJhdGlvblwiIE9ic2VydmFibGUuIFdoZW4gdGhlIGR1cmF0aW9uXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUgb3IgY29tcGxldGVzLCB0aGUgdGltZXIgaXMgZGlzYWJsZWQsIHRoZW4gdGhlIG1vc3RcbiAqIHJlY2VudCBzb3VyY2UgdmFsdWUgaXMgZW1pdHRlZCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUsIGFuZCB0aGlzIHByb2Nlc3NcbiAqIHJlcGVhdHMgZm9yIHRoZSBuZXh0IHNvdXJjZSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FbWl0IGNsaWNrcyBhdCBhIHJhdGUgb2YgYXQgbW9zdCBvbmUgY2xpY2sgcGVyIHNlY29uZDwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLmF1ZGl0KGV2ID0+IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCkpO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBhdWRpdFRpbWV9XG4gKiBAc2VlIHtAbGluayBkZWJvdW5jZX1cbiAqIEBzZWUge0BsaW5rIGRlbGF5V2hlbn1cbiAqIEBzZWUge0BsaW5rIHNhbXBsZX1cbiAqIEBzZWUge0BsaW5rIHRocm90dGxlfVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24odmFsdWU6IFQpOiBPYnNlcnZhYmxlfFByb21pc2V9IGR1cmF0aW9uU2VsZWN0b3IgQSBmdW5jdGlvblxuICogdGhhdCByZWNlaXZlcyBhIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCBmb3IgY29tcHV0aW5nIHRoZSBzaWxlbmNpbmdcbiAqIGR1cmF0aW9uLCByZXR1cm5lZCBhcyBhbiBPYnNlcnZhYmxlIG9yIGEgUHJvbWlzZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgdGhhdCBwZXJmb3JtcyByYXRlLWxpbWl0aW5nIG9mXG4gKiBlbWlzc2lvbnMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIGF1ZGl0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBhdWRpdChkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgQXVkaXRPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7XG59XG5leHBvcnRzLmF1ZGl0ID0gYXVkaXQ7XG52YXIgQXVkaXRPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXVkaXRPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7XG4gICAgfVxuICAgIEF1ZGl0T3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBBdWRpdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXVkaXRPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIEF1ZGl0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEF1ZGl0U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBdWRpdFN1YnNjcmliZXIoZGVzdGluYXRpb24sIGR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIEF1ZGl0U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkge1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaCh0aGlzLmR1cmF0aW9uU2VsZWN0b3IpKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMudGhyb3R0bGVkID0gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBBdWRpdFN1YnNjcmliZXIucHJvdG90eXBlLmNsZWFyVGhyb3R0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHZhbHVlID0gX2EudmFsdWUsIGhhc1ZhbHVlID0gX2EuaGFzVmFsdWUsIHRocm90dGxlZCA9IF9hLnRocm90dGxlZDtcbiAgICAgICAgaWYgKHRocm90dGxlZCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhyb3R0bGVkKTtcbiAgICAgICAgICAgIHRoaXMudGhyb3R0bGVkID0gbnVsbDtcbiAgICAgICAgICAgIHRocm90dGxlZC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBdWRpdFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTtcbiAgICB9O1xuICAgIEF1ZGl0U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaHJvdHRsZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIEF1ZGl0U3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdWRpdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9hdWRpdC5qc1xuLy8gbW9kdWxlIGlkID0gNTMxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1181. /***/ },
  1182. /* 532 */
  1183. /***/ function(module, exports, __webpack_require__) {
  1184. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar auditTime_1 = __webpack_require__(533);\nObservable_1.Observable.prototype.auditTime = auditTime_1.auditTime;\n//# sourceMappingURL=auditTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9hdWRpdFRpbWUuanM/YjRhOSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgYXVkaXRUaW1lXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9hdWRpdFRpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5hdWRpdFRpbWUgPSBhdWRpdFRpbWVfMS5hdWRpdFRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdWRpdFRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2F1ZGl0VGltZS5qc1xuLy8gbW9kdWxlIGlkID0gNTMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1185. /***/ },
  1186. /* 533 */
  1187. /***/ function(module, exports, __webpack_require__) {
  1188. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = __webpack_require__(414);\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Ignores source values for `duration` milliseconds, then emits the most recent\n * value from the source Observable, then repeats this process.\n *\n * <span class=\"informal\">When it sees a source values, it ignores that plus\n * the next ones for `duration` milliseconds, and then it emits the most recent\n * value from the source.</span>\n *\n * <img src=\"./img/auditTime.png\" width=\"100%\">\n *\n * `auditTime` is similar to `throttleTime`, but emits the last value from the\n * silenced time window, instead of the first value. `auditTime` emits the most\n * recent value from the source Observable on the output Observable as soon as\n * its internal timer becomes disabled, and ignores source values while the\n * timer is enabled. Initially, the timer is disabled. As soon as the first\n * source value arrives, the timer is enabled. After `duration` milliseconds (or\n * the time unit determined internally by the optional `scheduler`) has passed,\n * the timer is disabled, then the most recent source value is emitted on the\n * output Observable, and this process repeats for the next source value.\n * Optionally takes a {@link Scheduler} for managing timers.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.auditTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttleTime}\n *\n * @param {number} duration Time to wait before emitting the most recent source\n * value, measured in milliseconds or the time unit determined internally\n * by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link Scheduler} to use for\n * managing the timers that handle the rate-limiting behavior.\n * @return {Observable<T>} An Observable that performs rate-limiting of\n * emissions from the source Observable.\n * @method auditTime\n * @owner Observable\n */\nfunction auditTime(duration, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new AuditTimeOperator(duration, scheduler));\n}\nexports.auditTime = auditTime;\nvar AuditTimeOperator = (function () {\n function AuditTimeOperator(duration, scheduler) {\n this.duration = duration;\n this.scheduler = scheduler;\n }\n AuditTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new AuditTimeSubscriber(subscriber, this.duration, this.scheduler));\n };\n return AuditTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AuditTimeSubscriber = (function (_super) {\n __extends(AuditTimeSubscriber, _super);\n function AuditTimeSubscriber(destination, duration, scheduler) {\n _super.call(this, destination);\n this.duration = duration;\n this.scheduler = scheduler;\n this.hasValue = false;\n }\n AuditTimeSubscriber.prototype._next = function (value) {\n this.value = value;\n this.hasValue = true;\n if (!this.throttled) {\n this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, this));\n }\n };\n AuditTimeSubscriber.prototype.clearThrottle = function () {\n var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;\n if (throttled) {\n this.remove(throttled);\n this.throttled = null;\n throttled.unsubscribe();\n }\n if (hasValue) {\n this.value = null;\n this.hasValue = false;\n this.destination.next(value);\n }\n };\n return AuditTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(subscriber) {\n subscriber.clearThrottle();\n}\n//# sourceMappingURL=auditTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2F1ZGl0VGltZS5qcz8xNDliIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgYXN5bmNfMSA9IHJlcXVpcmUoJy4uL3NjaGVkdWxlci9hc3luYycpO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogSWdub3JlcyBzb3VyY2UgdmFsdWVzIGZvciBgZHVyYXRpb25gIG1pbGxpc2Vjb25kcywgdGhlbiBlbWl0cyB0aGUgbW9zdCByZWNlbnRcbiAqIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCB0aGVuIHJlcGVhdHMgdGhpcyBwcm9jZXNzLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5XaGVuIGl0IHNlZXMgYSBzb3VyY2UgdmFsdWVzLCBpdCBpZ25vcmVzIHRoYXQgcGx1c1xuICogdGhlIG5leHQgb25lcyBmb3IgYGR1cmF0aW9uYCBtaWxsaXNlY29uZHMsIGFuZCB0aGVuIGl0IGVtaXRzIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWUgZnJvbSB0aGUgc291cmNlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL2F1ZGl0VGltZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgYXVkaXRUaW1lYCBpcyBzaW1pbGFyIHRvIGB0aHJvdHRsZVRpbWVgLCBidXQgZW1pdHMgdGhlIGxhc3QgdmFsdWUgZnJvbSB0aGVcbiAqIHNpbGVuY2VkIHRpbWUgd2luZG93LCBpbnN0ZWFkIG9mIHRoZSBmaXJzdCB2YWx1ZS4gYGF1ZGl0VGltZWAgZW1pdHMgdGhlIG1vc3RcbiAqIHJlY2VudCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgYXMgc29vbiBhc1xuICogaXRzIGludGVybmFsIHRpbWVyIGJlY29tZXMgZGlzYWJsZWQsIGFuZCBpZ25vcmVzIHNvdXJjZSB2YWx1ZXMgd2hpbGUgdGhlXG4gKiB0aW1lciBpcyBlbmFibGVkLiBJbml0aWFsbHksIHRoZSB0aW1lciBpcyBkaXNhYmxlZC4gQXMgc29vbiBhcyB0aGUgZmlyc3RcbiAqIHNvdXJjZSB2YWx1ZSBhcnJpdmVzLCB0aGUgdGltZXIgaXMgZW5hYmxlZC4gQWZ0ZXIgYGR1cmF0aW9uYCBtaWxsaXNlY29uZHMgKG9yXG4gKiB0aGUgdGltZSB1bml0IGRldGVybWluZWQgaW50ZXJuYWxseSBieSB0aGUgb3B0aW9uYWwgYHNjaGVkdWxlcmApIGhhcyBwYXNzZWQsXG4gKiB0aGUgdGltZXIgaXMgZGlzYWJsZWQsIHRoZW4gdGhlIG1vc3QgcmVjZW50IHNvdXJjZSB2YWx1ZSBpcyBlbWl0dGVkIG9uIHRoZVxuICogb3V0cHV0IE9ic2VydmFibGUsIGFuZCB0aGlzIHByb2Nlc3MgcmVwZWF0cyBmb3IgdGhlIG5leHQgc291cmNlIHZhbHVlLlxuICogT3B0aW9uYWxseSB0YWtlcyBhIHtAbGluayBTY2hlZHVsZXJ9IGZvciBtYW5hZ2luZyB0aW1lcnMuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCBjbGlja3MgYXQgYSByYXRlIG9mIGF0IG1vc3Qgb25lIGNsaWNrIHBlciBzZWNvbmQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5hdWRpdFRpbWUoMTAwMCk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGF1ZGl0fVxuICogQHNlZSB7QGxpbmsgZGVib3VuY2VUaW1lfVxuICogQHNlZSB7QGxpbmsgZGVsYXl9XG4gKiBAc2VlIHtAbGluayBzYW1wbGVUaW1lfVxuICogQHNlZSB7QGxpbmsgdGhyb3R0bGVUaW1lfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaW1lIHRvIHdhaXQgYmVmb3JlIGVtaXR0aW5nIHRoZSBtb3N0IHJlY2VudCBzb3VyY2VcbiAqIHZhbHVlLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMgb3IgdGhlIHRpbWUgdW5pdCBkZXRlcm1pbmVkIGludGVybmFsbHlcbiAqIGJ5IHRoZSBvcHRpb25hbCBgc2NoZWR1bGVyYC5cbiAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyPWFzeW5jXSBUaGUge0BsaW5rIFNjaGVkdWxlcn0gdG8gdXNlIGZvclxuICogbWFuYWdpbmcgdGhlIHRpbWVycyB0aGF0IGhhbmRsZSB0aGUgcmF0ZS1saW1pdGluZyBiZWhhdmlvci5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IEFuIE9ic2VydmFibGUgdGhhdCBwZXJmb3JtcyByYXRlLWxpbWl0aW5nIG9mXG4gKiBlbWlzc2lvbnMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIGF1ZGl0VGltZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gYXVkaXRUaW1lKGR1cmF0aW9uLCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IEF1ZGl0VGltZU9wZXJhdG9yKGR1cmF0aW9uLCBzY2hlZHVsZXIpKTtcbn1cbmV4cG9ydHMuYXVkaXRUaW1lID0gYXVkaXRUaW1lO1xudmFyIEF1ZGl0VGltZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBdWRpdFRpbWVPcGVyYXRvcihkdXJhdGlvbiwgc2NoZWR1bGVyKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIEF1ZGl0VGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQXVkaXRUaW1lU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmR1cmF0aW9uLCB0aGlzLnNjaGVkdWxlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIEF1ZGl0VGltZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQXVkaXRUaW1lU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEF1ZGl0VGltZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXVkaXRUaW1lU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgZHVyYXRpb24sIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICB9XG4gICAgQXVkaXRUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkge1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy50aHJvdHRsZWQgPSB0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaE5leHQsIHRoaXMuZHVyYXRpb24sIHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXVkaXRUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuY2xlYXJUaHJvdHRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgdmFsdWUgPSBfYS52YWx1ZSwgaGFzVmFsdWUgPSBfYS5oYXNWYWx1ZSwgdGhyb3R0bGVkID0gX2EudGhyb3R0bGVkO1xuICAgICAgICBpZiAodGhyb3R0bGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSh0aHJvdHRsZWQpO1xuICAgICAgICAgICAgdGhpcy50aHJvdHRsZWQgPSBudWxsO1xuICAgICAgICAgICAgdGhyb3R0bGVkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBBdWRpdFRpbWVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZnVuY3Rpb24gZGlzcGF0Y2hOZXh0KHN1YnNjcmliZXIpIHtcbiAgICBzdWJzY3JpYmVyLmNsZWFyVGhyb3R0bGUoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1ZGl0VGltZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9hdWRpdFRpbWUuanNcbi8vIG1vZHVsZSBpZCA9IDUzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1189. /***/ },
  1190. /* 534 */
  1191. /***/ function(module, exports, __webpack_require__) {
  1192. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar last_1 = __webpack_require__(60);\nObservable_1.Observable.prototype.last = last_1.last;\n//# sourceMappingURL=last.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9sYXN0LmpzP2M5ZjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIGxhc3RfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL2xhc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5sYXN0ID0gbGFzdF8xLmxhc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9sYXN0LmpzXG4vLyBtb2R1bGUgaWQgPSA1MzRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1193. /***/ },
  1194. /* 535 */
  1195. /***/ function(module, exports, __webpack_require__) {
  1196. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar let_1 = __webpack_require__(536);\nObservable_1.Observable.prototype.let = let_1.letProto;\nObservable_1.Observable.prototype.letBind = let_1.letProto;\n//# sourceMappingURL=let.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9sZXQuanM/ZTdiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbGV0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9sZXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5sZXQgPSBsZXRfMS5sZXRQcm90bztcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5sZXRCaW5kID0gbGV0XzEubGV0UHJvdG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL2xldC5qc1xuLy8gbW9kdWxlIGlkID0gNTM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1197. /***/ },
  1198. /* 536 */
  1199. /***/ function(module, exports) {
  1200. eval("\"use strict\";\n/**\n * @param func\n * @return {Observable<R>}\n * @method let\n * @owner Observable\n */\nfunction letProto(func) {\n return func(this);\n}\nexports.letProto = letProto;\n//# sourceMappingURL=let.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL2xldC5qcz8xODdjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAcGFyYW0gZnVuY1xuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPn1cbiAqIEBtZXRob2QgbGV0XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBsZXRQcm90byhmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmModGhpcyk7XG59XG5leHBvcnRzLmxldFByb3RvID0gbGV0UHJvdG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvbGV0LmpzXG4vLyBtb2R1bGUgaWQgPSA1MzZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1201. /***/ },
  1202. /* 537 */
  1203. /***/ function(module, exports, __webpack_require__) {
  1204. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar every_1 = __webpack_require__(52);\nObservable_1.Observable.prototype.every = every_1.every;\n//# sourceMappingURL=every.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9ldmVyeS5qcz8wYjFmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBldmVyeV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvZXZlcnknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5ldmVyeSA9IGV2ZXJ5XzEuZXZlcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVyeS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvZXZlcnkuanNcbi8vIG1vZHVsZSBpZCA9IDUzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1205. /***/ },
  1206. /* 538 */
  1207. /***/ function(module, exports, __webpack_require__) {
  1208. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar map_1 = __webpack_require__(55);\nObservable_1.Observable.prototype.map = map_1.map;\n//# sourceMappingURL=map.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tYXAuanM/OTRiMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbWFwXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9tYXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tYXAgPSBtYXBfMS5tYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL21hcC5qc1xuLy8gbW9kdWxlIGlkID0gNTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1209. /***/ },
  1210. /* 539 */
  1211. /***/ function(module, exports, __webpack_require__) {
  1212. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar mapTo_1 = __webpack_require__(540);\nObservable_1.Observable.prototype.mapTo = mapTo_1.mapTo;\n//# sourceMappingURL=mapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tYXBUby5qcz8wZTQ0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBtYXBUb18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvbWFwVG8nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tYXBUbyA9IG1hcFRvXzEubWFwVG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXBUby5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvbWFwVG8uanNcbi8vIG1vZHVsZSBpZCA9IDUzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1213. /***/ },
  1214. /* 540 */
  1215. /***/ function(module, exports, __webpack_require__) {
  1216. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Emits the given constant value on the output Observable every time the source\n * Observable emits a value.\n *\n * <span class=\"informal\">Like {@link map}, but it maps every source value to\n * the same output value every time.</span>\n *\n * <img src=\"./img/mapTo.png\" width=\"100%\">\n *\n * Takes a constant `value` as argument, and emits that whenever the source\n * Observable emits a value. In other words, ignores the actual source value,\n * and simply uses the emission moment to know when to emit the given `value`.\n *\n * @example <caption>Map every every click to the string 'Hi'</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var greetings = clicks.mapTo('Hi');\n * greetings.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {any} value The value to map each source value to.\n * @return {Observable} An Observable that emits the given `value` every time\n * the source Observable emits something.\n * @method mapTo\n * @owner Observable\n */\nfunction mapTo(value) {\n return this.lift(new MapToOperator(value));\n}\nexports.mapTo = mapTo;\nvar MapToOperator = (function () {\n function MapToOperator(value) {\n this.value = value;\n }\n MapToOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new MapToSubscriber(subscriber, this.value));\n };\n return MapToOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MapToSubscriber = (function (_super) {\n __extends(MapToSubscriber, _super);\n function MapToSubscriber(destination, value) {\n _super.call(this, destination);\n this.value = value;\n }\n MapToSubscriber.prototype._next = function (x) {\n this.destination.next(this.value);\n };\n return MapToSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=mapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21hcFRvLmpzP2M1ODQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIEVtaXRzIHRoZSBnaXZlbiBjb25zdGFudCB2YWx1ZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgZXZlcnkgdGltZSB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkxpa2Uge0BsaW5rIG1hcH0sIGJ1dCBpdCBtYXBzIGV2ZXJ5IHNvdXJjZSB2YWx1ZSB0b1xuICogdGhlIHNhbWUgb3V0cHV0IHZhbHVlIGV2ZXJ5IHRpbWUuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbWFwVG8ucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogVGFrZXMgYSBjb25zdGFudCBgdmFsdWVgIGFzIGFyZ3VtZW50LCBhbmQgZW1pdHMgdGhhdCB3aGVuZXZlciB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUuIEluIG90aGVyIHdvcmRzLCBpZ25vcmVzIHRoZSBhY3R1YWwgc291cmNlIHZhbHVlLFxuICogYW5kIHNpbXBseSB1c2VzIHRoZSBlbWlzc2lvbiBtb21lbnQgdG8ga25vdyB3aGVuIHRvIGVtaXQgdGhlIGdpdmVuIGB2YWx1ZWAuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+TWFwIGV2ZXJ5IGV2ZXJ5IGNsaWNrIHRvIHRoZSBzdHJpbmcgJ0hpJzwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgZ3JlZXRpbmdzID0gY2xpY2tzLm1hcFRvKCdIaScpO1xuICogZ3JlZXRpbmdzLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBtYXB9XG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBtYXAgZWFjaCBzb3VyY2UgdmFsdWUgdG8uXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGdpdmVuIGB2YWx1ZWAgZXZlcnkgdGltZVxuICogdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGVtaXRzIHNvbWV0aGluZy5cbiAqIEBtZXRob2QgbWFwVG9cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIG1hcFRvKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgTWFwVG9PcGVyYXRvcih2YWx1ZSkpO1xufVxuZXhwb3J0cy5tYXBUbyA9IG1hcFRvO1xudmFyIE1hcFRvT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1hcFRvT3BlcmF0b3IodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBNYXBUb09wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwVG9TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMudmFsdWUpKTtcbiAgICB9O1xuICAgIHJldHVybiBNYXBUb09wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgTWFwVG9TdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWFwVG9TdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1hcFRvU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIE1hcFRvU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gTWFwVG9TdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwVG8uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvbWFwVG8uanNcbi8vIG1vZHVsZSBpZCA9IDU0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1217. /***/ },
  1218. /* 541 */
  1219. /***/ function(module, exports, __webpack_require__) {
  1220. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar materialize_1 = __webpack_require__(542);\nObservable_1.Observable.prototype.materialize = materialize_1.materialize;\n//# sourceMappingURL=materialize.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tYXRlcmlhbGl6ZS5qcz82MjU0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBtYXRlcmlhbGl6ZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvbWF0ZXJpYWxpemUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tYXRlcmlhbGl6ZSA9IG1hdGVyaWFsaXplXzEubWF0ZXJpYWxpemU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRlcmlhbGl6ZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvbWF0ZXJpYWxpemUuanNcbi8vIG1vZHVsZSBpZCA9IDU0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1221. /***/ },
  1222. /* 542 */
  1223. /***/ function(module, exports, __webpack_require__) {
  1224. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Notification_1 = __webpack_require__(45);\n/**\n * Represents all of the notifications from the source Observable as `next`\n * emissions marked with their original types within {@link Notification}\n * objects.\n *\n * <span class=\"informal\">Wraps `next`, `error` and `complete` emissions in\n * {@link Notification} objects, emitted as `next` on the output Observable.\n * </span>\n *\n * <img src=\"./img/materialize.png\" width=\"100%\">\n *\n * `materialize` returns an Observable that emits a `next` notification for each\n * `next`, `error`, or `complete` emission of the source Observable. When the\n * source Observable emits `complete`, the output Observable will emit `next` as\n * a Notification of type \"complete\", and then it will emit `complete` as well.\n * When the source Observable emits `error`, the output will emit `next` as a\n * Notification of type \"error\", and then `complete`.\n *\n * This operator is useful for producing metadata of the source Observable, to\n * be consumed as `next` emissions. Use it in conjunction with\n * {@link dematerialize}.\n *\n * @example <caption>Convert a faulty Observable to an Observable of Notifications</caption>\n * var letters = Rx.Observable.of('a', 'b', 13, 'd');\n * var upperCase = letters.map(x => x.toUpperCase());\n * var materialized = upperCase.materialize();\n * materialized.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - Notification {kind: \"N\", value: \"A\", error: undefined, hasValue: true}\n * // - Notification {kind: \"N\", value: \"B\", error: undefined, hasValue: true}\n * // - Notification {kind: \"E\", value: undefined, error: TypeError:\n * // x.toUpperCase is not a function at MapSubscriber.letters.map.x\n * // [as project] (http://1…, hasValue: false}\n *\n * @see {@link Notification}\n * @see {@link dematerialize}\n *\n * @return {Observable<Notification<T>>} An Observable that emits\n * {@link Notification} objects that wrap the original emissions from the source\n * Observable with metadata.\n * @method materialize\n * @owner Observable\n */\nfunction materialize() {\n return this.lift(new MaterializeOperator());\n}\nexports.materialize = materialize;\nvar MaterializeOperator = (function () {\n function MaterializeOperator() {\n }\n MaterializeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new MaterializeSubscriber(subscriber));\n };\n return MaterializeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MaterializeSubscriber = (function (_super) {\n __extends(MaterializeSubscriber, _super);\n function MaterializeSubscriber(destination) {\n _super.call(this, destination);\n }\n MaterializeSubscriber.prototype._next = function (value) {\n this.destination.next(Notification_1.Notification.createNext(value));\n };\n MaterializeSubscriber.prototype._error = function (err) {\n var destination = this.destination;\n destination.next(Notification_1.Notification.createError(err));\n destination.complete();\n };\n MaterializeSubscriber.prototype._complete = function () {\n var destination = this.destination;\n destination.next(Notification_1.Notification.createComplete());\n destination.complete();\n };\n return MaterializeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=materialize.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21hdGVyaWFsaXplLmpzP2Q4ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgTm90aWZpY2F0aW9uXzEgPSByZXF1aXJlKCcuLi9Ob3RpZmljYXRpb24nKTtcbi8qKlxuICogUmVwcmVzZW50cyBhbGwgb2YgdGhlIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgYXMgYG5leHRgXG4gKiBlbWlzc2lvbnMgbWFya2VkIHdpdGggdGhlaXIgb3JpZ2luYWwgdHlwZXMgd2l0aGluIHtAbGluayBOb3RpZmljYXRpb259XG4gKiBvYmplY3RzLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5XcmFwcyBgbmV4dGAsIGBlcnJvcmAgYW5kIGBjb21wbGV0ZWAgZW1pc3Npb25zIGluXG4gKiB7QGxpbmsgTm90aWZpY2F0aW9ufSBvYmplY3RzLCBlbWl0dGVkIGFzIGBuZXh0YCBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKiA8L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9tYXRlcmlhbGl6ZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgbWF0ZXJpYWxpemVgIHJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgYG5leHRgIG5vdGlmaWNhdGlvbiBmb3IgZWFjaFxuICogYG5leHRgLCBgZXJyb3JgLCBvciBgY29tcGxldGVgIGVtaXNzaW9uIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gV2hlbiB0aGVcbiAqIHNvdXJjZSBPYnNlcnZhYmxlIGVtaXRzIGBjb21wbGV0ZWAsIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZSB3aWxsIGVtaXQgYG5leHRgIGFzXG4gKiBhIE5vdGlmaWNhdGlvbiBvZiB0eXBlIFwiY29tcGxldGVcIiwgYW5kIHRoZW4gaXQgd2lsbCBlbWl0IGBjb21wbGV0ZWAgYXMgd2VsbC5cbiAqIFdoZW4gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGVtaXRzIGBlcnJvcmAsIHRoZSBvdXRwdXQgd2lsbCBlbWl0IGBuZXh0YCBhcyBhXG4gKiBOb3RpZmljYXRpb24gb2YgdHlwZSBcImVycm9yXCIsIGFuZCB0aGVuIGBjb21wbGV0ZWAuXG4gKlxuICogVGhpcyBvcGVyYXRvciBpcyB1c2VmdWwgZm9yIHByb2R1Y2luZyBtZXRhZGF0YSBvZiB0aGUgc291cmNlIE9ic2VydmFibGUsIHRvXG4gKiBiZSBjb25zdW1lZCBhcyBgbmV4dGAgZW1pc3Npb25zLiBVc2UgaXQgaW4gY29uanVuY3Rpb24gd2l0aFxuICoge0BsaW5rIGRlbWF0ZXJpYWxpemV9LlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNvbnZlcnQgYSBmYXVsdHkgT2JzZXJ2YWJsZSB0byBhbiBPYnNlcnZhYmxlIG9mIE5vdGlmaWNhdGlvbnM8L2NhcHRpb24+XG4gKiB2YXIgbGV0dGVycyA9IFJ4Lk9ic2VydmFibGUub2YoJ2EnLCAnYicsIDEzLCAnZCcpO1xuICogdmFyIHVwcGVyQ2FzZSA9IGxldHRlcnMubWFwKHggPT4geC50b1VwcGVyQ2FzZSgpKTtcbiAqIHZhciBtYXRlcmlhbGl6ZWQgPSB1cHBlckNhc2UubWF0ZXJpYWxpemUoKTtcbiAqIG1hdGVyaWFsaXplZC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogLy8gUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOlxuICogLy8gLSBOb3RpZmljYXRpb24ge2tpbmQ6IFwiTlwiLCB2YWx1ZTogXCJBXCIsIGVycm9yOiB1bmRlZmluZWQsIGhhc1ZhbHVlOiB0cnVlfVxuICogLy8gLSBOb3RpZmljYXRpb24ge2tpbmQ6IFwiTlwiLCB2YWx1ZTogXCJCXCIsIGVycm9yOiB1bmRlZmluZWQsIGhhc1ZhbHVlOiB0cnVlfVxuICogLy8gLSBOb3RpZmljYXRpb24ge2tpbmQ6IFwiRVwiLCB2YWx1ZTogdW5kZWZpbmVkLCBlcnJvcjogVHlwZUVycm9yOlxuICogLy8gICB4LnRvVXBwZXJDYXNlIGlzIG5vdCBhIGZ1bmN0aW9uIGF0IE1hcFN1YnNjcmliZXIubGV0dGVycy5tYXAueFxuICogLy8gICBbYXMgcHJvamVjdF0gKGh0dHA6Ly8x4oCmLCBoYXNWYWx1ZTogZmFsc2V9XG4gKlxuICogQHNlZSB7QGxpbmsgTm90aWZpY2F0aW9ufVxuICogQHNlZSB7QGxpbmsgZGVtYXRlcmlhbGl6ZX1cbiAqXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPE5vdGlmaWNhdGlvbjxUPj59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0c1xuICoge0BsaW5rIE5vdGlmaWNhdGlvbn0gb2JqZWN0cyB0aGF0IHdyYXAgdGhlIG9yaWdpbmFsIGVtaXNzaW9ucyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgd2l0aCBtZXRhZGF0YS5cbiAqIEBtZXRob2QgbWF0ZXJpYWxpemVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIG1hdGVyaWFsaXplKCkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE1hdGVyaWFsaXplT3BlcmF0b3IoKSk7XG59XG5leHBvcnRzLm1hdGVyaWFsaXplID0gbWF0ZXJpYWxpemU7XG52YXIgTWF0ZXJpYWxpemVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWF0ZXJpYWxpemVPcGVyYXRvcigpIHtcbiAgICB9XG4gICAgTWF0ZXJpYWxpemVPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1hdGVyaWFsaXplU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gTWF0ZXJpYWxpemVPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIE1hdGVyaWFsaXplU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1hdGVyaWFsaXplU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNYXRlcmlhbGl6ZVN1YnNjcmliZXIoZGVzdGluYXRpb24pIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgIH1cbiAgICBNYXRlcmlhbGl6ZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpO1xuICAgIH07XG4gICAgTWF0ZXJpYWxpemVTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGRlc3RpbmF0aW9uLm5leHQoTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZUVycm9yKGVycikpO1xuICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgTWF0ZXJpYWxpemVTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGRlc3RpbmF0aW9uLm5leHQoTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZUNvbXBsZXRlKCkpO1xuICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIE1hdGVyaWFsaXplU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGVyaWFsaXplLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL21hdGVyaWFsaXplLmpzXG4vLyBtb2R1bGUgaWQgPSA1NDJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1225. /***/ },
  1226. /* 543 */
  1227. /***/ function(module, exports, __webpack_require__) {
  1228. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar max_1 = __webpack_require__(544);\nObservable_1.Observable.prototype.max = max_1.max;\n//# sourceMappingURL=max.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tYXguanM/ZTUxMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbWF4XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9tYXgnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tYXggPSBtYXhfMS5tYXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL21heC5qc1xuLy8gbW9kdWxlIGlkID0gNTQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1229. /***/ },
  1230. /* 544 */
  1231. /***/ function(module, exports, __webpack_require__) {
  1232. eval("\"use strict\";\nvar reduce_1 = __webpack_require__(56);\n/**\n * The Max operator operates on an Observable that emits numbers (or items that can be evaluated as numbers),\n * and when source Observable completes it emits a single item: the item with the largest number.\n *\n * <img src=\"./img/max.png\" width=\"100%\">\n *\n * @param {Function} optional comparer function that it will use instead of its default to compare the value of two\n * items.\n * @return {Observable} an Observable that emits item with the largest number.\n * @method max\n * @owner Observable\n */\nfunction max(comparer) {\n var max = (typeof comparer === 'function')\n ? function (x, y) { return comparer(x, y) > 0 ? x : y; }\n : function (x, y) { return x > y ? x : y; };\n return this.lift(new reduce_1.ReduceOperator(max));\n}\nexports.max = max;\n//# sourceMappingURL=max.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21heC5qcz80ZmZlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIHJlZHVjZV8xID0gcmVxdWlyZSgnLi9yZWR1Y2UnKTtcbi8qKlxuICogVGhlIE1heCBvcGVyYXRvciBvcGVyYXRlcyBvbiBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgbnVtYmVycyAob3IgaXRlbXMgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGFzIG51bWJlcnMpLFxuICogYW5kIHdoZW4gc291cmNlIE9ic2VydmFibGUgY29tcGxldGVzIGl0IGVtaXRzIGEgc2luZ2xlIGl0ZW06IHRoZSBpdGVtIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbWF4LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdGlvbmFsIGNvbXBhcmVyIGZ1bmN0aW9uIHRoYXQgaXQgd2lsbCB1c2UgaW5zdGVhZCBvZiBpdHMgZGVmYXVsdCB0byBjb21wYXJlIHRoZSB2YWx1ZSBvZiB0d29cbiAqIGl0ZW1zLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW0gd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIuXG4gKiBAbWV0aG9kIG1heFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbWF4KGNvbXBhcmVyKSB7XG4gICAgdmFyIG1heCA9ICh0eXBlb2YgY29tcGFyZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgID8gZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIGNvbXBhcmVyKHgsIHkpID4gMCA/IHggOiB5OyB9XG4gICAgICAgIDogZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHggPiB5ID8geCA6IHk7IH07XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgcmVkdWNlXzEuUmVkdWNlT3BlcmF0b3IobWF4KSk7XG59XG5leHBvcnRzLm1heCA9IG1heDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1heC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9tYXguanNcbi8vIG1vZHVsZSBpZCA9IDU0NFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1233. /***/ },
  1234. /* 545 */
  1235. /***/ function(module, exports, __webpack_require__) {
  1236. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar merge_1 = __webpack_require__(421);\nObservable_1.Observable.prototype.merge = merge_1.merge;\n//# sourceMappingURL=merge.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZS5qcz8yNWJiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBtZXJnZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvbWVyZ2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tZXJnZSA9IG1lcmdlXzEubWVyZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvbWVyZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDU0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1237. /***/ },
  1238. /* 546 */
  1239. /***/ function(module, exports, __webpack_require__) {
  1240. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar mergeAll_1 = __webpack_require__(59);\nObservable_1.Observable.prototype.mergeAll = mergeAll_1.mergeAll;\n//# sourceMappingURL=mergeAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZUFsbC5qcz9kNDRiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBtZXJnZUFsbF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvbWVyZ2VBbGwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tZXJnZUFsbCA9IG1lcmdlQWxsXzEubWVyZ2VBbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZUFsbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvbWVyZ2VBbGwuanNcbi8vIG1vZHVsZSBpZCA9IDU0NlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1241. /***/ },
  1242. /* 547 */
  1243. /***/ function(module, exports, __webpack_require__) {
  1244. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar mergeMap_1 = __webpack_require__(48);\nObservable_1.Observable.prototype.mergeMap = mergeMap_1.mergeMap;\nObservable_1.Observable.prototype.flatMap = mergeMap_1.mergeMap;\n//# sourceMappingURL=mergeMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZU1hcC5qcz9hMDgzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBtZXJnZU1hcF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvbWVyZ2VNYXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tZXJnZU1hcCA9IG1lcmdlTWFwXzEubWVyZ2VNYXA7XG5PYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZS5wcm90b3R5cGUuZmxhdE1hcCA9IG1lcmdlTWFwXzEubWVyZ2VNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZU1hcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvbWVyZ2VNYXAuanNcbi8vIG1vZHVsZSBpZCA9IDU0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1245. /***/ },
  1246. /* 548 */
  1247. /***/ function(module, exports, __webpack_require__) {
  1248. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar mergeMapTo_1 = __webpack_require__(480);\nObservable_1.Observable.prototype.flatMapTo = mergeMapTo_1.mergeMapTo;\nObservable_1.Observable.prototype.mergeMapTo = mergeMapTo_1.mergeMapTo;\n//# sourceMappingURL=mergeMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZU1hcFRvLmpzPzZmODEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIG1lcmdlTWFwVG9fMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL21lcmdlTWFwVG8nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5mbGF0TWFwVG8gPSBtZXJnZU1hcFRvXzEubWVyZ2VNYXBUbztcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tZXJnZU1hcFRvID0gbWVyZ2VNYXBUb18xLm1lcmdlTWFwVG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZU1hcFRvLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZU1hcFRvLmpzXG4vLyBtb2R1bGUgaWQgPSA1NDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1249. /***/ },
  1250. /* 549 */
  1251. /***/ function(module, exports, __webpack_require__) {
  1252. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar mergeScan_1 = __webpack_require__(550);\nObservable_1.Observable.prototype.mergeScan = mergeScan_1.mergeScan;\n//# sourceMappingURL=mergeScan.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tZXJnZVNjYW4uanM/MTk1YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbWVyZ2VTY2FuXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9tZXJnZVNjYW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tZXJnZVNjYW4gPSBtZXJnZVNjYW5fMS5tZXJnZVNjYW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXJnZVNjYW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL21lcmdlU2Nhbi5qc1xuLy8gbW9kdWxlIGlkID0gNTQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1253. /***/ },
  1254. /* 550 */
  1255. /***/ function(module, exports, __webpack_require__) {
  1256. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar subscribeToResult_1 = __webpack_require__(49);\nvar OuterSubscriber_1 = __webpack_require__(51);\n/**\n * @param project\n * @param seed\n * @param concurrent\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method mergeScan\n * @owner Observable\n */\nfunction mergeScan(project, seed, concurrent) {\n if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n return this.lift(new MergeScanOperator(project, seed, concurrent));\n}\nexports.mergeScan = mergeScan;\nvar MergeScanOperator = (function () {\n function MergeScanOperator(project, seed, concurrent) {\n this.project = project;\n this.seed = seed;\n this.concurrent = concurrent;\n }\n MergeScanOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new MergeScanSubscriber(subscriber, this.project, this.seed, this.concurrent));\n };\n return MergeScanOperator;\n}());\nexports.MergeScanOperator = MergeScanOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar MergeScanSubscriber = (function (_super) {\n __extends(MergeScanSubscriber, _super);\n function MergeScanSubscriber(destination, project, acc, concurrent) {\n _super.call(this, destination);\n this.project = project;\n this.acc = acc;\n this.concurrent = concurrent;\n this.hasValue = false;\n this.hasCompleted = false;\n this.buffer = [];\n this.active = 0;\n this.index = 0;\n }\n MergeScanSubscriber.prototype._next = function (value) {\n if (this.active < this.concurrent) {\n var index = this.index++;\n var ish = tryCatch_1.tryCatch(this.project)(this.acc, value);\n var destination = this.destination;\n if (ish === errorObject_1.errorObject) {\n destination.error(errorObject_1.errorObject.e);\n }\n else {\n this.active++;\n this._innerSub(ish, value, index);\n }\n }\n else {\n this.buffer.push(value);\n }\n };\n MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {\n this.add(subscribeToResult_1.subscribeToResult(this, ish, value, index));\n };\n MergeScanSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n if (this.hasValue === false) {\n this.destination.next(this.acc);\n }\n this.destination.complete();\n }\n };\n MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var destination = this.destination;\n this.acc = innerValue;\n this.hasValue = true;\n destination.next(innerValue);\n };\n MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {\n var buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n }\n else if (this.active === 0 && this.hasCompleted) {\n if (this.hasValue === false) {\n this.destination.next(this.acc);\n }\n this.destination.complete();\n }\n };\n return MergeScanSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\nexports.MergeScanSubscriber = MergeScanSubscriber;\n//# sourceMappingURL=mergeScan.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21lcmdlU2Nhbi5qcz8wNzMzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbi8qKlxuICogQHBhcmFtIHByb2plY3RcbiAqIEBwYXJhbSBzZWVkXG4gKiBAcGFyYW0gY29uY3VycmVudFxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPnxXZWJTb2NrZXRTdWJqZWN0PFQ+fE9ic2VydmFibGU8VD59XG4gKiBAbWV0aG9kIG1lcmdlU2NhblxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbWVyZ2VTY2FuKHByb2plY3QsIHNlZWQsIGNvbmN1cnJlbnQpIHtcbiAgICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7IH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBNZXJnZVNjYW5PcGVyYXRvcihwcm9qZWN0LCBzZWVkLCBjb25jdXJyZW50KSk7XG59XG5leHBvcnRzLm1lcmdlU2NhbiA9IG1lcmdlU2NhbjtcbnZhciBNZXJnZVNjYW5PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVyZ2VTY2FuT3BlcmF0b3IocHJvamVjdCwgc2VlZCwgY29uY3VycmVudCkge1xuICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICAgICAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgIH1cbiAgICBNZXJnZVNjYW5PcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1lcmdlU2NhblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcm9qZWN0LCB0aGlzLnNlZWQsIHRoaXMuY29uY3VycmVudCkpO1xuICAgIH07XG4gICAgcmV0dXJuIE1lcmdlU2Nhbk9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydHMuTWVyZ2VTY2FuT3BlcmF0b3IgPSBNZXJnZVNjYW5PcGVyYXRvcjtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgTWVyZ2VTY2FuU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1lcmdlU2NhblN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWVyZ2VTY2FuU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJvamVjdCwgYWNjLCBjb25jdXJyZW50KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5hY2MgPSBhY2M7XG4gICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgTWVyZ2VTY2FuU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlIDwgdGhpcy5jb25jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICB2YXIgaXNoID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaCh0aGlzLnByb2plY3QpKHRoaXMuYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgaWYgKGlzaCA9PT0gZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdCkge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVycm9yKGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QuZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSsrO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lubmVyU3ViKGlzaCwgdmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNZXJnZVNjYW5TdWJzY3JpYmVyLnByb3RvdHlwZS5faW5uZXJTdWIgPSBmdW5jdGlvbiAoaXNoLCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBpc2gsIHZhbHVlLCBpbmRleCkpO1xuICAgIH07XG4gICAgTWVyZ2VTY2FuU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmFjYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1lcmdlU2NhblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgdGhpcy5hY2MgPSBpbm5lclZhbHVlO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICB9O1xuICAgIE1lcmdlU2NhblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWIpO1xuICAgICAgICB0aGlzLmFjdGl2ZS0tO1xuICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX25leHQoYnVmZmVyLnNoaWZ0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlID09PSAwICYmIHRoaXMuaGFzQ29tcGxldGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodGhpcy5hY2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTWVyZ2VTY2FuU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnRzLk1lcmdlU2NhblN1YnNjcmliZXIgPSBNZXJnZVNjYW5TdWJzY3JpYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVyZ2VTY2FuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL21lcmdlU2Nhbi5qc1xuLy8gbW9kdWxlIGlkID0gNTUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1257. /***/ },
  1258. /* 551 */
  1259. /***/ function(module, exports, __webpack_require__) {
  1260. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar min_1 = __webpack_require__(552);\nObservable_1.Observable.prototype.min = min_1.min;\n//# sourceMappingURL=min.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9taW4uanM/NGZhNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbWluXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9taW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5taW4gPSBtaW5fMS5taW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL21pbi5qc1xuLy8gbW9kdWxlIGlkID0gNTUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1261. /***/ },
  1262. /* 552 */
  1263. /***/ function(module, exports, __webpack_require__) {
  1264. eval("\"use strict\";\nvar reduce_1 = __webpack_require__(56);\n/**\n * The Min operator operates on an Observable that emits numbers (or items that can be evaluated as numbers),\n * and when source Observable completes it emits a single item: the item with the smallest number.\n *\n * <img src=\"./img/min.png\" width=\"100%\">\n *\n * @param {Function} optional comparer function that it will use instead of its default to compare the value of two items.\n * @return {Observable<R>} an Observable that emits item with the smallest number.\n * @method min\n * @owner Observable\n */\nfunction min(comparer) {\n var min = (typeof comparer === 'function')\n ? function (x, y) { return comparer(x, y) < 0 ? x : y; }\n : function (x, y) { return x < y ? x : y; };\n return this.lift(new reduce_1.ReduceOperator(min));\n}\nexports.min = min;\n//# sourceMappingURL=min.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL21pbi5qcz83NmZmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIHJlZHVjZV8xID0gcmVxdWlyZSgnLi9yZWR1Y2UnKTtcbi8qKlxuICogVGhlIE1pbiBvcGVyYXRvciBvcGVyYXRlcyBvbiBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgbnVtYmVycyAob3IgaXRlbXMgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGFzIG51bWJlcnMpLFxuICogYW5kIHdoZW4gc291cmNlIE9ic2VydmFibGUgY29tcGxldGVzIGl0IGVtaXRzIGEgc2luZ2xlIGl0ZW06IHRoZSBpdGVtIHdpdGggdGhlIHNtYWxsZXN0IG51bWJlci5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL21pbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25hbCBjb21wYXJlciBmdW5jdGlvbiB0aGF0IGl0IHdpbGwgdXNlIGluc3RlYWQgb2YgaXRzIGRlZmF1bHQgdG8gY29tcGFyZSB0aGUgdmFsdWUgb2YgdHdvIGl0ZW1zLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxSPn0gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW0gd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyLlxuICogQG1ldGhvZCBtaW5cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIG1pbihjb21wYXJlcikge1xuICAgIHZhciBtaW4gPSAodHlwZW9mIGNvbXBhcmVyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICA/IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiBjb21wYXJlcih4LCB5KSA8IDAgPyB4IDogeTsgfVxuICAgICAgICA6IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiB4IDwgeSA/IHggOiB5OyB9O1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IHJlZHVjZV8xLlJlZHVjZU9wZXJhdG9yKG1pbikpO1xufVxuZXhwb3J0cy5taW4gPSBtaW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvbWluLmpzXG4vLyBtb2R1bGUgaWQgPSA1NTJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1265. /***/ },
  1266. /* 553 */
  1267. /***/ function(module, exports, __webpack_require__) {
  1268. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar multicast_1 = __webpack_require__(554);\nObservable_1.Observable.prototype.multicast = multicast_1.multicast;\n//# sourceMappingURL=multicast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9tdWx0aWNhc3QuanM/ZWU3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgbXVsdGljYXN0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9tdWx0aWNhc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5tdWx0aWNhc3QgPSBtdWx0aWNhc3RfMS5tdWx0aWNhc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tdWx0aWNhc3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL211bHRpY2FzdC5qc1xuLy8gbW9kdWxlIGlkID0gNTUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1269. /***/ },
  1270. /* 554 */
  1271. /***/ function(module, exports, __webpack_require__) {
  1272. eval("\"use strict\";\nvar ConnectableObservable_1 = __webpack_require__(555);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits the results of invoking a specified selector on items\n * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.\n *\n * <img src=\"./img/multicast.png\" width=\"100%\">\n *\n * @param {Function|Subject} Factory function to create an intermediate subject through\n * which the source sequence's elements will be multicast to the selector function\n * or Subject to push source elements into.\n * @param {Function} Optional selector function that can use the multicasted source stream\n * as many times as needed, without causing multiple subscriptions to the source stream.\n * Subscribers to the given source will receive all notifications of the source from the\n * time of the subscription forward.\n * @return {Observable} an Observable that emits the results of invoking the selector\n * on the items emitted by a `ConnectableObservable` that shares a single subscription to\n * the underlying stream.\n * @method multicast\n * @owner Observable\n */\nfunction multicast(subjectOrSubjectFactory, selector) {\n var subjectFactory;\n if (typeof subjectOrSubjectFactory === 'function') {\n subjectFactory = subjectOrSubjectFactory;\n }\n else {\n subjectFactory = function subjectFactory() {\n return subjectOrSubjectFactory;\n };\n }\n if (typeof selector === 'function') {\n return this.lift(new MulticastOperator(subjectFactory, selector));\n }\n var connectable = Object.create(this, ConnectableObservable_1.connectableObservableDescriptor);\n connectable.source = this;\n connectable.subjectFactory = subjectFactory;\n return connectable;\n}\nexports.multicast = multicast;\nvar MulticastOperator = (function () {\n function MulticastOperator(subjectFactory, selector) {\n this.subjectFactory = subjectFactory;\n this.selector = selector;\n }\n MulticastOperator.prototype.call = function (subscriber, source) {\n var selector = this.selector;\n var subject = this.subjectFactory();\n var subscription = selector(subject).subscribe(subscriber);\n subscription.add(source.subscribe(subject));\n return subscription;\n };\n return MulticastOperator;\n}());\nexports.MulticastOperator = MulticastOperator;\n//# sourceMappingURL=multicast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL211bHRpY2FzdC5qcz8zODBkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIENvbm5lY3RhYmxlT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0cyBvZiBpbnZva2luZyBhIHNwZWNpZmllZCBzZWxlY3RvciBvbiBpdGVtc1xuICogZW1pdHRlZCBieSBhIENvbm5lY3RhYmxlT2JzZXJ2YWJsZSB0aGF0IHNoYXJlcyBhIHNpbmdsZSBzdWJzY3JpcHRpb24gdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvbXVsdGljYXN0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3ViamVjdH0gRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYW4gaW50ZXJtZWRpYXRlIHN1YmplY3QgdGhyb3VnaFxuICogd2hpY2ggdGhlIHNvdXJjZSBzZXF1ZW5jZSdzIGVsZW1lbnRzIHdpbGwgYmUgbXVsdGljYXN0IHRvIHRoZSBzZWxlY3RvciBmdW5jdGlvblxuICogb3IgU3ViamVjdCB0byBwdXNoIHNvdXJjZSBlbGVtZW50cyBpbnRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gT3B0aW9uYWwgc2VsZWN0b3IgZnVuY3Rpb24gdGhhdCBjYW4gdXNlIHRoZSBtdWx0aWNhc3RlZCBzb3VyY2Ugc3RyZWFtXG4gKiBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCwgd2l0aG91dCBjYXVzaW5nIG11bHRpcGxlIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNvdXJjZSBzdHJlYW0uXG4gKiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgcmVjZWl2ZSBhbGwgbm90aWZpY2F0aW9ucyBvZiB0aGUgc291cmNlIGZyb20gdGhlXG4gKiB0aW1lIG9mIHRoZSBzdWJzY3JpcHRpb24gZm9yd2FyZC5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0cyBvZiBpbnZva2luZyB0aGUgc2VsZWN0b3JcbiAqIG9uIHRoZSBpdGVtcyBlbWl0dGVkIGJ5IGEgYENvbm5lY3RhYmxlT2JzZXJ2YWJsZWAgdGhhdCBzaGFyZXMgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIHRvXG4gKiB0aGUgdW5kZXJseWluZyBzdHJlYW0uXG4gKiBAbWV0aG9kIG11bHRpY2FzdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gbXVsdGljYXN0KHN1YmplY3RPclN1YmplY3RGYWN0b3J5LCBzZWxlY3Rvcikge1xuICAgIHZhciBzdWJqZWN0RmFjdG9yeTtcbiAgICBpZiAodHlwZW9mIHN1YmplY3RPclN1YmplY3RGYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHN1YmplY3RGYWN0b3J5ID0gc3ViamVjdE9yU3ViamVjdEZhY3Rvcnk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdWJqZWN0RmFjdG9yeSA9IGZ1bmN0aW9uIHN1YmplY3RGYWN0b3J5KCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YmplY3RPclN1YmplY3RGYWN0b3J5O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZnQobmV3IE11bHRpY2FzdE9wZXJhdG9yKHN1YmplY3RGYWN0b3J5LCBzZWxlY3RvcikpO1xuICAgIH1cbiAgICB2YXIgY29ubmVjdGFibGUgPSBPYmplY3QuY3JlYXRlKHRoaXMsIENvbm5lY3RhYmxlT2JzZXJ2YWJsZV8xLmNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IpO1xuICAgIGNvbm5lY3RhYmxlLnNvdXJjZSA9IHRoaXM7XG4gICAgY29ubmVjdGFibGUuc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0RmFjdG9yeTtcbiAgICByZXR1cm4gY29ubmVjdGFibGU7XG59XG5leHBvcnRzLm11bHRpY2FzdCA9IG11bHRpY2FzdDtcbnZhciBNdWx0aWNhc3RPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTXVsdGljYXN0T3BlcmF0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0RmFjdG9yeTtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIH1cbiAgICBNdWx0aWNhc3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLnN1YmplY3RGYWN0b3J5KCk7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzZWxlY3RvcihzdWJqZWN0KS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5hZGQoc291cmNlLnN1YnNjcmliZShzdWJqZWN0KSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gTXVsdGljYXN0T3BlcmF0b3I7XG59KCkpO1xuZXhwb3J0cy5NdWx0aWNhc3RPcGVyYXRvciA9IE11bHRpY2FzdE9wZXJhdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXVsdGljYXN0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL211bHRpY2FzdC5qc1xuLy8gbW9kdWxlIGlkID0gNTU0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1273. /***/ },
  1274. /* 555 */
  1275. /***/ function(module, exports, __webpack_require__) {
  1276. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar Observable_1 = __webpack_require__(6);\nvar Subscriber_1 = __webpack_require__(9);\nvar Subscription_1 = __webpack_require__(11);\n/**\n * @class ConnectableObservable<T>\n */\nvar ConnectableObservable = (function (_super) {\n __extends(ConnectableObservable, _super);\n function ConnectableObservable(source, subjectFactory) {\n _super.call(this);\n this.source = source;\n this.subjectFactory = subjectFactory;\n this._refCount = 0;\n }\n ConnectableObservable.prototype._subscribe = function (subscriber) {\n return this.getSubject().subscribe(subscriber);\n };\n ConnectableObservable.prototype.getSubject = function () {\n var subject = this._subject;\n if (!subject || subject.isStopped) {\n this._subject = this.subjectFactory();\n }\n return this._subject;\n };\n ConnectableObservable.prototype.connect = function () {\n var connection = this._connection;\n if (!connection) {\n connection = this._connection = new Subscription_1.Subscription();\n connection.add(this.source\n .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n if (connection.closed) {\n this._connection = null;\n connection = Subscription_1.Subscription.EMPTY;\n }\n else {\n this._connection = connection;\n }\n }\n return connection;\n };\n ConnectableObservable.prototype.refCount = function () {\n return this.lift(new RefCountOperator(this));\n };\n return ConnectableObservable;\n}(Observable_1.Observable));\nexports.ConnectableObservable = ConnectableObservable;\nexports.connectableObservableDescriptor = {\n operator: { value: null },\n _refCount: { value: 0, writable: true },\n _subscribe: { value: ConnectableObservable.prototype._subscribe },\n getSubject: { value: ConnectableObservable.prototype.getSubject },\n connect: { value: ConnectableObservable.prototype.connect },\n refCount: { value: ConnectableObservable.prototype.refCount }\n};\nvar ConnectableSubscriber = (function (_super) {\n __extends(ConnectableSubscriber, _super);\n function ConnectableSubscriber(destination, connectable) {\n _super.call(this, destination);\n this.connectable = connectable;\n }\n ConnectableSubscriber.prototype._error = function (err) {\n this._unsubscribe();\n _super.prototype._error.call(this, err);\n };\n ConnectableSubscriber.prototype._complete = function () {\n this._unsubscribe();\n _super.prototype._complete.call(this);\n };\n ConnectableSubscriber.prototype._unsubscribe = function () {\n var connectable = this.connectable;\n if (connectable) {\n this.connectable = null;\n var connection = connectable._connection;\n connectable._refCount = 0;\n connectable._subject = null;\n connectable._connection = null;\n if (connection) {\n connection.unsubscribe();\n }\n }\n };\n return ConnectableSubscriber;\n}(Subject_1.SubjectSubscriber));\nvar RefCountOperator = (function () {\n function RefCountOperator(connectable) {\n this.connectable = connectable;\n }\n RefCountOperator.prototype.call = function (subscriber, source) {\n var connectable = this.connectable;\n connectable._refCount++;\n var refCounter = new RefCountSubscriber(subscriber, connectable);\n var subscription = source.subscribe(refCounter);\n if (!refCounter.closed) {\n refCounter.connection = connectable.connect();\n }\n return subscription;\n };\n return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n __extends(RefCountSubscriber, _super);\n function RefCountSubscriber(destination, connectable) {\n _super.call(this, destination);\n this.connectable = connectable;\n }\n RefCountSubscriber.prototype._unsubscribe = function () {\n var connectable = this.connectable;\n if (!connectable) {\n this.connection = null;\n return;\n }\n this.connectable = null;\n var refCount = connectable._refCount;\n if (refCount <= 0) {\n this.connection = null;\n return;\n }\n connectable._refCount = refCount - 1;\n if (refCount > 1) {\n this.connection = null;\n return;\n }\n ///\n // Compare the local RefCountSubscriber's connection Subscription to the\n // connection Subscription on the shared ConnectableObservable. In cases\n // where the ConnectableObservable source synchronously emits values, and\n // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n // execution continues to here before the RefCountOperator has a chance to\n // supply the RefCountSubscriber with the shared connection Subscription.\n // For example:\n // ```\n // Observable.range(0, 10)\n // .publish()\n // .refCount()\n // .take(5)\n // .subscribe();\n // ```\n // In order to account for this case, RefCountSubscriber should only dispose\n // the ConnectableObservable's shared connection Subscription if the\n // connection Subscription exists, *and* either:\n // a. RefCountSubscriber doesn't have a reference to the shared connection\n // Subscription yet, or,\n // b. RefCountSubscriber's connection Subscription reference is identical\n // to the shared connection Subscription\n ///\n var connection = this.connection;\n var sharedConnection = connectable._connection;\n this.connection = null;\n if (sharedConnection && (!connection || sharedConnection === connection)) {\n sharedConnection.unsubscribe();\n }\n };\n return RefCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=ConnectableObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvQ29ubmVjdGFibGVPYnNlcnZhYmxlLmpzP2FkNGMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9TdWJqZWN0Jyk7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xuLyoqXG4gKiBAY2xhc3MgQ29ubmVjdGFibGVPYnNlcnZhYmxlPFQ+XG4gKi9cbnZhciBDb25uZWN0YWJsZU9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb25uZWN0YWJsZU9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGFibGVPYnNlcnZhYmxlKHNvdXJjZSwgc3ViamVjdEZhY3RvcnkpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX3JlZkNvdW50ID0gMDtcbiAgICB9XG4gICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9O1xuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuZ2V0U3ViamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0O1xuICAgICAgICBpZiAoIXN1YmplY3QgfHwgc3ViamVjdC5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLnN1YmplY3RGYWN0b3J5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Q7XG4gICAgfTtcbiAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbjtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbiA9IG5ldyBTdWJzY3JpcHRpb25fMS5TdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uYWRkKHRoaXMuc291cmNlXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXcgQ29ubmVjdGFibGVTdWJzY3JpYmVyKHRoaXMuZ2V0U3ViamVjdCgpLCB0aGlzKSkpO1xuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH07XG4gICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5yZWZDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlmdChuZXcgUmVmQ291bnRPcGVyYXRvcih0aGlzKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGFibGVPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5Db25uZWN0YWJsZU9ic2VydmFibGUgPSBDb25uZWN0YWJsZU9ic2VydmFibGU7XG5leHBvcnRzLmNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgPSB7XG4gICAgb3BlcmF0b3I6IHsgdmFsdWU6IG51bGwgfSxcbiAgICBfcmVmQ291bnQ6IHsgdmFsdWU6IDAsIHdyaXRhYmxlOiB0cnVlIH0sXG4gICAgX3N1YnNjcmliZTogeyB2YWx1ZTogQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlIH0sXG4gICAgZ2V0U3ViamVjdDogeyB2YWx1ZTogQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5nZXRTdWJqZWN0IH0sXG4gICAgY29ubmVjdDogeyB2YWx1ZTogQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5jb25uZWN0IH0sXG4gICAgcmVmQ291bnQ6IHsgdmFsdWU6IENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVmQ291bnQgfVxufTtcbnZhciBDb25uZWN0YWJsZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb25uZWN0YWJsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGFibGVTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTtcbiAgICB9XG4gICAgQ29ubmVjdGFibGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2Vycm9yLmNhbGwodGhpcywgZXJyKTtcbiAgICB9O1xuICAgIENvbm5lY3RhYmxlU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgQ29ubmVjdGFibGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0YWJsZSA9IHRoaXMuY29ubmVjdGFibGU7XG4gICAgICAgIGlmIChjb25uZWN0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uO1xuICAgICAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gMDtcbiAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGFibGVTdWJzY3JpYmVyO1xufShTdWJqZWN0XzEuU3ViamVjdFN1YnNjcmliZXIpKTtcbnZhciBSZWZDb3VudE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWZDb3VudE9wZXJhdG9yKGNvbm5lY3RhYmxlKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTtcbiAgICB9XG4gICAgUmVmQ291bnRPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgdmFyIGNvbm5lY3RhYmxlID0gdGhpcy5jb25uZWN0YWJsZTtcbiAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50Kys7XG4gICAgICAgIHZhciByZWZDb3VudGVyID0gbmV3IFJlZkNvdW50U3Vic2NyaWJlcihzdWJzY3JpYmVyLCBjb25uZWN0YWJsZSk7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKHJlZkNvdW50ZXIpO1xuICAgICAgICBpZiAoIXJlZkNvdW50ZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZWZDb3VudGVyLmNvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5jb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBSZWZDb3VudE9wZXJhdG9yO1xufSgpKTtcbnZhciBSZWZDb3VudFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZDb3VudFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmQ291bnRTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTtcbiAgICB9XG4gICAgUmVmQ291bnRTdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0YWJsZSA9IHRoaXMuY29ubmVjdGFibGU7XG4gICAgICAgIGlmICghY29ubmVjdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7XG4gICAgICAgIHZhciByZWZDb3VudCA9IGNvbm5lY3RhYmxlLl9yZWZDb3VudDtcbiAgICAgICAgaWYgKHJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gcmVmQ291bnQgLSAxO1xuICAgICAgICBpZiAocmVmQ291bnQgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vL1xuICAgICAgICAvLyBDb21wYXJlIHRoZSBsb2NhbCBSZWZDb3VudFN1YnNjcmliZXIncyBjb25uZWN0aW9uIFN1YnNjcmlwdGlvbiB0byB0aGVcbiAgICAgICAgLy8gY29ubmVjdGlvbiBTdWJzY3JpcHRpb24gb24gdGhlIHNoYXJlZCBDb25uZWN0YWJsZU9ic2VydmFibGUuIEluIGNhc2VzXG4gICAgICAgIC8vIHdoZXJlIHRoZSBDb25uZWN0YWJsZU9ic2VydmFibGUgc291cmNlIHN5bmNocm9ub3VzbHkgZW1pdHMgdmFsdWVzLCBhbmRcbiAgICAgICAgLy8gdGhlIFJlZkNvdW50U3Vic2NyaWJlcidzIGRvd25zdHJlYW0gT2JzZXJ2ZXJzIHN5bmNocm9ub3VzbHkgdW5zdWJzY3JpYmUsXG4gICAgICAgIC8vIGV4ZWN1dGlvbiBjb250aW51ZXMgdG8gaGVyZSBiZWZvcmUgdGhlIFJlZkNvdW50T3BlcmF0b3IgaGFzIGEgY2hhbmNlIHRvXG4gICAgICAgIC8vIHN1cHBseSB0aGUgUmVmQ291bnRTdWJzY3JpYmVyIHdpdGggdGhlIHNoYXJlZCBjb25uZWN0aW9uIFN1YnNjcmlwdGlvbi5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGU6XG4gICAgICAgIC8vIGBgYFxuICAgICAgICAvLyBPYnNlcnZhYmxlLnJhbmdlKDAsIDEwKVxuICAgICAgICAvLyAgIC5wdWJsaXNoKClcbiAgICAgICAgLy8gICAucmVmQ291bnQoKVxuICAgICAgICAvLyAgIC50YWtlKDUpXG4gICAgICAgIC8vICAgLnN1YnNjcmliZSgpO1xuICAgICAgICAvLyBgYGBcbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gYWNjb3VudCBmb3IgdGhpcyBjYXNlLCBSZWZDb3VudFN1YnNjcmliZXIgc2hvdWxkIG9ubHkgZGlzcG9zZVxuICAgICAgICAvLyB0aGUgQ29ubmVjdGFibGVPYnNlcnZhYmxlJ3Mgc2hhcmVkIGNvbm5lY3Rpb24gU3Vic2NyaXB0aW9uIGlmIHRoZVxuICAgICAgICAvLyBjb25uZWN0aW9uIFN1YnNjcmlwdGlvbiBleGlzdHMsICphbmQqIGVpdGhlcjpcbiAgICAgICAgLy8gICBhLiBSZWZDb3VudFN1YnNjcmliZXIgZG9lc24ndCBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBzaGFyZWQgY29ubmVjdGlvblxuICAgICAgICAvLyAgICAgIFN1YnNjcmlwdGlvbiB5ZXQsIG9yLFxuICAgICAgICAvLyAgIGIuIFJlZkNvdW50U3Vic2NyaWJlcidzIGNvbm5lY3Rpb24gU3Vic2NyaXB0aW9uIHJlZmVyZW5jZSBpcyBpZGVudGljYWxcbiAgICAgICAgLy8gICAgICB0byB0aGUgc2hhcmVkIGNvbm5lY3Rpb24gU3Vic2NyaXB0aW9uXG4gICAgICAgIC8vL1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbjtcbiAgICAgICAgdmFyIHNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5fY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgaWYgKHNoYXJlZENvbm5lY3Rpb24gJiYgKCFjb25uZWN0aW9uIHx8IHNoYXJlZENvbm5lY3Rpb24gPT09IGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBzaGFyZWRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZDb3VudFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0YWJsZU9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9Db25uZWN0YWJsZU9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDU1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1277. /***/ },
  1278. /* 556 */
  1279. /***/ function(module, exports, __webpack_require__) {
  1280. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar observeOn_1 = __webpack_require__(44);\nObservable_1.Observable.prototype.observeOn = observeOn_1.observeOn;\n//# sourceMappingURL=observeOn.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9vYnNlcnZlT24uanM/YzQ4YiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgb2JzZXJ2ZU9uXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9vYnNlcnZlT24nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5vYnNlcnZlT24gPSBvYnNlcnZlT25fMS5vYnNlcnZlT247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYnNlcnZlT24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL29ic2VydmVPbi5qc1xuLy8gbW9kdWxlIGlkID0gNTU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1281. /***/ },
  1282. /* 557 */
  1283. /***/ function(module, exports, __webpack_require__) {
  1284. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar onErrorResumeNext_1 = __webpack_require__(430);\nObservable_1.Observable.prototype.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;\n//# sourceMappingURL=onErrorResumeNext.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9vbkVycm9yUmVzdW1lTmV4dC5qcz82NDZmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBvbkVycm9yUmVzdW1lTmV4dF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivb25FcnJvclJlc3VtZU5leHQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5vbkVycm9yUmVzdW1lTmV4dCA9IG9uRXJyb3JSZXN1bWVOZXh0XzEub25FcnJvclJlc3VtZU5leHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbkVycm9yUmVzdW1lTmV4dC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivb25FcnJvclJlc3VtZU5leHQuanNcbi8vIG1vZHVsZSBpZCA9IDU1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1285. /***/ },
  1286. /* 558 */
  1287. /***/ function(module, exports, __webpack_require__) {
  1288. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar pairwise_1 = __webpack_require__(559);\nObservable_1.Observable.prototype.pairwise = pairwise_1.pairwise;\n//# sourceMappingURL=pairwise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wYWlyd2lzZS5qcz9mNmM5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBwYWlyd2lzZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvcGFpcndpc2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wYWlyd2lzZSA9IHBhaXJ3aXNlXzEucGFpcndpc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYWlyd2lzZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvcGFpcndpc2UuanNcbi8vIG1vZHVsZSBpZCA9IDU1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1289. /***/ },
  1290. /* 559 */
  1291. /***/ function(module, exports, __webpack_require__) {
  1292. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Groups pairs of consecutive emissions together and emits them as an array of\n * two values.\n *\n * <span class=\"informal\">Puts the current value and previous value together as\n * an array, and emits that.</span>\n *\n * <img src=\"./img/pairwise.png\" width=\"100%\">\n *\n * The Nth emission from the source Observable will cause the output Observable\n * to emit an array [(N-1)th, Nth] of the previous and the current value, as a\n * pair. For this reason, `pairwise` emits on the second and subsequent\n * emissions from the source Observable, but not on the first emission, because\n * there is no previous value in that case.\n *\n * @example <caption>On every click (starting from the second), emit the relative distance to the previous click</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var pairs = clicks.pairwise();\n * var distance = pairs.map(pair => {\n * var x0 = pair[0].clientX;\n * var y0 = pair[0].clientY;\n * var x1 = pair[1].clientX;\n * var y1 = pair[1].clientY;\n * return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));\n * });\n * distance.subscribe(x => console.log(x));\n *\n * @see {@link buffer}\n * @see {@link bufferCount}\n *\n * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of\n * consecutive values from the source Observable.\n * @method pairwise\n * @owner Observable\n */\nfunction pairwise() {\n return this.lift(new PairwiseOperator());\n}\nexports.pairwise = pairwise;\nvar PairwiseOperator = (function () {\n function PairwiseOperator() {\n }\n PairwiseOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new PairwiseSubscriber(subscriber));\n };\n return PairwiseOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar PairwiseSubscriber = (function (_super) {\n __extends(PairwiseSubscriber, _super);\n function PairwiseSubscriber(destination) {\n _super.call(this, destination);\n this.hasPrev = false;\n }\n PairwiseSubscriber.prototype._next = function (value) {\n if (this.hasPrev) {\n this.destination.next([this.prev, value]);\n }\n else {\n this.hasPrev = true;\n }\n this.prev = value;\n };\n return PairwiseSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=pairwise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3BhaXJ3aXNlLmpzP2I4M2IiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIEdyb3VwcyBwYWlycyBvZiBjb25zZWN1dGl2ZSBlbWlzc2lvbnMgdG9nZXRoZXIgYW5kIGVtaXRzIHRoZW0gYXMgYW4gYXJyYXkgb2ZcbiAqIHR3byB2YWx1ZXMuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPlB1dHMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHByZXZpb3VzIHZhbHVlIHRvZ2V0aGVyIGFzXG4gKiBhbiBhcnJheSwgYW5kIGVtaXRzIHRoYXQuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvcGFpcndpc2UucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogVGhlIE50aCBlbWlzc2lvbiBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB3aWxsIGNhdXNlIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZVxuICogdG8gZW1pdCBhbiBhcnJheSBbKE4tMSl0aCwgTnRoXSBvZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50IHZhbHVlLCBhcyBhXG4gKiBwYWlyLiBGb3IgdGhpcyByZWFzb24sIGBwYWlyd2lzZWAgZW1pdHMgb24gdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudFxuICogZW1pc3Npb25zIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCBidXQgbm90IG9uIHRoZSBmaXJzdCBlbWlzc2lvbiwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm8gcHJldmlvdXMgdmFsdWUgaW4gdGhhdCBjYXNlLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPk9uIGV2ZXJ5IGNsaWNrIChzdGFydGluZyBmcm9tIHRoZSBzZWNvbmQpLCBlbWl0IHRoZSByZWxhdGl2ZSBkaXN0YW5jZSB0byB0aGUgcHJldmlvdXMgY2xpY2s8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHBhaXJzID0gY2xpY2tzLnBhaXJ3aXNlKCk7XG4gKiB2YXIgZGlzdGFuY2UgPSBwYWlycy5tYXAocGFpciA9PiB7XG4gKiAgIHZhciB4MCA9IHBhaXJbMF0uY2xpZW50WDtcbiAqICAgdmFyIHkwID0gcGFpclswXS5jbGllbnRZO1xuICogICB2YXIgeDEgPSBwYWlyWzFdLmNsaWVudFg7XG4gKiAgIHZhciB5MSA9IHBhaXJbMV0uY2xpZW50WTtcbiAqICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh4MCAtIHgxLCAyKSArIE1hdGgucG93KHkwIC0geTEsIDIpKTtcbiAqIH0pO1xuICogZGlzdGFuY2Uuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGJ1ZmZlcn1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlckNvdW50fVxuICpcbiAqIEByZXR1cm4ge09ic2VydmFibGU8QXJyYXk8VD4+fSBBbiBPYnNlcnZhYmxlIG9mIHBhaXJzIChhcyBhcnJheXMpIG9mXG4gKiBjb25zZWN1dGl2ZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIHBhaXJ3aXNlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBwYWlyd2lzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBQYWlyd2lzZU9wZXJhdG9yKCkpO1xufVxuZXhwb3J0cy5wYWlyd2lzZSA9IHBhaXJ3aXNlO1xudmFyIFBhaXJ3aXNlT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhaXJ3aXNlT3BlcmF0b3IoKSB7XG4gICAgfVxuICAgIFBhaXJ3aXNlT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBQYWlyd2lzZVN1YnNjcmliZXIoc3Vic2NyaWJlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFBhaXJ3aXNlT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBQYWlyd2lzZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQYWlyd2lzZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUGFpcndpc2VTdWJzY3JpYmVyKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5oYXNQcmV2ID0gZmFsc2U7XG4gICAgfVxuICAgIFBhaXJ3aXNlU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJldikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KFt0aGlzLnByZXYsIHZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhc1ByZXYgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldiA9IHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIFBhaXJ3aXNlU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhaXJ3aXNlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3BhaXJ3aXNlLmpzXG4vLyBtb2R1bGUgaWQgPSA1NTlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1293. /***/ },
  1294. /* 560 */
  1295. /***/ function(module, exports, __webpack_require__) {
  1296. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar partition_1 = __webpack_require__(561);\nObservable_1.Observable.prototype.partition = partition_1.partition;\n//# sourceMappingURL=partition.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wYXJ0aXRpb24uanM/MTE2MSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcGFydGl0aW9uXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9wYXJ0aXRpb24nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wYXJ0aXRpb24gPSBwYXJ0aXRpb25fMS5wYXJ0aXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJ0aXRpb24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3BhcnRpdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNTYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1297. /***/ },
  1298. /* 561 */
  1299. /***/ function(module, exports, __webpack_require__) {
  1300. eval("\"use strict\";\nvar not_1 = __webpack_require__(562);\nvar filter_1 = __webpack_require__(61);\n/**\n * Splits the source Observable into two, one with values that satisfy a\n * predicate, and another with values that don't satisfy the predicate.\n *\n * <span class=\"informal\">It's like {@link filter}, but returns two Observables:\n * one like the output of {@link filter}, and the other with values that did not\n * pass the condition.</span>\n *\n * <img src=\"./img/partition.png\" width=\"100%\">\n *\n * `partition` outputs an array with two Observables that partition the values\n * from the source Observable through the given `predicate` function. The first\n * Observable in that array emits source values for which the predicate argument\n * returns true. The second Observable emits source values for which the\n * predicate returns false. The first behaves like {@link filter} and the second\n * behaves like {@link filter} with the predicate negated.\n *\n * @example <caption>Partition click events into those on DIV elements and those elsewhere</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var parts = clicks.partition(ev => ev.target.tagName === 'DIV');\n * var clicksOnDivs = parts[0];\n * var clicksElsewhere = parts[1];\n * clicksOnDivs.subscribe(x => console.log('DIV clicked: ', x));\n * clicksElsewhere.subscribe(x => console.log('Other clicked: ', x));\n *\n * @see {@link filter}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted on the first Observable in the returned array, if\n * `false` the value is emitted on the second Observable in the array. The\n * `index` parameter is the number `i` for the i-th source emission that has\n * happened since the subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {[Observable<T>, Observable<T>]} An array with two Observables: one\n * with values that passed the predicate, and another with values that did not\n * pass the predicate.\n * @method partition\n * @owner Observable\n */\nfunction partition(predicate, thisArg) {\n return [\n filter_1.filter.call(this, predicate, thisArg),\n filter_1.filter.call(this, not_1.not(predicate, thisArg))\n ];\n}\nexports.partition = partition;\n//# sourceMappingURL=partition.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3BhcnRpdGlvbi5qcz8xNDAyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIG5vdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9ub3QnKTtcbnZhciBmaWx0ZXJfMSA9IHJlcXVpcmUoJy4vZmlsdGVyJyk7XG4vKipcbiAqIFNwbGl0cyB0aGUgc291cmNlIE9ic2VydmFibGUgaW50byB0d28sIG9uZSB3aXRoIHZhbHVlcyB0aGF0IHNhdGlzZnkgYVxuICogcHJlZGljYXRlLCBhbmQgYW5vdGhlciB3aXRoIHZhbHVlcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBmaWx0ZXJ9LCBidXQgcmV0dXJucyB0d28gT2JzZXJ2YWJsZXM6XG4gKiBvbmUgbGlrZSB0aGUgb3V0cHV0IG9mIHtAbGluayBmaWx0ZXJ9LCBhbmQgdGhlIG90aGVyIHdpdGggdmFsdWVzIHRoYXQgZGlkIG5vdFxuICogcGFzcyB0aGUgY29uZGl0aW9uLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3BhcnRpdGlvbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgcGFydGl0aW9uYCBvdXRwdXRzIGFuIGFycmF5IHdpdGggdHdvIE9ic2VydmFibGVzIHRoYXQgcGFydGl0aW9uIHRoZSB2YWx1ZXNcbiAqIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHRocm91Z2ggdGhlIGdpdmVuIGBwcmVkaWNhdGVgIGZ1bmN0aW9uLiBUaGUgZmlyc3RcbiAqIE9ic2VydmFibGUgaW4gdGhhdCBhcnJheSBlbWl0cyBzb3VyY2UgdmFsdWVzIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIGFyZ3VtZW50XG4gKiByZXR1cm5zIHRydWUuIFRoZSBzZWNvbmQgT2JzZXJ2YWJsZSBlbWl0cyBzb3VyY2UgdmFsdWVzIGZvciB3aGljaCB0aGVcbiAqIHByZWRpY2F0ZSByZXR1cm5zIGZhbHNlLiBUaGUgZmlyc3QgYmVoYXZlcyBsaWtlIHtAbGluayBmaWx0ZXJ9IGFuZCB0aGUgc2Vjb25kXG4gKiBiZWhhdmVzIGxpa2Uge0BsaW5rIGZpbHRlcn0gd2l0aCB0aGUgcHJlZGljYXRlIG5lZ2F0ZWQuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+UGFydGl0aW9uIGNsaWNrIGV2ZW50cyBpbnRvIHRob3NlIG9uIERJViBlbGVtZW50cyBhbmQgdGhvc2UgZWxzZXdoZXJlPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBwYXJ0cyA9IGNsaWNrcy5wYXJ0aXRpb24oZXYgPT4gZXYudGFyZ2V0LnRhZ05hbWUgPT09ICdESVYnKTtcbiAqIHZhciBjbGlja3NPbkRpdnMgPSBwYXJ0c1swXTtcbiAqIHZhciBjbGlja3NFbHNld2hlcmUgPSBwYXJ0c1sxXTtcbiAqIGNsaWNrc09uRGl2cy5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZygnRElWIGNsaWNrZWQ6ICcsIHgpKTtcbiAqIGNsaWNrc0Vsc2V3aGVyZS5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZygnT3RoZXIgY2xpY2tlZDogJywgeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGZpbHRlcn1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKTogYm9vbGVhbn0gcHJlZGljYXRlIEEgZnVuY3Rpb24gdGhhdFxuICogZXZhbHVhdGVzIGVhY2ggdmFsdWUgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuIElmIGl0IHJldHVybnMgYHRydWVgLFxuICogdGhlIHZhbHVlIGlzIGVtaXR0ZWQgb24gdGhlIGZpcnN0IE9ic2VydmFibGUgaW4gdGhlIHJldHVybmVkIGFycmF5LCBpZlxuICogYGZhbHNlYCB0aGUgdmFsdWUgaXMgZW1pdHRlZCBvbiB0aGUgc2Vjb25kIE9ic2VydmFibGUgaW4gdGhlIGFycmF5LiBUaGVcbiAqIGBpbmRleGAgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgYGlgIGZvciB0aGUgaS10aCBzb3VyY2UgZW1pc3Npb24gdGhhdCBoYXNcbiAqIGhhcHBlbmVkIHNpbmNlIHRoZSBzdWJzY3JpcHRpb24sIHN0YXJ0aW5nIGZyb20gdGhlIG51bWJlciBgMGAuXG4gKiBAcGFyYW0ge2FueX0gW3RoaXNBcmddIEFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgYHRoaXNgXG4gKiBpbiB0aGUgYHByZWRpY2F0ZWAgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtbT2JzZXJ2YWJsZTxUPiwgT2JzZXJ2YWJsZTxUPl19IEFuIGFycmF5IHdpdGggdHdvIE9ic2VydmFibGVzOiBvbmVcbiAqIHdpdGggdmFsdWVzIHRoYXQgcGFzc2VkIHRoZSBwcmVkaWNhdGUsIGFuZCBhbm90aGVyIHdpdGggdmFsdWVzIHRoYXQgZGlkIG5vdFxuICogcGFzcyB0aGUgcHJlZGljYXRlLlxuICogQG1ldGhvZCBwYXJ0aXRpb25cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHBhcnRpdGlvbihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBmaWx0ZXJfMS5maWx0ZXIuY2FsbCh0aGlzLCBwcmVkaWNhdGUsIHRoaXNBcmcpLFxuICAgICAgICBmaWx0ZXJfMS5maWx0ZXIuY2FsbCh0aGlzLCBub3RfMS5ub3QocHJlZGljYXRlLCB0aGlzQXJnKSlcbiAgICBdO1xufVxuZXhwb3J0cy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJ0aXRpb24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcGFydGl0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSA1NjFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1301. /***/ },
  1302. /* 562 */
  1303. /***/ function(module, exports) {
  1304. eval("\"use strict\";\nfunction not(pred, thisArg) {\n function notPred() {\n return !(notPred.pred.apply(notPred.thisArg, arguments));\n }\n notPred.pred = pred;\n notPred.thisArg = thisArg;\n return notPred;\n}\nexports.not = not;\n//# sourceMappingURL=not.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvbm90LmpzPzk1NjUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBub3QocHJlZCwgdGhpc0FyZykge1xuICAgIGZ1bmN0aW9uIG5vdFByZWQoKSB7XG4gICAgICAgIHJldHVybiAhKG5vdFByZWQucHJlZC5hcHBseShub3RQcmVkLnRoaXNBcmcsIGFyZ3VtZW50cykpO1xuICAgIH1cbiAgICBub3RQcmVkLnByZWQgPSBwcmVkO1xuICAgIG5vdFByZWQudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgcmV0dXJuIG5vdFByZWQ7XG59XG5leHBvcnRzLm5vdCA9IG5vdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL25vdC5qc1xuLy8gbW9kdWxlIGlkID0gNTYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1305. /***/ },
  1306. /* 563 */
  1307. /***/ function(module, exports, __webpack_require__) {
  1308. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar pluck_1 = __webpack_require__(564);\nObservable_1.Observable.prototype.pluck = pluck_1.pluck;\n//# sourceMappingURL=pluck.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wbHVjay5qcz83MWQ0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBwbHVja18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvcGx1Y2snKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wbHVjayA9IHBsdWNrXzEucGx1Y2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbHVjay5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvcGx1Y2suanNcbi8vIG1vZHVsZSBpZCA9IDU2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1309. /***/ },
  1310. /* 564 */
  1311. /***/ function(module, exports, __webpack_require__) {
  1312. eval("\"use strict\";\nvar map_1 = __webpack_require__(55);\n/**\n * Maps each source value (an object) to its specified nested property.\n *\n * <span class=\"informal\">Like {@link map}, but meant only for picking one of\n * the nested properties of every emitted object.</span>\n *\n * <img src=\"./img/pluck.png\" width=\"100%\">\n *\n * Given a list of strings describing a path to an object property, retrieves\n * the value of a specified nested property from all values in the source\n * Observable. If a property can't be resolved, it will return `undefined` for\n * that value.\n *\n * @example <caption>Map every every click to the tagName of the clicked target element</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var tagNames = clicks.pluck('target', 'tagName');\n * tagNames.subscribe(x => console.log(x));\n *\n * @see {@link map}\n *\n * @param {...string} properties The nested properties to pluck from each source\n * value (an object).\n * @return {Observable} Returns a new Observable of property values from the\n * source values.\n * @method pluck\n * @owner Observable\n */\nfunction pluck() {\n var properties = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n properties[_i - 0] = arguments[_i];\n }\n var length = properties.length;\n if (length === 0) {\n throw new Error('list of properties cannot be empty.');\n }\n return map_1.map.call(this, plucker(properties, length));\n}\nexports.pluck = pluck;\nfunction plucker(props, length) {\n var mapper = function (x) {\n var currentProp = x;\n for (var i = 0; i < length; i++) {\n var p = currentProp[props[i]];\n if (typeof p !== 'undefined') {\n currentProp = p;\n }\n else {\n return undefined;\n }\n }\n return currentProp;\n };\n return mapper;\n}\n//# sourceMappingURL=pluck.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3BsdWNrLmpzPzA5Y2IiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbWFwXzEgPSByZXF1aXJlKCcuL21hcCcpO1xuLyoqXG4gKiBNYXBzIGVhY2ggc291cmNlIHZhbHVlIChhbiBvYmplY3QpIHRvIGl0cyBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5LlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5MaWtlIHtAbGluayBtYXB9LCBidXQgbWVhbnQgb25seSBmb3IgcGlja2luZyBvbmUgb2ZcbiAqIHRoZSBuZXN0ZWQgcHJvcGVydGllcyBvZiBldmVyeSBlbWl0dGVkIG9iamVjdC48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9wbHVjay5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBHaXZlbiBhIGxpc3Qgb2Ygc3RyaW5ncyBkZXNjcmliaW5nIGEgcGF0aCB0byBhbiBvYmplY3QgcHJvcGVydHksIHJldHJpZXZlc1xuICogdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIG5lc3RlZCBwcm9wZXJ0eSBmcm9tIGFsbCB2YWx1ZXMgaW4gdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gSWYgYSBwcm9wZXJ0eSBjYW4ndCBiZSByZXNvbHZlZCwgaXQgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgZm9yXG4gKiB0aGF0IHZhbHVlLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPk1hcCBldmVyeSBldmVyeSBjbGljayB0byB0aGUgdGFnTmFtZSBvZiB0aGUgY2xpY2tlZCB0YXJnZXQgZWxlbWVudDwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgdGFnTmFtZXMgPSBjbGlja3MucGx1Y2soJ3RhcmdldCcsICd0YWdOYW1lJyk7XG4gKiB0YWdOYW1lcy5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgbWFwfVxuICpcbiAqIEBwYXJhbSB7Li4uc3RyaW5nfSBwcm9wZXJ0aWVzIFRoZSBuZXN0ZWQgcHJvcGVydGllcyB0byBwbHVjayBmcm9tIGVhY2ggc291cmNlXG4gKiB2YWx1ZSAoYW4gb2JqZWN0KS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IFJldHVybnMgYSBuZXcgT2JzZXJ2YWJsZSBvZiBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSB0aGVcbiAqIHNvdXJjZSB2YWx1ZXMuXG4gKiBAbWV0aG9kIHBsdWNrXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBwbHVjaygpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHByb3BlcnRpZXNbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbGlzdCBvZiBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBlbXB0eS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcF8xLm1hcC5jYWxsKHRoaXMsIHBsdWNrZXIocHJvcGVydGllcywgbGVuZ3RoKSk7XG59XG5leHBvcnRzLnBsdWNrID0gcGx1Y2s7XG5mdW5jdGlvbiBwbHVja2VyKHByb3BzLCBsZW5ndGgpIHtcbiAgICB2YXIgbWFwcGVyID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRQcm9wID0geDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSBjdXJyZW50UHJvcFtwcm9wc1tpXV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFByb3AgPSBwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFByb3A7XG4gICAgfTtcbiAgICByZXR1cm4gbWFwcGVyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGx1Y2suanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcGx1Y2suanNcbi8vIG1vZHVsZSBpZCA9IDU2NFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1313. /***/ },
  1314. /* 565 */
  1315. /***/ function(module, exports, __webpack_require__) {
  1316. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar publish_1 = __webpack_require__(566);\nObservable_1.Observable.prototype.publish = publish_1.publish;\n//# sourceMappingURL=publish.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoLmpzPzg4ZDUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHB1Ymxpc2hfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3B1Ymxpc2gnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wdWJsaXNoID0gcHVibGlzaF8xLnB1Ymxpc2g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoLmpzXG4vLyBtb2R1bGUgaWQgPSA1NjVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1317. /***/ },
  1318. /* 566 */
  1319. /***/ function(module, exports, __webpack_require__) {
  1320. eval("\"use strict\";\nvar Subject_1 = __webpack_require__(5);\nvar multicast_1 = __webpack_require__(554);\n/* tslint:disable:max-line-length */\n/**\n * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called\n * before it begins emitting items to those Observers that have subscribed to it.\n *\n * <img src=\"./img/publish.png\" width=\"100%\">\n *\n * @param {Function} Optional selector function which can use the multicasted source sequence as many times as needed,\n * without causing multiple subscriptions to the source sequence.\n * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n * @return a ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.\n * @method publish\n * @owner Observable\n */\nfunction publish(selector) {\n return selector ? multicast_1.multicast.call(this, function () { return new Subject_1.Subject(); }, selector) :\n multicast_1.multicast.call(this, new Subject_1.Subject());\n}\nexports.publish = publish;\n//# sourceMappingURL=publish.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3B1Ymxpc2guanM/MjI5OCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9TdWJqZWN0Jyk7XG52YXIgbXVsdGljYXN0XzEgPSByZXF1aXJlKCcuL211bHRpY2FzdCcpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFJldHVybnMgYSBDb25uZWN0YWJsZU9ic2VydmFibGUsIHdoaWNoIGlzIGEgdmFyaWV0eSBvZiBPYnNlcnZhYmxlIHRoYXQgd2FpdHMgdW50aWwgaXRzIGNvbm5lY3QgbWV0aG9kIGlzIGNhbGxlZFxuICogYmVmb3JlIGl0IGJlZ2lucyBlbWl0dGluZyBpdGVtcyB0byB0aG9zZSBPYnNlcnZlcnMgdGhhdCBoYXZlIHN1YnNjcmliZWQgdG8gaXQuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9wdWJsaXNoLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IE9wdGlvbmFsIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiB1c2UgdGhlIG11bHRpY2FzdGVkIHNvdXJjZSBzZXF1ZW5jZSBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZCxcbiAqIHdpdGhvdXQgY2F1c2luZyBtdWx0aXBsZSBzdWJzY3JpcHRpb25zIHRvIHRoZSBzb3VyY2Ugc2VxdWVuY2UuXG4gKiBTdWJzY3JpYmVycyB0byB0aGUgZ2l2ZW4gc291cmNlIHdpbGwgcmVjZWl2ZSBhbGwgbm90aWZpY2F0aW9ucyBvZiB0aGUgc291cmNlIGZyb20gdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbiBvbi5cbiAqIEByZXR1cm4gYSBDb25uZWN0YWJsZU9ic2VydmFibGUgdGhhdCB1cG9uIGNvbm5lY3Rpb24gY2F1c2VzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0byBlbWl0IGl0ZW1zIHRvIGl0cyBPYnNlcnZlcnMuXG4gKiBAbWV0aG9kIHB1Ymxpc2hcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2goc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgPyBtdWx0aWNhc3RfMS5tdWx0aWNhc3QuY2FsbCh0aGlzLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTsgfSwgc2VsZWN0b3IpIDpcbiAgICAgICAgbXVsdGljYXN0XzEubXVsdGljYXN0LmNhbGwodGhpcywgbmV3IFN1YmplY3RfMS5TdWJqZWN0KCkpO1xufVxuZXhwb3J0cy5wdWJsaXNoID0gcHVibGlzaDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1Ymxpc2guanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcHVibGlzaC5qc1xuLy8gbW9kdWxlIGlkID0gNTY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1321. /***/ },
  1322. /* 567 */
  1323. /***/ function(module, exports, __webpack_require__) {
  1324. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar publishBehavior_1 = __webpack_require__(568);\nObservable_1.Observable.prototype.publishBehavior = publishBehavior_1.publishBehavior;\n//# sourceMappingURL=publishBehavior.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoQmVoYXZpb3IuanM/NjAzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcHVibGlzaEJlaGF2aW9yXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9wdWJsaXNoQmVoYXZpb3InKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wdWJsaXNoQmVoYXZpb3IgPSBwdWJsaXNoQmVoYXZpb3JfMS5wdWJsaXNoQmVoYXZpb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoQmVoYXZpb3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3B1Ymxpc2hCZWhhdmlvci5qc1xuLy8gbW9kdWxlIGlkID0gNTY3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1325. /***/ },
  1326. /* 568 */
  1327. /***/ function(module, exports, __webpack_require__) {
  1328. eval("\"use strict\";\nvar BehaviorSubject_1 = __webpack_require__(33);\nvar multicast_1 = __webpack_require__(554);\n/**\n * @param value\n * @return {ConnectableObservable<T>}\n * @method publishBehavior\n * @owner Observable\n */\nfunction publishBehavior(value) {\n return multicast_1.multicast.call(this, new BehaviorSubject_1.BehaviorSubject(value));\n}\nexports.publishBehavior = publishBehavior;\n//# sourceMappingURL=publishBehavior.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3B1Ymxpc2hCZWhhdmlvci5qcz9mZDRjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEJlaGF2aW9yU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vQmVoYXZpb3JTdWJqZWN0Jyk7XG52YXIgbXVsdGljYXN0XzEgPSByZXF1aXJlKCcuL211bHRpY2FzdCcpO1xuLyoqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm4ge0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZTxUPn1cbiAqIEBtZXRob2QgcHVibGlzaEJlaGF2aW9yXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBwdWJsaXNoQmVoYXZpb3IodmFsdWUpIHtcbiAgICByZXR1cm4gbXVsdGljYXN0XzEubXVsdGljYXN0LmNhbGwodGhpcywgbmV3IEJlaGF2aW9yU3ViamVjdF8xLkJlaGF2aW9yU3ViamVjdCh2YWx1ZSkpO1xufVxuZXhwb3J0cy5wdWJsaXNoQmVoYXZpb3IgPSBwdWJsaXNoQmVoYXZpb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoQmVoYXZpb3IuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcHVibGlzaEJlaGF2aW9yLmpzXG4vLyBtb2R1bGUgaWQgPSA1Njhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1329. /***/ },
  1330. /* 569 */
  1331. /***/ function(module, exports, __webpack_require__) {
  1332. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar publishReplay_1 = __webpack_require__(570);\nObservable_1.Observable.prototype.publishReplay = publishReplay_1.publishReplay;\n//# sourceMappingURL=publishReplay.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoUmVwbGF5LmpzP2ZlYTAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHB1Ymxpc2hSZXBsYXlfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3B1Ymxpc2hSZXBsYXknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wdWJsaXNoUmVwbGF5ID0gcHVibGlzaFJlcGxheV8xLnB1Ymxpc2hSZXBsYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoUmVwbGF5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoUmVwbGF5LmpzXG4vLyBtb2R1bGUgaWQgPSA1Njlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1333. /***/ },
  1334. /* 570 */
  1335. /***/ function(module, exports, __webpack_require__) {
  1336. eval("\"use strict\";\nvar ReplaySubject_1 = __webpack_require__(456);\nvar multicast_1 = __webpack_require__(554);\n/**\n * @param bufferSize\n * @param windowTime\n * @param scheduler\n * @return {ConnectableObservable<T>}\n * @method publishReplay\n * @owner Observable\n */\nfunction publishReplay(bufferSize, windowTime, scheduler) {\n if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n return multicast_1.multicast.call(this, new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler));\n}\nexports.publishReplay = publishReplay;\n//# sourceMappingURL=publishReplay.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3B1Ymxpc2hSZXBsYXkuanM/ZDFjZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBSZXBsYXlTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9SZXBsYXlTdWJqZWN0Jyk7XG52YXIgbXVsdGljYXN0XzEgPSByZXF1aXJlKCcuL211bHRpY2FzdCcpO1xuLyoqXG4gKiBAcGFyYW0gYnVmZmVyU2l6ZVxuICogQHBhcmFtIHdpbmRvd1RpbWVcbiAqIEBwYXJhbSBzY2hlZHVsZXJcbiAqIEByZXR1cm4ge0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZTxUPn1cbiAqIEBtZXRob2QgcHVibGlzaFJlcGxheVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaFJlcGxheShidWZmZXJTaXplLCB3aW5kb3dUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoYnVmZmVyU2l6ZSA9PT0gdm9pZCAwKSB7IGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7IH1cbiAgICBpZiAod2luZG93VGltZSA9PT0gdm9pZCAwKSB7IHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7IH1cbiAgICByZXR1cm4gbXVsdGljYXN0XzEubXVsdGljYXN0LmNhbGwodGhpcywgbmV3IFJlcGxheVN1YmplY3RfMS5SZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcikpO1xufVxuZXhwb3J0cy5wdWJsaXNoUmVwbGF5ID0gcHVibGlzaFJlcGxheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1Ymxpc2hSZXBsYXkuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcHVibGlzaFJlcGxheS5qc1xuLy8gbW9kdWxlIGlkID0gNTcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1337. /***/ },
  1338. /* 571 */
  1339. /***/ function(module, exports, __webpack_require__) {
  1340. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar publishLast_1 = __webpack_require__(572);\nObservable_1.Observable.prototype.publishLast = publishLast_1.publishLast;\n//# sourceMappingURL=publishLast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9wdWJsaXNoTGFzdC5qcz85YmJiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBwdWJsaXNoTGFzdF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvcHVibGlzaExhc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5wdWJsaXNoTGFzdCA9IHB1Ymxpc2hMYXN0XzEucHVibGlzaExhc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoTGFzdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvcHVibGlzaExhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDU3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1341. /***/ },
  1342. /* 572 */
  1343. /***/ function(module, exports, __webpack_require__) {
  1344. eval("\"use strict\";\nvar AsyncSubject_1 = __webpack_require__(379);\nvar multicast_1 = __webpack_require__(554);\n/**\n * @return {ConnectableObservable<T>}\n * @method publishLast\n * @owner Observable\n */\nfunction publishLast() {\n return multicast_1.multicast.call(this, new AsyncSubject_1.AsyncSubject());\n}\nexports.publishLast = publishLast;\n//# sourceMappingURL=publishLast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3B1Ymxpc2hMYXN0LmpzPzI3Y2QiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQXN5bmNTdWJqZWN0XzEgPSByZXF1aXJlKCcuLi9Bc3luY1N1YmplY3QnKTtcbnZhciBtdWx0aWNhc3RfMSA9IHJlcXVpcmUoJy4vbXVsdGljYXN0Jyk7XG4vKipcbiAqIEByZXR1cm4ge0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZTxUPn1cbiAqIEBtZXRob2QgcHVibGlzaExhc3RcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hMYXN0KCkge1xuICAgIHJldHVybiBtdWx0aWNhc3RfMS5tdWx0aWNhc3QuY2FsbCh0aGlzLCBuZXcgQXN5bmNTdWJqZWN0XzEuQXN5bmNTdWJqZWN0KCkpO1xufVxuZXhwb3J0cy5wdWJsaXNoTGFzdCA9IHB1Ymxpc2hMYXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVibGlzaExhc3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcHVibGlzaExhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDU3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1345. /***/ },
  1346. /* 573 */
  1347. /***/ function(module, exports, __webpack_require__) {
  1348. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar race_1 = __webpack_require__(423);\nObservable_1.Observable.prototype.race = race_1.race;\n//# sourceMappingURL=race.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yYWNlLmpzPzRmMDAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHJhY2VfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3JhY2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yYWNlID0gcmFjZV8xLnJhY2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYWNlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9yYWNlLmpzXG4vLyBtb2R1bGUgaWQgPSA1NzNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1349. /***/ },
  1350. /* 574 */
  1351. /***/ function(module, exports, __webpack_require__) {
  1352. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar reduce_1 = __webpack_require__(56);\nObservable_1.Observable.prototype.reduce = reduce_1.reduce;\n//# sourceMappingURL=reduce.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZWR1Y2UuanM/MjY3MSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcmVkdWNlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9yZWR1Y2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZWR1Y2UgPSByZWR1Y2VfMS5yZWR1Y2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1Y2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3JlZHVjZS5qc1xuLy8gbW9kdWxlIGlkID0gNTc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1353. /***/ },
  1354. /* 575 */
  1355. /***/ function(module, exports, __webpack_require__) {
  1356. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar repeat_1 = __webpack_require__(576);\nObservable_1.Observable.prototype.repeat = repeat_1.repeat;\n//# sourceMappingURL=repeat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZXBlYXQuanM/OTA0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcmVwZWF0XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9yZXBlYXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZXBlYXQgPSByZXBlYXRfMS5yZXBlYXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXBlYXQuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3JlcGVhdC5qc1xuLy8gbW9kdWxlIGlkID0gNTc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1357. /***/ },
  1358. /* 576 */
  1359. /***/ function(module, exports, __webpack_require__) {
  1360. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar EmptyObservable_1 = __webpack_require__(41);\n/**\n * Returns an Observable that repeats the stream of items emitted by the source Observable at most count times,\n * on a particular Scheduler.\n *\n * <img src=\"./img/repeat.png\" width=\"100%\">\n *\n * @param {Scheduler} [scheduler] the Scheduler to emit the items on.\n * @param {number} [count] the number of times the source Observable items are repeated, a count of 0 will yield\n * an empty Observable.\n * @return {Observable} an Observable that repeats the stream of items emitted by the source Observable at most\n * count times.\n * @method repeat\n * @owner Observable\n */\nfunction repeat(count) {\n if (count === void 0) { count = -1; }\n if (count === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n else if (count < 0) {\n return this.lift(new RepeatOperator(-1, this));\n }\n else {\n return this.lift(new RepeatOperator(count - 1, this));\n }\n}\nexports.repeat = repeat;\nvar RepeatOperator = (function () {\n function RepeatOperator(count, source) {\n this.count = count;\n this.source = source;\n }\n RepeatOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));\n };\n return RepeatOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RepeatSubscriber = (function (_super) {\n __extends(RepeatSubscriber, _super);\n function RepeatSubscriber(destination, count, source) {\n _super.call(this, destination);\n this.count = count;\n this.source = source;\n }\n RepeatSubscriber.prototype.complete = function () {\n if (!this.isStopped) {\n var _a = this, source = _a.source, count = _a.count;\n if (count === 0) {\n return _super.prototype.complete.call(this);\n }\n else if (count > -1) {\n this.count = count - 1;\n }\n this.unsubscribe();\n this.isStopped = false;\n this.closed = false;\n source.subscribe(this);\n }\n };\n return RepeatSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=repeat.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3JlcGVhdC5qcz83N2RlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIEVtcHR5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9FbXB0eU9ic2VydmFibGUnKTtcbi8qKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgcmVwZWF0cyB0aGUgc3RyZWFtIG9mIGl0ZW1zIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGF0IG1vc3QgY291bnQgdGltZXMsXG4gKiBvbiBhIHBhcnRpY3VsYXIgU2NoZWR1bGVyLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvcmVwZWF0LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyXSB0aGUgU2NoZWR1bGVyIHRvIGVtaXQgdGhlIGl0ZW1zIG9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtjb3VudF0gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIE9ic2VydmFibGUgaXRlbXMgYXJlIHJlcGVhdGVkLCBhIGNvdW50IG9mIDAgd2lsbCB5aWVsZFxuICogYW4gZW1wdHkgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IGFuIE9ic2VydmFibGUgdGhhdCByZXBlYXRzIHRoZSBzdHJlYW0gb2YgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgYXQgbW9zdFxuICogY291bnQgdGltZXMuXG4gKiBAbWV0aG9kIHJlcGVhdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gcmVwZWF0KGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHsgY291bnQgPSAtMTsgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbmV3IEVtcHR5T2JzZXJ2YWJsZV8xLkVtcHR5T2JzZXJ2YWJsZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb3VudCA8IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlmdChuZXcgUmVwZWF0T3BlcmF0b3IoLTEsIHRoaXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFJlcGVhdE9wZXJhdG9yKGNvdW50IC0gMSwgdGhpcykpO1xuICAgIH1cbn1cbmV4cG9ydHMucmVwZWF0ID0gcmVwZWF0O1xudmFyIFJlcGVhdE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBlYXRPcGVyYXRvcihjb3VudCwgc291cmNlKSB7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIFJlcGVhdE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVwZWF0U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmNvdW50LCB0aGlzLnNvdXJjZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcGVhdE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgUmVwZWF0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlcGVhdFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwZWF0U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgY291bnQsIHNvdXJjZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIFJlcGVhdFN1YnNjcmliZXIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLCBzb3VyY2UgPSBfYS5zb3VyY2UsIGNvdW50ID0gX2EuY291bnQ7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgPiAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNvdXJjZS5zdWJzY3JpYmUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZXBlYXRTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVwZWF0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3JlcGVhdC5qc1xuLy8gbW9kdWxlIGlkID0gNTc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1361. /***/ },
  1362. /* 577 */
  1363. /***/ function(module, exports, __webpack_require__) {
  1364. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar repeatWhen_1 = __webpack_require__(578);\nObservable_1.Observable.prototype.repeatWhen = repeatWhen_1.repeatWhen;\n//# sourceMappingURL=repeatWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZXBlYXRXaGVuLmpzPzA2MzQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHJlcGVhdFdoZW5fMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3JlcGVhdFdoZW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZXBlYXRXaGVuID0gcmVwZWF0V2hlbl8xLnJlcGVhdFdoZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXBlYXRXaGVuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZXBlYXRXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA1Nzdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1365. /***/ },
  1366. /* 578 */
  1367. /***/ function(module, exports, __webpack_require__) {
  1368. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Returns an Observable that emits the same values as the source observable with the exception of a `complete`.\n * A `complete` will cause the emission of the Throwable that cause the complete to the Observable returned from\n * notificationHandler. If that Observable calls onComplete or `complete` then retry will call `complete` or `error`\n * on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular\n * Scheduler.\n *\n * <img src=\"./img/repeatWhen.png\" width=\"100%\">\n *\n * @param {notificationHandler} receives an Observable of notifications with which a user can `complete` or `error`,\n * aborting the retry.\n * @param {scheduler} the Scheduler on which to subscribe to the source Observable.\n * @return {Observable} the source Observable modified with retry logic.\n * @method repeatWhen\n * @owner Observable\n */\nfunction repeatWhen(notifier) {\n return this.lift(new RepeatWhenOperator(notifier, this));\n}\nexports.repeatWhen = repeatWhen;\nvar RepeatWhenOperator = (function () {\n function RepeatWhenOperator(notifier, source) {\n this.notifier = notifier;\n this.source = source;\n }\n RepeatWhenOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, this.source));\n };\n return RepeatWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RepeatWhenSubscriber = (function (_super) {\n __extends(RepeatWhenSubscriber, _super);\n function RepeatWhenSubscriber(destination, notifier, source) {\n _super.call(this, destination);\n this.notifier = notifier;\n this.source = source;\n }\n RepeatWhenSubscriber.prototype.complete = function () {\n if (!this.isStopped) {\n var notifications = this.notifications;\n var retries = this.retries;\n var retriesSubscription = this.retriesSubscription;\n if (!retries) {\n notifications = new Subject_1.Subject();\n retries = tryCatch_1.tryCatch(this.notifier)(notifications);\n if (retries === errorObject_1.errorObject) {\n return _super.prototype.complete.call(this);\n }\n retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);\n }\n else {\n this.notifications = null;\n this.retriesSubscription = null;\n }\n this.unsubscribe();\n this.closed = false;\n this.notifications = notifications;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n notifications.next();\n }\n };\n RepeatWhenSubscriber.prototype._unsubscribe = function () {\n var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;\n if (notifications) {\n notifications.unsubscribe();\n this.notifications = null;\n }\n if (retriesSubscription) {\n retriesSubscription.unsubscribe();\n this.retriesSubscription = null;\n }\n this.retries = null;\n };\n RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var _a = this, notifications = _a.notifications, retries = _a.retries, retriesSubscription = _a.retriesSubscription;\n this.notifications = null;\n this.retries = null;\n this.retriesSubscription = null;\n this.unsubscribe();\n this.isStopped = false;\n this.closed = false;\n this.notifications = notifications;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n this.source.subscribe(this);\n };\n return RepeatWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=repeatWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3JlcGVhdFdoZW4uanM/ZDcxNSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4uL1N1YmplY3QnKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIGBjb21wbGV0ZWAuXG4gKiBBIGBjb21wbGV0ZWAgd2lsbCBjYXVzZSB0aGUgZW1pc3Npb24gb2YgdGhlIFRocm93YWJsZSB0aGF0IGNhdXNlIHRoZSBjb21wbGV0ZSB0byB0aGUgT2JzZXJ2YWJsZSByZXR1cm5lZCBmcm9tXG4gKiBub3RpZmljYXRpb25IYW5kbGVyLiBJZiB0aGF0IE9ic2VydmFibGUgY2FsbHMgb25Db21wbGV0ZSBvciBgY29tcGxldGVgIHRoZW4gcmV0cnkgd2lsbCBjYWxsIGBjb21wbGV0ZWAgb3IgYGVycm9yYFxuICogb24gdGhlIGNoaWxkIHN1YnNjcmlwdGlvbi4gT3RoZXJ3aXNlLCB0aGlzIE9ic2VydmFibGUgd2lsbCByZXN1YnNjcmliZSB0byB0aGUgc291cmNlIG9ic2VydmFibGUsIG9uIGEgcGFydGljdWxhclxuICogU2NoZWR1bGVyLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvcmVwZWF0V2hlbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBAcGFyYW0ge25vdGlmaWNhdGlvbkhhbmRsZXJ9IHJlY2VpdmVzIGFuIE9ic2VydmFibGUgb2Ygbm90aWZpY2F0aW9ucyB3aXRoIHdoaWNoIGEgdXNlciBjYW4gYGNvbXBsZXRlYCBvciBgZXJyb3JgLFxuICogYWJvcnRpbmcgdGhlIHJldHJ5LlxuICogQHBhcmFtIHtzY2hlZHVsZXJ9IHRoZSBTY2hlZHVsZXIgb24gd2hpY2ggdG8gc3Vic2NyaWJlIHRvIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBtb2RpZmllZCB3aXRoIHJldHJ5IGxvZ2ljLlxuICogQG1ldGhvZCByZXBlYXRXaGVuXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiByZXBlYXRXaGVuKG5vdGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgUmVwZWF0V2hlbk9wZXJhdG9yKG5vdGlmaWVyLCB0aGlzKSk7XG59XG5leHBvcnRzLnJlcGVhdFdoZW4gPSByZXBlYXRXaGVuO1xudmFyIFJlcGVhdFdoZW5PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVwZWF0V2hlbk9wZXJhdG9yKG5vdGlmaWVyLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgUmVwZWF0V2hlbk9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVwZWF0V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllciwgdGhpcy5zb3VyY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXBlYXRXaGVuT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBSZXBlYXRXaGVuU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlcGVhdFdoZW5TdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlcGVhdFdoZW5TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBub3RpZmllciwgc291cmNlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgUmVwZWF0V2hlblN1YnNjcmliZXIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9ucztcbiAgICAgICAgICAgIHZhciByZXRyaWVzID0gdGhpcy5yZXRyaWVzO1xuICAgICAgICAgICAgdmFyIHJldHJpZXNTdWJzY3JpcHRpb24gPSB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb247XG4gICAgICAgICAgICBpZiAoIXJldHJpZXMpIHtcbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zID0gbmV3IFN1YmplY3RfMS5TdWJqZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0cmllcyA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godGhpcy5ub3RpZmllcikobm90aWZpY2F0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0cmllc1N1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgcmV0cmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucztcbiAgICAgICAgICAgIHRoaXMucmV0cmllcyA9IHJldHJpZXM7XG4gICAgICAgICAgICB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gPSByZXRyaWVzU3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlcGVhdFdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIG5vdGlmaWNhdGlvbnMgPSBfYS5ub3RpZmljYXRpb25zLCByZXRyaWVzU3Vic2NyaXB0aW9uID0gX2EucmV0cmllc1N1YnNjcmlwdGlvbjtcbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldHJpZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHJpZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXRyaWVzID0gbnVsbDtcbiAgICB9O1xuICAgIFJlcGVhdFdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIG5vdGlmaWNhdGlvbnMgPSBfYS5ub3RpZmljYXRpb25zLCByZXRyaWVzID0gX2EucmV0cmllcywgcmV0cmllc1N1YnNjcmlwdGlvbiA9IF9hLnJldHJpZXNTdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMucmV0cmllcyA9IG51bGw7XG4gICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucztcbiAgICAgICAgdGhpcy5yZXRyaWVzID0gcmV0cmllcztcbiAgICAgICAgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uID0gcmV0cmllc1N1YnNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcGVhdFdoZW5TdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcGVhdFdoZW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvcmVwZWF0V2hlbi5qc1xuLy8gbW9kdWxlIGlkID0gNTc4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1369. /***/ },
  1370. /* 579 */
  1371. /***/ function(module, exports, __webpack_require__) {
  1372. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar retry_1 = __webpack_require__(580);\nObservable_1.Observable.prototype.retry = retry_1.retry;\n//# sourceMappingURL=retry.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZXRyeS5qcz8wMTEzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciByZXRyeV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvcmV0cnknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZXRyeSA9IHJldHJ5XzEucmV0cnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvcmV0cnkuanNcbi8vIG1vZHVsZSBpZCA9IDU3OVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1373. /***/ },
  1374. /* 580 */
  1375. /***/ function(module, exports, __webpack_require__) {
  1376. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Returns an Observable that mirrors the source Observable, resubscribing to it if it calls `error` and the\n * predicate returns true for that specific exception and retry count.\n * If the source Observable calls `error`, this method will resubscribe to the source Observable for a maximum of\n * count resubscriptions (given as a number parameter) rather than propagating the `error` call.\n *\n * <img src=\"./img/retry.png\" width=\"100%\">\n *\n * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted\n * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second\n * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications\n * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].\n * @param {number} number of retry attempts before failing.\n * @return {Observable} the source Observable modified with the retry logic.\n * @method retry\n * @owner Observable\n */\nfunction retry(count) {\n if (count === void 0) { count = -1; }\n return this.lift(new RetryOperator(count, this));\n}\nexports.retry = retry;\nvar RetryOperator = (function () {\n function RetryOperator(count, source) {\n this.count = count;\n this.source = source;\n }\n RetryOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));\n };\n return RetryOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RetrySubscriber = (function (_super) {\n __extends(RetrySubscriber, _super);\n function RetrySubscriber(destination, count, source) {\n _super.call(this, destination);\n this.count = count;\n this.source = source;\n }\n RetrySubscriber.prototype.error = function (err) {\n if (!this.isStopped) {\n var _a = this, source = _a.source, count = _a.count;\n if (count === 0) {\n return _super.prototype.error.call(this, err);\n }\n else if (count > -1) {\n this.count = count - 1;\n }\n this.unsubscribe();\n this.isStopped = false;\n this.closed = false;\n source.subscribe(this);\n }\n };\n return RetrySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=retry.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3JldHJ5LmpzPzNhMmUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG4vKipcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IG1pcnJvcnMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCByZXN1YnNjcmliaW5nIHRvIGl0IGlmIGl0IGNhbGxzIGBlcnJvcmAgYW5kIHRoZVxuICogcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBmb3IgdGhhdCBzcGVjaWZpYyBleGNlcHRpb24gYW5kIHJldHJ5IGNvdW50LlxuICogSWYgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGNhbGxzIGBlcnJvcmAsIHRoaXMgbWV0aG9kIHdpbGwgcmVzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGZvciBhIG1heGltdW0gb2ZcbiAqIGNvdW50IHJlc3Vic2NyaXB0aW9ucyAoZ2l2ZW4gYXMgYSBudW1iZXIgcGFyYW1ldGVyKSByYXRoZXIgdGhhbiBwcm9wYWdhdGluZyB0aGUgYGVycm9yYCBjYWxsLlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvcmV0cnkucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQW55IGFuZCBhbGwgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgd2lsbCBiZSBlbWl0dGVkIGJ5IHRoZSByZXN1bHRpbmcgT2JzZXJ2YWJsZSwgZXZlbiB0aG9zZSBlbWl0dGVkXG4gKiBkdXJpbmcgZmFpbGVkIHN1YnNjcmlwdGlvbnMuIEZvciBleGFtcGxlLCBpZiBhbiBPYnNlcnZhYmxlIGZhaWxzIGF0IGZpcnN0IGJ1dCBlbWl0cyBbMSwgMl0gdGhlbiBzdWNjZWVkcyB0aGUgc2Vjb25kXG4gKiB0aW1lIGFuZCBlbWl0czogWzEsIDIsIDMsIDQsIDVdIHRoZW4gdGhlIGNvbXBsZXRlIHN0cmVhbSBvZiBlbWlzc2lvbnMgYW5kIG5vdGlmaWNhdGlvbnNcbiAqIHdvdWxkIGJlOiBbMSwgMiwgMSwgMiwgMywgNCwgNSwgYGNvbXBsZXRlYF0uXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIG9mIHJldHJ5IGF0dGVtcHRzIGJlZm9yZSBmYWlsaW5nLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZX0gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIG1vZGlmaWVkIHdpdGggdGhlIHJldHJ5IGxvZ2ljLlxuICogQG1ldGhvZCByZXRyeVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gcmV0cnkoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IHZvaWQgMCkgeyBjb3VudCA9IC0xOyB9XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgUmV0cnlPcGVyYXRvcihjb3VudCwgdGhpcykpO1xufVxuZXhwb3J0cy5yZXRyeSA9IHJldHJ5O1xudmFyIFJldHJ5T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJldHJ5T3BlcmF0b3IoY291bnQsIHNvdXJjZSkge1xuICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBSZXRyeU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmV0cnlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY291bnQsIHRoaXMuc291cmNlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmV0cnlPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFJldHJ5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJldHJ5U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXRyeVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGNvdW50LCBzb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBSZXRyeVN1YnNjcmliZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLCBzb3VyY2UgPSBfYS5zb3VyY2UsIGNvdW50ID0gX2EuY291bnQ7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3VudCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50IC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgc291cmNlLnN1YnNjcmliZSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFJldHJ5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldHJ5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3JldHJ5LmpzXG4vLyBtb2R1bGUgaWQgPSA1ODBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1377. /***/ },
  1378. /* 581 */
  1379. /***/ function(module, exports, __webpack_require__) {
  1380. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar retryWhen_1 = __webpack_require__(582);\nObservable_1.Observable.prototype.retryWhen = retryWhen_1.retryWhen;\n//# sourceMappingURL=retryWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9yZXRyeVdoZW4uanM/Y2ZjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgcmV0cnlXaGVuXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9yZXRyeVdoZW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5yZXRyeVdoZW4gPSByZXRyeVdoZW5fMS5yZXRyeVdoZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeVdoZW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3JldHJ5V2hlbi5qc1xuLy8gbW9kdWxlIGlkID0gNTgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1381. /***/ },
  1382. /* 582 */
  1383. /***/ function(module, exports, __webpack_require__) {
  1384. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Returns an Observable that emits the same values as the source observable with the exception of an `error`.\n * An `error` will cause the emission of the Throwable that cause the error to the Observable returned from\n * notificationHandler. If that Observable calls onComplete or `error` then retry will call `complete` or `error`\n * on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular\n * Scheduler.\n *\n * <img src=\"./img/retryWhen.png\" width=\"100%\">\n *\n * @param {notificationHandler} receives an Observable of notifications with which a user can `complete` or `error`,\n * aborting the retry.\n * @param {scheduler} the Scheduler on which to subscribe to the source Observable.\n * @return {Observable} the source Observable modified with retry logic.\n * @method retryWhen\n * @owner Observable\n */\nfunction retryWhen(notifier) {\n return this.lift(new RetryWhenOperator(notifier, this));\n}\nexports.retryWhen = retryWhen;\nvar RetryWhenOperator = (function () {\n function RetryWhenOperator(notifier, source) {\n this.notifier = notifier;\n this.source = source;\n }\n RetryWhenOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));\n };\n return RetryWhenOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar RetryWhenSubscriber = (function (_super) {\n __extends(RetryWhenSubscriber, _super);\n function RetryWhenSubscriber(destination, notifier, source) {\n _super.call(this, destination);\n this.notifier = notifier;\n this.source = source;\n }\n RetryWhenSubscriber.prototype.error = function (err) {\n if (!this.isStopped) {\n var errors = this.errors;\n var retries = this.retries;\n var retriesSubscription = this.retriesSubscription;\n if (!retries) {\n errors = new Subject_1.Subject();\n retries = tryCatch_1.tryCatch(this.notifier)(errors);\n if (retries === errorObject_1.errorObject) {\n return _super.prototype.error.call(this, errorObject_1.errorObject.e);\n }\n retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);\n }\n else {\n this.errors = null;\n this.retriesSubscription = null;\n }\n this.unsubscribe();\n this.closed = false;\n this.errors = errors;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n errors.next(err);\n }\n };\n RetryWhenSubscriber.prototype._unsubscribe = function () {\n var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;\n if (errors) {\n errors.unsubscribe();\n this.errors = null;\n }\n if (retriesSubscription) {\n retriesSubscription.unsubscribe();\n this.retriesSubscription = null;\n }\n this.retries = null;\n };\n RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var _a = this, errors = _a.errors, retries = _a.retries, retriesSubscription = _a.retriesSubscription;\n this.errors = null;\n this.retries = null;\n this.retriesSubscription = null;\n this.unsubscribe();\n this.isStopped = false;\n this.closed = false;\n this.errors = errors;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n this.source.subscribe(this);\n };\n return RetryWhenSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=retryWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3JldHJ5V2hlbi5qcz9iYjI1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vU3ViamVjdCcpO1xudmFyIHRyeUNhdGNoXzEgPSByZXF1aXJlKCcuLi91dGlsL3RyeUNhdGNoJyk7XG52YXIgZXJyb3JPYmplY3RfMSA9IHJlcXVpcmUoJy4uL3V0aWwvZXJyb3JPYmplY3QnKTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKipcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgc291cmNlIG9ic2VydmFibGUgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFuIGBlcnJvcmAuXG4gKiBBbiBgZXJyb3JgIHdpbGwgY2F1c2UgdGhlIGVtaXNzaW9uIG9mIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZSB0aGUgZXJyb3IgdG8gdGhlIE9ic2VydmFibGUgcmV0dXJuZWQgZnJvbVxuICogbm90aWZpY2F0aW9uSGFuZGxlci4gSWYgdGhhdCBPYnNlcnZhYmxlIGNhbGxzIG9uQ29tcGxldGUgb3IgYGVycm9yYCB0aGVuIHJldHJ5IHdpbGwgY2FsbCBgY29tcGxldGVgIG9yIGBlcnJvcmBcbiAqIG9uIHRoZSBjaGlsZCBzdWJzY3JpcHRpb24uIE90aGVyd2lzZSwgdGhpcyBPYnNlcnZhYmxlIHdpbGwgcmVzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZSBvYnNlcnZhYmxlLCBvbiBhIHBhcnRpY3VsYXJcbiAqIFNjaGVkdWxlci5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3JldHJ5V2hlbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBAcGFyYW0ge25vdGlmaWNhdGlvbkhhbmRsZXJ9IHJlY2VpdmVzIGFuIE9ic2VydmFibGUgb2Ygbm90aWZpY2F0aW9ucyB3aXRoIHdoaWNoIGEgdXNlciBjYW4gYGNvbXBsZXRlYCBvciBgZXJyb3JgLFxuICogYWJvcnRpbmcgdGhlIHJldHJ5LlxuICogQHBhcmFtIHtzY2hlZHVsZXJ9IHRoZSBTY2hlZHVsZXIgb24gd2hpY2ggdG8gc3Vic2NyaWJlIHRvIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBtb2RpZmllZCB3aXRoIHJldHJ5IGxvZ2ljLlxuICogQG1ldGhvZCByZXRyeVdoZW5cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHJldHJ5V2hlbihub3RpZmllcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFJldHJ5V2hlbk9wZXJhdG9yKG5vdGlmaWVyLCB0aGlzKSk7XG59XG5leHBvcnRzLnJldHJ5V2hlbiA9IHJldHJ5V2hlbjtcbnZhciBSZXRyeVdoZW5PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmV0cnlXaGVuT3BlcmF0b3Iobm90aWZpZXIsIHNvdXJjZSkge1xuICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBSZXRyeVdoZW5PcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFJldHJ5V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllciwgdGhpcy5zb3VyY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXRyeVdoZW5PcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFJldHJ5V2hlblN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXRyeVdoZW5TdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJldHJ5V2hlblN1YnNjcmliZXIoZGVzdGluYXRpb24sIG5vdGlmaWVyLCBzb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBSZXRyeVdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgdmFyIGVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgICAgICAgICAgdmFyIHJldHJpZXMgPSB0aGlzLnJldHJpZXM7XG4gICAgICAgICAgICB2YXIgcmV0cmllc1N1YnNjcmlwdGlvbiA9IHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgIGlmICghcmV0cmllcykge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIHJldHJpZXMgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKHRoaXMubm90aWZpZXIpKGVycm9ycyk7XG4gICAgICAgICAgICAgICAgaWYgKHJldHJpZXMgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZXJyb3IuY2FsbCh0aGlzLCBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRyaWVzU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXRyaWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgICAgdGhpcy5yZXRyaWVzID0gcmV0cmllcztcbiAgICAgICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IHJldHJpZXNTdWJzY3JpcHRpb247XG4gICAgICAgICAgICBlcnJvcnMubmV4dChlcnIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXRyeVdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGVycm9ycyA9IF9hLmVycm9ycywgcmV0cmllc1N1YnNjcmlwdGlvbiA9IF9hLnJldHJpZXNTdWJzY3JpcHRpb247XG4gICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgIGVycm9ycy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyaWVzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXRyaWVzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV0cmllcyA9IG51bGw7XG4gICAgfTtcbiAgICBSZXRyeVdoZW5TdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGVycm9ycyA9IF9hLmVycm9ycywgcmV0cmllcyA9IF9hLnJldHJpZXMsIHJldHJpZXNTdWJzY3JpcHRpb24gPSBfYS5yZXRyaWVzU3Vic2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmVycm9ycyA9IG51bGw7XG4gICAgICAgIHRoaXMucmV0cmllcyA9IG51bGw7XG4gICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHRoaXMucmV0cmllcyA9IHJldHJpZXM7XG4gICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IHJldHJpZXNTdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMuc291cmNlLnN1YnNjcmliZSh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBSZXRyeVdoZW5TdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldHJ5V2hlbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9yZXRyeVdoZW4uanNcbi8vIG1vZHVsZSBpZCA9IDU4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1385. /***/ },
  1386. /* 583 */
  1387. /***/ function(module, exports, __webpack_require__) {
  1388. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar sample_1 = __webpack_require__(584);\nObservable_1.Observable.prototype.sample = sample_1.sample;\n//# sourceMappingURL=sample.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zYW1wbGUuanM/NTRlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc2FtcGxlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9zYW1wbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zYW1wbGUgPSBzYW1wbGVfMS5zYW1wbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zYW1wbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3NhbXBsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1389. /***/ },
  1390. /* 584 */
  1391. /***/ function(module, exports, __webpack_require__) {
  1392. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Emits the most recently emitted value from the source Observable whenever\n * another Observable, the `notifier`, emits.\n *\n * <span class=\"informal\">It's like {@link sampleTime}, but samples whenever\n * the `notifier` Observable emits something.</span>\n *\n * <img src=\"./img/sample.png\" width=\"100%\">\n *\n * Whenever the `notifier` Observable emits a value or completes, `sample`\n * looks at the source Observable and emits whichever value it has most recently\n * emitted since the previous sampling, unless the source has not emitted\n * anything since the previous sampling. The `notifier` is subscribed to as soon\n * as the output Observable is subscribed.\n *\n * @example <caption>On every click, sample the most recent \"seconds\" timer</caption>\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = seconds.sample(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {Observable<any>} notifier The Observable to use for sampling the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the results of sampling the\n * values emitted by the source Observable whenever the notifier Observable\n * emits value or completes.\n * @method sample\n * @owner Observable\n */\nfunction sample(notifier) {\n return this.lift(new SampleOperator(notifier));\n}\nexports.sample = sample;\nvar SampleOperator = (function () {\n function SampleOperator(notifier) {\n this.notifier = notifier;\n }\n SampleOperator.prototype.call = function (subscriber, source) {\n var sampleSubscriber = new SampleSubscriber(subscriber);\n var subscription = source.subscribe(sampleSubscriber);\n subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));\n return subscription;\n };\n return SampleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SampleSubscriber = (function (_super) {\n __extends(SampleSubscriber, _super);\n function SampleSubscriber() {\n _super.apply(this, arguments);\n this.hasValue = false;\n }\n SampleSubscriber.prototype._next = function (value) {\n this.value = value;\n this.hasValue = true;\n };\n SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.emitValue();\n };\n SampleSubscriber.prototype.notifyComplete = function () {\n this.emitValue();\n };\n SampleSubscriber.prototype.emitValue = function () {\n if (this.hasValue) {\n this.hasValue = false;\n this.destination.next(this.value);\n }\n };\n return SampleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=sample.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NhbXBsZS5qcz83MGExIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBFbWl0cyB0aGUgbW9zdCByZWNlbnRseSBlbWl0dGVkIHZhbHVlIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHdoZW5ldmVyXG4gKiBhbm90aGVyIE9ic2VydmFibGUsIHRoZSBgbm90aWZpZXJgLCBlbWl0cy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBzYW1wbGVUaW1lfSwgYnV0IHNhbXBsZXMgd2hlbmV2ZXJcbiAqIHRoZSBgbm90aWZpZXJgIE9ic2VydmFibGUgZW1pdHMgc29tZXRoaW5nLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3NhbXBsZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBXaGVuZXZlciB0aGUgYG5vdGlmaWVyYCBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUgb3IgY29tcGxldGVzLCBgc2FtcGxlYFxuICogbG9va3MgYXQgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFuZCBlbWl0cyB3aGljaGV2ZXIgdmFsdWUgaXQgaGFzIG1vc3QgcmVjZW50bHlcbiAqIGVtaXR0ZWQgc2luY2UgdGhlIHByZXZpb3VzIHNhbXBsaW5nLCB1bmxlc3MgdGhlIHNvdXJjZSBoYXMgbm90IGVtaXR0ZWRcbiAqIGFueXRoaW5nIHNpbmNlIHRoZSBwcmV2aW91cyBzYW1wbGluZy4gVGhlIGBub3RpZmllcmAgaXMgc3Vic2NyaWJlZCB0byBhcyBzb29uXG4gKiBhcyB0aGUgb3V0cHV0IE9ic2VydmFibGUgaXMgc3Vic2NyaWJlZC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5PbiBldmVyeSBjbGljaywgc2FtcGxlIHRoZSBtb3N0IHJlY2VudCBcInNlY29uZHNcIiB0aW1lcjwvY2FwdGlvbj5cbiAqIHZhciBzZWNvbmRzID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gc2Vjb25kcy5zYW1wbGUoY2xpY2tzKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgYXVkaXR9XG4gKiBAc2VlIHtAbGluayBkZWJvdW5jZX1cbiAqIEBzZWUge0BsaW5rIHNhbXBsZVRpbWV9XG4gKiBAc2VlIHtAbGluayB0aHJvdHRsZX1cbiAqXG4gKiBAcGFyYW0ge09ic2VydmFibGU8YW55Pn0gbm90aWZpZXIgVGhlIE9ic2VydmFibGUgdG8gdXNlIGZvciBzYW1wbGluZyB0aGVcbiAqIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHRzIG9mIHNhbXBsaW5nIHRoZVxuICogdmFsdWVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHdoZW5ldmVyIHRoZSBub3RpZmllciBPYnNlcnZhYmxlXG4gKiBlbWl0cyB2YWx1ZSBvciBjb21wbGV0ZXMuXG4gKiBAbWV0aG9kIHNhbXBsZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2FtcGxlKG5vdGlmaWVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgU2FtcGxlT3BlcmF0b3Iobm90aWZpZXIpKTtcbn1cbmV4cG9ydHMuc2FtcGxlID0gc2FtcGxlO1xudmFyIFNhbXBsZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTYW1wbGVPcGVyYXRvcihub3RpZmllcikge1xuICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7XG4gICAgfVxuICAgIFNhbXBsZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICB2YXIgc2FtcGxlU3Vic2NyaWJlciA9IG5ldyBTYW1wbGVTdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShzYW1wbGVTdWJzY3JpYmVyKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHNhbXBsZVN1YnNjcmliZXIsIHRoaXMubm90aWZpZXIpKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBTYW1wbGVPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFNhbXBsZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTYW1wbGVTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNhbXBsZVN1YnNjcmliZXIoKSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIFNhbXBsZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgfTtcbiAgICBTYW1wbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgfTtcbiAgICBTYW1wbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICB9O1xuICAgIFNhbXBsZVN1YnNjcmliZXIucHJvdG90eXBlLmVtaXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFNhbXBsZVN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2FtcGxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3NhbXBsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1393. /***/ },
  1394. /* 585 */
  1395. /***/ function(module, exports, __webpack_require__) {
  1396. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar sampleTime_1 = __webpack_require__(586);\nObservable_1.Observable.prototype.sampleTime = sampleTime_1.sampleTime;\n//# sourceMappingURL=sampleTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zYW1wbGVUaW1lLmpzPzNjNWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHNhbXBsZVRpbWVfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3NhbXBsZVRpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zYW1wbGVUaW1lID0gc2FtcGxlVGltZV8xLnNhbXBsZVRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zYW1wbGVUaW1lLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9zYW1wbGVUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA1ODVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1397. /***/ },
  1398. /* 586 */
  1399. /***/ function(module, exports, __webpack_require__) {
  1400. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar async_1 = __webpack_require__(414);\n/**\n * Emits the most recently emitted value from the source Observable within\n * periodic time intervals.\n *\n * <span class=\"informal\">Samples the source Observable at periodic time\n * intervals, emitting what it samples.</span>\n *\n * <img src=\"./img/sampleTime.png\" width=\"100%\">\n *\n * `sampleTime` periodically looks at the source Observable and emits whichever\n * value it has most recently emitted since the previous sampling, unless the\n * source has not emitted anything since the previous sampling. The sampling\n * happens periodically in time every `period` milliseconds (or the time unit\n * defined by the optional `scheduler` argument). The sampling starts as soon as\n * the output Observable is subscribed.\n *\n * @example <caption>Every second, emit the most recent click at most once</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.sampleTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sample}\n * @see {@link throttleTime}\n *\n * @param {number} period The sampling period expressed in milliseconds or the\n * time unit determined internally by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link Scheduler} to use for\n * managing the timers that handle the sampling.\n * @return {Observable<T>} An Observable that emits the results of sampling the\n * values emitted by the source Observable at the specified time interval.\n * @method sampleTime\n * @owner Observable\n */\nfunction sampleTime(period, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new SampleTimeOperator(period, scheduler));\n}\nexports.sampleTime = sampleTime;\nvar SampleTimeOperator = (function () {\n function SampleTimeOperator(period, scheduler) {\n this.period = period;\n this.scheduler = scheduler;\n }\n SampleTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));\n };\n return SampleTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SampleTimeSubscriber = (function (_super) {\n __extends(SampleTimeSubscriber, _super);\n function SampleTimeSubscriber(destination, period, scheduler) {\n _super.call(this, destination);\n this.period = period;\n this.scheduler = scheduler;\n this.hasValue = false;\n this.add(scheduler.schedule(dispatchNotification, period, { subscriber: this, period: period }));\n }\n SampleTimeSubscriber.prototype._next = function (value) {\n this.lastValue = value;\n this.hasValue = true;\n };\n SampleTimeSubscriber.prototype.notifyNext = function () {\n if (this.hasValue) {\n this.hasValue = false;\n this.destination.next(this.lastValue);\n }\n };\n return SampleTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNotification(state) {\n var subscriber = state.subscriber, period = state.period;\n subscriber.notifyNext();\n this.schedule(state, period);\n}\n//# sourceMappingURL=sampleTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NhbXBsZVRpbWUuanM/ZmYzOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBhc3luY18xID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL2FzeW5jJyk7XG4vKipcbiAqIEVtaXRzIHRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUgd2l0aGluXG4gKiBwZXJpb2RpYyB0aW1lIGludGVydmFscy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+U2FtcGxlcyB0aGUgc291cmNlIE9ic2VydmFibGUgYXQgcGVyaW9kaWMgdGltZVxuICogaW50ZXJ2YWxzLCBlbWl0dGluZyB3aGF0IGl0IHNhbXBsZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvc2FtcGxlVGltZS5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBgc2FtcGxlVGltZWAgcGVyaW9kaWNhbGx5IGxvb2tzIGF0IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBhbmQgZW1pdHMgd2hpY2hldmVyXG4gKiB2YWx1ZSBpdCBoYXMgbW9zdCByZWNlbnRseSBlbWl0dGVkIHNpbmNlIHRoZSBwcmV2aW91cyBzYW1wbGluZywgdW5sZXNzIHRoZVxuICogc291cmNlIGhhcyBub3QgZW1pdHRlZCBhbnl0aGluZyBzaW5jZSB0aGUgcHJldmlvdXMgc2FtcGxpbmcuIFRoZSBzYW1wbGluZ1xuICogaGFwcGVucyBwZXJpb2RpY2FsbHkgaW4gdGltZSBldmVyeSBgcGVyaW9kYCBtaWxsaXNlY29uZHMgKG9yIHRoZSB0aW1lIHVuaXRcbiAqIGRlZmluZWQgYnkgdGhlIG9wdGlvbmFsIGBzY2hlZHVsZXJgIGFyZ3VtZW50KS4gVGhlIHNhbXBsaW5nIHN0YXJ0cyBhcyBzb29uIGFzXG4gKiB0aGUgb3V0cHV0IE9ic2VydmFibGUgaXMgc3Vic2NyaWJlZC5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FdmVyeSBzZWNvbmQsIGVtaXQgdGhlIG1vc3QgcmVjZW50IGNsaWNrIGF0IG1vc3Qgb25jZTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLnNhbXBsZVRpbWUoMTAwMCk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIGF1ZGl0VGltZX1cbiAqIEBzZWUge0BsaW5rIGRlYm91bmNlVGltZX1cbiAqIEBzZWUge0BsaW5rIGRlbGF5fVxuICogQHNlZSB7QGxpbmsgc2FtcGxlfVxuICogQHNlZSB7QGxpbmsgdGhyb3R0bGVUaW1lfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBwZXJpb2QgVGhlIHNhbXBsaW5nIHBlcmlvZCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIG9yIHRoZVxuICogdGltZSB1bml0IGRldGVybWluZWQgaW50ZXJuYWxseSBieSB0aGUgb3B0aW9uYWwgYHNjaGVkdWxlcmAuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1hc3luY10gVGhlIHtAbGluayBTY2hlZHVsZXJ9IHRvIHVzZSBmb3JcbiAqIG1hbmFnaW5nIHRoZSB0aW1lcnMgdGhhdCBoYW5kbGUgdGhlIHNhbXBsaW5nLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHRzIG9mIHNhbXBsaW5nIHRoZVxuICogdmFsdWVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGF0IHRoZSBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbC5cbiAqIEBtZXRob2Qgc2FtcGxlVGltZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2FtcGxlVGltZShwZXJpb2QsIHNjaGVkdWxlcikge1xuICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgeyBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jOyB9XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgU2FtcGxlVGltZU9wZXJhdG9yKHBlcmlvZCwgc2NoZWR1bGVyKSk7XG59XG5leHBvcnRzLnNhbXBsZVRpbWUgPSBzYW1wbGVUaW1lO1xudmFyIFNhbXBsZVRpbWVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2FtcGxlVGltZU9wZXJhdG9yKHBlcmlvZCwgc2NoZWR1bGVyKSB7XG4gICAgICAgIHRoaXMucGVyaW9kID0gcGVyaW9kO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG4gICAgU2FtcGxlVGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgU2FtcGxlVGltZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wZXJpb2QsIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gU2FtcGxlVGltZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2FtcGxlVGltZVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTYW1wbGVUaW1lU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYW1wbGVUaW1lU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcGVyaW9kLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnBlcmlvZCA9IHBlcmlvZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTm90aWZpY2F0aW9uLCBwZXJpb2QsIHsgc3Vic2NyaWJlcjogdGhpcywgcGVyaW9kOiBwZXJpb2QgfSkpO1xuICAgIH1cbiAgICBTYW1wbGVUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgfTtcbiAgICBTYW1wbGVUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmxhc3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTYW1wbGVUaW1lU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmZ1bmN0aW9uIGRpc3BhdGNoTm90aWZpY2F0aW9uKHN0YXRlKSB7XG4gICAgdmFyIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyLCBwZXJpb2QgPSBzdGF0ZS5wZXJpb2Q7XG4gICAgc3Vic2NyaWJlci5ub3RpZnlOZXh0KCk7XG4gICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgcGVyaW9kKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNhbXBsZVRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2FtcGxlVGltZS5qc1xuLy8gbW9kdWxlIGlkID0gNTg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1401. /***/ },
  1402. /* 587 */
  1403. /***/ function(module, exports, __webpack_require__) {
  1404. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar scan_1 = __webpack_require__(588);\nObservable_1.Observable.prototype.scan = scan_1.scan;\n//# sourceMappingURL=scan.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zY2FuLmpzPzJiNDgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHNjYW5fMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3NjYW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zY2FuID0gc2Nhbl8xLnNjYW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zY2FuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9zY2FuLmpzXG4vLyBtb2R1bGUgaWQgPSA1ODdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1405. /***/ },
  1406. /* 588 */
  1407. /***/ function(module, exports, __webpack_require__) {
  1408. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/* tslint:disable:max-line-length */\n/**\n * Applies an accumulator function over the source Observable, and returns each\n * intermediate result, with an optional seed value.\n *\n * <span class=\"informal\">It's like {@link reduce}, but emits the current\n * accumulation whenever the source emits a value.</span>\n *\n * <img src=\"./img/scan.png\" width=\"100%\">\n *\n * Combines together all values emitted on the source, using an accumulator\n * function that knows how to join a new source value into the accumulation from\n * the past. Is similar to {@link reduce}, but emits the intermediate\n * accumulations.\n *\n * Returns an Observable that applies a specified `accumulator` function to each\n * item emitted by the source Observable. If a `seed` value is specified, then\n * that value will be used as the initial value for the accumulator. If no seed\n * value is specified, the first item of the source is used as the seed.\n *\n * @example <caption>Count the number of click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var ones = clicks.mapTo(1);\n * var seed = 0;\n * var count = ones.scan((acc, one) => acc + one, seed);\n * count.subscribe(x => console.log(x));\n *\n * @see {@link expand}\n * @see {@link mergeScan}\n * @see {@link reduce}\n *\n * @param {function(acc: R, value: T, index: number): R} accumulator\n * The accumulator function called on each source value.\n * @param {T|R} [seed] The initial accumulation value.\n * @return {Observable<R>} An observable of the accumulated values.\n * @method scan\n * @owner Observable\n */\nfunction scan(accumulator, seed) {\n var hasSeed = false;\n // providing a seed of `undefined` *should* be valid and trigger\n // hasSeed! so don't use `seed !== undefined` checks!\n // For this reason, we have to check it here at the original call site\n // otherwise inside Operator/Subscriber we won't know if `undefined`\n // means they didn't provide anything or if they literally provided `undefined`\n if (arguments.length >= 2) {\n hasSeed = true;\n }\n return this.lift(new ScanOperator(accumulator, seed, hasSeed));\n}\nexports.scan = scan;\nvar ScanOperator = (function () {\n function ScanOperator(accumulator, seed, hasSeed) {\n if (hasSeed === void 0) { hasSeed = false; }\n this.accumulator = accumulator;\n this.seed = seed;\n this.hasSeed = hasSeed;\n }\n ScanOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n };\n return ScanOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ScanSubscriber = (function (_super) {\n __extends(ScanSubscriber, _super);\n function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n _super.call(this, destination);\n this.accumulator = accumulator;\n this._seed = _seed;\n this.hasSeed = hasSeed;\n this.index = 0;\n }\n Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n get: function () {\n return this._seed;\n },\n set: function (value) {\n this.hasSeed = true;\n this._seed = value;\n },\n enumerable: true,\n configurable: true\n });\n ScanSubscriber.prototype._next = function (value) {\n if (!this.hasSeed) {\n this.seed = value;\n this.destination.next(value);\n }\n else {\n return this._tryNext(value);\n }\n };\n ScanSubscriber.prototype._tryNext = function (value) {\n var index = this.index++;\n var result;\n try {\n result = this.accumulator(this.seed, value, index);\n }\n catch (err) {\n this.destination.error(err);\n }\n this.seed = result;\n this.destination.next(result);\n };\n return ScanSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=scan.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NjYW4uanM/MjZiMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBBcHBsaWVzIGFuIGFjY3VtdWxhdG9yIGZ1bmN0aW9uIG92ZXIgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCBhbmQgcmV0dXJucyBlYWNoXG4gKiBpbnRlcm1lZGlhdGUgcmVzdWx0LCB3aXRoIGFuIG9wdGlvbmFsIHNlZWQgdmFsdWUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgcmVkdWNlfSwgYnV0IGVtaXRzIHRoZSBjdXJyZW50XG4gKiBhY2N1bXVsYXRpb24gd2hlbmV2ZXIgdGhlIHNvdXJjZSBlbWl0cyBhIHZhbHVlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3NjYW4ucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQ29tYmluZXMgdG9nZXRoZXIgYWxsIHZhbHVlcyBlbWl0dGVkIG9uIHRoZSBzb3VyY2UsIHVzaW5nIGFuIGFjY3VtdWxhdG9yXG4gKiBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBqb2luIGEgbmV3IHNvdXJjZSB2YWx1ZSBpbnRvIHRoZSBhY2N1bXVsYXRpb24gZnJvbVxuICogdGhlIHBhc3QuIElzIHNpbWlsYXIgdG8ge0BsaW5rIHJlZHVjZX0sIGJ1dCBlbWl0cyB0aGUgaW50ZXJtZWRpYXRlXG4gKiBhY2N1bXVsYXRpb25zLlxuICpcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGFwcGxpZXMgYSBzcGVjaWZpZWQgYGFjY3VtdWxhdG9yYCBmdW5jdGlvbiB0byBlYWNoXG4gKiBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLiBJZiBhIGBzZWVkYCB2YWx1ZSBpcyBzcGVjaWZpZWQsIHRoZW5cbiAqIHRoYXQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgYWNjdW11bGF0b3IuIElmIG5vIHNlZWRcbiAqIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIHNvdXJjZSBpcyB1c2VkIGFzIHRoZSBzZWVkLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNvdW50IHRoZSBudW1iZXIgb2YgY2xpY2sgZXZlbnRzPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciBvbmVzID0gY2xpY2tzLm1hcFRvKDEpO1xuICogdmFyIHNlZWQgPSAwO1xuICogdmFyIGNvdW50ID0gb25lcy5zY2FuKChhY2MsIG9uZSkgPT4gYWNjICsgb25lLCBzZWVkKTtcbiAqIGNvdW50LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBleHBhbmR9XG4gKiBAc2VlIHtAbGluayBtZXJnZVNjYW59XG4gKiBAc2VlIHtAbGluayByZWR1Y2V9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbihhY2M6IFIsIHZhbHVlOiBULCBpbmRleDogbnVtYmVyKTogUn0gYWNjdW11bGF0b3JcbiAqIFRoZSBhY2N1bXVsYXRvciBmdW5jdGlvbiBjYWxsZWQgb24gZWFjaCBzb3VyY2UgdmFsdWUuXG4gKiBAcGFyYW0ge1R8Un0gW3NlZWRdIFRoZSBpbml0aWFsIGFjY3VtdWxhdGlvbiB2YWx1ZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8Uj59IEFuIG9ic2VydmFibGUgb2YgdGhlIGFjY3VtdWxhdGVkIHZhbHVlcy5cbiAqIEBtZXRob2Qgc2NhblxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2NhbihhY2N1bXVsYXRvciwgc2VlZCkge1xuICAgIHZhciBoYXNTZWVkID0gZmFsc2U7XG4gICAgLy8gcHJvdmlkaW5nIGEgc2VlZCBvZiBgdW5kZWZpbmVkYCAqc2hvdWxkKiBiZSB2YWxpZCBhbmQgdHJpZ2dlclxuICAgIC8vIGhhc1NlZWQhIHNvIGRvbid0IHVzZSBgc2VlZCAhPT0gdW5kZWZpbmVkYCBjaGVja3MhXG4gICAgLy8gRm9yIHRoaXMgcmVhc29uLCB3ZSBoYXZlIHRvIGNoZWNrIGl0IGhlcmUgYXQgdGhlIG9yaWdpbmFsIGNhbGwgc2l0ZVxuICAgIC8vIG90aGVyd2lzZSBpbnNpZGUgT3BlcmF0b3IvU3Vic2NyaWJlciB3ZSB3b24ndCBrbm93IGlmIGB1bmRlZmluZWRgXG4gICAgLy8gbWVhbnMgdGhleSBkaWRuJ3QgcHJvdmlkZSBhbnl0aGluZyBvciBpZiB0aGV5IGxpdGVyYWxseSBwcm92aWRlZCBgdW5kZWZpbmVkYFxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgaGFzU2VlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFNjYW5PcGVyYXRvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCkpO1xufVxuZXhwb3J0cy5zY2FuID0gc2NhbjtcbnZhciBTY2FuT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjYW5PcGVyYXRvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCkge1xuICAgICAgICBpZiAoaGFzU2VlZCA9PT0gdm9pZCAwKSB7IGhhc1NlZWQgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3I7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgfVxuICAgIFNjYW5PcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNjYW5TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYWNjdW11bGF0b3IsIHRoaXMuc2VlZCwgdGhpcy5oYXNTZWVkKSk7XG4gICAgfTtcbiAgICByZXR1cm4gU2Nhbk9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2NhblN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTY2FuU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTY2FuU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgYWNjdW11bGF0b3IsIF9zZWVkLCBoYXNTZWVkKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yO1xuICAgICAgICB0aGlzLl9zZWVkID0gX3NlZWQ7XG4gICAgICAgIHRoaXMuaGFzU2VlZCA9IGhhc1NlZWQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2NhblN1YnNjcmliZXIucHJvdG90eXBlLCBcInNlZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZWVkO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5oYXNTZWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlZWQgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU2NhblN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNTZWVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJ5TmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNjYW5TdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5TmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFjY3VtdWxhdG9yKHRoaXMuc2VlZCwgdmFsdWUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWVkID0gcmVzdWx0O1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTtcbiAgICB9O1xuICAgIHJldHVybiBTY2FuU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjYW4uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2Nhbi5qc1xuLy8gbW9kdWxlIGlkID0gNTg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1409. /***/ },
  1410. /* 589 */
  1411. /***/ function(module, exports, __webpack_require__) {
  1412. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar sequenceEqual_1 = __webpack_require__(590);\nObservable_1.Observable.prototype.sequenceEqual = sequenceEqual_1.sequenceEqual;\n//# sourceMappingURL=sequenceEqual.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zZXF1ZW5jZUVxdWFsLmpzPzFkOGEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHNlcXVlbmNlRXF1YWxfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3NlcXVlbmNlRXF1YWwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zZXF1ZW5jZUVxdWFsID0gc2VxdWVuY2VFcXVhbF8xLnNlcXVlbmNlRXF1YWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXF1ZW5jZUVxdWFsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9zZXF1ZW5jZUVxdWFsLmpzXG4vLyBtb2R1bGUgaWQgPSA1ODlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1413. /***/ },
  1414. /* 590 */
  1415. /***/ function(module, exports, __webpack_require__) {
  1416. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\n/**\n * Compares all values of two observables in sequence using an optional comparor function\n * and returns an observable of a single boolean value representing whether or not the two sequences\n * are equal.\n *\n * <span class=\"informal\">Checks to see of all values emitted by both observables are equal, in order.</span>\n *\n * <img src=\"./img/sequenceEqual.png\" width=\"100%\">\n *\n * `sequenceEqual` subscribes to two observables and buffers incoming values from each observable. Whenever either\n * observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom\n * up; If any value pair doesn't match, the returned observable will emit `false` and complete. If one of the\n * observables completes, the operator will wait for the other observable to complete; If the other\n * observable emits before completing, the returned observable will emit `false` and complete. If one observable never\n * completes or emits after the other complets, the returned observable will never complete.\n *\n * @example <caption>figure out if the Konami code matches</caption>\n * var code = Rx.Observable.from([\n * \"ArrowUp\",\n * \"ArrowUp\",\n * \"ArrowDown\",\n * \"ArrowDown\",\n * \"ArrowLeft\",\n * \"ArrowRight\",\n * \"ArrowLeft\",\n * \"ArrowRight\",\n * \"KeyB\",\n * \"KeyA\",\n * \"Enter\" // no start key, clearly.\n * ]);\n *\n * var keys = Rx.Observable.fromEvent(document, 'keyup')\n * .map(e => e.code);\n * var matches = keys.bufferCount(11, 1)\n * .mergeMap(\n * last11 =>\n * Rx.Observable.from(last11)\n * .sequenceEqual(code)\n * );\n * matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));\n *\n * @see {@link combineLatest}\n * @see {@link zip}\n * @see {@link withLatestFrom}\n *\n * @param {Observable} compareTo the observable sequence to compare the source sequence to.\n * @param {function} [comparor] An optional function to compare each value pair\n * @return {Observable} An Observable of a single boolean value representing whether or not\n * the values emitted by both observables were equal in sequence\n * @method sequenceEqual\n * @owner Observable\n */\nfunction sequenceEqual(compareTo, comparor) {\n return this.lift(new SequenceEqualOperator(compareTo, comparor));\n}\nexports.sequenceEqual = sequenceEqual;\nvar SequenceEqualOperator = (function () {\n function SequenceEqualOperator(compareTo, comparor) {\n this.compareTo = compareTo;\n this.comparor = comparor;\n }\n SequenceEqualOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparor));\n };\n return SequenceEqualOperator;\n}());\nexports.SequenceEqualOperator = SequenceEqualOperator;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SequenceEqualSubscriber = (function (_super) {\n __extends(SequenceEqualSubscriber, _super);\n function SequenceEqualSubscriber(destination, compareTo, comparor) {\n _super.call(this, destination);\n this.compareTo = compareTo;\n this.comparor = comparor;\n this._a = [];\n this._b = [];\n this._oneComplete = false;\n this.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, this)));\n }\n SequenceEqualSubscriber.prototype._next = function (value) {\n if (this._oneComplete && this._b.length === 0) {\n this.emit(false);\n }\n else {\n this._a.push(value);\n this.checkValues();\n }\n };\n SequenceEqualSubscriber.prototype._complete = function () {\n if (this._oneComplete) {\n this.emit(this._a.length === 0 && this._b.length === 0);\n }\n else {\n this._oneComplete = true;\n }\n };\n SequenceEqualSubscriber.prototype.checkValues = function () {\n var _c = this, _a = _c._a, _b = _c._b, comparor = _c.comparor;\n while (_a.length > 0 && _b.length > 0) {\n var a = _a.shift();\n var b = _b.shift();\n var areEqual = false;\n if (comparor) {\n areEqual = tryCatch_1.tryCatch(comparor)(a, b);\n if (areEqual === errorObject_1.errorObject) {\n this.destination.error(errorObject_1.errorObject.e);\n }\n }\n else {\n areEqual = a === b;\n }\n if (!areEqual) {\n this.emit(false);\n }\n }\n };\n SequenceEqualSubscriber.prototype.emit = function (value) {\n var destination = this.destination;\n destination.next(value);\n destination.complete();\n };\n SequenceEqualSubscriber.prototype.nextB = function (value) {\n if (this._oneComplete && this._a.length === 0) {\n this.emit(false);\n }\n else {\n this._b.push(value);\n this.checkValues();\n }\n };\n return SequenceEqualSubscriber;\n}(Subscriber_1.Subscriber));\nexports.SequenceEqualSubscriber = SequenceEqualSubscriber;\nvar SequenceEqualCompareToSubscriber = (function (_super) {\n __extends(SequenceEqualCompareToSubscriber, _super);\n function SequenceEqualCompareToSubscriber(destination, parent) {\n _super.call(this, destination);\n this.parent = parent;\n }\n SequenceEqualCompareToSubscriber.prototype._next = function (value) {\n this.parent.nextB(value);\n };\n SequenceEqualCompareToSubscriber.prototype._error = function (err) {\n this.parent.error(err);\n };\n SequenceEqualCompareToSubscriber.prototype._complete = function () {\n this.parent._complete();\n };\n return SequenceEqualCompareToSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=sequenceEqual.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NlcXVlbmNlRXF1YWwuanM/NzQ2MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG4vKipcbiAqIENvbXBhcmVzIGFsbCB2YWx1ZXMgb2YgdHdvIG9ic2VydmFibGVzIGluIHNlcXVlbmNlIHVzaW5nIGFuIG9wdGlvbmFsIGNvbXBhcm9yIGZ1bmN0aW9uXG4gKiBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlIG9mIGEgc2luZ2xlIGJvb2xlYW4gdmFsdWUgcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gc2VxdWVuY2VzXG4gKiBhcmUgZXF1YWwuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkNoZWNrcyB0byBzZWUgb2YgYWxsIHZhbHVlcyBlbWl0dGVkIGJ5IGJvdGggb2JzZXJ2YWJsZXMgYXJlIGVxdWFsLCBpbiBvcmRlci48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9zZXF1ZW5jZUVxdWFsLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBzZXF1ZW5jZUVxdWFsYCBzdWJzY3JpYmVzIHRvIHR3byBvYnNlcnZhYmxlcyBhbmQgYnVmZmVycyBpbmNvbWluZyB2YWx1ZXMgZnJvbSBlYWNoIG9ic2VydmFibGUuIFdoZW5ldmVyIGVpdGhlclxuICogb2JzZXJ2YWJsZSBlbWl0cyBhIHZhbHVlLCB0aGUgdmFsdWUgaXMgYnVmZmVyZWQgYW5kIHRoZSBidWZmZXJzIGFyZSBzaGlmdGVkIGFuZCBjb21wYXJlZCBmcm9tIHRoZSBib3R0b21cbiAqIHVwOyBJZiBhbnkgdmFsdWUgcGFpciBkb2Vzbid0IG1hdGNoLCB0aGUgcmV0dXJuZWQgb2JzZXJ2YWJsZSB3aWxsIGVtaXQgYGZhbHNlYCBhbmQgY29tcGxldGUuIElmIG9uZSBvZiB0aGVcbiAqIG9ic2VydmFibGVzIGNvbXBsZXRlcywgdGhlIG9wZXJhdG9yIHdpbGwgd2FpdCBmb3IgdGhlIG90aGVyIG9ic2VydmFibGUgdG8gY29tcGxldGU7IElmIHRoZSBvdGhlclxuICogb2JzZXJ2YWJsZSBlbWl0cyBiZWZvcmUgY29tcGxldGluZywgdGhlIHJldHVybmVkIG9ic2VydmFibGUgd2lsbCBlbWl0IGBmYWxzZWAgYW5kIGNvbXBsZXRlLiBJZiBvbmUgb2JzZXJ2YWJsZSBuZXZlclxuICogY29tcGxldGVzIG9yIGVtaXRzIGFmdGVyIHRoZSBvdGhlciBjb21wbGV0cywgdGhlIHJldHVybmVkIG9ic2VydmFibGUgd2lsbCBuZXZlciBjb21wbGV0ZS5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5maWd1cmUgb3V0IGlmIHRoZSBLb25hbWkgY29kZSBtYXRjaGVzPC9jYXB0aW9uPlxuICogdmFyIGNvZGUgPSBSeC5PYnNlcnZhYmxlLmZyb20oW1xuICogIFwiQXJyb3dVcFwiLFxuICogIFwiQXJyb3dVcFwiLFxuICogIFwiQXJyb3dEb3duXCIsXG4gKiAgXCJBcnJvd0Rvd25cIixcbiAqICBcIkFycm93TGVmdFwiLFxuICogIFwiQXJyb3dSaWdodFwiLFxuICogIFwiQXJyb3dMZWZ0XCIsXG4gKiAgXCJBcnJvd1JpZ2h0XCIsXG4gKiAgXCJLZXlCXCIsXG4gKiAgXCJLZXlBXCIsXG4gKiAgXCJFbnRlclwiIC8vIG5vIHN0YXJ0IGtleSwgY2xlYXJseS5cbiAqIF0pO1xuICpcbiAqIHZhciBrZXlzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcpXG4gKiAgLm1hcChlID0+IGUuY29kZSk7XG4gKiB2YXIgbWF0Y2hlcyA9IGtleXMuYnVmZmVyQ291bnQoMTEsIDEpXG4gKiAgLm1lcmdlTWFwKFxuICogICAgbGFzdDExID0+XG4gKiAgICAgIFJ4Lk9ic2VydmFibGUuZnJvbShsYXN0MTEpXG4gKiAgICAgICAgLnNlcXVlbmNlRXF1YWwoY29kZSlcbiAqICAgKTtcbiAqIG1hdGNoZXMuc3Vic2NyaWJlKG1hdGNoZWQgPT4gY29uc29sZS5sb2coJ1N1Y2Nlc3NmdWwgY2hlYXQgYXQgQ29udHJhPyAnLCBtYXRjaGVkKSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29tYmluZUxhdGVzdH1cbiAqIEBzZWUge0BsaW5rIHppcH1cbiAqIEBzZWUge0BsaW5rIHdpdGhMYXRlc3RGcm9tfVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gY29tcGFyZVRvIHRoZSBvYnNlcnZhYmxlIHNlcXVlbmNlIHRvIGNvbXBhcmUgdGhlIHNvdXJjZSBzZXF1ZW5jZSB0by5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb21wYXJvcl0gQW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gY29tcGFyZSBlYWNoIHZhbHVlIHBhaXJcbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgb2YgYSBzaW5nbGUgYm9vbGVhbiB2YWx1ZSByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3RcbiAqIHRoZSB2YWx1ZXMgZW1pdHRlZCBieSBib3RoIG9ic2VydmFibGVzIHdlcmUgZXF1YWwgaW4gc2VxdWVuY2VcbiAqIEBtZXRob2Qgc2VxdWVuY2VFcXVhbFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2VxdWVuY2VFcXVhbChjb21wYXJlVG8sIGNvbXBhcm9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgU2VxdWVuY2VFcXVhbE9wZXJhdG9yKGNvbXBhcmVUbywgY29tcGFyb3IpKTtcbn1cbmV4cG9ydHMuc2VxdWVuY2VFcXVhbCA9IHNlcXVlbmNlRXF1YWw7XG52YXIgU2VxdWVuY2VFcXVhbE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXF1ZW5jZUVxdWFsT3BlcmF0b3IoY29tcGFyZVRvLCBjb21wYXJvcikge1xuICAgICAgICB0aGlzLmNvbXBhcmVUbyA9IGNvbXBhcmVUbztcbiAgICAgICAgdGhpcy5jb21wYXJvciA9IGNvbXBhcm9yO1xuICAgIH1cbiAgICBTZXF1ZW5jZUVxdWFsT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBTZXF1ZW5jZUVxdWFsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmNvbXBhcmVUbywgdGhpcy5jb21wYXJvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFNlcXVlbmNlRXF1YWxPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnRzLlNlcXVlbmNlRXF1YWxPcGVyYXRvciA9IFNlcXVlbmNlRXF1YWxPcGVyYXRvcjtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2VxdWVuY2VFcXVhbFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTZXF1ZW5jZUVxdWFsU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTZXF1ZW5jZUVxdWFsU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgY29tcGFyZVRvLCBjb21wYXJvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuY29tcGFyZVRvID0gY29tcGFyZVRvO1xuICAgICAgICB0aGlzLmNvbXBhcm9yID0gY29tcGFyb3I7XG4gICAgICAgIHRoaXMuX2EgPSBbXTtcbiAgICAgICAgdGhpcy5fYiA9IFtdO1xuICAgICAgICB0aGlzLl9vbmVDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZChjb21wYXJlVG8uc3Vic2NyaWJlKG5ldyBTZXF1ZW5jZUVxdWFsQ29tcGFyZVRvU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgdGhpcykpKTtcbiAgICB9XG4gICAgU2VxdWVuY2VFcXVhbFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9vbmVDb21wbGV0ZSAmJiB0aGlzLl9iLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2EucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNlcXVlbmNlRXF1YWxTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9vbmVDb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KHRoaXMuX2EubGVuZ3RoID09PSAwICYmIHRoaXMuX2IubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX29uZUNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2VxdWVuY2VFcXVhbFN1YnNjcmliZXIucHJvdG90eXBlLmNoZWNrVmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2MgPSB0aGlzLCBfYSA9IF9jLl9hLCBfYiA9IF9jLl9iLCBjb21wYXJvciA9IF9jLmNvbXBhcm9yO1xuICAgICAgICB3aGlsZSAoX2EubGVuZ3RoID4gMCAmJiBfYi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgYSA9IF9hLnNoaWZ0KCk7XG4gICAgICAgICAgICB2YXIgYiA9IF9iLnNoaWZ0KCk7XG4gICAgICAgICAgICB2YXIgYXJlRXF1YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjb21wYXJvcikge1xuICAgICAgICAgICAgICAgIGFyZUVxdWFsID0gdHJ5Q2F0Y2hfMS50cnlDYXRjaChjb21wYXJvcikoYSwgYik7XG4gICAgICAgICAgICAgICAgaWYgKGFyZUVxdWFsID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcmVFcXVhbCA9IGEgPT09IGI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFyZUVxdWFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU2VxdWVuY2VFcXVhbFN1YnNjcmliZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBTZXF1ZW5jZUVxdWFsU3Vic2NyaWJlci5wcm90b3R5cGUubmV4dEIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX29uZUNvbXBsZXRlICYmIHRoaXMuX2EubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYi5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFNlcXVlbmNlRXF1YWxTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZXhwb3J0cy5TZXF1ZW5jZUVxdWFsU3Vic2NyaWJlciA9IFNlcXVlbmNlRXF1YWxTdWJzY3JpYmVyO1xudmFyIFNlcXVlbmNlRXF1YWxDb21wYXJlVG9TdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2VxdWVuY2VFcXVhbENvbXBhcmVUb1N1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2VxdWVuY2VFcXVhbENvbXBhcmVUb1N1YnNjcmliZXIoZGVzdGluYXRpb24sIHBhcmVudCkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICBTZXF1ZW5jZUVxdWFsQ29tcGFyZVRvU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQubmV4dEIodmFsdWUpO1xuICAgIH07XG4gICAgU2VxdWVuY2VFcXVhbENvbXBhcmVUb1N1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQuZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIFNlcXVlbmNlRXF1YWxDb21wYXJlVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGFyZW50Ll9jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIFNlcXVlbmNlRXF1YWxDb21wYXJlVG9TdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VxdWVuY2VFcXVhbC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9zZXF1ZW5jZUVxdWFsLmpzXG4vLyBtb2R1bGUgaWQgPSA1OTBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1417. /***/ },
  1418. /* 591 */
  1419. /***/ function(module, exports, __webpack_require__) {
  1420. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar share_1 = __webpack_require__(592);\nObservable_1.Observable.prototype.share = share_1.share;\n//# sourceMappingURL=share.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zaGFyZS5qcz9lNjY2Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBzaGFyZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivc2hhcmUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zaGFyZSA9IHNoYXJlXzEuc2hhcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFyZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivc2hhcmUuanNcbi8vIG1vZHVsZSBpZCA9IDU5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1421. /***/ },
  1422. /* 592 */
  1423. /***/ function(module, exports, __webpack_require__) {
  1424. eval("\"use strict\";\nvar multicast_1 = __webpack_require__(554);\nvar Subject_1 = __webpack_require__(5);\nfunction shareSubjectFactory() {\n return new Subject_1.Subject();\n}\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n * This is an alias for .publish().refCount().\n *\n * <img src=\"./img/share.png\" width=\"100%\">\n *\n * @return {Observable<T>} an Observable that upon connection causes the source Observable to emit items to its Observers\n * @method share\n * @owner Observable\n */\nfunction share() {\n return multicast_1.multicast.call(this, shareSubjectFactory).refCount();\n}\nexports.share = share;\n;\n//# sourceMappingURL=share.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NoYXJlLmpzP2I2ZmUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbXVsdGljYXN0XzEgPSByZXF1aXJlKCcuL211bHRpY2FzdCcpO1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4uL1N1YmplY3QnKTtcbmZ1bmN0aW9uIHNoYXJlU3ViamVjdEZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IE9ic2VydmFibGUgdGhhdCBtdWx0aWNhc3RzIChzaGFyZXMpIHRoZSBvcmlnaW5hbCBPYnNlcnZhYmxlLiBBcyBsb25nIGFzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZVxuICogU3Vic2NyaWJlciB0aGlzIE9ic2VydmFibGUgd2lsbCBiZSBzdWJzY3JpYmVkIGFuZCBlbWl0dGluZyBkYXRhLiBXaGVuIGFsbCBzdWJzY3JpYmVycyBoYXZlIHVuc3Vic2NyaWJlZCBpdCB3aWxsXG4gKiB1bnN1YnNjcmliZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gQmVjYXVzZSB0aGUgT2JzZXJ2YWJsZSBpcyBtdWx0aWNhc3RpbmcgaXQgbWFrZXMgdGhlIHN0cmVhbSBgaG90YC5cbiAqIFRoaXMgaXMgYW4gYWxpYXMgZm9yIC5wdWJsaXNoKCkucmVmQ291bnQoKS5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3NoYXJlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIEByZXR1cm4ge09ic2VydmFibGU8VD59IGFuIE9ic2VydmFibGUgdGhhdCB1cG9uIGNvbm5lY3Rpb24gY2F1c2VzIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB0byBlbWl0IGl0ZW1zIHRvIGl0cyBPYnNlcnZlcnNcbiAqIEBtZXRob2Qgc2hhcmVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHNoYXJlKCkge1xuICAgIHJldHVybiBtdWx0aWNhc3RfMS5tdWx0aWNhc3QuY2FsbCh0aGlzLCBzaGFyZVN1YmplY3RGYWN0b3J5KS5yZWZDb3VudCgpO1xufVxuZXhwb3J0cy5zaGFyZSA9IHNoYXJlO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2hhcmUuanNcbi8vIG1vZHVsZSBpZCA9IDU5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1425. /***/ },
  1426. /* 593 */
  1427. /***/ function(module, exports, __webpack_require__) {
  1428. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar single_1 = __webpack_require__(594);\nObservable_1.Observable.prototype.single = single_1.single;\n//# sourceMappingURL=single.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zaW5nbGUuanM/YmZkNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc2luZ2xlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9zaW5nbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zaW5nbGUgPSBzaW5nbGVfMS5zaW5nbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5nbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3NpbmdsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTkzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1429. /***/ },
  1430. /* 594 */
  1431. /***/ function(module, exports, __webpack_require__) {
  1432. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar EmptyError_1 = __webpack_require__(54);\n/**\n * Returns an Observable that emits the single item emitted by the source Observable that matches a specified\n * predicate, if that Observable emits one such item. If the source Observable emits more than one such item or no\n * such items, notify of an IllegalArgumentException or NoSuchElementException respectively.\n *\n * <img src=\"./img/single.png\" width=\"100%\">\n *\n * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`\n * callback if the Observable completes before any `next` notification was sent.\n * @param {Function} a predicate function to evaluate items emitted by the source Observable.\n * @return {Observable<T>} an Observable that emits the single item emitted by the source Observable that matches\n * the predicate.\n .\n * @method single\n * @owner Observable\n */\nfunction single(predicate) {\n return this.lift(new SingleOperator(predicate, this));\n}\nexports.single = single;\nvar SingleOperator = (function () {\n function SingleOperator(predicate, source) {\n this.predicate = predicate;\n this.source = source;\n }\n SingleOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));\n };\n return SingleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SingleSubscriber = (function (_super) {\n __extends(SingleSubscriber, _super);\n function SingleSubscriber(destination, predicate, source) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.source = source;\n this.seenValue = false;\n this.index = 0;\n }\n SingleSubscriber.prototype.applySingleValue = function (value) {\n if (this.seenValue) {\n this.destination.error('Sequence contains more than one element');\n }\n else {\n this.seenValue = true;\n this.singleValue = value;\n }\n };\n SingleSubscriber.prototype._next = function (value) {\n var predicate = this.predicate;\n this.index++;\n if (predicate) {\n this.tryNext(value);\n }\n else {\n this.applySingleValue(value);\n }\n };\n SingleSubscriber.prototype.tryNext = function (value) {\n try {\n var result = this.predicate(value, this.index, this.source);\n if (result) {\n this.applySingleValue(value);\n }\n }\n catch (err) {\n this.destination.error(err);\n }\n };\n SingleSubscriber.prototype._complete = function () {\n var destination = this.destination;\n if (this.index > 0) {\n destination.next(this.seenValue ? this.singleValue : undefined);\n destination.complete();\n }\n else {\n destination.error(new EmptyError_1.EmptyError);\n }\n };\n return SingleSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=single.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NpbmdsZS5qcz9kNTgyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIEVtcHR5RXJyb3JfMSA9IHJlcXVpcmUoJy4uL3V0aWwvRW1wdHlFcnJvcicpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgc2luZ2xlIGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkXG4gKiBwcmVkaWNhdGUsIGlmIHRoYXQgT2JzZXJ2YWJsZSBlbWl0cyBvbmUgc3VjaCBpdGVtLiBJZiB0aGUgc291cmNlIE9ic2VydmFibGUgZW1pdHMgbW9yZSB0aGFuIG9uZSBzdWNoIGl0ZW0gb3Igbm9cbiAqIHN1Y2ggaXRlbXMsIG5vdGlmeSBvZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gb3IgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiByZXNwZWN0aXZlbHkuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9zaW5nbGUucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHRocm93cyB7RW1wdHlFcnJvcn0gRGVsaXZlcnMgYW4gRW1wdHlFcnJvciB0byB0aGUgT2JzZXJ2ZXIncyBgZXJyb3JgXG4gKiBjYWxsYmFjayBpZiB0aGUgT2JzZXJ2YWJsZSBjb21wbGV0ZXMgYmVmb3JlIGFueSBgbmV4dGAgbm90aWZpY2F0aW9uIHdhcyBzZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFQ+fSBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHNpbmdsZSBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHRoYXQgbWF0Y2hlc1xuICogdGhlIHByZWRpY2F0ZS5cbiAuXG4gKiBAbWV0aG9kIHNpbmdsZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2luZ2xlKHByZWRpY2F0ZSkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFNpbmdsZU9wZXJhdG9yKHByZWRpY2F0ZSwgdGhpcykpO1xufVxuZXhwb3J0cy5zaW5nbGUgPSBzaW5nbGU7XG52YXIgU2luZ2xlT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbmdsZU9wZXJhdG9yKHByZWRpY2F0ZSwgc291cmNlKSB7XG4gICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgU2luZ2xlT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBTaW5nbGVTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnNvdXJjZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbmdsZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2luZ2xlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNpbmdsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2luZ2xlU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlLCBzb3VyY2UpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuc2VlblZhbHVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBTaW5nbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5hcHBseVNpbmdsZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnNlZW5WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcignU2VxdWVuY2UgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBlbGVtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlZW5WYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZVZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpbmdsZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB0aGlzLnByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICBpZiAocHJlZGljYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnRyeU5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBseVNpbmdsZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2luZ2xlU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5TmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucHJlZGljYXRlKHZhbHVlLCB0aGlzLmluZGV4LCB0aGlzLnNvdXJjZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVNpbmdsZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpbmdsZVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPiAwKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHRoaXMuc2VlblZhbHVlID8gdGhpcy5zaW5nbGVWYWx1ZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IobmV3IEVtcHR5RXJyb3JfMS5FbXB0eUVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFNpbmdsZVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaW5nbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2luZ2xlLmpzXG4vLyBtb2R1bGUgaWQgPSA1OTRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1433. /***/ },
  1434. /* 595 */
  1435. /***/ function(module, exports, __webpack_require__) {
  1436. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar skip_1 = __webpack_require__(596);\nObservable_1.Observable.prototype.skip = skip_1.skip;\n//# sourceMappingURL=skip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9za2lwLmpzPzQyNzciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHNraXBfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3NraXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5za2lwID0gc2tpcF8xLnNraXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lwLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9za2lwLmpzXG4vLyBtb2R1bGUgaWQgPSA1OTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1437. /***/ },
  1438. /* 596 */
  1439. /***/ function(module, exports, __webpack_require__) {
  1440. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Returns an Observable that skips `n` items emitted by an Observable.\n *\n * <img src=\"./img/skip.png\" width=\"100%\">\n *\n * @param {Number} the `n` of times, items emitted by source Observable should be skipped.\n * @return {Observable} an Observable that skips values emitted by the source Observable.\n *\n * @method skip\n * @owner Observable\n */\nfunction skip(total) {\n return this.lift(new SkipOperator(total));\n}\nexports.skip = skip;\nvar SkipOperator = (function () {\n function SkipOperator(total) {\n this.total = total;\n }\n SkipOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SkipSubscriber(subscriber, this.total));\n };\n return SkipOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipSubscriber = (function (_super) {\n __extends(SkipSubscriber, _super);\n function SkipSubscriber(destination, total) {\n _super.call(this, destination);\n this.total = total;\n this.count = 0;\n }\n SkipSubscriber.prototype._next = function (x) {\n if (++this.count > this.total) {\n this.destination.next(x);\n }\n };\n return SkipSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NraXAuanM/MDkzNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgc2tpcHMgYG5gIGl0ZW1zIGVtaXR0ZWQgYnkgYW4gT2JzZXJ2YWJsZS5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3NraXAucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHRoZSBgbmAgb2YgdGltZXMsIGl0ZW1zIGVtaXR0ZWQgYnkgc291cmNlIE9ic2VydmFibGUgc2hvdWxkIGJlIHNraXBwZWQuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBPYnNlcnZhYmxlIHRoYXQgc2tpcHMgdmFsdWVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICpcbiAqIEBtZXRob2Qgc2tpcFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc2tpcCh0b3RhbCkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFNraXBPcGVyYXRvcih0b3RhbCkpO1xufVxuZXhwb3J0cy5za2lwID0gc2tpcDtcbnZhciBTa2lwT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNraXBPcGVyYXRvcih0b3RhbCkge1xuICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XG4gICAgfVxuICAgIFNraXBPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNraXBTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMudG90YWwpKTtcbiAgICB9O1xuICAgIHJldHVybiBTa2lwT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBTa2lwU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNraXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNraXBTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCB0b3RhbCkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIFNraXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGlmICgrK3RoaXMuY291bnQgPiB0aGlzLnRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTa2lwU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNraXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2tpcC5qc1xuLy8gbW9kdWxlIGlkID0gNTk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1441. /***/ },
  1442. /* 597 */
  1443. /***/ function(module, exports, __webpack_require__) {
  1444. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar skipUntil_1 = __webpack_require__(598);\nObservable_1.Observable.prototype.skipUntil = skipUntil_1.skipUntil;\n//# sourceMappingURL=skipUntil.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9za2lwVW50aWwuanM/OWQ4MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc2tpcFVudGlsXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9za2lwVW50aWwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5za2lwVW50aWwgPSBza2lwVW50aWxfMS5za2lwVW50aWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lwVW50aWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3NraXBVbnRpbC5qc1xuLy8gbW9kdWxlIGlkID0gNTk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1445. /***/ },
  1446. /* 598 */
  1447. /***/ function(module, exports, __webpack_require__) {
  1448. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.\n *\n * <img src=\"./img/skipUntil.png\" width=\"100%\">\n *\n * @param {Observable} the second Observable that has to emit an item before the source Observable's elements begin to\n * be mirrored by the resulting Observable.\n * @return {Observable<T>} an Observable that skips items from the source Observable until the second Observable emits\n * an item, then emits the remaining items.\n * @method skipUntil\n * @owner Observable\n */\nfunction skipUntil(notifier) {\n return this.lift(new SkipUntilOperator(notifier));\n}\nexports.skipUntil = skipUntil;\nvar SkipUntilOperator = (function () {\n function SkipUntilOperator(notifier) {\n this.notifier = notifier;\n }\n SkipUntilOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SkipUntilSubscriber(subscriber, this.notifier));\n };\n return SkipUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipUntilSubscriber = (function (_super) {\n __extends(SkipUntilSubscriber, _super);\n function SkipUntilSubscriber(destination, notifier) {\n _super.call(this, destination);\n this.hasValue = false;\n this.isInnerStopped = false;\n this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n }\n SkipUntilSubscriber.prototype._next = function (value) {\n if (this.hasValue) {\n _super.prototype._next.call(this, value);\n }\n };\n SkipUntilSubscriber.prototype._complete = function () {\n if (this.isInnerStopped) {\n _super.prototype._complete.call(this);\n }\n else {\n this.unsubscribe();\n }\n };\n SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.hasValue = true;\n };\n SkipUntilSubscriber.prototype.notifyComplete = function () {\n this.isInnerStopped = true;\n if (this.isStopped) {\n _super.prototype._complete.call(this);\n }\n };\n return SkipUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=skipUntil.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NraXBVbnRpbC5qcz9kZjlhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBza2lwcyBpdGVtcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB1bnRpbCBhIHNlY29uZCBPYnNlcnZhYmxlIGVtaXRzIGFuIGl0ZW0uXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9za2lwVW50aWwucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSB0aGUgc2Vjb25kIE9ic2VydmFibGUgdGhhdCBoYXMgdG8gZW1pdCBhbiBpdGVtIGJlZm9yZSB0aGUgc291cmNlIE9ic2VydmFibGUncyBlbGVtZW50cyBiZWdpbiB0b1xuICogYmUgbWlycm9yZWQgYnkgdGhlIHJlc3VsdGluZyBPYnNlcnZhYmxlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gYW4gT2JzZXJ2YWJsZSB0aGF0IHNraXBzIGl0ZW1zIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHVudGlsIHRoZSBzZWNvbmQgT2JzZXJ2YWJsZSBlbWl0c1xuICogYW4gaXRlbSwgdGhlbiBlbWl0cyB0aGUgcmVtYWluaW5nIGl0ZW1zLlxuICogQG1ldGhvZCBza2lwVW50aWxcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHNraXBVbnRpbChub3RpZmllcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFNraXBVbnRpbE9wZXJhdG9yKG5vdGlmaWVyKSk7XG59XG5leHBvcnRzLnNraXBVbnRpbCA9IHNraXBVbnRpbDtcbnZhciBTa2lwVW50aWxPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2tpcFVudGlsT3BlcmF0b3Iobm90aWZpZXIpIHtcbiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyO1xuICAgIH1cbiAgICBTa2lwVW50aWxPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNraXBVbnRpbFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFNraXBVbnRpbE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2tpcFVudGlsU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNraXBVbnRpbFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2tpcFVudGlsU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgbm90aWZpZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNJbm5lclN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBub3RpZmllcikpO1xuICAgIH1cbiAgICBTa2lwVW50aWxTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fbmV4dC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2tpcFVudGlsU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0lubmVyU3RvcHBlZCkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2tpcFVudGlsU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9O1xuICAgIFNraXBVbnRpbFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlzSW5uZXJTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gU2tpcFVudGlsU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lwVW50aWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc2tpcFVudGlsLmpzXG4vLyBtb2R1bGUgaWQgPSA1OThcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1449. /***/ },
  1450. /* 599 */
  1451. /***/ function(module, exports, __webpack_require__) {
  1452. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar skipWhile_1 = __webpack_require__(600);\nObservable_1.Observable.prototype.skipWhile = skipWhile_1.skipWhile;\n//# sourceMappingURL=skipWhile.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9za2lwV2hpbGUuanM/ODhlZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc2tpcFdoaWxlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9za2lwV2hpbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5za2lwV2hpbGUgPSBza2lwV2hpbGVfMS5za2lwV2hpbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1za2lwV2hpbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3NraXBXaGlsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1453. /***/ },
  1454. /* 600 */
  1455. /***/ function(module, exports, __webpack_require__) {
  1456. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds\n * true, but emits all further source items as soon as the condition becomes false.\n *\n * <img src=\"./img/skipWhile.png\" width=\"100%\">\n *\n * @param {Function} predicate - a function to test each item emitted from the source Observable.\n * @return {Observable<T>} an Observable that begins emitting items emitted by the source Observable when the\n * specified predicate becomes false.\n * @method skipWhile\n * @owner Observable\n */\nfunction skipWhile(predicate) {\n return this.lift(new SkipWhileOperator(predicate));\n}\nexports.skipWhile = skipWhile;\nvar SkipWhileOperator = (function () {\n function SkipWhileOperator(predicate) {\n this.predicate = predicate;\n }\n SkipWhileOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));\n };\n return SkipWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SkipWhileSubscriber = (function (_super) {\n __extends(SkipWhileSubscriber, _super);\n function SkipWhileSubscriber(destination, predicate) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.skipping = true;\n this.index = 0;\n }\n SkipWhileSubscriber.prototype._next = function (value) {\n var destination = this.destination;\n if (this.skipping) {\n this.tryCallPredicate(value);\n }\n if (!this.skipping) {\n destination.next(value);\n }\n };\n SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {\n try {\n var result = this.predicate(value, this.index++);\n this.skipping = Boolean(result);\n }\n catch (err) {\n this.destination.error(err);\n }\n };\n return SkipWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=skipWhile.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3NraXBXaGlsZS5qcz80ZjBiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBza2lwcyBhbGwgaXRlbXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgYXMgbG9uZyBhcyBhIHNwZWNpZmllZCBjb25kaXRpb24gaG9sZHNcbiAqIHRydWUsIGJ1dCBlbWl0cyBhbGwgZnVydGhlciBzb3VyY2UgaXRlbXMgYXMgc29vbiBhcyB0aGUgY29uZGl0aW9uIGJlY29tZXMgZmFsc2UuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9za2lwV2hpbGUucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIC0gYSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggaXRlbSBlbWl0dGVkIGZyb20gdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gYW4gT2JzZXJ2YWJsZSB0aGF0IGJlZ2lucyBlbWl0dGluZyBpdGVtcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB3aGVuIHRoZVxuICogc3BlY2lmaWVkIHByZWRpY2F0ZSBiZWNvbWVzIGZhbHNlLlxuICogQG1ldGhvZCBza2lwV2hpbGVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHNraXBXaGlsZShwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBTa2lwV2hpbGVPcGVyYXRvcihwcmVkaWNhdGUpKTtcbn1cbmV4cG9ydHMuc2tpcFdoaWxlID0gc2tpcFdoaWxlO1xudmFyIFNraXBXaGlsZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTa2lwV2hpbGVPcGVyYXRvcihwcmVkaWNhdGUpIHtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgfVxuICAgIFNraXBXaGlsZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgU2tpcFdoaWxlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByZWRpY2F0ZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFNraXBXaGlsZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU2tpcFdoaWxlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNraXBXaGlsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2tpcFdoaWxlU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMuc2tpcHBpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgU2tpcFdoaWxlU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuc2tpcHBpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5Q2FsbFByZWRpY2F0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNraXBwaW5nKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2tpcFdoaWxlU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5Q2FsbFByZWRpY2F0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucHJlZGljYXRlKHZhbHVlLCB0aGlzLmluZGV4KyspO1xuICAgICAgICAgICAgdGhpcy5za2lwcGluZyA9IEJvb2xlYW4ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTa2lwV2hpbGVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2tpcFdoaWxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3NraXBXaGlsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1457. /***/ },
  1458. /* 601 */
  1459. /***/ function(module, exports, __webpack_require__) {
  1460. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar startWith_1 = __webpack_require__(602);\nObservable_1.Observable.prototype.startWith = startWith_1.startWith;\n//# sourceMappingURL=startWith.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zdGFydFdpdGguanM/MTUxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc3RhcnRXaXRoXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9zdGFydFdpdGgnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zdGFydFdpdGggPSBzdGFydFdpdGhfMS5zdGFydFdpdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGFydFdpdGguanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3N0YXJ0V2l0aC5qc1xuLy8gbW9kdWxlIGlkID0gNjAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1461. /***/ },
  1462. /* 602 */
  1463. /***/ function(module, exports, __webpack_require__) {
  1464. eval("\"use strict\";\nvar ArrayObservable_1 = __webpack_require__(39);\nvar ScalarObservable_1 = __webpack_require__(40);\nvar EmptyObservable_1 = __webpack_require__(41);\nvar concat_1 = __webpack_require__(388);\nvar isScheduler_1 = __webpack_require__(42);\n/* tslint:disable:max-line-length */\n/**\n * Returns an Observable that emits the items in a specified Iterable before it begins to emit items emitted by the\n * source Observable.\n *\n * <img src=\"./img/startWith.png\" width=\"100%\">\n *\n * @param {Values} an Iterable that contains the items you want the modified Observable to emit first.\n * @return {Observable} an Observable that emits the items in the specified Iterable and then emits the items\n * emitted by the source Observable.\n * @method startWith\n * @owner Observable\n */\nfunction startWith() {\n var array = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n array[_i - 0] = arguments[_i];\n }\n var scheduler = array[array.length - 1];\n if (isScheduler_1.isScheduler(scheduler)) {\n array.pop();\n }\n else {\n scheduler = null;\n }\n var len = array.length;\n if (len === 1) {\n return concat_1.concatStatic(new ScalarObservable_1.ScalarObservable(array[0], scheduler), this);\n }\n else if (len > 1) {\n return concat_1.concatStatic(new ArrayObservable_1.ArrayObservable(array, scheduler), this);\n }\n else {\n return concat_1.concatStatic(new EmptyObservable_1.EmptyObservable(scheduler), this);\n }\n}\nexports.startWith = startWith;\n//# sourceMappingURL=startWith.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3N0YXJ0V2l0aC5qcz9mYmJmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEFycmF5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9BcnJheU9ic2VydmFibGUnKTtcbnZhciBTY2FsYXJPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9vYnNlcnZhYmxlL1NjYWxhck9ic2VydmFibGUnKTtcbnZhciBFbXB0eU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL29ic2VydmFibGUvRW1wdHlPYnNlcnZhYmxlJyk7XG52YXIgY29uY2F0XzEgPSByZXF1aXJlKCcuL2NvbmNhdCcpO1xudmFyIGlzU2NoZWR1bGVyXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzU2NoZWR1bGVyJyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGl0ZW1zIGluIGEgc3BlY2lmaWVkIEl0ZXJhYmxlIGJlZm9yZSBpdCBiZWdpbnMgdG8gZW1pdCBpdGVtcyBlbWl0dGVkIGJ5IHRoZVxuICogc291cmNlIE9ic2VydmFibGUuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9zdGFydFdpdGgucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogQHBhcmFtIHtWYWx1ZXN9IGFuIEl0ZXJhYmxlIHRoYXQgY29udGFpbnMgdGhlIGl0ZW1zIHlvdSB3YW50IHRoZSBtb2RpZmllZCBPYnNlcnZhYmxlIHRvIGVtaXQgZmlyc3QuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgSXRlcmFibGUgYW5kIHRoZW4gZW1pdHMgdGhlIGl0ZW1zXG4gKiBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2Qgc3RhcnRXaXRoXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBzdGFydFdpdGgoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJyYXlbX2kgLSAwXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBzY2hlZHVsZXIgPSBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICBpZiAoaXNTY2hlZHVsZXJfMS5pc1NjaGVkdWxlcihzY2hlZHVsZXIpKSB7XG4gICAgICAgIGFycmF5LnBvcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVyID0gbnVsbDtcbiAgICB9XG4gICAgdmFyIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAxKSB7XG4gICAgICAgIHJldHVybiBjb25jYXRfMS5jb25jYXRTdGF0aWMobmV3IFNjYWxhck9ic2VydmFibGVfMS5TY2FsYXJPYnNlcnZhYmxlKGFycmF5WzBdLCBzY2hlZHVsZXIpLCB0aGlzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobGVuID4gMSkge1xuICAgICAgICByZXR1cm4gY29uY2F0XzEuY29uY2F0U3RhdGljKG5ldyBBcnJheU9ic2VydmFibGVfMS5BcnJheU9ic2VydmFibGUoYXJyYXksIHNjaGVkdWxlciksIHRoaXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbmNhdF8xLmNvbmNhdFN0YXRpYyhuZXcgRW1wdHlPYnNlcnZhYmxlXzEuRW1wdHlPYnNlcnZhYmxlKHNjaGVkdWxlciksIHRoaXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuc3RhcnRXaXRoID0gc3RhcnRXaXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhcnRXaXRoLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3N0YXJ0V2l0aC5qc1xuLy8gbW9kdWxlIGlkID0gNjAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1465. /***/ },
  1466. /* 603 */
  1467. /***/ function(module, exports, __webpack_require__) {
  1468. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar subscribeOn_1 = __webpack_require__(604);\nObservable_1.Observable.prototype.subscribeOn = subscribeOn_1.subscribeOn;\n//# sourceMappingURL=subscribeOn.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zdWJzY3JpYmVPbi5qcz84ODBmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBzdWJzY3JpYmVPbl8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivc3Vic2NyaWJlT24nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zdWJzY3JpYmVPbiA9IHN1YnNjcmliZU9uXzEuc3Vic2NyaWJlT247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJzY3JpYmVPbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivc3Vic2NyaWJlT24uanNcbi8vIG1vZHVsZSBpZCA9IDYwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1469. /***/ },
  1470. /* 604 */
  1471. /***/ function(module, exports, __webpack_require__) {
  1472. eval("\"use strict\";\nvar SubscribeOnObservable_1 = __webpack_require__(605);\n/**\n * Asynchronously subscribes Observers to this Observable on the specified Scheduler.\n *\n * <img src=\"./img/subscribeOn.png\" width=\"100%\">\n *\n * @param {Scheduler} the Scheduler to perform subscription actions on.\n * @return {Observable<T>} the source Observable modified so that its subscriptions happen on the specified Scheduler\n .\n * @method subscribeOn\n * @owner Observable\n */\nfunction subscribeOn(scheduler, delay) {\n if (delay === void 0) { delay = 0; }\n return this.lift(new SubscribeOnOperator(scheduler, delay));\n}\nexports.subscribeOn = subscribeOn;\nvar SubscribeOnOperator = (function () {\n function SubscribeOnOperator(scheduler, delay) {\n this.scheduler = scheduler;\n this.delay = delay;\n }\n SubscribeOnOperator.prototype.call = function (subscriber, source) {\n return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);\n };\n return SubscribeOnOperator;\n}());\n//# sourceMappingURL=subscribeOn.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3N1YnNjcmliZU9uLmpzP2E5NTUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgU3Vic2NyaWJlT25PYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9vYnNlcnZhYmxlL1N1YnNjcmliZU9uT2JzZXJ2YWJsZScpO1xuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzdWJzY3JpYmVzIE9ic2VydmVycyB0byB0aGlzIE9ic2VydmFibGUgb24gdGhlIHNwZWNpZmllZCBTY2hlZHVsZXIuXG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy9zdWJzY3JpYmVPbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gdGhlIFNjaGVkdWxlciB0byBwZXJmb3JtIHN1YnNjcmlwdGlvbiBhY3Rpb25zIG9uLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gdGhlIHNvdXJjZSBPYnNlcnZhYmxlIG1vZGlmaWVkIHNvIHRoYXQgaXRzIHN1YnNjcmlwdGlvbnMgaGFwcGVuIG9uIHRoZSBzcGVjaWZpZWQgU2NoZWR1bGVyXG4gLlxuICogQG1ldGhvZCBzdWJzY3JpYmVPblxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gc3Vic2NyaWJlT24oc2NoZWR1bGVyLCBkZWxheSkge1xuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFN1YnNjcmliZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkpO1xufVxuZXhwb3J0cy5zdWJzY3JpYmVPbiA9IHN1YnNjcmliZU9uO1xudmFyIFN1YnNjcmliZU9uT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN1YnNjcmliZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5kZWxheSA9IGRlbGF5O1xuICAgIH1cbiAgICBTdWJzY3JpYmVPbk9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmliZU9uT2JzZXJ2YWJsZV8xLlN1YnNjcmliZU9uT2JzZXJ2YWJsZShzb3VyY2UsIHRoaXMuZGVsYXksIHRoaXMuc2NoZWR1bGVyKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfTtcbiAgICByZXR1cm4gU3Vic2NyaWJlT25PcGVyYXRvcjtcbn0oKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJzY3JpYmVPbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci9zdWJzY3JpYmVPbi5qc1xuLy8gbW9kdWxlIGlkID0gNjA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1473. /***/ },
  1474. /* 605 */
  1475. /***/ function(module, exports, __webpack_require__) {
  1476. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar asap_1 = __webpack_require__(606);\nvar isNumeric_1 = __webpack_require__(413);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nvar SubscribeOnObservable = (function (_super) {\n __extends(SubscribeOnObservable, _super);\n function SubscribeOnObservable(source, delayTime, scheduler) {\n if (delayTime === void 0) { delayTime = 0; }\n if (scheduler === void 0) { scheduler = asap_1.asap; }\n _super.call(this);\n this.source = source;\n this.delayTime = delayTime;\n this.scheduler = scheduler;\n if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {\n this.delayTime = 0;\n }\n if (!scheduler || typeof scheduler.schedule !== 'function') {\n this.scheduler = asap_1.asap;\n }\n }\n SubscribeOnObservable.create = function (source, delay, scheduler) {\n if (delay === void 0) { delay = 0; }\n if (scheduler === void 0) { scheduler = asap_1.asap; }\n return new SubscribeOnObservable(source, delay, scheduler);\n };\n SubscribeOnObservable.dispatch = function (arg) {\n var source = arg.source, subscriber = arg.subscriber;\n return this.add(source.subscribe(subscriber));\n };\n SubscribeOnObservable.prototype._subscribe = function (subscriber) {\n var delay = this.delayTime;\n var source = this.source;\n var scheduler = this.scheduler;\n return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {\n source: source, subscriber: subscriber\n });\n };\n return SubscribeOnObservable;\n}(Observable_1.Observable));\nexports.SubscribeOnObservable = SubscribeOnObservable;\n//# sourceMappingURL=SubscribeOnObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29ic2VydmFibGUvU3Vic2NyaWJlT25PYnNlcnZhYmxlLmpzPzQyOTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi9PYnNlcnZhYmxlJyk7XG52YXIgYXNhcF8xID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL2FzYXAnKTtcbnZhciBpc051bWVyaWNfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNOdW1lcmljJyk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqIEBoaWRlIHRydWVcbiAqL1xudmFyIFN1YnNjcmliZU9uT2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN1YnNjcmliZU9uT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJzY3JpYmVPbk9ic2VydmFibGUoc291cmNlLCBkZWxheVRpbWUsIHNjaGVkdWxlcikge1xuICAgICAgICBpZiAoZGVsYXlUaW1lID09PSB2b2lkIDApIHsgZGVsYXlUaW1lID0gMDsgfVxuICAgICAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXNhcF8xLmFzYXA7IH1cbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmRlbGF5VGltZSA9IGRlbGF5VGltZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIGlmICghaXNOdW1lcmljXzEuaXNOdW1lcmljKGRlbGF5VGltZSkgfHwgZGVsYXlUaW1lIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2NoZWR1bGVyIHx8IHR5cGVvZiBzY2hlZHVsZXIuc2NoZWR1bGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gYXNhcF8xLmFzYXA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgU3Vic2NyaWJlT25PYnNlcnZhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChzb3VyY2UsIGRlbGF5LCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHsgZGVsYXkgPSAwOyB9XG4gICAgICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgeyBzY2hlZHVsZXIgPSBhc2FwXzEuYXNhcDsgfVxuICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmliZU9uT2JzZXJ2YWJsZShzb3VyY2UsIGRlbGF5LCBzY2hlZHVsZXIpO1xuICAgIH07XG4gICAgU3Vic2NyaWJlT25PYnNlcnZhYmxlLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJnLnNvdXJjZSwgc3Vic2NyaWJlciA9IGFyZy5zdWJzY3JpYmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQoc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKSk7XG4gICAgfTtcbiAgICBTdWJzY3JpYmVPbk9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgZGVsYXkgPSB0aGlzLmRlbGF5VGltZTtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoU3Vic2NyaWJlT25PYnNlcnZhYmxlLmRpc3BhdGNoLCBkZWxheSwge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsIHN1YnNjcmliZXI6IHN1YnNjcmliZXJcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3Vic2NyaWJlT25PYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlXzEuT2JzZXJ2YWJsZSkpO1xuZXhwb3J0cy5TdWJzY3JpYmVPbk9ic2VydmFibGUgPSBTdWJzY3JpYmVPbk9ic2VydmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJzY3JpYmVPbk9ic2VydmFibGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb2JzZXJ2YWJsZS9TdWJzY3JpYmVPbk9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDYwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1477. /***/ },
  1478. /* 606 */
  1479. /***/ function(module, exports, __webpack_require__) {
  1480. eval("\"use strict\";\nvar AsapAction_1 = __webpack_require__(607);\nvar AsapScheduler_1 = __webpack_require__(609);\nexports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);\n//# sourceMappingURL=asap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9hc2FwLmpzPzQ4NTQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQXNhcEFjdGlvbl8xID0gcmVxdWlyZSgnLi9Bc2FwQWN0aW9uJyk7XG52YXIgQXNhcFNjaGVkdWxlcl8xID0gcmVxdWlyZSgnLi9Bc2FwU2NoZWR1bGVyJyk7XG5leHBvcnRzLmFzYXAgPSBuZXcgQXNhcFNjaGVkdWxlcl8xLkFzYXBTY2hlZHVsZXIoQXNhcEFjdGlvbl8xLkFzYXBBY3Rpb24pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNhcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9zY2hlZHVsZXIvYXNhcC5qc1xuLy8gbW9kdWxlIGlkID0gNjA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1481. /***/ },
  1482. /* 607 */
  1483. /***/ function(module, exports, __webpack_require__) {
  1484. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Immediate_1 = __webpack_require__(608);\nvar AsyncAction_1 = __webpack_require__(415);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AsapAction = (function (_super) {\n __extends(AsapAction, _super);\n function AsapAction(scheduler, work) {\n _super.call(this, scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If a microtask has already been scheduled, don't schedule another\n // one. If a microtask hasn't been scheduled yet, schedule one now. Return\n // the current scheduled microtask id.\n return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));\n };\n AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n }\n // If the scheduler queue is empty, cancel the requested microtask and\n // set the scheduled flag to undefined so the next AsapAction will schedule\n // its own.\n if (scheduler.actions.length === 0) {\n Immediate_1.Immediate.clearImmediate(id);\n scheduler.scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n };\n return AsapAction;\n}(AsyncAction_1.AsyncAction));\nexports.AsapAction = AsapAction;\n//# sourceMappingURL=AsapAction.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9Bc2FwQWN0aW9uLmpzP2VkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBJbW1lZGlhdGVfMSA9IHJlcXVpcmUoJy4uL3V0aWwvSW1tZWRpYXRlJyk7XG52YXIgQXN5bmNBY3Rpb25fMSA9IHJlcXVpcmUoJy4vQXN5bmNBY3Rpb24nKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQXNhcEFjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzYXBBY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXNhcEFjdGlvbihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMud29yayA9IHdvcms7XG4gICAgfVxuICAgIEFzYXBBY3Rpb24ucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgICAgICAvLyBJZiBkZWxheSBpcyBncmVhdGVyIHRoYW4gMCwgcmVxdWVzdCBhcyBhbiBhc3luYyBhY3Rpb24uXG4gICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFB1c2ggdGhlIGFjdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBzY2hlZHVsZXIgcXVldWUuXG4gICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7XG4gICAgICAgIC8vIElmIGEgbWljcm90YXNrIGhhcyBhbHJlYWR5IGJlZW4gc2NoZWR1bGVkLCBkb24ndCBzY2hlZHVsZSBhbm90aGVyXG4gICAgICAgIC8vIG9uZS4gSWYgYSBtaWNyb3Rhc2sgaGFzbid0IGJlZW4gc2NoZWR1bGVkIHlldCwgc2NoZWR1bGUgb25lIG5vdy4gUmV0dXJuXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IHNjaGVkdWxlZCBtaWNyb3Rhc2sgaWQuXG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVkIHx8IChzY2hlZHVsZXIuc2NoZWR1bGVkID0gSW1tZWRpYXRlXzEuSW1tZWRpYXRlLnNldEltbWVkaWF0ZShzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIG51bGwpKSk7XG4gICAgfTtcbiAgICBBc2FwQWN0aW9uLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgLy8gSWYgZGVsYXkgZXhpc3RzIGFuZCBpcyBncmVhdGVyIHRoYW4gMCwgb3IgaWYgdGhlIGRlbGF5IGlzIG51bGwgKHRoZVxuICAgICAgICAvLyBhY3Rpb24gd2Fzbid0IHJlc2NoZWR1bGVkKSBidXQgd2FzIG9yaWdpbmFsbHkgc2NoZWR1bGVkIGFzIGFuIGFzeW5jXG4gICAgICAgIC8vIGFjdGlvbiwgdGhlbiByZWN5Y2xlIGFzIGFuIGFzeW5jIGFjdGlvbi5cbiAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSBzY2hlZHVsZXIgcXVldWUgaXMgZW1wdHksIGNhbmNlbCB0aGUgcmVxdWVzdGVkIG1pY3JvdGFzayBhbmRcbiAgICAgICAgLy8gc2V0IHRoZSBzY2hlZHVsZWQgZmxhZyB0byB1bmRlZmluZWQgc28gdGhlIG5leHQgQXNhcEFjdGlvbiB3aWxsIHNjaGVkdWxlXG4gICAgICAgIC8vIGl0cyBvd24uXG4gICAgICAgIGlmIChzY2hlZHVsZXIuYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIEltbWVkaWF0ZV8xLkltbWVkaWF0ZS5jbGVhckltbWVkaWF0ZShpZCk7XG4gICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgc28gdGhlIGFjdGlvbiBrbm93cyB0byByZXF1ZXN0IGEgbmV3IGFzeW5jIGlkIGlmIGl0J3MgcmVzY2hlZHVsZWQuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gQXNhcEFjdGlvbjtcbn0oQXN5bmNBY3Rpb25fMS5Bc3luY0FjdGlvbikpO1xuZXhwb3J0cy5Bc2FwQWN0aW9uID0gQXNhcEFjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzYXBBY3Rpb24uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvc2NoZWR1bGVyL0FzYXBBY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDYwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1485. /***/ },
  1486. /* 608 */
  1487. /***/ function(module, exports, __webpack_require__) {
  1488. eval("/* WEBPACK VAR INJECTION */(function(clearImmediate, setImmediate) {/**\nSome credit for this helper goes to http://github.com/YuzuJS/setImmediate\n*/\n\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar ImmediateDefinition = (function () {\n function ImmediateDefinition(root) {\n this.root = root;\n if (root.setImmediate && typeof root.setImmediate === 'function') {\n this.setImmediate = root.setImmediate.bind(root);\n this.clearImmediate = root.clearImmediate.bind(root);\n }\n else {\n this.nextHandle = 1;\n this.tasksByHandle = {};\n this.currentlyRunningATask = false;\n // Don't get fooled by e.g. browserify environments.\n if (this.canUseProcessNextTick()) {\n // For Node.js before 0.9\n this.setImmediate = this.createProcessNextTickSetImmediate();\n }\n else if (this.canUsePostMessage()) {\n // For non-IE10 modern browsers\n this.setImmediate = this.createPostMessageSetImmediate();\n }\n else if (this.canUseMessageChannel()) {\n // For web workers, where supported\n this.setImmediate = this.createMessageChannelSetImmediate();\n }\n else if (this.canUseReadyStateChange()) {\n // For IE 6–8\n this.setImmediate = this.createReadyStateChangeSetImmediate();\n }\n else {\n // For older browsers\n this.setImmediate = this.createSetTimeoutSetImmediate();\n }\n var ci = function clearImmediate(handle) {\n delete clearImmediate.instance.tasksByHandle[handle];\n };\n ci.instance = this;\n this.clearImmediate = ci;\n }\n }\n ImmediateDefinition.prototype.identify = function (o) {\n return this.root.Object.prototype.toString.call(o);\n };\n ImmediateDefinition.prototype.canUseProcessNextTick = function () {\n return this.identify(this.root.process) === '[object process]';\n };\n ImmediateDefinition.prototype.canUseMessageChannel = function () {\n return Boolean(this.root.MessageChannel);\n };\n ImmediateDefinition.prototype.canUseReadyStateChange = function () {\n var document = this.root.document;\n return Boolean(document && 'onreadystatechange' in document.createElement('script'));\n };\n ImmediateDefinition.prototype.canUsePostMessage = function () {\n var root = this.root;\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `root.postMessage` means something completely different and can't be used for this purpose.\n if (root.postMessage && !root.importScripts) {\n var postMessageIsAsynchronous_1 = true;\n var oldOnMessage = root.onmessage;\n root.onmessage = function () {\n postMessageIsAsynchronous_1 = false;\n };\n root.postMessage('', '*');\n root.onmessage = oldOnMessage;\n return postMessageIsAsynchronous_1;\n }\n return false;\n };\n // This function accepts the same arguments as setImmediate, but\n // returns a function that requires no arguments.\n ImmediateDefinition.prototype.partiallyApplied = function (handler) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var fn = function result() {\n var _a = result, handler = _a.handler, args = _a.args;\n if (typeof handler === 'function') {\n handler.apply(undefined, args);\n }\n else {\n (new Function('' + handler))();\n }\n };\n fn.handler = handler;\n fn.args = args;\n return fn;\n };\n ImmediateDefinition.prototype.addFromSetImmediateArguments = function (args) {\n this.tasksByHandle[this.nextHandle] = this.partiallyApplied.apply(undefined, args);\n return this.nextHandle++;\n };\n ImmediateDefinition.prototype.createProcessNextTickSetImmediate = function () {\n var fn = function setImmediate() {\n var instance = setImmediate.instance;\n var handle = instance.addFromSetImmediateArguments(arguments);\n instance.root.process.nextTick(instance.partiallyApplied(instance.runIfPresent, handle));\n return handle;\n };\n fn.instance = this;\n return fn;\n };\n ImmediateDefinition.prototype.createPostMessageSetImmediate = function () {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n var root = this.root;\n var messagePrefix = 'setImmediate$' + root.Math.random() + '$';\n var onGlobalMessage = function globalMessageHandler(event) {\n var instance = globalMessageHandler.instance;\n if (event.source === root &&\n typeof event.data === 'string' &&\n event.data.indexOf(messagePrefix) === 0) {\n instance.runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n onGlobalMessage.instance = this;\n root.addEventListener('message', onGlobalMessage, false);\n var fn = function setImmediate() {\n var _a = setImmediate, messagePrefix = _a.messagePrefix, instance = _a.instance;\n var handle = instance.addFromSetImmediateArguments(arguments);\n instance.root.postMessage(messagePrefix + handle, '*');\n return handle;\n };\n fn.instance = this;\n fn.messagePrefix = messagePrefix;\n return fn;\n };\n ImmediateDefinition.prototype.runIfPresent = function (handle) {\n // From the spec: 'Wait until any invocations of this algorithm started before this one have completed.'\n // So if we're currently running a task, we'll need to delay this invocation.\n if (this.currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // 'too much recursion' error.\n this.root.setTimeout(this.partiallyApplied(this.runIfPresent, handle), 0);\n }\n else {\n var task = this.tasksByHandle[handle];\n if (task) {\n this.currentlyRunningATask = true;\n try {\n task();\n }\n finally {\n this.clearImmediate(handle);\n this.currentlyRunningATask = false;\n }\n }\n }\n };\n ImmediateDefinition.prototype.createMessageChannelSetImmediate = function () {\n var _this = this;\n var channel = new this.root.MessageChannel();\n channel.port1.onmessage = function (event) {\n var handle = event.data;\n _this.runIfPresent(handle);\n };\n var fn = function setImmediate() {\n var _a = setImmediate, channel = _a.channel, instance = _a.instance;\n var handle = instance.addFromSetImmediateArguments(arguments);\n channel.port2.postMessage(handle);\n return handle;\n };\n fn.channel = channel;\n fn.instance = this;\n return fn;\n };\n ImmediateDefinition.prototype.createReadyStateChangeSetImmediate = function () {\n var fn = function setImmediate() {\n var instance = setImmediate.instance;\n var root = instance.root;\n var doc = root.document;\n var html = doc.documentElement;\n var handle = instance.addFromSetImmediateArguments(arguments);\n // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var script = doc.createElement('script');\n script.onreadystatechange = function () {\n instance.runIfPresent(handle);\n script.onreadystatechange = null;\n html.removeChild(script);\n script = null;\n };\n html.appendChild(script);\n return handle;\n };\n fn.instance = this;\n return fn;\n };\n ImmediateDefinition.prototype.createSetTimeoutSetImmediate = function () {\n var fn = function setImmediate() {\n var instance = setImmediate.instance;\n var handle = instance.addFromSetImmediateArguments(arguments);\n instance.root.setTimeout(instance.partiallyApplied(instance.runIfPresent, handle), 0);\n return handle;\n };\n fn.instance = this;\n return fn;\n };\n return ImmediateDefinition;\n}());\nexports.ImmediateDefinition = ImmediateDefinition;\nexports.Immediate = new ImmediateDefinition(root_1.root);\n//# sourceMappingURL=Immediate.js.map\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(82).clearImmediate, __webpack_require__(82).setImmediate))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvSW1tZWRpYXRlLmpzPzg1MTEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG5Tb21lIGNyZWRpdCBmb3IgdGhpcyBoZWxwZXIgZ29lcyB0byBodHRwOi8vZ2l0aHViLmNvbS9ZdXp1SlMvc2V0SW1tZWRpYXRlXG4qL1xuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgcm9vdF8xID0gcmVxdWlyZSgnLi9yb290Jyk7XG52YXIgSW1tZWRpYXRlRGVmaW5pdGlvbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW1tZWRpYXRlRGVmaW5pdGlvbihyb290KSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIGlmIChyb290LnNldEltbWVkaWF0ZSAmJiB0eXBlb2Ygcm9vdC5zZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW1tZWRpYXRlID0gcm9vdC5zZXRJbW1lZGlhdGUuYmluZChyb290KTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbW1lZGlhdGUgPSByb290LmNsZWFySW1tZWRpYXRlLmJpbmQocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRIYW5kbGUgPSAxO1xuICAgICAgICAgICAgdGhpcy50YXNrc0J5SGFuZGxlID0ge307XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuVXNlUHJvY2Vzc05leHRUaWNrKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbW1lZGlhdGUgPSB0aGlzLmNyZWF0ZVByb2Nlc3NOZXh0VGlja1NldEltbWVkaWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW1tZWRpYXRlID0gdGhpcy5jcmVhdGVQb3N0TWVzc2FnZVNldEltbWVkaWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5Vc2VNZXNzYWdlQ2hhbm5lbCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICB0aGlzLnNldEltbWVkaWF0ZSA9IHRoaXMuY3JlYXRlTWVzc2FnZUNoYW5uZWxTZXRJbW1lZGlhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2FuVXNlUmVhZHlTdGF0ZUNoYW5nZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbW1lZGlhdGUgPSB0aGlzLmNyZWF0ZVJlYWR5U3RhdGVDaGFuZ2VTZXRJbW1lZGlhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW1tZWRpYXRlID0gdGhpcy5jcmVhdGVTZXRUaW1lb3V0U2V0SW1tZWRpYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2kgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2xlYXJJbW1lZGlhdGUuaW5zdGFuY2UudGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNpLmluc3RhbmNlID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbW1lZGlhdGUgPSBjaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJbW1lZGlhdGVEZWZpbml0aW9uLnByb3RvdHlwZS5pZGVudGlmeSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QuT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xuICAgIH07XG4gICAgSW1tZWRpYXRlRGVmaW5pdGlvbi5wcm90b3R5cGUuY2FuVXNlUHJvY2Vzc05leHRUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZGVudGlmeSh0aGlzLnJvb3QucHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcbiAgICB9O1xuICAgIEltbWVkaWF0ZURlZmluaXRpb24ucHJvdG90eXBlLmNhblVzZU1lc3NhZ2VDaGFubmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJvb3QuTWVzc2FnZUNoYW5uZWwpO1xuICAgIH07XG4gICAgSW1tZWRpYXRlRGVmaW5pdGlvbi5wcm90b3R5cGUuY2FuVXNlUmVhZHlTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5yb290LmRvY3VtZW50O1xuICAgICAgICByZXR1cm4gQm9vbGVhbihkb2N1bWVudCAmJiAnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7XG4gICAgfTtcbiAgICBJbW1lZGlhdGVEZWZpbml0aW9uLnByb3RvdHlwZS5jYW5Vc2VQb3N0TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3Q7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYHJvb3QucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAocm9vdC5wb3N0TWVzc2FnZSAmJiAhcm9vdC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91c18xID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSByb290Lm9ubWVzc2FnZTtcbiAgICAgICAgICAgIHJvb3Qub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXNfMSA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJvb3QucG9zdE1lc3NhZ2UoJycsICcqJyk7XG4gICAgICAgICAgICByb290Lm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzXzE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBzZXRJbW1lZGlhdGUsIGJ1dFxuICAgIC8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlcXVpcmVzIG5vIGFyZ3VtZW50cy5cbiAgICBJbW1lZGlhdGVEZWZpbml0aW9uLnByb3RvdHlwZS5wYXJ0aWFsbHlBcHBsaWVkID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gcmVzdWx0KCkge1xuICAgICAgICAgICAgdmFyIF9hID0gcmVzdWx0LCBoYW5kbGVyID0gX2EuaGFuZGxlciwgYXJncyA9IF9hLmFyZ3M7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAobmV3IEZ1bmN0aW9uKCcnICsgaGFuZGxlcikpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZuLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBmbi5hcmdzID0gYXJncztcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH07XG4gICAgSW1tZWRpYXRlRGVmaW5pdGlvbi5wcm90b3R5cGUuYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHRoaXMudGFza3NCeUhhbmRsZVt0aGlzLm5leHRIYW5kbGVdID0gdGhpcy5wYXJ0aWFsbHlBcHBsaWVkLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRIYW5kbGUrKztcbiAgICB9O1xuICAgIEltbWVkaWF0ZURlZmluaXRpb24ucHJvdG90eXBlLmNyZWF0ZVByb2Nlc3NOZXh0VGlja1NldEltbWVkaWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gc2V0SW1tZWRpYXRlLmluc3RhbmNlO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGluc3RhbmNlLmFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGluc3RhbmNlLnJvb3QucHJvY2Vzcy5uZXh0VGljayhpbnN0YW5jZS5wYXJ0aWFsbHlBcHBsaWVkKGluc3RhbmNlLnJ1bklmUHJlc2VudCwgaGFuZGxlKSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgICAgICBmbi5pbnN0YW5jZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9O1xuICAgIEltbWVkaWF0ZURlZmluaXRpb24ucHJvdG90eXBlLmNyZWF0ZVBvc3RNZXNzYWdlU2V0SW1tZWRpYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcbiAgICAgICAgdmFyIHJvb3QgPSB0aGlzLnJvb3Q7XG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gJ3NldEltbWVkaWF0ZSQnICsgcm9vdC5NYXRoLnJhbmRvbSgpICsgJyQnO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24gZ2xvYmFsTWVzc2FnZUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGdsb2JhbE1lc3NhZ2VIYW5kbGVyLmluc3RhbmNlO1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gcm9vdCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLnJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBvbkdsb2JhbE1lc3NhZ2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgICAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKCkge1xuICAgICAgICAgICAgdmFyIF9hID0gc2V0SW1tZWRpYXRlLCBtZXNzYWdlUHJlZml4ID0gX2EubWVzc2FnZVByZWZpeCwgaW5zdGFuY2UgPSBfYS5pbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBpbnN0YW5jZS5hZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpbnN0YW5jZS5yb290LnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsICcqJyk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgICAgICBmbi5pbnN0YW5jZSA9IHRoaXM7XG4gICAgICAgIGZuLm1lc3NhZ2VQcmVmaXggPSBtZXNzYWdlUHJlZml4O1xuICAgICAgICByZXR1cm4gZm47XG4gICAgfTtcbiAgICBJbW1lZGlhdGVEZWZpbml0aW9uLnByb3RvdHlwZS5ydW5JZlByZXNlbnQgPSBmdW5jdGlvbiAoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6ICdXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC4nXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vICd0b28gbXVjaCByZWN1cnNpb24nIGVycm9yLlxuICAgICAgICAgICAgdGhpcy5yb290LnNldFRpbWVvdXQodGhpcy5wYXJ0aWFsbHlBcHBsaWVkKHRoaXMucnVuSWZQcmVzZW50LCBoYW5kbGUpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGhpcy50YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbW1lZGlhdGVEZWZpbml0aW9uLnByb3RvdHlwZS5jcmVhdGVNZXNzYWdlQ2hhbm5lbFNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgdGhpcy5yb290Lk1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIF90aGlzLnJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBzZXRJbW1lZGlhdGUsIGNoYW5uZWwgPSBfYS5jaGFubmVsLCBpbnN0YW5jZSA9IF9hLmluc3RhbmNlO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGluc3RhbmNlLmFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgICAgIGZuLmNoYW5uZWwgPSBjaGFubmVsO1xuICAgICAgICBmbi5pbnN0YW5jZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9O1xuICAgIEltbWVkaWF0ZURlZmluaXRpb24ucHJvdG90eXBlLmNyZWF0ZVJlYWR5U3RhdGVDaGFuZ2VTZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZSgpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHNldEltbWVkaWF0ZS5pbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciByb290ID0gaW5zdGFuY2Uucm9vdDtcbiAgICAgICAgICAgIHZhciBkb2MgPSByb290LmRvY3VtZW50O1xuICAgICAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGluc3RhbmNlLmFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLnJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgIH07XG4gICAgICAgIGZuLmluc3RhbmNlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH07XG4gICAgSW1tZWRpYXRlRGVmaW5pdGlvbi5wcm90b3R5cGUuY3JlYXRlU2V0VGltZW91dFNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gc2V0SW1tZWRpYXRlLmluc3RhbmNlO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGluc3RhbmNlLmFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGluc3RhbmNlLnJvb3Quc2V0VGltZW91dChpbnN0YW5jZS5wYXJ0aWFsbHlBcHBsaWVkKGluc3RhbmNlLnJ1bklmUHJlc2VudCwgaGFuZGxlKSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgICAgICBmbi5pbnN0YW5jZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9O1xuICAgIHJldHVybiBJbW1lZGlhdGVEZWZpbml0aW9uO1xufSgpKTtcbmV4cG9ydHMuSW1tZWRpYXRlRGVmaW5pdGlvbiA9IEltbWVkaWF0ZURlZmluaXRpb247XG5leHBvcnRzLkltbWVkaWF0ZSA9IG5ldyBJbW1lZGlhdGVEZWZpbml0aW9uKHJvb3RfMS5yb290KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUltbWVkaWF0ZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL0ltbWVkaWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNjA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1489. /***/ },
  1490. /* 609 */
  1491. /***/ function(module, exports, __webpack_require__) {
  1492. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncScheduler_1 = __webpack_require__(417);\nvar AsapScheduler = (function (_super) {\n __extends(AsapScheduler, _super);\n function AsapScheduler() {\n _super.apply(this, arguments);\n }\n AsapScheduler.prototype.flush = function (action) {\n this.active = true;\n this.scheduled = undefined;\n var actions = this.actions;\n var error;\n var index = -1;\n var count = actions.length;\n action = action || actions.shift();\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (++index < count && (action = actions.shift()));\n this.active = false;\n if (error) {\n while (++index < count && (action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AsapScheduler;\n}(AsyncScheduler_1.AsyncScheduler));\nexports.AsapScheduler = AsapScheduler;\n//# sourceMappingURL=AsapScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9Bc2FwU2NoZWR1bGVyLmpzPzM0MWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBBc3luY1NjaGVkdWxlcl8xID0gcmVxdWlyZSgnLi9Bc3luY1NjaGVkdWxlcicpO1xudmFyIEFzYXBTY2hlZHVsZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBc2FwU2NoZWR1bGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzYXBTY2hlZHVsZXIoKSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBBc2FwU2NoZWR1bGVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnM7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBjb3VudCA9IGFjdGlvbnMubGVuZ3RoO1xuICAgICAgICBhY3Rpb24gPSBhY3Rpb24gfHwgYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoKytpbmRleCA8IGNvdW50ICYmIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpKTtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGNvdW50ICYmIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFzYXBTY2hlZHVsZXI7XG59KEFzeW5jU2NoZWR1bGVyXzEuQXN5bmNTY2hlZHVsZXIpKTtcbmV4cG9ydHMuQXNhcFNjaGVkdWxlciA9IEFzYXBTY2hlZHVsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2FwU2NoZWR1bGVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9Bc2FwU2NoZWR1bGVyLmpzXG4vLyBtb2R1bGUgaWQgPSA2MDlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1493. /***/ },
  1494. /* 610 */
  1495. /***/ function(module, exports, __webpack_require__) {
  1496. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar switch_1 = __webpack_require__(611);\nObservable_1.Observable.prototype.switch = switch_1._switch;\nObservable_1.Observable.prototype._switch = switch_1._switch;\n//# sourceMappingURL=switch.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zd2l0Y2guanM/ZDUyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc3dpdGNoXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9zd2l0Y2gnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zd2l0Y2ggPSBzd2l0Y2hfMS5fc3dpdGNoO1xuT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUucHJvdG90eXBlLl9zd2l0Y2ggPSBzd2l0Y2hfMS5fc3dpdGNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3dpdGNoLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci9zd2l0Y2guanNcbi8vIG1vZHVsZSBpZCA9IDYxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1497. /***/ },
  1498. /* 611 */
  1499. /***/ function(module, exports, __webpack_require__) {
  1500. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Converts a higher-order Observable into a first-order Observable by\n * subscribing to only the most recently emitted of those inner Observables.\n *\n * <span class=\"informal\">Flattens an Observable-of-Observables by dropping the\n * previous inner Observable once a new one appears.</span>\n *\n * <img src=\"./img/switch.png\" width=\"100%\">\n *\n * `switch` subscribes to an Observable that emits Observables, also known as a\n * higher-order Observable. Each time it observes one of these emitted inner\n * Observables, the output Observable subscribes to the inner Observable and\n * begins emitting the items emitted by that. So far, it behaves\n * like {@link mergeAll}. However, when a new inner Observable is emitted,\n * `switch` unsubscribes from the earlier-emitted inner Observable and\n * subscribes to the new inner Observable and begins emitting items from it. It\n * continues to behave like this for subsequent inner Observables.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * // Each click event is mapped to an Observable that ticks every second\n * var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));\n * var switched = higherOrder.switch();\n * // The outcome is that `switched` is essentially a timer that restarts\n * // on every click. The interval Observables from older clicks do not merge\n * // with the current interval Observable.\n * switched.subscribe(x => console.log(x));\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link mergeAll}\n * @see {@link switchMap}\n * @see {@link switchMapTo}\n * @see {@link zipAll}\n *\n * @return {Observable<T>} An Observable that emits the items emitted by the\n * Observable most recently emitted by the source Observable.\n * @method switch\n * @name switch\n * @owner Observable\n */\nfunction _switch() {\n return this.lift(new SwitchOperator());\n}\nexports._switch = _switch;\nvar SwitchOperator = (function () {\n function SwitchOperator() {\n }\n SwitchOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SwitchSubscriber(subscriber));\n };\n return SwitchOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchSubscriber = (function (_super) {\n __extends(SwitchSubscriber, _super);\n function SwitchSubscriber(destination) {\n _super.call(this, destination);\n this.active = 0;\n this.hasCompleted = false;\n }\n SwitchSubscriber.prototype._next = function (value) {\n this.unsubscribeInner();\n this.active++;\n this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, value));\n };\n SwitchSubscriber.prototype._complete = function () {\n this.hasCompleted = true;\n if (this.active === 0) {\n this.destination.complete();\n }\n };\n SwitchSubscriber.prototype.unsubscribeInner = function () {\n this.active = this.active > 0 ? this.active - 1 : 0;\n var innerSubscription = this.innerSubscription;\n if (innerSubscription) {\n innerSubscription.unsubscribe();\n this.remove(innerSubscription);\n }\n };\n SwitchSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.destination.next(innerValue);\n };\n SwitchSubscriber.prototype.notifyError = function (err) {\n this.destination.error(err);\n };\n SwitchSubscriber.prototype.notifyComplete = function () {\n this.unsubscribeInner();\n if (this.hasCompleted && this.active === 0) {\n this.destination.complete();\n }\n };\n return SwitchSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=switch.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3N3aXRjaC5qcz8wOWVjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBDb252ZXJ0cyBhIGhpZ2hlci1vcmRlciBPYnNlcnZhYmxlIGludG8gYSBmaXJzdC1vcmRlciBPYnNlcnZhYmxlIGJ5XG4gKiBzdWJzY3JpYmluZyB0byBvbmx5IHRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgb2YgdGhvc2UgaW5uZXIgT2JzZXJ2YWJsZXMuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkZsYXR0ZW5zIGFuIE9ic2VydmFibGUtb2YtT2JzZXJ2YWJsZXMgYnkgZHJvcHBpbmcgdGhlXG4gKiBwcmV2aW91cyBpbm5lciBPYnNlcnZhYmxlIG9uY2UgYSBuZXcgb25lIGFwcGVhcnMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvc3dpdGNoLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGBzd2l0Y2hgIHN1YnNjcmliZXMgdG8gYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIE9ic2VydmFibGVzLCBhbHNvIGtub3duIGFzIGFcbiAqIGhpZ2hlci1vcmRlciBPYnNlcnZhYmxlLiBFYWNoIHRpbWUgaXQgb2JzZXJ2ZXMgb25lIG9mIHRoZXNlIGVtaXR0ZWQgaW5uZXJcbiAqIE9ic2VydmFibGVzLCB0aGUgb3V0cHV0IE9ic2VydmFibGUgc3Vic2NyaWJlcyB0byB0aGUgaW5uZXIgT2JzZXJ2YWJsZSBhbmRcbiAqIGJlZ2lucyBlbWl0dGluZyB0aGUgaXRlbXMgZW1pdHRlZCBieSB0aGF0LiBTbyBmYXIsIGl0IGJlaGF2ZXNcbiAqIGxpa2Uge0BsaW5rIG1lcmdlQWxsfS4gSG93ZXZlciwgd2hlbiBhIG5ldyBpbm5lciBPYnNlcnZhYmxlIGlzIGVtaXR0ZWQsXG4gKiBgc3dpdGNoYCB1bnN1YnNjcmliZXMgZnJvbSB0aGUgZWFybGllci1lbWl0dGVkIGlubmVyIE9ic2VydmFibGUgYW5kXG4gKiBzdWJzY3JpYmVzIHRvIHRoZSBuZXcgaW5uZXIgT2JzZXJ2YWJsZSBhbmQgYmVnaW5zIGVtaXR0aW5nIGl0ZW1zIGZyb20gaXQuIEl0XG4gKiBjb250aW51ZXMgdG8gYmVoYXZlIGxpa2UgdGhpcyBmb3Igc3Vic2VxdWVudCBpbm5lciBPYnNlcnZhYmxlcy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5SZXJ1biBhbiBpbnRlcnZhbCBPYnNlcnZhYmxlIG9uIGV2ZXJ5IGNsaWNrIGV2ZW50PC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIC8vIEVhY2ggY2xpY2sgZXZlbnQgaXMgbWFwcGVkIHRvIGFuIE9ic2VydmFibGUgdGhhdCB0aWNrcyBldmVyeSBzZWNvbmRcbiAqIHZhciBoaWdoZXJPcmRlciA9IGNsaWNrcy5tYXAoKGV2KSA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHZhciBzd2l0Y2hlZCA9IGhpZ2hlck9yZGVyLnN3aXRjaCgpO1xuICogLy8gVGhlIG91dGNvbWUgaXMgdGhhdCBgc3dpdGNoZWRgIGlzIGVzc2VudGlhbGx5IGEgdGltZXIgdGhhdCByZXN0YXJ0c1xuICogLy8gb24gZXZlcnkgY2xpY2suIFRoZSBpbnRlcnZhbCBPYnNlcnZhYmxlcyBmcm9tIG9sZGVyIGNsaWNrcyBkbyBub3QgbWVyZ2VcbiAqIC8vIHdpdGggdGhlIGN1cnJlbnQgaW50ZXJ2YWwgT2JzZXJ2YWJsZS5cbiAqIHN3aXRjaGVkLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBjb21iaW5lQWxsfVxuICogQHNlZSB7QGxpbmsgY29uY2F0QWxsfVxuICogQHNlZSB7QGxpbmsgZXhoYXVzdH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlQWxsfVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwfVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwVG99XG4gKiBAc2VlIHtAbGluayB6aXBBbGx9XG4gKlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBpdGVtcyBlbWl0dGVkIGJ5IHRoZVxuICogT2JzZXJ2YWJsZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBzd2l0Y2hcbiAqIEBuYW1lIHN3aXRjaFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gX3N3aXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBTd2l0Y2hPcGVyYXRvcigpKTtcbn1cbmV4cG9ydHMuX3N3aXRjaCA9IF9zd2l0Y2g7XG52YXIgU3dpdGNoT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN3aXRjaE9wZXJhdG9yKCkge1xuICAgIH1cbiAgICBTd2l0Y2hPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaFN1YnNjcmliZXIoc3Vic2NyaWJlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFN3aXRjaE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgU3dpdGNoU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN3aXRjaFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3dpdGNoU3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgU3dpdGNoU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUlubmVyKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlKys7XG4gICAgICAgIHRoaXMuYWRkKHRoaXMuaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBTd2l0Y2hTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN3aXRjaFN1YnNjcmliZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlSW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdGhpcy5hY3RpdmUgPiAwID8gdGhpcy5hY3RpdmUgLSAxIDogMDtcbiAgICAgICAgdmFyIGlubmVyU3Vic2NyaXB0aW9uID0gdGhpcy5pbm5lclN1YnNjcmlwdGlvbjtcbiAgICAgICAgaWYgKGlubmVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBpbm5lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWJzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTd2l0Y2hTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICB9O1xuICAgIFN3aXRjaFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfTtcbiAgICBTd2l0Y2hTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUlubmVyKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbXBsZXRlZCAmJiB0aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gU3dpdGNoU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zd2l0Y2guanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc3dpdGNoLmpzXG4vLyBtb2R1bGUgaWQgPSA2MTFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1501. /***/ },
  1502. /* 612 */
  1503. /***/ function(module, exports, __webpack_require__) {
  1504. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar switchMap_1 = __webpack_require__(613);\nObservable_1.Observable.prototype.switchMap = switchMap_1.switchMap;\n//# sourceMappingURL=switchMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zd2l0Y2hNYXAuanM/ZmY5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgc3dpdGNoTWFwXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci9zd2l0Y2hNYXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zd2l0Y2hNYXAgPSBzd2l0Y2hNYXBfMS5zd2l0Y2hNYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zd2l0Y2hNYXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3N3aXRjaE1hcC5qc1xuLy8gbW9kdWxlIGlkID0gNjEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1505. /***/ },
  1506. /* 613 */
  1507. /***/ function(module, exports, __webpack_require__) {
  1508. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, emitting values only from the most recently projected Observable.\n *\n * <span class=\"informal\">Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link switch}.</span>\n *\n * <img src=\"./img/switchMap.png\" width=\"100%\">\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each time it observes one of these\n * inner Observables, the output Observable begins emitting the items emitted by\n * that inner Observable. When a new inner Observable is emitted, `switchMap`\n * stops emitting items from the earlier-emitted inner Observable and begins\n * emitting items from the new one. It continues to behave like this for\n * subsequent inner Observables.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.switchMap((ev) => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switch}\n * @see {@link switchMapTo}\n *\n * @param {function(value: T, ?index: number): Observable} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and taking only the values from the most recently\n * projected inner Observable.\n * @method switchMap\n * @owner Observable\n */\nfunction switchMap(project, resultSelector) {\n return this.lift(new SwitchMapOperator(project, resultSelector));\n}\nexports.switchMap = switchMap;\nvar SwitchMapOperator = (function () {\n function SwitchMapOperator(project, resultSelector) {\n this.project = project;\n this.resultSelector = resultSelector;\n }\n SwitchMapOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SwitchMapSubscriber(subscriber, this.project, this.resultSelector));\n };\n return SwitchMapOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchMapSubscriber = (function (_super) {\n __extends(SwitchMapSubscriber, _super);\n function SwitchMapSubscriber(destination, project, resultSelector) {\n _super.call(this, destination);\n this.project = project;\n this.resultSelector = resultSelector;\n this.index = 0;\n }\n SwitchMapSubscriber.prototype._next = function (value) {\n var result;\n var index = this.index++;\n try {\n result = this.project(value, index);\n }\n catch (error) {\n this.destination.error(error);\n return;\n }\n this._innerSub(result, value, index);\n };\n SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {\n var innerSubscription = this.innerSubscription;\n if (innerSubscription) {\n innerSubscription.unsubscribe();\n }\n this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index));\n };\n SwitchMapSubscriber.prototype._complete = function () {\n var innerSubscription = this.innerSubscription;\n if (!innerSubscription || innerSubscription.closed) {\n _super.prototype._complete.call(this);\n }\n };\n SwitchMapSubscriber.prototype._unsubscribe = function () {\n this.innerSubscription = null;\n };\n SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {\n this.remove(innerSub);\n this.innerSubscription = null;\n if (this.isStopped) {\n _super.prototype._complete.call(this);\n }\n };\n SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n if (this.resultSelector) {\n this._tryNotifyNext(outerValue, innerValue, outerIndex, innerIndex);\n }\n else {\n this.destination.next(innerValue);\n }\n };\n SwitchMapSubscriber.prototype._tryNotifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n var result;\n try {\n result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n return SwitchMapSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=switchMap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3N3aXRjaE1hcC5qcz84MTkzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG4vKipcbiAqIFByb2plY3RzIGVhY2ggc291cmNlIHZhbHVlIHRvIGFuIE9ic2VydmFibGUgd2hpY2ggaXMgbWVyZ2VkIGluIHRoZSBvdXRwdXRcbiAqIE9ic2VydmFibGUsIGVtaXR0aW5nIHZhbHVlcyBvbmx5IGZyb20gdGhlIG1vc3QgcmVjZW50bHkgcHJvamVjdGVkIE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPk1hcHMgZWFjaCB2YWx1ZSB0byBhbiBPYnNlcnZhYmxlLCB0aGVuIGZsYXR0ZW5zIGFsbCBvZlxuICogdGhlc2UgaW5uZXIgT2JzZXJ2YWJsZXMgdXNpbmcge0BsaW5rIHN3aXRjaH0uPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvc3dpdGNoTWFwLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGl0ZW1zIGJhc2VkIG9uIGFwcGx5aW5nIGEgZnVuY3Rpb24gdGhhdCB5b3VcbiAqIHN1cHBseSB0byBlYWNoIGl0ZW0gZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUsIHdoZXJlIHRoYXQgZnVuY3Rpb25cbiAqIHJldHVybnMgYW4gKHNvLWNhbGxlZCBcImlubmVyXCIpIE9ic2VydmFibGUuIEVhY2ggdGltZSBpdCBvYnNlcnZlcyBvbmUgb2YgdGhlc2VcbiAqIGlubmVyIE9ic2VydmFibGVzLCB0aGUgb3V0cHV0IE9ic2VydmFibGUgYmVnaW5zIGVtaXR0aW5nIHRoZSBpdGVtcyBlbWl0dGVkIGJ5XG4gKiB0aGF0IGlubmVyIE9ic2VydmFibGUuIFdoZW4gYSBuZXcgaW5uZXIgT2JzZXJ2YWJsZSBpcyBlbWl0dGVkLCBgc3dpdGNoTWFwYFxuICogc3RvcHMgZW1pdHRpbmcgaXRlbXMgZnJvbSB0aGUgZWFybGllci1lbWl0dGVkIGlubmVyIE9ic2VydmFibGUgYW5kIGJlZ2luc1xuICogZW1pdHRpbmcgaXRlbXMgZnJvbSB0aGUgbmV3IG9uZS4gSXQgY29udGludWVzIHRvIGJlaGF2ZSBsaWtlIHRoaXMgZm9yXG4gKiBzdWJzZXF1ZW50IGlubmVyIE9ic2VydmFibGVzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlJlcnVuIGFuIGludGVydmFsIE9ic2VydmFibGUgb24gZXZlcnkgY2xpY2sgZXZlbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5zd2l0Y2hNYXAoKGV2KSA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwfVxuICogQHNlZSB7QGxpbmsgZXhoYXVzdE1hcH1cbiAqIEBzZWUge0BsaW5rIG1lcmdlTWFwfVxuICogQHNlZSB7QGxpbmsgc3dpdGNofVxuICogQHNlZSB7QGxpbmsgc3dpdGNoTWFwVG99XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCwgP2luZGV4OiBudW1iZXIpOiBPYnNlcnZhYmxlfSBwcm9qZWN0IEEgZnVuY3Rpb25cbiAqIHRoYXQsIHdoZW4gYXBwbGllZCB0byBhbiBpdGVtIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLCByZXR1cm5zIGFuXG4gKiBPYnNlcnZhYmxlLlxuICogQHBhcmFtIHtmdW5jdGlvbihvdXRlclZhbHVlOiBULCBpbm5lclZhbHVlOiBJLCBvdXRlckluZGV4OiBudW1iZXIsIGlubmVySW5kZXg6IG51bWJlcik6IGFueX0gW3Jlc3VsdFNlbGVjdG9yXVxuICogQSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB2YWx1ZSBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUgYmFzZWQgb24gdGhlIHZhbHVlc1xuICogYW5kIHRoZSBpbmRpY2VzIG9mIHRoZSBzb3VyY2UgKG91dGVyKSBlbWlzc2lvbiBhbmQgdGhlIGlubmVyIE9ic2VydmFibGVcbiAqIGVtaXNzaW9uLiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGFyZTpcbiAqIC0gYG91dGVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJWYWx1ZWA6IHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSB0aGUgcHJvamVjdGVkIE9ic2VydmFibGVcbiAqIC0gYG91dGVySW5kZXhgOiB0aGUgXCJpbmRleFwiIG9mIHRoZSB2YWx1ZSB0aGF0IGNhbWUgZnJvbSB0aGUgc291cmNlXG4gKiAtIGBpbm5lckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgZnJvbSB0aGUgcHJvamVjdGVkIE9ic2VydmFibGVcbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZVxuICogcHJvamVjdGlvbiBmdW5jdGlvbiAoYW5kIHRoZSBvcHRpb25hbCBgcmVzdWx0U2VsZWN0b3JgKSB0byBlYWNoIGl0ZW0gZW1pdHRlZFxuICogYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFuZCB0YWtpbmcgb25seSB0aGUgdmFsdWVzIGZyb20gdGhlIG1vc3QgcmVjZW50bHlcbiAqIHByb2plY3RlZCBpbm5lciBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCBzd2l0Y2hNYXBcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHN3aXRjaE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFN3aXRjaE1hcE9wZXJhdG9yKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSk7XG59XG5leHBvcnRzLnN3aXRjaE1hcCA9IHN3aXRjaE1hcDtcbnZhciBTd2l0Y2hNYXBPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3dpdGNoTWFwT3BlcmF0b3IocHJvamVjdCwgcmVzdWx0U2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgIH1cbiAgICBTd2l0Y2hNYXBPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFN3aXRjaE1hcFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcm9qZWN0LCB0aGlzLnJlc3VsdFNlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3dpdGNoTWFwT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBTd2l0Y2hNYXBTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU3dpdGNoTWFwU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTd2l0Y2hNYXBTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgfVxuICAgIFN3aXRjaE1hcFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXgrKztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdCh2YWx1ZSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH07XG4gICAgU3dpdGNoTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX2lubmVyU3ViID0gZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHZhciBpbm5lclN1YnNjcmlwdGlvbiA9IHRoaXMuaW5uZXJTdWJzY3JpcHRpb247XG4gICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgaW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZCh0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXN1bHQsIHZhbHVlLCBpbmRleCkpO1xuICAgIH07XG4gICAgU3dpdGNoTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5uZXJTdWJzY3JpcHRpb24gPSB0aGlzLmlubmVyU3Vic2NyaXB0aW9uO1xuICAgICAgICBpZiAoIWlubmVyU3Vic2NyaXB0aW9uIHx8IGlubmVyU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3dpdGNoTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX3Vuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9O1xuICAgIFN3aXRjaE1hcFN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGlubmVyU3ViKTtcbiAgICAgICAgdGhpcy5pbm5lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3dpdGNoTWFwU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICBpZiAodGhpcy5yZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5fdHJ5Tm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3dpdGNoTWFwU3Vic2NyaWJlci5wcm90b3R5cGUuX3RyeU5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5yZXN1bHRTZWxlY3RvcihvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7XG4gICAgfTtcbiAgICByZXR1cm4gU3dpdGNoTWFwU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zd2l0Y2hNYXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivc3dpdGNoTWFwLmpzXG4vLyBtb2R1bGUgaWQgPSA2MTNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1509. /***/ },
  1510. /* 614 */
  1511. /***/ function(module, exports, __webpack_require__) {
  1512. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar switchMapTo_1 = __webpack_require__(615);\nObservable_1.Observable.prototype.switchMapTo = switchMapTo_1.switchMapTo;\n//# sourceMappingURL=switchMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci9zd2l0Y2hNYXBUby5qcz9hNTYwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciBzd2l0Y2hNYXBUb18xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivc3dpdGNoTWFwVG8nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS5zd2l0Y2hNYXBUbyA9IHN3aXRjaE1hcFRvXzEuc3dpdGNoTWFwVG87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zd2l0Y2hNYXBUby5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivc3dpdGNoTWFwVG8uanNcbi8vIG1vZHVsZSBpZCA9IDYxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1513. /***/ },
  1514. /* 615 */
  1515. /***/ function(module, exports, __webpack_require__) {
  1516. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Projects each source value to the same Observable which is flattened multiple\n * times with {@link switch} in the output Observable.\n *\n * <span class=\"informal\">It's like {@link switchMap}, but maps each value\n * always to the same inner Observable.</span>\n *\n * <img src=\"./img/switchMapTo.png\" width=\"100%\">\n *\n * Maps each source value to the given Observable `innerObservable` regardless\n * of the source value, and then flattens those resulting Observables into one\n * single Observable, which is the output Observable. The output Observables\n * emits values only from the most recently emitted instance of\n * `innerObservable`.\n *\n * @example <caption>Rerun an interval Observable on every click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.switchMapTo(Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link concatMapTo}\n * @see {@link switch}\n * @see {@link switchMap}\n * @see {@link mergeMapTo}\n *\n * @param {Observable} innerObservable An Observable to replace each value from\n * the source Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @return {Observable} An Observable that emits items from the given\n * `innerObservable` every time a value is emitted on the source Observable.\n * @return {Observable} An Observable that emits items from the given\n * `innerObservable` (and optionally transformed through `resultSelector`) every\n * time a value is emitted on the source Observable, and taking only the values\n * from the most recently projected inner Observable.\n * @method switchMapTo\n * @owner Observable\n */\nfunction switchMapTo(innerObservable, resultSelector) {\n return this.lift(new SwitchMapToOperator(innerObservable, resultSelector));\n}\nexports.switchMapTo = switchMapTo;\nvar SwitchMapToOperator = (function () {\n function SwitchMapToOperator(observable, resultSelector) {\n this.observable = observable;\n this.resultSelector = resultSelector;\n }\n SwitchMapToOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new SwitchMapToSubscriber(subscriber, this.observable, this.resultSelector));\n };\n return SwitchMapToOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar SwitchMapToSubscriber = (function (_super) {\n __extends(SwitchMapToSubscriber, _super);\n function SwitchMapToSubscriber(destination, inner, resultSelector) {\n _super.call(this, destination);\n this.inner = inner;\n this.resultSelector = resultSelector;\n this.index = 0;\n }\n SwitchMapToSubscriber.prototype._next = function (value) {\n var innerSubscription = this.innerSubscription;\n if (innerSubscription) {\n innerSubscription.unsubscribe();\n }\n this.add(this.innerSubscription = subscribeToResult_1.subscribeToResult(this, this.inner, value, this.index++));\n };\n SwitchMapToSubscriber.prototype._complete = function () {\n var innerSubscription = this.innerSubscription;\n if (!innerSubscription || innerSubscription.closed) {\n _super.prototype._complete.call(this);\n }\n };\n SwitchMapToSubscriber.prototype._unsubscribe = function () {\n this.innerSubscription = null;\n };\n SwitchMapToSubscriber.prototype.notifyComplete = function (innerSub) {\n this.remove(innerSub);\n this.innerSubscription = null;\n if (this.isStopped) {\n _super.prototype._complete.call(this);\n }\n };\n SwitchMapToSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n if (resultSelector) {\n this.tryResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n else {\n destination.next(innerValue);\n }\n };\n SwitchMapToSubscriber.prototype.tryResultSelector = function (outerValue, innerValue, outerIndex, innerIndex) {\n var _a = this, resultSelector = _a.resultSelector, destination = _a.destination;\n var result;\n try {\n result = resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n }\n catch (err) {\n destination.error(err);\n return;\n }\n destination.next(result);\n };\n return SwitchMapToSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=switchMapTo.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3N3aXRjaE1hcFRvLmpzP2M5N2YiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogUHJvamVjdHMgZWFjaCBzb3VyY2UgdmFsdWUgdG8gdGhlIHNhbWUgT2JzZXJ2YWJsZSB3aGljaCBpcyBmbGF0dGVuZWQgbXVsdGlwbGVcbiAqIHRpbWVzIHdpdGgge0BsaW5rIHN3aXRjaH0gaW4gdGhlIG91dHB1dCBPYnNlcnZhYmxlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5JdCdzIGxpa2Uge0BsaW5rIHN3aXRjaE1hcH0sIGJ1dCBtYXBzIGVhY2ggdmFsdWVcbiAqIGFsd2F5cyB0byB0aGUgc2FtZSBpbm5lciBPYnNlcnZhYmxlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3N3aXRjaE1hcFRvLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIE1hcHMgZWFjaCBzb3VyY2UgdmFsdWUgdG8gdGhlIGdpdmVuIE9ic2VydmFibGUgYGlubmVyT2JzZXJ2YWJsZWAgcmVnYXJkbGVzc1xuICogb2YgdGhlIHNvdXJjZSB2YWx1ZSwgYW5kIHRoZW4gZmxhdHRlbnMgdGhvc2UgcmVzdWx0aW5nIE9ic2VydmFibGVzIGludG8gb25lXG4gKiBzaW5nbGUgT2JzZXJ2YWJsZSwgd2hpY2ggaXMgdGhlIG91dHB1dCBPYnNlcnZhYmxlLiBUaGUgb3V0cHV0IE9ic2VydmFibGVzXG4gKiBlbWl0cyB2YWx1ZXMgb25seSBmcm9tIHRoZSBtb3N0IHJlY2VudGx5IGVtaXR0ZWQgaW5zdGFuY2Ugb2ZcbiAqIGBpbm5lck9ic2VydmFibGVgLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlJlcnVuIGFuIGludGVydmFsIE9ic2VydmFibGUgb24gZXZlcnkgY2xpY2sgZXZlbnQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy5zd2l0Y2hNYXBUbyhSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29uY2F0TWFwVG99XG4gKiBAc2VlIHtAbGluayBzd2l0Y2h9XG4gKiBAc2VlIHtAbGluayBzd2l0Y2hNYXB9XG4gKiBAc2VlIHtAbGluayBtZXJnZU1hcFRvfVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gaW5uZXJPYnNlcnZhYmxlIEFuIE9ic2VydmFibGUgdG8gcmVwbGFjZSBlYWNoIHZhbHVlIGZyb21cbiAqIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24ob3V0ZXJWYWx1ZTogVCwgaW5uZXJWYWx1ZTogSSwgb3V0ZXJJbmRleDogbnVtYmVyLCBpbm5lckluZGV4OiBudW1iZXIpOiBhbnl9IFtyZXN1bHRTZWxlY3Rvcl1cbiAqIEEgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdmFsdWUgb24gdGhlIG91dHB1dCBPYnNlcnZhYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZXNcbiAqIGFuZCB0aGUgaW5kaWNlcyBvZiB0aGUgc291cmNlIChvdXRlcikgZW1pc3Npb24gYW5kIHRoZSBpbm5lciBPYnNlcnZhYmxlXG4gKiBlbWlzc2lvbi4gVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBhcmU6XG4gKiAtIGBvdXRlclZhbHVlYDogdGhlIHZhbHVlIHRoYXQgY2FtZSBmcm9tIHRoZSBzb3VyY2VcbiAqIC0gYGlubmVyVmFsdWVgOiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiAtIGBvdXRlckluZGV4YDogdGhlIFwiaW5kZXhcIiBvZiB0aGUgdmFsdWUgdGhhdCBjYW1lIGZyb20gdGhlIHNvdXJjZVxuICogLSBgaW5uZXJJbmRleGA6IHRoZSBcImluZGV4XCIgb2YgdGhlIHZhbHVlIGZyb20gdGhlIHByb2plY3RlZCBPYnNlcnZhYmxlXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlfSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaXRlbXMgZnJvbSB0aGUgZ2l2ZW5cbiAqIGBpbm5lck9ic2VydmFibGVgIGV2ZXJ5IHRpbWUgYSB2YWx1ZSBpcyBlbWl0dGVkIG9uIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBpdGVtcyBmcm9tIHRoZSBnaXZlblxuICogYGlubmVyT2JzZXJ2YWJsZWAgKGFuZCBvcHRpb25hbGx5IHRyYW5zZm9ybWVkIHRocm91Z2ggYHJlc3VsdFNlbGVjdG9yYCkgZXZlcnlcbiAqIHRpbWUgYSB2YWx1ZSBpcyBlbWl0dGVkIG9uIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgYW5kIHRha2luZyBvbmx5IHRoZSB2YWx1ZXNcbiAqIGZyb20gdGhlIG1vc3QgcmVjZW50bHkgcHJvamVjdGVkIGlubmVyIE9ic2VydmFibGUuXG4gKiBAbWV0aG9kIHN3aXRjaE1hcFRvXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBzd2l0Y2hNYXBUbyhpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgU3dpdGNoTWFwVG9PcGVyYXRvcihpbm5lck9ic2VydmFibGUsIHJlc3VsdFNlbGVjdG9yKSk7XG59XG5leHBvcnRzLnN3aXRjaE1hcFRvID0gc3dpdGNoTWFwVG87XG52YXIgU3dpdGNoTWFwVG9PcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3dpdGNoTWFwVG9PcGVyYXRvcihvYnNlcnZhYmxlLCByZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICB0aGlzLm9ic2VydmFibGUgPSBvYnNlcnZhYmxlO1xuICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7XG4gICAgfVxuICAgIFN3aXRjaE1hcFRvT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBTd2l0Y2hNYXBUb1N1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5vYnNlcnZhYmxlLCB0aGlzLnJlc3VsdFNlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3dpdGNoTWFwVG9PcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFN3aXRjaE1hcFRvU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN3aXRjaE1hcFRvU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTd2l0Y2hNYXBUb1N1YnNjcmliZXIoZGVzdGluYXRpb24sIGlubmVyLCByZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjtcbiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgU3dpdGNoTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaW5uZXJTdWJzY3JpcHRpb24gPSB0aGlzLmlubmVyU3Vic2NyaXB0aW9uO1xuICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlubmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGQodGhpcy5pbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgdGhpcy5pbm5lciwgdmFsdWUsIHRoaXMuaW5kZXgrKykpO1xuICAgIH07XG4gICAgU3dpdGNoTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbm5lclN1YnNjcmlwdGlvbiA9IHRoaXMuaW5uZXJTdWJzY3JpcHRpb247XG4gICAgICAgIGlmICghaW5uZXJTdWJzY3JpcHRpb24gfHwgaW5uZXJTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTd2l0Y2hNYXBUb1N1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pbm5lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfTtcbiAgICBTd2l0Y2hNYXBUb1N1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKGlubmVyU3ViKTtcbiAgICAgICAgdGhpcy5pbm5lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3dpdGNoTWFwVG9TdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHJlc3VsdFNlbGVjdG9yID0gX2EucmVzdWx0U2VsZWN0b3IsIGRlc3RpbmF0aW9uID0gX2EuZGVzdGluYXRpb247XG4gICAgICAgIGlmIChyZXN1bHRTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy50cnlSZXN1bHRTZWxlY3RvcihvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN3aXRjaE1hcFRvU3Vic2NyaWJlci5wcm90b3R5cGUudHJ5UmVzdWx0U2VsZWN0b3IgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCByZXN1bHRTZWxlY3RvciA9IF9hLnJlc3VsdFNlbGVjdG9yLCBkZXN0aW5hdGlvbiA9IF9hLmRlc3RpbmF0aW9uO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0U2VsZWN0b3Iob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7XG4gICAgfTtcbiAgICByZXR1cm4gU3dpdGNoTWFwVG9TdWJzY3JpYmVyO1xufShPdXRlclN1YnNjcmliZXJfMS5PdXRlclN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN3aXRjaE1hcFRvLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3N3aXRjaE1hcFRvLmpzXG4vLyBtb2R1bGUgaWQgPSA2MTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1517. /***/ },
  1518. /* 616 */
  1519. /***/ function(module, exports, __webpack_require__) {
  1520. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar take_1 = __webpack_require__(617);\nObservable_1.Observable.prototype.take = take_1.take;\n//# sourceMappingURL=take.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90YWtlLmpzP2ZiZGIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRha2VfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3Rha2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50YWtlID0gdGFrZV8xLnRha2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWtlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci90YWtlLmpzXG4vLyBtb2R1bGUgaWQgPSA2MTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1521. /***/ },
  1522. /* 617 */
  1523. /***/ function(module, exports, __webpack_require__) {
  1524. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar ArgumentOutOfRangeError_1 = __webpack_require__(512);\nvar EmptyObservable_1 = __webpack_require__(41);\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Takes the first `count` values from the source, then\n * completes.</span>\n *\n * <img src=\"./img/take.png\" width=\"100%\">\n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example <caption>Take the first 5 seconds of an infinite 1-second interval Observable</caption>\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable<T>} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nfunction take(count) {\n if (count === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n else {\n return this.lift(new TakeOperator(count));\n }\n}\nexports.take = take;\nvar TakeOperator = (function () {\n function TakeOperator(total) {\n this.total = total;\n if (this.total < 0) {\n throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n }\n }\n TakeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TakeSubscriber(subscriber, this.total));\n };\n return TakeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeSubscriber = (function (_super) {\n __extends(TakeSubscriber, _super);\n function TakeSubscriber(destination, total) {\n _super.call(this, destination);\n this.total = total;\n this.count = 0;\n }\n TakeSubscriber.prototype._next = function (value) {\n var total = this.total;\n var count = ++this.count;\n if (count <= total) {\n this.destination.next(value);\n if (count === total) {\n this.destination.complete();\n this.unsubscribe();\n }\n }\n };\n return TakeSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=take.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rha2UuanM/MTE3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbnZhciBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xID0gcmVxdWlyZSgnLi4vdXRpbC9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvcicpO1xudmFyIEVtcHR5T2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vb2JzZXJ2YWJsZS9FbXB0eU9ic2VydmFibGUnKTtcbi8qKlxuICogRW1pdHMgb25seSB0aGUgZmlyc3QgYGNvdW50YCB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPlRha2VzIHRoZSBmaXJzdCBgY291bnRgIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2UsIHRoZW5cbiAqIGNvbXBsZXRlcy48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy90YWtlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGB0YWtlYCByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBvbmx5IHRoZSBmaXJzdCBgY291bnRgIHZhbHVlcyBlbWl0dGVkXG4gKiBieSB0aGUgc291cmNlIE9ic2VydmFibGUuIElmIHRoZSBzb3VyY2UgZW1pdHMgZmV3ZXIgdGhhbiBgY291bnRgIHZhbHVlcyB0aGVuXG4gKiBhbGwgb2YgaXRzIHZhbHVlcyBhcmUgZW1pdHRlZC4gQWZ0ZXIgdGhhdCwgaXQgY29tcGxldGVzLCByZWdhcmRsZXNzIGlmIHRoZVxuICogc291cmNlIGNvbXBsZXRlcy5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UYWtlIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgYW4gaW5maW5pdGUgMS1zZWNvbmQgaW50ZXJ2YWwgT2JzZXJ2YWJsZTwvY2FwdGlvbj5cbiAqIHZhciBpbnRlcnZhbCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG4gKiB2YXIgZml2ZSA9IGludGVydmFsLnRha2UoNSk7XG4gKiBmaXZlLnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayB0YWtlTGFzdH1cbiAqIEBzZWUge0BsaW5rIHRha2VVbnRpbH1cbiAqIEBzZWUge0BsaW5rIHRha2VXaGlsZX1cbiAqIEBzZWUge0BsaW5rIHNraXB9XG4gKlxuICogQHRocm93cyB7QXJndW1lbnRPdXRPZlJhbmdlRXJyb3J9IFdoZW4gdXNpbmcgYHRha2UoaSlgLCBpdCBkZWxpdmVycyBhblxuICogQXJndW1lbnRPdXRPclJhbmdlRXJyb3IgdG8gdGhlIE9ic2VydmVyJ3MgYGVycm9yYCBjYWxsYmFjayBpZiBgaSA8IDBgLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYG5leHRgIHZhbHVlcyB0byBlbWl0LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG9ubHkgdGhlIGZpcnN0IGBjb3VudGBcbiAqIHZhbHVlcyBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgb3IgYWxsIG9mIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlXG4gKiBpZiB0aGUgc291cmNlIGVtaXRzIGZld2VyIHRoYW4gYGNvdW50YCB2YWx1ZXMuXG4gKiBAbWV0aG9kIHRha2VcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRha2UoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbXB0eU9ic2VydmFibGVfMS5FbXB0eU9ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRha2VPcGVyYXRvcihjb3VudCkpO1xuICAgIH1cbn1cbmV4cG9ydHMudGFrZSA9IHRha2U7XG52YXIgVGFrZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWtlT3BlcmF0b3IodG90YWwpIHtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICBpZiAodGhpcy50b3RhbCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcl8xLkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIFRha2VPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMudG90YWwpKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWtlT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBUYWtlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRha2VTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRha2VTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCB0b3RhbCkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIFRha2VTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgdG90YWwgPSB0aGlzLnRvdGFsO1xuICAgICAgICB2YXIgY291bnQgPSArK3RoaXMuY291bnQ7XG4gICAgICAgIGlmIChjb3VudCA8PSB0b3RhbCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gdG90YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGFrZVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWtlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3Rha2UuanNcbi8vIG1vZHVsZSBpZCA9IDYxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1525. /***/ },
  1526. /* 618 */
  1527. /***/ function(module, exports, __webpack_require__) {
  1528. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar takeLast_1 = __webpack_require__(619);\nObservable_1.Observable.prototype.takeLast = takeLast_1.takeLast;\n//# sourceMappingURL=takeLast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90YWtlTGFzdC5qcz8wZDQ0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB0YWtlTGFzdF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvdGFrZUxhc3QnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50YWtlTGFzdCA9IHRha2VMYXN0XzEudGFrZUxhc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWtlTGFzdC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvdGFrZUxhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDYxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1529. /***/ },
  1530. /* 619 */
  1531. /***/ function(module, exports, __webpack_require__) {
  1532. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar ArgumentOutOfRangeError_1 = __webpack_require__(512);\nvar EmptyObservable_1 = __webpack_require__(41);\n/**\n * Emits only the last `count` values emitted by the source Observable.\n *\n * <span class=\"informal\">Remembers the latest `count` values, then emits those\n * only when the source completes.</span>\n *\n * <img src=\"./img/takeLast.png\" width=\"100%\">\n *\n * `takeLast` returns an Observable that emits at most the last `count` values\n * emitted by the source Observable. If the source emits fewer than `count`\n * values then all of its values are emitted. This operator must wait until the\n * `complete` notification emission from the source in order to emit the `next`\n * values on the output Observable, because otherwise it is impossible to know\n * whether or not more values will be emitted on the source. For this reason,\n * all values are emitted synchronously, followed by the complete notification.\n *\n * @example <caption>Take the last 3 values of an Observable with many values</caption>\n * var many = Rx.Observable.range(1, 100);\n * var lastThree = many.takeLast(3);\n * lastThree.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `takeLast(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of values to emit from the end of\n * the sequence of values emitted by the source Observable.\n * @return {Observable<T>} An Observable that emits at most the last count\n * values emitted by the source Observable.\n * @method takeLast\n * @owner Observable\n */\nfunction takeLast(count) {\n if (count === 0) {\n return new EmptyObservable_1.EmptyObservable();\n }\n else {\n return this.lift(new TakeLastOperator(count));\n }\n}\nexports.takeLast = takeLast;\nvar TakeLastOperator = (function () {\n function TakeLastOperator(total) {\n this.total = total;\n if (this.total < 0) {\n throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;\n }\n }\n TakeLastOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TakeLastSubscriber(subscriber, this.total));\n };\n return TakeLastOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeLastSubscriber = (function (_super) {\n __extends(TakeLastSubscriber, _super);\n function TakeLastSubscriber(destination, total) {\n _super.call(this, destination);\n this.total = total;\n this.ring = new Array();\n this.count = 0;\n }\n TakeLastSubscriber.prototype._next = function (value) {\n var ring = this.ring;\n var total = this.total;\n var count = this.count++;\n if (ring.length < total) {\n ring.push(value);\n }\n else {\n var index = count % total;\n ring[index] = value;\n }\n };\n TakeLastSubscriber.prototype._complete = function () {\n var destination = this.destination;\n var count = this.count;\n if (count > 0) {\n var total = this.count >= this.total ? this.total : this.count;\n var ring = this.ring;\n for (var i = 0; i < total; i++) {\n var idx = (count++) % total;\n destination.next(ring[idx]);\n }\n }\n destination.complete();\n };\n return TakeLastSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=takeLast.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rha2VMYXN0LmpzPzIxM2QiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JfMSA9IHJlcXVpcmUoJy4uL3V0aWwvQXJndW1lbnRPdXRPZlJhbmdlRXJyb3InKTtcbnZhciBFbXB0eU9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL29ic2VydmFibGUvRW1wdHlPYnNlcnZhYmxlJyk7XG4vKipcbiAqIEVtaXRzIG9ubHkgdGhlIGxhc3QgYGNvdW50YCB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPlJlbWVtYmVycyB0aGUgbGF0ZXN0IGBjb3VudGAgdmFsdWVzLCB0aGVuIGVtaXRzIHRob3NlXG4gKiBvbmx5IHdoZW4gdGhlIHNvdXJjZSBjb21wbGV0ZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvdGFrZUxhc3QucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYHRha2VMYXN0YCByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhdCBtb3N0IHRoZSBsYXN0IGBjb3VudGAgdmFsdWVzXG4gKiBlbWl0dGVkIGJ5IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS4gSWYgdGhlIHNvdXJjZSBlbWl0cyBmZXdlciB0aGFuIGBjb3VudGBcbiAqIHZhbHVlcyB0aGVuIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSBlbWl0dGVkLiBUaGlzIG9wZXJhdG9yIG11c3Qgd2FpdCB1bnRpbCB0aGVcbiAqIGBjb21wbGV0ZWAgbm90aWZpY2F0aW9uIGVtaXNzaW9uIGZyb20gdGhlIHNvdXJjZSBpbiBvcmRlciB0byBlbWl0IHRoZSBgbmV4dGBcbiAqIHZhbHVlcyBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGUsIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IGlzIGltcG9zc2libGUgdG8ga25vd1xuICogd2hldGhlciBvciBub3QgbW9yZSB2YWx1ZXMgd2lsbCBiZSBlbWl0dGVkIG9uIHRoZSBzb3VyY2UuIEZvciB0aGlzIHJlYXNvbixcbiAqIGFsbCB2YWx1ZXMgYXJlIGVtaXR0ZWQgc3luY2hyb25vdXNseSwgZm9sbG93ZWQgYnkgdGhlIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5UYWtlIHRoZSBsYXN0IDMgdmFsdWVzIG9mIGFuIE9ic2VydmFibGUgd2l0aCBtYW55IHZhbHVlczwvY2FwdGlvbj5cbiAqIHZhciBtYW55ID0gUnguT2JzZXJ2YWJsZS5yYW5nZSgxLCAxMDApO1xuICogdmFyIGxhc3RUaHJlZSA9IG1hbnkudGFrZUxhc3QoMyk7XG4gKiBsYXN0VGhyZWUuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIHRha2V9XG4gKiBAc2VlIHtAbGluayB0YWtlVW50aWx9XG4gKiBAc2VlIHtAbGluayB0YWtlV2hpbGV9XG4gKiBAc2VlIHtAbGluayBza2lwfVxuICpcbiAqIEB0aHJvd3Mge0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yfSBXaGVuIHVzaW5nIGB0YWtlTGFzdChpKWAsIGl0IGRlbGl2ZXJzIGFuXG4gKiBBcmd1bWVudE91dE9yUmFuZ2VFcnJvciB0byB0aGUgT2JzZXJ2ZXIncyBgZXJyb3JgIGNhbGxiYWNrIGlmIGBpIDwgMGAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgdG8gZW1pdCBmcm9tIHRoZSBlbmQgb2ZcbiAqIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFQ+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYXQgbW9zdCB0aGUgbGFzdCBjb3VudFxuICogdmFsdWVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLlxuICogQG1ldGhvZCB0YWtlTGFzdFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gdGFrZUxhc3QoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbXB0eU9ic2VydmFibGVfMS5FbXB0eU9ic2VydmFibGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRha2VMYXN0T3BlcmF0b3IoY291bnQpKTtcbiAgICB9XG59XG5leHBvcnRzLnRha2VMYXN0ID0gdGFrZUxhc3Q7XG52YXIgVGFrZUxhc3RPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFrZUxhc3RPcGVyYXRvcih0b3RhbCkge1xuICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yXzEuQXJndW1lbnRPdXRPZlJhbmdlRXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVGFrZUxhc3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VMYXN0U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnRvdGFsKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFrZUxhc3RPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFRha2VMYXN0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRha2VMYXN0U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWtlTGFzdFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHRvdGFsKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICB0aGlzLnJpbmcgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIFRha2VMYXN0U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJpbmcgPSB0aGlzLnJpbmc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMudG90YWw7XG4gICAgICAgIHZhciBjb3VudCA9IHRoaXMuY291bnQrKztcbiAgICAgICAgaWYgKHJpbmcubGVuZ3RoIDwgdG90YWwpIHtcbiAgICAgICAgICAgIHJpbmcucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBjb3VudCAlIHRvdGFsO1xuICAgICAgICAgICAgcmluZ1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGFrZUxhc3RTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIHZhciBjb3VudCA9IHRoaXMuY291bnQ7XG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IHRoaXMuY291bnQgPj0gdGhpcy50b3RhbCA/IHRoaXMudG90YWwgOiB0aGlzLmNvdW50O1xuICAgICAgICAgICAgdmFyIHJpbmcgPSB0aGlzLnJpbmc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gKGNvdW50KyspICUgdG90YWw7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dChyaW5nW2lkeF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFrZUxhc3RTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFrZUxhc3QuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdGFrZUxhc3QuanNcbi8vIG1vZHVsZSBpZCA9IDYxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1533. /***/ },
  1534. /* 620 */
  1535. /***/ function(module, exports, __webpack_require__) {
  1536. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar takeUntil_1 = __webpack_require__(621);\nObservable_1.Observable.prototype.takeUntil = takeUntil_1.takeUntil;\n//# sourceMappingURL=takeUntil.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90YWtlVW50aWwuanM/YTkyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdGFrZVVudGlsXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90YWtlVW50aWwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50YWtlVW50aWwgPSB0YWtlVW50aWxfMS50YWtlVW50aWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWtlVW50aWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3Rha2VVbnRpbC5qc1xuLy8gbW9kdWxlIGlkID0gNjIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1537. /***/ },
  1538. /* 621 */
  1539. /***/ function(module, exports, __webpack_require__) {
  1540. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Emits the values emitted by the source Observable until a `notifier`\n * Observable emits a value.\n *\n * <span class=\"informal\">Lets values pass until a second Observable,\n * `notifier`, emits something. Then, it completes.</span>\n *\n * <img src=\"./img/takeUntil.png\" width=\"100%\">\n *\n * `takeUntil` subscribes and begins mirroring the source Observable. It also\n * monitors a second Observable, `notifier` that you provide. If the `notifier`\n * emits a value or a complete notification, the output Observable stops\n * mirroring the source Observable and completes.\n *\n * @example <caption>Tick every second until the first click happens</caption>\n * var interval = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = interval.takeUntil(clicks);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @param {Observable} notifier The Observable whose first emitted value will\n * cause the output Observable of `takeUntil` to stop emitting values from the\n * source Observable.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable until such time as `notifier` emits its first value.\n * @method takeUntil\n * @owner Observable\n */\nfunction takeUntil(notifier) {\n return this.lift(new TakeUntilOperator(notifier));\n}\nexports.takeUntil = takeUntil;\nvar TakeUntilOperator = (function () {\n function TakeUntilOperator(notifier) {\n this.notifier = notifier;\n }\n TakeUntilOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TakeUntilSubscriber(subscriber, this.notifier));\n };\n return TakeUntilOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeUntilSubscriber = (function (_super) {\n __extends(TakeUntilSubscriber, _super);\n function TakeUntilSubscriber(destination, notifier) {\n _super.call(this, destination);\n this.notifier = notifier;\n this.add(subscribeToResult_1.subscribeToResult(this, notifier));\n }\n TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.complete();\n };\n TakeUntilSubscriber.prototype.notifyComplete = function () {\n // noop\n };\n return TakeUntilSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=takeUntil.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rha2VVbnRpbC5qcz85OTY1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBFbWl0cyB0aGUgdmFsdWVzIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHVudGlsIGEgYG5vdGlmaWVyYFxuICogT2JzZXJ2YWJsZSBlbWl0cyBhIHZhbHVlLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5MZXRzIHZhbHVlcyBwYXNzIHVudGlsIGEgc2Vjb25kIE9ic2VydmFibGUsXG4gKiBgbm90aWZpZXJgLCBlbWl0cyBzb21ldGhpbmcuIFRoZW4sIGl0IGNvbXBsZXRlcy48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy90YWtlVW50aWwucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYHRha2VVbnRpbGAgc3Vic2NyaWJlcyBhbmQgYmVnaW5zIG1pcnJvcmluZyB0aGUgc291cmNlIE9ic2VydmFibGUuIEl0IGFsc29cbiAqIG1vbml0b3JzIGEgc2Vjb25kIE9ic2VydmFibGUsIGBub3RpZmllcmAgdGhhdCB5b3UgcHJvdmlkZS4gSWYgdGhlIGBub3RpZmllcmBcbiAqIGVtaXRzIGEgdmFsdWUgb3IgYSBjb21wbGV0ZSBub3RpZmljYXRpb24sIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBzdG9wc1xuICogbWlycm9yaW5nIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSBhbmQgY29tcGxldGVzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlRpY2sgZXZlcnkgc2Vjb25kIHVudGlsIHRoZSBmaXJzdCBjbGljayBoYXBwZW5zPC9jYXB0aW9uPlxuICogdmFyIGludGVydmFsID0gUnguT2JzZXJ2YWJsZS5pbnRlcnZhbCgxMDAwKTtcbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gaW50ZXJ2YWwudGFrZVVudGlsKGNsaWNrcyk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIHRha2V9XG4gKiBAc2VlIHtAbGluayB0YWtlTGFzdH1cbiAqIEBzZWUge0BsaW5rIHRha2VXaGlsZX1cbiAqIEBzZWUge0BsaW5rIHNraXB9XG4gKlxuICogQHBhcmFtIHtPYnNlcnZhYmxlfSBub3RpZmllciBUaGUgT2JzZXJ2YWJsZSB3aG9zZSBmaXJzdCBlbWl0dGVkIHZhbHVlIHdpbGxcbiAqIGNhdXNlIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBvZiBgdGFrZVVudGlsYCB0byBzdG9wIGVtaXR0aW5nIHZhbHVlcyBmcm9tIHRoZVxuICogc291cmNlIE9ic2VydmFibGUuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFQ+fSBBbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUgdW50aWwgc3VjaCB0aW1lIGFzIGBub3RpZmllcmAgZW1pdHMgaXRzIGZpcnN0IHZhbHVlLlxuICogQG1ldGhvZCB0YWtlVW50aWxcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRha2VVbnRpbChub3RpZmllcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRha2VVbnRpbE9wZXJhdG9yKG5vdGlmaWVyKSk7XG59XG5leHBvcnRzLnRha2VVbnRpbCA9IHRha2VVbnRpbDtcbnZhciBUYWtlVW50aWxPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFrZVVudGlsT3BlcmF0b3Iobm90aWZpZXIpIHtcbiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyO1xuICAgIH1cbiAgICBUYWtlVW50aWxPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VVbnRpbFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFRha2VVbnRpbE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgVGFrZVVudGlsU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRha2VVbnRpbFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFrZVVudGlsU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgbm90aWZpZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7XG4gICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgbm90aWZpZXIpKTtcbiAgICB9XG4gICAgVGFrZVVudGlsU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBUYWtlVW50aWxTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH07XG4gICAgcmV0dXJuIFRha2VVbnRpbFN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFrZVVudGlsLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3Rha2VVbnRpbC5qc1xuLy8gbW9kdWxlIGlkID0gNjIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1541. /***/ },
  1542. /* 622 */
  1543. /***/ function(module, exports, __webpack_require__) {
  1544. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar takeWhile_1 = __webpack_require__(623);\nObservable_1.Observable.prototype.takeWhile = takeWhile_1.takeWhile;\n//# sourceMappingURL=takeWhile.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90YWtlV2hpbGUuanM/MTIzZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdGFrZVdoaWxlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90YWtlV2hpbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50YWtlV2hpbGUgPSB0YWtlV2hpbGVfMS50YWtlV2hpbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWtlV2hpbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3Rha2VXaGlsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1545. /***/ },
  1546. /* 623 */
  1547. /***/ function(module, exports, __webpack_require__) {
  1548. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Emits values emitted by the source Observable so long as each value satisfies\n * the given `predicate`, and then completes as soon as this `predicate` is not\n * satisfied.\n *\n * <span class=\"informal\">Takes values from the source only while they pass the\n * condition given. When the first value does not satisfy, it completes.</span>\n *\n * <img src=\"./img/takeWhile.png\" width=\"100%\">\n *\n * `takeWhile` subscribes and begins mirroring the source Observable. Each value\n * emitted on the source is given to the `predicate` function which returns a\n * boolean, representing a condition to be satisfied by the source values. The\n * output Observable emits the source values until such time as the `predicate`\n * returns false, at which point `takeWhile` stops mirroring the source\n * Observable and completes the output Observable.\n *\n * @example <caption>Emit click events only while the clientX property is greater than 200</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.takeWhile(ev => ev.clientX > 200);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link take}\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates a value emitted by the source Observable and returns a boolean.\n * Also takes the (zero-based) index as the second argument.\n * @return {Observable<T>} An Observable that emits the values from the source\n * Observable so long as each value satisfies the condition defined by the\n * `predicate`, then completes.\n * @method takeWhile\n * @owner Observable\n */\nfunction takeWhile(predicate) {\n return this.lift(new TakeWhileOperator(predicate));\n}\nexports.takeWhile = takeWhile;\nvar TakeWhileOperator = (function () {\n function TakeWhileOperator(predicate) {\n this.predicate = predicate;\n }\n TakeWhileOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate));\n };\n return TakeWhileOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TakeWhileSubscriber = (function (_super) {\n __extends(TakeWhileSubscriber, _super);\n function TakeWhileSubscriber(destination, predicate) {\n _super.call(this, destination);\n this.predicate = predicate;\n this.index = 0;\n }\n TakeWhileSubscriber.prototype._next = function (value) {\n var destination = this.destination;\n var result;\n try {\n result = this.predicate(value, this.index++);\n }\n catch (err) {\n destination.error(err);\n return;\n }\n this.nextOrComplete(value, result);\n };\n TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {\n var destination = this.destination;\n if (Boolean(predicateResult)) {\n destination.next(value);\n }\n else {\n destination.complete();\n }\n };\n return TakeWhileSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=takeWhile.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rha2VXaGlsZS5qcz82NTljIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBFbWl0cyB2YWx1ZXMgZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgc28gbG9uZyBhcyBlYWNoIHZhbHVlIHNhdGlzZmllc1xuICogdGhlIGdpdmVuIGBwcmVkaWNhdGVgLCBhbmQgdGhlbiBjb21wbGV0ZXMgYXMgc29vbiBhcyB0aGlzIGBwcmVkaWNhdGVgIGlzIG5vdFxuICogc2F0aXNmaWVkLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5UYWtlcyB2YWx1ZXMgZnJvbSB0aGUgc291cmNlIG9ubHkgd2hpbGUgdGhleSBwYXNzIHRoZVxuICogY29uZGl0aW9uIGdpdmVuLiBXaGVuIHRoZSBmaXJzdCB2YWx1ZSBkb2VzIG5vdCBzYXRpc2Z5LCBpdCBjb21wbGV0ZXMuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvdGFrZVdoaWxlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGB0YWtlV2hpbGVgIHN1YnNjcmliZXMgYW5kIGJlZ2lucyBtaXJyb3JpbmcgdGhlIHNvdXJjZSBPYnNlcnZhYmxlLiBFYWNoIHZhbHVlXG4gKiBlbWl0dGVkIG9uIHRoZSBzb3VyY2UgaXMgZ2l2ZW4gdG8gdGhlIGBwcmVkaWNhdGVgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYVxuICogYm9vbGVhbiwgcmVwcmVzZW50aW5nIGEgY29uZGl0aW9uIHRvIGJlIHNhdGlzZmllZCBieSB0aGUgc291cmNlIHZhbHVlcy4gVGhlXG4gKiBvdXRwdXQgT2JzZXJ2YWJsZSBlbWl0cyB0aGUgc291cmNlIHZhbHVlcyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIGBwcmVkaWNhdGVgXG4gKiByZXR1cm5zIGZhbHNlLCBhdCB3aGljaCBwb2ludCBgdGFrZVdoaWxlYCBzdG9wcyBtaXJyb3JpbmcgdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZSBhbmQgY29tcGxldGVzIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FbWl0IGNsaWNrIGV2ZW50cyBvbmx5IHdoaWxlIHRoZSBjbGllbnRYIHByb3BlcnR5IGlzIGdyZWF0ZXIgdGhhbiAyMDA8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy50YWtlV2hpbGUoZXYgPT4gZXYuY2xpZW50WCA+IDIwMCk7XG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIHRha2V9XG4gKiBAc2VlIHtAbGluayB0YWtlTGFzdH1cbiAqIEBzZWUge0BsaW5rIHRha2VVbnRpbH1cbiAqIEBzZWUge0BsaW5rIHNraXB9XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbih2YWx1ZTogVCwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW59IHByZWRpY2F0ZSBBIGZ1bmN0aW9uIHRoYXRcbiAqIGV2YWx1YXRlcyBhIHZhbHVlIGVtaXR0ZWQgYnkgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGFuZCByZXR1cm5zIGEgYm9vbGVhbi5cbiAqIEFsc28gdGFrZXMgdGhlICh6ZXJvLWJhc2VkKSBpbmRleCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlIHNvIGxvbmcgYXMgZWFjaCB2YWx1ZSBzYXRpc2ZpZXMgdGhlIGNvbmRpdGlvbiBkZWZpbmVkIGJ5IHRoZVxuICogYHByZWRpY2F0ZWAsIHRoZW4gY29tcGxldGVzLlxuICogQG1ldGhvZCB0YWtlV2hpbGVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRha2VXaGlsZShwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBUYWtlV2hpbGVPcGVyYXRvcihwcmVkaWNhdGUpKTtcbn1cbmV4cG9ydHMudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xudmFyIFRha2VXaGlsZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUYWtlV2hpbGVPcGVyYXRvcihwcmVkaWNhdGUpIHtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgfVxuICAgIFRha2VXaGlsZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFrZVdoaWxlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByZWRpY2F0ZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRha2VXaGlsZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgVGFrZVdoaWxlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRha2VXaGlsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFrZVdoaWxlU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIH1cbiAgICBUYWtlV2hpbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUodmFsdWUsIHRoaXMuaW5kZXgrKyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRPckNvbXBsZXRlKHZhbHVlLCByZXN1bHQpO1xuICAgIH07XG4gICAgVGFrZVdoaWxlU3Vic2NyaWJlci5wcm90b3R5cGUubmV4dE9yQ29tcGxldGUgPSBmdW5jdGlvbiAodmFsdWUsIHByZWRpY2F0ZVJlc3VsdCkge1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICBpZiAoQm9vbGVhbihwcmVkaWNhdGVSZXN1bHQpKSB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYWtlV2hpbGVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFrZVdoaWxlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3Rha2VXaGlsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1549. /***/ },
  1550. /* 624 */
  1551. /***/ function(module, exports, __webpack_require__) {
  1552. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar throttle_1 = __webpack_require__(625);\nObservable_1.Observable.prototype.throttle = throttle_1.throttle;\n//# sourceMappingURL=throttle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aHJvdHRsZS5qcz9lYTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB0aHJvdHRsZV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvdGhyb3R0bGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aHJvdHRsZSA9IHRocm90dGxlXzEudGhyb3R0bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvdGhyb3R0bGUuanNcbi8vIG1vZHVsZSBpZCA9IDYyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1553. /***/ },
  1554. /* 625 */
  1555. /***/ function(module, exports, __webpack_require__) {
  1556. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for a duration determined by another Observable, then repeats this\n * process.\n *\n * <span class=\"informal\">It's like {@link throttleTime}, but the silencing\n * duration is determined by a second Observable.</span>\n *\n * <img src=\"./img/throttle.png\" width=\"100%\">\n *\n * `throttle` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled by calling the `durationSelector` function with the source value,\n * which returns the \"duration\" Observable. When the duration Observable emits a\n * value or completes, the timer is disabled, and this process repeats for the\n * next source value.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttle(ev => Rx.Observable.interval(1000));\n * result.subscribe(x => console.log(x));\n *\n * @see {@link audit}\n * @see {@link debounce}\n * @see {@link delayWhen}\n * @see {@link sample}\n * @see {@link throttleTime}\n *\n * @param {function(value: T): Observable|Promise} durationSelector A function\n * that receives a value from the source Observable, for computing the silencing\n * duration for each source value, returned as an Observable or a Promise.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttle\n * @owner Observable\n */\nfunction throttle(durationSelector) {\n return this.lift(new ThrottleOperator(durationSelector));\n}\nexports.throttle = throttle;\nvar ThrottleOperator = (function () {\n function ThrottleOperator(durationSelector) {\n this.durationSelector = durationSelector;\n }\n ThrottleOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector));\n };\n return ThrottleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleSubscriber = (function (_super) {\n __extends(ThrottleSubscriber, _super);\n function ThrottleSubscriber(destination, durationSelector) {\n _super.call(this, destination);\n this.destination = destination;\n this.durationSelector = durationSelector;\n }\n ThrottleSubscriber.prototype._next = function (value) {\n if (!this.throttled) {\n this.tryDurationSelector(value);\n }\n };\n ThrottleSubscriber.prototype.tryDurationSelector = function (value) {\n var duration = null;\n try {\n duration = this.durationSelector(value);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.emitAndThrottle(value, duration);\n };\n ThrottleSubscriber.prototype.emitAndThrottle = function (value, duration) {\n this.add(this.throttled = subscribeToResult_1.subscribeToResult(this, duration));\n this.destination.next(value);\n };\n ThrottleSubscriber.prototype._unsubscribe = function () {\n var throttled = this.throttled;\n if (throttled) {\n this.remove(throttled);\n this.throttled = null;\n throttled.unsubscribe();\n }\n };\n ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this._unsubscribe();\n };\n ThrottleSubscriber.prototype.notifyComplete = function () {\n this._unsubscribe();\n };\n return ThrottleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=throttle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rocm90dGxlLmpzPzE3MjkiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKipcbiAqIEVtaXRzIGEgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUsIHRoZW4gaWdub3JlcyBzdWJzZXF1ZW50IHNvdXJjZVxuICogdmFsdWVzIGZvciBhIGR1cmF0aW9uIGRldGVybWluZWQgYnkgYW5vdGhlciBPYnNlcnZhYmxlLCB0aGVuIHJlcGVhdHMgdGhpc1xuICogcHJvY2Vzcy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayB0aHJvdHRsZVRpbWV9LCBidXQgdGhlIHNpbGVuY2luZ1xuICogZHVyYXRpb24gaXMgZGV0ZXJtaW5lZCBieSBhIHNlY29uZCBPYnNlcnZhYmxlLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3Rocm90dGxlLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGB0aHJvdHRsZWAgZW1pdHMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHZhbHVlcyBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGVcbiAqIHdoZW4gaXRzIGludGVybmFsIHRpbWVyIGlzIGRpc2FibGVkLCBhbmQgaWdub3JlcyBzb3VyY2UgdmFsdWVzIHdoZW4gdGhlIHRpbWVyXG4gKiBpcyBlbmFibGVkLiBJbml0aWFsbHksIHRoZSB0aW1lciBpcyBkaXNhYmxlZC4gQXMgc29vbiBhcyB0aGUgZmlyc3Qgc291cmNlXG4gKiB2YWx1ZSBhcnJpdmVzLCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIG91dHB1dCBPYnNlcnZhYmxlLCBhbmQgdGhlbiB0aGUgdGltZXJcbiAqIGlzIGVuYWJsZWQgYnkgY2FsbGluZyB0aGUgYGR1cmF0aW9uU2VsZWN0b3JgIGZ1bmN0aW9uIHdpdGggdGhlIHNvdXJjZSB2YWx1ZSxcbiAqIHdoaWNoIHJldHVybnMgdGhlIFwiZHVyYXRpb25cIiBPYnNlcnZhYmxlLiBXaGVuIHRoZSBkdXJhdGlvbiBPYnNlcnZhYmxlIGVtaXRzIGFcbiAqIHZhbHVlIG9yIGNvbXBsZXRlcywgdGhlIHRpbWVyIGlzIGRpc2FibGVkLCBhbmQgdGhpcyBwcm9jZXNzIHJlcGVhdHMgZm9yIHRoZVxuICogbmV4dCBzb3VyY2UgdmFsdWUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCBjbGlja3MgYXQgYSByYXRlIG9mIGF0IG1vc3Qgb25lIGNsaWNrIHBlciBzZWNvbmQ8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy50aHJvdHRsZShldiA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgYXVkaXR9XG4gKiBAc2VlIHtAbGluayBkZWJvdW5jZX1cbiAqIEBzZWUge0BsaW5rIGRlbGF5V2hlbn1cbiAqIEBzZWUge0BsaW5rIHNhbXBsZX1cbiAqIEBzZWUge0BsaW5rIHRocm90dGxlVGltZX1cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBUKTogT2JzZXJ2YWJsZXxQcm9taXNlfSBkdXJhdGlvblNlbGVjdG9yIEEgZnVuY3Rpb25cbiAqIHRoYXQgcmVjZWl2ZXMgYSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgZm9yIGNvbXB1dGluZyB0aGUgc2lsZW5jaW5nXG4gKiBkdXJhdGlvbiBmb3IgZWFjaCBzb3VyY2UgdmFsdWUsIHJldHVybmVkIGFzIGFuIE9ic2VydmFibGUgb3IgYSBQcm9taXNlLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IHBlcmZvcm1zIHRoZSB0aHJvdHRsZSBvcGVyYXRpb24gdG9cbiAqIGxpbWl0IHRoZSByYXRlIG9mIGVtaXNzaW9ucyBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAbWV0aG9kIHRocm90dGxlXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgVGhyb3R0bGVPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7XG59XG5leHBvcnRzLnRocm90dGxlID0gdGhyb3R0bGU7XG52YXIgVGhyb3R0bGVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGhyb3R0bGVPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7XG4gICAgfVxuICAgIFRocm90dGxlT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUaHJvdHRsZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGhyb3R0bGVPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFRocm90dGxlU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRocm90dGxlU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaHJvdHRsZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIGR1cmF0aW9uU2VsZWN0b3IpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7XG4gICAgfVxuICAgIFRocm90dGxlU3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkge1xuICAgICAgICAgICAgdGhpcy50cnlEdXJhdGlvblNlbGVjdG9yKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGhyb3R0bGVTdWJzY3JpYmVyLnByb3RvdHlwZS50cnlEdXJhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb25TZWxlY3Rvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdEFuZFRocm90dGxlKHZhbHVlLCBkdXJhdGlvbik7XG4gICAgfTtcbiAgICBUaHJvdHRsZVN1YnNjcmliZXIucHJvdG90eXBlLmVtaXRBbmRUaHJvdHRsZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZHVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5hZGQodGhpcy50aHJvdHRsZWQgPSBzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGR1cmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgfTtcbiAgICBUaHJvdHRsZVN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRocm90dGxlZCA9IHRoaXMudGhyb3R0bGVkO1xuICAgICAgICBpZiAodGhyb3R0bGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSh0aHJvdHRsZWQpO1xuICAgICAgICAgICAgdGhpcy50aHJvdHRsZWQgPSBudWxsO1xuICAgICAgICAgICAgdGhyb3R0bGVkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRocm90dGxlU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uIChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1Yikge1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgVGhyb3R0bGVTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBUaHJvdHRsZVN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3R0bGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdGhyb3R0bGUuanNcbi8vIG1vZHVsZSBpZCA9IDYyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1557. /***/ },
  1558. /* 626 */
  1559. /***/ function(module, exports, __webpack_require__) {
  1560. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar throttleTime_1 = __webpack_require__(627);\nObservable_1.Observable.prototype.throttleTime = throttleTime_1.throttleTime;\n//# sourceMappingURL=throttleTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aHJvdHRsZVRpbWUuanM/M2RlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdGhyb3R0bGVUaW1lXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90aHJvdHRsZVRpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aHJvdHRsZVRpbWUgPSB0aHJvdHRsZVRpbWVfMS50aHJvdHRsZVRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsZVRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3Rocm90dGxlVGltZS5qc1xuLy8gbW9kdWxlIGlkID0gNjI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1561. /***/ },
  1562. /* 627 */
  1563. /***/ function(module, exports, __webpack_require__) {
  1564. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar async_1 = __webpack_require__(414);\n/**\n * Emits a value from the source Observable, then ignores subsequent source\n * values for `duration` milliseconds, then repeats this process.\n *\n * <span class=\"informal\">Lets a value pass, then ignores source values for the\n * next `duration` milliseconds.</span>\n *\n * <img src=\"./img/throttleTime.png\" width=\"100%\">\n *\n * `throttleTime` emits the source Observable values on the output Observable\n * when its internal timer is disabled, and ignores source values when the timer\n * is enabled. Initially, the timer is disabled. As soon as the first source\n * value arrives, it is forwarded to the output Observable, and then the timer\n * is enabled. After `duration` milliseconds (or the time unit determined\n * internally by the optional `scheduler`) has passed, the timer is disabled,\n * and this process repeats for the next source value. Optionally takes a\n * {@link Scheduler} for managing timers.\n *\n * @example <caption>Emit clicks at a rate of at most one click per second</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.throttleTime(1000);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link auditTime}\n * @see {@link debounceTime}\n * @see {@link delay}\n * @see {@link sampleTime}\n * @see {@link throttle}\n *\n * @param {number} duration Time to wait before emitting another value after\n * emitting the last value, measured in milliseconds or the time unit determined\n * internally by the optional `scheduler`.\n * @param {Scheduler} [scheduler=async] The {@link Scheduler} to use for\n * managing the timers that handle the sampling.\n * @return {Observable<T>} An Observable that performs the throttle operation to\n * limit the rate of emissions from the source.\n * @method throttleTime\n * @owner Observable\n */\nfunction throttleTime(duration, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new ThrottleTimeOperator(duration, scheduler));\n}\nexports.throttleTime = throttleTime;\nvar ThrottleTimeOperator = (function () {\n function ThrottleTimeOperator(duration, scheduler) {\n this.duration = duration;\n this.scheduler = scheduler;\n }\n ThrottleTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler));\n };\n return ThrottleTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ThrottleTimeSubscriber = (function (_super) {\n __extends(ThrottleTimeSubscriber, _super);\n function ThrottleTimeSubscriber(destination, duration, scheduler) {\n _super.call(this, destination);\n this.duration = duration;\n this.scheduler = scheduler;\n }\n ThrottleTimeSubscriber.prototype._next = function (value) {\n if (!this.throttled) {\n this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n this.destination.next(value);\n }\n };\n ThrottleTimeSubscriber.prototype.clearThrottle = function () {\n var throttled = this.throttled;\n if (throttled) {\n throttled.unsubscribe();\n this.remove(throttled);\n this.throttled = null;\n }\n };\n return ThrottleTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchNext(arg) {\n var subscriber = arg.subscriber;\n subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3Rocm90dGxlVGltZS5qcz85YmJkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbi8qKlxuICogRW1pdHMgYSB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSwgdGhlbiBpZ25vcmVzIHN1YnNlcXVlbnQgc291cmNlXG4gKiB2YWx1ZXMgZm9yIGBkdXJhdGlvbmAgbWlsbGlzZWNvbmRzLCB0aGVuIHJlcGVhdHMgdGhpcyBwcm9jZXNzLlxuICpcbiAqIDxzcGFuIGNsYXNzPVwiaW5mb3JtYWxcIj5MZXRzIGEgdmFsdWUgcGFzcywgdGhlbiBpZ25vcmVzIHNvdXJjZSB2YWx1ZXMgZm9yIHRoZVxuICogbmV4dCBgZHVyYXRpb25gIG1pbGxpc2Vjb25kcy48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy90aHJvdHRsZVRpbWUucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogYHRocm90dGxlVGltZWAgZW1pdHMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHZhbHVlcyBvbiB0aGUgb3V0cHV0IE9ic2VydmFibGVcbiAqIHdoZW4gaXRzIGludGVybmFsIHRpbWVyIGlzIGRpc2FibGVkLCBhbmQgaWdub3JlcyBzb3VyY2UgdmFsdWVzIHdoZW4gdGhlIHRpbWVyXG4gKiBpcyBlbmFibGVkLiBJbml0aWFsbHksIHRoZSB0aW1lciBpcyBkaXNhYmxlZC4gQXMgc29vbiBhcyB0aGUgZmlyc3Qgc291cmNlXG4gKiB2YWx1ZSBhcnJpdmVzLCBpdCBpcyBmb3J3YXJkZWQgdG8gdGhlIG91dHB1dCBPYnNlcnZhYmxlLCBhbmQgdGhlbiB0aGUgdGltZXJcbiAqIGlzIGVuYWJsZWQuIEFmdGVyIGBkdXJhdGlvbmAgbWlsbGlzZWNvbmRzIChvciB0aGUgdGltZSB1bml0IGRldGVybWluZWRcbiAqIGludGVybmFsbHkgYnkgdGhlIG9wdGlvbmFsIGBzY2hlZHVsZXJgKSBoYXMgcGFzc2VkLCB0aGUgdGltZXIgaXMgZGlzYWJsZWQsXG4gKiBhbmQgdGhpcyBwcm9jZXNzIHJlcGVhdHMgZm9yIHRoZSBuZXh0IHNvdXJjZSB2YWx1ZS4gT3B0aW9uYWxseSB0YWtlcyBhXG4gKiB7QGxpbmsgU2NoZWR1bGVyfSBmb3IgbWFuYWdpbmcgdGltZXJzLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkVtaXQgY2xpY2tzIGF0IGEgcmF0ZSBvZiBhdCBtb3N0IG9uZSBjbGljayBwZXIgc2Vjb25kPC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciByZXN1bHQgPSBjbGlja3MudGhyb3R0bGVUaW1lKDEwMDApO1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayBhdWRpdFRpbWV9XG4gKiBAc2VlIHtAbGluayBkZWJvdW5jZVRpbWV9XG4gKiBAc2VlIHtAbGluayBkZWxheX1cbiAqIEBzZWUge0BsaW5rIHNhbXBsZVRpbWV9XG4gKiBAc2VlIHtAbGluayB0aHJvdHRsZX1cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGltZSB0byB3YWl0IGJlZm9yZSBlbWl0dGluZyBhbm90aGVyIHZhbHVlIGFmdGVyXG4gKiBlbWl0dGluZyB0aGUgbGFzdCB2YWx1ZSwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzIG9yIHRoZSB0aW1lIHVuaXQgZGV0ZXJtaW5lZFxuICogaW50ZXJuYWxseSBieSB0aGUgb3B0aW9uYWwgYHNjaGVkdWxlcmAuXG4gKiBAcGFyYW0ge1NjaGVkdWxlcn0gW3NjaGVkdWxlcj1hc3luY10gVGhlIHtAbGluayBTY2hlZHVsZXJ9IHRvIHVzZSBmb3JcbiAqIG1hbmFnaW5nIHRoZSB0aW1lcnMgdGhhdCBoYW5kbGUgdGhlIHNhbXBsaW5nLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUPn0gQW4gT2JzZXJ2YWJsZSB0aGF0IHBlcmZvcm1zIHRoZSB0aHJvdHRsZSBvcGVyYXRpb24gdG9cbiAqIGxpbWl0IHRoZSByYXRlIG9mIGVtaXNzaW9ucyBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAbWV0aG9kIHRocm90dGxlVGltZVxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGVUaW1lKGR1cmF0aW9uLCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRocm90dGxlVGltZU9wZXJhdG9yKGR1cmF0aW9uLCBzY2hlZHVsZXIpKTtcbn1cbmV4cG9ydHMudGhyb3R0bGVUaW1lID0gdGhyb3R0bGVUaW1lO1xudmFyIFRocm90dGxlVGltZU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaHJvdHRsZVRpbWVPcGVyYXRvcihkdXJhdGlvbiwgc2NoZWR1bGVyKSB7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIFRocm90dGxlVGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGhyb3R0bGVUaW1lU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmR1cmF0aW9uLCB0aGlzLnNjaGVkdWxlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFRocm90dGxlVGltZU9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgVGhyb3R0bGVUaW1lU3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRocm90dGxlVGltZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGhyb3R0bGVUaW1lU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgZHVyYXRpb24sIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIFRocm90dGxlVGltZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy50aHJvdHRsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMudGhyb3R0bGVkID0gdGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hOZXh0LCB0aGlzLmR1cmF0aW9uLCB7IHN1YnNjcmliZXI6IHRoaXMgfSkpO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGhyb3R0bGVUaW1lU3Vic2NyaWJlci5wcm90b3R5cGUuY2xlYXJUaHJvdHRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRocm90dGxlZCA9IHRoaXMudGhyb3R0bGVkO1xuICAgICAgICBpZiAodGhyb3R0bGVkKSB7XG4gICAgICAgICAgICB0aHJvdHRsZWQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRocm90dGxlZCk7XG4gICAgICAgICAgICB0aGlzLnRocm90dGxlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUaHJvdHRsZVRpbWVTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuZnVuY3Rpb24gZGlzcGF0Y2hOZXh0KGFyZykge1xuICAgIHZhciBzdWJzY3JpYmVyID0gYXJnLnN1YnNjcmliZXI7XG4gICAgc3Vic2NyaWJlci5jbGVhclRocm90dGxlKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsZVRpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdGhyb3R0bGVUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA2Mjdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1565. /***/ },
  1566. /* 628 */
  1567. /***/ function(module, exports, __webpack_require__) {
  1568. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar timeInterval_1 = __webpack_require__(629);\nObservable_1.Observable.prototype.timeInterval = timeInterval_1.timeInterval;\n//# sourceMappingURL=timeInterval.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aW1lSW50ZXJ2YWwuanM/MzEwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdGltZUludGVydmFsXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90aW1lSW50ZXJ2YWwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aW1lSW50ZXJ2YWwgPSB0aW1lSW50ZXJ2YWxfMS50aW1lSW50ZXJ2YWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lSW50ZXJ2YWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3RpbWVJbnRlcnZhbC5qc1xuLy8gbW9kdWxlIGlkID0gNjI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1569. /***/ },
  1570. /* 629 */
  1571. /***/ function(module, exports, __webpack_require__) {
  1572. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar async_1 = __webpack_require__(414);\n/**\n * @param scheduler\n * @return {Observable<TimeInterval<any>>|WebSocketSubject<T>|Observable<T>}\n * @method timeInterval\n * @owner Observable\n */\nfunction timeInterval(scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new TimeIntervalOperator(scheduler));\n}\nexports.timeInterval = timeInterval;\nvar TimeInterval = (function () {\n function TimeInterval(value, interval) {\n this.value = value;\n this.interval = interval;\n }\n return TimeInterval;\n}());\nexports.TimeInterval = TimeInterval;\n;\nvar TimeIntervalOperator = (function () {\n function TimeIntervalOperator(scheduler) {\n this.scheduler = scheduler;\n }\n TimeIntervalOperator.prototype.call = function (observer, source) {\n return source.subscribe(new TimeIntervalSubscriber(observer, this.scheduler));\n };\n return TimeIntervalOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TimeIntervalSubscriber = (function (_super) {\n __extends(TimeIntervalSubscriber, _super);\n function TimeIntervalSubscriber(destination, scheduler) {\n _super.call(this, destination);\n this.scheduler = scheduler;\n this.lastTime = 0;\n this.lastTime = scheduler.now();\n }\n TimeIntervalSubscriber.prototype._next = function (value) {\n var now = this.scheduler.now();\n var span = now - this.lastTime;\n this.lastTime = now;\n this.destination.next(new TimeInterval(value, span));\n };\n return TimeIntervalSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=timeInterval.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3RpbWVJbnRlcnZhbC5qcz9jOTFlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbi8qKlxuICogQHBhcmFtIHNjaGVkdWxlclxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUaW1lSW50ZXJ2YWw8YW55Pj58V2ViU29ja2V0U3ViamVjdDxUPnxPYnNlcnZhYmxlPFQ+fVxuICogQG1ldGhvZCB0aW1lSW50ZXJ2YWxcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRpbWVJbnRlcnZhbChzY2hlZHVsZXIpIHtcbiAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRpbWVJbnRlcnZhbE9wZXJhdG9yKHNjaGVkdWxlcikpO1xufVxuZXhwb3J0cy50aW1lSW50ZXJ2YWwgPSB0aW1lSW50ZXJ2YWw7XG52YXIgVGltZUludGVydmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lSW50ZXJ2YWwodmFsdWUsIGludGVydmFsKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IGludGVydmFsO1xuICAgIH1cbiAgICByZXR1cm4gVGltZUludGVydmFsO1xufSgpKTtcbmV4cG9ydHMuVGltZUludGVydmFsID0gVGltZUludGVydmFsO1xuO1xudmFyIFRpbWVJbnRlcnZhbE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lSW50ZXJ2YWxPcGVyYXRvcihzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIFRpbWVJbnRlcnZhbE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRpbWVJbnRlcnZhbFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUludGVydmFsT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBUaW1lSW50ZXJ2YWxTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGltZUludGVydmFsU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lSW50ZXJ2YWxTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5sYXN0VGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSBzY2hlZHVsZXIubm93KCk7XG4gICAgfVxuICAgIFRpbWVJbnRlcnZhbFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBub3cgPSB0aGlzLnNjaGVkdWxlci5ub3coKTtcbiAgICAgICAgdmFyIHNwYW4gPSBub3cgLSB0aGlzLmxhc3RUaW1lO1xuICAgICAgICB0aGlzLmxhc3RUaW1lID0gbm93O1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQobmV3IFRpbWVJbnRlcnZhbCh2YWx1ZSwgc3BhbikpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVJbnRlcnZhbFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXJfMS5TdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lSW50ZXJ2YWwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdGltZUludGVydmFsLmpzXG4vLyBtb2R1bGUgaWQgPSA2Mjlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1573. /***/ },
  1574. /* 630 */
  1575. /***/ function(module, exports, __webpack_require__) {
  1576. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar timeout_1 = __webpack_require__(631);\nObservable_1.Observable.prototype.timeout = timeout_1.timeout;\n//# sourceMappingURL=timeout.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aW1lb3V0LmpzPzA1YmYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRpbWVvdXRfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3RpbWVvdXQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aW1lb3V0ID0gdGltZW91dF8xLnRpbWVvdXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lb3V0LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci90aW1lb3V0LmpzXG4vLyBtb2R1bGUgaWQgPSA2MzBcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1577. /***/ },
  1578. /* 631 */
  1579. /***/ function(module, exports, __webpack_require__) {
  1580. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = __webpack_require__(414);\nvar isDate_1 = __webpack_require__(446);\nvar Subscriber_1 = __webpack_require__(9);\nvar TimeoutError_1 = __webpack_require__(632);\n/**\n * @param {number} due\n * @param {Scheduler} [scheduler]\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method timeout\n * @owner Observable\n */\nfunction timeout(due, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n var absoluteTimeout = isDate_1.isDate(due);\n var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);\n return this.lift(new TimeoutOperator(waitFor, absoluteTimeout, scheduler, new TimeoutError_1.TimeoutError()));\n}\nexports.timeout = timeout;\nvar TimeoutOperator = (function () {\n function TimeoutOperator(waitFor, absoluteTimeout, scheduler, errorInstance) {\n this.waitFor = waitFor;\n this.absoluteTimeout = absoluteTimeout;\n this.scheduler = scheduler;\n this.errorInstance = errorInstance;\n }\n TimeoutOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TimeoutSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.scheduler, this.errorInstance));\n };\n return TimeoutOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TimeoutSubscriber = (function (_super) {\n __extends(TimeoutSubscriber, _super);\n function TimeoutSubscriber(destination, absoluteTimeout, waitFor, scheduler, errorInstance) {\n _super.call(this, destination);\n this.absoluteTimeout = absoluteTimeout;\n this.waitFor = waitFor;\n this.scheduler = scheduler;\n this.errorInstance = errorInstance;\n this.index = 0;\n this._previousIndex = 0;\n this._hasCompleted = false;\n this.scheduleTimeout();\n }\n Object.defineProperty(TimeoutSubscriber.prototype, \"previousIndex\", {\n get: function () {\n return this._previousIndex;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TimeoutSubscriber.prototype, \"hasCompleted\", {\n get: function () {\n return this._hasCompleted;\n },\n enumerable: true,\n configurable: true\n });\n TimeoutSubscriber.dispatchTimeout = function (state) {\n var source = state.subscriber;\n var currentIndex = state.index;\n if (!source.hasCompleted && source.previousIndex === currentIndex) {\n source.notifyTimeout();\n }\n };\n TimeoutSubscriber.prototype.scheduleTimeout = function () {\n var currentIndex = this.index;\n this.scheduler.schedule(TimeoutSubscriber.dispatchTimeout, this.waitFor, { subscriber: this, index: currentIndex });\n this.index++;\n this._previousIndex = currentIndex;\n };\n TimeoutSubscriber.prototype._next = function (value) {\n this.destination.next(value);\n if (!this.absoluteTimeout) {\n this.scheduleTimeout();\n }\n };\n TimeoutSubscriber.prototype._error = function (err) {\n this.destination.error(err);\n this._hasCompleted = true;\n };\n TimeoutSubscriber.prototype._complete = function () {\n this.destination.complete();\n this._hasCompleted = true;\n };\n TimeoutSubscriber.prototype.notifyTimeout = function () {\n this.error(this.errorInstance);\n };\n return TimeoutSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=timeout.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3RpbWVvdXQuanM/ZWM4MSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbnZhciBpc0RhdGVfMSA9IHJlcXVpcmUoJy4uL3V0aWwvaXNEYXRlJyk7XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIFRpbWVvdXRFcnJvcl8xID0gcmVxdWlyZSgnLi4vdXRpbC9UaW1lb3V0RXJyb3InKTtcbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGR1ZVxuICogQHBhcmFtIHtTY2hlZHVsZXJ9IFtzY2hlZHVsZXJdXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPFI+fFdlYlNvY2tldFN1YmplY3Q8VD58T2JzZXJ2YWJsZTxUPn1cbiAqIEBtZXRob2QgdGltZW91dFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gdGltZW91dChkdWUsIHNjaGVkdWxlcikge1xuICAgIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkgeyBzY2hlZHVsZXIgPSBhc3luY18xLmFzeW5jOyB9XG4gICAgdmFyIGFic29sdXRlVGltZW91dCA9IGlzRGF0ZV8xLmlzRGF0ZShkdWUpO1xuICAgIHZhciB3YWl0Rm9yID0gYWJzb2x1dGVUaW1lb3V0ID8gKCtkdWUgLSBzY2hlZHVsZXIubm93KCkpIDogTWF0aC5hYnMoZHVlKTtcbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBUaW1lb3V0T3BlcmF0b3Iod2FpdEZvciwgYWJzb2x1dGVUaW1lb3V0LCBzY2hlZHVsZXIsIG5ldyBUaW1lb3V0RXJyb3JfMS5UaW1lb3V0RXJyb3IoKSkpO1xufVxuZXhwb3J0cy50aW1lb3V0ID0gdGltZW91dDtcbnZhciBUaW1lb3V0T3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVvdXRPcGVyYXRvcih3YWl0Rm9yLCBhYnNvbHV0ZVRpbWVvdXQsIHNjaGVkdWxlciwgZXJyb3JJbnN0YW5jZSkge1xuICAgICAgICB0aGlzLndhaXRGb3IgPSB3YWl0Rm9yO1xuICAgICAgICB0aGlzLmFic29sdXRlVGltZW91dCA9IGFic29sdXRlVGltZW91dDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMuZXJyb3JJbnN0YW5jZSA9IGVycm9ySW5zdGFuY2U7XG4gICAgfVxuICAgIFRpbWVvdXRPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRpbWVvdXRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYWJzb2x1dGVUaW1lb3V0LCB0aGlzLndhaXRGb3IsIHRoaXMuc2NoZWR1bGVyLCB0aGlzLmVycm9ySW5zdGFuY2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lb3V0T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBUaW1lb3V0U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRpbWVvdXRTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVvdXRTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBhYnNvbHV0ZVRpbWVvdXQsIHdhaXRGb3IsIHNjaGVkdWxlciwgZXJyb3JJbnN0YW5jZSkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuYWJzb2x1dGVUaW1lb3V0ID0gYWJzb2x1dGVUaW1lb3V0O1xuICAgICAgICB0aGlzLndhaXRGb3IgPSB3YWl0Rm9yO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy5lcnJvckluc3RhbmNlID0gZXJyb3JJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpbWVvdXRTdWJzY3JpYmVyLnByb3RvdHlwZSwgXCJwcmV2aW91c0luZGV4XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNJbmRleDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpbWVvdXRTdWJzY3JpYmVyLnByb3RvdHlwZSwgXCJoYXNDb21wbGV0ZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNDb21wbGV0ZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFRpbWVvdXRTdWJzY3JpYmVyLmRpc3BhdGNoVGltZW91dCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgc291cmNlID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHN0YXRlLmluZGV4O1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNDb21wbGV0ZWQgJiYgc291cmNlLnByZXZpb3VzSW5kZXggPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgc291cmNlLm5vdGlmeVRpbWVvdXQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGltZW91dFN1YnNjcmliZXIucHJvdG90eXBlLnNjaGVkdWxlVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKFRpbWVvdXRTdWJzY3JpYmVyLmRpc3BhdGNoVGltZW91dCwgdGhpcy53YWl0Rm9yLCB7IHN1YnNjcmliZXI6IHRoaXMsIGluZGV4OiBjdXJyZW50SW5kZXggfSk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgdGhpcy5fcHJldmlvdXNJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICB9O1xuICAgIFRpbWVvdXRTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGVUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaW1lb3V0U3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIHRoaXMuX2hhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgfTtcbiAgICBUaW1lb3V0U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2hhc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgfTtcbiAgICBUaW1lb3V0U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5lcnJvcih0aGlzLmVycm9ySW5zdGFuY2UpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVvdXRTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZW91dC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci90aW1lb3V0LmpzXG4vLyBtb2R1bGUgaWQgPSA2MzFcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1581. /***/ },
  1582. /* 632 */
  1583. /***/ function(module, exports) {
  1584. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n/**\n * An error thrown when duetime elapses.\n *\n * @see {@link timeout}\n *\n * @class TimeoutError\n */\nvar TimeoutError = (function (_super) {\n __extends(TimeoutError, _super);\n function TimeoutError() {\n var err = _super.call(this, 'Timeout has occurred');\n this.name = err.name = 'TimeoutError';\n this.stack = err.stack;\n this.message = err.message;\n }\n return TimeoutError;\n}(Error));\nexports.TimeoutError = TimeoutError;\n//# sourceMappingURL=TimeoutError.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvVGltZW91dEVycm9yLmpzPzU0MGEiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gZHVldGltZSBlbGFwc2VzLlxuICpcbiAqIEBzZWUge0BsaW5rIHRpbWVvdXR9XG4gKlxuICogQGNsYXNzIFRpbWVvdXRFcnJvclxuICovXG52YXIgVGltZW91dEVycm9yID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGltZW91dEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVvdXRFcnJvcigpIHtcbiAgICAgICAgdmFyIGVyciA9IF9zdXBlci5jYWxsKHRoaXMsICdUaW1lb3V0IGhhcyBvY2N1cnJlZCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSBlcnIubmFtZSA9ICdUaW1lb3V0RXJyb3InO1xuICAgICAgICB0aGlzLnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydHMuVGltZW91dEVycm9yID0gVGltZW91dEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGltZW91dEVycm9yLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3V0aWwvVGltZW91dEVycm9yLmpzXG4vLyBtb2R1bGUgaWQgPSA2MzJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1585. /***/ },
  1586. /* 633 */
  1587. /***/ function(module, exports, __webpack_require__) {
  1588. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar timeoutWith_1 = __webpack_require__(634);\nObservable_1.Observable.prototype.timeoutWith = timeoutWith_1.timeoutWith;\n//# sourceMappingURL=timeoutWith.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aW1lb3V0V2l0aC5qcz9hNmJkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB0aW1lb3V0V2l0aF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3IvdGltZW91dFdpdGgnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aW1lb3V0V2l0aCA9IHRpbWVvdXRXaXRoXzEudGltZW91dFdpdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lb3V0V2l0aC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvdGltZW91dFdpdGguanNcbi8vIG1vZHVsZSBpZCA9IDYzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1589. /***/ },
  1590. /* 634 */
  1591. /***/ function(module, exports, __webpack_require__) {
  1592. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar async_1 = __webpack_require__(414);\nvar isDate_1 = __webpack_require__(446);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * @param due\n * @param withObservable\n * @param scheduler\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method timeoutWith\n * @owner Observable\n */\nfunction timeoutWith(due, withObservable, scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n var absoluteTimeout = isDate_1.isDate(due);\n var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);\n return this.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));\n}\nexports.timeoutWith = timeoutWith;\nvar TimeoutWithOperator = (function () {\n function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {\n this.waitFor = waitFor;\n this.absoluteTimeout = absoluteTimeout;\n this.withObservable = withObservable;\n this.scheduler = scheduler;\n }\n TimeoutWithOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));\n };\n return TimeoutWithOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar TimeoutWithSubscriber = (function (_super) {\n __extends(TimeoutWithSubscriber, _super);\n function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {\n _super.call(this);\n this.destination = destination;\n this.absoluteTimeout = absoluteTimeout;\n this.waitFor = waitFor;\n this.withObservable = withObservable;\n this.scheduler = scheduler;\n this.timeoutSubscription = undefined;\n this.index = 0;\n this._previousIndex = 0;\n this._hasCompleted = false;\n destination.add(this);\n this.scheduleTimeout();\n }\n Object.defineProperty(TimeoutWithSubscriber.prototype, \"previousIndex\", {\n get: function () {\n return this._previousIndex;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(TimeoutWithSubscriber.prototype, \"hasCompleted\", {\n get: function () {\n return this._hasCompleted;\n },\n enumerable: true,\n configurable: true\n });\n TimeoutWithSubscriber.dispatchTimeout = function (state) {\n var source = state.subscriber;\n var currentIndex = state.index;\n if (!source.hasCompleted && source.previousIndex === currentIndex) {\n source.handleTimeout();\n }\n };\n TimeoutWithSubscriber.prototype.scheduleTimeout = function () {\n var currentIndex = this.index;\n var timeoutState = { subscriber: this, index: currentIndex };\n this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, timeoutState);\n this.index++;\n this._previousIndex = currentIndex;\n };\n TimeoutWithSubscriber.prototype._next = function (value) {\n this.destination.next(value);\n if (!this.absoluteTimeout) {\n this.scheduleTimeout();\n }\n };\n TimeoutWithSubscriber.prototype._error = function (err) {\n this.destination.error(err);\n this._hasCompleted = true;\n };\n TimeoutWithSubscriber.prototype._complete = function () {\n this.destination.complete();\n this._hasCompleted = true;\n };\n TimeoutWithSubscriber.prototype.handleTimeout = function () {\n if (!this.closed) {\n var withObservable = this.withObservable;\n this.unsubscribe();\n this.destination.add(this.timeoutSubscription = subscribeToResult_1.subscribeToResult(this, withObservable));\n }\n };\n return TimeoutWithSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=timeoutWith.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3RpbWVvdXRXaXRoLmpzPzcwZWUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBhc3luY18xID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL2FzeW5jJyk7XG52YXIgaXNEYXRlXzEgPSByZXF1aXJlKCcuLi91dGlsL2lzRGF0ZScpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xuLyoqXG4gKiBAcGFyYW0gZHVlXG4gKiBAcGFyYW0gd2l0aE9ic2VydmFibGVcbiAqIEBwYXJhbSBzY2hlZHVsZXJcbiAqIEByZXR1cm4ge09ic2VydmFibGU8Uj58V2ViU29ja2V0U3ViamVjdDxUPnxPYnNlcnZhYmxlPFQ+fVxuICogQG1ldGhvZCB0aW1lb3V0V2l0aFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gdGltZW91dFdpdGgoZHVlLCB3aXRoT2JzZXJ2YWJsZSwgc2NoZWR1bGVyKSB7XG4gICAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7IHNjaGVkdWxlciA9IGFzeW5jXzEuYXN5bmM7IH1cbiAgICB2YXIgYWJzb2x1dGVUaW1lb3V0ID0gaXNEYXRlXzEuaXNEYXRlKGR1ZSk7XG4gICAgdmFyIHdhaXRGb3IgPSBhYnNvbHV0ZVRpbWVvdXQgPyAoK2R1ZSAtIHNjaGVkdWxlci5ub3coKSkgOiBNYXRoLmFicyhkdWUpO1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRpbWVvdXRXaXRoT3BlcmF0b3Iod2FpdEZvciwgYWJzb2x1dGVUaW1lb3V0LCB3aXRoT2JzZXJ2YWJsZSwgc2NoZWR1bGVyKSk7XG59XG5leHBvcnRzLnRpbWVvdXRXaXRoID0gdGltZW91dFdpdGg7XG52YXIgVGltZW91dFdpdGhPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGltZW91dFdpdGhPcGVyYXRvcih3YWl0Rm9yLCBhYnNvbHV0ZVRpbWVvdXQsIHdpdGhPYnNlcnZhYmxlLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yID0gd2FpdEZvcjtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZVRpbWVvdXQgPSBhYnNvbHV0ZVRpbWVvdXQ7XG4gICAgICAgIHRoaXMud2l0aE9ic2VydmFibGUgPSB3aXRoT2JzZXJ2YWJsZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIFRpbWVvdXRXaXRoT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUaW1lb3V0V2l0aFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5hYnNvbHV0ZVRpbWVvdXQsIHRoaXMud2FpdEZvciwgdGhpcy53aXRoT2JzZXJ2YWJsZSwgdGhpcy5zY2hlZHVsZXIpKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lb3V0V2l0aE9wZXJhdG9yO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgVGltZW91dFdpdGhTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGltZW91dFdpdGhTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVvdXRXaXRoU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgYWJzb2x1dGVUaW1lb3V0LCB3YWl0Rm9yLCB3aXRoT2JzZXJ2YWJsZSwgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICAgIHRoaXMuYWJzb2x1dGVUaW1lb3V0ID0gYWJzb2x1dGVUaW1lb3V0O1xuICAgICAgICB0aGlzLndhaXRGb3IgPSB3YWl0Rm9yO1xuICAgICAgICB0aGlzLndpdGhPYnNlcnZhYmxlID0gd2l0aE9ic2VydmFibGU7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLnRpbWVvdXRTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9wcmV2aW91c0luZGV4ID0gMDtcbiAgICAgICAgdGhpcy5faGFzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIGRlc3RpbmF0aW9uLmFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVRpbWVvdXQoKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpbWVvdXRXaXRoU3Vic2NyaWJlci5wcm90b3R5cGUsIFwicHJldmlvdXNJbmRleFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzSW5kZXg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaW1lb3V0V2l0aFN1YnNjcmliZXIucHJvdG90eXBlLCBcImhhc0NvbXBsZXRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0NvbXBsZXRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVGltZW91dFdpdGhTdWJzY3JpYmVyLmRpc3BhdGNoVGltZW91dCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgc291cmNlID0gc3RhdGUuc3Vic2NyaWJlcjtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHN0YXRlLmluZGV4O1xuICAgICAgICBpZiAoIXNvdXJjZS5oYXNDb21wbGV0ZWQgJiYgc291cmNlLnByZXZpb3VzSW5kZXggPT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgc291cmNlLmhhbmRsZVRpbWVvdXQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGltZW91dFdpdGhTdWJzY3JpYmVyLnByb3RvdHlwZS5zY2hlZHVsZVRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB2YXIgdGltZW91dFN0YXRlID0geyBzdWJzY3JpYmVyOiB0aGlzLCBpbmRleDogY3VycmVudEluZGV4IH07XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKFRpbWVvdXRXaXRoU3Vic2NyaWJlci5kaXNwYXRjaFRpbWVvdXQsIHRoaXMud2FpdEZvciwgdGltZW91dFN0YXRlKTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICB0aGlzLl9wcmV2aW91c0luZGV4ID0gY3VycmVudEluZGV4O1xuICAgIH07XG4gICAgVGltZW91dFdpdGhTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGVUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaW1lb3V0V2l0aFN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLl9oYXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgIH07XG4gICAgVGltZW91dFdpdGhTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5faGFzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIFRpbWVvdXRXaXRoU3Vic2NyaWJlci5wcm90b3R5cGUuaGFuZGxlVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdmFyIHdpdGhPYnNlcnZhYmxlID0gdGhpcy53aXRoT2JzZXJ2YWJsZTtcbiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uYWRkKHRoaXMudGltZW91dFN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgd2l0aE9ic2VydmFibGUpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFRpbWVvdXRXaXRoU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyXzEuT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lb3V0V2l0aC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci90aW1lb3V0V2l0aC5qc1xuLy8gbW9kdWxlIGlkID0gNjM0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1593. /***/ },
  1594. /* 635 */
  1595. /***/ function(module, exports, __webpack_require__) {
  1596. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar timestamp_1 = __webpack_require__(636);\nObservable_1.Observable.prototype.timestamp = timestamp_1.timestamp;\n//# sourceMappingURL=timestamp.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90aW1lc3RhbXAuanM/MmNhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdGltZXN0YW1wXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90aW1lc3RhbXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50aW1lc3RhbXAgPSB0aW1lc3RhbXBfMS50aW1lc3RhbXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lc3RhbXAuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3RpbWVzdGFtcC5qc1xuLy8gbW9kdWxlIGlkID0gNjM1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1597. /***/ },
  1598. /* 636 */
  1599. /***/ function(module, exports, __webpack_require__) {
  1600. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar async_1 = __webpack_require__(414);\n/**\n * @param scheduler\n * @return {Observable<Timestamp<any>>|WebSocketSubject<T>|Observable<T>}\n * @method timestamp\n * @owner Observable\n */\nfunction timestamp(scheduler) {\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new TimestampOperator(scheduler));\n}\nexports.timestamp = timestamp;\nvar Timestamp = (function () {\n function Timestamp(value, timestamp) {\n this.value = value;\n this.timestamp = timestamp;\n }\n return Timestamp;\n}());\nexports.Timestamp = Timestamp;\n;\nvar TimestampOperator = (function () {\n function TimestampOperator(scheduler) {\n this.scheduler = scheduler;\n }\n TimestampOperator.prototype.call = function (observer, source) {\n return source.subscribe(new TimestampSubscriber(observer, this.scheduler));\n };\n return TimestampOperator;\n}());\nvar TimestampSubscriber = (function (_super) {\n __extends(TimestampSubscriber, _super);\n function TimestampSubscriber(destination, scheduler) {\n _super.call(this, destination);\n this.scheduler = scheduler;\n }\n TimestampSubscriber.prototype._next = function (value) {\n var now = this.scheduler.now();\n this.destination.next(new Timestamp(value, now));\n };\n return TimestampSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=timestamp.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3RpbWVzdGFtcC5qcz9mYzZmIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xudmFyIGFzeW5jXzEgPSByZXF1aXJlKCcuLi9zY2hlZHVsZXIvYXN5bmMnKTtcbi8qKlxuICogQHBhcmFtIHNjaGVkdWxlclxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxUaW1lc3RhbXA8YW55Pj58V2ViU29ja2V0U3ViamVjdDxUPnxPYnNlcnZhYmxlPFQ+fVxuICogQG1ldGhvZCB0aW1lc3RhbXBcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHRpbWVzdGFtcChzY2hlZHVsZXIpIHtcbiAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRpbWVzdGFtcE9wZXJhdG9yKHNjaGVkdWxlcikpO1xufVxuZXhwb3J0cy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG52YXIgVGltZXN0YW1wID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lc3RhbXAodmFsdWUsIHRpbWVzdGFtcCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIH1cbiAgICByZXR1cm4gVGltZXN0YW1wO1xufSgpKTtcbmV4cG9ydHMuVGltZXN0YW1wID0gVGltZXN0YW1wO1xuO1xudmFyIFRpbWVzdGFtcE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaW1lc3RhbXBPcGVyYXRvcihzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuICAgIFRpbWVzdGFtcE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRpbWVzdGFtcFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMuc2NoZWR1bGVyKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZXN0YW1wT3BlcmF0b3I7XG59KCkpO1xudmFyIFRpbWVzdGFtcFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUaW1lc3RhbXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVzdGFtcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHNjaGVkdWxlcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICBUaW1lc3RhbXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbm93ID0gdGhpcy5zY2hlZHVsZXIubm93KCk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChuZXcgVGltZXN0YW1wKHZhbHVlLCBub3cpKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lc3RhbXBTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyXzEuU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXN0YW1wLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3RpbWVzdGFtcC5qc1xuLy8gbW9kdWxlIGlkID0gNjM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1601. /***/ },
  1602. /* 637 */
  1603. /***/ function(module, exports, __webpack_require__) {
  1604. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar toArray_1 = __webpack_require__(638);\nObservable_1.Observable.prototype.toArray = toArray_1.toArray;\n//# sourceMappingURL=toArray.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90b0FycmF5LmpzP2Q2MWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHRvQXJyYXlfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3RvQXJyYXknKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50b0FycmF5ID0gdG9BcnJheV8xLnRvQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b0FycmF5LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci90b0FycmF5LmpzXG4vLyBtb2R1bGUgaWQgPSA2Mzdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1605. /***/ },
  1606. /* 638 */
  1607. /***/ function(module, exports, __webpack_require__) {
  1608. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * @return {Observable<any[]>|WebSocketSubject<T>|Observable<T>}\n * @method toArray\n * @owner Observable\n */\nfunction toArray() {\n return this.lift(new ToArrayOperator());\n}\nexports.toArray = toArray;\nvar ToArrayOperator = (function () {\n function ToArrayOperator() {\n }\n ToArrayOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new ToArraySubscriber(subscriber));\n };\n return ToArrayOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ToArraySubscriber = (function (_super) {\n __extends(ToArraySubscriber, _super);\n function ToArraySubscriber(destination) {\n _super.call(this, destination);\n this.array = [];\n }\n ToArraySubscriber.prototype._next = function (x) {\n this.array.push(x);\n };\n ToArraySubscriber.prototype._complete = function () {\n this.destination.next(this.array);\n this.destination.complete();\n };\n return ToArraySubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=toArray.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3RvQXJyYXkuanM/YWMwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmliZXInKTtcbi8qKlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxhbnlbXT58V2ViU29ja2V0U3ViamVjdDxUPnxPYnNlcnZhYmxlPFQ+fVxuICogQG1ldGhvZCB0b0FycmF5XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFRvQXJyYXlPcGVyYXRvcigpKTtcbn1cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG52YXIgVG9BcnJheU9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb0FycmF5T3BlcmF0b3IoKSB7XG4gICAgfVxuICAgIFRvQXJyYXlPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRvQXJyYXlTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTtcbiAgICB9O1xuICAgIHJldHVybiBUb0FycmF5T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBUb0FycmF5U3Vic2NyaWJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRvQXJyYXlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRvQXJyYXlTdWJzY3JpYmVyKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgIH1cbiAgICBUb0FycmF5U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICB0aGlzLmFycmF5LnB1c2goeCk7XG4gICAgfTtcbiAgICBUb0FycmF5U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodGhpcy5hcnJheSk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIHJldHVybiBUb0FycmF5U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvQXJyYXkuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvdG9BcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gNjM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1609. /***/ },
  1610. /* 639 */
  1611. /***/ function(module, exports, __webpack_require__) {
  1612. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar toPromise_1 = __webpack_require__(26);\nObservable_1.Observable.prototype.toPromise = toPromise_1.toPromise;\n//# sourceMappingURL=toPromise.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci90b1Byb21pc2UuanM/MDEyMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgdG9Qcm9taXNlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci90b1Byb21pc2UnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS50b1Byb21pc2UgPSB0b1Byb21pc2VfMS50b1Byb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b1Byb21pc2UuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3RvUHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gNjM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1613. /***/ },
  1614. /* 640 */
  1615. /***/ function(module, exports, __webpack_require__) {
  1616. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar window_1 = __webpack_require__(641);\nObservable_1.Observable.prototype.window = window_1.window;\n//# sourceMappingURL=window.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3cuanM/ODE1MyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgd2luZG93XzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci93aW5kb3cnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aW5kb3cgPSB3aW5kb3dfMS53aW5kb3c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aW5kb3cuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3dpbmRvdy5qc1xuLy8gbW9kdWxlIGlkID0gNjQwXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1617. /***/ },
  1618. /* 641 */
  1619. /***/ function(module, exports, __webpack_require__) {
  1620. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Branch out the source Observable values as a nested Observable whenever\n * `windowBoundaries` emits.\n *\n * <span class=\"informal\">It's like {@link buffer}, but emits a nested Observable\n * instead of an array.</span>\n *\n * <img src=\"./img/window.png\" width=\"100%\">\n *\n * Returns an Observable that emits windows of items it collects from the source\n * Observable. The output Observable emits connected, non-overlapping\n * windows. It emits the current window and opens a new one whenever the\n * Observable `windowBoundaries` emits an item. Because each window is an\n * Observable, the output is a higher-order Observable.\n *\n * @example <caption>In every window of 1 second each, emit at most 2 click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var interval = Rx.Observable.interval(1000);\n * var result = clicks.window(interval)\n * .map(win => win.take(2)) // each window has at most 2 emissions\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @see {@link windowCount}\n * @see {@link windowTime}\n * @see {@link windowToggle}\n * @see {@link windowWhen}\n * @see {@link buffer}\n *\n * @param {Observable<any>} windowBoundaries An Observable that completes the\n * previous window and starts a new window.\n * @return {Observable<Observable<T>>} An Observable of windows, which are\n * Observables emitting values of the source Observable.\n * @method window\n * @owner Observable\n */\nfunction window(windowBoundaries) {\n return this.lift(new WindowOperator(windowBoundaries));\n}\nexports.window = window;\nvar WindowOperator = (function () {\n function WindowOperator(windowBoundaries) {\n this.windowBoundaries = windowBoundaries;\n }\n WindowOperator.prototype.call = function (subscriber, source) {\n var windowSubscriber = new WindowSubscriber(subscriber);\n var sourceSubscription = source.subscribe(windowSubscriber);\n if (!sourceSubscription.closed) {\n windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));\n }\n return sourceSubscription;\n };\n return WindowOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WindowSubscriber = (function (_super) {\n __extends(WindowSubscriber, _super);\n function WindowSubscriber(destination) {\n _super.call(this, destination);\n this.window = new Subject_1.Subject();\n destination.next(this.window);\n }\n WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.openWindow();\n };\n WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n this._error(error);\n };\n WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n this._complete();\n };\n WindowSubscriber.prototype._next = function (value) {\n this.window.next(value);\n };\n WindowSubscriber.prototype._error = function (err) {\n this.window.error(err);\n this.destination.error(err);\n };\n WindowSubscriber.prototype._complete = function () {\n this.window.complete();\n this.destination.complete();\n };\n WindowSubscriber.prototype._unsubscribe = function () {\n this.window = null;\n };\n WindowSubscriber.prototype.openWindow = function () {\n var prevWindow = this.window;\n if (prevWindow) {\n prevWindow.complete();\n }\n var destination = this.destination;\n var newWindow = this.window = new Subject_1.Subject();\n destination.next(newWindow);\n };\n return WindowSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=window.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpbmRvdy5qcz9lYTAzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vU3ViamVjdCcpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQnJhbmNoIG91dCB0aGUgc291cmNlIE9ic2VydmFibGUgdmFsdWVzIGFzIGEgbmVzdGVkIE9ic2VydmFibGUgd2hlbmV2ZXJcbiAqIGB3aW5kb3dCb3VuZGFyaWVzYCBlbWl0cy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBidWZmZXJ9LCBidXQgZW1pdHMgYSBuZXN0ZWQgT2JzZXJ2YWJsZVxuICogaW5zdGVhZCBvZiBhbiBhcnJheS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy93aW5kb3cucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2luZG93cyBvZiBpdGVtcyBpdCBjb2xsZWN0cyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIFRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBlbWl0cyBjb25uZWN0ZWQsIG5vbi1vdmVybGFwcGluZ1xuICogd2luZG93cy4gSXQgZW1pdHMgdGhlIGN1cnJlbnQgd2luZG93IGFuZCBvcGVucyBhIG5ldyBvbmUgd2hlbmV2ZXIgdGhlXG4gKiBPYnNlcnZhYmxlIGB3aW5kb3dCb3VuZGFyaWVzYCBlbWl0cyBhbiBpdGVtLiBCZWNhdXNlIGVhY2ggd2luZG93IGlzIGFuXG4gKiBPYnNlcnZhYmxlLCB0aGUgb3V0cHV0IGlzIGEgaGlnaGVyLW9yZGVyIE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+SW4gZXZlcnkgd2luZG93IG9mIDEgc2Vjb25kIGVhY2gsIGVtaXQgYXQgbW9zdCAyIGNsaWNrIGV2ZW50czwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgaW50ZXJ2YWwgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy53aW5kb3coaW50ZXJ2YWwpXG4gKiAgIC5tYXAod2luID0+IHdpbi50YWtlKDIpKSAvLyBlYWNoIHdpbmRvdyBoYXMgYXQgbW9zdCAyIGVtaXNzaW9uc1xuICogICAubWVyZ2VBbGwoKTsgLy8gZmxhdHRlbiB0aGUgT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlc1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayB3aW5kb3dDb3VudH1cbiAqIEBzZWUge0BsaW5rIHdpbmRvd1RpbWV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUb2dnbGV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dXaGVufVxuICogQHNlZSB7QGxpbmsgYnVmZmVyfVxuICpcbiAqIEBwYXJhbSB7T2JzZXJ2YWJsZTxhbnk+fSB3aW5kb3dCb3VuZGFyaWVzIEFuIE9ic2VydmFibGUgdGhhdCBjb21wbGV0ZXMgdGhlXG4gKiBwcmV2aW91cyB3aW5kb3cgYW5kIHN0YXJ0cyBhIG5ldyB3aW5kb3cuXG4gKiBAcmV0dXJuIHtPYnNlcnZhYmxlPE9ic2VydmFibGU8VD4+fSBBbiBPYnNlcnZhYmxlIG9mIHdpbmRvd3MsIHdoaWNoIGFyZVxuICogT2JzZXJ2YWJsZXMgZW1pdHRpbmcgdmFsdWVzIG9mIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2Qgd2luZG93XG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiB3aW5kb3cod2luZG93Qm91bmRhcmllcykge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFdpbmRvd09wZXJhdG9yKHdpbmRvd0JvdW5kYXJpZXMpKTtcbn1cbmV4cG9ydHMud2luZG93ID0gd2luZG93O1xudmFyIFdpbmRvd09wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXaW5kb3dPcGVyYXRvcih3aW5kb3dCb3VuZGFyaWVzKSB7XG4gICAgICAgIHRoaXMud2luZG93Qm91bmRhcmllcyA9IHdpbmRvd0JvdW5kYXJpZXM7XG4gICAgfVxuICAgIFdpbmRvd09wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICB2YXIgd2luZG93U3Vic2NyaWJlciA9IG5ldyBXaW5kb3dTdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuICAgICAgICB2YXIgc291cmNlU3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZSh3aW5kb3dTdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKCFzb3VyY2VTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICB3aW5kb3dTdWJzY3JpYmVyLmFkZChzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHdpbmRvd1N1YnNjcmliZXIsIHRoaXMud2luZG93Qm91bmRhcmllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2VTdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gV2luZG93T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBXaW5kb3dTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoV2luZG93U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBXaW5kb3dTdWJzY3JpYmVyKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy53aW5kb3cgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dCh0aGlzLndpbmRvdyk7XG4gICAgfVxuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5vcGVuV2luZG93KCk7XG4gICAgfTtcbiAgICBXaW5kb3dTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5fZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgV2luZG93U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5fY29tcGxldGUoKTtcbiAgICB9O1xuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMud2luZG93Lm5leHQodmFsdWUpO1xuICAgIH07XG4gICAgV2luZG93U3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLndpbmRvdy5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfTtcbiAgICBXaW5kb3dTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMud2luZG93LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAgIH07XG4gICAgV2luZG93U3Vic2NyaWJlci5wcm90b3R5cGUub3BlbldpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByZXZXaW5kb3cgPSB0aGlzLndpbmRvdztcbiAgICAgICAgaWYgKHByZXZXaW5kb3cpIHtcbiAgICAgICAgICAgIHByZXZXaW5kb3cuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICB2YXIgbmV3V2luZG93ID0gdGhpcy53aW5kb3cgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dChuZXdXaW5kb3cpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1N1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2luZG93LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3dpbmRvdy5qc1xuLy8gbW9kdWxlIGlkID0gNjQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1621. /***/ },
  1622. /* 642 */
  1623. /***/ function(module, exports, __webpack_require__) {
  1624. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar windowCount_1 = __webpack_require__(643);\nObservable_1.Observable.prototype.windowCount = windowCount_1.windowCount;\n//# sourceMappingURL=windowCount.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dDb3VudC5qcz84MGZkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB3aW5kb3dDb3VudF8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivd2luZG93Q291bnQnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aW5kb3dDb3VudCA9IHdpbmRvd0NvdW50XzEud2luZG93Q291bnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aW5kb3dDb3VudC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivd2luZG93Q291bnQuanNcbi8vIG1vZHVsZSBpZCA9IDY0MlxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1625. /***/ },
  1626. /* 643 */
  1627. /***/ function(module, exports, __webpack_require__) {
  1628. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subscriber_1 = __webpack_require__(9);\nvar Subject_1 = __webpack_require__(5);\n/**\n * Branch out the source Observable values as a nested Observable with each\n * nested Observable emitting at most `windowSize` values.\n *\n * <span class=\"informal\">It's like {@link bufferCount}, but emits a nested\n * Observable instead of an array.</span>\n *\n * <img src=\"./img/windowCount.png\" width=\"100%\">\n *\n * Returns an Observable that emits windows of items it collects from the source\n * Observable. The output Observable emits windows every `startWindowEvery`\n * items, each containing no more than `windowSize` items. When the source\n * Observable completes or encounters an error, the output Observable emits\n * the current window and propagates the notification from the source\n * Observable. If `startWindowEvery` is not provided, then new windows are\n * started immediately at the start of the source and when each window completes\n * with size `windowSize`.\n *\n * @example <caption>Ignore every 3rd click event, starting from the first one</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.windowCount(3)\n * .map(win => win.skip(1)) // skip first of every 3 clicks\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Ignore every 3rd click event, starting from the third one</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.windowCount(2, 3)\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @see {@link window}\n * @see {@link windowTime}\n * @see {@link windowToggle}\n * @see {@link windowWhen}\n * @see {@link bufferCount}\n *\n * @param {number} windowSize The maximum number of values emitted by each\n * window.\n * @param {number} [startWindowEvery] Interval at which to start a new window.\n * For example if `startWindowEvery` is `2`, then a new window will be started\n * on every other value from the source. A new window is started at the\n * beginning of the source by default.\n * @return {Observable<Observable<T>>} An Observable of windows, which in turn\n * are Observable of values.\n * @method windowCount\n * @owner Observable\n */\nfunction windowCount(windowSize, startWindowEvery) {\n if (startWindowEvery === void 0) { startWindowEvery = 0; }\n return this.lift(new WindowCountOperator(windowSize, startWindowEvery));\n}\nexports.windowCount = windowCount;\nvar WindowCountOperator = (function () {\n function WindowCountOperator(windowSize, startWindowEvery) {\n this.windowSize = windowSize;\n this.startWindowEvery = startWindowEvery;\n }\n WindowCountOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));\n };\n return WindowCountOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WindowCountSubscriber = (function (_super) {\n __extends(WindowCountSubscriber, _super);\n function WindowCountSubscriber(destination, windowSize, startWindowEvery) {\n _super.call(this, destination);\n this.destination = destination;\n this.windowSize = windowSize;\n this.startWindowEvery = startWindowEvery;\n this.windows = [new Subject_1.Subject()];\n this.count = 0;\n destination.next(this.windows[0]);\n }\n WindowCountSubscriber.prototype._next = function (value) {\n var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;\n var destination = this.destination;\n var windowSize = this.windowSize;\n var windows = this.windows;\n var len = windows.length;\n for (var i = 0; i < len && !this.closed; i++) {\n windows[i].next(value);\n }\n var c = this.count - windowSize + 1;\n if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {\n windows.shift().complete();\n }\n if (++this.count % startWindowEvery === 0 && !this.closed) {\n var window_1 = new Subject_1.Subject();\n windows.push(window_1);\n destination.next(window_1);\n }\n };\n WindowCountSubscriber.prototype._error = function (err) {\n var windows = this.windows;\n if (windows) {\n while (windows.length > 0 && !this.closed) {\n windows.shift().error(err);\n }\n }\n this.destination.error(err);\n };\n WindowCountSubscriber.prototype._complete = function () {\n var windows = this.windows;\n if (windows) {\n while (windows.length > 0 && !this.closed) {\n windows.shift().complete();\n }\n }\n this.destination.complete();\n };\n WindowCountSubscriber.prototype._unsubscribe = function () {\n this.count = 0;\n this.windows = null;\n };\n return WindowCountSubscriber;\n}(Subscriber_1.Subscriber));\n//# sourceMappingURL=windowCount.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd0NvdW50LmpzPzg4NGUiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9TdWJzY3JpYmVyJyk7XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vU3ViamVjdCcpO1xuLyoqXG4gKiBCcmFuY2ggb3V0IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB2YWx1ZXMgYXMgYSBuZXN0ZWQgT2JzZXJ2YWJsZSB3aXRoIGVhY2hcbiAqIG5lc3RlZCBPYnNlcnZhYmxlIGVtaXR0aW5nIGF0IG1vc3QgYHdpbmRvd1NpemVgIHZhbHVlcy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBidWZmZXJDb3VudH0sIGJ1dCBlbWl0cyBhIG5lc3RlZFxuICogT2JzZXJ2YWJsZSBpbnN0ZWFkIG9mIGFuIGFycmF5Ljwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3dpbmRvd0NvdW50LnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdpbmRvd3Mgb2YgaXRlbXMgaXQgY29sbGVjdHMgZnJvbSB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlLiBUaGUgb3V0cHV0IE9ic2VydmFibGUgZW1pdHMgd2luZG93cyBldmVyeSBgc3RhcnRXaW5kb3dFdmVyeWBcbiAqIGl0ZW1zLCBlYWNoIGNvbnRhaW5pbmcgbm8gbW9yZSB0aGFuIGB3aW5kb3dTaXplYCBpdGVtcy4gV2hlbiB0aGUgc291cmNlXG4gKiBPYnNlcnZhYmxlIGNvbXBsZXRlcyBvciBlbmNvdW50ZXJzIGFuIGVycm9yLCB0aGUgb3V0cHV0IE9ic2VydmFibGUgZW1pdHNcbiAqIHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgcHJvcGFnYXRlcyB0aGUgbm90aWZpY2F0aW9uIGZyb20gdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gSWYgYHN0YXJ0V2luZG93RXZlcnlgIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBuZXcgd2luZG93cyBhcmVcbiAqIHN0YXJ0ZWQgaW1tZWRpYXRlbHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzb3VyY2UgYW5kIHdoZW4gZWFjaCB3aW5kb3cgY29tcGxldGVzXG4gKiB3aXRoIHNpemUgYHdpbmRvd1NpemVgLlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPklnbm9yZSBldmVyeSAzcmQgY2xpY2sgZXZlbnQsIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IG9uZTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLndpbmRvd0NvdW50KDMpXG4gKiAgIC5tYXAod2luID0+IHdpbi5za2lwKDEpKSAvLyBza2lwIGZpcnN0IG9mIGV2ZXJ5IDMgY2xpY2tzXG4gKiAgIC5tZXJnZUFsbCgpOyAvLyBmbGF0dGVuIHRoZSBPYnNlcnZhYmxlLW9mLU9ic2VydmFibGVzXG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPklnbm9yZSBldmVyeSAzcmQgY2xpY2sgZXZlbnQsIHN0YXJ0aW5nIGZyb20gdGhlIHRoaXJkIG9uZTwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLndpbmRvd0NvdW50KDIsIDMpXG4gKiAgIC5tZXJnZUFsbCgpOyAvLyBmbGF0dGVuIHRoZSBPYnNlcnZhYmxlLW9mLU9ic2VydmFibGVzXG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBzZWUge0BsaW5rIHdpbmRvd31cbiAqIEBzZWUge0BsaW5rIHdpbmRvd1RpbWV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUb2dnbGV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dXaGVufVxuICogQHNlZSB7QGxpbmsgYnVmZmVyQ291bnR9XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpbmRvd1NpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIHZhbHVlcyBlbWl0dGVkIGJ5IGVhY2hcbiAqIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRXaW5kb3dFdmVyeV0gSW50ZXJ2YWwgYXQgd2hpY2ggdG8gc3RhcnQgYSBuZXcgd2luZG93LlxuICogRm9yIGV4YW1wbGUgaWYgYHN0YXJ0V2luZG93RXZlcnlgIGlzIGAyYCwgdGhlbiBhIG5ldyB3aW5kb3cgd2lsbCBiZSBzdGFydGVkXG4gKiBvbiBldmVyeSBvdGhlciB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UuIEEgbmV3IHdpbmRvdyBpcyBzdGFydGVkIGF0IHRoZVxuICogYmVnaW5uaW5nIG9mIHRoZSBzb3VyY2UgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8T2JzZXJ2YWJsZTxUPj59IEFuIE9ic2VydmFibGUgb2Ygd2luZG93cywgd2hpY2ggaW4gdHVyblxuICogYXJlIE9ic2VydmFibGUgb2YgdmFsdWVzLlxuICogQG1ldGhvZCB3aW5kb3dDb3VudFxuICogQG93bmVyIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gd2luZG93Q291bnQod2luZG93U2l6ZSwgc3RhcnRXaW5kb3dFdmVyeSkge1xuICAgIGlmIChzdGFydFdpbmRvd0V2ZXJ5ID09PSB2b2lkIDApIHsgc3RhcnRXaW5kb3dFdmVyeSA9IDA7IH1cbiAgICByZXR1cm4gdGhpcy5saWZ0KG5ldyBXaW5kb3dDb3VudE9wZXJhdG9yKHdpbmRvd1NpemUsIHN0YXJ0V2luZG93RXZlcnkpKTtcbn1cbmV4cG9ydHMud2luZG93Q291bnQgPSB3aW5kb3dDb3VudDtcbnZhciBXaW5kb3dDb3VudE9wZXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXaW5kb3dDb3VudE9wZXJhdG9yKHdpbmRvd1NpemUsIHN0YXJ0V2luZG93RXZlcnkpIHtcbiAgICAgICAgdGhpcy53aW5kb3dTaXplID0gd2luZG93U2l6ZTtcbiAgICAgICAgdGhpcy5zdGFydFdpbmRvd0V2ZXJ5ID0gc3RhcnRXaW5kb3dFdmVyeTtcbiAgICB9XG4gICAgV2luZG93Q291bnRPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFdpbmRvd0NvdW50U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLndpbmRvd1NpemUsIHRoaXMuc3RhcnRXaW5kb3dFdmVyeSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd0NvdW50T3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBXaW5kb3dDb3VudFN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXaW5kb3dDb3VudFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93Q291bnRTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCB3aW5kb3dTaXplLCBzdGFydFdpbmRvd0V2ZXJ5KSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgICAgICB0aGlzLndpbmRvd1NpemUgPSB3aW5kb3dTaXplO1xuICAgICAgICB0aGlzLnN0YXJ0V2luZG93RXZlcnkgPSBzdGFydFdpbmRvd0V2ZXJ5O1xuICAgICAgICB0aGlzLndpbmRvd3MgPSBbbmV3IFN1YmplY3RfMS5TdWJqZWN0KCldO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dCh0aGlzLndpbmRvd3NbMF0pO1xuICAgIH1cbiAgICBXaW5kb3dDb3VudFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBzdGFydFdpbmRvd0V2ZXJ5ID0gKHRoaXMuc3RhcnRXaW5kb3dFdmVyeSA+IDApID8gdGhpcy5zdGFydFdpbmRvd0V2ZXJ5IDogdGhpcy53aW5kb3dTaXplO1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICB2YXIgd2luZG93U2l6ZSA9IHRoaXMud2luZG93U2l6ZTtcbiAgICAgICAgdmFyIHdpbmRvd3MgPSB0aGlzLndpbmRvd3M7XG4gICAgICAgIHZhciBsZW4gPSB3aW5kb3dzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW4gJiYgIXRoaXMuY2xvc2VkOyBpKyspIHtcbiAgICAgICAgICAgIHdpbmRvd3NbaV0ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGMgPSB0aGlzLmNvdW50IC0gd2luZG93U2l6ZSArIDE7XG4gICAgICAgIGlmIChjID49IDAgJiYgYyAlIHN0YXJ0V2luZG93RXZlcnkgPT09IDAgJiYgIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB3aW5kb3dzLnNoaWZ0KCkuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt0aGlzLmNvdW50ICUgc3RhcnRXaW5kb3dFdmVyeSA9PT0gMCAmJiAhdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHZhciB3aW5kb3dfMSA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpO1xuICAgICAgICAgICAgd2luZG93cy5wdXNoKHdpbmRvd18xKTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQod2luZG93XzEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXaW5kb3dDb3VudFN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIHdpbmRvd3MgPSB0aGlzLndpbmRvd3M7XG4gICAgICAgIGlmICh3aW5kb3dzKSB7XG4gICAgICAgICAgICB3aGlsZSAod2luZG93cy5sZW5ndGggPiAwICYmICF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHdpbmRvd3Muc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIFdpbmRvd0NvdW50U3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2luZG93cyA9IHRoaXMud2luZG93cztcbiAgICAgICAgaWYgKHdpbmRvd3MpIHtcbiAgICAgICAgICAgIHdoaWxlICh3aW5kb3dzLmxlbmd0aCA+IDAgJiYgIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgd2luZG93cy5zaGlmdCgpLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgV2luZG93Q291bnRTdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICB0aGlzLndpbmRvd3MgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd0NvdW50U3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdpbmRvd0NvdW50LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd0NvdW50LmpzXG4vLyBtb2R1bGUgaWQgPSA2NDNcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1629. /***/ },
  1630. /* 644 */
  1631. /***/ function(module, exports, __webpack_require__) {
  1632. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar windowTime_1 = __webpack_require__(645);\nObservable_1.Observable.prototype.windowTime = windowTime_1.windowTime;\n//# sourceMappingURL=windowTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dUaW1lLmpzPzE0MGIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHdpbmRvd1RpbWVfMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3dpbmRvd1RpbWUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aW5kb3dUaW1lID0gd2luZG93VGltZV8xLndpbmRvd1RpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aW5kb3dUaW1lLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dUaW1lLmpzXG4vLyBtb2R1bGUgaWQgPSA2NDRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1633. /***/ },
  1634. /* 645 */
  1635. /***/ function(module, exports, __webpack_require__) {
  1636. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar async_1 = __webpack_require__(414);\nvar Subscriber_1 = __webpack_require__(9);\n/**\n * Branch out the source Observable values as a nested Observable periodically\n * in time.\n *\n * <span class=\"informal\">It's like {@link bufferTime}, but emits a nested\n * Observable instead of an array.</span>\n *\n * <img src=\"./img/windowTime.png\" width=\"100%\">\n *\n * Returns an Observable that emits windows of items it collects from the source\n * Observable. The output Observable starts a new window periodically, as\n * determined by the `windowCreationInterval` argument. It emits each window\n * after a fixed timespan, specified by the `windowTimeSpan` argument. When the\n * source Observable completes or encounters an error, the output Observable\n * emits the current window and propagates the notification from the source\n * Observable. If `windowCreationInterval` is not provided, the output\n * Observable starts a new window when the previous window of duration\n * `windowTimeSpan` completes.\n *\n * @example <caption>In every window of 1 second each, emit at most 2 click events</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.windowTime(1000)\n * .map(win => win.take(2)) // each window has at most 2 emissions\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @example <caption>Every 5 seconds start a window 1 second long, and emit at most 2 click events per window</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks.windowTime(1000, 5000)\n * .map(win => win.take(2)) // each window has at most 2 emissions\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @see {@link window}\n * @see {@link windowCount}\n * @see {@link windowToggle}\n * @see {@link windowWhen}\n * @see {@link bufferTime}\n *\n * @param {number} windowTimeSpan The amount of time to fill each window.\n * @param {number} [windowCreationInterval] The interval at which to start new\n * windows.\n * @param {Scheduler} [scheduler=async] The scheduler on which to schedule the\n * intervals that determine window boundaries.\n * @return {Observable<Observable<T>>} An observable of windows, which in turn\n * are Observables.\n * @method windowTime\n * @owner Observable\n */\nfunction windowTime(windowTimeSpan, windowCreationInterval, scheduler) {\n if (windowCreationInterval === void 0) { windowCreationInterval = null; }\n if (scheduler === void 0) { scheduler = async_1.async; }\n return this.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, scheduler));\n}\nexports.windowTime = windowTime;\nvar WindowTimeOperator = (function () {\n function WindowTimeOperator(windowTimeSpan, windowCreationInterval, scheduler) {\n this.windowTimeSpan = windowTimeSpan;\n this.windowCreationInterval = windowCreationInterval;\n this.scheduler = scheduler;\n }\n WindowTimeOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.scheduler));\n };\n return WindowTimeOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WindowTimeSubscriber = (function (_super) {\n __extends(WindowTimeSubscriber, _super);\n function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, scheduler) {\n _super.call(this, destination);\n this.destination = destination;\n this.windowTimeSpan = windowTimeSpan;\n this.windowCreationInterval = windowCreationInterval;\n this.scheduler = scheduler;\n this.windows = [];\n if (windowCreationInterval !== null && windowCreationInterval >= 0) {\n var window_1 = this.openWindow();\n var closeState = { subscriber: this, window: window_1, context: null };\n var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: this, scheduler: scheduler };\n this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));\n this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));\n }\n else {\n var window_2 = this.openWindow();\n var timeSpanOnlyState = { subscriber: this, window: window_2, windowTimeSpan: windowTimeSpan };\n this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));\n }\n }\n WindowTimeSubscriber.prototype._next = function (value) {\n var windows = this.windows;\n var len = windows.length;\n for (var i = 0; i < len; i++) {\n var window_3 = windows[i];\n if (!window_3.closed) {\n window_3.next(value);\n }\n }\n };\n WindowTimeSubscriber.prototype._error = function (err) {\n var windows = this.windows;\n while (windows.length > 0) {\n windows.shift().error(err);\n }\n this.destination.error(err);\n };\n WindowTimeSubscriber.prototype._complete = function () {\n var windows = this.windows;\n while (windows.length > 0) {\n var window_4 = windows.shift();\n if (!window_4.closed) {\n window_4.complete();\n }\n }\n this.destination.complete();\n };\n WindowTimeSubscriber.prototype.openWindow = function () {\n var window = new Subject_1.Subject();\n this.windows.push(window);\n var destination = this.destination;\n destination.next(window);\n return window;\n };\n WindowTimeSubscriber.prototype.closeWindow = function (window) {\n window.complete();\n var windows = this.windows;\n windows.splice(windows.indexOf(window), 1);\n };\n return WindowTimeSubscriber;\n}(Subscriber_1.Subscriber));\nfunction dispatchWindowTimeSpanOnly(state) {\n var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;\n if (window) {\n window.complete();\n }\n state.window = subscriber.openWindow();\n this.schedule(state, windowTimeSpan);\n}\nfunction dispatchWindowCreation(state) {\n var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;\n var window = subscriber.openWindow();\n var action = this;\n var context = { action: action, subscription: null };\n var timeSpanState = { subscriber: subscriber, window: window, context: context };\n context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);\n action.add(context.subscription);\n action.schedule(state, windowCreationInterval);\n}\nfunction dispatchWindowClose(arg) {\n var subscriber = arg.subscriber, window = arg.window, context = arg.context;\n if (context && context.action && context.subscription) {\n context.action.remove(context.subscription);\n }\n subscriber.closeWindow(window);\n}\n//# sourceMappingURL=windowTime.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd1RpbWUuanM/YmZmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4uL1N1YmplY3QnKTtcbnZhciBhc3luY18xID0gcmVxdWlyZSgnLi4vc2NoZWR1bGVyL2FzeW5jJyk7XG52YXIgU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaWJlcicpO1xuLyoqXG4gKiBCcmFuY2ggb3V0IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB2YWx1ZXMgYXMgYSBuZXN0ZWQgT2JzZXJ2YWJsZSBwZXJpb2RpY2FsbHlcbiAqIGluIHRpbWUuXG4gKlxuICogPHNwYW4gY2xhc3M9XCJpbmZvcm1hbFwiPkl0J3MgbGlrZSB7QGxpbmsgYnVmZmVyVGltZX0sIGJ1dCBlbWl0cyBhIG5lc3RlZFxuICogT2JzZXJ2YWJsZSBpbnN0ZWFkIG9mIGFuIGFycmF5Ljwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3dpbmRvd1RpbWUucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2luZG93cyBvZiBpdGVtcyBpdCBjb2xsZWN0cyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIFRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBzdGFydHMgYSBuZXcgd2luZG93IHBlcmlvZGljYWxseSwgYXNcbiAqIGRldGVybWluZWQgYnkgdGhlIGB3aW5kb3dDcmVhdGlvbkludGVydmFsYCBhcmd1bWVudC4gSXQgZW1pdHMgZWFjaCB3aW5kb3dcbiAqIGFmdGVyIGEgZml4ZWQgdGltZXNwYW4sIHNwZWNpZmllZCBieSB0aGUgYHdpbmRvd1RpbWVTcGFuYCBhcmd1bWVudC4gV2hlbiB0aGVcbiAqIHNvdXJjZSBPYnNlcnZhYmxlIGNvbXBsZXRlcyBvciBlbmNvdW50ZXJzIGFuIGVycm9yLCB0aGUgb3V0cHV0IE9ic2VydmFibGVcbiAqIGVtaXRzIHRoZSBjdXJyZW50IHdpbmRvdyBhbmQgcHJvcGFnYXRlcyB0aGUgbm90aWZpY2F0aW9uIGZyb20gdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gSWYgYHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWxgIGlzIG5vdCBwcm92aWRlZCwgdGhlIG91dHB1dFxuICogT2JzZXJ2YWJsZSBzdGFydHMgYSBuZXcgd2luZG93IHdoZW4gdGhlIHByZXZpb3VzIHdpbmRvdyBvZiBkdXJhdGlvblxuICogYHdpbmRvd1RpbWVTcGFuYCBjb21wbGV0ZXMuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+SW4gZXZlcnkgd2luZG93IG9mIDEgc2Vjb25kIGVhY2gsIGVtaXQgYXQgbW9zdCAyIGNsaWNrIGV2ZW50czwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLndpbmRvd1RpbWUoMTAwMClcbiAqICAgLm1hcCh3aW4gPT4gd2luLnRha2UoMikpIC8vIGVhY2ggd2luZG93IGhhcyBhdCBtb3N0IDIgZW1pc3Npb25zXG4gKiAgIC5tZXJnZUFsbCgpOyAvLyBmbGF0dGVuIHRoZSBPYnNlcnZhYmxlLW9mLU9ic2VydmFibGVzXG4gKiByZXN1bHQuc3Vic2NyaWJlKHggPT4gY29uc29sZS5sb2coeCkpO1xuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV2ZXJ5IDUgc2Vjb25kcyBzdGFydCBhIHdpbmRvdyAxIHNlY29uZCBsb25nLCBhbmQgZW1pdCBhdCBtb3N0IDIgY2xpY2sgZXZlbnRzIHBlciB3aW5kb3c8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy53aW5kb3dUaW1lKDEwMDAsIDUwMDApXG4gKiAgIC5tYXAod2luID0+IHdpbi50YWtlKDIpKSAvLyBlYWNoIHdpbmRvdyBoYXMgYXQgbW9zdCAyIGVtaXNzaW9uc1xuICogICAubWVyZ2VBbGwoKTsgLy8gZmxhdHRlbiB0aGUgT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlc1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayB3aW5kb3d9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dDb3VudH1cbiAqIEBzZWUge0BsaW5rIHdpbmRvd1RvZ2dsZX1cbiAqIEBzZWUge0BsaW5rIHdpbmRvd1doZW59XG4gKiBAc2VlIHtAbGluayBidWZmZXJUaW1lfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aW5kb3dUaW1lU3BhbiBUaGUgYW1vdW50IG9mIHRpbWUgdG8gZmlsbCBlYWNoIHdpbmRvdy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2luZG93Q3JlYXRpb25JbnRlcnZhbF0gVGhlIGludGVydmFsIGF0IHdoaWNoIHRvIHN0YXJ0IG5ld1xuICogd2luZG93cy5cbiAqIEBwYXJhbSB7U2NoZWR1bGVyfSBbc2NoZWR1bGVyPWFzeW5jXSBUaGUgc2NoZWR1bGVyIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZVxuICogaW50ZXJ2YWxzIHRoYXQgZGV0ZXJtaW5lIHdpbmRvdyBib3VuZGFyaWVzLlxuICogQHJldHVybiB7T2JzZXJ2YWJsZTxPYnNlcnZhYmxlPFQ+Pn0gQW4gb2JzZXJ2YWJsZSBvZiB3aW5kb3dzLCB3aGljaCBpbiB0dXJuXG4gKiBhcmUgT2JzZXJ2YWJsZXMuXG4gKiBAbWV0aG9kIHdpbmRvd1RpbWVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHdpbmRvd1RpbWUod2luZG93VGltZVNwYW4sIHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWwsIHNjaGVkdWxlcikge1xuICAgIGlmICh3aW5kb3dDcmVhdGlvbkludGVydmFsID09PSB2b2lkIDApIHsgd2luZG93Q3JlYXRpb25JbnRlcnZhbCA9IG51bGw7IH1cbiAgICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHsgc2NoZWR1bGVyID0gYXN5bmNfMS5hc3luYzsgfVxuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFdpbmRvd1RpbWVPcGVyYXRvcih3aW5kb3dUaW1lU3Bhbiwgd2luZG93Q3JlYXRpb25JbnRlcnZhbCwgc2NoZWR1bGVyKSk7XG59XG5leHBvcnRzLndpbmRvd1RpbWUgPSB3aW5kb3dUaW1lO1xudmFyIFdpbmRvd1RpbWVPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gV2luZG93VGltZU9wZXJhdG9yKHdpbmRvd1RpbWVTcGFuLCB3aW5kb3dDcmVhdGlvbkludGVydmFsLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgdGhpcy53aW5kb3dUaW1lU3BhbiA9IHdpbmRvd1RpbWVTcGFuO1xuICAgICAgICB0aGlzLndpbmRvd0NyZWF0aW9uSW50ZXJ2YWwgPSB3aW5kb3dDcmVhdGlvbkludGVydmFsO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG4gICAgV2luZG93VGltZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgV2luZG93VGltZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy53aW5kb3dUaW1lU3BhbiwgdGhpcy53aW5kb3dDcmVhdGlvbkludGVydmFsLCB0aGlzLnNjaGVkdWxlcikpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1RpbWVPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFdpbmRvd1RpbWVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoV2luZG93VGltZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93VGltZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIHdpbmRvd1RpbWVTcGFuLCB3aW5kb3dDcmVhdGlvbkludGVydmFsLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICAgIHRoaXMud2luZG93VGltZVNwYW4gPSB3aW5kb3dUaW1lU3BhbjtcbiAgICAgICAgdGhpcy53aW5kb3dDcmVhdGlvbkludGVydmFsID0gd2luZG93Q3JlYXRpb25JbnRlcnZhbDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgICAgIHRoaXMud2luZG93cyA9IFtdO1xuICAgICAgICBpZiAod2luZG93Q3JlYXRpb25JbnRlcnZhbCAhPT0gbnVsbCAmJiB3aW5kb3dDcmVhdGlvbkludGVydmFsID49IDApIHtcbiAgICAgICAgICAgIHZhciB3aW5kb3dfMSA9IHRoaXMub3BlbldpbmRvdygpO1xuICAgICAgICAgICAgdmFyIGNsb3NlU3RhdGUgPSB7IHN1YnNjcmliZXI6IHRoaXMsIHdpbmRvdzogd2luZG93XzEsIGNvbnRleHQ6IG51bGwgfTtcbiAgICAgICAgICAgIHZhciBjcmVhdGlvblN0YXRlID0geyB3aW5kb3dUaW1lU3Bhbjogd2luZG93VGltZVNwYW4sIHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWw6IHdpbmRvd0NyZWF0aW9uSW50ZXJ2YWwsIHN1YnNjcmliZXI6IHRoaXMsIHNjaGVkdWxlcjogc2NoZWR1bGVyIH07XG4gICAgICAgICAgICB0aGlzLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hXaW5kb3dDbG9zZSwgd2luZG93VGltZVNwYW4sIGNsb3NlU3RhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaFdpbmRvd0NyZWF0aW9uLCB3aW5kb3dDcmVhdGlvbkludGVydmFsLCBjcmVhdGlvblN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgd2luZG93XzIgPSB0aGlzLm9wZW5XaW5kb3coKTtcbiAgICAgICAgICAgIHZhciB0aW1lU3Bhbk9ubHlTdGF0ZSA9IHsgc3Vic2NyaWJlcjogdGhpcywgd2luZG93OiB3aW5kb3dfMiwgd2luZG93VGltZVNwYW46IHdpbmRvd1RpbWVTcGFuIH07XG4gICAgICAgICAgICB0aGlzLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2hXaW5kb3dUaW1lU3Bhbk9ubHksIHdpbmRvd1RpbWVTcGFuLCB0aW1lU3Bhbk9ubHlTdGF0ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFdpbmRvd1RpbWVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgd2luZG93cyA9IHRoaXMud2luZG93cztcbiAgICAgICAgdmFyIGxlbiA9IHdpbmRvd3MubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2luZG93XzMgPSB3aW5kb3dzW2ldO1xuICAgICAgICAgICAgaWYgKCF3aW5kb3dfMy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3dfMy5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgV2luZG93VGltZVN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIHdpbmRvd3MgPSB0aGlzLndpbmRvd3M7XG4gICAgICAgIHdoaWxlICh3aW5kb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHdpbmRvd3Muc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIFdpbmRvd1RpbWVTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aW5kb3dzID0gdGhpcy53aW5kb3dzO1xuICAgICAgICB3aGlsZSAod2luZG93cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgd2luZG93XzQgPSB3aW5kb3dzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIXdpbmRvd180LmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHdpbmRvd180LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgV2luZG93VGltZVN1YnNjcmliZXIucHJvdG90eXBlLm9wZW5XaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3aW5kb3cgPSBuZXcgU3ViamVjdF8xLlN1YmplY3QoKTtcbiAgICAgICAgdGhpcy53aW5kb3dzLnB1c2god2luZG93KTtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgZGVzdGluYXRpb24ubmV4dCh3aW5kb3cpO1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH07XG4gICAgV2luZG93VGltZVN1YnNjcmliZXIucHJvdG90eXBlLmNsb3NlV2luZG93ID0gZnVuY3Rpb24gKHdpbmRvdykge1xuICAgICAgICB3aW5kb3cuY29tcGxldGUoKTtcbiAgICAgICAgdmFyIHdpbmRvd3MgPSB0aGlzLndpbmRvd3M7XG4gICAgICAgIHdpbmRvd3Muc3BsaWNlKHdpbmRvd3MuaW5kZXhPZih3aW5kb3cpLCAxKTtcbiAgICB9O1xuICAgIHJldHVybiBXaW5kb3dUaW1lU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcl8xLlN1YnNjcmliZXIpKTtcbmZ1bmN0aW9uIGRpc3BhdGNoV2luZG93VGltZVNwYW5Pbmx5KHN0YXRlKSB7XG4gICAgdmFyIHN1YnNjcmliZXIgPSBzdGF0ZS5zdWJzY3JpYmVyLCB3aW5kb3dUaW1lU3BhbiA9IHN0YXRlLndpbmRvd1RpbWVTcGFuLCB3aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gICAgaWYgKHdpbmRvdykge1xuICAgICAgICB3aW5kb3cuY29tcGxldGUoKTtcbiAgICB9XG4gICAgc3RhdGUud2luZG93ID0gc3Vic2NyaWJlci5vcGVuV2luZG93KCk7XG4gICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgd2luZG93VGltZVNwYW4pO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hXaW5kb3dDcmVhdGlvbihzdGF0ZSkge1xuICAgIHZhciB3aW5kb3dUaW1lU3BhbiA9IHN0YXRlLndpbmRvd1RpbWVTcGFuLCBzdWJzY3JpYmVyID0gc3RhdGUuc3Vic2NyaWJlciwgc2NoZWR1bGVyID0gc3RhdGUuc2NoZWR1bGVyLCB3aW5kb3dDcmVhdGlvbkludGVydmFsID0gc3RhdGUud2luZG93Q3JlYXRpb25JbnRlcnZhbDtcbiAgICB2YXIgd2luZG93ID0gc3Vic2NyaWJlci5vcGVuV2luZG93KCk7XG4gICAgdmFyIGFjdGlvbiA9IHRoaXM7XG4gICAgdmFyIGNvbnRleHQgPSB7IGFjdGlvbjogYWN0aW9uLCBzdWJzY3JpcHRpb246IG51bGwgfTtcbiAgICB2YXIgdGltZVNwYW5TdGF0ZSA9IHsgc3Vic2NyaWJlcjogc3Vic2NyaWJlciwgd2luZG93OiB3aW5kb3csIGNvbnRleHQ6IGNvbnRleHQgfTtcbiAgICBjb250ZXh0LnN1YnNjcmlwdGlvbiA9IHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaFdpbmRvd0Nsb3NlLCB3aW5kb3dUaW1lU3BhbiwgdGltZVNwYW5TdGF0ZSk7XG4gICAgYWN0aW9uLmFkZChjb250ZXh0LnN1YnNjcmlwdGlvbik7XG4gICAgYWN0aW9uLnNjaGVkdWxlKHN0YXRlLCB3aW5kb3dDcmVhdGlvbkludGVydmFsKTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoV2luZG93Q2xvc2UoYXJnKSB7XG4gICAgdmFyIHN1YnNjcmliZXIgPSBhcmcuc3Vic2NyaWJlciwgd2luZG93ID0gYXJnLndpbmRvdywgY29udGV4dCA9IGFyZy5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuYWN0aW9uICYmIGNvbnRleHQuc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aW9uLnJlbW92ZShjb250ZXh0LnN1YnNjcmlwdGlvbik7XG4gICAgfVxuICAgIHN1YnNjcmliZXIuY2xvc2VXaW5kb3cod2luZG93KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdpbmRvd1RpbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivd2luZG93VGltZS5qc1xuLy8gbW9kdWxlIGlkID0gNjQ1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1637. /***/ },
  1638. /* 646 */
  1639. /***/ function(module, exports, __webpack_require__) {
  1640. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar windowToggle_1 = __webpack_require__(647);\nObservable_1.Observable.prototype.windowToggle = windowToggle_1.windowToggle;\n//# sourceMappingURL=windowToggle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dUb2dnbGUuanM/MjcyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgd2luZG93VG9nZ2xlXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci93aW5kb3dUb2dnbGUnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aW5kb3dUb2dnbGUgPSB3aW5kb3dUb2dnbGVfMS53aW5kb3dUb2dnbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aW5kb3dUb2dnbGUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3dpbmRvd1RvZ2dsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1641. /***/ },
  1642. /* 647 */
  1643. /***/ function(module, exports, __webpack_require__) {
  1644. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar Subscription_1 = __webpack_require__(11);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Branch out the source Observable values as a nested Observable starting from\n * an emission from `openings` and ending when the output of `closingSelector`\n * emits.\n *\n * <span class=\"informal\">It's like {@link bufferToggle}, but emits a nested\n * Observable instead of an array.</span>\n *\n * <img src=\"./img/windowToggle.png\" width=\"100%\">\n *\n * Returns an Observable that emits windows of items it collects from the source\n * Observable. The output Observable emits windows that contain those items\n * emitted by the source Observable between the time when the `openings`\n * Observable emits an item and when the Observable returned by\n * `closingSelector` emits an item.\n *\n * @example <caption>Every other second, emit the click events from the next 500ms</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var openings = Rx.Observable.interval(1000);\n * var result = clicks.windowToggle(openings, i =>\n * i % 2 ? Rx.Observable.interval(500) : Rx.Observable.empty()\n * ).mergeAll();\n * result.subscribe(x => console.log(x));\n *\n * @see {@link window}\n * @see {@link windowCount}\n * @see {@link windowTime}\n * @see {@link windowWhen}\n * @see {@link bufferToggle}\n *\n * @param {Observable<O>} openings An observable of notifications to start new\n * windows.\n * @param {function(value: O): Observable} closingSelector A function that takes\n * the value emitted by the `openings` observable and returns an Observable,\n * which, when it emits (either `next` or `complete`), signals that the\n * associated window should complete.\n * @return {Observable<Observable<T>>} An observable of windows, which in turn\n * are Observables.\n * @method windowToggle\n * @owner Observable\n */\nfunction windowToggle(openings, closingSelector) {\n return this.lift(new WindowToggleOperator(openings, closingSelector));\n}\nexports.windowToggle = windowToggle;\nvar WindowToggleOperator = (function () {\n function WindowToggleOperator(openings, closingSelector) {\n this.openings = openings;\n this.closingSelector = closingSelector;\n }\n WindowToggleOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));\n };\n return WindowToggleOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WindowToggleSubscriber = (function (_super) {\n __extends(WindowToggleSubscriber, _super);\n function WindowToggleSubscriber(destination, openings, closingSelector) {\n _super.call(this, destination);\n this.openings = openings;\n this.closingSelector = closingSelector;\n this.contexts = [];\n this.add(this.openSubscription = subscribeToResult_1.subscribeToResult(this, openings, openings));\n }\n WindowToggleSubscriber.prototype._next = function (value) {\n var contexts = this.contexts;\n if (contexts) {\n var len = contexts.length;\n for (var i = 0; i < len; i++) {\n contexts[i].window.next(value);\n }\n }\n };\n WindowToggleSubscriber.prototype._error = function (err) {\n var contexts = this.contexts;\n this.contexts = null;\n if (contexts) {\n var len = contexts.length;\n var index = -1;\n while (++index < len) {\n var context = contexts[index];\n context.window.error(err);\n context.subscription.unsubscribe();\n }\n }\n _super.prototype._error.call(this, err);\n };\n WindowToggleSubscriber.prototype._complete = function () {\n var contexts = this.contexts;\n this.contexts = null;\n if (contexts) {\n var len = contexts.length;\n var index = -1;\n while (++index < len) {\n var context = contexts[index];\n context.window.complete();\n context.subscription.unsubscribe();\n }\n }\n _super.prototype._complete.call(this);\n };\n WindowToggleSubscriber.prototype._unsubscribe = function () {\n var contexts = this.contexts;\n this.contexts = null;\n if (contexts) {\n var len = contexts.length;\n var index = -1;\n while (++index < len) {\n var context = contexts[index];\n context.window.unsubscribe();\n context.subscription.unsubscribe();\n }\n }\n };\n WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n if (outerValue === this.openings) {\n var closingSelector = this.closingSelector;\n var closingNotifier = tryCatch_1.tryCatch(closingSelector)(innerValue);\n if (closingNotifier === errorObject_1.errorObject) {\n return this.error(errorObject_1.errorObject.e);\n }\n else {\n var window_1 = new Subject_1.Subject();\n var subscription = new Subscription_1.Subscription();\n var context = { window: window_1, subscription: subscription };\n this.contexts.push(context);\n var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);\n if (innerSubscription.closed) {\n this.closeWindow(this.contexts.length - 1);\n }\n else {\n innerSubscription.context = context;\n subscription.add(innerSubscription);\n }\n this.destination.next(window_1);\n }\n }\n else {\n this.closeWindow(this.contexts.indexOf(outerValue));\n }\n };\n WindowToggleSubscriber.prototype.notifyError = function (err) {\n this.error(err);\n };\n WindowToggleSubscriber.prototype.notifyComplete = function (inner) {\n if (inner !== this.openSubscription) {\n this.closeWindow(this.contexts.indexOf(inner.context));\n }\n };\n WindowToggleSubscriber.prototype.closeWindow = function (index) {\n if (index === -1) {\n return;\n }\n var contexts = this.contexts;\n var context = contexts[index];\n var window = context.window, subscription = context.subscription;\n contexts.splice(index, 1);\n window.complete();\n subscription.unsubscribe();\n };\n return WindowToggleSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=windowToggle.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd1RvZ2dsZS5qcz9kNWMyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vU3ViamVjdCcpO1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaXB0aW9uJyk7XG52YXIgdHJ5Q2F0Y2hfMSA9IHJlcXVpcmUoJy4uL3V0aWwvdHJ5Q2F0Y2gnKTtcbnZhciBlcnJvck9iamVjdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9lcnJvck9iamVjdCcpO1xudmFyIE91dGVyU3Vic2NyaWJlcl8xID0gcmVxdWlyZSgnLi4vT3V0ZXJTdWJzY3JpYmVyJyk7XG52YXIgc3Vic2NyaWJlVG9SZXN1bHRfMSA9IHJlcXVpcmUoJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnKTtcbi8qKlxuICogQnJhbmNoIG91dCB0aGUgc291cmNlIE9ic2VydmFibGUgdmFsdWVzIGFzIGEgbmVzdGVkIE9ic2VydmFibGUgc3RhcnRpbmcgZnJvbVxuICogYW4gZW1pc3Npb24gZnJvbSBgb3BlbmluZ3NgIGFuZCBlbmRpbmcgd2hlbiB0aGUgb3V0cHV0IG9mIGBjbG9zaW5nU2VsZWN0b3JgXG4gKiBlbWl0cy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBidWZmZXJUb2dnbGV9LCBidXQgZW1pdHMgYSBuZXN0ZWRcbiAqIE9ic2VydmFibGUgaW5zdGVhZCBvZiBhbiBhcnJheS48L3NwYW4+XG4gKlxuICogPGltZyBzcmM9XCIuL2ltZy93aW5kb3dUb2dnbGUucG5nXCIgd2lkdGg9XCIxMDAlXCI+XG4gKlxuICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2luZG93cyBvZiBpdGVtcyBpdCBjb2xsZWN0cyBmcm9tIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIFRoZSBvdXRwdXQgT2JzZXJ2YWJsZSBlbWl0cyB3aW5kb3dzIHRoYXQgY29udGFpbiB0aG9zZSBpdGVtc1xuICogZW1pdHRlZCBieSB0aGUgc291cmNlIE9ic2VydmFibGUgYmV0d2VlbiB0aGUgdGltZSB3aGVuIHRoZSBgb3BlbmluZ3NgXG4gKiBPYnNlcnZhYmxlIGVtaXRzIGFuIGl0ZW0gYW5kIHdoZW4gdGhlIE9ic2VydmFibGUgcmV0dXJuZWQgYnlcbiAqIGBjbG9zaW5nU2VsZWN0b3JgIGVtaXRzIGFuIGl0ZW0uXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXZlcnkgb3RoZXIgc2Vjb25kLCBlbWl0IHRoZSBjbGljayBldmVudHMgZnJvbSB0aGUgbmV4dCA1MDBtczwvY2FwdGlvbj5cbiAqIHZhciBjbGlja3MgPSBSeC5PYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJyk7XG4gKiB2YXIgb3BlbmluZ3MgPSBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDApO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrcy53aW5kb3dUb2dnbGUob3BlbmluZ3MsIGkgPT5cbiAqICAgaSAlIDIgPyBSeC5PYnNlcnZhYmxlLmludGVydmFsKDUwMCkgOiBSeC5PYnNlcnZhYmxlLmVtcHR5KClcbiAqICkubWVyZ2VBbGwoKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgd2luZG93fVxuICogQHNlZSB7QGxpbmsgd2luZG93Q291bnR9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUaW1lfVxuICogQHNlZSB7QGxpbmsgd2luZG93V2hlbn1cbiAqIEBzZWUge0BsaW5rIGJ1ZmZlclRvZ2dsZX1cbiAqXG4gKiBAcGFyYW0ge09ic2VydmFibGU8Tz59IG9wZW5pbmdzIEFuIG9ic2VydmFibGUgb2Ygbm90aWZpY2F0aW9ucyB0byBzdGFydCBuZXdcbiAqIHdpbmRvd3MuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHZhbHVlOiBPKTogT2JzZXJ2YWJsZX0gY2xvc2luZ1NlbGVjdG9yIEEgZnVuY3Rpb24gdGhhdCB0YWtlc1xuICogdGhlIHZhbHVlIGVtaXR0ZWQgYnkgdGhlIGBvcGVuaW5nc2Agb2JzZXJ2YWJsZSBhbmQgcmV0dXJucyBhbiBPYnNlcnZhYmxlLFxuICogd2hpY2gsIHdoZW4gaXQgZW1pdHMgKGVpdGhlciBgbmV4dGAgb3IgYGNvbXBsZXRlYCksIHNpZ25hbHMgdGhhdCB0aGVcbiAqIGFzc29jaWF0ZWQgd2luZG93IHNob3VsZCBjb21wbGV0ZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8T2JzZXJ2YWJsZTxUPj59IEFuIG9ic2VydmFibGUgb2Ygd2luZG93cywgd2hpY2ggaW4gdHVyblxuICogYXJlIE9ic2VydmFibGVzLlxuICogQG1ldGhvZCB3aW5kb3dUb2dnbGVcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHdpbmRvd1RvZ2dsZShvcGVuaW5ncywgY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgV2luZG93VG9nZ2xlT3BlcmF0b3Iob3BlbmluZ3MsIGNsb3NpbmdTZWxlY3RvcikpO1xufVxuZXhwb3J0cy53aW5kb3dUb2dnbGUgPSB3aW5kb3dUb2dnbGU7XG52YXIgV2luZG93VG9nZ2xlT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFdpbmRvd1RvZ2dsZU9wZXJhdG9yKG9wZW5pbmdzLCBjbG9zaW5nU2VsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5vcGVuaW5ncyA9IG9wZW5pbmdzO1xuICAgICAgICB0aGlzLmNsb3NpbmdTZWxlY3RvciA9IGNsb3NpbmdTZWxlY3RvcjtcbiAgICB9XG4gICAgV2luZG93VG9nZ2xlT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBXaW5kb3dUb2dnbGVTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMub3BlbmluZ3MsIHRoaXMuY2xvc2luZ1NlbGVjdG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gV2luZG93VG9nZ2xlT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBXaW5kb3dUb2dnbGVTdWJzY3JpYmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoV2luZG93VG9nZ2xlU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBXaW5kb3dUb2dnbGVTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvcGVuaW5ncywgY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgdGhpcy5vcGVuaW5ncyA9IG9wZW5pbmdzO1xuICAgICAgICB0aGlzLmNsb3NpbmdTZWxlY3RvciA9IGNsb3NpbmdTZWxlY3RvcjtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IFtdO1xuICAgICAgICB0aGlzLmFkZCh0aGlzLm9wZW5TdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdF8xLnN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIG9wZW5pbmdzLCBvcGVuaW5ncykpO1xuICAgIH1cbiAgICBXaW5kb3dUb2dnbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICBpZiAoY29udGV4dHMpIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dHNbaV0ud2luZG93Lm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBXaW5kb3dUb2dnbGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHZhciBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBudWxsO1xuICAgICAgICBpZiAoY29udGV4dHMpIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSBjb250ZXh0cy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBjb250ZXh0c1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29udGV4dC53aW5kb3cuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2Vycm9yLmNhbGwodGhpcywgZXJyKTtcbiAgICB9O1xuICAgIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG51bGw7XG4gICAgICAgIGlmIChjb250ZXh0cykge1xuICAgICAgICAgICAgdmFyIGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LndpbmRvdy5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fY29tcGxldGUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHRzID0gdGhpcy5jb250ZXh0cztcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG51bGw7XG4gICAgICAgIGlmIChjb250ZXh0cykge1xuICAgICAgICAgICAgdmFyIGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LndpbmRvdy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgaWYgKG91dGVyVmFsdWUgPT09IHRoaXMub3BlbmluZ3MpIHtcbiAgICAgICAgICAgIHZhciBjbG9zaW5nU2VsZWN0b3IgPSB0aGlzLmNsb3NpbmdTZWxlY3RvcjtcbiAgICAgICAgICAgIHZhciBjbG9zaW5nTm90aWZpZXIgPSB0cnlDYXRjaF8xLnRyeUNhdGNoKGNsb3NpbmdTZWxlY3RvcikoaW5uZXJWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2xvc2luZ05vdGlmaWVyID09PSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoZXJyb3JPYmplY3RfMS5lcnJvck9iamVjdC5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB3aW5kb3dfMSA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpO1xuICAgICAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB7IHdpbmRvdzogd2luZG93XzEsIHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uIH07XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0XzEuc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgY2xvc2luZ05vdGlmaWVyLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24uY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VXaW5kb3codGhpcy5jb250ZXh0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyU3Vic2NyaXB0aW9uLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKGlubmVyU3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHdpbmRvd18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaW5kb3codGhpcy5jb250ZXh0cy5pbmRleE9mKG91dGVyVmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgV2luZG93VG9nZ2xlU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5RXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICB9O1xuICAgIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyKSB7XG4gICAgICAgIGlmIChpbm5lciAhPT0gdGhpcy5vcGVuU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlV2luZG93KHRoaXMuY29udGV4dHMuaW5kZXhPZihpbm5lci5jb250ZXh0KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXIucHJvdG90eXBlLmNsb3NlV2luZG93ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzO1xuICAgICAgICB2YXIgY29udGV4dCA9IGNvbnRleHRzW2luZGV4XTtcbiAgICAgICAgdmFyIHdpbmRvdyA9IGNvbnRleHQud2luZG93LCBzdWJzY3JpcHRpb24gPSBjb250ZXh0LnN1YnNjcmlwdGlvbjtcbiAgICAgICAgY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgd2luZG93LmNvbXBsZXRlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1RvZ2dsZVN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2luZG93VG9nZ2xlLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd1RvZ2dsZS5qc1xuLy8gbW9kdWxlIGlkID0gNjQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1645. /***/ },
  1646. /* 648 */
  1647. /***/ function(module, exports, __webpack_require__) {
  1648. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar windowWhen_1 = __webpack_require__(649);\nObservable_1.Observable.prototype.windowWhen = windowWhen_1.windowWhen;\n//# sourceMappingURL=windowWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dXaGVuLmpzP2E4NjgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vLi4vT2JzZXJ2YWJsZScpO1xudmFyIHdpbmRvd1doZW5fMSA9IHJlcXVpcmUoJy4uLy4uL29wZXJhdG9yL3dpbmRvd1doZW4nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aW5kb3dXaGVuID0gd2luZG93V2hlbl8xLndpbmRvd1doZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aW5kb3dXaGVuLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL2FkZC9vcGVyYXRvci93aW5kb3dXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA2NDhcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1649. /***/ },
  1650. /* 649 */
  1651. /***/ function(module, exports, __webpack_require__) {
  1652. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar tryCatch_1 = __webpack_require__(14);\nvar errorObject_1 = __webpack_require__(15);\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/**\n * Branch out the source Observable values as a nested Observable using a\n * factory function of closing Observables to determine when to start a new\n * window.\n *\n * <span class=\"informal\">It's like {@link bufferWhen}, but emits a nested\n * Observable instead of an array.</span>\n *\n * <img src=\"./img/windowWhen.png\" width=\"100%\">\n *\n * Returns an Observable that emits windows of items it collects from the source\n * Observable. The output Observable emits connected, non-overlapping windows.\n * It emits the current window and opens a new one whenever the Observable\n * produced by the specified `closingSelector` function emits an item. The first\n * window is opened immediately when subscribing to the output Observable.\n *\n * @example <caption>Emit only the first two clicks events in every window of [1-5] random seconds</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var result = clicks\n * .windowWhen(() => Rx.Observable.interval(1000 + Math.random() * 4000))\n * .map(win => win.take(2)) // each window has at most 2 emissions\n * .mergeAll(); // flatten the Observable-of-Observables\n * result.subscribe(x => console.log(x));\n *\n * @see {@link window}\n * @see {@link windowCount}\n * @see {@link windowTime}\n * @see {@link windowToggle}\n * @see {@link bufferWhen}\n *\n * @param {function(): Observable} closingSelector A function that takes no\n * arguments and returns an Observable that signals (on either `next` or\n * `complete`) when to close the previous window and start a new one.\n * @return {Observable<Observable<T>>} An observable of windows, which in turn\n * are Observables.\n * @method windowWhen\n * @owner Observable\n */\nfunction windowWhen(closingSelector) {\n return this.lift(new WindowOperator(closingSelector));\n}\nexports.windowWhen = windowWhen;\nvar WindowOperator = (function () {\n function WindowOperator(closingSelector) {\n this.closingSelector = closingSelector;\n }\n WindowOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));\n };\n return WindowOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WindowSubscriber = (function (_super) {\n __extends(WindowSubscriber, _super);\n function WindowSubscriber(destination, closingSelector) {\n _super.call(this, destination);\n this.destination = destination;\n this.closingSelector = closingSelector;\n this.openWindow();\n }\n WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.openWindow(innerSub);\n };\n WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n this._error(error);\n };\n WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n this.openWindow(innerSub);\n };\n WindowSubscriber.prototype._next = function (value) {\n this.window.next(value);\n };\n WindowSubscriber.prototype._error = function (err) {\n this.window.error(err);\n this.destination.error(err);\n this.unsubscribeClosingNotification();\n };\n WindowSubscriber.prototype._complete = function () {\n this.window.complete();\n this.destination.complete();\n this.unsubscribeClosingNotification();\n };\n WindowSubscriber.prototype.unsubscribeClosingNotification = function () {\n if (this.closingNotification) {\n this.closingNotification.unsubscribe();\n }\n };\n WindowSubscriber.prototype.openWindow = function (innerSub) {\n if (innerSub === void 0) { innerSub = null; }\n if (innerSub) {\n this.remove(innerSub);\n innerSub.unsubscribe();\n }\n var prevWindow = this.window;\n if (prevWindow) {\n prevWindow.complete();\n }\n var window = this.window = new Subject_1.Subject();\n this.destination.next(window);\n var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();\n if (closingNotifier === errorObject_1.errorObject) {\n var err = errorObject_1.errorObject.e;\n this.destination.error(err);\n this.window.error(err);\n }\n else {\n this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));\n }\n };\n return WindowSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=windowWhen.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpbmRvd1doZW4uanM/ZmFmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIFN1YmplY3RfMSA9IHJlcXVpcmUoJy4uL1N1YmplY3QnKTtcbnZhciB0cnlDYXRjaF8xID0gcmVxdWlyZSgnLi4vdXRpbC90cnlDYXRjaCcpO1xudmFyIGVycm9yT2JqZWN0XzEgPSByZXF1aXJlKCcuLi91dGlsL2Vycm9yT2JqZWN0Jyk7XG52YXIgT3V0ZXJTdWJzY3JpYmVyXzEgPSByZXF1aXJlKCcuLi9PdXRlclN1YnNjcmliZXInKTtcbnZhciBzdWJzY3JpYmVUb1Jlc3VsdF8xID0gcmVxdWlyZSgnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCcpO1xuLyoqXG4gKiBCcmFuY2ggb3V0IHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSB2YWx1ZXMgYXMgYSBuZXN0ZWQgT2JzZXJ2YWJsZSB1c2luZyBhXG4gKiBmYWN0b3J5IGZ1bmN0aW9uIG9mIGNsb3NpbmcgT2JzZXJ2YWJsZXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gc3RhcnQgYSBuZXdcbiAqIHdpbmRvdy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+SXQncyBsaWtlIHtAbGluayBidWZmZXJXaGVufSwgYnV0IGVtaXRzIGEgbmVzdGVkXG4gKiBPYnNlcnZhYmxlIGluc3RlYWQgb2YgYW4gYXJyYXkuPC9zcGFuPlxuICpcbiAqIDxpbWcgc3JjPVwiLi9pbWcvd2luZG93V2hlbi5wbmdcIiB3aWR0aD1cIjEwMCVcIj5cbiAqXG4gKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB3aW5kb3dzIG9mIGl0ZW1zIGl0IGNvbGxlY3RzIGZyb20gdGhlIHNvdXJjZVxuICogT2JzZXJ2YWJsZS4gVGhlIG91dHB1dCBPYnNlcnZhYmxlIGVtaXRzIGNvbm5lY3RlZCwgbm9uLW92ZXJsYXBwaW5nIHdpbmRvd3MuXG4gKiBJdCBlbWl0cyB0aGUgY3VycmVudCB3aW5kb3cgYW5kIG9wZW5zIGEgbmV3IG9uZSB3aGVuZXZlciB0aGUgT2JzZXJ2YWJsZVxuICogcHJvZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBgY2xvc2luZ1NlbGVjdG9yYCBmdW5jdGlvbiBlbWl0cyBhbiBpdGVtLiBUaGUgZmlyc3RcbiAqIHdpbmRvdyBpcyBvcGVuZWQgaW1tZWRpYXRlbHkgd2hlbiBzdWJzY3JpYmluZyB0byB0aGUgb3V0cHV0IE9ic2VydmFibGUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RW1pdCBvbmx5IHRoZSBmaXJzdCB0d28gY2xpY2tzIGV2ZW50cyBpbiBldmVyeSB3aW5kb3cgb2YgWzEtNV0gcmFuZG9tIHNlY29uZHM8L2NhcHRpb24+XG4gKiB2YXIgY2xpY2tzID0gUnguT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpO1xuICogdmFyIHJlc3VsdCA9IGNsaWNrc1xuICogICAud2luZG93V2hlbigoKSA9PiBSeC5PYnNlcnZhYmxlLmludGVydmFsKDEwMDAgKyBNYXRoLnJhbmRvbSgpICogNDAwMCkpXG4gKiAgIC5tYXAod2luID0+IHdpbi50YWtlKDIpKSAvLyBlYWNoIHdpbmRvdyBoYXMgYXQgbW9zdCAyIGVtaXNzaW9uc1xuICogICAubWVyZ2VBbGwoKTsgLy8gZmxhdHRlbiB0aGUgT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlc1xuICogcmVzdWx0LnN1YnNjcmliZSh4ID0+IGNvbnNvbGUubG9nKHgpKTtcbiAqXG4gKiBAc2VlIHtAbGluayB3aW5kb3d9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dDb3VudH1cbiAqIEBzZWUge0BsaW5rIHdpbmRvd1RpbWV9XG4gKiBAc2VlIHtAbGluayB3aW5kb3dUb2dnbGV9XG4gKiBAc2VlIHtAbGluayBidWZmZXJXaGVufVxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogT2JzZXJ2YWJsZX0gY2xvc2luZ1NlbGVjdG9yIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIChvbiBlaXRoZXIgYG5leHRgIG9yXG4gKiBgY29tcGxldGVgKSB3aGVuIHRvIGNsb3NlIHRoZSBwcmV2aW91cyB3aW5kb3cgYW5kIHN0YXJ0IGEgbmV3IG9uZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGU8T2JzZXJ2YWJsZTxUPj59IEFuIG9ic2VydmFibGUgb2Ygd2luZG93cywgd2hpY2ggaW4gdHVyblxuICogYXJlIE9ic2VydmFibGVzLlxuICogQG1ldGhvZCB3aW5kb3dXaGVuXG4gKiBAb3duZXIgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiB3aW5kb3dXaGVuKGNsb3NpbmdTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmxpZnQobmV3IFdpbmRvd09wZXJhdG9yKGNsb3NpbmdTZWxlY3RvcikpO1xufVxuZXhwb3J0cy53aW5kb3dXaGVuID0gd2luZG93V2hlbjtcbnZhciBXaW5kb3dPcGVyYXRvciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gV2luZG93T3BlcmF0b3IoY2xvc2luZ1NlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY2xvc2luZ1NlbGVjdG9yID0gY2xvc2luZ1NlbGVjdG9yO1xuICAgIH1cbiAgICBXaW5kb3dPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFdpbmRvd1N1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5jbG9zaW5nU2VsZWN0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBXaW5kb3dPcGVyYXRvcjtcbn0oKSk7XG4vKipcbiAqIFdlIG5lZWQgdGhpcyBKU0RvYyBjb21tZW50IGZvciBhZmZlY3RpbmcgRVNEb2MuXG4gKiBAaWdub3JlXG4gKiBAZXh0ZW5kcyB7SWdub3JlZH1cbiAqL1xudmFyIFdpbmRvd1N1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXaW5kb3dTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFdpbmRvd1N1YnNjcmliZXIoZGVzdGluYXRpb24sIGNsb3NpbmdTZWxlY3Rvcikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgICAgdGhpcy5jbG9zaW5nU2VsZWN0b3IgPSBjbG9zaW5nU2VsZWN0b3I7XG4gICAgICAgIHRoaXMub3BlbldpbmRvdygpO1xuICAgIH1cbiAgICBXaW5kb3dTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMub3BlbldpbmRvdyhpbm5lclN1Yik7XG4gICAgfTtcbiAgICBXaW5kb3dTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5fZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgV2luZG93U3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy5vcGVuV2luZG93KGlubmVyU3ViKTtcbiAgICB9O1xuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMud2luZG93Lm5leHQodmFsdWUpO1xuICAgIH07XG4gICAgV2luZG93U3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLndpbmRvdy5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVDbG9zaW5nTm90aWZpY2F0aW9uKCk7XG4gICAgfTtcbiAgICBXaW5kb3dTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMud2luZG93LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUNsb3NpbmdOb3RpZmljYXRpb24oKTtcbiAgICB9O1xuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlQ2xvc2luZ05vdGlmaWNhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2luZ05vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zaW5nTm90aWZpY2F0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdpbmRvd1N1YnNjcmliZXIucHJvdG90eXBlLm9wZW5XaW5kb3cgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgaWYgKGlubmVyU3ViID09PSB2b2lkIDApIHsgaW5uZXJTdWIgPSBudWxsOyB9XG4gICAgICAgIGlmIChpbm5lclN1Yikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWIpO1xuICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldldpbmRvdyA9IHRoaXMud2luZG93O1xuICAgICAgICBpZiAocHJldldpbmRvdykge1xuICAgICAgICAgICAgcHJldldpbmRvdy5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB3aW5kb3cgPSB0aGlzLndpbmRvdyA9IG5ldyBTdWJqZWN0XzEuU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQod2luZG93KTtcbiAgICAgICAgdmFyIGNsb3NpbmdOb3RpZmllciA9IHRyeUNhdGNoXzEudHJ5Q2F0Y2godGhpcy5jbG9zaW5nU2VsZWN0b3IpKCk7XG4gICAgICAgIGlmIChjbG9zaW5nTm90aWZpZXIgPT09IGVycm9yT2JqZWN0XzEuZXJyb3JPYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBlcnJvck9iamVjdF8xLmVycm9yT2JqZWN0LmU7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5jbG9zaW5nTm90aWZpY2F0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBjbG9zaW5nTm90aWZpZXIpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1N1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2luZG93V2hlbi5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9vcGVyYXRvci93aW5kb3dXaGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA2NDlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1653. /***/ },
  1654. /* 650 */
  1655. /***/ function(module, exports, __webpack_require__) {
  1656. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar withLatestFrom_1 = __webpack_require__(651);\nObservable_1.Observable.prototype.withLatestFrom = withLatestFrom_1.withLatestFrom;\n//# sourceMappingURL=withLatestFrom.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci93aXRoTGF0ZXN0RnJvbS5qcz81ZmFkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uLy4uL09ic2VydmFibGUnKTtcbnZhciB3aXRoTGF0ZXN0RnJvbV8xID0gcmVxdWlyZSgnLi4vLi4vb3BlcmF0b3Ivd2l0aExhdGVzdEZyb20nKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS53aXRoTGF0ZXN0RnJvbSA9IHdpdGhMYXRlc3RGcm9tXzEud2l0aExhdGVzdEZyb207XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aXRoTGF0ZXN0RnJvbS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3Ivd2l0aExhdGVzdEZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDY1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1657. /***/ },
  1658. /* 651 */
  1659. /***/ function(module, exports, __webpack_require__) {
  1660. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar OuterSubscriber_1 = __webpack_require__(51);\nvar subscribeToResult_1 = __webpack_require__(49);\n/* tslint:disable:max-line-length */\n/**\n * Combines the source Observable with other Observables to create an Observable\n * whose values are calculated from the latest values of each, only when the\n * source emits.\n *\n * <span class=\"informal\">Whenever the source Observable emits a value, it\n * computes a formula using that value plus the latest values from other input\n * Observables, then emits the output of that formula.</span>\n *\n * <img src=\"./img/withLatestFrom.png\" width=\"100%\">\n *\n * `withLatestFrom` combines each value from the source Observable (the\n * instance) with the latest values from the other input Observables only when\n * the source emits a value, optionally using a `project` function to determine\n * the value to be emitted on the output Observable. All input Observables must\n * emit at least one value before the output Observable will emit a value.\n *\n * @example <caption>On every click event, emit an array with the latest timer event plus the click event</caption>\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var timer = Rx.Observable.interval(1000);\n * var result = clicks.withLatestFrom(timer);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link combineLatest}\n *\n * @param {Observable} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {Function} [project] Projection function for combining values\n * together. Receives all values in order of the Observables passed, where the\n * first parameter is a value from the source Observable. (e.g.\n * `a.withLatestFrom(b, c, (a1, b1, c1) => a1 + b1 + c1)`). If this is not\n * passed, arrays will be emitted on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method withLatestFrom\n * @owner Observable\n */\nfunction withLatestFrom() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n var project;\n if (typeof args[args.length - 1] === 'function') {\n project = args.pop();\n }\n var observables = args;\n return this.lift(new WithLatestFromOperator(observables, project));\n}\nexports.withLatestFrom = withLatestFrom;\nvar WithLatestFromOperator = (function () {\n function WithLatestFromOperator(observables, project) {\n this.observables = observables;\n this.project = project;\n }\n WithLatestFromOperator.prototype.call = function (subscriber, source) {\n return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n };\n return WithLatestFromOperator;\n}());\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar WithLatestFromSubscriber = (function (_super) {\n __extends(WithLatestFromSubscriber, _super);\n function WithLatestFromSubscriber(destination, observables, project) {\n _super.call(this, destination);\n this.observables = observables;\n this.project = project;\n this.toRespond = [];\n var len = observables.length;\n this.values = new Array(len);\n for (var i = 0; i < len; i++) {\n this.toRespond.push(i);\n }\n for (var i = 0; i < len; i++) {\n var observable = observables[i];\n this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));\n }\n }\n WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n this.values[outerIndex] = innerValue;\n var toRespond = this.toRespond;\n if (toRespond.length > 0) {\n var found = toRespond.indexOf(outerIndex);\n if (found !== -1) {\n toRespond.splice(found, 1);\n }\n }\n };\n WithLatestFromSubscriber.prototype.notifyComplete = function () {\n // noop\n };\n WithLatestFromSubscriber.prototype._next = function (value) {\n if (this.toRespond.length === 0) {\n var args = [value].concat(this.values);\n if (this.project) {\n this._tryProject(args);\n }\n else {\n this.destination.next(args);\n }\n }\n };\n WithLatestFromSubscriber.prototype._tryProject = function (args) {\n var result;\n try {\n result = this.project.apply(this, args);\n }\n catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n };\n return WithLatestFromSubscriber;\n}(OuterSubscriber_1.OuterSubscriber));\n//# sourceMappingURL=withLatestFrom.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3dpdGhMYXRlc3RGcm9tLmpzPzUxY2UiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBPdXRlclN1YnNjcmliZXJfMSA9IHJlcXVpcmUoJy4uL091dGVyU3Vic2NyaWJlcicpO1xudmFyIHN1YnNjcmliZVRvUmVzdWx0XzEgPSByZXF1aXJlKCcuLi91dGlsL3N1YnNjcmliZVRvUmVzdWx0Jyk7XG4vKiB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGggKi9cbi8qKlxuICogQ29tYmluZXMgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIHdpdGggb3RoZXIgT2JzZXJ2YWJsZXMgdG8gY3JlYXRlIGFuIE9ic2VydmFibGVcbiAqIHdob3NlIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBsYXRlc3QgdmFsdWVzIG9mIGVhY2gsIG9ubHkgd2hlbiB0aGVcbiAqIHNvdXJjZSBlbWl0cy5cbiAqXG4gKiA8c3BhbiBjbGFzcz1cImluZm9ybWFsXCI+V2hlbmV2ZXIgdGhlIHNvdXJjZSBPYnNlcnZhYmxlIGVtaXRzIGEgdmFsdWUsIGl0XG4gKiBjb21wdXRlcyBhIGZvcm11bGEgdXNpbmcgdGhhdCB2YWx1ZSBwbHVzIHRoZSBsYXRlc3QgdmFsdWVzIGZyb20gb3RoZXIgaW5wdXRcbiAqIE9ic2VydmFibGVzLCB0aGVuIGVtaXRzIHRoZSBvdXRwdXQgb2YgdGhhdCBmb3JtdWxhLjwvc3Bhbj5cbiAqXG4gKiA8aW1nIHNyYz1cIi4vaW1nL3dpdGhMYXRlc3RGcm9tLnBuZ1wiIHdpZHRoPVwiMTAwJVwiPlxuICpcbiAqIGB3aXRoTGF0ZXN0RnJvbWAgY29tYmluZXMgZWFjaCB2YWx1ZSBmcm9tIHRoZSBzb3VyY2UgT2JzZXJ2YWJsZSAodGhlXG4gKiBpbnN0YW5jZSkgd2l0aCB0aGUgbGF0ZXN0IHZhbHVlcyBmcm9tIHRoZSBvdGhlciBpbnB1dCBPYnNlcnZhYmxlcyBvbmx5IHdoZW5cbiAqIHRoZSBzb3VyY2UgZW1pdHMgYSB2YWx1ZSwgb3B0aW9uYWxseSB1c2luZyBhIGBwcm9qZWN0YCBmdW5jdGlvbiB0byBkZXRlcm1pbmVcbiAqIHRoZSB2YWx1ZSB0byBiZSBlbWl0dGVkIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS4gQWxsIGlucHV0IE9ic2VydmFibGVzIG11c3RcbiAqIGVtaXQgYXQgbGVhc3Qgb25lIHZhbHVlIGJlZm9yZSB0aGUgb3V0cHV0IE9ic2VydmFibGUgd2lsbCBlbWl0IGEgdmFsdWUuXG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+T24gZXZlcnkgY2xpY2sgZXZlbnQsIGVtaXQgYW4gYXJyYXkgd2l0aCB0aGUgbGF0ZXN0IHRpbWVyIGV2ZW50IHBsdXMgdGhlIGNsaWNrIGV2ZW50PC9jYXB0aW9uPlxuICogdmFyIGNsaWNrcyA9IFJ4Lk9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAnY2xpY2snKTtcbiAqIHZhciB0aW1lciA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCk7XG4gKiB2YXIgcmVzdWx0ID0gY2xpY2tzLndpdGhMYXRlc3RGcm9tKHRpbWVyKTtcbiAqIHJlc3VsdC5zdWJzY3JpYmUoeCA9PiBjb25zb2xlLmxvZyh4KSk7XG4gKlxuICogQHNlZSB7QGxpbmsgY29tYmluZUxhdGVzdH1cbiAqXG4gKiBAcGFyYW0ge09ic2VydmFibGV9IG90aGVyIEFuIGlucHV0IE9ic2VydmFibGUgdG8gY29tYmluZSB3aXRoIHRoZSBzb3VyY2VcbiAqIE9ic2VydmFibGUuIE1vcmUgdGhhbiBvbmUgaW5wdXQgT2JzZXJ2YWJsZXMgbWF5IGJlIGdpdmVuIGFzIGFyZ3VtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb2plY3RdIFByb2plY3Rpb24gZnVuY3Rpb24gZm9yIGNvbWJpbmluZyB2YWx1ZXNcbiAqIHRvZ2V0aGVyLiBSZWNlaXZlcyBhbGwgdmFsdWVzIGluIG9yZGVyIG9mIHRoZSBPYnNlcnZhYmxlcyBwYXNzZWQsIHdoZXJlIHRoZVxuICogZmlyc3QgcGFyYW1ldGVyIGlzIGEgdmFsdWUgZnJvbSB0aGUgc291cmNlIE9ic2VydmFibGUuIChlLmcuXG4gKiBgYS53aXRoTGF0ZXN0RnJvbShiLCBjLCAoYTEsIGIxLCBjMSkgPT4gYTEgKyBiMSArIGMxKWApLiBJZiB0aGlzIGlzIG5vdFxuICogcGFzc2VkLCBhcnJheXMgd2lsbCBiZSBlbWl0dGVkIG9uIHRoZSBvdXRwdXQgT2JzZXJ2YWJsZS5cbiAqIEByZXR1cm4ge09ic2VydmFibGV9IEFuIE9ic2VydmFibGUgb2YgcHJvamVjdGVkIHZhbHVlcyBmcm9tIHRoZSBtb3N0IHJlY2VudFxuICogdmFsdWVzIGZyb20gZWFjaCBpbnB1dCBPYnNlcnZhYmxlLCBvciBhbiBhcnJheSBvZiB0aGUgbW9zdCByZWNlbnQgdmFsdWVzIGZyb21cbiAqIGVhY2ggaW5wdXQgT2JzZXJ2YWJsZS5cbiAqIEBtZXRob2Qgd2l0aExhdGVzdEZyb21cbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHdpdGhMYXRlc3RGcm9tKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaSAtIDBdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHByb2plY3Q7XG4gICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJvamVjdCA9IGFyZ3MucG9wKCk7XG4gICAgfVxuICAgIHZhciBvYnNlcnZhYmxlcyA9IGFyZ3M7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgV2l0aExhdGVzdEZyb21PcGVyYXRvcihvYnNlcnZhYmxlcywgcHJvamVjdCkpO1xufVxuZXhwb3J0cy53aXRoTGF0ZXN0RnJvbSA9IHdpdGhMYXRlc3RGcm9tO1xudmFyIFdpdGhMYXRlc3RGcm9tT3BlcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFdpdGhMYXRlc3RGcm9tT3BlcmF0b3Iob2JzZXJ2YWJsZXMsIHByb2plY3QpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlcyA9IG9ic2VydmFibGVzO1xuICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICAgIH1cbiAgICBXaXRoTGF0ZXN0RnJvbU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgV2l0aExhdGVzdEZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMub2JzZXJ2YWJsZXMsIHRoaXMucHJvamVjdCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpdGhMYXRlc3RGcm9tT3BlcmF0b3I7XG59KCkpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2l0aExhdGVzdEZyb21TdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvYnNlcnZhYmxlcywgcHJvamVjdCkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbik7XG4gICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlcztcbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy50b1Jlc3BvbmQgPSBbXTtcbiAgICAgICAgdmFyIGxlbiA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdGhpcy50b1Jlc3BvbmQucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzW2ldO1xuICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHRfMS5zdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBvYnNlcnZhYmxlLCBvYnNlcnZhYmxlLCBpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgV2l0aExhdGVzdEZyb21TdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMudmFsdWVzW291dGVySW5kZXhdID0gaW5uZXJWYWx1ZTtcbiAgICAgICAgdmFyIHRvUmVzcG9uZCA9IHRoaXMudG9SZXNwb25kO1xuICAgICAgICBpZiAodG9SZXNwb25kLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBmb3VuZCA9IHRvUmVzcG9uZC5pbmRleE9mKG91dGVySW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZvdW5kICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRvUmVzcG9uZC5zcGxpY2UoZm91bmQsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBub29wXG4gICAgfTtcbiAgICBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnRvUmVzcG9uZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW3ZhbHVlXS5jb25jYXQodGhpcy52YWx1ZXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyeVByb2plY3QoYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdpdGhMYXRlc3RGcm9tU3Vic2NyaWJlci5wcm90b3R5cGUuX3RyeVByb2plY3QgPSBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTtcbiAgICB9O1xuICAgIHJldHVybiBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXI7XG59KE91dGVyU3Vic2NyaWJlcl8xLk91dGVyU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2l0aExhdGVzdEZyb20uanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3Ivd2l0aExhdGVzdEZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDY1MVxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1661. /***/ },
  1662. /* 652 */
  1663. /***/ function(module, exports, __webpack_require__) {
  1664. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar zip_1 = __webpack_require__(449);\nObservable_1.Observable.prototype.zip = zip_1.zipProto;\n//# sourceMappingURL=zip.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci96aXAuanM/ZmMwNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgemlwXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci96aXAnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS56aXAgPSB6aXBfMS56aXBQcm90bztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXppcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy9hZGQvb3BlcmF0b3IvemlwLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTJcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1665. /***/ },
  1666. /* 653 */
  1667. /***/ function(module, exports, __webpack_require__) {
  1668. eval("\"use strict\";\nvar Observable_1 = __webpack_require__(6);\nvar zipAll_1 = __webpack_require__(654);\nObservable_1.Observable.prototype.zipAll = zipAll_1.zipAll;\n//# sourceMappingURL=zipAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL2FkZC9vcGVyYXRvci96aXBBbGwuanM/YTU0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuLi8uLi9PYnNlcnZhYmxlJyk7XG52YXIgemlwQWxsXzEgPSByZXF1aXJlKCcuLi8uLi9vcGVyYXRvci96aXBBbGwnKTtcbk9ic2VydmFibGVfMS5PYnNlcnZhYmxlLnByb3RvdHlwZS56aXBBbGwgPSB6aXBBbGxfMS56aXBBbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD16aXBBbGwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvYWRkL29wZXJhdG9yL3ppcEFsbC5qc1xuLy8gbW9kdWxlIGlkID0gNjUzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1669. /***/ },
  1670. /* 654 */
  1671. /***/ function(module, exports, __webpack_require__) {
  1672. eval("\"use strict\";\nvar zip_1 = __webpack_require__(449);\n/**\n * @param project\n * @return {Observable<R>|WebSocketSubject<T>|Observable<T>}\n * @method zipAll\n * @owner Observable\n */\nfunction zipAll(project) {\n return this.lift(new zip_1.ZipOperator(project));\n}\nexports.zipAll = zipAll;\n//# sourceMappingURL=zipAll.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL29wZXJhdG9yL3ppcEFsbC5qcz81ZTRhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIHppcF8xID0gcmVxdWlyZSgnLi96aXAnKTtcbi8qKlxuICogQHBhcmFtIHByb2plY3RcbiAqIEByZXR1cm4ge09ic2VydmFibGU8Uj58V2ViU29ja2V0U3ViamVjdDxUPnxPYnNlcnZhYmxlPFQ+fVxuICogQG1ldGhvZCB6aXBBbGxcbiAqIEBvd25lciBPYnNlcnZhYmxlXG4gKi9cbmZ1bmN0aW9uIHppcEFsbChwcm9qZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMubGlmdChuZXcgemlwXzEuWmlwT3BlcmF0b3IocHJvamVjdCkpO1xufVxuZXhwb3J0cy56aXBBbGwgPSB6aXBBbGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD16aXBBbGwuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvb3BlcmF0b3IvemlwQWxsLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTRcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1673. /***/ },
  1674. /* 655 */
  1675. /***/ function(module, exports, __webpack_require__) {
  1676. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar Notification_1 = __webpack_require__(45);\nvar ColdObservable_1 = __webpack_require__(656);\nvar HotObservable_1 = __webpack_require__(660);\nvar SubscriptionLog_1 = __webpack_require__(658);\nvar VirtualTimeScheduler_1 = __webpack_require__(661);\nvar defaultMaxFrame = 750;\nvar TestScheduler = (function (_super) {\n __extends(TestScheduler, _super);\n function TestScheduler(assertDeepEqual) {\n _super.call(this, VirtualTimeScheduler_1.VirtualAction, defaultMaxFrame);\n this.assertDeepEqual = assertDeepEqual;\n this.hotObservables = [];\n this.coldObservables = [];\n this.flushTests = [];\n }\n TestScheduler.prototype.createTime = function (marbles) {\n var indexOf = marbles.indexOf('|');\n if (indexOf === -1) {\n throw new Error('marble diagram for time should have a completion marker \"|\"');\n }\n return indexOf * TestScheduler.frameTimeFactor;\n };\n TestScheduler.prototype.createColdObservable = function (marbles, values, error) {\n if (marbles.indexOf('^') !== -1) {\n throw new Error('cold observable cannot have subscription offset \"^\"');\n }\n if (marbles.indexOf('!') !== -1) {\n throw new Error('cold observable cannot have unsubscription marker \"!\"');\n }\n var messages = TestScheduler.parseMarbles(marbles, values, error);\n var cold = new ColdObservable_1.ColdObservable(messages, this);\n this.coldObservables.push(cold);\n return cold;\n };\n TestScheduler.prototype.createHotObservable = function (marbles, values, error) {\n if (marbles.indexOf('!') !== -1) {\n throw new Error('hot observable cannot have unsubscription marker \"!\"');\n }\n var messages = TestScheduler.parseMarbles(marbles, values, error);\n var subject = new HotObservable_1.HotObservable(messages, this);\n this.hotObservables.push(subject);\n return subject;\n };\n TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {\n var _this = this;\n var messages = [];\n observable.subscribe(function (value) {\n messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createNext(value) });\n }, function (err) {\n messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createError(err) });\n }, function () {\n messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createComplete() });\n });\n return messages;\n };\n TestScheduler.prototype.expectObservable = function (observable, unsubscriptionMarbles) {\n var _this = this;\n if (unsubscriptionMarbles === void 0) { unsubscriptionMarbles = null; }\n var actual = [];\n var flushTest = { actual: actual, ready: false };\n var unsubscriptionFrame = TestScheduler\n .parseMarblesAsSubscriptions(unsubscriptionMarbles).unsubscribedFrame;\n var subscription;\n this.schedule(function () {\n subscription = observable.subscribe(function (x) {\n var value = x;\n // Support Observable-of-Observables\n if (x instanceof Observable_1.Observable) {\n value = _this.materializeInnerObservable(value, _this.frame);\n }\n actual.push({ frame: _this.frame, notification: Notification_1.Notification.createNext(value) });\n }, function (err) {\n actual.push({ frame: _this.frame, notification: Notification_1.Notification.createError(err) });\n }, function () {\n actual.push({ frame: _this.frame, notification: Notification_1.Notification.createComplete() });\n });\n }, 0);\n if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {\n this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);\n }\n this.flushTests.push(flushTest);\n return {\n toBe: function (marbles, values, errorValue) {\n flushTest.ready = true;\n flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true);\n }\n };\n };\n TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {\n var flushTest = { actual: actualSubscriptionLogs, ready: false };\n this.flushTests.push(flushTest);\n return {\n toBe: function (marbles) {\n var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;\n flushTest.ready = true;\n flushTest.expected = marblesArray.map(function (marbles) {\n return TestScheduler.parseMarblesAsSubscriptions(marbles);\n });\n }\n };\n };\n TestScheduler.prototype.flush = function () {\n var hotObservables = this.hotObservables;\n while (hotObservables.length > 0) {\n hotObservables.shift().setup();\n }\n _super.prototype.flush.call(this);\n var readyFlushTests = this.flushTests.filter(function (test) { return test.ready; });\n while (readyFlushTests.length > 0) {\n var test = readyFlushTests.shift();\n this.assertDeepEqual(test.actual, test.expected);\n }\n };\n TestScheduler.parseMarblesAsSubscriptions = function (marbles) {\n if (typeof marbles !== 'string') {\n return new SubscriptionLog_1.SubscriptionLog(Number.POSITIVE_INFINITY);\n }\n var len = marbles.length;\n var groupStart = -1;\n var subscriptionFrame = Number.POSITIVE_INFINITY;\n var unsubscriptionFrame = Number.POSITIVE_INFINITY;\n for (var i = 0; i < len; i++) {\n var frame = i * this.frameTimeFactor;\n var c = marbles[i];\n switch (c) {\n case '-':\n case ' ':\n break;\n case '(':\n groupStart = frame;\n break;\n case ')':\n groupStart = -1;\n break;\n case '^':\n if (subscriptionFrame !== Number.POSITIVE_INFINITY) {\n throw new Error('found a second subscription point \\'^\\' in a ' +\n 'subscription marble diagram. There can only be one.');\n }\n subscriptionFrame = groupStart > -1 ? groupStart : frame;\n break;\n case '!':\n if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {\n throw new Error('found a second subscription point \\'^\\' in a ' +\n 'subscription marble diagram. There can only be one.');\n }\n unsubscriptionFrame = groupStart > -1 ? groupStart : frame;\n break;\n default:\n throw new Error('there can only be \\'^\\' and \\'!\\' markers in a ' +\n 'subscription marble diagram. Found instead \\'' + c + '\\'.');\n }\n }\n if (unsubscriptionFrame < 0) {\n return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame);\n }\n else {\n return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame, unsubscriptionFrame);\n }\n };\n TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables) {\n if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }\n if (marbles.indexOf('!') !== -1) {\n throw new Error('conventional marble diagrams cannot have the ' +\n 'unsubscription marker \"!\"');\n }\n var len = marbles.length;\n var testMessages = [];\n var subIndex = marbles.indexOf('^');\n var frameOffset = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);\n var getValue = typeof values !== 'object' ?\n function (x) { return x; } :\n function (x) {\n // Support Observable-of-Observables\n if (materializeInnerObservables && values[x] instanceof ColdObservable_1.ColdObservable) {\n return values[x].messages;\n }\n return values[x];\n };\n var groupStart = -1;\n for (var i = 0; i < len; i++) {\n var frame = i * this.frameTimeFactor + frameOffset;\n var notification = void 0;\n var c = marbles[i];\n switch (c) {\n case '-':\n case ' ':\n break;\n case '(':\n groupStart = frame;\n break;\n case ')':\n groupStart = -1;\n break;\n case '|':\n notification = Notification_1.Notification.createComplete();\n break;\n case '^':\n break;\n case '#':\n notification = Notification_1.Notification.createError(errorValue || 'error');\n break;\n default:\n notification = Notification_1.Notification.createNext(getValue(c));\n break;\n }\n if (notification) {\n testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });\n }\n }\n return testMessages;\n };\n return TestScheduler;\n}(VirtualTimeScheduler_1.VirtualTimeScheduler));\nexports.TestScheduler = TestScheduler;\n//# sourceMappingURL=TestScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3Rlc3RpbmcvVGVzdFNjaGVkdWxlci5qcz9mNTc4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgT2JzZXJ2YWJsZV8xID0gcmVxdWlyZSgnLi4vT2JzZXJ2YWJsZScpO1xudmFyIE5vdGlmaWNhdGlvbl8xID0gcmVxdWlyZSgnLi4vTm90aWZpY2F0aW9uJyk7XG52YXIgQ29sZE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4vQ29sZE9ic2VydmFibGUnKTtcbnZhciBIb3RPYnNlcnZhYmxlXzEgPSByZXF1aXJlKCcuL0hvdE9ic2VydmFibGUnKTtcbnZhciBTdWJzY3JpcHRpb25Mb2dfMSA9IHJlcXVpcmUoJy4vU3Vic2NyaXB0aW9uTG9nJyk7XG52YXIgVmlydHVhbFRpbWVTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4uL3NjaGVkdWxlci9WaXJ0dWFsVGltZVNjaGVkdWxlcicpO1xudmFyIGRlZmF1bHRNYXhGcmFtZSA9IDc1MDtcbnZhciBUZXN0U2NoZWR1bGVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGVzdFNjaGVkdWxlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUZXN0U2NoZWR1bGVyKGFzc2VydERlZXBFcXVhbCkge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBWaXJ0dWFsVGltZVNjaGVkdWxlcl8xLlZpcnR1YWxBY3Rpb24sIGRlZmF1bHRNYXhGcmFtZSk7XG4gICAgICAgIHRoaXMuYXNzZXJ0RGVlcEVxdWFsID0gYXNzZXJ0RGVlcEVxdWFsO1xuICAgICAgICB0aGlzLmhvdE9ic2VydmFibGVzID0gW107XG4gICAgICAgIHRoaXMuY29sZE9ic2VydmFibGVzID0gW107XG4gICAgICAgIHRoaXMuZmx1c2hUZXN0cyA9IFtdO1xuICAgIH1cbiAgICBUZXN0U2NoZWR1bGVyLnByb3RvdHlwZS5jcmVhdGVUaW1lID0gZnVuY3Rpb24gKG1hcmJsZXMpIHtcbiAgICAgICAgdmFyIGluZGV4T2YgPSBtYXJibGVzLmluZGV4T2YoJ3wnKTtcbiAgICAgICAgaWYgKGluZGV4T2YgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hcmJsZSBkaWFncmFtIGZvciB0aW1lIHNob3VsZCBoYXZlIGEgY29tcGxldGlvbiBtYXJrZXIgXCJ8XCInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXhPZiAqIFRlc3RTY2hlZHVsZXIuZnJhbWVUaW1lRmFjdG9yO1xuICAgIH07XG4gICAgVGVzdFNjaGVkdWxlci5wcm90b3R5cGUuY3JlYXRlQ29sZE9ic2VydmFibGUgPSBmdW5jdGlvbiAobWFyYmxlcywgdmFsdWVzLCBlcnJvcikge1xuICAgICAgICBpZiAobWFyYmxlcy5pbmRleE9mKCdeJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbGQgb2JzZXJ2YWJsZSBjYW5ub3QgaGF2ZSBzdWJzY3JpcHRpb24gb2Zmc2V0IFwiXlwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmJsZXMuaW5kZXhPZignIScpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2xkIG9ic2VydmFibGUgY2Fubm90IGhhdmUgdW5zdWJzY3JpcHRpb24gbWFya2VyIFwiIVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gVGVzdFNjaGVkdWxlci5wYXJzZU1hcmJsZXMobWFyYmxlcywgdmFsdWVzLCBlcnJvcik7XG4gICAgICAgIHZhciBjb2xkID0gbmV3IENvbGRPYnNlcnZhYmxlXzEuQ29sZE9ic2VydmFibGUobWVzc2FnZXMsIHRoaXMpO1xuICAgICAgICB0aGlzLmNvbGRPYnNlcnZhYmxlcy5wdXNoKGNvbGQpO1xuICAgICAgICByZXR1cm4gY29sZDtcbiAgICB9O1xuICAgIFRlc3RTY2hlZHVsZXIucHJvdG90eXBlLmNyZWF0ZUhvdE9ic2VydmFibGUgPSBmdW5jdGlvbiAobWFyYmxlcywgdmFsdWVzLCBlcnJvcikge1xuICAgICAgICBpZiAobWFyYmxlcy5pbmRleE9mKCchJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvdCBvYnNlcnZhYmxlIGNhbm5vdCBoYXZlIHVuc3Vic2NyaXB0aW9uIG1hcmtlciBcIiFcIicpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXNzYWdlcyA9IFRlc3RTY2hlZHVsZXIucGFyc2VNYXJibGVzKG1hcmJsZXMsIHZhbHVlcywgZXJyb3IpO1xuICAgICAgICB2YXIgc3ViamVjdCA9IG5ldyBIb3RPYnNlcnZhYmxlXzEuSG90T2JzZXJ2YWJsZShtZXNzYWdlcywgdGhpcyk7XG4gICAgICAgIHRoaXMuaG90T2JzZXJ2YWJsZXMucHVzaChzdWJqZWN0KTtcbiAgICAgICAgcmV0dXJuIHN1YmplY3Q7XG4gICAgfTtcbiAgICBUZXN0U2NoZWR1bGVyLnByb3RvdHlwZS5tYXRlcmlhbGl6ZUlubmVyT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlLCBvdXRlckZyYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtZXNzYWdlcyA9IFtdO1xuICAgICAgICBvYnNlcnZhYmxlLnN1YnNjcmliZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goeyBmcmFtZTogX3RoaXMuZnJhbWUgLSBvdXRlckZyYW1lLCBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbi5jcmVhdGVOZXh0KHZhbHVlKSB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgbWVzc2FnZXMucHVzaCh7IGZyYW1lOiBfdGhpcy5mcmFtZSAtIG91dGVyRnJhbWUsIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZUVycm9yKGVycikgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goeyBmcmFtZTogX3RoaXMuZnJhbWUgLSBvdXRlckZyYW1lLCBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgIH07XG4gICAgVGVzdFNjaGVkdWxlci5wcm90b3R5cGUuZXhwZWN0T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvYnNlcnZhYmxlLCB1bnN1YnNjcmlwdGlvbk1hcmJsZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHVuc3Vic2NyaXB0aW9uTWFyYmxlcyA9PT0gdm9pZCAwKSB7IHVuc3Vic2NyaXB0aW9uTWFyYmxlcyA9IG51bGw7IH1cbiAgICAgICAgdmFyIGFjdHVhbCA9IFtdO1xuICAgICAgICB2YXIgZmx1c2hUZXN0ID0geyBhY3R1YWw6IGFjdHVhbCwgcmVhZHk6IGZhbHNlIH07XG4gICAgICAgIHZhciB1bnN1YnNjcmlwdGlvbkZyYW1lID0gVGVzdFNjaGVkdWxlclxuICAgICAgICAgICAgLnBhcnNlTWFyYmxlc0FzU3Vic2NyaXB0aW9ucyh1bnN1YnNjcmlwdGlvbk1hcmJsZXMpLnVuc3Vic2NyaWJlZEZyYW1lO1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uO1xuICAgICAgICB0aGlzLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG9ic2VydmFibGUuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0geDtcbiAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IE9ic2VydmFibGUtb2YtT2JzZXJ2YWJsZXNcbiAgICAgICAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIE9ic2VydmFibGVfMS5PYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX3RoaXMubWF0ZXJpYWxpemVJbm5lck9ic2VydmFibGUodmFsdWUsIF90aGlzLmZyYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWN0dWFsLnB1c2goeyBmcmFtZTogX3RoaXMuZnJhbWUsIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQodmFsdWUpIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGFjdHVhbC5wdXNoKHsgZnJhbWU6IF90aGlzLmZyYW1lLCBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGFjdHVhbC5wdXNoKHsgZnJhbWU6IF90aGlzLmZyYW1lLCBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbl8xLk5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICBpZiAodW5zdWJzY3JpcHRpb25GcmFtZSAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyB9LCB1bnN1YnNjcmlwdGlvbkZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZsdXNoVGVzdHMucHVzaChmbHVzaFRlc3QpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9CZTogZnVuY3Rpb24gKG1hcmJsZXMsIHZhbHVlcywgZXJyb3JWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZsdXNoVGVzdC5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZmx1c2hUZXN0LmV4cGVjdGVkID0gVGVzdFNjaGVkdWxlci5wYXJzZU1hcmJsZXMobWFyYmxlcywgdmFsdWVzLCBlcnJvclZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRlc3RTY2hlZHVsZXIucHJvdG90eXBlLmV4cGVjdFN1YnNjcmlwdGlvbnMgPSBmdW5jdGlvbiAoYWN0dWFsU3Vic2NyaXB0aW9uTG9ncykge1xuICAgICAgICB2YXIgZmx1c2hUZXN0ID0geyBhY3R1YWw6IGFjdHVhbFN1YnNjcmlwdGlvbkxvZ3MsIHJlYWR5OiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmZsdXNoVGVzdHMucHVzaChmbHVzaFRlc3QpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9CZTogZnVuY3Rpb24gKG1hcmJsZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWFyYmxlc0FycmF5ID0gKHR5cGVvZiBtYXJibGVzID09PSAnc3RyaW5nJykgPyBbbWFyYmxlc10gOiBtYXJibGVzO1xuICAgICAgICAgICAgICAgIGZsdXNoVGVzdC5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZmx1c2hUZXN0LmV4cGVjdGVkID0gbWFyYmxlc0FycmF5Lm1hcChmdW5jdGlvbiAobWFyYmxlcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGVzdFNjaGVkdWxlci5wYXJzZU1hcmJsZXNBc1N1YnNjcmlwdGlvbnMobWFyYmxlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBUZXN0U2NoZWR1bGVyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGhvdE9ic2VydmFibGVzID0gdGhpcy5ob3RPYnNlcnZhYmxlcztcbiAgICAgICAgd2hpbGUgKGhvdE9ic2VydmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhvdE9ic2VydmFibGVzLnNoaWZ0KCkuc2V0dXAoKTtcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7XG4gICAgICAgIHZhciByZWFkeUZsdXNoVGVzdHMgPSB0aGlzLmZsdXNoVGVzdHMuZmlsdGVyKGZ1bmN0aW9uICh0ZXN0KSB7IHJldHVybiB0ZXN0LnJlYWR5OyB9KTtcbiAgICAgICAgd2hpbGUgKHJlYWR5Rmx1c2hUZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgdGVzdCA9IHJlYWR5Rmx1c2hUZXN0cy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5hc3NlcnREZWVwRXF1YWwodGVzdC5hY3R1YWwsIHRlc3QuZXhwZWN0ZWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUZXN0U2NoZWR1bGVyLnBhcnNlTWFyYmxlc0FzU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIChtYXJibGVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbWFyYmxlcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uTG9nXzEuU3Vic2NyaXB0aW9uTG9nKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbiA9IG1hcmJsZXMubGVuZ3RoO1xuICAgICAgICB2YXIgZ3JvdXBTdGFydCA9IC0xO1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uRnJhbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIHZhciB1bnN1YnNjcmlwdGlvbkZyYW1lID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZnJhbWUgPSBpICogdGhpcy5mcmFtZVRpbWVGYWN0b3I7XG4gICAgICAgICAgICB2YXIgYyA9IG1hcmJsZXNbaV07XG4gICAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnKCc6XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU3RhcnQgPSBmcmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnKSc6XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwU3RhcnQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25GcmFtZSAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZvdW5kIGEgc2Vjb25kIHN1YnNjcmlwdGlvbiBwb2ludCBcXCdeXFwnIGluIGEgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiBtYXJibGUgZGlhZ3JhbS4gVGhlcmUgY2FuIG9ubHkgYmUgb25lLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbkZyYW1lID0gZ3JvdXBTdGFydCA+IC0xID8gZ3JvdXBTdGFydCA6IGZyYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaXB0aW9uRnJhbWUgIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZCBhIHNlY29uZCBzdWJzY3JpcHRpb24gcG9pbnQgXFwnXlxcJyBpbiBhICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gbWFyYmxlIGRpYWdyYW0uIFRoZXJlIGNhbiBvbmx5IGJlIG9uZS4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmlwdGlvbkZyYW1lID0gZ3JvdXBTdGFydCA+IC0xID8gZ3JvdXBTdGFydCA6IGZyYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZXJlIGNhbiBvbmx5IGJlIFxcJ15cXCcgYW5kIFxcJyFcXCcgbWFya2VycyBpbiBhICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiBtYXJibGUgZGlhZ3JhbS4gRm91bmQgaW5zdGVhZCBcXCcnICsgYyArICdcXCcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuc3Vic2NyaXB0aW9uRnJhbWUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbkxvZ18xLlN1YnNjcmlwdGlvbkxvZyhzdWJzY3JpcHRpb25GcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbkxvZ18xLlN1YnNjcmlwdGlvbkxvZyhzdWJzY3JpcHRpb25GcmFtZSwgdW5zdWJzY3JpcHRpb25GcmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlc3RTY2hlZHVsZXIucGFyc2VNYXJibGVzID0gZnVuY3Rpb24gKG1hcmJsZXMsIHZhbHVlcywgZXJyb3JWYWx1ZSwgbWF0ZXJpYWxpemVJbm5lck9ic2VydmFibGVzKSB7XG4gICAgICAgIGlmIChtYXRlcmlhbGl6ZUlubmVyT2JzZXJ2YWJsZXMgPT09IHZvaWQgMCkgeyBtYXRlcmlhbGl6ZUlubmVyT2JzZXJ2YWJsZXMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAobWFyYmxlcy5pbmRleE9mKCchJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnZlbnRpb25hbCBtYXJibGUgZGlhZ3JhbXMgY2Fubm90IGhhdmUgdGhlICcgK1xuICAgICAgICAgICAgICAgICd1bnN1YnNjcmlwdGlvbiBtYXJrZXIgXCIhXCInKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuID0gbWFyYmxlcy5sZW5ndGg7XG4gICAgICAgIHZhciB0ZXN0TWVzc2FnZXMgPSBbXTtcbiAgICAgICAgdmFyIHN1YkluZGV4ID0gbWFyYmxlcy5pbmRleE9mKCdeJyk7XG4gICAgICAgIHZhciBmcmFtZU9mZnNldCA9IHN1YkluZGV4ID09PSAtMSA/IDAgOiAoc3ViSW5kZXggKiAtdGhpcy5mcmFtZVRpbWVGYWN0b3IpO1xuICAgICAgICB2YXIgZ2V0VmFsdWUgPSB0eXBlb2YgdmFsdWVzICE9PSAnb2JqZWN0JyA/XG4gICAgICAgICAgICBmdW5jdGlvbiAoeCkgeyByZXR1cm4geDsgfSA6XG4gICAgICAgICAgICBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgT2JzZXJ2YWJsZS1vZi1PYnNlcnZhYmxlc1xuICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbGl6ZUlubmVyT2JzZXJ2YWJsZXMgJiYgdmFsdWVzW3hdIGluc3RhbmNlb2YgQ29sZE9ic2VydmFibGVfMS5Db2xkT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzW3hdLm1lc3NhZ2VzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzW3hdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgdmFyIGdyb3VwU3RhcnQgPSAtMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGZyYW1lID0gaSAqIHRoaXMuZnJhbWVUaW1lRmFjdG9yICsgZnJhbWVPZmZzZXQ7XG4gICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIGMgPSBtYXJibGVzW2ldO1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJygnOlxuICAgICAgICAgICAgICAgICAgICBncm91cFN0YXJ0ID0gZnJhbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyknOlxuICAgICAgICAgICAgICAgICAgICBncm91cFN0YXJ0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gPSBOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gPSBOb3RpZmljYXRpb25fMS5Ob3RpZmljYXRpb24uY3JlYXRlRXJyb3IoZXJyb3JWYWx1ZSB8fCAnZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uXzEuTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQoZ2V0VmFsdWUoYykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0ZXN0TWVzc2FnZXMucHVzaCh7IGZyYW1lOiBncm91cFN0YXJ0ID4gLTEgPyBncm91cFN0YXJ0IDogZnJhbWUsIG5vdGlmaWNhdGlvbjogbm90aWZpY2F0aW9uIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXN0TWVzc2FnZXM7XG4gICAgfTtcbiAgICByZXR1cm4gVGVzdFNjaGVkdWxlcjtcbn0oVmlydHVhbFRpbWVTY2hlZHVsZXJfMS5WaXJ0dWFsVGltZVNjaGVkdWxlcikpO1xuZXhwb3J0cy5UZXN0U2NoZWR1bGVyID0gVGVzdFNjaGVkdWxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRlc3RTY2hlZHVsZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdGVzdGluZy9UZXN0U2NoZWR1bGVyLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTVcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1677. /***/ },
  1678. /* 656 */
  1679. /***/ function(module, exports, __webpack_require__) {
  1680. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Observable_1 = __webpack_require__(6);\nvar Subscription_1 = __webpack_require__(11);\nvar SubscriptionLoggable_1 = __webpack_require__(657);\nvar applyMixins_1 = __webpack_require__(659);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar ColdObservable = (function (_super) {\n __extends(ColdObservable, _super);\n function ColdObservable(messages, scheduler) {\n _super.call(this, function (subscriber) {\n var observable = this;\n var index = observable.logSubscribedFrame();\n subscriber.add(new Subscription_1.Subscription(function () {\n observable.logUnsubscribedFrame(index);\n }));\n observable.scheduleMessages(subscriber);\n return subscriber;\n });\n this.messages = messages;\n this.subscriptions = [];\n this.scheduler = scheduler;\n }\n ColdObservable.prototype.scheduleMessages = function (subscriber) {\n var messagesLength = this.messages.length;\n for (var i = 0; i < messagesLength; i++) {\n var message = this.messages[i];\n subscriber.add(this.scheduler.schedule(function (_a) {\n var message = _a.message, subscriber = _a.subscriber;\n message.notification.observe(subscriber);\n }, message.frame, { message: message, subscriber: subscriber }));\n }\n };\n return ColdObservable;\n}(Observable_1.Observable));\nexports.ColdObservable = ColdObservable;\napplyMixins_1.applyMixins(ColdObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);\n//# sourceMappingURL=ColdObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3Rlc3RpbmcvQ29sZE9ic2VydmFibGUuanM/YmQ3NyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59O1xudmFyIE9ic2VydmFibGVfMSA9IHJlcXVpcmUoJy4uL09ic2VydmFibGUnKTtcbnZhciBTdWJzY3JpcHRpb25fMSA9IHJlcXVpcmUoJy4uL1N1YnNjcmlwdGlvbicpO1xudmFyIFN1YnNjcmlwdGlvbkxvZ2dhYmxlXzEgPSByZXF1aXJlKCcuL1N1YnNjcmlwdGlvbkxvZ2dhYmxlJyk7XG52YXIgYXBwbHlNaXhpbnNfMSA9IHJlcXVpcmUoJy4uL3V0aWwvYXBwbHlNaXhpbnMnKTtcbi8qKlxuICogV2UgbmVlZCB0aGlzIEpTRG9jIGNvbW1lbnQgZm9yIGFmZmVjdGluZyBFU0RvYy5cbiAqIEBpZ25vcmVcbiAqIEBleHRlbmRzIHtJZ25vcmVkfVxuICovXG52YXIgQ29sZE9ic2VydmFibGUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb2xkT2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb2xkT2JzZXJ2YWJsZShtZXNzYWdlcywgc2NoZWR1bGVyKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBvYnNlcnZhYmxlLmxvZ1N1YnNjcmliZWRGcmFtZSgpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQobmV3IFN1YnNjcmlwdGlvbl8xLlN1YnNjcmlwdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2YWJsZS5sb2dVbnN1YnNjcmliZWRGcmFtZShpbmRleCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLnNjaGVkdWxlTWVzc2FnZXMoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICBDb2xkT2JzZXJ2YWJsZS5wcm90b3R5cGUuc2NoZWR1bGVNZXNzYWdlcyA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBtZXNzYWdlc0xlbmd0aCA9IHRoaXMubWVzc2FnZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lc3NhZ2VzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tpXTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gX2EubWVzc2FnZSwgc3Vic2NyaWJlciA9IF9hLnN1YnNjcmliZXI7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5ub3RpZmljYXRpb24ub2JzZXJ2ZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH0sIG1lc3NhZ2UuZnJhbWUsIHsgbWVzc2FnZTogbWVzc2FnZSwgc3Vic2NyaWJlcjogc3Vic2NyaWJlciB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb2xkT2JzZXJ2YWJsZTtcbn0oT2JzZXJ2YWJsZV8xLk9ic2VydmFibGUpKTtcbmV4cG9ydHMuQ29sZE9ic2VydmFibGUgPSBDb2xkT2JzZXJ2YWJsZTtcbmFwcGx5TWl4aW5zXzEuYXBwbHlNaXhpbnMoQ29sZE9ic2VydmFibGUsIFtTdWJzY3JpcHRpb25Mb2dnYWJsZV8xLlN1YnNjcmlwdGlvbkxvZ2dhYmxlXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db2xkT2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy90ZXN0aW5nL0NvbGRPYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTZcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1681. /***/ },
  1682. /* 657 */
  1683. /***/ function(module, exports, __webpack_require__) {
  1684. eval("\"use strict\";\nvar SubscriptionLog_1 = __webpack_require__(658);\nvar SubscriptionLoggable = (function () {\n function SubscriptionLoggable() {\n this.subscriptions = [];\n }\n SubscriptionLoggable.prototype.logSubscribedFrame = function () {\n this.subscriptions.push(new SubscriptionLog_1.SubscriptionLog(this.scheduler.now()));\n return this.subscriptions.length - 1;\n };\n SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {\n var subscriptionLogs = this.subscriptions;\n var oldSubscriptionLog = subscriptionLogs[index];\n subscriptionLogs[index] = new SubscriptionLog_1.SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());\n };\n return SubscriptionLoggable;\n}());\nexports.SubscriptionLoggable = SubscriptionLoggable;\n//# sourceMappingURL=SubscriptionLoggable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3Rlc3RpbmcvU3Vic2NyaXB0aW9uTG9nZ2FibGUuanM/NmMzZiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBTdWJzY3JpcHRpb25Mb2dfMSA9IHJlcXVpcmUoJy4vU3Vic2NyaXB0aW9uTG9nJyk7XG52YXIgU3Vic2NyaXB0aW9uTG9nZ2FibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbkxvZ2dhYmxlKCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgU3Vic2NyaXB0aW9uTG9nZ2FibGUucHJvdG90eXBlLmxvZ1N1YnNjcmliZWRGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gobmV3IFN1YnNjcmlwdGlvbkxvZ18xLlN1YnNjcmlwdGlvbkxvZyh0aGlzLnNjaGVkdWxlci5ub3coKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb25Mb2dnYWJsZS5wcm90b3R5cGUubG9nVW5zdWJzY3JpYmVkRnJhbWUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbkxvZ3MgPSB0aGlzLnN1YnNjcmlwdGlvbnM7XG4gICAgICAgIHZhciBvbGRTdWJzY3JpcHRpb25Mb2cgPSBzdWJzY3JpcHRpb25Mb2dzW2luZGV4XTtcbiAgICAgICAgc3Vic2NyaXB0aW9uTG9nc1tpbmRleF0gPSBuZXcgU3Vic2NyaXB0aW9uTG9nXzEuU3Vic2NyaXB0aW9uTG9nKG9sZFN1YnNjcmlwdGlvbkxvZy5zdWJzY3JpYmVkRnJhbWUsIHRoaXMuc2NoZWR1bGVyLm5vdygpKTtcbiAgICB9O1xuICAgIHJldHVybiBTdWJzY3JpcHRpb25Mb2dnYWJsZTtcbn0oKSk7XG5leHBvcnRzLlN1YnNjcmlwdGlvbkxvZ2dhYmxlID0gU3Vic2NyaXB0aW9uTG9nZ2FibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJzY3JpcHRpb25Mb2dnYWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy90ZXN0aW5nL1N1YnNjcmlwdGlvbkxvZ2dhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTdcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1685. /***/ },
  1686. /* 658 */
  1687. /***/ function(module, exports) {
  1688. eval("\"use strict\";\nvar SubscriptionLog = (function () {\n function SubscriptionLog(subscribedFrame, unsubscribedFrame) {\n if (unsubscribedFrame === void 0) { unsubscribedFrame = Number.POSITIVE_INFINITY; }\n this.subscribedFrame = subscribedFrame;\n this.unsubscribedFrame = unsubscribedFrame;\n }\n return SubscriptionLog;\n}());\nexports.SubscriptionLog = SubscriptionLog;\n//# sourceMappingURL=SubscriptionLog.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3Rlc3RpbmcvU3Vic2NyaXB0aW9uTG9nLmpzPzkyMjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgU3Vic2NyaXB0aW9uTG9nID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdWJzY3JpcHRpb25Mb2coc3Vic2NyaWJlZEZyYW1lLCB1bnN1YnNjcmliZWRGcmFtZSkge1xuICAgICAgICBpZiAodW5zdWJzY3JpYmVkRnJhbWUgPT09IHZvaWQgMCkgeyB1bnN1YnNjcmliZWRGcmFtZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgICAgICB0aGlzLnN1YnNjcmliZWRGcmFtZSA9IHN1YnNjcmliZWRGcmFtZTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZWRGcmFtZSA9IHVuc3Vic2NyaWJlZEZyYW1lO1xuICAgIH1cbiAgICByZXR1cm4gU3Vic2NyaXB0aW9uTG9nO1xufSgpKTtcbmV4cG9ydHMuU3Vic2NyaXB0aW9uTG9nID0gU3Vic2NyaXB0aW9uTG9nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3Vic2NyaXB0aW9uTG9nLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3Rlc3RpbmcvU3Vic2NyaXB0aW9uTG9nLmpzXG4vLyBtb2R1bGUgaWQgPSA2NThcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");
  1689. /***/ },
  1690. /* 659 */
  1691. /***/ function(module, exports) {
  1692. eval("\"use strict\";\nfunction applyMixins(derivedCtor, baseCtors) {\n for (var i = 0, len = baseCtors.length; i < len; i++) {\n var baseCtor = baseCtors[i];\n var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);\n for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {\n var name_1 = propertyKeys[j];\n derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];\n }\n }\n}\nexports.applyMixins = applyMixins;\n//# sourceMappingURL=applyMixins.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvYXBwbHlNaXhpbnMuanM/NDc4YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGRlcml2ZWRDdG9yLCBiYXNlQ3RvcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYmFzZUN0b3JzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBiYXNlQ3RvciA9IGJhc2VDdG9yc1tpXTtcbiAgICAgICAgdmFyIHByb3BlcnR5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJhc2VDdG9yLnByb3RvdHlwZSk7XG4gICAgICAgIGZvciAodmFyIGogPSAwLCBsZW4yID0gcHJvcGVydHlLZXlzLmxlbmd0aDsgaiA8IGxlbjI7IGorKykge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHByb3BlcnR5S2V5c1tqXTtcbiAgICAgICAgICAgIGRlcml2ZWRDdG9yLnByb3RvdHlwZVtuYW1lXzFdID0gYmFzZUN0b3IucHJvdG90eXBlW25hbWVfMV07XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmFwcGx5TWl4aW5zID0gYXBwbHlNaXhpbnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHBseU1peGlucy5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy91dGlsL2FwcGx5TWl4aW5zLmpzXG4vLyBtb2R1bGUgaWQgPSA2NTlcbi8vIG1vZHVsZSBjaHVua3MgPSAyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1693. /***/ },
  1694. /* 660 */
  1695. /***/ function(module, exports, __webpack_require__) {
  1696. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Subject_1 = __webpack_require__(5);\nvar Subscription_1 = __webpack_require__(11);\nvar SubscriptionLoggable_1 = __webpack_require__(657);\nvar applyMixins_1 = __webpack_require__(659);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar HotObservable = (function (_super) {\n __extends(HotObservable, _super);\n function HotObservable(messages, scheduler) {\n _super.call(this);\n this.messages = messages;\n this.subscriptions = [];\n this.scheduler = scheduler;\n }\n HotObservable.prototype._subscribe = function (subscriber) {\n var subject = this;\n var index = subject.logSubscribedFrame();\n subscriber.add(new Subscription_1.Subscription(function () {\n subject.logUnsubscribedFrame(index);\n }));\n return _super.prototype._subscribe.call(this, subscriber);\n };\n HotObservable.prototype.setup = function () {\n var subject = this;\n var messagesLength = subject.messages.length;\n /* tslint:disable:no-var-keyword */\n for (var i = 0; i < messagesLength; i++) {\n (function () {\n var message = subject.messages[i];\n /* tslint:enable */\n subject.scheduler.schedule(function () { message.notification.observe(subject); }, message.frame);\n })();\n }\n };\n return HotObservable;\n}(Subject_1.Subject));\nexports.HotObservable = HotObservable;\napplyMixins_1.applyMixins(HotObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);\n//# sourceMappingURL=HotObservable.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3Rlc3RpbmcvSG90T2JzZXJ2YWJsZS5qcz9hZmI3Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgU3ViamVjdF8xID0gcmVxdWlyZSgnLi4vU3ViamVjdCcpO1xudmFyIFN1YnNjcmlwdGlvbl8xID0gcmVxdWlyZSgnLi4vU3Vic2NyaXB0aW9uJyk7XG52YXIgU3Vic2NyaXB0aW9uTG9nZ2FibGVfMSA9IHJlcXVpcmUoJy4vU3Vic2NyaXB0aW9uTG9nZ2FibGUnKTtcbnZhciBhcHBseU1peGluc18xID0gcmVxdWlyZSgnLi4vdXRpbC9hcHBseU1peGlucycpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBIb3RPYnNlcnZhYmxlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSG90T2JzZXJ2YWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBIb3RPYnNlcnZhYmxlKG1lc3NhZ2VzLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIH1cbiAgICBIb3RPYnNlcnZhYmxlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzO1xuICAgICAgICB2YXIgaW5kZXggPSBzdWJqZWN0LmxvZ1N1YnNjcmliZWRGcmFtZSgpO1xuICAgICAgICBzdWJzY3JpYmVyLmFkZChuZXcgU3Vic2NyaXB0aW9uXzEuU3Vic2NyaXB0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN1YmplY3QubG9nVW5zdWJzY3JpYmVkRnJhbWUoaW5kZXgpO1xuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9zdWJzY3JpYmUuY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTtcbiAgICB9O1xuICAgIEhvdE9ic2VydmFibGUucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3ViamVjdCA9IHRoaXM7XG4gICAgICAgIHZhciBtZXNzYWdlc0xlbmd0aCA9IHN1YmplY3QubWVzc2FnZXMubGVuZ3RoO1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby12YXIta2V5d29yZCAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lc3NhZ2VzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBzdWJqZWN0Lm1lc3NhZ2VzW2ldO1xuICAgICAgICAgICAgICAgIC8qIHRzbGludDplbmFibGUgKi9cbiAgICAgICAgICAgICAgICBzdWJqZWN0LnNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7IG1lc3NhZ2Uubm90aWZpY2F0aW9uLm9ic2VydmUoc3ViamVjdCk7IH0sIG1lc3NhZ2UuZnJhbWUpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEhvdE9ic2VydmFibGU7XG59KFN1YmplY3RfMS5TdWJqZWN0KSk7XG5leHBvcnRzLkhvdE9ic2VydmFibGUgPSBIb3RPYnNlcnZhYmxlO1xuYXBwbHlNaXhpbnNfMS5hcHBseU1peGlucyhIb3RPYnNlcnZhYmxlLCBbU3Vic2NyaXB0aW9uTG9nZ2FibGVfMS5TdWJzY3JpcHRpb25Mb2dnYWJsZV0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SG90T2JzZXJ2YWJsZS5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcnhqcy90ZXN0aW5nL0hvdE9ic2VydmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDY2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1697. /***/ },
  1698. /* 661 */
  1699. /***/ function(module, exports, __webpack_require__) {
  1700. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncAction_1 = __webpack_require__(415);\nvar AsyncScheduler_1 = __webpack_require__(417);\nvar VirtualTimeScheduler = (function (_super) {\n __extends(VirtualTimeScheduler, _super);\n function VirtualTimeScheduler(SchedulerAction, maxFrames) {\n var _this = this;\n if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }\n if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }\n _super.call(this, SchedulerAction, function () { return _this.frame; });\n this.maxFrames = maxFrames;\n this.frame = 0;\n this.index = -1;\n }\n /**\n * Prompt the Scheduler to execute all of its queued actions, therefore\n * clearing its queue.\n * @return {void}\n */\n VirtualTimeScheduler.prototype.flush = function () {\n var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;\n var error, action;\n while ((action = actions.shift()) && (this.frame = action.delay) <= maxFrames) {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n }\n if (error) {\n while (action = actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n VirtualTimeScheduler.frameTimeFactor = 10;\n return VirtualTimeScheduler;\n}(AsyncScheduler_1.AsyncScheduler));\nexports.VirtualTimeScheduler = VirtualTimeScheduler;\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar VirtualAction = (function (_super) {\n __extends(VirtualAction, _super);\n function VirtualAction(scheduler, work, index) {\n if (index === void 0) { index = scheduler.index += 1; }\n _super.call(this, scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n this.index = index;\n this.index = scheduler.index = index;\n }\n VirtualAction.prototype.schedule = function (state, delay) {\n if (delay === void 0) { delay = 0; }\n return !this.id ?\n _super.prototype.schedule.call(this, state, delay) : this.add(new VirtualAction(this.scheduler, this.work)).schedule(state, delay);\n };\n VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n this.delay = scheduler.frame + delay;\n var actions = scheduler.actions;\n actions.push(this);\n actions.sort(VirtualAction.sortActions);\n return true;\n };\n VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n return undefined;\n };\n VirtualAction.sortActions = function (a, b) {\n if (a.delay === b.delay) {\n if (a.index === b.index) {\n return 0;\n }\n else if (a.index > b.index) {\n return 1;\n }\n else {\n return -1;\n }\n }\n else if (a.delay > b.delay) {\n return 1;\n }\n else {\n return -1;\n }\n };\n return VirtualAction;\n}(AsyncAction_1.AsyncAction));\nexports.VirtualAction = VirtualAction;\n//# sourceMappingURL=VirtualTimeScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9WaXJ0dWFsVGltZVNjaGVkdWxlci5qcz9iYmUzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXN5bmNBY3Rpb25fMSA9IHJlcXVpcmUoJy4vQXN5bmNBY3Rpb24nKTtcbnZhciBBc3luY1NjaGVkdWxlcl8xID0gcmVxdWlyZSgnLi9Bc3luY1NjaGVkdWxlcicpO1xudmFyIFZpcnR1YWxUaW1lU2NoZWR1bGVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVmlydHVhbFRpbWVTY2hlZHVsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVmlydHVhbFRpbWVTY2hlZHVsZXIoU2NoZWR1bGVyQWN0aW9uLCBtYXhGcmFtZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKFNjaGVkdWxlckFjdGlvbiA9PT0gdm9pZCAwKSB7IFNjaGVkdWxlckFjdGlvbiA9IFZpcnR1YWxBY3Rpb247IH1cbiAgICAgICAgaWYgKG1heEZyYW1lcyA9PT0gdm9pZCAwKSB7IG1heEZyYW1lcyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBTY2hlZHVsZXJBY3Rpb24sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmZyYW1lOyB9KTtcbiAgICAgICAgdGhpcy5tYXhGcmFtZXMgPSBtYXhGcmFtZXM7XG4gICAgICAgIHRoaXMuZnJhbWUgPSAwO1xuICAgICAgICB0aGlzLmluZGV4ID0gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21wdCB0aGUgU2NoZWR1bGVyIHRvIGV4ZWN1dGUgYWxsIG9mIGl0cyBxdWV1ZWQgYWN0aW9ucywgdGhlcmVmb3JlXG4gICAgICogY2xlYXJpbmcgaXRzIHF1ZXVlLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgVmlydHVhbFRpbWVTY2hlZHVsZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBhY3Rpb25zID0gX2EuYWN0aW9ucywgbWF4RnJhbWVzID0gX2EubWF4RnJhbWVzO1xuICAgICAgICB2YXIgZXJyb3IsIGFjdGlvbjtcbiAgICAgICAgd2hpbGUgKChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpICYmICh0aGlzLmZyYW1lID0gYWN0aW9uLmRlbGF5KSA8PSBtYXhGcmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFZpcnR1YWxUaW1lU2NoZWR1bGVyLmZyYW1lVGltZUZhY3RvciA9IDEwO1xuICAgIHJldHVybiBWaXJ0dWFsVGltZVNjaGVkdWxlcjtcbn0oQXN5bmNTY2hlZHVsZXJfMS5Bc3luY1NjaGVkdWxlcikpO1xuZXhwb3J0cy5WaXJ0dWFsVGltZVNjaGVkdWxlciA9IFZpcnR1YWxUaW1lU2NoZWR1bGVyO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBWaXJ0dWFsQWN0aW9uID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVmlydHVhbEFjdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBWaXJ0dWFsQWN0aW9uKHNjaGVkdWxlciwgd29yaywgaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHsgaW5kZXggPSBzY2hlZHVsZXIuaW5kZXggKz0gMTsgfVxuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy53b3JrID0gd29yaztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmluZGV4ID0gc2NoZWR1bGVyLmluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIFZpcnR1YWxBY3Rpb24ucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHN0YXRlLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgcmV0dXJuICF0aGlzLmlkID9cbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuc2NoZWR1bGUuY2FsbCh0aGlzLCBzdGF0ZSwgZGVsYXkpIDogdGhpcy5hZGQobmV3IFZpcnR1YWxBY3Rpb24odGhpcy5zY2hlZHVsZXIsIHRoaXMud29yaykpLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7XG4gICAgfTtcbiAgICBWaXJ0dWFsQWN0aW9uLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgdGhpcy5kZWxheSA9IHNjaGVkdWxlci5mcmFtZSArIGRlbGF5O1xuICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zO1xuICAgICAgICBhY3Rpb25zLnB1c2godGhpcyk7XG4gICAgICAgIGFjdGlvbnMuc29ydChWaXJ0dWFsQWN0aW9uLnNvcnRBY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBWaXJ0dWFsQWN0aW9uLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkgeyBkZWxheSA9IDA7IH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFZpcnR1YWxBY3Rpb24uc29ydEFjdGlvbnMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBpZiAoYS5kZWxheSA9PT0gYi5kZWxheSkge1xuICAgICAgICAgICAgaWYgKGEuaW5kZXggPT09IGIuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGEuaW5kZXggPiBiLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYS5kZWxheSA+IGIuZGVsYXkpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVmlydHVhbEFjdGlvbjtcbn0oQXN5bmNBY3Rpb25fMS5Bc3luY0FjdGlvbikpO1xuZXhwb3J0cy5WaXJ0dWFsQWN0aW9uID0gVmlydHVhbEFjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpcnR1YWxUaW1lU2NoZWR1bGVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9WaXJ0dWFsVGltZVNjaGVkdWxlci5qc1xuLy8gbW9kdWxlIGlkID0gNjYxXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1701. /***/ },
  1702. /* 662 */
  1703. /***/ function(module, exports, __webpack_require__) {
  1704. eval("\"use strict\";\nvar AnimationFrameAction_1 = __webpack_require__(663);\nvar AnimationFrameScheduler_1 = __webpack_require__(665);\nexports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);\n//# sourceMappingURL=animationFrame.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qcz9jYmMzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIEFuaW1hdGlvbkZyYW1lQWN0aW9uXzEgPSByZXF1aXJlKCcuL0FuaW1hdGlvbkZyYW1lQWN0aW9uJyk7XG52YXIgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXInKTtcbmV4cG9ydHMuYW5pbWF0aW9uRnJhbWUgPSBuZXcgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXJfMS5BbmltYXRpb25GcmFtZVNjaGVkdWxlcihBbmltYXRpb25GcmFtZUFjdGlvbl8xLkFuaW1hdGlvbkZyYW1lQWN0aW9uKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuaW1hdGlvbkZyYW1lLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9hbmltYXRpb25GcmFtZS5qc1xuLy8gbW9kdWxlIGlkID0gNjYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");
  1705. /***/ },
  1706. /* 663 */
  1707. /***/ function(module, exports, __webpack_require__) {
  1708. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncAction_1 = __webpack_require__(415);\nvar AnimationFrame_1 = __webpack_require__(664);\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nvar AnimationFrameAction = (function (_super) {\n __extends(AnimationFrameAction, _super);\n function AnimationFrameAction(scheduler, work) {\n _super.call(this, scheduler, work);\n this.scheduler = scheduler;\n this.work = work;\n }\n AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler.scheduled || (scheduler.scheduled = AnimationFrame_1.AnimationFrame.requestAnimationFrame(scheduler.flush.bind(scheduler, null)));\n };\n AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n if (delay === void 0) { delay = 0; }\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n }\n // If the scheduler queue is empty, cancel the requested animation frame and\n // set the scheduled flag to undefined so the next AnimationFrameAction will\n // request its own.\n if (scheduler.actions.length === 0) {\n AnimationFrame_1.AnimationFrame.cancelAnimationFrame(id);\n scheduler.scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n };\n return AnimationFrameAction;\n}(AsyncAction_1.AsyncAction));\nexports.AnimationFrameAction = AnimationFrameAction;\n//# sourceMappingURL=AnimationFrameAction.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZUFjdGlvbi5qcz80Zjk5Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXN5bmNBY3Rpb25fMSA9IHJlcXVpcmUoJy4vQXN5bmNBY3Rpb24nKTtcbnZhciBBbmltYXRpb25GcmFtZV8xID0gcmVxdWlyZSgnLi4vdXRpbC9BbmltYXRpb25GcmFtZScpO1xuLyoqXG4gKiBXZSBuZWVkIHRoaXMgSlNEb2MgY29tbWVudCBmb3IgYWZmZWN0aW5nIEVTRG9jLlxuICogQGlnbm9yZVxuICogQGV4dGVuZHMge0lnbm9yZWR9XG4gKi9cbnZhciBBbmltYXRpb25GcmFtZUFjdGlvbiA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFuaW1hdGlvbkZyYW1lQWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkZyYW1lQWN0aW9uKHNjaGVkdWxlciwgd29yaykge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspO1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgdGhpcy53b3JrID0gd29yaztcbiAgICB9XG4gICAgQW5pbWF0aW9uRnJhbWVBY3Rpb24ucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgICAgICAvLyBJZiBkZWxheSBpcyBncmVhdGVyIHRoYW4gMCwgcmVxdWVzdCBhcyBhbiBhc3luYyBhY3Rpb24uXG4gICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcywgc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFB1c2ggdGhlIGFjdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBzY2hlZHVsZXIgcXVldWUuXG4gICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7XG4gICAgICAgIC8vIElmIGFuIGFuaW1hdGlvbiBmcmFtZSBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZCwgZG9uJ3QgcmVxdWVzdCBhbm90aGVyXG4gICAgICAgIC8vIG9uZS4gSWYgYW4gYW5pbWF0aW9uIGZyYW1lIGhhc24ndCBiZWVuIHJlcXVlc3RlZCB5ZXQsIHJlcXVlc3Qgb25lLiBSZXR1cm5cbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZyYW1lIHJlcXVlc3QgaWQuXG4gICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVkIHx8IChzY2hlZHVsZXIuc2NoZWR1bGVkID0gQW5pbWF0aW9uRnJhbWVfMS5BbmltYXRpb25GcmFtZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCBudWxsKSkpO1xuICAgIH07XG4gICAgQW5pbWF0aW9uRnJhbWVBY3Rpb24ucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7IGRlbGF5ID0gMDsgfVxuICAgICAgICAvLyBJZiBkZWxheSBleGlzdHMgYW5kIGlzIGdyZWF0ZXIgdGhhbiAwLCBvciBpZiB0aGUgZGVsYXkgaXMgbnVsbCAodGhlXG4gICAgICAgIC8vIGFjdGlvbiB3YXNuJ3QgcmVzY2hlZHVsZWQpIGJ1dCB3YXMgb3JpZ2luYWxseSBzY2hlZHVsZWQgYXMgYW4gYXN5bmNcbiAgICAgICAgLy8gYWN0aW9uLCB0aGVuIHJlY3ljbGUgYXMgYW4gYXN5bmMgYWN0aW9uLlxuICAgICAgICBpZiAoKGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ID4gMCkgfHwgKGRlbGF5ID09PSBudWxsICYmIHRoaXMuZGVsYXkgPiAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIGlkLCBkZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHNjaGVkdWxlciBxdWV1ZSBpcyBlbXB0eSwgY2FuY2VsIHRoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uIGZyYW1lIGFuZFxuICAgICAgICAvLyBzZXQgdGhlIHNjaGVkdWxlZCBmbGFnIHRvIHVuZGVmaW5lZCBzbyB0aGUgbmV4dCBBbmltYXRpb25GcmFtZUFjdGlvbiB3aWxsXG4gICAgICAgIC8vIHJlcXVlc3QgaXRzIG93bi5cbiAgICAgICAgaWYgKHNjaGVkdWxlci5hY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQW5pbWF0aW9uRnJhbWVfMS5BbmltYXRpb25GcmFtZS5jYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgc28gdGhlIGFjdGlvbiBrbm93cyB0byByZXF1ZXN0IGEgbmV3IGFzeW5jIGlkIGlmIGl0J3MgcmVzY2hlZHVsZWQuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gQW5pbWF0aW9uRnJhbWVBY3Rpb247XG59KEFzeW5jQWN0aW9uXzEuQXN5bmNBY3Rpb24pKTtcbmV4cG9ydHMuQW5pbWF0aW9uRnJhbWVBY3Rpb24gPSBBbmltYXRpb25GcmFtZUFjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFuaW1hdGlvbkZyYW1lQWN0aW9uLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZUFjdGlvbi5qc1xuLy8gbW9kdWxlIGlkID0gNjYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1709. /***/ },
  1710. /* 664 */
  1711. /***/ function(module, exports, __webpack_require__) {
  1712. eval("\"use strict\";\nvar root_1 = __webpack_require__(7);\nvar RequestAnimationFrameDefinition = (function () {\n function RequestAnimationFrameDefinition(root) {\n if (root.requestAnimationFrame) {\n this.cancelAnimationFrame = root.cancelAnimationFrame.bind(root);\n this.requestAnimationFrame = root.requestAnimationFrame.bind(root);\n }\n else if (root.mozRequestAnimationFrame) {\n this.cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);\n this.requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);\n }\n else if (root.webkitRequestAnimationFrame) {\n this.cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);\n this.requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);\n }\n else if (root.msRequestAnimationFrame) {\n this.cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);\n this.requestAnimationFrame = root.msRequestAnimationFrame.bind(root);\n }\n else if (root.oRequestAnimationFrame) {\n this.cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);\n this.requestAnimationFrame = root.oRequestAnimationFrame.bind(root);\n }\n else {\n this.cancelAnimationFrame = root.clearTimeout.bind(root);\n this.requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };\n }\n }\n return RequestAnimationFrameDefinition;\n}());\nexports.RequestAnimationFrameDefinition = RequestAnimationFrameDefinition;\nexports.AnimationFrame = new RequestAnimationFrameDefinition(root_1.root);\n//# sourceMappingURL=AnimationFrame.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3V0aWwvQW5pbWF0aW9uRnJhbWUuanM/NTlmYyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciByb290XzEgPSByZXF1aXJlKCcuL3Jvb3QnKTtcbnZhciBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVEZWZpbml0aW9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVEZWZpbml0aW9uKHJvb3QpIHtcbiAgICAgICAgaWYgKHJvb3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gcm9vdC5jYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByb290LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3QubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gcm9vdC5tb3pDYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByb290Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3Qud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gcm9vdC53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSByb290LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3QubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSByb290Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWUuYmluZChyb290KTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gcm9vdC5tc1JlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJvb3Qub1JlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHJvb3Qub0NhbmNlbEFuaW1hdGlvbkZyYW1lLmJpbmQocm9vdCk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHJvb3Qub1JlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHJvb3QuY2xlYXJUaW1lb3V0LmJpbmQocm9vdCk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChjYikgeyByZXR1cm4gcm9vdC5zZXRUaW1lb3V0KGNiLCAxMDAwIC8gNjApOyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVEZWZpbml0aW9uO1xufSgpKTtcbmV4cG9ydHMuUmVxdWVzdEFuaW1hdGlvbkZyYW1lRGVmaW5pdGlvbiA9IFJlcXVlc3RBbmltYXRpb25GcmFtZURlZmluaXRpb247XG5leHBvcnRzLkFuaW1hdGlvbkZyYW1lID0gbmV3IFJlcXVlc3RBbmltYXRpb25GcmFtZURlZmluaXRpb24ocm9vdF8xLnJvb3QpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QW5pbWF0aW9uRnJhbWUuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3J4anMvdXRpbC9BbmltYXRpb25GcmFtZS5qc1xuLy8gbW9kdWxlIGlkID0gNjY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1713. /***/ },
  1714. /* 665 */
  1715. /***/ function(module, exports, __webpack_require__) {
  1716. eval("\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar AsyncScheduler_1 = __webpack_require__(417);\nvar AnimationFrameScheduler = (function (_super) {\n __extends(AnimationFrameScheduler, _super);\n function AnimationFrameScheduler() {\n _super.apply(this, arguments);\n }\n AnimationFrameScheduler.prototype.flush = function (action) {\n this.active = true;\n this.scheduled = undefined;\n var actions = this.actions;\n var error;\n var index = -1;\n var count = actions.length;\n action = action || actions.shift();\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (++index < count && (action = actions.shift()));\n this.active = false;\n if (error) {\n while (++index < count && (action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n };\n return AnimationFrameScheduler;\n}(AsyncScheduler_1.AsyncScheduler));\nexports.AnimationFrameScheduler = AnimationFrameScheduler;\n//# sourceMappingURL=AnimationFrameScheduler.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yeGpzL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZVNjaGVkdWxlci5qcz9iNDZiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgQXN5bmNTY2hlZHVsZXJfMSA9IHJlcXVpcmUoJy4vQXN5bmNTY2hlZHVsZXInKTtcbnZhciBBbmltYXRpb25GcmFtZVNjaGVkdWxlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyKCkge1xuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgdmFyIGNvdW50ID0gYWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBhY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpO1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXI7XG59KEFzeW5jU2NoZWR1bGVyXzEuQXN5bmNTY2hlZHVsZXIpKTtcbmV4cG9ydHMuQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgPSBBbmltYXRpb25GcmFtZVNjaGVkdWxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yeGpzL3NjaGVkdWxlci9BbmltYXRpb25GcmFtZVNjaGVkdWxlci5qc1xuLy8gbW9kdWxlIGlkID0gNjY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");
  1717. /***/ }
  1718. ]);