From bb1d49cecbbb916a1ae5503b1d369edde0045610 Mon Sep 17 00:00:00 2001 From: Rohan Sircar Date: Wed, 15 Jan 2020 11:16:35 +0530 Subject: [PATCH] added minifying using terser --- chatto/.gitignore | 5 +- chatto/pom.xml | 10 +- chatto/src/main/javascript/Gruntfile.js | 49 +- chatto/src/main/javascript/bundle.js | 614 -------------------- chatto/src/main/javascript/package.json | 4 +- chatto/src/main/javascript/ts/tsconfig.json | 2 +- chatto/src/main/javascript/yarn.lock | 350 ++--------- 7 files changed, 82 insertions(+), 952 deletions(-) delete mode 100644 chatto/src/main/javascript/bundle.js diff --git a/chatto/.gitignore b/chatto/.gitignore index 586aaed..a7ad434 100644 --- a/chatto/.gitignore +++ b/chatto/.gitignore @@ -31,7 +31,8 @@ build/ .vscode/ ../vscode/ -src/main/javascript/node_modules +node_modules config/ -src/main/resources/static/js/bundle.js +bundle.js +bundle.min.js src/main/javascript/node/ \ No newline at end of file diff --git a/chatto/pom.xml b/chatto/pom.xml index 193b9cf..6510969 100644 --- a/chatto/pom.xml +++ b/chatto/pom.xml @@ -15,6 +15,7 @@ 11 + @@ -178,15 +179,10 @@ grunt - - - generate-resources - - - browserify + ${gruntArg} + diff --git a/chatto/src/main/javascript/Gruntfile.js b/chatto/src/main/javascript/Gruntfile.js index 683a95b..f8416e1 100644 --- a/chatto/src/main/javascript/Gruntfile.js +++ b/chatto/src/main/javascript/Gruntfile.js @@ -3,35 +3,49 @@ module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), - // uglify: { - // options: { - // banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' - // }, - // build: { - // src: 'src/<%= pkg.name %>.js', - // dest: 'build/<%= pkg.name %>.min.js' - // } - // }, + terser: { + options: { + // Task-specific options go here. + }, + build: { + // Target-specific file lists and/or options go here. + src: '../resources/static/js/bundle.js', + dest: '../resources/static/js/bundle.min.js' + }, + }, browserify: { - main: { + dev: { src: 'ts/src/main.ts', - dest: '../resources/static/js/bundle.js' + dest: '../resources/static/js/bundle.js', + options: { + browserifyOptions: { + debug: true + }, + } + }, + prod: { + src: 'ts/src/main.ts', + dest: '../resources/static/js/bundle.js', + banner: '/*! Chat.js <%= grunt.template.today("yyyy-mm-dd") %> */ ', + options: { + browserifyOptions: { + debug: false + }, + } }, options: { plugin: [ - ['tsify', { target: 'es2017', noImplicitAny: true }], // register plugin by name + ['tsify', { target: 'ES6', noImplicitAny: true }], // register plugin by name ], - browserifyOptions: { - debug: true - }, + browserifyOptions: {}, } } }); // Load the plugin that provides the "uglify" task. - // grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-terser'); // // Default task(s). // grunt.registerTask('default', ['uglify']); @@ -40,6 +54,7 @@ module.exports = function(grunt) { - grunt.registerTask('default', ['browserify']) + grunt.registerTask('default', ['browserify:dev']) + grunt.registerTask('prod', ["browserify:prod", "terser"]) }; \ No newline at end of file diff --git a/chatto/src/main/javascript/bundle.js b/chatto/src/main/javascript/bundle.js deleted file mode 100644 index b986b70..0000000 --- a/chatto/src/main/javascript/bundle.js +++ /dev/null @@ -1,614 +0,0 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i '; -}); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./controller/ChatController":1,"./controller/UserController":2,"./model/ChatModel":5,"./model/UserModel":8,"./service/SJCLEncryptionService":9,"./singleton/JsonAPI":10,"./view/ChatView":13,"./view/UserView":14}],4:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); - -},{}],5:[function(require,module,exports){ -(function (global){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null); -const ChatModelHelper_1 = require("./ChatModelHelper"); -class ChatModel { - constructor() { - /** - * @type {Observer[]} List of subscribers. In real life, the list of - * subscribers can be stored more comprehensively (categorized by event - * type, etc.). - */ - this._observers = []; - this.state = null; - this._messagesMap = new Map(); - } - /** - * The subscription management methods. - */ - attach(observer) { - console.log('Subject: Attached an observer.'); - this._observers.push(observer); - } - detach(observer) { - const observerIndex = this._observers.indexOf(observer); - this._observers.splice(observerIndex, 1); - console.log('Subject: Detached an observer.'); - } - setUserMessages(username, messages) { - this._messagesMap.set(username, messages); - } - /** - * Trigger an update in each subscriber. - */ - notify() { - console.log('Subject: Notifying observers...'); - for (const observer of this._observers) { - observer.update(this.state); - } - } - someBusinessMethod(chatMessageList) { - this.state = chatMessageList; - this.helperMethod(); - console.log(`Subject: My state has just changed`); - console.log(chatMessageList); - this.notify(); - } - getmessages(userName, passphrase, lastMessageTime) { - const cVMs = ChatModelHelper_1.ChatModelHelper.getMessages(userName, passphrase, lastMessageTime, this); - if (cVMs != null) { - log.info('Subject: My state has just changed'); - log.debug(cVMs); - this._messagesMap.set(userName, cVMs); - this.notify(); - } - else { - log.error('Messages were null'); - } - } - helperMethod() { } - populateMessages() { - } -} -exports.ChatModel = ChatModel; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./ChatModelHelper":6}],6:[function(require,module,exports){ -(function (global){ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null); -const ChatMessageViewModel_1 = require("../viewmodel/ChatMessageViewModel"); -const JsonAPI_1 = require("../singleton/JsonAPI"); -const FetchErrorHandler_1 = require("./FetchErrorHandler"); -const SJCLEncryptionService_1 = require("../service/SJCLEncryptionService"); -class ChatModelHelper { - static getMessages(userName, passphrase, lastMessageTime, chatModel) { - switch (lastMessageTime) { - case null: { - this.getAllMessagesAjax(userName) - .then((data) => { - log.debug(`Subject: received all messages`); - // let userNames = data.map(ChatMessageViewModel => ChatMessageViewModel.fromUser) - // let sumt = data.map(chatMessageViewModel => { return this.encryptionService.decrypt(passphrase, chatMessageViewModel.messageCipher) }); - return data.map(vm => this.toChatMessageVM(vm, passphrase)); - // chatModel.setUserMessages(userName, chatMessageVMs); - // chatModel.notify(); - }); - break; - } - default: { - this.getNewMessagesAjax(userName, lastMessageTime) - .then((data) => { - log.debug(`Subject: received new messages`); - return data.map(vm => this.toChatMessageVM(vm, passphrase)); - // chatModel.setUserMessages(userName, chatMessageVMs); - // this.state = data; - // chatModel.notify(); - }); - break; - } - } - return null; - } - static toChatMessageVM(chatMessageDTO, passphrase) { - const vm = new ChatMessageViewModel_1.ChatMessageViewModel(); - vm.fromUser = chatMessageDTO.fromUser; - vm.toUser = chatMessageDTO.toUser; - vm.messageTime = chatMessageDTO.messageTime; - vm.message = this.encryptionService.decrypt(passphrase, chatMessageDTO.messageCipher); - return vm; - } - static getAllMessagesAjax(toUser) { - return __awaiter(this, void 0, void 0, function* () { - let headers = new Headers(); - if (JsonAPI_1.JsonAPI.authToken == null) { - log.error("authToken null"); - return; - } - ; - headers.append('X-AUTH-TOKEN', JsonAPI_1.JsonAPI.authToken); - let response = yield fetch(`${JsonAPI_1.JsonAPI.CHAT_MESSAGES_GET}/${toUser}`, { - method: 'GET', - headers: headers - }); - console.log(response.clone()); - if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) { - return null; - } - let data = yield response.json(); - return data; - }); - } - static getNewMessagesAjax(toUser, lastMessageTimeStamp) { - return __awaiter(this, void 0, void 0, function* () { - let headers = new Headers(); - if (JsonAPI_1.JsonAPI.authToken == null) { - log.error("authToken null"); - return; - } - ; - headers.append('X-AUTH-TOKEN', JsonAPI_1.JsonAPI.authToken); - let response = yield fetch(`${JsonAPI_1.JsonAPI.CHAT_MESSAGES_GET}/${toUser}/${lastMessageTimeStamp}`, { - method: 'GET', - headers: headers - }); - console.log(response.clone()); - if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) { - return null; - } - let data = yield response.json(); - return data; - }); - } -} -exports.ChatModelHelper = ChatModelHelper; -ChatModelHelper.encryptionService = new SJCLEncryptionService_1.SJCLEncryptionService(); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../service/SJCLEncryptionService":9,"../singleton/JsonAPI":10,"../viewmodel/ChatMessageViewModel":16,"./FetchErrorHandler":7}],7:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -function fetchErrorHandler(response) { - // alertify.success('Current position : ' + alertify.get('notifier', 'position')); - if (!response.ok) { - return response.text().catch(err => { - // the status was not ok and there is no json body - // throw new Error(response.statusText); - // window.alert(sprintf('Some error occured. Http code is %s', response.status)); - // alertify.error(sprintf('Some error occured. Http code is %s', response.status)); - return true; - }).then(json => { - // the status was not ok but there is a json body - // throw new Error(json.error.message); // example error message returned by a REST API - // window.alert(sprintf('Error: %s (Http code %s)', json, response.status)); - // alertify.error(sprintf('Some error occured. Http code is %s', response.status)); - console.log(json); - return true; - }); - } -} -exports.fetchErrorHandler = fetchErrorHandler; - -},{}],8:[function(require,module,exports){ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const FetchErrorHandler_1 = require("./FetchErrorHandler"); -const JsonAPI_1 = require("../singleton/JsonAPI"); -class UserModel { - // @ts-ignore: Cannot find name 'hostAddress'. - constructor() { - /** - * @type {Observer[]} List of subscribers. In real life, the list of - * subscribers can be stored more comprehensively (categorized by event - * type, etc.). - */ - this.observers = []; - } - /** - * The subscription management methods. - */ - attach(observer) { - console.log('Subject: Attached an observer.'); - this.observers.push(observer); - } - detach(observer) { - const observerIndex = this.observers.indexOf(observer); - this.observers.splice(observerIndex, 1); - console.log('Subject: Detached an observer.'); - } - /** - * Trigger an update in each subscriber. - */ - notify() { - console.log('Subject: Notifying observers...'); - for (const observer of this.observers) { - observer.update(this.state); - } - } - someBusinessMethod(activeuserList) { - this.state = activeuserList; - this.helperMethod(); - console.log(`Subject: My state has just changed`); - console.log(activeuserList); - this.notify(); - } - /** - * getActiveUsers - */ - getActiveUsers() { - this.getActiveUsersAjax("", JsonAPI_1.JsonAPI.ACTIVE_USERS_GET) - .then(data => { - // // activeUsers = data; - // sessionStorage.setItem('activeUsers', JSON.stringify(data)); - // console.log(sessionStorage.getItem('activeUsers')); - console.log(`Subject: received ajax active users`); - this.state = data; - this.notify(); - }); - } - getActiveUsersAjax(authToken2, URL) { - return __awaiter(this, void 0, void 0, function* () { - let headers = new Headers(); - // headers.append('Authorization', basicAuthToken); - headers.append('X-AUTH-TOKEN', authToken2); - let response = yield fetch(JsonAPI_1.JsonAPI.ACTIVE_USERS_GET, { - method: 'GET', - headers: headers - }); - console.log(response.clone()); - if (FetchErrorHandler_1.fetchErrorHandler(response.clone())) { - return null; - } - let data = yield response.json(); - // return data; - return new Promise((resolve, reject) => { - if (data != null) - resolve(data); - else - reject('Response data null'); - }); - }); - } - helperMethod() { } -} -exports.UserModel = UserModel; - -},{"../singleton/JsonAPI":10,"./FetchErrorHandler":7}],9:[function(require,module,exports){ -(function (global){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const sjcl = (typeof window !== "undefined" ? window['sjcl'] : typeof global !== "undefined" ? global['sjcl'] : null); -class SJCLEncryptionService { - constructor() { - this.params = { mode: "gcm", ts: 128, adata: "", iter: 10000 }; - } - encrypt(passphrase, plainText) { - return sjcl.encrypt(passphrase, plainText, this.params); - } - decrypt(passphrase, cipher) { - return sjcl.decrypt(passphrase, cipher, undefined, undefined); - } -} -exports.SJCLEncryptionService = SJCLEncryptionService; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],10:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var JsonAPI; -(function (JsonAPI) { - // @ts-ignore: Cannot find name 'hostAddress'. - JsonAPI.userName = localStorage.getItem('userName'); - JsonAPI.authToken = localStorage.getItem('authToken'); - JsonAPI.ACTIVE_USERS_GET = `/api/chat/get/active-users`; - JsonAPI.CHAT_MESSAGES_GET = ``; -})(JsonAPI = exports.JsonAPI || (exports.JsonAPI = {})); - -},{}],11:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class TemplateFactory { - // static getTemplate(templateName: string): Handlebars.TemplateDelegate { - // switch (templateName) { - // case "user-contact-online-template": { - // // let source = document.getElementById("user-contact-online-template").innerHTML; - // // let msgContainerTemplate = Handlebars.compile(source); - // // return msgContainerTemplate; - // return this.createTemplate(templateName); - // } - // case "msg_container_send_template": { - // // let source = document.getElementById("msg_container_send_template").innerHTML; - // // let msgContainerTemplate = Handlebars.compile(source); - // // return msgContainerTemplate; - // return this.createTemplate(templateName); - // } - // case "msg_container_template": { - // // let source = document.getElementById("msg_container_send_template").innerHTML; - // // let msgContainerTemplate = Handlebars.compile(source); - // // return msgContainerTemplate; - // return this.createTemplate(templateName); - // } - // default: - // throw new Error('invalid template name'); - // } - // } - static getTemplate(templateName) { - //@ts-ignore: Object is possibly 'null'. - let source = document.getElementById(templateName).innerHTML; - let msgContainerTemplate = Handlebars.compile(source); - return msgContainerTemplate; - } -} -exports.TemplateFactory = TemplateFactory; - -},{}],12:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); - -},{}],13:[function(require,module,exports){ -(function (global){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const TemplateFactory_1 = require("../template/TemplateFactory"); -const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null); -class ChatView { - constructor(model, element) { - this._messageSendTemplate = TemplateFactory_1.TemplateFactory.getTemplate('msg_container_send_template'); - this._model = model; - this._element = element; - } - update(data) { - let html = ""; - data.forEach((vm) => { - html += this._messageSendTemplate(vm); - }); - this._element.innerHTML = html; - log.debug(this._element.innerHTML); - } -} -exports.ChatView = ChatView; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../template/TemplateFactory":11}],14:[function(require,module,exports){ -(function (global){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const TemplateFactory_1 = require("../template/TemplateFactory"); -const log = (typeof window !== "undefined" ? window['log'] : typeof global !== "undefined" ? global['log'] : null); -class UserView { - // private userBoxes: any[] = []; - constructor(model, chatModel, element) { - this._model = model; - this._chatModel = chatModel; - this._element = element; - } - update(data) { - let template = TemplateFactory_1.TemplateFactory.getTemplate('user-contact-online-template'); - let html = ""; - data.forEach((element) => { - html += template(element); - }); - this._element.innerHTML = html; - this.addUserCallBacks(); - console.log(this._element.innerHTML); - } - helper() { - } - addUserCallBacks() { - let userBoxes = document.getElementsByClassName('user-box'); - for (let i = 0; i < userBoxes.length; i++) { - let userBox = userBoxes[i]; - userBoxes[i].addEventListener('click', this.userCallBack.bind(this, userBox)); - } - } - userCallBack(el) { - let current = document.getElementsByClassName('user-box active'); - let passphrase = ''; - if (current.length > 0) { - let passphraseInput = document.getElementById('passphrase'); - if (passphraseInput == null) { - log.error('passphraseInput element reference is null'); - return; - } - passphrase = passphraseInput.value; - if (passphrase == '' || passphrase == null) { - // alert('Please input passphrase') - // alertify.error('Please enter a passphrase'); - log.error('passphrase is empty or null'); - return; - } - current[0].className = current[0].className.replace(" active", ""); - } - // Add the active class to the current/clicked button - else if (current.length == 0) { - let elem = document.getElementById('passphrase-initial'); - if (elem == null) { - log.error('passphraseInput element reference is null'); - return; - } - passphrase = elem.value; - if (passphrase == '' || passphrase == null) { - // // alert('Please input passphrase') - // // alertify.error('Please enter a passphrase'); - log.error('passphrase is empty or null'); - return; - } - // @ts-ignore: Object is possibly 'null'. - document.getElementById('no-user-selected').hidden = true; - // @ts-ignore: Object is possibly 'null'. - document.getElementById('chat-card').hidden = false; - // @ts-ignore: Object is possibly 'null'. - elem.hidden = true; - } - // console.log(this.getElementsByClassName('to-user-span')); - let elem = el.getElementsByClassName('to-user-span')[0]; - let userName = elem.innerText; - // @ts-ignore: Object is possibly 'null'. - document.getElementById('user-name-span').innerText = userName; - this._chatModel.getmessages(userName, passphrase, null); - // populateMessages(userName, passphrase); - sessionStorage.setItem('selectedUser', userName); - el.className += " active"; - } -} -exports.UserView = UserView; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"../template/TemplateFactory":11}],15:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class ActiveUserViewModel { -} -exports.ActiveUserViewModel = ActiveUserViewModel; - -},{}],16:[function(require,module,exports){ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -class ChatMessageViewModel { -} -exports.ChatMessageViewModel = ChatMessageViewModel; - -},{}]},{},[3]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL3dhdGNoaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJ0cy9zcmMvY29udHJvbGxlci9DaGF0Q29udHJvbGxlci50cyIsInRzL3NyYy9jb250cm9sbGVyL1VzZXJDb250cm9sbGVyLnRzIiwidHMvc3JjL21haW4udHMiLCJ0cy9zcmMvbW9kZWwvQ2hhdE1vZGVsLnRzIiwidHMvc3JjL21vZGVsL0NoYXRNb2RlbEhlbHBlci50cyIsInRzL3NyYy9tb2RlbC9GZXRjaEVycm9ySGFuZGxlci50cyIsInRzL3NyYy9tb2RlbC9Vc2VyTW9kZWwudHMiLCJ0cy9zcmMvc2VydmljZS9TSkNMRW5jcnlwdGlvblNlcnZpY2UudHMiLCJ0cy9zcmMvc2luZ2xldG9uL0pzb25BUEkudHMiLCJ0cy9zcmMvdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5LnRzIiwidHMvc3JjL3ZpZXcvQ2hhdFZpZXcudHMiLCJ0cy9zcmMvdmlldy9Vc2VyVmlldy50cyIsInRzL3NyYy92aWV3bW9kZWwvQWN0aXZlVXNlclZpZXdNb2RlbC50cyIsInRzL3NyYy92aWV3bW9kZWwvQ2hhdE1lc3NhZ2VWaWV3TW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztBQ0NBLGtDQUErQjtBQUMvQiw4QkFBMkI7QUFDM0IsZ0NBQTZCO0FBQzdCLDRCQUF5QjtBQUd6Qiw0RUFBeUU7QUFJekUsTUFBYSxjQUFjO0lBS3ZCLFlBQVksS0FBZ0IsRUFBRSxJQUFjO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFHRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUEwQjtRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENB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RCx5Q0FBeUM7WUFDekMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BELHlDQUF5QztZQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUN0QjtRQUNELDREQUE0RDtRQUM1RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFnQixDQUFDO1FBQ3ZFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDOUIseUNBQXlDO1FBQ3pDLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQy9ELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsMENBQTBDO1FBQzFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELEVBQUUsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDO0lBQzlCLENBQUM7Q0FFSjtBQTlGRCw0QkE4RkM7Ozs7Ozs7QUN4R0QsTUFBYSxtQkFBbUI7Q0FJL0I7QUFKRCxrREFJQzs7Ozs7QUNKRCxNQUFhLG9CQUFvQjtDQU9oQztBQVBELG9EQU9DIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCIuL0Fic3RyYWN0Q29udHJvbGxlclwiO1xuaW1wb3J0IFwiLi4vbW9kZWwvQWJzdHJhY3RNb2RlbFwiXG5pbXBvcnQgXCIuLi9tb2RlbC9Vc2VyTW9kZWxcIlxuaW1wb3J0IFwiLi4vdmlldy9BYnN0cmFjdFZpZXdcIlxuaW1wb3J0IFwiLi4vdmlldy9Vc2VyVmlld1wiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9BYnN0cmFjdE1vZGVsXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uL3ZpZXcvQWJzdHJhY3RWaWV3XCI7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZVZpZXdNb2RlbCB9IGZyb20gXCIuLi92aWV3bW9kZWwvQ2hhdE1lc3NhZ2VWaWV3TW9kZWxcIjtcbmltcG9ydCB7IENoYXRNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9DaGF0TW9kZWxcIjtcbmltcG9ydCB7IENoYXRWaWV3IH0gZnJvbSBcIi4uL3ZpZXcvQ2hhdFZpZXdcIjtcblxuZXhwb3J0IGNsYXNzIENoYXRDb250cm9sbGVyIHtcbiAgICBwcml2YXRlIF9tb2RlbDogQ2hhdE1vZGVsO1xuICAgIHByaXZhdGUgX3ZpZXc6IENoYXRWaWV3O1xuXG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogQ2hhdE1vZGVsLCB2aWV3OiBDaGF0Vmlldykge1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLl92aWV3ID0gdmlldztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIGV2ZW50SGFuZGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBldmVudEhhbmRsZXIodm06IENoYXRNZXNzYWdlVmlld01vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc29tZUJ1c2luZXNzTWV0aG9kKHZtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhdE1lc3NhZ2VWaWV3TW9kZWxzOiBDaGF0TWVzc2FnZVZpZXdNb2RlbFtdID0gW107XG4gICAgICAgIGxldCBjaGF0TWVzc2FnZVZpZXdNb2RlbE1vY2sgPSBuZXcgQ2hhdE1lc3NhZ2VWaWV3TW9kZWwoKTtcbiAgICAgICAgY2hhdE1lc3NhZ2VWaWV3TW9kZWxNb2NrLmZyb21Vc2VyID0gXCJ1c2VyMVwiO1xuICAgICAgICBjaGF0TWVzc2FnZVZpZXdNb2RlbE1vY2sudG9Vc2VyID0gXCJ1c2VyMlwiO1xuICAgICAgICBjaGF0TWVzc2FnZVZpZXdNb2RlbE1vY2subWVzc2FnZSA9IFwiXCI7XG4gICAgICAgIGNoYXRNZXNzYWdlVmlld01vZGVsTW9jay5tZXNzYWdlVGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNoYXRNZXNzYWdlVmlld01vZGVscy5wdXNoKGNoYXRNZXNzYWdlVmlld01vZGVsTW9jayk7XG4gICAgfVxuXG4gICAgXG59IiwiaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCIuL0Fic3RyYWN0Q29udHJvbGxlclwiO1xuaW1wb3J0IFwiLi4vbW9kZWwvQWJzdHJhY3RNb2RlbFwiXG5pbXBvcnQgXCIuLi9tb2RlbC9Vc2VyTW9kZWxcIlxuaW1wb3J0IFwiLi4vdmlldy9BYnN0cmFjdFZpZXdcIlxuaW1wb3J0IFwiLi4vdmlldy9Vc2VyVmlld1wiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9BYnN0cmFjdE1vZGVsXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uL3ZpZXcvQWJzdHJhY3RWaWV3XCI7XG5pbXBvcnQgeyBBY3RpdmVVc2VyVmlld01vZGVsIH0gZnJvbSBcIi4uL3ZpZXdtb2RlbC9BY3RpdmVVc2VyVmlld01vZGVsXCI7XG5pbXBvcnQgeyBVc2VyVmlldyB9IGZyb20gXCIuLi92aWV3L1VzZXJWaWV3XCI7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciB7XG4gICAgcHJpdmF0ZSBfbW9kZWw6IE1vZGVsO1xuICAgIHByaXZhdGUgX3ZpZXc6IFVzZXJWaWV3O1xuXG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWwsIHZpZXc6IFVzZXJWaWV3KSB7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuX3ZpZXcgPSB2aWV3O1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogZXZlbnRIYW5kbGVyXG4gICAgICovXG4gICAgcHVibGljIGV2ZW50SGFuZGxlcih2bTogQWN0aXZlVXNlclZpZXdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21vZGVsLnNvbWVCdXNpbmVzc01ldGhvZCh2bSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRlc3QoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVVzZXJzTW9jazogQWN0aXZlVXNlclZpZXdNb2RlbFtdID0gW107XG4gICAgICAgIGxldCBhY3RpdmVVc2VyVmlld01vZGVsTW9jayA9IG5ldyBBY3RpdmVVc2VyVmlld01vZGVsKCk7XG4gICAgICAgIGFjdGl2ZVVzZXJWaWV3TW9kZWxNb2NrLnVzZXJOYW1lID0gXCJzb21lIHVzZXJcIjtcbiAgICAgICAgYWN0aXZlVXNlclZpZXdNb2RlbE1vY2subGFzdEFjdGl2ZSA9IFwiMyBocnMgYWdvXCI7XG4gICAgICAgIGFjdGl2ZVVzZXJWaWV3TW9kZWxNb2NrLm9ubGluZSA9IHRydWU7XG4gICAgICAgIGFjdGl2ZVVzZXJzTW9jay5wdXNoKGFjdGl2ZVVzZXJWaWV3TW9kZWxNb2NrKTtcbiAgICAgICAgYWN0aXZlVXNlclZpZXdNb2RlbE1vY2sgPSBuZXcgQWN0aXZlVXNlclZpZXdNb2RlbCgpO1xuICAgICAgICBhY3RpdmVVc2VyVmlld01vZGVsTW9jay5sYXN0QWN0aXZlID0gXCIzIGhycyBhZ29cIjtcbiAgICAgICAgYWN0aXZlVXNlclZpZXdNb2RlbE1vY2sub25saW5lID0gdHJ1ZTtcbiAgICAgICAgYWN0aXZlVXNlclZpZXdNb2RlbE1vY2sudXNlck5hbWUgPSBcInNvbWUgdXNlciAyXCI7XG4gICAgICAgIGFjdGl2ZVVzZXJzTW9jay5wdXNoKGFjdGl2ZVVzZXJWaWV3TW9kZWxNb2NrKTtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIoYWN0aXZlVXNlcnNNb2NrKTtcbiAgICB9XG5cbiAgICBcbn0iLCJpbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSBcIi4vY29udHJvbGxlci9BYnN0cmFjdENvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFVzZXJNb2RlbCB9IGZyb20gXCIuL21vZGVsL1VzZXJNb2RlbFwiXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL21vZGVsL0Fic3RyYWN0TW9kZWxcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi92aWV3L0Fic3RyYWN0Vmlld1wiO1xuaW1wb3J0IHsgVXNlclZpZXcgfSBmcm9tIFwiLi92aWV3L1VzZXJWaWV3XCI7XG5pbXBvcnQgeyBVc2VyQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXIvVXNlckNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IE1vZGVsRmFjdG9yeSB9IGZyb20gXCIuL21vZGVsL01vZGVsRmFjdG9yeVwiO1xuaW1wb3J0IHsgQWN0aXZlVXNlclZpZXdNb2RlbCB9IGZyb20gXCIuL3ZpZXdtb2RlbC9BY3RpdmVVc2VyVmlld01vZGVsXCI7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZVZpZXdNb2RlbCB9IGZyb20gXCIuL3ZpZXdtb2RlbC9DaGF0TWVzc2FnZVZpZXdNb2RlbFwiO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tIFwiaGFuZGxlYmFyc1wiO1xuaW1wb3J0IG1hcmtkb3duaXQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpO1xuaW1wb3J0IHsgQ2hhdE1vZGVsIH0gZnJvbSBcIi4vbW9kZWwvQ2hhdE1vZGVsXCI7XG5pbXBvcnQgeyBDaGF0VmlldyB9IGZyb20gXCIuL3ZpZXcvQ2hhdFZpZXdcIjtcbmltcG9ydCB7IENoYXRDb250cm9sbGVyIH0gZnJvbSBcIi4vY29udHJvbGxlci9DaGF0Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgSnNvbkFQSSB9IGZyb20gXCIuL3NpbmdsZXRvbi9Kc29uQVBJXCI7XG4vLyBpbXBvcnQgbG9nID0gcmVxdWlyZSgnbG9nbGV2ZWwnKVxuaW1wb3J0ICogYXMgbG9nIGZyb20gJ2xvZ2xldmVsJztcbi8vIGltcG9ydCBsb2cgZnJvbSAnbG9nbGV2ZWwnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlL0VuY3J5cHRpb25TZXJ2aWNlXCI7XG5pbXBvcnQgeyBTSkNMRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlL1NKQ0xFbmNyeXB0aW9uU2VydmljZVwiO1xuLy8gdmFyIG1hcmtkb3duaXQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpO1xudmFyIG1kID0gbmV3IG1hcmtkb3duaXQoKTtcblxuXG5jb25zdCB1c2VyQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhY3RzLWJveCcpO1xuXG5sb2cuc2V0TGV2ZWwoXCJUUkFDRVwiKVxuXG5jb25zdCBjaGF0TW9kZWwgPSBuZXcgQ2hhdE1vZGVsKCk7XG5cbmNvbnN0IHVzZXJNb2RlbCA9IG5ldyBVc2VyTW9kZWwoKTtcbi8vIGNvbnN0IHVzZXJNb2RlbCA9IE1vZGVsRmFjdG9yeS5jcmVhdGVNb2RlbChcIlVTRVJcIik7XG4vLyBAdHMtaWdub3JlOiBBcmd1bWVudCBvZiB0eXBlICdIVE1MRWxlbWVudCB8IG51bGwnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHBhcmFtZXRlciBvZiB0eXBlICdIVE1MRWxlbWVudCcuIFR5cGUgJ251bGwnIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0hUTUxFbGVtZW50Jy5cbmNvbnN0IHVzZXJWaWV3ID0gbmV3IFVzZXJWaWV3KHVzZXJNb2RlbCwgY2hhdE1vZGVsLCB1c2VyQm94KTtcblxuLy8gY29uc29sZS5sb2codXNlckJveCk7XG5cbnVzZXJNb2RlbC5hdHRhY2godXNlclZpZXcpO1xuLy8gdXNlclZpZXcubW9kZWxcblxuXG5jb25zdCB1c2VyQ29udHJvbGxlciA9IG5ldyBVc2VyQ29udHJvbGxlcih1c2VyTW9kZWwsIHVzZXJWaWV3KTtcbnVzZXJDb250cm9sbGVyLnRlc3QoKTtcblxuXG5cbi8vIHVzZXJNb2RlbC5zb21lQnVzaW5lc3NNZXRob2QoYWN0aXZlVXNlcnNNb2NrKTtcbmxvZy5pbmZvKFwiaGVsbG9cIik7XG5cbmNvbnN0IGNoYXRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoYXQtYXJlYS1uZXcnKTtcbi8vIEB0cy1pZ25vcmU6IEFyZ3VtZW50IG9mIHR5cGUgJ0hUTUxFbGVtZW50IHwgbnVsbCcgaXMgbm90IGFzc2lnbmFibGUgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJ0hUTUxFbGVtZW50Jy4gVHlwZSAnbnVsbCcgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnSFRNTEVsZW1lbnQnLlxuY29uc3QgY2hhdFZpZXcgPSBuZXcgQ2hhdFZpZXcoY2hhdE1vZGVsLCBjaGF0QXJlYSk7XG5jb25zdCBjaGF0Q29udHJvbGxlciA9IG5ldyBDaGF0Q29udHJvbGxlcihjaGF0TW9kZWwsIGNoYXRWaWV3KTtcblxuXG5mdW5jdGlvbiBzb21lRnVuYyh2bTogQWN0aXZlVXNlclZpZXdNb2RlbCk6IHZvaWQge1xuICAgIC8vIGxvZy5pbmZvKHZtKTtcbiAgICAvLyBsb2dnZXIuaW5mbyh2bSlcbn1cblxubG9nLmluZm8oXCJ0ZXN0XCIpO1xuLy8gc29tZUZ1bmMoYWN0aXZlVXNlclZpZXdNb2RlbE1vY2spO1xuXG4vLyBAdHMtaWdub3JlOiBPYmplY3QgaXMgcG9zc2libHkgJ251bGwnLlxudmFyIHNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXNnX2NvbnRhaW5lcl90ZW1wbGF0ZVwiKS5pbm5lckhUTUw7XG5cbnZhciBtc2dDb250YWluZXJUZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShzb3VyY2UpO1xuXG5Kc29uQVBJLkFDVElWRV9VU0VSU19HRVQgKyAnYWVmJztcblxuY29uc3QgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlID0gbmV3IFNKQ0xFbmNyeXB0aW9uU2VydmljZSgpO1xubGV0IGN0ID0gZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcInBhc3N3b3JkXCIsXCJkYXRhXCIpO1xuY29uc29sZS5sb2coZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcInBhc3N3b3JkXCIsIGN0KSk7XG5cbkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2F2YXRhcicsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnPGRpdiBjbGFzcz1cImltZ19jb250X21zZ1wiPiA8aW1nIHNyYz1cImh0dHBzOi8vc3RhdGljLnR1cmJvc3F1aWQuY29tL1ByZXZpZXcvMDAxMjkyLzQ4MS9XVi9fRC5qcGdcIiBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIHVzZXJfaW1nX21zZ1wiPiA8L2Rpdj4nO1xufSk7IiwiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCIuLi9vYnNlcnZlL09ic2VydmFibGVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vQWJzdHJhY3RNb2RlbFwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vb2JzZXJ2ZS9PYnNlcnZlclwiO1xuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi9GZXRjaEVycm9ySGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZlVXNlclZpZXdNb2RlbCB9IGZyb20gXCIuLi92aWV3bW9kZWwvQWN0aXZlVXNlclZpZXdNb2RlbFwiO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VWaWV3TW9kZWwgfSBmcm9tIFwiLi4vdmlld21vZGVsL0NoYXRNZXNzYWdlVmlld01vZGVsXCI7XG5pbXBvcnQgeyBKc29uQVBJIH0gZnJvbSBcIi4uL3NpbmdsZXRvbi9Kc29uQVBJXCI7XG5pbXBvcnQgbG9nID0gcmVxdWlyZSgnbG9nbGV2ZWwnKTtcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2UvRW5jcnlwdGlvblNlcnZpY2VcIjtcbmltcG9ydCB7IFNKQ0xFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlL1NKQ0xFbmNyeXB0aW9uU2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VEVE8gfSBmcm9tIFwiLi4vZHRvL0NoYXRNZXNzYWdlRFRPXCI7XG5pbXBvcnQgeyBDaGF0TW9kZWxIZWxwZXIgfSBmcm9tIFwiLi9DaGF0TW9kZWxIZWxwZXJcIjtcblxuZXhwb3J0IGNsYXNzIENoYXRNb2RlbCBpbXBsZW1lbnRzIFN1YmplY3Qge1xuICAgIC8qKlxuICAqIEB0eXBlIHtPYnNlcnZlcltdfSBMaXN0IG9mIHN1YnNjcmliZXJzLiBJbiByZWFsIGxpZmUsIHRoZSBsaXN0IG9mXG4gICogc3Vic2NyaWJlcnMgY2FuIGJlIHN0b3JlZCBtb3JlIGNvbXByZWhlbnNpdmVseSAoY2F0ZWdvcml6ZWQgYnkgZXZlbnRcbiAgKiB0eXBlLCBldGMuKS5cbiAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHN0YXRlOiBDaGF0TWVzc2FnZVZpZXdNb2RlbFtdIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlc01hcDogTWFwPHN0cmluZywgQ2hhdE1lc3NhZ2VWaWV3TW9kZWxbXT47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VzTWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc3Vic2NyaXB0aW9uIG1hbmFnZW1lbnQgbWV0aG9kcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXR0YWNoKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnU3ViamVjdDogQXR0YWNoZWQgYW4gb2JzZXJ2ZXIuJyk7XG4gICAgICAgIHRoaXMuX29ic2VydmVycy5wdXNoKG9ic2VydmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWNoKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBvYnNlcnZlckluZGV4ID0gdGhpcy5fb2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgICAgICB0aGlzLl9vYnNlcnZlcnMuc3BsaWNlKG9ic2VydmVySW5kZXgsIDEpO1xuICAgICAgICBjb25zb2xlLmxvZygnU3ViamVjdDogRGV0YWNoZWQgYW4gb2JzZXJ2ZXIuJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZXJNZXNzYWdlcyh1c2VybmFtZTogc3RyaW5nLCBtZXNzYWdlczogQ2hhdE1lc3NhZ2VWaWV3TW9kZWxbXSkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlc01hcC5zZXQodXNlcm5hbWUsIG1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGFuIHVwZGF0ZSBpbiBlYWNoIHN1YnNjcmliZXIuXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeSgpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1N1YmplY3Q6IE5vdGlmeWluZyBvYnNlcnZlcnMuLi4nKTtcbiAgICAgICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiB0aGlzLl9vYnNlcnZlcnMpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzb21lQnVzaW5lc3NNZXRob2QoY2hhdE1lc3NhZ2VMaXN0OiBDaGF0TWVzc2FnZVZpZXdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBjaGF0TWVzc2FnZUxpc3Q7XG4gICAgICAgIHRoaXMuaGVscGVyTWV0aG9kKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWJqZWN0OiBNeSBzdGF0ZSBoYXMganVzdCBjaGFuZ2VkYCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYXRNZXNzYWdlTGlzdCk7XG4gICAgICAgIHRoaXMubm90aWZ5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldG1lc3NhZ2VzKHVzZXJOYW1lOiBzdHJpbmcsIHBhc3NwaHJhc2U6IHN0cmluZywgbGFzdE1lc3NhZ2VUaW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNWTXMgPSBDaGF0TW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXModXNlck5hbWUsIHBhc3NwaHJhc2UsIGxhc3RNZXNzYWdlVGltZSwgdGhpcyk7XG4gICAgICAgIGlmIChjVk1zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdTdWJqZWN0OiBNeSBzdGF0ZSBoYXMganVzdCBjaGFuZ2VkJylcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhjVk1zKTtcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VzTWFwLnNldCh1c2VyTmFtZSwgY1ZNcyk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdNZXNzYWdlcyB3ZXJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICBwcml2YXRlIGhlbHBlck1ldGhvZCgpIHsgfVxuXG4gICAgcHVibGljIHBvcHVsYXRlTWVzc2FnZXMoKTogdm9pZCB7XG5cbiAgICB9XG5cblxuXG59IiwiaW1wb3J0IHsgQ2hhdE1lc3NhZ2VEVE8gfSBmcm9tIFwiLi4vZHRvL0NoYXRNZXNzYWdlRFRPXCI7XG5cbmltcG9ydCAqIGFzIGxvZyBmcm9tIFwibG9nbGV2ZWxcIjtcblxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VWaWV3TW9kZWwgfSBmcm9tIFwiLi4vdmlld21vZGVsL0NoYXRNZXNzYWdlVmlld01vZGVsXCI7XG5cbmltcG9ydCB7IEpzb25BUEkgfSBmcm9tIFwiLi4vc2luZ2xldG9uL0pzb25BUElcIjtcblxuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi9GZXRjaEVycm9ySGFuZGxlclwiO1xuXG5pbXBvcnQgeyBFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlL0VuY3J5cHRpb25TZXJ2aWNlXCI7XG5pbXBvcnQgeyBTSkNMRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZS9TSkNMRW5jcnlwdGlvblNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRNb2RlbCB9IGZyb20gXCIuL0NoYXRNb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdE1vZGVsSGVscGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBlbmNyeXB0aW9uU2VydmljZSA9IG5ldyBTSkNMRW5jcnlwdGlvblNlcnZpY2UoKTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWVzc2FnZXModXNlck5hbWU6IHN0cmluZywgcGFzc3BocmFzZTogc3RyaW5nLCBsYXN0TWVzc2FnZVRpbWU6IHN0cmluZyB8IG51bGwsIGNoYXRNb2RlbDogQ2hhdE1vZGVsKTogQ2hhdE1lc3NhZ2VWaWV3TW9kZWxbXSB8IG51bGwge1xuICAgICAgICBzd2l0Y2ggKGxhc3RNZXNzYWdlVGltZSkge1xuICAgICAgICAgICAgY2FzZSBudWxsOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxNZXNzYWdlc0FqYXgodXNlck5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhOiBDaGF0TWVzc2FnZURUT1tdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoYFN1YmplY3Q6IHJlY2VpdmVkIGFsbCBtZXNzYWdlc2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHVzZXJOYW1lcyA9IGRhdGEubWFwKENoYXRNZXNzYWdlVmlld01vZGVsID0+IENoYXRNZXNzYWdlVmlld01vZGVsLmZyb21Vc2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHN1bXQgPSBkYXRhLm1hcChjaGF0TWVzc2FnZVZpZXdNb2RlbCA9PiB7IHJldHVybiB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQocGFzc3BocmFzZSwgY2hhdE1lc3NhZ2VWaWV3TW9kZWwubWVzc2FnZUNpcGhlcikgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5tYXAodm0gPT4gdGhpcy50b0NoYXRNZXNzYWdlVk0odm0sIHBhc3NwaHJhc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXRNb2RlbC5zZXRVc2VyTWVzc2FnZXModXNlck5hbWUsIGNoYXRNZXNzYWdlVk1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXRNb2RlbC5ub3RpZnkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE5ld01lc3NhZ2VzQWpheCh1c2VyTmFtZSwgbGFzdE1lc3NhZ2VUaW1lKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YTogQ2hhdE1lc3NhZ2VEVE9bXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGBTdWJqZWN0OiByZWNlaXZlZCBuZXcgbWVzc2FnZXNgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcCh2bSA9PiB0aGlzLnRvQ2hhdE1lc3NhZ2VWTSh2bSwgcGFzc3BocmFzZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhdE1vZGVsLnNldFVzZXJNZXNzYWdlcyh1c2VyTmFtZSwgY2hhdE1lc3NhZ2VWTXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdGF0ZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGF0TW9kZWwubm90aWZ5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyB0b0NoYXRNZXNzYWdlVk0oY2hhdE1lc3NhZ2VEVE86IENoYXRNZXNzYWdlRFRPLCBwYXNzcGhyYXNlOiBzdHJpbmcpOiBDaGF0TWVzc2FnZVZpZXdNb2RlbCB7XG4gICAgICAgIGNvbnN0IHZtID0gbmV3IENoYXRNZXNzYWdlVmlld01vZGVsKCk7XG4gICAgICAgIHZtLmZyb21Vc2VyID0gY2hhdE1lc3NhZ2VEVE8uZnJvbVVzZXI7XG4gICAgICAgIHZtLnRvVXNlciA9IGNoYXRNZXNzYWdlRFRPLnRvVXNlcjtcbiAgICAgICAgdm0ubWVzc2FnZVRpbWUgPSBjaGF0TWVzc2FnZURUTy5tZXNzYWdlVGltZTtcbiAgICAgICAgdm0ubWVzc2FnZSA9IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChwYXNzcGhyYXNlLCBjaGF0TWVzc2FnZURUTy5tZXNzYWdlQ2lwaGVyKSBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiB2bTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRBbGxNZXNzYWdlc0FqYXgodG9Vc2VyOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIGlmIChKc29uQVBJLmF1dGhUb2tlbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoXCJhdXRoVG9rZW4gbnVsbFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfTtcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1gtQVVUSC1UT0tFTicsIEpzb25BUEkuYXV0aFRva2VuKTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7SnNvbkFQSS5DSEFUX01FU1NBR0VTX0dFVH0vJHt0b1VzZXJ9YCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLmNsb25lKCkpO1xuICAgICAgICBpZiAoZmV0Y2hFcnJvckhhbmRsZXIocmVzcG9uc2UuY2xvbmUoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRhOiBQcm9taXNlPGFueT4gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdldE5ld01lc3NhZ2VzQWpheCh0b1VzZXI6IHN0cmluZywgbGFzdE1lc3NhZ2VUaW1lU3RhbXA6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgaWYgKEpzb25BUEkuYXV0aFRva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcImF1dGhUb2tlbiBudWxsXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9O1xuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnWC1BVVRILVRPS0VOJywgSnNvbkFQSS5hdXRoVG9rZW4pO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtKc29uQVBJLkNIQVRfTUVTU0FHRVNfR0VUfS8ke3RvVXNlcn0vJHtsYXN0TWVzc2FnZVRpbWVTdGFtcH1gLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UuY2xvbmUoKSk7XG4gICAgICAgIGlmIChmZXRjaEVycm9ySGFuZGxlcihyZXNwb25zZS5jbG9uZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGE6IFByb21pc2U8YW55PiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSIsImV4cG9ydCBmdW5jdGlvbiBmZXRjaEVycm9ySGFuZGxlcihyZXNwb25zZTogUmVzcG9uc2UpIHtcbiAgICAvLyBhbGVydGlmeS5zdWNjZXNzKCdDdXJyZW50IHBvc2l0aW9uIDogJyArIGFsZXJ0aWZ5LmdldCgnbm90aWZpZXInLCAncG9zaXRpb24nKSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAvLyB0aGUgc3RhdHVzIHdhcyBub3Qgb2sgYW5kIHRoZXJlIGlzIG5vIGpzb24gYm9keVxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgLy8gd2luZG93LmFsZXJ0KHNwcmludGYoJ1NvbWUgZXJyb3Igb2NjdXJlZC4gSHR0cCBjb2RlIGlzICVzJywgcmVzcG9uc2Uuc3RhdHVzKSk7XG4gICAgICAgICAgICAvLyBhbGVydGlmeS5lcnJvcihzcHJpbnRmKCdTb21lIGVycm9yIG9jY3VyZWQuIEh0dHAgY29kZSBpcyAlcycsIHJlc3BvbnNlLnN0YXR1cykpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pLnRoZW4oanNvbiA9PiB7XG4gICAgICAgICAgICAvLyB0aGUgc3RhdHVzIHdhcyBub3Qgb2sgYnV0IHRoZXJlIGlzIGEganNvbiBib2R5XG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoanNvbi5lcnJvci5tZXNzYWdlKTsgLy8gZXhhbXBsZSBlcnJvciBtZXNzYWdlIHJldHVybmVkIGJ5IGEgUkVTVCBBUElcbiAgICAgICAgICAgIC8vIHdpbmRvdy5hbGVydChzcHJpbnRmKCdFcnJvcjogJXMgKEh0dHAgY29kZSAlcyknLCBqc29uLCByZXNwb25zZS5zdGF0dXMpKTtcbiAgICAgICAgICAgIC8vIGFsZXJ0aWZ5LmVycm9yKHNwcmludGYoJ1NvbWUgZXJyb3Igb2NjdXJlZC4gSHR0cCBjb2RlIGlzICVzJywgcmVzcG9uc2Uuc3RhdHVzKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhqc29uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG59IiwiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCIuLi9vYnNlcnZlL09ic2VydmFibGVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vQWJzdHJhY3RNb2RlbFwiO1xuaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vb2JzZXJ2ZS9PYnNlcnZlclwiO1xuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi9GZXRjaEVycm9ySGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZlVXNlclZpZXdNb2RlbCB9IGZyb20gXCIuLi92aWV3bW9kZWwvQWN0aXZlVXNlclZpZXdNb2RlbFwiO1xuaW1wb3J0IHsgSnNvbkFQSSB9IGZyb20gXCIuLi9zaW5nbGV0b24vSnNvbkFQSVwiO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VWaWV3TW9kZWwgfSBmcm9tIFwiLi4vdmlld21vZGVsL0NoYXRNZXNzYWdlVmlld01vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTW9kZWwgaW1wbGVtZW50cyBTdWJqZWN0IHtcbiAgICAvKipcbiAgKiBAdHlwZSB7T2JzZXJ2ZXJbXX0gTGlzdCBvZiBzdWJzY3JpYmVycy4gSW4gcmVhbCBsaWZlLCB0aGUgbGlzdCBvZlxuICAqIHN1YnNjcmliZXJzIGNhbiBiZSBzdG9yZWQgbW9yZSBjb21wcmVoZW5zaXZlbHkgKGNhdGVnb3JpemVkIGJ5IGV2ZW50XG4gICogdHlwZSwgZXRjLikuXG4gICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBvYnNlcnZlcnM6IE9ic2VydmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHN0YXRlOiBBY3RpdmVVc2VyVmlld01vZGVsW10gfCB1bmRlZmluZWQ7XG4gICAgLy8gQHRzLWlnbm9yZTogQ2Fubm90IGZpbmQgbmFtZSAnaG9zdEFkZHJlc3MnLlxuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgc3Vic2NyaXB0aW9uIG1hbmFnZW1lbnQgbWV0aG9kcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXR0YWNoKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnU3ViamVjdDogQXR0YWNoZWQgYW4gb2JzZXJ2ZXIuJyk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZXRhY2gob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVySW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKG9ic2VydmVySW5kZXgsIDEpO1xuICAgICAgICBjb25zb2xlLmxvZygnU3ViamVjdDogRGV0YWNoZWQgYW4gb2JzZXJ2ZXIuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhbiB1cGRhdGUgaW4gZWFjaCBzdWJzY3JpYmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBub3RpZnkoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWJqZWN0OiBOb3RpZnlpbmcgb2JzZXJ2ZXJzLi4uJyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgdGhpcy5vYnNlcnZlcnMpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzb21lQnVzaW5lc3NNZXRob2QoYWN0aXZldXNlckxpc3Q6IEFjdGl2ZVVzZXJWaWV3TW9kZWxbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXRlID0gYWN0aXZldXNlckxpc3Q7XG4gICAgICAgIHRoaXMuaGVscGVyTWV0aG9kKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWJqZWN0OiBNeSBzdGF0ZSBoYXMganVzdCBjaGFuZ2VkYCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGFjdGl2ZXVzZXJMaXN0KTtcbiAgICAgICAgdGhpcy5ub3RpZnkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRBY3RpdmVVc2Vyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBY3RpdmVVc2VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVVc2Vyc0FqYXgoXCJcIiwgSnNvbkFQSS5BQ1RJVkVfVVNFUlNfR0VUKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gLy8gYWN0aXZlVXNlcnMgPSBkYXRhO1xuICAgICAgICAgICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2FjdGl2ZVVzZXJzJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2FjdGl2ZVVzZXJzJykpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdWJqZWN0OiByZWNlaXZlZCBhamF4IGFjdGl2ZSB1c2Vyc2ApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7XG4gICAgICAgICAgICB9KVxuICAgIH1cblxuICAgIGFzeW5jIGdldEFjdGl2ZVVzZXJzQWpheChhdXRoVG9rZW4yOiBzdHJpbmcsIFVSTDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgICAvLyBoZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsIGJhc2ljQXV0aFRva2VuKTtcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1gtQVVUSC1UT0tFTicsIGF1dGhUb2tlbjIpO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChKc29uQVBJLkFDVElWRV9VU0VSU19HRVQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZS5jbG9uZSgpKTtcbiAgICAgICAgaWYgKGZldGNoRXJyb3JIYW5kbGVyKHJlc3BvbnNlLmNsb25lKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgLy8gcmV0dXJuIGRhdGE7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZWplY3QoJ1Jlc3BvbnNlIGRhdGEgbnVsbCcpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoZWxwZXJNZXRob2QoKSB7IH1cblxufSIsImltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vRW5jcnlwdGlvblNlcnZpY2VcIjtcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSBcInNqY2xcIjtcblxuZXhwb3J0IGNsYXNzIFNKQ0xFbmNyeXB0aW9uU2VydmljZSBpbXBsZW1lbnRzIEVuY3J5cHRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogYW55ID0geyBtb2RlOiBcImdjbVwiLCB0czogMTI4LCBhZGF0YTogXCJcIiwgaXRlcjogMTAwMDB9XG4gICAgcHVibGljIGVuY3J5cHQocGFzc3BocmFzZTogc3RyaW5nLCBwbGFpblRleHQ6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBzamNsLmVuY3J5cHQocGFzc3BocmFzZSwgcGxhaW5UZXh0LCB0aGlzLnBhcmFtcyk7XG4gICAgfSBcbiAgICBcbiAgICBwdWJsaWMgZGVjcnlwdChwYXNzcGhyYXNlOiBzdHJpbmcsIGNpcGhlcjogT2JqZWN0KTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHNqY2wuZGVjcnlwdChwYXNzcGhyYXNlLCBjaXBoZXIgYXMgc2pjbC5TamNsQ2lwaGVyRW5jcnlwdGVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxufSIsImV4cG9ydCBuYW1lc3BhY2UgSnNvbkFQSSB7XG4gICAgLy8gQHRzLWlnbm9yZTogQ2Fubm90IGZpbmQgbmFtZSAnaG9zdEFkZHJlc3MnLlxuICAgIGV4cG9ydCBsZXQgdXNlck5hbWU6IHN0cmluZyB8IG51bGwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlck5hbWUnKTtcbiAgICBleHBvcnQgbGV0IGF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdhdXRoVG9rZW4nKTtcbiAgICBleHBvcnQgY29uc3QgQUNUSVZFX1VTRVJTX0dFVCA9IGAvYXBpL2NoYXQvZ2V0L2FjdGl2ZS11c2Vyc2A7XG4gICAgZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfR0VUID0gYGA7XG4gICAgXG59IiwiZXhwb3J0IGNsYXNzIFRlbXBsYXRlRmFjdG9yeSB7XG4gICAgLy8gc3RhdGljIGdldFRlbXBsYXRlKHRlbXBsYXRlTmFtZTogc3RyaW5nKTogSGFuZGxlYmFycy5UZW1wbGF0ZURlbGVnYXRlPGFueT4ge1xuXG4gICAgLy8gICAgIHN3aXRjaCAodGVtcGxhdGVOYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidXNlci1jb250YWN0LW9ubGluZS10ZW1wbGF0ZVwiOiB7XG4gICAgLy8gICAgICAgICAgICAgLy8gbGV0IHNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidXNlci1jb250YWN0LW9ubGluZS10ZW1wbGF0ZVwiKS5pbm5lckhUTUw7XG4gICAgLy8gICAgICAgICAgICAgLy8gbGV0IG1zZ0NvbnRhaW5lclRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHNvdXJjZSk7XG4gICAgLy8gICAgICAgICAgICAgLy8gcmV0dXJuIG1zZ0NvbnRhaW5lclRlbXBsYXRlO1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBjYXNlIFwibXNnX2NvbnRhaW5lcl9zZW5kX3RlbXBsYXRlXCI6IHtcbiAgICAvLyAgICAgICAgICAgICAvLyBsZXQgc291cmNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtc2dfY29udGFpbmVyX3NlbmRfdGVtcGxhdGVcIikuaW5uZXJIVE1MO1xuICAgIC8vICAgICAgICAgICAgIC8vIGxldCBtc2dDb250YWluZXJUZW1wbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShzb3VyY2UpO1xuICAgIC8vICAgICAgICAgICAgIC8vIHJldHVybiBtc2dDb250YWluZXJUZW1wbGF0ZTtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgY2FzZSBcIm1zZ19jb250YWluZXJfdGVtcGxhdGVcIjoge1xuICAgIC8vICAgICAgICAgICAgIC8vIGxldCBzb3VyY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1zZ19jb250YWluZXJfc2VuZF90ZW1wbGF0ZVwiKS5pbm5lckhUTUw7XG4gICAgLy8gICAgICAgICAgICAgLy8gbGV0IG1zZ0NvbnRhaW5lclRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHNvdXJjZSk7XG4gICAgLy8gICAgICAgICAgICAgLy8gcmV0dXJuIG1zZ0NvbnRhaW5lclRlbXBsYXRlO1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0ZW1wbGF0ZSBuYW1lJyk7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBzdGF0aWMgZ2V0VGVtcGxhdGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpOiBIYW5kbGViYXJzLlRlbXBsYXRlRGVsZWdhdGU8YW55PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZTogT2JqZWN0IGlzIHBvc3NpYmx5ICdudWxsJy5cbiAgICAgICAgbGV0IHNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRlbXBsYXRlTmFtZSkuaW5uZXJIVE1MO1xuICAgICAgICBsZXQgbXNnQ29udGFpbmVyVGVtcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoc291cmNlKTtcbiAgICAgICAgcmV0dXJuIG1zZ0NvbnRhaW5lclRlbXBsYXRlO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBPYnNlcnZlciB9IGZyb20gXCIuLi9vYnNlcnZlL09ic2VydmVyXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbC9BYnN0cmFjdE1vZGVsXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcIi4uL29ic2VydmUvT2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuL0Fic3RyYWN0Vmlld1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyL0Fic3RyYWN0Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSBcIi4uL3RlbXBsYXRlL1RlbXBsYXRlRmFjdG9yeVwiO1xuaW1wb3J0IHsgQWN0aXZlVXNlclZpZXdNb2RlbCB9IGZyb20gXCIuLi92aWV3bW9kZWwvQWN0aXZlVXNlclZpZXdNb2RlbFwiO1xuaW1wb3J0IHsgQ2hhdE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0NoYXRNb2RlbFwiO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VWaWV3TW9kZWwgfSBmcm9tIFwiLi4vdmlld21vZGVsL0NoYXRNZXNzYWdlVmlld01vZGVsXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnbG9nbGV2ZWwnO1xuXG5leHBvcnQgY2xhc3MgQ2hhdFZpZXcgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IENoYXRNb2RlbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlU2VuZFRlbXBsYXRlID0gVGVtcGxhdGVGYWN0b3J5LmdldFRlbXBsYXRlKCdtc2dfY29udGFpbmVyX3NlbmRfdGVtcGxhdGUnKTtcblxuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IENoYXRNb2RlbCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICB1cGRhdGUoZGF0YTogQ2hhdE1lc3NhZ2VWaWV3TW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBsZXQgaHRtbDogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgZGF0YS5mb3JFYWNoKCh2bTogQ2hhdE1lc3NhZ2VWaWV3TW9kZWwpID0+IHtcbiAgICAgICAgICAgIGh0bWwgKz0gdGhpcy5fbWVzc2FnZVNlbmRUZW1wbGF0ZSh2bSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9lbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIGxvZy5kZWJ1Zyh0aGlzLl9lbGVtZW50LmlubmVySFRNTCk7XG4gICAgfVxufSIsImltcG9ydCB7IE9ic2VydmVyIH0gZnJvbSBcIi4uL29ic2VydmUvT2JzZXJ2ZXJcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL0Fic3RyYWN0TW9kZWxcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwiLi4vb2JzZXJ2ZS9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4vQWJzdHJhY3RWaWV3XCI7XG5pbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvQWJzdHJhY3RDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUZhY3RvcnkgfSBmcm9tIFwiLi4vdGVtcGxhdGUvVGVtcGxhdGVGYWN0b3J5XCI7XG5pbXBvcnQgeyBBY3RpdmVVc2VyVmlld01vZGVsIH0gZnJvbSBcIi4uL3ZpZXdtb2RlbC9BY3RpdmVVc2VyVmlld01vZGVsXCI7XG5pbXBvcnQgeyBDaGF0TW9kZWwgfSBmcm9tIFwiLi4vbW9kZWwvQ2hhdE1vZGVsXCI7XG5pbXBvcnQgbG9nID0gcmVxdWlyZShcImxvZ2xldmVsXCIpO1xuXG5leHBvcnQgY2xhc3MgVXNlclZpZXcgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbW9kZWw6IE1vZGVsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYXRNb2RlbDogQ2hhdE1vZGVsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIC8vIHByaXZhdGUgdXNlckJveGVzOiBhbnlbXSA9ICBbXTtcblxuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsLCBjaGF0TW9kZWw6IENoYXRNb2RlbCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fY2hhdE1vZGVsID0gY2hhdE1vZGVsO1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cblxuXG5cbiAgICB1cGRhdGUoZGF0YTogQWN0aXZlVXNlclZpZXdNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IFRlbXBsYXRlRmFjdG9yeS5nZXRUZW1wbGF0ZSgndXNlci1jb250YWN0LW9ubGluZS10ZW1wbGF0ZScpO1xuICAgICAgICBsZXQgaHRtbDogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OiBBY3RpdmVVc2VyVmlld01vZGVsKSA9PiB7XG4gICAgICAgICAgICBodG1sICs9IHRlbXBsYXRlKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB0aGlzLmFkZFVzZXJDYWxsQmFja3MoKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5fZWxlbWVudC5pbm5lckhUTUwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGVscGVyKCk6IHZvaWQge1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRVc2VyQ2FsbEJhY2tzKCk6IHZvaWQge1xuICAgICAgICBsZXQgdXNlckJveGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndXNlci1ib3gnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyQm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB1c2VyQm94ID0gdXNlckJveGVzW2ldO1xuICAgICAgICAgICAgdXNlckJveGVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy51c2VyQ2FsbEJhY2suYmluZCh0aGlzLCB1c2VyQm94KSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHByaXZhdGUgdXNlckNhbGxCYWNrKGVsOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndXNlci1ib3ggYWN0aXZlJyk7XG5cbiAgICAgICAgbGV0IHBhc3NwaHJhc2U6IHN0cmluZyA9ICcnO1xuICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcGFzc3BocmFzZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bhc3NwaHJhc2UnKSBhcyBhbnk7XG5cbiAgICAgICAgICAgIGlmIChwYXNzcGhyYXNlSW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcigncGFzc3BocmFzZUlucHV0IGVsZW1lbnQgcmVmZXJlbmNlIGlzIG51bGwnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzcGhyYXNlID0gcGFzc3BocmFzZUlucHV0LnZhbHVlXG4gICAgICAgICAgICBpZiAocGFzc3BocmFzZSA9PSAnJyB8fCBwYXNzcGhyYXNlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBhbGVydCgnUGxlYXNlIGlucHV0IHBhc3NwaHJhc2UnKVxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0aWZ5LmVycm9yKCdQbGVhc2UgZW50ZXIgYSBwYXNzcGhyYXNlJyk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdwYXNzcGhyYXNlIGlzIGVtcHR5IG9yIG51bGwnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50WzBdLmNsYXNzTmFtZSA9IGN1cnJlbnRbMF0uY2xhc3NOYW1lLnJlcGxhY2UoXCIgYWN0aXZlXCIsIFwiXCIpO1xuXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBhY3RpdmUgY2xhc3MgdG8gdGhlIGN1cnJlbnQvY2xpY2tlZCBidXR0b25cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFzc3BocmFzZS1pbml0aWFsJykgYXMgYW55O1xuICAgICAgICAgICAgaWYoZWxlbSA9PSBudWxsKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcigncGFzc3BocmFzZUlucHV0IGVsZW1lbnQgcmVmZXJlbmNlIGlzIG51bGwnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXNzcGhyYXNlID0gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXNzcGhyYXNlID09ICcnIHx8IHBhc3NwaHJhc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAvLyBhbGVydCgnUGxlYXNlIGlucHV0IHBhc3NwaHJhc2UnKVxuICAgICAgICAgICAgICAgIC8vICAgICAvLyBhbGVydGlmeS5lcnJvcignUGxlYXNlIGVudGVyIGEgcGFzc3BocmFzZScpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcigncGFzc3BocmFzZSBpcyBlbXB0eSBvciBudWxsJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogT2JqZWN0IGlzIHBvc3NpYmx5ICdudWxsJy5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduby11c2VyLXNlbGVjdGVkJykuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IE9iamVjdCBpcyBwb3NzaWJseSAnbnVsbCcuXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdC1jYXJkJykuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBPYmplY3QgaXMgcG9zc2libHkgJ251bGwnLlxuICAgICAgICAgICAgZWxlbS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndG8tdXNlci1zcGFuJykpO1xuICAgICAgICBsZXQgZWxlbSA9IGVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RvLXVzZXItc3BhbicpWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgdXNlck5hbWUgPSBlbGVtLmlubmVyVGV4dDtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogT2JqZWN0IGlzIHBvc3NpYmx5ICdudWxsJy5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZS1zcGFuJykuaW5uZXJUZXh0ID0gdXNlck5hbWU7XG4gICAgICAgIHRoaXMuX2NoYXRNb2RlbC5nZXRtZXNzYWdlcyh1c2VyTmFtZSwgcGFzc3BocmFzZSwgbnVsbCk7XG4gICAgICAgIC8vIHBvcHVsYXRlTWVzc2FnZXModXNlck5hbWUsIHBhc3NwaHJhc2UpO1xuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZFVzZXInLCB1c2VyTmFtZSk7XG4gICAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBhY3RpdmVcIjtcbiAgICB9XG5cbn0iLCJleHBvcnQgY2xhc3MgQWN0aXZlVXNlclZpZXdNb2RlbCB7XG4gICAgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBvbmxpbmU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgbGFzdEFjdGl2ZTogc3RyaW5nfCB1bmRlZmluZWQ7XG59IiwiZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlVmlld01vZGVsIHtcbiAgICBwdWJsaWMgdG9Vc2VyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIGZyb21Vc2VyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcHVibGljIG1lc3NhZ2UhOiBzdHJpbmc7XG4gICAgcHVibGljIG1lc3NhZ2VUaW1lITogRGF0ZTtcblxuICAgIFxufSJdfQ== diff --git a/chatto/src/main/javascript/package.json b/chatto/src/main/javascript/package.json index 27e7d12..61f69ee 100644 --- a/chatto/src/main/javascript/package.json +++ b/chatto/src/main/javascript/package.json @@ -24,8 +24,10 @@ "browserify-shim": "^3.8.14", "grunt": "^1.0.4", "grunt-browserify": "^5.3.0", + "grunt-terser": "^1.0.0", "tsify": "^4.0.1", - "typescript": "^3.7.4" + "typescript": "^3.7.4", + "uglify-js": "^3.7.5" }, "browserify": { "transform": [ diff --git a/chatto/src/main/javascript/ts/tsconfig.json b/chatto/src/main/javascript/ts/tsconfig.json index 53ad2ef..c15a0ba 100644 --- a/chatto/src/main/javascript/ts/tsconfig.json +++ b/chatto/src/main/javascript/ts/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ + "target": "ES2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [ "ES2015" ], // "lib": [], /* Specify library files to be included in the compilation. */ diff --git a/chatto/src/main/javascript/yarn.lock b/chatto/src/main/javascript/yarn.lock index 788fd04..94804e6 100644 --- a/chatto/src/main/javascript/yarn.lock +++ b/chatto/src/main/javascript/yarn.lock @@ -112,16 +112,6 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -147,19 +137,6 @@ ap@~0.2.0: resolved "https://registry.yarnpkg.com/ap/-/ap-0.2.0.tgz#ae0942600b29912f0d2b14ec60c45e8f330b6110" integrity sha1-rglCYAspkS8NKxTsYMRejzMLYRA= -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -598,11 +575,6 @@ chokidar@^2.1.1: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -628,11 +600,6 @@ clean-css@^4.1.5: dependencies: source-map "~0.6.0" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - coffeescript@~1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e" @@ -678,7 +645,7 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -commander@~2.20.3: +commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -708,11 +675,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -825,13 +787,6 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -842,11 +797,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -874,11 +824,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - deps-sort@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" @@ -902,11 +847,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detective@^4.5.0: version "4.7.1" resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" @@ -1187,13 +1127,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1217,20 +1150,6 @@ fuse.js@^3.4.6: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.6.tgz#545c3411fed88bf2e27c457cab6e73e7af697a45" integrity sha512-H6aJY4UpLFwxj1+5nAvufom5b2BT2v45P1MkPvdGIK8fWjQx/7o6tTT1+ALV0yawQvbmvCF0ufl2et8eJ7v7Cg== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -1395,6 +1314,13 @@ grunt-legacy-util@~1.1.1: underscore.string "~3.3.4" which "~1.3.0" +grunt-terser@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/grunt-terser/-/grunt-terser-1.0.0.tgz#cb46d645fe51ec9b3bcb1f37dbd2f3112d91e791" + integrity sha512-8MfNU3cVP4UWZLlIjJMUpk3NWIEmaD+CwewhDpUTiPaS49EkBiSWCmGAihqWxBKbiOC3KePPXMmB/yiaVNqW2w== + dependencies: + terser "^4.3.9" + grunt@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38" @@ -1441,11 +1367,6 @@ has-require@~1.2.1: dependencies: escape-string-regexp "^1.0.3" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -1536,7 +1457,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1548,13 +1469,6 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -1585,7 +1499,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -1705,18 +1619,6 @@ is-finite@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -2014,7 +1916,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -2024,21 +1926,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -2047,7 +1934,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -2092,11 +1979,6 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - nan@^2.12.1: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" @@ -2119,44 +2001,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -2186,36 +2035,6 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.7" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" - integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -2274,24 +2093,6 @@ os-browserify@~0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" @@ -2481,16 +2282,6 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -2528,19 +2319,6 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^3.0.6: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" @@ -2676,13 +2454,6 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -2720,21 +2491,11 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -2829,6 +2590,14 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -2839,7 +2608,7 @@ source-map@^0.5.6, source-map@~0.5.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -2936,23 +2705,6 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -2972,20 +2724,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -3007,7 +2745,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: +strip-json-comments@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -3033,24 +2771,20 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - ternary@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ternary/-/ternary-1.0.0.tgz#45702725608c9499d46a9610e9b0e49ff26f789e" integrity sha1-RXAnJWCMlJnUapYQ6bDkn/JveJ4= +terser@^4.3.9: + version "4.6.3" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87" + integrity sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + through2@2.0.x, through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -3166,6 +2900,14 @@ uglify-js@^3.1.4: commander "~2.20.3" source-map "~0.6.1" +uglify-js@^3.7.5: + version "3.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.5.tgz#278c7c24927ac5a32d3336fc68fd4ae1177a486a" + integrity sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + umd@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" @@ -3283,13 +3025,6 @@ which@^1.2.14, which@~1.3.0: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -3311,8 +3046,3 @@ xtend@~2.1.1: integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" - -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==