From be6869a87e0bdf02fa7ed753d9d32c7af6c1608c Mon Sep 17 00:00:00 2001 From: baozhoutao Date: Thu, 9 May 2024 15:14:05 +0800 Subject: [PATCH] build creator --- .../programs/server/packages/modules.js | 26 +++++++++---------- .../server/packages/steedos_objects.js | 11 ++++++-- .../server/packages/steedos_objects.js.map | 2 +- ...d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js} | 16 ++++++------ ...d571fa8e0eb86d000d02178fdf01c3.stats.json} | 24 ++++++++--------- .../programs/web.browser.legacy/program.json | 22 ++++++++-------- ...d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js} | 16 ++++++------ ...d571fa8e0eb86d000d02178fdf01c3.stats.json} | 24 ++++++++--------- .../bundle/programs/web.browser/program.json | 22 ++++++++-------- ...2ba9e3da8c7d7570f1cffd7ec10e272010cd34.js} | 14 +++++----- ...8c7d7570f1cffd7ec10e272010cd34.stats.json} | 24 ++++++++--------- .../bundle/programs/web.cordova/program.json | 26 +++++++++---------- server/bundle/star.json | 2 +- 13 files changed, 118 insertions(+), 111 deletions(-) rename server/bundle/programs/web.browser.legacy/{0e8e091408993e566bde6016e2c1649202635d18.js => 46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js} (87%) rename server/bundle/programs/web.browser.legacy/{0e8e091408993e566bde6016e2c1649202635d18.stats.json => 46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.stats.json} (99%) rename server/bundle/programs/web.browser/{0e8e091408993e566bde6016e2c1649202635d18.js => 46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js} (87%) rename server/bundle/programs/web.browser/{0e8e091408993e566bde6016e2c1649202635d18.stats.json => 46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.stats.json} (99%) rename server/bundle/programs/web.cordova/{9f30c101caa5703f6bfb61789c7e2d80336dd6dc.js => c22ba9e3da8c7d7570f1cffd7ec10e272010cd34.js} (88%) rename server/bundle/programs/web.cordova/{9f30c101caa5703f6bfb61789c7e2d80336dd6dc.stats.json => c22ba9e3da8c7d7570f1cffd7ec10e272010cd34.stats.json} (99%) diff --git a/server/bundle/programs/server/packages/modules.js b/server/bundle/programs/server/packages/modules.js index 0f313ac539..80d0ac2814 100644 --- a/server/bundle/programs/server/packages/modules.js +++ b/server/bundle/programs/server/packages/modules.js @@ -463,7 +463,7 @@ module.useNode(); // module.exports = { "name": "@steedos/objectql", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "lib/index.js" }; @@ -490,7 +490,7 @@ module.useNode(); // module.exports = { "name": "@steedos/i18n", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "lib/index.js" }; @@ -517,7 +517,7 @@ module.useNode(); // module.exports = { "name": "@steedos/core", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "lib/index.js" }; @@ -544,7 +544,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-meteor-package-loader", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "index.js" }; @@ -571,7 +571,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-api", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "index.js" }; @@ -598,7 +598,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-metadata-server", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "index.js" }; @@ -625,7 +625,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-package-registry", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "package.service.js" }; @@ -652,7 +652,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-objectql", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "package.service.js" }; @@ -679,7 +679,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-ui", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "package.service.js" }; @@ -706,7 +706,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-pages", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "package.service.js" }; @@ -733,7 +733,7 @@ module.useNode(); // module.exports = { "name": "@steedos/router", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "lib/index.js" }; @@ -760,7 +760,7 @@ module.useNode(); // module.exports = { "name": "@steedos/auth", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "lib/index.js" }; @@ -787,7 +787,7 @@ module.useNode(); // module.exports = { "name": "@steedos/workflow", - "version": "2.6.11-beta.5", + "version": "2.6.11", "main": "index.js" }; diff --git a/server/bundle/programs/server/packages/steedos_objects.js b/server/bundle/programs/server/packages/steedos_objects.js index e0b829a5e7..e86d2e9ba0 100644 --- a/server/bundle/programs/server/packages/steedos_objects.js +++ b/server/bundle/programs/server/packages/steedos_objects.js @@ -451,7 +451,14 @@ Creator.getOrderlySetByIds = function (docs, ids, id_key, hit_first) { }); } else { return _.sortBy(docs, function (doc) { - return ids.indexOf(doc[id_key]); + var v; + v = ids.indexOf(doc[id_key]); + + if (v < 0) { + return 99999; + } else { + return v; + } }); } }; /* @@ -5679,4 +5686,4 @@ Package._define("steedos:objects"); })(); //# sourceURL=meteor://💻app/packages/steedos_objects.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xvYWRTdGFuZGFyZE9iamVjdHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9sb2FkU3RhbmRhcmRPYmplY3RzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2NvcmVTdXBwb3J0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY29yZVN1cHBvcnQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvc2VydmVyL21ldGhvZHMvb2JqZWN0X29wdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9vYmplY3Rfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvbGlzdHZpZXdzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2xpc3R2aWV3cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvYWRkX3NpbXBsZV9zY2hlbWFfdmFsaWRhdGlvbl9lcnJvci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hZGRfc2ltcGxlX3NjaGVtYV92YWxpZGF0aW9uX2Vycm9yLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9maWVsZF9zaW1wbGVfc2NoZW1hX3ZhbGlkYXRpb25fZXJyb3IuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvZmllbGRfc2ltcGxlX3NjaGVtYV92YWxpZGF0aW9uX2Vycm9yLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpvYmplY3RzL2xpYi9ldmFsLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL2NvbnZlcnQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvY29udmVydC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvZm9ybXVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvZm9ybXVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL29iamVjdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9vYmplY3QuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL2ZpZWxkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9maWVsZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL3RyaWdnZXJzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL3RyaWdnZXJzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9wZXJtaXNzaW9uX3NldHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvcGVybWlzc2lvbl9zZXRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9jb2xsZWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9jb2xsZWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvYWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hY3Rpb25zLmNvZmZlZSJdLCJuYW1lcyI6WyJkYiIsIkNyZWF0b3IiLCJPYmplY3RzIiwiQ29sbGVjdGlvbnMiLCJNZW51cyIsIkFwcHMiLCJEYXNoYm9hcmRzIiwiUmVwb3J0cyIsInN1YnMiLCJzdGVlZG9zU2NoZW1hIiwiQVBJU2VydmljZSIsIk1ldGFkYXRhU2VydmljZSIsImNvbmZpZyIsImUiLCJtb2xlY3VsZXIiLCJvYmplY3RxbCIsInBhY2thZ2VMb2FkZXIiLCJwYWNrYWdlU2VydmljZSIsInBhdGgiLCJzZXR0aW5ncyIsInN0ZWVkb3NDb3JlIiwicHJvY2VzcyIsImVudiIsIkNSRUFUT1JfTk9ERV9FTlYiLCJyZXF1aXJlIiwiZ2V0U3RlZWRvc0NvbmZpZyIsImJ1aWx0X2luX3BsdWdpbnMiLCJwbHVnaW5zIiwiTWV0ZW9yIiwic3RhcnR1cCIsImFwaVNlcnZpY2UiLCJicm9rZXIiLCJleCIsIm1ldGFkYXRhU2VydmljZSIsIm9iamVjdHFsU2VydmljZSIsInBhZ2VTZXJ2aWNlIiwicHJvamVjdFNlcnZpY2UiLCJzdGFuZGFyZE9iamVjdHNEaXIiLCJzdGFuZGFyZE9iamVjdHNQYWNrYWdlTG9hZGVyU2VydmljZSIsInN0ZWVkb3NTZXJ2aWNlIiwidWlTZXJ2aWNlIiwiU2VydmljZUJyb2tlciIsIm5hbWVzcGFjZSIsIm5vZGVJRCIsIm1ldGFkYXRhIiwidHJhbnNwb3J0ZXIiLCJUUkFOU1BPUlRFUiIsImNhY2hlciIsIkNBQ0hFUiIsImxvZ0xldmVsIiwic2VyaWFsaXplciIsInJlcXVlc3RUaW1lb3V0IiwibWF4Q2FsbExldmVsIiwiaGVhcnRiZWF0SW50ZXJ2YWwiLCJoZWFydGJlYXRUaW1lb3V0IiwiY29udGV4dFBhcmFtc0Nsb25pbmciLCJ0cmFja2luZyIsImVuYWJsZWQiLCJzaHV0ZG93blRpbWVvdXQiLCJkaXNhYmxlQmFsYW5jZXIiLCJyZWdpc3RyeSIsInN0cmF0ZWd5IiwicHJlZmVyTG9jYWwiLCJidWxraGVhZCIsImNvbmN1cnJlbmN5IiwibWF4UXVldWVTaXplIiwidmFsaWRhdG9yIiwiZXJyb3JIYW5kbGVyIiwidHJhY2luZyIsImV4cG9ydGVyIiwidHlwZSIsIm9wdGlvbnMiLCJsb2dnZXIiLCJjb2xvcnMiLCJ3aWR0aCIsImdhdWdlV2lkdGgiLCJza2lwUHJvY2Vzc0V2ZW50UmVnaXN0cmF0aW9uIiwiY3JlYXRlZCIsIndhcm4iLCJjbGVhbiIsImluaXQiLCJjcmVhdGVTZXJ2aWNlIiwibmFtZSIsIm1peGlucyIsInBvcnQiLCJzdGFydGVkIiwic2V0VGltZW91dCIsImVtaXQiLCJnZXRTdGVlZG9zU2NoZW1hIiwiU3RhbmRhcmRPYmplY3RzUGF0aCIsInBhY2thZ2VJbmZvIiwid3JhcEFzeW5jIiwiY2IiLCJzdGFydCIsInRoZW4iLCJjb25uZWN0SGFuZGxlcnNFeHByZXNzIiwiZXhwcmVzcyIsIl9yZXN0YXJ0U2VydmljZSIsInVzZSIsInN0YXRpY1JvdXRlciIsIndhaXRGb3JTZXJ2aWNlcyIsImNvbnNvbGUiLCJsb2ciLCJTdGVlZG9zQXBpIiwiV2ViQXBwIiwiY29ubmVjdEhhbmRsZXJzIiwicmVzb2x2ZSIsInJlamVjdCIsImVycm9yIiwiRmliZXIiLCJkZXBzIiwiYXBwIiwiVHJhY2tlciIsIkRlcGVuZGVuY3kiLCJvYmplY3QiLCJfVEVNUExBVEUiLCJTaW1wbGVTY2hlbWEiLCJleHRlbmRPcHRpb25zIiwiZmlsdGVyc0Z1bmN0aW9uIiwiTWF0Y2giLCJPcHRpb25hbCIsIk9uZU9mIiwiRnVuY3Rpb24iLCJTdHJpbmciLCJvcHRpb25zRnVuY3Rpb24iLCJjcmVhdGVGdW5jdGlvbiIsImlzU2VydmVyIiwiZmliZXJMb2FkT2JqZWN0cyIsIm9iaiIsIm9iamVjdF9uYW1lIiwibG9hZE9iamVjdHMiLCJydW4iLCJsaXN0X3ZpZXdzIiwic3BhY2UiLCJnZXRDb2xsZWN0aW9uTmFtZSIsIl8iLCJjbG9uZSIsImNvbnZlcnRPYmplY3QiLCJPYmplY3QiLCJpbml0VHJpZ2dlcnMiLCJpbml0TGlzdFZpZXdzIiwiZ2V0T2JqZWN0TmFtZSIsImdldE9iamVjdCIsInNwYWNlX2lkIiwicmVmIiwicmVmMSIsImlzQXJyYXkiLCJpc0NsaWVudCIsImRlcGVuZCIsIlNlc3Npb24iLCJnZXQiLCJvYmplY3RzQnlOYW1lIiwiZ2V0T2JqZWN0QnlJZCIsIm9iamVjdF9pZCIsImZpbmRXaGVyZSIsIl9pZCIsInJlbW92ZU9iamVjdCIsImdldENvbGxlY3Rpb24iLCJzcGFjZUlkIiwiX2NvbGxlY3Rpb25fbmFtZSIsInJlbW92ZUNvbGxlY3Rpb24iLCJpc1NwYWNlQWRtaW4iLCJ1c2VySWQiLCJmaW5kT25lIiwiZmllbGRzIiwiYWRtaW5zIiwiaW5kZXhPZiIsImV2YWx1YXRlRm9ybXVsYSIsImZvcm11bGFyIiwiY29udGV4dCIsImlzU3RyaW5nIiwiRm9ybXVsYXIiLCJjaGVja0Zvcm11bGEiLCJldmFsdWF0ZUZpbHRlcnMiLCJmaWx0ZXJzIiwic2VsZWN0b3IiLCJlYWNoIiwiZmlsdGVyIiwiYWN0aW9uIiwidmFsdWUiLCJsZW5ndGgiLCJpc0NvbW1vblNwYWNlIiwiZ2V0T3JkZXJseVNldEJ5SWRzIiwiZG9jcyIsImlkcyIsImlkX2tleSIsImhpdF9maXJzdCIsInZhbHVlcyIsImdldFByb3BlcnR5Iiwic29ydEJ5IiwiZG9jIiwiX2luZGV4Iiwic29ydGluZ01ldGhvZCIsInZhbHVlMSIsInZhbHVlMiIsImlzVmFsdWUxRW1wdHkiLCJpc1ZhbHVlMkVtcHR5IiwibG9jYWxlIiwia2V5IiwiRGF0ZSIsImdldFRpbWUiLCJTdGVlZG9zIiwidG9TdHJpbmciLCJsb2NhbGVDb21wYXJlIiwiZ2V0T2JqZWN0UmVsYXRlZHMiLCJfb2JqZWN0IiwicGVybWlzc2lvbnMiLCJyZWxhdGVkTGlzdCIsInJlbGF0ZWRMaXN0TWFwIiwicmVsYXRlZF9vYmplY3RzIiwiaXNFbXB0eSIsIm9iak5hbWUiLCJpc09iamVjdCIsIm9iamVjdE5hbWUiLCJyZWxhdGVkX29iamVjdCIsInJlbGF0ZWRfb2JqZWN0X25hbWUiLCJyZWxhdGVkX2ZpZWxkIiwicmVsYXRlZF9maWVsZF9uYW1lIiwicmVmZXJlbmNlX3RvIiwiZm9yZWlnbl9rZXkiLCJ3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCIsImVuYWJsZU9iak5hbWUiLCJnZXRQZXJtaXNzaW9ucyIsImVuYWJsZV9hdWRpdCIsIm1vZGlmeUFsbFJlY29yZHMiLCJlbmFibGVfZmlsZXMiLCJwdXNoIiwic2ZzRmlsZXNPYmplY3QiLCJzcGxpY2UiLCJlbmFibGVfdGFza3MiLCJlbmFibGVfbm90ZXMiLCJlbmFibGVfZXZlbnRzIiwiZW5hYmxlX2luc3RhbmNlcyIsImVuYWJsZV9hcHByb3ZhbHMiLCJlbmFibGVfcHJvY2VzcyIsImdldFVzZXJDb250ZXh0IiwiaXNVblNhZmVNb2RlIiwiVVNFUl9DT05URVhUIiwic3BhY2VfdXNlcl9vcmciLCJzdSIsInN1RmllbGRzIiwiRXJyb3IiLCJtb2JpbGUiLCJwb3NpdGlvbiIsImVtYWlsIiwiY29tcGFueSIsIm9yZ2FuaXphdGlvbiIsImNvbXBhbnlfaWQiLCJjb21wYW55X2lkcyIsInVzZXIiLCJmdWxsbmFtZSIsImdldFJlbGF0aXZlVXJsIiwidXJsIiwiaXNGdW5jdGlvbiIsImlzQ29yZG92YSIsInN0YXJ0c1dpdGgiLCJ0ZXN0IiwiX19tZXRlb3JfcnVudGltZV9jb25maWdfXyIsIlJPT1RfVVJMX1BBVEhfUFJFRklYIiwiZ2V0VXNlckNvbXBhbnlJZCIsImdldFVzZXJDb21wYW55SWRzIiwicHJvY2Vzc1Blcm1pc3Npb25zIiwicG8iLCJhbGxvd0NyZWF0ZSIsImFsbG93UmVhZCIsImFsbG93RWRpdCIsImFsbG93RGVsZXRlIiwidmlld0FsbFJlY29yZHMiLCJ2aWV3Q29tcGFueVJlY29yZHMiLCJtb2RpZnlDb21wYW55UmVjb3JkcyIsImFsbG93UmVhZEZpbGVzIiwidmlld0FsbEZpbGVzIiwiYWxsb3dDcmVhdGVGaWxlcyIsImFsbG93RWRpdEZpbGVzIiwiYWxsb3dEZWxldGVGaWxlcyIsIm1vZGlmeUFsbEZpbGVzIiwiZ2V0VGVtcGxhdGVTcGFjZUlkIiwidGVtcGxhdGVTcGFjZUlkIiwiZ2V0Q2xvdWRBZG1pblNwYWNlSWQiLCJjbG91ZEFkbWluU3BhY2VJZCIsImlzVGVtcGxhdGVTcGFjZSIsImlzQ2xvdWRBZG1pblNwYWNlIiwic3RlZWRvc1N0b3JhZ2VEaXIiLCJTVEVFRE9TX1NUT1JBR0VfRElSIiwibWV0aG9kcyIsImNvbGxlY3Rpb24iLCJuYW1lX2ZpZWxkX2tleSIsIm9wdGlvbnNfbGltaXQiLCJxdWVyeSIsInF1ZXJ5X29wdGlvbnMiLCJyZWNvcmRzIiwicmVzdWx0cyIsInNlYXJjaFRleHRRdWVyeSIsInNlbGVjdGVkIiwic29ydCIsInBhcmFtcyIsIk5BTUVfRklFTERfS0VZIiwic2VhcmNoVGV4dCIsIiRyZWdleCIsIiRvciIsIiRpbiIsImV4dGVuZCIsIiRuaW4iLCJmaWx0ZXJRdWVyeSIsImxpbWl0IiwiZmluZCIsImZldGNoIiwicmVjb3JkIiwibGFiZWwiLCJtZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEluaXRXaWR0aFBlcmNlbnQiLCJjb2x1bW5zIiwiX3NjaGVtYSIsImNvbHVtbl9udW0iLCJpbml0X3dpZHRoX3BlcmNlbnQiLCJnZXRTY2hlbWEiLCJmaWVsZF9uYW1lIiwiZmllbGQiLCJpc193aWRlIiwicmVmMiIsInBpY2siLCJhdXRvZm9ybSIsImdldEZpZWxkSXNXaWRlIiwiZ2V0VGFidWxhck9yZGVyIiwibGlzdF92aWV3X2lkIiwic2V0dGluZyIsInJlY29yZF9pZCIsIm1hcCIsImNvbHVtbiIsImhpZGRlbiIsImNvbXBhY3QiLCJvcmRlciIsImluZGV4IiwiZGVmYXVsdF9leHRyYV9jb2x1bW5zIiwiZXh0cmFfY29sdW1ucyIsImdldE9iamVjdERlZmF1bHRDb2x1bW5zIiwiZ2V0T2JqZWN0RGVmYXVsdEV4dHJhQ29sdW1ucyIsInVuaW9uIiwiZ2V0T2JqZWN0RGVmYXVsdFNvcnQiLCJUYWJ1bGFyU2VsZWN0ZWRJZHMiLCJjb252ZXJ0TGlzdFZpZXciLCJkZWZhdWx0X3ZpZXciLCJsaXN0X3ZpZXciLCJsaXN0X3ZpZXdfbmFtZSIsImRlZmF1bHRfY29sdW1ucyIsImRlZmF1bHRfbW9iaWxlX2NvbHVtbnMiLCJvaXRlbSIsIm1vYmlsZV9jb2x1bW5zIiwiaGFzIiwiaW5jbHVkZSIsImZpbHRlcl9zY29wZSIsInBhcnNlIiwiZm9yRWFjaCIsIl92YWx1ZSIsImdldFJlbGF0ZWRMaXN0IiwibGF5b3V0UmVsYXRlZExpc3QiLCJsaXN0IiwibWFwTGlzdCIsIm9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cyIsInJlbGF0ZWRMaXN0TmFtZXMiLCJyZWxhdGVkTGlzdE9iamVjdHMiLCJyZWxhdGVkX29iamVjdF9uYW1lcyIsInVucmVsYXRlZF9vYmplY3RzIiwicmVsYXRlZF9saXN0cyIsIml0ZW0iLCJyZUZpZWxkTmFtZSIsInJlT2JqZWN0TmFtZSIsInJlbGF0ZWQiLCJyZWxhdGVkX2ZpZWxkX2Z1bGxuYW1lIiwic3BsaXQiLCJmaWVsZF9uYW1lcyIsImlzX2ZpbGUiLCJjdXN0b21SZWxhdGVkTGlzdE9iamVjdCIsImFjdGlvbnMiLCJidXR0b25zIiwidmlzaWJsZV9vbiIsInBhZ2Vfc2l6ZSIsIm9iak9yTmFtZSIsImdldFJlbGF0ZWRPYmplY3RzIiwicmVsYXRlZF9vYmplY3RfaXRlbSIsInJlbGF0ZWRPYmplY3QiLCJ0YWJ1bGFyX29yZGVyIiwiZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMiLCJ3aXRob3V0IiwidHJhbnNmb3JtU29ydFRvVGFidWxhciIsInJlcGxhY2UiLCJwbHVjayIsImRpZmZlcmVuY2UiLCJ2IiwiaXNBY3RpdmUiLCJhbGxvd19yZWxhdGVkTGlzdCIsImdldE9iamVjdEZpcnN0TGlzdFZpZXciLCJmaXJzdCIsImdldExpc3RWaWV3cyIsImdldExpc3RWaWV3IiwiZXhhYyIsImxpc3RWaWV3cyIsImdldExpc3RWaWV3SXNSZWNlbnQiLCJsaXN0VmlldyIsInBpY2tPYmplY3RNb2JpbGVDb2x1bW5zIiwiY291bnQiLCJnZXRGaWVsZCIsImlzTmFtZUNvbHVtbiIsIml0ZW1Db3VudCIsIm1heENvdW50IiwibWF4Um93cyIsIm5hbWVDb2x1bW4iLCJuYW1lS2V5IiwicmVzdWx0IiwiZ2V0T2JqZWN0RGVmYXVsdFZpZXciLCJkZWZhdWx0VmlldyIsInVzZV9tb2JpbGVfY29sdW1ucyIsImlzQWxsVmlldyIsImlzUmVjZW50VmlldyIsInRhYnVsYXJDb2x1bW5zIiwidGFidWxhcl9zb3J0IiwiY29sdW1uX2luZGV4IiwidHJhbnNmb3JtU29ydFRvRFgiLCJkeF9zb3J0IiwiUmVnRXgiLCJjb2RlIiwiUmVnRXhwIiwiX3JlZ0V4TWVzc2FnZXMiLCJfZ2xvYmFsTWVzc2FnZXMiLCJyZWdFeCIsImV4cCIsIm1zZyIsIm1lc3NhZ2VzIiwiZXZhbEluQ29udGV4dCIsImpzIiwiZXZhbCIsImNhbGwiLCJjb252ZXJ0RmllbGQiLCJnZXRPcHRpb24iLCJvcHRpb24iLCJmb28iLCJjb2xvciIsImFsbE9wdGlvbnMiLCJwaWNrbGlzdCIsInBpY2tsaXN0T3B0aW9ucyIsImdldFBpY2tsaXN0IiwiZ2V0UGlja0xpc3RPcHRpb25zIiwicmV2ZXJzZSIsImVuYWJsZSIsImRlZmF1bHRWYWx1ZSIsInRyaWdnZXJzIiwidHJpZ2dlciIsIl90b2RvIiwiX3RvZG9fZnJvbV9jb2RlIiwiX3RvZG9fZnJvbV9kYiIsIm9uIiwidG9kbyIsInN5c3RlbUJhc2VGaWVsZHMiLCJvbWl0IiwicmVxdWlyZWQiLCJyZWFkb25seSIsImdldFN5c3RlbUJhc2VGaWVsZHMiLCJfdmlzaWJsZSIsImVycm9yMSIsImFjdGlvbnNCeU5hbWUiLCJ0cmltIiwiaXNFeHByZXNzaW9uIiwidmlzaWJsZSIsInJlY29yZF9wZXJtaXNzaW9ucyIsImdsb2JhbERhdGEiLCJhc3NpZ24iLCJub3ciLCJwYXJzZVNpbmdsZUV4cHJlc3Npb24iLCJfb3B0aW9ucyIsIl90eXBlIiwiYmVmb3JlT3BlbkZ1bmN0aW9uIiwiaXNfY29tcGFueV9saW1pdGVkIiwibWF4IiwibWluIiwiX29wdGlvbiIsImsiLCJfcmVnRXgiLCJfbWluIiwiX21heCIsIk51bWJlciIsIkJvb2xlYW4iLCJfb3B0aW9uc0Z1bmN0aW9uIiwiX3JlZmVyZW5jZV90byIsIl9jcmVhdGVGdW5jdGlvbiIsIl9iZWZvcmVPcGVuRnVuY3Rpb24iLCJfZmlsdGVyc0Z1bmN0aW9uIiwiX2RlZmF1bHRWYWx1ZSIsIl9pc19jb21wYW55X2xpbWl0ZWQiLCJfZmlsdGVycyIsImlzRGF0ZSIsInBvcCIsIl9pc19kYXRlIiwiZm9ybSIsInZhbCIsInJlbGF0ZWRPYmpJbmZvIiwiUFJFRklYIiwiX3ByZXBlbmRQcmVmaXhGb3JGb3JtdWxhIiwicHJlZml4IiwiZmllbGRWYXJpYWJsZSIsInJlZyIsInJldiIsIm0iLCIkMSIsImZvcm11bGFfc3RyIiwiX0NPTlRFWFQiLCJfVkFMVUVTIiwiZGF0YSIsImlzQm9vbGVhbiIsInRvYXN0ciIsImZvcm1hdE9iamVjdE5hbWUiLCJfYmFzZU9iamVjdCIsIl9kYiIsImRlZmF1bHRMaXN0Vmlld0lkIiwiZGlzYWJsZWRfbGlzdF92aWV3cyIsInJlZjMiLCJzY2hlbWEiLCJzZWxmIiwiYmFzZU9iamVjdCIsInBlcm1pc3Npb25fc2V0IiwiaWNvbiIsImRlc2NyaXB0aW9uIiwiaXNfdmlldyIsImhhc0ltcG9ydFRlbXBsYXRlcyIsInZlcnNpb24iLCJpc19lbmFibGUiLCJhbGxvd19jdXN0b21BY3Rpb25zIiwiZXhjbHVkZV9hY3Rpb25zIiwiZW5hYmxlX3NlYXJjaCIsInBhZ2luZyIsImVuYWJsZV9hcGkiLCJjdXN0b20iLCJlbmFibGVfc2hhcmUiLCJlbmFibGVfdHJlZSIsInNpZGViYXIiLCJvcGVuX3dpbmRvdyIsImZpbHRlcl9jb21wYW55IiwiY2FsZW5kYXIiLCJlbmFibGVfY2hhdHRlciIsImVuYWJsZV90cmFzaCIsImVuYWJsZV9zcGFjZV9nbG9iYWwiLCJlbmFibGVfZm9sbG93IiwiZW5hYmxlX3dvcmtmbG93IiwiZW5hYmxlX2lubGluZV9lZGl0IiwiZGV0YWlscyIsIm1hc3RlcnMiLCJsb29rdXBfZGV0YWlscyIsImluX2RldmVsb3BtZW50IiwiaWRGaWVsZE5hbWUiLCJkYXRhYmFzZV9uYW1lIiwiaXNfbmFtZSIsInByaW1hcnkiLCJmaWx0ZXJhYmxlIiwiaXRlbV9uYW1lIiwiY29weUl0ZW0iLCJhZG1pbiIsImFsbCIsImxpc3Rfdmlld19pdGVtIiwiUmVhY3RpdmVWYXIiLCJjcmVhdGVDb2xsZWN0aW9uIiwiX25hbWUiLCJnZXRPYmplY3RTY2hlbWEiLCJjb250YWlucyIsImF0dGFjaFNjaGVtYSIsIl9zaW1wbGVTY2hlbWEiLCJnZXRPYmplY3RPRGF0YVJvdXRlclByZWZpeCIsImJvb3RzdHJhcExvYWRlZCIsImdldFNlbGVjdE9wdGlvbnMiLCJmaWVsZFNjaGVtYSIsImRhdGFfdHlwZSIsIm9wdGlvbkl0ZW0iLCJmaWVsZHNBcnIiLCJfcmVmX29iaiIsImF1dG9mb3JtX3R5cGUiLCJjb2xsZWN0aW9uTmFtZSIsImZzIiwiZnNUeXBlIiwiaXNVbkxpbWl0ZWQiLCJtdWx0aXBsZSIsInJvd3MiLCJsYW5ndWFnZSIsImlzTW9iaWxlIiwiaXNQYWQiLCJpc2lPUyIsImFmRmllbGRJbnB1dCIsInRpbWV6b25lSWQiLCJkeERhdGVCb3hPcHRpb25zIiwiZGlzcGxheUZvcm1hdCIsInBpY2tlclR5cGUiLCJkYXRlTW9iaWxlT3B0aW9ucyIsIm91dEZvcm1hdCIsInNob3dJY29uIiwiZGVwZW5kT24iLCJkZXBlbmRfb24iLCJjcmVhdGUiLCJsb29rdXBfZmllbGQiLCJNb2RhbCIsInNob3ciLCJmb3JtSWQiLCJvcGVyYXRpb24iLCJvblN1Y2Nlc3MiLCJhZGRJdGVtcyIsInJlZmVyZW5jZV9zb3J0Iiwib3B0aW9uc1NvcnQiLCJyZWZlcmVuY2VfbGltaXQiLCJvcHRpb25zTGltaXQiLCJyZWZlcmVuY2VfdG9fZmllbGQiLCJyZWZlcmVuY2VUb0ZpZWxkIiwiYmxhY2tib3giLCJvYmplY3RTd2l0Y2hlIiwib3B0aW9uc01ldGhvZCIsIm9wdGlvbnNNZXRob2RQYXJhbXMiLCJyZWZlcmVuY2VzIiwiX3JlZmVyZW5jZSIsImxpbmsiLCJkZWZhdWx0SWNvbiIsImZpcnN0T3B0aW9uIiwiZGVjaW1hbCIsInByZWNpc2lvbiIsInNjYWxlIiwiZGlzYWJsZWQiLCJBcnJheSIsImVkaXRhYmxlIiwiYWNjZXB0Iiwic3lzdGVtIiwiRW1haWwiLCJpc051bWJlciIsIm9wdGlvbmFsIiwidW5pcXVlIiwiZ3JvdXAiLCJzZWFyY2hhYmxlIiwiaW5saW5lSGVscFRleHQiLCJpc1Byb2R1Y3Rpb24iLCJzb3J0YWJsZSIsImdldEZpZWxkRGlzcGxheVZhbHVlIiwiZmllbGRfdmFsdWUiLCJodG1sIiwibW9tZW50IiwiZm9ybWF0IiwiY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5IiwiZmllbGRfdHlwZSIsImluY2x1ZGVzIiwicHVzaEJldHdlZW5CdWlsdGluT3B0aW9uYWxzIiwib3BlcmF0aW9ucyIsImJ1aWx0aW5WYWx1ZXMiLCJnZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyIsImJ1aWx0aW5JdGVtIiwiaXNfY2hlY2tfb25seSIsImdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlcyIsImdldEJldHdlZW5CdWlsdGluVmFsdWVJdGVtIiwiZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtIiwiZ2V0QmV0d2VlbkJ1aWx0aW5PcGVyYXRpb24iLCJiZXR3ZWVuQnVpbHRpblZhbHVlcyIsImdldFF1YXJ0ZXJTdGFydE1vbnRoIiwibW9udGgiLCJnZXRNb250aCIsImdldExhc3RRdWFydGVyRmlyc3REYXkiLCJ5ZWFyIiwiZ2V0RnVsbFllYXIiLCJnZXROZXh0UXVhcnRlckZpcnN0RGF5IiwiZ2V0TW9udGhEYXlzIiwiZGF5cyIsImVuZERhdGUiLCJtaWxsaXNlY29uZCIsInN0YXJ0RGF0ZSIsImdldExhc3RNb250aEZpcnN0RGF5IiwiY3VycmVudE1vbnRoIiwiY3VycmVudFllYXIiLCJlbmRWYWx1ZSIsImZpcnN0RGF5IiwibGFzdERheSIsImxhc3RNb25kYXkiLCJsYXN0TW9udGhGaW5hbERheSIsImxhc3RNb250aEZpcnN0RGF5IiwibGFzdFF1YXJ0ZXJFbmREYXkiLCJsYXN0UXVhcnRlclN0YXJ0RGF5IiwibGFzdFN1bmRheSIsImxhc3RfMTIwX2RheXMiLCJsYXN0XzMwX2RheXMiLCJsYXN0XzYwX2RheXMiLCJsYXN0XzdfZGF5cyIsImxhc3RfOTBfZGF5cyIsIm1pbnVzRGF5IiwibW9uZGF5IiwibmV4dE1vbmRheSIsIm5leHRNb250aEZpbmFsRGF5IiwibmV4dE1vbnRoRmlyc3REYXkiLCJuZXh0UXVhcnRlckVuZERheSIsIm5leHRRdWFydGVyU3RhcnREYXkiLCJuZXh0U3VuZGF5IiwibmV4dFllYXIiLCJuZXh0XzEyMF9kYXlzIiwibmV4dF8zMF9kYXlzIiwibmV4dF82MF9kYXlzIiwibmV4dF83X2RheXMiLCJuZXh0XzkwX2RheXMiLCJwcmV2aW91c1llYXIiLCJzdGFydFZhbHVlIiwic3RyRW5kRGF5Iiwic3RyRmlyc3REYXkiLCJzdHJMYXN0RGF5Iiwic3RyTW9uZGF5Iiwic3RyU3RhcnREYXkiLCJzdHJTdW5kYXkiLCJzdHJUb2RheSIsInN0clRvbW9ycm93Iiwic3RyWWVzdGRheSIsInN1bmRheSIsInRoaXNRdWFydGVyRW5kRGF5IiwidGhpc1F1YXJ0ZXJTdGFydERheSIsInRvbW9ycm93Iiwid2VlayIsInllc3RkYXkiLCJnZXREYXkiLCJ0IiwiZnYiLCJzZXRIb3VycyIsImdldEhvdXJzIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRGaWVsZERlZmF1bHRPcGVyYXRpb24iLCJnZXRGaWVsZE9wZXJhdGlvbiIsIm9wdGlvbmFscyIsImVxdWFsIiwidW5lcXVhbCIsImxlc3NfdGhhbiIsImdyZWF0ZXJfdGhhbiIsImxlc3Nfb3JfZXF1YWwiLCJncmVhdGVyX29yX2VxdWFsIiwibm90X2NvbnRhaW4iLCJzdGFydHNfd2l0aCIsImJldHdlZW4iLCJnZXRPYmplY3RGaWVsZHNOYW1lIiwiZmllbGRzTmFtZSIsInNvcnRfbm8iLCJjbGVhblRyaWdnZXIiLCJpbml0VHJpZ2dlciIsIl90cmlnZ2VyX2hvb2tzIiwicmVmNCIsInJlZjUiLCJ0b2RvV3JhcHBlciIsImFwcGx5IiwiYXJndW1lbnRzIiwid2hlbiIsImJlZm9yZSIsImluc2VydCIsInVwZGF0ZSIsInJlbW92ZSIsImFmdGVyIiwiX2hvb2siLCJ0cmlnZ2VyX25hbWUiLCJfdHJpZ2dlcl9ob29rIiwiYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzIiwiZXh0ZW5kUGVybWlzc2lvblByb3BzIiwiZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdCIsImZpbmRfcGVybWlzc2lvbl9vYmplY3QiLCJpbnRlcnNlY3Rpb25QbHVzIiwib3RoZXJQZXJtaXNzaW9uUHJvcE5hbWVzIiwib3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzIiwicGVybWlzc2lvblByb3BOYW1lcyIsInVuaW9uUGVybWlzc2lvbk9iamVjdHMiLCJ1bmlvblBsdXMiLCJnZXRPYmplY3RQZXJtaXNzaW9ucyIsImdldFJlY29yZFBlcm1pc3Npb25zIiwiaXNPd25lciIsIm1hc3Rlck9iamVjdE5hbWUiLCJtYXN0ZXJSZWNvcmRQZXJtIiwicmVjb3JkX2NvbXBhbnlfaWQiLCJyZWNvcmRfY29tcGFueV9pZHMiLCJ1c2VyX2NvbXBhbnlfaWRzIiwib3duZXIiLCJwYXJlbnQiLCJuIiwiaW50ZXJzZWN0aW9uIiwibG9ja2VkIiwiZ2V0UmVjb3JkUmVsYXRlZExpc3RQZXJtaXNzaW9ucyIsImN1cnJlbnRPYmplY3ROYW1lIiwicmVsYXRlZExpc3RJdGVtIiwiY3VycmVudFJlY29yZCIsImlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZSIsIm1hc3RlckFsbG93IiwicmVsYXRlZE9iamVjdFBlcm1pc3Npb25zIiwidW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QiLCJnZXRPYmplY3RSZWNvcmQiLCJnZXRSZWNvcmRTYWZlUmVsYXRlZExpc3QiLCJnZXRBbGxQZXJtaXNzaW9ucyIsIl9pIiwicHNldHMiLCJwc2V0c0FkbWluIiwicHNldHNBZG1pbl9wb3MiLCJwc2V0c0N1cnJlbnQiLCJwc2V0c0N1cnJlbnROYW1lcyIsInBzZXRzQ3VycmVudF9wb3MiLCJwc2V0c0N1c3RvbWVyIiwicHNldHNDdXN0b21lcl9wb3MiLCJwc2V0c0d1ZXN0IiwicHNldHNHdWVzdF9wb3MiLCJwc2V0c01lbWJlciIsInBzZXRzTWVtYmVyX3BvcyIsInBzZXRzU3VwcGxpZXIiLCJwc2V0c1N1cHBsaWVyX3BvcyIsInBzZXRzVXNlciIsInBzZXRzVXNlcl9wb3MiLCJzZXRfaWRzIiwic3BhY2VVc2VyIiwib2JqZWN0cyIsImFzc2lnbmVkX2FwcHMiLCJwcm9maWxlIiwidXNlcnMiLCJwZXJtaXNzaW9uX3NldF9pZCIsIm1vZGlmaWVkIiwiY3JlYXRlZF9ieSIsIm1vZGlmaWVkX2J5IiwiZ2V0QXNzaWduZWRBcHBzIiwiYmluZCIsImFzc2lnbmVkX21lbnVzIiwiZ2V0QXNzaWduZWRNZW51cyIsInVzZXJfcGVybWlzc2lvbl9zZXRzIiwiYXJyYXkiLCJvdGhlciIsInRhcmdldCIsInByb3BzIiwiZmlsZXNQcm9OYW1lcyIsInByb3BOYW1lcyIsInByb3BOYW1lIiwiYXBwcyIsInBzZXRCYXNlIiwidXNlclByb2ZpbGUiLCJwc2V0IiwidW5pcSIsImFib3V0TWVudSIsImFkbWluTWVudXMiLCJhbGxNZW51cyIsImN1cnJlbnRQc2V0TmFtZXMiLCJtZW51cyIsIm90aGVyTWVudUFwcHMiLCJvdGhlck1lbnVzIiwiYWRtaW5fbWVudXMiLCJmbGF0dGVuIiwibWVudSIsInBzZXRzTWVudSIsInBlcm1pc3Npb25fc2V0cyIsInBlcm1pc3Npb25fb2JqZWN0cyIsImlzTnVsbCIsInBlcm1pc3Npb25fc2V0X2lkcyIsInBvcyIsIm9wcyIsIm9wc19rZXkiLCJjdXJyZW50UHNldCIsInRlbXBPcHMiLCJyZXBlYXRJbmRleCIsInJlcGVhdFBvIiwib3BzZXRBZG1pbiIsIm9wc2V0Q3VzdG9tZXIiLCJvcHNldEd1ZXN0Iiwib3BzZXRNZW1iZXIiLCJvcHNldFN1cHBsaWVyIiwib3BzZXRVc2VyIiwicG9zQWRtaW4iLCJwb3NDdXN0b21lciIsInBvc0d1ZXN0IiwicG9zTWVtYmVyIiwicG9zU3VwcGxpZXIiLCJwb3NVc2VyIiwicHJvZiIsImd1ZXN0IiwibWVtYmVyIiwic3VwcGxpZXIiLCJjdXN0b21lciIsImRpc2FibGVkX2FjdGlvbnMiLCJ1bnJlYWRhYmxlX2ZpZWxkcyIsInVuZWRpdGFibGVfZmllbGRzIiwiY3JlYXRvcl9kYl91cmwiLCJvcGxvZ191cmwiLCJNT05HT19VUkxfQ1JFQVRPUiIsIk1PTkdPX09QTE9HX1VSTF9DUkVBVE9SIiwiX0NSRUFUT1JfREFUQVNPVVJDRSIsIl9kcml2ZXIiLCJNb25nb0ludGVybmFscyIsIlJlbW90ZUNvbGxlY3Rpb25Ecml2ZXIiLCJvcGxvZ1VybCIsImNvbGxlY3Rpb25fa2V5IiwibmV3Q29sbGVjdGlvbiIsIlNNU1F1ZXVlIiwiX2RlbGV0ZVJlY29yZCIsImFjdGlvbl9uYW1lIiwiZXhlY3V0ZUFjdGlvbiIsIml0ZW1fZWxlbWVudCIsImNhbGxiYWNrIiwibW9yZUFyZ3MiLCJ0b2RvQXJncyIsIk9iamVjdEdyaWQiLCJnZXRGaWx0ZXJzIiwid29yZF90ZW1wbGF0ZSIsIlN0ZWVkb3NGaWx0ZXJzIiwiZm9ybWF0RmlsdGVyc1RvT0RhdGFRdWVyeSIsImFic29sdXRlVXJsIiwid2luZG93Iiwib3BlbiIsIm9kYXRhIiwicHJvdG90eXBlIiwic2xpY2UiLCJjb25jYXQiLCJ3YXJuaW5nIiwicmVjb3JkX3RpdGxlIiwiY2FsbF9iYWNrIiwiY2FsbF9iYWNrX2Vycm9yIiwicHJldmlvdXNEb2MiLCJGb3JtTWFuYWdlciIsImdldFByZXZpb3VzRG9jIiwiaW5mbyIsInN1Y2Nlc3MiLCJydW5Ib29rIiwicmVsYXRlZE9iamVjdFN0YW5kYXJkTmV3IiwiY29sbGVjdGlvbl9uYW1lIiwiY3VycmVudF9vYmplY3RfbmFtZSIsImN1cnJlbnRfcmVjb3JkX2lkIiwiZGVmYXVsdERvYyIsImluaXRpYWxWYWx1ZXMiLCJyZWxhdGVPYmplY3QiLCJzZXQiLCJnZXRSZWxhdGVkSW5pdGlhbFZhbHVlcyIsIlN0ZWVkb3NVSSIsInNob3dNb2RhbCIsInN0b3JlcyIsIkNvbXBvbmVudFJlZ2lzdHJ5IiwiY29tcG9uZW50cyIsIk9iamVjdEZvcm0iLCJvYmplY3RBcGlOYW1lIiwidGl0bGUiLCJhZnRlckluc2VydCIsInJlbG9hZFJlY29yZCIsIkZsb3dSb3V0ZXIiLCJyZWxvYWQiLCJpY29uUGF0aCIsImRlZmVyIiwiJCIsImNsaWNrIiwiZ3JpZE5hbWUiLCJpc1JlbGF0ZWQiLCJtYXN0ZXJSZWNvcmRJZCIsInJlbGF0ZWRGaWVsZE5hbWUiLCJzZWxlY3RlZFJvd3MiLCJncmlkUmVmcyIsImN1cnJlbnQiLCJhcGkiLCJnZXRTZWxlY3RlZFJvd3MiLCJncmlkUmVmIiwiZ2V0SW5pdGlhbFZhbHVlcyIsIlBhZ2UiLCJGb3JtIiwiU3RhbmRhcmROZXciLCJyZW5kZXIiLCJocmVmIiwiZ2V0T2JqZWN0VXJsIiwicmVkaXJlY3QiLCJTdGFuZGFyZEVkaXQiLCJiZWZvcmVIb29rIiwiaTE4blRleHRLZXkiLCJpMThuVGl0bGVLZXkiLCJuYW1lRmllbGQiLCJzZWxlY3RlZFJlY29yZHMiLCJ0ZXh0IiwiZ2V0VGFibGVTZWxlY3RlZFJvd3MiLCJzd2FsIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNvbmZpcm1CdXR0b25UZXh0IiwiY2FuY2VsQnV0dG9uVGV4dCIsImFmdGVyQmF0Y2hlc0RlbGV0ZSIsImRlbGV0ZUNvdW50ZXIiLCJfZSIsImFwcGlkIiwiZHhEYXRhR3JpZEluc3RhbmNlIiwiZ3JpZENvbnRhaW5lciIsImdyaWRPYmplY3ROYW1lQ2xhc3MiLCJpc09wZW5lclJlbW92ZSIsInJlY29yZFVybCIsInRlbXBOYXZSZW1vdmVkIiwib3BlbmVyIiwicm91dGUiLCJlbmRzV2l0aCIsInJlZnJlc2hHcmlkIiwiZHhUcmVlTGlzdCIsImR4RGF0YUdyaWQiLCJyZWZyZXNoIiwicmVtb3ZlVGVtcE5hdkl0ZW0iLCJjbG9zZSIsImdvIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInJlY29yZFRpdGxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxLQUFDQSxFQUFELEdBQU0sRUFBTjs7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O0FEN0ZSO0FBREQ7QUNvSEk7QUQ1SE4sUUNxQkc7QUQzSUo7QUFBQSxHQUZEO0FDd1BBLEMiLCJmaWxlIjoiL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIkBkYiA9IHt9XG5pZiAhQ3JlYXRvcj9cblx0QENyZWF0b3IgPSB7fVxuQ3JlYXRvci5PYmplY3RzID0ge31cbkNyZWF0b3IuQ29sbGVjdGlvbnMgPSB7fVxuQ3JlYXRvci5NZW51cyA9IFtdXG5DcmVhdG9yLkFwcHMgPSB7fVxuQ3JlYXRvci5EYXNoYm9hcmRzID0ge31cbkNyZWF0b3IuUmVwb3J0cyA9IHt9XG5DcmVhdG9yLnN1YnMgPSB7fVxuQ3JlYXRvci5zdGVlZG9zU2NoZW1hID0ge30iLCJ0aGlzLmRiID0ge307XG5cbmlmICh0eXBlb2YgQ3JlYXRvciA9PT0gXCJ1bmRlZmluZWRcIiB8fCBDcmVhdG9yID09PSBudWxsKSB7XG4gIHRoaXMuQ3JlYXRvciA9IHt9O1xufVxuXG5DcmVhdG9yLk9iamVjdHMgPSB7fTtcblxuQ3JlYXRvci5Db2xsZWN0aW9ucyA9IHt9O1xuXG5DcmVhdG9yLk1lbnVzID0gW107XG5cbkNyZWF0b3IuQXBwcyA9IHt9O1xuXG5DcmVhdG9yLkRhc2hib2FyZHMgPSB7fTtcblxuQ3JlYXRvci5SZXBvcnRzID0ge307XG5cbkNyZWF0b3Iuc3VicyA9IHt9O1xuXG5DcmVhdG9yLnN0ZWVkb3NTY2hlbWEgPSB7fTtcbiIsInRyeVxuXHRpZiBwcm9jZXNzLmVudi5DUkVBVE9SX05PREVfRU5WID09ICdkZXZlbG9wbWVudCdcblx0XHRzdGVlZG9zQ29yZSA9IHJlcXVpcmUoJ0BzdGVlZG9zL2NvcmUnKVxuXHRcdG9iamVjdHFsID0gcmVxdWlyZSgnQHN0ZWVkb3Mvb2JqZWN0cWwnKVxuXHRcdG1vbGVjdWxlciA9IHJlcXVpcmUoXCJtb2xlY3VsZXJcIik7XG5cdFx0cGFja2FnZUxvYWRlciA9IHJlcXVpcmUoJ0BzdGVlZG9zL3NlcnZpY2UtbWV0ZW9yLXBhY2thZ2UtbG9hZGVyJyk7XG5cdFx0QVBJU2VydmljZSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3NlcnZpY2UtYXBpJyk7XG5cdFx0TWV0YWRhdGFTZXJ2aWNlID0gcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1tZXRhZGF0YS1zZXJ2ZXInKTtcblx0XHRwYWNrYWdlU2VydmljZSA9IHJlcXVpcmUoXCJAc3RlZWRvcy9zZXJ2aWNlLXBhY2thZ2UtcmVnaXN0cnlcIik7XG5cdFx0cGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG5cdFx0Y29uZmlnID0gb2JqZWN0cWwuZ2V0U3RlZWRvc0NvbmZpZygpO1xuXHRcdHNldHRpbmdzID0ge1xuXHRcdFx0YnVpbHRfaW5fcGx1Z2luczogW1xuXHRcdFx0XHRcIkBzdGVlZG9zL3N0YW5kYXJkLXNwYWNlXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc3RhbmRhcmQtb2JqZWN0LWRhdGFiYXNlXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc3RhbmRhcmQtcHJvY2Vzcy1hcHByb3ZhbFwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3N0YW5kYXJkLWNvbGxhYm9yYXRpb25cIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zdGFuZGFyZC11aVwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3N0YW5kYXJkLXBlcm1pc3Npb25cIixcblx0XHRcdFx0XCJAc3RlZWRvcy93ZWJhcHAtcHVibGljXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS1jYWNoZXJzLW1hbmFnZXJcIixcblx0XHRcdFx0XCJAc3RlZWRvcy91bnBrZ1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3dvcmtmbG93XCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3MvYWNjb3VudHNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9wbHVnaW4tY29tcGFueVwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL21ldGFkYXRhLWFwaVwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL2RhdGEtaW1wb3J0XCIsXG5cdFx0XHRcdCMgXCJAc3RlZWRvcy9zZXJ2aWNlLWZpZWxkcy1pbmRleHNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLWFjY291bnRzXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS1jaGFydHNcIixcblx0XHRcdFx0IyBcIkBzdGVlZG9zL3NlcnZpY2UtcGFnZXNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLXBhY2thZ2UtcmVnaXN0cnlcIixcblx0XHQgICBcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLXBhY2thZ2UtdG9vbFwiLFxuXHRcdFx0XHQjIFwiQHN0ZWVkb3Mvc3RhbmRhcmQtcHJvY2Vzc1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3dlYmFwcC1hY2NvdW50c1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3NlcnZpY2Utd29ya2Zsb3dcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLXBsdWdpbi1hbWlzXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS1maWxlc1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3NlcnZpY2Utc2VudHJ5XCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS1pZGVudGl0eS1qd3RcIlxuXHRcdFx0XSxcblx0XHRcdHBsdWdpbnM6IGNvbmZpZy5wbHVnaW5zXG5cdFx0fVxuXHRcdE1ldGVvci5zdGFydHVwIC0+XG5cdFx0XHR0cnlcblx0XHRcdFx0YnJva2VyID0gbmV3IG1vbGVjdWxlci5TZXJ2aWNlQnJva2VyKHtcblx0XHRcdFx0XHRuYW1lc3BhY2U6IFwic3RlZWRvc1wiLFxuXHRcdFx0XHRcdG5vZGVJRDogXCJzdGVlZG9zLWNyZWF0b3JcIixcblx0XHRcdFx0XHRtZXRhZGF0YToge30sXG5cdFx0XHRcdFx0dHJhbnNwb3J0ZXI6IHByb2Nlc3MuZW52LlRSQU5TUE9SVEVSLFxuXHRcdFx0XHRcdGNhY2hlcjogcHJvY2Vzcy5lbnYuQ0FDSEVSLFxuXHRcdFx0XHRcdGxvZ0xldmVsOiBcIndhcm5cIixcblx0XHRcdFx0XHRzZXJpYWxpemVyOiBcIkpTT05cIixcblx0XHRcdFx0XHRyZXF1ZXN0VGltZW91dDogNjAgKiAxMDAwLFxuXHRcdFx0XHRcdG1heENhbGxMZXZlbDogMTAwLFxuXG5cdFx0XHRcdFx0aGVhcnRiZWF0SW50ZXJ2YWw6IDEwLFxuXHRcdFx0XHRcdGhlYXJ0YmVhdFRpbWVvdXQ6IDMwLFxuXG5cdFx0XHRcdFx0Y29udGV4dFBhcmFtc0Nsb25pbmc6IGZhbHNlLFxuXG5cdFx0XHRcdFx0dHJhY2tpbmc6IHtcblx0XHRcdFx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2h1dGRvd25UaW1lb3V0OiA1MDAwLFxuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRkaXNhYmxlQmFsYW5jZXI6IGZhbHNlLFxuXG5cdFx0XHRcdFx0cmVnaXN0cnk6IHtcblx0XHRcdFx0XHRcdHN0cmF0ZWd5OiBcIlJvdW5kUm9iaW5cIixcblx0XHRcdFx0XHRcdHByZWZlckxvY2FsOiB0cnVlXG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdGJ1bGtoZWFkOiB7XG5cdFx0XHRcdFx0XHRlbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRcdGNvbmN1cnJlbmN5OiAxMCxcblx0XHRcdFx0XHRcdG1heFF1ZXVlU2l6ZTogMTAwLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dmFsaWRhdG9yOiB0cnVlLFxuXHRcdFx0XHRcdGVycm9ySGFuZGxlcjogbnVsbCxcblx0XHRcdFx0XHR0cmFjaW5nOiB7XG5cdFx0XHRcdFx0XHRlbmFibGVkOiBmYWxzZSxcblx0XHRcdFx0XHRcdGV4cG9ydGVyOiB7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiQ29uc29sZVwiLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0bG9nZ2VyOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRcdGNvbG9yczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdFx0XHRcdGdhdWdlV2lkdGg6IDQwXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHNraXBQcm9jZXNzRXZlbnRSZWdpc3RyYXRpb246IHRydWUsXG5cblx0XHRcdFx0XHRjcmVhdGVkOiAoYnJva2VyKS0+IFxuXHRcdFx0XHRcdFx0IyBDbGVhciBhbGwgY2FjaGUgZW50cmllc1xuXHRcdFx0XHRcdFx0YnJva2VyLmxvZ2dlci53YXJuKCdDbGVhciBhbGwgY2FjaGUgZW50cmllcyBvbiBzdGFydHVwLicpXG5cdFx0XHRcdFx0XHRicm9rZXIuY2FjaGVyLmNsZWFuKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG9iamVjdHFsLmJyb2tlci5pbml0KGJyb2tlcik7XG5cblx0XHRcdFx0b2JqZWN0cWxTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2UocmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2Utb2JqZWN0cWxcIikpO1xuXHRcdFx0XHRcblx0XHRcdFx0cHJvamVjdFNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG5cdFx0XHRcdFx0bmFtZTogXCJwcm9qZWN0LXNlcnZlclwiLFxuXHRcdFx0XHRcdG5hbWVzcGFjZTogXCJzdGVlZG9zXCIsXG5cdFx0XHRcdFx0bWl4aW5zOiBbcGFja2FnZVNlcnZpY2VdLFxuXHRcdFx0XHR9KTtcblxuXG5cdFx0XHRcdG1ldGFkYXRhU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcblx0XHRcdFx0XHRuYW1lOiAnbWV0YWRhdGEtc2VydmVyJyxcblx0XHRcdFx0XHRtaXhpbnM6IFtNZXRhZGF0YVNlcnZpY2VdLFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0fSBcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dWlTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2UocmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2UtdWlcIikpO1xuXG5cdFx0XHRcdGFwaVNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG5cdFx0XHRcdFx0bmFtZTogXCJhcGlcIixcblx0XHRcdFx0XHRtaXhpbnM6IFtBUElTZXJ2aWNlXSxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0cG9ydDogbnVsbFxuXHRcdFx0XHRcdH0gXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHBhZ2VTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuXHRcdFx0XHRcdG5hbWU6IFwiQHN0ZWVkb3Mvc2VydmljZS1wYWdlc1wiLFxuXHRcdFx0XHRcdG1peGluczogW3JlcXVpcmUoJ0BzdGVlZG9zL3NlcnZpY2UtcGFnZXMnKV0sXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdHBvcnQ6IG51bGxcblx0XHRcdFx0XHR9IFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRzdGVlZG9zU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcblx0XHRcdFx0XHRuYW1lOiBcInN0ZWVkb3Mtc2VydmVyXCIsXG5cdFx0XHRcdFx0bWl4aW5zOiBbXSxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0cG9ydDogbnVsbFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c3RhcnRlZDogKCktPlxuXHRcdFx0XHRcdFx0c2V0VGltZW91dCAtPlxuXHRcdFx0XHRcdFx0XHRicm9rZXIuZW1pdCAnc3RlZWRvcy1zZXJ2ZXIuc3RhcnRlZCdcblx0XHRcdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdFx0XHQsIDEwMDBcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0b2JqZWN0cWwuZ2V0U3RlZWRvc1NjaGVtYShicm9rZXIpO1xuXHRcdFx0XHRzdGFuZGFyZE9iamVjdHNEaXIgPSBvYmplY3RxbC5TdGFuZGFyZE9iamVjdHNQYXRoO1xuXHRcdFx0XHRzdGFuZGFyZE9iamVjdHNQYWNrYWdlTG9hZGVyU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcblx0XHRcdFx0XHRuYW1lOiAnc3RhbmRhcmQtb2JqZWN0cycsXG5cdFx0XHRcdFx0bWl4aW5zOiBbcGFja2FnZUxvYWRlcl0sXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHsgcGFja2FnZUluZm86IHtcblx0XHRcdFx0XHRcdHBhdGg6IHN0YW5kYXJkT2JqZWN0c0Rpcixcblx0XHRcdFx0XHR9IH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0TWV0ZW9yLndyYXBBc3luYygoY2IpLT5cblx0XHRcdFx0XHRicm9rZXIuc3RhcnQoKS50aGVuKCgpLT5cblx0XHRcdFx0XHRcdGlmICFicm9rZXIuc3RhcnRlZCBcblx0XHRcdFx0XHRcdFx0YnJva2VyLl9yZXN0YXJ0U2VydmljZShvYmplY3RxbFNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0XHRicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdFx0YnJva2VyLl9yZXN0YXJ0U2VydmljZSh1aVNlcnZpY2UpO1xuXG5cdFx0XHRcdFx0XHRleHByZXNzID0gcmVxdWlyZSgnZXhwcmVzcycpO1xuXHRcdFx0XHRcdFx0Y29ubmVjdEhhbmRsZXJzRXhwcmVzcyA9IGV4cHJlc3MoKTtcblx0XHRcdFx0XHRcdGNvbm5lY3RIYW5kbGVyc0V4cHJlc3MudXNlKHJlcXVpcmUoJ0BzdGVlZG9zL3JvdXRlcicpLnN0YXRpY1JvdXRlcigpKTtcblx0XHRcdFx0XHRcdGJyb2tlci53YWl0Rm9yU2VydmljZXMoJ35wYWNrYWdlcy1Ac3RlZWRvcy9zZXJ2aWNlLXVpJykudGhlbiAoKS0+XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCd3YWl0Rm9yU2VydmljZXMgfnBhY2thZ2VzLUBzdGVlZG9zL3NlcnZpY2UtdWknKVxuXHRcdFx0XHRcdFx0XHRjb25uZWN0SGFuZGxlcnNFeHByZXNzLnVzZShTdGVlZG9zQXBpLmV4cHJlc3MoKSlcblx0XHRcdFx0XHRcdFx0V2ViQXBwLmNvbm5lY3RIYW5kbGVycy51c2UoY29ubmVjdEhhbmRsZXJzRXhwcmVzcylcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0IyBzdGVlZG9zQ29yZS5pbml0KHNldHRpbmdzKS50aGVuICgpLT5cblx0XHRcdFx0XHRcdCMgXHRjYigpO1xuXG5cdFx0XHRcdFx0XHRicm9rZXIud2FpdEZvclNlcnZpY2VzKHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlLm5hbWUpLnRoZW4gKHJlc29sdmUsIHJlamVjdCkgLT5cblx0XHRcdFx0XHRcdFx0c3RlZWRvc0NvcmUuaW5pdChzZXR0aW5ncykudGhlbiAoKS0+XG5cdFx0XHRcdFx0XHRcdFx0Y2IocmVqZWN0LCByZXNvbHZlKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSgpXG5cdFx0XHRjYXRjaCBleFxuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiZXJyb3I6XCIsZXgpXG5jYXRjaCBlXG5cdGNvbnNvbGUuZXJyb3IoXCJlcnJvcjpcIixlKSIsInZhciBBUElTZXJ2aWNlLCBNZXRhZGF0YVNlcnZpY2UsIGNvbmZpZywgZSwgbW9sZWN1bGVyLCBvYmplY3RxbCwgcGFja2FnZUxvYWRlciwgcGFja2FnZVNlcnZpY2UsIHBhdGgsIHNldHRpbmdzLCBzdGVlZG9zQ29yZTtcblxudHJ5IHtcbiAgaWYgKHByb2Nlc3MuZW52LkNSRUFUT1JfTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBzdGVlZG9zQ29yZSA9IHJlcXVpcmUoJ0BzdGVlZG9zL2NvcmUnKTtcbiAgICBvYmplY3RxbCA9IHJlcXVpcmUoJ0BzdGVlZG9zL29iamVjdHFsJyk7XG4gICAgbW9sZWN1bGVyID0gcmVxdWlyZShcIm1vbGVjdWxlclwiKTtcbiAgICBwYWNrYWdlTG9hZGVyID0gcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1tZXRlb3ItcGFja2FnZS1sb2FkZXInKTtcbiAgICBBUElTZXJ2aWNlID0gcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1hcGknKTtcbiAgICBNZXRhZGF0YVNlcnZpY2UgPSByZXF1aXJlKCdAc3RlZWRvcy9zZXJ2aWNlLW1ldGFkYXRhLXNlcnZlcicpO1xuICAgIHBhY2thZ2VTZXJ2aWNlID0gcmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2UtcGFja2FnZS1yZWdpc3RyeVwiKTtcbiAgICBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuICAgIGNvbmZpZyA9IG9iamVjdHFsLmdldFN0ZWVkb3NDb25maWcoKTtcbiAgICBzZXR0aW5ncyA9IHtcbiAgICAgIGJ1aWx0X2luX3BsdWdpbnM6IFtcIkBzdGVlZG9zL3N0YW5kYXJkLXNwYWNlXCIsIFwiQHN0ZWVkb3Mvc3RhbmRhcmQtb2JqZWN0LWRhdGFiYXNlXCIsIFwiQHN0ZWVkb3Mvc3RhbmRhcmQtcHJvY2Vzcy1hcHByb3ZhbFwiLCBcIkBzdGVlZG9zL3N0YW5kYXJkLWNvbGxhYm9yYXRpb25cIiwgXCJAc3RlZWRvcy9zdGFuZGFyZC11aVwiLCBcIkBzdGVlZG9zL3N0YW5kYXJkLXBlcm1pc3Npb25cIiwgXCJAc3RlZWRvcy93ZWJhcHAtcHVibGljXCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1jYWNoZXJzLW1hbmFnZXJcIiwgXCJAc3RlZWRvcy91bnBrZ1wiLCBcIkBzdGVlZG9zL3dvcmtmbG93XCIsIFwiQHN0ZWVkb3MvYWNjb3VudHNcIiwgXCJAc3RlZWRvcy9wbHVnaW4tY29tcGFueVwiLCBcIkBzdGVlZG9zL21ldGFkYXRhLWFwaVwiLCBcIkBzdGVlZG9zL2RhdGEtaW1wb3J0XCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1hY2NvdW50c1wiLCBcIkBzdGVlZG9zL3NlcnZpY2UtY2hhcnRzXCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1wYWNrYWdlLXJlZ2lzdHJ5XCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1wYWNrYWdlLXRvb2xcIiwgXCJAc3RlZWRvcy93ZWJhcHAtYWNjb3VudHNcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLXdvcmtmbG93XCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1wbHVnaW4tYW1pc1wiLCBcIkBzdGVlZG9zL3NlcnZpY2UtZmlsZXNcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLXNlbnRyeVwiLCBcIkBzdGVlZG9zL3NlcnZpY2UtaWRlbnRpdHktand0XCJdLFxuICAgICAgcGx1Z2luczogY29uZmlnLnBsdWdpbnNcbiAgICB9O1xuICAgIE1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFwaVNlcnZpY2UsIGJyb2tlciwgZXgsIG1ldGFkYXRhU2VydmljZSwgb2JqZWN0cWxTZXJ2aWNlLCBwYWdlU2VydmljZSwgcHJvamVjdFNlcnZpY2UsIHN0YW5kYXJkT2JqZWN0c0Rpciwgc3RhbmRhcmRPYmplY3RzUGFja2FnZUxvYWRlclNlcnZpY2UsIHN0ZWVkb3NTZXJ2aWNlLCB1aVNlcnZpY2U7XG4gICAgICB0cnkge1xuICAgICAgICBicm9rZXIgPSBuZXcgbW9sZWN1bGVyLlNlcnZpY2VCcm9rZXIoe1xuICAgICAgICAgIG5hbWVzcGFjZTogXCJzdGVlZG9zXCIsXG4gICAgICAgICAgbm9kZUlEOiBcInN0ZWVkb3MtY3JlYXRvclwiLFxuICAgICAgICAgIG1ldGFkYXRhOiB7fSxcbiAgICAgICAgICB0cmFuc3BvcnRlcjogcHJvY2Vzcy5lbnYuVFJBTlNQT1JURVIsXG4gICAgICAgICAgY2FjaGVyOiBwcm9jZXNzLmVudi5DQUNIRVIsXG4gICAgICAgICAgbG9nTGV2ZWw6IFwid2FyblwiLFxuICAgICAgICAgIHNlcmlhbGl6ZXI6IFwiSlNPTlwiLFxuICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiA2MCAqIDEwMDAsXG4gICAgICAgICAgbWF4Q2FsbExldmVsOiAxMDAsXG4gICAgICAgICAgaGVhcnRiZWF0SW50ZXJ2YWw6IDEwLFxuICAgICAgICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IDMwLFxuICAgICAgICAgIGNvbnRleHRQYXJhbXNDbG9uaW5nOiBmYWxzZSxcbiAgICAgICAgICB0cmFja2luZzoge1xuICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBzaHV0ZG93blRpbWVvdXQ6IDUwMDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc2FibGVCYWxhbmNlcjogZmFsc2UsXG4gICAgICAgICAgcmVnaXN0cnk6IHtcbiAgICAgICAgICAgIHN0cmF0ZWd5OiBcIlJvdW5kUm9iaW5cIixcbiAgICAgICAgICAgIHByZWZlckxvY2FsOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBidWxraGVhZDoge1xuICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBjb25jdXJyZW5jeTogMTAsXG4gICAgICAgICAgICBtYXhRdWV1ZVNpemU6IDEwMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdG9yOiB0cnVlLFxuICAgICAgICAgIGVycm9ySGFuZGxlcjogbnVsbCxcbiAgICAgICAgICB0cmFjaW5nOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGV4cG9ydGVyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwiQ29uc29sZVwiLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbG9yczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgICAgICAgIGdhdWdlV2lkdGg6IDQwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNraXBQcm9jZXNzRXZlbnRSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24oYnJva2VyKSB7XG4gICAgICAgICAgICBicm9rZXIubG9nZ2VyLndhcm4oJ0NsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIG9uIHN0YXJ0dXAuJyk7XG4gICAgICAgICAgICByZXR1cm4gYnJva2VyLmNhY2hlci5jbGVhbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9iamVjdHFsLmJyb2tlci5pbml0KGJyb2tlcik7XG4gICAgICAgIG9iamVjdHFsU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHJlcXVpcmUoXCJAc3RlZWRvcy9zZXJ2aWNlLW9iamVjdHFsXCIpKTtcbiAgICAgICAgcHJvamVjdFNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG4gICAgICAgICAgbmFtZTogXCJwcm9qZWN0LXNlcnZlclwiLFxuICAgICAgICAgIG5hbWVzcGFjZTogXCJzdGVlZG9zXCIsXG4gICAgICAgICAgbWl4aW5zOiBbcGFja2FnZVNlcnZpY2VdXG4gICAgICAgIH0pO1xuICAgICAgICBtZXRhZGF0YVNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG4gICAgICAgICAgbmFtZTogJ21ldGFkYXRhLXNlcnZlcicsXG4gICAgICAgICAgbWl4aW5zOiBbTWV0YWRhdGFTZXJ2aWNlXSxcbiAgICAgICAgICBzZXR0aW5nczoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHVpU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHJlcXVpcmUoXCJAc3RlZWRvcy9zZXJ2aWNlLXVpXCIpKTtcbiAgICAgICAgYXBpU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgICBuYW1lOiBcImFwaVwiLFxuICAgICAgICAgIG1peGluczogW0FQSVNlcnZpY2VdLFxuICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBwb3J0OiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG4gICAgICAgICAgbmFtZTogXCJAc3RlZWRvcy9zZXJ2aWNlLXBhZ2VzXCIsXG4gICAgICAgICAgbWl4aW5zOiBbcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1wYWdlcycpXSxcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgcG9ydDogbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHN0ZWVkb3NTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuICAgICAgICAgIG5hbWU6IFwic3RlZWRvcy1zZXJ2ZXJcIixcbiAgICAgICAgICBtaXhpbnM6IFtdLFxuICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBwb3J0OiBudWxsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGFydGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBicm9rZXIuZW1pdCgnc3RlZWRvcy1zZXJ2ZXIuc3RhcnRlZCcpO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2JqZWN0cWwuZ2V0U3RlZWRvc1NjaGVtYShicm9rZXIpO1xuICAgICAgICBzdGFuZGFyZE9iamVjdHNEaXIgPSBvYmplY3RxbC5TdGFuZGFyZE9iamVjdHNQYXRoO1xuICAgICAgICBzdGFuZGFyZE9iamVjdHNQYWNrYWdlTG9hZGVyU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgICBuYW1lOiAnc3RhbmRhcmQtb2JqZWN0cycsXG4gICAgICAgICAgbWl4aW5zOiBbcGFja2FnZUxvYWRlcl0sXG4gICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgIHBhY2thZ2VJbmZvOiB7XG4gICAgICAgICAgICAgIHBhdGg6IHN0YW5kYXJkT2JqZWN0c0RpclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgICAgcmV0dXJuIGJyb2tlci5zdGFydCgpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY29ubmVjdEhhbmRsZXJzRXhwcmVzcywgZXhwcmVzcztcbiAgICAgICAgICAgIGlmICghYnJva2VyLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgYnJva2VyLl9yZXN0YXJ0U2VydmljZShvYmplY3RxbFNlcnZpY2UpO1xuICAgICAgICAgICAgICBicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgYnJva2VyLl9yZXN0YXJ0U2VydmljZSh1aVNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTtcbiAgICAgICAgICAgIGNvbm5lY3RIYW5kbGVyc0V4cHJlc3MgPSBleHByZXNzKCk7XG4gICAgICAgICAgICBjb25uZWN0SGFuZGxlcnNFeHByZXNzLnVzZShyZXF1aXJlKCdAc3RlZWRvcy9yb3V0ZXInKS5zdGF0aWNSb3V0ZXIoKSk7XG4gICAgICAgICAgICBicm9rZXIud2FpdEZvclNlcnZpY2VzKCd+cGFja2FnZXMtQHN0ZWVkb3Mvc2VydmljZS11aScpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3YWl0Rm9yU2VydmljZXMgfnBhY2thZ2VzLUBzdGVlZG9zL3NlcnZpY2UtdWknKTtcbiAgICAgICAgICAgICAgY29ubmVjdEhhbmRsZXJzRXhwcmVzcy51c2UoU3RlZWRvc0FwaS5leHByZXNzKCkpO1xuICAgICAgICAgICAgICByZXR1cm4gV2ViQXBwLmNvbm5lY3RIYW5kbGVycy51c2UoY29ubmVjdEhhbmRsZXJzRXhwcmVzcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBicm9rZXIud2FpdEZvclNlcnZpY2VzKHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlLm5hbWUpLnRoZW4oZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdGVlZG9zQ29yZS5pbml0KHNldHRpbmdzKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYihyZWplY3QsIHJlc29sdmUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXggPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjpcIiwgZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IGNhdGNoIChlcnJvcikge1xuICBlID0gZXJyb3I7XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjpcIiwgZSk7XG59XG4iLCJDcmVhdG9yLmRlcHMgPSB7XG5cdGFwcDogbmV3IFRyYWNrZXIuRGVwZW5kZW5jeVxuXHRvYmplY3Q6IG5ldyBUcmFja2VyLkRlcGVuZGVuY3lcbn07XG5cbkNyZWF0b3IuX1RFTVBMQVRFID0ge1xuXHRBcHBzOiB7fSxcblx0T2JqZWN0czoge31cbn1cblxuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0U2ltcGxlU2NoZW1hLmV4dGVuZE9wdGlvbnMoe2ZpbHRlcnNGdW5jdGlvbjogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpfSlcblx0U2ltcGxlU2NoZW1hLmV4dGVuZE9wdGlvbnMoe29wdGlvbnNGdW5jdGlvbjogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpfSlcblx0U2ltcGxlU2NoZW1hLmV4dGVuZE9wdGlvbnMoe2NyZWF0ZUZ1bmN0aW9uOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSl9KVxuXG4jIENyZWF0b3IuZmliZXJMb2FkT2JqZWN0cyDkvptzdGVlZG9zLWNsaemhueebruS9v+eUqFxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdEZpYmVyID0gcmVxdWlyZSgnZmliZXJzJylcblx0Q3JlYXRvci5maWJlckxvYWRPYmplY3RzID0gKG9iaiwgb2JqZWN0X25hbWUpLT5cblx0XHRGaWJlcigoKS0+XG5cdFx0XHRDcmVhdG9yLmxvYWRPYmplY3RzKG9iaiwgb2JqZWN0X25hbWUpXG5cdFx0KS5ydW4oKVxuXG5DcmVhdG9yLmxvYWRPYmplY3RzID0gKG9iaiwgb2JqZWN0X25hbWUpLT5cblx0aWYgIW9iamVjdF9uYW1lXG5cdFx0b2JqZWN0X25hbWUgPSBvYmoubmFtZVxuXG5cdGlmICFvYmoubGlzdF92aWV3c1xuXHRcdG9iai5saXN0X3ZpZXdzID0ge31cblxuXHRpZiBvYmouc3BhY2Vcblx0XHRvYmplY3RfbmFtZSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbk5hbWUob2JqKVxuXHRpZiBvYmplY3RfbmFtZSA9PSAnY2ZzX2ZpbGVzX2ZpbGVyZWNvcmQnXG5cdFx0b2JqZWN0X25hbWUgPSAnY2ZzLmZpbGVzLmZpbGVyZWNvcmQnXG5cdFx0b2JqID0gXy5jbG9uZShvYmopXG5cdFx0b2JqLm5hbWUgPSBvYmplY3RfbmFtZVxuXHRcdENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV0gPSBvYmpcblxuXHRDcmVhdG9yLmNvbnZlcnRPYmplY3Qob2JqKVxuXHRuZXcgQ3JlYXRvci5PYmplY3Qob2JqKTtcblxuXHRDcmVhdG9yLmluaXRUcmlnZ2VycyhvYmplY3RfbmFtZSlcblx0Q3JlYXRvci5pbml0TGlzdFZpZXdzKG9iamVjdF9uYW1lKVxuXHRyZXR1cm4gb2JqXG5cbkNyZWF0b3IuZ2V0T2JqZWN0TmFtZSA9IChvYmplY3QpIC0+XG5cdGlmIG9iamVjdC5zcGFjZVxuXHRcdHJldHVybiBcImNfI3tvYmplY3Quc3BhY2V9XyN7b2JqZWN0Lm5hbWV9XCJcblx0cmV0dXJuIG9iamVjdC5uYW1lXG5cbkNyZWF0b3IuZ2V0T2JqZWN0ID0gKG9iamVjdF9uYW1lLCBzcGFjZV9pZCktPlxuXHRpZiBfLmlzQXJyYXkob2JqZWN0X25hbWUpXG5cdFx0cmV0dXJuIDtcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0Q3JlYXRvci5kZXBzPy5vYmplY3Q/LmRlcGVuZCgpXG5cdGlmICFvYmplY3RfbmFtZSBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cbiNcdGlmICFzcGFjZV9pZCAmJiBvYmplY3RfbmFtZVxuI1x0XHRpZiBNZXRlb3IuaXNDbGllbnQgJiYgIW9iamVjdF9uYW1lLnN0YXJ0c1dpdGgoJ2NfJylcbiNcdFx0XHRzcGFjZV9pZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXG5cdGlmIG9iamVjdF9uYW1lXG4jXHRcdGlmIHNwYWNlX2lkXG4jXHRcdFx0b2JqID0gQ3JlYXRvci5vYmplY3RzQnlOYW1lW1wiY18je3NwYWNlX2lkfV8je29iamVjdF9uYW1lfVwiXVxuI1x0XHRcdGlmIG9ialxuI1x0XHRcdFx0cmV0dXJuIG9ialxuI1xuI1x0XHRvYmogPSBfLmZpbmQgQ3JlYXRvci5vYmplY3RzQnlOYW1lLCAobyktPlxuI1x0XHRcdFx0cmV0dXJuIG8uX2NvbGxlY3Rpb25fbmFtZSA9PSBvYmplY3RfbmFtZVxuI1x0XHRpZiBvYmpcbiNcdFx0XHRyZXR1cm4gb2JqXG5cblx0XHRyZXR1cm4gQ3JlYXRvci5vYmplY3RzQnlOYW1lW29iamVjdF9uYW1lXVxuXG5DcmVhdG9yLmdldE9iamVjdEJ5SWQgPSAob2JqZWN0X2lkKS0+XG5cdHJldHVybiBfLmZpbmRXaGVyZShDcmVhdG9yLm9iamVjdHNCeU5hbWUsIHtfaWQ6IG9iamVjdF9pZH0pXG5cbkNyZWF0b3IucmVtb3ZlT2JqZWN0ID0gKG9iamVjdF9uYW1lKS0+XG5cdGNvbnNvbGUubG9nKFwicmVtb3ZlT2JqZWN0XCIsIG9iamVjdF9uYW1lKVxuXHRkZWxldGUgQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXVxuXHRkZWxldGUgQ3JlYXRvci5vYmplY3RzQnlOYW1lW29iamVjdF9uYW1lXVxuXG5DcmVhdG9yLmdldENvbGxlY3Rpb24gPSAob2JqZWN0X25hbWUsIHNwYWNlSWQpLT5cblx0aWYgIW9iamVjdF9uYW1lXG5cdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdGlmIG9iamVjdF9uYW1lXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRyZXR1cm4gZGJbb2JqZWN0X25hbWVdXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIENyZWF0b3IuQ29sbGVjdGlvbnNbQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUsIHNwYWNlSWQpPy5fY29sbGVjdGlvbl9uYW1lIHx8IG9iamVjdF9uYW1lXVxuXG5DcmVhdG9yLnJlbW92ZUNvbGxlY3Rpb24gPSAob2JqZWN0X25hbWUpLT5cblx0ZGVsZXRlIENyZWF0b3IuQ29sbGVjdGlvbnNbb2JqZWN0X25hbWVdXG5cbkNyZWF0b3IuaXNTcGFjZUFkbWluID0gKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhc3BhY2VJZFxuXHRcdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXHRcdGlmICF1c2VySWRcblx0XHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXG5cdHNwYWNlID0gQ3JlYXRvci5nZXRPYmplY3QoXCJzcGFjZXNcIik/LmRiPy5maW5kT25lKHNwYWNlSWQse2ZpZWxkczp7YWRtaW5zOjF9fSlcblx0aWYgc3BhY2U/LmFkbWluc1xuXHRcdHJldHVybiBzcGFjZS5hZG1pbnMuaW5kZXhPZih1c2VySWQpID49IDBcblxuXG5DcmVhdG9yLmV2YWx1YXRlRm9ybXVsYSA9IChmb3JtdWxhciwgY29udGV4dCwgb3B0aW9ucyktPlxuXG5cdGlmICFfLmlzU3RyaW5nKGZvcm11bGFyKVxuXHRcdHJldHVybiBmb3JtdWxhclxuXG5cdGlmIENyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhKGZvcm11bGFyKVxuXHRcdHJldHVybiBDcmVhdG9yLkZvcm11bGFyLnJ1bihmb3JtdWxhciwgY29udGV4dCwgb3B0aW9ucylcblxuXHRyZXR1cm4gZm9ybXVsYXJcblxuQ3JlYXRvci5ldmFsdWF0ZUZpbHRlcnMgPSAoZmlsdGVycywgY29udGV4dCktPlxuXHRzZWxlY3RvciA9IHt9XG5cdF8uZWFjaCBmaWx0ZXJzLCAoZmlsdGVyKS0+XG5cdFx0aWYgZmlsdGVyPy5sZW5ndGggPT0gM1xuXHRcdFx0bmFtZSA9IGZpbHRlclswXVxuXHRcdFx0YWN0aW9uID0gZmlsdGVyWzFdXG5cdFx0XHR2YWx1ZSA9IENyZWF0b3IuZXZhbHVhdGVGb3JtdWxhKGZpbHRlclsyXSwgY29udGV4dClcblx0XHRcdHNlbGVjdG9yW25hbWVdID0ge31cblx0XHRcdHNlbGVjdG9yW25hbWVdW2FjdGlvbl0gPSB2YWx1ZVxuXHQjIGNvbnNvbGUubG9nKFwiZXZhbHVhdGVGaWx0ZXJzLS0+c2VsZWN0b3JcIiwgc2VsZWN0b3IpXG5cdHJldHVybiBzZWxlY3RvclxuXG5DcmVhdG9yLmlzQ29tbW9uU3BhY2UgPSAoc3BhY2VJZCkgLT5cblx0cmV0dXJuIHNwYWNlSWQgPT0gJ2NvbW1vbidcblxuIyMjXG5cdGRvY3PvvJrlvoXmjpLluo/nmoTmlofmoaPmlbDnu4Rcblx0aWRz77yaX2lk6ZuG5ZCIXG5cdGlkX2tleTog6buY6K6k5Li6X2lkXG5cdHJldHVybiDmjInnhadpZHPnmoTpobrluo/ov5Tlm57mlrDnmoTmlofmoaPpm4blkIhcbiMjI1xuQ3JlYXRvci5nZXRPcmRlcmx5U2V0QnlJZHMgPSAoZG9jcywgaWRzLCBpZF9rZXksIGhpdF9maXJzdCktPlxuXG5cdGlmICFpZF9rZXlcblx0XHRpZF9rZXkgPSBcIl9pZFwiXG5cblx0aWYgaGl0X2ZpcnN0XG5cblx0XHQj55Sx5LqO5LiN6IO95L2/55SoXy5maW5kSW5kZXjlh73mlbDvvIzlm6DmraTmraTlpITlhYjlsIblr7nosaHmlbDnu4TovazkuLrmma7pgJrmlbDnu4TnsbvlnovvvIzlnKjojrflj5blhbZpbmRleFxuXHRcdHZhbHVlcyA9IGRvY3MuZ2V0UHJvcGVydHkoaWRfa2V5KVxuXG5cdFx0cmV0dXJuXHRfLnNvcnRCeSBkb2NzLCAoZG9jKS0+XG5cdFx0XHRcdFx0X2luZGV4ID0gaWRzLmluZGV4T2YoZG9jW2lkX2tleV0pXG5cdFx0XHRcdFx0aWYgX2luZGV4ID4gLTFcblx0XHRcdFx0XHRcdHJldHVybiBfaW5kZXhcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gaWRzLmxlbmd0aCArIF8uaW5kZXhPZih2YWx1ZXMsIGRvY1tpZF9rZXldKVxuXHRlbHNlXG5cdFx0cmV0dXJuXHRfLnNvcnRCeSBkb2NzLCAoZG9jKS0+XG5cdFx0XHRyZXR1cm4gaWRzLmluZGV4T2YoZG9jW2lkX2tleV0pXG5cbiMjI1xuXHTmjInnlKjmiLfmiYDlsZ7mnKzlnLDljJbor63oqIDov5vooYzmjpLluo/vvIzmlK/mjIHkuK3mlofjgIHmlbDlgLzjgIHml6XmnJ/nrYnlrZfmrrXmjpLluo9cblx05a+55LqOT2JqZWN057G75Z6L77yM5aaC5p6c5o+Q5L6b5L2c55So5Z+f5Lita2V55bGe5oCn77yM5YiZ5Y+W5YC85Li6dmFsdWVba2V5Xei/m+ihjOaOkuW6j+avlOi+g++8jOWPjeS5i+aVtOS4qk9iamVjdC50b1N0cmluZygp5ZCO5o6S5bqP5q+U6L6DXG4jIyNcbkNyZWF0b3Iuc29ydGluZ01ldGhvZCA9ICh2YWx1ZTEsIHZhbHVlMikgLT5cblx0aWYgdGhpcy5rZXlcblx0XHR2YWx1ZTEgPSB2YWx1ZTFbdGhpcy5rZXldXG5cdFx0dmFsdWUyID0gdmFsdWUyW3RoaXMua2V5XVxuXHRpZiB2YWx1ZTEgaW5zdGFuY2VvZiBEYXRlXG5cdFx0dmFsdWUxID0gdmFsdWUxLmdldFRpbWUoKVxuXHRpZiB2YWx1ZTIgaW5zdGFuY2VvZiBEYXRlXG5cdFx0dmFsdWUyID0gdmFsdWUyLmdldFRpbWUoKVxuXHRpZiB0eXBlb2YgdmFsdWUxIGlzIFwibnVtYmVyXCIgYW5kIHR5cGVvZiB2YWx1ZTIgaXMgXCJudW1iZXJcIlxuXHRcdHJldHVybiB2YWx1ZTEgLSB2YWx1ZTJcblx0IyBIYW5kbGluZyBudWxsIHZhbHVlc1xuXHRpc1ZhbHVlMUVtcHR5ID0gdmFsdWUxID09IG51bGwgb3IgdmFsdWUxID09IHVuZGVmaW5lZFxuXHRpc1ZhbHVlMkVtcHR5ID0gdmFsdWUyID09IG51bGwgb3IgdmFsdWUyID09IHVuZGVmaW5lZFxuXHRpZiBpc1ZhbHVlMUVtcHR5IGFuZCAhaXNWYWx1ZTJFbXB0eVxuXHRcdHJldHVybiAtMVxuXHRpZiBpc1ZhbHVlMUVtcHR5IGFuZCBpc1ZhbHVlMkVtcHR5XG5cdFx0cmV0dXJuIDBcblx0aWYgIWlzVmFsdWUxRW1wdHkgYW5kIGlzVmFsdWUyRW1wdHlcblx0XHRyZXR1cm4gMVxuXHRsb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSgpXG5cdHJldHVybiB2YWx1ZTEudG9TdHJpbmcoKS5sb2NhbGVDb21wYXJlIHZhbHVlMi50b1N0cmluZygpLCBsb2NhbGVcblxuXG4jIOivpeWHveaVsOWPquWcqOWIneWni+WMlk9iamVjdOaXtu+8jOaKiuebuOWFs+WvueixoeeahOiuoeeul+e7k+aenOS/neWtmOWIsE9iamVjdOeahHJlbGF0ZWRfb2JqZWN0c+WxnuaAp+S4re+8jOWQjue7reWPr+S7peebtOaOpeS7jnJlbGF0ZWRfb2JqZWN0c+WxnuaAp+S4reWPluW+l+iuoeeul+e7k+aenOiAjOS4jeeUqOWGjeasoeiwg+eUqOivpeWHveaVsOadpeiuoeeul1xuQ3JlYXRvci5nZXRPYmplY3RSZWxhdGVkcyA9IChvYmplY3RfbmFtZSktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdHJlbGF0ZWRfb2JqZWN0cyA9IFtdXG5cdCMgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHQjIOWboENyZWF0b3IuZ2V0T2JqZWN05Ye95pWw5YaF6YOo6KaB6LCD55So6K+l5Ye95pWw77yM5omA5Lul6L+Z6YeM5LiN5Y+v5Lul6LCD55SoQ3JlYXRvci5nZXRPYmplY3Tlj5blr7nosaHvvIzlj6rog73osIPnlKhDcmVhdG9yLk9iamVjdHPmnaXlj5blr7nosaFcblx0X29iamVjdCA9IENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV1cblx0aWYgIV9vYmplY3Rcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cdFxuXHRyZWxhdGVkTGlzdCA9IF9vYmplY3QucmVsYXRlZExpc3Rcblx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmICFfLmlzRW1wdHkgcmVsYXRlZExpc3Rcblx0XHRyZWxhdGVkTGlzdE1hcCA9IHt9XG5cdFx0Xy5lYWNoIHJlbGF0ZWRMaXN0LCAob2JqTmFtZSktPlxuXHRcdFx0aWYgXy5pc09iamVjdCBvYmpOYW1lXG5cdFx0XHRcdHJlbGF0ZWRMaXN0TWFwW29iak5hbWUub2JqZWN0TmFtZV0gPSB7fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZWxhdGVkTGlzdE1hcFtvYmpOYW1lXSA9IHt9XG5cdFx0Xy5lYWNoIENyZWF0b3IuT2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0XHRfLmVhY2ggcmVsYXRlZF9vYmplY3QuZmllbGRzLCAocmVsYXRlZF9maWVsZCwgcmVsYXRlZF9maWVsZF9uYW1lKS0+XG5cdFx0XHRcdGlmIChyZWxhdGVkX2ZpZWxkLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCIgfHwgcmVsYXRlZF9maWVsZC50eXBlID09IFwibG9va3VwXCIpIGFuZCByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0X25hbWUgYW5kIHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdXG5cdFx0XHRcdFx0IyDlvZNyZWxhdGVkX29iamVjdC5maWVsZHPkuK3mnInkuKTkuKrmiJbku6XkuIrnmoTlrZfmrrXmjIflkJFvYmplY3RfbmFtZeihqOekuueahOWvueixoeaXtu+8jOS8mOWFiOWPluesrOS4gOS4quS9nOS4uuWklumUruWFs+ezu+Wtl+aute+8jOS9huaYr3JlbGF0ZWRfZmllbGTkuLrkuLvlrZDooajml7blvLrooYzopobnm5bkuYvliY3nmoRyZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXeWAvFxuXHRcdFx0XHRcdGlmIF8uaXNFbXB0eSByZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXSB8fCByZWxhdGVkX2ZpZWxkLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCJcblx0XHRcdFx0XHRcdHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdID0geyBvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSwgZm9yZWlnbl9rZXk6IHJlbGF0ZWRfZmllbGRfbmFtZSwgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHJlbGF0ZWRfZmllbGQud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgfVxuXHRcdGlmIHJlbGF0ZWRMaXN0TWFwWydjbXNfZmlsZXMnXVxuXHRcdFx0cmVsYXRlZExpc3RNYXBbJ2Ntc19maWxlcyddID0geyBvYmplY3RfbmFtZTogXCJjbXNfZmlsZXNcIiwgZm9yZWlnbl9rZXk6IFwicGFyZW50XCIgfVxuXHRcdGlmIHJlbGF0ZWRMaXN0TWFwWydpbnN0YW5jZXMnXVxuXHRcdFx0cmVsYXRlZExpc3RNYXBbJ2luc3RhbmNlcyddID0geyBvYmplY3RfbmFtZTogXCJpbnN0YW5jZXNcIiwgZm9yZWlnbl9rZXk6IFwicmVjb3JkX2lkc1wiIH1cblx0XHRfLmVhY2ggWyd0YXNrcycsICdub3RlcycsICdldmVudHMnLCAnYXBwcm92YWxzJ10sIChlbmFibGVPYmpOYW1lKS0+XG5cdFx0XHRpZiByZWxhdGVkTGlzdE1hcFtlbmFibGVPYmpOYW1lXVxuXHRcdFx0XHRyZWxhdGVkTGlzdE1hcFtlbmFibGVPYmpOYW1lXSA9IHsgb2JqZWN0X25hbWU6IGVuYWJsZU9iak5hbWUsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIiB9XG5cdFx0aWYgcmVsYXRlZExpc3RNYXBbJ2F1ZGl0X3JlY29yZHMnXVxuXHRcdFx0I3JlY29yZCDor6bnu4bkuIvnmoRhdWRpdF9yZWNvcmRz5LuFbW9kaWZ5QWxsUmVjb3Jkc+adg+mZkOWPr+ingVxuXHRcdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lKVxuXHRcdFx0aWYgX29iamVjdC5lbmFibGVfYXVkaXQgJiYgcGVybWlzc2lvbnM/Lm1vZGlmeUFsbFJlY29yZHNcblx0XHRcdFx0cmVsYXRlZExpc3RNYXBbJ2F1ZGl0X3JlY29yZHMnXSA9IHsgb2JqZWN0X25hbWU6XCJhdWRpdF9yZWNvcmRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIiB9XG5cdFx0cmVsYXRlZF9vYmplY3RzID0gXy52YWx1ZXMgcmVsYXRlZExpc3RNYXBcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cblx0aWYgX29iamVjdC5lbmFibGVfZmlsZXNcblx0XHRyZWxhdGVkX29iamVjdHMucHVzaCB7b2JqZWN0X25hbWU6XCJjbXNfZmlsZXNcIiwgZm9yZWlnbl9rZXk6IFwicGFyZW50XCJ9XG5cblx0Xy5lYWNoIENyZWF0b3IuT2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCJcblx0XHRcdCMgY2ZzLmZpbGVzLmZpbGVyZWNvcmTlr7nosaHlnKjnrKzkuozmrKHngrnlh7vnmoTml7blgJlyZWxhdGVkX29iamVjdOi/lOWbnueahOaYr2FwcC1idWlsZGVy5Lit55qEXCJtZXRhZGF0YS5wYXJlbnRcIuWtl+auteiiq+WIoOmZpOS6hu+8jOiusOWIsG1ldGFkYXRh5a2X5q6155qEc3ViX2ZpZWxkc+S4reS6hu+8jOaJgOS7peimgeWNleeLrOWkhOeQhuOAglxuXHRcdFx0c2ZzRmlsZXNPYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChcImNmcy5maWxlcy5maWxlcmVjb3JkXCIpXG5cdFx0XHRzZnNGaWxlc09iamVjdCAmJiByZWxhdGVkX29iamVjdCA9IHNmc0ZpbGVzT2JqZWN0XG5cdFx0Xy5lYWNoIHJlbGF0ZWRfb2JqZWN0LmZpZWxkcywgKHJlbGF0ZWRfZmllbGQsIHJlbGF0ZWRfZmllbGRfbmFtZSktPlxuXHRcdFx0aWYgKHJlbGF0ZWRfZmllbGQudHlwZSA9PSBcIm1hc3Rlcl9kZXRhaWxcIiB8fCAocmVsYXRlZF9maWVsZC50eXBlID09IFwibG9va3VwXCIgJiYgcmVsYXRlZF9maWVsZC5yZWxhdGVkTGlzdCkpIGFuZCByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0X25hbWVcblx0XHRcdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcIm9iamVjdF9maWVsZHNcIlxuXHRcdFx0XHRcdCNUT0RPIOW+heebuOWFs+WIl+ihqOaUr+aMgeaOkuW6j+WQju+8jOWIoOmZpOatpOWIpOaWrVxuXHRcdFx0XHRcdHJlbGF0ZWRfb2JqZWN0cy5zcGxpY2UoMCwgMCwge29iamVjdF9uYW1lOnJlbGF0ZWRfb2JqZWN0X25hbWUsIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWV9KVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOnJlbGF0ZWRfb2JqZWN0X25hbWUsIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWUsIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiByZWxhdGVkX2ZpZWxkLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkfVxuXG5cdGlmIF9vYmplY3QuZW5hYmxlX3Rhc2tzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwidGFza3NcIiwgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wifVxuXHRpZiBfb2JqZWN0LmVuYWJsZV9ub3Rlc1xuXHRcdHJlbGF0ZWRfb2JqZWN0cy5wdXNoIHtvYmplY3RfbmFtZTpcIm5vdGVzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfZXZlbnRzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiZXZlbnRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfaW5zdGFuY2VzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiaW5zdGFuY2VzXCIsIGZvcmVpZ25fa2V5OiBcInJlY29yZF9pZHNcIn1cblx0aWYgX29iamVjdC5lbmFibGVfYXBwcm92YWxzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiYXBwcm92YWxzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfcHJvY2Vzc1xuXHRcdHJlbGF0ZWRfb2JqZWN0cy5wdXNoIHtvYmplY3RfbmFtZTpcInByb2Nlc3NfaW5zdGFuY2VfaGlzdG9yeVwiLCBmb3JlaWduX2tleTogXCJ0YXJnZXRfb2JqZWN0XCJ9XG5cdCNyZWNvcmQg6K+m57uG5LiL55qEYXVkaXRfcmVjb3Jkc+S7hW1vZGlmeUFsbFJlY29yZHPmnYPpmZDlj6/op4Fcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lKVxuXHRcdGlmIF9vYmplY3QuZW5hYmxlX2F1ZGl0ICYmIHBlcm1pc3Npb25zPy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHRyZWxhdGVkX29iamVjdHMucHVzaCB7b2JqZWN0X25hbWU6XCJhdWRpdF9yZWNvcmRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblxuXHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cbkNyZWF0b3IuZ2V0VXNlckNvbnRleHQgPSAodXNlcklkLCBzcGFjZUlkLCBpc1VuU2FmZU1vZGUpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0cmV0dXJuIENyZWF0b3IuVVNFUl9DT05URVhUXG5cdGVsc2Vcblx0XHRpZiAhKHVzZXJJZCBhbmQgc3BhY2VJZClcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IgNTAwLCBcInRoZSBwYXJhbXMgdXNlcklkIGFuZCBzcGFjZUlkIGlzIHJlcXVpcmVkIGZvciB0aGUgZnVuY3Rpb24gQ3JlYXRvci5nZXRVc2VyQ29udGV4dFwiXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdHN1RmllbGRzID0ge25hbWU6IDEsIG1vYmlsZTogMSwgcG9zaXRpb246IDEsIGVtYWlsOiAxLCBjb21wYW55OiAxLCBvcmdhbml6YXRpb246IDEsIHNwYWNlOiAxLCBjb21wYW55X2lkOiAxLCBjb21wYW55X2lkczogMX1cblx0XHQjIGNoZWNrIGlmIHVzZXIgaW4gdGhlIHNwYWNlXG5cdFx0c3UgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0sIHtmaWVsZHM6IHN1RmllbGRzfSlcblx0XHRpZiAhc3Vcblx0XHRcdHNwYWNlSWQgPSBudWxsXG5cblx0XHQjIGlmIHNwYWNlSWQgbm90IGV4aXN0cywgZ2V0IHRoZSBmaXJzdCBvbmUuXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdGlmIGlzVW5TYWZlTW9kZVxuXHRcdFx0XHRzdSA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJzcGFjZV91c2Vyc1wiXS5maW5kT25lKHt1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiBzdUZpZWxkc30pXG5cdFx0XHRcdGlmICFzdVxuXHRcdFx0XHRcdHJldHVybiBudWxsXG5cdFx0XHRcdHNwYWNlSWQgPSBzdS5zcGFjZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gbnVsbFxuXG5cdFx0VVNFUl9DT05URVhUID0ge31cblx0XHRVU0VSX0NPTlRFWFQudXNlcklkID0gdXNlcklkXG5cdFx0VVNFUl9DT05URVhULnNwYWNlSWQgPSBzcGFjZUlkXG5cdFx0VVNFUl9DT05URVhULnVzZXIgPSB7XG5cdFx0XHRfaWQ6IHVzZXJJZFxuXHRcdFx0bmFtZTogc3UubmFtZSxcblx0XHRcdG1vYmlsZTogc3UubW9iaWxlLFxuXHRcdFx0cG9zaXRpb246IHN1LnBvc2l0aW9uLFxuXHRcdFx0ZW1haWw6IHN1LmVtYWlsXG5cdFx0XHRjb21wYW55OiBzdS5jb21wYW55XG5cdFx0XHRjb21wYW55X2lkOiBzdS5jb21wYW55X2lkXG5cdFx0XHRjb21wYW55X2lkczogc3UuY29tcGFueV9pZHNcblx0XHR9XG5cdFx0c3BhY2VfdXNlcl9vcmcgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvcmdhbml6YXRpb25zXCIpPy5maW5kT25lKHN1Lm9yZ2FuaXphdGlvbilcblx0XHRpZiBzcGFjZV91c2VyX29yZ1xuXHRcdFx0VVNFUl9DT05URVhULnVzZXIub3JnYW5pemF0aW9uID0ge1xuXHRcdFx0XHRfaWQ6IHNwYWNlX3VzZXJfb3JnLl9pZCxcblx0XHRcdFx0bmFtZTogc3BhY2VfdXNlcl9vcmcubmFtZSxcblx0XHRcdFx0ZnVsbG5hbWU6IHNwYWNlX3VzZXJfb3JnLmZ1bGxuYW1lXG5cdFx0XHR9XG5cdFx0cmV0dXJuIFVTRVJfQ09OVEVYVFxuXG5DcmVhdG9yLmdldFJlbGF0aXZlVXJsID0gKHVybCktPlxuXG5cdGlmIF8uaXNGdW5jdGlvbihTdGVlZG9zLmlzQ29yZG92YSkgJiYgU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAodXJsPy5zdGFydHNXaXRoKFwiL2Fzc2V0c1wiKSB8fCB1cmw/LnN0YXJ0c1dpdGgoXCJhc3NldHNcIikgfHwgdXJsPy5zdGFydHNXaXRoKFwiL3BhY2thZ2VzXCIpKVxuXHRcdGlmICEvXlxcLy8udGVzdCh1cmwpXG5cdFx0XHR1cmwgPSBcIi9cIiArIHVybFxuXHRcdHJldHVybiB1cmxcblxuXHRpZiB1cmxcblx0XHQjIHVybOW8gOWktOayoeaciVwiL1wi77yM6ZyA6KaB5re75YqgXCIvXCJcblx0XHRpZiAhL15cXC8vLnRlc3QodXJsKVxuXHRcdFx0dXJsID0gXCIvXCIgKyB1cmxcblx0XHRyZXR1cm4gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIHVybFxuXHRlbHNlXG5cdFx0cmV0dXJuIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVhcblxuQ3JlYXRvci5nZXRVc2VyQ29tcGFueUlkID0gKHVzZXJJZCwgc3BhY2VJZCktPlxuXHR1c2VySWQgPSB1c2VySWQgfHwgTWV0ZW9yLnVzZXJJZCgpXG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHNwYWNlSWQgPSBzcGFjZUlkIHx8IFNlc3Npb24uZ2V0KCdzcGFjZUlkJylcblx0ZWxzZVxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ21pc3Mgc3BhY2VJZCcpXG5cdHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7Y29tcGFueV9pZDoxfX0pXG5cdHJldHVybiBzdS5jb21wYW55X2lkXG5cbkNyZWF0b3IuZ2V0VXNlckNvbXBhbnlJZHMgPSAodXNlcklkLCBzcGFjZUlkKS0+XG5cdHVzZXJJZCA9IHVzZXJJZCB8fCBNZXRlb3IudXNlcklkKClcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0c3BhY2VJZCA9IHNwYWNlSWQgfHwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKVxuXHRlbHNlXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAnbWlzcyBzcGFjZUlkJylcblx0c3UgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ3NwYWNlX3VzZXJzJykuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0sIHtmaWVsZHM6IHtjb21wYW55X2lkczoxfX0pXG5cdHJldHVybiBzdT8uY29tcGFueV9pZHNcblxuQ3JlYXRvci5wcm9jZXNzUGVybWlzc2lvbnMgPSAocG8pLT5cblx0aWYgcG8uYWxsb3dDcmVhdGVcblx0XHRwby5hbGxvd1JlYWQgPSB0cnVlXG5cdGlmIHBvLmFsbG93RWRpdFxuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8uYWxsb3dEZWxldGVcblx0XHRwby5hbGxvd0VkaXQgPSB0cnVlXG5cdFx0cG8uYWxsb3dSZWFkID0gdHJ1ZVxuXHRpZiBwby52aWV3QWxsUmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8ubW9kaWZ5QWxsUmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0XHRwby5hbGxvd0VkaXQgPSB0cnVlXG5cdFx0cG8uYWxsb3dEZWxldGUgPSB0cnVlXG5cdFx0cG8udmlld0FsbFJlY29yZHMgPSB0cnVlXG5cdGlmIHBvLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8ubW9kaWZ5Q29tcGFueVJlY29yZHNcblx0XHRwby5hbGxvd1JlYWQgPSB0cnVlXG5cdFx0cG8uYWxsb3dFZGl0ID0gdHJ1ZVxuXHRcdHBvLmFsbG93RGVsZXRlID0gdHJ1ZVxuXHRcdHBvLnZpZXdDb21wYW55UmVjb3JkcyA9IHRydWVcblx0XHRcblx0IyDlpoLmnpzpmYTku7bnm7jlhbPmnYPpmZDphY3nva7kuLrnqbrvvIzliJnlhbzlrrnkuYvliY3msqHmnInpmYTku7bmnYPpmZDphY3nva7ml7bnmoTop4TliJlcblx0aWYgcG8uYWxsb3dSZWFkXG5cdFx0dHlwZW9mIHBvLmFsbG93UmVhZEZpbGVzICE9IFwiYm9vbGVhblwiICYmIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZVxuXHRcdHR5cGVvZiBwby52aWV3QWxsRmlsZXMgIT0gXCJib29sZWFuXCIgJiYgcG8udmlld0FsbEZpbGVzID0gdHJ1ZVxuXHRpZiBwby5hbGxvd0VkaXRcblx0XHR0eXBlb2YgcG8uYWxsb3dDcmVhdGVGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0NyZWF0ZUZpbGVzID0gdHJ1ZVxuXHRcdHR5cGVvZiBwby5hbGxvd0VkaXRGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0VkaXRGaWxlcyA9IHRydWVcblx0XHR0eXBlb2YgcG8uYWxsb3dEZWxldGVGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0RlbGV0ZUZpbGVzID0gdHJ1ZVxuXHRpZiBwby5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0dHlwZW9mIHBvLm1vZGlmeUFsbEZpbGVzICE9IFwiYm9vbGVhblwiICYmIHBvLm1vZGlmeUFsbEZpbGVzID0gdHJ1ZVxuXG5cdGlmIHBvLmFsbG93Q3JlYXRlRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8uYWxsb3dFZGl0RmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8uYWxsb3dEZWxldGVGaWxlc1xuXHRcdHBvLmFsbG93RWRpdEZpbGVzID0gdHJ1ZVxuXHRcdHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZVxuXHRpZiBwby52aWV3QWxsRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8ubW9kaWZ5QWxsRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0XHRwby5hbGxvd0VkaXRGaWxlcyA9IHRydWVcblx0XHRwby5hbGxvd0RlbGV0ZUZpbGVzID0gdHJ1ZVxuXHRcdHBvLnZpZXdBbGxGaWxlcyA9IHRydWVcblxuXHRyZXR1cm4gcG9cblxuQ3JlYXRvci5nZXRUZW1wbGF0ZVNwYWNlSWQgPSAoKS0+XG5cdHJldHVybiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy50ZW1wbGF0ZVNwYWNlSWRcblxuQ3JlYXRvci5nZXRDbG91ZEFkbWluU3BhY2VJZCA9ICgpLT5cblx0cmV0dXJuIE1ldGVvci5zZXR0aW5ncy5wdWJsaWM/LmNsb3VkQWRtaW5TcGFjZUlkXG5cbkNyZWF0b3IuaXNUZW1wbGF0ZVNwYWNlID0gKHNwYWNlSWQpLT5cblx0aWYgc3BhY2VJZCAmJiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy50ZW1wbGF0ZVNwYWNlSWQgPT0gc3BhY2VJZFxuXHRcdHJldHVybiB0cnVlXG5cdHJldHVybiBmYWxzZVxuXG5DcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlID0gKHNwYWNlSWQpLT5cblx0aWYgc3BhY2VJZCAmJiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy5jbG91ZEFkbWluU3BhY2VJZCA9PSBzcGFjZUlkXG5cdFx0cmV0dXJuIHRydWVcblx0cmV0dXJuIGZhbHNlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDcmVhdG9yLnN0ZWVkb3NTdG9yYWdlRGlyID0gcHJvY2Vzcy5lbnYuU1RFRURPU19TVE9SQUdFX0RJUlxuXHQiLCJ2YXIgRmliZXI7XG5cbkNyZWF0b3IuZGVwcyA9IHtcbiAgYXBwOiBuZXcgVHJhY2tlci5EZXBlbmRlbmN5LFxuICBvYmplY3Q6IG5ldyBUcmFja2VyLkRlcGVuZGVuY3lcbn07XG5cbkNyZWF0b3IuX1RFTVBMQVRFID0ge1xuICBBcHBzOiB7fSxcbiAgT2JqZWN0czoge31cbn07XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICBTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7XG4gICAgZmlsdGVyc0Z1bmN0aW9uOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSlcbiAgfSk7XG4gIFNpbXBsZVNjaGVtYS5leHRlbmRPcHRpb25zKHtcbiAgICBvcHRpb25zRnVuY3Rpb246IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKVxuICB9KTtcbiAgcmV0dXJuIFNpbXBsZVNjaGVtYS5leHRlbmRPcHRpb25zKHtcbiAgICBjcmVhdGVGdW5jdGlvbjogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpXG4gIH0pO1xufSk7XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcbiAgQ3JlYXRvci5maWJlckxvYWRPYmplY3RzID0gZnVuY3Rpb24ob2JqLCBvYmplY3RfbmFtZSkge1xuICAgIHJldHVybiBGaWJlcihmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLmxvYWRPYmplY3RzKG9iaiwgb2JqZWN0X25hbWUpO1xuICAgIH0pLnJ1bigpO1xuICB9O1xufVxuXG5DcmVhdG9yLmxvYWRPYmplY3RzID0gZnVuY3Rpb24ob2JqLCBvYmplY3RfbmFtZSkge1xuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgb2JqZWN0X25hbWUgPSBvYmoubmFtZTtcbiAgfVxuICBpZiAoIW9iai5saXN0X3ZpZXdzKSB7XG4gICAgb2JqLmxpc3Rfdmlld3MgPSB7fTtcbiAgfVxuICBpZiAob2JqLnNwYWNlKSB7XG4gICAgb2JqZWN0X25hbWUgPSBDcmVhdG9yLmdldENvbGxlY3Rpb25OYW1lKG9iaik7XG4gIH1cbiAgaWYgKG9iamVjdF9uYW1lID09PSAnY2ZzX2ZpbGVzX2ZpbGVyZWNvcmQnKSB7XG4gICAgb2JqZWN0X25hbWUgPSAnY2ZzLmZpbGVzLmZpbGVyZWNvcmQnO1xuICAgIG9iaiA9IF8uY2xvbmUob2JqKTtcbiAgICBvYmoubmFtZSA9IG9iamVjdF9uYW1lO1xuICAgIENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV0gPSBvYmo7XG4gIH1cbiAgQ3JlYXRvci5jb252ZXJ0T2JqZWN0KG9iaik7XG4gIG5ldyBDcmVhdG9yLk9iamVjdChvYmopO1xuICBDcmVhdG9yLmluaXRUcmlnZ2VycyhvYmplY3RfbmFtZSk7XG4gIENyZWF0b3IuaW5pdExpc3RWaWV3cyhvYmplY3RfbmFtZSk7XG4gIHJldHVybiBvYmo7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdE5hbWUgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKG9iamVjdC5zcGFjZSkge1xuICAgIHJldHVybiBcImNfXCIgKyBvYmplY3Quc3BhY2UgKyBcIl9cIiArIG9iamVjdC5uYW1lO1xuICB9XG4gIHJldHVybiBvYmplY3QubmFtZTtcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlX2lkKSB7XG4gIHZhciByZWYsIHJlZjE7XG4gIGlmIChfLmlzQXJyYXkob2JqZWN0X25hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoKHJlZiA9IENyZWF0b3IuZGVwcykgIT0gbnVsbCkge1xuICAgICAgaWYgKChyZWYxID0gcmVmLm9iamVjdCkgIT0gbnVsbCkge1xuICAgICAgICByZWYxLmRlcGVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIW9iamVjdF9uYW1lICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAob2JqZWN0X25hbWUpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5vYmplY3RzQnlOYW1lW29iamVjdF9uYW1lXTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RCeUlkID0gZnVuY3Rpb24ob2JqZWN0X2lkKSB7XG4gIHJldHVybiBfLmZpbmRXaGVyZShDcmVhdG9yLm9iamVjdHNCeU5hbWUsIHtcbiAgICBfaWQ6IG9iamVjdF9pZFxuICB9KTtcbn07XG5cbkNyZWF0b3IucmVtb3ZlT2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgY29uc29sZS5sb2coXCJyZW1vdmVPYmplY3RcIiwgb2JqZWN0X25hbWUpO1xuICBkZWxldGUgQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXTtcbiAgcmV0dXJuIGRlbGV0ZSBDcmVhdG9yLm9iamVjdHNCeU5hbWVbb2JqZWN0X25hbWVdO1xufTtcblxuQ3JlYXRvci5nZXRDb2xsZWN0aW9uID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlSWQpIHtcbiAgdmFyIHJlZjtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAob2JqZWN0X25hbWUpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gZGJbb2JqZWN0X25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9uc1soKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lLCBzcGFjZUlkKSkgIT0gbnVsbCA/IHJlZi5fY29sbGVjdGlvbl9uYW1lIDogdm9pZCAwKSB8fCBvYmplY3RfbmFtZV07XG4gICAgfVxuICB9XG59O1xuXG5DcmVhdG9yLnJlbW92ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICByZXR1cm4gZGVsZXRlIENyZWF0b3IuQ29sbGVjdGlvbnNbb2JqZWN0X25hbWVdO1xufTtcblxuQ3JlYXRvci5pc1NwYWNlQWRtaW4gPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIHJlZiwgcmVmMSwgc3BhY2U7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgfVxuICAgIGlmICghdXNlcklkKSB7XG4gICAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgfVxuICB9XG4gIHNwYWNlID0gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KFwic3BhY2VzXCIpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGIpICE9IG51bGwgPyByZWYxLmZpbmRPbmUoc3BhY2VJZCwge1xuICAgIGZpZWxkczoge1xuICAgICAgYWRtaW5zOiAxXG4gICAgfVxuICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgaWYgKHNwYWNlICE9IG51bGwgPyBzcGFjZS5hZG1pbnMgOiB2b2lkIDApIHtcbiAgICByZXR1cm4gc3BhY2UuYWRtaW5zLmluZGV4T2YodXNlcklkKSA+PSAwO1xuICB9XG59O1xuXG5DcmVhdG9yLmV2YWx1YXRlRm9ybXVsYSA9IGZ1bmN0aW9uKGZvcm11bGFyLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghXy5pc1N0cmluZyhmb3JtdWxhcikpIHtcbiAgICByZXR1cm4gZm9ybXVsYXI7XG4gIH1cbiAgaWYgKENyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhKGZvcm11bGFyKSkge1xuICAgIHJldHVybiBDcmVhdG9yLkZvcm11bGFyLnJ1bihmb3JtdWxhciwgY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGZvcm11bGFyO1xufTtcblxuQ3JlYXRvci5ldmFsdWF0ZUZpbHRlcnMgPSBmdW5jdGlvbihmaWx0ZXJzLCBjb250ZXh0KSB7XG4gIHZhciBzZWxlY3RvcjtcbiAgc2VsZWN0b3IgPSB7fTtcbiAgXy5lYWNoKGZpbHRlcnMsIGZ1bmN0aW9uKGZpbHRlcikge1xuICAgIHZhciBhY3Rpb24sIG5hbWUsIHZhbHVlO1xuICAgIGlmICgoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIubGVuZ3RoIDogdm9pZCAwKSA9PT0gMykge1xuICAgICAgbmFtZSA9IGZpbHRlclswXTtcbiAgICAgIGFjdGlvbiA9IGZpbHRlclsxXTtcbiAgICAgIHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdLCBjb250ZXh0KTtcbiAgICAgIHNlbGVjdG9yW25hbWVdID0ge307XG4gICAgICByZXR1cm4gc2VsZWN0b3JbbmFtZV1bYWN0aW9uXSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbkNyZWF0b3IuaXNDb21tb25TcGFjZSA9IGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgcmV0dXJuIHNwYWNlSWQgPT09ICdjb21tb24nO1xufTtcblxuXG4vKlxuXHRkb2Nz77ya5b6F5o6S5bqP55qE5paH5qGj5pWw57uEXG5cdGlkc++8ml9pZOmbhuWQiFxuXHRpZF9rZXk6IOm7mOiupOS4ul9pZFxuXHRyZXR1cm4g5oyJ54WnaWRz55qE6aG65bqP6L+U5Zue5paw55qE5paH5qGj6ZuG5ZCIXG4gKi9cblxuQ3JlYXRvci5nZXRPcmRlcmx5U2V0QnlJZHMgPSBmdW5jdGlvbihkb2NzLCBpZHMsIGlkX2tleSwgaGl0X2ZpcnN0KSB7XG4gIHZhciB2YWx1ZXM7XG4gIGlmICghaWRfa2V5KSB7XG4gICAgaWRfa2V5ID0gXCJfaWRcIjtcbiAgfVxuICBpZiAoaGl0X2ZpcnN0KSB7XG4gICAgdmFsdWVzID0gZG9jcy5nZXRQcm9wZXJ0eShpZF9rZXkpO1xuICAgIHJldHVybiBfLnNvcnRCeShkb2NzLCBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciBfaW5kZXg7XG4gICAgICBfaW5kZXggPSBpZHMuaW5kZXhPZihkb2NbaWRfa2V5XSk7XG4gICAgICBpZiAoX2luZGV4ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIF9pbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpZHMubGVuZ3RoICsgXy5pbmRleE9mKHZhbHVlcywgZG9jW2lkX2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBfLnNvcnRCeShkb2NzLCBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHJldHVybiBpZHMuaW5kZXhPZihkb2NbaWRfa2V5XSk7XG4gICAgfSk7XG4gIH1cbn07XG5cblxuLypcblx05oyJ55So5oi35omA5bGe5pys5Zyw5YyW6K+t6KiA6L+b6KGM5o6S5bqP77yM5pSv5oyB5Lit5paH44CB5pWw5YC844CB5pel5pyf562J5a2X5q615o6S5bqPXG5cdOWvueS6jk9iamVjdOexu+Wei++8jOWmguaenOaPkOS+m+S9nOeUqOWfn+S4rWtleeWxnuaAp++8jOWImeWPluWAvOS4unZhbHVlW2tleV3ov5vooYzmjpLluo/mr5TovoPvvIzlj43kuYvmlbTkuKpPYmplY3QudG9TdHJpbmcoKeWQjuaOkuW6j+avlOi+g1xuICovXG5cbkNyZWF0b3Iuc29ydGluZ01ldGhvZCA9IGZ1bmN0aW9uKHZhbHVlMSwgdmFsdWUyKSB7XG4gIHZhciBpc1ZhbHVlMUVtcHR5LCBpc1ZhbHVlMkVtcHR5LCBsb2NhbGU7XG4gIGlmICh0aGlzLmtleSkge1xuICAgIHZhbHVlMSA9IHZhbHVlMVt0aGlzLmtleV07XG4gICAgdmFsdWUyID0gdmFsdWUyW3RoaXMua2V5XTtcbiAgfVxuICBpZiAodmFsdWUxIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHZhbHVlMSA9IHZhbHVlMS5nZXRUaW1lKCk7XG4gIH1cbiAgaWYgKHZhbHVlMiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICB2YWx1ZTIgPSB2YWx1ZTIuZ2V0VGltZSgpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUxID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB2YWx1ZTIgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gdmFsdWUxIC0gdmFsdWUyO1xuICB9XG4gIGlzVmFsdWUxRW1wdHkgPSB2YWx1ZTEgPT09IG51bGwgfHwgdmFsdWUxID09PSB2b2lkIDA7XG4gIGlzVmFsdWUyRW1wdHkgPSB2YWx1ZTIgPT09IG51bGwgfHwgdmFsdWUyID09PSB2b2lkIDA7XG4gIGlmIChpc1ZhbHVlMUVtcHR5ICYmICFpc1ZhbHVlMkVtcHR5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChpc1ZhbHVlMUVtcHR5ICYmIGlzVmFsdWUyRW1wdHkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoIWlzVmFsdWUxRW1wdHkgJiYgaXNWYWx1ZTJFbXB0eSkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIGxvY2FsZSA9IFN0ZWVkb3MubG9jYWxlKCk7XG4gIHJldHVybiB2YWx1ZTEudG9TdHJpbmcoKS5sb2NhbGVDb21wYXJlKHZhbHVlMi50b1N0cmluZygpLCBsb2NhbGUpO1xufTtcblxuQ3JlYXRvci5nZXRPYmplY3RSZWxhdGVkcyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBfb2JqZWN0LCBwZXJtaXNzaW9ucywgcmVsYXRlZExpc3QsIHJlbGF0ZWRMaXN0TWFwLCByZWxhdGVkX29iamVjdHM7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICB9XG4gIHJlbGF0ZWRfb2JqZWN0cyA9IFtdO1xuICBfb2JqZWN0ID0gQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXTtcbiAgaWYgKCFfb2JqZWN0KSB7XG4gICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0cztcbiAgfVxuICByZWxhdGVkTGlzdCA9IF9vYmplY3QucmVsYXRlZExpc3Q7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgIV8uaXNFbXB0eShyZWxhdGVkTGlzdCkpIHtcbiAgICByZWxhdGVkTGlzdE1hcCA9IHt9O1xuICAgIF8uZWFjaChyZWxhdGVkTGlzdCwgZnVuY3Rpb24ob2JqTmFtZSkge1xuICAgICAgaWYgKF8uaXNPYmplY3Qob2JqTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0ZWRMaXN0TWFwW29iak5hbWUub2JqZWN0TmFtZV0gPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZWxhdGVkTGlzdE1hcFtvYmpOYW1lXSA9IHt9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIF8uZWFjaChDcmVhdG9yLk9iamVjdHMsIGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKSB7XG4gICAgICByZXR1cm4gXy5lYWNoKHJlbGF0ZWRfb2JqZWN0LmZpZWxkcywgZnVuY3Rpb24ocmVsYXRlZF9maWVsZCwgcmVsYXRlZF9maWVsZF9uYW1lKSB7XG4gICAgICAgIGlmICgocmVsYXRlZF9maWVsZC50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIiB8fCByZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibG9va3VwXCIpICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvID09PSBvYmplY3RfbmFtZSAmJiByZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXSkge1xuICAgICAgICAgIGlmIChfLmlzRW1wdHkocmVsYXRlZExpc3RNYXBbcmVsYXRlZF9vYmplY3RfbmFtZV0gfHwgcmVsYXRlZF9maWVsZC50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXSA9IHtcbiAgICAgICAgICAgICAgb2JqZWN0X25hbWU6IHJlbGF0ZWRfb2JqZWN0X25hbWUsXG4gICAgICAgICAgICAgIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWUsXG4gICAgICAgICAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiByZWxhdGVkX2ZpZWxkLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlbGF0ZWRMaXN0TWFwWydjbXNfZmlsZXMnXSkge1xuICAgICAgcmVsYXRlZExpc3RNYXBbJ2Ntc19maWxlcyddID0ge1xuICAgICAgICBvYmplY3RfbmFtZTogXCJjbXNfZmlsZXNcIixcbiAgICAgICAgZm9yZWlnbl9rZXk6IFwicGFyZW50XCJcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChyZWxhdGVkTGlzdE1hcFsnaW5zdGFuY2VzJ10pIHtcbiAgICAgIHJlbGF0ZWRMaXN0TWFwWydpbnN0YW5jZXMnXSA9IHtcbiAgICAgICAgb2JqZWN0X25hbWU6IFwiaW5zdGFuY2VzXCIsXG4gICAgICAgIGZvcmVpZ25fa2V5OiBcInJlY29yZF9pZHNcIlxuICAgICAgfTtcbiAgICB9XG4gICAgXy5lYWNoKFsndGFza3MnLCAnbm90ZXMnLCAnZXZlbnRzJywgJ2FwcHJvdmFscyddLCBmdW5jdGlvbihlbmFibGVPYmpOYW1lKSB7XG4gICAgICBpZiAocmVsYXRlZExpc3RNYXBbZW5hYmxlT2JqTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0ZWRMaXN0TWFwW2VuYWJsZU9iak5hbWVdID0ge1xuICAgICAgICAgIG9iamVjdF9uYW1lOiBlbmFibGVPYmpOYW1lLFxuICAgICAgICAgIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyZWxhdGVkTGlzdE1hcFsnYXVkaXRfcmVjb3JkcyddKSB7XG4gICAgICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUpO1xuICAgICAgaWYgKF9vYmplY3QuZW5hYmxlX2F1ZGl0ICYmIChwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyA6IHZvaWQgMCkpIHtcbiAgICAgICAgcmVsYXRlZExpc3RNYXBbJ2F1ZGl0X3JlY29yZHMnXSA9IHtcbiAgICAgICAgICBvYmplY3RfbmFtZTogXCJhdWRpdF9yZWNvcmRzXCIsXG4gICAgICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJlbGF0ZWRfb2JqZWN0cyA9IF8udmFsdWVzKHJlbGF0ZWRMaXN0TWFwKTtcbiAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RzO1xuICB9XG4gIGlmIChfb2JqZWN0LmVuYWJsZV9maWxlcykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcImNtc19maWxlc1wiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwicGFyZW50XCJcbiAgICB9KTtcbiAgfVxuICBfLmVhY2goQ3JlYXRvci5PYmplY3RzLCBmdW5jdGlvbihyZWxhdGVkX29iamVjdCwgcmVsYXRlZF9vYmplY3RfbmFtZSkge1xuICAgIHZhciBzZnNGaWxlc09iamVjdDtcbiAgICBpZiAocmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiKSB7XG4gICAgICBzZnNGaWxlc09iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KFwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIik7XG4gICAgICBzZnNGaWxlc09iamVjdCAmJiAocmVsYXRlZF9vYmplY3QgPSBzZnNGaWxlc09iamVjdCk7XG4gICAgfVxuICAgIHJldHVybiBfLmVhY2gocmVsYXRlZF9vYmplY3QuZmllbGRzLCBmdW5jdGlvbihyZWxhdGVkX2ZpZWxkLCByZWxhdGVkX2ZpZWxkX25hbWUpIHtcbiAgICAgIGlmICgocmVsYXRlZF9maWVsZC50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIiB8fCAocmVsYXRlZF9maWVsZC50eXBlID09PSBcImxvb2t1cFwiICYmIHJlbGF0ZWRfZmllbGQucmVsYXRlZExpc3QpKSAmJiByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byAmJiByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byA9PT0gb2JqZWN0X25hbWUpIHtcbiAgICAgICAgaWYgKHJlbGF0ZWRfb2JqZWN0X25hbWUgPT09IFwib2JqZWN0X2ZpZWxkc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0cy5zcGxpY2UoMCwgMCwge1xuICAgICAgICAgICAgb2JqZWN0X25hbWU6IHJlbGF0ZWRfb2JqZWN0X25hbWUsXG4gICAgICAgICAgICBmb3JlaWduX2tleTogcmVsYXRlZF9maWVsZF9uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICAgIG9iamVjdF9uYW1lOiByZWxhdGVkX29iamVjdF9uYW1lLFxuICAgICAgICAgICAgZm9yZWlnbl9rZXk6IHJlbGF0ZWRfZmllbGRfbmFtZSxcbiAgICAgICAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiByZWxhdGVkX2ZpZWxkLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChfb2JqZWN0LmVuYWJsZV90YXNrcykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcInRhc2tzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICB9KTtcbiAgfVxuICBpZiAoX29iamVjdC5lbmFibGVfbm90ZXMpIHtcbiAgICByZWxhdGVkX29iamVjdHMucHVzaCh7XG4gICAgICBvYmplY3RfbmFtZTogXCJub3Rlc1wiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgfSk7XG4gIH1cbiAgaWYgKF9vYmplY3QuZW5hYmxlX2V2ZW50cykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcImV2ZW50c1wiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgfSk7XG4gIH1cbiAgaWYgKF9vYmplY3QuZW5hYmxlX2luc3RhbmNlcykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcImluc3RhbmNlc1wiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwicmVjb3JkX2lkc1wiXG4gICAgfSk7XG4gIH1cbiAgaWYgKF9vYmplY3QuZW5hYmxlX2FwcHJvdmFscykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcImFwcHJvdmFsc1wiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgfSk7XG4gIH1cbiAgaWYgKF9vYmplY3QuZW5hYmxlX3Byb2Nlc3MpIHtcbiAgICByZWxhdGVkX29iamVjdHMucHVzaCh7XG4gICAgICBvYmplY3RfbmFtZTogXCJwcm9jZXNzX2luc3RhbmNlX2hpc3RvcnlcIixcbiAgICAgIGZvcmVpZ25fa2V5OiBcInRhcmdldF9vYmplY3RcIlxuICAgIH0pO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUpO1xuICAgIGlmIChfb2JqZWN0LmVuYWJsZV9hdWRpdCAmJiAocGVybWlzc2lvbnMgIT0gbnVsbCA/IHBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgOiB2b2lkIDApKSB7XG4gICAgICByZWxhdGVkX29iamVjdHMucHVzaCh7XG4gICAgICAgIG9iamVjdF9uYW1lOiBcImF1ZGl0X3JlY29yZHNcIixcbiAgICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlbGF0ZWRfb2JqZWN0cztcbn07XG5cbkNyZWF0b3IuZ2V0VXNlckNvbnRleHQgPSBmdW5jdGlvbih1c2VySWQsIHNwYWNlSWQsIGlzVW5TYWZlTW9kZSkge1xuICB2YXIgVVNFUl9DT05URVhULCByZWYsIHNwYWNlX3VzZXJfb3JnLCBzdSwgc3VGaWVsZHM7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5VU0VSX0NPTlRFWFQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCEodXNlcklkICYmIHNwYWNlSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDUwMCwgXCJ0aGUgcGFyYW1zIHVzZXJJZCBhbmQgc3BhY2VJZCBpcyByZXF1aXJlZCBmb3IgdGhlIGZ1bmN0aW9uIENyZWF0b3IuZ2V0VXNlckNvbnRleHRcIik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3VGaWVsZHMgPSB7XG4gICAgICBuYW1lOiAxLFxuICAgICAgbW9iaWxlOiAxLFxuICAgICAgcG9zaXRpb246IDEsXG4gICAgICBlbWFpbDogMSxcbiAgICAgIGNvbXBhbnk6IDEsXG4gICAgICBvcmdhbml6YXRpb246IDEsXG4gICAgICBzcGFjZTogMSxcbiAgICAgIGNvbXBhbnlfaWQ6IDEsXG4gICAgICBjb21wYW55X2lkczogMVxuICAgIH07XG4gICAgc3UgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIHVzZXI6IHVzZXJJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczogc3VGaWVsZHNcbiAgICB9KTtcbiAgICBpZiAoIXN1KSB7XG4gICAgICBzcGFjZUlkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICBpZiAoaXNVblNhZmVNb2RlKSB7XG4gICAgICAgIHN1ID0gQ3JlYXRvci5Db2xsZWN0aW9uc1tcInNwYWNlX3VzZXJzXCJdLmZpbmRPbmUoe1xuICAgICAgICAgIHVzZXI6IHVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiBzdUZpZWxkc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNwYWNlSWQgPSBzdS5zcGFjZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBVU0VSX0NPTlRFWFQgPSB7fTtcbiAgICBVU0VSX0NPTlRFWFQudXNlcklkID0gdXNlcklkO1xuICAgIFVTRVJfQ09OVEVYVC5zcGFjZUlkID0gc3BhY2VJZDtcbiAgICBVU0VSX0NPTlRFWFQudXNlciA9IHtcbiAgICAgIF9pZDogdXNlcklkLFxuICAgICAgbmFtZTogc3UubmFtZSxcbiAgICAgIG1vYmlsZTogc3UubW9iaWxlLFxuICAgICAgcG9zaXRpb246IHN1LnBvc2l0aW9uLFxuICAgICAgZW1haWw6IHN1LmVtYWlsLFxuICAgICAgY29tcGFueTogc3UuY29tcGFueSxcbiAgICAgIGNvbXBhbnlfaWQ6IHN1LmNvbXBhbnlfaWQsXG4gICAgICBjb21wYW55X2lkczogc3UuY29tcGFueV9pZHNcbiAgICB9O1xuICAgIHNwYWNlX3VzZXJfb3JnID0gKHJlZiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9yZ2FuaXphdGlvbnNcIikpICE9IG51bGwgPyByZWYuZmluZE9uZShzdS5vcmdhbml6YXRpb24pIDogdm9pZCAwO1xuICAgIGlmIChzcGFjZV91c2VyX29yZykge1xuICAgICAgVVNFUl9DT05URVhULnVzZXIub3JnYW5pemF0aW9uID0ge1xuICAgICAgICBfaWQ6IHNwYWNlX3VzZXJfb3JnLl9pZCxcbiAgICAgICAgbmFtZTogc3BhY2VfdXNlcl9vcmcubmFtZSxcbiAgICAgICAgZnVsbG5hbWU6IHNwYWNlX3VzZXJfb3JnLmZ1bGxuYW1lXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gVVNFUl9DT05URVhUO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldFJlbGF0aXZlVXJsID0gZnVuY3Rpb24odXJsKSB7XG4gIGlmIChfLmlzRnVuY3Rpb24oU3RlZWRvcy5pc0NvcmRvdmEpICYmIFN0ZWVkb3MuaXNDb3Jkb3ZhKCkgJiYgKCh1cmwgIT0gbnVsbCA/IHVybC5zdGFydHNXaXRoKFwiL2Fzc2V0c1wiKSA6IHZvaWQgMCkgfHwgKHVybCAhPSBudWxsID8gdXJsLnN0YXJ0c1dpdGgoXCJhc3NldHNcIikgOiB2b2lkIDApIHx8ICh1cmwgIT0gbnVsbCA/IHVybC5zdGFydHNXaXRoKFwiL3BhY2thZ2VzXCIpIDogdm9pZCAwKSkpIHtcbiAgICBpZiAoIS9eXFwvLy50ZXN0KHVybCkpIHtcbiAgICAgIHVybCA9IFwiL1wiICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGlmICh1cmwpIHtcbiAgICBpZiAoIS9eXFwvLy50ZXN0KHVybCkpIHtcbiAgICAgIHVybCA9IFwiL1wiICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIHVybDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWDtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRVc2VyQ29tcGFueUlkID0gZnVuY3Rpb24odXNlcklkLCBzcGFjZUlkKSB7XG4gIHZhciBzdTtcbiAgdXNlcklkID0gdXNlcklkIHx8IE1ldGVvci51c2VySWQoKTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHNwYWNlSWQgPSBzcGFjZUlkIHx8IFNlc3Npb24uZ2V0KCdzcGFjZUlkJyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ21pc3Mgc3BhY2VJZCcpO1xuICAgIH1cbiAgfVxuICBzdSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignc3BhY2VfdXNlcnMnKS5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICB1c2VyOiB1c2VySWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgY29tcGFueV9pZDogMVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzdS5jb21wYW55X2lkO1xufTtcblxuQ3JlYXRvci5nZXRVc2VyQ29tcGFueUlkcyA9IGZ1bmN0aW9uKHVzZXJJZCwgc3BhY2VJZCkge1xuICB2YXIgc3U7XG4gIHVzZXJJZCA9IHVzZXJJZCB8fCBNZXRlb3IudXNlcklkKCk7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBzcGFjZUlkID0gc3BhY2VJZCB8fCBTZXNzaW9uLmdldCgnc3BhY2VJZCcpO1xuICB9IGVsc2Uge1xuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsICdtaXNzIHNwYWNlSWQnKTtcbiAgICB9XG4gIH1cbiAgc3UgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ3NwYWNlX3VzZXJzJykuZmluZE9uZSh7XG4gICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgdXNlcjogdXNlcklkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbXBhbnlfaWRzOiAxXG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHN1ICE9IG51bGwgPyBzdS5jb21wYW55X2lkcyA6IHZvaWQgMDtcbn07XG5cbkNyZWF0b3IucHJvY2Vzc1Blcm1pc3Npb25zID0gZnVuY3Rpb24ocG8pIHtcbiAgaWYgKHBvLmFsbG93Q3JlYXRlKSB7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8uYWxsb3dFZGl0KSB7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8uYWxsb3dEZWxldGUpIHtcbiAgICBwby5hbGxvd0VkaXQgPSB0cnVlO1xuICAgIHBvLmFsbG93UmVhZCA9IHRydWU7XG4gIH1cbiAgaWYgKHBvLnZpZXdBbGxSZWNvcmRzKSB7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8ubW9kaWZ5QWxsUmVjb3Jkcykge1xuICAgIHBvLmFsbG93UmVhZCA9IHRydWU7XG4gICAgcG8uYWxsb3dFZGl0ID0gdHJ1ZTtcbiAgICBwby5hbGxvd0RlbGV0ZSA9IHRydWU7XG4gICAgcG8udmlld0FsbFJlY29yZHMgPSB0cnVlO1xuICB9XG4gIGlmIChwby52aWV3Q29tcGFueVJlY29yZHMpIHtcbiAgICBwby5hbGxvd1JlYWQgPSB0cnVlO1xuICB9XG4gIGlmIChwby5tb2RpZnlDb21wYW55UmVjb3Jkcykge1xuICAgIHBvLmFsbG93UmVhZCA9IHRydWU7XG4gICAgcG8uYWxsb3dFZGl0ID0gdHJ1ZTtcbiAgICBwby5hbGxvd0RlbGV0ZSA9IHRydWU7XG4gICAgcG8udmlld0NvbXBhbnlSZWNvcmRzID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8uYWxsb3dSZWFkKSB7XG4gICAgdHlwZW9mIHBvLmFsbG93UmVhZEZpbGVzICE9PSBcImJvb2xlYW5cIiAmJiAocG8uYWxsb3dSZWFkRmlsZXMgPSB0cnVlKTtcbiAgICB0eXBlb2YgcG8udmlld0FsbEZpbGVzICE9PSBcImJvb2xlYW5cIiAmJiAocG8udmlld0FsbEZpbGVzID0gdHJ1ZSk7XG4gIH1cbiAgaWYgKHBvLmFsbG93RWRpdCkge1xuICAgIHR5cGVvZiBwby5hbGxvd0NyZWF0ZUZpbGVzICE9PSBcImJvb2xlYW5cIiAmJiAocG8uYWxsb3dDcmVhdGVGaWxlcyA9IHRydWUpO1xuICAgIHR5cGVvZiBwby5hbGxvd0VkaXRGaWxlcyAhPT0gXCJib29sZWFuXCIgJiYgKHBvLmFsbG93RWRpdEZpbGVzID0gdHJ1ZSk7XG4gICAgdHlwZW9mIHBvLmFsbG93RGVsZXRlRmlsZXMgIT09IFwiYm9vbGVhblwiICYmIChwby5hbGxvd0RlbGV0ZUZpbGVzID0gdHJ1ZSk7XG4gIH1cbiAgaWYgKHBvLm1vZGlmeUFsbFJlY29yZHMpIHtcbiAgICB0eXBlb2YgcG8ubW9kaWZ5QWxsRmlsZXMgIT09IFwiYm9vbGVhblwiICYmIChwby5tb2RpZnlBbGxGaWxlcyA9IHRydWUpO1xuICB9XG4gIGlmIChwby5hbGxvd0NyZWF0ZUZpbGVzKSB7XG4gICAgcG8uYWxsb3dSZWFkRmlsZXMgPSB0cnVlO1xuICB9XG4gIGlmIChwby5hbGxvd0VkaXRGaWxlcykge1xuICAgIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8uYWxsb3dEZWxldGVGaWxlcykge1xuICAgIHBvLmFsbG93RWRpdEZpbGVzID0gdHJ1ZTtcbiAgICBwby5hbGxvd1JlYWRGaWxlcyA9IHRydWU7XG4gIH1cbiAgaWYgKHBvLnZpZXdBbGxGaWxlcykge1xuICAgIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8ubW9kaWZ5QWxsRmlsZXMpIHtcbiAgICBwby5hbGxvd1JlYWRGaWxlcyA9IHRydWU7XG4gICAgcG8uYWxsb3dFZGl0RmlsZXMgPSB0cnVlO1xuICAgIHBvLmFsbG93RGVsZXRlRmlsZXMgPSB0cnVlO1xuICAgIHBvLnZpZXdBbGxGaWxlcyA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHBvO1xufTtcblxuQ3JlYXRvci5nZXRUZW1wbGF0ZVNwYWNlSWQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlZjtcbiAgcmV0dXJuIChyZWYgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0pICE9IG51bGwgPyByZWYudGVtcGxhdGVTcGFjZUlkIDogdm9pZCAwO1xufTtcblxuQ3JlYXRvci5nZXRDbG91ZEFkbWluU3BhY2VJZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVmO1xuICByZXR1cm4gKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IHJlZi5jbG91ZEFkbWluU3BhY2VJZCA6IHZvaWQgMDtcbn07XG5cbkNyZWF0b3IuaXNUZW1wbGF0ZVNwYWNlID0gZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgcmVmO1xuICBpZiAoc3BhY2VJZCAmJiAoKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IHJlZi50ZW1wbGF0ZVNwYWNlSWQgOiB2b2lkIDApID09PSBzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZSA9IGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgdmFyIHJlZjtcbiAgaWYgKHNwYWNlSWQgJiYgKChyZWYgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0pICE9IG51bGwgPyByZWYuY2xvdWRBZG1pblNwYWNlSWQgOiB2b2lkIDApID09PSBzcGFjZUlkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBDcmVhdG9yLnN0ZWVkb3NTdG9yYWdlRGlyID0gcHJvY2Vzcy5lbnYuU1RFRURPU19TVE9SQUdFX0RJUjtcbn1cbiIsIk1ldGVvci5tZXRob2RzXG5cdCMg55So5oi36I635Y+WbG9va3VwIOOAgW1hc3Rlcl9kZXRhaWznsbvlnovlrZfmrrXnmoTpgInpobnlgLxcblx0XCJjcmVhdG9yLm9iamVjdF9vcHRpb25zXCI6IChvcHRpb25zKS0+XG5cdFx0aWYgb3B0aW9ucz8ucGFyYW1zPy5yZWZlcmVuY2VfdG9cblxuXHRcdFx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob3B0aW9ucy5wYXJhbXMucmVmZXJlbmNlX3RvLCBvcHRpb25zLnBhcmFtcy5zcGFjZSlcblxuXHRcdFx0bmFtZV9maWVsZF9rZXkgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVlcblxuXHRcdFx0cXVlcnkgPSB7fVxuXHRcdFx0aWYgb3B0aW9ucy5wYXJhbXMuc3BhY2Vcblx0XHRcdFx0cXVlcnkuc3BhY2UgPSBvcHRpb25zLnBhcmFtcy5zcGFjZVxuXG5cdFx0XHRcdHNvcnQgPSBvcHRpb25zPy5zb3J0XG5cblx0XHRcdFx0c2VsZWN0ZWQgPSBvcHRpb25zPy5zZWxlY3RlZCB8fCBbXVxuXG5cdFx0XHRcdG9wdGlvbnNfbGltaXQgPSBvcHRpb25zPy5vcHRpb25zX2xpbWl0IHx8IDEwXG5cblx0XHRcdFx0aWYgb3B0aW9ucy5zZWFyY2hUZXh0XG5cdFx0XHRcdFx0c2VhcmNoVGV4dFF1ZXJ5ID0ge31cblx0XHRcdFx0XHRzZWFyY2hUZXh0UXVlcnlbbmFtZV9maWVsZF9rZXldID0geyRyZWdleDogb3B0aW9ucy5zZWFyY2hUZXh0fVxuXG5cdFx0XHRcdGlmIG9wdGlvbnM/LnZhbHVlcz8ubGVuZ3RoXG5cdFx0XHRcdFx0aWYgb3B0aW9ucy5zZWFyY2hUZXh0XG5cdFx0XHRcdFx0XHRxdWVyeS4kb3IgPSBbe19pZDogeyRpbjogb3B0aW9ucy52YWx1ZXN9fSwgc2VhcmNoVGV4dFF1ZXJ5XVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHF1ZXJ5LiRvciA9IFt7X2lkOiB7JGluOiBvcHRpb25zLnZhbHVlc319XVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aWYgb3B0aW9ucy5zZWFyY2hUZXh0XG5cdFx0XHRcdFx0XHRfLmV4dGVuZChxdWVyeSwgc2VhcmNoVGV4dFF1ZXJ5KVxuXHRcdFx0XHRcdHF1ZXJ5Ll9pZCA9IHskbmluOiBzZWxlY3RlZH1cblxuXHRcdFx0XHRjb2xsZWN0aW9uID0gb2JqZWN0LmRiXG5cblx0XHRcdFx0aWYgb3B0aW9ucy5maWx0ZXJRdWVyeVxuXHRcdFx0XHRcdF8uZXh0ZW5kIHF1ZXJ5LCBvcHRpb25zLmZpbHRlclF1ZXJ5XG5cblx0XHRcdFx0cXVlcnlfb3B0aW9ucyA9IHtsaW1pdDogb3B0aW9uc19saW1pdH1cblxuXHRcdFx0XHRpZiBzb3J0ICYmIF8uaXNPYmplY3Qoc29ydClcblx0XHRcdFx0XHRxdWVyeV9vcHRpb25zLnNvcnQgPSBzb3J0XG5cblx0XHRcdFx0aWYgY29sbGVjdGlvblxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0cmVjb3JkcyA9IGNvbGxlY3Rpb24uZmluZChxdWVyeSwgcXVlcnlfb3B0aW9ucykuZmV0Y2goKVxuXHRcdFx0XHRcdFx0cmVzdWx0cyA9IFtdXG5cdFx0XHRcdFx0XHRfLmVhY2ggcmVjb3JkcywgKHJlY29yZCktPlxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2hcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogcmVjb3JkW25hbWVfZmllbGRfa2V5XVxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiByZWNvcmQuX2lkXG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0c1xuXHRcdFx0XHRcdGNhdGNoIGVcblx0XHRcdFx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IgNTAwLCBlLm1lc3NhZ2UgKyBcIi0tPlwiICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucylcblx0XHRyZXR1cm4gW10gIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBcImNyZWF0b3Iub2JqZWN0X29wdGlvbnNcIjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBjb2xsZWN0aW9uLCBlLCBuYW1lX2ZpZWxkX2tleSwgb2JqZWN0LCBvcHRpb25zX2xpbWl0LCBxdWVyeSwgcXVlcnlfb3B0aW9ucywgcmVjb3JkcywgcmVmLCByZWYxLCByZXN1bHRzLCBzZWFyY2hUZXh0UXVlcnksIHNlbGVjdGVkLCBzb3J0O1xuICAgIGlmIChvcHRpb25zICE9IG51bGwgPyAocmVmID0gb3B0aW9ucy5wYXJhbXMpICE9IG51bGwgPyByZWYucmVmZXJlbmNlX3RvIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvcHRpb25zLnBhcmFtcy5yZWZlcmVuY2VfdG8sIG9wdGlvbnMucGFyYW1zLnNwYWNlKTtcbiAgICAgIG5hbWVfZmllbGRfa2V5ID0gb2JqZWN0Lk5BTUVfRklFTERfS0VZO1xuICAgICAgcXVlcnkgPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLnBhcmFtcy5zcGFjZSkge1xuICAgICAgICBxdWVyeS5zcGFjZSA9IG9wdGlvbnMucGFyYW1zLnNwYWNlO1xuICAgICAgICBzb3J0ID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5zb3J0IDogdm9pZCAwO1xuICAgICAgICBzZWxlY3RlZCA9IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnNlbGVjdGVkIDogdm9pZCAwKSB8fCBbXTtcbiAgICAgICAgb3B0aW9uc19saW1pdCA9IChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLm9wdGlvbnNfbGltaXQgOiB2b2lkIDApIHx8IDEwO1xuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgc2VhcmNoVGV4dFF1ZXJ5ID0ge307XG4gICAgICAgICAgc2VhcmNoVGV4dFF1ZXJ5W25hbWVfZmllbGRfa2V5XSA9IHtcbiAgICAgICAgICAgICRyZWdleDogb3B0aW9ucy5zZWFyY2hUZXh0XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsID8gKHJlZjEgPSBvcHRpb25zLnZhbHVlcykgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgcXVlcnkuJG9yID0gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX2lkOiB7XG4gICAgICAgICAgICAgICAgICAkaW46IG9wdGlvbnMudmFsdWVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBzZWFyY2hUZXh0UXVlcnlcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5LiRvciA9IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIF9pZDoge1xuICAgICAgICAgICAgICAgICAgJGluOiBvcHRpb25zLnZhbHVlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgXy5leHRlbmQocXVlcnksIHNlYXJjaFRleHRRdWVyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXJ5Ll9pZCA9IHtcbiAgICAgICAgICAgICRuaW46IHNlbGVjdGVkXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb2xsZWN0aW9uID0gb2JqZWN0LmRiO1xuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJRdWVyeSkge1xuICAgICAgICAgIF8uZXh0ZW5kKHF1ZXJ5LCBvcHRpb25zLmZpbHRlclF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeV9vcHRpb25zID0ge1xuICAgICAgICAgIGxpbWl0OiBvcHRpb25zX2xpbWl0XG4gICAgICAgIH07XG4gICAgICAgIGlmIChzb3J0ICYmIF8uaXNPYmplY3Qoc29ydCkpIHtcbiAgICAgICAgICBxdWVyeV9vcHRpb25zLnNvcnQgPSBzb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlY29yZHMgPSBjb2xsZWN0aW9uLmZpbmQocXVlcnksIHF1ZXJ5X29wdGlvbnMpLmZldGNoKCk7XG4gICAgICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgICAgICBfLmVhY2gocmVjb3JkcywgZnVuY3Rpb24ocmVjb3JkKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGxhYmVsOiByZWNvcmRbbmFtZV9maWVsZF9rZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuX2lkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig1MDAsIGUubWVzc2FnZSArIFwiLS0+XCIgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxufSk7XG4iLCJDcmVhdG9yLmdldEluaXRXaWR0aFBlcmNlbnQgPSAob2JqZWN0X25hbWUsIGNvbHVtbnMpIC0+XG5cdF9zY2hlbWEgPSBDcmVhdG9yLmdldFNjaGVtYShvYmplY3RfbmFtZSk/Ll9zY2hlbWFcblx0Y29sdW1uX251bSA9IDBcblx0aWYgX3NjaGVtYVxuXHRcdF8uZWFjaCBjb2x1bW5zLCAoZmllbGRfbmFtZSkgLT5cblx0XHRcdGZpZWxkID0gXy5waWNrKF9zY2hlbWEsIGZpZWxkX25hbWUpXG5cdFx0XHRpc193aWRlID0gZmllbGRbZmllbGRfbmFtZV0/LmF1dG9mb3JtPy5pc193aWRlXG5cdFx0XHRpZiBpc193aWRlXG5cdFx0XHRcdGNvbHVtbl9udW0gKz0gMlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRjb2x1bW5fbnVtICs9IDFcblxuXHRcdGluaXRfd2lkdGhfcGVyY2VudCA9IDEwMCAvIGNvbHVtbl9udW1cblx0XHRyZXR1cm4gaW5pdF93aWR0aF9wZXJjZW50XG5cbkNyZWF0b3IuZ2V0RmllbGRJc1dpZGUgPSAob2JqZWN0X25hbWUsIGZpZWxkX25hbWUpIC0+XG5cdF9zY2hlbWEgPSBDcmVhdG9yLmdldFNjaGVtYShvYmplY3RfbmFtZSkuX3NjaGVtYVxuXHRpZiBfc2NoZW1hXG5cdFx0ZmllbGQgPSBfLnBpY2soX3NjaGVtYSwgZmllbGRfbmFtZSlcblx0XHRpc193aWRlID0gZmllbGRbZmllbGRfbmFtZV0/LmF1dG9mb3JtPy5pc193aWRlXG5cdFx0cmV0dXJuIGlzX3dpZGVcblxuQ3JlYXRvci5nZXRUYWJ1bGFyT3JkZXIgPSAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgY29sdW1ucykgLT5cblx0c2V0dGluZyA9IENyZWF0b3IuQ29sbGVjdGlvbnM/LnNldHRpbmdzPy5maW5kT25lKHtvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsIHJlY29yZF9pZDogXCJvYmplY3RfbGlzdHZpZXdzXCJ9KVxuXHRvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0Y29sdW1ucyA9IF8ubWFwIGNvbHVtbnMsIChjb2x1bW4pLT5cblx0XHRmaWVsZCA9IG9iai5maWVsZHNbY29sdW1uXVxuXHRcdGlmIGZpZWxkPy50eXBlIGFuZCAhZmllbGQuaGlkZGVuXG5cdFx0XHRyZXR1cm4gY29sdW1uXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZFxuXHRjb2x1bW5zID0gXy5jb21wYWN0IGNvbHVtbnNcblx0aWYgc2V0dGluZyBhbmQgc2V0dGluZy5zZXR0aW5nc1xuXHRcdHNvcnQgPSBzZXR0aW5nLnNldHRpbmdzW2xpc3Rfdmlld19pZF0/LnNvcnQgfHwgW11cblx0XHRzb3J0ID0gXy5tYXAgc29ydCwgKG9yZGVyKS0+XG5cdFx0XHRrZXkgPSBvcmRlclswXVxuXHRcdFx0aW5kZXggPSBfLmluZGV4T2YoY29sdW1ucywga2V5KVxuXHRcdFx0b3JkZXJbMF0gPSBpbmRleCArIDFcblx0XHRcdHJldHVybiBvcmRlclxuXHRcdHJldHVybiBzb3J0XG5cdHJldHVybiBbXVxuXG5cbkNyZWF0b3IuaW5pdExpc3RWaWV3cyA9IChvYmplY3RfbmFtZSktPlxuXHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0Y29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdENvbHVtbnMob2JqZWN0X25hbWUpIHx8IFtcIm5hbWVcIl1cblx0ZXh0cmFfY29sdW1ucyA9IFtcIm93bmVyXCJdXG5cdGRlZmF1bHRfZXh0cmFfY29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdEV4dHJhQ29sdW1ucyhvYmplY3RfbmFtZSkgfHwgW1wib3duZXJcIl1cblx0aWYgZGVmYXVsdF9leHRyYV9jb2x1bW5zXG5cdFx0ZXh0cmFfY29sdW1ucyA9IF8udW5pb24gZXh0cmFfY29sdW1ucywgZGVmYXVsdF9leHRyYV9jb2x1bW5zXG5cblx0b3JkZXIgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRTb3J0KG9iamVjdF9uYW1lKSB8fCBbXVxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRDcmVhdG9yLlRhYnVsYXJTZWxlY3RlZElkcz9bb2JqZWN0X25hbWVdID0gW11cblxuQ3JlYXRvci5jb252ZXJ0TGlzdFZpZXcgPSAoZGVmYXVsdF92aWV3LCBsaXN0X3ZpZXcsIGxpc3Rfdmlld19uYW1lKS0+XG5cdGRlZmF1bHRfY29sdW1ucyA9IGRlZmF1bHRfdmlldz8uY29sdW1uc1xuXHRkZWZhdWx0X21vYmlsZV9jb2x1bW5zID0gZGVmYXVsdF92aWV3Py5tb2JpbGVfY29sdW1uc1xuXHR1bmxlc3MgbGlzdF92aWV3XG5cdFx0cmV0dXJuXG5cdG9pdGVtID0gXy5jbG9uZShsaXN0X3ZpZXcpXG5cdGlmICFfLmhhcyhvaXRlbSwgXCJuYW1lXCIpXG5cdFx0b2l0ZW0ubmFtZSA9IGxpc3Rfdmlld19uYW1lXG5cdGlmICFvaXRlbS5jb2x1bW5zXG5cdFx0aWYgZGVmYXVsdF9jb2x1bW5zXG5cdFx0XHRvaXRlbS5jb2x1bW5zID0gZGVmYXVsdF9jb2x1bW5zXG5cdGlmICFvaXRlbS5jb2x1bW5zXG5cdFx0b2l0ZW0uY29sdW1ucyA9IFtcIm5hbWVcIl1cblx0aWYgIW9pdGVtLm1vYmlsZV9jb2x1bW5zXG5cdFx0aWYgZGVmYXVsdF9tb2JpbGVfY29sdW1uc1xuXHRcdFx0b2l0ZW0ubW9iaWxlX2NvbHVtbnMgPSBkZWZhdWx0X21vYmlsZV9jb2x1bW5zXG5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZShTZXNzaW9uLmdldChcInNwYWNlSWRcIikpICYmICFfLmluY2x1ZGUob2l0ZW0uY29sdW1ucywgJ3NwYWNlJylcblx0XHRcdG9pdGVtLmNvbHVtbnMucHVzaCgnc3BhY2UnKVxuXG5cblx0aWYgIW9pdGVtLmZpbHRlcl9zY29wZVxuXHRcdCMgbGlzdHZpZXfop4blm77nmoRmaWx0ZXJfc2NvcGXpu5jorqTlgLzmlLnkuLpzcGFjZSAjMTMxXG5cdFx0b2l0ZW0uZmlsdGVyX3Njb3BlID0gXCJzcGFjZVwiXG5cblx0aWYgIV8uaGFzKG9pdGVtLCBcIl9pZFwiKVxuXHRcdG9pdGVtLl9pZCA9IGxpc3Rfdmlld19uYW1lXG5cdGVsc2Vcblx0XHRvaXRlbS5sYWJlbCA9IG9pdGVtLmxhYmVsIHx8IGxpc3Rfdmlldy5uYW1lXG5cblx0aWYgXy5pc1N0cmluZyhvaXRlbS5vcHRpb25zKVxuXHRcdG9pdGVtLm9wdGlvbnMgPSBKU09OLnBhcnNlKG9pdGVtLm9wdGlvbnMpXG5cblx0Xy5mb3JFYWNoIG9pdGVtLmZpbHRlcnMsIChmaWx0ZXIsIF9pbmRleCktPlxuXHRcdGlmICFfLmlzQXJyYXkoZmlsdGVyKSAmJiBfLmlzT2JqZWN0KGZpbHRlcilcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24oZmlsdGVyPy52YWx1ZSlcblx0XHRcdFx0XHRmaWx0ZXIuX3ZhbHVlID0gZmlsdGVyLnZhbHVlLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0aWYgXy5pc1N0cmluZyhmaWx0ZXI/Ll92YWx1ZSlcblx0XHRcdFx0XHRmaWx0ZXIudmFsdWUgPSBDcmVhdG9yLmV2YWwoXCIoI3tmaWx0ZXIuX3ZhbHVlfSlcIilcblx0cmV0dXJuIG9pdGVtXG5cblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdENyZWF0b3IuZ2V0UmVsYXRlZExpc3QgPSAob2JqZWN0X25hbWUpLT5cblx0XHR1bmxlc3Mgb2JqZWN0X25hbWVcblx0XHRcdHJldHVyblxuXHRcdHJlbGF0ZWRMaXN0T2JqZWN0cyA9IHt9XG5cdFx0cmVsYXRlZExpc3ROYW1lcyA9IFtdXG5cdFx0b2JqZWN0TGF5b3V0UmVsYXRlZExpc3RPYmplY3RzID0gW107XG5cdFx0X29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRcdGlmIF9vYmplY3Rcblx0XHRcdGxheW91dFJlbGF0ZWRMaXN0ID0gX29iamVjdC5yZWxhdGVkX2xpc3RzO1xuXHRcdFx0IyBsYXlvdXRSZWxhdGVkTGlzdCDmmK/mlbDnu4TlsLHooajnpLrphY3nva7ov4fpobXpnaLluIPlsYDvvIzlsLHlkK/nlKjpobXpnaLluIPlsYDnmoTnm7jlhbPlrZDooajjgIJcblx0XHRcdGlmIF8uaXNBcnJheSBsYXlvdXRSZWxhdGVkTGlzdFxuXHRcdFx0XHRfLmVhY2ggbGF5b3V0UmVsYXRlZExpc3QsIChpdGVtKS0+XG5cdFx0XHRcdFx0cmVPYmplY3ROYW1lID0gaXRlbS5yZWxhdGVkX2ZpZWxkX2Z1bGxuYW1lLnNwbGl0KCcuJylbMF1cblx0XHRcdFx0XHRyZUZpZWxkTmFtZSA9IGl0ZW0ucmVsYXRlZF9maWVsZF9mdWxsbmFtZS5zcGxpdCgnLicpWzFdXG5cdFx0XHRcdFx0d3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPSBDcmVhdG9yLmdldE9iamVjdChyZU9iamVjdE5hbWUpPy5maWVsZHNbcmVGaWVsZE5hbWVdPy53cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZFxuXHRcdFx0XHRcdHJlbGF0ZWQgPVxuXHRcdFx0XHRcdFx0b2JqZWN0X25hbWU6IHJlT2JqZWN0TmFtZVxuXHRcdFx0XHRcdFx0Y29sdW1uczogaXRlbS5maWVsZF9uYW1lc1xuXHRcdFx0XHRcdFx0bW9iaWxlX2NvbHVtbnM6IGl0ZW0uZmllbGRfbmFtZXNcblx0XHRcdFx0XHRcdGlzX2ZpbGU6IHJlT2JqZWN0TmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHRcdFx0XHRmaWx0ZXJzRnVuY3Rpb246IGl0ZW0uZmlsdGVyc1xuXHRcdFx0XHRcdFx0c29ydDogaXRlbS5zb3J0XG5cdFx0XHRcdFx0XHRyZWxhdGVkX2ZpZWxkX25hbWU6IHJlRmllbGROYW1lXG5cdFx0XHRcdFx0XHRjdXN0b21SZWxhdGVkTGlzdE9iamVjdDogdHJ1ZVxuXHRcdFx0XHRcdFx0d3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG5cdFx0XHRcdFx0XHRsYWJlbDogaXRlbS5sYWJlbFxuXHRcdFx0XHRcdFx0YWN0aW9uczogaXRlbS5idXR0b25zXG5cdFx0XHRcdFx0XHR2aXNpYmxlX29uOiBpdGVtLnZpc2libGVfb25cblx0XHRcdFx0XHRcdHBhZ2Vfc2l6ZTogaXRlbS5wYWdlX3NpemVcblx0XHRcdFx0XHRvYmplY3RMYXlvdXRSZWxhdGVkTGlzdE9iamVjdHMucHVzaChyZWxhdGVkKVxuXHRcdFx0XHRyZXR1cm4gb2JqZWN0TGF5b3V0UmVsYXRlZExpc3RPYmplY3RzO1xuXHRcdFx0cmVsYXRlZExpc3QgPSBfb2JqZWN0LnJlbGF0ZWRMaXN0XG5cdFx0XHRpZiAhXy5pc0VtcHR5IHJlbGF0ZWRMaXN0XG5cdFx0XHRcdF8uZWFjaCByZWxhdGVkTGlzdCwgKG9iak9yTmFtZSktPlxuXHRcdFx0XHRcdGlmIF8uaXNPYmplY3Qgb2JqT3JOYW1lXG5cdFx0XHRcdFx0XHRyZWxhdGVkID1cblx0XHRcdFx0XHRcdFx0b2JqZWN0X25hbWU6IG9iak9yTmFtZS5vYmplY3ROYW1lXG5cdFx0XHRcdFx0XHRcdGNvbHVtbnM6IG9iak9yTmFtZS5jb2x1bW5zXG5cdFx0XHRcdFx0XHRcdG1vYmlsZV9jb2x1bW5zOiBvYmpPck5hbWUubW9iaWxlX2NvbHVtbnNcblx0XHRcdFx0XHRcdFx0aXNfZmlsZTogb2JqT3JOYW1lLm9iamVjdE5hbWUgPT0gXCJjbXNfZmlsZXNcIlxuXHRcdFx0XHRcdFx0XHRmaWx0ZXJzRnVuY3Rpb246IG9iak9yTmFtZS5maWx0ZXJzXG5cdFx0XHRcdFx0XHRcdHNvcnQ6IG9iak9yTmFtZS5zb3J0XG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZTogJydcblx0XHRcdFx0XHRcdFx0Y3VzdG9tUmVsYXRlZExpc3RPYmplY3Q6IHRydWVcblx0XHRcdFx0XHRcdFx0bGFiZWw6IG9iak9yTmFtZS5sYWJlbFxuXHRcdFx0XHRcdFx0XHRhY3Rpb25zOiBvYmpPck5hbWUuYWN0aW9uc1xuXHRcdFx0XHRcdFx0XHRwYWdlX3NpemU6IG9iak9yTmFtZS5wYWdlX3NpemVcblx0XHRcdFx0XHRcdHJlbGF0ZWRMaXN0T2JqZWN0c1tvYmpPck5hbWUub2JqZWN0TmFtZV0gPSByZWxhdGVkXG5cdFx0XHRcdFx0XHRyZWxhdGVkTGlzdE5hbWVzLnB1c2ggb2JqT3JOYW1lLm9iamVjdE5hbWVcblx0XHRcdFx0XHRlbHNlIGlmIF8uaXNTdHJpbmcgb2JqT3JOYW1lXG5cdFx0XHRcdFx0XHRyZWxhdGVkTGlzdE5hbWVzLnB1c2ggb2JqT3JOYW1lXG5cblx0XHRtYXBMaXN0ID0ge31cblx0XHRyZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldFJlbGF0ZWRPYmplY3RzKG9iamVjdF9uYW1lKVxuXHRcdF8uZWFjaCByZWxhdGVkX29iamVjdHMsIChyZWxhdGVkX29iamVjdF9pdGVtKSAtPlxuXHRcdFx0aWYgIXJlbGF0ZWRfb2JqZWN0X2l0ZW0/Lm9iamVjdF9uYW1lXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0cmVsYXRlZF9vYmplY3RfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0X2l0ZW0ub2JqZWN0X25hbWVcblx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0X2l0ZW0uZm9yZWlnbl9rZXlcblx0XHRcdHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID0gcmVsYXRlZF9vYmplY3RfaXRlbS53cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZFxuXHRcdFx0cmVsYXRlZF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZWxhdGVkX29iamVjdF9uYW1lKVxuXHRcdFx0dW5sZXNzIHJlbGF0ZWRfb2JqZWN0XG5cdFx0XHRcdHJldHVyblxuXHRcdFx0Y29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMocmVsYXRlZF9vYmplY3RfbmFtZSkgfHwgW1wibmFtZVwiXVxuXHRcdFx0Y29sdW1ucyA9IF8ud2l0aG91dChjb2x1bW5zLCByZWxhdGVkX2ZpZWxkX25hbWUpXG5cdFx0XHRtb2JpbGVfY29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMocmVsYXRlZF9vYmplY3RfbmFtZSwgdHJ1ZSkgfHwgW1wibmFtZVwiXVxuXHRcdFx0bW9iaWxlX2NvbHVtbnMgPSBfLndpdGhvdXQobW9iaWxlX2NvbHVtbnMsIHJlbGF0ZWRfZmllbGRfbmFtZSlcblxuXHRcdFx0b3JkZXIgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRTb3J0KHJlbGF0ZWRfb2JqZWN0X25hbWUpXG5cdFx0XHR0YWJ1bGFyX29yZGVyID0gQ3JlYXRvci50cmFuc2Zvcm1Tb3J0VG9UYWJ1bGFyKG9yZGVyLCBjb2x1bW5zKVxuXG5cdFx0XHRpZiAvXFx3K1xcLlxcJFxcLlxcdysvZy50ZXN0KHJlbGF0ZWRfZmllbGRfbmFtZSlcblx0XHRcdFx0IyBvYmplY3TnsbvlnovluKblrZDlsZ7mgKfnmoRyZWxhdGVkX2ZpZWxkX25hbWXopoHljrvmjonkuK3pl7TnmoTnvo7lhYPnrKblj7fvvIzlkKbliJnmmL7npLrkuI3lh7rlrZfmrrXlgLxcblx0XHRcdFx0cmVsYXRlZF9maWVsZF9uYW1lID0gcmVsYXRlZF9maWVsZF9uYW1lLnJlcGxhY2UoL1xcJFxcLi8sXCJcIilcblx0XHRcdHJlbGF0ZWQgPVxuXHRcdFx0XHRvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZVxuXHRcdFx0XHRjb2x1bW5zOiBjb2x1bW5zXG5cdFx0XHRcdG1vYmlsZV9jb2x1bW5zOiBtb2JpbGVfY29sdW1uc1xuXHRcdFx0XHRyZWxhdGVkX2ZpZWxkX25hbWU6IHJlbGF0ZWRfZmllbGRfbmFtZVxuXHRcdFx0XHRpc19maWxlOiByZWxhdGVkX29iamVjdF9uYW1lID09IFwiY21zX2ZpbGVzXCJcblx0XHRcdFx0d3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG5cblx0XHRcdHJlbGF0ZWRPYmplY3QgPSByZWxhdGVkTGlzdE9iamVjdHNbcmVsYXRlZF9vYmplY3RfbmFtZV1cblx0XHRcdGlmIHJlbGF0ZWRPYmplY3Rcblx0XHRcdFx0aWYgcmVsYXRlZE9iamVjdC5jb2x1bW5zXG5cdFx0XHRcdFx0cmVsYXRlZC5jb2x1bW5zID0gcmVsYXRlZE9iamVjdC5jb2x1bW5zXG5cdFx0XHRcdGlmIHJlbGF0ZWRPYmplY3QubW9iaWxlX2NvbHVtbnNcblx0XHRcdFx0XHRyZWxhdGVkLm1vYmlsZV9jb2x1bW5zID0gcmVsYXRlZE9iamVjdC5tb2JpbGVfY29sdW1uc1xuXHRcdFx0XHRpZiByZWxhdGVkT2JqZWN0LnNvcnRcblx0XHRcdFx0XHRyZWxhdGVkLnNvcnQgPSByZWxhdGVkT2JqZWN0LnNvcnRcblx0XHRcdFx0aWYgcmVsYXRlZE9iamVjdC5maWx0ZXJzRnVuY3Rpb25cblx0XHRcdFx0XHRyZWxhdGVkLmZpbHRlcnNGdW5jdGlvbiA9IHJlbGF0ZWRPYmplY3QuZmlsdGVyc0Z1bmN0aW9uXG5cdFx0XHRcdGlmIHJlbGF0ZWRPYmplY3QuY3VzdG9tUmVsYXRlZExpc3RPYmplY3Rcblx0XHRcdFx0XHRyZWxhdGVkLmN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0ID0gcmVsYXRlZE9iamVjdC5jdXN0b21SZWxhdGVkTGlzdE9iamVjdFxuXHRcdFx0XHRpZiByZWxhdGVkT2JqZWN0LmxhYmVsXG5cdFx0XHRcdFx0cmVsYXRlZC5sYWJlbCA9IHJlbGF0ZWRPYmplY3QubGFiZWxcblx0XHRcdFx0aWYgcmVsYXRlZE9iamVjdC5wYWdlX3NpemVcblx0XHRcdFx0XHRyZWxhdGVkLnBhZ2Vfc2l6ZSA9IHJlbGF0ZWRPYmplY3QucGFnZV9zaXplXG5cdFx0XHRcdGRlbGV0ZSByZWxhdGVkTGlzdE9iamVjdHNbcmVsYXRlZF9vYmplY3RfbmFtZV1cblxuXHRcdFx0bWFwTGlzdFtyZWxhdGVkLm9iamVjdF9uYW1lXSA9IHJlbGF0ZWRcblxuXG5cdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXHRcdHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5wbHVjayhfLnZhbHVlcyhyZWxhdGVkTGlzdE9iamVjdHMpLCBcIm9iamVjdF9uYW1lXCIpXG5cdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpXG5cdFx0dW5yZWxhdGVkX29iamVjdHMgPSBwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0c1xuXHRcdHJlbGF0ZWRfb2JqZWN0X25hbWVzID0gXy5kaWZmZXJlbmNlIHJlbGF0ZWRfb2JqZWN0X25hbWVzLCB1bnJlbGF0ZWRfb2JqZWN0c1xuXHRcdF8uZWFjaCByZWxhdGVkTGlzdE9iamVjdHMsICh2LCByZWxhdGVkX29iamVjdF9uYW1lKSAtPlxuXHRcdFx0aXNBY3RpdmUgPSByZWxhdGVkX29iamVjdF9uYW1lcy5pbmRleE9mKHJlbGF0ZWRfb2JqZWN0X25hbWUpID4gLTFcblx0XHRcdGFsbG93UmVhZCA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMocmVsYXRlZF9vYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKT8uYWxsb3dSZWFkXG5cdFx0XHRpZiBpc0FjdGl2ZSAmJiBhbGxvd1JlYWRcblx0XHRcdFx0bWFwTGlzdFtyZWxhdGVkX29iamVjdF9uYW1lXSA9IHZcblxuXHRcdGxpc3QgPSBbXVxuXHRcdGlmIF8uaXNFbXB0eSByZWxhdGVkTGlzdE5hbWVzXG5cdFx0XHRsaXN0ID0gIF8udmFsdWVzIG1hcExpc3Rcblx0XHRlbHNlXG5cdFx0XHRfLmVhY2ggcmVsYXRlZExpc3ROYW1lcywgKG9iamVjdE5hbWUpIC0+XG5cdFx0XHRcdGlmIG1hcExpc3Rbb2JqZWN0TmFtZV1cblx0XHRcdFx0XHRsaXN0LnB1c2ggbWFwTGlzdFtvYmplY3ROYW1lXVxuXG5cdFx0aWYgXy5oYXMoX29iamVjdCwgJ2FsbG93X3JlbGF0ZWRMaXN0Jylcblx0XHRcdGxpc3QgPSBfLmZpbHRlciBsaXN0LCAoaXRlbSktPlxuXHRcdFx0XHRyZXR1cm4gXy5pbmNsdWRlKF9vYmplY3QuYWxsb3dfcmVsYXRlZExpc3QsIGl0ZW0ub2JqZWN0X25hbWUpXG5cblx0XHRyZXR1cm4gbGlzdFxuXG5DcmVhdG9yLmdldE9iamVjdEZpcnN0TGlzdFZpZXcgPSAob2JqZWN0X25hbWUpLT5cblx0cmV0dXJuIF8uZmlyc3QoQ3JlYXRvci5nZXRMaXN0Vmlld3Mob2JqZWN0X25hbWUpKVxuXG4jIyMgXG5cdOWPluWHumxpc3Rfdmlld19pZOWvueW6lOeahOinhuWbvu+8jOWmguaenOS4jeWtmOWcqOaIluiAheayoeacieadg+mZkO+8jOWwsei/lOWbnuesrOS4gOS4quinhuWbvlxuXHRleGFj5Li6dHJ1ZeaXtu+8jOmcgOimgeW8uuWItuaMiWxpc3Rfdmlld19pZOeyvuehruafpeaJvu+8jOS4jem7mOiupOi/lOWbnuesrOS4gOS4quinhuWbvlxuIyMjXG5DcmVhdG9yLmdldExpc3RWaWV3ID0gKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIGV4YWMpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgIW9iamVjdF9uYW1lXG5cdFx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRpZiAhbGlzdF92aWV3X2lkXG5cdFx0XHRsaXN0X3ZpZXdfaWQgPSBTZXNzaW9uLmdldChcImxpc3Rfdmlld19pZFwiKVxuXHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0aWYgIW9iamVjdFxuXHRcdHJldHVyblxuXHRsaXN0Vmlld3MgPSBDcmVhdG9yLmdldExpc3RWaWV3cyhvYmplY3RfbmFtZSlcblx0dW5sZXNzIGxpc3RWaWV3cz8ubGVuZ3RoXG5cdFx0cmV0dXJuXG5cdGxpc3RfdmlldyA9IF8uZmluZChsaXN0Vmlld3MsIChpdGVtKS0+IHJldHVybiBpdGVtLl9pZCA9PSBsaXN0X3ZpZXdfaWQgfHwgaXRlbS5uYW1lID09IGxpc3Rfdmlld19pZClcblx0dW5sZXNzIGxpc3Rfdmlld1xuXHRcdCMg5aaC5p6c5LiN6ZyA6KaB5by65Yi25oyJbGlzdF92aWV3X2lk57K+56Gu5p+l5om+77yM5YiZ6buY6K6k6L+U5Zue56ys5LiA5Liq6KeG5Zu+77yM5Y+N5LmL6L+U5Zue56m6XG5cdFx0aWYgZXhhY1xuXHRcdFx0cmV0dXJuXG5cdFx0ZWxzZVxuXHRcdFx0bGlzdF92aWV3ID0gbGlzdFZpZXdzWzBdXG5cdHJldHVybiBsaXN0X3ZpZXdcblxuI+iOt+WPlmxpc3Rfdmlld19pZOWvueW6lOeahOinhuWbvuaYr+WQpuaYr+acgOi/keafpeeci+inhuWbvlxuQ3JlYXRvci5nZXRMaXN0Vmlld0lzUmVjZW50ID0gKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgIW9iamVjdF9uYW1lXG5cdFx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRpZiAhbGlzdF92aWV3X2lkXG5cdFx0XHRsaXN0X3ZpZXdfaWQgPSBTZXNzaW9uLmdldChcImxpc3Rfdmlld19pZFwiKVxuXHRpZiB0eXBlb2YobGlzdF92aWV3X2lkKSA9PSBcInN0cmluZ1wiXG5cdFx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdFx0aWYgIW9iamVjdFxuXHRcdFx0cmV0dXJuXG5cdFx0bGlzdFZpZXcgPSBfLmZpbmRXaGVyZShvYmplY3QubGlzdF92aWV3cyx7X2lkOiBsaXN0X3ZpZXdfaWR9KVxuXHRlbHNlXG5cdFx0bGlzdFZpZXcgPSBsaXN0X3ZpZXdfaWRcblx0cmV0dXJuIGxpc3RWaWV3Py5uYW1lID09IFwicmVjZW50XCJcblxuXG4jIyNcbiAgICDku45jb2x1bW5z5Y+C5pWw5Lit6L+H5ruk5Ye655So5LqO5omL5py656uv5pi+56S655qEY29sdW1uc1xuXHTop4TliJnvvJpcblx0MS7kvJjlhYjmiopjb2x1bW5z5Lit55qEbmFtZeWtl+auteaOkuWcqOesrOS4gOS4qlxuXHQyLuacgOWkmuWPqui/lOWbnjTkuKrlrZfmrrVcblx0My7ogIPomZHlrr3lrZfmrrXljaDnlKjmlbTooYzop4TliJnmnaHku7bkuIvvvIzmnIDlpJrlj6rov5Tlm57kuKTooYxcbiMjI1xuQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyA9IChvYmplY3RfbmFtZSwgY29sdW1ucyktPlxuXHRyZXN1bHQgPSBbXVxuXHRtYXhSb3dzID0gMiBcblx0bWF4Q291bnQgPSBtYXhSb3dzICogMlxuXHRjb3VudCA9IDBcblx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdGZpZWxkcyA9IG9iamVjdC5maWVsZHNcblx0dW5sZXNzIG9iamVjdFxuXHRcdHJldHVybiBjb2x1bW5zXG5cdG5hbWVLZXkgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVlcblx0aXNOYW1lQ29sdW1uID0gKGl0ZW0pLT5cblx0XHRpZiBfLmlzT2JqZWN0KGl0ZW0pXG5cdFx0XHRyZXR1cm4gaXRlbS5maWVsZCA9PSBuYW1lS2V5XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGl0ZW0gPT0gbmFtZUtleVxuXHRnZXRGaWVsZCA9IChpdGVtKS0+XG5cdFx0aWYgXy5pc09iamVjdChpdGVtKVxuXHRcdFx0cmV0dXJuIGZpZWxkc1tpdGVtLmZpZWxkXVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBmaWVsZHNbaXRlbV1cblx0aWYgbmFtZUtleVxuXHRcdG5hbWVDb2x1bW4gPSBjb2x1bW5zLmZpbmQgKGl0ZW0pLT5cblx0XHRcdHJldHVybiBpc05hbWVDb2x1bW4oaXRlbSlcblx0aWYgbmFtZUNvbHVtblxuXHRcdGZpZWxkID0gZ2V0RmllbGQobmFtZUNvbHVtbilcblx0XHRpdGVtQ291bnQgPSBpZiBmaWVsZC5pc193aWRlIHRoZW4gMiBlbHNlIDFcblx0XHRjb3VudCArPSBpdGVtQ291bnRcblx0XHRyZXN1bHQucHVzaCBuYW1lQ29sdW1uXG5cdGNvbHVtbnMuZm9yRWFjaCAoaXRlbSktPlxuXHRcdGZpZWxkID0gZ2V0RmllbGQoaXRlbSlcblx0XHR1bmxlc3MgZmllbGRcblx0XHRcdHJldHVyblxuXHRcdGl0ZW1Db3VudCA9IGlmIGZpZWxkLmlzX3dpZGUgdGhlbiAyIGVsc2UgMVxuXHRcdGlmIGNvdW50IDwgbWF4Q291bnQgYW5kIHJlc3VsdC5sZW5ndGggPCBtYXhDb3VudCBhbmQgIWlzTmFtZUNvbHVtbihpdGVtKVxuXHRcdFx0Y291bnQgKz0gaXRlbUNvdW50XG5cdFx0XHRpZiBjb3VudCA8PSBtYXhDb3VudFxuXHRcdFx0XHRyZXN1bHQucHVzaCBpdGVtXG5cdFxuXHRyZXR1cm4gcmVzdWx0XG5cbiMjI1xuICAgIOiOt+WPlum7mOiupOinhuWbvlxuIyMjXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3ID0gKG9iamVjdF9uYW1lKS0+XG5cdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRpZiAhb2JqZWN0XG5cdFx0b2JqZWN0ID0gQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXVxuXHRpZiBvYmplY3Q/Lmxpc3Rfdmlld3M/LmRlZmF1bHRcblx0XHQjVE9ETyDmraTku6PnoIHlj6rmmK/mmoLml7blhbzlrrnku6XliY1jb2Rl5Lit5a6a5LmJ55qEZGVmYXVsdOinhuWbvu+8jOW+hWNvZGXkuK3nmoRkZWZhdWx05riF55CG5a6M5oiQ5ZCO77yM6ZyA6KaB5Yig6Zmk5q2k5Luj56CBXG5cdFx0ZGVmYXVsdFZpZXcgPSBvYmplY3QubGlzdF92aWV3cy5kZWZhdWx0XG5cdGVsc2Vcblx0XHRfLmVhY2ggb2JqZWN0Py5saXN0X3ZpZXdzLCAobGlzdF92aWV3LCBrZXkpLT5cblx0XHRcdGlmIGxpc3Rfdmlldy5uYW1lID09IFwiYWxsXCIgfHwga2V5ID09IFwiYWxsXCJcblx0XHRcdFx0ZGVmYXVsdFZpZXcgPSBsaXN0X3ZpZXdcblx0cmV0dXJuIGRlZmF1bHRWaWV3O1xuXG4jIyNcbiAgICDojrflj5blr7nosaHnmoTliJfooajpu5jorqTmmL7npLrlrZfmrrVcbiMjI1xuQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0Q29sdW1ucyA9IChvYmplY3RfbmFtZSwgdXNlX21vYmlsZV9jb2x1bW5zKS0+XG5cdGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhvYmplY3RfbmFtZSlcblx0Y29sdW1ucyA9IGRlZmF1bHRWaWV3Py5jb2x1bW5zXG5cdGlmIHVzZV9tb2JpbGVfY29sdW1uc1xuXHRcdGlmIGRlZmF1bHRWaWV3Py5tb2JpbGVfY29sdW1uc1xuXHRcdFx0Y29sdW1ucyA9IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zXG5cdFx0ZWxzZSBpZiBjb2x1bW5zXG5cdFx0XHRjb2x1bW5zID0gQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyhvYmplY3RfbmFtZSwgY29sdW1ucylcblx0cmV0dXJuIGNvbHVtbnNcblxuIyMjXG4gICAg6I635Y+W5a+56LGh55qE5YiX6KGo56ys5LiA5Liq6KeG5Zu+5pi+56S655qE5a2X5q61XG4jIyNcbkNyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMgPSAob2JqZWN0X25hbWUsIHVzZV9tb2JpbGVfY29sdW1ucyktPlxuXHRkZWZhdWx0VmlldyA9IENyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0VmlldyhvYmplY3RfbmFtZSlcblx0Y29sdW1ucyA9IGRlZmF1bHRWaWV3Py5jb2x1bW5zXG5cdGlmIHVzZV9tb2JpbGVfY29sdW1uc1xuXHRcdGlmIGRlZmF1bHRWaWV3Py5tb2JpbGVfY29sdW1uc1xuXHRcdFx0Y29sdW1ucyA9IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zXG5cdFx0ZWxzZSBpZiBjb2x1bW5zXG5cdFx0XHRjb2x1bW5zID0gQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyhvYmplY3RfbmFtZSwgY29sdW1ucylcblx0cmV0dXJuIGNvbHVtbnNcblxuIyMjXG5cdOiOt+WPluWvueixoeeahOWIl+ihqOm7mOiupOmineWkluWKoOi9veeahOWtl+autVxuIyMjXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRFeHRyYUNvbHVtbnMgPSAob2JqZWN0X25hbWUpLT5cblx0ZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KG9iamVjdF9uYW1lKVxuXHRyZXR1cm4gZGVmYXVsdFZpZXc/LmV4dHJhX2NvbHVtbnNcblxuIyMjXG5cdOiOt+WPluWvueixoeeahOm7mOiupOaOkuW6j1xuIyMjXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRTb3J0ID0gKG9iamVjdF9uYW1lKS0+XG5cdGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhvYmplY3RfbmFtZSlcblx0aWYgZGVmYXVsdFZpZXdcblx0XHRpZiBkZWZhdWx0Vmlldy5zb3J0XG5cdFx0XHRyZXR1cm4gZGVmYXVsdFZpZXcuc29ydFxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBbW1wiY3JlYXRlZFwiLCBcImRlc2NcIl1dXG5cblxuIyMjXG4gICAg5Yik5pat5piv5ZCmQWxsIHZpZXdcbiMjI1xuQ3JlYXRvci5pc0FsbFZpZXcgPSAobGlzdF92aWV3KS0+XG5cdHJldHVybiBsaXN0X3ZpZXc/Lm5hbWUgPT0gXCJhbGxcIlxuXG4jIyNcbiAgICDliKTmlq3mmK/lkKbmnIDov5Hmn6XnnIsgdmlld1xuIyMjXG5DcmVhdG9yLmlzUmVjZW50VmlldyA9IChsaXN0X3ZpZXcpLT5cblx0cmV0dXJuIGxpc3Rfdmlldz8ubmFtZSA9PSBcInJlY2VudFwiXG5cbiMjI1xuICAgIOWwhnNvcnTovazmjaLkuLpUYWJ1bGFy5o6n5Lu25omA6ZyA6KaB55qE5qC85byPXG4jIyNcbkNyZWF0b3IudHJhbnNmb3JtU29ydFRvVGFidWxhciA9IChzb3J0LCB0YWJ1bGFyQ29sdW1ucyktPlxuXHR0YWJ1bGFyX3NvcnQgPSBbXVxuXHRfLmVhY2ggc29ydCwgKGl0ZW0pLT5cblx0XHRpZiBfLmlzQXJyYXkoaXRlbSlcblx0XHRcdCMg5YW85a655pen55qE5pWw5o2u5qC85byPW1tcImZpZWxkX25hbWVcIiwgXCJvcmRlclwiXV1cblx0XHRcdGlmIGl0ZW0ubGVuZ3RoID09IDFcblx0XHRcdFx0Y29sdW1uX2luZGV4ID0gdGFidWxhckNvbHVtbnMuaW5kZXhPZihpdGVtWzBdKVxuXHRcdFx0XHRpZiBjb2x1bW5faW5kZXggPiAtMVxuXHRcdFx0XHRcdHRhYnVsYXJfc29ydC5wdXNoIFtjb2x1bW5faW5kZXgsIFwiYXNjXCJdXG5cdFx0XHRlbHNlIGlmIGl0ZW0ubGVuZ3RoID09IDJcblx0XHRcdFx0Y29sdW1uX2luZGV4ID0gdGFidWxhckNvbHVtbnMuaW5kZXhPZihpdGVtWzBdKVxuXHRcdFx0XHRpZiBjb2x1bW5faW5kZXggPiAtMVxuXHRcdFx0XHRcdHRhYnVsYXJfc29ydC5wdXNoIFtjb2x1bW5faW5kZXgsIGl0ZW1bMV1dXG5cdFx0ZWxzZSBpZiBfLmlzT2JqZWN0KGl0ZW0pXG5cdFx0XHQj5paw5pWw5o2u5qC85byP77yaW3tmaWVsZF9uYW1lOiAsIG9yZGVyOiB9XVxuXHRcdFx0ZmllbGRfbmFtZSA9IGl0ZW0uZmllbGRfbmFtZVxuXHRcdFx0b3JkZXIgPSBpdGVtLm9yZGVyXG5cdFx0XHRpZiBmaWVsZF9uYW1lICYmIG9yZGVyXG5cdFx0XHRcdGNvbHVtbl9pbmRleCA9IHRhYnVsYXJDb2x1bW5zLmluZGV4T2YoZmllbGRfbmFtZSlcblx0XHRcdFx0aWYgY29sdW1uX2luZGV4ID4gLTFcblx0XHRcdFx0XHR0YWJ1bGFyX3NvcnQucHVzaCBbY29sdW1uX2luZGV4LCBvcmRlcl1cblxuXHRyZXR1cm4gdGFidWxhcl9zb3J0XG5cbiMjI1xuICAgIOWwhnNvcnTovazmjaLkuLpEZXZFeHByZXNz5o6n5Lu25omA6ZyA6KaB55qE5qC85byPXG4jIyNcbkNyZWF0b3IudHJhbnNmb3JtU29ydFRvRFggPSAoc29ydCktPlxuXHRkeF9zb3J0ID0gW11cblx0Xy5lYWNoIHNvcnQsIChpdGVtKS0+XG5cdFx0aWYgXy5pc0FycmF5KGl0ZW0pXG5cdFx0XHQj5YW85a655pen5qC85byP77yaW1tcImZpZWxkX25hbWVcIiwgXCJvcmRlclwiXV1cblx0XHRcdGR4X3NvcnQucHVzaChpdGVtKVxuXHRcdGVsc2UgaWYgXy5pc09iamVjdChpdGVtKVxuXHRcdFx0I+aWsOaVsOaNruagvOW8j++8mlt7ZmllbGRfbmFtZTogLCBvcmRlcjogfV1cblx0XHRcdGZpZWxkX25hbWUgPSBpdGVtLmZpZWxkX25hbWVcblx0XHRcdG9yZGVyID0gaXRlbS5vcmRlclxuXHRcdFx0aWYgZmllbGRfbmFtZSAmJiBvcmRlclxuXHRcdFx0XHRkeF9zb3J0LnB1c2ggW2ZpZWxkX25hbWUsIG9yZGVyXVxuXG5cdHJldHVybiBkeF9zb3J0XG4iLCJDcmVhdG9yLmdldEluaXRXaWR0aFBlcmNlbnQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgY29sdW1ucykge1xuICB2YXIgX3NjaGVtYSwgY29sdW1uX251bSwgaW5pdF93aWR0aF9wZXJjZW50LCByZWY7XG4gIF9zY2hlbWEgPSAocmVmID0gQ3JlYXRvci5nZXRTY2hlbWEob2JqZWN0X25hbWUpKSAhPSBudWxsID8gcmVmLl9zY2hlbWEgOiB2b2lkIDA7XG4gIGNvbHVtbl9udW0gPSAwO1xuICBpZiAoX3NjaGVtYSkge1xuICAgIF8uZWFjaChjb2x1bW5zLCBmdW5jdGlvbihmaWVsZF9uYW1lKSB7XG4gICAgICB2YXIgZmllbGQsIGlzX3dpZGUsIHJlZjEsIHJlZjI7XG4gICAgICBmaWVsZCA9IF8ucGljayhfc2NoZW1hLCBmaWVsZF9uYW1lKTtcbiAgICAgIGlzX3dpZGUgPSAocmVmMSA9IGZpZWxkW2ZpZWxkX25hbWVdKSAhPSBudWxsID8gKHJlZjIgPSByZWYxLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmMi5pc193aWRlIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgaWYgKGlzX3dpZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbl9udW0gKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5fbnVtICs9IDE7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5pdF93aWR0aF9wZXJjZW50ID0gMTAwIC8gY29sdW1uX251bTtcbiAgICByZXR1cm4gaW5pdF93aWR0aF9wZXJjZW50O1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkSXNXaWRlID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGZpZWxkX25hbWUpIHtcbiAgdmFyIF9zY2hlbWEsIGZpZWxkLCBpc193aWRlLCByZWYsIHJlZjE7XG4gIF9zY2hlbWEgPSBDcmVhdG9yLmdldFNjaGVtYShvYmplY3RfbmFtZSkuX3NjaGVtYTtcbiAgaWYgKF9zY2hlbWEpIHtcbiAgICBmaWVsZCA9IF8ucGljayhfc2NoZW1hLCBmaWVsZF9uYW1lKTtcbiAgICBpc193aWRlID0gKHJlZiA9IGZpZWxkW2ZpZWxkX25hbWVdKSAhPSBudWxsID8gKHJlZjEgPSByZWYuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYxLmlzX3dpZGUgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGlzX3dpZGU7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0VGFidWxhck9yZGVyID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgY29sdW1ucykge1xuICB2YXIgb2JqLCByZWYsIHJlZjEsIHJlZjIsIHNldHRpbmcsIHNvcnQ7XG4gIHNldHRpbmcgPSAocmVmID0gQ3JlYXRvci5Db2xsZWN0aW9ucykgIT0gbnVsbCA/IChyZWYxID0gcmVmLnNldHRpbmdzKSAhPSBudWxsID8gcmVmMS5maW5kT25lKHtcbiAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIlxuICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgb2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBjb2x1bW5zID0gXy5tYXAoY29sdW1ucywgZnVuY3Rpb24oY29sdW1uKSB7XG4gICAgdmFyIGZpZWxkO1xuICAgIGZpZWxkID0gb2JqLmZpZWxkc1tjb2x1bW5dO1xuICAgIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnR5cGUgOiB2b2lkIDApICYmICFmaWVsZC5oaWRkZW4pIHtcbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9KTtcbiAgY29sdW1ucyA9IF8uY29tcGFjdChjb2x1bW5zKTtcbiAgaWYgKHNldHRpbmcgJiYgc2V0dGluZy5zZXR0aW5ncykge1xuICAgIHNvcnQgPSAoKHJlZjIgPSBzZXR0aW5nLnNldHRpbmdzW2xpc3Rfdmlld19pZF0pICE9IG51bGwgPyByZWYyLnNvcnQgOiB2b2lkIDApIHx8IFtdO1xuICAgIHNvcnQgPSBfLm1hcChzb3J0LCBmdW5jdGlvbihvcmRlcikge1xuICAgICAgdmFyIGluZGV4LCBrZXk7XG4gICAgICBrZXkgPSBvcmRlclswXTtcbiAgICAgIGluZGV4ID0gXy5pbmRleE9mKGNvbHVtbnMsIGtleSk7XG4gICAgICBvcmRlclswXSA9IGluZGV4ICsgMTtcbiAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gc29ydDtcbiAgfVxuICByZXR1cm4gW107XG59O1xuXG5DcmVhdG9yLmluaXRMaXN0Vmlld3MgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgY29sdW1ucywgZGVmYXVsdF9leHRyYV9jb2x1bW5zLCBleHRyYV9jb2x1bW5zLCBvYmplY3QsIG9yZGVyLCByZWY7XG4gIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgY29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdENvbHVtbnMob2JqZWN0X25hbWUpIHx8IFtcIm5hbWVcIl07XG4gIGV4dHJhX2NvbHVtbnMgPSBbXCJvd25lclwiXTtcbiAgZGVmYXVsdF9leHRyYV9jb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0RXh0cmFDb2x1bW5zKG9iamVjdF9uYW1lKSB8fCBbXCJvd25lclwiXTtcbiAgaWYgKGRlZmF1bHRfZXh0cmFfY29sdW1ucykge1xuICAgIGV4dHJhX2NvbHVtbnMgPSBfLnVuaW9uKGV4dHJhX2NvbHVtbnMsIGRlZmF1bHRfZXh0cmFfY29sdW1ucyk7XG4gIH1cbiAgb3JkZXIgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRTb3J0KG9iamVjdF9uYW1lKSB8fCBbXTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHJldHVybiAocmVmID0gQ3JlYXRvci5UYWJ1bGFyU2VsZWN0ZWRJZHMpICE9IG51bGwgPyByZWZbb2JqZWN0X25hbWVdID0gW10gOiB2b2lkIDA7XG4gIH1cbn07XG5cbkNyZWF0b3IuY29udmVydExpc3RWaWV3ID0gZnVuY3Rpb24oZGVmYXVsdF92aWV3LCBsaXN0X3ZpZXcsIGxpc3Rfdmlld19uYW1lKSB7XG4gIHZhciBkZWZhdWx0X2NvbHVtbnMsIGRlZmF1bHRfbW9iaWxlX2NvbHVtbnMsIG9pdGVtO1xuICBkZWZhdWx0X2NvbHVtbnMgPSBkZWZhdWx0X3ZpZXcgIT0gbnVsbCA/IGRlZmF1bHRfdmlldy5jb2x1bW5zIDogdm9pZCAwO1xuICBkZWZhdWx0X21vYmlsZV9jb2x1bW5zID0gZGVmYXVsdF92aWV3ICE9IG51bGwgPyBkZWZhdWx0X3ZpZXcubW9iaWxlX2NvbHVtbnMgOiB2b2lkIDA7XG4gIGlmICghbGlzdF92aWV3KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG9pdGVtID0gXy5jbG9uZShsaXN0X3ZpZXcpO1xuICBpZiAoIV8uaGFzKG9pdGVtLCBcIm5hbWVcIikpIHtcbiAgICBvaXRlbS5uYW1lID0gbGlzdF92aWV3X25hbWU7XG4gIH1cbiAgaWYgKCFvaXRlbS5jb2x1bW5zKSB7XG4gICAgaWYgKGRlZmF1bHRfY29sdW1ucykge1xuICAgICAgb2l0ZW0uY29sdW1ucyA9IGRlZmF1bHRfY29sdW1ucztcbiAgICB9XG4gIH1cbiAgaWYgKCFvaXRlbS5jb2x1bW5zKSB7XG4gICAgb2l0ZW0uY29sdW1ucyA9IFtcIm5hbWVcIl07XG4gIH1cbiAgaWYgKCFvaXRlbS5tb2JpbGVfY29sdW1ucykge1xuICAgIGlmIChkZWZhdWx0X21vYmlsZV9jb2x1bW5zKSB7XG4gICAgICBvaXRlbS5tb2JpbGVfY29sdW1ucyA9IGRlZmF1bHRfbW9iaWxlX2NvbHVtbnM7XG4gICAgfVxuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZShTZXNzaW9uLmdldChcInNwYWNlSWRcIikpICYmICFfLmluY2x1ZGUob2l0ZW0uY29sdW1ucywgJ3NwYWNlJykpIHtcbiAgICAgIG9pdGVtLmNvbHVtbnMucHVzaCgnc3BhY2UnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvaXRlbS5maWx0ZXJfc2NvcGUpIHtcbiAgICBvaXRlbS5maWx0ZXJfc2NvcGUgPSBcInNwYWNlXCI7XG4gIH1cbiAgaWYgKCFfLmhhcyhvaXRlbSwgXCJfaWRcIikpIHtcbiAgICBvaXRlbS5faWQgPSBsaXN0X3ZpZXdfbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBvaXRlbS5sYWJlbCA9IG9pdGVtLmxhYmVsIHx8IGxpc3Rfdmlldy5uYW1lO1xuICB9XG4gIGlmIChfLmlzU3RyaW5nKG9pdGVtLm9wdGlvbnMpKSB7XG4gICAgb2l0ZW0ub3B0aW9ucyA9IEpTT04ucGFyc2Uob2l0ZW0ub3B0aW9ucyk7XG4gIH1cbiAgXy5mb3JFYWNoKG9pdGVtLmZpbHRlcnMsIGZ1bmN0aW9uKGZpbHRlciwgX2luZGV4KSB7XG4gICAgaWYgKCFfLmlzQXJyYXkoZmlsdGVyKSAmJiBfLmlzT2JqZWN0KGZpbHRlcikpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci52YWx1ZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm4gZmlsdGVyLl92YWx1ZSA9IGZpbHRlci52YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci5fdmFsdWUgOiB2b2lkIDApKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbHRlci52YWx1ZSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgZmlsdGVyLl92YWx1ZSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvaXRlbTtcbn07XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgQ3JlYXRvci5nZXRSZWxhdGVkTGlzdCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gICAgdmFyIF9vYmplY3QsIGxheW91dFJlbGF0ZWRMaXN0LCBsaXN0LCBtYXBMaXN0LCBvYmplY3RMYXlvdXRSZWxhdGVkTGlzdE9iamVjdHMsIHBlcm1pc3Npb25zLCByZWxhdGVkTGlzdCwgcmVsYXRlZExpc3ROYW1lcywgcmVsYXRlZExpc3RPYmplY3RzLCByZWxhdGVkX29iamVjdF9uYW1lcywgcmVsYXRlZF9vYmplY3RzLCBzcGFjZUlkLCB1bnJlbGF0ZWRfb2JqZWN0cywgdXNlcklkO1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVsYXRlZExpc3RPYmplY3RzID0ge307XG4gICAgcmVsYXRlZExpc3ROYW1lcyA9IFtdO1xuICAgIG9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cyA9IFtdO1xuICAgIF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgaWYgKF9vYmplY3QpIHtcbiAgICAgIGxheW91dFJlbGF0ZWRMaXN0ID0gX29iamVjdC5yZWxhdGVkX2xpc3RzO1xuICAgICAgaWYgKF8uaXNBcnJheShsYXlvdXRSZWxhdGVkTGlzdCkpIHtcbiAgICAgICAgXy5lYWNoKGxheW91dFJlbGF0ZWRMaXN0LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgdmFyIHJlRmllbGROYW1lLCByZU9iamVjdE5hbWUsIHJlZiwgcmVmMSwgcmVsYXRlZCwgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ7XG4gICAgICAgICAgcmVPYmplY3ROYW1lID0gaXRlbS5yZWxhdGVkX2ZpZWxkX2Z1bGxuYW1lLnNwbGl0KCcuJylbMF07XG4gICAgICAgICAgcmVGaWVsZE5hbWUgPSBpdGVtLnJlbGF0ZWRfZmllbGRfZnVsbG5hbWUuc3BsaXQoJy4nKVsxXTtcbiAgICAgICAgICB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9IChyZWYgPSBDcmVhdG9yLmdldE9iamVjdChyZU9iamVjdE5hbWUpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZmllbGRzW3JlRmllbGROYW1lXSkgIT0gbnVsbCA/IHJlZjEud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgICAgcmVsYXRlZCA9IHtcbiAgICAgICAgICAgIG9iamVjdF9uYW1lOiByZU9iamVjdE5hbWUsXG4gICAgICAgICAgICBjb2x1bW5zOiBpdGVtLmZpZWxkX25hbWVzLFxuICAgICAgICAgICAgbW9iaWxlX2NvbHVtbnM6IGl0ZW0uZmllbGRfbmFtZXMsXG4gICAgICAgICAgICBpc19maWxlOiByZU9iamVjdE5hbWUgPT09IFwiY21zX2ZpbGVzXCIsXG4gICAgICAgICAgICBmaWx0ZXJzRnVuY3Rpb246IGl0ZW0uZmlsdGVycyxcbiAgICAgICAgICAgIHNvcnQ6IGl0ZW0uc29ydCxcbiAgICAgICAgICAgIHJlbGF0ZWRfZmllbGRfbmFtZTogcmVGaWVsZE5hbWUsXG4gICAgICAgICAgICBjdXN0b21SZWxhdGVkTGlzdE9iamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCxcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgYWN0aW9uczogaXRlbS5idXR0b25zLFxuICAgICAgICAgICAgdmlzaWJsZV9vbjogaXRlbS52aXNpYmxlX29uLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBpdGVtLnBhZ2Vfc2l6ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIG9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cy5wdXNoKHJlbGF0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cztcbiAgICAgIH1cbiAgICAgIHJlbGF0ZWRMaXN0ID0gX29iamVjdC5yZWxhdGVkTGlzdDtcbiAgICAgIGlmICghXy5pc0VtcHR5KHJlbGF0ZWRMaXN0KSkge1xuICAgICAgICBfLmVhY2gocmVsYXRlZExpc3QsIGZ1bmN0aW9uKG9iak9yTmFtZSkge1xuICAgICAgICAgIHZhciByZWxhdGVkO1xuICAgICAgICAgIGlmIChfLmlzT2JqZWN0KG9iak9yTmFtZSkpIHtcbiAgICAgICAgICAgIHJlbGF0ZWQgPSB7XG4gICAgICAgICAgICAgIG9iamVjdF9uYW1lOiBvYmpPck5hbWUub2JqZWN0TmFtZSxcbiAgICAgICAgICAgICAgY29sdW1uczogb2JqT3JOYW1lLmNvbHVtbnMsXG4gICAgICAgICAgICAgIG1vYmlsZV9jb2x1bW5zOiBvYmpPck5hbWUubW9iaWxlX2NvbHVtbnMsXG4gICAgICAgICAgICAgIGlzX2ZpbGU6IG9iak9yTmFtZS5vYmplY3ROYW1lID09PSBcImNtc19maWxlc1wiLFxuICAgICAgICAgICAgICBmaWx0ZXJzRnVuY3Rpb246IG9iak9yTmFtZS5maWx0ZXJzLFxuICAgICAgICAgICAgICBzb3J0OiBvYmpPck5hbWUuc29ydCxcbiAgICAgICAgICAgICAgcmVsYXRlZF9maWVsZF9uYW1lOiAnJyxcbiAgICAgICAgICAgICAgY3VzdG9tUmVsYXRlZExpc3RPYmplY3Q6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiBvYmpPck5hbWUubGFiZWwsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IG9iak9yTmFtZS5hY3Rpb25zLFxuICAgICAgICAgICAgICBwYWdlX3NpemU6IG9iak9yTmFtZS5wYWdlX3NpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWxhdGVkTGlzdE9iamVjdHNbb2JqT3JOYW1lLm9iamVjdE5hbWVdID0gcmVsYXRlZDtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGVkTGlzdE5hbWVzLnB1c2gob2JqT3JOYW1lLm9iamVjdE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhvYmpPck5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRlZExpc3ROYW1lcy5wdXNoKG9iak9yTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFwTGlzdCA9IHt9O1xuICAgIHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMob2JqZWN0X25hbWUpO1xuICAgIF8uZWFjaChyZWxhdGVkX29iamVjdHMsIGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0X2l0ZW0pIHtcbiAgICAgIHZhciBjb2x1bW5zLCBtb2JpbGVfY29sdW1ucywgb3JkZXIsIHJlbGF0ZWQsIHJlbGF0ZWRPYmplY3QsIHJlbGF0ZWRfZmllbGRfbmFtZSwgcmVsYXRlZF9vYmplY3QsIHJlbGF0ZWRfb2JqZWN0X25hbWUsIHRhYnVsYXJfb3JkZXIsIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkO1xuICAgICAgaWYgKCEocmVsYXRlZF9vYmplY3RfaXRlbSAhPSBudWxsID8gcmVsYXRlZF9vYmplY3RfaXRlbS5vYmplY3RfbmFtZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVsYXRlZF9vYmplY3RfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0X2l0ZW0ub2JqZWN0X25hbWU7XG4gICAgICByZWxhdGVkX2ZpZWxkX25hbWUgPSByZWxhdGVkX29iamVjdF9pdGVtLmZvcmVpZ25fa2V5O1xuICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPSByZWxhdGVkX29iamVjdF9pdGVtLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkO1xuICAgICAgcmVsYXRlZF9vYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZWxhdGVkX29iamVjdF9uYW1lKTtcbiAgICAgIGlmICghcmVsYXRlZF9vYmplY3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29sdW1ucyA9IENyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMocmVsYXRlZF9vYmplY3RfbmFtZSkgfHwgW1wibmFtZVwiXTtcbiAgICAgIGNvbHVtbnMgPSBfLndpdGhvdXQoY29sdW1ucywgcmVsYXRlZF9maWVsZF9uYW1lKTtcbiAgICAgIG1vYmlsZV9jb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3Q29sdW1ucyhyZWxhdGVkX29iamVjdF9uYW1lLCB0cnVlKSB8fCBbXCJuYW1lXCJdO1xuICAgICAgbW9iaWxlX2NvbHVtbnMgPSBfLndpdGhvdXQobW9iaWxlX2NvbHVtbnMsIHJlbGF0ZWRfZmllbGRfbmFtZSk7XG4gICAgICBvcmRlciA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQocmVsYXRlZF9vYmplY3RfbmFtZSk7XG4gICAgICB0YWJ1bGFyX29yZGVyID0gQ3JlYXRvci50cmFuc2Zvcm1Tb3J0VG9UYWJ1bGFyKG9yZGVyLCBjb2x1bW5zKTtcbiAgICAgIGlmICgvXFx3K1xcLlxcJFxcLlxcdysvZy50ZXN0KHJlbGF0ZWRfZmllbGRfbmFtZSkpIHtcbiAgICAgICAgcmVsYXRlZF9maWVsZF9uYW1lID0gcmVsYXRlZF9maWVsZF9uYW1lLnJlcGxhY2UoL1xcJFxcLi8sIFwiXCIpO1xuICAgICAgfVxuICAgICAgcmVsYXRlZCA9IHtcbiAgICAgICAgb2JqZWN0X25hbWU6IHJlbGF0ZWRfb2JqZWN0X25hbWUsXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIG1vYmlsZV9jb2x1bW5zOiBtb2JpbGVfY29sdW1ucyxcbiAgICAgICAgcmVsYXRlZF9maWVsZF9uYW1lOiByZWxhdGVkX2ZpZWxkX25hbWUsXG4gICAgICAgIGlzX2ZpbGU6IHJlbGF0ZWRfb2JqZWN0X25hbWUgPT09IFwiY21zX2ZpbGVzXCIsXG4gICAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZFxuICAgICAgfTtcbiAgICAgIHJlbGF0ZWRPYmplY3QgPSByZWxhdGVkTGlzdE9iamVjdHNbcmVsYXRlZF9vYmplY3RfbmFtZV07XG4gICAgICBpZiAocmVsYXRlZE9iamVjdCkge1xuICAgICAgICBpZiAocmVsYXRlZE9iamVjdC5jb2x1bW5zKSB7XG4gICAgICAgICAgcmVsYXRlZC5jb2x1bW5zID0gcmVsYXRlZE9iamVjdC5jb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0Lm1vYmlsZV9jb2x1bW5zKSB7XG4gICAgICAgICAgcmVsYXRlZC5tb2JpbGVfY29sdW1ucyA9IHJlbGF0ZWRPYmplY3QubW9iaWxlX2NvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3Quc29ydCkge1xuICAgICAgICAgIHJlbGF0ZWQuc29ydCA9IHJlbGF0ZWRPYmplY3Quc29ydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRlZE9iamVjdC5maWx0ZXJzRnVuY3Rpb24pIHtcbiAgICAgICAgICByZWxhdGVkLmZpbHRlcnNGdW5jdGlvbiA9IHJlbGF0ZWRPYmplY3QuZmlsdGVyc0Z1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0LmN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0KSB7XG4gICAgICAgICAgcmVsYXRlZC5jdXN0b21SZWxhdGVkTGlzdE9iamVjdCA9IHJlbGF0ZWRPYmplY3QuY3VzdG9tUmVsYXRlZExpc3RPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3QubGFiZWwpIHtcbiAgICAgICAgICByZWxhdGVkLmxhYmVsID0gcmVsYXRlZE9iamVjdC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRlZE9iamVjdC5wYWdlX3NpemUpIHtcbiAgICAgICAgICByZWxhdGVkLnBhZ2Vfc2l6ZSA9IHJlbGF0ZWRPYmplY3QucGFnZV9zaXplO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSByZWxhdGVkTGlzdE9iamVjdHNbcmVsYXRlZF9vYmplY3RfbmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwTGlzdFtyZWxhdGVkLm9iamVjdF9uYW1lXSA9IHJlbGF0ZWQ7XG4gICAgfSk7XG4gICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgcmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLnBsdWNrKF8udmFsdWVzKHJlbGF0ZWRMaXN0T2JqZWN0cyksIFwib2JqZWN0X25hbWVcIik7XG4gICAgcGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpO1xuICAgIHVucmVsYXRlZF9vYmplY3RzID0gcGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHM7XG4gICAgcmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLmRpZmZlcmVuY2UocmVsYXRlZF9vYmplY3RfbmFtZXMsIHVucmVsYXRlZF9vYmplY3RzKTtcbiAgICBfLmVhY2gocmVsYXRlZExpc3RPYmplY3RzLCBmdW5jdGlvbih2LCByZWxhdGVkX29iamVjdF9uYW1lKSB7XG4gICAgICB2YXIgYWxsb3dSZWFkLCBpc0FjdGl2ZSwgcmVmO1xuICAgICAgaXNBY3RpdmUgPSByZWxhdGVkX29iamVjdF9uYW1lcy5pbmRleE9mKHJlbGF0ZWRfb2JqZWN0X25hbWUpID4gLTE7XG4gICAgICBhbGxvd1JlYWQgPSAocmVmID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkX29iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpKSAhPSBudWxsID8gcmVmLmFsbG93UmVhZCA6IHZvaWQgMDtcbiAgICAgIGlmIChpc0FjdGl2ZSAmJiBhbGxvd1JlYWQpIHtcbiAgICAgICAgcmV0dXJuIG1hcExpc3RbcmVsYXRlZF9vYmplY3RfbmFtZV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxpc3QgPSBbXTtcbiAgICBpZiAoXy5pc0VtcHR5KHJlbGF0ZWRMaXN0TmFtZXMpKSB7XG4gICAgICBsaXN0ID0gXy52YWx1ZXMobWFwTGlzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF8uZWFjaChyZWxhdGVkTGlzdE5hbWVzLCBmdW5jdGlvbihvYmplY3ROYW1lKSB7XG4gICAgICAgIGlmIChtYXBMaXN0W29iamVjdE5hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIGxpc3QucHVzaChtYXBMaXN0W29iamVjdE5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChfLmhhcyhfb2JqZWN0LCAnYWxsb3dfcmVsYXRlZExpc3QnKSkge1xuICAgICAgbGlzdCA9IF8uZmlsdGVyKGxpc3QsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIF8uaW5jbHVkZShfb2JqZWN0LmFsbG93X3JlbGF0ZWRMaXN0LCBpdGVtLm9iamVjdF9uYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfTtcbn1cblxuQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgcmV0dXJuIF8uZmlyc3QoQ3JlYXRvci5nZXRMaXN0Vmlld3Mob2JqZWN0X25hbWUpKTtcbn07XG5cblxuLyogXG5cdOWPluWHumxpc3Rfdmlld19pZOWvueW6lOeahOinhuWbvu+8jOWmguaenOS4jeWtmOWcqOaIluiAheayoeacieadg+mZkO+8jOWwsei/lOWbnuesrOS4gOS4quinhuWbvlxuXHRleGFj5Li6dHJ1ZeaXtu+8jOmcgOimgeW8uuWItuaMiWxpc3Rfdmlld19pZOeyvuehruafpeaJvu+8jOS4jem7mOiupOi/lOWbnuesrOS4gOS4quinhuWbvlxuICovXG5cbkNyZWF0b3IuZ2V0TGlzdFZpZXcgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBleGFjKSB7XG4gIHZhciBsaXN0Vmlld3MsIGxpc3Rfdmlldywgb2JqZWN0O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICAgIH1cbiAgICBpZiAoIWxpc3Rfdmlld19pZCkge1xuICAgICAgbGlzdF92aWV3X2lkID0gU2Vzc2lvbi5nZXQoXCJsaXN0X3ZpZXdfaWRcIik7XG4gICAgfVxuICB9XG4gIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGlzdFZpZXdzID0gQ3JlYXRvci5nZXRMaXN0Vmlld3Mob2JqZWN0X25hbWUpO1xuICBpZiAoIShsaXN0Vmlld3MgIT0gbnVsbCA/IGxpc3RWaWV3cy5sZW5ndGggOiB2b2lkIDApKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpc3RfdmlldyA9IF8uZmluZChsaXN0Vmlld3MsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5faWQgPT09IGxpc3Rfdmlld19pZCB8fCBpdGVtLm5hbWUgPT09IGxpc3Rfdmlld19pZDtcbiAgfSk7XG4gIGlmICghbGlzdF92aWV3KSB7XG4gICAgaWYgKGV4YWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdF92aWV3ID0gbGlzdFZpZXdzWzBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGlzdF92aWV3O1xufTtcblxuQ3JlYXRvci5nZXRMaXN0Vmlld0lzUmVjZW50ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCkge1xuICB2YXIgbGlzdFZpZXcsIG9iamVjdDtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gICAgaWYgKCFsaXN0X3ZpZXdfaWQpIHtcbiAgICAgIGxpc3Rfdmlld19pZCA9IFNlc3Npb24uZ2V0KFwibGlzdF92aWV3X2lkXCIpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIGxpc3Rfdmlld19pZCA9PT0gXCJzdHJpbmdcIikge1xuICAgIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsaXN0VmlldyA9IF8uZmluZFdoZXJlKG9iamVjdC5saXN0X3ZpZXdzLCB7XG4gICAgICBfaWQ6IGxpc3Rfdmlld19pZFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGxpc3RWaWV3ID0gbGlzdF92aWV3X2lkO1xuICB9XG4gIHJldHVybiAobGlzdFZpZXcgIT0gbnVsbCA/IGxpc3RWaWV3Lm5hbWUgOiB2b2lkIDApID09PSBcInJlY2VudFwiO1xufTtcblxuXG4vKlxuICAgIOS7jmNvbHVtbnPlj4LmlbDkuK3ov4fmu6Tlh7rnlKjkuo7miYvmnLrnq6/mmL7npLrnmoRjb2x1bW5zXG5cdOinhOWIme+8mlxuXHQxLuS8mOWFiOaKimNvbHVtbnPkuK3nmoRuYW1l5a2X5q615o6S5Zyo56ys5LiA5LiqXG5cdDIu5pyA5aSa5Y+q6L+U5ZueNOS4quWtl+autVxuXHQzLuiAg+iZkeWuveWtl+auteWNoOeUqOaVtOihjOinhOWImeadoeS7tuS4i++8jOacgOWkmuWPqui/lOWbnuS4pOihjFxuICovXG5cbkNyZWF0b3IucGlja09iamVjdE1vYmlsZUNvbHVtbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgY29sdW1ucykge1xuICB2YXIgY291bnQsIGZpZWxkLCBmaWVsZHMsIGdldEZpZWxkLCBpc05hbWVDb2x1bW4sIGl0ZW1Db3VudCwgbWF4Q291bnQsIG1heFJvd3MsIG5hbWVDb2x1bW4sIG5hbWVLZXksIG9iamVjdCwgcmVzdWx0O1xuICByZXN1bHQgPSBbXTtcbiAgbWF4Um93cyA9IDI7XG4gIG1heENvdW50ID0gbWF4Um93cyAqIDI7XG4gIGNvdW50ID0gMDtcbiAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBmaWVsZHMgPSBvYmplY3QuZmllbGRzO1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG4gIG5hbWVLZXkgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVk7XG4gIGlzTmFtZUNvbHVtbiA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICBpZiAoXy5pc09iamVjdChpdGVtKSkge1xuICAgICAgcmV0dXJuIGl0ZW0uZmllbGQgPT09IG5hbWVLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpdGVtID09PSBuYW1lS2V5O1xuICAgIH1cbiAgfTtcbiAgZ2V0RmllbGQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgaWYgKF8uaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIHJldHVybiBmaWVsZHNbaXRlbS5maWVsZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaWVsZHNbaXRlbV07XG4gICAgfVxuICB9O1xuICBpZiAobmFtZUtleSkge1xuICAgIG5hbWVDb2x1bW4gPSBjb2x1bW5zLmZpbmQoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgcmV0dXJuIGlzTmFtZUNvbHVtbihpdGVtKTtcbiAgICB9KTtcbiAgfVxuICBpZiAobmFtZUNvbHVtbikge1xuICAgIGZpZWxkID0gZ2V0RmllbGQobmFtZUNvbHVtbik7XG4gICAgaXRlbUNvdW50ID0gZmllbGQuaXNfd2lkZSA/IDIgOiAxO1xuICAgIGNvdW50ICs9IGl0ZW1Db3VudDtcbiAgICByZXN1bHQucHVzaChuYW1lQ29sdW1uKTtcbiAgfVxuICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIGZpZWxkID0gZ2V0RmllbGQoaXRlbSk7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtQ291bnQgPSBmaWVsZC5pc193aWRlID8gMiA6IDE7XG4gICAgaWYgKGNvdW50IDwgbWF4Q291bnQgJiYgcmVzdWx0Lmxlbmd0aCA8IG1heENvdW50ICYmICFpc05hbWVDb2x1bW4oaXRlbSkpIHtcbiAgICAgIGNvdW50ICs9IGl0ZW1Db3VudDtcbiAgICAgIGlmIChjb3VudCA8PSBtYXhDb3VudCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLypcbiAgICDojrflj5bpu5jorqTop4blm75cbiAqL1xuXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgdmFyIGRlZmF1bHRWaWV3LCBvYmplY3QsIHJlZjtcbiAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBpZiAoIW9iamVjdCkge1xuICAgIG9iamVjdCA9IENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV07XG4gIH1cbiAgaWYgKG9iamVjdCAhPSBudWxsID8gKHJlZiA9IG9iamVjdC5saXN0X3ZpZXdzKSAhPSBudWxsID8gcmVmW1wiZGVmYXVsdFwiXSA6IHZvaWQgMCA6IHZvaWQgMCkge1xuICAgIGRlZmF1bHRWaWV3ID0gb2JqZWN0Lmxpc3Rfdmlld3NbXCJkZWZhdWx0XCJdO1xuICB9IGVsc2Uge1xuICAgIF8uZWFjaChvYmplY3QgIT0gbnVsbCA/IG9iamVjdC5saXN0X3ZpZXdzIDogdm9pZCAwLCBmdW5jdGlvbihsaXN0X3ZpZXcsIGtleSkge1xuICAgICAgaWYgKGxpc3Rfdmlldy5uYW1lID09PSBcImFsbFwiIHx8IGtleSA9PT0gXCJhbGxcIikge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZpZXcgPSBsaXN0X3ZpZXc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWaWV3O1xufTtcblxuXG4vKlxuICAgIOiOt+WPluWvueixoeeahOWIl+ihqOm7mOiupOaYvuekuuWtl+autVxuICovXG5cbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdENvbHVtbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgdXNlX21vYmlsZV9jb2x1bW5zKSB7XG4gIHZhciBjb2x1bW5zLCBkZWZhdWx0VmlldztcbiAgZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KG9iamVjdF9uYW1lKTtcbiAgY29sdW1ucyA9IGRlZmF1bHRWaWV3ICE9IG51bGwgPyBkZWZhdWx0Vmlldy5jb2x1bW5zIDogdm9pZCAwO1xuICBpZiAodXNlX21vYmlsZV9jb2x1bW5zKSB7XG4gICAgaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwgPyBkZWZhdWx0Vmlldy5tb2JpbGVfY29sdW1ucyA6IHZvaWQgMCkge1xuICAgICAgY29sdW1ucyA9IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zO1xuICAgIH0gZWxzZSBpZiAoY29sdW1ucykge1xuICAgICAgY29sdW1ucyA9IENyZWF0b3IucGlja09iamVjdE1vYmlsZUNvbHVtbnMob2JqZWN0X25hbWUsIGNvbHVtbnMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sdW1ucztcbn07XG5cblxuLypcbiAgICDojrflj5blr7nosaHnmoTliJfooajnrKzkuIDkuKrop4blm77mmL7npLrnmoTlrZfmrrVcbiAqL1xuXG5DcmVhdG9yLmdldE9iamVjdEZpcnN0TGlzdFZpZXdDb2x1bW5zID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHVzZV9tb2JpbGVfY29sdW1ucykge1xuICB2YXIgY29sdW1ucywgZGVmYXVsdFZpZXc7XG4gIGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3KG9iamVjdF9uYW1lKTtcbiAgY29sdW1ucyA9IGRlZmF1bHRWaWV3ICE9IG51bGwgPyBkZWZhdWx0Vmlldy5jb2x1bW5zIDogdm9pZCAwO1xuICBpZiAodXNlX21vYmlsZV9jb2x1bW5zKSB7XG4gICAgaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwgPyBkZWZhdWx0Vmlldy5tb2JpbGVfY29sdW1ucyA6IHZvaWQgMCkge1xuICAgICAgY29sdW1ucyA9IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zO1xuICAgIH0gZWxzZSBpZiAoY29sdW1ucykge1xuICAgICAgY29sdW1ucyA9IENyZWF0b3IucGlja09iamVjdE1vYmlsZUNvbHVtbnMob2JqZWN0X25hbWUsIGNvbHVtbnMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sdW1ucztcbn07XG5cblxuLypcblx06I635Y+W5a+56LGh55qE5YiX6KGo6buY6K6k6aKd5aSW5Yqg6L2955qE5a2X5q61XG4gKi9cblxuQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0RXh0cmFDb2x1bW5zID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgdmFyIGRlZmF1bHRWaWV3O1xuICBkZWZhdWx0VmlldyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcob2JqZWN0X25hbWUpO1xuICByZXR1cm4gZGVmYXVsdFZpZXcgIT0gbnVsbCA/IGRlZmF1bHRWaWV3LmV4dHJhX2NvbHVtbnMgOiB2b2lkIDA7XG59O1xuXG5cbi8qXG5cdOiOt+WPluWvueixoeeahOm7mOiupOaOkuW6j1xuICovXG5cbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgZGVmYXVsdFZpZXc7XG4gIGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhvYmplY3RfbmFtZSk7XG4gIGlmIChkZWZhdWx0Vmlldykge1xuICAgIGlmIChkZWZhdWx0Vmlldy5zb3J0KSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXcuc29ydDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtbXCJjcmVhdGVkXCIsIFwiZGVzY1wiXV07XG4gICAgfVxuICB9XG59O1xuXG5cbi8qXG4gICAg5Yik5pat5piv5ZCmQWxsIHZpZXdcbiAqL1xuXG5DcmVhdG9yLmlzQWxsVmlldyA9IGZ1bmN0aW9uKGxpc3Rfdmlldykge1xuICByZXR1cm4gKGxpc3RfdmlldyAhPSBudWxsID8gbGlzdF92aWV3Lm5hbWUgOiB2b2lkIDApID09PSBcImFsbFwiO1xufTtcblxuXG4vKlxuICAgIOWIpOaWreaYr+WQpuacgOi/keafpeeciyB2aWV3XG4gKi9cblxuQ3JlYXRvci5pc1JlY2VudFZpZXcgPSBmdW5jdGlvbihsaXN0X3ZpZXcpIHtcbiAgcmV0dXJuIChsaXN0X3ZpZXcgIT0gbnVsbCA/IGxpc3Rfdmlldy5uYW1lIDogdm9pZCAwKSA9PT0gXCJyZWNlbnRcIjtcbn07XG5cblxuLypcbiAgICDlsIZzb3J06L2s5o2i5Li6VGFidWxhcuaOp+S7tuaJgOmcgOimgeeahOagvOW8j1xuICovXG5cbkNyZWF0b3IudHJhbnNmb3JtU29ydFRvVGFidWxhciA9IGZ1bmN0aW9uKHNvcnQsIHRhYnVsYXJDb2x1bW5zKSB7XG4gIHZhciB0YWJ1bGFyX3NvcnQ7XG4gIHRhYnVsYXJfc29ydCA9IFtdO1xuICBfLmVhY2goc29ydCwgZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBjb2x1bW5faW5kZXgsIGZpZWxkX25hbWUsIG9yZGVyO1xuICAgIGlmIChfLmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb2x1bW5faW5kZXggPSB0YWJ1bGFyQ29sdW1ucy5pbmRleE9mKGl0ZW1bMF0pO1xuICAgICAgICBpZiAoY29sdW1uX2luZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdGFidWxhcl9zb3J0LnB1c2goW2NvbHVtbl9pbmRleCwgXCJhc2NcIl0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbHVtbl9pbmRleCA9IHRhYnVsYXJDb2x1bW5zLmluZGV4T2YoaXRlbVswXSk7XG4gICAgICAgIGlmIChjb2x1bW5faW5kZXggPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0YWJ1bGFyX3NvcnQucHVzaChbY29sdW1uX2luZGV4LCBpdGVtWzFdXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgIGZpZWxkX25hbWUgPSBpdGVtLmZpZWxkX25hbWU7XG4gICAgICBvcmRlciA9IGl0ZW0ub3JkZXI7XG4gICAgICBpZiAoZmllbGRfbmFtZSAmJiBvcmRlcikge1xuICAgICAgICBjb2x1bW5faW5kZXggPSB0YWJ1bGFyQ29sdW1ucy5pbmRleE9mKGZpZWxkX25hbWUpO1xuICAgICAgICBpZiAoY29sdW1uX2luZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdGFidWxhcl9zb3J0LnB1c2goW2NvbHVtbl9pbmRleCwgb3JkZXJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0YWJ1bGFyX3NvcnQ7XG59O1xuXG5cbi8qXG4gICAg5bCGc29ydOi9rOaNouS4ukRldkV4cHJlc3Pmjqfku7bmiYDpnIDopoHnmoTmoLzlvI9cbiAqL1xuXG5DcmVhdG9yLnRyYW5zZm9ybVNvcnRUb0RYID0gZnVuY3Rpb24oc29ydCkge1xuICB2YXIgZHhfc29ydDtcbiAgZHhfc29ydCA9IFtdO1xuICBfLmVhY2goc29ydCwgZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBmaWVsZF9uYW1lLCBvcmRlcjtcbiAgICBpZiAoXy5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICByZXR1cm4gZHhfc29ydC5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChpdGVtKSkge1xuICAgICAgZmllbGRfbmFtZSA9IGl0ZW0uZmllbGRfbmFtZTtcbiAgICAgIG9yZGVyID0gaXRlbS5vcmRlcjtcbiAgICAgIGlmIChmaWVsZF9uYW1lICYmIG9yZGVyKSB7XG4gICAgICAgIHJldHVybiBkeF9zb3J0LnB1c2goW2ZpZWxkX25hbWUsIG9yZGVyXSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGR4X3NvcnQ7XG59O1xuIiwiU2ltcGxlU2NoZW1hLlJlZ0V4LmNvZGUgPSBuZXcgUmVnRXhwKCdeW2EtekEtWl9dW2EtekEtWjAtOV9dKiQnKVxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0TWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRcdF9yZWdFeE1lc3NhZ2VzID0gU2ltcGxlU2NoZW1hLl9nbG9iYWxNZXNzYWdlcy5yZWdFeCB8fCBbXVxuXHRcdF9yZWdFeE1lc3NhZ2VzLnB1c2gge2V4cDogU2ltcGxlU2NoZW1hLlJlZ0V4LmNvZGUsIG1zZzogXCJbbGFiZWxdIOWPquiDveS7peWtl+avjeOAgV/lvIDlpLTvvIzkuJTlj6rog73ljIXlkKvlrZfmr43jgIHmlbDlrZfjgIFfXCJ9XG5cdFx0U2ltcGxlU2NoZW1hLm1lc3NhZ2VzKHtcblx0XHRcdHJlZ0V4OiBfcmVnRXhNZXNzYWdlcyxcblx0XHR9KSIsIlNpbXBsZVNjaGVtYS5SZWdFeC5jb2RlID0gbmV3IFJlZ0V4cCgnXlthLXpBLVpfXVthLXpBLVowLTlfXSokJyk7XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9yZWdFeE1lc3NhZ2VzO1xuICAgIF9yZWdFeE1lc3NhZ2VzID0gU2ltcGxlU2NoZW1hLl9nbG9iYWxNZXNzYWdlcy5yZWdFeCB8fCBbXTtcbiAgICBfcmVnRXhNZXNzYWdlcy5wdXNoKHtcbiAgICAgIGV4cDogU2ltcGxlU2NoZW1hLlJlZ0V4LmNvZGUsXG4gICAgICBtc2c6IFwiW2xhYmVsXSDlj6rog73ku6XlrZfmr43jgIFf5byA5aS077yM5LiU5Y+q6IO95YyF5ZCr5a2X5q+N44CB5pWw5a2X44CBX1wiXG4gICAgfSk7XG4gICAgcmV0dXJuIFNpbXBsZVNjaGVtYS5tZXNzYWdlcyh7XG4gICAgICByZWdFeDogX3JlZ0V4TWVzc2FnZXNcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJTaW1wbGVTY2hlbWEuUmVnRXguZmllbGQgPSBuZXcgUmVnRXhwKCdeW2EtekEtWl9dXFxcXHcqKFxcXFwuXFxcXCRcXFxcLlxcXFx3Kyk/W2EtekEtWjAtOV0qJCcpXG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXHRNZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFx0X3JlZ0V4TWVzc2FnZXMgPSBTaW1wbGVTY2hlbWEuX2dsb2JhbE1lc3NhZ2VzLnJlZ0V4IHx8IFtdXG5cdFx0X3JlZ0V4TWVzc2FnZXMucHVzaCB7ZXhwOiBTaW1wbGVTY2hlbWEuUmVnRXguZmllbGQsIG1zZzogXCJbbGFiZWxdIOWPquiDveS7peWtl+avjeOAgV/lvIDlpLTvvIwuJC7liY3lkI7lv4XpobvljIXlkKvlrZfnrKZcIn1cblx0XHRTaW1wbGVTY2hlbWEubWVzc2FnZXMoe1xuXHRcdFx0cmVnRXg6IF9yZWdFeE1lc3NhZ2VzLFxuXHRcdH0pIiwiU2ltcGxlU2NoZW1hLlJlZ0V4LmZpZWxkID0gbmV3IFJlZ0V4cCgnXlthLXpBLVpfXVxcXFx3KihcXFxcLlxcXFwkXFxcXC5cXFxcdyspP1thLXpBLVowLTldKiQnKTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZ0V4TWVzc2FnZXM7XG4gICAgX3JlZ0V4TWVzc2FnZXMgPSBTaW1wbGVTY2hlbWEuX2dsb2JhbE1lc3NhZ2VzLnJlZ0V4IHx8IFtdO1xuICAgIF9yZWdFeE1lc3NhZ2VzLnB1c2goe1xuICAgICAgZXhwOiBTaW1wbGVTY2hlbWEuUmVnRXguZmllbGQsXG4gICAgICBtc2c6IFwiW2xhYmVsXSDlj6rog73ku6XlrZfmr43jgIFf5byA5aS077yMLiQu5YmN5ZCO5b+F6aG75YyF5ZCr5a2X56ymXCJcbiAgICB9KTtcbiAgICByZXR1cm4gU2ltcGxlU2NoZW1hLm1lc3NhZ2VzKHtcbiAgICAgIHJlZ0V4OiBfcmVnRXhNZXNzYWdlc1xuICAgIH0pO1xuICB9KTtcbn1cbiIsIi8vIOWboOS4um1ldGVvcue8luivkWNvZmZlZXNjcmlwdOS8muWvvOiHtGV2YWzlh73mlbDmiqXplJnvvIzmiYDku6XljZXni6zlhpnlnKjkuIDkuKpqc+aWh+S7tuS4reOAglxuQ3JlYXRvci5ldmFsSW5Db250ZXh0ID0gZnVuY3Rpb24oanMsIGNvbnRleHQpIHtcbiAgICAvLyMgUmV0dXJuIHRoZSByZXN1bHRzIG9mIHRoZSBpbi1saW5lIGFub255bW91cyBmdW5jdGlvbiB3ZSAuY2FsbCB3aXRoIHRoZSBwYXNzZWQgY29udGV4dFxuICAgIHJldHVybiBmdW5jdGlvbigpIHsgXG4gICAgXHRyZXR1cm4gZXZhbChqcyk7IFxuXHR9LmNhbGwoY29udGV4dCk7XG59XG5cblxuQ3JlYXRvci5ldmFsID0gZnVuY3Rpb24oanMpe1xuXHR0cnl7XG5cdFx0cmV0dXJuIGV2YWwoanMpXG5cdH1jYXRjaCAoZSl7XG5cdFx0Y29uc29sZS5lcnJvcihlLCBqcyk7XG5cdH1cbn07IiwiXHRnZXRPcHRpb24gPSAob3B0aW9uKS0+XG5cdFx0Zm9vID0gb3B0aW9uLnNwbGl0KFwiOlwiKVxuXHRcdGlmIGZvby5sZW5ndGggPiAyXG5cdFx0XHRyZXR1cm4ge2xhYmVsOiBmb29bMF0sIHZhbHVlOiBmb29bMV0sIGNvbG9yOiBmb29bMl19XG5cdFx0ZWxzZSBpZiBmb28ubGVuZ3RoID4gMVxuXHRcdFx0cmV0dXJuIHtsYWJlbDogZm9vWzBdLCB2YWx1ZTogZm9vWzFdfVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7bGFiZWw6IGZvb1swXSwgdmFsdWU6IGZvb1swXX1cblxuXHRjb252ZXJ0RmllbGQgPSAob2JqZWN0X25hbWUsIGZpZWxkX25hbWUsIGZpZWxkLCBzcGFjZUlkKS0+XG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyICYmIHNwYWNlSWQgJiYgZmllbGQudHlwZSA9PSAnc2VsZWN0J1xuXHRcdFx0Y29kZSA9IGZpZWxkLnBpY2tsaXN0IHx8IFwiI3tvYmplY3RfbmFtZX0uI3tmaWVsZF9uYW1lfVwiO1xuXHRcdFx0aWYgY29kZVxuXHRcdFx0XHRwaWNrbGlzdCA9IENyZWF0b3IuZ2V0UGlja2xpc3QoY29kZSwgc3BhY2VJZCk7XG5cdFx0XHRcdGlmIHBpY2tsaXN0XG5cdFx0XHRcdFx0b3B0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdGFsbE9wdGlvbnMgPSBbXTtcblx0XHRcdFx0XHRwaWNrbGlzdE9wdGlvbnMgPSBDcmVhdG9yLmdldFBpY2tMaXN0T3B0aW9ucyhwaWNrbGlzdClcblx0XHRcdFx0XHRwaWNrbGlzdE9wdGlvbnMgPSBfLnNvcnRCeShwaWNrbGlzdE9wdGlvbnMsICdzb3J0X25vJyk/LnJldmVyc2UoKTtcblx0XHRcdFx0XHRfLmVhY2ggcGlja2xpc3RPcHRpb25zLCAoaXRlbSktPlxuXHRcdFx0XHRcdFx0bGFiZWwgPSBpdGVtLm5hbWVcblx0XHRcdFx0XHRcdHZhbHVlID0gaXRlbS52YWx1ZSB8fCBpdGVtLm5hbWVcblx0XHRcdFx0XHRcdGFsbE9wdGlvbnMucHVzaCh7bGFiZWw6IGxhYmVsLCB2YWx1ZTogdmFsdWUsIGVuYWJsZTogaXRlbS5lbmFibGUsIGNvbG9yOiBpdGVtLmNvbG9yfSlcblx0XHRcdFx0XHRcdGlmIGl0ZW0uZW5hYmxlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7bGFiZWw6IGxhYmVsLCB2YWx1ZTogdmFsdWUsIGNvbG9yOiBpdGVtLmNvbG9yfSlcblx0XHRcdFx0XHRcdGlmIGl0ZW0uZGVmYXVsdFxuXHRcdFx0XHRcdFx0XHRmaWVsZC5kZWZhdWx0VmFsdWUgPSB2YWx1ZVxuXHRcdFx0XHRcdGlmIG9wdGlvbnMubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0ZmllbGQub3B0aW9ucyA9IG9wdGlvbnNcblx0XHRcdFx0XHRpZiBhbGxPcHRpb25zLmxlbmd0aCA+IDBcblx0XHRcdFx0XHRcdGZpZWxkLmFsbE9wdGlvbnMgPSBhbGxPcHRpb25zXG5cdFx0cmV0dXJuIGZpZWxkO1xuXG5cdENyZWF0b3IuY29udmVydE9iamVjdCA9IChvYmplY3QsIHNwYWNlSWQpLT5cblx0XHRpZiAhb2JqZWN0XG5cdFx0XHRyZXR1cm5cblx0XHRfLmZvckVhY2ggb2JqZWN0LnRyaWdnZXJzLCAodHJpZ2dlciwga2V5KS0+XG5cblx0XHRcdGlmIChNZXRlb3IuaXNTZXJ2ZXIgJiYgdHJpZ2dlci5vbiA9PSBcInNlcnZlclwiKSB8fCAoTWV0ZW9yLmlzQ2xpZW50ICYmIHRyaWdnZXIub24gPT0gXCJjbGllbnRcIilcblx0XHRcdFx0X3RvZG9fZnJvbV9jb2RlID0gdHJpZ2dlcj8uX3RvZG9cblx0XHRcdFx0X3RvZG9fZnJvbV9kYiA9IHRyaWdnZXIudG9kb1xuXHRcdFx0XHRpZiBfdG9kb19mcm9tX2NvZGUgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2NvZGUpXG5cdFx0XHRcdFx0dHJpZ2dlci50b2RvID0gQ3JlYXRvci5ldmFsKFwiKCN7X3RvZG9fZnJvbV9jb2RlfSlcIilcblxuXHRcdFx0XHRpZiBfdG9kb19mcm9tX2RiICYmIF8uaXNTdHJpbmcoX3RvZG9fZnJvbV9kYilcblx0XHRcdFx0XHQj5Y+q5pyJdXBkYXRl5pe277yMIGZpZWxkTmFtZXMsIG1vZGlmaWVyLCBvcHRpb25zIOaJjeacieWAvFxuXHRcdFx0XHRcdCNUT0RPIOaOp+WItuWPr+S9v+eUqOeahOWPmOmHj++8jOWwpOWFtuaYr0NvbGxlY3Rpb25cblx0XHRcdFx0XHRpZiBfdG9kb19mcm9tX2RiLnN0YXJ0c1dpdGgoXCJmdW5jdGlvblwiKVxuXHRcdFx0XHRcdFx0dHJpZ2dlci50b2RvID0gQ3JlYXRvci5ldmFsKFwiKCN7X3RvZG9fZnJvbV9kYn0pXCIpXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dHJpZ2dlci50b2RvID0gQ3JlYXRvci5ldmFsKFwiKGZ1bmN0aW9uKHVzZXJJZCwgZG9jLCBmaWVsZE5hbWVzLCBtb2RpZmllciwgb3B0aW9ucyl7I3tfdG9kb19mcm9tX2RifX0pXCIpXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlciAmJiB0cmlnZ2VyLm9uID09IFwiY2xpZW50XCJcblx0XHRcdFx0X3RvZG8gPSB0cmlnZ2VyLnRvZG9cblx0XHRcdFx0aWYgX3RvZG8gJiYgXy5pc0Z1bmN0aW9uKF90b2RvKVxuXHRcdFx0XHRcdHRyaWdnZXIuX3RvZG8gPSBfdG9kby50b1N0cmluZygpXG5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QuZmllbGRzLCAoZmllbGQsIGtleSktPlxuXG5cdFx0XHRcdGlmIGZpZWxkLm9taXRcblx0XHRcdFx0XHQjIG9taXTlrZfmrrXlrozlhajpmpDol4/kuI3mmL7npLpcblx0XHRcdFx0XHRmaWVsZC5oaWRkZW4gPSB0cnVlXG5cblx0XHRcdFx0aWYgZmllbGQucmVxdWlyZWQgJiYgZmllbGQucmVhZG9ubHlcblx0XHRcdFx0XHQjIOmAmueUqOW/heWhq+Wtl+autSAjMjk1Mu+8jOW/heWhq+Wtl+auteiuvue9ruS4uumdnuWPquivu1xuXHRcdFx0XHRcdGZpZWxkLnJlYWRvbmx5ID0gZmFsc2VcblxuXHRcdFx0XHRzeXN0ZW1CYXNlRmllbGRzID0gQ3JlYXRvci5nZXRTeXN0ZW1CYXNlRmllbGRzKClcblx0XHRcdFx0aWYgc3lzdGVtQmFzZUZpZWxkcy5pbmRleE9mKGtleSkgPiAtMVxuXHRcdFx0XHRcdCMg5by65Yi25Yib5bu65Lq65Yib5bu65pe26Ze0562J5a2X5q615Li65Y+q6K+7XG5cdFx0XHRcdFx0ZmllbGQucmVhZG9ubHkgPSB0cnVlXG5cblx0XHRcdF8uZm9yRWFjaCBvYmplY3QuYWN0aW9ucywgKGFjdGlvbiwga2V5KS0+XG5cdFx0XHRcdF90b2RvX2Zyb21fY29kZSA9IGFjdGlvbj8uX3RvZG9cblx0XHRcdFx0X3RvZG9fZnJvbV9kYiA9IGFjdGlvbj8udG9kb1xuXHRcdFx0XHRpZiBfdG9kb19mcm9tX2NvZGUgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2NvZGUpXG5cdFx0XHRcdFx0I1RPRE8g5o6n5Yi25Y+v5L2/55So55qE5Y+Y6YePXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRhY3Rpb24udG9kbyA9IENyZWF0b3IuZXZhbChcIigje190b2RvX2Zyb21fY29kZX0pXCIpXG5cdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJ0b2RvX2Zyb21fY29kZVwiLCBfdG9kb19mcm9tX2NvZGVcblx0XHRcdFx0aWYgX3RvZG9fZnJvbV9kYiAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fZGIpXG5cdFx0XHRcdFx0I1RPRE8g5o6n5Yi25Y+v5L2/55So55qE5Y+Y6YePXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRpZiBfdG9kb19mcm9tX2RiLnN0YXJ0c1dpdGgoXCJmdW5jdGlvblwiKVxuXHRcdFx0XHRcdFx0XHRhY3Rpb24udG9kbyA9IENyZWF0b3IuZXZhbChcIigje190b2RvX2Zyb21fZGJ9KVwiKVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24oQ3JlYXRvci5hY3Rpb25zQnlOYW1lW190b2RvX2Zyb21fZGJdKVxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvbi50b2RvID0gX3RvZG9fZnJvbV9kYlxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uLnRvZG8gPSBDcmVhdG9yLmV2YWwoXCIoZnVuY3Rpb24oKXsje190b2RvX2Zyb21fZGJ9fSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcInRvZG9fZnJvbV9kYlwiLCBfdG9kb19mcm9tX2RiLCBlcnJvclxuXG5cdFx0XHRcdF92aXNpYmxlID0gYWN0aW9uPy5fdmlzaWJsZVxuXHRcdFx0XHRpZiBfdmlzaWJsZVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0aWYgXy5pc1N0cmluZyhfdmlzaWJsZSlcblx0XHRcdFx0XHRcdFx0X3Zpc2libGUgPSBfdmlzaWJsZS50cmltKClcblx0XHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNFeHByZXNzaW9uKF92aXNpYmxlKVxuXHRcdFx0XHRcdFx0XHQjIOaUr+aMgemhtemdouW4g+WxgOS4reWGmXZpc2libGVfb27lh73mlbDooajovr7lvI/vvIzpobXpnaLluIPlsYDmjInpkq7nmoTmmL7npLrmnaHku7bkuI3nlJ/mlYggIzMzNDBcblx0XHRcdFx0XHRcdFx0YWN0aW9uLnZpc2libGUgPSAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3Blcm1pc3Npb25zLCByZWNvcmQpIC0+XG5cdFx0XHRcdFx0XHRcdFx0Z2xvYmFsRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIENyZWF0b3IuVVNFUl9DT05URVhULCB7bm93OiBuZXcgRGF0ZSgpfSlcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gU3RlZWRvcy5wYXJzZVNpbmdsZUV4cHJlc3Npb24oX3Zpc2libGUsIHJlY29yZCwgXCIjXCIsIGdsb2JhbERhdGEpXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGFjdGlvbi52aXNpYmxlID0gQ3JlYXRvci5ldmFsKFwiKCN7X3Zpc2libGV9KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiYWN0aW9uLnZpc2libGUgdG8gZnVuY3Rpb24gZXJyb3I6IFwiLCBlcnJvciwgX3Zpc2libGVcblx0XHRlbHNlXG5cdFx0XHRfLmZvckVhY2ggb2JqZWN0LmFjdGlvbnMsIChhY3Rpb24sIGtleSktPlxuXHRcdFx0XHRfdG9kbyA9IGFjdGlvbj8udG9kb1xuXHRcdFx0XHRpZiBfdG9kbyAmJiBfLmlzRnVuY3Rpb24oX3RvZG8pXG5cdFx0XHRcdFx0I1RPRE8g5o6n5Yi25Y+v5L2/55So55qE5Y+Y6YePXG5cdFx0XHRcdFx0YWN0aW9uLl90b2RvID0gX3RvZG8udG9TdHJpbmcoKVxuXG5cdFx0XHRcdF92aXNpYmxlID0gYWN0aW9uPy52aXNpYmxlXG5cblx0XHRcdFx0aWYgX3Zpc2libGUgJiYgXy5pc0Z1bmN0aW9uKF92aXNpYmxlKVxuXHRcdFx0XHRcdGFjdGlvbi5fdmlzaWJsZSA9IF92aXNpYmxlLnRvU3RyaW5nKClcblxuXHRcdF8uZm9yRWFjaCBvYmplY3QuZmllbGRzLCAoZmllbGQsIGtleSktPlxuXG5cdFx0XHRmaWVsZCA9IGNvbnZlcnRGaWVsZChvYmplY3QubmFtZSwga2V5LCBmaWVsZCwgc3BhY2VJZCk7XG5cblx0XHRcdGlmIGZpZWxkLm9wdGlvbnMgJiYgXy5pc1N0cmluZyhmaWVsZC5vcHRpb25zKVxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRfb3B0aW9ucyA9IFtdXG5cdFx0XHRcdFx0I+aUr+aMgVxcbuaIluiAheiLseaWh+mAl+WPt+WIhuWJsixcblx0XHRcdFx0XHRfLmZvckVhY2ggZmllbGQub3B0aW9ucy5zcGxpdChcIlxcblwiKSwgKG9wdGlvbiktPlxuXHRcdFx0XHRcdFx0aWYgb3B0aW9uLmluZGV4T2YoXCIsXCIpXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMgPSBvcHRpb24uc3BsaXQoXCIsXCIpXG5cdFx0XHRcdFx0XHRcdF8uZm9yRWFjaCBvcHRpb25zLCAoX29wdGlvbiktPlxuXHRcdFx0XHRcdFx0XHRcdF9vcHRpb25zLnB1c2goZ2V0T3B0aW9uKF9vcHRpb24pKVxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRfb3B0aW9ucy5wdXNoKGdldE9wdGlvbihvcHRpb24pKVxuXHRcdFx0XHRcdGZpZWxkLm9wdGlvbnMgPSBfb3B0aW9uc1xuXHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJDcmVhdG9yLmNvbnZlcnRGaWVsZHNPcHRpb25zXCIsIGZpZWxkLm9wdGlvbnMsIGVycm9yXG5cblx0XHRcdGVsc2UgaWYgZmllbGQub3B0aW9ucyAmJiBfLmlzQXJyYXkoZmllbGQub3B0aW9ucylcblx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0X29wdGlvbnMgPSBbXVxuXHRcdFx0XHRcdCPmlK/mjIHmlbDnu4TkuK3nm7TmjqXlrprkuYnmr4/kuKrpgInpobnnmoTnroDniYjmoLzlvI/lrZfnrKbkuLJcblx0XHRcdFx0XHRfLmZvckVhY2ggZmllbGQub3B0aW9ucywgKG9wdGlvbiktPlxuXHRcdFx0XHRcdFx0aWYgXy5pc1N0cmluZyhvcHRpb24pXG5cdFx0XHRcdFx0XHRcdF9vcHRpb25zLnB1c2goZ2V0T3B0aW9uKG9wdGlvbikpXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdF9vcHRpb25zLnB1c2gob3B0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLm9wdGlvbnMgPSBfb3B0aW9uc1xuXHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJDcmVhdG9yLmNvbnZlcnRGaWVsZHNPcHRpb25zXCIsIGZpZWxkLm9wdGlvbnMsIGVycm9yXG5cblx0XHRcdGVsc2UgaWYgZmllbGQub3B0aW9ucyAmJiAhXy5pc0Z1bmN0aW9uKGZpZWxkLm9wdGlvbnMpICYmICFfLmlzQXJyYXkoZmllbGQub3B0aW9ucykgJiYgXy5pc09iamVjdChmaWVsZC5vcHRpb25zKVxuXHRcdFx0XHRfb3B0aW9ucyA9IFtdXG5cdFx0XHRcdF8uZWFjaCBmaWVsZC5vcHRpb25zLCAodiwgayktPlxuXHRcdFx0XHRcdF9vcHRpb25zLnB1c2gge2xhYmVsOiB2LCB2YWx1ZToga31cblx0XHRcdFx0ZmllbGQub3B0aW9ucyA9IF9vcHRpb25zXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRvcHRpb25zID0gZmllbGQub3B0aW9uc1xuXHRcdFx0XHRpZiBvcHRpb25zICYmIF8uaXNGdW5jdGlvbihvcHRpb25zKVxuXHRcdFx0XHRcdGZpZWxkLl9vcHRpb25zID0gZmllbGQub3B0aW9ucy50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdG9wdGlvbnMgPSBmaWVsZC5fb3B0aW9uc1xuXHRcdFx0XHRpZiBvcHRpb25zICYmIF8uaXNTdHJpbmcob3B0aW9ucylcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGZpZWxkLm9wdGlvbnMgPSBDcmVhdG9yLmV2YWwoXCIoI3tvcHRpb25zfSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImNvbnZlcnQgZXJyb3IgI3tvYmplY3QubmFtZX0gLT4gI3tmaWVsZC5uYW1lfVwiLCBlcnJvclxuXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0cmVnRXggPSBmaWVsZC5yZWdFeFxuXHRcdFx0XHRpZiByZWdFeFxuXHRcdFx0XHRcdGZpZWxkLl9yZWdFeCA9IGZpZWxkLnJlZ0V4LnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmVnRXggPSBmaWVsZC5fcmVnRXhcblx0XHRcdFx0aWYgcmVnRXhcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGZpZWxkLnJlZ0V4ID0gQ3JlYXRvci5ldmFsKFwiKCN7cmVnRXh9KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY29udmVydCBlcnJvciAje29iamVjdC5uYW1lfSAtPiAje2ZpZWxkLm5hbWV9XCIsIGVycm9yXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRtaW4gPSBmaWVsZC5taW5cblx0XHRcdFx0aWYgXy5pc0Z1bmN0aW9uKG1pbilcblx0XHRcdFx0XHRmaWVsZC5fbWluID0gbWluLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0bWluID0gZmllbGQuX21pblxuXHRcdFx0XHRpZiBfLmlzU3RyaW5nKG1pbilcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGZpZWxkLm1pbiA9IENyZWF0b3IuZXZhbChcIigje21pbn0pXCIpXG5cdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJjb252ZXJ0IGVycm9yICN7b2JqZWN0Lm5hbWV9IC0+ICN7ZmllbGQubmFtZX1cIiwgZXJyb3JcblxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1heCA9IGZpZWxkLm1heFxuXHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24obWF4KVxuXHRcdFx0XHRcdGZpZWxkLl9tYXggPSBtYXgudG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRtYXggPSBmaWVsZC5fbWF4XG5cdFx0XHRcdGlmIF8uaXNTdHJpbmcobWF4KVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQubWF4ID0gQ3JlYXRvci5ldmFsKFwiKCN7bWF4fSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImNvbnZlcnQgZXJyb3IgI3tvYmplY3QubmFtZX0gLT4gI3tmaWVsZC5uYW1lfVwiLCBlcnJvclxuXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0aWYgZmllbGQuYXV0b2Zvcm1cblx0XHRcdFx0XHRfdHlwZSA9IGZpZWxkLmF1dG9mb3JtLnR5cGVcblx0XHRcdFx0XHRpZiBfdHlwZSAmJiBfLmlzRnVuY3Rpb24oX3R5cGUpICYmIF90eXBlICE9IE9iamVjdCAmJiBfdHlwZSAhPSBTdHJpbmcgJiYgX3R5cGUgIT0gTnVtYmVyICYmIF90eXBlICE9IEJvb2xlYW4gJiYgIV8uaXNBcnJheShfdHlwZSlcblx0XHRcdFx0XHRcdGZpZWxkLmF1dG9mb3JtLl90eXBlID0gX3R5cGUudG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpZiBmaWVsZC5hdXRvZm9ybVxuXHRcdFx0XHRcdF90eXBlID0gZmllbGQuYXV0b2Zvcm0uX3R5cGVcblx0XHRcdFx0XHRpZiBfdHlwZSAmJiBfLmlzU3RyaW5nKF90eXBlKVxuXHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdGZpZWxkLmF1dG9mb3JtLnR5cGUgPSBDcmVhdG9yLmV2YWwoXCIoI3tfdHlwZX0pXCIpXG5cdFx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY29udmVydCBmaWVsZCAtPiB0eXBlIGVycm9yXCIsIGZpZWxkLCBlcnJvclxuXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblxuXHRcdFx0XHRvcHRpb25zRnVuY3Rpb24gPSBmaWVsZC5vcHRpb25zRnVuY3Rpb25cblx0XHRcdFx0cmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvXG5cdFx0XHRcdGNyZWF0ZUZ1bmN0aW9uID0gZmllbGQuY3JlYXRlRnVuY3Rpb25cblx0XHRcdFx0YmVmb3JlT3BlbkZ1bmN0aW9uID0gZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uXG5cdFx0XHRcdGZpbHRlcnNGdW5jdGlvbiA9IGZpZWxkLmZpbHRlcnNGdW5jdGlvblxuXG5cdFx0XHRcdGlmIG9wdGlvbnNGdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24ob3B0aW9uc0Z1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLl9vcHRpb25zRnVuY3Rpb24gPSBvcHRpb25zRnVuY3Rpb24udG9TdHJpbmcoKVxuXG5cdFx0XHRcdGlmIHJlZmVyZW5jZV90byAmJiBfLmlzRnVuY3Rpb24ocmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdGZpZWxkLl9yZWZlcmVuY2VfdG8gPSByZWZlcmVuY2VfdG8udG9TdHJpbmcoKVxuXG5cdFx0XHRcdGlmIGNyZWF0ZUZ1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihjcmVhdGVGdW5jdGlvbilcblx0XHRcdFx0XHRmaWVsZC5fY3JlYXRlRnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbi50b1N0cmluZygpXG5cdFx0XHRcdGlmIGJlZm9yZU9wZW5GdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oYmVmb3JlT3BlbkZ1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLl9iZWZvcmVPcGVuRnVuY3Rpb24gPSBiZWZvcmVPcGVuRnVuY3Rpb24udG9TdHJpbmcoKVxuXG5cdFx0XHRcdGlmIGZpbHRlcnNGdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oZmlsdGVyc0Z1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLl9maWx0ZXJzRnVuY3Rpb24gPSBmaWx0ZXJzRnVuY3Rpb24udG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXG5cdFx0XHRcdG9wdGlvbnNGdW5jdGlvbiA9IGZpZWxkLl9vcHRpb25zRnVuY3Rpb24gfHwgZmllbGQub3B0aW9uc0Z1bmN0aW9uXG5cdFx0XHRcdHJlZmVyZW5jZV90byA9IGZpZWxkLl9yZWZlcmVuY2VfdG9cblx0XHRcdFx0Y3JlYXRlRnVuY3Rpb24gPSBmaWVsZC5fY3JlYXRlRnVuY3Rpb25cblx0XHRcdFx0YmVmb3JlT3BlbkZ1bmN0aW9uID0gZmllbGQuX2JlZm9yZU9wZW5GdW5jdGlvblxuXHRcdFx0XHRmaWx0ZXJzRnVuY3Rpb24gPSBmaWVsZC5fZmlsdGVyc0Z1bmN0aW9uIHx8IGZpZWxkLmZpbHRlcnNGdW5jdGlvblxuXG5cdFx0XHRcdGlmIG9wdGlvbnNGdW5jdGlvbiAmJiBfLmlzU3RyaW5nKG9wdGlvbnNGdW5jdGlvbilcblx0XHRcdFx0XHRmaWVsZC5vcHRpb25zRnVuY3Rpb24gPSBDcmVhdG9yLmV2YWwoXCIoI3tvcHRpb25zRnVuY3Rpb259KVwiKVxuXG5cdFx0XHRcdGlmIHJlZmVyZW5jZV90byAmJiBfLmlzU3RyaW5nKHJlZmVyZW5jZV90bylcblx0XHRcdFx0XHRmaWVsZC5yZWZlcmVuY2VfdG8gPSBDcmVhdG9yLmV2YWwoXCIoI3tyZWZlcmVuY2VfdG99KVwiKVxuXG5cdFx0XHRcdGlmIGNyZWF0ZUZ1bmN0aW9uICYmIF8uaXNTdHJpbmcoY3JlYXRlRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuY3JlYXRlRnVuY3Rpb24gPSBDcmVhdG9yLmV2YWwoXCIoI3tjcmVhdGVGdW5jdGlvbn0pXCIpXG5cblx0XHRcdFx0aWYgYmVmb3JlT3BlbkZ1bmN0aW9uICYmIF8uaXNTdHJpbmcoYmVmb3JlT3BlbkZ1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLmJlZm9yZU9wZW5GdW5jdGlvbiA9IENyZWF0b3IuZXZhbChcIigje2JlZm9yZU9wZW5GdW5jdGlvbn0pXCIpXG5cblx0XHRcdFx0aWYgZmlsdGVyc0Z1bmN0aW9uICYmIF8uaXNTdHJpbmcoZmlsdGVyc0Z1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLmZpbHRlcnNGdW5jdGlvbiA9IENyZWF0b3IuZXZhbChcIigje2ZpbHRlcnNGdW5jdGlvbn0pXCIpXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRkZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWVcblx0XHRcdFx0aWYgZGVmYXVsdFZhbHVlICYmIF8uaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG5cdFx0XHRcdFx0ZmllbGQuX2RlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZS50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGRlZmF1bHRWYWx1ZSA9IGZpZWxkLl9kZWZhdWx0VmFsdWVcblxuXHRcdFx0XHRpZiAhZGVmYXVsdFZhbHVlICYmIF8uaXNTdHJpbmcoZmllbGQuZGVmYXVsdFZhbHVlKSAmJiBmaWVsZC5kZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpXG5cdFx0XHRcdFx0ZGVmYXVsdFZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlXG5cblx0XHRcdFx0aWYgZGVmYXVsdFZhbHVlICYmIF8uaXNTdHJpbmcoZGVmYXVsdFZhbHVlKVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQuZGVmYXVsdFZhbHVlID0gQ3JlYXRvci5ldmFsKFwiKCN7ZGVmYXVsdFZhbHVlfSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImNvbnZlcnQgZXJyb3IgI3tvYmplY3QubmFtZX0gLT4gI3tmaWVsZC5uYW1lfVwiLCBlcnJvclxuXHRcdFx0XG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0aXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdGlmIGlzX2NvbXBhbnlfbGltaXRlZCAmJiBfLmlzRnVuY3Rpb24oaXNfY29tcGFueV9saW1pdGVkKVxuXHRcdFx0XHRcdGZpZWxkLl9pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQudG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5faXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdGlmIGlzX2NvbXBhbnlfbGltaXRlZCAmJiBfLmlzU3RyaW5nKGlzX2NvbXBhbnlfbGltaXRlZClcblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCA9IENyZWF0b3IuZXZhbChcIigje2lzX2NvbXBhbnlfbGltaXRlZH0pXCIpXG5cdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJjb252ZXJ0IGVycm9yICN7b2JqZWN0Lm5hbWV9IC0+ICN7ZmllbGQubmFtZX1cIiwgZXJyb3JcblxuXHRcdF8uZm9yRWFjaCBvYmplY3QubGlzdF92aWV3cywgKGxpc3Rfdmlldywga2V5KSAtPlxuXHRcdFx0IyMjXG5cdFx0XHTop4blm77ov4fomZHlmajpnIDopoHmlK/mjIFmdW5jdGlvbu+8jOWQjuWPsOi9rOaIkOWtl+espuS4su+8jOWJjeWPsGV2YWzmiJDlh73mlbBcblx0XHRcdOiuqei/h+iZkeWZqOaUr+aMgeS4pOenjWZ1bmN0aW9u5pa55byP77yaXG5cdFx0XHQxLiDmlbTkuKpmaWx0ZXJz5Li6ZnVuY3Rpb246XG5cdFx0XHTlpoLvvJpcblx0XHRcdGZpbHRlcnM6ICgpLT5cblx0XHRcdFx0cmV0dXJuIFtbW1wib2JqZWN0X25hbWVcIixcIj1cIixcInByb2plY3RfaXNzdWVzXCJdLCdvcicsW1wib2JqZWN0X25hbWVcIixcIj1cIixcInRhc2tzXCJdXV1cblx0XHRcdDIuIGZpbHRlcnPlhoXnmoRmaWx0ZXIudmFsdWXkuLpmdW5jdGlvblxuXHRcdFx05aaC77yaXG5cdFx0XHRmaWx0ZXJzOiBbW1wib2JqZWN0X25hbWVcIiwgXCI9XCIsICgpLT5cblx0XHRcdFx0cmV0dXJuIFwicHJvamVjdF9pc3N1ZXNcIlxuXHRcdFx0XV1cblx0XHRcdOaIllxuXHRcdFx0ZmlsdGVyczogW3tcblx0XHRcdFx0XCJmaWVsZFwiOiBcIm9iamVjdF9uYW1lXCJcblx0XHRcdFx0XCJvcGVyYXRpb25cIjogXCI9XCJcblx0XHRcdFx0XCJ2YWx1ZVwiOiAoKS0+XG5cdFx0XHRcdFx0cmV0dXJuIFwicHJvamVjdF9pc3N1ZXNcIlxuXHRcdFx0fV1cblx0XHRcdCMjI1xuXHRcdFx0aWYgXy5pc0Z1bmN0aW9uKGxpc3Rfdmlldy5maWx0ZXJzKVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRsaXN0X3ZpZXcuX2ZpbHRlcnMgPSBsaXN0X3ZpZXcuZmlsdGVycy50b1N0cmluZygpXG5cdFx0XHRlbHNlIGlmIF8uaXNTdHJpbmcobGlzdF92aWV3Ll9maWx0ZXJzKVxuXHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRsaXN0X3ZpZXcuZmlsdGVycyA9IENyZWF0b3IuZXZhbChcIigje2xpc3Rfdmlldy5fZmlsdGVyc30pXCIpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdF8uZm9yRWFjaCBsaXN0X3ZpZXcuZmlsdGVycywgKGZpbHRlciwgX2luZGV4KS0+XG5cdFx0XHRcdFx0aWYgXy5pc0FycmF5KGZpbHRlcilcblx0XHRcdFx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdFx0XHRpZiBmaWx0ZXIubGVuZ3RoID09IDMgYW5kIF8uaXNGdW5jdGlvbihmaWx0ZXJbMl0pXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyWzJdID0gZmlsdGVyWzJdLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJbM10gPSBcIkZVTkNUSU9OXCJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBmaWx0ZXIubGVuZ3RoID09IDMgYW5kIF8uaXNEYXRlKGZpbHRlclsyXSlcblx0XHRcdFx0XHRcdFx0XHQjIOWmguaenOaYr0RhdGXnsbvlnovvvIzliJlmaWx0ZXJbMl3lgLzliLDliY3nq6/kvJroh6rliqjovazmiJDlrZfnrKbkuLLvvIzmoLzlvI/vvJpcIjIwMTgtMDMtMjlUMDM6NDM6MjEuNzg3WlwiXG5cdFx0XHRcdFx0XHRcdFx0IyDljIXmi6xncmlk5YiX6KGo6K+35rGC55qE5o6l5Y+j5Zyo5YaF55qE5omA5pyJT0RhdGHmjqXlj6PvvIxEYXRl57G75Z6L5a2X5q616YO95Lya5Lul5LiK6L+w5qC85byP6L+U5ZueXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyWzNdID0gXCJEQVRFXCJcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0aWYgZmlsdGVyLmxlbmd0aCA9PSA0IGFuZCBfLmlzU3RyaW5nKGZpbHRlclsyXSkgYW5kIGZpbHRlclszXSA9PSBcIkZVTkNUSU9OXCJcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJbMl0gPSBDcmVhdG9yLmV2YWwoXCIoI3tmaWx0ZXJbMl19KVwiKVxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlci5wb3AoKVxuXHRcdFx0XHRcdFx0XHRpZiBmaWx0ZXIubGVuZ3RoID09IDQgYW5kIF8uaXNTdHJpbmcoZmlsdGVyWzJdKSBhbmQgZmlsdGVyWzNdID09IFwiREFURVwiXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyWzJdID0gbmV3IERhdGUoZmlsdGVyWzJdKVxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlci5wb3AoKVxuXHRcdFx0XHRcdGVsc2UgaWYgXy5pc09iamVjdChmaWx0ZXIpXG5cdFx0XHRcdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0XHRcdFx0aWYgXy5pc0Z1bmN0aW9uKGZpbHRlcj8udmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLl92YWx1ZSA9IGZpbHRlci52YWx1ZS50b1N0cmluZygpXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgXy5pc0RhdGUoZmlsdGVyPy52YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXIuX2lzX2RhdGUgPSB0cnVlXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGlmIF8uaXNTdHJpbmcoZmlsdGVyPy5fdmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLnZhbHVlID0gQ3JlYXRvci5ldmFsKFwiKCN7ZmlsdGVyLl92YWx1ZX0pXCIpXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgZmlsdGVyLl9pc19kYXRlID09IHRydWVcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShmaWx0ZXIudmFsdWUpXG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdGlmIG9iamVjdC5mb3JtICYmICFfLmlzU3RyaW5nKG9iamVjdC5mb3JtKVxuXHRcdFx0XHRvYmplY3QuZm9ybSA9IEpTT04uc3RyaW5naWZ5IG9iamVjdC5mb3JtLCAoa2V5LCB2YWwpLT5cblx0XHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24odmFsKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbCArICcnO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJldHVybiB2YWw7XG5cdFx0ZWxzZSBpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIG9iamVjdC5mb3JtXG5cdFx0XHRcdG9iamVjdC5mb3JtID0gSlNPTi5wYXJzZSBvYmplY3QuZm9ybSwgKGtleSwgdmFsKS0+XG5cdFx0XHRcdFx0aWYgXy5pc1N0cmluZyh2YWwpICYmIHZhbC5zdGFydHNXaXRoKCdmdW5jdGlvbicpXG5cdFx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRvci5ldmFsKFwiKCN7dmFsfSlcIilcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsO1xuXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRfLmZvckVhY2ggb2JqZWN0LnJlbGF0ZWRfbGlzdHMsIChyZWxhdGVkT2JqSW5mbyktPlxuXHRcdFx0XHRpZiBfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKVxuXHRcdFx0XHRcdF8uZm9yRWFjaCByZWxhdGVkT2JqSW5mbywgKHZhbCwga2V5KS0+XG5cdFx0XHRcdFx0XHRpZiBrZXkgPT0gJ2ZpbHRlcnMnICYmIF8uaXNTdHJpbmcodmFsKVxuXHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0XHRyZWxhdGVkT2JqSW5mb1trZXldID0gQ3JlYXRvci5ldmFsKFwiKCN7dmFsfSlcIilcblx0XHRcdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiZmlsdGVyc19jb2RlXCIsIHZhbFxuXHRcdGVsc2Vcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QucmVsYXRlZF9saXN0cywgKHJlbGF0ZWRPYmpJbmZvKS0+XG5cdFx0XHRcdGlmIF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pXG5cdFx0XHRcdFx0Xy5mb3JFYWNoIHJlbGF0ZWRPYmpJbmZvLCAodmFsLCBrZXkpLT5cblx0XHRcdFx0XHRcdGlmIGtleSA9PSAnZmlsdGVycycgJiYgXy5pc0Z1bmN0aW9uKHZhbClcblx0XHRcdFx0XHRcdFx0cmVsYXRlZE9iakluZm9ba2V5XSA9IHZhbC50b1N0cmluZygpXG5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QucmVsYXRlZExpc3QsIChyZWxhdGVkT2JqSW5mbyktPlxuXHRcdFx0XHRpZiBfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKVxuXHRcdFx0XHRcdF8uZm9yRWFjaCByZWxhdGVkT2JqSW5mbywgKHZhbCwga2V5KS0+XG5cdFx0XHRcdFx0XHRpZiBrZXkgPT0gJ2ZpbHRlcnMnICYmIF8uaXNTdHJpbmcodmFsKVxuXHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0XHRyZWxhdGVkT2JqSW5mb1trZXldID0gQ3JlYXRvci5ldmFsKFwiKCN7dmFsfSlcIilcblx0XHRcdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiZmlsdGVyc19jb2RlXCIsIHZhbFxuXHRcdGVsc2Vcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QucmVsYXRlZExpc3QsIChyZWxhdGVkT2JqSW5mbyktPlxuXHRcdFx0XHRpZiBfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKVxuXHRcdFx0XHRcdF8uZm9yRWFjaCByZWxhdGVkT2JqSW5mbywgKHZhbCwga2V5KS0+XG5cdFx0XHRcdFx0XHRpZiBrZXkgPT0gJ2ZpbHRlcnMnICYmIF8uaXNGdW5jdGlvbih2YWwpXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRPYmpJbmZvW2tleV0gPSB2YWwudG9TdHJpbmcoKVxuXG5cdFx0cmV0dXJuIG9iamVjdFxuXG5cbiIsInZhciBjb252ZXJ0RmllbGQsIGdldE9wdGlvbjtcblxuZ2V0T3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uKSB7XG4gIHZhciBmb287XG4gIGZvbyA9IG9wdGlvbi5zcGxpdChcIjpcIik7XG4gIGlmIChmb28ubGVuZ3RoID4gMikge1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogZm9vWzBdLFxuICAgICAgdmFsdWU6IGZvb1sxXSxcbiAgICAgIGNvbG9yOiBmb29bMl1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGZvby5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBmb29bMF0sXG4gICAgICB2YWx1ZTogZm9vWzFdXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGZvb1swXSxcbiAgICAgIHZhbHVlOiBmb29bMF1cbiAgICB9O1xuICB9XG59O1xuXG5jb252ZXJ0RmllbGQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgZmllbGRfbmFtZSwgZmllbGQsIHNwYWNlSWQpIHtcbiAgdmFyIGFsbE9wdGlvbnMsIGNvZGUsIG9wdGlvbnMsIHBpY2tsaXN0LCBwaWNrbGlzdE9wdGlvbnMsIHJlZjtcbiAgaWYgKE1ldGVvci5pc1NlcnZlciAmJiBzcGFjZUlkICYmIGZpZWxkLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgY29kZSA9IGZpZWxkLnBpY2tsaXN0IHx8IChvYmplY3RfbmFtZSArIFwiLlwiICsgZmllbGRfbmFtZSk7XG4gICAgaWYgKGNvZGUpIHtcbiAgICAgIHBpY2tsaXN0ID0gQ3JlYXRvci5nZXRQaWNrbGlzdChjb2RlLCBzcGFjZUlkKTtcbiAgICAgIGlmIChwaWNrbGlzdCkge1xuICAgICAgICBvcHRpb25zID0gW107XG4gICAgICAgIGFsbE9wdGlvbnMgPSBbXTtcbiAgICAgICAgcGlja2xpc3RPcHRpb25zID0gQ3JlYXRvci5nZXRQaWNrTGlzdE9wdGlvbnMocGlja2xpc3QpO1xuICAgICAgICBwaWNrbGlzdE9wdGlvbnMgPSAocmVmID0gXy5zb3J0QnkocGlja2xpc3RPcHRpb25zLCAnc29ydF9ubycpKSAhPSBudWxsID8gcmVmLnJldmVyc2UoKSA6IHZvaWQgMDtcbiAgICAgICAgXy5lYWNoKHBpY2tsaXN0T3B0aW9ucywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHZhciBsYWJlbCwgdmFsdWU7XG4gICAgICAgICAgbGFiZWwgPSBpdGVtLm5hbWU7XG4gICAgICAgICAgdmFsdWUgPSBpdGVtLnZhbHVlIHx8IGl0ZW0ubmFtZTtcbiAgICAgICAgICBhbGxPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW5hYmxlOiBpdGVtLmVuYWJsZSxcbiAgICAgICAgICAgIGNvbG9yOiBpdGVtLmNvbG9yXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGl0ZW0uZW5hYmxlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbVtcImRlZmF1bHRcIl0pIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmllbGQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpZWxkLmFsbE9wdGlvbnMgPSBhbGxPcHRpb25zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWVsZDtcbn07XG5cbkNyZWF0b3IuY29udmVydE9iamVjdCA9IGZ1bmN0aW9uKG9iamVjdCwgc3BhY2VJZCkge1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuICBfLmZvckVhY2gob2JqZWN0LnRyaWdnZXJzLCBmdW5jdGlvbih0cmlnZ2VyLCBrZXkpIHtcbiAgICB2YXIgX3RvZG8sIF90b2RvX2Zyb21fY29kZSwgX3RvZG9fZnJvbV9kYjtcbiAgICBpZiAoKE1ldGVvci5pc1NlcnZlciAmJiB0cmlnZ2VyLm9uID09PSBcInNlcnZlclwiKSB8fCAoTWV0ZW9yLmlzQ2xpZW50ICYmIHRyaWdnZXIub24gPT09IFwiY2xpZW50XCIpKSB7XG4gICAgICBfdG9kb19mcm9tX2NvZGUgPSB0cmlnZ2VyICE9IG51bGwgPyB0cmlnZ2VyLl90b2RvIDogdm9pZCAwO1xuICAgICAgX3RvZG9fZnJvbV9kYiA9IHRyaWdnZXIudG9kbztcbiAgICAgIGlmIChfdG9kb19mcm9tX2NvZGUgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2NvZGUpKSB7XG4gICAgICAgIHRyaWdnZXIudG9kbyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgX3RvZG9fZnJvbV9jb2RlICsgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKF90b2RvX2Zyb21fZGIgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2RiKSkge1xuICAgICAgICBpZiAoX3RvZG9fZnJvbV9kYi5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICB0cmlnZ2VyLnRvZG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIF90b2RvX2Zyb21fZGIgKyBcIilcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJpZ2dlci50b2RvID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoZnVuY3Rpb24odXNlcklkLCBkb2MsIGZpZWxkTmFtZXMsIG1vZGlmaWVyLCBvcHRpb25zKXtcIiArIF90b2RvX2Zyb21fZGIgKyBcIn0pXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIgJiYgdHJpZ2dlci5vbiA9PT0gXCJjbGllbnRcIikge1xuICAgICAgX3RvZG8gPSB0cmlnZ2VyLnRvZG87XG4gICAgICBpZiAoX3RvZG8gJiYgXy5pc0Z1bmN0aW9uKF90b2RvKSkge1xuICAgICAgICByZXR1cm4gdHJpZ2dlci5fdG9kbyA9IF90b2RvLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIF8uZm9yRWFjaChvYmplY3QuZmllbGRzLCBmdW5jdGlvbihmaWVsZCwga2V5KSB7XG4gICAgICB2YXIgc3lzdGVtQmFzZUZpZWxkcztcbiAgICAgIGlmIChmaWVsZC5vbWl0KSB7XG4gICAgICAgIGZpZWxkLmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQucmVxdWlyZWQgJiYgZmllbGQucmVhZG9ubHkpIHtcbiAgICAgICAgZmllbGQucmVhZG9ubHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN5c3RlbUJhc2VGaWVsZHMgPSBDcmVhdG9yLmdldFN5c3RlbUJhc2VGaWVsZHMoKTtcbiAgICAgIGlmIChzeXN0ZW1CYXNlRmllbGRzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5yZWFkb25seSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXy5mb3JFYWNoKG9iamVjdC5hY3Rpb25zLCBmdW5jdGlvbihhY3Rpb24sIGtleSkge1xuICAgICAgdmFyIF90b2RvX2Zyb21fY29kZSwgX3RvZG9fZnJvbV9kYiwgX3Zpc2libGUsIGVycm9yO1xuICAgICAgX3RvZG9fZnJvbV9jb2RlID0gYWN0aW9uICE9IG51bGwgPyBhY3Rpb24uX3RvZG8gOiB2b2lkIDA7XG4gICAgICBfdG9kb19mcm9tX2RiID0gYWN0aW9uICE9IG51bGwgPyBhY3Rpb24udG9kbyA6IHZvaWQgMDtcbiAgICAgIGlmIChfdG9kb19mcm9tX2NvZGUgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2NvZGUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYWN0aW9uLnRvZG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIF90b2RvX2Zyb21fY29kZSArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcInRvZG9fZnJvbV9jb2RlXCIsIF90b2RvX2Zyb21fY29kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChfdG9kb19mcm9tX2RiICYmIF8uaXNTdHJpbmcoX3RvZG9fZnJvbV9kYikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoX3RvZG9fZnJvbV9kYi5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgICAgIGFjdGlvbi50b2RvID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBfdG9kb19mcm9tX2RiICsgXCIpXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKENyZWF0b3IuYWN0aW9uc0J5TmFtZVtfdG9kb19mcm9tX2RiXSkpIHtcbiAgICAgICAgICAgICAgYWN0aW9uLnRvZG8gPSBfdG9kb19mcm9tX2RiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWN0aW9uLnRvZG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihmdW5jdGlvbigpe1wiICsgX3RvZG9fZnJvbV9kYiArIFwifSlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwidG9kb19mcm9tX2RiXCIsIF90b2RvX2Zyb21fZGIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3Zpc2libGUgPSBhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi5fdmlzaWJsZSA6IHZvaWQgMDtcbiAgICAgIGlmIChfdmlzaWJsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChfLmlzU3RyaW5nKF92aXNpYmxlKSkge1xuICAgICAgICAgICAgX3Zpc2libGUgPSBfdmlzaWJsZS50cmltKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChTdGVlZG9zLmlzRXhwcmVzc2lvbihfdmlzaWJsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24udmlzaWJsZSA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHJlY29yZF9wZXJtaXNzaW9ucywgcmVjb3JkKSB7XG4gICAgICAgICAgICAgIHZhciBnbG9iYWxEYXRhO1xuICAgICAgICAgICAgICBnbG9iYWxEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgQ3JlYXRvci5VU0VSX0NPTlRFWFQsIHtcbiAgICAgICAgICAgICAgICBub3c6IG5ldyBEYXRlKClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBTdGVlZG9zLnBhcnNlU2luZ2xlRXhwcmVzc2lvbihfdmlzaWJsZSwgcmVjb3JkLCBcIiNcIiwgZ2xvYmFsRGF0YSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnZpc2libGUgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIF92aXNpYmxlICsgXCIpXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJhY3Rpb24udmlzaWJsZSB0byBmdW5jdGlvbiBlcnJvcjogXCIsIGVycm9yLCBfdmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBfLmZvckVhY2gob2JqZWN0LmFjdGlvbnMsIGZ1bmN0aW9uKGFjdGlvbiwga2V5KSB7XG4gICAgICB2YXIgX3RvZG8sIF92aXNpYmxlO1xuICAgICAgX3RvZG8gPSBhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi50b2RvIDogdm9pZCAwO1xuICAgICAgaWYgKF90b2RvICYmIF8uaXNGdW5jdGlvbihfdG9kbykpIHtcbiAgICAgICAgYWN0aW9uLl90b2RvID0gX3RvZG8udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIF92aXNpYmxlID0gYWN0aW9uICE9IG51bGwgPyBhY3Rpb24udmlzaWJsZSA6IHZvaWQgMDtcbiAgICAgIGlmIChfdmlzaWJsZSAmJiBfLmlzRnVuY3Rpb24oX3Zpc2libGUpKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uX3Zpc2libGUgPSBfdmlzaWJsZS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIF8uZm9yRWFjaChvYmplY3QuZmllbGRzLCBmdW5jdGlvbihmaWVsZCwga2V5KSB7XG4gICAgdmFyIF9vcHRpb25zLCBfdHlwZSwgYmVmb3JlT3BlbkZ1bmN0aW9uLCBjcmVhdGVGdW5jdGlvbiwgZGVmYXVsdFZhbHVlLCBlcnJvciwgZmlsdGVyc0Z1bmN0aW9uLCBpc19jb21wYW55X2xpbWl0ZWQsIG1heCwgbWluLCBvcHRpb25zLCBvcHRpb25zRnVuY3Rpb24sIHJlZmVyZW5jZV90bywgcmVnRXg7XG4gICAgZmllbGQgPSBjb252ZXJ0RmllbGQob2JqZWN0Lm5hbWUsIGtleSwgZmllbGQsIHNwYWNlSWQpO1xuICAgIGlmIChmaWVsZC5vcHRpb25zICYmIF8uaXNTdHJpbmcoZmllbGQub3B0aW9ucykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9vcHRpb25zID0gW107XG4gICAgICAgIF8uZm9yRWFjaChmaWVsZC5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICB2YXIgb3B0aW9ucztcbiAgICAgICAgICBpZiAob3B0aW9uLmluZGV4T2YoXCIsXCIpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJldHVybiBfLmZvckVhY2gob3B0aW9ucywgZnVuY3Rpb24oX29wdGlvbikge1xuICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbnMucHVzaChnZXRPcHRpb24oX29wdGlvbikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKGdldE9wdGlvbihvcHRpb24pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZC5vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDcmVhdG9yLmNvbnZlcnRGaWVsZHNPcHRpb25zXCIsIGZpZWxkLm9wdGlvbnMsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLm9wdGlvbnMgJiYgXy5pc0FycmF5KGZpZWxkLm9wdGlvbnMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBfb3B0aW9ucyA9IFtdO1xuICAgICAgICBfLmZvckVhY2goZmllbGQub3B0aW9ucywgZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKF8uaXNTdHJpbmcob3B0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goZ2V0T3B0aW9uKG9wdGlvbikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX29wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNyZWF0b3IuY29udmVydEZpZWxkc09wdGlvbnNcIiwgZmllbGQub3B0aW9ucywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQub3B0aW9ucyAmJiAhXy5pc0Z1bmN0aW9uKGZpZWxkLm9wdGlvbnMpICYmICFfLmlzQXJyYXkoZmllbGQub3B0aW9ucykgJiYgXy5pc09iamVjdChmaWVsZC5vcHRpb25zKSkge1xuICAgICAgX29wdGlvbnMgPSBbXTtcbiAgICAgIF8uZWFjaChmaWVsZC5vcHRpb25zLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogdixcbiAgICAgICAgICB2YWx1ZToga1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgZmllbGQub3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBvcHRpb25zID0gZmllbGQub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zICYmIF8uaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBmaWVsZC5fb3B0aW9ucyA9IGZpZWxkLm9wdGlvbnMudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGZpZWxkLl9vcHRpb25zO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgXy5pc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpZWxkLm9wdGlvbnMgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIG9wdGlvbnMgKyBcIilcIik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGVycm9yIFwiICsgb2JqZWN0Lm5hbWUgKyBcIiAtPiBcIiArIGZpZWxkLm5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICByZWdFeCA9IGZpZWxkLnJlZ0V4O1xuICAgICAgaWYgKHJlZ0V4KSB7XG4gICAgICAgIGZpZWxkLl9yZWdFeCA9IGZpZWxkLnJlZ0V4LnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ0V4ID0gZmllbGQuX3JlZ0V4O1xuICAgICAgaWYgKHJlZ0V4KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmllbGQucmVnRXggPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIHJlZ0V4ICsgXCIpXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udmVydCBlcnJvciBcIiArIG9iamVjdC5uYW1lICsgXCIgLT4gXCIgKyBmaWVsZC5uYW1lLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbWluID0gZmllbGQubWluO1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihtaW4pKSB7XG4gICAgICAgIGZpZWxkLl9taW4gPSBtaW4udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWluID0gZmllbGQuX21pbjtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG1pbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWVsZC5taW4gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIG1pbiArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImNvbnZlcnQgZXJyb3IgXCIgKyBvYmplY3QubmFtZSArIFwiIC0+IFwiICsgZmllbGQubmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIG1heCA9IGZpZWxkLm1heDtcbiAgICAgIGlmIChfLmlzRnVuY3Rpb24obWF4KSkge1xuICAgICAgICBmaWVsZC5fbWF4ID0gbWF4LnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1heCA9IGZpZWxkLl9tYXg7XG4gICAgICBpZiAoXy5pc1N0cmluZyhtYXgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmllbGQubWF4ID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBtYXggKyBcIilcIik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGVycm9yIFwiICsgb2JqZWN0Lm5hbWUgKyBcIiAtPiBcIiArIGZpZWxkLm5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBpZiAoZmllbGQuYXV0b2Zvcm0pIHtcbiAgICAgICAgX3R5cGUgPSBmaWVsZC5hdXRvZm9ybS50eXBlO1xuICAgICAgICBpZiAoX3R5cGUgJiYgXy5pc0Z1bmN0aW9uKF90eXBlKSAmJiBfdHlwZSAhPT0gT2JqZWN0ICYmIF90eXBlICE9PSBTdHJpbmcgJiYgX3R5cGUgIT09IE51bWJlciAmJiBfdHlwZSAhPT0gQm9vbGVhbiAmJiAhXy5pc0FycmF5KF90eXBlKSkge1xuICAgICAgICAgIGZpZWxkLmF1dG9mb3JtLl90eXBlID0gX3R5cGUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmllbGQuYXV0b2Zvcm0pIHtcbiAgICAgICAgX3R5cGUgPSBmaWVsZC5hdXRvZm9ybS5fdHlwZTtcbiAgICAgICAgaWYgKF90eXBlICYmIF8uaXNTdHJpbmcoX3R5cGUpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpZWxkLmF1dG9mb3JtLnR5cGUgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIF90eXBlICsgXCIpXCIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udmVydCBmaWVsZCAtPiB0eXBlIGVycm9yXCIsIGZpZWxkLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIG9wdGlvbnNGdW5jdGlvbiA9IGZpZWxkLm9wdGlvbnNGdW5jdGlvbjtcbiAgICAgIHJlZmVyZW5jZV90byA9IGZpZWxkLnJlZmVyZW5jZV90bztcbiAgICAgIGNyZWF0ZUZ1bmN0aW9uID0gZmllbGQuY3JlYXRlRnVuY3Rpb247XG4gICAgICBiZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb247XG4gICAgICBmaWx0ZXJzRnVuY3Rpb24gPSBmaWVsZC5maWx0ZXJzRnVuY3Rpb247XG4gICAgICBpZiAob3B0aW9uc0Z1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihvcHRpb25zRnVuY3Rpb24pKSB7XG4gICAgICAgIGZpZWxkLl9vcHRpb25zRnVuY3Rpb24gPSBvcHRpb25zRnVuY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZlcmVuY2VfdG8gJiYgXy5pc0Z1bmN0aW9uKHJlZmVyZW5jZV90bykpIHtcbiAgICAgICAgZmllbGQuX3JlZmVyZW5jZV90byA9IHJlZmVyZW5jZV90by50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGNyZWF0ZUZ1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihjcmVhdGVGdW5jdGlvbikpIHtcbiAgICAgICAgZmllbGQuX2NyZWF0ZUZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmIChiZWZvcmVPcGVuRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKGJlZm9yZU9wZW5GdW5jdGlvbikpIHtcbiAgICAgICAgZmllbGQuX2JlZm9yZU9wZW5GdW5jdGlvbiA9IGJlZm9yZU9wZW5GdW5jdGlvbi50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlcnNGdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oZmlsdGVyc0Z1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5fZmlsdGVyc0Z1bmN0aW9uID0gZmlsdGVyc0Z1bmN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNGdW5jdGlvbiA9IGZpZWxkLl9vcHRpb25zRnVuY3Rpb24gfHwgZmllbGQub3B0aW9uc0Z1bmN0aW9uO1xuICAgICAgcmVmZXJlbmNlX3RvID0gZmllbGQuX3JlZmVyZW5jZV90bztcbiAgICAgIGNyZWF0ZUZ1bmN0aW9uID0gZmllbGQuX2NyZWF0ZUZ1bmN0aW9uO1xuICAgICAgYmVmb3JlT3BlbkZ1bmN0aW9uID0gZmllbGQuX2JlZm9yZU9wZW5GdW5jdGlvbjtcbiAgICAgIGZpbHRlcnNGdW5jdGlvbiA9IGZpZWxkLl9maWx0ZXJzRnVuY3Rpb24gfHwgZmllbGQuZmlsdGVyc0Z1bmN0aW9uO1xuICAgICAgaWYgKG9wdGlvbnNGdW5jdGlvbiAmJiBfLmlzU3RyaW5nKG9wdGlvbnNGdW5jdGlvbikpIHtcbiAgICAgICAgZmllbGQub3B0aW9uc0Z1bmN0aW9uID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBvcHRpb25zRnVuY3Rpb24gKyBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAocmVmZXJlbmNlX3RvICYmIF8uaXNTdHJpbmcocmVmZXJlbmNlX3RvKSkge1xuICAgICAgICBmaWVsZC5yZWZlcmVuY2VfdG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIHJlZmVyZW5jZV90byArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChjcmVhdGVGdW5jdGlvbiAmJiBfLmlzU3RyaW5nKGNyZWF0ZUZ1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5jcmVhdGVGdW5jdGlvbiA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgY3JlYXRlRnVuY3Rpb24gKyBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAoYmVmb3JlT3BlbkZ1bmN0aW9uICYmIF8uaXNTdHJpbmcoYmVmb3JlT3BlbkZ1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb24gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGJlZm9yZU9wZW5GdW5jdGlvbiArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJzRnVuY3Rpb24gJiYgXy5pc1N0cmluZyhmaWx0ZXJzRnVuY3Rpb24pKSB7XG4gICAgICAgIGZpZWxkLmZpbHRlcnNGdW5jdGlvbiA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgZmlsdGVyc0Z1bmN0aW9uICsgXCIpXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlICYmIF8uaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGZpZWxkLl9kZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVmYXVsdFZhbHVlID0gZmllbGQuX2RlZmF1bHRWYWx1ZTtcbiAgICAgIGlmICghZGVmYXVsdFZhbHVlICYmIF8uaXNTdHJpbmcoZmllbGQuZGVmYXVsdFZhbHVlKSAmJiBmaWVsZC5kZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgJiYgXy5pc1N0cmluZyhkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmllbGQuZGVmYXVsdFZhbHVlID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBkZWZhdWx0VmFsdWUgKyBcIilcIik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGVycm9yIFwiICsgb2JqZWN0Lm5hbWUgKyBcIiAtPiBcIiArIGZpZWxkLm5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBpc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQ7XG4gICAgICBpZiAoaXNfY29tcGFueV9saW1pdGVkICYmIF8uaXNGdW5jdGlvbihpc19jb21wYW55X2xpbWl0ZWQpKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5faXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLl9pc19jb21wYW55X2xpbWl0ZWQ7XG4gICAgICBpZiAoaXNfY29tcGFueV9saW1pdGVkICYmIF8uaXNTdHJpbmcoaXNfY29tcGFueV9saW1pdGVkKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGlzX2NvbXBhbnlfbGltaXRlZCArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGVycm9yIFwiICsgb2JqZWN0Lm5hbWUgKyBcIiAtPiBcIiArIGZpZWxkLm5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIF8uZm9yRWFjaChvYmplY3QubGlzdF92aWV3cywgZnVuY3Rpb24obGlzdF92aWV3LCBrZXkpIHtcblxuICAgIC8qXG4gICAgXHRcdFx06KeG5Zu+6L+H6JmR5Zmo6ZyA6KaB5pSv5oyBZnVuY3Rpb27vvIzlkI7lj7DovazmiJDlrZfnrKbkuLLvvIzliY3lj7BldmFs5oiQ5Ye95pWwXG4gICAgXHRcdFx06K6p6L+H6JmR5Zmo5pSv5oyB5Lik56eNZnVuY3Rpb27mlrnlvI/vvJpcbiAgICBcdFx0XHQxLiDmlbTkuKpmaWx0ZXJz5Li6ZnVuY3Rpb246XG4gICAgXHRcdFx05aaC77yaXG4gICAgXHRcdFx0ZmlsdGVyczogKCktPlxuICAgIFx0XHRcdFx0cmV0dXJuIFtbW1wib2JqZWN0X25hbWVcIixcIj1cIixcInByb2plY3RfaXNzdWVzXCJdLCdvcicsW1wib2JqZWN0X25hbWVcIixcIj1cIixcInRhc2tzXCJdXV1cbiAgICBcdFx0XHQyLiBmaWx0ZXJz5YaF55qEZmlsdGVyLnZhbHVl5Li6ZnVuY3Rpb25cbiAgICBcdFx0XHTlpoLvvJpcbiAgICBcdFx0XHRmaWx0ZXJzOiBbW1wib2JqZWN0X25hbWVcIiwgXCI9XCIsICgpLT5cbiAgICBcdFx0XHRcdHJldHVybiBcInByb2plY3RfaXNzdWVzXCJcbiAgICBcdFx0XHRdXVxuICAgIFx0XHRcdOaIllxuICAgIFx0XHRcdGZpbHRlcnM6IFt7XG4gICAgXHRcdFx0XHRcImZpZWxkXCI6IFwib2JqZWN0X25hbWVcIlxuICAgIFx0XHRcdFx0XCJvcGVyYXRpb25cIjogXCI9XCJcbiAgICBcdFx0XHRcdFwidmFsdWVcIjogKCktPlxuICAgIFx0XHRcdFx0XHRyZXR1cm4gXCJwcm9qZWN0X2lzc3Vlc1wiXG4gICAgXHRcdFx0fV1cbiAgICAgKi9cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGxpc3Rfdmlldy5maWx0ZXJzKSkge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICByZXR1cm4gbGlzdF92aWV3Ll9maWx0ZXJzID0gbGlzdF92aWV3LmZpbHRlcnMudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcobGlzdF92aWV3Ll9maWx0ZXJzKSkge1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICByZXR1cm4gbGlzdF92aWV3LmZpbHRlcnMgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGxpc3Rfdmlldy5fZmlsdGVycyArIFwiKVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF8uZm9yRWFjaChsaXN0X3ZpZXcuZmlsdGVycywgZnVuY3Rpb24oZmlsdGVyLCBfaW5kZXgpIHtcbiAgICAgICAgaWYgKF8uaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT09IDMgJiYgXy5pc0Z1bmN0aW9uKGZpbHRlclsyXSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVyWzJdID0gZmlsdGVyWzJdLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJbM10gPSBcIkZVTkNUSU9OXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPT09IDMgJiYgXy5pc0RhdGUoZmlsdGVyWzJdKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyWzNdID0gXCJEQVRFXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09PSA0ICYmIF8uaXNTdHJpbmcoZmlsdGVyWzJdKSAmJiBmaWx0ZXJbM10gPT09IFwiRlVOQ1RJT05cIikge1xuICAgICAgICAgICAgICBmaWx0ZXJbMl0gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGZpbHRlclsyXSArIFwiKVwiKTtcbiAgICAgICAgICAgICAgZmlsdGVyLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT09IDQgJiYgXy5pc1N0cmluZyhmaWx0ZXJbMl0pICYmIGZpbHRlclszXSA9PT0gXCJEQVRFXCIpIHtcbiAgICAgICAgICAgICAgZmlsdGVyWzJdID0gbmV3IERhdGUoZmlsdGVyWzJdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChmaWx0ZXIpKSB7XG4gICAgICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICAgICAgaWYgKF8uaXNGdW5jdGlvbihmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci52YWx1ZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5fdmFsdWUgPSBmaWx0ZXIudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc0RhdGUoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIudmFsdWUgOiB2b2lkIDApKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuX2lzX2RhdGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXy5pc1N0cmluZyhmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci5fdmFsdWUgOiB2b2lkIDApKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIudmFsdWUgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGZpbHRlci5fdmFsdWUgKyBcIilcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5faXNfZGF0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLnZhbHVlID0gbmV3IERhdGUoZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICBpZiAob2JqZWN0LmZvcm0gJiYgIV8uaXNTdHJpbmcob2JqZWN0LmZvcm0pKSB7XG4gICAgICBvYmplY3QuZm9ybSA9IEpTT04uc3RyaW5naWZ5KG9iamVjdC5mb3JtLCBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsICsgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmIChvYmplY3QuZm9ybSkge1xuICAgICAgb2JqZWN0LmZvcm0gPSBKU09OLnBhcnNlKG9iamVjdC5mb3JtLCBmdW5jdGlvbihrZXksIHZhbCkge1xuICAgICAgICBpZiAoXy5pc1N0cmluZyh2YWwpICYmIHZhbC5zdGFydHNXaXRoKCdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgcmV0dXJuIENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgdmFsICsgXCIpXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgXy5mb3JFYWNoKG9iamVjdC5yZWxhdGVkX2xpc3RzLCBmdW5jdGlvbihyZWxhdGVkT2JqSW5mbykge1xuICAgICAgaWYgKF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pKSB7XG4gICAgICAgIHJldHVybiBfLmZvckVhY2gocmVsYXRlZE9iakluZm8sIGZ1bmN0aW9uKHZhbCwga2V5KSB7XG4gICAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXJzJyAmJiBfLmlzU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWxhdGVkT2JqSW5mb1trZXldID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyB2YWwgKyBcIilcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiZmlsdGVyc19jb2RlXCIsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBfLmZvckVhY2gob2JqZWN0LnJlbGF0ZWRfbGlzdHMsIGZ1bmN0aW9uKHJlbGF0ZWRPYmpJbmZvKSB7XG4gICAgICBpZiAoXy5pc09iamVjdChyZWxhdGVkT2JqSW5mbykpIHtcbiAgICAgICAgcmV0dXJuIF8uZm9yRWFjaChyZWxhdGVkT2JqSW5mbywgZnVuY3Rpb24odmFsLCBrZXkpIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnZmlsdGVycycgJiYgXy5pc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGVkT2JqSW5mb1trZXldID0gdmFsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgXy5mb3JFYWNoKG9iamVjdC5yZWxhdGVkTGlzdCwgZnVuY3Rpb24ocmVsYXRlZE9iakluZm8pIHtcbiAgICAgIGlmIChfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKSkge1xuICAgICAgICByZXR1cm4gXy5mb3JFYWNoKHJlbGF0ZWRPYmpJbmZvLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnZmlsdGVycycgJiYgXy5pc1N0cmluZyh2YWwpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVsYXRlZE9iakluZm9ba2V5XSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgdmFsICsgXCIpXCIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcImZpbHRlcnNfY29kZVwiLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgXy5mb3JFYWNoKG9iamVjdC5yZWxhdGVkTGlzdCwgZnVuY3Rpb24ocmVsYXRlZE9iakluZm8pIHtcbiAgICAgIGlmIChfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKSkge1xuICAgICAgICByZXR1cm4gXy5mb3JFYWNoKHJlbGF0ZWRPYmpJbmZvLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXJzJyAmJiBfLmlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRPYmpJbmZvW2tleV0gPSB2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwiQ3JlYXRvci5Gb3JtdWxhciA9IHt9XG5cbkNyZWF0b3IuRm9ybXVsYXIuUFJFRklYID0gXCJfVkFMVUVTXCJcblxuQ3JlYXRvci5Gb3JtdWxhci5fcHJlcGVuZFByZWZpeEZvckZvcm11bGEgPSAocHJlZml4LGZpZWxkVmFyaWFibGUpLT5cblx0cmVnID0gLyhcXHtbXnt9XSpcXH0pL2c7XG5cblx0cmV2ID0gZmllbGRWYXJpYWJsZS5yZXBsYWNlIHJlZywgKG0sICQxKS0+XG5cdFx0cmV0dXJuIHByZWZpeCArICQxLnJlcGxhY2UoL1xce1xccyovLFwiW1xcXCJcIikucmVwbGFjZSgvXFxzKlxcfS8sXCJcXFwiXVwiKS5yZXBsYWNlKC9cXHMqXFwuXFxzKi9nLFwiXFxcIl1bXFxcIlwiKTtcblxuXHRyZXR1cm4gcmV2XG5cbkNyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhID0gKGZvcm11bGFfc3RyKS0+XG5cdGlmIF8uaXNTdHJpbmcoZm9ybXVsYV9zdHIpICYmIGZvcm11bGFfc3RyLmluZGV4T2YoXCJ7XCIpID4gLTEgJiYgZm9ybXVsYV9zdHIuaW5kZXhPZihcIn1cIikgPiAtMVxuXHRcdHJldHVybiB0cnVlXG5cdHJldHVybiBmYWxzZVxuXG5DcmVhdG9yLkZvcm11bGFyLnJ1biA9IChmb3JtdWxhX3N0ciwgX0NPTlRFWFQsIG9wdGlvbnMpLT5cblx0aWYgZm9ybXVsYV9zdHIgJiYgXy5pc1N0cmluZyhmb3JtdWxhX3N0cilcblxuXHRcdGlmICFfLmlzQm9vbGVhbihvcHRpb25zPy5leHRlbmQpXG5cdFx0XHRleHRlbmQgPSB0cnVlXG5cblx0XHRfVkFMVUVTID0ge31cblx0XHRfVkFMVUVTID0gXy5leHRlbmQoX1ZBTFVFUywgX0NPTlRFWFQpXG5cdFx0aWYgZXh0ZW5kXG5cdFx0XHRfVkFMVUVTID0gXy5leHRlbmQoX1ZBTFVFUywgQ3JlYXRvci5nZXRVc2VyQ29udGV4dChvcHRpb25zPy51c2VySWQsIG9wdGlvbnM/LnNwYWNlSWQpKVxuXHRcdGZvcm11bGFfc3RyID0gQ3JlYXRvci5Gb3JtdWxhci5fcHJlcGVuZFByZWZpeEZvckZvcm11bGEoXCJ0aGlzXCIsIGZvcm11bGFfc3RyKVxuXG5cdFx0dHJ5XG5cdFx0XHRkYXRhID0gQ3JlYXRvci5ldmFsSW5Db250ZXh0KGZvcm11bGFfc3RyLCBfVkFMVUVTKSAgICMg5q2k5aSE5LiN6IO955Sod2luZG93LmV2YWwg77yM5Lya5a+86Ie05Y+Y6YeP5L2c55So5Z+f5byC5bi4XG5cdFx0XHRyZXR1cm4gZGF0YVxuXHRcdGNhdGNoIGVcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJDcmVhdG9yLkZvcm11bGFyLnJ1bjogI3tmb3JtdWxhX3N0cn1cIiwgZSlcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHR0b2FzdHI/LmVycm9yKFwi5YWs5byP5omn6KGM5Ye66ZSZ5LqG77yM6K+35qOA5p+l5YWs5byP6YWN572u5piv5ZCm5q2j56Gu77yBXCIpXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yIDUwMCwgXCJDcmVhdG9yLkZvcm11bGFyLnJ1bjogI3tmb3JtdWxhX3N0cn0je2V9XCJcblxuXHRyZXR1cm4gZm9ybXVsYV9zdHJcbiIsIkNyZWF0b3IuRm9ybXVsYXIgPSB7fTtcblxuQ3JlYXRvci5Gb3JtdWxhci5QUkVGSVggPSBcIl9WQUxVRVNcIjtcblxuQ3JlYXRvci5Gb3JtdWxhci5fcHJlcGVuZFByZWZpeEZvckZvcm11bGEgPSBmdW5jdGlvbihwcmVmaXgsIGZpZWxkVmFyaWFibGUpIHtcbiAgdmFyIHJlZywgcmV2O1xuICByZWcgPSAvKFxce1tee31dKlxcfSkvZztcbiAgcmV2ID0gZmllbGRWYXJpYWJsZS5yZXBsYWNlKHJlZywgZnVuY3Rpb24obSwgJDEpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJDEucmVwbGFjZSgvXFx7XFxzKi8sIFwiW1xcXCJcIikucmVwbGFjZSgvXFxzKlxcfS8sIFwiXFxcIl1cIikucmVwbGFjZSgvXFxzKlxcLlxccyovZywgXCJcXFwiXVtcXFwiXCIpO1xuICB9KTtcbiAgcmV0dXJuIHJldjtcbn07XG5cbkNyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhID0gZnVuY3Rpb24oZm9ybXVsYV9zdHIpIHtcbiAgaWYgKF8uaXNTdHJpbmcoZm9ybXVsYV9zdHIpICYmIGZvcm11bGFfc3RyLmluZGV4T2YoXCJ7XCIpID4gLTEgJiYgZm9ybXVsYV9zdHIuaW5kZXhPZihcIn1cIikgPiAtMSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbkNyZWF0b3IuRm9ybXVsYXIucnVuID0gZnVuY3Rpb24oZm9ybXVsYV9zdHIsIF9DT05URVhULCBvcHRpb25zKSB7XG4gIHZhciBfVkFMVUVTLCBkYXRhLCBlLCBleHRlbmQ7XG4gIGlmIChmb3JtdWxhX3N0ciAmJiBfLmlzU3RyaW5nKGZvcm11bGFfc3RyKSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ob3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5leHRlbmQgOiB2b2lkIDApKSB7XG4gICAgICBleHRlbmQgPSB0cnVlO1xuICAgIH1cbiAgICBfVkFMVUVTID0ge307XG4gICAgX1ZBTFVFUyA9IF8uZXh0ZW5kKF9WQUxVRVMsIF9DT05URVhUKTtcbiAgICBpZiAoZXh0ZW5kKSB7XG4gICAgICBfVkFMVUVTID0gXy5leHRlbmQoX1ZBTFVFUywgQ3JlYXRvci5nZXRVc2VyQ29udGV4dChvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnVzZXJJZCA6IHZvaWQgMCwgb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucy5zcGFjZUlkIDogdm9pZCAwKSk7XG4gICAgfVxuICAgIGZvcm11bGFfc3RyID0gQ3JlYXRvci5Gb3JtdWxhci5fcHJlcGVuZFByZWZpeEZvckZvcm11bGEoXCJ0aGlzXCIsIGZvcm11bGFfc3RyKTtcbiAgICB0cnkge1xuICAgICAgZGF0YSA9IENyZWF0b3IuZXZhbEluQ29udGV4dChmb3JtdWxhX3N0ciwgX1ZBTFVFUyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZSA9IGVycm9yO1xuICAgICAgY29uc29sZS5lcnJvcihcIkNyZWF0b3IuRm9ybXVsYXIucnVuOiBcIiArIGZvcm11bGFfc3RyLCBlKTtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2FzdHIgIT09IFwidW5kZWZpbmVkXCIgJiYgdG9hc3RyICE9PSBudWxsKSB7XG4gICAgICAgICAgdG9hc3RyLmVycm9yKFwi5YWs5byP5omn6KGM5Ye66ZSZ5LqG77yM6K+35qOA5p+l5YWs5byP6YWN572u5piv5ZCm5q2j56Gu77yBXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDUwMCwgXCJDcmVhdG9yLkZvcm11bGFyLnJ1bjogXCIgKyBmb3JtdWxhX3N0ciArIGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm9ybXVsYV9zdHI7XG59O1xuIiwiY2xvbmUgPSByZXF1aXJlKCdjbG9uZScpO1xuQ3JlYXRvci5vYmplY3RzQnlOYW1lID0ge30gICAjIOatpOWvueixoeWPquiDveWcqOehruS/neaJgOaciU9iamVjdOWIneWni+WMluWujOaIkOWQjuiwg+eUqO+8jCDlkKbliJnojrflj5bliLDnmoRvYmplY3TkuI3lhahcblxuQ3JlYXRvci5mb3JtYXRPYmplY3ROYW1lID0gKG9iamVjdF9uYW1lKS0+XG5cdGlmIG9iamVjdF9uYW1lLnN0YXJ0c1dpdGgoJ2Nmcy5maWxlcy4nKVxuXHRcdG9iamVjdF9uYW1lID0gb2JqZWN0X25hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcLicsICdnJyksICdfJylcblx0cmV0dXJuIG9iamVjdF9uYW1lXG5cbkNyZWF0b3IuT2JqZWN0ID0gKG9wdGlvbnMpLT5cblx0X2Jhc2VPYmplY3QgPSBDcmVhdG9yLmJhc2VPYmplY3Rcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0X2Jhc2VPYmplY3QgPSB7YWN0aW9uczogQ3JlYXRvci5iYXNlT2JqZWN0LmFjdGlvbnMgLCBmaWVsZHM6IHt9LCB0cmlnZ2Vyczoge30sIHBlcm1pc3Npb25fc2V0OiB7fX1cblx0c2VsZiA9IHRoaXNcblx0aWYgKCFvcHRpb25zLm5hbWUpXG5cdFx0Y29uc29sZS5lcnJvcihvcHRpb25zKVxuXHRcdHRocm93IG5ldyBFcnJvcignQ3JlYXRvci5PYmplY3Qgb3B0aW9ucyBtdXN0IHNwZWNpZnkgbmFtZScpO1xuXG5cdHNlbGYuX2lkID0gb3B0aW9ucy5faWQgfHwgb3B0aW9ucy5uYW1lXG5cdHNlbGYuc3BhY2UgPSBvcHRpb25zLnNwYWNlXG5cdHNlbGYubmFtZSA9IG9wdGlvbnMubmFtZVxuXHRzZWxmLmxhYmVsID0gb3B0aW9ucy5sYWJlbFxuXHRzZWxmLmljb24gPSBvcHRpb25zLmljb25cblx0c2VsZi5kZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb25cblx0c2VsZi5pc192aWV3ID0gb3B0aW9ucy5pc192aWV3XG5cdHNlbGYuZm9ybSA9IG9wdGlvbnMuZm9ybVxuXHRzZWxmLnJlbGF0ZWRMaXN0ID0gb3B0aW9ucy5yZWxhdGVkTGlzdFxuXHRzZWxmLnJlbGF0ZWRfbGlzdHMgPSBvcHRpb25zLnJlbGF0ZWRfbGlzdHNcblx0c2VsZi5oYXNJbXBvcnRUZW1wbGF0ZXMgPSBvcHRpb25zLmhhc0ltcG9ydFRlbXBsYXRlc1xuXHRzZWxmLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gfHwgMS4wXG5cdGlmICFfLmlzQm9vbGVhbihvcHRpb25zLmlzX2VuYWJsZSkgIHx8IG9wdGlvbnMuaXNfZW5hYmxlID09IHRydWVcblx0XHRzZWxmLmlzX2VuYWJsZSA9IHRydWVcblx0ZWxzZVxuXHRcdHNlbGYuaXNfZW5hYmxlID0gZmFsc2Vcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgXy5oYXMob3B0aW9ucywgJ2FsbG93X2N1c3RvbUFjdGlvbnMnKVxuXHRcdFx0c2VsZi5hbGxvd19jdXN0b21BY3Rpb25zID0gb3B0aW9ucy5hbGxvd19jdXN0b21BY3Rpb25zXG5cdFx0aWYgXy5oYXMob3B0aW9ucywgJ2V4Y2x1ZGVfYWN0aW9ucycpXG5cdFx0XHRzZWxmLmV4Y2x1ZGVfYWN0aW9ucyA9IG9wdGlvbnMuZXhjbHVkZV9hY3Rpb25zXG5cdFx0aWYgXy5oYXMob3B0aW9ucywgJ2FsbG93X3JlbGF0ZWRMaXN0Jylcblx0XHRcdHNlbGYuYWxsb3dfcmVsYXRlZExpc3QgPSBvcHRpb25zLmFsbG93X3JlbGF0ZWRMaXN0XG5cdHNlbGYuZW5hYmxlX3NlYXJjaCA9IG9wdGlvbnMuZW5hYmxlX3NlYXJjaFxuXHRzZWxmLmVuYWJsZV9maWxlcyA9IG9wdGlvbnMuZW5hYmxlX2ZpbGVzXG5cdHNlbGYuZW5hYmxlX3Rhc2tzID0gb3B0aW9ucy5lbmFibGVfdGFza3Ncblx0c2VsZi5lbmFibGVfbm90ZXMgPSBvcHRpb25zLmVuYWJsZV9ub3Rlc1xuXHRzZWxmLmVuYWJsZV9hdWRpdCA9IG9wdGlvbnMuZW5hYmxlX2F1ZGl0XG5cdHNlbGYuZW5hYmxlX2V2ZW50cyA9IG9wdGlvbnMuZW5hYmxlX2V2ZW50c1xuXHRpZiBvcHRpb25zLnBhZ2luZ1xuXHRcdHNlbGYucGFnaW5nID0gb3B0aW9ucy5wYWdpbmdcblx0c2VsZi5oaWRkZW4gPSBvcHRpb25zLmhpZGRlblxuXHRzZWxmLmVuYWJsZV9hcGkgPSAob3B0aW9ucy5lbmFibGVfYXBpID09IHVuZGVmaW5lZCkgb3Igb3B0aW9ucy5lbmFibGVfYXBpXG5cdHNlbGYuY3VzdG9tID0gb3B0aW9ucy5jdXN0b21cblx0c2VsZi5lbmFibGVfc2hhcmUgPSBvcHRpb25zLmVuYWJsZV9zaGFyZVxuXHRzZWxmLmVuYWJsZV9pbnN0YW5jZXMgPSBvcHRpb25zLmVuYWJsZV9pbnN0YW5jZXNcblx0c2VsZi5lbmFibGVfcHJvY2VzcyA9IG9wdGlvbnMuZW5hYmxlX3Byb2Nlc3Ncblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZShTZXNzaW9uLmdldChcInNwYWNlSWRcIikpXG5cdFx0XHRzZWxmLmVuYWJsZV90cmVlID0gZmFsc2Vcblx0XHRlbHNlXG5cdFx0XHRzZWxmLmVuYWJsZV90cmVlID0gb3B0aW9ucy5lbmFibGVfdHJlZVxuXHRcdFx0c2VsZi5zaWRlYmFyID0gXy5jbG9uZShvcHRpb25zLnNpZGViYXIpXG5cdGVsc2Vcblx0XHRzZWxmLnNpZGViYXIgPSBfLmNsb25lKG9wdGlvbnMuc2lkZWJhcilcblx0XHRzZWxmLmVuYWJsZV90cmVlID0gb3B0aW9ucy5lbmFibGVfdHJlZVxuXHRzZWxmLm9wZW5fd2luZG93ID0gb3B0aW9ucy5vcGVuX3dpbmRvd1xuXHRzZWxmLmZpbHRlcl9jb21wYW55ID0gb3B0aW9ucy5maWx0ZXJfY29tcGFueVxuXHRzZWxmLmNhbGVuZGFyID0gXy5jbG9uZShvcHRpb25zLmNhbGVuZGFyKVxuXHRzZWxmLmVuYWJsZV9jaGF0dGVyID0gb3B0aW9ucy5lbmFibGVfY2hhdHRlclxuXHRzZWxmLmVuYWJsZV90cmFzaCA9IG9wdGlvbnMuZW5hYmxlX3RyYXNoXG5cdHNlbGYuZW5hYmxlX3NwYWNlX2dsb2JhbCA9IG9wdGlvbnMuZW5hYmxlX3NwYWNlX2dsb2JhbFxuXHRzZWxmLmVuYWJsZV9hcHByb3ZhbHMgPSBvcHRpb25zLmVuYWJsZV9hcHByb3ZhbHNcblx0c2VsZi5lbmFibGVfZm9sbG93ID0gb3B0aW9ucy5lbmFibGVfZm9sbG93XG5cdHNlbGYuZW5hYmxlX3dvcmtmbG93ID0gb3B0aW9ucy5lbmFibGVfd29ya2Zsb3dcblx0c2VsZi5lbmFibGVfaW5saW5lX2VkaXQgPSBvcHRpb25zLmVuYWJsZV9pbmxpbmVfZWRpdFxuXHRzZWxmLmRldGFpbHMgPSBvcHRpb25zLmRldGFpbHNcblx0c2VsZi5tYXN0ZXJzID0gb3B0aW9ucy5tYXN0ZXJzXG5cdHNlbGYubG9va3VwX2RldGFpbHMgPSBvcHRpb25zLmxvb2t1cF9kZXRhaWxzXG5cdGlmIF8uaGFzKG9wdGlvbnMsICdpbl9kZXZlbG9wbWVudCcpXG5cdFx0c2VsZi5pbl9kZXZlbG9wbWVudCA9IG9wdGlvbnMuaW5fZGV2ZWxvcG1lbnRcblx0c2VsZi5pZEZpZWxkTmFtZSA9ICdfaWQnXG5cdGlmIG9wdGlvbnMuZGF0YWJhc2VfbmFtZVxuXHRcdHNlbGYuZGF0YWJhc2VfbmFtZSA9IG9wdGlvbnMuZGF0YWJhc2VfbmFtZVxuXHRpZiAoIW9wdGlvbnMuZmllbGRzKVxuXHRcdGNvbnNvbGUuZXJyb3Iob3B0aW9ucylcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NyZWF0b3IuT2JqZWN0IG9wdGlvbnMgbXVzdCBzcGVjaWZ5IGZpZWxkcycpO1xuXG5cdHNlbGYuZmllbGRzID0gY2xvbmUob3B0aW9ucy5maWVsZHMpXG5cblx0Xy5lYWNoIHNlbGYuZmllbGRzLCAoZmllbGQsIGZpZWxkX25hbWUpLT5cblx0XHRpZiBmaWVsZC5pc19uYW1lXG5cdFx0XHRzZWxmLk5BTUVfRklFTERfS0VZID0gZmllbGRfbmFtZVxuXHRcdGVsc2UgaWYgZmllbGRfbmFtZSA9PSAnbmFtZScgJiYgIXNlbGYuTkFNRV9GSUVMRF9LRVlcblx0XHRcdHNlbGYuTkFNRV9GSUVMRF9LRVkgPSBmaWVsZF9uYW1lXG5cdFx0aWYgZmllbGQucHJpbWFyeVxuXHRcdFx0c2VsZi5pZEZpZWxkTmFtZSA9IGZpZWxkX25hbWVcblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIENyZWF0b3IuaXNDbG91ZEFkbWluU3BhY2UoU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpKVxuXHRcdFx0XHRpZiBmaWVsZF9uYW1lID09ICdzcGFjZSdcblx0XHRcdFx0XHRmaWVsZC5maWx0ZXJhYmxlID0gdHJ1ZVxuXHRcdFx0XHRcdGZpZWxkLmhpZGRlbiA9IGZhbHNlXG5cblx0aWYgIW9wdGlvbnMuZGF0YWJhc2VfbmFtZSB8fCBvcHRpb25zLmRhdGFiYXNlX25hbWUgPT0gJ21ldGVvci1tb25nbydcblx0XHRfLmVhY2ggX2Jhc2VPYmplY3QuZmllbGRzLCAoZmllbGQsIGZpZWxkX25hbWUpLT5cblx0XHRcdGlmICFzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXVxuXHRcdFx0XHRzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSA9IHt9XG5cdFx0XHRzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSA9IF8uZXh0ZW5kKF8uY2xvbmUoZmllbGQpLCBzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSlcblxuXHRfLmVhY2ggc2VsZi5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuXHRcdGlmIGZpZWxkLnR5cGUgPT0gJ2F1dG9udW1iZXInXG5cdFx0XHRmaWVsZC5yZWFkb25seSA9IHRydWVcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2Zvcm11bGEnXG5cdFx0XHRmaWVsZC5yZWFkb25seSA9IHRydWVcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3N1bW1hcnknXG5cdFx0XHRmaWVsZC5yZWFkb25seSA9IHRydWVcblxuXHRzZWxmLmxpc3Rfdmlld3MgPSB7fVxuXHRkZWZhdWx0VmlldyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcoc2VsZi5uYW1lKVxuXHRfLmVhY2ggb3B0aW9ucy5saXN0X3ZpZXdzLCAoaXRlbSwgaXRlbV9uYW1lKS0+XG5cdFx0b2l0ZW0gPSBDcmVhdG9yLmNvbnZlcnRMaXN0VmlldyhkZWZhdWx0VmlldywgaXRlbSwgaXRlbV9uYW1lKVxuXHRcdHNlbGYubGlzdF92aWV3c1tpdGVtX25hbWVdID0gb2l0ZW1cblxuXHRzZWxmLnRyaWdnZXJzID0gXy5jbG9uZShfYmFzZU9iamVjdC50cmlnZ2Vycylcblx0Xy5lYWNoIG9wdGlvbnMudHJpZ2dlcnMsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0XHRpZiAhc2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdXG5cdFx0XHRzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0gPSB7fVxuXHRcdHNlbGYudHJpZ2dlcnNbaXRlbV9uYW1lXS5uYW1lID0gaXRlbV9uYW1lXG5cdFx0c2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0pLCBpdGVtKVxuXG5cdHNlbGYuYWN0aW9ucyA9IF8uY2xvbmUoX2Jhc2VPYmplY3QuYWN0aW9ucylcblx0Xy5lYWNoIG9wdGlvbnMuYWN0aW9ucywgKGl0ZW0sIGl0ZW1fbmFtZSktPlxuXHRcdGlmICFzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXVxuXHRcdFx0c2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0gPSB7fVxuXHRcdGNvcHlJdGVtID0gXy5jbG9uZShzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSlcblx0XHRkZWxldGUgc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0gI+WFiOWIoOmZpOebuOWFs+WxnuaAp+WGjemHjeW7uuaJjeiDveS/neivgeWQjue7remHjeWkjeWumuS5ieeahOWxnuaAp+mhuuW6j+eUn+aViFxuXHRcdHNlbGYuYWN0aW9uc1tpdGVtX25hbWVdID0gXy5leHRlbmQoY29weUl0ZW0sIGl0ZW0pXG5cdFx0c2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0ub2JqZWN0X25hbWUgPSBzZWxmLm5hbWVcblxuXHRfLmVhY2ggc2VsZi5hY3Rpb25zLCAoaXRlbSwgaXRlbV9uYW1lKS0+XG5cdFx0aXRlbS5uYW1lID0gaXRlbV9uYW1lXG5cblx0c2VsZi5yZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldE9iamVjdFJlbGF0ZWRzKHNlbGYubmFtZSlcblxuXHQjIOiuqeaJgOaciW9iamVjdOm7mOiupOacieaJgOaciWxpc3Rfdmlld3MvYWN0aW9ucy9yZWxhdGVkX29iamVjdHMvcmVhZGFibGVfZmllbGRzL2VkaXRhYmxlX2ZpZWxkc+WujOaVtOadg+mZkO+8jOivpeadg+mZkOWPr+iDveiiq+aVsOaNruW6k+S4reiuvue9rueahGFkbWluL3VzZXLmnYPpmZDopobnm5Zcblx0c2VsZi5wZXJtaXNzaW9uX3NldCA9IF8uY2xvbmUoX2Jhc2VPYmplY3QucGVybWlzc2lvbl9zZXQpXG5cdCMgZGVmYXVsdExpc3RWaWV3cyA9IF8ua2V5cyhzZWxmLmxpc3Rfdmlld3MpXG5cdCMgZGVmYXVsdEFjdGlvbnMgPSBfLmtleXMoc2VsZi5hY3Rpb25zKVxuXHQjIGRlZmF1bHRSZWxhdGVkT2JqZWN0cyA9IF8ucGx1Y2soc2VsZi5yZWxhdGVkX29iamVjdHMsXCJvYmplY3RfbmFtZVwiKVxuXHQjIGRlZmF1bHRSZWFkYWJsZUZpZWxkcyA9IFtdXG5cdCMgZGVmYXVsdEVkaXRhYmxlRmllbGRzID0gW11cblx0IyBfLmVhY2ggc2VsZi5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuXHQjIFx0aWYgIShmaWVsZC5oaWRkZW4pICAgICMyMzEgb21pdOWtl+auteaUr+aMgeWcqOmdnue8lui+kemhtemdouafpeeciywg5Zug5q2k5Yig6Zmk5LqG5q2k5aSE5a+5b21pdOeahOWIpOaWrVxuXHQjIFx0XHRkZWZhdWx0UmVhZGFibGVGaWVsZHMucHVzaCBmaWVsZF9uYW1lXG5cdCMgXHRcdGlmICFmaWVsZC5yZWFkb25seVxuXHQjIFx0XHRcdGRlZmF1bHRFZGl0YWJsZUZpZWxkcy5wdXNoIGZpZWxkX25hbWVcblxuXHQjIF8uZWFjaCBzZWxmLnBlcm1pc3Npb25fc2V0LCAoaXRlbSwgaXRlbV9uYW1lKS0+XG5cdCMgXHRpZiBpdGVtX25hbWUgPT0gXCJub25lXCJcblx0IyBcdFx0cmV0dXJuXG5cdCMgXHRpZiBzZWxmLmxpc3Rfdmlld3Ncblx0IyBcdFx0c2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdLmxpc3Rfdmlld3MgPSBkZWZhdWx0TGlzdFZpZXdzXG5cdCMgXHRpZiBzZWxmLmFjdGlvbnNcblx0IyBcdFx0c2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdLmFjdGlvbnMgPSBkZWZhdWx0QWN0aW9uc1xuXHQjIFx0aWYgc2VsZi5yZWxhdGVkX29iamVjdHNcblx0IyBcdFx0c2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdLnJlbGF0ZWRfb2JqZWN0cyA9IGRlZmF1bHRSZWxhdGVkT2JqZWN0c1xuXHQjIFx0aWYgc2VsZi5maWVsZHNcblx0IyBcdFx0c2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdLnJlYWRhYmxlX2ZpZWxkcyA9IGRlZmF1bHRSZWFkYWJsZUZpZWxkc1xuXHQjIFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0uZWRpdGFibGVfZmllbGRzID0gZGVmYXVsdEVkaXRhYmxlRmllbGRzXG5cdHVubGVzcyBvcHRpb25zLnBlcm1pc3Npb25fc2V0XG5cdFx0b3B0aW9ucy5wZXJtaXNzaW9uX3NldCA9IHt9XG5cdGlmICEob3B0aW9ucy5wZXJtaXNzaW9uX3NldD8uYWRtaW4pXG5cdFx0b3B0aW9ucy5wZXJtaXNzaW9uX3NldC5hZG1pbiA9IF8uY2xvbmUoc2VsZi5wZXJtaXNzaW9uX3NldFtcImFkbWluXCJdKVxuXHRpZiAhKG9wdGlvbnMucGVybWlzc2lvbl9zZXQ/LnVzZXIpXG5cdFx0b3B0aW9ucy5wZXJtaXNzaW9uX3NldC51c2VyID0gXy5jbG9uZShzZWxmLnBlcm1pc3Npb25fc2V0W1widXNlclwiXSlcblx0Xy5lYWNoIG9wdGlvbnMucGVybWlzc2lvbl9zZXQsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0XHRpZiAhc2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdXG5cdFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0gPSB7fVxuXHRcdHNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXSA9IF8uZXh0ZW5kKF8uY2xvbmUoc2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdKSwgaXRlbSlcblxuXHQjIOWJjeerr+agueaNrnBlcm1pc3Npb25z5pS55YaZZmllbGTnm7jlhbPlsZ7mgKfvvIzlkI7nq6/lj6ropoHotbDpu5jorqTlsZ7mgKflsLHooYzvvIzkuI3pnIDopoHmlLnlhplcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0cGVybWlzc2lvbnMgPSBvcHRpb25zLnBlcm1pc3Npb25zXG5cdFx0ZGlzYWJsZWRfbGlzdF92aWV3cyA9IHBlcm1pc3Npb25zPy5kaXNhYmxlZF9saXN0X3ZpZXdzXG5cdFx0aWYgZGlzYWJsZWRfbGlzdF92aWV3cz8ubGVuZ3RoXG5cdFx0XHRkZWZhdWx0TGlzdFZpZXdJZCA9IG9wdGlvbnMubGlzdF92aWV3cz8uYWxsPy5faWRcblx0XHRcdGlmIGRlZmF1bHRMaXN0Vmlld0lkXG5cdFx0XHRcdCMg5oqK6KeG5Zu+5p2D6ZmQ6YWN572u5Lit6buY6K6k55qEYWxs6KeG5Zu+aWTovazmjaLmiJBhbGzlhbPplK7lrZdcblx0XHRcdFx0cGVybWlzc2lvbnMuZGlzYWJsZWRfbGlzdF92aWV3cyA9IF8ubWFwIGRpc2FibGVkX2xpc3Rfdmlld3MsIChsaXN0X3ZpZXdfaXRlbSkgLT5cblx0XHRcdFx0XHRyZXR1cm4gaWYgZGVmYXVsdExpc3RWaWV3SWQgPT0gbGlzdF92aWV3X2l0ZW0gdGhlbiBcImFsbFwiIGVsc2UgbGlzdF92aWV3X2l0ZW1cblx0XHRzZWxmLnBlcm1pc3Npb25zID0gbmV3IFJlYWN0aXZlVmFyKHBlcm1pc3Npb25zKVxuI1x0XHRfLmVhY2ggc2VsZi5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuI1x0XHRcdGlmIGZpZWxkXG4jXHRcdFx0XHRpZiBfLmluZGV4T2YocGVybWlzc2lvbnM/LnVucmVhZGFibGVfZmllbGRzLCBmaWVsZF9uYW1lKSA8IDBcbiNcdFx0XHRcdFx0aWYgZmllbGQuaGlkZGVuXG4jXHRcdFx0XHRcdFx0cmV0dXJuXG4jXHRcdFx0XHRcdGlmIF8uaW5kZXhPZihwZXJtaXNzaW9ucz8udW5lZGl0YWJsZV9maWVsZHMsIGZpZWxkX25hbWUpID4gLTFcbiNcdFx0XHRcdFx0XHRmaWVsZC5yZWFkb25seSA9IHRydWVcbiNcdFx0XHRcdFx0XHRmaWVsZC5kaXNhYmxlZCA9IHRydWVcbiNcdFx0XHRcdFx0XHQjIOW9k+WPquivu+aXtu+8jOWmguaenOS4jeWOu+aOieW/heWhq+Wtl+aute+8jGF1dG9mb3Jt5piv5Lya5oql6ZSZ55qEXG4jXHRcdFx0XHRcdFx0ZmllbGQucmVxdWlyZWQgPSBmYWxzZVxuI1x0XHRcdFx0ZWxzZVxuI1x0XHRcdFx0XHRmaWVsZC5oaWRkZW4gPSB0cnVlXG5cdGVsc2Vcblx0XHRzZWxmLnBlcm1pc3Npb25zID0gbnVsbFxuXG5cdF9kYiA9IENyZWF0b3IuY3JlYXRlQ29sbGVjdGlvbihvcHRpb25zKVxuXG5cdENyZWF0b3IuQ29sbGVjdGlvbnNbX2RiLl9uYW1lXSA9IF9kYlxuXG5cdHNlbGYuZGIgPSBfZGJcblxuXHRzZWxmLl9jb2xsZWN0aW9uX25hbWUgPSBfZGIuX25hbWVcblxuXHRzY2hlbWEgPSBDcmVhdG9yLmdldE9iamVjdFNjaGVtYShzZWxmKVxuXHRzZWxmLnNjaGVtYSA9IG5ldyBTaW1wbGVTY2hlbWEoc2NoZW1hKVxuXHRpZiBzZWxmLm5hbWUgIT0gXCJ1c2Vyc1wiIGFuZCBzZWxmLm5hbWUgIT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiICYmICFzZWxmLmlzX3ZpZXcgJiYgIV8uY29udGFpbnMoW1wiZmxvd3NcIiwgXCJmb3Jtc1wiLCBcImluc3RhbmNlc1wiLCBcIm9yZ2FuaXphdGlvbnNcIiwgXCJhY3Rpb25fZmllbGRfdXBkYXRlc1wiLCBcIm9iamVjdF9saXN0dmlld3NcIl0sIHNlbGYubmFtZSlcblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdF9kYi5hdHRhY2hTY2hlbWEoc2VsZi5zY2hlbWEsIHtyZXBsYWNlOiB0cnVlfSlcblx0XHRlbHNlXG5cdFx0XHRfZGIuYXR0YWNoU2NoZW1hKHNlbGYuc2NoZW1hLCB7cmVwbGFjZTogdHJ1ZX0pXG5cdGlmIHNlbGYubmFtZSA9PSBcInVzZXJzXCJcblx0XHRfZGIuX3NpbXBsZVNjaGVtYSA9IHNlbGYuc2NoZW1hXG5cblx0aWYgXy5jb250YWlucyhbXCJmbG93c1wiLCBcImZvcm1zXCIsIFwiaW5zdGFuY2VzXCIsIFwib3JnYW5pemF0aW9uc1wiXSwgc2VsZi5uYW1lKVxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0X2RiLmF0dGFjaFNjaGVtYShzZWxmLnNjaGVtYSwge3JlcGxhY2U6IHRydWV9KVxuXG5cdENyZWF0b3Iub2JqZWN0c0J5TmFtZVtzZWxmLl9jb2xsZWN0aW9uX25hbWVdID0gc2VsZlxuXG5cdHJldHVybiBzZWxmXG5cbiMgQ3JlYXRvci5PYmplY3QucHJvdG90eXBlLmkxOG4gPSAoKS0+XG4jIFx0IyBzZXQgb2JqZWN0IGxhYmVsXG4jIFx0c2VsZiA9IHRoaXNcblxuIyBcdGtleSA9IHNlbGYubmFtZVxuIyBcdGlmIHQoa2V5KSA9PSBrZXlcbiMgXHRcdGlmICFzZWxmLmxhYmVsXG4jIFx0XHRcdHNlbGYubGFiZWwgPSBzZWxmLm5hbWVcbiMgXHRlbHNlXG4jIFx0XHRzZWxmLmxhYmVsID0gdChrZXkpXG5cbiMgXHQjIHNldCBmaWVsZCBsYWJlbHNcbiMgXHRfLmVhY2ggc2VsZi5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuIyBcdFx0ZmtleSA9IHNlbGYubmFtZSArIFwiX1wiICsgZmllbGRfbmFtZVxuIyBcdFx0aWYgdChma2V5KSA9PSBma2V5XG4jIFx0XHRcdGlmICFmaWVsZC5sYWJlbFxuIyBcdFx0XHRcdGZpZWxkLmxhYmVsID0gZmllbGRfbmFtZVxuIyBcdFx0ZWxzZVxuIyBcdFx0XHRmaWVsZC5sYWJlbCA9IHQoZmtleSlcbiMgXHRcdHNlbGYuc2NoZW1hPy5fc2NoZW1hP1tmaWVsZF9uYW1lXT8ubGFiZWwgPSBmaWVsZC5sYWJlbFxuXG5cbiMgXHQjIHNldCBsaXN0dmlldyBsYWJlbHNcbiMgXHRfLmVhY2ggc2VsZi5saXN0X3ZpZXdzLCAoaXRlbSwgaXRlbV9uYW1lKS0+XG4jIFx0XHRpMThuX2tleSA9IHNlbGYubmFtZSArIFwiX2xpc3R2aWV3X1wiICsgaXRlbV9uYW1lXG4jIFx0XHRpZiB0KGkxOG5fa2V5KSA9PSBpMThuX2tleVxuIyBcdFx0XHRpZiAhaXRlbS5sYWJlbFxuIyBcdFx0XHRcdGl0ZW0ubGFiZWwgPSBpdGVtX25hbWVcbiMgXHRcdGVsc2VcbiMgXHRcdFx0aXRlbS5sYWJlbCA9IHQoaTE4bl9rZXkpXG5cblxuQ3JlYXRvci5nZXRPYmplY3RPRGF0YVJvdXRlclByZWZpeCA9IChvYmplY3QpLT5cblx0cmV0dXJuIFwiL2FwaS9vZGF0YS92NFwiXG5cdCMgaWYgb2JqZWN0XG5cdCMgXHRpZiAhb2JqZWN0LmRhdGFiYXNlX25hbWUgfHwgb2JqZWN0LmRhdGFiYXNlX25hbWUgPT0gJ21ldGVvci1tb25nbydcblx0IyBcdFx0cmV0dXJuIFwiL2FwaS9vZGF0YS92NFwiXG5cdCMgXHRlbHNlXG5cdCMgXHRcdHJldHVybiBcIi9hcGkvb2RhdGEvI3tvYmplY3QuZGF0YWJhc2VfbmFtZX1cIlxuXG4jIGlmIE1ldGVvci5pc0NsaWVudFxuXG4jIFx0TWV0ZW9yLnN0YXJ0dXAgLT5cbiMgXHRcdFRyYWNrZXIuYXV0b3J1biAtPlxuIyBcdFx0XHRpZiBTZXNzaW9uLmdldChcInN0ZWVkb3MtbG9jYWxlXCIpICYmIENyZWF0b3IuYm9vdHN0cmFwTG9hZGVkPy5nZXQoKVxuIyBcdFx0XHRcdF8uZWFjaCBDcmVhdG9yLm9iamVjdHNCeU5hbWUsIChvYmplY3QsIG9iamVjdF9uYW1lKS0+XG4jIFx0XHRcdFx0XHRvYmplY3QuaTE4bigpXG5cbk1ldGVvci5zdGFydHVwIC0+XG5cdGlmICFDcmVhdG9yLmJvb3RzdHJhcExvYWRlZCAmJiBDcmVhdG9yLk9iamVjdHNcblx0XHRfLmVhY2ggQ3JlYXRvci5PYmplY3RzLCAob2JqZWN0KS0+XG5cdFx0XHRuZXcgQ3JlYXRvci5PYmplY3Qob2JqZWN0KVxuXG4iLCJ2YXIgY2xvbmU7XG5cbmNsb25lID0gcmVxdWlyZSgnY2xvbmUnKTtcblxuQ3JlYXRvci5vYmplY3RzQnlOYW1lID0ge307XG5cbkNyZWF0b3IuZm9ybWF0T2JqZWN0TmFtZSA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIGlmIChvYmplY3RfbmFtZS5zdGFydHNXaXRoKCdjZnMuZmlsZXMuJykpIHtcbiAgICBvYmplY3RfbmFtZSA9IG9iamVjdF9uYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXC4nLCAnZycpLCAnXycpO1xuICB9XG4gIHJldHVybiBvYmplY3RfbmFtZTtcbn07XG5cbkNyZWF0b3IuT2JqZWN0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgX2Jhc2VPYmplY3QsIF9kYiwgZGVmYXVsdExpc3RWaWV3SWQsIGRlZmF1bHRWaWV3LCBkaXNhYmxlZF9saXN0X3ZpZXdzLCBwZXJtaXNzaW9ucywgcmVmLCByZWYxLCByZWYyLCByZWYzLCBzY2hlbWEsIHNlbGY7XG4gIF9iYXNlT2JqZWN0ID0gQ3JlYXRvci5iYXNlT2JqZWN0O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgX2Jhc2VPYmplY3QgPSB7XG4gICAgICBhY3Rpb25zOiBDcmVhdG9yLmJhc2VPYmplY3QuYWN0aW9ucyxcbiAgICAgIGZpZWxkczoge30sXG4gICAgICB0cmlnZ2Vyczoge30sXG4gICAgICBwZXJtaXNzaW9uX3NldDoge31cbiAgICB9O1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgIGNvbnNvbGUuZXJyb3Iob3B0aW9ucyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDcmVhdG9yLk9iamVjdCBvcHRpb25zIG11c3Qgc3BlY2lmeSBuYW1lJyk7XG4gIH1cbiAgc2VsZi5faWQgPSBvcHRpb25zLl9pZCB8fCBvcHRpb25zLm5hbWU7XG4gIHNlbGYuc3BhY2UgPSBvcHRpb25zLnNwYWNlO1xuICBzZWxmLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIHNlbGYubGFiZWwgPSBvcHRpb25zLmxhYmVsO1xuICBzZWxmLmljb24gPSBvcHRpb25zLmljb247XG4gIHNlbGYuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uO1xuICBzZWxmLmlzX3ZpZXcgPSBvcHRpb25zLmlzX3ZpZXc7XG4gIHNlbGYuZm9ybSA9IG9wdGlvbnMuZm9ybTtcbiAgc2VsZi5yZWxhdGVkTGlzdCA9IG9wdGlvbnMucmVsYXRlZExpc3Q7XG4gIHNlbGYucmVsYXRlZF9saXN0cyA9IG9wdGlvbnMucmVsYXRlZF9saXN0cztcbiAgc2VsZi5oYXNJbXBvcnRUZW1wbGF0ZXMgPSBvcHRpb25zLmhhc0ltcG9ydFRlbXBsYXRlcztcbiAgc2VsZi52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uIHx8IDEuMDtcbiAgaWYgKCFfLmlzQm9vbGVhbihvcHRpb25zLmlzX2VuYWJsZSkgfHwgb3B0aW9ucy5pc19lbmFibGUgPT09IHRydWUpIHtcbiAgICBzZWxmLmlzX2VuYWJsZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5pc19lbmFibGUgPSBmYWxzZTtcbiAgfVxuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgaWYgKF8uaGFzKG9wdGlvbnMsICdhbGxvd19jdXN0b21BY3Rpb25zJykpIHtcbiAgICAgIHNlbGYuYWxsb3dfY3VzdG9tQWN0aW9ucyA9IG9wdGlvbnMuYWxsb3dfY3VzdG9tQWN0aW9ucztcbiAgICB9XG4gICAgaWYgKF8uaGFzKG9wdGlvbnMsICdleGNsdWRlX2FjdGlvbnMnKSkge1xuICAgICAgc2VsZi5leGNsdWRlX2FjdGlvbnMgPSBvcHRpb25zLmV4Y2x1ZGVfYWN0aW9ucztcbiAgICB9XG4gICAgaWYgKF8uaGFzKG9wdGlvbnMsICdhbGxvd19yZWxhdGVkTGlzdCcpKSB7XG4gICAgICBzZWxmLmFsbG93X3JlbGF0ZWRMaXN0ID0gb3B0aW9ucy5hbGxvd19yZWxhdGVkTGlzdDtcbiAgICB9XG4gIH1cbiAgc2VsZi5lbmFibGVfc2VhcmNoID0gb3B0aW9ucy5lbmFibGVfc2VhcmNoO1xuICBzZWxmLmVuYWJsZV9maWxlcyA9IG9wdGlvbnMuZW5hYmxlX2ZpbGVzO1xuICBzZWxmLmVuYWJsZV90YXNrcyA9IG9wdGlvbnMuZW5hYmxlX3Rhc2tzO1xuICBzZWxmLmVuYWJsZV9ub3RlcyA9IG9wdGlvbnMuZW5hYmxlX25vdGVzO1xuICBzZWxmLmVuYWJsZV9hdWRpdCA9IG9wdGlvbnMuZW5hYmxlX2F1ZGl0O1xuICBzZWxmLmVuYWJsZV9ldmVudHMgPSBvcHRpb25zLmVuYWJsZV9ldmVudHM7XG4gIGlmIChvcHRpb25zLnBhZ2luZykge1xuICAgIHNlbGYucGFnaW5nID0gb3B0aW9ucy5wYWdpbmc7XG4gIH1cbiAgc2VsZi5oaWRkZW4gPSBvcHRpb25zLmhpZGRlbjtcbiAgc2VsZi5lbmFibGVfYXBpID0gKG9wdGlvbnMuZW5hYmxlX2FwaSA9PT0gdm9pZCAwKSB8fCBvcHRpb25zLmVuYWJsZV9hcGk7XG4gIHNlbGYuY3VzdG9tID0gb3B0aW9ucy5jdXN0b207XG4gIHNlbGYuZW5hYmxlX3NoYXJlID0gb3B0aW9ucy5lbmFibGVfc2hhcmU7XG4gIHNlbGYuZW5hYmxlX2luc3RhbmNlcyA9IG9wdGlvbnMuZW5hYmxlX2luc3RhbmNlcztcbiAgc2VsZi5lbmFibGVfcHJvY2VzcyA9IG9wdGlvbnMuZW5hYmxlX3Byb2Nlc3M7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZShTZXNzaW9uLmdldChcInNwYWNlSWRcIikpKSB7XG4gICAgICBzZWxmLmVuYWJsZV90cmVlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW5hYmxlX3RyZWUgPSBvcHRpb25zLmVuYWJsZV90cmVlO1xuICAgICAgc2VsZi5zaWRlYmFyID0gXy5jbG9uZShvcHRpb25zLnNpZGViYXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzZWxmLnNpZGViYXIgPSBfLmNsb25lKG9wdGlvbnMuc2lkZWJhcik7XG4gICAgc2VsZi5lbmFibGVfdHJlZSA9IG9wdGlvbnMuZW5hYmxlX3RyZWU7XG4gIH1cbiAgc2VsZi5vcGVuX3dpbmRvdyA9IG9wdGlvbnMub3Blbl93aW5kb3c7XG4gIHNlbGYuZmlsdGVyX2NvbXBhbnkgPSBvcHRpb25zLmZpbHRlcl9jb21wYW55O1xuICBzZWxmLmNhbGVuZGFyID0gXy5jbG9uZShvcHRpb25zLmNhbGVuZGFyKTtcbiAgc2VsZi5lbmFibGVfY2hhdHRlciA9IG9wdGlvbnMuZW5hYmxlX2NoYXR0ZXI7XG4gIHNlbGYuZW5hYmxlX3RyYXNoID0gb3B0aW9ucy5lbmFibGVfdHJhc2g7XG4gIHNlbGYuZW5hYmxlX3NwYWNlX2dsb2JhbCA9IG9wdGlvbnMuZW5hYmxlX3NwYWNlX2dsb2JhbDtcbiAgc2VsZi5lbmFibGVfYXBwcm92YWxzID0gb3B0aW9ucy5lbmFibGVfYXBwcm92YWxzO1xuICBzZWxmLmVuYWJsZV9mb2xsb3cgPSBvcHRpb25zLmVuYWJsZV9mb2xsb3c7XG4gIHNlbGYuZW5hYmxlX3dvcmtmbG93ID0gb3B0aW9ucy5lbmFibGVfd29ya2Zsb3c7XG4gIHNlbGYuZW5hYmxlX2lubGluZV9lZGl0ID0gb3B0aW9ucy5lbmFibGVfaW5saW5lX2VkaXQ7XG4gIHNlbGYuZGV0YWlscyA9IG9wdGlvbnMuZGV0YWlscztcbiAgc2VsZi5tYXN0ZXJzID0gb3B0aW9ucy5tYXN0ZXJzO1xuICBzZWxmLmxvb2t1cF9kZXRhaWxzID0gb3B0aW9ucy5sb29rdXBfZGV0YWlscztcbiAgaWYgKF8uaGFzKG9wdGlvbnMsICdpbl9kZXZlbG9wbWVudCcpKSB7XG4gICAgc2VsZi5pbl9kZXZlbG9wbWVudCA9IG9wdGlvbnMuaW5fZGV2ZWxvcG1lbnQ7XG4gIH1cbiAgc2VsZi5pZEZpZWxkTmFtZSA9ICdfaWQnO1xuICBpZiAob3B0aW9ucy5kYXRhYmFzZV9uYW1lKSB7XG4gICAgc2VsZi5kYXRhYmFzZV9uYW1lID0gb3B0aW9ucy5kYXRhYmFzZV9uYW1lO1xuICB9XG4gIGlmICghb3B0aW9ucy5maWVsZHMpIHtcbiAgICBjb25zb2xlLmVycm9yKG9wdGlvbnMpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ3JlYXRvci5PYmplY3Qgb3B0aW9ucyBtdXN0IHNwZWNpZnkgZmllbGRzJyk7XG4gIH1cbiAgc2VsZi5maWVsZHMgPSBjbG9uZShvcHRpb25zLmZpZWxkcyk7XG4gIF8uZWFjaChzZWxmLmZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkX25hbWUpIHtcbiAgICBpZiAoZmllbGQuaXNfbmFtZSkge1xuICAgICAgc2VsZi5OQU1FX0ZJRUxEX0tFWSA9IGZpZWxkX25hbWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZF9uYW1lID09PSAnbmFtZScgJiYgIXNlbGYuTkFNRV9GSUVMRF9LRVkpIHtcbiAgICAgIHNlbGYuTkFNRV9GSUVMRF9LRVkgPSBmaWVsZF9uYW1lO1xuICAgIH1cbiAgICBpZiAoZmllbGQucHJpbWFyeSkge1xuICAgICAgc2VsZi5pZEZpZWxkTmFtZSA9IGZpZWxkX25hbWU7XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChDcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlKFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSkpIHtcbiAgICAgICAgaWYgKGZpZWxkX25hbWUgPT09ICdzcGFjZScpIHtcbiAgICAgICAgICBmaWVsZC5maWx0ZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gZmllbGQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBpZiAoIW9wdGlvbnMuZGF0YWJhc2VfbmFtZSB8fCBvcHRpb25zLmRhdGFiYXNlX25hbWUgPT09ICdtZXRlb3ItbW9uZ28nKSB7XG4gICAgXy5lYWNoKF9iYXNlT2JqZWN0LmZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkX25hbWUpIHtcbiAgICAgIGlmICghc2VsZi5maWVsZHNbZmllbGRfbmFtZV0pIHtcbiAgICAgICAgc2VsZi5maWVsZHNbZmllbGRfbmFtZV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSA9IF8uZXh0ZW5kKF8uY2xvbmUoZmllbGQpLCBzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSk7XG4gICAgfSk7XG4gIH1cbiAgXy5lYWNoKHNlbGYuZmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRfbmFtZSkge1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnYXV0b251bWJlcicpIHtcbiAgICAgIHJldHVybiBmaWVsZC5yZWFkb25seSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnZm9ybXVsYScpIHtcbiAgICAgIHJldHVybiBmaWVsZC5yZWFkb25seSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnc3VtbWFyeScpIHtcbiAgICAgIHJldHVybiBmaWVsZC5yZWFkb25seSA9IHRydWU7XG4gICAgfVxuICB9KTtcbiAgc2VsZi5saXN0X3ZpZXdzID0ge307XG4gIGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhzZWxmLm5hbWUpO1xuICBfLmVhY2gob3B0aW9ucy5saXN0X3ZpZXdzLCBmdW5jdGlvbihpdGVtLCBpdGVtX25hbWUpIHtcbiAgICB2YXIgb2l0ZW07XG4gICAgb2l0ZW0gPSBDcmVhdG9yLmNvbnZlcnRMaXN0VmlldyhkZWZhdWx0VmlldywgaXRlbSwgaXRlbV9uYW1lKTtcbiAgICByZXR1cm4gc2VsZi5saXN0X3ZpZXdzW2l0ZW1fbmFtZV0gPSBvaXRlbTtcbiAgfSk7XG4gIHNlbGYudHJpZ2dlcnMgPSBfLmNsb25lKF9iYXNlT2JqZWN0LnRyaWdnZXJzKTtcbiAgXy5lYWNoKG9wdGlvbnMudHJpZ2dlcnMsIGZ1bmN0aW9uKGl0ZW0sIGl0ZW1fbmFtZSkge1xuICAgIGlmICghc2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdKSB7XG4gICAgICBzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgc2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdLm5hbWUgPSBpdGVtX25hbWU7XG4gICAgcmV0dXJuIHNlbGYudHJpZ2dlcnNbaXRlbV9uYW1lXSA9IF8uZXh0ZW5kKF8uY2xvbmUoc2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdKSwgaXRlbSk7XG4gIH0pO1xuICBzZWxmLmFjdGlvbnMgPSBfLmNsb25lKF9iYXNlT2JqZWN0LmFjdGlvbnMpO1xuICBfLmVhY2gob3B0aW9ucy5hY3Rpb25zLCBmdW5jdGlvbihpdGVtLCBpdGVtX25hbWUpIHtcbiAgICB2YXIgY29weUl0ZW07XG4gICAgaWYgKCFzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSkge1xuICAgICAgc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgY29weUl0ZW0gPSBfLmNsb25lKHNlbGYuYWN0aW9uc1tpdGVtX25hbWVdKTtcbiAgICBkZWxldGUgc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV07XG4gICAgc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0gPSBfLmV4dGVuZChjb3B5SXRlbSwgaXRlbSk7XG4gICAgcmV0dXJuIHNlbGYuYWN0aW9uc1tpdGVtX25hbWVdLm9iamVjdF9uYW1lID0gc2VsZi5uYW1lO1xuICB9KTtcbiAgXy5lYWNoKHNlbGYuYWN0aW9ucywgZnVuY3Rpb24oaXRlbSwgaXRlbV9uYW1lKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZSA9IGl0ZW1fbmFtZTtcbiAgfSk7XG4gIHNlbGYucmVsYXRlZF9vYmplY3RzID0gQ3JlYXRvci5nZXRPYmplY3RSZWxhdGVkcyhzZWxmLm5hbWUpO1xuICBzZWxmLnBlcm1pc3Npb25fc2V0ID0gXy5jbG9uZShfYmFzZU9iamVjdC5wZXJtaXNzaW9uX3NldCk7XG4gIGlmICghb3B0aW9ucy5wZXJtaXNzaW9uX3NldCkge1xuICAgIG9wdGlvbnMucGVybWlzc2lvbl9zZXQgPSB7fTtcbiAgfVxuICBpZiAoISgocmVmID0gb3B0aW9ucy5wZXJtaXNzaW9uX3NldCkgIT0gbnVsbCA/IHJlZi5hZG1pbiA6IHZvaWQgMCkpIHtcbiAgICBvcHRpb25zLnBlcm1pc3Npb25fc2V0LmFkbWluID0gXy5jbG9uZShzZWxmLnBlcm1pc3Npb25fc2V0W1wiYWRtaW5cIl0pO1xuICB9XG4gIGlmICghKChyZWYxID0gb3B0aW9ucy5wZXJtaXNzaW9uX3NldCkgIT0gbnVsbCA/IHJlZjEudXNlciA6IHZvaWQgMCkpIHtcbiAgICBvcHRpb25zLnBlcm1pc3Npb25fc2V0LnVzZXIgPSBfLmNsb25lKHNlbGYucGVybWlzc2lvbl9zZXRbXCJ1c2VyXCJdKTtcbiAgfVxuICBfLmVhY2gob3B0aW9ucy5wZXJtaXNzaW9uX3NldCwgZnVuY3Rpb24oaXRlbSwgaXRlbV9uYW1lKSB7XG4gICAgaWYgKCFzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0pIHtcbiAgICAgIHNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXSA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gc2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0pLCBpdGVtKTtcbiAgfSk7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBwZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnM7XG4gICAgZGlzYWJsZWRfbGlzdF92aWV3cyA9IHBlcm1pc3Npb25zICE9IG51bGwgPyBwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzIDogdm9pZCAwO1xuICAgIGlmIChkaXNhYmxlZF9saXN0X3ZpZXdzICE9IG51bGwgPyBkaXNhYmxlZF9saXN0X3ZpZXdzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdExpc3RWaWV3SWQgPSAocmVmMiA9IG9wdGlvbnMubGlzdF92aWV3cykgIT0gbnVsbCA/IChyZWYzID0gcmVmMi5hbGwpICE9IG51bGwgPyByZWYzLl9pZCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIGlmIChkZWZhdWx0TGlzdFZpZXdJZCkge1xuICAgICAgICBwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzID0gXy5tYXAoZGlzYWJsZWRfbGlzdF92aWV3cywgZnVuY3Rpb24obGlzdF92aWV3X2l0ZW0pIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdExpc3RWaWV3SWQgPT09IGxpc3Rfdmlld19pdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJhbGxcIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Rfdmlld19pdGVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYucGVybWlzc2lvbnMgPSBuZXcgUmVhY3RpdmVWYXIocGVybWlzc2lvbnMpO1xuICB9IGVsc2Uge1xuICAgIHNlbGYucGVybWlzc2lvbnMgPSBudWxsO1xuICB9XG4gIF9kYiA9IENyZWF0b3IuY3JlYXRlQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgQ3JlYXRvci5Db2xsZWN0aW9uc1tfZGIuX25hbWVdID0gX2RiO1xuICBzZWxmLmRiID0gX2RiO1xuICBzZWxmLl9jb2xsZWN0aW9uX25hbWUgPSBfZGIuX25hbWU7XG4gIHNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hKHNlbGYpO1xuICBzZWxmLnNjaGVtYSA9IG5ldyBTaW1wbGVTY2hlbWEoc2NoZW1hKTtcbiAgaWYgKHNlbGYubmFtZSAhPT0gXCJ1c2Vyc1wiICYmIHNlbGYubmFtZSAhPT0gXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiICYmICFzZWxmLmlzX3ZpZXcgJiYgIV8uY29udGFpbnMoW1wiZmxvd3NcIiwgXCJmb3Jtc1wiLCBcImluc3RhbmNlc1wiLCBcIm9yZ2FuaXphdGlvbnNcIiwgXCJhY3Rpb25fZmllbGRfdXBkYXRlc1wiLCBcIm9iamVjdF9saXN0dmlld3NcIl0sIHNlbGYubmFtZSkpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBfZGIuYXR0YWNoU2NoZW1hKHNlbGYuc2NoZW1hLCB7XG4gICAgICAgIHJlcGxhY2U6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZGIuYXR0YWNoU2NoZW1hKHNlbGYuc2NoZW1hLCB7XG4gICAgICAgIHJlcGxhY2U6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoc2VsZi5uYW1lID09PSBcInVzZXJzXCIpIHtcbiAgICBfZGIuX3NpbXBsZVNjaGVtYSA9IHNlbGYuc2NoZW1hO1xuICB9XG4gIGlmIChfLmNvbnRhaW5zKFtcImZsb3dzXCIsIFwiZm9ybXNcIiwgXCJpbnN0YW5jZXNcIiwgXCJvcmdhbml6YXRpb25zXCJdLCBzZWxmLm5hbWUpKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgX2RiLmF0dGFjaFNjaGVtYShzZWxmLnNjaGVtYSwge1xuICAgICAgICByZXBsYWNlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgQ3JlYXRvci5vYmplY3RzQnlOYW1lW3NlbGYuX2NvbGxlY3Rpb25fbmFtZV0gPSBzZWxmO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0T0RhdGFSb3V0ZXJQcmVmaXggPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIFwiL2FwaS9vZGF0YS92NFwiO1xufTtcblxuTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIGlmICghQ3JlYXRvci5ib290c3RyYXBMb2FkZWQgJiYgQ3JlYXRvci5PYmplY3RzKSB7XG4gICAgcmV0dXJuIF8uZWFjaChDcmVhdG9yLk9iamVjdHMsIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG5ldyBDcmVhdG9yLk9iamVjdChvYmplY3QpO1xuICAgIH0pO1xuICB9XG59KTtcbiIsIkNyZWF0b3IuZ2V0U2VsZWN0T3B0aW9ucyA9IChmaWVsZFNjaGVtYSkgLT5cblx0b3B0aW9ucyA9IGZpZWxkU2NoZW1hLm9wdGlvbnNcblx0dW5sZXNzIG9wdGlvbnNcblx0XHRyZXR1cm5cblx0ZGF0YV90eXBlID0gZmllbGRTY2hlbWEuZGF0YV90eXBlXG5cdGlmICFfLmlzRnVuY3Rpb24ob3B0aW9ucykgYW5kIGRhdGFfdHlwZSBhbmQgZGF0YV90eXBlICE9ICd0ZXh0J1xuXHRcdCMg6Zu25Luj56CB55WM6Z2i6YWN572ub3B0aW9uc+mAiemhueWAvOWPquaUr+aMgeWtl+espuS4su+8jOaJgOS7peW9k2RhdGFfdHlwZeS4uuaVsOWAvOaIlmJvb2xlYW7ml7bvvIzlj6rog73lvLrooYzmiorpgInpobnlgLzlhYjovazmjaLkuLrlr7nlupTnmoTnsbvlnotcblx0XHRvcHRpb25zLmZvckVhY2ggKG9wdGlvbkl0ZW0pIC0+XG5cdFx0XHRpZiB0eXBlb2Ygb3B0aW9uSXRlbS52YWx1ZSAhPSAnc3RyaW5nJ1xuXHRcdFx0XHRyZXR1cm5cblx0XHRcdGlmIFtcblx0XHRcdFx0J251bWJlcidcblx0XHRcdFx0J2N1cnJlbmN5J1xuXHRcdFx0XHQncGVyY2VudCdcblx0XHRcdF0uaW5kZXhPZihkYXRhX3R5cGUpID4gLTFcblx0XHRcdFx0b3B0aW9uSXRlbS52YWx1ZSA9IE51bWJlcihvcHRpb25JdGVtLnZhbHVlKVxuXHRcdFx0ZWxzZSBpZiBkYXRhX3R5cGUgPT0gJ2Jvb2xlYW4nXG5cdFx0XHRcdCMg5Y+q5pyJ5Li6dHJ1ZeaJjeS4uuecn1xuXHRcdFx0XHRvcHRpb25JdGVtLnZhbHVlID0gb3B0aW9uSXRlbS52YWx1ZSA9PSAndHJ1ZSdcblx0cmV0dXJuIG9wdGlvbnNcblxuQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEgPSAob2JqKSAtPlxuXHR1bmxlc3Mgb2JqXG5cdFx0cmV0dXJuXG5cdHNjaGVtYSA9IHt9XG5cblx0ZmllbGRzQXJyID0gW11cblxuXHRfLmVhY2ggb2JqLmZpZWxkcyAsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuXHRcdGlmICFfLmhhcyhmaWVsZCwgXCJuYW1lXCIpXG5cdFx0XHRmaWVsZC5uYW1lID0gZmllbGRfbmFtZVxuXHRcdGZpZWxkc0Fyci5wdXNoIGZpZWxkXG5cblx0Xy5lYWNoIF8uc29ydEJ5KGZpZWxkc0FyciwgXCJzb3J0X25vXCIpLCAoZmllbGQpLT5cblxuXHRcdGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lXG5cblx0XHRmcyA9IHt9XG5cdFx0aWYgZmllbGQucmVnRXhcblx0XHRcdGZzLnJlZ0V4ID0gZmllbGQucmVnRXhcblx0XHRmcy5hdXRvZm9ybSA9IHt9XG5cdFx0ZnMuYXV0b2Zvcm0ubXVsdGlwbGUgPSBmaWVsZC5tdWx0aXBsZVxuXHRcdGZzLmF1dG9mb3JtLnJlZmVyZW5jZV90byA9IGZpZWxkLnJlZmVyZW5jZV90b1xuXG5cdFx0YXV0b2Zvcm1fdHlwZSA9IGZpZWxkLmF1dG9mb3JtPy50eXBlXG5cblx0XHRpZiBmaWVsZC50eXBlID09IFwidGV4dFwiIG9yIGZpZWxkLnR5cGUgPT0gXCJwaG9uZVwiXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRpZiBmaWVsZC5tdWx0aXBsZVxuXHRcdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwidGFnc1wiXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiW3RleHRdXCIgb3IgZmllbGQudHlwZSA9PSBcIltwaG9uZV1cIlxuXHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJ0YWdzXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2NvZGUnXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJ3aWRlYXJlYVwiXG5cdFx0XHRmcy5hdXRvZm9ybS5yb3dzID0gZmllbGQucm93cyB8fCAxMlxuXHRcdFx0aWYgZmllbGQubGFuZ3VhZ2Vcblx0XHRcdFx0ZnMuYXV0b2Zvcm0ubGFuZ3VhZ2UgPSBmaWVsZC5sYW5ndWFnZVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcInRleHRhcmVhXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcIndpZGVhcmVhXCJcblx0XHRcdGZzLmF1dG9mb3JtLnJvd3MgPSBmaWVsZC5yb3dzIHx8IDJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJwYXNzd29yZFwiXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJwYXNzd29yZFwiXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiZGF0ZVwiXG5cdFx0XHRmcy50eXBlID0gRGF0ZVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0XHRpZiBTdGVlZG9zLmlzaU9TKClcblx0XHRcdFx0XHRcdCMgRml4IGlvcyAxNCwg5omL5py65a6i5oi356uv5b6F5a6h5qC45paH5Lu25pel5pyf5o6n5Lu25pi+56S65pWF6ZqcICM5OTHvvIxpb3Pnu5/kuIDnlKhQQ+err+S4gOagt+eahGpz5o6n5Lu2XG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImR4LWRhdGUtYm94XCJcblx0XHRcdFx0XHRcdFx0dGltZXpvbmVJZDogXCJ1dGNcIlxuXHRcdFx0XHRcdFx0XHRkeERhdGVCb3hPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZVwiXG5cdFx0XHRcdFx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkXCJcblx0XHRcdFx0XHRcdFx0XHRwaWNrZXJUeXBlOiBcInJvbGxlcnNcIlxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdCMg6L+Z6YeM55SoYWZGaWVsZElucHV06ICM5LiN55u05o6l55SoYXV0b2Zvcm3nmoTljp/lm6DmmK/lvZPlrZfmrrXooqtoaWRkZW7nmoTml7blgJnljrvmiafooYxkeERhdGVCb3hPcHRpb25z5Y+C5pWw5Lya5oql6ZSZXG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcInN0ZWVkb3MtZGF0ZS1tb2JpbGVcIlxuXHRcdFx0XHRcdFx0XHRkYXRlTW9iaWxlT3B0aW9uczpcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3V0Rm9ybWF0ID0gJ3l5eXktTU0tZGQnO1xuXHRcdFx0XHRcdCMg6L+Z6YeM55SoYWZGaWVsZElucHV06ICM5LiN55u05o6l55SoYXV0b2Zvcm3nmoTljp/lm6DmmK/lvZPlrZfmrrXooqtoaWRkZW7nmoTml7blgJnljrvmiafooYxkeERhdGVCb3hPcHRpb25z5Y+C5pWw5Lya5oql6ZSZXG5cdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID1cblx0XHRcdFx0XHRcdHR5cGU6IFwiZHgtZGF0ZS1ib3hcIlxuXHRcdFx0XHRcdFx0dGltZXpvbmVJZDogXCJ1dGNcIlxuXHRcdFx0XHRcdFx0ZHhEYXRlQm94T3B0aW9uczpcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJkYXRlXCJcblx0XHRcdFx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJ0aW1lXCJcblx0XHRcdGZzLnR5cGUgPSBEYXRlXG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0IyDov5nph4znlKhhZkZpZWxkSW5wdXTogIzkuI3nm7TmjqXnlKhhdXRvZm9ybeeahOWOn+WboOaYr+W9k+Wtl+auteiiq2hpZGRlbueahOaXtuWAmeWOu+aJp+ihjGR4RGF0ZUJveE9wdGlvbnPlj4LmlbDkvJrmiqXplJlcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID1cblx0XHRcdFx0XHR0eXBlOiBcImR4LWRhdGUtYm94XCJcblx0XHRcdFx0XHR0aW1lem9uZUlkOiBcInV0Y1wiXG5cdFx0XHRcdFx0ZHhEYXRlQm94T3B0aW9uczpcblx0XHRcdFx0XHRcdHR5cGU6IFwidGltZVwiXG5cdFx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkhIOm1tXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJkYXRldGltZVwiXG5cdFx0XHRmcy50eXBlID0gRGF0ZVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzUGFkKClcblx0XHRcdFx0XHRpZiBTdGVlZG9zLmlzaU9TKClcblx0XHRcdFx0XHRcdCMgRml4IGlvcyAxNCwg5omL5py65a6i5oi356uv5b6F5a6h5qC45paH5Lu25pel5pyf5o6n5Lu25pi+56S65pWF6ZqcICM5OTHvvIxpb3Pnu5/kuIDnlKhQQ+err+S4gOagt+eahGpz5o6n5Lu2XG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImR4LWRhdGUtYm94XCJcblx0XHRcdFx0XHRcdFx0ZHhEYXRlQm94T3B0aW9uczpcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGV0aW1lXCJcblx0XHRcdFx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGQgSEg6bW1cIlxuXHRcdFx0XHRcdFx0XHRcdHBpY2tlclR5cGU6IFwicm9sbGVyc1wiXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0IyDov5nph4znlKhhZkZpZWxkSW5wdXTogIzkuI3nm7TmjqXnlKhhdXRvZm9ybeeahOWOn+WboOaYr+W9k+Wtl+auteiiq2hpZGRlbueahOaXtuWAmeWOu+aJp+ihjGR4RGF0ZUJveE9wdGlvbnPlj4LmlbDkvJrmiqXplJlcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwic3RlZWRvcy1kYXRlLW1vYmlsZVwiXG5cdFx0XHRcdFx0XHRcdGRhdGVNb2JpbGVPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZXRpbWVcIlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0IyDov5nph4znlKhhZkZpZWxkSW5wdXTogIzkuI3nm7TmjqXnlKhhdXRvZm9ybeeahOWOn+WboOaYr+W9k+Wtl+auteiiq2hpZGRlbueahOaXtuWAmeWOu+aJp+ihjGR4RGF0ZUJveE9wdGlvbnPlj4LmlbDkvJrmiqXplJlcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdFx0dHlwZTogXCJkeC1kYXRlLWJveFwiXG5cdFx0XHRcdFx0XHRkeERhdGVCb3hPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGV0aW1lXCJcblx0XHRcdFx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkIEhIOm1tXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJbT2JqZWN0XVwiXG5cdFx0XHRmcy50eXBlID0gW09iamVjdF1cblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJodG1sXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ3N0ZWVkb3NIdG1sJztcblx0XHRcdCMgaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHQjIFx0bG9jYWxlID0gU3RlZWRvcy5sb2NhbGUoKVxuXHRcdFx0IyBcdGlmIGxvY2FsZSA9PSBcInpoLWNuXCIgfHwgbG9jYWxlID09IFwiemgtQ05cIlxuXHRcdFx0IyBcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cdFx0XHQjIFx0ZWxzZVxuXHRcdFx0IyBcdFx0bG9jYWxlID0gXCJlbi1VU1wiXG5cdFx0XHQjIFx0ZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID1cblx0XHRcdCMgXHRcdHR5cGU6IFwic3VtbWVybm90ZVwiXG5cdFx0XHQjIFx0XHRjbGFzczogJ3N1bW1lcm5vdGUtZWRpdG9yJ1xuXHRcdFx0IyBcdFx0c2V0dGluZ3M6XG5cdFx0XHQjIFx0XHRcdGhlaWdodDogMjAwXG5cdFx0XHQjIFx0XHRcdGRpYWxvZ3NJbkJvZHk6IHRydWVcblx0XHRcdCMgXHRcdFx0dG9vbGJhcjogIFtcblx0XHRcdCMgXHRcdFx0XHRbJ2ZvbnQxJywgWydzdHlsZSddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ2ZvbnQyJywgWydib2xkJywgJ3VuZGVybGluZScsICdpdGFsaWMnLCAnY2xlYXInXV0sXG5cdFx0XHQjIFx0XHRcdFx0Wydmb250MycsIFsnZm9udG5hbWUnXV0sXG5cdFx0XHQjIFx0XHRcdFx0Wydjb2xvcicsIFsnY29sb3InXV0sXG5cdFx0XHQjIFx0XHRcdFx0WydwYXJhJywgWyd1bCcsICdvbCcsICdwYXJhZ3JhcGgnXV0sXG5cdFx0XHQjIFx0XHRcdFx0Wyd0YWJsZScsIFsndGFibGUnXV0sXG5cdFx0XHQjIFx0XHRcdFx0WydpbnNlcnQnLCBbJ2xpbmsnLCAncGljdHVyZSddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ3ZpZXcnLCBbJ2NvZGV2aWV3J11dXG5cdFx0XHQjIFx0XHRcdF1cblx0XHRcdCMgXHRcdFx0Zm9udE5hbWVzOiBbJ0FyaWFsJywgJ0NvbWljIFNhbnMgTVMnLCAnQ291cmllciBOZXcnLCAnSGVsdmV0aWNhJywgJ0ltcGFjdCcsICflrovkvZMnLCfpu5HkvZMnLCflvq7ova/pm4Xpu5EnLCfku7/lrosnLCfmpbfkvZMnLCfpmrbkuaYnLCflubzlnIYnXVxuXHRcdFx0IyBcdFx0XHRsYW5nOiBsb2NhbGVcblxuXHRcdGVsc2UgaWYgKGZpZWxkLnR5cGUgPT0gXCJsb29rdXBcIiBvciBmaWVsZC50eXBlID09IFwibWFzdGVyX2RldGFpbFwiKVxuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0ZnMuYXV0b2Zvcm0uc2hvd0ljb24gPSBmaWVsZC5zaG93SWNvblxuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cblx0XHRcdGlmICFmaWVsZC5oaWRkZW5cblxuXHRcdFx0XHRmcy5hdXRvZm9ybS5maWx0ZXJzID0gZmllbGQuZmlsdGVyc1xuXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmRlcGVuZE9uID0gZmllbGQuZGVwZW5kX29uXG5cblx0XHRcdFx0aWYgZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uXG5cdFx0XHRcdFx0ZnMuYmVmb3JlT3BlbkZ1bmN0aW9uID0gZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uXG5cblx0XHRcdFx0ZnMuZmlsdGVyc0Z1bmN0aW9uID0gaWYgZmllbGQuZmlsdGVyc0Z1bmN0aW9uIHRoZW4gZmllbGQuZmlsdGVyc0Z1bmN0aW9uIGVsc2UgQ3JlYXRvci5ldmFsdWF0ZUZpbHRlcnNcblxuXHRcdFx0XHRpZiBmaWVsZC5vcHRpb25zRnVuY3Rpb25cblx0XHRcdFx0XHRmcy5vcHRpb25zRnVuY3Rpb24gPSBmaWVsZC5vcHRpb25zRnVuY3Rpb25cblxuXHRcdFx0XHRpZiBmaWVsZC5yZWZlcmVuY2VfdG9cblxuXHRcdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdFx0aWYgZmllbGQuY3JlYXRlRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKGZpZWxkLmNyZWF0ZUZ1bmN0aW9uKVxuXHRcdFx0XHRcdFx0XHRmcy5jcmVhdGVGdW5jdGlvbiA9IGZpZWxkLmNyZWF0ZUZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGlmIF8uaXNTdHJpbmcoZmllbGQucmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdFx0XHRcdF9yZWZfb2JqID0gQ3JlYXRvci5PYmplY3RzW2ZpZWxkLnJlZmVyZW5jZV90b11cblx0XHRcdFx0XHRcdFx0XHRpZiBfcmVmX29iaj8ucGVybWlzc2lvbnM/LmFsbG93Q3JlYXRlXG5cdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5jcmVhdGUgPSB0cnVlXG5cdFx0XHRcdFx0XHRcdFx0XHRmcy5jcmVhdGVGdW5jdGlvbiA9IChsb29rdXBfZmllbGQpLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0TW9kYWwuc2hvdyhcIkNyZWF0b3JPYmplY3RNb2RhbFwiLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbjogXCJDcmVhdG9yLkNvbGxlY3Rpb25zLiN7Q3JlYXRvci5nZXRDb2xsZWN0aW9uKGZpZWxkLnJlZmVyZW5jZV90bykuX25hbWV9XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9ybUlkOiBcIm5ldyN7ZmllbGQucmVmZXJlbmNlX3RvLnJlcGxhY2UoJy4nLCdfJyl9XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0X25hbWU6IFwiI3tmaWVsZC5yZWZlcmVuY2VfdG99XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3BlcmF0aW9uOiBcImluc2VydFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uU3VjY2VzczogKG9wZXJhdGlvbiwgcmVzdWx0KS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZXN1bHQub2JqZWN0X25hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiByZXN1bHQub2JqZWN0X25hbWUgPT0gXCJvYmplY3RzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bG9va3VwX2ZpZWxkLmFkZEl0ZW1zKFt7bGFiZWw6IHJlc3VsdC52YWx1ZS5sYWJlbCwgdmFsdWU6IHJlc3VsdC52YWx1ZS5uYW1lLCBpY29uOiByZXN1bHQudmFsdWUuaWNvbn1dLCByZXN1bHQudmFsdWUubmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bG9va3VwX2ZpZWxkLmFkZEl0ZW1zKFt7bGFiZWw6IHJlc3VsdC52YWx1ZVtvYmplY3QuTkFNRV9GSUVMRF9LRVldIHx8IHJlc3VsdC52YWx1ZS5sYWJlbCB8fCByZXN1bHQudmFsdWUubmFtZSwgdmFsdWU6IHJlc3VsdC5faWR9XSwgcmVzdWx0Ll9pZClcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5jcmVhdGUgPSBmYWxzZVxuXG5cdFx0XHRcdFx0aWYgXy5pc0Jvb2xlYW4oZmllbGQuY3JlYXRlKVxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uY3JlYXRlID0gZmllbGQuY3JlYXRlXG5cblx0XHRcdFx0XHRpZiBmaWVsZC5yZWZlcmVuY2Vfc29ydFxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9uc1NvcnQgPSBmaWVsZC5yZWZlcmVuY2Vfc29ydFxuXG5cdFx0XHRcdFx0aWYgZmllbGQucmVmZXJlbmNlX2xpbWl0XG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zTGltaXQgPSBmaWVsZC5yZWZlcmVuY2VfbGltaXRcblx0XHRcdFx0XHRpZiBmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGRcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnJlZmVyZW5jZVRvRmllbGQgPSBmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGRcblxuXHRcdFx0XHRcdGlmIGZpZWxkLnJlZmVyZW5jZV90byA9PSBcInVzZXJzXCJcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdHVzZXJcIlxuXHRcdFx0XHRcdFx0aWYgIWZpZWxkLmhpZGRlbiAmJiAhZmllbGQub21pdFxuXHRcdFx0XHRcdFx0XHQjIGlzX2NvbXBhbnlfbGltaXRlZOihqOekuui/h+a7pOaVsOaNruaXtuaYr+WQpuWPquaYvuekuuacrOWIhumDqOS4i+eahOaVsOaNrlxuXHRcdFx0XHRcdFx0XHQjIGlzX2NvbXBhbnlfbGltaXRlZOWPr+S7peiiq+aUueWGmeimhuebluaIkHRydWUvZmFsc2XmiJblhbbku5ZmdW5jdGlvblxuXHRcdFx0XHRcdFx0XHRpZiBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQgPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdFx0IyDmnKrlrprkuYlpc19jb21wYW55X2xpbWl0ZWTlsZ7mgKfml7bpu5jorqTlpITnkIbpgLvovpHvvJpcblx0XHRcdFx0XHRcdFx0XHQjIOWvueW9k+WJjeWvueixoeaciXZpZXdBbGxSZWNvcmRz5p2D6ZmQ5YiZ5LiN6ZmQ5Yi25omA5bGe5YiG6YOo5YiX6KGo5p+l55yL5p2D6ZmQ77yM5ZCm5YiZ5Y+q5pi+56S65b2T5YmN5omA5bGe5YiG6YOoXG5cdFx0XHRcdFx0XHRcdFx0IyDms6jmhI/kuI3mmK9yZWZlcmVuY2VfdG/lr7nosaHnmoR2aWV3QWxsUmVjb3Jkc+adg+mZkO+8jOiAjOaYr+W9k+WJjeWvueixoeeahFxuXHRcdFx0XHRcdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvYmoucGVybWlzc2lvbnNcblx0XHRcdFx0XHRcdFx0XHRcdGlzVW5MaW1pdGVkID0gcGVybWlzc2lvbnM/LnZpZXdBbGxSZWNvcmRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBfLmluY2x1ZGUoW1wib3JnYW5pemF0aW9uc1wiLCBcInVzZXJzXCIsIFwic3BhY2VfdXNlcnNcIl0sIG9iai5uYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQjIOWmguaenOWtl+auteaJgOWxnuWvueixoeaYr+eUqOaIt+aIlue7hOe7h++8jOWImeaYr+WQpumZkOWItuaYvuekuuaJgOWxnuWIhumDqOmDqOmXqOS4jm1vZGlmeUFsbFJlY29yZHPmnYPpmZDlhbPogZRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucz8ubW9kaWZ5QWxsUmVjb3Jkc1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgaXNVbkxpbWl0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIF8uaXNGdW5jdGlvbiBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRcdFx0XHRcdCMg5Lyg5YWl5b2T5YmN5a+56LGh55qE5p2D6ZmQ77yM5Zyo5Ye95pWw5Lit5qC55o2u5p2D6ZmQ6K6h566X5piv5ZCm6KaB6ZmQ5Yi25Y+q5p+l55yL5pys5YiG6YOoXG5cdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQob2JqLnBlcm1pc3Npb25zKVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdCMg5pyN5Yqh56uv55So5LiN5YiwaXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdFx0ZWxzZSBpZiBmaWVsZC5yZWZlcmVuY2VfdG8gPT0gXCJvcmdhbml6YXRpb25zXCJcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdG9yZ1wiXG5cdFx0XHRcdFx0XHRpZiAhZmllbGQuaGlkZGVuICYmICFmaWVsZC5vbWl0XG5cdFx0XHRcdFx0XHRcdCMgaXNfY29tcGFueV9saW1pdGVk6KGo56S66L+H5ruk5pWw5o2u5pe25piv5ZCm5Y+q5pi+56S65pys5YiG6YOo5LiL55qE5pWw5o2uXG5cdFx0XHRcdFx0XHRcdCMgaXNfY29tcGFueV9saW1pdGVk5Y+v5Lul6KKr5pS55YaZ6KaG55uW5oiQdHJ1ZS9mYWxzZeaIluWFtuS7lmZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmIGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCA9PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHQjIOacquWumuS5iWlzX2NvbXBhbnlfbGltaXRlZOWxnuaAp+aXtum7mOiupOWkhOeQhumAu+i+ke+8mlxuXHRcdFx0XHRcdFx0XHRcdCMg5a+55b2T5YmN5a+56LGh5pyJdmlld0FsbFJlY29yZHPmnYPpmZDliJnkuI3pmZDliLbmiYDlsZ7liIbpg6jliJfooajmn6XnnIvmnYPpmZDvvIzlkKbliJnlj6rmmL7npLrlvZPliY3miYDlsZ7liIbpg6hcblx0XHRcdFx0XHRcdFx0XHQjIOazqOaEj+S4jeaYr3JlZmVyZW5jZV90b+WvueixoeeahHZpZXdBbGxSZWNvcmRz5p2D6ZmQ77yM6ICM5piv5b2T5YmN5a+56LGh55qEXG5cdFx0XHRcdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9iai5wZXJtaXNzaW9uc1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucz8udmlld0FsbFJlY29yZHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmIF8uaW5jbHVkZShbXCJvcmdhbml6YXRpb25zXCIsIFwidXNlcnNcIiwgXCJzcGFjZV91c2Vyc1wiXSwgb2JqLm5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCMg5aaC5p6c5a2X5q615omA5bGe5a+56LGh5piv55So5oi35oiW57uE57uH77yM5YiZ5piv5ZCm6ZmQ5Yi25pi+56S65omA5bGe5YiG6YOo6YOo6Zeo5LiObW9kaWZ5QWxsUmVjb3Jkc+adg+mZkOWFs+iBlFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc1VuTGltaXRlZCA9IHBlcm1pc3Npb25zPy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBpc1VuTGltaXRlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgXy5pc0Z1bmN0aW9uIGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0IyDkvKDlhaXlvZPliY3lr7nosaHnmoTmnYPpmZDvvIzlnKjlh73mlbDkuK3moLnmja7mnYPpmZDorqHnrpfmmK/lkKbopoHpmZDliLblj6rmn6XnnIvmnKzliIbpg6hcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZChvYmoucGVybWlzc2lvbnMpXG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0IyDmnI3liqHnq6/nlKjkuI3liLBpc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWVcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpZiB0eXBlb2YoZmllbGQucmVmZXJlbmNlX3RvKSA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdFx0XHRcdFx0X3JlZmVyZW5jZV90byA9IGZpZWxkLnJlZmVyZW5jZV90bygpXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdF9yZWZlcmVuY2VfdG8gPSBmaWVsZC5yZWZlcmVuY2VfdG9cblxuXHRcdFx0XHRcdFx0aWYgXy5pc0FycmF5KF9yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0XHRcdGZzLnR5cGUgPSBPYmplY3Rcblx0XHRcdFx0XHRcdFx0ZnMuYmxhY2tib3ggPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLm9iamVjdFN3aXRjaGUgPSB0cnVlXG5cblx0XHRcdFx0XHRcdFx0c2NoZW1hW2ZpZWxkX25hbWUgKyBcIi5vXCJdID0ge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHRcdFx0XHRcdGF1dG9mb3JtOiB7b21pdDogdHJ1ZX1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuaWRzXCJdID0ge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFtTdHJpbmddXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2Zvcm06IHtvbWl0OiB0cnVlfVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0X3JlZmVyZW5jZV90byA9IFtfcmVmZXJlbmNlX3RvXVxuXG5cdFx0XHRcdFx0XHRfb2JqZWN0ID0gQ3JlYXRvci5PYmplY3RzW19yZWZlcmVuY2VfdG9bMF1dXG5cdFx0XHRcdFx0XHRpZiBfb2JqZWN0IGFuZCBfb2JqZWN0LmVuYWJsZV90cmVlXG5cdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdFRyZWVcIlxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTG9va3Vwc1wiXG5cdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLm9wdGlvbnNNZXRob2QgPSBmaWVsZC5vcHRpb25zTWV0aG9kIHx8IFwiY3JlYXRvci5vYmplY3Rfb3B0aW9uc1wiXG5cblx0XHRcdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9uc01ldGhvZFBhcmFtcyA9ICgpLT5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7c3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKX1cblx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5yZWZlcmVuY2VzID0gW11cblx0XHRcdFx0XHRcdFx0XHRfcmVmZXJlbmNlX3RvLmZvckVhY2ggKF9yZWZlcmVuY2UpLT5cblx0XHRcdFx0XHRcdFx0XHRcdF9vYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbX3JlZmVyZW5jZV1cblx0XHRcdFx0XHRcdFx0XHRcdGlmIF9vYmplY3Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ucmVmZXJlbmNlcy5wdXNoIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IF9yZWZlcmVuY2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsYWJlbDogX29iamVjdD8ubGFiZWxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpY29uOiBfb2JqZWN0Py5pY29uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bGluazogKCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiL2FwcC8je1Nlc3Npb24uZ2V0KCdhcHBfaWQnKX0vI3tfcmVmZXJlbmNlfS92aWV3L1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ucmVmZXJlbmNlcy5wdXNoIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IF9yZWZlcmVuY2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsaW5rOiAoKS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCIvYXBwLyN7U2Vzc2lvbi5nZXQoJ2FwcF9pZCcpfS8je19yZWZlcmVuY2V9L3ZpZXcvXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTG9va3Vwc1wiXG5cdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGVmYXVsdEljb24gPSBmaWVsZC5kZWZhdWx0SWNvblxuXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwic2VsZWN0XCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGlmIGZpZWxkLm11bHRpcGxlXG5cdFx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTG9va3Vwc1wiXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnNob3dJY29uID0gZmFsc2Vcblx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnNcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0XCJcblx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnNcblx0XHRcdFx0aWYgXy5oYXMoZmllbGQsICdmaXJzdE9wdGlvbicpXG5cdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uZmlyc3RPcHRpb24gPSBmaWVsZC5maXJzdE9wdGlvblxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uZmlyc3RPcHRpb24gPSBcIlwiXG5cdFx0XHQjIOWboOS4uuWIl+ihqOinhuWbvuWPs+S+p+i/h+a7pOWZqOi/mOaYr+eUqOeahOiAgeihqOWNleeahGxvb2t1cOWSjHNlbGVjdOaOp+S7tu+8jOaJgOS7peS4iumdoueahOS7o+eggeWni+e7iOS/neaMgeWOn+agt+mcgOimgeaJp+ihjFxuXHRcdFx0IyDkuIvpnaLmmK/phY3nva7kuoZkYXRhX3R5cGXml7bvvIzpop3lpJblpITnkIbnmoTpgLvovpFcblx0XHRcdGlmIGZpZWxkLmRhdGFfdHlwZSBhbmQgZmllbGQuZGF0YV90eXBlICE9IFwidGV4dFwiXG5cdFx0XHRcdGlmIFtcIm51bWJlclwiLCBcImN1cnJlbmN5XCIsIFwicGVyY2VudFwiXS5pbmRleE9mKGZpZWxkLmRhdGFfdHlwZSkgPiAtMVxuXHRcdFx0XHRcdGZzVHlwZSA9IE51bWJlclxuXHRcdFx0XHRcdGZzLmRlY2ltYWwgPSB0cnVlXG5cdFx0XHRcdGVsc2UgaWYgZmllbGQuZGF0YV90eXBlID09IFwiYm9vbGVhblwiXG5cdFx0XHRcdFx0ZnNUeXBlID0gQm9vbGVhblxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZnNUeXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLnR5cGUgPSBmc1R5cGVcblx0XHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0XHRmcy50eXBlID0gW2ZzVHlwZV1cblx0XHRcdFx0XHRcblx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IENyZWF0b3IuZ2V0U2VsZWN0T3B0aW9ucyhmaWVsZClcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJjdXJyZW5jeVwiXG5cdFx0XHRmcy50eXBlID0gTnVtYmVyXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTnVtYmVyXCJcblx0XHRcdGZzLmF1dG9mb3JtLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbiB8fCAxOFxuXHRcdFx0aWYgZmllbGQ/LnNjYWxlXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnNjYWxlID0gZmllbGQuc2NhbGVcblx0XHRcdFx0ZnMuZGVjaW1hbCA9IHRydWVcblx0XHRcdGVsc2UgaWYgZmllbGQ/LnNjYWxlICE9IDBcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uc2NhbGUgPSAyXG5cdFx0XHRcdGZzLmRlY2ltYWwgPSB0cnVlXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwibnVtYmVyXCJcblx0XHRcdGZzLnR5cGUgPSBOdW1iZXJcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIlxuXHRcdFx0ZnMuYXV0b2Zvcm0ucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uIHx8IDE4XG5cdFx0XHRpZiBmaWVsZD8uc2NhbGVcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZVxuXHRcdFx0XHRmcy5kZWNpbWFsID0gdHJ1ZVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImJvb2xlYW5cIlxuXHRcdFx0ZnMudHlwZSA9IEJvb2xlYW5cblx0XHRcdGlmIGZpZWxkLnJlYWRvbmx5XG5cdFx0XHRcdGZzLmF1dG9mb3JtLmRpc2FibGVkID0gdHJ1ZVxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvcy1ib29sZWFuLWNoZWNrYm94XCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJ0b2dnbGVcIlxuXHRcdFx0ZnMudHlwZSA9IEJvb2xlYW5cblx0XHRcdGlmIGZpZWxkLnJlYWRvbmx5XG5cdFx0XHRcdGZzLmF1dG9mb3JtLmRpc2FibGVkID0gdHJ1ZVxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvcy1ib29sZWFuLXRvZ2dsZVwiXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwicmVmZXJlbmNlXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJjaGVja2JveFwiXG5cdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdC1jaGVja2JveFwiXG5cdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zID0gZmllbGQub3B0aW9uc1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImZpbGVcIlxuXHRcdFx0Y29sbGVjdGlvbk5hbWUgPSBmaWVsZC5jb2xsZWN0aW9uIHx8IFwiZmlsZXNcIiAjIGNvbGxlY3Rpb24g6buY6K6k5pivICdmaWxlcydcblx0XHRcdGlmIGZpZWxkLm11bHRpcGxlXG5cdFx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0XHRzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPVxuXHRcdFx0XHRcdGF1dG9mb3JtOlxuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uOiBjb2xsZWN0aW9uTmFtZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9IGNvbGxlY3Rpb25OYW1lXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiZmlsZXNpemVcIlxuXHRcdFx0ZnMudHlwZSA9IE51bWJlclxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlc2l6ZSdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJPYmplY3RcIiB8fCBmaWVsZC50eXBlID09IFwib2JqZWN0XCJcblx0XHRcdGZzLnR5cGUgPSBPYmplY3Rcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJncmlkXCIgfHwgZmllbGQudHlwZSA9PSBcInRhYmxlXCJcblx0XHRcdGZzLnR5cGUgPSBBcnJheVxuXHRcdFx0ZnMuYXV0b2Zvcm0uZWRpdGFibGUgPSB0cnVlXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zR3JpZFwiXG5cblx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdHR5cGU6IE9iamVjdFxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImltYWdlXCJcblx0XHRcdGlmIGZpZWxkLm11bHRpcGxlXG5cdFx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0XHRzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPVxuXHRcdFx0XHRcdGF1dG9mb3JtOlxuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uOiAnaW1hZ2VzJ1xuXHRcdFx0XHRcdFx0YWNjZXB0OiAnaW1hZ2UvKidcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmNvbGxlY3Rpb24gPSAnaW1hZ2VzJ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS5hY2NlcHQgPSAnaW1hZ2UvKidcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJhdmF0YXJcIlxuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdFx0YXV0b2Zvcm06XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmlsZVVwbG9hZCdcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb246ICdhdmF0YXJzJ1xuXHRcdFx0XHRcdFx0YWNjZXB0OiAnaW1hZ2UvKidcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmNvbGxlY3Rpb24gPSAnYXZhdGFycydcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uYWNjZXB0ID0gJ2ltYWdlLyonXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiYXVkaW9cIlxuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdFx0YXV0b2Zvcm06XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmlsZVVwbG9hZCdcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb246ICdhdWRpb3MnXG5cdFx0XHRcdFx0XHRhY2NlcHQ6ICdhdWRpby8qJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICdhdWRpb3MnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmFjY2VwdCA9ICdhdWRpby8qJ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcInZpZGVvXCJcblx0XHRcdGlmIGZpZWxkLm11bHRpcGxlXG5cdFx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0XHRzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPVxuXHRcdFx0XHRcdGF1dG9mb3JtOlxuXHRcdFx0XHRcdFx0dHlwZTogJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uOiAndmlkZW9zJ1xuXHRcdFx0XHRcdFx0YWNjZXB0OiAndmlkZW8vKidcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmNvbGxlY3Rpb24gPSAndmlkZW9zJ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS5hY2NlcHQgPSAndmlkZW8vKidcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJsb2NhdGlvblwiXG5cdFx0XHRmcy50eXBlID0gT2JqZWN0XG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJsb2NhdGlvblwiXG5cdFx0XHRmcy5hdXRvZm9ybS5zeXN0ZW0gPSBmaWVsZC5zeXN0ZW0gfHwgXCJ3Z3M4NFwiXG5cdFx0XHRmcy5ibGFja2JveCA9IHRydWVcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJtYXJrZG93blwiXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJ0ZXh0XCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3VybCdcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdCMgZnMucmVnRXggPSBTaW1wbGVTY2hlbWEuUmVnRXguVXJsXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ3N0ZWVkb3NVcmwnXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09ICdlbWFpbCdcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGZzLnJlZ0V4ID0gU2ltcGxlU2NoZW1hLlJlZ0V4LkVtYWlsXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ3N0ZWVkb3NFbWFpbCdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2F1dG9udW1iZXInXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09ICdjb2xvcidcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2Zvcm11bGEnXG5cdFx0XHRmcyA9IENyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hKHtmaWVsZHM6IHtmaWVsZDogT2JqZWN0LmFzc2lnbih7fSwgZmllbGQsIHt0eXBlOiBmaWVsZC5kYXRhX3R5cGV9KX19KVtmaWVsZC5uYW1lXVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnc3VtbWFyeSdcblx0XHRcdGZzID0gQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEoe2ZpZWxkczoge2ZpZWxkOiBPYmplY3QuYXNzaWduKHt9LCBmaWVsZCwge3R5cGU6IGZpZWxkLmRhdGFfdHlwZX0pfX0pW2ZpZWxkLm5hbWVdXG5cdFx0IyBlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3NlbGVjdCdcblx0XHQjIFx0ZnMgPSBDcmVhdG9yLmdldE9iamVjdFNjaGVtYSh7ZmllbGRzOiB7ZmllbGQ6IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkLCB7dHlwZTogZmllbGQuZGF0YV90eXBlfSl9fSlbZmllbGQubmFtZV1cblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ3BlcmNlbnQnXG5cdFx0XHRmcy50eXBlID0gTnVtYmVyXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTnVtYmVyXCJcblx0XHRcdGZzLmF1dG9mb3JtLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbiB8fCAxOFxuXHRcdFx0dW5sZXNzIF8uaXNOdW1iZXIoZmllbGQuc2NhbGUpXG5cdFx0XHRcdCMg5rKh6YWN572u5bCP5pWw5L2N5pWw5YiZ5oyJ5bCP5pWw5L2N5pWwMOadpeWkhOeQhu+8jOWNs+m7mOiupOaYvuekuuS4uuaVtOaVsOeahOeZvuWIhuavlO+8jOavlOWmgjIwJe+8jOatpOaXtuaOp+S7tuWPr+S7pei+k+WFpTLkvY3lsI/mlbDvvIzovazmiJDnmb7liIbmr5TlsLHmmK/mlbTmlbBcblx0XHRcdFx0ZmllbGQuc2NhbGUgPSAwXG5cdFx0XHQjIGF1dG9mb3Jt5o6n5Lu25Lit5bCP5pWw5L2N5pWw5aeL57uI5q+U6YWN572u55qE5L2N5pWw5aSaMuS9jVxuXHRcdFx0ZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZSArIDJcblx0XHRcdGZzLmRlY2ltYWwgPSB0cnVlXG5cdFx0ZWxzZVxuXHRcdFx0ZnMudHlwZSA9IGZpZWxkLnR5cGVcblxuXHRcdGlmIGZpZWxkLmxhYmVsXG5cdFx0XHRmcy5sYWJlbCA9IGZpZWxkLmxhYmVsXG5cbiNcdFx0aWYgZmllbGQuYWxsb3dlZFZhbHVlc1xuI1x0XHRcdGZzLmFsbG93ZWRWYWx1ZXMgPSBmaWVsZC5hbGxvd2VkVmFsdWVzXG5cblx0XHRpZiAhZmllbGQucmVxdWlyZWRcblx0XHRcdGZzLm9wdGlvbmFsID0gdHJ1ZVxuXG5cdFx0IyBb562+57qm5a+56LGh5ZCM5pe26YWN572u5LqGY29tcGFueV9pZHPlv4Xloavlj4p1bmVkaXRhYmxlX2ZpZWxkc+mAoOaIkOmDqOWIhueUqOaIt+aWsOW7uuetvue6puWvueixoeaXtuaKpemUmSAjMTkyXShodHRwczovL2dpdGh1Yi5jb20vc3RlZWRvcy9zdGVlZG9zLXByb2plY3QtZHp1Zy9pc3N1ZXMvMTkyKVxuXHRcdCMg5ZCO5Y+w5aeL57uI6K6+572ucmVxdWlyZWTkuLpmYWxzZVxuXHRcdGlmICFNZXRlb3IuaXNDbGllbnRcblx0XHRcdGZzLm9wdGlvbmFsID0gdHJ1ZVxuXG5cdFx0aWYgZmllbGQudW5pcXVlXG5cdFx0XHRmcy51bmlxdWUgPSB0cnVlXG5cblx0XHRpZiBmaWVsZC5vbWl0XG5cdFx0XHRmcy5hdXRvZm9ybS5vbWl0ID0gdHJ1ZVxuXG5cdFx0aWYgZmllbGQuZ3JvdXBcblx0XHRcdGZzLmF1dG9mb3JtLmdyb3VwID0gZmllbGQuZ3JvdXBcblxuXHRcdGlmIGZpZWxkLmlzX3dpZGVcblx0XHRcdGZzLmF1dG9mb3JtLmlzX3dpZGUgPSB0cnVlXG5cblx0XHRpZiBmaWVsZC5oaWRkZW5cblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcImhpZGRlblwiXG5cblx0XHRpZiAoZmllbGQudHlwZSA9PSBcInNlbGVjdFwiKSBvciAoZmllbGQudHlwZSA9PSBcImxvb2t1cFwiKSBvciAoZmllbGQudHlwZSA9PSBcIm1hc3Rlcl9kZXRhaWxcIilcblx0XHRcdGlmIHR5cGVvZihmaWVsZC5maWx0ZXJhYmxlKSA9PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHRmaWVsZC5maWx0ZXJhYmxlID0gdHJ1ZVxuXHRcdGlmIGZpZWxkLm5hbWUgPT0gJ25hbWUnIHx8IGZpZWxkLmlzX25hbWVcblx0XHRcdGlmIHR5cGVvZihmaWVsZC5zZWFyY2hhYmxlKSA9PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHRmaWVsZC5zZWFyY2hhYmxlID0gdHJ1ZVxuXG5cdFx0aWYgYXV0b2Zvcm1fdHlwZVxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IGF1dG9mb3JtX3R5cGVcblxuXHRcdGlmIGZpZWxkLmRlZmF1bHRWYWx1ZVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50IGFuZCBDcmVhdG9yLkZvcm11bGFyLmNoZWNrRm9ybXVsYShmaWVsZC5kZWZhdWx0VmFsdWUpXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmRlZmF1bHRWYWx1ZSA9ICgpLT5cblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRvci5Gb3JtdWxhci5ydW4oZmllbGQuZGVmYXVsdFZhbHVlLCB7dXNlcklkOiBNZXRlb3IudXNlcklkKCksIHNwYWNlSWQ6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSwgbm93OiBuZXcgRGF0ZSgpfSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGVmYXVsdFZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlXG5cdFx0XHQjIFx0aWYgIV8uaXNGdW5jdGlvbihmaWVsZC5kZWZhdWx0VmFsdWUpXG5cdFx0XHQjIFx0XHRmcy5kZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWVcblxuXHRcdGlmIGZpZWxkLnJlYWRvbmx5XG5cdFx0XHRmcy5hdXRvZm9ybS5yZWFkb25seSA9IHRydWVcblxuXHRcdGlmIGZpZWxkLmRpc2FibGVkXG5cdFx0XHRmcy5hdXRvZm9ybS5kaXNhYmxlZCA9IHRydWVcblxuXHRcdGlmIGZpZWxkLmlubGluZUhlbHBUZXh0XG5cdFx0XHRmcy5hdXRvZm9ybS5pbmxpbmVIZWxwVGV4dCA9IGZpZWxkLmlubGluZUhlbHBUZXh0XG5cblx0XHRpZiBmaWVsZC5ibGFja2JveFxuXHRcdFx0ZnMuYmxhY2tib3ggPSB0cnVlXG5cblx0XHRpZiBfLmhhcyhmaWVsZCwgJ21pbicpXG5cdFx0XHRmcy5taW4gPSBmaWVsZC5taW5cblx0XHRpZiBfLmhhcyhmaWVsZCwgJ21heCcpXG5cdFx0XHRmcy5tYXggPSBmaWVsZC5tYXhcblxuXHRcdCMg5Y+q5pyJ55Sf5Lqn546v5aKD5omN6YeN5bu657Si5byVXG5cdFx0aWYgTWV0ZW9yLmlzUHJvZHVjdGlvblxuXHRcdFx0aWYgZmllbGQuaW5kZXhcblx0XHRcdFx0ZnMuaW5kZXggPSBmaWVsZC5pbmRleFxuXHRcdFx0ZWxzZSBpZiBmaWVsZC5zb3J0YWJsZVxuXHRcdFx0XHRmcy5pbmRleCA9IHRydWVcblxuXHRcdHNjaGVtYVtmaWVsZF9uYW1lXSA9IGZzXG5cblx0cmV0dXJuIHNjaGVtYVxuXG5cbkNyZWF0b3IuZ2V0RmllbGREaXNwbGF5VmFsdWUgPSAob2JqZWN0X25hbWUsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKS0+XG5cdGh0bWwgPSBmaWVsZF92YWx1ZVxuXHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0aWYgIW9iamVjdFxuXHRcdHJldHVybiBcIlwiXG5cdGZpZWxkID0gb2JqZWN0LmZpZWxkcyhmaWVsZF9uYW1lKVxuXHRpZiAhZmllbGRcblx0XHRyZXR1cm4gXCJcIlxuXG5cdGlmIGZpZWxkLnR5cGUgPT0gXCJkYXRldGltZVwiXG5cdFx0aHRtbCA9IG1vbWVudCh0aGlzLnZhbCkuZm9ybWF0KCdZWVlZLU1NLUREIEg6bW0nKVxuXHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJkYXRlXCJcblx0XHRodG1sID0gbW9tZW50KHRoaXMudmFsKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuXG5cdHJldHVybiBodG1sXG5cbkNyZWF0b3IuY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5ID0gKGZpZWxkX3R5cGUpLT5cblx0cmV0dXJuIFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVcIiwgXCJjdXJyZW5jeVwiLCBcIm51bWJlclwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKVxuXG5DcmVhdG9yLnB1c2hCZXR3ZWVuQnVpbHRpbk9wdGlvbmFscyA9IChmaWVsZF90eXBlLCBvcGVyYXRpb25zKS0+XG5cdGJ1aWx0aW5WYWx1ZXMgPSBDcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVzKGZpZWxkX3R5cGUpXG5cdGlmIGJ1aWx0aW5WYWx1ZXNcblx0XHRfLmZvckVhY2ggYnVpbHRpblZhbHVlcywgKGJ1aWx0aW5JdGVtLCBrZXkpLT5cblx0XHRcdG9wZXJhdGlvbnMucHVzaCh7bGFiZWw6IGJ1aWx0aW5JdGVtLmxhYmVsLCB2YWx1ZToga2V5fSlcblxuQ3JlYXRvci5nZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyA9IChmaWVsZF90eXBlLCBpc19jaGVja19vbmx5KS0+XG5cdCMg6L+H5ruk5Zmo5a2X5q6157G75Z6L5a+55bqU55qE5YaF572u6YCJ6aG5XG5cdGlmIFtcImRhdGVcIiwgXCJkYXRldGltZVwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKVxuXHRcdHJldHVybiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlcyhpc19jaGVja19vbmx5LCBmaWVsZF90eXBlKVxuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVJdGVtID0gKGZpZWxkX3R5cGUsIGtleSktPlxuXHQjIOi/h+a7pOWZqOWtl+auteexu+Wei+WvueW6lOeahOWGhee9rumAiemhuVxuXHRpZiBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIl0uaW5jbHVkZXMoZmllbGRfdHlwZSlcblx0XHRyZXR1cm4gQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwga2V5KVxuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluT3BlcmF0aW9uID0gKGZpZWxkX3R5cGUsIHZhbHVlKS0+XG5cdCMg5qC55o2u6L+H5ruk5Zmo55qE6L+H5ruk5YC877yM6I635Y+W5a+55bqU55qE5YaF572u6L+Q566X56ymXG5cdCMg5q+U5aaCdmFsdWXkuLpsYXN0X3llYXLvvIzov5Tlm55iZXR3ZWVuX3RpbWVfbGFzdF95ZWFyXG5cdHVubGVzcyBfLmlzU3RyaW5nKHZhbHVlKVxuXHRcdHJldHVyblxuXHRiZXR3ZWVuQnVpbHRpblZhbHVlcyA9IENyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5WYWx1ZXMoZmllbGRfdHlwZSlcblx0dW5sZXNzIGJldHdlZW5CdWlsdGluVmFsdWVzXG5cdFx0cmV0dXJuXG5cdHJlc3VsdCA9IG51bGxcblx0Xy5lYWNoIGJldHdlZW5CdWlsdGluVmFsdWVzLCAoaXRlbSwgb3BlcmF0aW9uKS0+XG5cdFx0aWYgaXRlbS5rZXkgPT0gdmFsdWVcblx0XHRcdHJlc3VsdCA9IG9wZXJhdGlvblxuXHRyZXR1cm4gcmVzdWx0XG5cbiMg5aaC5p6c5Y+q5piv5Li65Yik5patb3BlcmF0aW9u5piv5ZCm5a2Y5Zyo77yM5YiZ5rKh5b+F6KaB6K6h566XdmFsdWVz77yM5Lyg5YWlaXNfY2hlY2tfb25seeS4unRydWXljbPlj69cbkNyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzID0gKGlzX2NoZWNrX29ubHksIGZpZWxkX3R5cGUpLT5cblx0IyDov4fmu6Tlmajml7bpl7TlrZfmrrXnsbvlnovlr7nlupTnmoTlhoXnva7pgInpoblcblx0cmV0dXJuIHtcblx0XHRcImJldHdlZW5fdGltZV9sYXN0X3llYXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfeWVhclwiKSxcblx0XHRcImJldHdlZW5fdGltZV90aGlzX3llYXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRoaXNfeWVhclwiKSxcblx0XHRcImJldHdlZW5fdGltZV9uZXh0X3llYXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfeWVhclwiKSxcblx0XHRcImJldHdlZW5fdGltZV9sYXN0X3F1YXJ0ZXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfcXVhcnRlclwiKSxcblx0XHRcImJldHdlZW5fdGltZV90aGlzX3F1YXJ0ZXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRoaXNfcXVhcnRlclwiKSxcblx0XHRcImJldHdlZW5fdGltZV9uZXh0X3F1YXJ0ZXJcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfcXVhcnRlclwiKSxcblx0XHRcImJldHdlZW5fdGltZV9sYXN0X21vbnRoXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0X21vbnRoXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RoaXNfbW9udGhcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRoaXNfbW9udGhcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF9tb250aFwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF9tb250aFwiKSxcblx0XHRcImJldHdlZW5fdGltZV9sYXN0X3dlZWtcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3Rfd2Vla1wiKSxcblx0XHRcImJldHdlZW5fdGltZV90aGlzX3dlZWtcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRoaXNfd2Vla1wiKSxcblx0XHRcImJldHdlZW5fdGltZV9uZXh0X3dlZWtcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfd2Vla1wiKSxcblx0XHRcImJldHdlZW5fdGltZV95ZXN0ZGF5XCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ5ZXN0ZGF5XCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RvZGF5XCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0b2RheVwiKSxcblx0XHRcImJldHdlZW5fdGltZV90b21vcnJvd1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidG9tb3Jyb3dcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbGFzdF83X2RheXNcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfN19kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfMzBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF8zMF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfNjBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF82MF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfOTBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF85MF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfMTIwX2RheXNcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfMTIwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF83X2RheXNcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfN19kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfMzBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF8zMF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfNjBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF82MF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfOTBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF85MF9kYXlzXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfMTIwX2RheXNcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfMTIwX2RheXNcIilcblx0fVxuXG5DcmVhdG9yLmdldFF1YXJ0ZXJTdGFydE1vbnRoID0gKG1vbnRoKS0+XG5cdGlmICFtb250aFxuXHRcdG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpXG5cdFxuXHRpZiBtb250aCA8IDNcblx0XHRyZXR1cm4gMFxuXHRlbHNlIGlmIG1vbnRoIDwgNlxuXHRcdHJldHVybiAzXG5cdGVsc2UgaWYgbW9udGggPCA5XG5cdFx0cmV0dXJuIDZcblx0XG5cdHJldHVybiA5XG5cblxuQ3JlYXRvci5nZXRMYXN0UXVhcnRlckZpcnN0RGF5ID0gKHllYXIsbW9udGgpLT5cblx0aWYgIXllYXJcblx0XHR5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXG5cdGlmICFtb250aFxuXHRcdG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpXG5cdFxuXHRpZiBtb250aCA8IDNcblx0XHR5ZWFyLS1cblx0XHRtb250aCA9IDlcblx0ZWxzZSBpZiBtb250aCA8IDZcblx0XHRtb250aCA9IDBcblx0ZWxzZSBpZiBtb250aCA8IDlcblx0XHRtb250aCA9IDNcblx0ZWxzZSBcblx0XHRtb250aCA9IDZcblx0XG5cdHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcblx0XG5cbkNyZWF0b3IuZ2V0TmV4dFF1YXJ0ZXJGaXJzdERheSA9ICh5ZWFyLG1vbnRoKS0+XG5cdGlmICF5ZWFyXG5cdFx0eWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKVxuXHRpZiAhbW9udGhcblx0XHRtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKVxuXHRcblx0aWYgbW9udGggPCAzXG5cdFx0bW9udGggPSAzXG5cdGVsc2UgaWYgbW9udGggPCA2XG5cdFx0bW9udGggPSA2XG5cdGVsc2UgaWYgbW9udGggPCA5XG5cdFx0bW9udGggPSA5XG5cdGVsc2Vcblx0XHR5ZWFyKytcblx0XHRtb250aCA9IDBcblx0XG5cdHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcblxuQ3JlYXRvci5nZXRNb250aERheXMgPSAoeWVhcixtb250aCktPlxuXHRpZiBtb250aCA9PSAxMVxuXHRcdHJldHVybiAzMVxuXHRcblx0bWlsbGlzZWNvbmQgPSAxMDAwICogNjAgKiA2MCAqIDI0XG5cdHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuXHRlbmREYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgrMSwgMSlcblx0ZGF5cyA9IChlbmREYXRlLXN0YXJ0RGF0ZSkvbWlsbGlzZWNvbmRcblx0cmV0dXJuIGRheXNcblxuQ3JlYXRvci5nZXRMYXN0TW9udGhGaXJzdERheSA9ICh5ZWFyLCBtb250aCktPlxuXHRpZiAheWVhclxuXHRcdHllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcblx0aWYgIW1vbnRoXG5cdFx0bW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKClcblx0XG5cdCMg5pyI5Lu95Li6MOS7o+ihqOacrOW5tOeahOesrOS4gOaciFxuXHRpZiBtb250aCA9PSAwXG5cdFx0bW9udGggPSAxMVxuXHRcdHllYXItLVxuXHRcdHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcblx0XG5cdCMg5ZCm5YiZLOWPquWHj+WOu+aciOS7vVxuXHRtb250aC0tO1xuXHRyZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG5cdFxuQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0gPSAoZmllbGRfdHlwZSwga2V5KS0+XG5cdCMg6L+H5ruk5ZmoYmV0d2Vlbui/kOeul+espu+8jOeOsOeul+aXpeacny/ml6XmnJ/ml7bpl7TnsbvlnovlrZfmrrXnmoR2YWx1ZXPlgLxcblx0bm93ID0gbmV3IERhdGUoKVxuXHQjIOS4gOWkqeeahOavq+enkuaVsFxuXHRtaWxsaXNlY29uZCA9IDEwMDAgKiA2MCAqIDYwICogMjRcblx0eWVzdGRheSA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSBtaWxsaXNlY29uZClcblx0dG9tb3Jyb3cgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgbWlsbGlzZWNvbmQpXG5cdCMg5LiA5ZGo5Lit55qE5p+Q5LiA5aSpXG5cdHdlZWsgPSBub3cuZ2V0RGF5KClcblx0IyDlh4/ljrvnmoTlpKnmlbBcblx0bWludXNEYXkgPSBpZiB3ZWVrICE9IDAgdGhlbiB3ZWVrIC0gMSBlbHNlIDZcblx0bW9uZGF5ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIChtaW51c0RheSAqIG1pbGxpc2Vjb25kKSlcblx0c3VuZGF5ID0gbmV3IERhdGUobW9uZGF5LmdldFRpbWUoKSArICg2ICogbWlsbGlzZWNvbmQpKVxuXHQjIOS4iuWRqOaXpVxuXHRsYXN0U3VuZGF5ID0gbmV3IERhdGUobW9uZGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKVxuXHQjIOS4iuWRqOS4gFxuXHRsYXN0TW9uZGF5ID0gbmV3IERhdGUobGFzdFN1bmRheS5nZXRUaW1lKCkgLSAobWlsbGlzZWNvbmQgKiA2KSlcblx0IyDkuIvlkajkuIBcblx0bmV4dE1vbmRheSA9IG5ldyBEYXRlKHN1bmRheS5nZXRUaW1lKCkgKyBtaWxsaXNlY29uZClcblx0IyDkuIvlkajml6Vcblx0bmV4dFN1bmRheSA9IG5ldyBEYXRlKG5leHRNb25kYXkuZ2V0VGltZSgpICsgKG1pbGxpc2Vjb25kICogNikpXG5cdGN1cnJlbnRZZWFyID0gbm93LmdldEZ1bGxZZWFyKClcblx0cHJldmlvdXNZZWFyID0gY3VycmVudFllYXIgLSAxXG5cdG5leHRZZWFyID0gY3VycmVudFllYXIgKyAxXG5cdCMg5b2T5YmN5pyI5Lu9XG5cdGN1cnJlbnRNb250aCA9IG5vdy5nZXRNb250aCgpXG5cdCMg6K6h5pWw5bm044CB5pyIXG5cdHllYXIgPSBub3cuZ2V0RnVsbFllYXIoKVxuXHRtb250aCA9IG5vdy5nZXRNb250aCgpXG5cdCMg5pys5pyI56ys5LiA5aSpXG5cdGZpcnN0RGF5ID0gbmV3IERhdGUoY3VycmVudFllYXIsY3VycmVudE1vbnRoLDEpXG5cblx0IyDlvZPkuLoxMuaciOeahOaXtuWAmeW5tOS7vemcgOimgeWKoDFcblx0IyDmnIjku73pnIDopoHmm7TmlrDkuLowIOS5n+WwseaYr+S4i+S4gOW5tOeahOesrOS4gOS4quaciFxuXHRpZiBjdXJyZW50TW9udGggPT0gMTFcblx0XHR5ZWFyKytcblx0XHRtb250aCsrXG5cdGVsc2Vcblx0XHRtb250aCsrXG5cdFxuXHQjIOS4i+aciOesrOS4gOWkqVxuXHRuZXh0TW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuXHQjIOS4i+aciOacgOWQjuS4gOWkqVxuXHRuZXh0TW9udGhGaW5hbERheSA9IG5ldyBEYXRlKHllYXIsbW9udGgsQ3JlYXRvci5nZXRNb250aERheXMoeWVhcixtb250aCkpXG5cdCMg5pys5pyI5pyA5ZCO5LiA5aSpXG5cdGxhc3REYXkgPSBuZXcgRGF0ZShuZXh0TW9udGhGaXJzdERheS5nZXRUaW1lKCkgLSBtaWxsaXNlY29uZClcblx0IyDkuIrmnIjnrKzkuIDlpKlcblx0bGFzdE1vbnRoRmlyc3REYXkgPSBDcmVhdG9yLmdldExhc3RNb250aEZpcnN0RGF5KGN1cnJlbnRZZWFyLGN1cnJlbnRNb250aClcblx0IyDkuIrmnIjmnIDlkI7kuIDlpKlcblx0bGFzdE1vbnRoRmluYWxEYXkgPSBuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkgLSBtaWxsaXNlY29uZClcblx0IyDmnKzlraPluqblvIDlp4vml6Vcblx0dGhpc1F1YXJ0ZXJTdGFydERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLENyZWF0b3IuZ2V0UXVhcnRlclN0YXJ0TW9udGgoY3VycmVudE1vbnRoKSwxKVxuXHQjIOacrOWto+W6pue7k+adn+aXpVxuXHR0aGlzUXVhcnRlckVuZERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLENyZWF0b3IuZ2V0UXVhcnRlclN0YXJ0TW9udGgoY3VycmVudE1vbnRoKSsyLENyZWF0b3IuZ2V0TW9udGhEYXlzKGN1cnJlbnRZZWFyLENyZWF0b3IuZ2V0UXVhcnRlclN0YXJ0TW9udGgoY3VycmVudE1vbnRoKSsyKSlcblx0IyDkuIrlraPluqblvIDlp4vml6Vcblx0bGFzdFF1YXJ0ZXJTdGFydERheSA9IENyZWF0b3IuZ2V0TGFzdFF1YXJ0ZXJGaXJzdERheShjdXJyZW50WWVhcixjdXJyZW50TW9udGgpXG5cdCMg5LiK5a2j5bqm57uT5p2f5pelXG5cdGxhc3RRdWFydGVyRW5kRGF5ID0gbmV3IERhdGUobGFzdFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0TW9udGgoKSsyLENyZWF0b3IuZ2V0TW9udGhEYXlzKGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSxsYXN0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkrMikpXG5cdCMg5LiL5a2j5bqm5byA5aeL5pelXG5cdG5leHRRdWFydGVyU3RhcnREYXkgPSBDcmVhdG9yLmdldE5leHRRdWFydGVyRmlyc3REYXkoY3VycmVudFllYXIsY3VycmVudE1vbnRoKVxuXHQjIOS4i+Wto+W6pue7k+adn+aXpVxuXHRuZXh0UXVhcnRlckVuZERheSA9IG5ldyBEYXRlKG5leHRRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSxuZXh0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkrMixDcmVhdG9yLmdldE1vbnRoRGF5cyhuZXh0UXVhcnRlclN0YXJ0RGF5LmdldEZ1bGxZZWFyKCksbmV4dFF1YXJ0ZXJTdGFydERheS5nZXRNb250aCgpKzIpKVxuXHQjIOi/h+WOuzflpKkgXG5cdGxhc3RfN19kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICg2ICogbWlsbGlzZWNvbmQpKVxuXHQjIOi/h+WOuzMw5aSpXG5cdGxhc3RfMzBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAoMjkgKiBtaWxsaXNlY29uZCkpXG5cdCMg6L+H5Y67NjDlpKlcblx0bGFzdF82MF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICg1OSAqIG1pbGxpc2Vjb25kKSlcblx0IyDov4fljrs5MOWkqVxuXHRsYXN0XzkwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDg5ICogbWlsbGlzZWNvbmQpKVxuXHQjIOi/h+WOuzEyMOWkqVxuXHRsYXN0XzEyMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICgxMTkgKiBtaWxsaXNlY29uZCkpXG5cdCMg5pyq5p2lN+WkqSBcblx0bmV4dF83X2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDYgKiBtaWxsaXNlY29uZCkpXG5cdCMg5pyq5p2lMzDlpKlcblx0bmV4dF8zMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArICgyOSAqIG1pbGxpc2Vjb25kKSlcblx0IyDmnKrmnaU2MOWkqVxuXHRuZXh0XzYwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDU5ICogbWlsbGlzZWNvbmQpKVxuXHQjIOacquadpTkw5aSpXG5cdG5leHRfOTBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoODkgKiBtaWxsaXNlY29uZCkpXG5cdCMg5pyq5p2lMTIw5aSpXG5cdG5leHRfMTIwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDExOSAqIG1pbGxpc2Vjb25kKSlcblxuXHRzd2l0Y2gga2V5XG5cdFx0d2hlbiBcImxhc3RfeWVhclwiXG5cdFx0XHQj5Y675bm0XG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0X3llYXJcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7cHJldmlvdXNZZWFyfS0wMS0wMVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3ByZXZpb3VzWWVhcn0tMTItMzFUMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcInRoaXNfeWVhclwiXG5cdFx0XHQj5LuK5bm0XG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90aGlzX3llYXJcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7Y3VycmVudFllYXJ9LTAxLTAxVDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7Y3VycmVudFllYXJ9LTEyLTMxVDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJuZXh0X3llYXJcIlxuXHRcdFx0I+aYjuW5tFxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF95ZWFyXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje25leHRZZWFyfS0wMS0wMVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje25leHRZZWFyfS0xMi0zMVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF9xdWFydGVyXCJcblx0XHRcdCPkuIrlraPluqZcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KGxhc3RRdWFydGVyU3RhcnREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckxhc3REYXkgPSBtb21lbnQobGFzdFF1YXJ0ZXJFbmREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfcXVhcnRlclwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJGaXJzdERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJMYXN0RGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidGhpc19xdWFydGVyXCJcblx0XHRcdCPmnKzlraPluqZcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KHRoaXNRdWFydGVyU3RhcnREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckxhc3REYXkgPSBtb21lbnQodGhpc1F1YXJ0ZXJFbmREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfcXVhcnRlclwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJGaXJzdERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJMYXN0RGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF9xdWFydGVyXCJcblx0XHRcdCPkuIvlraPluqZcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KG5leHRRdWFydGVyU3RhcnREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckxhc3REYXkgPSBtb21lbnQobmV4dFF1YXJ0ZXJFbmREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfcXVhcnRlclwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJGaXJzdERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJMYXN0RGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF9tb250aFwiXG5cdFx0XHQj5LiK5pyIXG5cdFx0XHRzdHJGaXJzdERheSA9IG1vbWVudChsYXN0TW9udGhGaXJzdERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyTGFzdERheSA9IG1vbWVudChsYXN0TW9udGhGaW5hbERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF9tb250aFwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJGaXJzdERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJMYXN0RGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidGhpc19tb250aFwiXG5cdFx0XHQj5pys5pyIXG5cdFx0XHRzdHJGaXJzdERheSA9IG1vbWVudChmaXJzdERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyTGFzdERheSA9IG1vbWVudChsYXN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90aGlzX21vbnRoXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJuZXh0X21vbnRoXCJcblx0XHRcdCPkuIvmnIhcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KG5leHRNb250aEZpcnN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJMYXN0RGF5ID0gbW9tZW50KG5leHRNb250aEZpbmFsRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0X21vbnRoXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJsYXN0X3dlZWtcIlxuXHRcdFx0I+S4iuWRqFxuXHRcdFx0c3RyTW9uZGF5ID0gbW9tZW50KGxhc3RNb25kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0clN1bmRheSA9IG1vbWVudChsYXN0U3VuZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0X3dlZWtcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyTW9uZGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN1bmRheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcInRoaXNfd2Vla1wiXG5cdFx0XHQj5pys5ZGoXG5cdFx0XHRzdHJNb25kYXkgPSBtb21lbnQobW9uZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJTdW5kYXkgPSBtb21lbnQoc3VuZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90aGlzX3dlZWtcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyTW9uZGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN1bmRheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfd2Vla1wiXG5cdFx0XHQj5LiL5ZGoXG5cdFx0XHRzdHJNb25kYXkgPSBtb21lbnQobmV4dE1vbmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyU3VuZGF5ID0gbW9tZW50KG5leHRTdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfd2Vla1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJNb25kYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3VuZGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwieWVzdGRheVwiXG5cdFx0XHQj5pio5aSpXG5cdFx0XHRzdHJZZXN0ZGF5ID0gbW9tZW50KHllc3RkYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3llc3RkYXlcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyWWVzdGRheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJZZXN0ZGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidG9kYXlcIlxuXHRcdFx0I+S7iuWkqVxuXHRcdFx0c3RyVG9kYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90b2RheVwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJUb2RheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJUb2RheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcInRvbW9ycm93XCJcblx0XHRcdCPmmI7lpKlcblx0XHRcdHN0clRvbW9ycm93ID0gbW9tZW50KHRvbW9ycm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90b21vcnJvd1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJUb21vcnJvd31UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJUb21vcnJvd31UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3RfN19kYXlzXCJcblx0XHRcdCPov4fljrs35aSpXG5cdFx0XHRzdHJTdGFydERheSA9IG1vbWVudChsYXN0XzdfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSBcblx0XHRcdHN0ckVuZERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfN19kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3RfMzBfZGF5c1wiXG5cdFx0XHQj6L+H5Y67MzDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfMzBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF8zMF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3RfNjBfZGF5c1wiXG5cdFx0XHQj6L+H5Y67NjDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfNjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF82MF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3RfOTBfZGF5c1wiXG5cdFx0XHQj6L+H5Y67OTDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfOTBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF85MF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3RfMTIwX2RheXNcIlxuXHRcdFx0I+i/h+WOuzEyMOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF8xMjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF8xMjBfZGF5c1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJTdGFydERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJFbmREYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJuZXh0XzdfZGF5c1wiXG5cdFx0XHQj5pyq5p2lN+WkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobmV4dF83X2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfN19kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfMzBfZGF5c1wiXG5cdFx0XHQj5pyq5p2lMzDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5leHRfMzBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF8zMF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfNjBfZGF5c1wiXG5cdFx0XHQj5pyq5p2lNjDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5leHRfNjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF82MF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfOTBfZGF5c1wiXG5cdFx0XHQj5pyq5p2lOTDlpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5leHRfOTBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF85MF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfMTIwX2RheXNcIlxuXHRcdFx0I+acquadpTEyMOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobmV4dF8xMjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF8xMjBfZGF5c1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJTdGFydERheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJFbmREYXl9VDIzOjU5OjU5WlwiKVxuXHRcblx0dmFsdWVzID0gW3N0YXJ0VmFsdWUsIGVuZFZhbHVlXVxuXHRpZiBmaWVsZF90eXBlID09IFwiZGF0ZXRpbWVcIlxuXHRcdCMg5pe26Ze057G75Z6L5a2X5q6177yM5YaF572u5pe26Ze06IyD5Zu05bqU6K+l6ICD6JmR5YGP56e75pe25Yy65YC877yM5ZCm5YiZ6L+H5ruk5pWw5o2u5a2Y5Zyo5YGP5beuXG5cdFx0IyDpnZ7lhoXnva7ml7bpl7TojIPlm7Tml7bvvIznlKjmiLfpgJrov4fml7bpl7Tmjqfku7bpgInmi6nnmoTojIPlm7TvvIzkvJroh6rliqjlpITnkIbml7bljLrlgY/lt67mg4XlhrVcblx0XHQjIOaXpeacn+exu+Wei+Wtl+aute+8jOaVsOaNruW6k+acrOadpeWwseWtmOeahOaYr1VUQ+eahDDngrnvvIzkuI3lrZjlnKjlgY/lt65cblx0XHRfLmZvckVhY2ggdmFsdWVzLCAoZnYpLT5cblx0XHRcdGlmIGZ2XG5cdFx0XHRcdGZ2LnNldEhvdXJzKGZ2LmdldEhvdXJzKCkgKyBmdi5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjAgKVxuXHRcblx0cmV0dXJuIHtcblx0XHRsYWJlbDogbGFiZWxcblx0XHRrZXk6IGtleVxuXHRcdHZhbHVlczogdmFsdWVzXG5cdH1cblxuQ3JlYXRvci5nZXRGaWVsZERlZmF1bHRPcGVyYXRpb24gPSAoZmllbGRfdHlwZSktPlxuXHRpZiBmaWVsZF90eXBlICYmIENyZWF0b3IuY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5KGZpZWxkX3R5cGUpXG5cdFx0cmV0dXJuICdiZXR3ZWVuJ1xuXHRlbHNlIGlmIFtcInRleHRhcmVhXCIsIFwidGV4dFwiLCBcImNvZGVcIl0uaW5jbHVkZXMoZmllbGRfdHlwZSlcblx0XHRyZXR1cm4gJ2NvbnRhaW5zJ1xuXHRlbHNlXG5cdFx0cmV0dXJuIFwiPVwiXG5cbkNyZWF0b3IuZ2V0RmllbGRPcGVyYXRpb24gPSAoZmllbGRfdHlwZSkgLT5cblx0IyDml6XmnJ/nsbvlnos6IGRhdGUsIGRhdGV0aW1lICDmlK/mjIHmk43kvZznrKY6IFwiPVwiLCBcIjw+XCIsIFwiPFwiLCBcIj5cIiwgXCI8PVwiLCBcIj49XCJcblx0IyDmlofmnKznsbvlnos6IHRleHQsIHRleHRhcmVhLCBodG1sICDmlK/mjIHmk43kvZznrKY6IFwiPVwiLCBcIjw+XCIsIFwiY29udGFpbnNcIiwgXCJub3Rjb250YWluc1wiLCBcInN0YXJ0c3dpdGhcIlxuXHQjIOmAieaLqeexu+WeizogbG9va3VwLCBtYXN0ZXJfZGV0YWlsLCBzZWxlY3Qg5pSv5oyB5pON5L2c56ymOiBcIj1cIiwgXCI8PlwiXG5cdCMg5pWw5YC857G75Z6LOiBjdXJyZW5jeSwgbnVtYmVyICDmlK/mjIHmk43kvZznrKY6IFwiPVwiLCBcIjw+XCIsIFwiPFwiLCBcIj5cIiwgXCI8PVwiLCBcIj49XCJcblx0IyDluIPlsJTnsbvlnos6IGJvb2xlYW4gIOaUr+aMgeaTjeS9nOespjogXCI9XCIsIFwiPD5cIlxuXHQjIOaVsOe7hOexu+WeizogY2hlY2tib3gsIFt0ZXh0XSAg5pSv5oyB5pON5L2c56ymOiBcIj1cIiwgXCI8PlwiXG5cblx0b3B0aW9uYWxzID0ge1xuXHRcdGVxdWFsOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fZXF1YWxcIiksIHZhbHVlOiBcIj1cIn0sXG5cdFx0dW5lcXVhbDoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX3VuZXF1YWxcIiksIHZhbHVlOiBcIjw+XCJ9LFxuXHRcdGxlc3NfdGhhbjoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2xlc3NfdGhhblwiKSwgdmFsdWU6IFwiPFwifSxcblx0XHRncmVhdGVyX3RoYW46IHtsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9ncmVhdGVyX3RoYW5cIiksIHZhbHVlOiBcIj5cIn0sXG5cdFx0bGVzc19vcl9lcXVhbDoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2xlc3Nfb3JfZXF1YWxcIiksIHZhbHVlOiBcIjw9XCJ9LFxuXHRcdGdyZWF0ZXJfb3JfZXF1YWw6IHtsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9ncmVhdGVyX29yX2VxdWFsXCIpLCB2YWx1ZTogXCI+PVwifSxcblx0XHRjb250YWluczoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2NvbnRhaW5zXCIpLCB2YWx1ZTogXCJjb250YWluc1wifSxcblx0XHRub3RfY29udGFpbjoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2RvZXNfbm90X2NvbnRhaW5cIiksIHZhbHVlOiBcIm5vdGNvbnRhaW5zXCJ9LFxuXHRcdHN0YXJ0c193aXRoOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fc3RhcnRzX3dpdGhcIiksIHZhbHVlOiBcInN0YXJ0c3dpdGhcIn0sXG5cdFx0YmV0d2Vlbjoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5cIiksIHZhbHVlOiBcImJldHdlZW5cIn0sXG5cdH1cblxuXHRpZiBmaWVsZF90eXBlID09IHVuZGVmaW5lZFxuXHRcdHJldHVybiBfLnZhbHVlcyhvcHRpb25hbHMpXG5cblx0b3BlcmF0aW9ucyA9IFtdXG5cblx0aWYgQ3JlYXRvci5jaGVja0ZpZWxkVHlwZVN1cHBvcnRCZXR3ZWVuUXVlcnkoZmllbGRfdHlwZSlcblx0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmJldHdlZW4pXG5cdFx0Q3JlYXRvci5wdXNoQmV0d2VlbkJ1aWx0aW5PcHRpb25hbHMoZmllbGRfdHlwZSwgb3BlcmF0aW9ucylcblx0ZWxzZSBpZiBmaWVsZF90eXBlID09IFwidGV4dFwiIG9yIGZpZWxkX3R5cGUgPT0gXCJ0ZXh0YXJlYVwiIG9yIGZpZWxkX3R5cGUgPT0gXCJodG1sXCIgb3IgZmllbGRfdHlwZSA9PSBcImNvZGVcIlxuI1x0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbCwgb3B0aW9uYWxzLmNvbnRhaW5zLCBvcHRpb25hbHMubm90X2NvbnRhaW4sIG9wdGlvbmFscy5zdGFydHNfd2l0aClcblx0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmNvbnRhaW5zKVxuXHRlbHNlIGlmIGZpZWxkX3R5cGUgPT0gXCJsb29rdXBcIiBvciBmaWVsZF90eXBlID09IFwibWFzdGVyX2RldGFpbFwiIG9yIGZpZWxkX3R5cGUgPT0gXCJzZWxlY3RcIlxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKVxuXHRlbHNlIGlmIGZpZWxkX3R5cGUgPT0gXCJjdXJyZW5jeVwiIG9yIGZpZWxkX3R5cGUgPT0gXCJudW1iZXJcIlxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsLCBvcHRpb25hbHMubGVzc190aGFuLCBvcHRpb25hbHMuZ3JlYXRlcl90aGFuLCBvcHRpb25hbHMubGVzc19vcl9lcXVhbCwgb3B0aW9uYWxzLmdyZWF0ZXJfb3JfZXF1YWwpXG5cdGVsc2UgaWYgZmllbGRfdHlwZSA9PSBcImJvb2xlYW5cIlxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKVxuXHRlbHNlIGlmIGZpZWxkX3R5cGUgPT0gXCJjaGVja2JveFwiXG5cdFx0b3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpXG5cdGVsc2UgaWYgZmllbGRfdHlwZSA9PSBcIlt0ZXh0XVwiXG5cdFx0b3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpXG5cdGVsc2Vcblx0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbClcblxuXHRyZXR1cm4gb3BlcmF0aW9uc1xuXG4jIyNcbiAgICDlhYjmjInnhafmnInmjpLluo/lj7fnmoTlsI/nmoTlnKjliY3vvIzlpKfnmoTlnKjlkI5cbiAgICDlho3lsIbmsqHmnInmjpLluo/lj7fnmoTmmL7npLrlnKhcbiMjI1xuQ3JlYXRvci5nZXRPYmplY3RGaWVsZHNOYW1lID0gKG9iamVjdF9uYW1lKS0+XG5cdGZpZWxkcyA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKT8uZmllbGRzXG5cdGZpZWxkc0FyciA9IFtdXG5cblx0Xy5lYWNoIGZpZWxkcywgKGZpZWxkKS0+XG5cdFx0ZmllbGRzQXJyLnB1c2gge25hbWU6IGZpZWxkLm5hbWUsIHNvcnRfbm86IGZpZWxkLnNvcnRfbm99XG5cblx0ZmllbGRzTmFtZSA9IFtdXG5cdF8uZWFjaCBfLnNvcnRCeShmaWVsZHNBcnIsIFwic29ydF9ub1wiKSwgKGZpZWxkKS0+XG5cdFx0ZmllbGRzTmFtZS5wdXNoKGZpZWxkLm5hbWUpXG5cdHJldHVybiBmaWVsZHNOYW1lXG4iLCJDcmVhdG9yLmdldFNlbGVjdE9wdGlvbnMgPSBmdW5jdGlvbihmaWVsZFNjaGVtYSkge1xuICB2YXIgZGF0YV90eXBlLCBvcHRpb25zO1xuICBvcHRpb25zID0gZmllbGRTY2hlbWEub3B0aW9ucztcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRhdGFfdHlwZSA9IGZpZWxkU2NoZW1hLmRhdGFfdHlwZTtcbiAgaWYgKCFfLmlzRnVuY3Rpb24ob3B0aW9ucykgJiYgZGF0YV90eXBlICYmIGRhdGFfdHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG9wdGlvbkl0ZW0pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uSXRlbS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFsnbnVtYmVyJywgJ2N1cnJlbmN5JywgJ3BlcmNlbnQnXS5pbmRleE9mKGRhdGFfdHlwZSkgPiAtMSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uSXRlbS52YWx1ZSA9IE51bWJlcihvcHRpb25JdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YV90eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbkl0ZW0udmFsdWUgPSBvcHRpb25JdGVtLnZhbHVlID09PSAndHJ1ZSc7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdFNjaGVtYSA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgZmllbGRzQXJyLCBzY2hlbWE7XG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNjaGVtYSA9IHt9O1xuICBmaWVsZHNBcnIgPSBbXTtcbiAgXy5lYWNoKG9iai5maWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZF9uYW1lKSB7XG4gICAgaWYgKCFfLmhhcyhmaWVsZCwgXCJuYW1lXCIpKSB7XG4gICAgICBmaWVsZC5uYW1lID0gZmllbGRfbmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkc0Fyci5wdXNoKGZpZWxkKTtcbiAgfSk7XG4gIF8uZWFjaChfLnNvcnRCeShmaWVsZHNBcnIsIFwic29ydF9ub1wiKSwgZnVuY3Rpb24oZmllbGQpIHtcbiAgICB2YXIgX29iamVjdCwgX3JlZl9vYmosIF9yZWZlcmVuY2VfdG8sIGF1dG9mb3JtX3R5cGUsIGNvbGxlY3Rpb25OYW1lLCBmaWVsZF9uYW1lLCBmcywgZnNUeXBlLCBpc1VuTGltaXRlZCwgcGVybWlzc2lvbnMsIHJlZiwgcmVmMTtcbiAgICBmaWVsZF9uYW1lID0gZmllbGQubmFtZTtcbiAgICBmcyA9IHt9O1xuICAgIGlmIChmaWVsZC5yZWdFeCkge1xuICAgICAgZnMucmVnRXggPSBmaWVsZC5yZWdFeDtcbiAgICB9XG4gICAgZnMuYXV0b2Zvcm0gPSB7fTtcbiAgICBmcy5hdXRvZm9ybS5tdWx0aXBsZSA9IGZpZWxkLm11bHRpcGxlO1xuICAgIGZzLmF1dG9mb3JtLnJlZmVyZW5jZV90byA9IGZpZWxkLnJlZmVyZW5jZV90bztcbiAgICBhdXRvZm9ybV90eXBlID0gKHJlZiA9IGZpZWxkLmF1dG9mb3JtKSAhPSBudWxsID8gcmVmLnR5cGUgOiB2b2lkIDA7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09IFwidGV4dFwiIHx8IGZpZWxkLnR5cGUgPT09IFwicGhvbmVcIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInRhZ3NcIjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiW3RleHRdXCIgfHwgZmllbGQudHlwZSA9PT0gXCJbcGhvbmVdXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInRhZ3NcIjtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdjb2RlJykge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcIndpZGVhcmVhXCI7XG4gICAgICBmcy5hdXRvZm9ybS5yb3dzID0gZmllbGQucm93cyB8fCAxMjtcbiAgICAgIGlmIChmaWVsZC5sYW5ndWFnZSkge1xuICAgICAgICBmcy5hdXRvZm9ybS5sYW5ndWFnZSA9IGZpZWxkLmxhbmd1YWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwid2lkZWFyZWFcIjtcbiAgICAgIGZzLmF1dG9mb3JtLnJvd3MgPSBmaWVsZC5yb3dzIHx8IDI7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInBhc3N3b3JkXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJwYXNzd29yZFwiO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBEYXRlO1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNQYWQoKSkge1xuICAgICAgICAgIGlmIChTdGVlZG9zLmlzaU9TKCkpIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJkeC1kYXRlLWJveFwiLFxuICAgICAgICAgICAgICB0aW1lem9uZUlkOiBcInV0Y1wiLFxuICAgICAgICAgICAgICBkeERhdGVCb3hPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkXCIsXG4gICAgICAgICAgICAgICAgcGlja2VyVHlwZTogXCJyb2xsZXJzXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0ZWVkb3MtZGF0ZS1tb2JpbGVcIixcbiAgICAgICAgICAgICAgZGF0ZU1vYmlsZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5hdXRvZm9ybS5vdXRGb3JtYXQgPSAneXl5eS1NTS1kZCc7XG4gICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJkeC1kYXRlLWJveFwiLFxuICAgICAgICAgICAgdGltZXpvbmVJZDogXCJ1dGNcIixcbiAgICAgICAgICAgIGR4RGF0ZUJveE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IFwieXl5eS1NTS1kZFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJ0aW1lXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBEYXRlO1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPSB7XG4gICAgICAgICAgdHlwZTogXCJkeC1kYXRlLWJveFwiLFxuICAgICAgICAgIHRpbWV6b25lSWQ6IFwidXRjXCIsXG4gICAgICAgICAgZHhEYXRlQm94T3B0aW9uczoge1xuICAgICAgICAgICAgdHlwZTogXCJ0aW1lXCIsXG4gICAgICAgICAgICBkaXNwbGF5Rm9ybWF0OiBcIkhIOm1tXCJcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBEYXRlO1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNQYWQoKSkge1xuICAgICAgICAgIGlmIChTdGVlZG9zLmlzaU9TKCkpIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJkeC1kYXRlLWJveFwiLFxuICAgICAgICAgICAgICBkeERhdGVCb3hPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IFwieXl5eS1NTS1kZCBISDptbVwiLFxuICAgICAgICAgICAgICAgIHBpY2tlclR5cGU6IFwicm9sbGVyc1wiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdGVlZG9zLWRhdGUtbW9iaWxlXCIsXG4gICAgICAgICAgICAgIGRhdGVNb2JpbGVPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJkYXRldGltZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZHgtZGF0ZS1ib3hcIixcbiAgICAgICAgICAgIGR4RGF0ZUJveE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGQgSEg6bW1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiW09iamVjdF1cIikge1xuICAgICAgZnMudHlwZSA9IFtPYmplY3RdO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJodG1sXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSAnc3RlZWRvc0h0bWwnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJsb29rdXBcIiB8fCBmaWVsZC50eXBlID09PSBcIm1hc3Rlcl9kZXRhaWxcIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGZzLmF1dG9mb3JtLnNob3dJY29uID0gZmllbGQuc2hvd0ljb247XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgfVxuICAgICAgaWYgKCFmaWVsZC5oaWRkZW4pIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0uZmlsdGVycyA9IGZpZWxkLmZpbHRlcnM7XG4gICAgICAgIGZzLmF1dG9mb3JtLmRlcGVuZE9uID0gZmllbGQuZGVwZW5kX29uO1xuICAgICAgICBpZiAoZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uKSB7XG4gICAgICAgICAgZnMuYmVmb3JlT3BlbkZ1bmN0aW9uID0gZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGZzLmZpbHRlcnNGdW5jdGlvbiA9IGZpZWxkLmZpbHRlcnNGdW5jdGlvbiA/IGZpZWxkLmZpbHRlcnNGdW5jdGlvbiA6IENyZWF0b3IuZXZhbHVhdGVGaWx0ZXJzO1xuICAgICAgICBpZiAoZmllbGQub3B0aW9uc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgZnMub3B0aW9uc0Z1bmN0aW9uID0gZmllbGQub3B0aW9uc0Z1bmN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5yZWZlcmVuY2VfdG8pIHtcbiAgICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgICAgICBpZiAoZmllbGQuY3JlYXRlRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKGZpZWxkLmNyZWF0ZUZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgICBmcy5jcmVhdGVGdW5jdGlvbiA9IGZpZWxkLmNyZWF0ZUZ1bmN0aW9uO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKF8uaXNTdHJpbmcoZmllbGQucmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICAgIF9yZWZfb2JqID0gQ3JlYXRvci5PYmplY3RzW2ZpZWxkLnJlZmVyZW5jZV90b107XG4gICAgICAgICAgICAgICAgaWYgKF9yZWZfb2JqICE9IG51bGwgPyAocmVmMSA9IF9yZWZfb2JqLnBlcm1pc3Npb25zKSAhPSBudWxsID8gcmVmMS5hbGxvd0NyZWF0ZSA6IHZvaWQgMCA6IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGZzLmNyZWF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24obG9va3VwX2ZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2RhbC5zaG93KFwiQ3JlYXRvck9iamVjdE1vZGFsXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBcIkNyZWF0b3IuQ29sbGVjdGlvbnMuXCIgKyAoQ3JlYXRvci5nZXRDb2xsZWN0aW9uKGZpZWxkLnJlZmVyZW5jZV90bykuX25hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1JZDogXCJuZXdcIiArIChmaWVsZC5yZWZlcmVuY2VfdG8ucmVwbGFjZSgnLicsICdfJykpLFxuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9uYW1lOiBcIlwiICsgZmllbGQucmVmZXJlbmNlX3RvLFxuICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJpbnNlcnRcIixcbiAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uKG9wZXJhdGlvbiwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QocmVzdWx0Lm9iamVjdF9uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQub2JqZWN0X25hbWUgPT09IFwib2JqZWN0c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBfZmllbGQuYWRkSXRlbXMoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByZXN1bHQudmFsdWUubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiByZXN1bHQudmFsdWUuaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgcmVzdWx0LnZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cF9maWVsZC5hZGRJdGVtcyhbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlc3VsdC52YWx1ZVtvYmplY3QuTkFNRV9GSUVMRF9LRVldIHx8IHJlc3VsdC52YWx1ZS5sYWJlbCB8fCByZXN1bHQudmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuX2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLCByZXN1bHQuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uY3JlYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfLmlzQm9vbGVhbihmaWVsZC5jcmVhdGUpKSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS5jcmVhdGUgPSBmaWVsZC5jcmVhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC5yZWZlcmVuY2Vfc29ydCkge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9uc1NvcnQgPSBmaWVsZC5yZWZlcmVuY2Vfc29ydDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZV9saW1pdCkge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9uc0xpbWl0ID0gZmllbGQucmVmZXJlbmNlX2xpbWl0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkKSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS5yZWZlcmVuY2VUb0ZpZWxkID0gZmllbGQucmVmZXJlbmNlX3RvX2ZpZWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQucmVmZXJlbmNlX3RvID09PSBcInVzZXJzXCIpIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdHVzZXJcIjtcbiAgICAgICAgICAgIGlmICghZmllbGQuaGlkZGVuICYmICFmaWVsZC5vbWl0KSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb2JqLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgICAgICAgaXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlKFtcIm9yZ2FuaXphdGlvbnNcIiwgXCJ1c2Vyc1wiLCBcInNwYWNlX3VzZXJzXCJdLCBvYmoubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChpc1VuTGltaXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNGdW5jdGlvbihmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkKG9iai5wZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQucmVmZXJlbmNlX3RvID09PSBcIm9yZ2FuaXphdGlvbnNcIikge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0b3JnXCI7XG4gICAgICAgICAgICBpZiAoIWZpZWxkLmhpZGRlbiAmJiAhZmllbGQub21pdCkge1xuICAgICAgICAgICAgICBpZiAoZmllbGQuaXNfY29tcGFueV9saW1pdGVkID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9iai5wZXJtaXNzaW9ucztcbiAgICAgICAgICAgICAgICAgIGlzVW5MaW1pdGVkID0gcGVybWlzc2lvbnMgIT0gbnVsbCA/IHBlcm1pc3Npb25zLnZpZXdBbGxSZWNvcmRzIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgaWYgKF8uaW5jbHVkZShbXCJvcmdhbml6YXRpb25zXCIsIFwidXNlcnNcIiwgXCJzcGFjZV91c2Vyc1wiXSwgb2JqLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzVW5MaW1pdGVkID0gcGVybWlzc2lvbnMgIT0gbnVsbCA/IHBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoaXNVbkxpbWl0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzRnVuY3Rpb24oZmllbGQuaXNfY29tcGFueV9saW1pdGVkKSkge1xuICAgICAgICAgICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZChvYmoucGVybWlzc2lvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5yZWZlcmVuY2VfdG8gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBfcmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBfcmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF8uaXNBcnJheShfcmVmZXJlbmNlX3RvKSkge1xuICAgICAgICAgICAgICBmcy50eXBlID0gT2JqZWN0O1xuICAgICAgICAgICAgICBmcy5ibGFja2JveCA9IHRydWU7XG4gICAgICAgICAgICAgIGZzLmF1dG9mb3JtLm9iamVjdFN3aXRjaGUgPSB0cnVlO1xuICAgICAgICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLm9cIl0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICAgICAgICBvbWl0OiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLmlkc1wiXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBbU3RyaW5nXSxcbiAgICAgICAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgICAgICAgb21pdDogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF9yZWZlcmVuY2VfdG8gPSBbX3JlZmVyZW5jZV90b107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfb2JqZWN0ID0gQ3JlYXRvci5PYmplY3RzW19yZWZlcmVuY2VfdG9bMF1dO1xuICAgICAgICAgICAgaWYgKF9vYmplY3QgJiYgX29iamVjdC5lbmFibGVfdHJlZSkge1xuICAgICAgICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzZWxlY3RUcmVlXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTG9va3Vwc1wiO1xuICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5vcHRpb25zTWV0aG9kID0gZmllbGQub3B0aW9uc01ldGhvZCB8fCBcImNyZWF0b3Iub2JqZWN0X29wdGlvbnNcIjtcbiAgICAgICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLm9wdGlvbnNNZXRob2RQYXJhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlOiBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5yZWZlcmVuY2VzID0gW107XG4gICAgICAgICAgICAgICAgX3JlZmVyZW5jZV90by5mb3JFYWNoKGZ1bmN0aW9uKF9yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgIF9vYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbX3JlZmVyZW5jZV07XG4gICAgICAgICAgICAgICAgICBpZiAoX29iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnMuYXV0b2Zvcm0ucmVmZXJlbmNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IF9yZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IF9vYmplY3QgIT0gbnVsbCA/IF9vYmplY3QubGFiZWwgOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbjogX29iamVjdCAhPSBudWxsID8gX29iamVjdC5pY29uIDogdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiL2FwcC9cIiArIChTZXNzaW9uLmdldCgnYXBwX2lkJykpICsgXCIvXCIgKyBfcmVmZXJlbmNlICsgXCIvdmlldy9cIjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzLmF1dG9mb3JtLnJlZmVyZW5jZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBfcmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbms6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiL2FwcC9cIiArIChTZXNzaW9uLmdldCgnYXBwX2lkJykpICsgXCIvXCIgKyBfcmVmZXJlbmNlICsgXCIvdmlldy9cIjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCI7XG4gICAgICAgICAgZnMuYXV0b2Zvcm0uZGVmYXVsdEljb24gPSBmaWVsZC5kZWZhdWx0SWNvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCI7XG4gICAgICAgIGZzLmF1dG9mb3JtLnNob3dJY29uID0gZmFsc2U7XG4gICAgICAgIGZzLmF1dG9mb3JtLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0XCI7XG4gICAgICAgIGZzLmF1dG9mb3JtLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgICAgICBpZiAoXy5oYXMoZmllbGQsICdmaXJzdE9wdGlvbicpKSB7XG4gICAgICAgICAgZnMuYXV0b2Zvcm0uZmlyc3RPcHRpb24gPSBmaWVsZC5maXJzdE9wdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5hdXRvZm9ybS5maXJzdE9wdGlvbiA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5kYXRhX3R5cGUgJiYgZmllbGQuZGF0YV90eXBlICE9PSBcInRleHRcIikge1xuICAgICAgICBpZiAoW1wibnVtYmVyXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdLmluZGV4T2YoZmllbGQuZGF0YV90eXBlKSA+IC0xKSB7XG4gICAgICAgICAgZnNUeXBlID0gTnVtYmVyO1xuICAgICAgICAgIGZzLmRlY2ltYWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmRhdGFfdHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBmc1R5cGUgPSBCb29sZWFuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzVHlwZSA9IFN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBmcy50eXBlID0gZnNUeXBlO1xuICAgICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgICBmcy50eXBlID0gW2ZzVHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IENyZWF0b3IuZ2V0U2VsZWN0T3B0aW9ucyhmaWVsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImN1cnJlbmN5XCIpIHtcbiAgICAgIGZzLnR5cGUgPSBOdW1iZXI7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zTnVtYmVyXCI7XG4gICAgICBmcy5hdXRvZm9ybS5wcmVjaXNpb24gPSBmaWVsZC5wcmVjaXNpb24gfHwgMTg7XG4gICAgICBpZiAoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnNjYWxlIDogdm9pZCAwKSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLnNjYWxlID0gZmllbGQuc2NhbGU7XG4gICAgICAgIGZzLmRlY2ltYWwgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgoZmllbGQgIT0gbnVsbCA/IGZpZWxkLnNjYWxlIDogdm9pZCAwKSAhPT0gMCkge1xuICAgICAgICBmcy5hdXRvZm9ybS5zY2FsZSA9IDI7XG4gICAgICAgIGZzLmRlY2ltYWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZnMudHlwZSA9IE51bWJlcjtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIjtcbiAgICAgIGZzLmF1dG9mb3JtLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbiB8fCAxODtcbiAgICAgIGlmIChmaWVsZCAhPSBudWxsID8gZmllbGQuc2NhbGUgOiB2b2lkIDApIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZTtcbiAgICAgICAgZnMuZGVjaW1hbCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgZnMudHlwZSA9IEJvb2xlYW47XG4gICAgICBpZiAoZmllbGQucmVhZG9ubHkpIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvcy1ib29sZWFuLWNoZWNrYm94XCI7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInRvZ2dsZVwiKSB7XG4gICAgICBmcy50eXBlID0gQm9vbGVhbjtcbiAgICAgIGlmIChmaWVsZC5yZWFkb25seSkge1xuICAgICAgICBmcy5hdXRvZm9ybS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zLWJvb2xlYW4tdG9nZ2xlXCI7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzZWxlY3QtY2hlY2tib3hcIjtcbiAgICAgIGZzLmF1dG9mb3JtLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIGNvbGxlY3Rpb25OYW1lID0gZmllbGQuY29sbGVjdGlvbiB8fCBcImZpbGVzXCI7XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlVXBsb2FkJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9IGNvbGxlY3Rpb25OYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJmaWxlc2l6ZVwiKSB7XG4gICAgICBmcy50eXBlID0gTnVtYmVyO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlc2l6ZSc7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcIk9iamVjdFwiIHx8IGZpZWxkLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZzLnR5cGUgPSBPYmplY3Q7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImdyaWRcIiB8fCBmaWVsZC50eXBlID09PSBcInRhYmxlXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBBcnJheTtcbiAgICAgIGZzLmF1dG9mb3JtLmVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NHcmlkXCI7XG4gICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgIHR5cGU6IE9iamVjdFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgaWYgKGZpZWxkLm11bHRpcGxlKSB7XG4gICAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgICAgc2NoZW1hW2ZpZWxkX25hbWUgKyBcIi4kXCJdID0ge1xuICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICB0eXBlOiAnZmlsZVVwbG9hZCcsXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiAnaW1hZ2VzJyxcbiAgICAgICAgICAgIGFjY2VwdDogJ2ltYWdlLyonXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICdpbWFnZXMnO1xuICAgICAgICBmcy5hdXRvZm9ybS5hY2NlcHQgPSAnaW1hZ2UvKic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImF2YXRhclwiKSB7XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlVXBsb2FkJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246ICdhdmF0YXJzJyxcbiAgICAgICAgICAgIGFjY2VwdDogJ2ltYWdlLyonXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICdhdmF0YXJzJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uYWNjZXB0ID0gJ2ltYWdlLyonO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJhdWRpb1wiKSB7XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlVXBsb2FkJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246ICdhdWRpb3MnLFxuICAgICAgICAgICAgYWNjZXB0OiAnYXVkaW8vKidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnO1xuICAgICAgICBmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gJ2F1ZGlvcyc7XG4gICAgICAgIGZzLmF1dG9mb3JtLmFjY2VwdCA9ICdhdWRpby8qJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwidmlkZW9cIikge1xuICAgICAgaWYgKGZpZWxkLm11bHRpcGxlKSB7XG4gICAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgICAgc2NoZW1hW2ZpZWxkX25hbWUgKyBcIi4kXCJdID0ge1xuICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICB0eXBlOiAnZmlsZVVwbG9hZCcsXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiAndmlkZW9zJyxcbiAgICAgICAgICAgIGFjY2VwdDogJ3ZpZGVvLyonXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICd2aWRlb3MnO1xuICAgICAgICBmcy5hdXRvZm9ybS5hY2NlcHQgPSAndmlkZW8vKic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImxvY2F0aW9uXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBPYmplY3Q7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJsb2NhdGlvblwiO1xuICAgICAgZnMuYXV0b2Zvcm0uc3lzdGVtID0gZmllbGQuc3lzdGVtIHx8IFwid2dzODRcIjtcbiAgICAgIGZzLmJsYWNrYm94ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwibWFya2Rvd25cIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInRleHRcIjtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd1cmwnKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdzdGVlZG9zVXJsJztcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdlbWFpbCcpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICBmcy5yZWdFeCA9IFNpbXBsZVNjaGVtYS5SZWdFeC5FbWFpbDtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSAnc3RlZWRvc0VtYWlsJztcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhdXRvbnVtYmVyJykge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnZm9ybXVsYScpIHtcbiAgICAgIGZzID0gQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEoe1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmaWVsZDogT2JqZWN0LmFzc2lnbih7fSwgZmllbGQsIHtcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLmRhdGFfdHlwZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pW2ZpZWxkLm5hbWVdO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICBmcyA9IENyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hKHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgZmllbGQ6IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkLCB7XG4gICAgICAgICAgICB0eXBlOiBmaWVsZC5kYXRhX3R5cGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVtmaWVsZC5uYW1lXTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdwZXJjZW50Jykge1xuICAgICAgZnMudHlwZSA9IE51bWJlcjtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIjtcbiAgICAgIGZzLmF1dG9mb3JtLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbiB8fCAxODtcbiAgICAgIGlmICghXy5pc051bWJlcihmaWVsZC5zY2FsZSkpIHtcbiAgICAgICAgZmllbGQuc2NhbGUgPSAwO1xuICAgICAgfVxuICAgICAgZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZSArIDI7XG4gICAgICBmcy5kZWNpbWFsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5sYWJlbCkge1xuICAgICAgZnMubGFiZWwgPSBmaWVsZC5sYWJlbDtcbiAgICB9XG4gICAgaWYgKCFmaWVsZC5yZXF1aXJlZCkge1xuICAgICAgZnMub3B0aW9uYWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIU1ldGVvci5pc0NsaWVudCkge1xuICAgICAgZnMub3B0aW9uYWwgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQudW5pcXVlKSB7XG4gICAgICBmcy51bmlxdWUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQub21pdCkge1xuICAgICAgZnMuYXV0b2Zvcm0ub21pdCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5ncm91cCkge1xuICAgICAgZnMuYXV0b2Zvcm0uZ3JvdXAgPSBmaWVsZC5ncm91cDtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmlzX3dpZGUpIHtcbiAgICAgIGZzLmF1dG9mb3JtLmlzX3dpZGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQuaGlkZGVuKSB7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJoaWRkZW5cIjtcbiAgICB9XG4gICAgaWYgKChmaWVsZC50eXBlID09PSBcInNlbGVjdFwiKSB8fCAoZmllbGQudHlwZSA9PT0gXCJsb29rdXBcIikgfHwgKGZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiKSkge1xuICAgICAgaWYgKHR5cGVvZiBmaWVsZC5maWx0ZXJhYmxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmaWVsZC5maWx0ZXJhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpZWxkLm5hbWUgPT09ICduYW1lJyB8fCBmaWVsZC5pc19uYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIGZpZWxkLnNlYXJjaGFibGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpZWxkLnNlYXJjaGFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXV0b2Zvcm1fdHlwZSkge1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IGF1dG9mb3JtX3R5cGU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgQ3JlYXRvci5Gb3JtdWxhci5jaGVja0Zvcm11bGEoZmllbGQuZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBmcy5hdXRvZm9ybS5kZWZhdWx0VmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gQ3JlYXRvci5Gb3JtdWxhci5ydW4oZmllbGQuZGVmYXVsdFZhbHVlLCB7XG4gICAgICAgICAgICB1c2VySWQ6IE1ldGVvci51c2VySWQoKSxcbiAgICAgICAgICAgIHNwYWNlSWQ6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSxcbiAgICAgICAgICAgIG5vdzogbmV3IERhdGUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0uZGVmYXVsdFZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGQucmVhZG9ubHkpIHtcbiAgICAgIGZzLmF1dG9mb3JtLnJlYWRvbmx5ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmRpc2FibGVkKSB7XG4gICAgICBmcy5hdXRvZm9ybS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5pbmxpbmVIZWxwVGV4dCkge1xuICAgICAgZnMuYXV0b2Zvcm0uaW5saW5lSGVscFRleHQgPSBmaWVsZC5pbmxpbmVIZWxwVGV4dDtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmJsYWNrYm94KSB7XG4gICAgICBmcy5ibGFja2JveCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChfLmhhcyhmaWVsZCwgJ21pbicpKSB7XG4gICAgICBmcy5taW4gPSBmaWVsZC5taW47XG4gICAgfVxuICAgIGlmIChfLmhhcyhmaWVsZCwgJ21heCcpKSB7XG4gICAgICBmcy5tYXggPSBmaWVsZC5tYXg7XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNQcm9kdWN0aW9uKSB7XG4gICAgICBpZiAoZmllbGQuaW5kZXgpIHtcbiAgICAgICAgZnMuaW5kZXggPSBmaWVsZC5pbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQuc29ydGFibGUpIHtcbiAgICAgICAgZnMuaW5kZXggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hW2ZpZWxkX25hbWVdID0gZnM7XG4gIH0pO1xuICByZXR1cm4gc2NoZW1hO1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZERpc3BsYXlWYWx1ZSA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBmaWVsZF9uYW1lLCBmaWVsZF92YWx1ZSkge1xuICB2YXIgZmllbGQsIGh0bWwsIG9iamVjdDtcbiAgaHRtbCA9IGZpZWxkX3ZhbHVlO1xuICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgZmllbGQgPSBvYmplY3QuZmllbGRzKGZpZWxkX25hbWUpO1xuICBpZiAoIWZpZWxkKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgaWYgKGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgIGh0bWwgPSBtb21lbnQodGhpcy52YWwpLmZvcm1hdCgnWVlZWS1NTS1ERCBIOm1tJyk7XG4gIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICBodG1sID0gbW9tZW50KHRoaXMudmFsKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgfVxuICByZXR1cm4gaHRtbDtcbn07XG5cbkNyZWF0b3IuY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5ID0gZnVuY3Rpb24oZmllbGRfdHlwZSkge1xuICByZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZVwiLCBcImN1cnJlbmN5XCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGZpZWxkX3R5cGUpO1xufTtcblxuQ3JlYXRvci5wdXNoQmV0d2VlbkJ1aWx0aW5PcHRpb25hbHMgPSBmdW5jdGlvbihmaWVsZF90eXBlLCBvcGVyYXRpb25zKSB7XG4gIHZhciBidWlsdGluVmFsdWVzO1xuICBidWlsdGluVmFsdWVzID0gQ3JlYXRvci5nZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyhmaWVsZF90eXBlKTtcbiAgaWYgKGJ1aWx0aW5WYWx1ZXMpIHtcbiAgICByZXR1cm4gXy5mb3JFYWNoKGJ1aWx0aW5WYWx1ZXMsIGZ1bmN0aW9uKGJ1aWx0aW5JdGVtLCBrZXkpIHtcbiAgICAgIHJldHVybiBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICBsYWJlbDogYnVpbHRpbkl0ZW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiBrZXlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVzID0gZnVuY3Rpb24oZmllbGRfdHlwZSwgaXNfY2hlY2tfb25seSkge1xuICBpZiAoW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCJdLmluY2x1ZGVzKGZpZWxkX3R5cGUpKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzKGlzX2NoZWNrX29ubHksIGZpZWxkX3R5cGUpO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVJdGVtID0gZnVuY3Rpb24oZmllbGRfdHlwZSwga2V5KSB7XG4gIGlmIChbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIl0uaW5jbHVkZXMoZmllbGRfdHlwZSkpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwga2V5KTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRCZXR3ZWVuQnVpbHRpbk9wZXJhdGlvbiA9IGZ1bmN0aW9uKGZpZWxkX3R5cGUsIHZhbHVlKSB7XG4gIHZhciBiZXR3ZWVuQnVpbHRpblZhbHVlcywgcmVzdWx0O1xuICBpZiAoIV8uaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJldHdlZW5CdWlsdGluVmFsdWVzID0gQ3JlYXRvci5nZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyhmaWVsZF90eXBlKTtcbiAgaWYgKCFiZXR3ZWVuQnVpbHRpblZhbHVlcykge1xuICAgIHJldHVybjtcbiAgfVxuICByZXN1bHQgPSBudWxsO1xuICBfLmVhY2goYmV0d2VlbkJ1aWx0aW5WYWx1ZXMsIGZ1bmN0aW9uKGl0ZW0sIG9wZXJhdGlvbikge1xuICAgIGlmIChpdGVtLmtleSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiByZXN1bHQgPSBvcGVyYXRpb247XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkNyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzID0gZnVuY3Rpb24oaXNfY2hlY2tfb25seSwgZmllbGRfdHlwZSkge1xuICByZXR1cm4ge1xuICAgIFwiYmV0d2Vlbl90aW1lX2xhc3RfeWVhclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF95ZWFyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX3RoaXNfeWVhclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc195ZWFyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX25leHRfeWVhclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF95ZWFyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX2xhc3RfcXVhcnRlclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF9xdWFydGVyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX3RoaXNfcXVhcnRlclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc19xdWFydGVyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX25leHRfcXVhcnRlclwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF9xdWFydGVyXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX2xhc3RfbW9udGhcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfbW9udGhcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdGhpc19tb250aFwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc19tb250aFwiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0X21vbnRoXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0X21vbnRoXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX2xhc3Rfd2Vla1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF93ZWVrXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX3RoaXNfd2Vla1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc193ZWVrXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX25leHRfd2Vla1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF93ZWVrXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX3llc3RkYXlcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInllc3RkYXlcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdG9kYXlcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRvZGF5XCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX3RvbW9ycm93XCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0b21vcnJvd1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9sYXN0XzdfZGF5c1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF83X2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF8zMF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzMwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF82MF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzYwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF85MF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzkwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF8xMjBfZGF5c1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF8xMjBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0XzdfZGF5c1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF83X2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF8zMF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzMwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF82MF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzYwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF85MF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzkwX2RheXNcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF8xMjBfZGF5c1wiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF8xMjBfZGF5c1wiKVxuICB9O1xufTtcblxuQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aCA9IGZ1bmN0aW9uKG1vbnRoKSB7XG4gIGlmICghbW9udGgpIHtcbiAgICBtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcbiAgfVxuICBpZiAobW9udGggPCAzKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAobW9udGggPCA2KSB7XG4gICAgcmV0dXJuIDM7XG4gIH0gZWxzZSBpZiAobW9udGggPCA5KSB7XG4gICAgcmV0dXJuIDY7XG4gIH1cbiAgcmV0dXJuIDk7XG59O1xuXG5DcmVhdG9yLmdldExhc3RRdWFydGVyRmlyc3REYXkgPSBmdW5jdGlvbih5ZWFyLCBtb250aCkge1xuICBpZiAoIXllYXIpIHtcbiAgICB5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICB9XG4gIGlmICghbW9udGgpIHtcbiAgICBtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcbiAgfVxuICBpZiAobW9udGggPCAzKSB7XG4gICAgeWVhci0tO1xuICAgIG1vbnRoID0gOTtcbiAgfSBlbHNlIGlmIChtb250aCA8IDYpIHtcbiAgICBtb250aCA9IDA7XG4gIH0gZWxzZSBpZiAobW9udGggPCA5KSB7XG4gICAgbW9udGggPSAzO1xuICB9IGVsc2Uge1xuICAgIG1vbnRoID0gNjtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xufTtcblxuQ3JlYXRvci5nZXROZXh0UXVhcnRlckZpcnN0RGF5ID0gZnVuY3Rpb24oeWVhciwgbW9udGgpIHtcbiAgaWYgKCF5ZWFyKSB7XG4gICAgeWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgfVxuICBpZiAoIW1vbnRoKSB7XG4gICAgbW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XG4gIH1cbiAgaWYgKG1vbnRoIDwgMykge1xuICAgIG1vbnRoID0gMztcbiAgfSBlbHNlIGlmIChtb250aCA8IDYpIHtcbiAgICBtb250aCA9IDY7XG4gIH0gZWxzZSBpZiAobW9udGggPCA5KSB7XG4gICAgbW9udGggPSA5O1xuICB9IGVsc2Uge1xuICAgIHllYXIrKztcbiAgICBtb250aCA9IDA7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbn07XG5cbkNyZWF0b3IuZ2V0TW9udGhEYXlzID0gZnVuY3Rpb24oeWVhciwgbW9udGgpIHtcbiAgdmFyIGRheXMsIGVuZERhdGUsIG1pbGxpc2Vjb25kLCBzdGFydERhdGU7XG4gIGlmIChtb250aCA9PT0gMTEpIHtcbiAgICByZXR1cm4gMzE7XG4gIH1cbiAgbWlsbGlzZWNvbmQgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuICBzdGFydERhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gIGVuZERhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDEpO1xuICBkYXlzID0gKGVuZERhdGUgLSBzdGFydERhdGUpIC8gbWlsbGlzZWNvbmQ7XG4gIHJldHVybiBkYXlzO1xufTtcblxuQ3JlYXRvci5nZXRMYXN0TW9udGhGaXJzdERheSA9IGZ1bmN0aW9uKHllYXIsIG1vbnRoKSB7XG4gIGlmICgheWVhcikge1xuICAgIHllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIH1cbiAgaWYgKCFtb250aCkge1xuICAgIG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpO1xuICB9XG4gIGlmIChtb250aCA9PT0gMCkge1xuICAgIG1vbnRoID0gMTE7XG4gICAgeWVhci0tO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gIH1cbiAgbW9udGgtLTtcbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbn07XG5cbkNyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtID0gZnVuY3Rpb24oZmllbGRfdHlwZSwga2V5KSB7XG4gIHZhciBjdXJyZW50TW9udGgsIGN1cnJlbnRZZWFyLCBlbmRWYWx1ZSwgZmlyc3REYXksIGxhYmVsLCBsYXN0RGF5LCBsYXN0TW9uZGF5LCBsYXN0TW9udGhGaW5hbERheSwgbGFzdE1vbnRoRmlyc3REYXksIGxhc3RRdWFydGVyRW5kRGF5LCBsYXN0UXVhcnRlclN0YXJ0RGF5LCBsYXN0U3VuZGF5LCBsYXN0XzEyMF9kYXlzLCBsYXN0XzMwX2RheXMsIGxhc3RfNjBfZGF5cywgbGFzdF83X2RheXMsIGxhc3RfOTBfZGF5cywgbWlsbGlzZWNvbmQsIG1pbnVzRGF5LCBtb25kYXksIG1vbnRoLCBuZXh0TW9uZGF5LCBuZXh0TW9udGhGaW5hbERheSwgbmV4dE1vbnRoRmlyc3REYXksIG5leHRRdWFydGVyRW5kRGF5LCBuZXh0UXVhcnRlclN0YXJ0RGF5LCBuZXh0U3VuZGF5LCBuZXh0WWVhciwgbmV4dF8xMjBfZGF5cywgbmV4dF8zMF9kYXlzLCBuZXh0XzYwX2RheXMsIG5leHRfN19kYXlzLCBuZXh0XzkwX2RheXMsIG5vdywgcHJldmlvdXNZZWFyLCBzdGFydFZhbHVlLCBzdHJFbmREYXksIHN0ckZpcnN0RGF5LCBzdHJMYXN0RGF5LCBzdHJNb25kYXksIHN0clN0YXJ0RGF5LCBzdHJTdW5kYXksIHN0clRvZGF5LCBzdHJUb21vcnJvdywgc3RyWWVzdGRheSwgc3VuZGF5LCB0aGlzUXVhcnRlckVuZERheSwgdGhpc1F1YXJ0ZXJTdGFydERheSwgdG9tb3Jyb3csIHZhbHVlcywgd2VlaywgeWVhciwgeWVzdGRheTtcbiAgbm93ID0gbmV3IERhdGUoKTtcbiAgbWlsbGlzZWNvbmQgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuICB5ZXN0ZGF5ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKTtcbiAgdG9tb3Jyb3cgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgbWlsbGlzZWNvbmQpO1xuICB3ZWVrID0gbm93LmdldERheSgpO1xuICBtaW51c0RheSA9IHdlZWsgIT09IDAgPyB3ZWVrIC0gMSA6IDY7XG4gIG1vbmRheSA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAobWludXNEYXkgKiBtaWxsaXNlY29uZCkpO1xuICBzdW5kYXkgPSBuZXcgRGF0ZShtb25kYXkuZ2V0VGltZSgpICsgKDYgKiBtaWxsaXNlY29uZCkpO1xuICBsYXN0U3VuZGF5ID0gbmV3IERhdGUobW9uZGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKTtcbiAgbGFzdE1vbmRheSA9IG5ldyBEYXRlKGxhc3RTdW5kYXkuZ2V0VGltZSgpIC0gKG1pbGxpc2Vjb25kICogNikpO1xuICBuZXh0TW9uZGF5ID0gbmV3IERhdGUoc3VuZGF5LmdldFRpbWUoKSArIG1pbGxpc2Vjb25kKTtcbiAgbmV4dFN1bmRheSA9IG5ldyBEYXRlKG5leHRNb25kYXkuZ2V0VGltZSgpICsgKG1pbGxpc2Vjb25kICogNikpO1xuICBjdXJyZW50WWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xuICBwcmV2aW91c1llYXIgPSBjdXJyZW50WWVhciAtIDE7XG4gIG5leHRZZWFyID0gY3VycmVudFllYXIgKyAxO1xuICBjdXJyZW50TW9udGggPSBub3cuZ2V0TW9udGgoKTtcbiAgeWVhciA9IG5vdy5nZXRGdWxsWWVhcigpO1xuICBtb250aCA9IG5vdy5nZXRNb250aCgpO1xuICBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgsIDEpO1xuICBpZiAoY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgIHllYXIrKztcbiAgICBtb250aCsrO1xuICB9IGVsc2Uge1xuICAgIG1vbnRoKys7XG4gIH1cbiAgbmV4dE1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gIG5leHRNb250aEZpbmFsRGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIENyZWF0b3IuZ2V0TW9udGhEYXlzKHllYXIsIG1vbnRoKSk7XG4gIGxhc3REYXkgPSBuZXcgRGF0ZShuZXh0TW9udGhGaXJzdERheS5nZXRUaW1lKCkgLSBtaWxsaXNlY29uZCk7XG4gIGxhc3RNb250aEZpcnN0RGF5ID0gQ3JlYXRvci5nZXRMYXN0TW9udGhGaXJzdERheShjdXJyZW50WWVhciwgY3VycmVudE1vbnRoKTtcbiAgbGFzdE1vbnRoRmluYWxEYXkgPSBuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkgLSBtaWxsaXNlY29uZCk7XG4gIHRoaXNRdWFydGVyU3RhcnREYXkgPSBuZXcgRGF0ZShjdXJyZW50WWVhciwgQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpLCAxKTtcbiAgdGhpc1F1YXJ0ZXJFbmREYXkgPSBuZXcgRGF0ZShjdXJyZW50WWVhciwgQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpICsgMiwgQ3JlYXRvci5nZXRNb250aERheXMoY3VycmVudFllYXIsIENyZWF0b3IuZ2V0UXVhcnRlclN0YXJ0TW9udGgoY3VycmVudE1vbnRoKSArIDIpKTtcbiAgbGFzdFF1YXJ0ZXJTdGFydERheSA9IENyZWF0b3IuZ2V0TGFzdFF1YXJ0ZXJGaXJzdERheShjdXJyZW50WWVhciwgY3VycmVudE1vbnRoKTtcbiAgbGFzdFF1YXJ0ZXJFbmREYXkgPSBuZXcgRGF0ZShsYXN0UXVhcnRlclN0YXJ0RGF5LmdldEZ1bGxZZWFyKCksIGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0TW9udGgoKSArIDIsIENyZWF0b3IuZ2V0TW9udGhEYXlzKGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydERheS5nZXRNb250aCgpICsgMikpO1xuICBuZXh0UXVhcnRlclN0YXJ0RGF5ID0gQ3JlYXRvci5nZXROZXh0UXVhcnRlckZpcnN0RGF5KGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgpO1xuICBuZXh0UXVhcnRlckVuZERheSA9IG5ldyBEYXRlKG5leHRRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSwgbmV4dFF1YXJ0ZXJTdGFydERheS5nZXRNb250aCgpICsgMiwgQ3JlYXRvci5nZXRNb250aERheXMobmV4dFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLCBuZXh0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkgKyAyKSk7XG4gIGxhc3RfN19kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICg2ICogbWlsbGlzZWNvbmQpKTtcbiAgbGFzdF8zMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICgyOSAqIG1pbGxpc2Vjb25kKSk7XG4gIGxhc3RfNjBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAoNTkgKiBtaWxsaXNlY29uZCkpO1xuICBsYXN0XzkwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDg5ICogbWlsbGlzZWNvbmQpKTtcbiAgbGFzdF8xMjBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAoMTE5ICogbWlsbGlzZWNvbmQpKTtcbiAgbmV4dF83X2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDYgKiBtaWxsaXNlY29uZCkpO1xuICBuZXh0XzMwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDI5ICogbWlsbGlzZWNvbmQpKTtcbiAgbmV4dF82MF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArICg1OSAqIG1pbGxpc2Vjb25kKSk7XG4gIG5leHRfOTBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoODkgKiBtaWxsaXNlY29uZCkpO1xuICBuZXh0XzEyMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArICgxMTkgKiBtaWxsaXNlY29uZCkpO1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgXCJsYXN0X3llYXJcIjpcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfeWVhclwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShwcmV2aW91c1llYXIgKyBcIi0wMS0wMVQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHByZXZpb3VzWWVhciArIFwiLTEyLTMxVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0aGlzX3llYXJcIjpcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfeWVhclwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciArIFwiLTAxLTAxVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoY3VycmVudFllYXIgKyBcIi0xMi0zMVQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmV4dF95ZWFyXCI6XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0X3llYXJcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUobmV4dFllYXIgKyBcIi0wMS0wMVQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKG5leHRZZWFyICsgXCItMTItMzFUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfcXVhcnRlclwiOlxuICAgICAgc3RyRmlyc3REYXkgPSBtb21lbnQobGFzdFF1YXJ0ZXJTdGFydERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckxhc3REYXkgPSBtb21lbnQobGFzdFF1YXJ0ZXJFbmREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0X3F1YXJ0ZXJcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyRmlyc3REYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckxhc3REYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidGhpc19xdWFydGVyXCI6XG4gICAgICBzdHJGaXJzdERheSA9IG1vbWVudCh0aGlzUXVhcnRlclN0YXJ0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyTGFzdERheSA9IG1vbWVudCh0aGlzUXVhcnRlckVuZERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfcXVhcnRlclwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJGaXJzdERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyTGFzdERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0X3F1YXJ0ZXJcIjpcbiAgICAgIHN0ckZpcnN0RGF5ID0gbW9tZW50KG5leHRRdWFydGVyU3RhcnREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJMYXN0RGF5ID0gbW9tZW50KG5leHRRdWFydGVyRW5kRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF9xdWFydGVyXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0ckZpcnN0RGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJMYXN0RGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfbW9udGhcIjpcbiAgICAgIHN0ckZpcnN0RGF5ID0gbW9tZW50KGxhc3RNb250aEZpcnN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyTGFzdERheSA9IG1vbWVudChsYXN0TW9udGhGaW5hbERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfbW9udGhcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyRmlyc3REYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckxhc3REYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidGhpc19tb250aFwiOlxuICAgICAgc3RyRmlyc3REYXkgPSBtb21lbnQoZmlyc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJMYXN0RGF5ID0gbW9tZW50KGxhc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90aGlzX21vbnRoXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0ckZpcnN0RGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJMYXN0RGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfbW9udGhcIjpcbiAgICAgIHN0ckZpcnN0RGF5ID0gbW9tZW50KG5leHRNb250aEZpcnN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyTGFzdERheSA9IG1vbWVudChuZXh0TW9udGhGaW5hbERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfbW9udGhcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyRmlyc3REYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckxhc3REYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibGFzdF93ZWVrXCI6XG4gICAgICBzdHJNb25kYXkgPSBtb21lbnQobGFzdE1vbmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0clN1bmRheSA9IG1vbWVudChsYXN0U3VuZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF93ZWVrXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0ck1vbmRheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyU3VuZGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRoaXNfd2Vla1wiOlxuICAgICAgc3RyTW9uZGF5ID0gbW9tZW50KG1vbmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0clN1bmRheSA9IG1vbWVudChzdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90aGlzX3dlZWtcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyTW9uZGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJTdW5kYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmV4dF93ZWVrXCI6XG4gICAgICBzdHJNb25kYXkgPSBtb21lbnQobmV4dE1vbmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0clN1bmRheSA9IG1vbWVudChuZXh0U3VuZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF93ZWVrXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0ck1vbmRheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyU3VuZGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInllc3RkYXlcIjpcbiAgICAgIHN0clllc3RkYXkgPSBtb21lbnQoeWVzdGRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3llc3RkYXlcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyWWVzdGRheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyWWVzdGRheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0b2RheVwiOlxuICAgICAgc3RyVG9kYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fdG9kYXlcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyVG9kYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0clRvZGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRvbW9ycm93XCI6XG4gICAgICBzdHJUb21vcnJvdyA9IG1vbWVudCh0b21vcnJvdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RvbW9ycm93XCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0clRvbW9ycm93ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJUb21vcnJvdyArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0XzdfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF83X2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF83X2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0XzMwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfMzBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzMwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0XzYwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfNjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzYwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0XzkwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfOTBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzkwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0XzEyMF9kYXlzXCI6XG4gICAgICBzdHJTdGFydERheSA9IG1vbWVudChsYXN0XzEyMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfMTIwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0XzdfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5leHRfN19kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF83X2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0XzMwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChuZXh0XzMwX2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzMwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0XzYwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChuZXh0XzYwX2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzYwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0XzkwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChuZXh0XzkwX2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzkwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0XzEyMF9kYXlzXCI6XG4gICAgICBzdHJTdGFydERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJFbmREYXkgPSBtb21lbnQobmV4dF8xMjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfMTIwX2RheXNcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyU3RhcnREYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckVuZERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgfVxuICB2YWx1ZXMgPSBbc3RhcnRWYWx1ZSwgZW5kVmFsdWVdO1xuICBpZiAoZmllbGRfdHlwZSA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgXy5mb3JFYWNoKHZhbHVlcywgZnVuY3Rpb24oZnYpIHtcbiAgICAgIGlmIChmdikge1xuICAgICAgICByZXR1cm4gZnYuc2V0SG91cnMoZnYuZ2V0SG91cnMoKSArIGZ2LmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsYWJlbDogbGFiZWwsXG4gICAga2V5OiBrZXksXG4gICAgdmFsdWVzOiB2YWx1ZXNcbiAgfTtcbn07XG5cbkNyZWF0b3IuZ2V0RmllbGREZWZhdWx0T3BlcmF0aW9uID0gZnVuY3Rpb24oZmllbGRfdHlwZSkge1xuICBpZiAoZmllbGRfdHlwZSAmJiBDcmVhdG9yLmNoZWNrRmllbGRUeXBlU3VwcG9ydEJldHdlZW5RdWVyeShmaWVsZF90eXBlKSkge1xuICAgIHJldHVybiAnYmV0d2Vlbic7XG4gIH0gZWxzZSBpZiAoW1widGV4dGFyZWFcIiwgXCJ0ZXh0XCIsIFwiY29kZVwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKSkge1xuICAgIHJldHVybiAnY29udGFpbnMnO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIj1cIjtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRGaWVsZE9wZXJhdGlvbiA9IGZ1bmN0aW9uKGZpZWxkX3R5cGUpIHtcbiAgdmFyIG9wZXJhdGlvbnMsIG9wdGlvbmFscztcbiAgb3B0aW9uYWxzID0ge1xuICAgIGVxdWFsOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9lcXVhbFwiKSxcbiAgICAgIHZhbHVlOiBcIj1cIlxuICAgIH0sXG4gICAgdW5lcXVhbDoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fdW5lcXVhbFwiKSxcbiAgICAgIHZhbHVlOiBcIjw+XCJcbiAgICB9LFxuICAgIGxlc3NfdGhhbjoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fbGVzc190aGFuXCIpLFxuICAgICAgdmFsdWU6IFwiPFwiXG4gICAgfSxcbiAgICBncmVhdGVyX3RoYW46IHtcbiAgICAgIGxhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2dyZWF0ZXJfdGhhblwiKSxcbiAgICAgIHZhbHVlOiBcIj5cIlxuICAgIH0sXG4gICAgbGVzc19vcl9lcXVhbDoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fbGVzc19vcl9lcXVhbFwiKSxcbiAgICAgIHZhbHVlOiBcIjw9XCJcbiAgICB9LFxuICAgIGdyZWF0ZXJfb3JfZXF1YWw6IHtcbiAgICAgIGxhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxcIiksXG4gICAgICB2YWx1ZTogXCI+PVwiXG4gICAgfSxcbiAgICBjb250YWluczoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fY29udGFpbnNcIiksXG4gICAgICB2YWx1ZTogXCJjb250YWluc1wiXG4gICAgfSxcbiAgICBub3RfY29udGFpbjoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fZG9lc19ub3RfY29udGFpblwiKSxcbiAgICAgIHZhbHVlOiBcIm5vdGNvbnRhaW5zXCJcbiAgICB9LFxuICAgIHN0YXJ0c193aXRoOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9zdGFydHNfd2l0aFwiKSxcbiAgICAgIHZhbHVlOiBcInN0YXJ0c3dpdGhcIlxuICAgIH0sXG4gICAgYmV0d2Vlbjoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2VlblwiKSxcbiAgICAgIHZhbHVlOiBcImJldHdlZW5cIlxuICAgIH1cbiAgfTtcbiAgaWYgKGZpZWxkX3R5cGUgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiBfLnZhbHVlcyhvcHRpb25hbHMpO1xuICB9XG4gIG9wZXJhdGlvbnMgPSBbXTtcbiAgaWYgKENyZWF0b3IuY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5KGZpZWxkX3R5cGUpKSB7XG4gICAgb3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5iZXR3ZWVuKTtcbiAgICBDcmVhdG9yLnB1c2hCZXR3ZWVuQnVpbHRpbk9wdGlvbmFscyhmaWVsZF90eXBlLCBvcGVyYXRpb25zKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcInRleHRcIiB8fCBmaWVsZF90eXBlID09PSBcInRleHRhcmVhXCIgfHwgZmllbGRfdHlwZSA9PT0gXCJodG1sXCIgfHwgZmllbGRfdHlwZSA9PT0gXCJjb2RlXCIpIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmNvbnRhaW5zKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcImxvb2t1cFwiIHx8IGZpZWxkX3R5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiIHx8IGZpZWxkX3R5cGUgPT09IFwic2VsZWN0XCIpIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbCk7XG4gIH0gZWxzZSBpZiAoZmllbGRfdHlwZSA9PT0gXCJjdXJyZW5jeVwiIHx8IGZpZWxkX3R5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbCwgb3B0aW9uYWxzLmxlc3NfdGhhbiwgb3B0aW9uYWxzLmdyZWF0ZXJfdGhhbiwgb3B0aW9uYWxzLmxlc3Nfb3JfZXF1YWwsIG9wdGlvbmFscy5ncmVhdGVyX29yX2VxdWFsKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbCk7XG4gIH0gZWxzZSBpZiAoZmllbGRfdHlwZSA9PT0gXCJbdGV4dF1cIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKTtcbiAgfSBlbHNlIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbCk7XG4gIH1cbiAgcmV0dXJuIG9wZXJhdGlvbnM7XG59O1xuXG5cbi8qXG4gICAg5YWI5oyJ54Wn5pyJ5o6S5bqP5Y+355qE5bCP55qE5Zyo5YmN77yM5aSn55qE5Zyo5ZCOXG4gICAg5YaN5bCG5rKh5pyJ5o6S5bqP5Y+355qE5pi+56S65ZyoXG4gKi9cblxuQ3JlYXRvci5nZXRPYmplY3RGaWVsZHNOYW1lID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgdmFyIGZpZWxkcywgZmllbGRzQXJyLCBmaWVsZHNOYW1lLCByZWY7XG4gIGZpZWxkcyA9IChyZWYgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSkpICE9IG51bGwgPyByZWYuZmllbGRzIDogdm9pZCAwO1xuICBmaWVsZHNBcnIgPSBbXTtcbiAgXy5lYWNoKGZpZWxkcywgZnVuY3Rpb24oZmllbGQpIHtcbiAgICByZXR1cm4gZmllbGRzQXJyLnB1c2goe1xuICAgICAgbmFtZTogZmllbGQubmFtZSxcbiAgICAgIHNvcnRfbm86IGZpZWxkLnNvcnRfbm9cbiAgICB9KTtcbiAgfSk7XG4gIGZpZWxkc05hbWUgPSBbXTtcbiAgXy5lYWNoKF8uc29ydEJ5KGZpZWxkc0FyciwgXCJzb3J0X25vXCIpLCBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBmaWVsZHNOYW1lLnB1c2goZmllbGQubmFtZSk7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzTmFtZTtcbn07XG4iLCJDcmVhdG9yLl90cmlnZ2VyX2hvb2tzID0ge31cblxuaW5pdFRyaWdnZXIgPSAob2JqZWN0X25hbWUsIHRyaWdnZXIpLT5cblx0dHJ5XG5cdFx0Y29sbGVjdGlvbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihvYmplY3RfbmFtZSlcblx0XHRpZiAhdHJpZ2dlci50b2RvXG5cdFx0XHRyZXR1cm5cblx0XHR0b2RvV3JhcHBlciA9ICgpLT5cblx0XHRcdCAgdGhpcy5vYmplY3RfbmFtZSA9IG9iamVjdF9uYW1lXG5cdFx0XHQgIHJldHVybiB0cmlnZ2VyLnRvZG8uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuXHRcdGlmIHRyaWdnZXIud2hlbiA9PSBcImJlZm9yZS5pbnNlcnRcIlxuXHRcdFx0ICByZXR1cm4gY29sbGVjdGlvbj8uYmVmb3JlPy5pbnNlcnQodG9kb1dyYXBwZXIpXG5cdFx0ICBlbHNlIGlmIHRyaWdnZXIud2hlbiA9PSBcImJlZm9yZS51cGRhdGVcIlxuXHRcdFx0ICByZXR1cm4gY29sbGVjdGlvbj8uYmVmb3JlPy51cGRhdGUodG9kb1dyYXBwZXIpXG5cdFx0ICBlbHNlIGlmIHRyaWdnZXIud2hlbiA9PSBcImJlZm9yZS5yZW1vdmVcIlxuXHRcdFx0ICByZXR1cm4gY29sbGVjdGlvbj8uYmVmb3JlPy5yZW1vdmUodG9kb1dyYXBwZXIpXG5cdFx0ICBlbHNlIGlmIHRyaWdnZXIud2hlbiA9PSBcImFmdGVyLmluc2VydFwiXG5cdFx0XHQgIHJldHVybiBjb2xsZWN0aW9uPy5hZnRlcj8uaW5zZXJ0KHRvZG9XcmFwcGVyKVxuXHRcdCAgZWxzZSBpZiB0cmlnZ2VyLndoZW4gPT0gXCJhZnRlci51cGRhdGVcIlxuXHRcdFx0ICByZXR1cm4gY29sbGVjdGlvbj8uYWZ0ZXI/LnVwZGF0ZSh0b2RvV3JhcHBlcilcblx0XHQgIGVsc2UgaWYgdHJpZ2dlci53aGVuID09IFwiYWZ0ZXIucmVtb3ZlXCJcblx0XHRcdCAgcmV0dXJuIGNvbGxlY3Rpb24/LmFmdGVyPy5yZW1vdmUodG9kb1dyYXBwZXIpXG5cdGNhdGNoIGVycm9yXG5cdFx0Y29uc29sZS5lcnJvcignaW5pdFRyaWdnZXIgZXJyb3InLCBlcnJvcilcblxuY2xlYW5UcmlnZ2VyID0gKG9iamVjdF9uYW1lKS0+XG5cdCMjI1xuICAgIFx055Sx5LqOY29sbGVjdGlvbi1ob29rcyBwYWNrYWdlIOeahHJlbW92ZeWHveaVsOaYr+S9v+eUqOS4i+agh+WIoOmZpOWvueixoeeahO+8jOaJgOS7peatpOWkhOWPjei9rGhvb2tz6ZuG5ZCI5ZCO77yM5YaN5Yig6ZmkXG4gICAgXHTlm6DkuLrkuIDkuKrmlbDnu4TlhYPntKDliKDpmaTlkI7vvIzlhbbku5blhYPntKDnmoTkuIvmoIfkvJrlj5HnlJ/lj5jljJZcblx0IyMjXG4gICAgI1RPRE8g55Sx5LqOY29sbGVjdGlvbi1ob29rcyBwYWNrYWdlIOeahHJlbW92ZeWHveaVsGJ1Z1xuXHRDcmVhdG9yLl90cmlnZ2VyX2hvb2tzW29iamVjdF9uYW1lXT8ucmV2ZXJzZSgpLmZvckVhY2ggKF9ob29rKS0+XG5cdFx0X2hvb2sucmVtb3ZlKClcblxuQ3JlYXRvci5pbml0VHJpZ2dlcnMgPSAob2JqZWN0X25hbWUpLT5cbiNcdGNvbnNvbGUubG9nKCdDcmVhdG9yLmluaXRUcmlnZ2VycyBvYmplY3RfbmFtZScsIG9iamVjdF9uYW1lKVxuXHRvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblxuXHRjbGVhblRyaWdnZXIob2JqZWN0X25hbWUpXG5cblx0Q3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0gPSBbXVxuXG5cdF8uZWFjaCBvYmoudHJpZ2dlcnMsICh0cmlnZ2VyLCB0cmlnZ2VyX25hbWUpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXIgYW5kIHRyaWdnZXIub24gPT0gXCJzZXJ2ZXJcIiBhbmQgdHJpZ2dlci50b2RvIGFuZCB0cmlnZ2VyLndoZW5cblx0XHRcdF90cmlnZ2VyX2hvb2sgPSBpbml0VHJpZ2dlciBvYmplY3RfbmFtZSwgdHJpZ2dlclxuXHRcdFx0aWYgX3RyaWdnZXJfaG9va1xuXHRcdFx0XHRDcmVhdG9yLl90cmlnZ2VyX2hvb2tzW29iamVjdF9uYW1lXS5wdXNoKF90cmlnZ2VyX2hvb2spXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50IGFuZCB0cmlnZ2VyLm9uID09IFwiY2xpZW50XCIgYW5kIHRyaWdnZXIudG9kbyBhbmQgdHJpZ2dlci53aGVuXG5cdFx0XHRfdHJpZ2dlcl9ob29rID0gaW5pdFRyaWdnZXIgb2JqZWN0X25hbWUsIHRyaWdnZXJcblx0XHRcdENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdLnB1c2goX3RyaWdnZXJfaG9vaykiLCJ2YXIgY2xlYW5UcmlnZ2VyLCBpbml0VHJpZ2dlcjtcblxuQ3JlYXRvci5fdHJpZ2dlcl9ob29rcyA9IHt9O1xuXG5pbml0VHJpZ2dlciA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCB0cmlnZ2VyKSB7XG4gIHZhciBjb2xsZWN0aW9uLCBlcnJvciwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCB0b2RvV3JhcHBlcjtcbiAgdHJ5IHtcbiAgICBjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKTtcbiAgICBpZiAoIXRyaWdnZXIudG9kbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0b2RvV3JhcHBlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5vYmplY3RfbmFtZSA9IG9iamVjdF9uYW1lO1xuICAgICAgcmV0dXJuIHRyaWdnZXIudG9kby5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgaWYgKHRyaWdnZXIud2hlbiA9PT0gXCJiZWZvcmUuaW5zZXJ0XCIpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgPyAocmVmID0gY29sbGVjdGlvbi5iZWZvcmUpICE9IG51bGwgPyByZWYuaW5zZXJ0KHRvZG9XcmFwcGVyKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXIud2hlbiA9PT0gXCJiZWZvcmUudXBkYXRlXCIpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgPyAocmVmMSA9IGNvbGxlY3Rpb24uYmVmb3JlKSAhPSBudWxsID8gcmVmMS51cGRhdGUodG9kb1dyYXBwZXIpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIH0gZWxzZSBpZiAodHJpZ2dlci53aGVuID09PSBcImJlZm9yZS5yZW1vdmVcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWYyID0gY29sbGVjdGlvbi5iZWZvcmUpICE9IG51bGwgPyByZWYyLnJlbW92ZSh0b2RvV3JhcHBlcikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyLndoZW4gPT09IFwiYWZ0ZXIuaW5zZXJ0XCIpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgPyAocmVmMyA9IGNvbGxlY3Rpb24uYWZ0ZXIpICE9IG51bGwgPyByZWYzLmluc2VydCh0b2RvV3JhcHBlcikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyLndoZW4gPT09IFwiYWZ0ZXIudXBkYXRlXCIpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgPyAocmVmNCA9IGNvbGxlY3Rpb24uYWZ0ZXIpICE9IG51bGwgPyByZWY0LnVwZGF0ZSh0b2RvV3JhcHBlcikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyLndoZW4gPT09IFwiYWZ0ZXIucmVtb3ZlXCIpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgPyAocmVmNSA9IGNvbGxlY3Rpb24uYWZ0ZXIpICE9IG51bGwgPyByZWY1LnJlbW92ZSh0b2RvV3JhcHBlcikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICBlcnJvciA9IGVycm9yMTtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvcignaW5pdFRyaWdnZXIgZXJyb3InLCBlcnJvcik7XG4gIH1cbn07XG5cbmNsZWFuVHJpZ2dlciA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG5cbiAgLypcbiAgICAgXHTnlLHkuo5jb2xsZWN0aW9uLWhvb2tzIHBhY2thZ2Ug55qEcmVtb3Zl5Ye95pWw5piv5L2/55So5LiL5qCH5Yig6Zmk5a+56LGh55qE77yM5omA5Lul5q2k5aSE5Y+N6L2saG9va3Ppm4blkIjlkI7vvIzlho3liKDpmaRcbiAgICAgXHTlm6DkuLrkuIDkuKrmlbDnu4TlhYPntKDliKDpmaTlkI7vvIzlhbbku5blhYPntKDnmoTkuIvmoIfkvJrlj5HnlJ/lj5jljJZcbiAgICovXG4gIHZhciByZWY7XG4gIHJldHVybiAocmVmID0gQ3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0pICE9IG51bGwgPyByZWYucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24oX2hvb2spIHtcbiAgICByZXR1cm4gX2hvb2sucmVtb3ZlKCk7XG4gIH0pIDogdm9pZCAwO1xufTtcblxuQ3JlYXRvci5pbml0VHJpZ2dlcnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgb2JqO1xuICBvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGNsZWFuVHJpZ2dlcihvYmplY3RfbmFtZSk7XG4gIENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdID0gW107XG4gIHJldHVybiBfLmVhY2gob2JqLnRyaWdnZXJzLCBmdW5jdGlvbih0cmlnZ2VyLCB0cmlnZ2VyX25hbWUpIHtcbiAgICB2YXIgX3RyaWdnZXJfaG9vaztcbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyICYmIHRyaWdnZXIub24gPT09IFwic2VydmVyXCIgJiYgdHJpZ2dlci50b2RvICYmIHRyaWdnZXIud2hlbikge1xuICAgICAgX3RyaWdnZXJfaG9vayA9IGluaXRUcmlnZ2VyKG9iamVjdF9uYW1lLCB0cmlnZ2VyKTtcbiAgICAgIGlmIChfdHJpZ2dlcl9ob29rKSB7XG4gICAgICAgIENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdLnB1c2goX3RyaWdnZXJfaG9vayk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNDbGllbnQgJiYgdHJpZ2dlci5vbiA9PT0gXCJjbGllbnRcIiAmJiB0cmlnZ2VyLnRvZG8gJiYgdHJpZ2dlci53aGVuKSB7XG4gICAgICBfdHJpZ2dlcl9ob29rID0gaW5pdFRyaWdnZXIob2JqZWN0X25hbWUsIHRyaWdnZXIpO1xuICAgICAgcmV0dXJuIENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdLnB1c2goX3RyaWdnZXJfaG9vayk7XG4gICAgfVxuICB9KTtcbn07XG4iLCJjbG9uZSA9IHJlcXVpcmUoJ2Nsb25lJylcblxuYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzID0gW1wiYWxsb3dDcmVhdGVcIiwgXCJhbGxvd0RlbGV0ZVwiLCBcImFsbG93RWRpdFwiLCBcImFsbG93UmVhZFwiLCBcIm1vZGlmeUFsbFJlY29yZHNcIiwgXCJ2aWV3QWxsUmVjb3Jkc1wiLCBcIm1vZGlmeUNvbXBhbnlSZWNvcmRzXCIsIFwidmlld0NvbXBhbnlSZWNvcmRzXCIsIFxuXHRcImFsbG93UmVhZEZpbGVzXCIsIFwiYWxsb3dFZGl0RmlsZXNcIiwgXCJhbGxvd0NyZWF0ZUZpbGVzXCIsIFwiYWxsb3dEZWxldGVGaWxlc1wiLCBcInZpZXdBbGxGaWxlc1wiLCBcIm1vZGlmeUFsbEZpbGVzXCJdIFxub3RoZXJQZXJtaXNzaW9uUHJvcE5hbWVzID0gW1wiZGlzYWJsZWRfbGlzdF92aWV3c1wiLCBcImRpc2FibGVkX2FjdGlvbnNcIiwgXCJ1bnJlYWRhYmxlX2ZpZWxkc1wiLCBcInVuZWRpdGFibGVfZmllbGRzXCIsIFwidW5yZWxhdGVkX29iamVjdHNcIiwgXCJ1bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdFwiXVxucGVybWlzc2lvblByb3BOYW1lcyA9IF8udW5pb24gYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzLCBvdGhlclBlcm1pc3Npb25Qcm9wTmFtZXNcblxuQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFvYmplY3RfbmFtZVxuXHRcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0b2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdFx0aWYgIW9ialxuXHRcdFx0cmV0dXJuXG5cdFx0cmV0dXJuIG9iai5wZXJtaXNzaW9ucy5nZXQoKVxuXHRlbHNlIGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMoc3BhY2VJZCwgdXNlcklkLCBvYmplY3RfbmFtZSlcblxuQ3JlYXRvci5nZXRSZWNvcmRQZXJtaXNzaW9ucyA9IChvYmplY3RfbmFtZSwgcmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpLT5cblx0aWYgIW9iamVjdF9uYW1lIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblxuXHRpZiAhc3BhY2VJZCBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXHRcblx0IyDpmYTku7bmnYPpmZDkuI3lho3kuI7lhbbniLborrDlvZXnvJbovpHphY3nva7lhbPogZRcblx0IyBpZiByZWNvcmQgYW5kIG9iamVjdF9uYW1lID09IFwiY21zX2ZpbGVzXCIgYW5kIE1ldGVvci5pc0NsaWVudFxuXHQjIFx0IyDlpoLmnpzmmK9jbXNfZmlsZXPpmYTku7bvvIzliJnmnYPpmZDlj5blhbbniLborrDlvZXmnYPpmZBcblx0IyBcdGlmIG9iamVjdF9uYW1lID09IFNlc3Npb24uZ2V0KCdvYmplY3RfbmFtZScpXG5cdCMgXHRcdCMg5b2T5YmN5aSE5LqOY21zX2ZpbGVz6ZmE5Lu26K+m57uG55WM6Z2iXG5cdCMgXHRcdG9iamVjdF9uYW1lID0gcmVjb3JkLnBhcmVudFsncmVmZXJlbmNlX3RvLl9vJ107XG5cdCMgXHRcdHJlY29yZF9pZCA9IHJlY29yZC5wYXJlbnQuX2lkO1xuXHQjIFx0ZWxzZSBcblx0IyBcdFx0IyDlvZPliY3lpITkuo5jbXNfZmlsZXPpmYTku7bnmoTniLborrDlvZXnlYzpnaJcblx0IyBcdFx0b2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldCgnb2JqZWN0X25hbWUnKTtcblx0IyBcdFx0cmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIik7XG5cdCMgXHRvYmplY3RfZmllbGRzX2tleXMgPSBfLmtleXMoQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUsIHNwYWNlSWQpPy5maWVsZHMgb3Ige30pIHx8IFtdO1xuXHQjIFx0c2VsZWN0ID0gXy5pbnRlcnNlY3Rpb24ob2JqZWN0X2ZpZWxkc19rZXlzLCBbJ293bmVyJywgJ2NvbXBhbnlfaWQnLCAnY29tcGFueV9pZHMnLCAnbG9ja2VkJ10pIHx8IFtdO1xuXHQjIFx0aWYgc2VsZWN0Lmxlbmd0aCA+IDBcblx0IyBcdFx0cmVjb3JkID0gQ3JlYXRvci5nZXRPYmplY3RSZWNvcmQob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgc2VsZWN0LmpvaW4oJywnKSk7XG5cdCMgXHRlbHNlXG5cdCMgXHRcdHJlY29yZCA9IG51bGw7XG5cblx0cGVybWlzc2lvbnMgPSBfLmNsb25lKENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkpXG5cblx0aWYgcmVjb3JkXG5cdFx0aWYgIV8uaXNFbXB0eShyZWNvcmQucmVjb3JkX3Blcm1pc3Npb25zKVxuXHRcdFx0cmV0dXJuIHJlY29yZC5yZWNvcmRfcGVybWlzc2lvbnNcblxuXHRcdGlzT3duZXIgPSByZWNvcmQub3duZXIgPT0gdXNlcklkIHx8IHJlY29yZC5vd25lcj8uX2lkID09IHVzZXJJZFxuXG5cdFx0aWYgb2JqZWN0X25hbWUgPT0gXCJjbXNfZmlsZXNcIlxuXHRcdFx0IyDpmYTku7bnmoTmn6XnnIvmiYDmnInkv67mlLnmiYDmnInmnYPpmZDkuI7pmYTku7blr7nosaHnmoR2aWV3QWxsUmVjb3Jkc+OAgW1vZGlmeUFsbFJlY29yZHPml6DlhbPvvIzlj6rkuI7lhbbkuLvooajorrDlvZXnmoR2aWV3QWxsRmlsZXPlkoxtb2RpZnlBbGxGaWxlc+acieWFs1xuXHRcdFx0IyDlpoLmnpzmmK9jbXNfZmlsZXPpmYTku7bvvIzliJnmnYPpmZDpnIDopoHpop3lpJbogIPomZHlhbbniLblr7nosaHkuIrlhbPkuo7pmYTku7bnmoTmnYPpmZDphY3nva5cblx0XHRcdG1hc3Rlck9iamVjdE5hbWUgPSByZWNvcmQucGFyZW50WydyZWZlcmVuY2VfdG8uX28nXTtcblx0XHRcdG1hc3RlclJlY29yZFBlcm0gPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG1hc3Rlck9iamVjdE5hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0XHRcdHBlcm1pc3Npb25zLmFsbG93Q3JlYXRlID0gcGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0NyZWF0ZUZpbGVzXG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0VkaXRGaWxlc1xuXHRcdFx0cGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RGVsZXRlRmlsZXNcblx0XHRcdGlmICFtYXN0ZXJSZWNvcmRQZXJtLm1vZGlmeUFsbEZpbGVzIGFuZCAhaXNPd25lclxuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZVxuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBwZXJtaXNzaW9ucy5hbGxvd1JlYWQgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd1JlYWRGaWxlc1xuXHRcdFx0aWYgIW1hc3RlclJlY29yZFBlcm0udmlld0FsbEZpbGVzIGFuZCAhaXNPd25lclxuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHR1c2VyX2NvbXBhbnlfaWRzID0gU3RlZWRvcy5nZXRVc2VyQ29tcGFueUlkcygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHVzZXJfY29tcGFueV9pZHMgPSBDcmVhdG9yLmdldFVzZXJDb21wYW55SWRzKHVzZXJJZCwgc3BhY2VJZClcblx0XHRcdHJlY29yZF9jb21wYW55X2lkID0gcmVjb3JkPy5jb21wYW55X2lkXG5cdFx0XHRpZiByZWNvcmRfY29tcGFueV9pZCBhbmQgXy5pc09iamVjdChyZWNvcmRfY29tcGFueV9pZCkgYW5kIHJlY29yZF9jb21wYW55X2lkLl9pZFxuXHRcdFx0XHQjIOWboHJlY29yZF9jb21wYW55X2lk5pivbG9va3Vw57G75Z6L77yM5pyJ5Y+v6IO9ZHjmjqfku7bkvJrmiorlroPmmKDlsITovazkuLrlr7nlupTnmoRvYmplY3TvvIzmiYDku6Xov5nph4zlj5blh7rlhbZfaWTlgLxcblx0XHRcdFx0cmVjb3JkX2NvbXBhbnlfaWQgPSByZWNvcmRfY29tcGFueV9pZC5faWRcblx0XHRcdHJlY29yZF9jb21wYW55X2lkcyA9IHJlY29yZD8uY29tcGFueV9pZHNcblx0XHRcdGlmIHJlY29yZF9jb21wYW55X2lkcyBhbmQgcmVjb3JkX2NvbXBhbnlfaWRzLmxlbmd0aCBhbmQgXy5pc09iamVjdChyZWNvcmRfY29tcGFueV9pZHNbMF0pXG5cdFx0XHRcdCMg5ZugcmVjb3JkX2NvbXBhbnlfaWRz5pivbG9va3Vw57G75Z6L77yM5pyJ5Y+v6IO9ZHjmjqfku7bkvJrmiorlroPmmKDlsITovazkuLrlr7nlupTnmoRbb2JqZWN0Xe+8jOaJgOS7pei/memHjOWPluWHuuWFtl9pZOWAvFxuXHRcdFx0XHRyZWNvcmRfY29tcGFueV9pZHMgPSByZWNvcmRfY29tcGFueV9pZHMubWFwKChuKS0+IG4uX2lkKVxuXHRcdFx0cmVjb3JkX2NvbXBhbnlfaWRzID0gXy51bmlvbihyZWNvcmRfY29tcGFueV9pZHMsIFtyZWNvcmRfY29tcGFueV9pZF0pXG5cdFx0XHRpZiAhcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyBhbmQgIWlzT3duZXIgYW5kICFwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3Jkc1xuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZVxuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlXG5cdFx0XHRlbHNlIGlmICFwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzIGFuZCBwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3Jkc1xuXHRcdFx0XHRpZiByZWNvcmRfY29tcGFueV9pZHMgYW5kIHJlY29yZF9jb21wYW55X2lkcy5sZW5ndGhcblx0XHRcdFx0XHRpZiB1c2VyX2NvbXBhbnlfaWRzIGFuZCB1c2VyX2NvbXBhbnlfaWRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0aWYgIV8uaW50ZXJzZWN0aW9uKHVzZXJfY29tcGFueV9pZHMsIHJlY29yZF9jb21wYW55X2lkcykubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdCMg6K6w5b2V55qEY29tcGFueV9pZC9jb21wYW55X2lkc+WxnuaAp+S4jeWcqOW9k+WJjeeUqOaIt3VzZXJfY29tcGFueV9pZHPojIPlm7TlhoXml7bvvIzorqTkuLrml6DmnYPkv67mlLlcblx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdCMg6K6w5b2V5pyJY29tcGFueV9pZC9jb21wYW55X2lkc+WxnuaAp++8jOS9huaYr+W9k+WJjeeUqOaIt3VzZXJfY29tcGFueV9pZHPkuLrnqbrml7bvvIzorqTkuLrml6DmnYPkv67mlLlcblx0XHRcdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlXG5cdFx0XHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlXG5cdFx0XHRcblx0XHRcdGlmIHJlY29yZC5sb2NrZWQgYW5kICFwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2VcblxuXHRcdFx0aWYgIXBlcm1pc3Npb25zLnZpZXdBbGxSZWNvcmRzIGFuZCAhaXNPd25lciBhbmQgIXBlcm1pc3Npb25zLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBmYWxzZVxuXHRcdFx0ZWxzZSBpZiAhcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgYW5kIHBlcm1pc3Npb25zLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdFx0XHRpZiByZWNvcmRfY29tcGFueV9pZHMgYW5kIHJlY29yZF9jb21wYW55X2lkcy5sZW5ndGhcblx0XHRcdFx0XHRpZiB1c2VyX2NvbXBhbnlfaWRzIGFuZCB1c2VyX2NvbXBhbnlfaWRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0aWYgIV8uaW50ZXJzZWN0aW9uKHVzZXJfY29tcGFueV9pZHMsIHJlY29yZF9jb21wYW55X2lkcykubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdCMg6K6w5b2V55qEY29tcGFueV9pZC9jb21wYW55X2lkc+WxnuaAp+S4jeWcqOW9k+WJjeeUqOaIt3VzZXJfY29tcGFueV9pZHPojIPlm7TlhoXml7bvvIzorqTkuLrml6DmnYPmn6XnnItcblx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dSZWFkID0gZmFsc2Vcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHQjIOiusOW9leaciWNvbXBhbnlfaWTlsZ7mgKfvvIzkvYbmmK/lvZPliY3nlKjmiLd1c2VyX2NvbXBhbnlfaWRz5Li656m65pe277yM6K6k5Li65peg5p2D5p+l55yLXG5cdFx0XHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBmYWxzZVxuXHRcblx0cmV0dXJuIHBlcm1pc3Npb25zXG5cblxuIyBjdXJyZW50T2JqZWN0TmFtZe+8muW9k+WJjeS4u+WvueixoVxuIyByZWxhdGVkTGlzdEl0ZW3vvJpDcmVhdG9yLmdldFJlbGF0ZWRMaXN0KFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIiksIFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpKeS4reWPlnJlbGF0ZWRfb2JqZWN0X25hbWXlr7nlupTnmoTlgLxcbiMgY3VycmVudFJlY29yZOW9k+WJjeS4u+WvueixoeeahOivpue7huiusOW9lVxuaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdENyZWF0b3IuZ2V0UmVjb3JkUmVsYXRlZExpc3RQZXJtaXNzaW9ucyA9IChjdXJyZW50T2JqZWN0TmFtZSwgcmVsYXRlZExpc3RJdGVtLCBjdXJyZW50UmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpLT5cblx0XHRpZiAhY3VycmVudE9iamVjdE5hbWUgYW5kIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0Y3VycmVudE9iamVjdE5hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cblx0XHRpZiAhcmVsYXRlZExpc3RJdGVtXG5cdFx0XHRjb25zb2xlLmVycm9yKFwicmVsYXRlZExpc3RJdGVtIG11c3Qgbm90IGJlIGVtcHR5IGZvciB0aGUgZnVuY3Rpb24gQ3JlYXRvci5nZXRSZWNvcmRSZWxhdGVkTGlzdFBlcm1pc3Npb25zXCIpO1xuXHRcdFx0cmV0dXJuIHt9XG5cblx0XHRpZiAhY3VycmVudFJlY29yZCBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRjdXJyZW50UmVjb3JkID0gQ3JlYXRvci5nZXRPYmplY3RSZWNvcmQoKVxuXG5cdFx0aWYgIXVzZXJJZCBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblxuXHRcdGlmICFzcGFjZUlkIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIilcblxuXHRcdG1hc3RlclJlY29yZFBlcm0gPSBDcmVhdG9yLmdldFJlY29yZFBlcm1pc3Npb25zKGN1cnJlbnRPYmplY3ROYW1lLCBjdXJyZW50UmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpXG5cdFx0cmVsYXRlZE9iamVjdFBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkTGlzdEl0ZW0ub2JqZWN0X25hbWUpXG5cdFx0cmVzdWx0ID0gXy5jbG9uZSByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnNcblxuXHRcdGlmIHJlbGF0ZWRMaXN0SXRlbS5pc19maWxlXG5cdFx0XHRyZXN1bHQuYWxsb3dDcmVhdGUgPSByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0NyZWF0ZUZpbGVzXG5cdFx0XHRyZXN1bHQuYWxsb3dFZGl0ID0gcmVsYXRlZE9iamVjdFBlcm1pc3Npb25zLmFsbG93RWRpdCAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RWRpdEZpbGVzXG5cdFx0ZWxzZVxuXHRcdFx0d3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPSByZWxhdGVkTGlzdEl0ZW0ud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgfHwgZmFsc2Vcblx0XHRcdG1hc3RlckFsbG93ID0gZmFsc2Vcblx0XHRcdGlmIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID09IHRydWVcblx0XHRcdFx0bWFzdGVyQWxsb3cgPSBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93UmVhZFxuXHRcdFx0ZWxzZSBpZiB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9PSBmYWxzZVxuXHRcdFx0XHRtYXN0ZXJBbGxvdyA9IG1hc3RlclJlY29yZFBlcm0uYWxsb3dFZGl0XG5cblx0XHRcdHVuZWRpdGFibGVfcmVsYXRlZF9saXN0ID0gQ3JlYXRvci5nZXRSZWNvcmRTYWZlUmVsYXRlZExpc3QoY3VycmVudFJlY29yZCwgY3VycmVudE9iamVjdE5hbWUpXG5cdFx0XHRpc1JlbGF0ZU9iamVjdFVuZWRpdGFibGUgPSB1bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdC5pbmRleE9mKHJlbGF0ZWRMaXN0SXRlbS5vYmplY3RfbmFtZSkgPiAtMVxuXG5cdFx0XHRyZXN1bHQuYWxsb3dDcmVhdGUgPSBtYXN0ZXJBbGxvdyAmJiByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgJiYgIWlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZVxuXHRcdFx0cmVzdWx0LmFsbG93RWRpdCA9IG1hc3RlckFsbG93ICYmIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0VkaXQgJiYgIWlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZVxuXHRcdHJldHVybiByZXN1bHRcblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cblx0Q3JlYXRvci5nZXRBbGxQZXJtaXNzaW9ucyA9IChzcGFjZUlkLCB1c2VySWQpIC0+XG5cdFx0cGVybWlzc2lvbnMgPVxuXHRcdFx0b2JqZWN0czoge31cblx0XHRcdGFzc2lnbmVkX2FwcHM6IFtdXG5cdFx0IyMjXG5cdFx05p2D6ZmQ6ZuG6K+05piOOlxuXHRcdOWGhee9ruadg+mZkOmbhi1hZG1pbix1c2VyLG1lbWJlcixndWVzdCx3b3JrZmxvd19hZG1pbixvcmdhbml6YXRpb25fYWRtaW5cblx0XHToh6rlrprkuYnmnYPpmZDpm4Yt5pWw5o2u5bqT5Lit5paw5bu655qE6Zmk5YaF572u5p2D6ZmQ6ZuG5Lul5aSW55qE5YW25LuW5p2D6ZmQ6ZuGXG5cdFx054m55a6a55So5oi36ZuG5ZCI5p2D6ZmQ6ZuG77yI5Y2zdXNlcnPlsZ7mgKfkuI3lj6/phY3nva7vvIktYWRtaW4sdXNlcixtZW1iZXIsZ3Vlc3Rcblx0XHTlj6/phY3nva7nlKjmiLfpm4blkIjmnYPpmZDpm4bvvIjljbN1c2Vyc+WxnuaAp+WPr+mFjee9ru+8iS13b3JrZmxvd19hZG1pbixvcmdhbml6YXRpb25fYWRtaW7ku6Xlj4roh6rlrprkuYnmnYPpmZDpm4Zcblx0XHQjIyNcblxuXHRcdGlzU3BhY2VBZG1pbiA9IGZhbHNlXG5cdFx0c3BhY2VVc2VyID0gbnVsbFxuXHRcdGlmIHVzZXJJZFxuXHRcdFx0aXNTcGFjZUFkbWluID0gQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcklkKVxuXHRcdFx0c3BhY2VVc2VyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7IHNwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWQgfSwgeyBmaWVsZHM6IHsgcHJvZmlsZTogMSB9IH0pXG5cblx0XHRwc2V0c0FkbWluID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdhZG1pbid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pIHx8IG51bGxcblx0XHRwc2V0c1VzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ3VzZXInfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KSB8fCBudWxsXG5cdFx0cHNldHNNZW1iZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ21lbWJlcid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pIHx8IG51bGxcblx0XHRwc2V0c0d1ZXN0ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdndWVzdCd9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pIHx8IG51bGxcblxuXHRcdHBzZXRzU3VwcGxpZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ3N1cHBsaWVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSkgfHwgbnVsbFxuXHRcdHBzZXRzQ3VzdG9tZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2N1c3RvbWVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSkgfHwgbnVsbFxuXHRcdGlmIHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZVxuXHRcdFx0cHNldHNDdXJyZW50ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7c3BhY2U6IHNwYWNlSWQsICRvcjogW3t1c2VyczogdXNlcklkfSwge25hbWU6IHNwYWNlVXNlci5wcm9maWxlfV19LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxLCBuYW1lOjF9fSkuZmV0Y2goKVxuXHRcdGVsc2Vcblx0XHRcdHBzZXRzQ3VycmVudCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe3VzZXJzOiB1c2VySWQsIHNwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MSwgbmFtZToxfX0pLmZldGNoKClcblxuXHRcdHBzZXRzQWRtaW5fcG9zID0gbnVsbFxuXHRcdHBzZXRzVXNlcl9wb3MgPSBudWxsXG5cdFx0cHNldHNNZW1iZXJfcG9zID0gbnVsbFxuXHRcdHBzZXRzR3Vlc3RfcG9zID0gbnVsbFxuXHRcdHBzZXRzQ3VycmVudF9wb3MgPSBudWxsXG5cdFx0cHNldHNTdXBwbGllcl9wb3MgPSBudWxsXG5cdFx0cHNldHNDdXN0b21lcl9wb3MgPSBudWxsXG5cblx0XHRpZiBwc2V0c0FkbWluPy5faWRcblx0XHRcdHBzZXRzQWRtaW5fcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe3Blcm1pc3Npb25fc2V0X2lkOiBwc2V0c0FkbWluLl9pZH0sIHtmaWVsZHM6IHtjcmVhdGVkOiAwLCBtb2RpZmllZDogMCwgY3JlYXRlZF9ieTogMCwgbW9kaWZpZWRfYnk6IDB9fSkuZmV0Y2goKVxuXHRcdGlmIHBzZXRzVXNlcj8uX2lkXG5cdFx0XHRwc2V0c1VzZXJfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe3Blcm1pc3Npb25fc2V0X2lkOiBwc2V0c1VzZXIuX2lkfSwge2ZpZWxkczoge2NyZWF0ZWQ6IDAsIG1vZGlmaWVkOiAwLCBjcmVhdGVkX2J5OiAwLCBtb2RpZmllZF9ieTogMH19KS5mZXRjaCgpXG5cdFx0aWYgcHNldHNNZW1iZXI/Ll9pZFxuXHRcdFx0cHNldHNNZW1iZXJfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe3Blcm1pc3Npb25fc2V0X2lkOiBwc2V0c01lbWJlci5faWR9LCB7ZmllbGRzOiB7Y3JlYXRlZDogMCwgbW9kaWZpZWQ6IDAsIGNyZWF0ZWRfYnk6IDAsIG1vZGlmaWVkX2J5OiAwfX0pLmZldGNoKClcblx0XHRpZiBwc2V0c0d1ZXN0Py5faWRcblx0XHRcdHBzZXRzR3Vlc3RfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe3Blcm1pc3Npb25fc2V0X2lkOiBwc2V0c0d1ZXN0Ll9pZH0sIHtmaWVsZHM6IHtjcmVhdGVkOiAwLCBtb2RpZmllZDogMCwgY3JlYXRlZF9ieTogMCwgbW9kaWZpZWRfYnk6IDB9fSkuZmV0Y2goKVxuXHRcdGlmIHBzZXRzU3VwcGxpZXI/Ll9pZFxuXHRcdFx0cHNldHNTdXBwbGllcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzU3VwcGxpZXIuX2lkfSwge2ZpZWxkczoge2NyZWF0ZWQ6IDAsIG1vZGlmaWVkOiAwLCBjcmVhdGVkX2J5OiAwLCBtb2RpZmllZF9ieTogMH19KS5mZXRjaCgpXG5cdFx0aWYgcHNldHNDdXN0b21lcj8uX2lkXG5cdFx0XHRwc2V0c0N1c3RvbWVyX3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtwZXJtaXNzaW9uX3NldF9pZDogcHNldHNDdXN0b21lci5faWR9LCB7ZmllbGRzOiB7Y3JlYXRlZDogMCwgbW9kaWZpZWQ6IDAsIGNyZWF0ZWRfYnk6IDAsIG1vZGlmaWVkX2J5OiAwfX0pLmZldGNoKClcblxuXHRcdGlmIHBzZXRzQ3VycmVudC5sZW5ndGggPiAwXG5cdFx0XHRzZXRfaWRzID0gXy5wbHVjayBwc2V0c0N1cnJlbnQsIFwiX2lkXCJcblx0XHRcdHBzZXRzQ3VycmVudF9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHskaW46IHNldF9pZHN9fSkuZmV0Y2goKVxuXHRcdFx0cHNldHNDdXJyZW50TmFtZXMgPSBfLnBsdWNrIHBzZXRzQ3VycmVudCwgXCJuYW1lXCJcblx0XHRwc2V0cyA9IHtcblx0XHRcdHBzZXRzQWRtaW4sIFxuXHRcdFx0cHNldHNVc2VyLCBcblx0XHRcdHBzZXRzQ3VycmVudCwgXG5cdFx0XHRwc2V0c01lbWJlciwgXG5cdFx0XHRwc2V0c0d1ZXN0LFxuXHRcdFx0cHNldHNTdXBwbGllcixcblx0XHRcdHBzZXRzQ3VzdG9tZXIsXG5cdFx0XHRpc1NwYWNlQWRtaW4sXG5cdFx0XHRzcGFjZVVzZXIsIFxuXHRcdFx0cHNldHNBZG1pbl9wb3MsIFxuXHRcdFx0cHNldHNVc2VyX3BvcywgXG5cdFx0XHRwc2V0c01lbWJlcl9wb3MsIFxuXHRcdFx0cHNldHNHdWVzdF9wb3MsXG5cdFx0XHRwc2V0c1N1cHBsaWVyX3Bvcyxcblx0XHRcdHBzZXRzQ3VzdG9tZXJfcG9zLFxuXHRcdFx0cHNldHNDdXJyZW50X3Bvc1xuXHRcdH1cblx0XHRwZXJtaXNzaW9ucy5hc3NpZ25lZF9hcHBzID0gQ3JlYXRvci5nZXRBc3NpZ25lZEFwcHMuYmluZChwc2V0cykoc3BhY2VJZCwgdXNlcklkKVxuXHRcdHBlcm1pc3Npb25zLmFzc2lnbmVkX21lbnVzID0gQ3JlYXRvci5nZXRBc3NpZ25lZE1lbnVzLmJpbmQocHNldHMpKHNwYWNlSWQsIHVzZXJJZClcblx0XHRwZXJtaXNzaW9ucy51c2VyX3Blcm1pc3Npb25fc2V0cyA9IHBzZXRzQ3VycmVudE5hbWVzXG5cdFx0X2kgPSAwXG5cdFx0Xy5lYWNoIENyZWF0b3Iub2JqZWN0c0J5TmFtZSwgKG9iamVjdCwgb2JqZWN0X25hbWUpLT5cblx0XHRcdF9pKytcblx0XHRcdGlmICFfLmhhcyhvYmplY3QsICdzcGFjZScpIHx8ICFvYmplY3Quc3BhY2UgfHwgb2JqZWN0LnNwYWNlID09IHNwYWNlSWRcblx0XHRcdFx0aWYgIV8uaGFzKG9iamVjdCwgJ2luX2RldmVsb3BtZW50JykgfHwgb2JqZWN0LmluX2RldmVsb3BtZW50ID09ICcwJyB8fCAob2JqZWN0LmluX2RldmVsb3BtZW50ICE9ICcwJyAmJiBpc1NwYWNlQWRtaW4pXG5cdFx0XHRcdFx0cGVybWlzc2lvbnMub2JqZWN0c1tvYmplY3RfbmFtZV0gPSBDcmVhdG9yLmNvbnZlcnRPYmplY3QoY2xvbmUoQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXSksIHNwYWNlSWQpXG5cdFx0XHRcdFx0cGVybWlzc2lvbnMub2JqZWN0c1tvYmplY3RfbmFtZV1bXCJwZXJtaXNzaW9uc1wiXSA9IENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMuYmluZChwc2V0cykoc3BhY2VJZCwgdXNlcklkLCBvYmplY3RfbmFtZSlcblx0XHRyZXR1cm4gcGVybWlzc2lvbnNcblxuXHR1bmlvblBsdXMgPSAoYXJyYXksIG90aGVyKSAtPlxuXHRcdGlmICFhcnJheSBhbmQgIW90aGVyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkXG5cdFx0aWYgIWFycmF5XG5cdFx0XHRhcnJheSA9IFtdXG5cdFx0aWYgIW90aGVyXG5cdFx0XHRvdGhlciA9IFtdXG5cdFx0cmV0dXJuIF8udW5pb24oYXJyYXksIG90aGVyKVxuXG5cdGludGVyc2VjdGlvblBsdXMgPSAoYXJyYXksIG90aGVyKSAtPlxuXHRcdGlmICFhcnJheSBhbmQgIW90aGVyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkXG5cdFx0aWYgIWFycmF5XG5cdFx0XHRhcnJheSA9IFtdXG5cdFx0aWYgIW90aGVyXG5cdFx0XHRvdGhlciA9IFtdXG5cdFx0cmV0dXJuIF8uaW50ZXJzZWN0aW9uKGFycmF5LCBvdGhlcilcblxuXHRleHRlbmRQZXJtaXNzaW9uUHJvcHMgPSAodGFyZ2V0LCBwcm9wcykgLT5cblx0XHRwcm9wTmFtZXMgPSBwZXJtaXNzaW9uUHJvcE5hbWVzXG5cdFx0ZmlsZXNQcm9OYW1lcyA9IFxuXHRcdGlmIHByb3BzXG5cdFx0XHRfLmVhY2ggcHJvcE5hbWVzLCAocHJvcE5hbWUpIC0+XG5cdFx0XHRcdHRhcmdldFtwcm9wTmFtZV0gPSBwcm9wc1twcm9wTmFtZV1cblxuXHRcdFx0IyB0YXJnZXQuYWxsb3dDcmVhdGUgPSBwcm9wcy5hbGxvd0NyZWF0ZVxuXHRcdFx0IyB0YXJnZXQuYWxsb3dEZWxldGUgPSBwcm9wcy5hbGxvd0RlbGV0ZVxuXHRcdFx0IyB0YXJnZXQuYWxsb3dFZGl0ID0gcHJvcHMuYWxsb3dFZGl0XG5cdFx0XHQjIHRhcmdldC5hbGxvd1JlYWQgPSBwcm9wcy5hbGxvd1JlYWRcblx0XHRcdCMgdGFyZ2V0Lm1vZGlmeUFsbFJlY29yZHMgPSBwcm9wcy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHQjIHRhcmdldC52aWV3QWxsUmVjb3JkcyA9IHByb3BzLnZpZXdBbGxSZWNvcmRzXG5cdFx0XHQjIHRhcmdldC5tb2RpZnlDb21wYW55UmVjb3JkcyA9IHByb3BzLm1vZGlmeUNvbXBhbnlSZWNvcmRzXG5cdFx0XHQjIHRhcmdldC52aWV3Q29tcGFueVJlY29yZHMgPSBwcm9wcy52aWV3Q29tcGFueVJlY29yZHNcblx0XHRcdCMgdGFyZ2V0LmRpc2FibGVkX2xpc3Rfdmlld3MgPSBwcm9wcy5kaXNhYmxlZF9saXN0X3ZpZXdzXG5cdFx0XHQjIHRhcmdldC5kaXNhYmxlZF9hY3Rpb25zID0gcHJvcHMuZGlzYWJsZWRfYWN0aW9uc1xuXHRcdFx0IyB0YXJnZXQudW5yZWFkYWJsZV9maWVsZHMgPSBwcm9wcy51bnJlYWRhYmxlX2ZpZWxkc1xuXHRcdFx0IyB0YXJnZXQudW5lZGl0YWJsZV9maWVsZHMgPSBwcm9wcy51bmVkaXRhYmxlX2ZpZWxkc1xuXHRcdFx0IyB0YXJnZXQudW5yZWxhdGVkX29iamVjdHMgPSBwcm9wcy51bnJlbGF0ZWRfb2JqZWN0c1xuXHRcdFx0IyB0YXJnZXQudW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QgPSBwcm9wcy51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdFxuXG5cdG92ZXJsYXlCYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wcyA9ICh0YXJnZXQsIHByb3BzKSAtPlxuXHRcdHByb3BOYW1lcyA9IGJhc2VCb29sZWFuUGVybWlzc2lvblByb3BOYW1lc1xuXHRcdF8uZWFjaCBwcm9wTmFtZXMsIChwcm9wTmFtZSkgLT5cblx0XHRcdGlmIHByb3BzW3Byb3BOYW1lXVxuXHRcdFx0XHR0YXJnZXRbcHJvcE5hbWVdID0gdHJ1ZVxuXHRcdFxuXHRcdCMgaWYgcG8uYWxsb3dSZWFkXG5cdFx0IyBcdHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IHRydWVcblx0XHQjIGlmIHBvLmFsbG93Q3JlYXRlXG5cdFx0IyBcdHBlcm1pc3Npb25zLmFsbG93Q3JlYXRlID0gdHJ1ZVxuXHRcdCMgaWYgcG8uYWxsb3dFZGl0XG5cdFx0IyBcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IHRydWVcblx0XHQjIGlmIHBvLmFsbG93RGVsZXRlXG5cdFx0IyBcdHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gdHJ1ZVxuXHRcdCMgaWYgcG8ubW9kaWZ5QWxsUmVjb3Jkc1xuXHRcdCMgXHRwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzID0gdHJ1ZVxuXHRcdCMgaWYgcG8udmlld0FsbFJlY29yZHNcblx0XHQjIFx0cGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgPSB0cnVlXG5cdFx0IyBpZiBwby5tb2RpZnlDb21wYW55UmVjb3Jkc1xuXHRcdCMgXHRwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3JkcyA9IHRydWVcblx0XHQjIGlmIHBvLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdCMgXHRwZXJtaXNzaW9ucy52aWV3Q29tcGFueVJlY29yZHMgPSB0cnVlXG5cblxuXHRDcmVhdG9yLmdldEFzc2lnbmVkQXBwcyA9IChzcGFjZUlkLCB1c2VySWQpLT5cblx0XHRwc2V0c0FkbWluID0gdGhpcy5wc2V0c0FkbWluIHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnYWRtaW4nfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KVxuXHRcdHBzZXRzVXNlciA9IHRoaXMucHNldHNVc2VyIHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAndXNlcid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pXG5cdFx0cHNldHNTdXBwbGllciA9IHRoaXMucHNldHNNZW1iZXIgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdzdXBwbGllcid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pXG5cdFx0cHNldHNDdXN0b21lciA9IHRoaXMucHNldHNHdWVzdCB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2N1c3RvbWVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSlcblx0XHQjIHBzZXRzTWVtYmVyID0gdGhpcy5wc2V0c01lbWJlciB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ21lbWJlcid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pXG5cdFx0IyBwc2V0c0d1ZXN0ID0gdGhpcy5wc2V0c0d1ZXN0IHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnZ3Vlc3QnfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KVxuXHRcdHNwYWNlVXNlciA9IG51bGw7XG5cdFx0aWYgdXNlcklkXG5cdFx0XHRzcGFjZVVzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHsgc3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZCB9LCB7IGZpZWxkczogeyBwcm9maWxlOiAxIH0gfSlcblx0XHRpZiBzcGFjZVVzZXIgJiYgc3BhY2VVc2VyLnByb2ZpbGVcblx0XHRcdHBzZXRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7c3BhY2U6IHNwYWNlSWQsICRvcjogW3t1c2VyczogdXNlcklkfSwge25hbWU6IHNwYWNlVXNlci5wcm9maWxlfV19LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxLCBuYW1lOjF9fSkuZmV0Y2goKVxuXHRcdGVsc2Vcblx0XHRcdHBzZXRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7dXNlcnM6IHVzZXJJZCwgc3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxLCBuYW1lOjF9fSkuZmV0Y2goKVxuXHRcdGlzU3BhY2VBZG1pbiA9IGlmIF8uaXNCb29sZWFuKHRoaXMuaXNTcGFjZUFkbWluKSB0aGVuIHRoaXMuaXNTcGFjZUFkbWluIGVsc2UgQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcklkKVxuXHRcdGFwcHMgPSBbXVxuXHRcdGlmIGlzU3BhY2VBZG1pblxuXHRcdFx0cmV0dXJuIFtdXG5cdFx0ZWxzZVxuXHRcdFx0dXNlclByb2ZpbGUgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgdXNlcjogdXNlcklkfSwge2ZpZWxkczoge3Byb2ZpbGU6IDF9fSk/LnByb2ZpbGVcblx0XHRcdHBzZXRCYXNlID0gcHNldHNVc2VyXG5cdFx0XHRpZiB1c2VyUHJvZmlsZVxuXHRcdFx0XHRpZiB1c2VyUHJvZmlsZSA9PSAnc3VwcGxpZXInXG5cdFx0XHRcdFx0cHNldEJhc2UgPSBwc2V0c1N1cHBsaWVyXG5cdFx0XHRcdGVsc2UgaWYgdXNlclByb2ZpbGUgPT0gJ2N1c3RvbWVyJ1xuXHRcdFx0XHRcdHBzZXRCYXNlID0gcHNldHNDdXN0b21lclxuXHRcdFx0aWYgcHNldEJhc2U/LmFzc2lnbmVkX2FwcHM/Lmxlbmd0aFxuXHRcdFx0XHRhcHBzID0gXy51bmlvbiBhcHBzLCBwc2V0QmFzZS5hc3NpZ25lZF9hcHBzXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCMgdXNlcuadg+mZkOmbhuS4reeahGFzc2lnbmVkX2FwcHPooajnpLrmiYDmnInnlKjmiLflhbfmnInnmoRhcHBz5p2D6ZmQ77yM5Li656m65YiZ6KGo56S65pyJ5omA5pyJYXBwc+adg+mZkO+8jOS4jemcgOimgeS9nOadg+mZkOWIpOaWreS6hlxuXHRcdFx0XHRyZXR1cm4gW11cblx0XHRcdF8uZWFjaCBwc2V0cywgKHBzZXQpLT5cblx0XHRcdFx0aWYgIXBzZXQuYXNzaWduZWRfYXBwc1xuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRpZiBwc2V0Lm5hbWUgPT0gXCJhZG1pblwiIHx8ICBwc2V0Lm5hbWUgPT0gXCJ1c2VyXCIgfHwgcHNldC5uYW1lID09ICdzdXBwbGllcicgfHwgcHNldC5uYW1lID09ICdjdXN0b21lcidcblx0XHRcdFx0XHQjIOi/memHjOS5i+aJgOS7peimgeaOkumZpGFkbWluL3VzZXLvvIzmmK/lm6DkuLrov5nkuKTkuKrmnYPpmZDpm4bmmK/miYDmnInmnYPpmZDpm4bkuK11c2Vyc+WxnuaAp+aXoOaViOeahOadg+mZkOmbhu+8jOeJueaMh+W3peS9nOWMuueuoeeQhuWRmOWSjOaJgOacieeUqOaIt1xuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRhcHBzID0gXy51bmlvbiBhcHBzLCBwc2V0LmFzc2lnbmVkX2FwcHNcblx0XHRcdHJldHVybiBfLndpdGhvdXQoXy51bmlxKGFwcHMpLHVuZGVmaW5lZCxudWxsKVxuXG5cdENyZWF0b3IuZ2V0QXNzaWduZWRNZW51cyA9IChzcGFjZUlkLCB1c2VySWQpLT5cblx0XHRwc2V0cyA9ICB0aGlzLnBzZXRzQ3VycmVudCB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHt1c2VyczogdXNlcklkLCBzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjEsIG5hbWU6MX19KS5mZXRjaCgpXG5cdFx0aXNTcGFjZUFkbWluID0gaWYgXy5pc0Jvb2xlYW4odGhpcy5pc1NwYWNlQWRtaW4pIHRoZW4gdGhpcy5pc1NwYWNlQWRtaW4gZWxzZSBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpXG5cdFx0YWRtaW5NZW51cyA9IENyZWF0b3IuQXBwcy5hZG1pbj8uYWRtaW5fbWVudXNcblx0XHQjIOWmguaenOayoeaciWFkbWlu6I+c5Y2V6K+05piO5LiN6ZyA6KaB55u45YWz5Yqf6IO977yM55u05o6l6L+U5Zue56m6XG5cdFx0dW5sZXNzIGFkbWluTWVudXNcblx0XHRcdHJldHVybiBbXVxuXHRcdGFib3V0TWVudSA9IGFkbWluTWVudXMuZmluZCAobikgLT5cblx0XHRcdG4uX2lkID09ICdhYm91dCdcblx0XHRhZG1pbk1lbnVzID0gYWRtaW5NZW51cy5maWx0ZXIgKG4pIC0+XG5cdFx0XHRuLl9pZCAhPSAnYWJvdXQnXG5cdFx0b3RoZXJNZW51QXBwcyA9IF8uc29ydEJ5IF8uZmlsdGVyKF8udmFsdWVzKENyZWF0b3IuQXBwcyksIChuKSAtPlxuXHRcdFx0cmV0dXJuIG4uYWRtaW5fbWVudXMgYW5kIG4uX2lkICE9ICdhZG1pbidcblx0XHQpLCAnc29ydCdcblx0XHRvdGhlck1lbnVzID0gXy5mbGF0dGVuKF8ucGx1Y2sob3RoZXJNZW51QXBwcywgXCJhZG1pbl9tZW51c1wiKSlcblx0XHQjIOiPnOWNleacieS4iemDqOWIhue7hOaIkO+8jOiuvue9rkFQUOiPnOWNleOAgeWFtuS7lkFQUOiPnOWNleS7peWPimFib3V06I+c5Y2VXG5cdFx0YWxsTWVudXMgPSBfLnVuaW9uKGFkbWluTWVudXMsIG90aGVyTWVudXMsIFthYm91dE1lbnVdKVxuXHRcdGlmIGlzU3BhY2VBZG1pblxuXHRcdFx0IyDlt6XkvZzljLrnrqHnkIblkZjmnInlhajpg6joj5zljZXlip/og71cblx0XHRcdHJlc3VsdCA9IGFsbE1lbnVzXG5cdFx0ZWxzZVxuXHRcdFx0dXNlclByb2ZpbGUgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgdXNlcjogdXNlcklkfSwge2ZpZWxkczoge3Byb2ZpbGU6IDF9fSk/LnByb2ZpbGUgfHwgJ3VzZXInXG5cdFx0XHRjdXJyZW50UHNldE5hbWVzID0gcHNldHMubWFwIChuKSAtPlxuXHRcdFx0XHRyZXR1cm4gbi5uYW1lXG5cdFx0XHRtZW51cyA9IGFsbE1lbnVzLmZpbHRlciAobWVudSktPlxuXHRcdFx0XHRwc2V0c01lbnUgPSBtZW51LnBlcm1pc3Npb25fc2V0c1xuXHRcdFx0XHQjIOWmguaenOaZrumAmueUqOaIt+acieadg+mZkO+8jOWImeebtOaOpei/lOWbnnRydWVcblx0XHRcdFx0aWYgcHNldHNNZW51ICYmIHBzZXRzTWVudS5pbmRleE9mKHVzZXJQcm9maWxlKSA+IC0xXG5cdFx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdFx0IyDlkKbliJnlj5blvZPliY3nlKjmiLfnmoTmnYPpmZDpm4bkuI5tZW516I+c5Y2V6KaB5rGC55qE5p2D6ZmQ6ZuG5a+55q+U77yM5aaC5p6c5Lqk6ZuG5aSn5LqOMeS4quWImei/lOWbnnRydWVcblx0XHRcdFx0cmV0dXJuIF8uaW50ZXJzZWN0aW9uKGN1cnJlbnRQc2V0TmFtZXMsIHBzZXRzTWVudSkubGVuZ3RoXG5cdFx0XHRyZXN1bHQgPSBtZW51c1xuXHRcdFxuXHRcdHJldHVybiBfLnNvcnRCeShyZXN1bHQsXCJzb3J0XCIpXG5cblx0ZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdCA9IChwZXJtaXNzaW9uX29iamVjdHMsIG9iamVjdF9uYW1lLCBwZXJtaXNzaW9uX3NldF9pZCktPlxuXG5cdFx0aWYgXy5pc051bGwocGVybWlzc2lvbl9vYmplY3RzKVxuXHRcdFx0cmV0dXJuIG51bGxcblx0XHRpZiBfLmlzQXJyYXkocGVybWlzc2lvbl9vYmplY3RzKVxuXHRcdFx0cmV0dXJuIF8uZmluZCBwZXJtaXNzaW9uX29iamVjdHMsIChwbyktPlxuXHRcdFx0XHRcdHJldHVybiBwby5vYmplY3RfbmFtZSA9PSBvYmplY3RfbmFtZVxuXHRcdHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZE9uZSh7b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLCBwZXJtaXNzaW9uX3NldF9pZDogcGVybWlzc2lvbl9zZXRfaWR9KVxuXG5cdGZpbmRfcGVybWlzc2lvbl9vYmplY3QgPSAocGVybWlzc2lvbl9vYmplY3RzLCBvYmplY3RfbmFtZSwgcGVybWlzc2lvbl9zZXRfaWRzKS0+XG5cdFx0aWYgXy5pc051bGwocGVybWlzc2lvbl9vYmplY3RzKVxuXHRcdFx0cmV0dXJuIG51bGxcblx0XHRpZiBfLmlzQXJyYXkocGVybWlzc2lvbl9vYmplY3RzKVxuXHRcdFx0cmV0dXJuIF8uZmlsdGVyIHBlcm1pc3Npb25fb2JqZWN0cywgKHBvKS0+XG5cdFx0XHRcdHJldHVybiBwby5vYmplY3RfbmFtZSA9PSBvYmplY3RfbmFtZVxuXHRcdENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsIHBlcm1pc3Npb25fc2V0X2lkOiB7JGluOiBwZXJtaXNzaW9uX3NldF9pZHN9fSkuZmV0Y2goKVxuXG5cdHVuaW9uUGVybWlzc2lvbk9iamVjdHMgPSAocG9zLCBvYmplY3QsIHBzZXRzKS0+XG5cdFx0IyDmiopkYuWPinltbOS4reeahHBlcm1pc3Npb25fb2JqZWN0c+WQiOW5tu+8jOS8mOWFiOWPlmRi5Lit55qEXG5cdFx0cmVzdWx0ID0gW11cblx0XHRfLmVhY2ggb2JqZWN0LnBlcm1pc3Npb25fc2V0LCAob3BzLCBvcHNfa2V5KS0+XG5cdFx0XHQjIOaKinltbOS4remZpOS6hueJueWumueUqOaIt+mbhuWQiOadg+mZkOmbhlwiYWRtaW5cIiwgXCJ1c2VyXCIsIFwibWVtYmVyXCIsIFwiZ3Vlc3RcIuWklueahOWFtuS7luWvueixoeadg+mZkOWFiOWtmOWFpXJlc3VsdFxuXHRcdFx0IyBpZiBbXCJhZG1pblwiLCBcInVzZXJcIiwgXCJtZW1iZXJcIiwgXCJndWVzdFwiLCBcIndvcmtmbG93X2FkbWluXCIsIFwib3JnYW5pemF0aW9uX2FkbWluXCJdLmluZGV4T2Yob3BzX2tleSkgPCAwXG5cdFx0XHRpZiBbXCJhZG1pblwiLCBcInVzZXJcIiwgXCJtZW1iZXJcIiwgXCJndWVzdFwiXS5pbmRleE9mKG9wc19rZXkpIDwgMFxuXHRcdFx0XHRjdXJyZW50UHNldCA9IHBzZXRzLmZpbmQgKHBzZXQpLT4gcmV0dXJuIHBzZXQubmFtZSA9PSBvcHNfa2V5XG5cdFx0XHRcdGlmIGN1cnJlbnRQc2V0XG5cdFx0XHRcdFx0dGVtcE9wcyA9IF8uY2xvbmUob3BzKSB8fCB7fVxuXHRcdFx0XHRcdHRlbXBPcHMucGVybWlzc2lvbl9zZXRfaWQgPSBjdXJyZW50UHNldC5faWRcblx0XHRcdFx0XHR0ZW1wT3BzLm9iamVjdF9uYW1lID0gb2JqZWN0Lm9iamVjdF9uYW1lXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2ggdGVtcE9wc1xuXHRcdGlmIHJlc3VsdC5sZW5ndGhcblx0XHRcdHBvcy5mb3JFYWNoIChwbyktPlxuXHRcdFx0XHRyZXBlYXRJbmRleCA9IDBcblx0XHRcdFx0cmVwZWF0UG8gPSByZXN1bHQuZmluZCgoaXRlbSwgaW5kZXgpLT4gcmVwZWF0SW5kZXggPSBpbmRleDtyZXR1cm4gaXRlbS5wZXJtaXNzaW9uX3NldF9pZCA9PSBwby5wZXJtaXNzaW9uX3NldF9pZClcblx0XHRcdFx0IyDlpoLmnpx5bWzkuK3lt7Lnu4/lrZjlnKhwb++8jOWImeabv+aNouS4uuaVsOaNruW6k+S4reeahHBv77yM5Y+N5LmL5YiZ5oqK5pWw5o2u5bqT5Lit55qEcG/nm7TmjqXntK/liqDov5vljrtcblx0XHRcdFx0aWYgcmVwZWF0UG9cblx0XHRcdFx0XHRyZXN1bHRbcmVwZWF0SW5kZXhdID0gcG9cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoIHBvXG5cdFx0XHRyZXR1cm4gcmVzdWx0XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHBvc1xuXG5cdENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMgPSAoc3BhY2VJZCwgdXNlcklkLCBvYmplY3RfbmFtZSktPlxuXHRcdHBlcm1pc3Npb25zID0ge31cblx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSwgc3BhY2VJZClcblxuXHRcdGlmIHNwYWNlSWQgaXMgJ2d1ZXN0JyB8fCBvYmplY3RfbmFtZSA9PSBcInVzZXJzXCJcblx0XHRcdHBlcm1pc3Npb25zID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuZ3Vlc3QpIHx8IHt9XG5cdFx0XHRDcmVhdG9yLnByb2Nlc3NQZXJtaXNzaW9ucyBwZXJtaXNzaW9uc1xuXHRcdFx0cmV0dXJuIHBlcm1pc3Npb25zXG5cdFx0cHNldHNBZG1pbiA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNBZG1pbikgb3IgdGhpcy5wc2V0c0FkbWluIHRoZW4gdGhpcy5wc2V0c0FkbWluIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdhZG1pbid9LCB7ZmllbGRzOntfaWQ6MX19KVxuXHRcdHBzZXRzVXNlciA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNVc2VyKSBvciB0aGlzLnBzZXRzVXNlciB0aGVuIHRoaXMucHNldHNVc2VyIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICd1c2VyJ30sIHtmaWVsZHM6e19pZDoxfX0pXG5cdFx0cHNldHNNZW1iZXIgPSBpZiBfLmlzTnVsbCh0aGlzLnBzZXRzTWVtYmVyKSBvciB0aGlzLnBzZXRzTWVtYmVyIHRoZW4gdGhpcy5wc2V0c01lbWJlciBlbHNlIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnbWVtYmVyJ30sIHtmaWVsZHM6e19pZDoxfX0pXG5cdFx0cHNldHNHdWVzdCA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNHdWVzdCkgb3IgdGhpcy5wc2V0c0d1ZXN0IHRoZW4gdGhpcy5wc2V0c0d1ZXN0IGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdndWVzdCd9LCB7ZmllbGRzOntfaWQ6MX19KVxuXG5cdFx0cHNldHNTdXBwbGllciA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNTdXBwbGllcikgb3IgdGhpcy5wc2V0c1N1cHBsaWVyIHRoZW4gdGhpcy5wc2V0c1N1cHBsaWVyIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdzdXBwbGllcid9LCB7ZmllbGRzOntfaWQ6MX19KVxuXHRcdHBzZXRzQ3VzdG9tZXIgPSBpZiBfLmlzTnVsbCh0aGlzLnBzZXRzQ3VzdG9tZXIpIG9yIHRoaXMucHNldHNDdXN0b21lciB0aGVuIHRoaXMucHNldHNDdXN0b21lciBlbHNlIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnY3VzdG9tZXInfSwge2ZpZWxkczp7X2lkOjF9fSlcblx0XHRwc2V0cyA9IHRoaXMucHNldHNDdXJyZW50O1xuXHRcdGlmICFwc2V0c1xuXHRcdFx0c3BhY2VVc2VyID0gbnVsbDtcblx0XHRcdGlmIHVzZXJJZFxuXHRcdFx0XHRzcGFjZVVzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHsgc3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZCB9LCB7IGZpZWxkczogeyBwcm9maWxlOiAxIH0gfSlcblx0XHRcdGlmIHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZVxuXHRcdFx0XHRwc2V0cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe3NwYWNlOiBzcGFjZUlkLCAkb3I6IFt7dXNlcnM6IHVzZXJJZH0sIHtuYW1lOiBzcGFjZVVzZXIucHJvZmlsZX1dfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MSwgbmFtZToxfX0pLmZldGNoKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0cHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHt1c2VyczogdXNlcklkLCBzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjEsIG5hbWU6MX19KS5mZXRjaCgpXG5cdFx0aXNTcGFjZUFkbWluID0gaWYgXy5pc0Jvb2xlYW4odGhpcy5pc1NwYWNlQWRtaW4pIHRoZW4gdGhpcy5pc1NwYWNlQWRtaW4gZWxzZSBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpXG5cblx0XHRwc2V0c0FkbWluX3BvcyA9IHRoaXMucHNldHNBZG1pbl9wb3Ncblx0XHRwc2V0c1VzZXJfcG9zID0gdGhpcy5wc2V0c1VzZXJfcG9zXG5cdFx0cHNldHNNZW1iZXJfcG9zID0gdGhpcy5wc2V0c01lbWJlcl9wb3Ncblx0XHRwc2V0c0d1ZXN0X3BvcyA9IHRoaXMucHNldHNHdWVzdF9wb3NcblxuXHRcdHBzZXRzU3VwcGxpZXJfcG9zID0gdGhpcy5wc2V0c1N1cHBsaWVyX3Bvc1xuXHRcdHBzZXRzQ3VzdG9tZXJfcG9zID0gdGhpcy5wc2V0c0N1c3RvbWVyX3Bvc1xuXG5cdFx0cHNldHNDdXJyZW50X3BvcyA9IHRoaXMucHNldHNDdXJyZW50X3Bvc1xuXG5cdFx0b3BzZXRBZG1pbiA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LmFkbWluKSB8fCB7fVxuXHRcdG9wc2V0VXNlciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LnVzZXIpIHx8IHt9XG5cdFx0b3BzZXRNZW1iZXIgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5tZW1iZXIpIHx8IHt9XG5cdFx0b3BzZXRHdWVzdCA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0Lmd1ZXN0KSB8fCB7fVxuXG5cdFx0b3BzZXRTdXBwbGllciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LnN1cHBsaWVyKSB8fCB7fVxuXHRcdG9wc2V0Q3VzdG9tZXIgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5jdXN0b21lcikgfHwge31cblxuXHRcdCMgc2hhcmVkTGlzdFZpZXdzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdvYmplY3RfbGlzdHZpZXdzJykuZmluZCh7c3BhY2U6IHNwYWNlSWQsIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgc2hhcmVkOiB0cnVlfSwge2ZpZWxkczp7X2lkOjF9fSkuZmV0Y2goKVxuXHRcdCMgc2hhcmVkTGlzdFZpZXdzID0gXy5wbHVjayhzaGFyZWRMaXN0Vmlld3MsXCJfaWRcIilcblx0XHQjIGlmIHNoYXJlZExpc3RWaWV3cy5sZW5ndGhcblx0XHQjIFx0dW5sZXNzIG9wc2V0QWRtaW4ubGlzdF92aWV3c1xuXHRcdCMgXHRcdG9wc2V0QWRtaW4ubGlzdF92aWV3cyA9IFtdXG5cdFx0IyBcdG9wc2V0QWRtaW4ubGlzdF92aWV3cyA9IF8udW5pb24gb3BzZXRBZG1pbi5saXN0X3ZpZXdzLCBzaGFyZWRMaXN0Vmlld3Ncblx0XHQjIFx0dW5sZXNzIG9wc2V0VXNlci5saXN0X3ZpZXdzXG5cdFx0IyBcdFx0b3BzZXRVc2VyLmxpc3Rfdmlld3MgPSBbXVxuXHRcdCMgXHRvcHNldFVzZXIubGlzdF92aWV3cyA9IF8udW5pb24gb3BzZXRVc2VyLmxpc3Rfdmlld3MsIHNoYXJlZExpc3RWaWV3c1xuXHRcdCMg5pWw5o2u5bqT5Lit5aaC5p6c6YWN572u5LqG6buY6K6k55qEYWRtaW4vdXNlcuadg+mZkOmbhuiuvue9ru+8jOW6lOivpeimhuebluS7o+eggeS4rWFkbWluL3VzZXLnmoTmnYPpmZDpm4borr7nva5cblx0XHRpZiBwc2V0c0FkbWluXG5cdFx0XHRwb3NBZG1pbiA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNBZG1pbl9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c0FkbWluLl9pZClcblx0XHRcdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyBvcHNldEFkbWluLCBwb3NBZG1pblxuXHRcdGlmIHBzZXRzVXNlclxuXHRcdFx0cG9zVXNlciA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNVc2VyX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzVXNlci5faWQpXG5cdFx0XHRleHRlbmRQZXJtaXNzaW9uUHJvcHMgb3BzZXRVc2VyLCBwb3NVc2VyXG5cdFx0aWYgcHNldHNNZW1iZXJcblx0XHRcdHBvc01lbWJlciA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNNZW1iZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNNZW1iZXIuX2lkKVxuXHRcdFx0ZXh0ZW5kUGVybWlzc2lvblByb3BzIG9wc2V0TWVtYmVyLCBwb3NNZW1iZXJcblx0XHRpZiBwc2V0c0d1ZXN0XG5cdFx0XHRwb3NHdWVzdCA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNHdWVzdF9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c0d1ZXN0Ll9pZClcblx0XHRcdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyBvcHNldEd1ZXN0LCBwb3NHdWVzdFxuXHRcdGlmIHBzZXRzU3VwcGxpZXJcblx0XHRcdHBvc1N1cHBsaWVyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c1N1cHBsaWVyX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzU3VwcGxpZXIuX2lkKTtcblx0XHRcdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyBvcHNldFN1cHBsaWVyLCBwb3NTdXBwbGllclxuXHRcdGlmIHBzZXRzQ3VzdG9tZXJcblx0XHRcdHBvc0N1c3RvbWVyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0N1c3RvbWVyX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzQ3VzdG9tZXIuX2lkKTtcblx0XHRcdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyBvcHNldEN1c3RvbWVyLCBwb3NDdXN0b21lclxuXG5cdFx0aWYgIXVzZXJJZFxuXHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldEFkbWluXG5cdFx0ZWxzZVxuXHRcdFx0aWYgaXNTcGFjZUFkbWluXG5cdFx0XHRcdHBlcm1pc3Npb25zID0gb3BzZXRBZG1pblxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpZiBzcGFjZUlkIGlzICdjb21tb24nXG5cdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldFVzZXJcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHNwYWNlVXNlciA9IGlmIF8uaXNOdWxsKHRoaXMuc3BhY2VVc2VyKSBvciB0aGlzLnNwYWNlVXNlciB0aGVuIHRoaXMuc3BhY2VVc2VyIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7IHNwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWQgfSwgeyBmaWVsZHM6IHsgcHJvZmlsZTogMSB9IH0pXG5cdFx0XHRcdFx0aWYgc3BhY2VVc2VyXG5cdFx0XHRcdFx0XHRwcm9mID0gc3BhY2VVc2VyLnByb2ZpbGVcblx0XHRcdFx0XHRcdGlmIHByb2Zcblx0XHRcdFx0XHRcdFx0aWYgcHJvZiBpcyAndXNlcidcblx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0VXNlclxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIHByb2YgaXMgJ21lbWJlcidcblx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0TWVtYmVyXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgcHJvZiBpcyAnZ3Vlc3QnXG5cdFx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldEd1ZXN0XG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgcHJvZiBpcyAnc3VwcGxpZXInXG5cdFx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldFN1cHBsaWVyXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgcHJvZiBpcyAnY3VzdG9tZXInXG5cdFx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldEN1c3RvbWVyXG5cdFx0XHRcdFx0XHRlbHNlICMg5rKh5pyJcHJvZmlsZeWImeiupOS4uuaYr3VzZXLmnYPpmZBcblx0XHRcdFx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldFVzZXJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0R3Vlc3Rcblx0XHRpZiBwc2V0cy5sZW5ndGggPiAwXG5cdFx0XHRzZXRfaWRzID0gXy5wbHVjayBwc2V0cywgXCJfaWRcIlxuXHRcdFx0cG9zID0gZmluZF9wZXJtaXNzaW9uX29iamVjdChwc2V0c0N1cnJlbnRfcG9zLCBvYmplY3RfbmFtZSwgc2V0X2lkcylcblx0XHRcdHBvcyA9IHVuaW9uUGVybWlzc2lvbk9iamVjdHMocG9zLCBvYmplY3QsIHBzZXRzKVxuXHRcdFx0Xy5lYWNoIHBvcywgKHBvKS0+XG5cdFx0XHRcdGlmIHBvLnBlcm1pc3Npb25fc2V0X2lkID09IHBzZXRzQWRtaW4/Ll9pZCBvciBcblx0XHRcdFx0cG8ucGVybWlzc2lvbl9zZXRfaWQgPT0gcHNldHNVc2VyPy5faWQgb3IgXG5cdFx0XHRcdHBvLnBlcm1pc3Npb25fc2V0X2lkID09IHBzZXRzTWVtYmVyPy5faWQgb3IgXG5cdFx0XHRcdHBvLnBlcm1pc3Npb25fc2V0X2lkID09IHBzZXRzR3Vlc3Q/Ll9pZCBvclxuXHRcdFx0XHRwby5wZXJtaXNzaW9uX3NldF9pZCA9PSBwc2V0c1N1cHBsaWVyPy5faWQgb3Jcblx0XHRcdFx0cG8ucGVybWlzc2lvbl9zZXRfaWQgPT0gcHNldHNDdXN0b21lcj8uX2lkXG5cdFx0XHRcdFx0IyDpu5jorqTnmoRhZG1pbi91c2Vy5p2D6ZmQ5YC85Y+q5a6e6KGM5LiK6Z2i55qE6buY6K6k5YC86KaG55uW77yM5LiN5YGa566X5rOV5Yik5patXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGlmIF8uaXNFbXB0eShwZXJtaXNzaW9ucylcblx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IHBvXG5cdFx0XHRcdG92ZXJsYXlCYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wcyBwZXJtaXNzaW9ucywgcG9cblxuXHRcdFx0XHRwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzLCBwby5kaXNhYmxlZF9saXN0X3ZpZXdzKVxuXHRcdFx0XHRwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zLCBwby5kaXNhYmxlZF9hY3Rpb25zKVxuXHRcdFx0XHRwZXJtaXNzaW9ucy51bnJlYWRhYmxlX2ZpZWxkcyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5yZWFkYWJsZV9maWVsZHMsIHBvLnVucmVhZGFibGVfZmllbGRzKVxuXHRcdFx0XHRwZXJtaXNzaW9ucy51bmVkaXRhYmxlX2ZpZWxkcyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5lZGl0YWJsZV9maWVsZHMsIHBvLnVuZWRpdGFibGVfZmllbGRzKVxuXHRcdFx0XHRwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0cyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHMsIHBvLnVucmVsYXRlZF9vYmplY3RzKVxuXHRcdFx0XHRwZXJtaXNzaW9ucy51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdCA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QsIHBvLnVuZWRpdGFibGVfcmVsYXRlZF9saXN0KVxuXHRcdFxuXHRcdGlmIG9iamVjdC5pc192aWV3XG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZVxuXHRcdFx0cGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZVxuXHRcdFx0cGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3JkcyA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zID0gW11cblx0XHRDcmVhdG9yLnByb2Nlc3NQZXJtaXNzaW9ucyBwZXJtaXNzaW9uc1xuXG5cdFx0aWYgb2JqZWN0LnBlcm1pc3Npb25fc2V0Lm93bmVyXG5cdFx0XHRwZXJtaXNzaW9ucy5vd25lciA9IG9iamVjdC5wZXJtaXNzaW9uX3NldC5vd25lclxuXHRcdHJldHVybiBwZXJtaXNzaW9uc1xuXG5cblx0IyBDcmVhdG9yLmluaXRQZXJtaXNzaW9ucyA9IChvYmplY3RfbmFtZSkgLT5cblxuXHRcdCMgIyDlupTor6XmiororqHnrpflh7rmnaXnmoRcblx0XHQjIENyZWF0b3IuQ29sbGVjdGlvbnNbb2JqZWN0X25hbWVdLmFsbG93XG5cdFx0IyBcdGluc2VydDogKHVzZXJJZCwgZG9jKSAtPlxuXHRcdCMgXHRcdGlmICF1c2VySWRcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdGlmICFkb2Muc3BhY2Vcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHQgICAgXHQjIFx0XHRwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMoZG9jLnNwYWNlLCB1c2VySWQsIG9iamVjdF9uYW1lKVxuXHRcdCMgXHRcdGlmICFwZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZVxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHQjIFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdCMgXHR1cGRhdGU6ICh1c2VySWQsIGRvYykgLT5cblx0XHQjIFx0XHRpZiAhdXNlcklkXG5cdFx0IyBcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHQjIFx0XHRpZiAhZG9jLnNwYWNlXG5cdFx0IyBcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHQjIFx0XHRwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMoZG9jLnNwYWNlLCB1c2VySWQsIG9iamVjdF9uYW1lKVxuXHRcdCMgXHRcdGlmICFwZXJtaXNzaW9ucy5hbGxvd0VkaXRcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdHJldHVybiB0cnVlXG5cdFx0IyBcdHJlbW92ZTogKHVzZXJJZCwgZG9jKSAtPlxuXHRcdCMgXHRcdGlmICF1c2VySWRcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdGlmICFkb2Muc3BhY2Vcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyhkb2Muc3BhY2UsIHVzZXJJZCwgb2JqZWN0X25hbWUpXG5cdFx0IyBcdFx0aWYgIXBlcm1pc3Npb25zLmFsbG93RGVsZXRlXG5cdFx0IyBcdFx0XHRyZXR1cm4gZmFsc2Vcblx0XHQjIFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdE1ldGVvci5tZXRob2RzXG5cdFx0IyBDYWxjdWxhdGUgUGVybWlzc2lvbnMgb24gU2VydmVyXG5cdFx0XCJjcmVhdG9yLm9iamVjdF9wZXJtaXNzaW9uc1wiOiAoc3BhY2VJZCktPlxuXHRcdFx0cmV0dXJuIENyZWF0b3IuZ2V0QWxsUGVybWlzc2lvbnMoc3BhY2VJZCwgdGhpcy51c2VySWQpXG4iLCJ2YXIgYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzLCBjbG9uZSwgZXh0ZW5kUGVybWlzc2lvblByb3BzLCBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0LCBmaW5kX3Blcm1pc3Npb25fb2JqZWN0LCBpbnRlcnNlY3Rpb25QbHVzLCBvdGhlclBlcm1pc3Npb25Qcm9wTmFtZXMsIG92ZXJsYXlCYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wcywgcGVybWlzc2lvblByb3BOYW1lcywgdW5pb25QZXJtaXNzaW9uT2JqZWN0cywgdW5pb25QbHVzO1xuXG5jbG9uZSA9IHJlcXVpcmUoJ2Nsb25lJyk7XG5cbmJhc2VCb29sZWFuUGVybWlzc2lvblByb3BOYW1lcyA9IFtcImFsbG93Q3JlYXRlXCIsIFwiYWxsb3dEZWxldGVcIiwgXCJhbGxvd0VkaXRcIiwgXCJhbGxvd1JlYWRcIiwgXCJtb2RpZnlBbGxSZWNvcmRzXCIsIFwidmlld0FsbFJlY29yZHNcIiwgXCJtb2RpZnlDb21wYW55UmVjb3Jkc1wiLCBcInZpZXdDb21wYW55UmVjb3Jkc1wiLCBcImFsbG93UmVhZEZpbGVzXCIsIFwiYWxsb3dFZGl0RmlsZXNcIiwgXCJhbGxvd0NyZWF0ZUZpbGVzXCIsIFwiYWxsb3dEZWxldGVGaWxlc1wiLCBcInZpZXdBbGxGaWxlc1wiLCBcIm1vZGlmeUFsbEZpbGVzXCJdO1xuXG5vdGhlclBlcm1pc3Npb25Qcm9wTmFtZXMgPSBbXCJkaXNhYmxlZF9saXN0X3ZpZXdzXCIsIFwiZGlzYWJsZWRfYWN0aW9uc1wiLCBcInVucmVhZGFibGVfZmllbGRzXCIsIFwidW5lZGl0YWJsZV9maWVsZHNcIiwgXCJ1bnJlbGF0ZWRfb2JqZWN0c1wiLCBcInVuZWRpdGFibGVfcmVsYXRlZF9saXN0XCJdO1xuXG5wZXJtaXNzaW9uUHJvcE5hbWVzID0gXy51bmlvbihiYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wTmFtZXMsIG90aGVyUGVybWlzc2lvblByb3BOYW1lcyk7XG5cbkNyZWF0b3IuZ2V0UGVybWlzc2lvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSB7XG4gIHZhciBvYmo7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICBpZiAoIW9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gb2JqLnBlcm1pc3Npb25zLmdldCgpO1xuICB9IGVsc2UgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIHJldHVybiBDcmVhdG9yLmdldE9iamVjdFBlcm1pc3Npb25zKHNwYWNlSWQsIHVzZXJJZCwgb2JqZWN0X25hbWUpO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldFJlY29yZFBlcm1pc3Npb25zID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZCwgdXNlcklkLCBzcGFjZUlkKSB7XG4gIHZhciBpc093bmVyLCBtYXN0ZXJPYmplY3ROYW1lLCBtYXN0ZXJSZWNvcmRQZXJtLCBwZXJtaXNzaW9ucywgcmVjb3JkX2NvbXBhbnlfaWQsIHJlY29yZF9jb21wYW55X2lkcywgcmVmLCB1c2VyX2NvbXBhbnlfaWRzO1xuICBpZiAoIW9iamVjdF9uYW1lICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAoIXNwYWNlSWQgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgc3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcbiAgfVxuICBwZXJtaXNzaW9ucyA9IF8uY2xvbmUoQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSk7XG4gIGlmIChyZWNvcmQpIHtcbiAgICBpZiAoIV8uaXNFbXB0eShyZWNvcmQucmVjb3JkX3Blcm1pc3Npb25zKSkge1xuICAgICAgcmV0dXJuIHJlY29yZC5yZWNvcmRfcGVybWlzc2lvbnM7XG4gICAgfVxuICAgIGlzT3duZXIgPSByZWNvcmQub3duZXIgPT09IHVzZXJJZCB8fCAoKHJlZiA9IHJlY29yZC5vd25lcikgIT0gbnVsbCA/IHJlZi5faWQgOiB2b2lkIDApID09PSB1c2VySWQ7XG4gICAgaWYgKG9iamVjdF9uYW1lID09PSBcImNtc19maWxlc1wiKSB7XG4gICAgICBtYXN0ZXJPYmplY3ROYW1lID0gcmVjb3JkLnBhcmVudFsncmVmZXJlbmNlX3RvLl9vJ107XG4gICAgICBtYXN0ZXJSZWNvcmRQZXJtID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhtYXN0ZXJPYmplY3ROYW1lLCBzcGFjZUlkLCB1c2VySWQpO1xuICAgICAgcGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgPSBwZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93Q3JlYXRlRmlsZXM7XG4gICAgICBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0VkaXRGaWxlcztcbiAgICAgIHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0RlbGV0ZUZpbGVzO1xuICAgICAgaWYgKCFtYXN0ZXJSZWNvcmRQZXJtLm1vZGlmeUFsbEZpbGVzICYmICFpc093bmVyKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlO1xuICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcGVybWlzc2lvbnMuYWxsb3dSZWFkID0gcGVybWlzc2lvbnMuYWxsb3dSZWFkICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dSZWFkRmlsZXM7XG4gICAgICBpZiAoIW1hc3RlclJlY29yZFBlcm0udmlld0FsbEZpbGVzICYmICFpc093bmVyKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHVzZXJfY29tcGFueV9pZHMgPSBTdGVlZG9zLmdldFVzZXJDb21wYW55SWRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyX2NvbXBhbnlfaWRzID0gQ3JlYXRvci5nZXRVc2VyQ29tcGFueUlkcyh1c2VySWQsIHNwYWNlSWQpO1xuICAgICAgfVxuICAgICAgcmVjb3JkX2NvbXBhbnlfaWQgPSByZWNvcmQgIT0gbnVsbCA/IHJlY29yZC5jb21wYW55X2lkIDogdm9pZCAwO1xuICAgICAgaWYgKHJlY29yZF9jb21wYW55X2lkICYmIF8uaXNPYmplY3QocmVjb3JkX2NvbXBhbnlfaWQpICYmIHJlY29yZF9jb21wYW55X2lkLl9pZCkge1xuICAgICAgICByZWNvcmRfY29tcGFueV9pZCA9IHJlY29yZF9jb21wYW55X2lkLl9pZDtcbiAgICAgIH1cbiAgICAgIHJlY29yZF9jb21wYW55X2lkcyA9IHJlY29yZCAhPSBudWxsID8gcmVjb3JkLmNvbXBhbnlfaWRzIDogdm9pZCAwO1xuICAgICAgaWYgKHJlY29yZF9jb21wYW55X2lkcyAmJiByZWNvcmRfY29tcGFueV9pZHMubGVuZ3RoICYmIF8uaXNPYmplY3QocmVjb3JkX2NvbXBhbnlfaWRzWzBdKSkge1xuICAgICAgICByZWNvcmRfY29tcGFueV9pZHMgPSByZWNvcmRfY29tcGFueV9pZHMubWFwKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgICByZXR1cm4gbi5faWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVjb3JkX2NvbXBhbnlfaWRzID0gXy51bmlvbihyZWNvcmRfY29tcGFueV9pZHMsIFtyZWNvcmRfY29tcGFueV9pZF0pO1xuICAgICAgaWYgKCFwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzICYmICFpc093bmVyICYmICFwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3Jkcykge1xuICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZTtcbiAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgJiYgcGVybWlzc2lvbnMubW9kaWZ5Q29tcGFueVJlY29yZHMpIHtcbiAgICAgICAgaWYgKHJlY29yZF9jb21wYW55X2lkcyAmJiByZWNvcmRfY29tcGFueV9pZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHVzZXJfY29tcGFueV9pZHMgJiYgdXNlcl9jb21wYW55X2lkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghXy5pbnRlcnNlY3Rpb24odXNlcl9jb21wYW55X2lkcywgcmVjb3JkX2NvbXBhbnlfaWRzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2U7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlO1xuICAgICAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZWNvcmQubG9ja2VkICYmICFwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlO1xuICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyAmJiAhaXNPd25lciAmJiAhcGVybWlzc2lvbnMudmlld0NvbXBhbnlSZWNvcmRzKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICghcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgJiYgcGVybWlzc2lvbnMudmlld0NvbXBhbnlSZWNvcmRzKSB7XG4gICAgICAgIGlmIChyZWNvcmRfY29tcGFueV9pZHMgJiYgcmVjb3JkX2NvbXBhbnlfaWRzLmxlbmd0aCkge1xuICAgICAgICAgIGlmICh1c2VyX2NvbXBhbnlfaWRzICYmIHVzZXJfY29tcGFueV9pZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIV8uaW50ZXJzZWN0aW9uKHVzZXJfY29tcGFueV9pZHMsIHJlY29yZF9jb21wYW55X2lkcykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBlcm1pc3Npb25zO1xufTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBDcmVhdG9yLmdldFJlY29yZFJlbGF0ZWRMaXN0UGVybWlzc2lvbnMgPSBmdW5jdGlvbihjdXJyZW50T2JqZWN0TmFtZSwgcmVsYXRlZExpc3RJdGVtLCBjdXJyZW50UmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpIHtcbiAgICB2YXIgaXNSZWxhdGVPYmplY3RVbmVkaXRhYmxlLCBtYXN0ZXJBbGxvdywgbWFzdGVyUmVjb3JkUGVybSwgcmVsYXRlZE9iamVjdFBlcm1pc3Npb25zLCByZXN1bHQsIHVuZWRpdGFibGVfcmVsYXRlZF9saXN0LCB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZDtcbiAgICBpZiAoIWN1cnJlbnRPYmplY3ROYW1lICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgY3VycmVudE9iamVjdE5hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0ZWRMaXN0SXRlbSkge1xuICAgICAgY29uc29sZS5lcnJvcihcInJlbGF0ZWRMaXN0SXRlbSBtdXN0IG5vdCBiZSBlbXB0eSBmb3IgdGhlIGZ1bmN0aW9uIENyZWF0b3IuZ2V0UmVjb3JkUmVsYXRlZExpc3RQZXJtaXNzaW9uc1wiKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50UmVjb3JkICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgY3VycmVudFJlY29yZCA9IENyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkKCk7XG4gICAgfVxuICAgIGlmICghdXNlcklkICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIH1cbiAgICBpZiAoIXNwYWNlSWQgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIH1cbiAgICBtYXN0ZXJSZWNvcmRQZXJtID0gQ3JlYXRvci5nZXRSZWNvcmRQZXJtaXNzaW9ucyhjdXJyZW50T2JqZWN0TmFtZSwgY3VycmVudFJlY29yZCwgdXNlcklkLCBzcGFjZUlkKTtcbiAgICByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRMaXN0SXRlbS5vYmplY3RfbmFtZSk7XG4gICAgcmVzdWx0ID0gXy5jbG9uZShyZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMpO1xuICAgIGlmIChyZWxhdGVkTGlzdEl0ZW0uaXNfZmlsZSkge1xuICAgICAgcmVzdWx0LmFsbG93Q3JlYXRlID0gcmVsYXRlZE9iamVjdFBlcm1pc3Npb25zLmFsbG93Q3JlYXRlICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dDcmVhdGVGaWxlcztcbiAgICAgIHJlc3VsdC5hbGxvd0VkaXQgPSByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dFZGl0ICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dFZGl0RmlsZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID0gcmVsYXRlZExpc3RJdGVtLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkIHx8IGZhbHNlO1xuICAgICAgbWFzdGVyQWxsb3cgPSBmYWxzZTtcbiAgICAgIGlmICh3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9PT0gdHJ1ZSkge1xuICAgICAgICBtYXN0ZXJBbGxvdyA9IG1hc3RlclJlY29yZFBlcm0uYWxsb3dSZWFkO1xuICAgICAgfSBlbHNlIGlmICh3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWFzdGVyQWxsb3cgPSBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RWRpdDtcbiAgICAgIH1cbiAgICAgIHVuZWRpdGFibGVfcmVsYXRlZF9saXN0ID0gQ3JlYXRvci5nZXRSZWNvcmRTYWZlUmVsYXRlZExpc3QoY3VycmVudFJlY29yZCwgY3VycmVudE9iamVjdE5hbWUpO1xuICAgICAgaXNSZWxhdGVPYmplY3RVbmVkaXRhYmxlID0gdW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QuaW5kZXhPZihyZWxhdGVkTGlzdEl0ZW0ub2JqZWN0X25hbWUpID4gLTE7XG4gICAgICByZXN1bHQuYWxsb3dDcmVhdGUgPSBtYXN0ZXJBbGxvdyAmJiByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgJiYgIWlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZTtcbiAgICAgIHJlc3VsdC5hbGxvd0VkaXQgPSBtYXN0ZXJBbGxvdyAmJiByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dFZGl0ICYmICFpc1JlbGF0ZU9iamVjdFVuZWRpdGFibGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgQ3JlYXRvci5nZXRBbGxQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCkge1xuICAgIHZhciBfaSwgaXNTcGFjZUFkbWluLCBwZXJtaXNzaW9ucywgcHNldHMsIHBzZXRzQWRtaW4sIHBzZXRzQWRtaW5fcG9zLCBwc2V0c0N1cnJlbnQsIHBzZXRzQ3VycmVudE5hbWVzLCBwc2V0c0N1cnJlbnRfcG9zLCBwc2V0c0N1c3RvbWVyLCBwc2V0c0N1c3RvbWVyX3BvcywgcHNldHNHdWVzdCwgcHNldHNHdWVzdF9wb3MsIHBzZXRzTWVtYmVyLCBwc2V0c01lbWJlcl9wb3MsIHBzZXRzU3VwcGxpZXIsIHBzZXRzU3VwcGxpZXJfcG9zLCBwc2V0c1VzZXIsIHBzZXRzVXNlcl9wb3MsIHNldF9pZHMsIHNwYWNlVXNlcjtcbiAgICBwZXJtaXNzaW9ucyA9IHtcbiAgICAgIG9iamVjdHM6IHt9LFxuICAgICAgYXNzaWduZWRfYXBwczogW11cbiAgICB9O1xuXG4gICAgLypcbiAgICBcdFx05p2D6ZmQ6ZuG6K+05piOOlxuICAgIFx0XHTlhoXnva7mnYPpmZDpm4YtYWRtaW4sdXNlcixtZW1iZXIsZ3Vlc3Qsd29ya2Zsb3dfYWRtaW4sb3JnYW5pemF0aW9uX2FkbWluXG4gICAgXHRcdOiHquWumuS5ieadg+mZkOmbhi3mlbDmja7lupPkuK3mlrDlu7rnmoTpmaTlhoXnva7mnYPpmZDpm4bku6XlpJbnmoTlhbbku5bmnYPpmZDpm4ZcbiAgICBcdFx054m55a6a55So5oi36ZuG5ZCI5p2D6ZmQ6ZuG77yI5Y2zdXNlcnPlsZ7mgKfkuI3lj6/phY3nva7vvIktYWRtaW4sdXNlcixtZW1iZXIsZ3Vlc3RcbiAgICBcdFx05Y+v6YWN572u55So5oi36ZuG5ZCI5p2D6ZmQ6ZuG77yI5Y2zdXNlcnPlsZ7mgKflj6/phY3nva7vvIktd29ya2Zsb3dfYWRtaW4sb3JnYW5pemF0aW9uX2FkbWlu5Lul5Y+K6Ieq5a6a5LmJ5p2D6ZmQ6ZuGXG4gICAgICovXG4gICAgaXNTcGFjZUFkbWluID0gZmFsc2U7XG4gICAgc3BhY2VVc2VyID0gbnVsbDtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBpc1NwYWNlQWRtaW4gPSBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpO1xuICAgICAgc3BhY2VVc2VyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICB1c2VyOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgcHJvZmlsZTogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcHNldHNBZG1pbiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnYWRtaW4nXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgcHNldHNVc2VyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICd1c2VyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIGFzc2lnbmVkX2FwcHM6IDFcbiAgICAgIH1cbiAgICB9KSB8fCBudWxsO1xuICAgIHBzZXRzTWVtYmVyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdtZW1iZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgcHNldHNHdWVzdCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnZ3Vlc3QnXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgcHNldHNTdXBwbGllciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnc3VwcGxpZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgcHNldHNDdXN0b21lciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnY3VzdG9tZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgaWYgKHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZSkge1xuICAgICAgcHNldHNDdXJyZW50ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAkb3I6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VyczogdXNlcklkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgbmFtZTogc3BhY2VVc2VyLnByb2ZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgIGFzc2lnbmVkX2FwcHM6IDEsXG4gICAgICAgICAgbmFtZTogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwc2V0c0N1cnJlbnQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgICAgdXNlcnM6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgIGFzc2lnbmVkX2FwcHM6IDEsXG4gICAgICAgICAgbmFtZTogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBwc2V0c0FkbWluX3BvcyA9IG51bGw7XG4gICAgcHNldHNVc2VyX3BvcyA9IG51bGw7XG4gICAgcHNldHNNZW1iZXJfcG9zID0gbnVsbDtcbiAgICBwc2V0c0d1ZXN0X3BvcyA9IG51bGw7XG4gICAgcHNldHNDdXJyZW50X3BvcyA9IG51bGw7XG4gICAgcHNldHNTdXBwbGllcl9wb3MgPSBudWxsO1xuICAgIHBzZXRzQ3VzdG9tZXJfcG9zID0gbnVsbDtcbiAgICBpZiAocHNldHNBZG1pbiAhPSBudWxsID8gcHNldHNBZG1pbi5faWQgOiB2b2lkIDApIHtcbiAgICAgIHBzZXRzQWRtaW5fcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgICBwZXJtaXNzaW9uX3NldF9pZDogcHNldHNBZG1pbi5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgICBtb2RpZmllZDogMCxcbiAgICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIGlmIChwc2V0c1VzZXIgIT0gbnVsbCA/IHBzZXRzVXNlci5faWQgOiB2b2lkIDApIHtcbiAgICAgIHBzZXRzVXNlcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiBwc2V0c1VzZXIuX2lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgICAgbW9kaWZpZWQ6IDAsXG4gICAgICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgICAgICBtb2RpZmllZF9ieTogMFxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBpZiAocHNldHNNZW1iZXIgIT0gbnVsbCA/IHBzZXRzTWVtYmVyLl9pZCA6IHZvaWQgMCkge1xuICAgICAgcHNldHNNZW1iZXJfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgICBwZXJtaXNzaW9uX3NldF9pZDogcHNldHNNZW1iZXIuX2lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgICAgbW9kaWZpZWQ6IDAsXG4gICAgICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgICAgICBtb2RpZmllZF9ieTogMFxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBpZiAocHNldHNHdWVzdCAhPSBudWxsID8gcHNldHNHdWVzdC5faWQgOiB2b2lkIDApIHtcbiAgICAgIHBzZXRzR3Vlc3RfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgICBwZXJtaXNzaW9uX3NldF9pZDogcHNldHNHdWVzdC5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgICBtb2RpZmllZDogMCxcbiAgICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIGlmIChwc2V0c1N1cHBsaWVyICE9IG51bGwgPyBwc2V0c1N1cHBsaWVyLl9pZCA6IHZvaWQgMCkge1xuICAgICAgcHNldHNTdXBwbGllcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiBwc2V0c1N1cHBsaWVyLl9pZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBjcmVhdGVkOiAwLFxuICAgICAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzQ3VzdG9tZXIgIT0gbnVsbCA/IHBzZXRzQ3VzdG9tZXIuX2lkIDogdm9pZCAwKSB7XG4gICAgICBwc2V0c0N1c3RvbWVyX3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtcbiAgICAgICAgcGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzQ3VzdG9tZXIuX2lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgICAgbW9kaWZpZWQ6IDAsXG4gICAgICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgICAgICBtb2RpZmllZF9ieTogMFxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBpZiAocHNldHNDdXJyZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNldF9pZHMgPSBfLnBsdWNrKHBzZXRzQ3VycmVudCwgXCJfaWRcIik7XG4gICAgICBwc2V0c0N1cnJlbnRfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgICBwZXJtaXNzaW9uX3NldF9pZDoge1xuICAgICAgICAgICRpbjogc2V0X2lkc1xuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgICAgcHNldHNDdXJyZW50TmFtZXMgPSBfLnBsdWNrKHBzZXRzQ3VycmVudCwgXCJuYW1lXCIpO1xuICAgIH1cbiAgICBwc2V0cyA9IHtcbiAgICAgIHBzZXRzQWRtaW46IHBzZXRzQWRtaW4sXG4gICAgICBwc2V0c1VzZXI6IHBzZXRzVXNlcixcbiAgICAgIHBzZXRzQ3VycmVudDogcHNldHNDdXJyZW50LFxuICAgICAgcHNldHNNZW1iZXI6IHBzZXRzTWVtYmVyLFxuICAgICAgcHNldHNHdWVzdDogcHNldHNHdWVzdCxcbiAgICAgIHBzZXRzU3VwcGxpZXI6IHBzZXRzU3VwcGxpZXIsXG4gICAgICBwc2V0c0N1c3RvbWVyOiBwc2V0c0N1c3RvbWVyLFxuICAgICAgaXNTcGFjZUFkbWluOiBpc1NwYWNlQWRtaW4sXG4gICAgICBzcGFjZVVzZXI6IHNwYWNlVXNlcixcbiAgICAgIHBzZXRzQWRtaW5fcG9zOiBwc2V0c0FkbWluX3BvcyxcbiAgICAgIHBzZXRzVXNlcl9wb3M6IHBzZXRzVXNlcl9wb3MsXG4gICAgICBwc2V0c01lbWJlcl9wb3M6IHBzZXRzTWVtYmVyX3BvcyxcbiAgICAgIHBzZXRzR3Vlc3RfcG9zOiBwc2V0c0d1ZXN0X3BvcyxcbiAgICAgIHBzZXRzU3VwcGxpZXJfcG9zOiBwc2V0c1N1cHBsaWVyX3BvcyxcbiAgICAgIHBzZXRzQ3VzdG9tZXJfcG9zOiBwc2V0c0N1c3RvbWVyX3BvcyxcbiAgICAgIHBzZXRzQ3VycmVudF9wb3M6IHBzZXRzQ3VycmVudF9wb3NcbiAgICB9O1xuICAgIHBlcm1pc3Npb25zLmFzc2lnbmVkX2FwcHMgPSBDcmVhdG9yLmdldEFzc2lnbmVkQXBwcy5iaW5kKHBzZXRzKShzcGFjZUlkLCB1c2VySWQpO1xuICAgIHBlcm1pc3Npb25zLmFzc2lnbmVkX21lbnVzID0gQ3JlYXRvci5nZXRBc3NpZ25lZE1lbnVzLmJpbmQocHNldHMpKHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgcGVybWlzc2lvbnMudXNlcl9wZXJtaXNzaW9uX3NldHMgPSBwc2V0c0N1cnJlbnROYW1lcztcbiAgICBfaSA9IDA7XG4gICAgXy5lYWNoKENyZWF0b3Iub2JqZWN0c0J5TmFtZSwgZnVuY3Rpb24ob2JqZWN0LCBvYmplY3RfbmFtZSkge1xuICAgICAgX2krKztcbiAgICAgIGlmICghXy5oYXMob2JqZWN0LCAnc3BhY2UnKSB8fCAhb2JqZWN0LnNwYWNlIHx8IG9iamVjdC5zcGFjZSA9PT0gc3BhY2VJZCkge1xuICAgICAgICBpZiAoIV8uaGFzKG9iamVjdCwgJ2luX2RldmVsb3BtZW50JykgfHwgb2JqZWN0LmluX2RldmVsb3BtZW50ID09PSAnMCcgfHwgKG9iamVjdC5pbl9kZXZlbG9wbWVudCAhPT0gJzAnICYmIGlzU3BhY2VBZG1pbikpIHtcbiAgICAgICAgICBwZXJtaXNzaW9ucy5vYmplY3RzW29iamVjdF9uYW1lXSA9IENyZWF0b3IuY29udmVydE9iamVjdChjbG9uZShDcmVhdG9yLk9iamVjdHNbb2JqZWN0X25hbWVdKSwgc3BhY2VJZCk7XG4gICAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLm9iamVjdHNbb2JqZWN0X25hbWVdW1wicGVybWlzc2lvbnNcIl0gPSBDcmVhdG9yLmdldE9iamVjdFBlcm1pc3Npb25zLmJpbmQocHNldHMpKHNwYWNlSWQsIHVzZXJJZCwgb2JqZWN0X25hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9O1xuICB1bmlvblBsdXMgPSBmdW5jdGlvbihhcnJheSwgb3RoZXIpIHtcbiAgICBpZiAoIWFycmF5ICYmICFvdGhlcikge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKCFhcnJheSkge1xuICAgICAgYXJyYXkgPSBbXTtcbiAgICB9XG4gICAgaWYgKCFvdGhlcikge1xuICAgICAgb3RoZXIgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIF8udW5pb24oYXJyYXksIG90aGVyKTtcbiAgfTtcbiAgaW50ZXJzZWN0aW9uUGx1cyA9IGZ1bmN0aW9uKGFycmF5LCBvdGhlcikge1xuICAgIGlmICghYXJyYXkgJiYgIW90aGVyKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIWFycmF5KSB7XG4gICAgICBhcnJheSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIW90aGVyKSB7XG4gICAgICBvdGhlciA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gXy5pbnRlcnNlY3Rpb24oYXJyYXksIG90aGVyKTtcbiAgfTtcbiAgZXh0ZW5kUGVybWlzc2lvblByb3BzID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wcykge1xuICAgIHZhciBmaWxlc1Byb05hbWVzLCBwcm9wTmFtZXM7XG4gICAgcHJvcE5hbWVzID0gcGVybWlzc2lvblByb3BOYW1lcztcbiAgICByZXR1cm4gZmlsZXNQcm9OYW1lcyA9IHByb3BzID8gXy5lYWNoKHByb3BOYW1lcywgZnVuY3Rpb24ocHJvcE5hbWUpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcE5hbWVdID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIH0pIDogdm9pZCAwO1xuICB9O1xuICBvdmVybGF5QmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcHMgPSBmdW5jdGlvbih0YXJnZXQsIHByb3BzKSB7XG4gICAgdmFyIHByb3BOYW1lcztcbiAgICBwcm9wTmFtZXMgPSBiYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wTmFtZXM7XG4gICAgcmV0dXJuIF8uZWFjaChwcm9wTmFtZXMsIGZ1bmN0aW9uKHByb3BOYW1lKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRbcHJvcE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgQ3JlYXRvci5nZXRBc3NpZ25lZEFwcHMgPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQpIHtcbiAgICB2YXIgYXBwcywgaXNTcGFjZUFkbWluLCBwc2V0QmFzZSwgcHNldHMsIHBzZXRzQWRtaW4sIHBzZXRzQ3VzdG9tZXIsIHBzZXRzU3VwcGxpZXIsIHBzZXRzVXNlciwgcmVmLCByZWYxLCBzcGFjZVVzZXIsIHVzZXJQcm9maWxlO1xuICAgIHBzZXRzQWRtaW4gPSB0aGlzLnBzZXRzQWRtaW4gfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdhZG1pbidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgcHNldHNVc2VyID0gdGhpcy5wc2V0c1VzZXIgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICd1c2VyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIGFzc2lnbmVkX2FwcHM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c1N1cHBsaWVyID0gdGhpcy5wc2V0c01lbWJlciB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ3N1cHBsaWVyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIGFzc2lnbmVkX2FwcHM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c0N1c3RvbWVyID0gdGhpcy5wc2V0c0d1ZXN0IHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnY3VzdG9tZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHNwYWNlVXNlciA9IG51bGw7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgc3BhY2VVc2VyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICB1c2VyOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgcHJvZmlsZTogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZSkge1xuICAgICAgcHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXJzOiB1c2VySWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBzcGFjZVVzZXIucHJvZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgYXNzaWduZWRfYXBwczogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBzZXRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7XG4gICAgICAgIHVzZXJzOiB1c2VySWQsXG4gICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMSxcbiAgICAgICAgICBhc3NpZ25lZF9hcHBzOiAxLFxuICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gICAgaXNTcGFjZUFkbWluID0gXy5pc0Jvb2xlYW4odGhpcy5pc1NwYWNlQWRtaW4pID8gdGhpcy5pc1NwYWNlQWRtaW4gOiBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpO1xuICAgIGFwcHMgPSBbXTtcbiAgICBpZiAoaXNTcGFjZUFkbWluKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJQcm9maWxlID0gKHJlZiA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoe1xuICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgdXNlcjogdXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHByb2ZpbGU6IDFcbiAgICAgICAgfVxuICAgICAgfSkpICE9IG51bGwgPyByZWYucHJvZmlsZSA6IHZvaWQgMDtcbiAgICAgIHBzZXRCYXNlID0gcHNldHNVc2VyO1xuICAgICAgaWYgKHVzZXJQcm9maWxlKSB7XG4gICAgICAgIGlmICh1c2VyUHJvZmlsZSA9PT0gJ3N1cHBsaWVyJykge1xuICAgICAgICAgIHBzZXRCYXNlID0gcHNldHNTdXBwbGllcjtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyUHJvZmlsZSA9PT0gJ2N1c3RvbWVyJykge1xuICAgICAgICAgIHBzZXRCYXNlID0gcHNldHNDdXN0b21lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBzZXRCYXNlICE9IG51bGwgPyAocmVmMSA9IHBzZXRCYXNlLmFzc2lnbmVkX2FwcHMpICE9IG51bGwgPyByZWYxLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkge1xuICAgICAgICBhcHBzID0gXy51bmlvbihhcHBzLCBwc2V0QmFzZS5hc3NpZ25lZF9hcHBzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIF8uZWFjaChwc2V0cywgZnVuY3Rpb24ocHNldCkge1xuICAgICAgICBpZiAoIXBzZXQuYXNzaWduZWRfYXBwcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHNldC5uYW1lID09PSBcImFkbWluXCIgfHwgcHNldC5uYW1lID09PSBcInVzZXJcIiB8fCBwc2V0Lm5hbWUgPT09ICdzdXBwbGllcicgfHwgcHNldC5uYW1lID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBzID0gXy51bmlvbihhcHBzLCBwc2V0LmFzc2lnbmVkX2FwcHMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gXy53aXRob3V0KF8udW5pcShhcHBzKSwgdm9pZCAwLCBudWxsKTtcbiAgICB9XG4gIH07XG4gIENyZWF0b3IuZ2V0QXNzaWduZWRNZW51cyA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCkge1xuICAgIHZhciBhYm91dE1lbnUsIGFkbWluTWVudXMsIGFsbE1lbnVzLCBjdXJyZW50UHNldE5hbWVzLCBpc1NwYWNlQWRtaW4sIG1lbnVzLCBvdGhlck1lbnVBcHBzLCBvdGhlck1lbnVzLCBwc2V0cywgcmVmLCByZWYxLCByZXN1bHQsIHVzZXJQcm9maWxlO1xuICAgIHBzZXRzID0gdGhpcy5wc2V0c0N1cnJlbnQgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7XG4gICAgICB1c2VyczogdXNlcklkLFxuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxLFxuICAgICAgICBuYW1lOiAxXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICBpc1NwYWNlQWRtaW4gPSBfLmlzQm9vbGVhbih0aGlzLmlzU3BhY2VBZG1pbikgPyB0aGlzLmlzU3BhY2VBZG1pbiA6IENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgYWRtaW5NZW51cyA9IChyZWYgPSBDcmVhdG9yLkFwcHMuYWRtaW4pICE9IG51bGwgPyByZWYuYWRtaW5fbWVudXMgOiB2b2lkIDA7XG4gICAgaWYgKCFhZG1pbk1lbnVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGFib3V0TWVudSA9IGFkbWluTWVudXMuZmluZChmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gbi5faWQgPT09ICdhYm91dCc7XG4gICAgfSk7XG4gICAgYWRtaW5NZW51cyA9IGFkbWluTWVudXMuZmlsdGVyKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHJldHVybiBuLl9pZCAhPT0gJ2Fib3V0JztcbiAgICB9KTtcbiAgICBvdGhlck1lbnVBcHBzID0gXy5zb3J0QnkoXy5maWx0ZXIoXy52YWx1ZXMoQ3JlYXRvci5BcHBzKSwgZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIG4uYWRtaW5fbWVudXMgJiYgbi5faWQgIT09ICdhZG1pbic7XG4gICAgfSksICdzb3J0Jyk7XG4gICAgb3RoZXJNZW51cyA9IF8uZmxhdHRlbihfLnBsdWNrKG90aGVyTWVudUFwcHMsIFwiYWRtaW5fbWVudXNcIikpO1xuICAgIGFsbE1lbnVzID0gXy51bmlvbihhZG1pbk1lbnVzLCBvdGhlck1lbnVzLCBbYWJvdXRNZW51XSk7XG4gICAgaWYgKGlzU3BhY2VBZG1pbikge1xuICAgICAgcmVzdWx0ID0gYWxsTWVudXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJQcm9maWxlID0gKChyZWYxID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICB1c2VyOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgcHJvZmlsZTogMVxuICAgICAgICB9XG4gICAgICB9KSkgIT0gbnVsbCA/IHJlZjEucHJvZmlsZSA6IHZvaWQgMCkgfHwgJ3VzZXInO1xuICAgICAgY3VycmVudFBzZXROYW1lcyA9IHBzZXRzLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiBuLm5hbWU7XG4gICAgICB9KTtcbiAgICAgIG1lbnVzID0gYWxsTWVudXMuZmlsdGVyKGZ1bmN0aW9uKG1lbnUpIHtcbiAgICAgICAgdmFyIHBzZXRzTWVudTtcbiAgICAgICAgcHNldHNNZW51ID0gbWVudS5wZXJtaXNzaW9uX3NldHM7XG4gICAgICAgIGlmIChwc2V0c01lbnUgJiYgcHNldHNNZW51LmluZGV4T2YodXNlclByb2ZpbGUpID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXy5pbnRlcnNlY3Rpb24oY3VycmVudFBzZXROYW1lcywgcHNldHNNZW51KS5sZW5ndGg7XG4gICAgICB9KTtcbiAgICAgIHJlc3VsdCA9IG1lbnVzO1xuICAgIH1cbiAgICByZXR1cm4gXy5zb3J0QnkocmVzdWx0LCBcInNvcnRcIik7XG4gIH07XG4gIGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QgPSBmdW5jdGlvbihwZXJtaXNzaW9uX29iamVjdHMsIG9iamVjdF9uYW1lLCBwZXJtaXNzaW9uX3NldF9pZCkge1xuICAgIGlmIChfLmlzTnVsbChwZXJtaXNzaW9uX29iamVjdHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheShwZXJtaXNzaW9uX29iamVjdHMpKSB7XG4gICAgICByZXR1cm4gXy5maW5kKHBlcm1pc3Npb25fb2JqZWN0cywgZnVuY3Rpb24ocG8pIHtcbiAgICAgICAgcmV0dXJuIHBvLm9iamVjdF9uYW1lID09PSBvYmplY3RfbmFtZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmRPbmUoe1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgcGVybWlzc2lvbl9zZXRfaWQ6IHBlcm1pc3Npb25fc2V0X2lkXG4gICAgfSk7XG4gIH07XG4gIGZpbmRfcGVybWlzc2lvbl9vYmplY3QgPSBmdW5jdGlvbihwZXJtaXNzaW9uX29iamVjdHMsIG9iamVjdF9uYW1lLCBwZXJtaXNzaW9uX3NldF9pZHMpIHtcbiAgICBpZiAoXy5pc051bGwocGVybWlzc2lvbl9vYmplY3RzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChfLmlzQXJyYXkocGVybWlzc2lvbl9vYmplY3RzKSkge1xuICAgICAgcmV0dXJuIF8uZmlsdGVyKHBlcm1pc3Npb25fb2JqZWN0cywgZnVuY3Rpb24ocG8pIHtcbiAgICAgICAgcmV0dXJuIHBvLm9iamVjdF9uYW1lID09PSBvYmplY3RfbmFtZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgcGVybWlzc2lvbl9zZXRfaWQ6IHtcbiAgICAgICAgJGluOiBwZXJtaXNzaW9uX3NldF9pZHNcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICB9O1xuICB1bmlvblBlcm1pc3Npb25PYmplY3RzID0gZnVuY3Rpb24ocG9zLCBvYmplY3QsIHBzZXRzKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBfLmVhY2gob2JqZWN0LnBlcm1pc3Npb25fc2V0LCBmdW5jdGlvbihvcHMsIG9wc19rZXkpIHtcbiAgICAgIHZhciBjdXJyZW50UHNldCwgdGVtcE9wcztcbiAgICAgIGlmIChbXCJhZG1pblwiLCBcInVzZXJcIiwgXCJtZW1iZXJcIiwgXCJndWVzdFwiXS5pbmRleE9mKG9wc19rZXkpIDwgMCkge1xuICAgICAgICBjdXJyZW50UHNldCA9IHBzZXRzLmZpbmQoZnVuY3Rpb24ocHNldCkge1xuICAgICAgICAgIHJldHVybiBwc2V0Lm5hbWUgPT09IG9wc19rZXk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3VycmVudFBzZXQpIHtcbiAgICAgICAgICB0ZW1wT3BzID0gXy5jbG9uZShvcHMpIHx8IHt9O1xuICAgICAgICAgIHRlbXBPcHMucGVybWlzc2lvbl9zZXRfaWQgPSBjdXJyZW50UHNldC5faWQ7XG4gICAgICAgICAgdGVtcE9wcy5vYmplY3RfbmFtZSA9IG9iamVjdC5vYmplY3RfbmFtZTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnB1c2godGVtcE9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcG9zLmZvckVhY2goZnVuY3Rpb24ocG8pIHtcbiAgICAgICAgdmFyIHJlcGVhdEluZGV4LCByZXBlYXRQbztcbiAgICAgICAgcmVwZWF0SW5kZXggPSAwO1xuICAgICAgICByZXBlYXRQbyA9IHJlc3VsdC5maW5kKGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgcmVwZWF0SW5kZXggPSBpbmRleDtcbiAgICAgICAgICByZXR1cm4gaXRlbS5wZXJtaXNzaW9uX3NldF9pZCA9PT0gcG8ucGVybWlzc2lvbl9zZXRfaWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVwZWF0UG8pIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0W3JlcGVhdEluZGV4XSA9IHBvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHQucHVzaChwbyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gIH07XG4gIENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMgPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQsIG9iamVjdF9uYW1lKSB7XG4gICAgdmFyIGlzU3BhY2VBZG1pbiwgb2JqZWN0LCBvcHNldEFkbWluLCBvcHNldEN1c3RvbWVyLCBvcHNldEd1ZXN0LCBvcHNldE1lbWJlciwgb3BzZXRTdXBwbGllciwgb3BzZXRVc2VyLCBwZXJtaXNzaW9ucywgcG9zLCBwb3NBZG1pbiwgcG9zQ3VzdG9tZXIsIHBvc0d1ZXN0LCBwb3NNZW1iZXIsIHBvc1N1cHBsaWVyLCBwb3NVc2VyLCBwcm9mLCBwc2V0cywgcHNldHNBZG1pbiwgcHNldHNBZG1pbl9wb3MsIHBzZXRzQ3VycmVudF9wb3MsIHBzZXRzQ3VzdG9tZXIsIHBzZXRzQ3VzdG9tZXJfcG9zLCBwc2V0c0d1ZXN0LCBwc2V0c0d1ZXN0X3BvcywgcHNldHNNZW1iZXIsIHBzZXRzTWVtYmVyX3BvcywgcHNldHNTdXBwbGllciwgcHNldHNTdXBwbGllcl9wb3MsIHBzZXRzVXNlciwgcHNldHNVc2VyX3Bvcywgc2V0X2lkcywgc3BhY2VVc2VyO1xuICAgIHBlcm1pc3Npb25zID0ge307XG4gICAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUsIHNwYWNlSWQpO1xuICAgIGlmIChzcGFjZUlkID09PSAnZ3Vlc3QnIHx8IG9iamVjdF9uYW1lID09PSBcInVzZXJzXCIpIHtcbiAgICAgIHBlcm1pc3Npb25zID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuZ3Vlc3QpIHx8IHt9O1xuICAgICAgQ3JlYXRvci5wcm9jZXNzUGVybWlzc2lvbnMocGVybWlzc2lvbnMpO1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICAgIH1cbiAgICBwc2V0c0FkbWluID0gXy5pc051bGwodGhpcy5wc2V0c0FkbWluKSB8fCB0aGlzLnBzZXRzQWRtaW4gPyB0aGlzLnBzZXRzQWRtaW4gOiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ2FkbWluJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c1VzZXIgPSBfLmlzTnVsbCh0aGlzLnBzZXRzVXNlcikgfHwgdGhpcy5wc2V0c1VzZXIgPyB0aGlzLnBzZXRzVXNlciA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAndXNlcidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgcHNldHNNZW1iZXIgPSBfLmlzTnVsbCh0aGlzLnBzZXRzTWVtYmVyKSB8fCB0aGlzLnBzZXRzTWVtYmVyID8gdGhpcy5wc2V0c01lbWJlciA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnbWVtYmVyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c0d1ZXN0ID0gXy5pc051bGwodGhpcy5wc2V0c0d1ZXN0KSB8fCB0aGlzLnBzZXRzR3Vlc3QgPyB0aGlzLnBzZXRzR3Vlc3QgOiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ2d1ZXN0J1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c1N1cHBsaWVyID0gXy5pc051bGwodGhpcy5wc2V0c1N1cHBsaWVyKSB8fCB0aGlzLnBzZXRzU3VwcGxpZXIgPyB0aGlzLnBzZXRzU3VwcGxpZXIgOiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ3N1cHBsaWVyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c0N1c3RvbWVyID0gXy5pc051bGwodGhpcy5wc2V0c0N1c3RvbWVyKSB8fCB0aGlzLnBzZXRzQ3VzdG9tZXIgPyB0aGlzLnBzZXRzQ3VzdG9tZXIgOiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ2N1c3RvbWVyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0cyA9IHRoaXMucHNldHNDdXJyZW50O1xuICAgIGlmICghcHNldHMpIHtcbiAgICAgIHNwYWNlVXNlciA9IG51bGw7XG4gICAgICBpZiAodXNlcklkKSB7XG4gICAgICAgIHNwYWNlVXNlciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoe1xuICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgIHVzZXI6IHVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBwcm9maWxlOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzcGFjZVVzZXIgJiYgc3BhY2VVc2VyLnByb2ZpbGUpIHtcbiAgICAgICAgcHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXNlcnM6IHVzZXJJZFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBuYW1lOiBzcGFjZVVzZXIucHJvZmlsZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgYXNzaWduZWRfYXBwczogMSxcbiAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZldGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwc2V0cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe1xuICAgICAgICAgIHVzZXJzOiB1c2VySWQsXG4gICAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgICAgYXNzaWduZWRfYXBwczogMSxcbiAgICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZldGNoKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzU3BhY2VBZG1pbiA9IF8uaXNCb29sZWFuKHRoaXMuaXNTcGFjZUFkbWluKSA/IHRoaXMuaXNTcGFjZUFkbWluIDogQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcklkKTtcbiAgICBwc2V0c0FkbWluX3BvcyA9IHRoaXMucHNldHNBZG1pbl9wb3M7XG4gICAgcHNldHNVc2VyX3BvcyA9IHRoaXMucHNldHNVc2VyX3BvcztcbiAgICBwc2V0c01lbWJlcl9wb3MgPSB0aGlzLnBzZXRzTWVtYmVyX3BvcztcbiAgICBwc2V0c0d1ZXN0X3BvcyA9IHRoaXMucHNldHNHdWVzdF9wb3M7XG4gICAgcHNldHNTdXBwbGllcl9wb3MgPSB0aGlzLnBzZXRzU3VwcGxpZXJfcG9zO1xuICAgIHBzZXRzQ3VzdG9tZXJfcG9zID0gdGhpcy5wc2V0c0N1c3RvbWVyX3BvcztcbiAgICBwc2V0c0N1cnJlbnRfcG9zID0gdGhpcy5wc2V0c0N1cnJlbnRfcG9zO1xuICAgIG9wc2V0QWRtaW4gPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5hZG1pbikgfHwge307XG4gICAgb3BzZXRVc2VyID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQudXNlcikgfHwge307XG4gICAgb3BzZXRNZW1iZXIgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5tZW1iZXIpIHx8IHt9O1xuICAgIG9wc2V0R3Vlc3QgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5ndWVzdCkgfHwge307XG4gICAgb3BzZXRTdXBwbGllciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LnN1cHBsaWVyKSB8fCB7fTtcbiAgICBvcHNldEN1c3RvbWVyID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuY3VzdG9tZXIpIHx8IHt9O1xuICAgIGlmIChwc2V0c0FkbWluKSB7XG4gICAgICBwb3NBZG1pbiA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNBZG1pbl9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c0FkbWluLl9pZCk7XG4gICAgICBleHRlbmRQZXJtaXNzaW9uUHJvcHMob3BzZXRBZG1pbiwgcG9zQWRtaW4pO1xuICAgIH1cbiAgICBpZiAocHNldHNVc2VyKSB7XG4gICAgICBwb3NVc2VyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c1VzZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNVc2VyLl9pZCk7XG4gICAgICBleHRlbmRQZXJtaXNzaW9uUHJvcHMob3BzZXRVc2VyLCBwb3NVc2VyKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzTWVtYmVyKSB7XG4gICAgICBwb3NNZW1iZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzTWVtYmVyX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzTWVtYmVyLl9pZCk7XG4gICAgICBleHRlbmRQZXJtaXNzaW9uUHJvcHMob3BzZXRNZW1iZXIsIHBvc01lbWJlcik7XG4gICAgfVxuICAgIGlmIChwc2V0c0d1ZXN0KSB7XG4gICAgICBwb3NHdWVzdCA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNHdWVzdF9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c0d1ZXN0Ll9pZCk7XG4gICAgICBleHRlbmRQZXJtaXNzaW9uUHJvcHMob3BzZXRHdWVzdCwgcG9zR3Vlc3QpO1xuICAgIH1cbiAgICBpZiAocHNldHNTdXBwbGllcikge1xuICAgICAgcG9zU3VwcGxpZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzU3VwcGxpZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNTdXBwbGllci5faWQpO1xuICAgICAgZXh0ZW5kUGVybWlzc2lvblByb3BzKG9wc2V0U3VwcGxpZXIsIHBvc1N1cHBsaWVyKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzQ3VzdG9tZXIpIHtcbiAgICAgIHBvc0N1c3RvbWVyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0N1c3RvbWVyX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzQ3VzdG9tZXIuX2lkKTtcbiAgICAgIGV4dGVuZFBlcm1pc3Npb25Qcm9wcyhvcHNldEN1c3RvbWVyLCBwb3NDdXN0b21lcik7XG4gICAgfVxuICAgIGlmICghdXNlcklkKSB7XG4gICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0QWRtaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1NwYWNlQWRtaW4pIHtcbiAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldEFkbWluO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNwYWNlSWQgPT09ICdjb21tb24nKSB7XG4gICAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldFVzZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BhY2VVc2VyID0gXy5pc051bGwodGhpcy5zcGFjZVVzZXIpIHx8IHRoaXMuc3BhY2VVc2VyID8gdGhpcy5zcGFjZVVzZXIgOiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtcbiAgICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgICAgdXNlcjogdXNlcklkXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHByb2ZpbGU6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoc3BhY2VVc2VyKSB7XG4gICAgICAgICAgICBwcm9mID0gc3BhY2VVc2VyLnByb2ZpbGU7XG4gICAgICAgICAgICBpZiAocHJvZikge1xuICAgICAgICAgICAgICBpZiAocHJvZiA9PT0gJ3VzZXInKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldFVzZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZiA9PT0gJ21lbWJlcicpIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0TWVtYmVyO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2YgPT09ICdndWVzdCcpIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0R3Vlc3Q7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZiA9PT0gJ3N1cHBsaWVyJykge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb3BzZXRTdXBwbGllcjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9mID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldEN1c3RvbWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0VXNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldEd1ZXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHNldHMubGVuZ3RoID4gMCkge1xuICAgICAgc2V0X2lkcyA9IF8ucGx1Y2socHNldHMsIFwiX2lkXCIpO1xuICAgICAgcG9zID0gZmluZF9wZXJtaXNzaW9uX29iamVjdChwc2V0c0N1cnJlbnRfcG9zLCBvYmplY3RfbmFtZSwgc2V0X2lkcyk7XG4gICAgICBwb3MgPSB1bmlvblBlcm1pc3Npb25PYmplY3RzKHBvcywgb2JqZWN0LCBwc2V0cyk7XG4gICAgICBfLmVhY2gocG9zLCBmdW5jdGlvbihwbykge1xuICAgICAgICBpZiAocG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c0FkbWluICE9IG51bGwgPyBwc2V0c0FkbWluLl9pZCA6IHZvaWQgMCkgfHwgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c1VzZXIgIT0gbnVsbCA/IHBzZXRzVXNlci5faWQgOiB2b2lkIDApIHx8IHBvLnBlcm1pc3Npb25fc2V0X2lkID09PSAocHNldHNNZW1iZXIgIT0gbnVsbCA/IHBzZXRzTWVtYmVyLl9pZCA6IHZvaWQgMCkgfHwgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c0d1ZXN0ICE9IG51bGwgPyBwc2V0c0d1ZXN0Ll9pZCA6IHZvaWQgMCkgfHwgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c1N1cHBsaWVyICE9IG51bGwgPyBwc2V0c1N1cHBsaWVyLl9pZCA6IHZvaWQgMCkgfHwgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c0N1c3RvbWVyICE9IG51bGwgPyBwc2V0c0N1c3RvbWVyLl9pZCA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9ucykpIHtcbiAgICAgICAgICBwZXJtaXNzaW9ucyA9IHBvO1xuICAgICAgICB9XG4gICAgICAgIG92ZXJsYXlCYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wcyhwZXJtaXNzaW9ucywgcG8pO1xuICAgICAgICBwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzLCBwby5kaXNhYmxlZF9saXN0X3ZpZXdzKTtcbiAgICAgICAgcGVybWlzc2lvbnMuZGlzYWJsZWRfYWN0aW9ucyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMuZGlzYWJsZWRfYWN0aW9ucywgcG8uZGlzYWJsZWRfYWN0aW9ucyk7XG4gICAgICAgIHBlcm1pc3Npb25zLnVucmVhZGFibGVfZmllbGRzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bnJlYWRhYmxlX2ZpZWxkcywgcG8udW5yZWFkYWJsZV9maWVsZHMpO1xuICAgICAgICBwZXJtaXNzaW9ucy51bmVkaXRhYmxlX2ZpZWxkcyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5lZGl0YWJsZV9maWVsZHMsIHBvLnVuZWRpdGFibGVfZmllbGRzKTtcbiAgICAgICAgcGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHMgPSBpbnRlcnNlY3Rpb25QbHVzKHBlcm1pc3Npb25zLnVucmVsYXRlZF9vYmplY3RzLCBwby51bnJlbGF0ZWRfb2JqZWN0cyk7XG4gICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdCA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QsIHBvLnVuZWRpdGFibGVfcmVsYXRlZF9saXN0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAob2JqZWN0LmlzX3ZpZXcpIHtcbiAgICAgIHBlcm1pc3Npb25zLmFsbG93Q3JlYXRlID0gZmFsc2U7XG4gICAgICBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZTtcbiAgICAgIHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2U7XG4gICAgICBwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzID0gZmFsc2U7XG4gICAgICBwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3JkcyA9IGZhbHNlO1xuICAgICAgcGVybWlzc2lvbnMuZGlzYWJsZWRfYWN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBDcmVhdG9yLnByb2Nlc3NQZXJtaXNzaW9ucyhwZXJtaXNzaW9ucyk7XG4gICAgaWYgKG9iamVjdC5wZXJtaXNzaW9uX3NldC5vd25lcikge1xuICAgICAgcGVybWlzc2lvbnMub3duZXIgPSBvYmplY3QucGVybWlzc2lvbl9zZXQub3duZXI7XG4gICAgfVxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfTtcbiAgTWV0ZW9yLm1ldGhvZHMoe1xuICAgIFwiY3JlYXRvci5vYmplY3RfcGVybWlzc2lvbnNcIjogZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgICAgcmV0dXJuIENyZWF0b3IuZ2V0QWxsUGVybWlzc2lvbnMoc3BhY2VJZCwgdGhpcy51c2VySWQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJcbnN0ZWVkb3NDb3JlID0gcmVxdWlyZSgnQHN0ZWVkb3MvY29yZScpXG5cbk1ldGVvci5zdGFydHVwICgpLT5cblx0Y3JlYXRvcl9kYl91cmwgPSBwcm9jZXNzLmVudi5NT05HT19VUkxfQ1JFQVRPUlxuXHRvcGxvZ191cmwgPSBwcm9jZXNzLmVudi5NT05HT19PUExPR19VUkxfQ1JFQVRPUlxuXHRpZiBjcmVhdG9yX2RiX3VybFxuXHRcdGlmICFvcGxvZ191cmxcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcIlBsZWFzZSBjb25maWd1cmUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiBNT05HT19PUExPR19VUkxfQ1JFQVRPUlwiKVxuXHRcdENyZWF0b3IuX0NSRUFUT1JfREFUQVNPVVJDRSA9IHtfZHJpdmVyOiBuZXcgTW9uZ29JbnRlcm5hbHMuUmVtb3RlQ29sbGVjdGlvbkRyaXZlcihjcmVhdG9yX2RiX3VybCwge29wbG9nVXJsOiBvcGxvZ191cmx9KX1cblxuQ3JlYXRvci5nZXRDb2xsZWN0aW9uTmFtZSA9IChvYmplY3QpLT5cbiNcdGlmIG9iamVjdC50YWJsZV9uYW1lICYmIG9iamVjdC50YWJsZV9uYW1lLmVuZHNXaXRoKFwiX19jXCIpXG4jXHRcdHJldHVybiBvYmplY3QudGFibGVfbmFtZVxuI1x0ZWxzZVxuI1x0XHRyZXR1cm4gb2JqZWN0Lm5hbWVcblx0cmV0dXJuIG9iamVjdC5uYW1lXG5DcmVhdG9yLmNyZWF0ZUNvbGxlY3Rpb24gPSAob2JqZWN0KS0+XG5cdGNvbGxlY3Rpb25fa2V5ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uTmFtZShvYmplY3QpXG5cdGlmIGRiW2NvbGxlY3Rpb25fa2V5XVxuXHRcdHJldHVybiBkYltjb2xsZWN0aW9uX2tleV1cblx0ZWxzZSBpZiBvYmplY3QuZGJcblx0XHRyZXR1cm4gb2JqZWN0LmRiXG5cblx0aWYgQ3JlYXRvci5Db2xsZWN0aW9uc1tjb2xsZWN0aW9uX2tleV1cblx0XHRyZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9uc1tjb2xsZWN0aW9uX2tleV1cblx0ZWxzZVxuXHRcdGlmIG9iamVjdC5jdXN0b21cblx0XHRcdHJldHVybiBzdGVlZG9zQ29yZS5uZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb25fa2V5LCBDcmVhdG9yLl9DUkVBVE9SX0RBVEFTT1VSQ0UpXG5cdFx0ZWxzZVxuXHRcdFx0aWYgY29sbGVjdGlvbl9rZXkgPT0gJ19zbXNfcXVldWUnICYmIFNNU1F1ZXVlPy5jb2xsZWN0aW9uXG5cdFx0XHRcdHJldHVybiBTTVNRdWV1ZS5jb2xsZWN0aW9uXG5cdFx0XHRyZXR1cm4gc3RlZWRvc0NvcmUubmV3Q29sbGVjdGlvbihjb2xsZWN0aW9uX2tleSlcblxuXG4iLCJ2YXIgc3RlZWRvc0NvcmU7XG5cbnN0ZWVkb3NDb3JlID0gcmVxdWlyZSgnQHN0ZWVkb3MvY29yZScpO1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIGNyZWF0b3JfZGJfdXJsLCBvcGxvZ191cmw7XG4gIGNyZWF0b3JfZGJfdXJsID0gcHJvY2Vzcy5lbnYuTU9OR09fVVJMX0NSRUFUT1I7XG4gIG9wbG9nX3VybCA9IHByb2Nlc3MuZW52Lk1PTkdPX09QTE9HX1VSTF9DUkVBVE9SO1xuICBpZiAoY3JlYXRvcl9kYl91cmwpIHtcbiAgICBpZiAoIW9wbG9nX3VybCkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig1MDAsIFwiUGxlYXNlIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IE1PTkdPX09QTE9HX1VSTF9DUkVBVE9SXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQ3JlYXRvci5fQ1JFQVRPUl9EQVRBU09VUkNFID0ge1xuICAgICAgX2RyaXZlcjogbmV3IE1vbmdvSW50ZXJuYWxzLlJlbW90ZUNvbGxlY3Rpb25Ecml2ZXIoY3JlYXRvcl9kYl91cmwsIHtcbiAgICAgICAgb3Bsb2dVcmw6IG9wbG9nX3VybFxuICAgICAgfSlcbiAgICB9O1xuICB9XG59KTtcblxuQ3JlYXRvci5nZXRDb2xsZWN0aW9uTmFtZSA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0Lm5hbWU7XG59O1xuXG5DcmVhdG9yLmNyZWF0ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgdmFyIGNvbGxlY3Rpb25fa2V5O1xuICBjb2xsZWN0aW9uX2tleSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbk5hbWUob2JqZWN0KTtcbiAgaWYgKGRiW2NvbGxlY3Rpb25fa2V5XSkge1xuICAgIHJldHVybiBkYltjb2xsZWN0aW9uX2tleV07XG4gIH0gZWxzZSBpZiAob2JqZWN0LmRiKSB7XG4gICAgcmV0dXJuIG9iamVjdC5kYjtcbiAgfVxuICBpZiAoQ3JlYXRvci5Db2xsZWN0aW9uc1tjb2xsZWN0aW9uX2tleV0pIHtcbiAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9uc1tjb2xsZWN0aW9uX2tleV07XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9iamVjdC5jdXN0b20pIHtcbiAgICAgIHJldHVybiBzdGVlZG9zQ29yZS5uZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb25fa2V5LCBDcmVhdG9yLl9DUkVBVE9SX0RBVEFTT1VSQ0UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29sbGVjdGlvbl9rZXkgPT09ICdfc21zX3F1ZXVlJyAmJiAodHlwZW9mIFNNU1F1ZXVlICE9PSBcInVuZGVmaW5lZFwiICYmIFNNU1F1ZXVlICE9PSBudWxsID8gU01TUXVldWUuY29sbGVjdGlvbiA6IHZvaWQgMCkpIHtcbiAgICAgICAgcmV0dXJuIFNNU1F1ZXVlLmNvbGxlY3Rpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RlZWRvc0NvcmUubmV3Q29sbGVjdGlvbihjb2xsZWN0aW9uX2tleSk7XG4gICAgfVxuICB9XG59O1xuIiwiQ3JlYXRvci5hY3Rpb25zQnlOYW1lID0ge31cblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdCMg5a6a5LmJ5YWo5bGAIGFjdGlvbnMg5Ye95pWwXHRcblx0Q3JlYXRvci5hY3Rpb25zID0gKGFjdGlvbnMpLT5cblx0XHRfLmVhY2ggYWN0aW9ucywgKHRvZG8sIGFjdGlvbl9uYW1lKS0+XG5cdFx0XHRDcmVhdG9yLmFjdGlvbnNCeU5hbWVbYWN0aW9uX25hbWVdID0gdG9kbyBcblxuXHRDcmVhdG9yLmV4ZWN1dGVBY3Rpb24gPSAob2JqZWN0X25hbWUsIGFjdGlvbiwgcmVjb3JkX2lkLCBpdGVtX2VsZW1lbnQsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsYmFjayktPlxuXHRcdGlmIGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PSAnd29yZC1wcmludCdcblx0XHRcdGlmIHJlY29yZF9pZFxuXHRcdFx0XHRmaWx0ZXJzID0gWydfaWQnLCAnPScsIHJlY29yZF9pZF1cblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmlsdGVycyA9IE9iamVjdEdyaWQuZ2V0RmlsdGVycyhvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBmYWxzZSwgbnVsbCwgbnVsbClcblx0XHRcdHVybCA9IFwiL2FwaS92NC93b3JkX3RlbXBsYXRlcy9cIiArIGFjdGlvbi53b3JkX3RlbXBsYXRlICsgXCIvcHJpbnRcIiArIFwiP2ZpbHRlcnM9XCIgKyBTdGVlZG9zRmlsdGVycy5mb3JtYXRGaWx0ZXJzVG9PRGF0YVF1ZXJ5KGZpbHRlcnMpO1xuXHRcdFx0dXJsID0gU3RlZWRvcy5hYnNvbHV0ZVVybCh1cmwpO1xuXHRcdFx0cmV0dXJuIHdpbmRvdy5vcGVuKHVybCk7XG5cblx0XHRvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0XHRpZiBhY3Rpb24/LnRvZG9cblx0XHRcdGlmIHR5cGVvZiBhY3Rpb24udG9kbyA9PSBcInN0cmluZ1wiXG5cdFx0XHRcdHRvZG8gPSBDcmVhdG9yLmFjdGlvbnNCeU5hbWVbYWN0aW9uLnRvZG9dXG5cdFx0XHRlbHNlIGlmIHR5cGVvZiBhY3Rpb24udG9kbyA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdFx0dG9kbyA9IGFjdGlvbi50b2RvXHRcblx0XHRcdGlmICFyZWNvcmQgJiYgb2JqZWN0X25hbWUgJiYgcmVjb3JkX2lkXG5cdFx0XHRcdHJlY29yZCA9IENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQpXG5cdFx0XHRpZiB0b2RvXG5cdFx0XHRcdCMgaXRlbV9lbGVtZW505Li656m65pe25bqU6K+l6K6+572u6buY6K6k5YC877yI5a+56LGh55qEbmFtZeWtl+aute+8ie+8jOWQpuWImW1vcmVBcmdz5ou/5Yiw55qE5ZCO57ut5Y+C5pWw5L2N572u5bCx5LiN5a+5XG5cdFx0XHRcdGl0ZW1fZWxlbWVudCA9IGlmIGl0ZW1fZWxlbWVudCB0aGVuIGl0ZW1fZWxlbWVudCBlbHNlIFwiXCJcblx0XHRcdFx0bW9yZUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpXG5cdFx0XHRcdHRvZG9BcmdzID0gW29iamVjdF9uYW1lLCByZWNvcmRfaWRdLmNvbmNhdChtb3JlQXJncylcblx0XHRcdFx0dG9kby5hcHBseSB7XG5cdFx0XHRcdFx0b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lXG5cdFx0XHRcdFx0cmVjb3JkX2lkOiByZWNvcmRfaWRcblx0XHRcdFx0XHRvYmplY3Q6IG9ialxuXHRcdFx0XHRcdGFjdGlvbjogYWN0aW9uXG5cdFx0XHRcdFx0aXRlbV9lbGVtZW50OiBpdGVtX2VsZW1lbnRcblx0XHRcdFx0XHRyZWNvcmQ6IHJlY29yZFxuXHRcdFx0XHR9LCB0b2RvQXJnc1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0b2FzdHIud2FybmluZyh0KFwiX29iamVjdF9hY3Rpb25zX25vbmVfdG9kb1wiKSlcblx0XHRlbHNlXG5cdFx0XHR0b2FzdHIud2FybmluZyh0KFwiX29iamVjdF9hY3Rpb25zX25vbmVfdG9kb1wiKSlcblxuXG5cdF9kZWxldGVSZWNvcmQgPSAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3RpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgY2FsbF9iYWNrLCBjYWxsX2JhY2tfZXJyb3IpLT5cblx0XHQjIGNvbnNvbGUubG9nKFwiPT09X2RlbGV0ZVJlY29yZD09PVwiLCBvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2ssIGNhbGxfYmFja19lcnJvcik7XG5cdFx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdFx0cHJldmlvdXNEb2MgPSBGb3JtTWFuYWdlci5nZXRQcmV2aW91c0RvYyhvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCAnZGVsZXRlJylcblx0XHRDcmVhdG9yLm9kYXRhLmRlbGV0ZSBvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCAoKS0+XG5cdFx0XHRpZiByZWNvcmRfdGl0bGVcblx0XHRcdFx0IyBpbmZvID0gb2JqZWN0LmxhYmVsICsgXCJcXFwiI3tyZWNvcmRfdGl0bGV9XFxcIlwiICsgXCLlt7LliKDpmaRcIlxuXHRcdFx0XHRpbmZvID10IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX3N3YWxfdGl0bGVfc3VjXCIsIG9iamVjdC5sYWJlbCArIFwiXFxcIiN7cmVjb3JkX3RpdGxlfVxcXCJcIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbmZvID0gdCgnY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX3N3YWxfc3VjJylcblx0XHRcdHRvYXN0ci5zdWNjZXNzIGluZm9cblx0XHRcdGlmIGNhbGxfYmFjayBhbmQgdHlwZW9mIGNhbGxfYmFjayA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdFx0Y2FsbF9iYWNrKClcblxuXHRcdFx0Rm9ybU1hbmFnZXIucnVuSG9vayhvYmplY3RfbmFtZSwgJ2RlbGV0ZScsICdhZnRlcicsIHtfaWQ6IHJlY29yZF9pZCwgcHJldmlvdXNEb2M6IHByZXZpb3VzRG9jfSlcblx0XHQsIChlcnJvciktPlxuXHRcdFx0aWYgY2FsbF9iYWNrX2Vycm9yIGFuZCB0eXBlb2YgY2FsbF9iYWNrX2Vycm9yID09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHRjYWxsX2JhY2tfZXJyb3IoKVxuXHRcdFx0Rm9ybU1hbmFnZXIucnVuSG9vayhvYmplY3RfbmFtZSwgJ2RlbGV0ZScsICdlcnJvcicsIHtfaWQ6IHJlY29yZF9pZCwgZXJyb3I6IGVycm9yfSlcblxuXHRDcmVhdG9yLnJlbGF0ZWRPYmplY3RTdGFuZGFyZE5ldyA9IChyZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0cmVsYXRlT2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QocmVsYXRlZF9vYmplY3RfbmFtZSlcblx0XHRjb2xsZWN0aW9uX25hbWUgPSByZWxhdGVPYmplY3QubGFiZWxcblx0XHRjb2xsZWN0aW9uID0gXCJDcmVhdG9yLkNvbGxlY3Rpb25zLiN7Q3JlYXRvci5nZXRPYmplY3QocmVsYXRlZF9vYmplY3RfbmFtZSkuX2NvbGxlY3Rpb25fbmFtZX1cIlxuXHRcdGN1cnJlbnRfb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0Y3VycmVudF9yZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKVxuXHRcdGlkcyA9IENyZWF0b3IuVGFidWxhclNlbGVjdGVkSWRzW3JlbGF0ZWRfb2JqZWN0X25hbWVdXG5cdFx0aW5pdGlhbFZhbHVlcyA9IHt9O1xuXHRcdGlmIGlkcz8ubGVuZ3RoXG5cdFx0XHQjIOWIl+ihqOaciemAieS4remhueaXtu+8jOWPluesrOS4gOS4qumAieS4remhue+8jOWkjeWItuWFtuWGheWuueWIsOaWsOW7uueql+WPo+S4rVxuXHRcdFx0IyDov5nnmoTnrKzkuIDkuKrmjIfnmoTmmK/nrKzkuIDmrKHli77pgInnmoTpgInkuK3pobnvvIzogIzkuI3mmK/liJfooajkuK3lt7Lli77pgInnmoTnrKzkuIDpoblcblx0XHRcdHJlY29yZF9pZCA9IGlkc1swXVxuXHRcdFx0ZG9jID0gQ3JlYXRvci5vZGF0YS5nZXQocmVsYXRlZF9vYmplY3RfbmFtZSwgcmVjb3JkX2lkKVxuXHRcdFx0aW5pdGlhbFZhbHVlcyA9IGRvY1xuXHRcdFx0IyDigJzkv53lrZjlubbmlrDlu7rigJ3mk43kvZzkuK3oh6rliqjmiZPlvIDnmoTmlrDnqpflj6PkuK3pnIDopoHlho3mrKHlpI3liLbmnIDmlrDnmoRkb2PlhoXlrrnliLDmlrDnqpflj6PkuK1cblx0XHRcdFNlc3Npb24uc2V0ICdjbVNob3dBZ2FpbkR1cGxpY2F0ZWQnLCB0cnVlXG5cdFx0ZWxzZVxuXHRcdFx0ZGVmYXVsdERvYyA9IEZvcm1NYW5hZ2VyLmdldFJlbGF0ZWRJbml0aWFsVmFsdWVzKGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkLCByZWxhdGVkX29iamVjdF9uYW1lKTtcblx0XHRcdGlmICFfLmlzRW1wdHkoZGVmYXVsdERvYylcblx0XHRcdFx0aW5pdGlhbFZhbHVlcyA9IGRlZmF1bHREb2Ncblx0XHRpZiByZWxhdGVPYmplY3Q/LnZlcnNpb24gPj0gMlxuXHRcdFx0cmV0dXJuIFN0ZWVkb3NVSS5zaG93TW9kYWwoc3RvcmVzLkNvbXBvbmVudFJlZ2lzdHJ5LmNvbXBvbmVudHMuT2JqZWN0Rm9ybSwge1xuXHRcdFx0XHRuYW1lOiBcIiN7cmVsYXRlZF9vYmplY3RfbmFtZX1fc3RhbmRhcmRfbmV3X2Zvcm1cIixcblx0XHRcdFx0b2JqZWN0QXBpTmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSxcblx0XHRcdFx0dGl0bGU6ICfmlrDlu7ogJyArIHJlbGF0ZU9iamVjdC5sYWJlbCxcblx0XHRcdFx0aW5pdGlhbFZhbHVlczogaW5pdGlhbFZhbHVlcyxcblx0XHRcdFx0YWZ0ZXJJbnNlcnQ6IChyZXN1bHQpLT5cblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpLT5cblx0XHRcdFx0XHRcdCMgT2JqZWN0Rm9ybeaciee8k+WtmO+8jOaWsOW7uuWtkOihqOiusOW9leWPr+iDveS8muacieaxh+aAu+Wtl+aute+8jOmcgOimgeWIt+aWsOihqOWNleaVsOaNrlxuXHRcdFx0XHRcdFx0aWYgQ3JlYXRvci5nZXRPYmplY3QoY3VycmVudF9vYmplY3RfbmFtZSkudmVyc2lvbiA+IDFcblx0XHRcdFx0XHRcdFx0U3RlZWRvc1VJLnJlbG9hZFJlY29yZChjdXJyZW50X29iamVjdF9uYW1lLCBjdXJyZW50X3JlY29yZF9pZClcblx0XHRcdFx0XHRcdEZsb3dSb3V0ZXIucmVsb2FkKCk7XG5cdFx0XHRcdFx0LCAxKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sIG51bGwsIHtpY29uUGF0aDogJy9hc3NldHMvaWNvbnMnfSlcblxuXG5cdFx0aWYgaWRzPy5sZW5ndGhcblx0XHRcdCMg5YiX6KGo5pyJ6YCJ5Lit6aG55pe277yM5Y+W56ys5LiA5Liq6YCJ5Lit6aG577yM5aSN5Yi25YW25YaF5a655Yiw5paw5bu656qX5Y+j5LitXG5cdFx0XHQjIOi/meeahOesrOS4gOS4quaMh+eahOaYr+esrOS4gOasoeWLvumAieeahOmAieS4remhue+8jOiAjOS4jeaYr+WIl+ihqOS4reW3suWLvumAieeahOesrOS4gOmhuVxuXHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgaW5pdGlhbFZhbHVlc1xuXHRcdFx0IyDigJzkv53lrZjlubbmlrDlu7rigJ3mk43kvZzkuK3oh6rliqjmiZPlvIDnmoTmlrDnqpflj6PkuK3pnIDopoHlho3mrKHlpI3liLbmnIDmlrDnmoRkb2PlhoXlrrnliLDmlrDnqpflj6PkuK1cblx0XHRcdFNlc3Npb24uc2V0ICdjbVNob3dBZ2FpbkR1cGxpY2F0ZWQnLCB0cnVlXG5cdFx0ZWxzZVxuXHRcdFx0aWYgIV8uaXNFbXB0eShpbml0aWFsVmFsdWVzKVxuXHRcdFx0XHRTZXNzaW9uLnNldCAnY21Eb2MnLCBpbml0aWFsVmFsdWVzXG5cblx0XHRTZXNzaW9uLnNldChcImFjdGlvbl9maWVsZHNcIiwgdW5kZWZpbmVkKVxuXHRcdFNlc3Npb24uc2V0KFwiYWN0aW9uX2NvbGxlY3Rpb25cIiwgY29sbGVjdGlvbilcblx0XHRTZXNzaW9uLnNldChcImFjdGlvbl9jb2xsZWN0aW9uX25hbWVcIiwgY29sbGVjdGlvbl9uYW1lKVxuXHRcdFNlc3Npb24uc2V0KFwiYWN0aW9uX3NhdmVfYW5kX2luc2VydFwiLCBmYWxzZSlcblx0XHRNZXRlb3IuZGVmZXIgKCktPlxuXHRcdFx0JChcIi5jcmVhdG9yLWFkZC1yZWxhdGVkXCIpLmNsaWNrKClcblx0XHRyZXR1cm5cblxuXHRDcmVhdG9yLmFjdGlvbnMgXG5cdFx0IyDlnKjmraTlrprkuYnlhajlsYAgYWN0aW9uc1xuXHRcdFwic3RhbmRhcmRfcXVlcnlcIjogKCktPlxuXHRcdFx0TW9kYWwuc2hvdyhcInN0YW5kYXJkX3F1ZXJ5X21vZGFsXCIpXG5cblx0XHRcInN0YW5kYXJkX25ld1wiOiAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZmllbGRzKS0+XG5cdFx0XHQjIGN1cnJlbnRfcmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIilcblx0XHRcdCMgaWYgY3VycmVudF9yZWNvcmRfaWRcblx0XHRcdCMgXHQjIGFtaXMg55u45YWz5a2Q6KGo5Y+z5LiK6KeS5paw5bu6XG5cdFx0XHQjIFx0Q3JlYXRvci5yZWxhdGVkT2JqZWN0U3RhbmRhcmROZXcob2JqZWN0X25hbWUpXG5cdFx0XHQjIFx0cmV0dXJuIFxuXHRcdFx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuXHRcdFx0Z3JpZE5hbWUgPSB0aGlzLmFjdGlvbi5ncmlkTmFtZTtcblx0XHRcdGlzUmVsYXRlZCA9IHRoaXMuYWN0aW9uLmlzUmVsYXRlZDtcblx0XHRcdGlmIGlzUmVsYXRlZFxuXHRcdFx0XHRyZWxhdGVkRmllbGROYW1lID0gdGhpcy5hY3Rpb24ucmVsYXRlZEZpZWxkTmFtZTtcblx0XHRcdFx0bWFzdGVyUmVjb3JkSWQgPSB0aGlzLmFjdGlvbi5tYXN0ZXJSZWNvcmRJZDtcblx0XHRcdFx0aW5pdGlhbFZhbHVlcyA9IHRoaXMuYWN0aW9uLmluaXRpYWxWYWx1ZXNcblx0XHRcdFx0aWYgIWluaXRpYWxWYWx1ZXNcblx0XHRcdFx0XHRpbml0aWFsVmFsdWVzID0ge307XG5cdFx0XHRcdFx0aW5pdGlhbFZhbHVlc1tyZWxhdGVkRmllbGROYW1lXSA9IG1hc3RlclJlY29yZElkXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGluaXRpYWxWYWx1ZXM9e31cblx0XHRcdFx0aWYoZ3JpZE5hbWUpXG5cdFx0XHRcdFx0c2VsZWN0ZWRSb3dzID0gd2luZG93LmdyaWRSZWZzP1tncmlkTmFtZV0uY3VycmVudD8uYXBpPy5nZXRTZWxlY3RlZFJvd3MoKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c2VsZWN0ZWRSb3dzID0gd2luZG93LmdyaWRSZWY/LmN1cnJlbnQ/LmFwaT8uZ2V0U2VsZWN0ZWRSb3dzKClcdFxuXHRcdFx0XHRcblx0XHRcdFx0aWYgc2VsZWN0ZWRSb3dzPy5sZW5ndGhcblx0XHRcdFx0XHRyZWNvcmRfaWQgPSBzZWxlY3RlZFJvd3NbMF0uX2lkO1xuXHRcdFx0XHRcdGlmIHJlY29yZF9pZFxuXHRcdFx0XHRcdFx0aW5pdGlhbFZhbHVlcyA9IENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQpXG5cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGluaXRpYWxWYWx1ZXMgPSBGb3JtTWFuYWdlci5nZXRJbml0aWFsVmFsdWVzKG9iamVjdF9uYW1lKVxuXG5cdFx0XHRpZiBvYmplY3Q/LnZlcnNpb24gPj0gMlxuXHRcdFx0XHRyZXR1cm4gU3RlZWRvcy5QYWdlLkZvcm0uU3RhbmRhcmROZXcucmVuZGVyKFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpLCBvYmplY3RfbmFtZSwgdCgnTmV3JykgKyAnICcgKyBvYmplY3QubGFiZWwsIGluaXRpYWxWYWx1ZXMgLCB7Z3JpZE5hbWU6IGdyaWROYW1lfSk7XG5cdFx0XHRTZXNzaW9uLnNldCAnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWVcblx0XHRcdGlmIHNlbGVjdGVkUm93cz8ubGVuZ3RoXG5cdFx0XHRcdCMg5YiX6KGo5pyJ6YCJ5Lit6aG55pe277yM5Y+W56ys5LiA5Liq6YCJ5Lit6aG577yM5aSN5Yi25YW25YaF5a655Yiw5paw5bu656qX5Y+j5LitXG5cdFx0XHRcdCMg6L+Z55qE56ys5LiA5Liq5oyH55qE5piv56ys5LiA5qyh5Yu+6YCJ55qE6YCJ5Lit6aG577yM6ICM5LiN5piv5YiX6KGo5Lit5bey5Yu+6YCJ55qE56ys5LiA6aG5XG5cdFx0XHRcdFNlc3Npb24uc2V0ICdjbURvYycsIGluaXRpYWxWYWx1ZXNcblx0XHRcdFx0IyDigJzkv53lrZjlubbmlrDlu7rigJ3mk43kvZzkuK3oh6rliqjmiZPlvIDnmoTmlrDnqpflj6PkuK3pnIDopoHlho3mrKHlpI3liLbmnIDmlrDnmoRkb2PlhoXlrrnliLDmlrDnqpflj6PkuK1cblx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtU2hvd0FnYWluRHVwbGljYXRlZCcsIHRydWVcblx0XHRcdGVsc2Vcblx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgaW5pdGlhbFZhbHVlc1xuXHRcdFx0TWV0ZW9yLmRlZmVyICgpLT5cblx0XHRcdFx0JChcIi5jcmVhdG9yLWFkZFwiKS5jbGljaygpXG5cdFx0XHRyZXR1cm4gXG5cblx0XHRcInN0YW5kYXJkX29wZW5fdmlld1wiOiAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZmllbGRzKS0+XG5cdFx0XHRocmVmID0gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZClcblx0XHRcdEZsb3dSb3V0ZXIucmVkaXJlY3QoaHJlZilcblx0XHRcdHJldHVybiBmYWxzZVxuXG5cdFx0XCJzdGFuZGFyZF9lZGl0XCI6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBmaWVsZHMpLT5cblx0XHRcdGlmIHJlY29yZF9pZFxuXHRcdFx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG5cdFx0XHRcdGlmIG9iamVjdD8udmVyc2lvbiA+PSAyXG5cdFx0XHRcdFx0cmV0dXJuIFN0ZWVkb3MuUGFnZS5Gb3JtLlN0YW5kYXJkRWRpdC5yZW5kZXIoU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIiksIG9iamVjdF9uYW1lLCB0KCdFZGl0JykgKyAnICcgKyBvYmplY3QubGFiZWwsIHJlY29yZF9pZCwge1xuXHRcdFx0XHRcdFx0Z3JpZE5hbWU6IHRoaXMuYWN0aW9uLmdyaWROYW1lXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpICYmIGZhbHNlXG4jXHRcdFx0XHRcdHJlY29yZCA9IENyZWF0b3IuZ2V0T2JqZWN0UmVjb3JkKG9iamVjdF9uYW1lLCByZWNvcmRfaWQpXG4jXHRcdFx0XHRcdFNlc3Npb24uc2V0ICdjbURvYycsIHJlY29yZFxuI1x0XHRcdFx0XHRTZXNzaW9uLnNldCAncmVsb2FkX2R4bGlzdCcsIGZhbHNlXG5cdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2FjdGlvbl9vYmplY3RfbmFtZScsIG9iamVjdF9uYW1lXG5cdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2FjdGlvbl9yZWNvcmRfaWQnLCByZWNvcmRfaWRcblx0XHRcdFx0XHRpZiB0aGlzLnJlY29yZFxuXHRcdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgdGhpcy5yZWNvcmRcblx0XHRcdFx0XHRNZXRlb3IuZGVmZXIgKCktPlxuXHRcdFx0XHRcdFx0JChcIi5idG4tZWRpdC1yZWNvcmRcIikuY2xpY2soKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2FjdGlvbl9vYmplY3RfbmFtZScsIG9iamVjdF9uYW1lXG5cdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2FjdGlvbl9yZWNvcmRfaWQnLCByZWNvcmRfaWRcblx0XHRcdFx0XHRpZiB0aGlzLnJlY29yZFxuXHRcdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgdGhpcy5yZWNvcmRcblx0XHRcdFx0XHRcdE1ldGVvci5kZWZlciAoKS0+XG5cdFx0XHRcdFx0XHRcdCQoXCIuYnRuLmNyZWF0b3ItZWRpdFwiKS5jbGljaygpXG5cblx0XHRcInN0YW5kYXJkX2RlbGV0ZVwiOiAob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3RpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgY2FsbF9iYWNrKS0+XG5cdFx0XHRncmlkTmFtZSA9IHRoaXMuYWN0aW9uLmdyaWROYW1lO1xuXHRcdFx0IyBjb25zb2xlLmxvZyhcIj09PXN0YW5kYXJkX2RlbGV0ZT09PVwiLCBvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2spO1xuXHRcdFx0aWYgcmVjb3JkX2lkXG5cdFx0XHRcdGJlZm9yZUhvb2sgPSBGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2JlZm9yZScsIHtfaWQ6IHJlY29yZF9pZH0pXG5cdFx0XHRcdGlmICFiZWZvcmVIb29rXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdFx0XHRuYW1lRmllbGQgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVkgfHwgXCJuYW1lXCJcblxuXHRcdFx0dW5sZXNzIGxpc3Rfdmlld19pZFxuXHRcdFx0XHRsaXN0X3ZpZXdfaWQgPSBTZXNzaW9uLmdldChcImxpc3Rfdmlld19pZFwiKVxuXHRcdFx0dW5sZXNzIGxpc3Rfdmlld19pZFxuXHRcdFx0XHRsaXN0X3ZpZXdfaWQgPSBcImFsbFwiXG5cblx0XHRcdGlmKCFfLmlzU3RyaW5nKHJlY29yZF90aXRsZSkgJiYgcmVjb3JkX3RpdGxlKVxuXHRcdFx0XHRyZWNvcmRfdGl0bGUgPSByZWNvcmRfdGl0bGVbbmFtZUZpZWxkXVxuXHRcdFx0XG5cdFx0XHRpZiByZWNvcmQgJiYgIXJlY29yZF90aXRsZVxuXHRcdFx0XHRyZWNvcmRfdGl0bGUgPSByZWNvcmRbbmFtZUZpZWxkXVxuXHRcdFx0XG5cdFx0XHRpMThuVGl0bGVLZXkgPSBcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3RpdGxlXCJcblx0XHRcdGkxOG5UZXh0S2V5ID0gXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF90ZXh0XCJcblxuXHRcdFx0dW5sZXNzIHJlY29yZF9pZFxuXHRcdFx0XHRpMThuVGl0bGVLZXkgPSBcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9tYW55X3N3YWxfdGl0bGVcIlxuXHRcdFx0XHRpMThuVGV4dEtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX21hbnlfc3dhbF90ZXh0XCJcblxuXHRcdFx0XHQjIOWmguaenOaYr+aJuemHj+WIoOmZpO+8jOWImeS8oOWFpeeahGxpc3Rfdmlld19pZOS4uuWIl+ihqOinhuWbvueahG5hbWXvvIznlKjkuo7ojrflj5bliJfooajpgInkuK3poblcblx0XHRcdFx0IyDkuLvliJfooajop4TliJnmmK9cImxpc3R2aWV3XyN7b2JqZWN0X25hbWV9XyN7bGlzdF92aWV3X2lkfVwi77yM55u45YWz6KGo6KeE5YiZ5pivXCJyZWxhdGVkX2xpc3R2aWV3XyN7b2JqZWN0X25hbWV9XyN7cmVsYXRlZF9vYmplY3RfbmFtZX1fI3tyZWxhdGVkX2ZpZWxkX25hbWV9XCJcblx0XHRcdFx0c2VsZWN0ZWRSZWNvcmRzID0gU3RlZWRvc1VJLmdldFRhYmxlU2VsZWN0ZWRSb3dzKGdyaWROYW1lIHx8IGxpc3Rfdmlld19pZClcblx0XHRcdFx0aWYgIXNlbGVjdGVkUmVjb3JkcyB8fCAhc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aFxuXHRcdFx0XHRcdHRvYXN0ci53YXJuaW5nKHQoXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfbWFueV9ub19zZWxlY3Rpb25cIikpXG5cdFx0XHRcdFx0cmV0dXJuXG5cblx0XHRcdGlmIHJlY29yZF90aXRsZVxuXHRcdFx0XHR0ZXh0ID0gdCBpMThuVGV4dEtleSwgXCIje29iamVjdC5sYWJlbH0gXFxcIiN7cmVjb3JkX3RpdGxlfVxcXCJcIlxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0ZXh0ID0gdCBpMThuVGV4dEtleSwgXCIje29iamVjdC5sYWJlbH1cIlxuXHRcdFx0c3dhbFxuXHRcdFx0XHR0aXRsZTogdCBpMThuVGl0bGVLZXksIFwiI3tvYmplY3QubGFiZWx9XCJcblx0XHRcdFx0dGV4dDogXCI8ZGl2IGNsYXNzPSdkZWxldGUtY3JlYXRvci13YXJuaW5nJz4je3RleHR9PC9kaXY+XCJcblx0XHRcdFx0aHRtbDogdHJ1ZVxuXHRcdFx0XHRzaG93Q2FuY2VsQnV0dG9uOnRydWVcblx0XHRcdFx0Y29uZmlybUJ1dHRvblRleHQ6IHQoJ0RlbGV0ZScpXG5cdFx0XHRcdGNhbmNlbEJ1dHRvblRleHQ6IHQoJ0NhbmNlbCcpXG5cdFx0XHRcdChvcHRpb24pIC0+XG5cdFx0XHRcdFx0aWYgb3B0aW9uXG5cdFx0XHRcdFx0XHRpZiByZWNvcmRfaWRcblx0XHRcdFx0XHRcdFx0IyDljZXmnaHorrDlvZXliKDpmaRcblx0XHRcdFx0XHRcdFx0X2RlbGV0ZVJlY29yZCBvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCAoKS0+XG5cdFx0XHRcdFx0XHRcdFx0IyDmlofku7bniYjmnKzkuLpcImNmcy5maWxlcy5maWxlcmVjb3JkXCLvvIzpnIDopoHmm7/mjaLkuLpcImNmcy1maWxlcy1maWxlcmVjb3JkXCJcblx0XHRcdFx0XHRcdFx0XHRncmlkT2JqZWN0TmFtZUNsYXNzID0gb2JqZWN0X25hbWUucmVwbGFjZSgvXFwuL2csXCItXCIpXG5cdFx0XHRcdFx0XHRcdFx0Z3JpZENvbnRhaW5lciA9ICQoXCIuZ3JpZENvbnRhaW5lci4je2dyaWRPYmplY3ROYW1lQ2xhc3N9XCIpXG5cdFx0XHRcdFx0XHRcdFx0dW5sZXNzIGdyaWRDb250YWluZXI/Lmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgd2luZG93Lm9wZW5lclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc09wZW5lclJlbW92ZSA9IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGdyaWRDb250YWluZXIgPSB3aW5kb3cub3BlbmVyLiQoXCIuZ3JpZENvbnRhaW5lci4je2dyaWRPYmplY3ROYW1lQ2xhc3N9XCIpXG5cdFx0XHRcdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRcdFx0XHQjIE9iamVjdEZvcm3mnInnvJPlrZjvvIzliKDpmaTlrZDooajorrDlvZXlj6/og73kvJrmnInmsYfmgLvlrZfmrrXvvIzpnIDopoHliLfmlrDooajljZXmlbDmja5cblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRfb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50X3JlY29yZF9pZCA9IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBjdXJyZW50X29iamVjdF9uYW1lICYmIENyZWF0b3IuZ2V0T2JqZWN0KGN1cnJlbnRfb2JqZWN0X25hbWUpPy52ZXJzaW9uID4gMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRTdGVlZG9zVUkucmVsb2FkUmVjb3JkKGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkKVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgRmxvd1JvdXRlci5jdXJyZW50KCkucm91dGUucGF0aC5lbmRzV2l0aChcIi86cmVjb3JkX2lkXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIG9iamVjdF9uYW1lICE9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRGbG93Um91dGVyLnJlbG9hZCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cucmVmcmVzaEdyaWQoZ3JpZE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdGNhdGNoIF9lXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKF9lKTtcblx0XHRcdFx0XHRcdFx0XHRpZiBncmlkQ29udGFpbmVyPy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdGlmIG9iamVjdC5lbmFibGVfdHJlZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkeERhdGFHcmlkSW5zdGFuY2UgPSBncmlkQ29udGFpbmVyLmR4VHJlZUxpc3QoKS5keFRyZWVMaXN0KCdpbnN0YW5jZScpXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGR4RGF0YUdyaWRJbnN0YW5jZSA9IGdyaWRDb250YWluZXIuZHhEYXRhR3JpZCgpLmR4RGF0YUdyaWQoJ2luc3RhbmNlJylcblx0XHRcdFx0XHRcdFx0XHRpZiBkeERhdGFHcmlkSW5zdGFuY2Vcblx0XHRcdFx0XHRcdFx0XHRcdGlmIG9iamVjdC5lbmFibGVfdHJlZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkeERhdGFHcmlkSW5zdGFuY2UucmVmcmVzaCgpXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIG9iamVjdF9uYW1lICE9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRGbG93Um91dGVyLnJlbG9hZCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQjIGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0IyBcdFRlbXBsYXRlLmNyZWF0b3JfZ3JpZC5yZWZyZXNoKGR4RGF0YUdyaWRJbnN0YW5jZSlcblx0XHRcdFx0XHRcdFx0XHRyZWNvcmRVcmwgPSBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkKVxuXHRcdFx0XHRcdFx0XHRcdHRlbXBOYXZSZW1vdmVkID0gQ3JlYXRvci5yZW1vdmVUZW1wTmF2SXRlbShvYmplY3RfbmFtZSwgcmVjb3JkVXJsKSAj5peg6K665piv5Zyo6K6w5b2V6K+m57uG55WM6Z2i6L+Y5piv5YiX6KGo55WM6Z2i5omn6KGM5Yig6Zmk5pON5L2c77yM6YO95Lya5oqK5Li05pe25a+86Iiq5Yig6Zmk5o6JXG5cdFx0XHRcdFx0XHRcdFx0aWYgaXNPcGVuZXJSZW1vdmUgb3IgIWR4RGF0YUdyaWRJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgaXNPcGVuZXJSZW1vdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0d2luZG93LmNsb3NlKClcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgcmVjb3JkX2lkID09IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpIGFuZCBsaXN0X3ZpZXdfaWQgIT0gJ2NhbGVuZGFyJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhcHBpZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVubGVzcyB0ZW1wTmF2UmVtb3ZlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCMg5aaC5p6c56Gu5a6e5Yig6Zmk5LqG5Li05pe25a+86Iiq77yM5bCx5Y+v6IO95bey57uP6YeN5a6a5ZCR5Yiw5LiK5LiA5Liq6aG16Z2i5LqG77yM5rKh5b+F6KaB5YaN6YeN5a6a5ZCR5LiA5qyhXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Rmxvd1JvdXRlci5nbyBcIi9hcHAvI3thcHBpZH0vI3tvYmplY3RfbmFtZX0vZ3JpZC8je2xpc3Rfdmlld19pZH1cIlxuXHRcdFx0XHRcdFx0XHRcdGlmIGNhbGxfYmFjayBhbmQgdHlwZW9mIGNhbGxfYmFjayA9PSBcImZ1bmN0aW9uXCJcblx0XHRcdFx0XHRcdFx0XHRcdGNhbGxfYmFjaygpXHRcdFx0XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdCMg5om56YeP5Yig6ZmkXG5cdFx0XHRcdFx0XHRcdGlmIHNlbGVjdGVkUmVjb3JkcyAmJiBzZWxlY3RlZFJlY29yZHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlQ291bnRlciA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0YWZ0ZXJCYXRjaGVzRGVsZXRlID0gKCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVsZXRlQ291bnRlcisrXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBkZWxldGVDb3VudGVyID49IHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0IyBjb25zb2xlLmxvZyhcImRlbGV0ZUNvdW50ZXIsIHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGg9PT1cIiwgZGVsZXRlQ291bnRlciwgc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cucmVmcmVzaEdyaWQoZ3JpZE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdGVkUmVjb3Jkcy5mb3JFYWNoIChyZWNvcmQpLT5cblx0XHRcdFx0XHRcdFx0XHRcdHJlY29yZF9pZCA9IHJlY29yZC5faWRcblx0XHRcdFx0XHRcdFx0XHRcdGJlZm9yZUhvb2sgPSBGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2JlZm9yZScsIHtfaWQ6IHJlY29yZF9pZH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAhYmVmb3JlSG9va1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhZnRlckJhdGNoZXNEZWxldGUoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWNvcmRUaXRsZSA9IHJlY29yZFtuYW1lRmllbGRdIHx8IHJlY29yZF9pZFxuXHRcdFx0XHRcdFx0XHRcdFx0X2RlbGV0ZVJlY29yZCBvYmplY3RfbmFtZSwgcmVjb3JkLl9pZCwgcmVjb3JkVGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCAoKCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWNvcmRVcmwgPSBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRDcmVhdG9yLnJlbW92ZVRlbXBOYXZJdGVtKG9iamVjdF9uYW1lLCByZWNvcmRVcmwpICPml6DorrrmmK/lnKjorrDlvZXor6bnu4bnlYzpnaLov5jmmK/liJfooajnlYzpnaLmiafooYzliKDpmaTmk43kvZzvvIzpg73kvJrmiorkuLTml7blr7zoiKrliKDpmaTmjolcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWZ0ZXJCYXRjaGVzRGVsZXRlKClcblx0XHRcdFx0XHRcdFx0XHRcdCksICgpLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0YWZ0ZXJCYXRjaGVzRGVsZXRlKCkiLCJ2YXIgX2RlbGV0ZVJlY29yZDtcblxuQ3JlYXRvci5hY3Rpb25zQnlOYW1lID0ge307XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgQ3JlYXRvci5hY3Rpb25zID0gZnVuY3Rpb24oYWN0aW9ucykge1xuICAgIHJldHVybiBfLmVhY2goYWN0aW9ucywgZnVuY3Rpb24odG9kbywgYWN0aW9uX25hbWUpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLmFjdGlvbnNCeU5hbWVbYWN0aW9uX25hbWVdID0gdG9kbztcbiAgICB9KTtcbiAgfTtcbiAgQ3JlYXRvci5leGVjdXRlQWN0aW9uID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGFjdGlvbiwgcmVjb3JkX2lkLCBpdGVtX2VsZW1lbnQsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWx0ZXJzLCBtb3JlQXJncywgb2JqLCB0b2RvLCB0b2RvQXJncywgdXJsO1xuICAgIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09ICd3b3JkLXByaW50Jykge1xuICAgICAgaWYgKHJlY29yZF9pZCkge1xuICAgICAgICBmaWx0ZXJzID0gWydfaWQnLCAnPScsIHJlY29yZF9pZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJzID0gT2JqZWN0R3JpZC5nZXRGaWx0ZXJzKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIGZhbHNlLCBudWxsLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHVybCA9IFwiL2FwaS92NC93b3JkX3RlbXBsYXRlcy9cIiArIGFjdGlvbi53b3JkX3RlbXBsYXRlICsgXCIvcHJpbnRcIiArIFwiP2ZpbHRlcnM9XCIgKyBTdGVlZG9zRmlsdGVycy5mb3JtYXRGaWx0ZXJzVG9PRGF0YVF1ZXJ5KGZpbHRlcnMpO1xuICAgICAgdXJsID0gU3RlZWRvcy5hYnNvbHV0ZVVybCh1cmwpO1xuICAgICAgcmV0dXJuIHdpbmRvdy5vcGVuKHVybCk7XG4gICAgfVxuICAgIG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICBpZiAoYWN0aW9uICE9IG51bGwgPyBhY3Rpb24udG9kbyA6IHZvaWQgMCkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24udG9kbyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0b2RvID0gQ3JlYXRvci5hY3Rpb25zQnlOYW1lW2FjdGlvbi50b2RvXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFjdGlvbi50b2RvID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdG9kbyA9IGFjdGlvbi50b2RvO1xuICAgICAgfVxuICAgICAgaWYgKCFyZWNvcmQgJiYgb2JqZWN0X25hbWUgJiYgcmVjb3JkX2lkKSB7XG4gICAgICAgIHJlY29yZCA9IENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRvZG8pIHtcbiAgICAgICAgaXRlbV9lbGVtZW50ID0gaXRlbV9lbGVtZW50ID8gaXRlbV9lbGVtZW50IDogXCJcIjtcbiAgICAgICAgbW9yZUFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuICAgICAgICB0b2RvQXJncyA9IFtvYmplY3RfbmFtZSwgcmVjb3JkX2lkXS5jb25jYXQobW9yZUFyZ3MpO1xuICAgICAgICByZXR1cm4gdG9kby5hcHBseSh7XG4gICAgICAgICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgICAgICAgIHJlY29yZF9pZDogcmVjb3JkX2lkLFxuICAgICAgICAgIG9iamVjdDogb2JqLFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICAgIGl0ZW1fZWxlbWVudDogaXRlbV9lbGVtZW50LFxuICAgICAgICAgIHJlY29yZDogcmVjb3JkXG4gICAgICAgIH0sIHRvZG9BcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0b2FzdHIud2FybmluZyh0KFwiX29iamVjdF9hY3Rpb25zX25vbmVfdG9kb1wiKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b2FzdHIud2FybmluZyh0KFwiX29iamVjdF9hY3Rpb25zX25vbmVfdG9kb1wiKSk7XG4gICAgfVxuICB9O1xuICBfZGVsZXRlUmVjb3JkID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3RpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgY2FsbF9iYWNrLCBjYWxsX2JhY2tfZXJyb3IpIHtcbiAgICB2YXIgb2JqZWN0LCBwcmV2aW91c0RvYztcbiAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgcHJldmlvdXNEb2MgPSBGb3JtTWFuYWdlci5nZXRQcmV2aW91c0RvYyhvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCAnZGVsZXRlJyk7XG4gICAgcmV0dXJuIENyZWF0b3Iub2RhdGFbXCJkZWxldGVcIl0ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaW5mbztcbiAgICAgIGlmIChyZWNvcmRfdGl0bGUpIHtcbiAgICAgICAgaW5mbyA9IHQoXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF90aXRsZV9zdWNcIiwgb2JqZWN0LmxhYmVsICsgKFwiXFxcIlwiICsgcmVjb3JkX3RpdGxlICsgXCJcXFwiXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gPSB0KCdjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF9zdWMnKTtcbiAgICAgIH1cbiAgICAgIHRvYXN0ci5zdWNjZXNzKGluZm8pO1xuICAgICAgaWYgKGNhbGxfYmFjayAmJiB0eXBlb2YgY2FsbF9iYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbF9iYWNrKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRm9ybU1hbmFnZXIucnVuSG9vayhvYmplY3RfbmFtZSwgJ2RlbGV0ZScsICdhZnRlcicsIHtcbiAgICAgICAgX2lkOiByZWNvcmRfaWQsXG4gICAgICAgIHByZXZpb3VzRG9jOiBwcmV2aW91c0RvY1xuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgIGlmIChjYWxsX2JhY2tfZXJyb3IgJiYgdHlwZW9mIGNhbGxfYmFja19lcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxfYmFja19lcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEZvcm1NYW5hZ2VyLnJ1bkhvb2sob2JqZWN0X25hbWUsICdkZWxldGUnLCAnZXJyb3InLCB7XG4gICAgICAgIF9pZDogcmVjb3JkX2lkLFxuICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuICBDcmVhdG9yLnJlbGF0ZWRPYmplY3RTdGFuZGFyZE5ldyA9IGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0X25hbWUpIHtcbiAgICB2YXIgY29sbGVjdGlvbiwgY29sbGVjdGlvbl9uYW1lLCBjdXJyZW50X29iamVjdF9uYW1lLCBjdXJyZW50X3JlY29yZF9pZCwgZGVmYXVsdERvYywgZG9jLCBpZHMsIGluaXRpYWxWYWx1ZXMsIHJlY29yZF9pZCwgcmVsYXRlT2JqZWN0O1xuICAgIHJlbGF0ZU9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlbGF0ZWRfb2JqZWN0X25hbWUpO1xuICAgIGNvbGxlY3Rpb25fbmFtZSA9IHJlbGF0ZU9iamVjdC5sYWJlbDtcbiAgICBjb2xsZWN0aW9uID0gXCJDcmVhdG9yLkNvbGxlY3Rpb25zLlwiICsgKENyZWF0b3IuZ2V0T2JqZWN0KHJlbGF0ZWRfb2JqZWN0X25hbWUpLl9jb2xsZWN0aW9uX25hbWUpO1xuICAgIGN1cnJlbnRfb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICAgIGN1cnJlbnRfcmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIik7XG4gICAgaWRzID0gQ3JlYXRvci5UYWJ1bGFyU2VsZWN0ZWRJZHNbcmVsYXRlZF9vYmplY3RfbmFtZV07XG4gICAgaW5pdGlhbFZhbHVlcyA9IHt9O1xuICAgIGlmIChpZHMgIT0gbnVsbCA/IGlkcy5sZW5ndGggOiB2b2lkIDApIHtcbiAgICAgIHJlY29yZF9pZCA9IGlkc1swXTtcbiAgICAgIGRvYyA9IENyZWF0b3Iub2RhdGEuZ2V0KHJlbGF0ZWRfb2JqZWN0X25hbWUsIHJlY29yZF9pZCk7XG4gICAgICBpbml0aWFsVmFsdWVzID0gZG9jO1xuICAgICAgU2Vzc2lvbi5zZXQoJ2NtU2hvd0FnYWluRHVwbGljYXRlZCcsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0RG9jID0gRm9ybU1hbmFnZXIuZ2V0UmVsYXRlZEluaXRpYWxWYWx1ZXMoY3VycmVudF9vYmplY3RfbmFtZSwgY3VycmVudF9yZWNvcmRfaWQsIHJlbGF0ZWRfb2JqZWN0X25hbWUpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdERvYykpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlcyA9IGRlZmF1bHREb2M7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgocmVsYXRlT2JqZWN0ICE9IG51bGwgPyByZWxhdGVPYmplY3QudmVyc2lvbiA6IHZvaWQgMCkgPj0gMikge1xuICAgICAgcmV0dXJuIFN0ZWVkb3NVSS5zaG93TW9kYWwoc3RvcmVzLkNvbXBvbmVudFJlZ2lzdHJ5LmNvbXBvbmVudHMuT2JqZWN0Rm9ybSwge1xuICAgICAgICBuYW1lOiByZWxhdGVkX29iamVjdF9uYW1lICsgXCJfc3RhbmRhcmRfbmV3X2Zvcm1cIixcbiAgICAgICAgb2JqZWN0QXBpTmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSxcbiAgICAgICAgdGl0bGU6ICfmlrDlu7ogJyArIHJlbGF0ZU9iamVjdC5sYWJlbCxcbiAgICAgICAgaW5pdGlhbFZhbHVlczogaW5pdGlhbFZhbHVlcyxcbiAgICAgICAgYWZ0ZXJJbnNlcnQ6IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoQ3JlYXRvci5nZXRPYmplY3QoY3VycmVudF9vYmplY3RfbmFtZSkudmVyc2lvbiA+IDEpIHtcbiAgICAgICAgICAgICAgU3RlZWRvc1VJLnJlbG9hZFJlY29yZChjdXJyZW50X29iamVjdF9uYW1lLCBjdXJyZW50X3JlY29yZF9pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRmxvd1JvdXRlci5yZWxvYWQoKTtcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSwgbnVsbCwge1xuICAgICAgICBpY29uUGF0aDogJy9hc3NldHMvaWNvbnMnXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGlkcyAhPSBudWxsID8gaWRzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgU2Vzc2lvbi5zZXQoJ2NtRG9jJywgaW5pdGlhbFZhbHVlcyk7XG4gICAgICBTZXNzaW9uLnNldCgnY21TaG93QWdhaW5EdXBsaWNhdGVkJywgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0VtcHR5KGluaXRpYWxWYWx1ZXMpKSB7XG4gICAgICAgIFNlc3Npb24uc2V0KCdjbURvYycsIGluaXRpYWxWYWx1ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBTZXNzaW9uLnNldChcImFjdGlvbl9maWVsZHNcIiwgdm9pZCAwKTtcbiAgICBTZXNzaW9uLnNldChcImFjdGlvbl9jb2xsZWN0aW9uXCIsIGNvbGxlY3Rpb24pO1xuICAgIFNlc3Npb24uc2V0KFwiYWN0aW9uX2NvbGxlY3Rpb25fbmFtZVwiLCBjb2xsZWN0aW9uX25hbWUpO1xuICAgIFNlc3Npb24uc2V0KFwiYWN0aW9uX3NhdmVfYW5kX2luc2VydFwiLCBmYWxzZSk7XG4gICAgTWV0ZW9yLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICQoXCIuY3JlYXRvci1hZGQtcmVsYXRlZFwiKS5jbGljaygpO1xuICAgIH0pO1xuICB9O1xuICBDcmVhdG9yLmFjdGlvbnMoe1xuICAgIFwic3RhbmRhcmRfcXVlcnlcIjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gTW9kYWwuc2hvdyhcInN0YW5kYXJkX3F1ZXJ5X21vZGFsXCIpO1xuICAgIH0sXG4gICAgXCJzdGFuZGFyZF9uZXdcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZmllbGRzKSB7XG4gICAgICB2YXIgZ3JpZE5hbWUsIGluaXRpYWxWYWx1ZXMsIGlzUmVsYXRlZCwgbWFzdGVyUmVjb3JkSWQsIG9iamVjdCwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWxhdGVkRmllbGROYW1lLCBzZWxlY3RlZFJvd3M7XG4gICAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgICBncmlkTmFtZSA9IHRoaXMuYWN0aW9uLmdyaWROYW1lO1xuICAgICAgaXNSZWxhdGVkID0gdGhpcy5hY3Rpb24uaXNSZWxhdGVkO1xuICAgICAgaWYgKGlzUmVsYXRlZCkge1xuICAgICAgICByZWxhdGVkRmllbGROYW1lID0gdGhpcy5hY3Rpb24ucmVsYXRlZEZpZWxkTmFtZTtcbiAgICAgICAgbWFzdGVyUmVjb3JkSWQgPSB0aGlzLmFjdGlvbi5tYXN0ZXJSZWNvcmRJZDtcbiAgICAgICAgaW5pdGlhbFZhbHVlcyA9IHRoaXMuYWN0aW9uLmluaXRpYWxWYWx1ZXM7XG4gICAgICAgIGlmICghaW5pdGlhbFZhbHVlcykge1xuICAgICAgICAgIGluaXRpYWxWYWx1ZXMgPSB7fTtcbiAgICAgICAgICBpbml0aWFsVmFsdWVzW3JlbGF0ZWRGaWVsZE5hbWVdID0gbWFzdGVyUmVjb3JkSWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZXMgPSB7fTtcbiAgICAgICAgaWYgKGdyaWROYW1lKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dzID0gKHJlZiA9IHdpbmRvdy5ncmlkUmVmcykgIT0gbnVsbCA/IChyZWYxID0gcmVmW2dyaWROYW1lXS5jdXJyZW50KSAhPSBudWxsID8gKHJlZjIgPSByZWYxLmFwaSkgIT0gbnVsbCA/IHJlZjIuZ2V0U2VsZWN0ZWRSb3dzKCkgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dzID0gKHJlZjMgPSB3aW5kb3cuZ3JpZFJlZikgIT0gbnVsbCA/IChyZWY0ID0gcmVmMy5jdXJyZW50KSAhPSBudWxsID8gKHJlZjUgPSByZWY0LmFwaSkgIT0gbnVsbCA/IHJlZjUuZ2V0U2VsZWN0ZWRSb3dzKCkgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkUm93cyAhPSBudWxsID8gc2VsZWN0ZWRSb3dzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgICAgIHJlY29yZF9pZCA9IHNlbGVjdGVkUm93c1swXS5faWQ7XG4gICAgICAgICAgaWYgKHJlY29yZF9pZCkge1xuICAgICAgICAgICAgaW5pdGlhbFZhbHVlcyA9IENyZWF0b3Iub2RhdGEuZ2V0KG9iamVjdF9uYW1lLCByZWNvcmRfaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbml0aWFsVmFsdWVzID0gRm9ybU1hbmFnZXIuZ2V0SW5pdGlhbFZhbHVlcyhvYmplY3RfbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICgob2JqZWN0ICE9IG51bGwgPyBvYmplY3QudmVyc2lvbiA6IHZvaWQgMCkgPj0gMikge1xuICAgICAgICByZXR1cm4gU3RlZWRvcy5QYWdlLkZvcm0uU3RhbmRhcmROZXcucmVuZGVyKFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpLCBvYmplY3RfbmFtZSwgdCgnTmV3JykgKyAnICcgKyBvYmplY3QubGFiZWwsIGluaXRpYWxWYWx1ZXMsIHtcbiAgICAgICAgICBncmlkTmFtZTogZ3JpZE5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBTZXNzaW9uLnNldCgnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWUpO1xuICAgICAgaWYgKHNlbGVjdGVkUm93cyAhPSBudWxsID8gc2VsZWN0ZWRSb3dzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgICBTZXNzaW9uLnNldCgnY21Eb2MnLCBpbml0aWFsVmFsdWVzKTtcbiAgICAgICAgU2Vzc2lvbi5zZXQoJ2NtU2hvd0FnYWluRHVwbGljYXRlZCcsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU2Vzc2lvbi5zZXQoJ2NtRG9jJywgaW5pdGlhbFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBNZXRlb3IuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAkKFwiLmNyZWF0b3ItYWRkXCIpLmNsaWNrKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFwic3RhbmRhcmRfb3Blbl92aWV3XCI6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGZpZWxkcykge1xuICAgICAgdmFyIGhyZWY7XG4gICAgICBocmVmID0gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCk7XG4gICAgICBGbG93Um91dGVyLnJlZGlyZWN0KGhyZWYpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgXCJzdGFuZGFyZF9lZGl0XCI6IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGZpZWxkcykge1xuICAgICAgdmFyIG9iamVjdDtcbiAgICAgIGlmIChyZWNvcmRfaWQpIHtcbiAgICAgICAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgICAgICBpZiAoKG9iamVjdCAhPSBudWxsID8gb2JqZWN0LnZlcnNpb24gOiB2b2lkIDApID49IDIpIHtcbiAgICAgICAgICByZXR1cm4gU3RlZWRvcy5QYWdlLkZvcm0uU3RhbmRhcmRFZGl0LnJlbmRlcihTZXNzaW9uLmdldChcImFwcF9pZFwiKSwgb2JqZWN0X25hbWUsIHQoJ0VkaXQnKSArICcgJyArIG9iamVjdC5sYWJlbCwgcmVjb3JkX2lkLCB7XG4gICAgICAgICAgICBncmlkTmFtZTogdGhpcy5hY3Rpb24uZ3JpZE5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpICYmIGZhbHNlKSB7XG4gICAgICAgICAgU2Vzc2lvbi5zZXQoJ2FjdGlvbl9vYmplY3RfbmFtZScsIG9iamVjdF9uYW1lKTtcbiAgICAgICAgICBTZXNzaW9uLnNldCgnYWN0aW9uX3JlY29yZF9pZCcsIHJlY29yZF9pZCk7XG4gICAgICAgICAgaWYgKHRoaXMucmVjb3JkKSB7XG4gICAgICAgICAgICBTZXNzaW9uLnNldCgnY21Eb2MnLCB0aGlzLnJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBNZXRlb3IuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gJChcIi5idG4tZWRpdC1yZWNvcmRcIikuY2xpY2soKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBTZXNzaW9uLnNldCgnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWUpO1xuICAgICAgICAgIFNlc3Npb24uc2V0KCdhY3Rpb25fcmVjb3JkX2lkJywgcmVjb3JkX2lkKTtcbiAgICAgICAgICBpZiAodGhpcy5yZWNvcmQpIHtcbiAgICAgICAgICAgIFNlc3Npb24uc2V0KCdjbURvYycsIHRoaXMucmVjb3JkKTtcbiAgICAgICAgICAgIHJldHVybiBNZXRlb3IuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiAkKFwiLmJ0bi5jcmVhdG9yLWVkaXRcIikuY2xpY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJzdGFuZGFyZF9kZWxldGVcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3RpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgY2FsbF9iYWNrKSB7XG4gICAgICB2YXIgYmVmb3JlSG9vaywgZ3JpZE5hbWUsIGkxOG5UZXh0S2V5LCBpMThuVGl0bGVLZXksIG5hbWVGaWVsZCwgb2JqZWN0LCBzZWxlY3RlZFJlY29yZHMsIHRleHQ7XG4gICAgICBncmlkTmFtZSA9IHRoaXMuYWN0aW9uLmdyaWROYW1lO1xuICAgICAgaWYgKHJlY29yZF9pZCkge1xuICAgICAgICBiZWZvcmVIb29rID0gRm9ybU1hbmFnZXIucnVuSG9vayhvYmplY3RfbmFtZSwgJ2RlbGV0ZScsICdiZWZvcmUnLCB7XG4gICAgICAgICAgX2lkOiByZWNvcmRfaWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYmVmb3JlSG9vaykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgICAgbmFtZUZpZWxkID0gb2JqZWN0Lk5BTUVfRklFTERfS0VZIHx8IFwibmFtZVwiO1xuICAgICAgaWYgKCFsaXN0X3ZpZXdfaWQpIHtcbiAgICAgICAgbGlzdF92aWV3X2lkID0gU2Vzc2lvbi5nZXQoXCJsaXN0X3ZpZXdfaWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoIWxpc3Rfdmlld19pZCkge1xuICAgICAgICBsaXN0X3ZpZXdfaWQgPSBcImFsbFwiO1xuICAgICAgfVxuICAgICAgaWYgKCFfLmlzU3RyaW5nKHJlY29yZF90aXRsZSkgJiYgcmVjb3JkX3RpdGxlKSB7XG4gICAgICAgIHJlY29yZF90aXRsZSA9IHJlY29yZF90aXRsZVtuYW1lRmllbGRdO1xuICAgICAgfVxuICAgICAgaWYgKHJlY29yZCAmJiAhcmVjb3JkX3RpdGxlKSB7XG4gICAgICAgIHJlY29yZF90aXRsZSA9IHJlY29yZFtuYW1lRmllbGRdO1xuICAgICAgfVxuICAgICAgaTE4blRpdGxlS2V5ID0gXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF90aXRsZVwiO1xuICAgICAgaTE4blRleHRLZXkgPSBcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3RleHRcIjtcbiAgICAgIGlmICghcmVjb3JkX2lkKSB7XG4gICAgICAgIGkxOG5UaXRsZUtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX21hbnlfc3dhbF90aXRsZVwiO1xuICAgICAgICBpMThuVGV4dEtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX21hbnlfc3dhbF90ZXh0XCI7XG4gICAgICAgIHNlbGVjdGVkUmVjb3JkcyA9IFN0ZWVkb3NVSS5nZXRUYWJsZVNlbGVjdGVkUm93cyhncmlkTmFtZSB8fCBsaXN0X3ZpZXdfaWQpO1xuICAgICAgICBpZiAoIXNlbGVjdGVkUmVjb3JkcyB8fCAhc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgICAgIHRvYXN0ci53YXJuaW5nKHQoXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfbWFueV9ub19zZWxlY3Rpb25cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlY29yZF90aXRsZSkge1xuICAgICAgICB0ZXh0ID0gdChpMThuVGV4dEtleSwgb2JqZWN0LmxhYmVsICsgXCIgXFxcIlwiICsgcmVjb3JkX3RpdGxlICsgXCJcXFwiXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IHQoaTE4blRleHRLZXksIFwiXCIgKyBvYmplY3QubGFiZWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN3YWwoe1xuICAgICAgICB0aXRsZTogdChpMThuVGl0bGVLZXksIFwiXCIgKyBvYmplY3QubGFiZWwpLFxuICAgICAgICB0ZXh0OiBcIjxkaXYgY2xhc3M9J2RlbGV0ZS1jcmVhdG9yLXdhcm5pbmcnPlwiICsgdGV4dCArIFwiPC9kaXY+XCIsXG4gICAgICAgIGh0bWw6IHRydWUsXG4gICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0KCdEZWxldGUnKSxcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogdCgnQ2FuY2VsJylcbiAgICAgIH0sIGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICB2YXIgYWZ0ZXJCYXRjaGVzRGVsZXRlLCBkZWxldGVDb3VudGVyO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKHJlY29yZF9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9kZWxldGVSZWNvcmQob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3RpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHZhciBfZSwgYXBwaWQsIGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkLCBkeERhdGFHcmlkSW5zdGFuY2UsIGdyaWRDb250YWluZXIsIGdyaWRPYmplY3ROYW1lQ2xhc3MsIGlzT3BlbmVyUmVtb3ZlLCByZWNvcmRVcmwsIHJlZiwgdGVtcE5hdlJlbW92ZWQ7XG4gICAgICAgICAgICAgIGdyaWRPYmplY3ROYW1lQ2xhc3MgPSBvYmplY3RfbmFtZS5yZXBsYWNlKC9cXC4vZywgXCItXCIpO1xuICAgICAgICAgICAgICBncmlkQ29udGFpbmVyID0gJChcIi5ncmlkQ29udGFpbmVyLlwiICsgZ3JpZE9iamVjdE5hbWVDbGFzcyk7XG4gICAgICAgICAgICAgIGlmICghKGdyaWRDb250YWluZXIgIT0gbnVsbCA/IGdyaWRDb250YWluZXIubGVuZ3RoIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XG4gICAgICAgICAgICAgICAgICBpc09wZW5lclJlbW92ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgZ3JpZENvbnRhaW5lciA9IHdpbmRvdy5vcGVuZXIuJChcIi5ncmlkQ29udGFpbmVyLlwiICsgZ3JpZE9iamVjdE5hbWVDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY3VycmVudF9vYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgICAgICAgICAgICAgY3VycmVudF9yZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9vYmplY3RfbmFtZSAmJiAoKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KGN1cnJlbnRfb2JqZWN0X25hbWUpKSAhPSBudWxsID8gcmVmLnZlcnNpb24gOiB2b2lkIDApID4gMSkge1xuICAgICAgICAgICAgICAgICAgU3RlZWRvc1VJLnJlbG9hZFJlY29yZChjdXJyZW50X29iamVjdF9uYW1lLCBjdXJyZW50X3JlY29yZF9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChGbG93Um91dGVyLmN1cnJlbnQoKS5yb3V0ZS5wYXRoLmVuZHNXaXRoKFwiLzpyZWNvcmRfaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RfbmFtZSAhPT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBGbG93Um91dGVyLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB3aW5kb3cucmVmcmVzaEdyaWQoZ3JpZE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgICAgICAgX2UgPSBlcnJvcjE7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihfZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGdyaWRDb250YWluZXIgIT0gbnVsbCA/IGdyaWRDb250YWluZXIubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5lbmFibGVfdHJlZSkge1xuICAgICAgICAgICAgICAgICAgZHhEYXRhR3JpZEluc3RhbmNlID0gZ3JpZENvbnRhaW5lci5keFRyZWVMaXN0KCkuZHhUcmVlTGlzdCgnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZHhEYXRhR3JpZEluc3RhbmNlID0gZ3JpZENvbnRhaW5lci5keERhdGFHcmlkKCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGR4RGF0YUdyaWRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZW5hYmxlX3RyZWUpIHtcbiAgICAgICAgICAgICAgICAgIGR4RGF0YUdyaWRJbnN0YW5jZS5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RfbmFtZSAhPT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBGbG93Um91dGVyLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWNvcmRVcmwgPSBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkKTtcbiAgICAgICAgICAgICAgdGVtcE5hdlJlbW92ZWQgPSBDcmVhdG9yLnJlbW92ZVRlbXBOYXZJdGVtKG9iamVjdF9uYW1lLCByZWNvcmRVcmwpO1xuICAgICAgICAgICAgICBpZiAoaXNPcGVuZXJSZW1vdmUgfHwgIWR4RGF0YUdyaWRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09wZW5lclJlbW92ZSkge1xuICAgICAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRfaWQgPT09IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpICYmIGxpc3Rfdmlld19pZCAhPT0gJ2NhbGVuZGFyJykge1xuICAgICAgICAgICAgICAgICAgYXBwaWQgPSBTZXNzaW9uLmdldChcImFwcF9pZFwiKTtcbiAgICAgICAgICAgICAgICAgIGlmICghdGVtcE5hdlJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgRmxvd1JvdXRlci5nbyhcIi9hcHAvXCIgKyBhcHBpZCArIFwiL1wiICsgb2JqZWN0X25hbWUgKyBcIi9ncmlkL1wiICsgbGlzdF92aWV3X2lkKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNhbGxfYmFjayAmJiB0eXBlb2YgY2FsbF9iYWNrID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbF9iYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRSZWNvcmRzICYmIHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgICAgICAgICBkZWxldGVDb3VudGVyID0gMDtcbiAgICAgICAgICAgICAgYWZ0ZXJCYXRjaGVzRGVsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnRlcisrO1xuICAgICAgICAgICAgICAgIGlmIChkZWxldGVDb3VudGVyID49IHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwibG9hZGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucmVmcmVzaEdyaWQoZ3JpZE5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uKHJlY29yZCkge1xuICAgICAgICAgICAgICAgIHZhciByZWNvcmRUaXRsZTtcbiAgICAgICAgICAgICAgICByZWNvcmRfaWQgPSByZWNvcmQuX2lkO1xuICAgICAgICAgICAgICAgIGJlZm9yZUhvb2sgPSBGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2JlZm9yZScsIHtcbiAgICAgICAgICAgICAgICAgIF9pZDogcmVjb3JkX2lkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFiZWZvcmVIb29rKSB7XG4gICAgICAgICAgICAgICAgICBhZnRlckJhdGNoZXNEZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjb3JkVGl0bGUgPSByZWNvcmRbbmFtZUZpZWxkXSB8fCByZWNvcmRfaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWxldGVSZWNvcmQob2JqZWN0X25hbWUsIHJlY29yZC5faWQsIHJlY29yZFRpdGxlLCBsaXN0X3ZpZXdfaWQsIHJlY29yZCwgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlY29yZFVybDtcbiAgICAgICAgICAgICAgICAgIHJlY29yZFVybCA9IENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQpO1xuICAgICAgICAgICAgICAgICAgQ3JlYXRvci5yZW1vdmVUZW1wTmF2SXRlbShvYmplY3RfbmFtZSwgcmVjb3JkVXJsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhZnRlckJhdGNoZXNEZWxldGUoKTtcbiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXJCYXRjaGVzRGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xvYWRTdGFuZGFyZE9iamVjdHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9sb2FkU3RhbmRhcmRPYmplY3RzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2NvcmVTdXBwb3J0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvY29yZVN1cHBvcnQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvc2VydmVyL21ldGhvZHMvb2JqZWN0X29wdGlvbnMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9vYmplY3Rfb3B0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvbGlzdHZpZXdzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2xpc3R2aWV3cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvYWRkX3NpbXBsZV9zY2hlbWFfdmFsaWRhdGlvbl9lcnJvci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hZGRfc2ltcGxlX3NjaGVtYV92YWxpZGF0aW9uX2Vycm9yLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9maWVsZF9zaW1wbGVfc2NoZW1hX3ZhbGlkYXRpb25fZXJyb3IuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvZmllbGRfc2ltcGxlX3NjaGVtYV92YWxpZGF0aW9uX2Vycm9yLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpvYmplY3RzL2xpYi9ldmFsLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL2NvbnZlcnQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvY29udmVydC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvZm9ybXVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvZm9ybXVsYXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL29iamVjdC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9vYmplY3QuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL2ZpZWxkcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9maWVsZHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX29iamVjdHMvbGliL3RyaWdnZXJzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL3RyaWdnZXJzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9wZXJtaXNzaW9uX3NldHMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvcGVybWlzc2lvbl9zZXRzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzL2xpYi9jb2xsZWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9jb2xsZWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3Nfb2JqZWN0cy9saWIvYWN0aW9ucy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hY3Rpb25zLmNvZmZlZSJdLCJuYW1lcyI6WyJkYiIsIkNyZWF0b3IiLCJPYmplY3RzIiwiQ29sbGVjdGlvbnMiLCJNZW51cyIsIkFwcHMiLCJEYXNoYm9hcmRzIiwiUmVwb3J0cyIsInN1YnMiLCJzdGVlZG9zU2NoZW1hIiwiQVBJU2VydmljZSIsIk1ldGFkYXRhU2VydmljZSIsImNvbmZpZyIsImUiLCJtb2xlY3VsZXIiLCJvYmplY3RxbCIsInBhY2thZ2VMb2FkZXIiLCJwYWNrYWdlU2VydmljZSIsInBhdGgiLCJzZXR0aW5ncyIsInN0ZWVkb3NDb3JlIiwicHJvY2VzcyIsImVudiIsIkNSRUFUT1JfTk9ERV9FTlYiLCJyZXF1aXJlIiwiZ2V0U3RlZWRvc0NvbmZpZyIsImJ1aWx0X2luX3BsdWdpbnMiLCJwbHVnaW5zIiwiTWV0ZW9yIiwic3RhcnR1cCIsImFwaVNlcnZpY2UiLCJicm9rZXIiLCJleCIsIm1ldGFkYXRhU2VydmljZSIsIm9iamVjdHFsU2VydmljZSIsInBhZ2VTZXJ2aWNlIiwicHJvamVjdFNlcnZpY2UiLCJzdGFuZGFyZE9iamVjdHNEaXIiLCJzdGFuZGFyZE9iamVjdHNQYWNrYWdlTG9hZGVyU2VydmljZSIsInN0ZWVkb3NTZXJ2aWNlIiwidWlTZXJ2aWNlIiwiU2VydmljZUJyb2tlciIsIm5hbWVzcGFjZSIsIm5vZGVJRCIsIm1ldGFkYXRhIiwidHJhbnNwb3J0ZXIiLCJUUkFOU1BPUlRFUiIsImNhY2hlciIsIkNBQ0hFUiIsImxvZ0xldmVsIiwic2VyaWFsaXplciIsInJlcXVlc3RUaW1lb3V0IiwibWF4Q2FsbExldmVsIiwiaGVhcnRiZWF0SW50ZXJ2YWwiLCJoZWFydGJlYXRUaW1lb3V0IiwiY29udGV4dFBhcmFtc0Nsb25pbmciLCJ0cmFja2luZyIsImVuYWJsZWQiLCJzaHV0ZG93blRpbWVvdXQiLCJkaXNhYmxlQmFsYW5jZXIiLCJyZWdpc3RyeSIsInN0cmF0ZWd5IiwicHJlZmVyTG9jYWwiLCJidWxraGVhZCIsImNvbmN1cnJlbmN5IiwibWF4UXVldWVTaXplIiwidmFsaWRhdG9yIiwiZXJyb3JIYW5kbGVyIiwidHJhY2luZyIsImV4cG9ydGVyIiwidHlwZSIsIm9wdGlvbnMiLCJsb2dnZXIiLCJjb2xvcnMiLCJ3aWR0aCIsImdhdWdlV2lkdGgiLCJza2lwUHJvY2Vzc0V2ZW50UmVnaXN0cmF0aW9uIiwiY3JlYXRlZCIsIndhcm4iLCJjbGVhbiIsImluaXQiLCJjcmVhdGVTZXJ2aWNlIiwibmFtZSIsIm1peGlucyIsInBvcnQiLCJzdGFydGVkIiwic2V0VGltZW91dCIsImVtaXQiLCJnZXRTdGVlZG9zU2NoZW1hIiwiU3RhbmRhcmRPYmplY3RzUGF0aCIsInBhY2thZ2VJbmZvIiwid3JhcEFzeW5jIiwiY2IiLCJzdGFydCIsInRoZW4iLCJjb25uZWN0SGFuZGxlcnNFeHByZXNzIiwiZXhwcmVzcyIsIl9yZXN0YXJ0U2VydmljZSIsInVzZSIsInN0YXRpY1JvdXRlciIsIndhaXRGb3JTZXJ2aWNlcyIsImNvbnNvbGUiLCJsb2ciLCJTdGVlZG9zQXBpIiwiV2ViQXBwIiwiY29ubmVjdEhhbmRsZXJzIiwicmVzb2x2ZSIsInJlamVjdCIsImVycm9yIiwiRmliZXIiLCJkZXBzIiwiYXBwIiwiVHJhY2tlciIsIkRlcGVuZGVuY3kiLCJvYmplY3QiLCJfVEVNUExBVEUiLCJTaW1wbGVTY2hlbWEiLCJleHRlbmRPcHRpb25zIiwiZmlsdGVyc0Z1bmN0aW9uIiwiTWF0Y2giLCJPcHRpb25hbCIsIk9uZU9mIiwiRnVuY3Rpb24iLCJTdHJpbmciLCJvcHRpb25zRnVuY3Rpb24iLCJjcmVhdGVGdW5jdGlvbiIsImlzU2VydmVyIiwiZmliZXJMb2FkT2JqZWN0cyIsIm9iaiIsIm9iamVjdF9uYW1lIiwibG9hZE9iamVjdHMiLCJydW4iLCJsaXN0X3ZpZXdzIiwic3BhY2UiLCJnZXRDb2xsZWN0aW9uTmFtZSIsIl8iLCJjbG9uZSIsImNvbnZlcnRPYmplY3QiLCJPYmplY3QiLCJpbml0VHJpZ2dlcnMiLCJpbml0TGlzdFZpZXdzIiwiZ2V0T2JqZWN0TmFtZSIsImdldE9iamVjdCIsInNwYWNlX2lkIiwicmVmIiwicmVmMSIsImlzQXJyYXkiLCJpc0NsaWVudCIsImRlcGVuZCIsIlNlc3Npb24iLCJnZXQiLCJvYmplY3RzQnlOYW1lIiwiZ2V0T2JqZWN0QnlJZCIsIm9iamVjdF9pZCIsImZpbmRXaGVyZSIsIl9pZCIsInJlbW92ZU9iamVjdCIsImdldENvbGxlY3Rpb24iLCJzcGFjZUlkIiwiX2NvbGxlY3Rpb25fbmFtZSIsInJlbW92ZUNvbGxlY3Rpb24iLCJpc1NwYWNlQWRtaW4iLCJ1c2VySWQiLCJmaW5kT25lIiwiZmllbGRzIiwiYWRtaW5zIiwiaW5kZXhPZiIsImV2YWx1YXRlRm9ybXVsYSIsImZvcm11bGFyIiwiY29udGV4dCIsImlzU3RyaW5nIiwiRm9ybXVsYXIiLCJjaGVja0Zvcm11bGEiLCJldmFsdWF0ZUZpbHRlcnMiLCJmaWx0ZXJzIiwic2VsZWN0b3IiLCJlYWNoIiwiZmlsdGVyIiwiYWN0aW9uIiwidmFsdWUiLCJsZW5ndGgiLCJpc0NvbW1vblNwYWNlIiwiZ2V0T3JkZXJseVNldEJ5SWRzIiwiZG9jcyIsImlkcyIsImlkX2tleSIsImhpdF9maXJzdCIsInZhbHVlcyIsImdldFByb3BlcnR5Iiwic29ydEJ5IiwiZG9jIiwiX2luZGV4IiwidiIsInNvcnRpbmdNZXRob2QiLCJ2YWx1ZTEiLCJ2YWx1ZTIiLCJpc1ZhbHVlMUVtcHR5IiwiaXNWYWx1ZTJFbXB0eSIsImxvY2FsZSIsImtleSIsIkRhdGUiLCJnZXRUaW1lIiwiU3RlZWRvcyIsInRvU3RyaW5nIiwibG9jYWxlQ29tcGFyZSIsImdldE9iamVjdFJlbGF0ZWRzIiwiX29iamVjdCIsInBlcm1pc3Npb25zIiwicmVsYXRlZExpc3QiLCJyZWxhdGVkTGlzdE1hcCIsInJlbGF0ZWRfb2JqZWN0cyIsImlzRW1wdHkiLCJvYmpOYW1lIiwiaXNPYmplY3QiLCJvYmplY3ROYW1lIiwicmVsYXRlZF9vYmplY3QiLCJyZWxhdGVkX29iamVjdF9uYW1lIiwicmVsYXRlZF9maWVsZCIsInJlbGF0ZWRfZmllbGRfbmFtZSIsInJlZmVyZW5jZV90byIsImZvcmVpZ25fa2V5Iiwid3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQiLCJlbmFibGVPYmpOYW1lIiwiZ2V0UGVybWlzc2lvbnMiLCJlbmFibGVfYXVkaXQiLCJtb2RpZnlBbGxSZWNvcmRzIiwiZW5hYmxlX2ZpbGVzIiwicHVzaCIsInNmc0ZpbGVzT2JqZWN0Iiwic3BsaWNlIiwiZW5hYmxlX3Rhc2tzIiwiZW5hYmxlX25vdGVzIiwiZW5hYmxlX2V2ZW50cyIsImVuYWJsZV9pbnN0YW5jZXMiLCJlbmFibGVfYXBwcm92YWxzIiwiZW5hYmxlX3Byb2Nlc3MiLCJnZXRVc2VyQ29udGV4dCIsImlzVW5TYWZlTW9kZSIsIlVTRVJfQ09OVEVYVCIsInNwYWNlX3VzZXJfb3JnIiwic3UiLCJzdUZpZWxkcyIsIkVycm9yIiwibW9iaWxlIiwicG9zaXRpb24iLCJlbWFpbCIsImNvbXBhbnkiLCJvcmdhbml6YXRpb24iLCJjb21wYW55X2lkIiwiY29tcGFueV9pZHMiLCJ1c2VyIiwiZnVsbG5hbWUiLCJnZXRSZWxhdGl2ZVVybCIsInVybCIsImlzRnVuY3Rpb24iLCJpc0NvcmRvdmEiLCJzdGFydHNXaXRoIiwidGVzdCIsIl9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18iLCJST09UX1VSTF9QQVRIX1BSRUZJWCIsImdldFVzZXJDb21wYW55SWQiLCJnZXRVc2VyQ29tcGFueUlkcyIsInByb2Nlc3NQZXJtaXNzaW9ucyIsInBvIiwiYWxsb3dDcmVhdGUiLCJhbGxvd1JlYWQiLCJhbGxvd0VkaXQiLCJhbGxvd0RlbGV0ZSIsInZpZXdBbGxSZWNvcmRzIiwidmlld0NvbXBhbnlSZWNvcmRzIiwibW9kaWZ5Q29tcGFueVJlY29yZHMiLCJhbGxvd1JlYWRGaWxlcyIsInZpZXdBbGxGaWxlcyIsImFsbG93Q3JlYXRlRmlsZXMiLCJhbGxvd0VkaXRGaWxlcyIsImFsbG93RGVsZXRlRmlsZXMiLCJtb2RpZnlBbGxGaWxlcyIsImdldFRlbXBsYXRlU3BhY2VJZCIsInRlbXBsYXRlU3BhY2VJZCIsImdldENsb3VkQWRtaW5TcGFjZUlkIiwiY2xvdWRBZG1pblNwYWNlSWQiLCJpc1RlbXBsYXRlU3BhY2UiLCJpc0Nsb3VkQWRtaW5TcGFjZSIsInN0ZWVkb3NTdG9yYWdlRGlyIiwiU1RFRURPU19TVE9SQUdFX0RJUiIsIm1ldGhvZHMiLCJjb2xsZWN0aW9uIiwibmFtZV9maWVsZF9rZXkiLCJvcHRpb25zX2xpbWl0IiwicXVlcnkiLCJxdWVyeV9vcHRpb25zIiwicmVjb3JkcyIsInJlc3VsdHMiLCJzZWFyY2hUZXh0UXVlcnkiLCJzZWxlY3RlZCIsInNvcnQiLCJwYXJhbXMiLCJOQU1FX0ZJRUxEX0tFWSIsInNlYXJjaFRleHQiLCIkcmVnZXgiLCIkb3IiLCIkaW4iLCJleHRlbmQiLCIkbmluIiwiZmlsdGVyUXVlcnkiLCJsaW1pdCIsImZpbmQiLCJmZXRjaCIsInJlY29yZCIsImxhYmVsIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXRJbml0V2lkdGhQZXJjZW50IiwiY29sdW1ucyIsIl9zY2hlbWEiLCJjb2x1bW5fbnVtIiwiaW5pdF93aWR0aF9wZXJjZW50IiwiZ2V0U2NoZW1hIiwiZmllbGRfbmFtZSIsImZpZWxkIiwiaXNfd2lkZSIsInJlZjIiLCJwaWNrIiwiYXV0b2Zvcm0iLCJnZXRGaWVsZElzV2lkZSIsImdldFRhYnVsYXJPcmRlciIsImxpc3Rfdmlld19pZCIsInNldHRpbmciLCJyZWNvcmRfaWQiLCJtYXAiLCJjb2x1bW4iLCJoaWRkZW4iLCJjb21wYWN0Iiwib3JkZXIiLCJpbmRleCIsImRlZmF1bHRfZXh0cmFfY29sdW1ucyIsImV4dHJhX2NvbHVtbnMiLCJnZXRPYmplY3REZWZhdWx0Q29sdW1ucyIsImdldE9iamVjdERlZmF1bHRFeHRyYUNvbHVtbnMiLCJ1bmlvbiIsImdldE9iamVjdERlZmF1bHRTb3J0IiwiVGFidWxhclNlbGVjdGVkSWRzIiwiY29udmVydExpc3RWaWV3IiwiZGVmYXVsdF92aWV3IiwibGlzdF92aWV3IiwibGlzdF92aWV3X25hbWUiLCJkZWZhdWx0X2NvbHVtbnMiLCJkZWZhdWx0X21vYmlsZV9jb2x1bW5zIiwib2l0ZW0iLCJtb2JpbGVfY29sdW1ucyIsImhhcyIsImluY2x1ZGUiLCJmaWx0ZXJfc2NvcGUiLCJwYXJzZSIsImZvckVhY2giLCJfdmFsdWUiLCJnZXRSZWxhdGVkTGlzdCIsImxheW91dFJlbGF0ZWRMaXN0IiwibGlzdCIsIm1hcExpc3QiLCJvYmplY3RMYXlvdXRSZWxhdGVkTGlzdE9iamVjdHMiLCJyZWxhdGVkTGlzdE5hbWVzIiwicmVsYXRlZExpc3RPYmplY3RzIiwicmVsYXRlZF9vYmplY3RfbmFtZXMiLCJ1bnJlbGF0ZWRfb2JqZWN0cyIsInJlbGF0ZWRfbGlzdHMiLCJpdGVtIiwicmVGaWVsZE5hbWUiLCJyZU9iamVjdE5hbWUiLCJyZWxhdGVkIiwicmVsYXRlZF9maWVsZF9mdWxsbmFtZSIsInNwbGl0IiwiZmllbGRfbmFtZXMiLCJpc19maWxlIiwiY3VzdG9tUmVsYXRlZExpc3RPYmplY3QiLCJhY3Rpb25zIiwiYnV0dG9ucyIsInZpc2libGVfb24iLCJwYWdlX3NpemUiLCJvYmpPck5hbWUiLCJnZXRSZWxhdGVkT2JqZWN0cyIsInJlbGF0ZWRfb2JqZWN0X2l0ZW0iLCJyZWxhdGVkT2JqZWN0IiwidGFidWxhcl9vcmRlciIsImdldE9iamVjdEZpcnN0TGlzdFZpZXdDb2x1bW5zIiwid2l0aG91dCIsInRyYW5zZm9ybVNvcnRUb1RhYnVsYXIiLCJyZXBsYWNlIiwicGx1Y2siLCJkaWZmZXJlbmNlIiwiaXNBY3RpdmUiLCJhbGxvd19yZWxhdGVkTGlzdCIsImdldE9iamVjdEZpcnN0TGlzdFZpZXciLCJmaXJzdCIsImdldExpc3RWaWV3cyIsImdldExpc3RWaWV3IiwiZXhhYyIsImxpc3RWaWV3cyIsImdldExpc3RWaWV3SXNSZWNlbnQiLCJsaXN0VmlldyIsInBpY2tPYmplY3RNb2JpbGVDb2x1bW5zIiwiY291bnQiLCJnZXRGaWVsZCIsImlzTmFtZUNvbHVtbiIsIml0ZW1Db3VudCIsIm1heENvdW50IiwibWF4Um93cyIsIm5hbWVDb2x1bW4iLCJuYW1lS2V5IiwicmVzdWx0IiwiZ2V0T2JqZWN0RGVmYXVsdFZpZXciLCJkZWZhdWx0VmlldyIsInVzZV9tb2JpbGVfY29sdW1ucyIsImlzQWxsVmlldyIsImlzUmVjZW50VmlldyIsInRhYnVsYXJDb2x1bW5zIiwidGFidWxhcl9zb3J0IiwiY29sdW1uX2luZGV4IiwidHJhbnNmb3JtU29ydFRvRFgiLCJkeF9zb3J0IiwiUmVnRXgiLCJjb2RlIiwiUmVnRXhwIiwiX3JlZ0V4TWVzc2FnZXMiLCJfZ2xvYmFsTWVzc2FnZXMiLCJyZWdFeCIsImV4cCIsIm1zZyIsIm1lc3NhZ2VzIiwiZXZhbEluQ29udGV4dCIsImpzIiwiZXZhbCIsImNhbGwiLCJjb252ZXJ0RmllbGQiLCJnZXRPcHRpb24iLCJvcHRpb24iLCJmb28iLCJjb2xvciIsImFsbE9wdGlvbnMiLCJwaWNrbGlzdCIsInBpY2tsaXN0T3B0aW9ucyIsImdldFBpY2tsaXN0IiwiZ2V0UGlja0xpc3RPcHRpb25zIiwicmV2ZXJzZSIsImVuYWJsZSIsImRlZmF1bHRWYWx1ZSIsInRyaWdnZXJzIiwidHJpZ2dlciIsIl90b2RvIiwiX3RvZG9fZnJvbV9jb2RlIiwiX3RvZG9fZnJvbV9kYiIsIm9uIiwidG9kbyIsInN5c3RlbUJhc2VGaWVsZHMiLCJvbWl0IiwicmVxdWlyZWQiLCJyZWFkb25seSIsImdldFN5c3RlbUJhc2VGaWVsZHMiLCJfdmlzaWJsZSIsImVycm9yMSIsImFjdGlvbnNCeU5hbWUiLCJ0cmltIiwiaXNFeHByZXNzaW9uIiwidmlzaWJsZSIsInJlY29yZF9wZXJtaXNzaW9ucyIsImdsb2JhbERhdGEiLCJhc3NpZ24iLCJub3ciLCJwYXJzZVNpbmdsZUV4cHJlc3Npb24iLCJfb3B0aW9ucyIsIl90eXBlIiwiYmVmb3JlT3BlbkZ1bmN0aW9uIiwiaXNfY29tcGFueV9saW1pdGVkIiwibWF4IiwibWluIiwiX29wdGlvbiIsImsiLCJfcmVnRXgiLCJfbWluIiwiX21heCIsIk51bWJlciIsIkJvb2xlYW4iLCJfb3B0aW9uc0Z1bmN0aW9uIiwiX3JlZmVyZW5jZV90byIsIl9jcmVhdGVGdW5jdGlvbiIsIl9iZWZvcmVPcGVuRnVuY3Rpb24iLCJfZmlsdGVyc0Z1bmN0aW9uIiwiX2RlZmF1bHRWYWx1ZSIsIl9pc19jb21wYW55X2xpbWl0ZWQiLCJfZmlsdGVycyIsImlzRGF0ZSIsInBvcCIsIl9pc19kYXRlIiwiZm9ybSIsInZhbCIsInJlbGF0ZWRPYmpJbmZvIiwiUFJFRklYIiwiX3ByZXBlbmRQcmVmaXhGb3JGb3JtdWxhIiwicHJlZml4IiwiZmllbGRWYXJpYWJsZSIsInJlZyIsInJldiIsIm0iLCIkMSIsImZvcm11bGFfc3RyIiwiX0NPTlRFWFQiLCJfVkFMVUVTIiwiZGF0YSIsImlzQm9vbGVhbiIsInRvYXN0ciIsImZvcm1hdE9iamVjdE5hbWUiLCJfYmFzZU9iamVjdCIsIl9kYiIsImRlZmF1bHRMaXN0Vmlld0lkIiwiZGlzYWJsZWRfbGlzdF92aWV3cyIsInJlZjMiLCJzY2hlbWEiLCJzZWxmIiwiYmFzZU9iamVjdCIsInBlcm1pc3Npb25fc2V0IiwiaWNvbiIsImRlc2NyaXB0aW9uIiwiaXNfdmlldyIsImhhc0ltcG9ydFRlbXBsYXRlcyIsInZlcnNpb24iLCJpc19lbmFibGUiLCJhbGxvd19jdXN0b21BY3Rpb25zIiwiZXhjbHVkZV9hY3Rpb25zIiwiZW5hYmxlX3NlYXJjaCIsInBhZ2luZyIsImVuYWJsZV9hcGkiLCJjdXN0b20iLCJlbmFibGVfc2hhcmUiLCJlbmFibGVfdHJlZSIsInNpZGViYXIiLCJvcGVuX3dpbmRvdyIsImZpbHRlcl9jb21wYW55IiwiY2FsZW5kYXIiLCJlbmFibGVfY2hhdHRlciIsImVuYWJsZV90cmFzaCIsImVuYWJsZV9zcGFjZV9nbG9iYWwiLCJlbmFibGVfZm9sbG93IiwiZW5hYmxlX3dvcmtmbG93IiwiZW5hYmxlX2lubGluZV9lZGl0IiwiZGV0YWlscyIsIm1hc3RlcnMiLCJsb29rdXBfZGV0YWlscyIsImluX2RldmVsb3BtZW50IiwiaWRGaWVsZE5hbWUiLCJkYXRhYmFzZV9uYW1lIiwiaXNfbmFtZSIsInByaW1hcnkiLCJmaWx0ZXJhYmxlIiwiaXRlbV9uYW1lIiwiY29weUl0ZW0iLCJhZG1pbiIsImFsbCIsImxpc3Rfdmlld19pdGVtIiwiUmVhY3RpdmVWYXIiLCJjcmVhdGVDb2xsZWN0aW9uIiwiX25hbWUiLCJnZXRPYmplY3RTY2hlbWEiLCJjb250YWlucyIsImF0dGFjaFNjaGVtYSIsIl9zaW1wbGVTY2hlbWEiLCJnZXRPYmplY3RPRGF0YVJvdXRlclByZWZpeCIsImJvb3RzdHJhcExvYWRlZCIsImdldFNlbGVjdE9wdGlvbnMiLCJmaWVsZFNjaGVtYSIsImRhdGFfdHlwZSIsIm9wdGlvbkl0ZW0iLCJmaWVsZHNBcnIiLCJfcmVmX29iaiIsImF1dG9mb3JtX3R5cGUiLCJjb2xsZWN0aW9uTmFtZSIsImZzIiwiZnNUeXBlIiwiaXNVbkxpbWl0ZWQiLCJtdWx0aXBsZSIsInJvd3MiLCJsYW5ndWFnZSIsImlzTW9iaWxlIiwiaXNQYWQiLCJpc2lPUyIsImFmRmllbGRJbnB1dCIsInRpbWV6b25lSWQiLCJkeERhdGVCb3hPcHRpb25zIiwiZGlzcGxheUZvcm1hdCIsInBpY2tlclR5cGUiLCJkYXRlTW9iaWxlT3B0aW9ucyIsIm91dEZvcm1hdCIsInNob3dJY29uIiwiZGVwZW5kT24iLCJkZXBlbmRfb24iLCJjcmVhdGUiLCJsb29rdXBfZmllbGQiLCJNb2RhbCIsInNob3ciLCJmb3JtSWQiLCJvcGVyYXRpb24iLCJvblN1Y2Nlc3MiLCJhZGRJdGVtcyIsInJlZmVyZW5jZV9zb3J0Iiwib3B0aW9uc1NvcnQiLCJyZWZlcmVuY2VfbGltaXQiLCJvcHRpb25zTGltaXQiLCJyZWZlcmVuY2VfdG9fZmllbGQiLCJyZWZlcmVuY2VUb0ZpZWxkIiwiYmxhY2tib3giLCJvYmplY3RTd2l0Y2hlIiwib3B0aW9uc01ldGhvZCIsIm9wdGlvbnNNZXRob2RQYXJhbXMiLCJyZWZlcmVuY2VzIiwiX3JlZmVyZW5jZSIsImxpbmsiLCJkZWZhdWx0SWNvbiIsImZpcnN0T3B0aW9uIiwiZGVjaW1hbCIsInByZWNpc2lvbiIsInNjYWxlIiwiZGlzYWJsZWQiLCJBcnJheSIsImVkaXRhYmxlIiwiYWNjZXB0Iiwic3lzdGVtIiwiRW1haWwiLCJpc051bWJlciIsIm9wdGlvbmFsIiwidW5pcXVlIiwiZ3JvdXAiLCJzZWFyY2hhYmxlIiwiaW5saW5lSGVscFRleHQiLCJpc1Byb2R1Y3Rpb24iLCJzb3J0YWJsZSIsImdldEZpZWxkRGlzcGxheVZhbHVlIiwiZmllbGRfdmFsdWUiLCJodG1sIiwibW9tZW50IiwiZm9ybWF0IiwiY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5IiwiZmllbGRfdHlwZSIsImluY2x1ZGVzIiwicHVzaEJldHdlZW5CdWlsdGluT3B0aW9uYWxzIiwib3BlcmF0aW9ucyIsImJ1aWx0aW5WYWx1ZXMiLCJnZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyIsImJ1aWx0aW5JdGVtIiwiaXNfY2hlY2tfb25seSIsImdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlcyIsImdldEJldHdlZW5CdWlsdGluVmFsdWVJdGVtIiwiZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtIiwiZ2V0QmV0d2VlbkJ1aWx0aW5PcGVyYXRpb24iLCJiZXR3ZWVuQnVpbHRpblZhbHVlcyIsImdldFF1YXJ0ZXJTdGFydE1vbnRoIiwibW9udGgiLCJnZXRNb250aCIsImdldExhc3RRdWFydGVyRmlyc3REYXkiLCJ5ZWFyIiwiZ2V0RnVsbFllYXIiLCJnZXROZXh0UXVhcnRlckZpcnN0RGF5IiwiZ2V0TW9udGhEYXlzIiwiZGF5cyIsImVuZERhdGUiLCJtaWxsaXNlY29uZCIsInN0YXJ0RGF0ZSIsImdldExhc3RNb250aEZpcnN0RGF5IiwiY3VycmVudE1vbnRoIiwiY3VycmVudFllYXIiLCJlbmRWYWx1ZSIsImZpcnN0RGF5IiwibGFzdERheSIsImxhc3RNb25kYXkiLCJsYXN0TW9udGhGaW5hbERheSIsImxhc3RNb250aEZpcnN0RGF5IiwibGFzdFF1YXJ0ZXJFbmREYXkiLCJsYXN0UXVhcnRlclN0YXJ0RGF5IiwibGFzdFN1bmRheSIsImxhc3RfMTIwX2RheXMiLCJsYXN0XzMwX2RheXMiLCJsYXN0XzYwX2RheXMiLCJsYXN0XzdfZGF5cyIsImxhc3RfOTBfZGF5cyIsIm1pbnVzRGF5IiwibW9uZGF5IiwibmV4dE1vbmRheSIsIm5leHRNb250aEZpbmFsRGF5IiwibmV4dE1vbnRoRmlyc3REYXkiLCJuZXh0UXVhcnRlckVuZERheSIsIm5leHRRdWFydGVyU3RhcnREYXkiLCJuZXh0U3VuZGF5IiwibmV4dFllYXIiLCJuZXh0XzEyMF9kYXlzIiwibmV4dF8zMF9kYXlzIiwibmV4dF82MF9kYXlzIiwibmV4dF83X2RheXMiLCJuZXh0XzkwX2RheXMiLCJwcmV2aW91c1llYXIiLCJzdGFydFZhbHVlIiwic3RyRW5kRGF5Iiwic3RyRmlyc3REYXkiLCJzdHJMYXN0RGF5Iiwic3RyTW9uZGF5Iiwic3RyU3RhcnREYXkiLCJzdHJTdW5kYXkiLCJzdHJUb2RheSIsInN0clRvbW9ycm93Iiwic3RyWWVzdGRheSIsInN1bmRheSIsInRoaXNRdWFydGVyRW5kRGF5IiwidGhpc1F1YXJ0ZXJTdGFydERheSIsInRvbW9ycm93Iiwid2VlayIsInllc3RkYXkiLCJnZXREYXkiLCJ0IiwiZnYiLCJzZXRIb3VycyIsImdldEhvdXJzIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRGaWVsZERlZmF1bHRPcGVyYXRpb24iLCJnZXRGaWVsZE9wZXJhdGlvbiIsIm9wdGlvbmFscyIsImVxdWFsIiwidW5lcXVhbCIsImxlc3NfdGhhbiIsImdyZWF0ZXJfdGhhbiIsImxlc3Nfb3JfZXF1YWwiLCJncmVhdGVyX29yX2VxdWFsIiwibm90X2NvbnRhaW4iLCJzdGFydHNfd2l0aCIsImJldHdlZW4iLCJnZXRPYmplY3RGaWVsZHNOYW1lIiwiZmllbGRzTmFtZSIsInNvcnRfbm8iLCJjbGVhblRyaWdnZXIiLCJpbml0VHJpZ2dlciIsIl90cmlnZ2VyX2hvb2tzIiwicmVmNCIsInJlZjUiLCJ0b2RvV3JhcHBlciIsImFwcGx5IiwiYXJndW1lbnRzIiwid2hlbiIsImJlZm9yZSIsImluc2VydCIsInVwZGF0ZSIsInJlbW92ZSIsImFmdGVyIiwiX2hvb2siLCJ0cmlnZ2VyX25hbWUiLCJfdHJpZ2dlcl9ob29rIiwiYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzIiwiZXh0ZW5kUGVybWlzc2lvblByb3BzIiwiZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdCIsImZpbmRfcGVybWlzc2lvbl9vYmplY3QiLCJpbnRlcnNlY3Rpb25QbHVzIiwib3RoZXJQZXJtaXNzaW9uUHJvcE5hbWVzIiwib3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzIiwicGVybWlzc2lvblByb3BOYW1lcyIsInVuaW9uUGVybWlzc2lvbk9iamVjdHMiLCJ1bmlvblBsdXMiLCJnZXRPYmplY3RQZXJtaXNzaW9ucyIsImdldFJlY29yZFBlcm1pc3Npb25zIiwiaXNPd25lciIsIm1hc3Rlck9iamVjdE5hbWUiLCJtYXN0ZXJSZWNvcmRQZXJtIiwicmVjb3JkX2NvbXBhbnlfaWQiLCJyZWNvcmRfY29tcGFueV9pZHMiLCJ1c2VyX2NvbXBhbnlfaWRzIiwib3duZXIiLCJwYXJlbnQiLCJuIiwiaW50ZXJzZWN0aW9uIiwibG9ja2VkIiwiZ2V0UmVjb3JkUmVsYXRlZExpc3RQZXJtaXNzaW9ucyIsImN1cnJlbnRPYmplY3ROYW1lIiwicmVsYXRlZExpc3RJdGVtIiwiY3VycmVudFJlY29yZCIsImlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZSIsIm1hc3RlckFsbG93IiwicmVsYXRlZE9iamVjdFBlcm1pc3Npb25zIiwidW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QiLCJnZXRPYmplY3RSZWNvcmQiLCJnZXRSZWNvcmRTYWZlUmVsYXRlZExpc3QiLCJnZXRBbGxQZXJtaXNzaW9ucyIsIl9pIiwicHNldHMiLCJwc2V0c0FkbWluIiwicHNldHNBZG1pbl9wb3MiLCJwc2V0c0N1cnJlbnQiLCJwc2V0c0N1cnJlbnROYW1lcyIsInBzZXRzQ3VycmVudF9wb3MiLCJwc2V0c0N1c3RvbWVyIiwicHNldHNDdXN0b21lcl9wb3MiLCJwc2V0c0d1ZXN0IiwicHNldHNHdWVzdF9wb3MiLCJwc2V0c01lbWJlciIsInBzZXRzTWVtYmVyX3BvcyIsInBzZXRzU3VwcGxpZXIiLCJwc2V0c1N1cHBsaWVyX3BvcyIsInBzZXRzVXNlciIsInBzZXRzVXNlcl9wb3MiLCJzZXRfaWRzIiwic3BhY2VVc2VyIiwib2JqZWN0cyIsImFzc2lnbmVkX2FwcHMiLCJwcm9maWxlIiwidXNlcnMiLCJwZXJtaXNzaW9uX3NldF9pZCIsIm1vZGlmaWVkIiwiY3JlYXRlZF9ieSIsIm1vZGlmaWVkX2J5IiwiZ2V0QXNzaWduZWRBcHBzIiwiYmluZCIsImFzc2lnbmVkX21lbnVzIiwiZ2V0QXNzaWduZWRNZW51cyIsInVzZXJfcGVybWlzc2lvbl9zZXRzIiwiYXJyYXkiLCJvdGhlciIsInRhcmdldCIsInByb3BzIiwiZmlsZXNQcm9OYW1lcyIsInByb3BOYW1lcyIsInByb3BOYW1lIiwiYXBwcyIsInBzZXRCYXNlIiwidXNlclByb2ZpbGUiLCJwc2V0IiwidW5pcSIsImFib3V0TWVudSIsImFkbWluTWVudXMiLCJhbGxNZW51cyIsImN1cnJlbnRQc2V0TmFtZXMiLCJtZW51cyIsIm90aGVyTWVudUFwcHMiLCJvdGhlck1lbnVzIiwiYWRtaW5fbWVudXMiLCJmbGF0dGVuIiwibWVudSIsInBzZXRzTWVudSIsInBlcm1pc3Npb25fc2V0cyIsInBlcm1pc3Npb25fb2JqZWN0cyIsImlzTnVsbCIsInBlcm1pc3Npb25fc2V0X2lkcyIsInBvcyIsIm9wcyIsIm9wc19rZXkiLCJjdXJyZW50UHNldCIsInRlbXBPcHMiLCJyZXBlYXRJbmRleCIsInJlcGVhdFBvIiwib3BzZXRBZG1pbiIsIm9wc2V0Q3VzdG9tZXIiLCJvcHNldEd1ZXN0Iiwib3BzZXRNZW1iZXIiLCJvcHNldFN1cHBsaWVyIiwib3BzZXRVc2VyIiwicG9zQWRtaW4iLCJwb3NDdXN0b21lciIsInBvc0d1ZXN0IiwicG9zTWVtYmVyIiwicG9zU3VwcGxpZXIiLCJwb3NVc2VyIiwicHJvZiIsImd1ZXN0IiwibWVtYmVyIiwic3VwcGxpZXIiLCJjdXN0b21lciIsImRpc2FibGVkX2FjdGlvbnMiLCJ1bnJlYWRhYmxlX2ZpZWxkcyIsInVuZWRpdGFibGVfZmllbGRzIiwiY3JlYXRvcl9kYl91cmwiLCJvcGxvZ191cmwiLCJNT05HT19VUkxfQ1JFQVRPUiIsIk1PTkdPX09QTE9HX1VSTF9DUkVBVE9SIiwiX0NSRUFUT1JfREFUQVNPVVJDRSIsIl9kcml2ZXIiLCJNb25nb0ludGVybmFscyIsIlJlbW90ZUNvbGxlY3Rpb25Ecml2ZXIiLCJvcGxvZ1VybCIsImNvbGxlY3Rpb25fa2V5IiwibmV3Q29sbGVjdGlvbiIsIlNNU1F1ZXVlIiwiX2RlbGV0ZVJlY29yZCIsImFjdGlvbl9uYW1lIiwiZXhlY3V0ZUFjdGlvbiIsIml0ZW1fZWxlbWVudCIsImNhbGxiYWNrIiwibW9yZUFyZ3MiLCJ0b2RvQXJncyIsIk9iamVjdEdyaWQiLCJnZXRGaWx0ZXJzIiwid29yZF90ZW1wbGF0ZSIsIlN0ZWVkb3NGaWx0ZXJzIiwiZm9ybWF0RmlsdGVyc1RvT0RhdGFRdWVyeSIsImFic29sdXRlVXJsIiwid2luZG93Iiwib3BlbiIsIm9kYXRhIiwicHJvdG90eXBlIiwic2xpY2UiLCJjb25jYXQiLCJ3YXJuaW5nIiwicmVjb3JkX3RpdGxlIiwiY2FsbF9iYWNrIiwiY2FsbF9iYWNrX2Vycm9yIiwicHJldmlvdXNEb2MiLCJGb3JtTWFuYWdlciIsImdldFByZXZpb3VzRG9jIiwiaW5mbyIsInN1Y2Nlc3MiLCJydW5Ib29rIiwicmVsYXRlZE9iamVjdFN0YW5kYXJkTmV3IiwiY29sbGVjdGlvbl9uYW1lIiwiY3VycmVudF9vYmplY3RfbmFtZSIsImN1cnJlbnRfcmVjb3JkX2lkIiwiZGVmYXVsdERvYyIsImluaXRpYWxWYWx1ZXMiLCJyZWxhdGVPYmplY3QiLCJzZXQiLCJnZXRSZWxhdGVkSW5pdGlhbFZhbHVlcyIsIlN0ZWVkb3NVSSIsInNob3dNb2RhbCIsInN0b3JlcyIsIkNvbXBvbmVudFJlZ2lzdHJ5IiwiY29tcG9uZW50cyIsIk9iamVjdEZvcm0iLCJvYmplY3RBcGlOYW1lIiwidGl0bGUiLCJhZnRlckluc2VydCIsInJlbG9hZFJlY29yZCIsIkZsb3dSb3V0ZXIiLCJyZWxvYWQiLCJpY29uUGF0aCIsImRlZmVyIiwiJCIsImNsaWNrIiwiZ3JpZE5hbWUiLCJpc1JlbGF0ZWQiLCJtYXN0ZXJSZWNvcmRJZCIsInJlbGF0ZWRGaWVsZE5hbWUiLCJzZWxlY3RlZFJvd3MiLCJncmlkUmVmcyIsImN1cnJlbnQiLCJhcGkiLCJnZXRTZWxlY3RlZFJvd3MiLCJncmlkUmVmIiwiZ2V0SW5pdGlhbFZhbHVlcyIsIlBhZ2UiLCJGb3JtIiwiU3RhbmRhcmROZXciLCJyZW5kZXIiLCJocmVmIiwiZ2V0T2JqZWN0VXJsIiwicmVkaXJlY3QiLCJTdGFuZGFyZEVkaXQiLCJiZWZvcmVIb29rIiwiaTE4blRleHRLZXkiLCJpMThuVGl0bGVLZXkiLCJuYW1lRmllbGQiLCJzZWxlY3RlZFJlY29yZHMiLCJ0ZXh0IiwiZ2V0VGFibGVTZWxlY3RlZFJvd3MiLCJzd2FsIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNvbmZpcm1CdXR0b25UZXh0IiwiY2FuY2VsQnV0dG9uVGV4dCIsImFmdGVyQmF0Y2hlc0RlbGV0ZSIsImRlbGV0ZUNvdW50ZXIiLCJfZSIsImFwcGlkIiwiZHhEYXRhR3JpZEluc3RhbmNlIiwiZ3JpZENvbnRhaW5lciIsImdyaWRPYmplY3ROYW1lQ2xhc3MiLCJpc09wZW5lclJlbW92ZSIsInJlY29yZFVybCIsInRlbXBOYXZSZW1vdmVkIiwib3BlbmVyIiwicm91dGUiLCJlbmRzV2l0aCIsInJlZnJlc2hHcmlkIiwiZHhUcmVlTGlzdCIsImR4RGF0YUdyaWQiLCJyZWZyZXNoIiwicmVtb3ZlVGVtcE5hdkl0ZW0iLCJjbG9zZSIsImdvIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInJlY29yZFRpdGxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxLQUFDQSxFQUFELEdBQU0sRUFBTjs7QUFDQSxJQUFJLE9BQUFDLE9BQUEsb0JBQUFBLFlBQUEsSUFBSjtBQUNDLE9BQUNBLE9BQUQsR0FBVyxFQUFYO0FDRUE7O0FERERBLFFBQVFDLE9BQVIsR0FBa0IsRUFBbEI7QUFDQUQsUUFBUUUsV0FBUixHQUFzQixFQUF0QjtBQUNBRixRQUFRRyxLQUFSLEdBQWdCLEVBQWhCO0FBQ0FILFFBQVFJLElBQVIsR0FBZSxFQUFmO0FBQ0FKLFFBQVFLLFVBQVIsR0FBcUIsRUFBckI7QUFDQUwsUUFBUU0sT0FBUixHQUFrQixFQUFsQjtBQUNBTixRQUFRTyxJQUFSLEdBQWUsRUFBZjtBQUNBUCxRQUFRUSxhQUFSLEdBQXdCLEVBQXhCLEM7Ozs7Ozs7Ozs7OztBRVZBLElBQUFDLFVBQUEsRUFBQUMsZUFBQSxFQUFBQyxNQUFBLEVBQUFDLENBQUEsRUFBQUMsU0FBQSxFQUFBQyxRQUFBLEVBQUFDLGFBQUEsRUFBQUMsY0FBQSxFQUFBQyxJQUFBLEVBQUFDLFFBQUEsRUFBQUMsV0FBQTs7QUFBQTtBQUNDLE1BQUdDLFFBQVFDLEdBQVIsQ0FBWUMsZ0JBQVosS0FBZ0MsYUFBbkM7QUFDQ0gsa0JBQWNJLFFBQVEsZUFBUixDQUFkO0FBQ0FULGVBQVdTLFFBQVEsbUJBQVIsQ0FBWDtBQUNBVixnQkFBWVUsUUFBUSxXQUFSLENBQVo7QUFDQVIsb0JBQWdCUSxRQUFRLHdDQUFSLENBQWhCO0FBQ0FkLGlCQUFhYyxRQUFRLHNCQUFSLENBQWI7QUFDQWIsc0JBQWtCYSxRQUFRLGtDQUFSLENBQWxCO0FBQ0FQLHFCQUFpQk8sUUFBUSxtQ0FBUixDQUFqQjtBQUNBTixXQUFPTSxRQUFRLE1BQVIsQ0FBUDtBQUVBWixhQUFTRyxTQUFTVSxnQkFBVCxFQUFUO0FBQ0FOLGVBQVc7QUFDVk8sd0JBQWtCLENBQ2pCLHlCQURpQixFQUVqQixtQ0FGaUIsRUFHakIsb0NBSGlCLEVBSWpCLGlDQUppQixFQUtqQixzQkFMaUIsRUFNakIsOEJBTmlCLEVBT2pCLHdCQVBpQixFQVFqQixrQ0FSaUIsRUFTakIsZ0JBVGlCLEVBVWpCLG1CQVZpQixFQVdqQixtQkFYaUIsRUFZakIseUJBWmlCLEVBYWpCLHVCQWJpQixFQWNqQixzQkFkaUIsRUFnQmpCLDJCQWhCaUIsRUFpQmpCLHlCQWpCaUIsRUFtQmpCLG1DQW5CaUIsRUFvQmQsK0JBcEJjLEVBc0JqQiwwQkF0QmlCLEVBdUJqQiwyQkF2QmlCLEVBd0JqQiw4QkF4QmlCLEVBeUJqQix3QkF6QmlCLEVBMEJqQix5QkExQmlCLEVBMkJqQiwrQkEzQmlCLENBRFI7QUE4QlZDLGVBQVNmLE9BQU9lO0FBOUJOLEtBQVg7QUFnQ0FDLFdBQU9DLE9BQVAsQ0FBZTtBQUNkLFVBQUFDLFVBQUEsRUFBQUMsTUFBQSxFQUFBQyxFQUFBLEVBQUFDLGVBQUEsRUFBQUMsZUFBQSxFQUFBQyxXQUFBLEVBQUFDLGNBQUEsRUFBQUMsa0JBQUEsRUFBQUMsbUNBQUEsRUFBQUMsY0FBQSxFQUFBQyxTQUFBOztBQUFBO0FBQ0NULGlCQUFTLElBQUlqQixVQUFVMkIsYUFBZCxDQUE0QjtBQUNwQ0MscUJBQVcsU0FEeUI7QUFFcENDLGtCQUFRLGlCQUY0QjtBQUdwQ0Msb0JBQVUsRUFIMEI7QUFJcENDLHVCQUFheEIsUUFBUUMsR0FBUixDQUFZd0IsV0FKVztBQUtwQ0Msa0JBQVExQixRQUFRQyxHQUFSLENBQVkwQixNQUxnQjtBQU1wQ0Msb0JBQVUsTUFOMEI7QUFPcENDLHNCQUFZLE1BUHdCO0FBUXBDQywwQkFBZ0IsS0FBSyxJQVJlO0FBU3BDQyx3QkFBYyxHQVRzQjtBQVdwQ0MsNkJBQW1CLEVBWGlCO0FBWXBDQyw0QkFBa0IsRUFaa0I7QUFjcENDLGdDQUFzQixLQWRjO0FBZ0JwQ0Msb0JBQVU7QUFDVEMscUJBQVMsS0FEQTtBQUVUQyw2QkFBaUI7QUFGUixXQWhCMEI7QUFxQnBDQywyQkFBaUIsS0FyQm1CO0FBdUJwQ0Msb0JBQVU7QUFDVEMsc0JBQVUsWUFERDtBQUVUQyx5QkFBYTtBQUZKLFdBdkIwQjtBQTRCcENDLG9CQUFVO0FBQ1ROLHFCQUFTLEtBREE7QUFFVE8seUJBQWEsRUFGSjtBQUdUQywwQkFBYztBQUhMLFdBNUIwQjtBQWlDcENDLHFCQUFXLElBakN5QjtBQWtDcENDLHdCQUFjLElBbENzQjtBQW1DcENDLG1CQUFTO0FBQ1JYLHFCQUFTLEtBREQ7QUFFUlksc0JBQVU7QUFDVEMsb0JBQU0sU0FERztBQUVUQyx1QkFBUztBQUNSQyx3QkFBUSxJQURBO0FBRVJDLHdCQUFRLElBRkE7QUFHUkMsdUJBQU8sR0FIQztBQUlSQyw0QkFBWTtBQUpKO0FBRkE7QUFGRixXQW5DMkI7QUErQ3BDQyx3Q0FBOEIsSUEvQ007QUFpRHBDQyxtQkFBUyxVQUFDOUMsTUFBRDtBQUVSQSxtQkFBT3lDLE1BQVAsQ0FBY00sSUFBZCxDQUFtQixxQ0FBbkI7QUNqQ00sbUJEa0NOL0MsT0FBT2dCLE1BQVAsQ0FBY2dDLEtBQWQsRUNsQ007QURsQjZCO0FBQUEsU0FBNUIsQ0FBVDtBQXVEQWhFLGlCQUFTZ0IsTUFBVCxDQUFnQmlELElBQWhCLENBQXFCakQsTUFBckI7QUFFQUcsMEJBQWtCSCxPQUFPa0QsYUFBUCxDQUFxQnpELFFBQVEsMkJBQVIsQ0FBckIsQ0FBbEI7QUFFQVkseUJBQWlCTCxPQUFPa0QsYUFBUCxDQUFxQjtBQUNyQ0MsZ0JBQU0sZ0JBRCtCO0FBRXJDeEMscUJBQVcsU0FGMEI7QUFHckN5QyxrQkFBUSxDQUFDbEUsY0FBRDtBQUg2QixTQUFyQixDQUFqQjtBQU9BZ0IsMEJBQWtCRixPQUFPa0QsYUFBUCxDQUFxQjtBQUN0Q0MsZ0JBQU0saUJBRGdDO0FBRXRDQyxrQkFBUSxDQUFDeEUsZUFBRCxDQUY4QjtBQUd0Q1Esb0JBQVU7QUFINEIsU0FBckIsQ0FBbEI7QUFPQXFCLG9CQUFZVCxPQUFPa0QsYUFBUCxDQUFxQnpELFFBQVEscUJBQVIsQ0FBckIsQ0FBWjtBQUVBTSxxQkFBYUMsT0FBT2tELGFBQVAsQ0FBcUI7QUFDakNDLGdCQUFNLEtBRDJCO0FBRWpDQyxrQkFBUSxDQUFDekUsVUFBRCxDQUZ5QjtBQUdqQ1Msb0JBQVU7QUFDVGlFLGtCQUFNO0FBREc7QUFIdUIsU0FBckIsQ0FBYjtBQVFBakQsc0JBQWNKLE9BQU9rRCxhQUFQLENBQXFCO0FBQ2xDQyxnQkFBTSx3QkFENEI7QUFFbENDLGtCQUFRLENBQUMzRCxRQUFRLHdCQUFSLENBQUQsQ0FGMEI7QUFHbENMLG9CQUFVO0FBQ1RpRSxrQkFBTTtBQURHO0FBSHdCLFNBQXJCLENBQWQ7QUFRQTdDLHlCQUFpQlIsT0FBT2tELGFBQVAsQ0FBcUI7QUFDckNDLGdCQUFNLGdCQUQrQjtBQUVyQ0Msa0JBQVEsRUFGNkI7QUFHckNoRSxvQkFBVTtBQUNUaUUsa0JBQU07QUFERyxXQUgyQjtBQU1yQ0MsbUJBQVM7QUMxQ0YsbUJEMkNOQyxXQUFXO0FBQ1Z2RCxxQkFBT3dELElBQVAsQ0FBWSx3QkFBWjtBQURELGVBR0UsSUFIRixDQzNDTTtBRG9DOEI7QUFBQSxTQUFyQixDQUFqQjtBQWFBeEUsaUJBQVN5RSxnQkFBVCxDQUEwQnpELE1BQTFCO0FBQ0FNLDZCQUFxQnRCLFNBQVMwRSxtQkFBOUI7QUFDQW5ELDhDQUFzQ1AsT0FBT2tELGFBQVAsQ0FBcUI7QUFDMURDLGdCQUFNLGtCQURvRDtBQUUxREMsa0JBQVEsQ0FBQ25FLGFBQUQsQ0FGa0Q7QUFHMURHLG9CQUFVO0FBQUV1RSx5QkFBYTtBQUN4QnhFLG9CQUFNbUI7QUFEa0I7QUFBZjtBQUhnRCxTQUFyQixDQUF0QztBQ25DSSxlRDJDSlQsT0FBTytELFNBQVAsQ0FBaUIsVUFBQ0MsRUFBRDtBQzFDWCxpQkQyQ0w3RCxPQUFPOEQsS0FBUCxHQUFlQyxJQUFmLENBQW9CO0FBQ25CLGdCQUFBQyxzQkFBQSxFQUFBQyxPQUFBOztBQUFBLGdCQUFHLENBQUNqRSxPQUFPc0QsT0FBWDtBQUNDdEQscUJBQU9rRSxlQUFQLENBQXVCL0QsZUFBdkI7O0FBQ0FILHFCQUFPa0UsZUFBUCxDQUF1QjNELG1DQUF2Qjs7QUFDQVAscUJBQU9rRSxlQUFQLENBQXVCekQsU0FBdkI7QUN6Q007O0FEMkNQd0Qsc0JBQVV4RSxRQUFRLFNBQVIsQ0FBVjtBQUNBdUUscUNBQXlCQyxTQUF6QjtBQUNBRCxtQ0FBdUJHLEdBQXZCLENBQTJCMUUsUUFBUSxpQkFBUixFQUEyQjJFLFlBQTNCLEVBQTNCO0FBQ0FwRSxtQkFBT3FFLGVBQVAsQ0FBdUIsK0JBQXZCLEVBQXdETixJQUF4RCxDQUE2RDtBQUM1RE8sc0JBQVFDLEdBQVIsQ0FBWSwrQ0FBWjtBQUNBUCxxQ0FBdUJHLEdBQXZCLENBQTJCSyxXQUFXUCxPQUFYLEVBQTNCO0FDekNPLHFCRDBDUFEsT0FBT0MsZUFBUCxDQUF1QlAsR0FBdkIsQ0FBMkJILHNCQUEzQixDQzFDTztBRHVDUjtBQ3JDTSxtQkQ2Q05oRSxPQUFPcUUsZUFBUCxDQUF1QjlELG9DQUFvQzRDLElBQTNELEVBQWlFWSxJQUFqRSxDQUFzRSxVQUFDWSxPQUFELEVBQVVDLE1BQVY7QUM1QzlELHFCRDZDUHZGLFlBQVk0RCxJQUFaLENBQWlCN0QsUUFBakIsRUFBMkIyRSxJQUEzQixDQUFnQztBQzVDdkIsdUJENkNSRixHQUFHZSxNQUFILEVBQVdELE9BQVgsQ0M3Q1E7QUQ0Q1QsZ0JDN0NPO0FENENSLGNDN0NNO0FENEJQLFlDM0NLO0FEMENOLFlDM0NJO0FEeEVMLGVBQUFFLEtBQUE7QUEwSU01RSxhQUFBNEUsS0FBQTtBQ3pDRCxlRDBDSlAsUUFBUU8sS0FBUixDQUFjLFFBQWQsRUFBdUI1RSxFQUF2QixDQzFDSTtBQUNEO0FEbkdMO0FBNUNGO0FBQUEsU0FBQTRFLEtBQUE7QUF5TE0vRixNQUFBK0YsS0FBQTtBQUNMUCxVQUFRTyxLQUFSLENBQWMsUUFBZCxFQUF1Qi9GLENBQXZCO0FDckNBLEM7Ozs7Ozs7Ozs7OztBQ3JKRCxJQUFBZ0csS0FBQTtBQUFBNUcsUUFBUTZHLElBQVIsR0FBZTtBQUNkQyxPQUFLLElBQUlDLFFBQVFDLFVBQVosRUFEUztBQUVkQyxVQUFRLElBQUlGLFFBQVFDLFVBQVo7QUFGTSxDQUFmO0FBS0FoSCxRQUFRa0gsU0FBUixHQUFvQjtBQUNuQjlHLFFBQU0sRUFEYTtBQUVuQkgsV0FBUztBQUZVLENBQXBCO0FBS0EwQixPQUFPQyxPQUFQLENBQWU7QUFDZHVGLGVBQWFDLGFBQWIsQ0FBMkI7QUFBQ0MscUJBQWlCQyxNQUFNQyxRQUFOLENBQWVELE1BQU1FLEtBQU4sQ0FBWUMsUUFBWixFQUFzQkMsTUFBdEIsQ0FBZjtBQUFsQixHQUEzQjtBQUNBUCxlQUFhQyxhQUFiLENBQTJCO0FBQUNPLHFCQUFpQkwsTUFBTUMsUUFBTixDQUFlRCxNQUFNRSxLQUFOLENBQVlDLFFBQVosRUFBc0JDLE1BQXRCLENBQWY7QUFBbEIsR0FBM0I7QUNPQyxTRE5EUCxhQUFhQyxhQUFiLENBQTJCO0FBQUNRLG9CQUFnQk4sTUFBTUMsUUFBTixDQUFlRCxNQUFNRSxLQUFOLENBQVlDLFFBQVosRUFBc0JDLE1BQXRCLENBQWY7QUFBakIsR0FBM0IsQ0NNQztBRFRGOztBQU1BLElBQUcvRixPQUFPa0csUUFBVjtBQUNDakIsVUFBUXJGLFFBQVEsUUFBUixDQUFSOztBQUNBdkIsVUFBUThILGdCQUFSLEdBQTJCLFVBQUNDLEdBQUQsRUFBTUMsV0FBTjtBQ1N4QixXRFJGcEIsTUFBTTtBQ1NGLGFEUkg1RyxRQUFRaUksV0FBUixDQUFvQkYsR0FBcEIsRUFBeUJDLFdBQXpCLENDUUc7QURUSixPQUVFRSxHQUZGLEVDUUU7QURUd0IsR0FBM0I7QUNhQTs7QURSRGxJLFFBQVFpSSxXQUFSLEdBQXNCLFVBQUNGLEdBQUQsRUFBTUMsV0FBTjtBQUNyQixNQUFHLENBQUNBLFdBQUo7QUFDQ0Esa0JBQWNELElBQUk5QyxJQUFsQjtBQ1dDOztBRFRGLE1BQUcsQ0FBQzhDLElBQUlJLFVBQVI7QUFDQ0osUUFBSUksVUFBSixHQUFpQixFQUFqQjtBQ1dDOztBRFRGLE1BQUdKLElBQUlLLEtBQVA7QUFDQ0osa0JBQWNoSSxRQUFRcUksaUJBQVIsQ0FBMEJOLEdBQTFCLENBQWQ7QUNXQzs7QURWRixNQUFHQyxnQkFBZSxzQkFBbEI7QUFDQ0Esa0JBQWMsc0JBQWQ7QUFDQUQsVUFBTU8sRUFBRUMsS0FBRixDQUFRUixHQUFSLENBQU47QUFDQUEsUUFBSTlDLElBQUosR0FBVytDLFdBQVg7QUFDQWhJLFlBQVFDLE9BQVIsQ0FBZ0IrSCxXQUFoQixJQUErQkQsR0FBL0I7QUNZQzs7QURWRi9ILFVBQVF3SSxhQUFSLENBQXNCVCxHQUF0QjtBQUNBLE1BQUkvSCxRQUFReUksTUFBWixDQUFtQlYsR0FBbkI7QUFFQS9ILFVBQVEwSSxZQUFSLENBQXFCVixXQUFyQjtBQUNBaEksVUFBUTJJLGFBQVIsQ0FBc0JYLFdBQXRCO0FBQ0EsU0FBT0QsR0FBUDtBQXBCcUIsQ0FBdEI7O0FBc0JBL0gsUUFBUTRJLGFBQVIsR0FBd0IsVUFBQzNCLE1BQUQ7QUFDdkIsTUFBR0EsT0FBT21CLEtBQVY7QUFDQyxXQUFPLE9BQUtuQixPQUFPbUIsS0FBWixHQUFrQixHQUFsQixHQUFxQm5CLE9BQU9oQyxJQUFuQztBQ1lDOztBRFhGLFNBQU9nQyxPQUFPaEMsSUFBZDtBQUh1QixDQUF4Qjs7QUFLQWpGLFFBQVE2SSxTQUFSLEdBQW9CLFVBQUNiLFdBQUQsRUFBY2MsUUFBZDtBQUNuQixNQUFBQyxHQUFBLEVBQUFDLElBQUE7O0FBQUEsTUFBR1YsRUFBRVcsT0FBRixDQUFVakIsV0FBVixDQUFIO0FBQ0M7QUNlQzs7QURkRixNQUFHckcsT0FBT3VILFFBQVY7QUNnQkcsUUFBSSxDQUFDSCxNQUFNL0ksUUFBUTZHLElBQWYsS0FBd0IsSUFBNUIsRUFBa0M7QUFDaEMsVUFBSSxDQUFDbUMsT0FBT0QsSUFBSTlCLE1BQVosS0FBdUIsSUFBM0IsRUFBaUM7QUFDL0IrQixhRGpCZ0JHLE1DaUJoQjtBQUNEO0FEbkJOO0FDcUJFOztBRG5CRixNQUFHLENBQUNuQixXQUFELElBQWlCckcsT0FBT3VILFFBQTNCO0FBQ0NsQixrQkFBY29CLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQWQ7QUNxQkM7O0FEZkYsTUFBR3JCLFdBQUg7QUFXQyxXQUFPaEksUUFBUXNKLGFBQVIsQ0FBc0J0QixXQUF0QixDQUFQO0FDT0M7QUQ5QmlCLENBQXBCOztBQXlCQWhJLFFBQVF1SixhQUFSLEdBQXdCLFVBQUNDLFNBQUQ7QUFDdkIsU0FBT2xCLEVBQUVtQixTQUFGLENBQVl6SixRQUFRc0osYUFBcEIsRUFBbUM7QUFBQ0ksU0FBS0Y7QUFBTixHQUFuQyxDQUFQO0FBRHVCLENBQXhCOztBQUdBeEosUUFBUTJKLFlBQVIsR0FBdUIsVUFBQzNCLFdBQUQ7QUFDdEI1QixVQUFRQyxHQUFSLENBQVksY0FBWixFQUE0QjJCLFdBQTVCO0FBQ0EsU0FBT2hJLFFBQVFDLE9BQVIsQ0FBZ0IrSCxXQUFoQixDQUFQO0FDWUMsU0RYRCxPQUFPaEksUUFBUXNKLGFBQVIsQ0FBc0J0QixXQUF0QixDQ1dOO0FEZHFCLENBQXZCOztBQUtBaEksUUFBUTRKLGFBQVIsR0FBd0IsVUFBQzVCLFdBQUQsRUFBYzZCLE9BQWQ7QUFDdkIsTUFBQWQsR0FBQTs7QUFBQSxNQUFHLENBQUNmLFdBQUo7QUFDQ0Esa0JBQWNvQixRQUFRQyxHQUFSLENBQVksYUFBWixDQUFkO0FDY0M7O0FEYkYsTUFBR3JCLFdBQUg7QUFDQyxRQUFHckcsT0FBT3VILFFBQVY7QUFDQyxhQUFPbkosR0FBR2lJLFdBQUgsQ0FBUDtBQUREO0FBR0MsYUFBT2hJLFFBQVFFLFdBQVIsQ0FBb0IsRUFBQTZJLE1BQUEvSSxRQUFBNkksU0FBQSxDQUFBYixXQUFBLEVBQUE2QixPQUFBLGFBQUFkLElBQXlDZSxnQkFBekMsR0FBeUMsTUFBekMsS0FBNkQ5QixXQUFqRixDQUFQO0FBSkY7QUNvQkU7QUR2QnFCLENBQXhCOztBQVNBaEksUUFBUStKLGdCQUFSLEdBQTJCLFVBQUMvQixXQUFEO0FDa0J6QixTRGpCRCxPQUFPaEksUUFBUUUsV0FBUixDQUFvQjhILFdBQXBCLENDaUJOO0FEbEJ5QixDQUEzQjs7QUFHQWhJLFFBQVFnSyxZQUFSLEdBQXVCLFVBQUNILE9BQUQsRUFBVUksTUFBVjtBQUN0QixNQUFBbEIsR0FBQSxFQUFBQyxJQUFBLEVBQUFaLEtBQUE7O0FBQUEsTUFBR3pHLE9BQU91SCxRQUFWO0FBQ0MsUUFBRyxDQUFDVyxPQUFKO0FBQ0NBLGdCQUFVVCxRQUFRQyxHQUFSLENBQVksU0FBWixDQUFWO0FDb0JFOztBRG5CSCxRQUFHLENBQUNZLE1BQUo7QUFDQ0EsZUFBU3RJLE9BQU9zSSxNQUFQLEVBQVQ7QUFKRjtBQzBCRTs7QURwQkY3QixVQUFBLENBQUFXLE1BQUEvSSxRQUFBNkksU0FBQSx1QkFBQUcsT0FBQUQsSUFBQWhKLEVBQUEsWUFBQWlKLEtBQXlDa0IsT0FBekMsQ0FBaURMLE9BQWpELEVBQXlEO0FBQUNNLFlBQU87QUFBQ0MsY0FBTztBQUFSO0FBQVIsR0FBekQsSUFBUSxNQUFSLEdBQVEsTUFBUjs7QUFDQSxNQUFBaEMsU0FBQSxPQUFHQSxNQUFPZ0MsTUFBVixHQUFVLE1BQVY7QUFDQyxXQUFPaEMsTUFBTWdDLE1BQU4sQ0FBYUMsT0FBYixDQUFxQkosTUFBckIsS0FBZ0MsQ0FBdkM7QUMwQkM7QURuQ29CLENBQXZCOztBQVlBakssUUFBUXNLLGVBQVIsR0FBMEIsVUFBQ0MsUUFBRCxFQUFXQyxPQUFYLEVBQW9CbEcsT0FBcEI7QUFFekIsTUFBRyxDQUFDZ0UsRUFBRW1DLFFBQUYsQ0FBV0YsUUFBWCxDQUFKO0FBQ0MsV0FBT0EsUUFBUDtBQzBCQzs7QUR4QkYsTUFBR3ZLLFFBQVEwSyxRQUFSLENBQWlCQyxZQUFqQixDQUE4QkosUUFBOUIsQ0FBSDtBQUNDLFdBQU92SyxRQUFRMEssUUFBUixDQUFpQnhDLEdBQWpCLENBQXFCcUMsUUFBckIsRUFBK0JDLE9BQS9CLEVBQXdDbEcsT0FBeEMsQ0FBUDtBQzBCQzs7QUR4QkYsU0FBT2lHLFFBQVA7QUFSeUIsQ0FBMUI7O0FBVUF2SyxRQUFRNEssZUFBUixHQUEwQixVQUFDQyxPQUFELEVBQVVMLE9BQVY7QUFDekIsTUFBQU0sUUFBQTtBQUFBQSxhQUFXLEVBQVg7O0FBQ0F4QyxJQUFFeUMsSUFBRixDQUFPRixPQUFQLEVBQWdCLFVBQUNHLE1BQUQ7QUFDZixRQUFBQyxNQUFBLEVBQUFoRyxJQUFBLEVBQUFpRyxLQUFBOztBQUFBLFNBQUFGLFVBQUEsT0FBR0EsT0FBUUcsTUFBWCxHQUFXLE1BQVgsTUFBcUIsQ0FBckI7QUFDQ2xHLGFBQU8rRixPQUFPLENBQVAsQ0FBUDtBQUNBQyxlQUFTRCxPQUFPLENBQVAsQ0FBVDtBQUNBRSxjQUFRbEwsUUFBUXNLLGVBQVIsQ0FBd0JVLE9BQU8sQ0FBUCxDQUF4QixFQUFtQ1IsT0FBbkMsQ0FBUjtBQUNBTSxlQUFTN0YsSUFBVCxJQUFpQixFQUFqQjtBQzZCRyxhRDVCSDZGLFNBQVM3RixJQUFULEVBQWVnRyxNQUFmLElBQXlCQyxLQzRCdEI7QUFDRDtBRG5DSjs7QUFRQSxTQUFPSixRQUFQO0FBVnlCLENBQTFCOztBQVlBOUssUUFBUW9MLGFBQVIsR0FBd0IsVUFBQ3ZCLE9BQUQ7QUFDdkIsU0FBT0EsWUFBVyxRQUFsQjtBQUR1QixDQUF4QixDLENBR0E7Ozs7Ozs7QUFNQTdKLFFBQVFxTCxrQkFBUixHQUE2QixVQUFDQyxJQUFELEVBQU9DLEdBQVAsRUFBWUMsTUFBWixFQUFvQkMsU0FBcEI7QUFFNUIsTUFBQUMsTUFBQTs7QUFBQSxNQUFHLENBQUNGLE1BQUo7QUFDQ0EsYUFBUyxLQUFUO0FDa0NDOztBRGhDRixNQUFHQyxTQUFIO0FBR0NDLGFBQVNKLEtBQUtLLFdBQUwsQ0FBaUJILE1BQWpCLENBQVQ7QUFFQSxXQUFPbEQsRUFBRXNELE1BQUYsQ0FBU04sSUFBVCxFQUFlLFVBQUNPLEdBQUQ7QUFDbkIsVUFBQUMsTUFBQTs7QUFBQUEsZUFBU1AsSUFBSWxCLE9BQUosQ0FBWXdCLElBQUlMLE1BQUosQ0FBWixDQUFUOztBQUNBLFVBQUdNLFNBQVMsQ0FBQyxDQUFiO0FBQ0MsZUFBT0EsTUFBUDtBQUREO0FBR0MsZUFBT1AsSUFBSUosTUFBSixHQUFhN0MsRUFBRStCLE9BQUYsQ0FBVXFCLE1BQVYsRUFBa0JHLElBQUlMLE1BQUosQ0FBbEIsQ0FBcEI7QUNnQ0M7QURyQ0UsTUFBUDtBQUxEO0FBWUMsV0FBT2xELEVBQUVzRCxNQUFGLENBQVNOLElBQVQsRUFBZSxVQUFDTyxHQUFEO0FBQ3JCLFVBQUFFLENBQUE7QUFBQUEsVUFBSVIsSUFBSWxCLE9BQUosQ0FBWXdCLElBQUlMLE1BQUosQ0FBWixDQUFKOztBQUNBLFVBQUdPLElBQUksQ0FBUDtBQUNDLGVBQU8sS0FBUDtBQUREO0FBR0MsZUFBT0EsQ0FBUDtBQ21DRztBRHhDRSxNQUFQO0FDMENDO0FEM0QwQixDQUE3QixDLENBd0JBOzs7OztBQUlBL0wsUUFBUWdNLGFBQVIsR0FBd0IsVUFBQ0MsTUFBRCxFQUFTQyxNQUFUO0FBQ3ZCLE1BQUFDLGFBQUEsRUFBQUMsYUFBQSxFQUFBQyxNQUFBOztBQUFBLE1BQUcsS0FBS0MsR0FBUjtBQUNDTCxhQUFTQSxPQUFPLEtBQUtLLEdBQVosQ0FBVDtBQUNBSixhQUFTQSxPQUFPLEtBQUtJLEdBQVosQ0FBVDtBQzBDQzs7QUR6Q0YsTUFBR0wsa0JBQWtCTSxJQUFyQjtBQUNDTixhQUFTQSxPQUFPTyxPQUFQLEVBQVQ7QUMyQ0M7O0FEMUNGLE1BQUdOLGtCQUFrQkssSUFBckI7QUFDQ0wsYUFBU0EsT0FBT00sT0FBUCxFQUFUO0FDNENDOztBRDNDRixNQUFHLE9BQU9QLE1BQVAsS0FBaUIsUUFBakIsSUFBOEIsT0FBT0MsTUFBUCxLQUFpQixRQUFsRDtBQUNDLFdBQU9ELFNBQVNDLE1BQWhCO0FDNkNDOztBRDNDRkMsa0JBQWdCRixXQUFVLElBQVYsSUFBa0JBLFdBQVUsTUFBNUM7QUFDQUcsa0JBQWdCRixXQUFVLElBQVYsSUFBa0JBLFdBQVUsTUFBNUM7O0FBQ0EsTUFBR0MsaUJBQWtCLENBQUNDLGFBQXRCO0FBQ0MsV0FBTyxDQUFDLENBQVI7QUM2Q0M7O0FENUNGLE1BQUdELGlCQUFrQkMsYUFBckI7QUFDQyxXQUFPLENBQVA7QUM4Q0M7O0FEN0NGLE1BQUcsQ0FBQ0QsYUFBRCxJQUFtQkMsYUFBdEI7QUFDQyxXQUFPLENBQVA7QUMrQ0M7O0FEOUNGQyxXQUFTSSxRQUFRSixNQUFSLEVBQVQ7QUFDQSxTQUFPSixPQUFPUyxRQUFQLEdBQWtCQyxhQUFsQixDQUFnQ1QsT0FBT1EsUUFBUCxFQUFoQyxFQUFtREwsTUFBbkQsQ0FBUDtBQXBCdUIsQ0FBeEI7O0FBd0JBck0sUUFBUTRNLGlCQUFSLEdBQTRCLFVBQUM1RSxXQUFEO0FBQzNCLE1BQUE2RSxPQUFBLEVBQUFDLFdBQUEsRUFBQUMsV0FBQSxFQUFBQyxjQUFBLEVBQUFDLGVBQUE7O0FBQUEsTUFBR3RMLE9BQU91SCxRQUFWO0FBQ0MsUUFBRyxDQUFDbEIsV0FBSjtBQUNDQSxvQkFBY29CLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQWQ7QUFGRjtBQ21ERTs7QUQvQ0Y0RCxvQkFBa0IsRUFBbEI7QUFHQUosWUFBVTdNLFFBQVFDLE9BQVIsQ0FBZ0IrSCxXQUFoQixDQUFWOztBQUNBLE1BQUcsQ0FBQzZFLE9BQUo7QUFDQyxXQUFPSSxlQUFQO0FDK0NDOztBRDdDRkYsZ0JBQWNGLFFBQVFFLFdBQXRCOztBQUNBLE1BQUdwTCxPQUFPdUgsUUFBUCxJQUFtQixDQUFDWixFQUFFNEUsT0FBRixDQUFVSCxXQUFWLENBQXZCO0FBQ0NDLHFCQUFpQixFQUFqQjs7QUFDQTFFLE1BQUV5QyxJQUFGLENBQU9nQyxXQUFQLEVBQW9CLFVBQUNJLE9BQUQ7QUFDbkIsVUFBRzdFLEVBQUU4RSxRQUFGLENBQVdELE9BQVgsQ0FBSDtBQytDSyxlRDlDSkgsZUFBZUcsUUFBUUUsVUFBdkIsSUFBcUMsRUM4Q2pDO0FEL0NMO0FDaURLLGVEOUNKTCxlQUFlRyxPQUFmLElBQTBCLEVDOEN0QjtBQUNEO0FEbkRMOztBQUtBN0UsTUFBRXlDLElBQUYsQ0FBTy9LLFFBQVFDLE9BQWYsRUFBd0IsVUFBQ3FOLGNBQUQsRUFBaUJDLG1CQUFqQjtBQ2lEcEIsYURoREhqRixFQUFFeUMsSUFBRixDQUFPdUMsZUFBZW5ELE1BQXRCLEVBQThCLFVBQUNxRCxhQUFELEVBQWdCQyxrQkFBaEI7QUFDN0IsWUFBRyxDQUFDRCxjQUFjbkosSUFBZCxLQUFzQixlQUF0QixJQUF5Q21KLGNBQWNuSixJQUFkLEtBQXNCLFFBQWhFLEtBQThFbUosY0FBY0UsWUFBNUYsSUFBNkdGLGNBQWNFLFlBQWQsS0FBOEIxRixXQUEzSSxJQUEySmdGLGVBQWVPLG1CQUFmLENBQTlKO0FBRUMsY0FBR2pGLEVBQUU0RSxPQUFGLENBQVVGLGVBQWVPLG1CQUFmLEtBQXVDQyxjQUFjbkosSUFBZCxLQUFzQixlQUF2RSxDQUFIO0FDZ0RPLG1CRC9DTjJJLGVBQWVPLG1CQUFmLElBQXNDO0FBQUV2RiwyQkFBYXVGLG1CQUFmO0FBQW9DSSwyQkFBYUYsa0JBQWpEO0FBQXFFRywwQ0FBNEJKLGNBQWNJO0FBQS9HLGFDK0NoQztBRGxEUjtBQ3dESztBRHpETixRQ2dERztBRGpESjs7QUFNQSxRQUFHWixlQUFlLFdBQWYsQ0FBSDtBQUNDQSxxQkFBZSxXQUFmLElBQThCO0FBQUVoRixxQkFBYSxXQUFmO0FBQTRCMkYscUJBQWE7QUFBekMsT0FBOUI7QUMyREU7O0FEMURILFFBQUdYLGVBQWUsV0FBZixDQUFIO0FBQ0NBLHFCQUFlLFdBQWYsSUFBOEI7QUFBRWhGLHFCQUFhLFdBQWY7QUFBNEIyRixxQkFBYTtBQUF6QyxPQUE5QjtBQytERTs7QUQ5REhyRixNQUFFeUMsSUFBRixDQUFPLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkIsV0FBN0IsQ0FBUCxFQUFrRCxVQUFDOEMsYUFBRDtBQUNqRCxVQUFHYixlQUFlYSxhQUFmLENBQUg7QUNnRUssZUQvREpiLGVBQWVhLGFBQWYsSUFBZ0M7QUFBRTdGLHVCQUFhNkYsYUFBZjtBQUE4QkYsdUJBQWE7QUFBM0MsU0MrRDVCO0FBSUQ7QURyRUw7O0FBR0EsUUFBR1gsZUFBZSxlQUFmLENBQUg7QUFFQ0Ysb0JBQWM5TSxRQUFROE4sY0FBUixDQUF1QjlGLFdBQXZCLENBQWQ7O0FBQ0EsVUFBRzZFLFFBQVFrQixZQUFSLEtBQUFqQixlQUFBLE9BQXdCQSxZQUFha0IsZ0JBQXJDLEdBQXFDLE1BQXJDLENBQUg7QUFDQ2hCLHVCQUFlLGVBQWYsSUFBa0M7QUFBRWhGLHVCQUFZLGVBQWQ7QUFBK0IyRix1QkFBYTtBQUE1QyxTQUFsQztBQUpGO0FDNEVHOztBRHZFSFYsc0JBQWtCM0UsRUFBRW9ELE1BQUYsQ0FBU3NCLGNBQVQsQ0FBbEI7QUFDQSxXQUFPQyxlQUFQO0FDeUVDOztBRHZFRixNQUFHSixRQUFRb0IsWUFBWDtBQUNDaEIsb0JBQWdCaUIsSUFBaEIsQ0FBcUI7QUFBQ2xHLG1CQUFZLFdBQWI7QUFBMEIyRixtQkFBYTtBQUF2QyxLQUFyQjtBQzRFQzs7QUQxRUZyRixJQUFFeUMsSUFBRixDQUFPL0ssUUFBUUMsT0FBZixFQUF3QixVQUFDcU4sY0FBRCxFQUFpQkMsbUJBQWpCO0FBQ3ZCLFFBQUFZLGNBQUE7O0FBQUEsUUFBR1osd0JBQXVCLHNCQUExQjtBQUVDWSx1QkFBaUJuTyxRQUFRNkksU0FBUixDQUFrQixzQkFBbEIsQ0FBakI7QUFDQXNGLHlCQUFrQmIsaUJBQWlCYSxjQUFuQztBQzRFRTs7QUFDRCxXRDVFRjdGLEVBQUV5QyxJQUFGLENBQU91QyxlQUFlbkQsTUFBdEIsRUFBOEIsVUFBQ3FELGFBQUQsRUFBZ0JDLGtCQUFoQjtBQUM3QixVQUFHLENBQUNELGNBQWNuSixJQUFkLEtBQXNCLGVBQXRCLElBQTBDbUosY0FBY25KLElBQWQsS0FBc0IsUUFBdEIsSUFBa0NtSixjQUFjVCxXQUEzRixLQUE2R1MsY0FBY0UsWUFBM0gsSUFBNElGLGNBQWNFLFlBQWQsS0FBOEIxRixXQUE3SztBQUNDLFlBQUd1Rix3QkFBdUIsZUFBMUI7QUM2RU0saUJEM0VMTixnQkFBZ0JtQixNQUFoQixDQUF1QixDQUF2QixFQUEwQixDQUExQixFQUE2QjtBQUFDcEcseUJBQVl1RixtQkFBYjtBQUFrQ0kseUJBQWFGO0FBQS9DLFdBQTdCLENDMkVLO0FEN0VOO0FDa0ZNLGlCRDlFTFIsZ0JBQWdCaUIsSUFBaEIsQ0FBcUI7QUFBQ2xHLHlCQUFZdUYsbUJBQWI7QUFBa0NJLHlCQUFhRixrQkFBL0M7QUFBbUVHLHdDQUE0QkosY0FBY0k7QUFBN0csV0FBckIsQ0M4RUs7QURuRlA7QUN5Rkk7QUQxRkwsTUM0RUU7QURqRkg7O0FBYUEsTUFBR2YsUUFBUXdCLFlBQVg7QUFDQ3BCLG9CQUFnQmlCLElBQWhCLENBQXFCO0FBQUNsRyxtQkFBWSxPQUFiO0FBQXNCMkYsbUJBQWE7QUFBbkMsS0FBckI7QUN5RkM7O0FEeEZGLE1BQUdkLFFBQVF5QixZQUFYO0FBQ0NyQixvQkFBZ0JpQixJQUFoQixDQUFxQjtBQUFDbEcsbUJBQVksT0FBYjtBQUFzQjJGLG1CQUFhO0FBQW5DLEtBQXJCO0FDNkZDOztBRDVGRixNQUFHZCxRQUFRMEIsYUFBWDtBQUNDdEIsb0JBQWdCaUIsSUFBaEIsQ0FBcUI7QUFBQ2xHLG1CQUFZLFFBQWI7QUFBdUIyRixtQkFBYTtBQUFwQyxLQUFyQjtBQ2lHQzs7QURoR0YsTUFBR2QsUUFBUTJCLGdCQUFYO0FBQ0N2QixvQkFBZ0JpQixJQUFoQixDQUFxQjtBQUFDbEcsbUJBQVksV0FBYjtBQUEwQjJGLG1CQUFhO0FBQXZDLEtBQXJCO0FDcUdDOztBRHBHRixNQUFHZCxRQUFRNEIsZ0JBQVg7QUFDQ3hCLG9CQUFnQmlCLElBQWhCLENBQXFCO0FBQUNsRyxtQkFBWSxXQUFiO0FBQTBCMkYsbUJBQWE7QUFBdkMsS0FBckI7QUN5R0M7O0FEeEdGLE1BQUdkLFFBQVE2QixjQUFYO0FBQ0N6QixvQkFBZ0JpQixJQUFoQixDQUFxQjtBQUFDbEcsbUJBQVksMEJBQWI7QUFBeUMyRixtQkFBYTtBQUF0RCxLQUFyQjtBQzZHQzs7QUQzR0YsTUFBR2hNLE9BQU91SCxRQUFWO0FBQ0M0RCxrQkFBYzlNLFFBQVE4TixjQUFSLENBQXVCOUYsV0FBdkIsQ0FBZDs7QUFDQSxRQUFHNkUsUUFBUWtCLFlBQVIsS0FBQWpCLGVBQUEsT0FBd0JBLFlBQWFrQixnQkFBckMsR0FBcUMsTUFBckMsQ0FBSDtBQUNDZixzQkFBZ0JpQixJQUFoQixDQUFxQjtBQUFDbEcscUJBQVksZUFBYjtBQUE4QjJGLHFCQUFhO0FBQTNDLE9BQXJCO0FBSEY7QUNvSEU7O0FEL0dGLFNBQU9WLGVBQVA7QUEzRTJCLENBQTVCOztBQTZFQWpOLFFBQVEyTyxjQUFSLEdBQXlCLFVBQUMxRSxNQUFELEVBQVNKLE9BQVQsRUFBa0IrRSxZQUFsQjtBQUN4QixNQUFBQyxZQUFBLEVBQUE5RixHQUFBLEVBQUErRixjQUFBLEVBQUFDLEVBQUEsRUFBQUMsUUFBQTs7QUFBQSxNQUFHck4sT0FBT3VILFFBQVY7QUFDQyxXQUFPbEosUUFBUTZPLFlBQWY7QUFERDtBQUdDLFFBQUcsRUFBRTVFLFVBQVdKLE9BQWIsQ0FBSDtBQUNDLFlBQU0sSUFBSWxJLE9BQU9zTixLQUFYLENBQWlCLEdBQWpCLEVBQXNCLG1GQUF0QixDQUFOO0FBQ0EsYUFBTyxJQUFQO0FDbUhFOztBRGxISEQsZUFBVztBQUFDL0osWUFBTSxDQUFQO0FBQVVpSyxjQUFRLENBQWxCO0FBQXFCQyxnQkFBVSxDQUEvQjtBQUFrQ0MsYUFBTyxDQUF6QztBQUE0Q0MsZUFBUyxDQUFyRDtBQUF3REMsb0JBQWMsQ0FBdEU7QUFBeUVsSCxhQUFPLENBQWhGO0FBQW1GbUgsa0JBQVksQ0FBL0Y7QUFBa0dDLG1CQUFhO0FBQS9HLEtBQVg7QUFFQVQsU0FBSy9PLFFBQVFFLFdBQVIsQ0FBb0IsYUFBcEIsRUFBbUNnSyxPQUFuQyxDQUEyQztBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI0RixZQUFNeEY7QUFBdkIsS0FBM0MsRUFBMkU7QUFBQ0UsY0FBUTZFO0FBQVQsS0FBM0UsQ0FBTDs7QUFDQSxRQUFHLENBQUNELEVBQUo7QUFDQ2xGLGdCQUFVLElBQVY7QUNrSUU7O0FEL0hILFFBQUcsQ0FBQ0EsT0FBSjtBQUNDLFVBQUcrRSxZQUFIO0FBQ0NHLGFBQUsvTyxRQUFRRSxXQUFSLENBQW9CLGFBQXBCLEVBQW1DZ0ssT0FBbkMsQ0FBMkM7QUFBQ3VGLGdCQUFNeEY7QUFBUCxTQUEzQyxFQUEyRDtBQUFDRSxrQkFBUTZFO0FBQVQsU0FBM0QsQ0FBTDs7QUFDQSxZQUFHLENBQUNELEVBQUo7QUFDQyxpQkFBTyxJQUFQO0FDcUlJOztBRHBJTGxGLGtCQUFVa0YsR0FBRzNHLEtBQWI7QUFKRDtBQU1DLGVBQU8sSUFBUDtBQVBGO0FDOElHOztBRHJJSHlHLG1CQUFlLEVBQWY7QUFDQUEsaUJBQWE1RSxNQUFiLEdBQXNCQSxNQUF0QjtBQUNBNEUsaUJBQWFoRixPQUFiLEdBQXVCQSxPQUF2QjtBQUNBZ0YsaUJBQWFZLElBQWIsR0FBb0I7QUFDbkIvRixXQUFLTyxNQURjO0FBRW5CaEYsWUFBTThKLEdBQUc5SixJQUZVO0FBR25CaUssY0FBUUgsR0FBR0csTUFIUTtBQUluQkMsZ0JBQVVKLEdBQUdJLFFBSk07QUFLbkJDLGFBQU9MLEdBQUdLLEtBTFM7QUFNbkJDLGVBQVNOLEdBQUdNLE9BTk87QUFPbkJFLGtCQUFZUixHQUFHUSxVQVBJO0FBUW5CQyxtQkFBYVQsR0FBR1M7QUFSRyxLQUFwQjtBQVVBVixxQkFBQSxDQUFBL0YsTUFBQS9JLFFBQUE0SixhQUFBLDZCQUFBYixJQUF5RG1CLE9BQXpELENBQWlFNkUsR0FBR08sWUFBcEUsSUFBaUIsTUFBakI7O0FBQ0EsUUFBR1IsY0FBSDtBQUNDRCxtQkFBYVksSUFBYixDQUFrQkgsWUFBbEIsR0FBaUM7QUFDaEM1RixhQUFLb0YsZUFBZXBGLEdBRFk7QUFFaEN6RSxjQUFNNkosZUFBZTdKLElBRlc7QUFHaEN5SyxrQkFBVVosZUFBZVk7QUFITyxPQUFqQztBQzJJRTs7QUR0SUgsV0FBT2IsWUFBUDtBQ3dJQztBRG5Mc0IsQ0FBekI7O0FBNkNBN08sUUFBUTJQLGNBQVIsR0FBeUIsVUFBQ0MsR0FBRDtBQUV4QixNQUFHdEgsRUFBRXVILFVBQUYsQ0FBYXBELFFBQVFxRCxTQUFyQixLQUFtQ3JELFFBQVFxRCxTQUFSLEVBQW5DLEtBQTBELENBQUFGLE9BQUEsT0FBQ0EsSUFBS0csVUFBTCxDQUFnQixTQUFoQixDQUFELEdBQUMsTUFBRCxNQUFDSCxPQUFBLE9BQThCQSxJQUFLRyxVQUFMLENBQWdCLFFBQWhCLENBQTlCLEdBQThCLE1BQS9CLE1BQUNILE9BQUEsT0FBMkRBLElBQUtHLFVBQUwsQ0FBZ0IsV0FBaEIsQ0FBM0QsR0FBMkQsTUFBNUQsQ0FBMUQsQ0FBSDtBQUNDLFFBQUcsQ0FBQyxNQUFNQyxJQUFOLENBQVdKLEdBQVgsQ0FBSjtBQUNDQSxZQUFNLE1BQU1BLEdBQVo7QUN5SUU7O0FEeElILFdBQU9BLEdBQVA7QUMwSUM7O0FEeElGLE1BQUdBLEdBQUg7QUFFQyxRQUFHLENBQUMsTUFBTUksSUFBTixDQUFXSixHQUFYLENBQUo7QUFDQ0EsWUFBTSxNQUFNQSxHQUFaO0FDeUlFOztBRHhJSCxXQUFPSywwQkFBMEJDLG9CQUExQixHQUFpRE4sR0FBeEQ7QUFKRDtBQU1DLFdBQU9LLDBCQUEwQkMsb0JBQWpDO0FDMElDO0FEdkpzQixDQUF6Qjs7QUFlQWxRLFFBQVFtUSxnQkFBUixHQUEyQixVQUFDbEcsTUFBRCxFQUFTSixPQUFUO0FBQzFCLE1BQUFrRixFQUFBO0FBQUE5RSxXQUFTQSxVQUFVdEksT0FBT3NJLE1BQVAsRUFBbkI7O0FBQ0EsTUFBR3RJLE9BQU91SCxRQUFWO0FBQ0NXLGNBQVVBLFdBQVdULFFBQVFDLEdBQVIsQ0FBWSxTQUFaLENBQXJCO0FBREQ7QUFHQyxRQUFHLENBQUNRLE9BQUo7QUFDQyxZQUFNLElBQUlsSSxPQUFPc04sS0FBWCxDQUFpQixHQUFqQixFQUFzQixjQUF0QixDQUFOO0FBSkY7QUNrSkU7O0FEN0lGRixPQUFLL08sUUFBUTRKLGFBQVIsQ0FBc0IsYUFBdEIsRUFBcUNNLE9BQXJDLENBQTZDO0FBQUM5QixXQUFPeUIsT0FBUjtBQUFpQjRGLFVBQU14RjtBQUF2QixHQUE3QyxFQUE2RTtBQUFDRSxZQUFRO0FBQUNvRixrQkFBVztBQUFaO0FBQVQsR0FBN0UsQ0FBTDtBQUNBLFNBQU9SLEdBQUdRLFVBQVY7QUFSMEIsQ0FBM0I7O0FBVUF2UCxRQUFRb1EsaUJBQVIsR0FBNEIsVUFBQ25HLE1BQUQsRUFBU0osT0FBVDtBQUMzQixNQUFBa0YsRUFBQTtBQUFBOUUsV0FBU0EsVUFBVXRJLE9BQU9zSSxNQUFQLEVBQW5COztBQUNBLE1BQUd0SSxPQUFPdUgsUUFBVjtBQUNDVyxjQUFVQSxXQUFXVCxRQUFRQyxHQUFSLENBQVksU0FBWixDQUFyQjtBQUREO0FBR0MsUUFBRyxDQUFDUSxPQUFKO0FBQ0MsWUFBTSxJQUFJbEksT0FBT3NOLEtBQVgsQ0FBaUIsR0FBakIsRUFBc0IsY0FBdEIsQ0FBTjtBQUpGO0FDNkpFOztBRHhKRkYsT0FBSy9PLFFBQVE0SixhQUFSLENBQXNCLGFBQXRCLEVBQXFDTSxPQUFyQyxDQUE2QztBQUFDOUIsV0FBT3lCLE9BQVI7QUFBaUI0RixVQUFNeEY7QUFBdkIsR0FBN0MsRUFBNkU7QUFBQ0UsWUFBUTtBQUFDcUYsbUJBQVk7QUFBYjtBQUFULEdBQTdFLENBQUw7QUFDQSxTQUFBVCxNQUFBLE9BQU9BLEdBQUlTLFdBQVgsR0FBVyxNQUFYO0FBUjJCLENBQTVCOztBQVVBeFAsUUFBUXFRLGtCQUFSLEdBQTZCLFVBQUNDLEVBQUQ7QUFDNUIsTUFBR0EsR0FBR0MsV0FBTjtBQUNDRCxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQ2tLQzs7QURqS0YsTUFBR0YsR0FBR0csU0FBTjtBQUNDSCxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQ21LQzs7QURsS0YsTUFBR0YsR0FBR0ksV0FBTjtBQUNDSixPQUFHRyxTQUFILEdBQWUsSUFBZjtBQUNBSCxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQ29LQzs7QURuS0YsTUFBR0YsR0FBR0ssY0FBTjtBQUNDTCxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQ3FLQzs7QURwS0YsTUFBR0YsR0FBR3RDLGdCQUFOO0FBQ0NzQyxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQUNBRixPQUFHRyxTQUFILEdBQWUsSUFBZjtBQUNBSCxPQUFHSSxXQUFILEdBQWlCLElBQWpCO0FBQ0FKLE9BQUdLLGNBQUgsR0FBb0IsSUFBcEI7QUNzS0M7O0FEcktGLE1BQUdMLEdBQUdNLGtCQUFOO0FBQ0NOLE9BQUdFLFNBQUgsR0FBZSxJQUFmO0FDdUtDOztBRHRLRixNQUFHRixHQUFHTyxvQkFBTjtBQUNDUCxPQUFHRSxTQUFILEdBQWUsSUFBZjtBQUNBRixPQUFHRyxTQUFILEdBQWUsSUFBZjtBQUNBSCxPQUFHSSxXQUFILEdBQWlCLElBQWpCO0FBQ0FKLE9BQUdNLGtCQUFILEdBQXdCLElBQXhCO0FDd0tDOztBRHJLRixNQUFHTixHQUFHRSxTQUFOO0FBQ0MsV0FBT0YsR0FBR1EsY0FBVixLQUE0QixTQUE1QixLQUF5Q1IsR0FBR1EsY0FBSCxHQUFvQixJQUE3RDtBQUNBLFdBQU9SLEdBQUdTLFlBQVYsS0FBMEIsU0FBMUIsS0FBdUNULEdBQUdTLFlBQUgsR0FBa0IsSUFBekQ7QUN1S0M7O0FEdEtGLE1BQUdULEdBQUdHLFNBQU47QUFDQyxXQUFPSCxHQUFHVSxnQkFBVixLQUE4QixTQUE5QixLQUEyQ1YsR0FBR1UsZ0JBQUgsR0FBc0IsSUFBakU7QUFDQSxXQUFPVixHQUFHVyxjQUFWLEtBQTRCLFNBQTVCLEtBQXlDWCxHQUFHVyxjQUFILEdBQW9CLElBQTdEO0FBQ0EsV0FBT1gsR0FBR1ksZ0JBQVYsS0FBOEIsU0FBOUIsS0FBMkNaLEdBQUdZLGdCQUFILEdBQXNCLElBQWpFO0FDd0tDOztBRHZLRixNQUFHWixHQUFHdEMsZ0JBQU47QUFDQyxXQUFPc0MsR0FBR2EsY0FBVixLQUE0QixTQUE1QixLQUF5Q2IsR0FBR2EsY0FBSCxHQUFvQixJQUE3RDtBQ3lLQzs7QUR2S0YsTUFBR2IsR0FBR1UsZ0JBQU47QUFDQ1YsT0FBR1EsY0FBSCxHQUFvQixJQUFwQjtBQ3lLQzs7QUR4S0YsTUFBR1IsR0FBR1csY0FBTjtBQUNDWCxPQUFHUSxjQUFILEdBQW9CLElBQXBCO0FDMEtDOztBRHpLRixNQUFHUixHQUFHWSxnQkFBTjtBQUNDWixPQUFHVyxjQUFILEdBQW9CLElBQXBCO0FBQ0FYLE9BQUdRLGNBQUgsR0FBb0IsSUFBcEI7QUMyS0M7O0FEMUtGLE1BQUdSLEdBQUdTLFlBQU47QUFDQ1QsT0FBR1EsY0FBSCxHQUFvQixJQUFwQjtBQzRLQzs7QUQzS0YsTUFBR1IsR0FBR2EsY0FBTjtBQUNDYixPQUFHUSxjQUFILEdBQW9CLElBQXBCO0FBQ0FSLE9BQUdXLGNBQUgsR0FBb0IsSUFBcEI7QUFDQVgsT0FBR1ksZ0JBQUgsR0FBc0IsSUFBdEI7QUFDQVosT0FBR1MsWUFBSCxHQUFrQixJQUFsQjtBQzZLQzs7QUQzS0YsU0FBT1QsRUFBUDtBQWpENEIsQ0FBN0I7O0FBbURBdFEsUUFBUW9SLGtCQUFSLEdBQTZCO0FBQzVCLE1BQUFySSxHQUFBO0FBQUEsVUFBQUEsTUFBQXBILE9BQUFULFFBQUEsc0JBQUE2SCxJQUErQnNJLGVBQS9CLEdBQStCLE1BQS9CO0FBRDRCLENBQTdCOztBQUdBclIsUUFBUXNSLG9CQUFSLEdBQStCO0FBQzlCLE1BQUF2SSxHQUFBO0FBQUEsVUFBQUEsTUFBQXBILE9BQUFULFFBQUEsc0JBQUE2SCxJQUErQndJLGlCQUEvQixHQUErQixNQUEvQjtBQUQ4QixDQUEvQjs7QUFHQXZSLFFBQVF3UixlQUFSLEdBQTBCLFVBQUMzSCxPQUFEO0FBQ3pCLE1BQUFkLEdBQUE7O0FBQUEsTUFBR2MsV0FBQSxFQUFBZCxNQUFBcEgsT0FBQVQsUUFBQSxzQkFBQTZILElBQW1Dc0ksZUFBbkMsR0FBbUMsTUFBbkMsTUFBc0R4SCxPQUF6RDtBQUNDLFdBQU8sSUFBUDtBQ21MQzs7QURsTEYsU0FBTyxLQUFQO0FBSHlCLENBQTFCOztBQUtBN0osUUFBUXlSLGlCQUFSLEdBQTRCLFVBQUM1SCxPQUFEO0FBQzNCLE1BQUFkLEdBQUE7O0FBQUEsTUFBR2MsV0FBQSxFQUFBZCxNQUFBcEgsT0FBQVQsUUFBQSxzQkFBQTZILElBQW1Dd0ksaUJBQW5DLEdBQW1DLE1BQW5DLE1BQXdEMUgsT0FBM0Q7QUFDQyxXQUFPLElBQVA7QUNzTEM7O0FEckxGLFNBQU8sS0FBUDtBQUgyQixDQUE1Qjs7QUFLQSxJQUFHbEksT0FBT2tHLFFBQVY7QUFDQzdILFVBQVEwUixpQkFBUixHQUE0QnRRLFFBQVFDLEdBQVIsQ0FBWXNRLG1CQUF4QztBQ3dMQSxDOzs7Ozs7Ozs7Ozs7QUN2bEJEaFEsT0FBT2lRLE9BQVAsQ0FFQztBQUFBLDRCQUEwQixVQUFDdE4sT0FBRDtBQUN6QixRQUFBdU4sVUFBQSxFQUFBalIsQ0FBQSxFQUFBa1IsY0FBQSxFQUFBN0ssTUFBQSxFQUFBOEssYUFBQSxFQUFBQyxLQUFBLEVBQUFDLGFBQUEsRUFBQUMsT0FBQSxFQUFBbkosR0FBQSxFQUFBQyxJQUFBLEVBQUFtSixPQUFBLEVBQUFDLGVBQUEsRUFBQUMsUUFBQSxFQUFBQyxJQUFBOztBQUFBLFFBQUFoTyxXQUFBLFFBQUF5RSxNQUFBekUsUUFBQWlPLE1BQUEsWUFBQXhKLElBQW9CMkUsWUFBcEIsR0FBb0IsTUFBcEIsR0FBb0IsTUFBcEI7QUFFQ3pHLGVBQVNqSCxRQUFRNkksU0FBUixDQUFrQnZFLFFBQVFpTyxNQUFSLENBQWU3RSxZQUFqQyxFQUErQ3BKLFFBQVFpTyxNQUFSLENBQWVuSyxLQUE5RCxDQUFUO0FBRUEwSix1QkFBaUI3SyxPQUFPdUwsY0FBeEI7QUFFQVIsY0FBUSxFQUFSOztBQUNBLFVBQUcxTixRQUFRaU8sTUFBUixDQUFlbkssS0FBbEI7QUFDQzRKLGNBQU01SixLQUFOLEdBQWM5RCxRQUFRaU8sTUFBUixDQUFlbkssS0FBN0I7QUFFQWtLLGVBQUFoTyxXQUFBLE9BQU9BLFFBQVNnTyxJQUFoQixHQUFnQixNQUFoQjtBQUVBRCxtQkFBQSxDQUFBL04sV0FBQSxPQUFXQSxRQUFTK04sUUFBcEIsR0FBb0IsTUFBcEIsS0FBZ0MsRUFBaEM7QUFFQU4sd0JBQUEsQ0FBQXpOLFdBQUEsT0FBZ0JBLFFBQVN5TixhQUF6QixHQUF5QixNQUF6QixLQUEwQyxFQUExQzs7QUFFQSxZQUFHek4sUUFBUW1PLFVBQVg7QUFDQ0wsNEJBQWtCLEVBQWxCO0FBQ0FBLDBCQUFnQk4sY0FBaEIsSUFBa0M7QUFBQ1ksb0JBQVFwTyxRQUFRbU87QUFBakIsV0FBbEM7QUNKSTs7QURNTCxZQUFBbk8sV0FBQSxRQUFBMEUsT0FBQTFFLFFBQUFvSCxNQUFBLFlBQUExQyxLQUFvQm1DLE1BQXBCLEdBQW9CLE1BQXBCLEdBQW9CLE1BQXBCO0FBQ0MsY0FBRzdHLFFBQVFtTyxVQUFYO0FBQ0NULGtCQUFNVyxHQUFOLEdBQVksQ0FBQztBQUFDakosbUJBQUs7QUFBQ2tKLHFCQUFLdE8sUUFBUW9IO0FBQWQ7QUFBTixhQUFELEVBQStCMEcsZUFBL0IsQ0FBWjtBQUREO0FBR0NKLGtCQUFNVyxHQUFOLEdBQVksQ0FBQztBQUFDakosbUJBQUs7QUFBQ2tKLHFCQUFLdE8sUUFBUW9IO0FBQWQ7QUFBTixhQUFELENBQVo7QUFKRjtBQUFBO0FBTUMsY0FBR3BILFFBQVFtTyxVQUFYO0FBQ0NuSyxjQUFFdUssTUFBRixDQUFTYixLQUFULEVBQWdCSSxlQUFoQjtBQ1NLOztBRFJOSixnQkFBTXRJLEdBQU4sR0FBWTtBQUFDb0osa0JBQU1UO0FBQVAsV0FBWjtBQ1lJOztBRFZMUixxQkFBYTVLLE9BQU9sSCxFQUFwQjs7QUFFQSxZQUFHdUUsUUFBUXlPLFdBQVg7QUFDQ3pLLFlBQUV1SyxNQUFGLENBQVNiLEtBQVQsRUFBZ0IxTixRQUFReU8sV0FBeEI7QUNXSTs7QURUTGQsd0JBQWdCO0FBQUNlLGlCQUFPakI7QUFBUixTQUFoQjs7QUFFQSxZQUFHTyxRQUFRaEssRUFBRThFLFFBQUYsQ0FBV2tGLElBQVgsQ0FBWDtBQUNDTCx3QkFBY0ssSUFBZCxHQUFxQkEsSUFBckI7QUNZSTs7QURWTCxZQUFHVCxVQUFIO0FBQ0M7QUFDQ0ssc0JBQVVMLFdBQVdvQixJQUFYLENBQWdCakIsS0FBaEIsRUFBdUJDLGFBQXZCLEVBQXNDaUIsS0FBdEMsRUFBVjtBQUNBZixzQkFBVSxFQUFWOztBQUNBN0osY0FBRXlDLElBQUYsQ0FBT21ILE9BQVAsRUFBZ0IsVUFBQ2lCLE1BQUQ7QUNZUixxQkRYUGhCLFFBQVFqRSxJQUFSLENBQ0M7QUFBQWtGLHVCQUFPRCxPQUFPckIsY0FBUCxDQUFQO0FBQ0E1Ryx1QkFBT2lJLE9BQU96SjtBQURkLGVBREQsQ0NXTztBRFpSOztBQUlBLG1CQUFPeUksT0FBUDtBQVBELG1CQUFBeEwsS0FBQTtBQVFNL0YsZ0JBQUErRixLQUFBO0FBQ0wsa0JBQU0sSUFBSWhGLE9BQU9zTixLQUFYLENBQWlCLEdBQWpCLEVBQXNCck8sRUFBRXlTLE9BQUYsR0FBWSxLQUFaLEdBQW9CQyxLQUFLQyxTQUFMLENBQWVqUCxPQUFmLENBQTFDLENBQU47QUFWRjtBQWpDRDtBQVBEO0FDb0VHOztBRGpCSCxXQUFPLEVBQVA7QUFwREQ7QUFBQSxDQUZELEU7Ozs7Ozs7Ozs7OztBRUFBdEUsUUFBUXdULG1CQUFSLEdBQThCLFVBQUN4TCxXQUFELEVBQWN5TCxPQUFkO0FBQzdCLE1BQUFDLE9BQUEsRUFBQUMsVUFBQSxFQUFBQyxrQkFBQSxFQUFBN0ssR0FBQTs7QUFBQTJLLFlBQUEsQ0FBQTNLLE1BQUEvSSxRQUFBNlQsU0FBQSxDQUFBN0wsV0FBQSxhQUFBZSxJQUEwQzJLLE9BQTFDLEdBQTBDLE1BQTFDO0FBQ0FDLGVBQWEsQ0FBYjs7QUFDQSxNQUFHRCxPQUFIO0FBQ0NwTCxNQUFFeUMsSUFBRixDQUFPMEksT0FBUCxFQUFnQixVQUFDSyxVQUFEO0FBQ2YsVUFBQUMsS0FBQSxFQUFBQyxPQUFBLEVBQUFoTCxJQUFBLEVBQUFpTCxJQUFBO0FBQUFGLGNBQVF6TCxFQUFFNEwsSUFBRixDQUFPUixPQUFQLEVBQWdCSSxVQUFoQixDQUFSO0FBQ0FFLGdCQUFBLENBQUFoTCxPQUFBK0ssTUFBQUQsVUFBQSxjQUFBRyxPQUFBakwsS0FBQW1MLFFBQUEsWUFBQUYsS0FBdUNELE9BQXZDLEdBQXVDLE1BQXZDLEdBQXVDLE1BQXZDOztBQUNBLFVBQUdBLE9BQUg7QUNHSyxlREZKTCxjQUFjLENDRVY7QURITDtBQ0tLLGVERkpBLGNBQWMsQ0NFVjtBQUNEO0FEVEw7O0FBUUFDLHlCQUFxQixNQUFNRCxVQUEzQjtBQUNBLFdBQU9DLGtCQUFQO0FDSUM7QURqQjJCLENBQTlCOztBQWVBNVQsUUFBUW9VLGNBQVIsR0FBeUIsVUFBQ3BNLFdBQUQsRUFBYzhMLFVBQWQ7QUFDeEIsTUFBQUosT0FBQSxFQUFBSyxLQUFBLEVBQUFDLE9BQUEsRUFBQWpMLEdBQUEsRUFBQUMsSUFBQTs7QUFBQTBLLFlBQVUxVCxRQUFRNlQsU0FBUixDQUFrQjdMLFdBQWxCLEVBQStCMEwsT0FBekM7O0FBQ0EsTUFBR0EsT0FBSDtBQUNDSyxZQUFRekwsRUFBRTRMLElBQUYsQ0FBT1IsT0FBUCxFQUFnQkksVUFBaEIsQ0FBUjtBQUNBRSxjQUFBLENBQUFqTCxNQUFBZ0wsTUFBQUQsVUFBQSxjQUFBOUssT0FBQUQsSUFBQW9MLFFBQUEsWUFBQW5MLEtBQXVDZ0wsT0FBdkMsR0FBdUMsTUFBdkMsR0FBdUMsTUFBdkM7QUFDQSxXQUFPQSxPQUFQO0FDT0M7QURac0IsQ0FBekI7O0FBT0FoVSxRQUFRcVUsZUFBUixHQUEwQixVQUFDck0sV0FBRCxFQUFjc00sWUFBZCxFQUE0QmIsT0FBNUI7QUFDekIsTUFBQTFMLEdBQUEsRUFBQWdCLEdBQUEsRUFBQUMsSUFBQSxFQUFBaUwsSUFBQSxFQUFBTSxPQUFBLEVBQUFqQyxJQUFBO0FBQUFpQyxZQUFBLENBQUF4TCxNQUFBL0ksUUFBQUUsV0FBQSxhQUFBOEksT0FBQUQsSUFBQTdILFFBQUEsWUFBQThILEtBQXlDa0IsT0FBekMsQ0FBaUQ7QUFBQ2xDLGlCQUFhQSxXQUFkO0FBQTJCd00sZUFBVztBQUF0QyxHQUFqRCxJQUFVLE1BQVYsR0FBVSxNQUFWO0FBQ0F6TSxRQUFNL0gsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQU47QUFDQXlMLFlBQVVuTCxFQUFFbU0sR0FBRixDQUFNaEIsT0FBTixFQUFlLFVBQUNpQixNQUFEO0FBQ3hCLFFBQUFYLEtBQUE7QUFBQUEsWUFBUWhNLElBQUlvQyxNQUFKLENBQVd1SyxNQUFYLENBQVI7O0FBQ0EsU0FBQVgsU0FBQSxPQUFHQSxNQUFPMVAsSUFBVixHQUFVLE1BQVYsS0FBbUIsQ0FBQzBQLE1BQU1ZLE1BQTFCO0FBQ0MsYUFBT0QsTUFBUDtBQUREO0FBR0MsYUFBTyxNQUFQO0FDY0U7QURuQk0sSUFBVjtBQU1BakIsWUFBVW5MLEVBQUVzTSxPQUFGLENBQVVuQixPQUFWLENBQVY7O0FBQ0EsTUFBR2MsV0FBWUEsUUFBUXJULFFBQXZCO0FBQ0NvUixXQUFBLEVBQUEyQixPQUFBTSxRQUFBclQsUUFBQSxDQUFBb1QsWUFBQSxhQUFBTCxLQUF1QzNCLElBQXZDLEdBQXVDLE1BQXZDLEtBQStDLEVBQS9DO0FBQ0FBLFdBQU9oSyxFQUFFbU0sR0FBRixDQUFNbkMsSUFBTixFQUFZLFVBQUN1QyxLQUFEO0FBQ2xCLFVBQUFDLEtBQUEsRUFBQXhJLEdBQUE7QUFBQUEsWUFBTXVJLE1BQU0sQ0FBTixDQUFOO0FBQ0FDLGNBQVF4TSxFQUFFK0IsT0FBRixDQUFVb0osT0FBVixFQUFtQm5ILEdBQW5CLENBQVI7QUFDQXVJLFlBQU0sQ0FBTixJQUFXQyxRQUFRLENBQW5CO0FBQ0EsYUFBT0QsS0FBUDtBQUpNLE1BQVA7QUFLQSxXQUFPdkMsSUFBUDtBQ2tCQzs7QURqQkYsU0FBTyxFQUFQO0FBbEJ5QixDQUExQjs7QUFxQkF0UyxRQUFRMkksYUFBUixHQUF3QixVQUFDWCxXQUFEO0FBQ3ZCLE1BQUF5TCxPQUFBLEVBQUFzQixxQkFBQSxFQUFBQyxhQUFBLEVBQUEvTixNQUFBLEVBQUE0TixLQUFBLEVBQUE5TCxHQUFBO0FBQUE5QixXQUFTakgsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVQ7QUFDQXlMLFlBQVV6VCxRQUFRaVYsdUJBQVIsQ0FBZ0NqTixXQUFoQyxLQUFnRCxDQUFDLE1BQUQsQ0FBMUQ7QUFDQWdOLGtCQUFnQixDQUFDLE9BQUQsQ0FBaEI7QUFDQUQsMEJBQXdCL1UsUUFBUWtWLDRCQUFSLENBQXFDbE4sV0FBckMsS0FBcUQsQ0FBQyxPQUFELENBQTdFOztBQUNBLE1BQUcrTSxxQkFBSDtBQUNDQyxvQkFBZ0IxTSxFQUFFNk0sS0FBRixDQUFRSCxhQUFSLEVBQXVCRCxxQkFBdkIsQ0FBaEI7QUNvQkM7O0FEbEJGRixVQUFRN1UsUUFBUW9WLG9CQUFSLENBQTZCcE4sV0FBN0IsS0FBNkMsRUFBckQ7O0FBQ0EsTUFBR3JHLE9BQU91SCxRQUFWO0FDb0JHLFdBQU8sQ0FBQ0gsTUFBTS9JLFFBQVFxVixrQkFBZixLQUFzQyxJQUF0QyxHQUE2Q3RNLElEbkIxQmYsV0NtQjBCLElEbkJYLEVDbUJsQyxHRG5Ca0MsTUNtQnpDO0FBQ0Q7QUQ5QnFCLENBQXhCOztBQVlBaEksUUFBUXNWLGVBQVIsR0FBMEIsVUFBQ0MsWUFBRCxFQUFlQyxTQUFmLEVBQTBCQyxjQUExQjtBQUN6QixNQUFBQyxlQUFBLEVBQUFDLHNCQUFBLEVBQUFDLEtBQUE7QUFBQUYsb0JBQUFILGdCQUFBLE9BQWtCQSxhQUFjOUIsT0FBaEMsR0FBZ0MsTUFBaEM7QUFDQWtDLDJCQUFBSixnQkFBQSxPQUF5QkEsYUFBY00sY0FBdkMsR0FBdUMsTUFBdkM7O0FBQ0EsT0FBT0wsU0FBUDtBQUNDO0FDdUJDOztBRHRCRkksVUFBUXROLEVBQUVDLEtBQUYsQ0FBUWlOLFNBQVIsQ0FBUjs7QUFDQSxNQUFHLENBQUNsTixFQUFFd04sR0FBRixDQUFNRixLQUFOLEVBQWEsTUFBYixDQUFKO0FBQ0NBLFVBQU0zUSxJQUFOLEdBQWF3USxjQUFiO0FDd0JDOztBRHZCRixNQUFHLENBQUNHLE1BQU1uQyxPQUFWO0FBQ0MsUUFBR2lDLGVBQUg7QUFDQ0UsWUFBTW5DLE9BQU4sR0FBZ0JpQyxlQUFoQjtBQUZGO0FDNEJFOztBRHpCRixNQUFHLENBQUNFLE1BQU1uQyxPQUFWO0FBQ0NtQyxVQUFNbkMsT0FBTixHQUFnQixDQUFDLE1BQUQsQ0FBaEI7QUMyQkM7O0FEMUJGLE1BQUcsQ0FBQ21DLE1BQU1DLGNBQVY7QUFDQyxRQUFHRixzQkFBSDtBQUNDQyxZQUFNQyxjQUFOLEdBQXVCRixzQkFBdkI7QUFGRjtBQytCRTs7QUQzQkYsTUFBR2hVLE9BQU91SCxRQUFWO0FBQ0MsUUFBR2xKLFFBQVF5UixpQkFBUixDQUEwQnJJLFFBQVFDLEdBQVIsQ0FBWSxTQUFaLENBQTFCLEtBQXFELENBQUNmLEVBQUV5TixPQUFGLENBQVVILE1BQU1uQyxPQUFoQixFQUF5QixPQUF6QixDQUF6RDtBQUNDbUMsWUFBTW5DLE9BQU4sQ0FBY3ZGLElBQWQsQ0FBbUIsT0FBbkI7QUFGRjtBQ2dDRTs7QUQzQkYsTUFBRyxDQUFDMEgsTUFBTUksWUFBVjtBQUVDSixVQUFNSSxZQUFOLEdBQXFCLE9BQXJCO0FDNEJDOztBRDFCRixNQUFHLENBQUMxTixFQUFFd04sR0FBRixDQUFNRixLQUFOLEVBQWEsS0FBYixDQUFKO0FBQ0NBLFVBQU1sTSxHQUFOLEdBQVkrTCxjQUFaO0FBREQ7QUFHQ0csVUFBTXhDLEtBQU4sR0FBY3dDLE1BQU14QyxLQUFOLElBQWVvQyxVQUFVdlEsSUFBdkM7QUM0QkM7O0FEMUJGLE1BQUdxRCxFQUFFbUMsUUFBRixDQUFXbUwsTUFBTXRSLE9BQWpCLENBQUg7QUFDQ3NSLFVBQU10UixPQUFOLEdBQWdCZ1AsS0FBSzJDLEtBQUwsQ0FBV0wsTUFBTXRSLE9BQWpCLENBQWhCO0FDNEJDOztBRDFCRmdFLElBQUU0TixPQUFGLENBQVVOLE1BQU0vSyxPQUFoQixFQUF5QixVQUFDRyxNQUFELEVBQVNjLE1BQVQ7QUFDeEIsUUFBRyxDQUFDeEQsRUFBRVcsT0FBRixDQUFVK0IsTUFBVixDQUFELElBQXNCMUMsRUFBRThFLFFBQUYsQ0FBV3BDLE1BQVgsQ0FBekI7QUFDQyxVQUFHckosT0FBT2tHLFFBQVY7QUFDQyxZQUFHUyxFQUFFdUgsVUFBRixDQUFBN0UsVUFBQSxPQUFhQSxPQUFRRSxLQUFyQixHQUFxQixNQUFyQixDQUFIO0FDNEJNLGlCRDNCTEYsT0FBT21MLE1BQVAsR0FBZ0JuTCxPQUFPRSxLQUFQLENBQWF3QixRQUFiLEVDMkJYO0FEN0JQO0FBQUE7QUFJQyxZQUFHcEUsRUFBRW1DLFFBQUYsQ0FBQU8sVUFBQSxPQUFXQSxPQUFRbUwsTUFBbkIsR0FBbUIsTUFBbkIsQ0FBSDtBQzZCTSxpQkQ1QkxuTCxPQUFPRSxLQUFQLEdBQWVsTCxRQUFPLE1BQVAsRUFBYSxNQUFJZ0wsT0FBT21MLE1BQVgsR0FBa0IsR0FBL0IsQ0M0QlY7QURqQ1A7QUFERDtBQ3FDRztBRHRDSjs7QUFRQSxTQUFPUCxLQUFQO0FBMUN5QixDQUExQjs7QUE2Q0EsSUFBR2pVLE9BQU91SCxRQUFWO0FBQ0NsSixVQUFRb1csY0FBUixHQUF5QixVQUFDcE8sV0FBRDtBQUN4QixRQUFBNkUsT0FBQSxFQUFBd0osaUJBQUEsRUFBQUMsSUFBQSxFQUFBQyxPQUFBLEVBQUFDLDhCQUFBLEVBQUExSixXQUFBLEVBQUFDLFdBQUEsRUFBQTBKLGdCQUFBLEVBQUFDLGtCQUFBLEVBQUFDLG9CQUFBLEVBQUExSixlQUFBLEVBQUFwRCxPQUFBLEVBQUErTSxpQkFBQSxFQUFBM00sTUFBQTs7QUFBQSxTQUFPakMsV0FBUDtBQUNDO0FDa0NFOztBRGpDSDBPLHlCQUFxQixFQUFyQjtBQUNBRCx1QkFBbUIsRUFBbkI7QUFDQUQscUNBQWlDLEVBQWpDO0FBQ0EzSixjQUFVN00sUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVY7O0FBQ0EsUUFBRzZFLE9BQUg7QUFDQ3dKLDBCQUFvQnhKLFFBQVFnSyxhQUE1Qjs7QUFFQSxVQUFHdk8sRUFBRVcsT0FBRixDQUFVb04saUJBQVYsQ0FBSDtBQUNDL04sVUFBRXlDLElBQUYsQ0FBT3NMLGlCQUFQLEVBQTBCLFVBQUNTLElBQUQ7QUFDekIsY0FBQUMsV0FBQSxFQUFBQyxZQUFBLEVBQUFqTyxHQUFBLEVBQUFDLElBQUEsRUFBQWlPLE9BQUEsRUFBQXJKLDBCQUFBO0FBQUFvSix5QkFBZUYsS0FBS0ksc0JBQUwsQ0FBNEJDLEtBQTVCLENBQWtDLEdBQWxDLEVBQXVDLENBQXZDLENBQWY7QUFDQUosd0JBQWNELEtBQUtJLHNCQUFMLENBQTRCQyxLQUE1QixDQUFrQyxHQUFsQyxFQUF1QyxDQUF2QyxDQUFkO0FBQ0F2Six1Q0FBQSxDQUFBN0UsTUFBQS9JLFFBQUE2SSxTQUFBLENBQUFtTyxZQUFBLGNBQUFoTyxPQUFBRCxJQUFBb0IsTUFBQSxDQUFBNE0sV0FBQSxhQUFBL04sS0FBbUY0RSwwQkFBbkYsR0FBbUYsTUFBbkYsR0FBbUYsTUFBbkY7QUFDQXFKLG9CQUNDO0FBQUFqUCx5QkFBYWdQLFlBQWI7QUFDQXZELHFCQUFTcUQsS0FBS00sV0FEZDtBQUVBdkIsNEJBQWdCaUIsS0FBS00sV0FGckI7QUFHQUMscUJBQVNMLGlCQUFnQixXQUh6QjtBQUlBM1AsNkJBQWlCeVAsS0FBS2pNLE9BSnRCO0FBS0F5SCxrQkFBTXdFLEtBQUt4RSxJQUxYO0FBTUE3RSxnQ0FBb0JzSixXQU5wQjtBQU9BTyxxQ0FBeUIsSUFQekI7QUFRQTFKLHdDQUE0QkEsMEJBUjVCO0FBU0F3RixtQkFBTzBELEtBQUsxRCxLQVRaO0FBVUFtRSxxQkFBU1QsS0FBS1UsT0FWZDtBQVdBQyx3QkFBWVgsS0FBS1csVUFYakI7QUFZQUMsdUJBQVdaLEtBQUtZO0FBWmhCLFdBREQ7QUNpREssaUJEbkNMbEIsK0JBQStCdEksSUFBL0IsQ0FBb0MrSSxPQUFwQyxDQ21DSztBRHJETjs7QUFtQkEsZUFBT1QsOEJBQVA7QUNxQ0c7O0FEcENKekosb0JBQWNGLFFBQVFFLFdBQXRCOztBQUNBLFVBQUcsQ0FBQ3pFLEVBQUU0RSxPQUFGLENBQVVILFdBQVYsQ0FBSjtBQUNDekUsVUFBRXlDLElBQUYsQ0FBT2dDLFdBQVAsRUFBb0IsVUFBQzRLLFNBQUQ7QUFDbkIsY0FBQVYsT0FBQTs7QUFBQSxjQUFHM08sRUFBRThFLFFBQUYsQ0FBV3VLLFNBQVgsQ0FBSDtBQUNDVixzQkFDQztBQUFBalAsMkJBQWEyUCxVQUFVdEssVUFBdkI7QUFDQW9HLHVCQUFTa0UsVUFBVWxFLE9BRG5CO0FBRUFvQyw4QkFBZ0I4QixVQUFVOUIsY0FGMUI7QUFHQXdCLHVCQUFTTSxVQUFVdEssVUFBVixLQUF3QixXQUhqQztBQUlBaEcsK0JBQWlCc1EsVUFBVTlNLE9BSjNCO0FBS0F5SCxvQkFBTXFGLFVBQVVyRixJQUxoQjtBQU1BN0Usa0NBQW9CLEVBTnBCO0FBT0E2Six1Q0FBeUIsSUFQekI7QUFRQWxFLHFCQUFPdUUsVUFBVXZFLEtBUmpCO0FBU0FtRSx1QkFBU0ksVUFBVUosT0FUbkI7QUFVQUcseUJBQVdDLFVBQVVEO0FBVnJCLGFBREQ7QUFZQWhCLCtCQUFtQmlCLFVBQVV0SyxVQUE3QixJQUEyQzRKLE9BQTNDO0FDd0NNLG1CRHZDTlIsaUJBQWlCdkksSUFBakIsQ0FBc0J5SixVQUFVdEssVUFBaEMsQ0N1Q007QURyRFAsaUJBZUssSUFBRy9FLEVBQUVtQyxRQUFGLENBQVdrTixTQUFYLENBQUg7QUN3Q0UsbUJEdkNObEIsaUJBQWlCdkksSUFBakIsQ0FBc0J5SixTQUF0QixDQ3VDTTtBQUNEO0FEekRQO0FBMUJGO0FDc0ZHOztBRHpDSHBCLGNBQVUsRUFBVjtBQUNBdEosc0JBQWtCak4sUUFBUTRYLGlCQUFSLENBQTBCNVAsV0FBMUIsQ0FBbEI7O0FBQ0FNLE1BQUV5QyxJQUFGLENBQU9rQyxlQUFQLEVBQXdCLFVBQUM0SyxtQkFBRDtBQUN2QixVQUFBcEUsT0FBQSxFQUFBb0MsY0FBQSxFQUFBaEIsS0FBQSxFQUFBb0MsT0FBQSxFQUFBYSxhQUFBLEVBQUFySyxrQkFBQSxFQUFBSCxjQUFBLEVBQUFDLG1CQUFBLEVBQUF3SyxhQUFBLEVBQUFuSywwQkFBQTs7QUFBQSxVQUFHLEVBQUFpSyx1QkFBQSxPQUFDQSxvQkFBcUI3UCxXQUF0QixHQUFzQixNQUF0QixDQUFIO0FBQ0M7QUM0Q0c7O0FEM0NKdUYsNEJBQXNCc0ssb0JBQW9CN1AsV0FBMUM7QUFDQXlGLDJCQUFxQm9LLG9CQUFvQmxLLFdBQXpDO0FBQ0FDLG1DQUE2QmlLLG9CQUFvQmpLLDBCQUFqRDtBQUNBTix1QkFBaUJ0TixRQUFRNkksU0FBUixDQUFrQjBFLG1CQUFsQixDQUFqQjs7QUFDQSxXQUFPRCxjQUFQO0FBQ0M7QUM2Q0c7O0FENUNKbUcsZ0JBQVV6VCxRQUFRZ1ksNkJBQVIsQ0FBc0N6SyxtQkFBdEMsS0FBOEQsQ0FBQyxNQUFELENBQXhFO0FBQ0FrRyxnQkFBVW5MLEVBQUUyUCxPQUFGLENBQVV4RSxPQUFWLEVBQW1CaEcsa0JBQW5CLENBQVY7QUFDQW9JLHVCQUFpQjdWLFFBQVFnWSw2QkFBUixDQUFzQ3pLLG1CQUF0QyxFQUEyRCxJQUEzRCxLQUFvRSxDQUFDLE1BQUQsQ0FBckY7QUFDQXNJLHVCQUFpQnZOLEVBQUUyUCxPQUFGLENBQVVwQyxjQUFWLEVBQTBCcEksa0JBQTFCLENBQWpCO0FBRUFvSCxjQUFRN1UsUUFBUW9WLG9CQUFSLENBQTZCN0gsbUJBQTdCLENBQVI7QUFDQXdLLHNCQUFnQi9YLFFBQVFrWSxzQkFBUixDQUErQnJELEtBQS9CLEVBQXNDcEIsT0FBdEMsQ0FBaEI7O0FBRUEsVUFBRyxnQkFBZ0J6RCxJQUFoQixDQUFxQnZDLGtCQUFyQixDQUFIO0FBRUNBLDZCQUFxQkEsbUJBQW1CMEssT0FBbkIsQ0FBMkIsTUFBM0IsRUFBa0MsRUFBbEMsQ0FBckI7QUMyQ0c7O0FEMUNKbEIsZ0JBQ0M7QUFBQWpQLHFCQUFhdUYsbUJBQWI7QUFDQWtHLGlCQUFTQSxPQURUO0FBRUFvQyx3QkFBZ0JBLGNBRmhCO0FBR0FwSSw0QkFBb0JBLGtCQUhwQjtBQUlBNEosaUJBQVM5Six3QkFBdUIsV0FKaEM7QUFLQUssb0NBQTRCQTtBQUw1QixPQUREO0FBUUFrSyxzQkFBZ0JwQixtQkFBbUJuSixtQkFBbkIsQ0FBaEI7O0FBQ0EsVUFBR3VLLGFBQUg7QUFDQyxZQUFHQSxjQUFjckUsT0FBakI7QUFDQ3dELGtCQUFReEQsT0FBUixHQUFrQnFFLGNBQWNyRSxPQUFoQztBQzRDSTs7QUQzQ0wsWUFBR3FFLGNBQWNqQyxjQUFqQjtBQUNDb0Isa0JBQVFwQixjQUFSLEdBQXlCaUMsY0FBY2pDLGNBQXZDO0FDNkNJOztBRDVDTCxZQUFHaUMsY0FBY3hGLElBQWpCO0FBQ0MyRSxrQkFBUTNFLElBQVIsR0FBZXdGLGNBQWN4RixJQUE3QjtBQzhDSTs7QUQ3Q0wsWUFBR3dGLGNBQWN6USxlQUFqQjtBQUNDNFAsa0JBQVE1UCxlQUFSLEdBQTBCeVEsY0FBY3pRLGVBQXhDO0FDK0NJOztBRDlDTCxZQUFHeVEsY0FBY1IsdUJBQWpCO0FBQ0NMLGtCQUFRSyx1QkFBUixHQUFrQ1EsY0FBY1IsdUJBQWhEO0FDZ0RJOztBRC9DTCxZQUFHUSxjQUFjMUUsS0FBakI7QUFDQzZELGtCQUFRN0QsS0FBUixHQUFnQjBFLGNBQWMxRSxLQUE5QjtBQ2lESTs7QURoREwsWUFBRzBFLGNBQWNKLFNBQWpCO0FBQ0NULGtCQUFRUyxTQUFSLEdBQW9CSSxjQUFjSixTQUFsQztBQ2tESTs7QURqREwsZUFBT2hCLG1CQUFtQm5KLG1CQUFuQixDQUFQO0FDbURHOztBQUNELGFEbERIZ0osUUFBUVUsUUFBUWpQLFdBQWhCLElBQStCaVAsT0NrRDVCO0FEaEdKOztBQWlEQXBOLGNBQVVULFFBQVFDLEdBQVIsQ0FBWSxTQUFaLENBQVY7QUFDQVksYUFBU3RJLE9BQU9zSSxNQUFQLEVBQVQ7QUFDQTBNLDJCQUF1QnJPLEVBQUU4UCxLQUFGLENBQVE5UCxFQUFFb0QsTUFBRixDQUFTZ0wsa0JBQVQsQ0FBUixFQUFzQyxhQUF0QyxDQUF2QjtBQUNBNUosa0JBQWM5TSxRQUFROE4sY0FBUixDQUF1QjlGLFdBQXZCLEVBQW9DNkIsT0FBcEMsRUFBNkNJLE1BQTdDLENBQWQ7QUFDQTJNLHdCQUFvQjlKLFlBQVk4SixpQkFBaEM7QUFDQUQsMkJBQXVCck8sRUFBRStQLFVBQUYsQ0FBYTFCLG9CQUFiLEVBQW1DQyxpQkFBbkMsQ0FBdkI7O0FBQ0F0TyxNQUFFeUMsSUFBRixDQUFPMkwsa0JBQVAsRUFBMkIsVUFBQzNLLENBQUQsRUFBSXdCLG1CQUFKO0FBQzFCLFVBQUFpRCxTQUFBLEVBQUE4SCxRQUFBLEVBQUF2UCxHQUFBO0FBQUF1UCxpQkFBVzNCLHFCQUFxQnRNLE9BQXJCLENBQTZCa0QsbUJBQTdCLElBQW9ELENBQUMsQ0FBaEU7QUFDQWlELGtCQUFBLENBQUF6SCxNQUFBL0ksUUFBQThOLGNBQUEsQ0FBQVAsbUJBQUEsRUFBQTFELE9BQUEsRUFBQUksTUFBQSxhQUFBbEIsSUFBMEV5SCxTQUExRSxHQUEwRSxNQUExRTs7QUFDQSxVQUFHOEgsWUFBWTlILFNBQWY7QUNtREssZURsREorRixRQUFRaEosbUJBQVIsSUFBK0J4QixDQ2tEM0I7QUFDRDtBRHZETDs7QUFNQXVLLFdBQU8sRUFBUDs7QUFDQSxRQUFHaE8sRUFBRTRFLE9BQUYsQ0FBVXVKLGdCQUFWLENBQUg7QUFDQ0gsYUFBUWhPLEVBQUVvRCxNQUFGLENBQVM2SyxPQUFULENBQVI7QUFERDtBQUdDak8sUUFBRXlDLElBQUYsQ0FBTzBMLGdCQUFQLEVBQXlCLFVBQUNwSixVQUFEO0FBQ3hCLFlBQUdrSixRQUFRbEosVUFBUixDQUFIO0FDb0RNLGlCRG5ETGlKLEtBQUtwSSxJQUFMLENBQVVxSSxRQUFRbEosVUFBUixDQUFWLENDbURLO0FBQ0Q7QUR0RE47QUN3REU7O0FEcERILFFBQUcvRSxFQUFFd04sR0FBRixDQUFNakosT0FBTixFQUFlLG1CQUFmLENBQUg7QUFDQ3lKLGFBQU9oTyxFQUFFMEMsTUFBRixDQUFTc0wsSUFBVCxFQUFlLFVBQUNRLElBQUQ7QUFDckIsZUFBT3hPLEVBQUV5TixPQUFGLENBQVVsSixRQUFRMEwsaUJBQWxCLEVBQXFDekIsS0FBSzlPLFdBQTFDLENBQVA7QUFETSxRQUFQO0FDd0RFOztBRHJESCxXQUFPc08sSUFBUDtBQS9Id0IsR0FBekI7QUN1TEE7O0FEdEREdFcsUUFBUXdZLHNCQUFSLEdBQWlDLFVBQUN4USxXQUFEO0FBQ2hDLFNBQU9NLEVBQUVtUSxLQUFGLENBQVF6WSxRQUFRMFksWUFBUixDQUFxQjFRLFdBQXJCLENBQVIsQ0FBUDtBQURnQyxDQUFqQyxDLENBR0E7Ozs7O0FBSUFoSSxRQUFRMlksV0FBUixHQUFzQixVQUFDM1EsV0FBRCxFQUFjc00sWUFBZCxFQUE0QnNFLElBQTVCO0FBQ3JCLE1BQUFDLFNBQUEsRUFBQXJELFNBQUEsRUFBQXZPLE1BQUE7O0FBQUEsTUFBR3RGLE9BQU91SCxRQUFWO0FBQ0MsUUFBRyxDQUFDbEIsV0FBSjtBQUNDQSxvQkFBY29CLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQWQ7QUM2REU7O0FENURILFFBQUcsQ0FBQ2lMLFlBQUo7QUFDQ0EscUJBQWVsTCxRQUFRQyxHQUFSLENBQVksY0FBWixDQUFmO0FBSkY7QUNtRUU7O0FEOURGcEMsV0FBU2pILFFBQVE2SSxTQUFSLENBQWtCYixXQUFsQixDQUFUOztBQUNBLE1BQUcsQ0FBQ2YsTUFBSjtBQUNDO0FDZ0VDOztBRC9ERjRSLGNBQVk3WSxRQUFRMFksWUFBUixDQUFxQjFRLFdBQXJCLENBQVo7O0FBQ0EsUUFBQTZRLGFBQUEsT0FBT0EsVUFBVzFOLE1BQWxCLEdBQWtCLE1BQWxCO0FBQ0M7QUNpRUM7O0FEaEVGcUssY0FBWWxOLEVBQUUySyxJQUFGLENBQU80RixTQUFQLEVBQWtCLFVBQUMvQixJQUFEO0FBQVMsV0FBT0EsS0FBS3BOLEdBQUwsS0FBWTRLLFlBQVosSUFBNEJ3QyxLQUFLN1IsSUFBTCxLQUFhcVAsWUFBaEQ7QUFBM0IsSUFBWjs7QUFDQSxPQUFPa0IsU0FBUDtBQUVDLFFBQUdvRCxJQUFIO0FBQ0M7QUFERDtBQUdDcEQsa0JBQVlxRCxVQUFVLENBQVYsQ0FBWjtBQUxGO0FDeUVFOztBRG5FRixTQUFPckQsU0FBUDtBQW5CcUIsQ0FBdEI7O0FBc0JBeFYsUUFBUThZLG1CQUFSLEdBQThCLFVBQUM5USxXQUFELEVBQWNzTSxZQUFkO0FBQzdCLE1BQUF5RSxRQUFBLEVBQUE5UixNQUFBOztBQUFBLE1BQUd0RixPQUFPdUgsUUFBVjtBQUNDLFFBQUcsQ0FBQ2xCLFdBQUo7QUFDQ0Esb0JBQWNvQixRQUFRQyxHQUFSLENBQVksYUFBWixDQUFkO0FDc0VFOztBRHJFSCxRQUFHLENBQUNpTCxZQUFKO0FBQ0NBLHFCQUFlbEwsUUFBUUMsR0FBUixDQUFZLGNBQVosQ0FBZjtBQUpGO0FDNEVFOztBRHZFRixNQUFHLE9BQU9pTCxZQUFQLEtBQXdCLFFBQTNCO0FBQ0NyTixhQUFTakgsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVQ7O0FBQ0EsUUFBRyxDQUFDZixNQUFKO0FBQ0M7QUN5RUU7O0FEeEVIOFIsZUFBV3pRLEVBQUVtQixTQUFGLENBQVl4QyxPQUFPa0IsVUFBbkIsRUFBOEI7QUFBQ3VCLFdBQUs0SztBQUFOLEtBQTlCLENBQVg7QUFKRDtBQU1DeUUsZUFBV3pFLFlBQVg7QUM0RUM7O0FEM0VGLFVBQUF5RSxZQUFBLE9BQU9BLFNBQVU5VCxJQUFqQixHQUFpQixNQUFqQixNQUF5QixRQUF6QjtBQWI2QixDQUE5QixDLENBZ0JBOzs7Ozs7OztBQU9BakYsUUFBUWdaLHVCQUFSLEdBQWtDLFVBQUNoUixXQUFELEVBQWN5TCxPQUFkO0FBQ2pDLE1BQUF3RixLQUFBLEVBQUFsRixLQUFBLEVBQUE1SixNQUFBLEVBQUErTyxRQUFBLEVBQUFDLFlBQUEsRUFBQUMsU0FBQSxFQUFBQyxRQUFBLEVBQUFDLE9BQUEsRUFBQUMsVUFBQSxFQUFBQyxPQUFBLEVBQUF2UyxNQUFBLEVBQUF3UyxNQUFBO0FBQUFBLFdBQVMsRUFBVDtBQUNBSCxZQUFVLENBQVY7QUFDQUQsYUFBV0MsVUFBVSxDQUFyQjtBQUNBTCxVQUFRLENBQVI7QUFDQWhTLFdBQVNqSCxRQUFRNkksU0FBUixDQUFrQmIsV0FBbEIsQ0FBVDtBQUNBbUMsV0FBU2xELE9BQU9rRCxNQUFoQjs7QUFDQSxPQUFPbEQsTUFBUDtBQUNDLFdBQU93TSxPQUFQO0FDZ0ZDOztBRC9FRitGLFlBQVV2UyxPQUFPdUwsY0FBakI7O0FBQ0EyRyxpQkFBZSxVQUFDckMsSUFBRDtBQUNkLFFBQUd4TyxFQUFFOEUsUUFBRixDQUFXMEosSUFBWCxDQUFIO0FBQ0MsYUFBT0EsS0FBSy9DLEtBQUwsS0FBY3lGLE9BQXJCO0FBREQ7QUFHQyxhQUFPMUMsU0FBUTBDLE9BQWY7QUNpRkU7QURyRlcsR0FBZjs7QUFLQU4sYUFBVyxVQUFDcEMsSUFBRDtBQUNWLFFBQUd4TyxFQUFFOEUsUUFBRixDQUFXMEosSUFBWCxDQUFIO0FBQ0MsYUFBTzNNLE9BQU8yTSxLQUFLL0MsS0FBWixDQUFQO0FBREQ7QUFHQyxhQUFPNUosT0FBTzJNLElBQVAsQ0FBUDtBQ21GRTtBRHZGTyxHQUFYOztBQUtBLE1BQUcwQyxPQUFIO0FBQ0NELGlCQUFhOUYsUUFBUVIsSUFBUixDQUFhLFVBQUM2RCxJQUFEO0FBQ3pCLGFBQU9xQyxhQUFhckMsSUFBYixDQUFQO0FBRFksTUFBYjtBQ3VGQzs7QURyRkYsTUFBR3lDLFVBQUg7QUFDQ3hGLFlBQVFtRixTQUFTSyxVQUFULENBQVI7QUFDQUgsZ0JBQWVyRixNQUFNQyxPQUFOLEdBQW1CLENBQW5CLEdBQTBCLENBQXpDO0FBQ0FpRixhQUFTRyxTQUFUO0FBQ0FLLFdBQU92TCxJQUFQLENBQVlxTCxVQUFaO0FDdUZDOztBRHRGRjlGLFVBQVF5QyxPQUFSLENBQWdCLFVBQUNZLElBQUQ7QUFDZi9DLFlBQVFtRixTQUFTcEMsSUFBVCxDQUFSOztBQUNBLFNBQU8vQyxLQUFQO0FBQ0M7QUN3RkU7O0FEdkZIcUYsZ0JBQWVyRixNQUFNQyxPQUFOLEdBQW1CLENBQW5CLEdBQTBCLENBQXpDOztBQUNBLFFBQUdpRixRQUFRSSxRQUFSLElBQXFCSSxPQUFPdE8sTUFBUCxHQUFnQmtPLFFBQXJDLElBQWtELENBQUNGLGFBQWFyQyxJQUFiLENBQXREO0FBQ0NtQyxlQUFTRyxTQUFUOztBQUNBLFVBQUdILFNBQVNJLFFBQVo7QUN5RkssZUR4RkpJLE9BQU92TCxJQUFQLENBQVk0SSxJQUFaLENDd0ZJO0FEM0ZOO0FDNkZHO0FEbEdKO0FBVUEsU0FBTzJDLE1BQVA7QUF0Q2lDLENBQWxDLEMsQ0F3Q0E7Ozs7QUFHQXpaLFFBQVEwWixvQkFBUixHQUErQixVQUFDMVIsV0FBRDtBQUM5QixNQUFBMlIsV0FBQSxFQUFBMVMsTUFBQSxFQUFBOEIsR0FBQTtBQUFBOUIsV0FBU2pILFFBQVE2SSxTQUFSLENBQWtCYixXQUFsQixDQUFUOztBQUNBLE1BQUcsQ0FBQ2YsTUFBSjtBQUNDQSxhQUFTakgsUUFBUUMsT0FBUixDQUFnQitILFdBQWhCLENBQVQ7QUMrRkM7O0FEOUZGLE1BQUFmLFVBQUEsUUFBQThCLE1BQUE5QixPQUFBa0IsVUFBQSxZQUFBWSxJQUFxQixTQUFyQixJQUFxQixNQUFyQixHQUFxQixNQUFyQjtBQUVDNFEsa0JBQWMxUyxPQUFPa0IsVUFBUCxDQUFpQixTQUFqQixDQUFkO0FBRkQ7QUFJQ0csTUFBRXlDLElBQUYsQ0FBQTlELFVBQUEsT0FBT0EsT0FBUWtCLFVBQWYsR0FBZSxNQUFmLEVBQTJCLFVBQUNxTixTQUFELEVBQVlsSixHQUFaO0FBQzFCLFVBQUdrSixVQUFVdlEsSUFBVixLQUFrQixLQUFsQixJQUEyQnFILFFBQU8sS0FBckM7QUMrRkssZUQ5RkpxTixjQUFjbkUsU0M4RlY7QUFDRDtBRGpHTDtBQ21HQzs7QURoR0YsU0FBT21FLFdBQVA7QUFYOEIsQ0FBL0IsQyxDQWFBOzs7O0FBR0EzWixRQUFRaVYsdUJBQVIsR0FBa0MsVUFBQ2pOLFdBQUQsRUFBYzRSLGtCQUFkO0FBQ2pDLE1BQUFuRyxPQUFBLEVBQUFrRyxXQUFBO0FBQUFBLGdCQUFjM1osUUFBUTBaLG9CQUFSLENBQTZCMVIsV0FBN0IsQ0FBZDtBQUNBeUwsWUFBQWtHLGVBQUEsT0FBVUEsWUFBYWxHLE9BQXZCLEdBQXVCLE1BQXZCOztBQUNBLE1BQUdtRyxrQkFBSDtBQUNDLFFBQUFELGVBQUEsT0FBR0EsWUFBYTlELGNBQWhCLEdBQWdCLE1BQWhCO0FBQ0NwQyxnQkFBVWtHLFlBQVk5RCxjQUF0QjtBQURELFdBRUssSUFBR3BDLE9BQUg7QUFDSkEsZ0JBQVV6VCxRQUFRZ1osdUJBQVIsQ0FBZ0NoUixXQUFoQyxFQUE2Q3lMLE9BQTdDLENBQVY7QUFKRjtBQzJHRTs7QUR0R0YsU0FBT0EsT0FBUDtBQVJpQyxDQUFsQyxDLENBVUE7Ozs7QUFHQXpULFFBQVFnWSw2QkFBUixHQUF3QyxVQUFDaFEsV0FBRCxFQUFjNFIsa0JBQWQ7QUFDdkMsTUFBQW5HLE9BQUEsRUFBQWtHLFdBQUE7QUFBQUEsZ0JBQWMzWixRQUFRd1ksc0JBQVIsQ0FBK0J4USxXQUEvQixDQUFkO0FBQ0F5TCxZQUFBa0csZUFBQSxPQUFVQSxZQUFhbEcsT0FBdkIsR0FBdUIsTUFBdkI7O0FBQ0EsTUFBR21HLGtCQUFIO0FBQ0MsUUFBQUQsZUFBQSxPQUFHQSxZQUFhOUQsY0FBaEIsR0FBZ0IsTUFBaEI7QUFDQ3BDLGdCQUFVa0csWUFBWTlELGNBQXRCO0FBREQsV0FFSyxJQUFHcEMsT0FBSDtBQUNKQSxnQkFBVXpULFFBQVFnWix1QkFBUixDQUFnQ2hSLFdBQWhDLEVBQTZDeUwsT0FBN0MsQ0FBVjtBQUpGO0FDaUhFOztBRDVHRixTQUFPQSxPQUFQO0FBUnVDLENBQXhDLEMsQ0FVQTs7OztBQUdBelQsUUFBUWtWLDRCQUFSLEdBQXVDLFVBQUNsTixXQUFEO0FBQ3RDLE1BQUEyUixXQUFBO0FBQUFBLGdCQUFjM1osUUFBUTBaLG9CQUFSLENBQTZCMVIsV0FBN0IsQ0FBZDtBQUNBLFNBQUEyUixlQUFBLE9BQU9BLFlBQWEzRSxhQUFwQixHQUFvQixNQUFwQjtBQUZzQyxDQUF2QyxDLENBSUE7Ozs7QUFHQWhWLFFBQVFvVixvQkFBUixHQUErQixVQUFDcE4sV0FBRDtBQUM5QixNQUFBMlIsV0FBQTtBQUFBQSxnQkFBYzNaLFFBQVEwWixvQkFBUixDQUE2QjFSLFdBQTdCLENBQWQ7O0FBQ0EsTUFBRzJSLFdBQUg7QUFDQyxRQUFHQSxZQUFZckgsSUFBZjtBQUNDLGFBQU9xSCxZQUFZckgsSUFBbkI7QUFERDtBQUdDLGFBQU8sQ0FBQyxDQUFDLFNBQUQsRUFBWSxNQUFaLENBQUQsQ0FBUDtBQUpGO0FDMkhFO0FEN0g0QixDQUEvQixDLENBU0E7Ozs7QUFHQXRTLFFBQVE2WixTQUFSLEdBQW9CLFVBQUNyRSxTQUFEO0FBQ25CLFVBQUFBLGFBQUEsT0FBT0EsVUFBV3ZRLElBQWxCLEdBQWtCLE1BQWxCLE1BQTBCLEtBQTFCO0FBRG1CLENBQXBCLEMsQ0FHQTs7OztBQUdBakYsUUFBUThaLFlBQVIsR0FBdUIsVUFBQ3RFLFNBQUQ7QUFDdEIsVUFBQUEsYUFBQSxPQUFPQSxVQUFXdlEsSUFBbEIsR0FBa0IsTUFBbEIsTUFBMEIsUUFBMUI7QUFEc0IsQ0FBdkIsQyxDQUdBOzs7O0FBR0FqRixRQUFRa1ksc0JBQVIsR0FBaUMsVUFBQzVGLElBQUQsRUFBT3lILGNBQVA7QUFDaEMsTUFBQUMsWUFBQTtBQUFBQSxpQkFBZSxFQUFmOztBQUNBMVIsSUFBRXlDLElBQUYsQ0FBT3VILElBQVAsRUFBYSxVQUFDd0UsSUFBRDtBQUNaLFFBQUFtRCxZQUFBLEVBQUFuRyxVQUFBLEVBQUFlLEtBQUE7O0FBQUEsUUFBR3ZNLEVBQUVXLE9BQUYsQ0FBVTZOLElBQVYsQ0FBSDtBQUVDLFVBQUdBLEtBQUszTCxNQUFMLEtBQWUsQ0FBbEI7QUFDQzhPLHVCQUFlRixlQUFlMVAsT0FBZixDQUF1QnlNLEtBQUssQ0FBTCxDQUF2QixDQUFmOztBQUNBLFlBQUdtRCxlQUFlLENBQUMsQ0FBbkI7QUNpSU0saUJEaElMRCxhQUFhOUwsSUFBYixDQUFrQixDQUFDK0wsWUFBRCxFQUFlLEtBQWYsQ0FBbEIsQ0NnSUs7QURuSVA7QUFBQSxhQUlLLElBQUduRCxLQUFLM0wsTUFBTCxLQUFlLENBQWxCO0FBQ0o4Tyx1QkFBZUYsZUFBZTFQLE9BQWYsQ0FBdUJ5TSxLQUFLLENBQUwsQ0FBdkIsQ0FBZjs7QUFDQSxZQUFHbUQsZUFBZSxDQUFDLENBQW5CO0FDa0lNLGlCRGpJTEQsYUFBYTlMLElBQWIsQ0FBa0IsQ0FBQytMLFlBQUQsRUFBZW5ELEtBQUssQ0FBTCxDQUFmLENBQWxCLENDaUlLO0FEcElGO0FBTk47QUFBQSxXQVVLLElBQUd4TyxFQUFFOEUsUUFBRixDQUFXMEosSUFBWCxDQUFIO0FBRUpoRCxtQkFBYWdELEtBQUtoRCxVQUFsQjtBQUNBZSxjQUFRaUMsS0FBS2pDLEtBQWI7O0FBQ0EsVUFBR2YsY0FBY2UsS0FBakI7QUFDQ29GLHVCQUFlRixlQUFlMVAsT0FBZixDQUF1QnlKLFVBQXZCLENBQWY7O0FBQ0EsWUFBR21HLGVBQWUsQ0FBQyxDQUFuQjtBQ21JTSxpQkRsSUxELGFBQWE5TCxJQUFiLENBQWtCLENBQUMrTCxZQUFELEVBQWVwRixLQUFmLENBQWxCLENDa0lLO0FEcklQO0FBSkk7QUM0SUY7QUR2Sko7O0FBb0JBLFNBQU9tRixZQUFQO0FBdEJnQyxDQUFqQyxDLENBd0JBOzs7O0FBR0FoYSxRQUFRa2EsaUJBQVIsR0FBNEIsVUFBQzVILElBQUQ7QUFDM0IsTUFBQTZILE9BQUE7QUFBQUEsWUFBVSxFQUFWOztBQUNBN1IsSUFBRXlDLElBQUYsQ0FBT3VILElBQVAsRUFBYSxVQUFDd0UsSUFBRDtBQUNaLFFBQUFoRCxVQUFBLEVBQUFlLEtBQUE7O0FBQUEsUUFBR3ZNLEVBQUVXLE9BQUYsQ0FBVTZOLElBQVYsQ0FBSDtBQzJJSSxhRHpJSHFELFFBQVFqTSxJQUFSLENBQWE0SSxJQUFiLENDeUlHO0FEM0lKLFdBR0ssSUFBR3hPLEVBQUU4RSxRQUFGLENBQVcwSixJQUFYLENBQUg7QUFFSmhELG1CQUFhZ0QsS0FBS2hELFVBQWxCO0FBQ0FlLGNBQVFpQyxLQUFLakMsS0FBYjs7QUFDQSxVQUFHZixjQUFjZSxLQUFqQjtBQ3lJSyxlRHhJSnNGLFFBQVFqTSxJQUFSLENBQWEsQ0FBQzRGLFVBQUQsRUFBYWUsS0FBYixDQUFiLENDd0lJO0FEN0lEO0FDK0lGO0FEbkpKOztBQVdBLFNBQU9zRixPQUFQO0FBYjJCLENBQTVCLEM7Ozs7Ozs7Ozs7OztBRXphQWhULGFBQWFpVCxLQUFiLENBQW1CQyxJQUFuQixHQUEwQixJQUFJQyxNQUFKLENBQVcsMEJBQVgsQ0FBMUI7O0FBRUEsSUFBRzNZLE9BQU91SCxRQUFWO0FBQ0N2SCxTQUFPQyxPQUFQLENBQWU7QUFDZCxRQUFBMlksY0FBQTs7QUFBQUEscUJBQWlCcFQsYUFBYXFULGVBQWIsQ0FBNkJDLEtBQTdCLElBQXNDLEVBQXZEOztBQUNBRixtQkFBZXJNLElBQWYsQ0FBb0I7QUFBQ3dNLFdBQUt2VCxhQUFhaVQsS0FBYixDQUFtQkMsSUFBekI7QUFBK0JNLFdBQUs7QUFBcEMsS0FBcEI7O0FDS0UsV0RKRnhULGFBQWF5VCxRQUFiLENBQXNCO0FBQ3JCSCxhQUFPRjtBQURjLEtBQXRCLENDSUU7QURQSDtBQ1dBLEM7Ozs7Ozs7Ozs7OztBQ2REcFQsYUFBYWlULEtBQWIsQ0FBbUJyRyxLQUFuQixHQUEyQixJQUFJdUcsTUFBSixDQUFXLDZDQUFYLENBQTNCOztBQUVBLElBQUczWSxPQUFPdUgsUUFBVjtBQUNDdkgsU0FBT0MsT0FBUCxDQUFlO0FBQ2QsUUFBQTJZLGNBQUE7O0FBQUFBLHFCQUFpQnBULGFBQWFxVCxlQUFiLENBQTZCQyxLQUE3QixJQUFzQyxFQUF2RDs7QUFDQUYsbUJBQWVyTSxJQUFmLENBQW9CO0FBQUN3TSxXQUFLdlQsYUFBYWlULEtBQWIsQ0FBbUJyRyxLQUF6QjtBQUFnQzRHLFdBQUs7QUFBckMsS0FBcEI7O0FDS0UsV0RKRnhULGFBQWF5VCxRQUFiLENBQXNCO0FBQ3JCSCxhQUFPRjtBQURjLEtBQXRCLENDSUU7QURQSDtBQ1dBLEM7Ozs7Ozs7Ozs7O0FDZEQ7QUFDQXZhLE9BQU8sQ0FBQzZhLGFBQVIsR0FBd0IsVUFBU0MsRUFBVCxFQUFhdFEsT0FBYixFQUFzQjtBQUMxQztBQUNBLFNBQU8sWUFBVztBQUNqQixXQUFPdVEsSUFBSSxDQUFDRCxFQUFELENBQVg7QUFDSCxHQUZTLENBRVJFLElBRlEsQ0FFSHhRLE9BRkcsQ0FBUDtBQUdILENBTEQ7O0FBUUF4SyxPQUFPLENBQUMrYSxJQUFSLEdBQWUsVUFBU0QsRUFBVCxFQUFZO0FBQzFCLE1BQUc7QUFDRixXQUFPQyxJQUFJLENBQUNELEVBQUQsQ0FBWDtBQUNBLEdBRkQsQ0FFQyxPQUFPbGEsQ0FBUCxFQUFTO0FBQ1R3RixXQUFPLENBQUNPLEtBQVIsQ0FBYy9GLENBQWQsRUFBaUJrYSxFQUFqQjtBQUNBO0FBQ0QsQ0FORCxDOzs7Ozs7Ozs7Ozs7QUNUQyxJQUFBRyxZQUFBLEVBQUFDLFNBQUE7O0FBQUFBLFlBQVksVUFBQ0MsTUFBRDtBQUNYLE1BQUFDLEdBQUE7QUFBQUEsUUFBTUQsT0FBT2hFLEtBQVAsQ0FBYSxHQUFiLENBQU47O0FBQ0EsTUFBR2lFLElBQUlqUSxNQUFKLEdBQWEsQ0FBaEI7QUFDQyxXQUFPO0FBQUNpSSxhQUFPZ0ksSUFBSSxDQUFKLENBQVI7QUFBZ0JsUSxhQUFPa1EsSUFBSSxDQUFKLENBQXZCO0FBQStCQyxhQUFPRCxJQUFJLENBQUo7QUFBdEMsS0FBUDtBQURELFNBRUssSUFBR0EsSUFBSWpRLE1BQUosR0FBYSxDQUFoQjtBQUNKLFdBQU87QUFBQ2lJLGFBQU9nSSxJQUFJLENBQUosQ0FBUjtBQUFnQmxRLGFBQU9rUSxJQUFJLENBQUo7QUFBdkIsS0FBUDtBQURJO0FBR0osV0FBTztBQUFDaEksYUFBT2dJLElBQUksQ0FBSixDQUFSO0FBQWdCbFEsYUFBT2tRLElBQUksQ0FBSjtBQUF2QixLQUFQO0FDY0E7QURyQlUsQ0FBWjs7QUFTQUgsZUFBZSxVQUFDalQsV0FBRCxFQUFjOEwsVUFBZCxFQUEwQkMsS0FBMUIsRUFBaUNsSyxPQUFqQztBQUNkLE1BQUF5UixVQUFBLEVBQUFqQixJQUFBLEVBQUEvVixPQUFBLEVBQUFpWCxRQUFBLEVBQUFDLGVBQUEsRUFBQXpTLEdBQUE7O0FBQUEsTUFBR3BILE9BQU9rRyxRQUFQLElBQW1CZ0MsT0FBbkIsSUFBOEJrSyxNQUFNMVAsSUFBTixLQUFjLFFBQS9DO0FBQ0NnVyxXQUFPdEcsTUFBTXdILFFBQU4sSUFBcUJ2VCxjQUFZLEdBQVosR0FBZThMLFVBQTNDOztBQUNBLFFBQUd1RyxJQUFIO0FBQ0NrQixpQkFBV3ZiLFFBQVF5YixXQUFSLENBQW9CcEIsSUFBcEIsRUFBMEJ4USxPQUExQixDQUFYOztBQUNBLFVBQUcwUixRQUFIO0FBQ0NqWCxrQkFBVSxFQUFWO0FBQ0FnWCxxQkFBYSxFQUFiO0FBQ0FFLDBCQUFrQnhiLFFBQVEwYixrQkFBUixDQUEyQkgsUUFBM0IsQ0FBbEI7QUFDQUMsMEJBQUEsQ0FBQXpTLE1BQUFULEVBQUFzRCxNQUFBLENBQUE0UCxlQUFBLHdCQUFBelMsSUFBd0Q0UyxPQUF4RCxLQUFrQixNQUFsQjs7QUFDQXJULFVBQUV5QyxJQUFGLENBQU95USxlQUFQLEVBQXdCLFVBQUMxRSxJQUFEO0FBQ3ZCLGNBQUExRCxLQUFBLEVBQUFsSSxLQUFBO0FBQUFrSSxrQkFBUTBELEtBQUs3UixJQUFiO0FBQ0FpRyxrQkFBUTRMLEtBQUs1TCxLQUFMLElBQWM0TCxLQUFLN1IsSUFBM0I7QUFDQXFXLHFCQUFXcE4sSUFBWCxDQUFnQjtBQUFDa0YsbUJBQU9BLEtBQVI7QUFBZWxJLG1CQUFPQSxLQUF0QjtBQUE2QjBRLG9CQUFROUUsS0FBSzhFLE1BQTFDO0FBQWtEUCxtQkFBT3ZFLEtBQUt1RTtBQUE5RCxXQUFoQjs7QUFDQSxjQUFHdkUsS0FBSzhFLE1BQVI7QUFDQ3RYLG9CQUFRNEosSUFBUixDQUFhO0FBQUNrRixxQkFBT0EsS0FBUjtBQUFlbEkscUJBQU9BLEtBQXRCO0FBQTZCbVEscUJBQU92RSxLQUFLdUU7QUFBekMsYUFBYjtBQzJCSTs7QUQxQkwsY0FBR3ZFLEtBQUksU0FBSixDQUFIO0FDNEJNLG1CRDNCTC9DLE1BQU04SCxZQUFOLEdBQXFCM1EsS0MyQmhCO0FBQ0Q7QURuQ047O0FBUUEsWUFBRzVHLFFBQVE2RyxNQUFSLEdBQWlCLENBQXBCO0FBQ0M0SSxnQkFBTXpQLE9BQU4sR0FBZ0JBLE9BQWhCO0FDOEJHOztBRDdCSixZQUFHZ1gsV0FBV25RLE1BQVgsR0FBb0IsQ0FBdkI7QUFDQzRJLGdCQUFNdUgsVUFBTixHQUFtQkEsVUFBbkI7QUFoQkY7QUFGRDtBQUZEO0FDc0RDOztBRGpDRCxTQUFPdkgsS0FBUDtBQXRCYyxDQUFmOztBQXdCQS9ULFFBQVF3SSxhQUFSLEdBQXdCLFVBQUN2QixNQUFELEVBQVM0QyxPQUFUO0FBQ3ZCLE1BQUcsQ0FBQzVDLE1BQUo7QUFDQztBQ29DQTs7QURuQ0RxQixJQUFFNE4sT0FBRixDQUFValAsT0FBTzZVLFFBQWpCLEVBQTJCLFVBQUNDLE9BQUQsRUFBVXpQLEdBQVY7QUFFMUIsUUFBQTBQLEtBQUEsRUFBQUMsZUFBQSxFQUFBQyxhQUFBOztBQUFBLFFBQUl2YSxPQUFPa0csUUFBUCxJQUFtQmtVLFFBQVFJLEVBQVIsS0FBYyxRQUFsQyxJQUFnRHhhLE9BQU91SCxRQUFQLElBQW1CNlMsUUFBUUksRUFBUixLQUFjLFFBQXBGO0FBQ0NGLHdCQUFBRixXQUFBLE9BQWtCQSxRQUFTQyxLQUEzQixHQUEyQixNQUEzQjtBQUNBRSxzQkFBZ0JILFFBQVFLLElBQXhCOztBQUNBLFVBQUdILG1CQUFtQjNULEVBQUVtQyxRQUFGLENBQVd3UixlQUFYLENBQXRCO0FBQ0NGLGdCQUFRSyxJQUFSLEdBQWVwYyxRQUFPLE1BQVAsRUFBYSxNQUFJaWMsZUFBSixHQUFvQixHQUFqQyxDQUFmO0FDcUNFOztBRG5DSCxVQUFHQyxpQkFBaUI1VCxFQUFFbUMsUUFBRixDQUFXeVIsYUFBWCxDQUFwQjtBQUdDLFlBQUdBLGNBQWNuTSxVQUFkLENBQXlCLFVBQXpCLENBQUg7QUFDQ2dNLGtCQUFRSyxJQUFSLEdBQWVwYyxRQUFPLE1BQVAsRUFBYSxNQUFJa2MsYUFBSixHQUFrQixHQUEvQixDQUFmO0FBREQ7QUFHQ0gsa0JBQVFLLElBQVIsR0FBZXBjLFFBQU8sTUFBUCxFQUFhLDJEQUF5RGtjLGFBQXpELEdBQXVFLElBQXBGLENBQWY7QUFORjtBQU5EO0FDaURFOztBRG5DRixRQUFHdmEsT0FBT2tHLFFBQVAsSUFBbUJrVSxRQUFRSSxFQUFSLEtBQWMsUUFBcEM7QUFDQ0gsY0FBUUQsUUFBUUssSUFBaEI7O0FBQ0EsVUFBR0osU0FBUzFULEVBQUV1SCxVQUFGLENBQWFtTSxLQUFiLENBQVo7QUNxQ0ksZURwQ0hELFFBQVFDLEtBQVIsR0FBZ0JBLE1BQU10UCxRQUFOLEVDb0NiO0FEdkNMO0FDeUNFO0FEekRIOztBQXFCQSxNQUFHL0ssT0FBT3VILFFBQVY7QUFDQ1osTUFBRTROLE9BQUYsQ0FBVWpQLE9BQU9rRCxNQUFqQixFQUF5QixVQUFDNEosS0FBRCxFQUFRekgsR0FBUjtBQUV4QixVQUFBK1AsZ0JBQUE7O0FBQUEsVUFBR3RJLE1BQU11SSxJQUFUO0FBRUN2SSxjQUFNWSxNQUFOLEdBQWUsSUFBZjtBQ3NDRTs7QURwQ0gsVUFBR1osTUFBTXdJLFFBQU4sSUFBa0J4SSxNQUFNeUksUUFBM0I7QUFFQ3pJLGNBQU15SSxRQUFOLEdBQWlCLEtBQWpCO0FDcUNFOztBRG5DSEgseUJBQW1CcmMsUUFBUXljLG1CQUFSLEVBQW5COztBQUNBLFVBQUdKLGlCQUFpQmhTLE9BQWpCLENBQXlCaUMsR0FBekIsSUFBZ0MsQ0FBQyxDQUFwQztBQ3FDSSxlRG5DSHlILE1BQU15SSxRQUFOLEdBQWlCLElDbUNkO0FBQ0Q7QURqREo7O0FBZUFsVSxNQUFFNE4sT0FBRixDQUFValAsT0FBT3NRLE9BQWpCLEVBQTBCLFVBQUN0TSxNQUFELEVBQVNxQixHQUFUO0FBQ3pCLFVBQUEyUCxlQUFBLEVBQUFDLGFBQUEsRUFBQVEsUUFBQSxFQUFBL1YsS0FBQTs7QUFBQXNWLHdCQUFBaFIsVUFBQSxPQUFrQkEsT0FBUStRLEtBQTFCLEdBQTBCLE1BQTFCO0FBQ0FFLHNCQUFBalIsVUFBQSxPQUFnQkEsT0FBUW1SLElBQXhCLEdBQXdCLE1BQXhCOztBQUNBLFVBQUdILG1CQUFtQjNULEVBQUVtQyxRQUFGLENBQVd3UixlQUFYLENBQXRCO0FBRUM7QUFDQ2hSLGlCQUFPbVIsSUFBUCxHQUFjcGMsUUFBTyxNQUFQLEVBQWEsTUFBSWljLGVBQUosR0FBb0IsR0FBakMsQ0FBZDtBQURELGlCQUFBVSxNQUFBO0FBRU1oVyxrQkFBQWdXLE1BQUE7QUFDTHZXLGtCQUFRTyxLQUFSLENBQWMsZ0JBQWQsRUFBZ0NzVixlQUFoQztBQUxGO0FDNENHOztBRHRDSCxVQUFHQyxpQkFBaUI1VCxFQUFFbUMsUUFBRixDQUFXeVIsYUFBWCxDQUFwQjtBQUVDO0FBQ0MsY0FBR0EsY0FBY25NLFVBQWQsQ0FBeUIsVUFBekIsQ0FBSDtBQUNDOUUsbUJBQU9tUixJQUFQLEdBQWNwYyxRQUFPLE1BQVAsRUFBYSxNQUFJa2MsYUFBSixHQUFrQixHQUEvQixDQUFkO0FBREQ7QUFHQyxnQkFBRzVULEVBQUV1SCxVQUFGLENBQWE3UCxRQUFRNGMsYUFBUixDQUFzQlYsYUFBdEIsQ0FBYixDQUFIO0FBQ0NqUixxQkFBT21SLElBQVAsR0FBY0YsYUFBZDtBQUREO0FBR0NqUixxQkFBT21SLElBQVAsR0FBY3BjLFFBQU8sTUFBUCxFQUFhLGlCQUFla2MsYUFBZixHQUE2QixJQUExQyxDQUFkO0FBTkY7QUFERDtBQUFBLGlCQUFBUyxNQUFBO0FBUU1oVyxrQkFBQWdXLE1BQUE7QUFDTHZXLGtCQUFRTyxLQUFSLENBQWMsY0FBZCxFQUE4QnVWLGFBQTlCLEVBQTZDdlYsS0FBN0M7QUFYRjtBQ3NERzs7QUR6Q0grVixpQkFBQXpSLFVBQUEsT0FBV0EsT0FBUXlSLFFBQW5CLEdBQW1CLE1BQW5COztBQUNBLFVBQUdBLFFBQUg7QUFDQztBQUNDLGNBQUdwVSxFQUFFbUMsUUFBRixDQUFXaVMsUUFBWCxDQUFIO0FBQ0NBLHVCQUFXQSxTQUFTRyxJQUFULEVBQVg7QUMyQ0k7O0FEMUNMLGNBQUdwUSxRQUFRcVEsWUFBUixDQUFxQkosUUFBckIsQ0FBSDtBQzRDTSxtQkQxQ0x6UixPQUFPOFIsT0FBUCxHQUFpQixVQUFDL1UsV0FBRCxFQUFjd00sU0FBZCxFQUF5QndJLGtCQUF6QixFQUE2QzdKLE1BQTdDO0FBQ2hCLGtCQUFBOEosVUFBQTtBQUFBQSwyQkFBYXhVLE9BQU95VSxNQUFQLENBQWMsRUFBZCxFQUFrQmxkLFFBQVE2TyxZQUExQixFQUF3QztBQUFDc08scUJBQUssSUFBSTVRLElBQUo7QUFBTixlQUF4QyxDQUFiO0FBQ0EscUJBQU9FLFFBQVEyUSxxQkFBUixDQUE4QlYsUUFBOUIsRUFBd0N2SixNQUF4QyxFQUFnRCxHQUFoRCxFQUFxRDhKLFVBQXJELENBQVA7QUFGZ0IsYUMwQ1o7QUQ1Q047QUNvRE0sbUJEOUNMaFMsT0FBTzhSLE9BQVAsR0FBaUIvYyxRQUFPLE1BQVAsRUFBYSxNQUFJMGMsUUFBSixHQUFhLEdBQTFCLENDOENaO0FEdkRQO0FBQUEsaUJBQUFDLE1BQUE7QUFVTWhXLGtCQUFBZ1csTUFBQTtBQ2lERCxpQkRoREp2VyxRQUFRTyxLQUFSLENBQWMsb0NBQWQsRUFBb0RBLEtBQXBELEVBQTJEK1YsUUFBM0QsQ0NnREk7QUQ1RE47QUM4REc7QURyRko7QUFoQkQ7QUFxRENwVSxNQUFFNE4sT0FBRixDQUFValAsT0FBT3NRLE9BQWpCLEVBQTBCLFVBQUN0TSxNQUFELEVBQVNxQixHQUFUO0FBQ3pCLFVBQUEwUCxLQUFBLEVBQUFVLFFBQUE7O0FBQUFWLGNBQUEvUSxVQUFBLE9BQVFBLE9BQVFtUixJQUFoQixHQUFnQixNQUFoQjs7QUFDQSxVQUFHSixTQUFTMVQsRUFBRXVILFVBQUYsQ0FBYW1NLEtBQWIsQ0FBWjtBQUVDL1EsZUFBTytRLEtBQVAsR0FBZUEsTUFBTXRQLFFBQU4sRUFBZjtBQ29ERTs7QURsREhnUSxpQkFBQXpSLFVBQUEsT0FBV0EsT0FBUThSLE9BQW5CLEdBQW1CLE1BQW5COztBQUVBLFVBQUdMLFlBQVlwVSxFQUFFdUgsVUFBRixDQUFhNk0sUUFBYixDQUFmO0FDbURJLGVEbERIelIsT0FBT3lSLFFBQVAsR0FBa0JBLFNBQVNoUSxRQUFULEVDa0RmO0FBQ0Q7QUQ1REo7QUM4REE7O0FEbkREcEUsSUFBRTROLE9BQUYsQ0FBVWpQLE9BQU9rRCxNQUFqQixFQUF5QixVQUFDNEosS0FBRCxFQUFRekgsR0FBUjtBQUV4QixRQUFBK1EsUUFBQSxFQUFBQyxLQUFBLEVBQUFDLGtCQUFBLEVBQUEzVixjQUFBLEVBQUFpVSxZQUFBLEVBQUFsVixLQUFBLEVBQUFVLGVBQUEsRUFBQW1XLGtCQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBcFosT0FBQSxFQUFBcUQsZUFBQSxFQUFBK0YsWUFBQSxFQUFBK00sS0FBQTs7QUFBQTFHLFlBQVFrSCxhQUFhaFUsT0FBT2hDLElBQXBCLEVBQTBCcUgsR0FBMUIsRUFBK0J5SCxLQUEvQixFQUFzQ2xLLE9BQXRDLENBQVI7O0FBRUEsUUFBR2tLLE1BQU16UCxPQUFOLElBQWlCZ0UsRUFBRW1DLFFBQUYsQ0FBV3NKLE1BQU16UCxPQUFqQixDQUFwQjtBQUNDO0FBQ0MrWSxtQkFBVyxFQUFYOztBQUVBL1UsVUFBRTROLE9BQUYsQ0FBVW5DLE1BQU16UCxPQUFOLENBQWM2UyxLQUFkLENBQW9CLElBQXBCLENBQVYsRUFBcUMsVUFBQ2dFLE1BQUQ7QUFDcEMsY0FBQTdXLE9BQUE7O0FBQUEsY0FBRzZXLE9BQU85USxPQUFQLENBQWUsR0FBZixDQUFIO0FBQ0MvRixzQkFBVTZXLE9BQU9oRSxLQUFQLENBQWEsR0FBYixDQUFWO0FDb0RLLG1CRG5ETDdPLEVBQUU0TixPQUFGLENBQVU1UixPQUFWLEVBQW1CLFVBQUNxWixPQUFEO0FDb0RaLHFCRG5ETk4sU0FBU25QLElBQVQsQ0FBY2dOLFVBQVV5QyxPQUFWLENBQWQsQ0NtRE07QURwRFAsY0NtREs7QURyRE47QUN5RE0sbUJEcERMTixTQUFTblAsSUFBVCxDQUFjZ04sVUFBVUMsTUFBVixDQUFkLENDb0RLO0FBQ0Q7QUQzRE47O0FBT0FwSCxjQUFNelAsT0FBTixHQUFnQitZLFFBQWhCO0FBVkQsZUFBQVYsTUFBQTtBQVdNaFcsZ0JBQUFnVyxNQUFBO0FBQ0x2VyxnQkFBUU8sS0FBUixDQUFjLDhCQUFkLEVBQThDb04sTUFBTXpQLE9BQXBELEVBQTZEcUMsS0FBN0Q7QUFiRjtBQUFBLFdBZUssSUFBR29OLE1BQU16UCxPQUFOLElBQWlCZ0UsRUFBRVcsT0FBRixDQUFVOEssTUFBTXpQLE9BQWhCLENBQXBCO0FBQ0o7QUFDQytZLG1CQUFXLEVBQVg7O0FBRUEvVSxVQUFFNE4sT0FBRixDQUFVbkMsTUFBTXpQLE9BQWhCLEVBQXlCLFVBQUM2VyxNQUFEO0FBQ3hCLGNBQUc3UyxFQUFFbUMsUUFBRixDQUFXMFEsTUFBWCxDQUFIO0FDdURNLG1CRHRETGtDLFNBQVNuUCxJQUFULENBQWNnTixVQUFVQyxNQUFWLENBQWQsQ0NzREs7QUR2RE47QUN5RE0sbUJEdERMa0MsU0FBU25QLElBQVQsQ0FBY2lOLE1BQWQsQ0NzREs7QUFDRDtBRDNETjs7QUFLQXBILGNBQU16UCxPQUFOLEdBQWdCK1ksUUFBaEI7QUFSRCxlQUFBVixNQUFBO0FBU01oVyxnQkFBQWdXLE1BQUE7QUFDTHZXLGdCQUFRTyxLQUFSLENBQWMsOEJBQWQsRUFBOENvTixNQUFNelAsT0FBcEQsRUFBNkRxQyxLQUE3RDtBQVhHO0FBQUEsV0FhQSxJQUFHb04sTUFBTXpQLE9BQU4sSUFBaUIsQ0FBQ2dFLEVBQUV1SCxVQUFGLENBQWFrRSxNQUFNelAsT0FBbkIsQ0FBbEIsSUFBaUQsQ0FBQ2dFLEVBQUVXLE9BQUYsQ0FBVThLLE1BQU16UCxPQUFoQixDQUFsRCxJQUE4RWdFLEVBQUU4RSxRQUFGLENBQVcyRyxNQUFNelAsT0FBakIsQ0FBakY7QUFDSitZLGlCQUFXLEVBQVg7O0FBQ0EvVSxRQUFFeUMsSUFBRixDQUFPZ0osTUFBTXpQLE9BQWIsRUFBc0IsVUFBQ3lILENBQUQsRUFBSTZSLENBQUo7QUMwRGxCLGVEekRIUCxTQUFTblAsSUFBVCxDQUFjO0FBQUNrRixpQkFBT3JILENBQVI7QUFBV2IsaUJBQU8wUztBQUFsQixTQUFkLENDeURHO0FEMURKOztBQUVBN0osWUFBTXpQLE9BQU4sR0FBZ0IrWSxRQUFoQjtBQzhEQzs7QUQ1REYsUUFBRzFiLE9BQU9rRyxRQUFWO0FBQ0N2RCxnQkFBVXlQLE1BQU16UCxPQUFoQjs7QUFDQSxVQUFHQSxXQUFXZ0UsRUFBRXVILFVBQUYsQ0FBYXZMLE9BQWIsQ0FBZDtBQUNDeVAsY0FBTXNKLFFBQU4sR0FBaUJ0SixNQUFNelAsT0FBTixDQUFjb0ksUUFBZCxFQUFqQjtBQUhGO0FBQUE7QUFLQ3BJLGdCQUFVeVAsTUFBTXNKLFFBQWhCOztBQUNBLFVBQUcvWSxXQUFXZ0UsRUFBRW1DLFFBQUYsQ0FBV25HLE9BQVgsQ0FBZDtBQUNDO0FBQ0N5UCxnQkFBTXpQLE9BQU4sR0FBZ0J0RSxRQUFPLE1BQVAsRUFBYSxNQUFJc0UsT0FBSixHQUFZLEdBQXpCLENBQWhCO0FBREQsaUJBQUFxWSxNQUFBO0FBRU1oVyxrQkFBQWdXLE1BQUE7QUFDTHZXLGtCQUFRTyxLQUFSLENBQWMsbUJBQWlCTSxPQUFPaEMsSUFBeEIsR0FBNkIsTUFBN0IsR0FBbUM4TyxNQUFNOU8sSUFBdkQsRUFBK0QwQixLQUEvRDtBQUpGO0FBTkQ7QUM0RUU7O0FEaEVGLFFBQUdoRixPQUFPa0csUUFBVjtBQUNDNFMsY0FBUTFHLE1BQU0wRyxLQUFkOztBQUNBLFVBQUdBLEtBQUg7QUFDQzFHLGNBQU04SixNQUFOLEdBQWU5SixNQUFNMEcsS0FBTixDQUFZL04sUUFBWixFQUFmO0FBSEY7QUFBQTtBQUtDK04sY0FBUTFHLE1BQU04SixNQUFkOztBQUNBLFVBQUdwRCxLQUFIO0FBQ0M7QUFDQzFHLGdCQUFNMEcsS0FBTixHQUFjemEsUUFBTyxNQUFQLEVBQWEsTUFBSXlhLEtBQUosR0FBVSxHQUF2QixDQUFkO0FBREQsaUJBQUFrQyxNQUFBO0FBRU1oVyxrQkFBQWdXLE1BQUE7QUFDTHZXLGtCQUFRTyxLQUFSLENBQWMsbUJBQWlCTSxPQUFPaEMsSUFBeEIsR0FBNkIsTUFBN0IsR0FBbUM4TyxNQUFNOU8sSUFBdkQsRUFBK0QwQixLQUEvRDtBQUpGO0FBTkQ7QUNnRkU7O0FEcEVGLFFBQUdoRixPQUFPa0csUUFBVjtBQUNDNlYsWUFBTTNKLE1BQU0ySixHQUFaOztBQUNBLFVBQUdwVixFQUFFdUgsVUFBRixDQUFhNk4sR0FBYixDQUFIO0FBQ0MzSixjQUFNK0osSUFBTixHQUFhSixJQUFJaFIsUUFBSixFQUFiO0FBSEY7QUFBQTtBQUtDZ1IsWUFBTTNKLE1BQU0rSixJQUFaOztBQUNBLFVBQUd4VixFQUFFbUMsUUFBRixDQUFXaVQsR0FBWCxDQUFIO0FBQ0M7QUFDQzNKLGdCQUFNMkosR0FBTixHQUFZMWQsUUFBTyxNQUFQLEVBQWEsTUFBSTBkLEdBQUosR0FBUSxHQUFyQixDQUFaO0FBREQsaUJBQUFmLE1BQUE7QUFFTWhXLGtCQUFBZ1csTUFBQTtBQUNMdlcsa0JBQVFPLEtBQVIsQ0FBYyxtQkFBaUJNLE9BQU9oQyxJQUF4QixHQUE2QixNQUE3QixHQUFtQzhPLE1BQU05TyxJQUF2RCxFQUErRDBCLEtBQS9EO0FBSkY7QUFORDtBQ29GRTs7QUR4RUYsUUFBR2hGLE9BQU9rRyxRQUFWO0FBQ0M0VixZQUFNMUosTUFBTTBKLEdBQVo7O0FBQ0EsVUFBR25WLEVBQUV1SCxVQUFGLENBQWE0TixHQUFiLENBQUg7QUFDQzFKLGNBQU1nSyxJQUFOLEdBQWFOLElBQUkvUSxRQUFKLEVBQWI7QUFIRjtBQUFBO0FBS0MrUSxZQUFNMUosTUFBTWdLLElBQVo7O0FBQ0EsVUFBR3pWLEVBQUVtQyxRQUFGLENBQVdnVCxHQUFYLENBQUg7QUFDQztBQUNDMUosZ0JBQU0wSixHQUFOLEdBQVl6ZCxRQUFPLE1BQVAsRUFBYSxNQUFJeWQsR0FBSixHQUFRLEdBQXJCLENBQVo7QUFERCxpQkFBQWQsTUFBQTtBQUVNaFcsa0JBQUFnVyxNQUFBO0FBQ0x2VyxrQkFBUU8sS0FBUixDQUFjLG1CQUFpQk0sT0FBT2hDLElBQXhCLEdBQTZCLE1BQTdCLEdBQW1DOE8sTUFBTTlPLElBQXZELEVBQStEMEIsS0FBL0Q7QUFKRjtBQU5EO0FDd0ZFOztBRDVFRixRQUFHaEYsT0FBT2tHLFFBQVY7QUFDQyxVQUFHa00sTUFBTUksUUFBVDtBQUNDbUosZ0JBQVF2SixNQUFNSSxRQUFOLENBQWU5UCxJQUF2Qjs7QUFDQSxZQUFHaVosU0FBU2hWLEVBQUV1SCxVQUFGLENBQWF5TixLQUFiLENBQVQsSUFBZ0NBLFVBQVM3VSxNQUF6QyxJQUFtRDZVLFVBQVM1VixNQUE1RCxJQUFzRTRWLFVBQVNVLE1BQS9FLElBQXlGVixVQUFTVyxPQUFsRyxJQUE2RyxDQUFDM1YsRUFBRVcsT0FBRixDQUFVcVUsS0FBVixDQUFqSDtBQUNDdkosZ0JBQU1JLFFBQU4sQ0FBZW1KLEtBQWYsR0FBdUJBLE1BQU01USxRQUFOLEVBQXZCO0FBSEY7QUFERDtBQUFBO0FBTUMsVUFBR3FILE1BQU1JLFFBQVQ7QUFDQ21KLGdCQUFRdkosTUFBTUksUUFBTixDQUFlbUosS0FBdkI7O0FBQ0EsWUFBR0EsU0FBU2hWLEVBQUVtQyxRQUFGLENBQVc2UyxLQUFYLENBQVo7QUFDQztBQUNDdkosa0JBQU1JLFFBQU4sQ0FBZTlQLElBQWYsR0FBc0JyRSxRQUFPLE1BQVAsRUFBYSxNQUFJc2QsS0FBSixHQUFVLEdBQXZCLENBQXRCO0FBREQsbUJBQUFYLE1BQUE7QUFFTWhXLG9CQUFBZ1csTUFBQTtBQUNMdlcsb0JBQVFPLEtBQVIsQ0FBYyw2QkFBZCxFQUE2Q29OLEtBQTdDLEVBQW9EcE4sS0FBcEQ7QUFKRjtBQUZEO0FBTkQ7QUNnR0U7O0FEbEZGLFFBQUdoRixPQUFPa0csUUFBVjtBQUVDRix3QkFBa0JvTSxNQUFNcE0sZUFBeEI7QUFDQStGLHFCQUFlcUcsTUFBTXJHLFlBQXJCO0FBQ0E5Rix1QkFBaUJtTSxNQUFNbk0sY0FBdkI7QUFDQTJWLDJCQUFxQnhKLE1BQU13SixrQkFBM0I7QUFDQWxXLHdCQUFrQjBNLE1BQU0xTSxlQUF4Qjs7QUFFQSxVQUFHTSxtQkFBbUJXLEVBQUV1SCxVQUFGLENBQWFsSSxlQUFiLENBQXRCO0FBQ0NvTSxjQUFNbUssZ0JBQU4sR0FBeUJ2VyxnQkFBZ0IrRSxRQUFoQixFQUF6QjtBQ2tGRTs7QURoRkgsVUFBR2dCLGdCQUFnQnBGLEVBQUV1SCxVQUFGLENBQWFuQyxZQUFiLENBQW5CO0FBQ0NxRyxjQUFNb0ssYUFBTixHQUFzQnpRLGFBQWFoQixRQUFiLEVBQXRCO0FDa0ZFOztBRGhGSCxVQUFHOUUsa0JBQWtCVSxFQUFFdUgsVUFBRixDQUFhakksY0FBYixDQUFyQjtBQUNDbU0sY0FBTXFLLGVBQU4sR0FBd0J4VyxlQUFlOEUsUUFBZixFQUF4QjtBQ2tGRTs7QURqRkgsVUFBRzZRLHNCQUFzQmpWLEVBQUV1SCxVQUFGLENBQWEwTixrQkFBYixDQUF6QjtBQUNDeEosY0FBTXNLLG1CQUFOLEdBQTRCZCxtQkFBbUI3USxRQUFuQixFQUE1QjtBQ21GRTs7QURqRkgsVUFBR3JGLG1CQUFtQmlCLEVBQUV1SCxVQUFGLENBQWF4SSxlQUFiLENBQXRCO0FBQ0MwTSxjQUFNdUssZ0JBQU4sR0FBeUJqWCxnQkFBZ0JxRixRQUFoQixFQUF6QjtBQXBCRjtBQUFBO0FBdUJDL0Usd0JBQWtCb00sTUFBTW1LLGdCQUFOLElBQTBCbkssTUFBTXBNLGVBQWxEO0FBQ0ErRixxQkFBZXFHLE1BQU1vSyxhQUFyQjtBQUNBdlcsdUJBQWlCbU0sTUFBTXFLLGVBQXZCO0FBQ0FiLDJCQUFxQnhKLE1BQU1zSyxtQkFBM0I7QUFDQWhYLHdCQUFrQjBNLE1BQU11SyxnQkFBTixJQUEwQnZLLE1BQU0xTSxlQUFsRDs7QUFFQSxVQUFHTSxtQkFBbUJXLEVBQUVtQyxRQUFGLENBQVc5QyxlQUFYLENBQXRCO0FBQ0NvTSxjQUFNcE0sZUFBTixHQUF3QjNILFFBQU8sTUFBUCxFQUFhLE1BQUkySCxlQUFKLEdBQW9CLEdBQWpDLENBQXhCO0FDa0ZFOztBRGhGSCxVQUFHK0YsZ0JBQWdCcEYsRUFBRW1DLFFBQUYsQ0FBV2lELFlBQVgsQ0FBbkI7QUFDQ3FHLGNBQU1yRyxZQUFOLEdBQXFCMU4sUUFBTyxNQUFQLEVBQWEsTUFBSTBOLFlBQUosR0FBaUIsR0FBOUIsQ0FBckI7QUNrRkU7O0FEaEZILFVBQUc5RixrQkFBa0JVLEVBQUVtQyxRQUFGLENBQVc3QyxjQUFYLENBQXJCO0FBQ0NtTSxjQUFNbk0sY0FBTixHQUF1QjVILFFBQU8sTUFBUCxFQUFhLE1BQUk0SCxjQUFKLEdBQW1CLEdBQWhDLENBQXZCO0FDa0ZFOztBRGhGSCxVQUFHMlYsc0JBQXNCalYsRUFBRW1DLFFBQUYsQ0FBVzhTLGtCQUFYLENBQXpCO0FBQ0N4SixjQUFNd0osa0JBQU4sR0FBMkJ2ZCxRQUFPLE1BQVAsRUFBYSxNQUFJdWQsa0JBQUosR0FBdUIsR0FBcEMsQ0FBM0I7QUNrRkU7O0FEaEZILFVBQUdsVyxtQkFBbUJpQixFQUFFbUMsUUFBRixDQUFXcEQsZUFBWCxDQUF0QjtBQUNDME0sY0FBTTFNLGVBQU4sR0FBd0JySCxRQUFPLE1BQVAsRUFBYSxNQUFJcUgsZUFBSixHQUFvQixHQUFqQyxDQUF4QjtBQTFDRjtBQzZIRTs7QURqRkYsUUFBRzFGLE9BQU9rRyxRQUFWO0FBQ0NnVSxxQkFBZTlILE1BQU04SCxZQUFyQjs7QUFDQSxVQUFHQSxnQkFBZ0J2VCxFQUFFdUgsVUFBRixDQUFhZ00sWUFBYixDQUFuQjtBQUNDOUgsY0FBTXdLLGFBQU4sR0FBc0J4SyxNQUFNOEgsWUFBTixDQUFtQm5QLFFBQW5CLEVBQXRCO0FBSEY7QUFBQTtBQUtDbVAscUJBQWU5SCxNQUFNd0ssYUFBckI7O0FBRUEsVUFBRyxDQUFDMUMsWUFBRCxJQUFpQnZULEVBQUVtQyxRQUFGLENBQVdzSixNQUFNOEgsWUFBakIsQ0FBakIsSUFBbUQ5SCxNQUFNOEgsWUFBTixDQUFtQjlMLFVBQW5CLENBQThCLFVBQTlCLENBQXREO0FBQ0M4TCx1QkFBZTlILE1BQU04SCxZQUFyQjtBQ21GRTs7QURqRkgsVUFBR0EsZ0JBQWdCdlQsRUFBRW1DLFFBQUYsQ0FBV29SLFlBQVgsQ0FBbkI7QUFDQztBQUNDOUgsZ0JBQU04SCxZQUFOLEdBQXFCN2IsUUFBTyxNQUFQLEVBQWEsTUFBSTZiLFlBQUosR0FBaUIsR0FBOUIsQ0FBckI7QUFERCxpQkFBQWMsTUFBQTtBQUVNaFcsa0JBQUFnVyxNQUFBO0FBQ0x2VyxrQkFBUU8sS0FBUixDQUFjLG1CQUFpQk0sT0FBT2hDLElBQXhCLEdBQTZCLE1BQTdCLEdBQW1DOE8sTUFBTTlPLElBQXZELEVBQStEMEIsS0FBL0Q7QUFKRjtBQVZEO0FDb0dFOztBRHBGRixRQUFHaEYsT0FBT2tHLFFBQVY7QUFDQzJWLDJCQUFxQnpKLE1BQU15SixrQkFBM0I7O0FBQ0EsVUFBR0Esc0JBQXNCbFYsRUFBRXVILFVBQUYsQ0FBYTJOLGtCQUFiLENBQXpCO0FDc0ZJLGVEckZIekosTUFBTXlLLG1CQUFOLEdBQTRCekssTUFBTXlKLGtCQUFOLENBQXlCOVEsUUFBekIsRUNxRnpCO0FEeEZMO0FBQUE7QUFLQzhRLDJCQUFxQnpKLE1BQU15SyxtQkFBM0I7O0FBQ0EsVUFBR2hCLHNCQUFzQmxWLEVBQUVtQyxRQUFGLENBQVcrUyxrQkFBWCxDQUF6QjtBQUNDO0FDdUZLLGlCRHRGSnpKLE1BQU15SixrQkFBTixHQUEyQnhkLFFBQU8sTUFBUCxFQUFhLE1BQUl3ZCxrQkFBSixHQUF1QixHQUFwQyxDQ3NGdkI7QUR2RkwsaUJBQUFiLE1BQUE7QUFFTWhXLGtCQUFBZ1csTUFBQTtBQ3dGRCxpQkR2Rkp2VyxRQUFRTyxLQUFSLENBQWMsbUJBQWlCTSxPQUFPaEMsSUFBeEIsR0FBNkIsTUFBN0IsR0FBbUM4TyxNQUFNOU8sSUFBdkQsRUFBK0QwQixLQUEvRCxDQ3VGSTtBRDNGTjtBQU5EO0FDb0dFO0FEcFFIOztBQTRLQTJCLElBQUU0TixPQUFGLENBQVVqUCxPQUFPa0IsVUFBakIsRUFBNkIsVUFBQ3FOLFNBQUQsRUFBWWxKLEdBQVo7QUFDNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkEsSUFBR2hFLEVBQUV1SCxVQUFGLENBQWEyRixVQUFVM0ssT0FBdkIsQ0FBSDtBQUNDLFVBQUdsSixPQUFPa0csUUFBVjtBQzRGSSxlRDNGSDJOLFVBQVVpSixRQUFWLEdBQXFCakosVUFBVTNLLE9BQVYsQ0FBa0I2QixRQUFsQixFQzJGbEI7QUQ3Rkw7QUFBQSxXQUdLLElBQUdwRSxFQUFFbUMsUUFBRixDQUFXK0ssVUFBVWlKLFFBQXJCLENBQUg7QUFDSixVQUFHOWMsT0FBT3VILFFBQVY7QUM2RkksZUQ1RkhzTSxVQUFVM0ssT0FBVixHQUFvQjdLLFFBQU8sTUFBUCxFQUFhLE1BQUl3VixVQUFVaUosUUFBZCxHQUF1QixHQUFwQyxDQzRGakI7QUQ5RkE7QUFBQTtBQ2lHRixhRDdGRm5XLEVBQUU0TixPQUFGLENBQVVWLFVBQVUzSyxPQUFwQixFQUE2QixVQUFDRyxNQUFELEVBQVNjLE1BQVQ7QUFDNUIsWUFBR3hELEVBQUVXLE9BQUYsQ0FBVStCLE1BQVYsQ0FBSDtBQUNDLGNBQUdySixPQUFPa0csUUFBVjtBQUNDLGdCQUFHbUQsT0FBT0csTUFBUCxLQUFpQixDQUFqQixJQUF1QjdDLEVBQUV1SCxVQUFGLENBQWE3RSxPQUFPLENBQVAsQ0FBYixDQUExQjtBQUNDQSxxQkFBTyxDQUFQLElBQVlBLE9BQU8sQ0FBUCxFQUFVMEIsUUFBVixFQUFaO0FDOEZNLHFCRDdGTjFCLE9BQU8sQ0FBUCxJQUFZLFVDNkZOO0FEL0ZQLG1CQUdLLElBQUdBLE9BQU9HLE1BQVAsS0FBaUIsQ0FBakIsSUFBdUI3QyxFQUFFb1csTUFBRixDQUFTMVQsT0FBTyxDQUFQLENBQVQsQ0FBMUI7QUM4RkUscUJEM0ZOQSxPQUFPLENBQVAsSUFBWSxNQzJGTjtBRGxHUjtBQUFBO0FBU0MsZ0JBQUdBLE9BQU9HLE1BQVAsS0FBaUIsQ0FBakIsSUFBdUI3QyxFQUFFbUMsUUFBRixDQUFXTyxPQUFPLENBQVAsQ0FBWCxDQUF2QixJQUFpREEsT0FBTyxDQUFQLE1BQWEsVUFBakU7QUFDQ0EscUJBQU8sQ0FBUCxJQUFZaEwsUUFBTyxNQUFQLEVBQWEsTUFBSWdMLE9BQU8sQ0FBUCxDQUFKLEdBQWMsR0FBM0IsQ0FBWjtBQUNBQSxxQkFBTzJULEdBQVA7QUM2Rks7O0FENUZOLGdCQUFHM1QsT0FBT0csTUFBUCxLQUFpQixDQUFqQixJQUF1QjdDLEVBQUVtQyxRQUFGLENBQVdPLE9BQU8sQ0FBUCxDQUFYLENBQXZCLElBQWlEQSxPQUFPLENBQVAsTUFBYSxNQUFqRTtBQUNDQSxxQkFBTyxDQUFQLElBQVksSUFBSXVCLElBQUosQ0FBU3ZCLE9BQU8sQ0FBUCxDQUFULENBQVo7QUM4Rk0scUJEN0ZOQSxPQUFPMlQsR0FBUCxFQzZGTTtBRDNHUjtBQUREO0FBQUEsZUFnQkssSUFBR3JXLEVBQUU4RSxRQUFGLENBQVdwQyxNQUFYLENBQUg7QUFDSixjQUFHckosT0FBT2tHLFFBQVY7QUFDQyxnQkFBR1MsRUFBRXVILFVBQUYsQ0FBQTdFLFVBQUEsT0FBYUEsT0FBUUUsS0FBckIsR0FBcUIsTUFBckIsQ0FBSDtBQ2dHTyxxQkQvRk5GLE9BQU9tTCxNQUFQLEdBQWdCbkwsT0FBT0UsS0FBUCxDQUFhd0IsUUFBYixFQytGVjtBRGhHUCxtQkFFSyxJQUFHcEUsRUFBRW9XLE1BQUYsQ0FBQTFULFVBQUEsT0FBU0EsT0FBUUUsS0FBakIsR0FBaUIsTUFBakIsQ0FBSDtBQ2dHRSxxQkQvRk5GLE9BQU80VCxRQUFQLEdBQWtCLElDK0ZaO0FEbkdSO0FBQUE7QUFNQyxnQkFBR3RXLEVBQUVtQyxRQUFGLENBQUFPLFVBQUEsT0FBV0EsT0FBUW1MLE1BQW5CLEdBQW1CLE1BQW5CLENBQUg7QUNpR08scUJEaEdObkwsT0FBT0UsS0FBUCxHQUFlbEwsUUFBTyxNQUFQLEVBQWEsTUFBSWdMLE9BQU9tTCxNQUFYLEdBQWtCLEdBQS9CLENDZ0dUO0FEakdQLG1CQUVLLElBQUduTCxPQUFPNFQsUUFBUCxLQUFtQixJQUF0QjtBQ2lHRSxxQkRoR041VCxPQUFPRSxLQUFQLEdBQWUsSUFBSXFCLElBQUosQ0FBU3ZCLE9BQU9FLEtBQWhCLENDZ0dUO0FEekdSO0FBREk7QUM2R0Q7QUQ5SEwsUUM2RkU7QUFtQ0Q7QUQ1Skg7O0FBeURBLE1BQUd2SixPQUFPa0csUUFBVjtBQUNDLFFBQUdaLE9BQU80WCxJQUFQLElBQWUsQ0FBQ3ZXLEVBQUVtQyxRQUFGLENBQVd4RCxPQUFPNFgsSUFBbEIsQ0FBbkI7QUFDQzVYLGFBQU80WCxJQUFQLEdBQWN2TCxLQUFLQyxTQUFMLENBQWV0TSxPQUFPNFgsSUFBdEIsRUFBNEIsVUFBQ3ZTLEdBQUQsRUFBTXdTLEdBQU47QUFDekMsWUFBR3hXLEVBQUV1SCxVQUFGLENBQWFpUCxHQUFiLENBQUg7QUFDQyxpQkFBT0EsTUFBTSxFQUFiO0FBREQ7QUFHQyxpQkFBT0EsR0FBUDtBQ3NHRztBRDFHUyxRQUFkO0FBRkY7QUFBQSxTQU9LLElBQUduZCxPQUFPdUgsUUFBVjtBQUNKLFFBQUdqQyxPQUFPNFgsSUFBVjtBQUNDNVgsYUFBTzRYLElBQVAsR0FBY3ZMLEtBQUsyQyxLQUFMLENBQVdoUCxPQUFPNFgsSUFBbEIsRUFBd0IsVUFBQ3ZTLEdBQUQsRUFBTXdTLEdBQU47QUFDckMsWUFBR3hXLEVBQUVtQyxRQUFGLENBQVdxVSxHQUFYLEtBQW1CQSxJQUFJL08sVUFBSixDQUFlLFVBQWYsQ0FBdEI7QUFDQyxpQkFBTy9QLFFBQU8sTUFBUCxFQUFhLE1BQUk4ZSxHQUFKLEdBQVEsR0FBckIsQ0FBUDtBQUREO0FBR0MsaUJBQU9BLEdBQVA7QUN5R0c7QUQ3R1MsUUFBZDtBQUZHO0FDa0hKOztBRDFHRCxNQUFHbmQsT0FBT3VILFFBQVY7QUFDQ1osTUFBRTROLE9BQUYsQ0FBVWpQLE9BQU80UCxhQUFqQixFQUFnQyxVQUFDa0ksY0FBRDtBQUMvQixVQUFHelcsRUFBRThFLFFBQUYsQ0FBVzJSLGNBQVgsQ0FBSDtBQzRHSSxlRDNHSHpXLEVBQUU0TixPQUFGLENBQVU2SSxjQUFWLEVBQTBCLFVBQUNELEdBQUQsRUFBTXhTLEdBQU47QUFDekIsY0FBQTNGLEtBQUE7O0FBQUEsY0FBRzJGLFFBQU8sU0FBUCxJQUFvQmhFLEVBQUVtQyxRQUFGLENBQVdxVSxHQUFYLENBQXZCO0FBQ0M7QUM2R08scUJENUdOQyxlQUFlelMsR0FBZixJQUFzQnRNLFFBQU8sTUFBUCxFQUFhLE1BQUk4ZSxHQUFKLEdBQVEsR0FBckIsQ0M0R2hCO0FEN0dQLHFCQUFBbkMsTUFBQTtBQUVNaFcsc0JBQUFnVyxNQUFBO0FDOEdDLHFCRDdHTnZXLFFBQVFPLEtBQVIsQ0FBYyxjQUFkLEVBQThCbVksR0FBOUIsQ0M2R007QURqSFI7QUNtSEs7QURwSE4sVUMyR0c7QUFXRDtBRHhISjtBQUREO0FBVUN4VyxNQUFFNE4sT0FBRixDQUFValAsT0FBTzRQLGFBQWpCLEVBQWdDLFVBQUNrSSxjQUFEO0FBQy9CLFVBQUd6VyxFQUFFOEUsUUFBRixDQUFXMlIsY0FBWCxDQUFIO0FDbUhJLGVEbEhIelcsRUFBRTROLE9BQUYsQ0FBVTZJLGNBQVYsRUFBMEIsVUFBQ0QsR0FBRCxFQUFNeFMsR0FBTjtBQUN6QixjQUFHQSxRQUFPLFNBQVAsSUFBb0JoRSxFQUFFdUgsVUFBRixDQUFhaVAsR0FBYixDQUF2QjtBQ21ITSxtQkRsSExDLGVBQWV6UyxHQUFmLElBQXNCd1MsSUFBSXBTLFFBQUosRUNrSGpCO0FBQ0Q7QURySE4sVUNrSEc7QUFLRDtBRHpISjtBQzJIQTs7QURySEQsTUFBRy9LLE9BQU91SCxRQUFWO0FBQ0NaLE1BQUU0TixPQUFGLENBQVVqUCxPQUFPOEYsV0FBakIsRUFBOEIsVUFBQ2dTLGNBQUQ7QUFDN0IsVUFBR3pXLEVBQUU4RSxRQUFGLENBQVcyUixjQUFYLENBQUg7QUN1SEksZUR0SEh6VyxFQUFFNE4sT0FBRixDQUFVNkksY0FBVixFQUEwQixVQUFDRCxHQUFELEVBQU14UyxHQUFOO0FBQ3pCLGNBQUEzRixLQUFBOztBQUFBLGNBQUcyRixRQUFPLFNBQVAsSUFBb0JoRSxFQUFFbUMsUUFBRixDQUFXcVUsR0FBWCxDQUF2QjtBQUNDO0FDd0hPLHFCRHZITkMsZUFBZXpTLEdBQWYsSUFBc0J0TSxRQUFPLE1BQVAsRUFBYSxNQUFJOGUsR0FBSixHQUFRLEdBQXJCLENDdUhoQjtBRHhIUCxxQkFBQW5DLE1BQUE7QUFFTWhXLHNCQUFBZ1csTUFBQTtBQ3lIQyxxQkR4SE52VyxRQUFRTyxLQUFSLENBQWMsY0FBZCxFQUE4Qm1ZLEdBQTlCLENDd0hNO0FENUhSO0FDOEhLO0FEL0hOLFVDc0hHO0FBV0Q7QURuSUo7QUFERDtBQVVDeFcsTUFBRTROLE9BQUYsQ0FBVWpQLE9BQU84RixXQUFqQixFQUE4QixVQUFDZ1MsY0FBRDtBQUM3QixVQUFHelcsRUFBRThFLFFBQUYsQ0FBVzJSLGNBQVgsQ0FBSDtBQzhISSxlRDdISHpXLEVBQUU0TixPQUFGLENBQVU2SSxjQUFWLEVBQTBCLFVBQUNELEdBQUQsRUFBTXhTLEdBQU47QUFDekIsY0FBR0EsUUFBTyxTQUFQLElBQW9CaEUsRUFBRXVILFVBQUYsQ0FBYWlQLEdBQWIsQ0FBdkI7QUM4SE0sbUJEN0hMQyxlQUFlelMsR0FBZixJQUFzQndTLElBQUlwUyxRQUFKLEVDNkhqQjtBQUNEO0FEaElOLFVDNkhHO0FBS0Q7QURwSUo7QUNzSUE7O0FEaElELFNBQU96RixNQUFQO0FBNVd1QixDQUF4QixDOzs7Ozs7Ozs7Ozs7QUVqQ0RqSCxRQUFRMEssUUFBUixHQUFtQixFQUFuQjtBQUVBMUssUUFBUTBLLFFBQVIsQ0FBaUJzVSxNQUFqQixHQUEwQixTQUExQjs7QUFFQWhmLFFBQVEwSyxRQUFSLENBQWlCdVUsd0JBQWpCLEdBQTRDLFVBQUNDLE1BQUQsRUFBUUMsYUFBUjtBQUMzQyxNQUFBQyxHQUFBLEVBQUFDLEdBQUE7QUFBQUQsUUFBTSxlQUFOO0FBRUFDLFFBQU1GLGNBQWNoSCxPQUFkLENBQXNCaUgsR0FBdEIsRUFBMkIsVUFBQ0UsQ0FBRCxFQUFJQyxFQUFKO0FBQ2hDLFdBQU9MLFNBQVNLLEdBQUdwSCxPQUFILENBQVcsT0FBWCxFQUFtQixLQUFuQixFQUEwQkEsT0FBMUIsQ0FBa0MsT0FBbEMsRUFBMEMsS0FBMUMsRUFBaURBLE9BQWpELENBQXlELFdBQXpELEVBQXFFLFFBQXJFLENBQWhCO0FBREssSUFBTjtBQUdBLFNBQU9rSCxHQUFQO0FBTjJDLENBQTVDOztBQVFBcmYsUUFBUTBLLFFBQVIsQ0FBaUJDLFlBQWpCLEdBQWdDLFVBQUM2VSxXQUFEO0FBQy9CLE1BQUdsWCxFQUFFbUMsUUFBRixDQUFXK1UsV0FBWCxLQUEyQkEsWUFBWW5WLE9BQVosQ0FBb0IsR0FBcEIsSUFBMkIsQ0FBQyxDQUF2RCxJQUE0RG1WLFlBQVluVixPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQUMsQ0FBM0Y7QUFDQyxXQUFPLElBQVA7QUNFQzs7QURERixTQUFPLEtBQVA7QUFIK0IsQ0FBaEM7O0FBS0FySyxRQUFRMEssUUFBUixDQUFpQnhDLEdBQWpCLEdBQXVCLFVBQUNzWCxXQUFELEVBQWNDLFFBQWQsRUFBd0JuYixPQUF4QjtBQUN0QixNQUFBb2IsT0FBQSxFQUFBQyxJQUFBLEVBQUEvZSxDQUFBLEVBQUFpUyxNQUFBOztBQUFBLE1BQUcyTSxlQUFlbFgsRUFBRW1DLFFBQUYsQ0FBVytVLFdBQVgsQ0FBbEI7QUFFQyxRQUFHLENBQUNsWCxFQUFFc1gsU0FBRixDQUFBdGIsV0FBQSxPQUFZQSxRQUFTdU8sTUFBckIsR0FBcUIsTUFBckIsQ0FBSjtBQUNDQSxlQUFTLElBQVQ7QUNJRTs7QURGSDZNLGNBQVUsRUFBVjtBQUNBQSxjQUFVcFgsRUFBRXVLLE1BQUYsQ0FBUzZNLE9BQVQsRUFBa0JELFFBQWxCLENBQVY7O0FBQ0EsUUFBRzVNLE1BQUg7QUFDQzZNLGdCQUFVcFgsRUFBRXVLLE1BQUYsQ0FBUzZNLE9BQVQsRUFBa0IxZixRQUFRMk8sY0FBUixDQUFBckssV0FBQSxPQUF1QkEsUUFBUzJGLE1BQWhDLEdBQWdDLE1BQWhDLEVBQUEzRixXQUFBLE9BQXdDQSxRQUFTdUYsT0FBakQsR0FBaUQsTUFBakQsQ0FBbEIsQ0FBVjtBQ0lFOztBREhIMlYsa0JBQWN4ZixRQUFRMEssUUFBUixDQUFpQnVVLHdCQUFqQixDQUEwQyxNQUExQyxFQUFrRE8sV0FBbEQsQ0FBZDs7QUFFQTtBQUNDRyxhQUFPM2YsUUFBUTZhLGFBQVIsQ0FBc0IyRSxXQUF0QixFQUFtQ0UsT0FBbkMsQ0FBUDtBQUNBLGFBQU9DLElBQVA7QUFGRCxhQUFBaFosS0FBQTtBQUdNL0YsVUFBQStGLEtBQUE7QUFDTFAsY0FBUU8sS0FBUixDQUFjLDJCQUF5QjZZLFdBQXZDLEVBQXNENWUsQ0FBdEQ7O0FBQ0EsVUFBR2UsT0FBT3VILFFBQVY7QUNLSyxZQUFJLE9BQU8yVyxNQUFQLEtBQWtCLFdBQWxCLElBQWlDQSxXQUFXLElBQWhELEVBQXNEO0FESjFEQSxpQkFBUWxaLEtBQVIsQ0FBYyxzQkFBZDtBQUREO0FDUUk7O0FETkosWUFBTSxJQUFJaEYsT0FBT3NOLEtBQVgsQ0FBaUIsR0FBakIsRUFBc0IsMkJBQXlCdVEsV0FBekIsR0FBdUM1ZSxDQUE3RCxDQUFOO0FBbEJGO0FDMkJFOztBRFBGLFNBQU80ZSxXQUFQO0FBckJzQixDQUF2QixDOzs7Ozs7Ozs7Ozs7QUVqQkEsSUFBQWpYLEtBQUE7QUFBQUEsUUFBUWhILFFBQVEsT0FBUixDQUFSO0FBQ0F2QixRQUFRc0osYUFBUixHQUF3QixFQUF4Qjs7QUFFQXRKLFFBQVE4ZixnQkFBUixHQUEyQixVQUFDOVgsV0FBRDtBQUMxQixNQUFHQSxZQUFZK0gsVUFBWixDQUF1QixZQUF2QixDQUFIO0FBQ0MvSCxrQkFBY0EsWUFBWW1RLE9BQVosQ0FBb0IsSUFBSW1DLE1BQUosQ0FBVyxLQUFYLEVBQWtCLEdBQWxCLENBQXBCLEVBQTRDLEdBQTVDLENBQWQ7QUNJQzs7QURIRixTQUFPdFMsV0FBUDtBQUgwQixDQUEzQjs7QUFLQWhJLFFBQVF5SSxNQUFSLEdBQWlCLFVBQUNuRSxPQUFEO0FBQ2hCLE1BQUF5YixXQUFBLEVBQUFDLEdBQUEsRUFBQUMsaUJBQUEsRUFBQXRHLFdBQUEsRUFBQXVHLG1CQUFBLEVBQUFwVCxXQUFBLEVBQUEvRCxHQUFBLEVBQUFDLElBQUEsRUFBQWlMLElBQUEsRUFBQWtNLElBQUEsRUFBQUMsTUFBQSxFQUFBQyxJQUFBOztBQUFBTixnQkFBYy9mLFFBQVFzZ0IsVUFBdEI7O0FBQ0EsTUFBRzNlLE9BQU91SCxRQUFWO0FBQ0M2VyxrQkFBYztBQUFDeEksZUFBU3ZYLFFBQVFzZ0IsVUFBUixDQUFtQi9JLE9BQTdCO0FBQXVDcE4sY0FBUSxFQUEvQztBQUFtRDJSLGdCQUFVLEVBQTdEO0FBQWlFeUUsc0JBQWdCO0FBQWpGLEtBQWQ7QUNZQzs7QURYRkYsU0FBTyxJQUFQOztBQUNBLE1BQUksQ0FBQy9iLFFBQVFXLElBQWI7QUFDQ21CLFlBQVFPLEtBQVIsQ0FBY3JDLE9BQWQ7QUFDQSxVQUFNLElBQUkySyxLQUFKLENBQVUsMENBQVYsQ0FBTjtBQ2FDOztBRFhGb1IsT0FBSzNXLEdBQUwsR0FBV3BGLFFBQVFvRixHQUFSLElBQWVwRixRQUFRVyxJQUFsQztBQUNBb2IsT0FBS2pZLEtBQUwsR0FBYTlELFFBQVE4RCxLQUFyQjtBQUNBaVksT0FBS3BiLElBQUwsR0FBWVgsUUFBUVcsSUFBcEI7QUFDQW9iLE9BQUtqTixLQUFMLEdBQWE5TyxRQUFROE8sS0FBckI7QUFDQWlOLE9BQUtHLElBQUwsR0FBWWxjLFFBQVFrYyxJQUFwQjtBQUNBSCxPQUFLSSxXQUFMLEdBQW1CbmMsUUFBUW1jLFdBQTNCO0FBQ0FKLE9BQUtLLE9BQUwsR0FBZXBjLFFBQVFvYyxPQUF2QjtBQUNBTCxPQUFLeEIsSUFBTCxHQUFZdmEsUUFBUXVhLElBQXBCO0FBQ0F3QixPQUFLdFQsV0FBTCxHQUFtQnpJLFFBQVF5SSxXQUEzQjtBQUNBc1QsT0FBS3hKLGFBQUwsR0FBcUJ2UyxRQUFRdVMsYUFBN0I7QUFDQXdKLE9BQUtNLGtCQUFMLEdBQTBCcmMsUUFBUXFjLGtCQUFsQztBQUNBTixPQUFLTyxPQUFMLEdBQWV0YyxRQUFRc2MsT0FBUixJQUFtQixHQUFsQzs7QUFDQSxNQUFHLENBQUN0WSxFQUFFc1gsU0FBRixDQUFZdGIsUUFBUXVjLFNBQXBCLENBQUQsSUFBb0N2YyxRQUFRdWMsU0FBUixLQUFxQixJQUE1RDtBQUNDUixTQUFLUSxTQUFMLEdBQWlCLElBQWpCO0FBREQ7QUFHQ1IsU0FBS1EsU0FBTCxHQUFpQixLQUFqQjtBQ2FDOztBRFpGLE1BQUdsZixPQUFPdUgsUUFBVjtBQUNDLFFBQUdaLEVBQUV3TixHQUFGLENBQU14UixPQUFOLEVBQWUscUJBQWYsQ0FBSDtBQUNDK2IsV0FBS1MsbUJBQUwsR0FBMkJ4YyxRQUFRd2MsbUJBQW5DO0FDY0U7O0FEYkgsUUFBR3hZLEVBQUV3TixHQUFGLENBQU14UixPQUFOLEVBQWUsaUJBQWYsQ0FBSDtBQUNDK2IsV0FBS1UsZUFBTCxHQUF1QnpjLFFBQVF5YyxlQUEvQjtBQ2VFOztBRGRILFFBQUd6WSxFQUFFd04sR0FBRixDQUFNeFIsT0FBTixFQUFlLG1CQUFmLENBQUg7QUFDQytiLFdBQUs5SCxpQkFBTCxHQUF5QmpVLFFBQVFpVSxpQkFBakM7QUFORjtBQ3VCRTs7QURoQkY4SCxPQUFLVyxhQUFMLEdBQXFCMWMsUUFBUTBjLGFBQTdCO0FBQ0FYLE9BQUtwUyxZQUFMLEdBQW9CM0osUUFBUTJKLFlBQTVCO0FBQ0FvUyxPQUFLaFMsWUFBTCxHQUFvQi9KLFFBQVErSixZQUE1QjtBQUNBZ1MsT0FBSy9SLFlBQUwsR0FBb0JoSyxRQUFRZ0ssWUFBNUI7QUFDQStSLE9BQUt0UyxZQUFMLEdBQW9CekosUUFBUXlKLFlBQTVCO0FBQ0FzUyxPQUFLOVIsYUFBTCxHQUFxQmpLLFFBQVFpSyxhQUE3Qjs7QUFDQSxNQUFHakssUUFBUTJjLE1BQVg7QUFDQ1osU0FBS1ksTUFBTCxHQUFjM2MsUUFBUTJjLE1BQXRCO0FDa0JDOztBRGpCRlosT0FBSzFMLE1BQUwsR0FBY3JRLFFBQVFxUSxNQUF0QjtBQUNBMEwsT0FBS2EsVUFBTCxHQUFtQjVjLFFBQVE0YyxVQUFSLEtBQXNCLE1BQXZCLElBQXFDNWMsUUFBUTRjLFVBQS9EO0FBQ0FiLE9BQUtjLE1BQUwsR0FBYzdjLFFBQVE2YyxNQUF0QjtBQUNBZCxPQUFLZSxZQUFMLEdBQW9COWMsUUFBUThjLFlBQTVCO0FBQ0FmLE9BQUs3UixnQkFBTCxHQUF3QmxLLFFBQVFrSyxnQkFBaEM7QUFDQTZSLE9BQUszUixjQUFMLEdBQXNCcEssUUFBUW9LLGNBQTlCOztBQUNBLE1BQUcvTSxPQUFPdUgsUUFBVjtBQUNDLFFBQUdsSixRQUFReVIsaUJBQVIsQ0FBMEJySSxRQUFRQyxHQUFSLENBQVksU0FBWixDQUExQixDQUFIO0FBQ0NnWCxXQUFLZ0IsV0FBTCxHQUFtQixLQUFuQjtBQUREO0FBR0NoQixXQUFLZ0IsV0FBTCxHQUFtQi9jLFFBQVErYyxXQUEzQjtBQUNBaEIsV0FBS2lCLE9BQUwsR0FBZWhaLEVBQUVDLEtBQUYsQ0FBUWpFLFFBQVFnZCxPQUFoQixDQUFmO0FBTEY7QUFBQTtBQU9DakIsU0FBS2lCLE9BQUwsR0FBZWhaLEVBQUVDLEtBQUYsQ0FBUWpFLFFBQVFnZCxPQUFoQixDQUFmO0FBQ0FqQixTQUFLZ0IsV0FBTCxHQUFtQi9jLFFBQVErYyxXQUEzQjtBQ29CQzs7QURuQkZoQixPQUFLa0IsV0FBTCxHQUFtQmpkLFFBQVFpZCxXQUEzQjtBQUNBbEIsT0FBS21CLGNBQUwsR0FBc0JsZCxRQUFRa2QsY0FBOUI7QUFDQW5CLE9BQUtvQixRQUFMLEdBQWdCblosRUFBRUMsS0FBRixDQUFRakUsUUFBUW1kLFFBQWhCLENBQWhCO0FBQ0FwQixPQUFLcUIsY0FBTCxHQUFzQnBkLFFBQVFvZCxjQUE5QjtBQUNBckIsT0FBS3NCLFlBQUwsR0FBb0JyZCxRQUFRcWQsWUFBNUI7QUFDQXRCLE9BQUt1QixtQkFBTCxHQUEyQnRkLFFBQVFzZCxtQkFBbkM7QUFDQXZCLE9BQUs1UixnQkFBTCxHQUF3Qm5LLFFBQVFtSyxnQkFBaEM7QUFDQTRSLE9BQUt3QixhQUFMLEdBQXFCdmQsUUFBUXVkLGFBQTdCO0FBQ0F4QixPQUFLeUIsZUFBTCxHQUF1QnhkLFFBQVF3ZCxlQUEvQjtBQUNBekIsT0FBSzBCLGtCQUFMLEdBQTBCemQsUUFBUXlkLGtCQUFsQztBQUNBMUIsT0FBSzJCLE9BQUwsR0FBZTFkLFFBQVEwZCxPQUF2QjtBQUNBM0IsT0FBSzRCLE9BQUwsR0FBZTNkLFFBQVEyZCxPQUF2QjtBQUNBNUIsT0FBSzZCLGNBQUwsR0FBc0I1ZCxRQUFRNGQsY0FBOUI7O0FBQ0EsTUFBRzVaLEVBQUV3TixHQUFGLENBQU14UixPQUFOLEVBQWUsZ0JBQWYsQ0FBSDtBQUNDK2IsU0FBSzhCLGNBQUwsR0FBc0I3ZCxRQUFRNmQsY0FBOUI7QUNxQkM7O0FEcEJGOUIsT0FBSytCLFdBQUwsR0FBbUIsS0FBbkI7O0FBQ0EsTUFBRzlkLFFBQVErZCxhQUFYO0FBQ0NoQyxTQUFLZ0MsYUFBTCxHQUFxQi9kLFFBQVErZCxhQUE3QjtBQ3NCQzs7QURyQkYsTUFBSSxDQUFDL2QsUUFBUTZGLE1BQWI7QUFDQy9ELFlBQVFPLEtBQVIsQ0FBY3JDLE9BQWQ7QUFDQSxVQUFNLElBQUkySyxLQUFKLENBQVUsNENBQVYsQ0FBTjtBQ3VCQzs7QURyQkZvUixPQUFLbFcsTUFBTCxHQUFjNUIsTUFBTWpFLFFBQVE2RixNQUFkLENBQWQ7O0FBRUE3QixJQUFFeUMsSUFBRixDQUFPc1YsS0FBS2xXLE1BQVosRUFBb0IsVUFBQzRKLEtBQUQsRUFBUUQsVUFBUjtBQUNuQixRQUFHQyxNQUFNdU8sT0FBVDtBQUNDakMsV0FBSzdOLGNBQUwsR0FBc0JzQixVQUF0QjtBQURELFdBRUssSUFBR0EsZUFBYyxNQUFkLElBQXdCLENBQUN1TSxLQUFLN04sY0FBakM7QUFDSjZOLFdBQUs3TixjQUFMLEdBQXNCc0IsVUFBdEI7QUNzQkU7O0FEckJILFFBQUdDLE1BQU13TyxPQUFUO0FBQ0NsQyxXQUFLK0IsV0FBTCxHQUFtQnRPLFVBQW5CO0FDdUJFOztBRHRCSCxRQUFHblMsT0FBT3VILFFBQVY7QUFDQyxVQUFHbEosUUFBUXlSLGlCQUFSLENBQTBCckksUUFBUUMsR0FBUixDQUFZLFNBQVosQ0FBMUIsQ0FBSDtBQUNDLFlBQUd5SyxlQUFjLE9BQWpCO0FBQ0NDLGdCQUFNeU8sVUFBTixHQUFtQixJQUFuQjtBQ3dCSyxpQkR2Qkx6TyxNQUFNWSxNQUFOLEdBQWUsS0N1QlY7QUQxQlA7QUFERDtBQzhCRztBRHJDSjs7QUFhQSxNQUFHLENBQUNyUSxRQUFRK2QsYUFBVCxJQUEwQi9kLFFBQVErZCxhQUFSLEtBQXlCLGNBQXREO0FBQ0MvWixNQUFFeUMsSUFBRixDQUFPZ1YsWUFBWTVWLE1BQW5CLEVBQTJCLFVBQUM0SixLQUFELEVBQVFELFVBQVI7QUFDMUIsVUFBRyxDQUFDdU0sS0FBS2xXLE1BQUwsQ0FBWTJKLFVBQVosQ0FBSjtBQUNDdU0sYUFBS2xXLE1BQUwsQ0FBWTJKLFVBQVosSUFBMEIsRUFBMUI7QUMyQkc7O0FBQ0QsYUQzQkh1TSxLQUFLbFcsTUFBTCxDQUFZMkosVUFBWixJQUEwQnhMLEVBQUV1SyxNQUFGLENBQVN2SyxFQUFFQyxLQUFGLENBQVF3TCxLQUFSLENBQVQsRUFBeUJzTSxLQUFLbFcsTUFBTCxDQUFZMkosVUFBWixDQUF6QixDQzJCdkI7QUQ5Qko7QUNnQ0M7O0FEM0JGeEwsSUFBRXlDLElBQUYsQ0FBT3NWLEtBQUtsVyxNQUFaLEVBQW9CLFVBQUM0SixLQUFELEVBQVFELFVBQVI7QUFDbkIsUUFBR0MsTUFBTTFQLElBQU4sS0FBYyxZQUFqQjtBQzZCSSxhRDVCSDBQLE1BQU15SSxRQUFOLEdBQWlCLElDNEJkO0FEN0JKLFdBRUssSUFBR3pJLE1BQU0xUCxJQUFOLEtBQWMsU0FBakI7QUM2QkQsYUQ1QkgwUCxNQUFNeUksUUFBTixHQUFpQixJQzRCZDtBRDdCQyxXQUVBLElBQUd6SSxNQUFNMVAsSUFBTixLQUFjLFNBQWpCO0FDNkJELGFENUJIMFAsTUFBTXlJLFFBQU4sR0FBaUIsSUM0QmQ7QUFDRDtBRG5DSjs7QUFRQTZELE9BQUtsWSxVQUFMLEdBQWtCLEVBQWxCO0FBQ0F3UixnQkFBYzNaLFFBQVEwWixvQkFBUixDQUE2QjJHLEtBQUtwYixJQUFsQyxDQUFkOztBQUNBcUQsSUFBRXlDLElBQUYsQ0FBT3pHLFFBQVE2RCxVQUFmLEVBQTJCLFVBQUMyTyxJQUFELEVBQU8yTCxTQUFQO0FBQzFCLFFBQUE3TSxLQUFBO0FBQUFBLFlBQVE1VixRQUFRc1YsZUFBUixDQUF3QnFFLFdBQXhCLEVBQXFDN0MsSUFBckMsRUFBMkMyTCxTQUEzQyxDQUFSO0FDK0JFLFdEOUJGcEMsS0FBS2xZLFVBQUwsQ0FBZ0JzYSxTQUFoQixJQUE2QjdNLEtDOEIzQjtBRGhDSDs7QUFJQXlLLE9BQUt2RSxRQUFMLEdBQWdCeFQsRUFBRUMsS0FBRixDQUFRd1gsWUFBWWpFLFFBQXBCLENBQWhCOztBQUNBeFQsSUFBRXlDLElBQUYsQ0FBT3pHLFFBQVF3WCxRQUFmLEVBQXlCLFVBQUNoRixJQUFELEVBQU8yTCxTQUFQO0FBQ3hCLFFBQUcsQ0FBQ3BDLEtBQUt2RSxRQUFMLENBQWMyRyxTQUFkLENBQUo7QUFDQ3BDLFdBQUt2RSxRQUFMLENBQWMyRyxTQUFkLElBQTJCLEVBQTNCO0FDK0JFOztBRDlCSHBDLFNBQUt2RSxRQUFMLENBQWMyRyxTQUFkLEVBQXlCeGQsSUFBekIsR0FBZ0N3ZCxTQUFoQztBQ2dDRSxXRC9CRnBDLEtBQUt2RSxRQUFMLENBQWMyRyxTQUFkLElBQTJCbmEsRUFBRXVLLE1BQUYsQ0FBU3ZLLEVBQUVDLEtBQUYsQ0FBUThYLEtBQUt2RSxRQUFMLENBQWMyRyxTQUFkLENBQVIsQ0FBVCxFQUE0QzNMLElBQTVDLENDK0J6QjtBRG5DSDs7QUFNQXVKLE9BQUs5SSxPQUFMLEdBQWVqUCxFQUFFQyxLQUFGLENBQVF3WCxZQUFZeEksT0FBcEIsQ0FBZjs7QUFDQWpQLElBQUV5QyxJQUFGLENBQU96RyxRQUFRaVQsT0FBZixFQUF3QixVQUFDVCxJQUFELEVBQU8yTCxTQUFQO0FBQ3ZCLFFBQUFDLFFBQUE7O0FBQUEsUUFBRyxDQUFDckMsS0FBSzlJLE9BQUwsQ0FBYWtMLFNBQWIsQ0FBSjtBQUNDcEMsV0FBSzlJLE9BQUwsQ0FBYWtMLFNBQWIsSUFBMEIsRUFBMUI7QUNpQ0U7O0FEaENIQyxlQUFXcGEsRUFBRUMsS0FBRixDQUFROFgsS0FBSzlJLE9BQUwsQ0FBYWtMLFNBQWIsQ0FBUixDQUFYO0FBQ0EsV0FBT3BDLEtBQUs5SSxPQUFMLENBQWFrTCxTQUFiLENBQVA7QUFDQXBDLFNBQUs5SSxPQUFMLENBQWFrTCxTQUFiLElBQTBCbmEsRUFBRXVLLE1BQUYsQ0FBUzZQLFFBQVQsRUFBbUI1TCxJQUFuQixDQUExQjtBQ2tDRSxXRGpDRnVKLEtBQUs5SSxPQUFMLENBQWFrTCxTQUFiLEVBQXdCemEsV0FBeEIsR0FBc0NxWSxLQUFLcGIsSUNpQ3pDO0FEdkNIOztBQVFBcUQsSUFBRXlDLElBQUYsQ0FBT3NWLEtBQUs5SSxPQUFaLEVBQXFCLFVBQUNULElBQUQsRUFBTzJMLFNBQVA7QUNrQ2xCLFdEakNGM0wsS0FBSzdSLElBQUwsR0FBWXdkLFNDaUNWO0FEbENIOztBQUdBcEMsT0FBS3BULGVBQUwsR0FBdUJqTixRQUFRNE0saUJBQVIsQ0FBMEJ5VCxLQUFLcGIsSUFBL0IsQ0FBdkI7QUFHQW9iLE9BQUtFLGNBQUwsR0FBc0JqWSxFQUFFQyxLQUFGLENBQVF3WCxZQUFZUSxjQUFwQixDQUF0Qjs7QUF3QkEsT0FBT2pjLFFBQVFpYyxjQUFmO0FBQ0NqYyxZQUFRaWMsY0FBUixHQUF5QixFQUF6QjtBQ1NDOztBRFJGLE1BQUcsRUFBQyxDQUFBeFgsTUFBQXpFLFFBQUFpYyxjQUFBLFlBQUF4WCxJQUF5QjRaLEtBQXpCLEdBQXlCLE1BQTFCLENBQUg7QUFDQ3JlLFlBQVFpYyxjQUFSLENBQXVCb0MsS0FBdkIsR0FBK0JyYSxFQUFFQyxLQUFGLENBQVE4WCxLQUFLRSxjQUFMLENBQW9CLE9BQXBCLENBQVIsQ0FBL0I7QUNVQzs7QURURixNQUFHLEVBQUMsQ0FBQXZYLE9BQUExRSxRQUFBaWMsY0FBQSxZQUFBdlgsS0FBeUJ5RyxJQUF6QixHQUF5QixNQUExQixDQUFIO0FBQ0NuTCxZQUFRaWMsY0FBUixDQUF1QjlRLElBQXZCLEdBQThCbkgsRUFBRUMsS0FBRixDQUFROFgsS0FBS0UsY0FBTCxDQUFvQixNQUFwQixDQUFSLENBQTlCO0FDV0M7O0FEVkZqWSxJQUFFeUMsSUFBRixDQUFPekcsUUFBUWljLGNBQWYsRUFBK0IsVUFBQ3pKLElBQUQsRUFBTzJMLFNBQVA7QUFDOUIsUUFBRyxDQUFDcEMsS0FBS0UsY0FBTCxDQUFvQmtDLFNBQXBCLENBQUo7QUFDQ3BDLFdBQUtFLGNBQUwsQ0FBb0JrQyxTQUFwQixJQUFpQyxFQUFqQztBQ1lFOztBQUNELFdEWkZwQyxLQUFLRSxjQUFMLENBQW9Ca0MsU0FBcEIsSUFBaUNuYSxFQUFFdUssTUFBRixDQUFTdkssRUFBRUMsS0FBRixDQUFROFgsS0FBS0UsY0FBTCxDQUFvQmtDLFNBQXBCLENBQVIsQ0FBVCxFQUFrRDNMLElBQWxELENDWS9CO0FEZkg7O0FBTUEsTUFBR25WLE9BQU91SCxRQUFWO0FBQ0M0RCxrQkFBY3hJLFFBQVF3SSxXQUF0QjtBQUNBb1QsMEJBQUFwVCxlQUFBLE9BQXNCQSxZQUFhb1QsbUJBQW5DLEdBQW1DLE1BQW5DOztBQUNBLFFBQUFBLHVCQUFBLE9BQUdBLG9CQUFxQi9VLE1BQXhCLEdBQXdCLE1BQXhCO0FBQ0M4VSwwQkFBQSxDQUFBaE0sT0FBQTNQLFFBQUE2RCxVQUFBLGFBQUFnWSxPQUFBbE0sS0FBQTJPLEdBQUEsWUFBQXpDLEtBQTZDelcsR0FBN0MsR0FBNkMsTUFBN0MsR0FBNkMsTUFBN0M7O0FBQ0EsVUFBR3VXLGlCQUFIO0FBRUNuVCxvQkFBWW9ULG1CQUFaLEdBQWtDNVgsRUFBRW1NLEdBQUYsQ0FBTXlMLG1CQUFOLEVBQTJCLFVBQUMyQyxjQUFEO0FBQ3JELGNBQUc1QyxzQkFBcUI0QyxjQUF4QjtBQ1dBLG1CRFg0QyxLQ1c1QztBRFhBO0FDYUEsbUJEYnVEQSxjQ2F2RDtBQUNEO0FEZjJCLFVBQWxDO0FBSkY7QUNzQkc7O0FEaEJIeEMsU0FBS3ZULFdBQUwsR0FBbUIsSUFBSWdXLFdBQUosQ0FBZ0JoVyxXQUFoQixDQUFuQjtBQVREO0FBdUJDdVQsU0FBS3ZULFdBQUwsR0FBbUIsSUFBbkI7QUNNQzs7QURKRmtULFFBQU1oZ0IsUUFBUStpQixnQkFBUixDQUF5QnplLE9BQXpCLENBQU47QUFFQXRFLFVBQVFFLFdBQVIsQ0FBb0I4ZixJQUFJZ0QsS0FBeEIsSUFBaUNoRCxHQUFqQztBQUVBSyxPQUFLdGdCLEVBQUwsR0FBVWlnQixHQUFWO0FBRUFLLE9BQUt2VyxnQkFBTCxHQUF3QmtXLElBQUlnRCxLQUE1QjtBQUVBNUMsV0FBU3BnQixRQUFRaWpCLGVBQVIsQ0FBd0I1QyxJQUF4QixDQUFUO0FBQ0FBLE9BQUtELE1BQUwsR0FBYyxJQUFJalosWUFBSixDQUFpQmlaLE1BQWpCLENBQWQ7O0FBQ0EsTUFBR0MsS0FBS3BiLElBQUwsS0FBYSxPQUFiLElBQXlCb2IsS0FBS3BiLElBQUwsS0FBYSxzQkFBdEMsSUFBZ0UsQ0FBQ29iLEtBQUtLLE9BQXRFLElBQWlGLENBQUNwWSxFQUFFNGEsUUFBRixDQUFXLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsV0FBbkIsRUFBZ0MsZUFBaEMsRUFBaUQsc0JBQWpELEVBQXlFLGtCQUF6RSxDQUFYLEVBQXlHN0MsS0FBS3BiLElBQTlHLENBQXJGO0FBQ0MsUUFBR3RELE9BQU91SCxRQUFWO0FBQ0M4VyxVQUFJbUQsWUFBSixDQUFpQjlDLEtBQUtELE1BQXRCLEVBQThCO0FBQUNqSSxpQkFBUztBQUFWLE9BQTlCO0FBREQ7QUFHQzZILFVBQUltRCxZQUFKLENBQWlCOUMsS0FBS0QsTUFBdEIsRUFBOEI7QUFBQ2pJLGlCQUFTO0FBQVYsT0FBOUI7QUFKRjtBQ1dFOztBRE5GLE1BQUdrSSxLQUFLcGIsSUFBTCxLQUFhLE9BQWhCO0FBQ0MrYSxRQUFJb0QsYUFBSixHQUFvQi9DLEtBQUtELE1BQXpCO0FDUUM7O0FETkYsTUFBRzlYLEVBQUU0YSxRQUFGLENBQVcsQ0FBQyxPQUFELEVBQVUsT0FBVixFQUFtQixXQUFuQixFQUFnQyxlQUFoQyxDQUFYLEVBQTZEN0MsS0FBS3BiLElBQWxFLENBQUg7QUFDQyxRQUFHdEQsT0FBT3VILFFBQVY7QUFDQzhXLFVBQUltRCxZQUFKLENBQWlCOUMsS0FBS0QsTUFBdEIsRUFBOEI7QUFBQ2pJLGlCQUFTO0FBQVYsT0FBOUI7QUFGRjtBQ2FFOztBRFRGblksVUFBUXNKLGFBQVIsQ0FBc0IrVyxLQUFLdlcsZ0JBQTNCLElBQStDdVcsSUFBL0M7QUFFQSxTQUFPQSxJQUFQO0FBM05nQixDQUFqQjs7QUE2UEFyZ0IsUUFBUXFqQiwwQkFBUixHQUFxQyxVQUFDcGMsTUFBRDtBQUNwQyxTQUFPLGVBQVA7QUFEb0MsQ0FBckM7O0FBZ0JBdEYsT0FBT0MsT0FBUCxDQUFlO0FBQ2QsTUFBRyxDQUFDNUIsUUFBUXNqQixlQUFULElBQTRCdGpCLFFBQVFDLE9BQXZDO0FDakNHLFdEa0NGcUksRUFBRXlDLElBQUYsQ0FBTy9LLFFBQVFDLE9BQWYsRUFBd0IsVUFBQ2dILE1BQUQ7QUNqQ3BCLGFEa0NILElBQUlqSCxRQUFReUksTUFBWixDQUFtQnhCLE1BQW5CLENDbENHO0FEaUNKLE1DbENFO0FBR0Q7QUQ2QkgsRzs7Ozs7Ozs7Ozs7O0FFclJBakgsUUFBUXVqQixnQkFBUixHQUEyQixVQUFDQyxXQUFEO0FBQzFCLE1BQUFDLFNBQUEsRUFBQW5mLE9BQUE7QUFBQUEsWUFBVWtmLFlBQVlsZixPQUF0Qjs7QUFDQSxPQUFPQSxPQUFQO0FBQ0M7QUNFQzs7QURERm1mLGNBQVlELFlBQVlDLFNBQXhCOztBQUNBLE1BQUcsQ0FBQ25iLEVBQUV1SCxVQUFGLENBQWF2TCxPQUFiLENBQUQsSUFBMkJtZixTQUEzQixJQUF5Q0EsY0FBYSxNQUF6RDtBQUVDbmYsWUFBUTRSLE9BQVIsQ0FBZ0IsVUFBQ3dOLFVBQUQ7QUFDZixVQUFHLE9BQU9BLFdBQVd4WSxLQUFsQixLQUEyQixRQUE5QjtBQUNDO0FDRUc7O0FEREosVUFBRyxDQUNGLFFBREUsRUFFRixVQUZFLEVBR0YsU0FIRSxFQUlEYixPQUpDLENBSU9vWixTQUpQLElBSW9CLENBQUMsQ0FKeEI7QUNHSyxlREVKQyxXQUFXeFksS0FBWCxHQUFtQjhTLE9BQU8wRixXQUFXeFksS0FBbEIsQ0NGZjtBREhMLGFBTUssSUFBR3VZLGNBQWEsU0FBaEI7QUNEQSxlREdKQyxXQUFXeFksS0FBWCxHQUFtQndZLFdBQVd4WSxLQUFYLEtBQW9CLE1DSG5DO0FBQ0Q7QURUTDtBQ1dDOztBRENGLFNBQU81RyxPQUFQO0FBbkIwQixDQUEzQjs7QUFxQkF0RSxRQUFRaWpCLGVBQVIsR0FBMEIsVUFBQ2xiLEdBQUQ7QUFDekIsTUFBQTRiLFNBQUEsRUFBQXZELE1BQUE7O0FBQUEsT0FBT3JZLEdBQVA7QUFDQztBQ0dDOztBREZGcVksV0FBUyxFQUFUO0FBRUF1RCxjQUFZLEVBQVo7O0FBRUFyYixJQUFFeUMsSUFBRixDQUFPaEQsSUFBSW9DLE1BQVgsRUFBb0IsVUFBQzRKLEtBQUQsRUFBUUQsVUFBUjtBQUNuQixRQUFHLENBQUN4TCxFQUFFd04sR0FBRixDQUFNL0IsS0FBTixFQUFhLE1BQWIsQ0FBSjtBQUNDQSxZQUFNOU8sSUFBTixHQUFhNk8sVUFBYjtBQ0VFOztBQUNELFdERkY2UCxVQUFVelYsSUFBVixDQUFlNkYsS0FBZixDQ0VFO0FETEg7O0FBS0F6TCxJQUFFeUMsSUFBRixDQUFPekMsRUFBRXNELE1BQUYsQ0FBUytYLFNBQVQsRUFBb0IsU0FBcEIsQ0FBUCxFQUF1QyxVQUFDNVAsS0FBRDtBQUV0QyxRQUFBbEgsT0FBQSxFQUFBK1csUUFBQSxFQUFBekYsYUFBQSxFQUFBMEYsYUFBQSxFQUFBQyxjQUFBLEVBQUFoUSxVQUFBLEVBQUFpUSxFQUFBLEVBQUFDLE1BQUEsRUFBQUMsV0FBQSxFQUFBblgsV0FBQSxFQUFBL0QsR0FBQSxFQUFBQyxJQUFBOztBQUFBOEssaUJBQWFDLE1BQU05TyxJQUFuQjtBQUVBOGUsU0FBSyxFQUFMOztBQUNBLFFBQUdoUSxNQUFNMEcsS0FBVDtBQUNDc0osU0FBR3RKLEtBQUgsR0FBVzFHLE1BQU0wRyxLQUFqQjtBQ0VFOztBRERIc0osT0FBRzVQLFFBQUgsR0FBYyxFQUFkO0FBQ0E0UCxPQUFHNVAsUUFBSCxDQUFZK1AsUUFBWixHQUF1Qm5RLE1BQU1tUSxRQUE3QjtBQUNBSCxPQUFHNVAsUUFBSCxDQUFZekcsWUFBWixHQUEyQnFHLE1BQU1yRyxZQUFqQztBQUVBbVcsb0JBQUEsQ0FBQTlhLE1BQUFnTCxNQUFBSSxRQUFBLFlBQUFwTCxJQUFnQzFFLElBQWhDLEdBQWdDLE1BQWhDOztBQUVBLFFBQUcwUCxNQUFNMVAsSUFBTixLQUFjLE1BQWQsSUFBd0IwUCxNQUFNMVAsSUFBTixLQUFjLE9BQXpDO0FBQ0MwZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjs7QUFDQSxVQUFHcU0sTUFBTW1RLFFBQVQ7QUFDQ0gsV0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FBQ0FxYyxXQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixNQUFuQjtBQUpGO0FBQUEsV0FLSyxJQUFHMFAsTUFBTTFQLElBQU4sS0FBYyxRQUFkLElBQTBCMFAsTUFBTTFQLElBQU4sS0FBYyxTQUEzQztBQUNKMGYsU0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FBQ0FxYyxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixNQUFuQjtBQUZJLFdBR0EsSUFBRzBQLE1BQU0xUCxJQUFOLEtBQWMsTUFBakI7QUFDSjBmLFNBQUcxZixJQUFILEdBQVVxRCxNQUFWO0FBQ0FxYyxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixVQUFuQjtBQUNBMGYsU0FBRzVQLFFBQUgsQ0FBWWdRLElBQVosR0FBbUJwUSxNQUFNb1EsSUFBTixJQUFjLEVBQWpDOztBQUNBLFVBQUdwUSxNQUFNcVEsUUFBVDtBQUNDTCxXQUFHNVAsUUFBSCxDQUFZaVEsUUFBWixHQUF1QnJRLE1BQU1xUSxRQUE3QjtBQUxHO0FBQUEsV0FNQSxJQUFHclEsTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVXFELE1BQVY7QUFDQXFjLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFVBQW5CO0FBQ0EwZixTQUFHNVAsUUFBSCxDQUFZZ1EsSUFBWixHQUFtQnBRLE1BQU1vUSxJQUFOLElBQWMsQ0FBakM7QUFISSxXQUlBLElBQUdwUSxNQUFNMVAsSUFBTixLQUFjLFVBQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUNBcWMsU0FBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsVUFBbkI7QUFGSSxXQUdBLElBQUcwUCxNQUFNMVAsSUFBTixLQUFjLE1BQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVa0ksSUFBVjs7QUFDQSxVQUFHNUssT0FBT3VILFFBQVY7QUFDQyxZQUFHdUQsUUFBUTRYLFFBQVIsTUFBc0I1WCxRQUFRNlgsS0FBUixFQUF6QjtBQUNDLGNBQUc3WCxRQUFROFgsS0FBUixFQUFIO0FBRUNSLGVBQUc1UCxRQUFILENBQVlxUSxZQUFaLEdBQ0M7QUFBQW5nQixvQkFBTSxhQUFOO0FBQ0FvZ0IsMEJBQVksS0FEWjtBQUVBQyxnQ0FDQztBQUFBcmdCLHNCQUFNLE1BQU47QUFDQXNnQiwrQkFBZSxZQURmO0FBRUFDLDRCQUFZO0FBRlo7QUFIRCxhQUREO0FBRkQ7QUFXQ2IsZUFBRzVQLFFBQUgsQ0FBWXFRLFlBQVosR0FDQztBQUFBbmdCLG9CQUFNLHFCQUFOO0FBQ0F3Z0IsaUNBQ0M7QUFBQXhnQixzQkFBTTtBQUFOO0FBRkQsYUFERDtBQVpGO0FBQUE7QUFpQkMwZixhQUFHNVAsUUFBSCxDQUFZMlEsU0FBWixHQUF3QixZQUF4QjtBQUVBZixhQUFHNVAsUUFBSCxDQUFZcVEsWUFBWixHQUNDO0FBQUFuZ0Isa0JBQU0sYUFBTjtBQUNBb2dCLHdCQUFZLEtBRFo7QUFFQUMsOEJBQ0M7QUFBQXJnQixvQkFBTSxNQUFOO0FBQ0FzZ0IsNkJBQWU7QUFEZjtBQUhELFdBREQ7QUFwQkY7QUFGSTtBQUFBLFdBNEJBLElBQUc1USxNQUFNMVAsSUFBTixLQUFjLE1BQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVa0ksSUFBVjs7QUFDQSxVQUFHNUssT0FBT3VILFFBQVY7QUFFQzZhLFdBQUc1UCxRQUFILENBQVlxUSxZQUFaLEdBQ0M7QUFBQW5nQixnQkFBTSxhQUFOO0FBQ0FvZ0Isc0JBQVksS0FEWjtBQUVBQyw0QkFDQztBQUFBcmdCLGtCQUFNLE1BQU47QUFDQXNnQiwyQkFBZTtBQURmO0FBSEQsU0FERDtBQUpHO0FBQUEsV0FVQSxJQUFHNVEsTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVWtJLElBQVY7O0FBQ0EsVUFBRzVLLE9BQU91SCxRQUFWO0FBQ0MsWUFBR3VELFFBQVE0WCxRQUFSLE1BQXNCNVgsUUFBUTZYLEtBQVIsRUFBekI7QUFDQyxjQUFHN1gsUUFBUThYLEtBQVIsRUFBSDtBQUVDUixlQUFHNVAsUUFBSCxDQUFZcVEsWUFBWixHQUNDO0FBQUFuZ0Isb0JBQU0sYUFBTjtBQUNBcWdCLGdDQUNDO0FBQUFyZ0Isc0JBQU0sVUFBTjtBQUNBc2dCLCtCQUFlLGtCQURmO0FBRUFDLDRCQUFZO0FBRlo7QUFGRCxhQUREO0FBRkQ7QUFVQ2IsZUFBRzVQLFFBQUgsQ0FBWXFRLFlBQVosR0FDQztBQUFBbmdCLG9CQUFNLHFCQUFOO0FBQ0F3Z0IsaUNBQ0M7QUFBQXhnQixzQkFBTTtBQUFOO0FBRkQsYUFERDtBQVhGO0FBQUE7QUFpQkMwZixhQUFHNVAsUUFBSCxDQUFZcVEsWUFBWixHQUNDO0FBQUFuZ0Isa0JBQU0sYUFBTjtBQUNBcWdCLDhCQUNDO0FBQUFyZ0Isb0JBQU0sVUFBTjtBQUNBc2dCLDZCQUFlO0FBRGY7QUFGRCxXQUREO0FBbEJGO0FBRkk7QUFBQSxXQXlCQSxJQUFHNVEsTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVSxDQUFDb0UsTUFBRCxDQUFWO0FBREksV0FFQSxJQUFHc0wsTUFBTTFQLElBQU4sS0FBYyxNQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVXFELE1BQVY7O0FBQ0EsVUFBRy9GLE9BQU91SCxRQUFWO0FBQ0M2YSxXQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixhQUFuQjtBQUhHO0FBQUEsV0E2QkEsSUFBSTBQLE1BQU0xUCxJQUFOLEtBQWMsUUFBZCxJQUEwQjBQLE1BQU0xUCxJQUFOLEtBQWMsZUFBNUM7QUFDSjBmLFNBQUcxZixJQUFILEdBQVVxRCxNQUFWO0FBQ0FxYyxTQUFHNVAsUUFBSCxDQUFZNFEsUUFBWixHQUF1QmhSLE1BQU1nUixRQUE3Qjs7QUFDQSxVQUFHaFIsTUFBTW1RLFFBQVQ7QUFDQ0gsV0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FDUEc7O0FEU0osVUFBRyxDQUFDcU0sTUFBTVksTUFBVjtBQUVDb1AsV0FBRzVQLFFBQUgsQ0FBWXRKLE9BQVosR0FBc0JrSixNQUFNbEosT0FBNUI7QUFFQWtaLFdBQUc1UCxRQUFILENBQVk2USxRQUFaLEdBQXVCalIsTUFBTWtSLFNBQTdCOztBQUVBLFlBQUdsUixNQUFNd0osa0JBQVQ7QUFDQ3dHLGFBQUd4RyxrQkFBSCxHQUF3QnhKLE1BQU13SixrQkFBOUI7QUNWSTs7QURZTHdHLFdBQUcxYyxlQUFILEdBQXdCME0sTUFBTTFNLGVBQU4sR0FBMkIwTSxNQUFNMU0sZUFBakMsR0FBc0RySCxRQUFRNEssZUFBdEY7O0FBRUEsWUFBR21KLE1BQU1wTSxlQUFUO0FBQ0NvYyxhQUFHcGMsZUFBSCxHQUFxQm9NLE1BQU1wTSxlQUEzQjtBQ1hJOztBRGFMLFlBQUdvTSxNQUFNckcsWUFBVDtBQUVDLGNBQUcvTCxPQUFPdUgsUUFBVjtBQUNDLGdCQUFHNkssTUFBTW5NLGNBQU4sSUFBd0JVLEVBQUV1SCxVQUFGLENBQWFrRSxNQUFNbk0sY0FBbkIsQ0FBM0I7QUFDQ21jLGlCQUFHbmMsY0FBSCxHQUFvQm1NLE1BQU1uTSxjQUExQjtBQUREO0FBR0Msa0JBQUdVLEVBQUVtQyxRQUFGLENBQVdzSixNQUFNckcsWUFBakIsQ0FBSDtBQUNDa1csMkJBQVc1akIsUUFBUUMsT0FBUixDQUFnQjhULE1BQU1yRyxZQUF0QixDQUFYOztBQUNBLG9CQUFBa1csWUFBQSxRQUFBNWEsT0FBQTRhLFNBQUE5VyxXQUFBLFlBQUE5RCxLQUEwQnVILFdBQTFCLEdBQTBCLE1BQTFCLEdBQTBCLE1BQTFCO0FBQ0N3VCxxQkFBRzVQLFFBQUgsQ0FBWStRLE1BQVosR0FBcUIsSUFBckI7O0FBQ0FuQixxQkFBR25jLGNBQUgsR0FBb0IsVUFBQ3VkLFlBQUQ7QUNaVCwyQkRhVkMsTUFBTUMsSUFBTixDQUFXLG9CQUFYLEVBQWlDO0FBQ2hDeFQsa0NBQVkseUJBQXVCN1IsUUFBUTRKLGFBQVIsQ0FBc0JtSyxNQUFNckcsWUFBNUIsRUFBMENzVixLQUQ3QztBQUVoQ3NDLDhCQUFRLFFBQU12UixNQUFNckcsWUFBTixDQUFtQnlLLE9BQW5CLENBQTJCLEdBQTNCLEVBQStCLEdBQS9CLENBRmtCO0FBR2hDblEsbUNBQWEsS0FBRytMLE1BQU1yRyxZQUhVO0FBSWhDNlgsaUNBQVcsUUFKcUI7QUFLaENDLGlDQUFXLFVBQUNELFNBQUQsRUFBWTlMLE1BQVo7QUFDViw0QkFBQXhTLE1BQUE7QUFBQUEsaUNBQVNqSCxRQUFRNkksU0FBUixDQUFrQjRRLE9BQU96UixXQUF6QixDQUFUOztBQUNBLDRCQUFHeVIsT0FBT3pSLFdBQVAsS0FBc0IsU0FBekI7QUNYYyxpQ0RZYm1kLGFBQWFNLFFBQWIsQ0FBc0IsQ0FBQztBQUFDclMsbUNBQU9xRyxPQUFPdk8sS0FBUCxDQUFha0ksS0FBckI7QUFBNEJsSSxtQ0FBT3VPLE9BQU92TyxLQUFQLENBQWFqRyxJQUFoRDtBQUFzRHViLGtDQUFNL0csT0FBT3ZPLEtBQVAsQ0FBYXNWO0FBQXpFLDJCQUFELENBQXRCLEVBQXdHL0csT0FBT3ZPLEtBQVAsQ0FBYWpHLElBQXJILENDWmE7QURXZDtBQ0hjLGlDRE1ia2dCLGFBQWFNLFFBQWIsQ0FBc0IsQ0FBQztBQUFDclMsbUNBQU9xRyxPQUFPdk8sS0FBUCxDQUFhakUsT0FBT3VMLGNBQXBCLEtBQXVDaUgsT0FBT3ZPLEtBQVAsQ0FBYWtJLEtBQXBELElBQTZEcUcsT0FBT3ZPLEtBQVAsQ0FBYWpHLElBQWxGO0FBQXdGaUcsbUNBQU91TyxPQUFPL1A7QUFBdEcsMkJBQUQsQ0FBdEIsRUFBb0krUCxPQUFPL1AsR0FBM0ksQ0NOYTtBQU1EO0FEVmtCO0FBQUEscUJBQWpDLENDYlU7QURZUyxtQkFBcEI7QUFGRDtBQWdCQ3FhLHFCQUFHNVAsUUFBSCxDQUFZK1EsTUFBWixHQUFxQixLQUFyQjtBQWxCRjtBQUhEO0FBREQ7QUM0Qk07O0FESk4sY0FBRzVjLEVBQUVzWCxTQUFGLENBQVk3TCxNQUFNbVIsTUFBbEIsQ0FBSDtBQUNDbkIsZUFBRzVQLFFBQUgsQ0FBWStRLE1BQVosR0FBcUJuUixNQUFNbVIsTUFBM0I7QUNNSzs7QURKTixjQUFHblIsTUFBTTJSLGNBQVQ7QUFDQzNCLGVBQUc1UCxRQUFILENBQVl3UixXQUFaLEdBQTBCNVIsTUFBTTJSLGNBQWhDO0FDTUs7O0FESk4sY0FBRzNSLE1BQU02UixlQUFUO0FBQ0M3QixlQUFHNVAsUUFBSCxDQUFZMFIsWUFBWixHQUEyQjlSLE1BQU02UixlQUFqQztBQ01LOztBRExOLGNBQUc3UixNQUFNK1Isa0JBQVQ7QUFDQy9CLGVBQUc1UCxRQUFILENBQVk0UixnQkFBWixHQUErQmhTLE1BQU0rUixrQkFBckM7QUNPSzs7QURMTixjQUFHL1IsTUFBTXJHLFlBQU4sS0FBc0IsT0FBekI7QUFDQ3FXLGVBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFlBQW5COztBQUNBLGdCQUFHLENBQUMwUCxNQUFNWSxNQUFQLElBQWlCLENBQUNaLE1BQU11SSxJQUEzQjtBQUdDLGtCQUFHdkksTUFBTXlKLGtCQUFOLEtBQTRCLE1BQS9CO0FBSUMsb0JBQUc3YixPQUFPdUgsUUFBVjtBQUNDNEQsZ0NBQWMvRSxJQUFJK0UsV0FBbEI7QUFDQW1YLGdDQUFBblgsZUFBQSxPQUFjQSxZQUFhNkQsY0FBM0IsR0FBMkIsTUFBM0I7O0FBQ0Esc0JBQUdySSxFQUFFeU4sT0FBRixDQUFVLENBQUMsZUFBRCxFQUFrQixPQUFsQixFQUEyQixhQUEzQixDQUFWLEVBQXFEaE8sSUFBSTlDLElBQXpELENBQUg7QUFFQ2dmLGtDQUFBblgsZUFBQSxPQUFjQSxZQUFha0IsZ0JBQTNCLEdBQTJCLE1BQTNCO0FDQ1M7O0FEQVYsc0JBQUdpVyxXQUFIO0FBQ0NGLHVCQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUMsS0FBakM7QUFERDtBQUdDdUcsdUJBQUc1UCxRQUFILENBQVlxSixrQkFBWixHQUFpQyxJQUFqQztBQVRGO0FBSkQ7QUFBQSxxQkFjSyxJQUFHbFYsRUFBRXVILFVBQUYsQ0FBYWtFLE1BQU15SixrQkFBbkIsQ0FBSDtBQUNKLG9CQUFHN2IsT0FBT3VILFFBQVY7QUFFQzZhLHFCQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUN6SixNQUFNeUosa0JBQU4sQ0FBeUJ6VixJQUFJK0UsV0FBN0IsQ0FBakM7QUFGRDtBQUtDaVgscUJBQUc1UCxRQUFILENBQVlxSixrQkFBWixHQUFpQyxJQUFqQztBQU5HO0FBQUE7QUFRSnVHLG1CQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUN6SixNQUFNeUosa0JBQXZDO0FBekJGO0FBQUE7QUEyQkN1RyxpQkFBRzVQLFFBQUgsQ0FBWXFKLGtCQUFaLEdBQWlDekosTUFBTXlKLGtCQUF2QztBQTdCRjtBQUFBLGlCQThCSyxJQUFHekosTUFBTXJHLFlBQU4sS0FBc0IsZUFBekI7QUFDSnFXLGVBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFdBQW5COztBQUNBLGdCQUFHLENBQUMwUCxNQUFNWSxNQUFQLElBQWlCLENBQUNaLE1BQU11SSxJQUEzQjtBQUdDLGtCQUFHdkksTUFBTXlKLGtCQUFOLEtBQTRCLE1BQS9CO0FBSUMsb0JBQUc3YixPQUFPdUgsUUFBVjtBQUNDNEQsZ0NBQWMvRSxJQUFJK0UsV0FBbEI7QUFDQW1YLGdDQUFBblgsZUFBQSxPQUFjQSxZQUFhNkQsY0FBM0IsR0FBMkIsTUFBM0I7O0FBQ0Esc0JBQUdySSxFQUFFeU4sT0FBRixDQUFVLENBQUMsZUFBRCxFQUFrQixPQUFsQixFQUEyQixhQUEzQixDQUFWLEVBQXFEaE8sSUFBSTlDLElBQXpELENBQUg7QUFFQ2dmLGtDQUFBblgsZUFBQSxPQUFjQSxZQUFha0IsZ0JBQTNCLEdBQTJCLE1BQTNCO0FDRFM7O0FERVYsc0JBQUdpVyxXQUFIO0FBQ0NGLHVCQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUMsS0FBakM7QUFERDtBQUdDdUcsdUJBQUc1UCxRQUFILENBQVlxSixrQkFBWixHQUFpQyxJQUFqQztBQVRGO0FBSkQ7QUFBQSxxQkFjSyxJQUFHbFYsRUFBRXVILFVBQUYsQ0FBYWtFLE1BQU15SixrQkFBbkIsQ0FBSDtBQUNKLG9CQUFHN2IsT0FBT3VILFFBQVY7QUFFQzZhLHFCQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUN6SixNQUFNeUosa0JBQU4sQ0FBeUJ6VixJQUFJK0UsV0FBN0IsQ0FBakM7QUFGRDtBQUtDaVgscUJBQUc1UCxRQUFILENBQVlxSixrQkFBWixHQUFpQyxJQUFqQztBQU5HO0FBQUE7QUFRSnVHLG1CQUFHNVAsUUFBSCxDQUFZcUosa0JBQVosR0FBaUN6SixNQUFNeUosa0JBQXZDO0FBekJGO0FBQUE7QUEyQkN1RyxpQkFBRzVQLFFBQUgsQ0FBWXFKLGtCQUFaLEdBQWlDekosTUFBTXlKLGtCQUF2QztBQTdCRztBQUFBO0FBK0JKLGdCQUFHLE9BQU96SixNQUFNckcsWUFBYixLQUE4QixVQUFqQztBQUNDeVEsOEJBQWdCcEssTUFBTXJHLFlBQU4sRUFBaEI7QUFERDtBQUdDeVEsOEJBQWdCcEssTUFBTXJHLFlBQXRCO0FDR007O0FERFAsZ0JBQUdwRixFQUFFVyxPQUFGLENBQVVrVixhQUFWLENBQUg7QUFDQzRGLGlCQUFHMWYsSUFBSCxHQUFVb0UsTUFBVjtBQUNBc2IsaUJBQUdpQyxRQUFILEdBQWMsSUFBZDtBQUNBakMsaUJBQUc1UCxRQUFILENBQVk4UixhQUFaLEdBQTRCLElBQTVCO0FBRUE3RixxQkFBT3RNLGFBQWEsSUFBcEIsSUFBNEI7QUFDM0J6UCxzQkFBTXFELE1BRHFCO0FBRTNCeU0sMEJBQVU7QUFBQ21JLHdCQUFNO0FBQVA7QUFGaUIsZUFBNUI7QUFLQThELHFCQUFPdE0sYUFBYSxNQUFwQixJQUE4QjtBQUM3QnpQLHNCQUFNLENBQUNxRCxNQUFELENBRHVCO0FBRTdCeU0sMEJBQVU7QUFBQ21JLHdCQUFNO0FBQVA7QUFGbUIsZUFBOUI7QUFWRDtBQWdCQzZCLDhCQUFnQixDQUFDQSxhQUFELENBQWhCO0FDSU07O0FERlB0UixzQkFBVTdNLFFBQVFDLE9BQVIsQ0FBZ0JrZSxjQUFjLENBQWQsQ0FBaEIsQ0FBVjs7QUFDQSxnQkFBR3RSLFdBQVlBLFFBQVF3VSxXQUF2QjtBQUNDMEMsaUJBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFlBQW5CO0FBREQ7QUFHQzBmLGlCQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixnQkFBbkI7QUFDQTBmLGlCQUFHNVAsUUFBSCxDQUFZK1IsYUFBWixHQUE0Qm5TLE1BQU1tUyxhQUFOLElBQXVCLHdCQUFuRDs7QUFFQSxrQkFBR3ZrQixPQUFPdUgsUUFBVjtBQUNDNmEsbUJBQUc1UCxRQUFILENBQVlnUyxtQkFBWixHQUFrQztBQUNqQyx5QkFBTztBQUFDL2QsMkJBQU9nQixRQUFRQyxHQUFSLENBQVksU0FBWjtBQUFSLG1CQUFQO0FBRGlDLGlCQUFsQzs7QUFFQTBhLG1CQUFHNVAsUUFBSCxDQUFZaVMsVUFBWixHQUF5QixFQUF6Qjs7QUFDQWpJLDhCQUFjakksT0FBZCxDQUFzQixVQUFDbVEsVUFBRDtBQUNyQnhaLDRCQUFVN00sUUFBUUMsT0FBUixDQUFnQm9tQixVQUFoQixDQUFWOztBQUNBLHNCQUFHeFosT0FBSDtBQ01XLDJCRExWa1gsR0FBRzVQLFFBQUgsQ0FBWWlTLFVBQVosQ0FBdUJsWSxJQUF2QixDQUE0QjtBQUMzQmpILDhCQUFRb2YsVUFEbUI7QUFFM0JqVCw2QkFBQXZHLFdBQUEsT0FBT0EsUUFBU3VHLEtBQWhCLEdBQWdCLE1BRlc7QUFHM0JvTiw0QkFBQTNULFdBQUEsT0FBTUEsUUFBUzJULElBQWYsR0FBZSxNQUhZO0FBSTNCOEYsNEJBQU07QUFDTCwrQkFBTyxVQUFRbGQsUUFBUUMsR0FBUixDQUFZLFFBQVosQ0FBUixHQUE4QixHQUE5QixHQUFpQ2dkLFVBQWpDLEdBQTRDLFFBQW5EO0FBTDBCO0FBQUEscUJBQTVCLENDS1U7QUROWDtBQ2VXLDJCRE5WdEMsR0FBRzVQLFFBQUgsQ0FBWWlTLFVBQVosQ0FBdUJsWSxJQUF2QixDQUE0QjtBQUMzQmpILDhCQUFRb2YsVUFEbUI7QUFFM0JDLDRCQUFNO0FBQ0wsK0JBQU8sVUFBUWxkLFFBQVFDLEdBQVIsQ0FBWSxRQUFaLENBQVIsR0FBOEIsR0FBOUIsR0FBaUNnZCxVQUFqQyxHQUE0QyxRQUFuRDtBQUgwQjtBQUFBLHFCQUE1QixDQ01VO0FBTUQ7QUR2Qlg7QUFWRjtBQXZESTtBQW5FTjtBQUFBO0FBc0pDdEMsYUFBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsZ0JBQW5CO0FBQ0EwZixhQUFHNVAsUUFBSCxDQUFZb1MsV0FBWixHQUEwQnhTLE1BQU13UyxXQUFoQztBQXJLRjtBQU5JO0FBQUEsV0E2S0EsSUFBR3hTLE1BQU0xUCxJQUFOLEtBQWMsUUFBakI7QUFDSjBmLFNBQUcxZixJQUFILEdBQVVxRCxNQUFWOztBQUNBLFVBQUdxTSxNQUFNbVEsUUFBVDtBQUNDSCxXQUFHMWYsSUFBSCxHQUFVLENBQUNxRCxNQUFELENBQVY7QUFDQXFjLFdBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLGdCQUFuQjtBQUNBMGYsV0FBRzVQLFFBQUgsQ0FBWTRRLFFBQVosR0FBdUIsS0FBdkI7QUFDQWhCLFdBQUc1UCxRQUFILENBQVk3UCxPQUFaLEdBQXNCeVAsTUFBTXpQLE9BQTVCO0FBSkQ7QUFNQ3lmLFdBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFFBQW5CO0FBQ0EwZixXQUFHNVAsUUFBSCxDQUFZN1AsT0FBWixHQUFzQnlQLE1BQU16UCxPQUE1Qjs7QUFDQSxZQUFHZ0UsRUFBRXdOLEdBQUYsQ0FBTS9CLEtBQU4sRUFBYSxhQUFiLENBQUg7QUFDQ2dRLGFBQUc1UCxRQUFILENBQVlxUyxXQUFaLEdBQTBCelMsTUFBTXlTLFdBQWhDO0FBREQ7QUFHQ3pDLGFBQUc1UCxRQUFILENBQVlxUyxXQUFaLEdBQTBCLEVBQTFCO0FBWEY7QUN5Qkk7O0FEWEosVUFBR3pTLE1BQU0wUCxTQUFOLElBQW9CMVAsTUFBTTBQLFNBQU4sS0FBbUIsTUFBMUM7QUFDQyxZQUFHLENBQUMsUUFBRCxFQUFXLFVBQVgsRUFBdUIsU0FBdkIsRUFBa0NwWixPQUFsQyxDQUEwQzBKLE1BQU0wUCxTQUFoRCxJQUE2RCxDQUFDLENBQWpFO0FBQ0NPLG1CQUFTaEcsTUFBVDtBQUNBK0YsYUFBRzBDLE9BQUgsR0FBYSxJQUFiO0FBRkQsZUFHSyxJQUFHMVMsTUFBTTBQLFNBQU4sS0FBbUIsU0FBdEI7QUFDSk8sbUJBQVMvRixPQUFUO0FBREk7QUFHSitGLG1CQUFTdGMsTUFBVDtBQ2FJOztBRFpMcWMsV0FBRzFmLElBQUgsR0FBVTJmLE1BQVY7O0FBQ0EsWUFBR2pRLE1BQU1tUSxRQUFUO0FBQ0NILGFBQUcxZixJQUFILEdBQVUsQ0FBQzJmLE1BQUQsQ0FBVjtBQ2NJOztBRFpMRCxXQUFHNVAsUUFBSCxDQUFZN1AsT0FBWixHQUFzQnRFLFFBQVF1akIsZ0JBQVIsQ0FBeUJ4UCxLQUF6QixDQUF0QjtBQTVCRztBQUFBLFdBNkJBLElBQUdBLE1BQU0xUCxJQUFOLEtBQWMsVUFBakI7QUFDSjBmLFNBQUcxZixJQUFILEdBQVUyWixNQUFWO0FBQ0ErRixTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixlQUFuQjtBQUNBMGYsU0FBRzVQLFFBQUgsQ0FBWXVTLFNBQVosR0FBd0IzUyxNQUFNMlMsU0FBTixJQUFtQixFQUEzQzs7QUFDQSxVQUFBM1MsU0FBQSxPQUFHQSxNQUFPNFMsS0FBVixHQUFVLE1BQVY7QUFDQzVDLFdBQUc1UCxRQUFILENBQVl3UyxLQUFaLEdBQW9CNVMsTUFBTTRTLEtBQTFCO0FBQ0E1QyxXQUFHMEMsT0FBSCxHQUFhLElBQWI7QUFGRCxhQUdLLEtBQUExUyxTQUFBLE9BQUdBLE1BQU80UyxLQUFWLEdBQVUsTUFBVixNQUFtQixDQUFuQjtBQUNKNUMsV0FBRzVQLFFBQUgsQ0FBWXdTLEtBQVosR0FBb0IsQ0FBcEI7QUFDQTVDLFdBQUcwQyxPQUFILEdBQWEsSUFBYjtBQVRHO0FBQUEsV0FVQSxJQUFHMVMsTUFBTTFQLElBQU4sS0FBYyxRQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVTJaLE1BQVY7QUFDQStGLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLGVBQW5CO0FBQ0EwZixTQUFHNVAsUUFBSCxDQUFZdVMsU0FBWixHQUF3QjNTLE1BQU0yUyxTQUFOLElBQW1CLEVBQTNDOztBQUNBLFVBQUEzUyxTQUFBLE9BQUdBLE1BQU80UyxLQUFWLEdBQVUsTUFBVjtBQUNDNUMsV0FBRzVQLFFBQUgsQ0FBWXdTLEtBQVosR0FBb0I1UyxNQUFNNFMsS0FBMUI7QUFDQTVDLFdBQUcwQyxPQUFILEdBQWEsSUFBYjtBQU5HO0FBQUEsV0FPQSxJQUFHMVMsTUFBTTFQLElBQU4sS0FBYyxTQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVTRaLE9BQVY7O0FBQ0EsVUFBR2xLLE1BQU15SSxRQUFUO0FBQ0N1SCxXQUFHNVAsUUFBSCxDQUFZeVMsUUFBWixHQUF1QixJQUF2QjtBQ2lCRzs7QURoQko3QyxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQiwwQkFBbkI7QUFKSSxXQUtBLElBQUcwUCxNQUFNMVAsSUFBTixLQUFjLFFBQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVNFosT0FBVjs7QUFDQSxVQUFHbEssTUFBTXlJLFFBQVQ7QUFDQ3VILFdBQUc1UCxRQUFILENBQVl5UyxRQUFaLEdBQXVCLElBQXZCO0FDa0JHOztBRGpCSjdDLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLHdCQUFuQjtBQUpJLFdBS0EsSUFBRzBQLE1BQU0xUCxJQUFOLEtBQWMsV0FBakI7QUFDSjBmLFNBQUcxZixJQUFILEdBQVVxRCxNQUFWO0FBREksV0FFQSxJQUFHcU0sTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FBQ0FxYyxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixpQkFBbkI7QUFDQTBmLFNBQUc1UCxRQUFILENBQVk3UCxPQUFaLEdBQXNCeVAsTUFBTXpQLE9BQTVCO0FBSEksV0FJQSxJQUFHeVAsTUFBTTFQLElBQU4sS0FBYyxNQUFqQjtBQUNKeWYsdUJBQWlCL1AsTUFBTWxDLFVBQU4sSUFBb0IsT0FBckM7O0FBQ0EsVUFBR2tDLE1BQU1tUSxRQUFUO0FBQ0NILFdBQUcxZixJQUFILEdBQVUsQ0FBQ3FELE1BQUQsQ0FBVjtBQUNBMFksZUFBT3RNLGFBQWEsSUFBcEIsSUFDQztBQUFBSyxvQkFDQztBQUFBOVAsa0JBQU0sWUFBTjtBQUNBd04sd0JBQVlpUztBQURaO0FBREQsU0FERDtBQUZEO0FBT0NDLFdBQUcxZixJQUFILEdBQVVxRCxNQUFWO0FBQ0FxYyxXQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixZQUFuQjtBQUNBMGYsV0FBRzVQLFFBQUgsQ0FBWXRDLFVBQVosR0FBeUJpUyxjQUF6QjtBQVhHO0FBQUEsV0FZQSxJQUFHL1AsTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVTJaLE1BQVY7QUFDQStGLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFVBQW5CO0FBRkksV0FHQSxJQUFHMFAsTUFBTTFQLElBQU4sS0FBYyxRQUFkLElBQTBCMFAsTUFBTTFQLElBQU4sS0FBYyxRQUEzQztBQUNKMGYsU0FBRzFmLElBQUgsR0FBVW9FLE1BQVY7QUFESSxXQUVBLElBQUdzTCxNQUFNMVAsSUFBTixLQUFjLE1BQWQsSUFBd0IwUCxNQUFNMVAsSUFBTixLQUFjLE9BQXpDO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVd2lCLEtBQVY7QUFDQTlDLFNBQUc1UCxRQUFILENBQVkyUyxRQUFaLEdBQXVCLElBQXZCO0FBQ0EvQyxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixhQUFuQjtBQUVBK2IsYUFBT3RNLGFBQWEsSUFBcEIsSUFDQztBQUFBelAsY0FBTW9FO0FBQU4sT0FERDtBQUxJLFdBT0EsSUFBR3NMLE1BQU0xUCxJQUFOLEtBQWMsT0FBakI7QUFDSixVQUFHMFAsTUFBTW1RLFFBQVQ7QUFDQ0gsV0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FBQ0EwWSxlQUFPdE0sYUFBYSxJQUFwQixJQUNDO0FBQUFLLG9CQUNDO0FBQUE5UCxrQkFBTSxZQUFOO0FBQ0F3Tix3QkFBWSxRQURaO0FBRUFrVixvQkFBUTtBQUZSO0FBREQsU0FERDtBQUZEO0FBUUNoRCxXQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUNBcWMsV0FBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsWUFBbkI7QUFDQTBmLFdBQUc1UCxRQUFILENBQVl0QyxVQUFaLEdBQXlCLFFBQXpCO0FBQ0FrUyxXQUFHNVAsUUFBSCxDQUFZNFMsTUFBWixHQUFxQixTQUFyQjtBQVpHO0FBQUEsV0FhQSxJQUFHaFQsTUFBTTFQLElBQU4sS0FBYyxRQUFqQjtBQUNKLFVBQUcwUCxNQUFNbVEsUUFBVDtBQUNDSCxXQUFHMWYsSUFBSCxHQUFVLENBQUNxRCxNQUFELENBQVY7QUFDQTBZLGVBQU90TSxhQUFhLElBQXBCLElBQ0M7QUFBQUssb0JBQ0M7QUFBQTlQLGtCQUFNLFlBQU47QUFDQXdOLHdCQUFZLFNBRFo7QUFFQWtWLG9CQUFRO0FBRlI7QUFERCxTQUREO0FBRkQ7QUFRQ2hELFdBQUcxZixJQUFILEdBQVVxRCxNQUFWO0FBQ0FxYyxXQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixZQUFuQjtBQUNBMGYsV0FBRzVQLFFBQUgsQ0FBWXRDLFVBQVosR0FBeUIsU0FBekI7QUFDQWtTLFdBQUc1UCxRQUFILENBQVk0UyxNQUFaLEdBQXFCLFNBQXJCO0FBWkc7QUFBQSxXQWFBLElBQUdoVCxNQUFNMVAsSUFBTixLQUFjLE9BQWpCO0FBQ0osVUFBRzBQLE1BQU1tUSxRQUFUO0FBQ0NILFdBQUcxZixJQUFILEdBQVUsQ0FBQ3FELE1BQUQsQ0FBVjtBQUNBMFksZUFBT3RNLGFBQWEsSUFBcEIsSUFDQztBQUFBSyxvQkFDQztBQUFBOVAsa0JBQU0sWUFBTjtBQUNBd04sd0JBQVksUUFEWjtBQUVBa1Ysb0JBQVE7QUFGUjtBQURELFNBREQ7QUFGRDtBQVFDaEQsV0FBRzFmLElBQUgsR0FBVXFELE1BQVY7QUFDQXFjLFdBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFlBQW5CO0FBQ0EwZixXQUFHNVAsUUFBSCxDQUFZdEMsVUFBWixHQUF5QixRQUF6QjtBQUNBa1MsV0FBRzVQLFFBQUgsQ0FBWTRTLE1BQVosR0FBcUIsU0FBckI7QUFaRztBQUFBLFdBYUEsSUFBR2hULE1BQU0xUCxJQUFOLEtBQWMsT0FBakI7QUFDSixVQUFHMFAsTUFBTW1RLFFBQVQ7QUFDQ0gsV0FBRzFmLElBQUgsR0FBVSxDQUFDcUQsTUFBRCxDQUFWO0FBQ0EwWSxlQUFPdE0sYUFBYSxJQUFwQixJQUNDO0FBQUFLLG9CQUNDO0FBQUE5UCxrQkFBTSxZQUFOO0FBQ0F3Tix3QkFBWSxRQURaO0FBRUFrVixvQkFBUTtBQUZSO0FBREQsU0FERDtBQUZEO0FBUUNoRCxXQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUNBcWMsV0FBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsWUFBbkI7QUFDQTBmLFdBQUc1UCxRQUFILENBQVl0QyxVQUFaLEdBQXlCLFFBQXpCO0FBQ0FrUyxXQUFHNVAsUUFBSCxDQUFZNFMsTUFBWixHQUFxQixTQUFyQjtBQVpHO0FBQUEsV0FhQSxJQUFHaFQsTUFBTTFQLElBQU4sS0FBYyxVQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVW9FLE1BQVY7QUFDQXNiLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFVBQW5CO0FBQ0EwZixTQUFHNVAsUUFBSCxDQUFZNlMsTUFBWixHQUFxQmpULE1BQU1pVCxNQUFOLElBQWdCLE9BQXJDO0FBQ0FqRCxTQUFHaUMsUUFBSCxHQUFjLElBQWQ7QUFKSSxXQUtBLElBQUdqUyxNQUFNMVAsSUFBTixLQUFjLFVBQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUNBcWMsU0FBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsTUFBbkI7QUFGSSxXQUdBLElBQUcwUCxNQUFNMVAsSUFBTixLQUFjLEtBQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUVBcWMsU0FBRzVQLFFBQUgsQ0FBWTlQLElBQVosR0FBbUIsWUFBbkI7QUFISSxXQUlBLElBQUcwUCxNQUFNMVAsSUFBTixLQUFjLE9BQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQUNBcWMsU0FBR3RKLEtBQUgsR0FBV3RULGFBQWFpVCxLQUFiLENBQW1CNk0sS0FBOUI7QUFDQWxELFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLGNBQW5CO0FBSEksV0FJQSxJQUFHMFAsTUFBTTFQLElBQU4sS0FBYyxZQUFqQjtBQUNKMGYsU0FBRzFmLElBQUgsR0FBVXFELE1BQVY7QUFESSxXQUVBLElBQUdxTSxNQUFNMVAsSUFBTixLQUFjLE9BQWpCO0FBQ0owZixTQUFHMWYsSUFBSCxHQUFVcUQsTUFBVjtBQURJLFdBRUEsSUFBR3FNLE1BQU0xUCxJQUFOLEtBQWMsU0FBakI7QUFDSjBmLFdBQUsvakIsUUFBUWlqQixlQUFSLENBQXdCO0FBQUM5WSxnQkFBUTtBQUFDNEosaUJBQU90TCxPQUFPeVUsTUFBUCxDQUFjLEVBQWQsRUFBa0JuSixLQUFsQixFQUF5QjtBQUFDMVAsa0JBQU0wUCxNQUFNMFA7QUFBYixXQUF6QjtBQUFSO0FBQVQsT0FBeEIsRUFBOEYxUCxNQUFNOU8sSUFBcEcsQ0FBTDtBQURJLFdBRUEsSUFBRzhPLE1BQU0xUCxJQUFOLEtBQWMsU0FBakI7QUFDSjBmLFdBQUsvakIsUUFBUWlqQixlQUFSLENBQXdCO0FBQUM5WSxnQkFBUTtBQUFDNEosaUJBQU90TCxPQUFPeVUsTUFBUCxDQUFjLEVBQWQsRUFBa0JuSixLQUFsQixFQUF5QjtBQUFDMVAsa0JBQU0wUCxNQUFNMFA7QUFBYixXQUF6QjtBQUFSO0FBQVQsT0FBeEIsRUFBOEYxUCxNQUFNOU8sSUFBcEcsQ0FBTDtBQURJLFdBSUEsSUFBRzhPLE1BQU0xUCxJQUFOLEtBQWMsU0FBakI7QUFDSjBmLFNBQUcxZixJQUFILEdBQVUyWixNQUFWO0FBQ0ErRixTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQixlQUFuQjtBQUNBMGYsU0FBRzVQLFFBQUgsQ0FBWXVTLFNBQVosR0FBd0IzUyxNQUFNMlMsU0FBTixJQUFtQixFQUEzQzs7QUFDQSxXQUFPcGUsRUFBRTRlLFFBQUYsQ0FBV25ULE1BQU00UyxLQUFqQixDQUFQO0FBRUM1UyxjQUFNNFMsS0FBTixHQUFjLENBQWQ7QUMwQ0c7O0FEeENKNUMsU0FBRzVQLFFBQUgsQ0FBWXdTLEtBQVosR0FBb0I1UyxNQUFNNFMsS0FBTixHQUFjLENBQWxDO0FBQ0E1QyxTQUFHMEMsT0FBSCxHQUFhLElBQWI7QUFUSTtBQVdKMUMsU0FBRzFmLElBQUgsR0FBVTBQLE1BQU0xUCxJQUFoQjtBQzBDRTs7QUR4Q0gsUUFBRzBQLE1BQU1YLEtBQVQ7QUFDQzJRLFNBQUczUSxLQUFILEdBQVdXLE1BQU1YLEtBQWpCO0FDMENFOztBRHJDSCxRQUFHLENBQUNXLE1BQU13SSxRQUFWO0FBQ0N3SCxTQUFHb0QsUUFBSCxHQUFjLElBQWQ7QUN1Q0U7O0FEbkNILFFBQUcsQ0FBQ3hsQixPQUFPdUgsUUFBWDtBQUNDNmEsU0FBR29ELFFBQUgsR0FBYyxJQUFkO0FDcUNFOztBRG5DSCxRQUFHcFQsTUFBTXFULE1BQVQ7QUFDQ3JELFNBQUdxRCxNQUFILEdBQVksSUFBWjtBQ3FDRTs7QURuQ0gsUUFBR3JULE1BQU11SSxJQUFUO0FBQ0N5SCxTQUFHNVAsUUFBSCxDQUFZbUksSUFBWixHQUFtQixJQUFuQjtBQ3FDRTs7QURuQ0gsUUFBR3ZJLE1BQU1zVCxLQUFUO0FBQ0N0RCxTQUFHNVAsUUFBSCxDQUFZa1QsS0FBWixHQUFvQnRULE1BQU1zVCxLQUExQjtBQ3FDRTs7QURuQ0gsUUFBR3RULE1BQU1DLE9BQVQ7QUFDQytQLFNBQUc1UCxRQUFILENBQVlILE9BQVosR0FBc0IsSUFBdEI7QUNxQ0U7O0FEbkNILFFBQUdELE1BQU1ZLE1BQVQ7QUFDQ29QLFNBQUc1UCxRQUFILENBQVk5UCxJQUFaLEdBQW1CLFFBQW5CO0FDcUNFOztBRG5DSCxRQUFJMFAsTUFBTTFQLElBQU4sS0FBYyxRQUFmLElBQTZCMFAsTUFBTTFQLElBQU4sS0FBYyxRQUEzQyxJQUF5RDBQLE1BQU0xUCxJQUFOLEtBQWMsZUFBMUU7QUFDQyxVQUFHLE9BQU8wUCxNQUFNeU8sVUFBYixLQUE0QixXQUEvQjtBQUNDek8sY0FBTXlPLFVBQU4sR0FBbUIsSUFBbkI7QUFGRjtBQ3dDRzs7QURyQ0gsUUFBR3pPLE1BQU05TyxJQUFOLEtBQWMsTUFBZCxJQUF3QjhPLE1BQU11TyxPQUFqQztBQUNDLFVBQUcsT0FBT3ZPLE1BQU11VCxVQUFiLEtBQTRCLFdBQS9CO0FBQ0N2VCxjQUFNdVQsVUFBTixHQUFtQixJQUFuQjtBQUZGO0FDMENHOztBRHRDSCxRQUFHekQsYUFBSDtBQUNDRSxTQUFHNVAsUUFBSCxDQUFZOVAsSUFBWixHQUFtQndmLGFBQW5CO0FDd0NFOztBRHRDSCxRQUFHOVAsTUFBTThILFlBQVQ7QUFDQyxVQUFHbGEsT0FBT3VILFFBQVAsSUFBb0JsSixRQUFRMEssUUFBUixDQUFpQkMsWUFBakIsQ0FBOEJvSixNQUFNOEgsWUFBcEMsQ0FBdkI7QUFDQ2tJLFdBQUc1UCxRQUFILENBQVkwSCxZQUFaLEdBQTJCO0FBQzFCLGlCQUFPN2IsUUFBUTBLLFFBQVIsQ0FBaUJ4QyxHQUFqQixDQUFxQjZMLE1BQU04SCxZQUEzQixFQUF5QztBQUFDNVIsb0JBQVF0SSxPQUFPc0ksTUFBUCxFQUFUO0FBQTBCSixxQkFBU1QsUUFBUUMsR0FBUixDQUFZLFNBQVosQ0FBbkM7QUFBMkQ4VCxpQkFBSyxJQUFJNVEsSUFBSjtBQUFoRSxXQUF6QyxDQUFQO0FBRDBCLFNBQTNCO0FBREQ7QUFJQ3dYLFdBQUc1UCxRQUFILENBQVkwSCxZQUFaLEdBQTJCOUgsTUFBTThILFlBQWpDO0FBTEY7QUNtREc7O0FEMUNILFFBQUc5SCxNQUFNeUksUUFBVDtBQUNDdUgsU0FBRzVQLFFBQUgsQ0FBWXFJLFFBQVosR0FBdUIsSUFBdkI7QUM0Q0U7O0FEMUNILFFBQUd6SSxNQUFNNlMsUUFBVDtBQUNDN0MsU0FBRzVQLFFBQUgsQ0FBWXlTLFFBQVosR0FBdUIsSUFBdkI7QUM0Q0U7O0FEMUNILFFBQUc3UyxNQUFNd1QsY0FBVDtBQUNDeEQsU0FBRzVQLFFBQUgsQ0FBWW9ULGNBQVosR0FBNkJ4VCxNQUFNd1QsY0FBbkM7QUM0Q0U7O0FEMUNILFFBQUd4VCxNQUFNaVMsUUFBVDtBQUNDakMsU0FBR2lDLFFBQUgsR0FBYyxJQUFkO0FDNENFOztBRDFDSCxRQUFHMWQsRUFBRXdOLEdBQUYsQ0FBTS9CLEtBQU4sRUFBYSxLQUFiLENBQUg7QUFDQ2dRLFNBQUdyRyxHQUFILEdBQVMzSixNQUFNMkosR0FBZjtBQzRDRTs7QUQzQ0gsUUFBR3BWLEVBQUV3TixHQUFGLENBQU0vQixLQUFOLEVBQWEsS0FBYixDQUFIO0FBQ0NnUSxTQUFHdEcsR0FBSCxHQUFTMUosTUFBTTBKLEdBQWY7QUM2Q0U7O0FEMUNILFFBQUc5YixPQUFPNmxCLFlBQVY7QUFDQyxVQUFHelQsTUFBTWUsS0FBVDtBQUNDaVAsV0FBR2pQLEtBQUgsR0FBV2YsTUFBTWUsS0FBakI7QUFERCxhQUVLLElBQUdmLE1BQU0wVCxRQUFUO0FBQ0oxRCxXQUFHalAsS0FBSCxHQUFXLElBQVg7QUFKRjtBQ2lERzs7QUFDRCxXRDVDRnNMLE9BQU90TSxVQUFQLElBQXFCaVEsRUM0Q25CO0FEbGxCSDs7QUF3aUJBLFNBQU8zRCxNQUFQO0FBcGpCeUIsQ0FBMUI7O0FBdWpCQXBnQixRQUFRMG5CLG9CQUFSLEdBQStCLFVBQUMxZixXQUFELEVBQWM4TCxVQUFkLEVBQTBCNlQsV0FBMUI7QUFDOUIsTUFBQTVULEtBQUEsRUFBQTZULElBQUEsRUFBQTNnQixNQUFBO0FBQUEyZ0IsU0FBT0QsV0FBUDtBQUNBMWdCLFdBQVNqSCxRQUFRNkksU0FBUixDQUFrQmIsV0FBbEIsQ0FBVDs7QUFDQSxNQUFHLENBQUNmLE1BQUo7QUFDQyxXQUFPLEVBQVA7QUM4Q0M7O0FEN0NGOE0sVUFBUTlNLE9BQU9rRCxNQUFQLENBQWMySixVQUFkLENBQVI7O0FBQ0EsTUFBRyxDQUFDQyxLQUFKO0FBQ0MsV0FBTyxFQUFQO0FDK0NDOztBRDdDRixNQUFHQSxNQUFNMVAsSUFBTixLQUFjLFVBQWpCO0FBQ0N1akIsV0FBT0MsT0FBTyxLQUFLL0ksR0FBWixFQUFpQmdKLE1BQWpCLENBQXdCLGlCQUF4QixDQUFQO0FBREQsU0FFSyxJQUFHL1QsTUFBTTFQLElBQU4sS0FBYyxNQUFqQjtBQUNKdWpCLFdBQU9DLE9BQU8sS0FBSy9JLEdBQVosRUFBaUJnSixNQUFqQixDQUF3QixZQUF4QixDQUFQO0FDK0NDOztBRDdDRixTQUFPRixJQUFQO0FBZDhCLENBQS9COztBQWdCQTVuQixRQUFRK25CLGlDQUFSLEdBQTRDLFVBQUNDLFVBQUQ7QUFDM0MsU0FBTyxDQUFDLE1BQUQsRUFBUyxVQUFULEVBQXFCLE1BQXJCLEVBQTZCLFVBQTdCLEVBQXlDLFFBQXpDLEVBQW1EQyxRQUFuRCxDQUE0REQsVUFBNUQsQ0FBUDtBQUQyQyxDQUE1Qzs7QUFHQWhvQixRQUFRa29CLDJCQUFSLEdBQXNDLFVBQUNGLFVBQUQsRUFBYUcsVUFBYjtBQUNyQyxNQUFBQyxhQUFBO0FBQUFBLGtCQUFnQnBvQixRQUFRcW9CLHVCQUFSLENBQWdDTCxVQUFoQyxDQUFoQjs7QUFDQSxNQUFHSSxhQUFIO0FDa0RHLFdEakRGOWYsRUFBRTROLE9BQUYsQ0FBVWtTLGFBQVYsRUFBeUIsVUFBQ0UsV0FBRCxFQUFjaGMsR0FBZDtBQ2tEckIsYURqREg2YixXQUFXamEsSUFBWCxDQUFnQjtBQUFDa0YsZUFBT2tWLFlBQVlsVixLQUFwQjtBQUEyQmxJLGVBQU9vQjtBQUFsQyxPQUFoQixDQ2lERztBRGxESixNQ2lERTtBQU1EO0FEMURtQyxDQUF0Qzs7QUFNQXRNLFFBQVFxb0IsdUJBQVIsR0FBa0MsVUFBQ0wsVUFBRCxFQUFhTyxhQUFiO0FBRWpDLE1BQUcsQ0FBQyxNQUFELEVBQVMsVUFBVCxFQUFxQk4sUUFBckIsQ0FBOEJELFVBQTlCLENBQUg7QUFDQyxXQUFPaG9CLFFBQVF3b0IsMkJBQVIsQ0FBb0NELGFBQXBDLEVBQW1EUCxVQUFuRCxDQUFQO0FDdURDO0FEMUQrQixDQUFsQzs7QUFLQWhvQixRQUFReW9CLDBCQUFSLEdBQXFDLFVBQUNULFVBQUQsRUFBYTFiLEdBQWI7QUFFcEMsTUFBRyxDQUFDLE1BQUQsRUFBUyxVQUFULEVBQXFCMmIsUUFBckIsQ0FBOEJELFVBQTlCLENBQUg7QUFDQyxXQUFPaG9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1EMWIsR0FBbkQsQ0FBUDtBQ3dEQztBRDNEa0MsQ0FBckM7O0FBS0F0TSxRQUFRMm9CLDBCQUFSLEdBQXFDLFVBQUNYLFVBQUQsRUFBYTljLEtBQWI7QUFHcEMsTUFBQTBkLG9CQUFBLEVBQUFuUCxNQUFBOztBQUFBLE9BQU9uUixFQUFFbUMsUUFBRixDQUFXUyxLQUFYLENBQVA7QUFDQztBQ3lEQzs7QUR4REYwZCx5QkFBdUI1b0IsUUFBUXFvQix1QkFBUixDQUFnQ0wsVUFBaEMsQ0FBdkI7O0FBQ0EsT0FBT1ksb0JBQVA7QUFDQztBQzBEQzs7QUR6REZuUCxXQUFTLElBQVQ7O0FBQ0FuUixJQUFFeUMsSUFBRixDQUFPNmQsb0JBQVAsRUFBNkIsVUFBQzlSLElBQUQsRUFBT3lPLFNBQVA7QUFDNUIsUUFBR3pPLEtBQUt4SyxHQUFMLEtBQVlwQixLQUFmO0FDMkRJLGFEMURIdU8sU0FBUzhMLFNDMEROO0FBQ0Q7QUQ3REo7O0FBR0EsU0FBTzlMLE1BQVA7QUFab0MsQ0FBckM7O0FBZUF6WixRQUFRd29CLDJCQUFSLEdBQXNDLFVBQUNELGFBQUQsRUFBZ0JQLFVBQWhCO0FBRXJDLFNBQU87QUFDTiw4QkFBNkJPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxXQUFuRCxDQURwRDtBQUVOLDhCQUE2Qk8sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELFdBQW5ELENBRnBEO0FBR04sOEJBQTZCTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsV0FBbkQsQ0FIcEQ7QUFJTixpQ0FBZ0NPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxjQUFuRCxDQUp2RDtBQUtOLGlDQUFnQ08sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELGNBQW5ELENBTHZEO0FBTU4saUNBQWdDTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsY0FBbkQsQ0FOdkQ7QUFPTiwrQkFBOEJPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxZQUFuRCxDQVByRDtBQVFOLCtCQUE4Qk8sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELFlBQW5ELENBUnJEO0FBU04sK0JBQThCTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsWUFBbkQsQ0FUckQ7QUFVTiw4QkFBNkJPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxXQUFuRCxDQVZwRDtBQVdOLDhCQUE2Qk8sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELFdBQW5ELENBWHBEO0FBWU4sOEJBQTZCTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsV0FBbkQsQ0FacEQ7QUFhTiw0QkFBMkJPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxTQUFuRCxDQWJsRDtBQWNOLDBCQUF5Qk8sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELE9BQW5ELENBZGhEO0FBZU4sNkJBQTRCTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsVUFBbkQsQ0FmbkQ7QUFnQk4sZ0NBQStCTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsYUFBbkQsQ0FoQnREO0FBaUJOLGlDQUFnQ08sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELGNBQW5ELENBakJ2RDtBQWtCTixpQ0FBZ0NPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxjQUFuRCxDQWxCdkQ7QUFtQk4saUNBQWdDTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsY0FBbkQsQ0FuQnZEO0FBb0JOLGtDQUFpQ08sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELGVBQW5ELENBcEJ4RDtBQXFCTixnQ0FBK0JPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxhQUFuRCxDQXJCdEQ7QUFzQk4saUNBQWdDTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsY0FBbkQsQ0F0QnZEO0FBdUJOLGlDQUFnQ08sZ0JBQW1CLElBQW5CLEdBQTZCdm9CLFFBQVEwb0IsOEJBQVIsQ0FBdUNWLFVBQXZDLEVBQW1ELGNBQW5ELENBdkJ2RDtBQXdCTixpQ0FBZ0NPLGdCQUFtQixJQUFuQixHQUE2QnZvQixRQUFRMG9CLDhCQUFSLENBQXVDVixVQUF2QyxFQUFtRCxjQUFuRCxDQXhCdkQ7QUF5Qk4sa0NBQWlDTyxnQkFBbUIsSUFBbkIsR0FBNkJ2b0IsUUFBUTBvQiw4QkFBUixDQUF1Q1YsVUFBdkMsRUFBbUQsZUFBbkQ7QUF6QnhELEdBQVA7QUFGcUMsQ0FBdEM7O0FBOEJBaG9CLFFBQVE2b0Isb0JBQVIsR0FBK0IsVUFBQ0MsS0FBRDtBQUM5QixNQUFHLENBQUNBLEtBQUo7QUFDQ0EsWUFBUSxJQUFJdmMsSUFBSixHQUFXd2MsUUFBWCxFQUFSO0FDNkRDOztBRDNERixNQUFHRCxRQUFRLENBQVg7QUFDQyxXQUFPLENBQVA7QUFERCxTQUVLLElBQUdBLFFBQVEsQ0FBWDtBQUNKLFdBQU8sQ0FBUDtBQURJLFNBRUEsSUFBR0EsUUFBUSxDQUFYO0FBQ0osV0FBTyxDQUFQO0FDNkRDOztBRDNERixTQUFPLENBQVA7QUFYOEIsQ0FBL0I7O0FBY0E5b0IsUUFBUWdwQixzQkFBUixHQUFpQyxVQUFDQyxJQUFELEVBQU1ILEtBQU47QUFDaEMsTUFBRyxDQUFDRyxJQUFKO0FBQ0NBLFdBQU8sSUFBSTFjLElBQUosR0FBVzJjLFdBQVgsRUFBUDtBQzZEQzs7QUQ1REYsTUFBRyxDQUFDSixLQUFKO0FBQ0NBLFlBQVEsSUFBSXZjLElBQUosR0FBV3djLFFBQVgsRUFBUjtBQzhEQzs7QUQ1REYsTUFBR0QsUUFBUSxDQUFYO0FBQ0NHO0FBQ0FILFlBQVEsQ0FBUjtBQUZELFNBR0ssSUFBR0EsUUFBUSxDQUFYO0FBQ0pBLFlBQVEsQ0FBUjtBQURJLFNBRUEsSUFBR0EsUUFBUSxDQUFYO0FBQ0pBLFlBQVEsQ0FBUjtBQURJO0FBR0pBLFlBQVEsQ0FBUjtBQzhEQzs7QUQ1REYsU0FBTyxJQUFJdmMsSUFBSixDQUFTMGMsSUFBVCxFQUFlSCxLQUFmLEVBQXNCLENBQXRCLENBQVA7QUFoQmdDLENBQWpDOztBQW1CQTlvQixRQUFRbXBCLHNCQUFSLEdBQWlDLFVBQUNGLElBQUQsRUFBTUgsS0FBTjtBQUNoQyxNQUFHLENBQUNHLElBQUo7QUFDQ0EsV0FBTyxJQUFJMWMsSUFBSixHQUFXMmMsV0FBWCxFQUFQO0FDOERDOztBRDdERixNQUFHLENBQUNKLEtBQUo7QUFDQ0EsWUFBUSxJQUFJdmMsSUFBSixHQUFXd2MsUUFBWCxFQUFSO0FDK0RDOztBRDdERixNQUFHRCxRQUFRLENBQVg7QUFDQ0EsWUFBUSxDQUFSO0FBREQsU0FFSyxJQUFHQSxRQUFRLENBQVg7QUFDSkEsWUFBUSxDQUFSO0FBREksU0FFQSxJQUFHQSxRQUFRLENBQVg7QUFDSkEsWUFBUSxDQUFSO0FBREk7QUFHSkc7QUFDQUgsWUFBUSxDQUFSO0FDK0RDOztBRDdERixTQUFPLElBQUl2YyxJQUFKLENBQVMwYyxJQUFULEVBQWVILEtBQWYsRUFBc0IsQ0FBdEIsQ0FBUDtBQWhCZ0MsQ0FBakM7O0FBa0JBOW9CLFFBQVFvcEIsWUFBUixHQUF1QixVQUFDSCxJQUFELEVBQU1ILEtBQU47QUFDdEIsTUFBQU8sSUFBQSxFQUFBQyxPQUFBLEVBQUFDLFdBQUEsRUFBQUMsU0FBQTs7QUFBQSxNQUFHVixVQUFTLEVBQVo7QUFDQyxXQUFPLEVBQVA7QUNpRUM7O0FEL0RGUyxnQkFBYyxPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQS9CO0FBQ0FDLGNBQVksSUFBSWpkLElBQUosQ0FBUzBjLElBQVQsRUFBZUgsS0FBZixFQUFzQixDQUF0QixDQUFaO0FBQ0FRLFlBQVUsSUFBSS9jLElBQUosQ0FBUzBjLElBQVQsRUFBZUgsUUFBTSxDQUFyQixFQUF3QixDQUF4QixDQUFWO0FBQ0FPLFNBQU8sQ0FBQ0MsVUFBUUUsU0FBVCxJQUFvQkQsV0FBM0I7QUFDQSxTQUFPRixJQUFQO0FBUnNCLENBQXZCOztBQVVBcnBCLFFBQVF5cEIsb0JBQVIsR0FBK0IsVUFBQ1IsSUFBRCxFQUFPSCxLQUFQO0FBQzlCLE1BQUcsQ0FBQ0csSUFBSjtBQUNDQSxXQUFPLElBQUkxYyxJQUFKLEdBQVcyYyxXQUFYLEVBQVA7QUNrRUM7O0FEakVGLE1BQUcsQ0FBQ0osS0FBSjtBQUNDQSxZQUFRLElBQUl2YyxJQUFKLEdBQVd3YyxRQUFYLEVBQVI7QUNtRUM7O0FEaEVGLE1BQUdELFVBQVMsQ0FBWjtBQUNDQSxZQUFRLEVBQVI7QUFDQUc7QUFDQSxXQUFPLElBQUkxYyxJQUFKLENBQVMwYyxJQUFULEVBQWVILEtBQWYsRUFBc0IsQ0FBdEIsQ0FBUDtBQ2tFQzs7QUQvREZBO0FBQ0EsU0FBTyxJQUFJdmMsSUFBSixDQUFTMGMsSUFBVCxFQUFlSCxLQUFmLEVBQXNCLENBQXRCLENBQVA7QUFkOEIsQ0FBL0I7O0FBZ0JBOW9CLFFBQVEwb0IsOEJBQVIsR0FBeUMsVUFBQ1YsVUFBRCxFQUFhMWIsR0FBYjtBQUV4QyxNQUFBb2QsWUFBQSxFQUFBQyxXQUFBLEVBQUFDLFFBQUEsRUFBQUMsUUFBQSxFQUFBelcsS0FBQSxFQUFBMFcsT0FBQSxFQUFBQyxVQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLFVBQUEsRUFBQUMsYUFBQSxFQUFBQyxZQUFBLEVBQUFDLFlBQUEsRUFBQUMsV0FBQSxFQUFBQyxZQUFBLEVBQUFsQixXQUFBLEVBQUFtQixRQUFBLEVBQUFDLE1BQUEsRUFBQTdCLEtBQUEsRUFBQThCLFVBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsbUJBQUEsRUFBQUMsVUFBQSxFQUFBQyxRQUFBLEVBQUFDLGFBQUEsRUFBQUMsWUFBQSxFQUFBQyxZQUFBLEVBQUFDLFdBQUEsRUFBQUMsWUFBQSxFQUFBcE8sR0FBQSxFQUFBcU8sWUFBQSxFQUFBQyxVQUFBLEVBQUFDLFNBQUEsRUFBQUMsV0FBQSxFQUFBQyxVQUFBLEVBQUFDLFNBQUEsRUFBQUMsV0FBQSxFQUFBQyxTQUFBLEVBQUFDLFFBQUEsRUFBQUMsV0FBQSxFQUFBQyxVQUFBLEVBQUFDLE1BQUEsRUFBQUMsaUJBQUEsRUFBQUMsbUJBQUEsRUFBQUMsUUFBQSxFQUFBNWdCLE1BQUEsRUFBQTZnQixJQUFBLEVBQUF0RCxJQUFBLEVBQUF1RCxPQUFBO0FBQUFyUCxRQUFNLElBQUk1USxJQUFKLEVBQU47QUFFQWdkLGdCQUFjLE9BQU8sRUFBUCxHQUFZLEVBQVosR0FBaUIsRUFBL0I7QUFDQWlELFlBQVUsSUFBSWpnQixJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFnQitjLFdBQXpCLENBQVY7QUFDQStDLGFBQVcsSUFBSS9mLElBQUosQ0FBUzRRLElBQUkzUSxPQUFKLEtBQWdCK2MsV0FBekIsQ0FBWDtBQUVBZ0QsU0FBT3BQLElBQUlzUCxNQUFKLEVBQVA7QUFFQS9CLGFBQWM2QixTQUFRLENBQVIsR0FBZUEsT0FBTyxDQUF0QixHQUE2QixDQUEzQztBQUNBNUIsV0FBUyxJQUFJcGUsSUFBSixDQUFTNFEsSUFBSTNRLE9BQUosS0FBaUJrZSxXQUFXbkIsV0FBckMsQ0FBVDtBQUNBNEMsV0FBUyxJQUFJNWYsSUFBSixDQUFTb2UsT0FBT25lLE9BQVAsS0FBb0IsSUFBSStjLFdBQWpDLENBQVQ7QUFFQWEsZUFBYSxJQUFJN2QsSUFBSixDQUFTb2UsT0FBT25lLE9BQVAsS0FBbUIrYyxXQUE1QixDQUFiO0FBRUFRLGVBQWEsSUFBSXhkLElBQUosQ0FBUzZkLFdBQVc1ZCxPQUFYLEtBQXdCK2MsY0FBYyxDQUEvQyxDQUFiO0FBRUFxQixlQUFhLElBQUlyZSxJQUFKLENBQVM0ZixPQUFPM2YsT0FBUCxLQUFtQitjLFdBQTVCLENBQWI7QUFFQTBCLGVBQWEsSUFBSTFlLElBQUosQ0FBU3FlLFdBQVdwZSxPQUFYLEtBQXdCK2MsY0FBYyxDQUEvQyxDQUFiO0FBQ0FJLGdCQUFjeE0sSUFBSStMLFdBQUosRUFBZDtBQUNBc0MsaUJBQWU3QixjQUFjLENBQTdCO0FBQ0F1QixhQUFXdkIsY0FBYyxDQUF6QjtBQUVBRCxpQkFBZXZNLElBQUk0TCxRQUFKLEVBQWY7QUFFQUUsU0FBTzlMLElBQUkrTCxXQUFKLEVBQVA7QUFDQUosVUFBUTNMLElBQUk0TCxRQUFKLEVBQVI7QUFFQWMsYUFBVyxJQUFJdGQsSUFBSixDQUFTb2QsV0FBVCxFQUFxQkQsWUFBckIsRUFBa0MsQ0FBbEMsQ0FBWDs7QUFJQSxNQUFHQSxpQkFBZ0IsRUFBbkI7QUFDQ1Q7QUFDQUg7QUFGRDtBQUlDQTtBQ3FEQzs7QURsREZnQyxzQkFBb0IsSUFBSXZlLElBQUosQ0FBUzBjLElBQVQsRUFBZUgsS0FBZixFQUFzQixDQUF0QixDQUFwQjtBQUVBK0Isc0JBQW9CLElBQUl0ZSxJQUFKLENBQVMwYyxJQUFULEVBQWNILEtBQWQsRUFBb0I5b0IsUUFBUW9wQixZQUFSLENBQXFCSCxJQUFyQixFQUEwQkgsS0FBMUIsQ0FBcEIsQ0FBcEI7QUFFQWdCLFlBQVUsSUFBSXZkLElBQUosQ0FBU3VlLGtCQUFrQnRlLE9BQWxCLEtBQThCK2MsV0FBdkMsQ0FBVjtBQUVBVSxzQkFBb0JqcUIsUUFBUXlwQixvQkFBUixDQUE2QkUsV0FBN0IsRUFBeUNELFlBQXpDLENBQXBCO0FBRUFNLHNCQUFvQixJQUFJemQsSUFBSixDQUFTc2QsU0FBU3JkLE9BQVQsS0FBcUIrYyxXQUE5QixDQUFwQjtBQUVBOEMsd0JBQXNCLElBQUk5ZixJQUFKLENBQVNvZCxXQUFULEVBQXFCM3BCLFFBQVE2b0Isb0JBQVIsQ0FBNkJhLFlBQTdCLENBQXJCLEVBQWdFLENBQWhFLENBQXRCO0FBRUEwQyxzQkFBb0IsSUFBSTdmLElBQUosQ0FBU29kLFdBQVQsRUFBcUIzcEIsUUFBUTZvQixvQkFBUixDQUE2QmEsWUFBN0IsSUFBMkMsQ0FBaEUsRUFBa0UxcEIsUUFBUW9wQixZQUFSLENBQXFCTyxXQUFyQixFQUFpQzNwQixRQUFRNm9CLG9CQUFSLENBQTZCYSxZQUE3QixJQUEyQyxDQUE1RSxDQUFsRSxDQUFwQjtBQUVBUyx3QkFBc0JucUIsUUFBUWdwQixzQkFBUixDQUErQlcsV0FBL0IsRUFBMkNELFlBQTNDLENBQXRCO0FBRUFRLHNCQUFvQixJQUFJM2QsSUFBSixDQUFTNGQsb0JBQW9CakIsV0FBcEIsRUFBVCxFQUEyQ2lCLG9CQUFvQnBCLFFBQXBCLEtBQStCLENBQTFFLEVBQTRFL29CLFFBQVFvcEIsWUFBUixDQUFxQmUsb0JBQW9CakIsV0FBcEIsRUFBckIsRUFBdURpQixvQkFBb0JwQixRQUFwQixLQUErQixDQUF0RixDQUE1RSxDQUFwQjtBQUVBaUMsd0JBQXNCaHJCLFFBQVFtcEIsc0JBQVIsQ0FBK0JRLFdBQS9CLEVBQTJDRCxZQUEzQyxDQUF0QjtBQUVBcUIsc0JBQW9CLElBQUl4ZSxJQUFKLENBQVN5ZSxvQkFBb0I5QixXQUFwQixFQUFULEVBQTJDOEIsb0JBQW9CakMsUUFBcEIsS0FBK0IsQ0FBMUUsRUFBNEUvb0IsUUFBUW9wQixZQUFSLENBQXFCNEIsb0JBQW9COUIsV0FBcEIsRUFBckIsRUFBdUQ4QixvQkFBb0JqQyxRQUFwQixLQUErQixDQUF0RixDQUE1RSxDQUFwQjtBQUVBeUIsZ0JBQWMsSUFBSWplLElBQUosQ0FBUzRRLElBQUkzUSxPQUFKLEtBQWlCLElBQUkrYyxXQUE5QixDQUFkO0FBRUFlLGlCQUFlLElBQUkvZCxJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFpQixLQUFLK2MsV0FBL0IsQ0FBZjtBQUVBZ0IsaUJBQWUsSUFBSWhlLElBQUosQ0FBUzRRLElBQUkzUSxPQUFKLEtBQWlCLEtBQUsrYyxXQUEvQixDQUFmO0FBRUFrQixpQkFBZSxJQUFJbGUsSUFBSixDQUFTNFEsSUFBSTNRLE9BQUosS0FBaUIsS0FBSytjLFdBQS9CLENBQWY7QUFFQWMsa0JBQWdCLElBQUk5ZCxJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFpQixNQUFNK2MsV0FBaEMsQ0FBaEI7QUFFQStCLGdCQUFjLElBQUkvZSxJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFpQixJQUFJK2MsV0FBOUIsQ0FBZDtBQUVBNkIsaUJBQWUsSUFBSTdlLElBQUosQ0FBUzRRLElBQUkzUSxPQUFKLEtBQWlCLEtBQUsrYyxXQUEvQixDQUFmO0FBRUE4QixpQkFBZSxJQUFJOWUsSUFBSixDQUFTNFEsSUFBSTNRLE9BQUosS0FBaUIsS0FBSytjLFdBQS9CLENBQWY7QUFFQWdDLGlCQUFlLElBQUloZixJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFpQixLQUFLK2MsV0FBL0IsQ0FBZjtBQUVBNEIsa0JBQWdCLElBQUk1ZSxJQUFKLENBQVM0USxJQUFJM1EsT0FBSixLQUFpQixNQUFNK2MsV0FBaEMsQ0FBaEI7O0FBRUEsVUFBT2pkLEdBQVA7QUFBQSxTQUNNLFdBRE47QUFHRThHLGNBQVFzWixFQUFFLDRDQUFGLENBQVI7QUFDQWpCLG1CQUFhLElBQUlsZixJQUFKLENBQVlpZixlQUFhLGtCQUF6QixDQUFiO0FBQ0E1QixpQkFBVyxJQUFJcmQsSUFBSixDQUFZaWYsZUFBYSxrQkFBekIsQ0FBWDtBQUpJOztBQUROLFNBTU0sV0FOTjtBQVFFcFksY0FBUXNaLEVBQUUsNENBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWW9kLGNBQVksa0JBQXhCLENBQWI7QUFDQUMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW9kLGNBQVksa0JBQXhCLENBQVg7QUFKSTs7QUFOTixTQVdNLFdBWE47QUFhRXZXLGNBQVFzWixFQUFFLDRDQUFGLENBQVI7QUFDQWpCLG1CQUFhLElBQUlsZixJQUFKLENBQVkyZSxXQUFTLGtCQUFyQixDQUFiO0FBQ0F0QixpQkFBVyxJQUFJcmQsSUFBSixDQUFZMmUsV0FBUyxrQkFBckIsQ0FBWDtBQUpJOztBQVhOLFNBZ0JNLGNBaEJOO0FBa0JFUyxvQkFBYzlELE9BQU9zQyxtQkFBUCxFQUE0QnJDLE1BQTVCLENBQW1DLFlBQW5DLENBQWQ7QUFDQThELG1CQUFhL0QsT0FBT3FDLGlCQUFQLEVBQTBCcEMsTUFBMUIsQ0FBaUMsWUFBakMsQ0FBYjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWW9mLGNBQVksWUFBeEIsQ0FBYjtBQUNBL0IsaUJBQVcsSUFBSXJkLElBQUosQ0FBWXFmLGFBQVcsWUFBdkIsQ0FBWDtBQU5JOztBQWhCTixTQXVCTSxjQXZCTjtBQXlCRUQsb0JBQWM5RCxPQUFPd0UsbUJBQVAsRUFBNEJ2RSxNQUE1QixDQUFtQyxZQUFuQyxDQUFkO0FBQ0E4RCxtQkFBYS9ELE9BQU91RSxpQkFBUCxFQUEwQnRFLE1BQTFCLENBQWlDLFlBQWpDLENBQWI7QUFDQTFVLGNBQVFzWixFQUFFLCtDQUFGLENBQVI7QUFDQWpCLG1CQUFhLElBQUlsZixJQUFKLENBQVlvZixjQUFZLFlBQXhCLENBQWI7QUFDQS9CLGlCQUFXLElBQUlyZCxJQUFKLENBQVlxZixhQUFXLFlBQXZCLENBQVg7QUFOSTs7QUF2Qk4sU0E4Qk0sY0E5Qk47QUFnQ0VELG9CQUFjOUQsT0FBT21ELG1CQUFQLEVBQTRCbEQsTUFBNUIsQ0FBbUMsWUFBbkMsQ0FBZDtBQUNBOEQsbUJBQWEvRCxPQUFPa0QsaUJBQVAsRUFBMEJqRCxNQUExQixDQUFpQyxZQUFqQyxDQUFiO0FBQ0ExVSxjQUFRc1osRUFBRSwrQ0FBRixDQUFSO0FBQ0FqQixtQkFBYSxJQUFJbGYsSUFBSixDQUFZb2YsY0FBWSxZQUF4QixDQUFiO0FBQ0EvQixpQkFBVyxJQUFJcmQsSUFBSixDQUFZcWYsYUFBVyxZQUF2QixDQUFYO0FBTkk7O0FBOUJOLFNBcUNNLFlBckNOO0FBdUNFRCxvQkFBYzlELE9BQU9vQyxpQkFBUCxFQUEwQm5DLE1BQTFCLENBQWlDLFlBQWpDLENBQWQ7QUFDQThELG1CQUFhL0QsT0FBT21DLGlCQUFQLEVBQTBCbEMsTUFBMUIsQ0FBaUMsWUFBakMsQ0FBYjtBQUNBMVUsY0FBUXNaLEVBQUUsNkNBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWW9mLGNBQVksWUFBeEIsQ0FBYjtBQUNBL0IsaUJBQVcsSUFBSXJkLElBQUosQ0FBWXFmLGFBQVcsWUFBdkIsQ0FBWDtBQU5JOztBQXJDTixTQTRDTSxZQTVDTjtBQThDRUQsb0JBQWM5RCxPQUFPZ0MsUUFBUCxFQUFpQi9CLE1BQWpCLENBQXdCLFlBQXhCLENBQWQ7QUFDQThELG1CQUFhL0QsT0FBT2lDLE9BQVAsRUFBZ0JoQyxNQUFoQixDQUF1QixZQUF2QixDQUFiO0FBQ0ExVSxjQUFRc1osRUFBRSw2Q0FBRixDQUFSO0FBQ0FqQixtQkFBYSxJQUFJbGYsSUFBSixDQUFZb2YsY0FBWSxZQUF4QixDQUFiO0FBQ0EvQixpQkFBVyxJQUFJcmQsSUFBSixDQUFZcWYsYUFBVyxZQUF2QixDQUFYO0FBTkk7O0FBNUNOLFNBbURNLFlBbkROO0FBcURFRCxvQkFBYzlELE9BQU9pRCxpQkFBUCxFQUEwQmhELE1BQTFCLENBQWlDLFlBQWpDLENBQWQ7QUFDQThELG1CQUFhL0QsT0FBT2dELGlCQUFQLEVBQTBCL0MsTUFBMUIsQ0FBaUMsWUFBakMsQ0FBYjtBQUNBMVUsY0FBUXNaLEVBQUUsNkNBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWW9mLGNBQVksWUFBeEIsQ0FBYjtBQUNBL0IsaUJBQVcsSUFBSXJkLElBQUosQ0FBWXFmLGFBQVcsWUFBdkIsQ0FBWDtBQU5JOztBQW5ETixTQTBETSxXQTFETjtBQTRERUMsa0JBQVloRSxPQUFPa0MsVUFBUCxFQUFtQmpDLE1BQW5CLENBQTBCLFlBQTFCLENBQVo7QUFDQWlFLGtCQUFZbEUsT0FBT3VDLFVBQVAsRUFBbUJ0QyxNQUFuQixDQUEwQixZQUExQixDQUFaO0FBQ0ExVSxjQUFRc1osRUFBRSw0Q0FBRixDQUFSO0FBQ0FqQixtQkFBYSxJQUFJbGYsSUFBSixDQUFZc2YsWUFBVSxZQUF0QixDQUFiO0FBQ0FqQyxpQkFBVyxJQUFJcmQsSUFBSixDQUFZd2YsWUFBVSxZQUF0QixDQUFYO0FBTkk7O0FBMUROLFNBaUVNLFdBakVOO0FBbUVFRixrQkFBWWhFLE9BQU84QyxNQUFQLEVBQWU3QyxNQUFmLENBQXNCLFlBQXRCLENBQVo7QUFDQWlFLGtCQUFZbEUsT0FBT3NFLE1BQVAsRUFBZXJFLE1BQWYsQ0FBc0IsWUFBdEIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsNENBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXNmLFlBQVUsWUFBdEIsQ0FBYjtBQUNBakMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWXdmLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQWpFTixTQXdFTSxXQXhFTjtBQTBFRUYsa0JBQVloRSxPQUFPK0MsVUFBUCxFQUFtQjlDLE1BQW5CLENBQTBCLFlBQTFCLENBQVo7QUFDQWlFLGtCQUFZbEUsT0FBT29ELFVBQVAsRUFBbUJuRCxNQUFuQixDQUEwQixZQUExQixDQUFaO0FBQ0ExVSxjQUFRc1osRUFBRSw0Q0FBRixDQUFSO0FBQ0FqQixtQkFBYSxJQUFJbGYsSUFBSixDQUFZc2YsWUFBVSxZQUF0QixDQUFiO0FBQ0FqQyxpQkFBVyxJQUFJcmQsSUFBSixDQUFZd2YsWUFBVSxZQUF0QixDQUFYO0FBTkk7O0FBeEVOLFNBK0VNLFNBL0VOO0FBaUZFRyxtQkFBYXJFLE9BQU8yRSxPQUFQLEVBQWdCMUUsTUFBaEIsQ0FBdUIsWUFBdkIsQ0FBYjtBQUNBMVUsY0FBUXNaLEVBQUUsMENBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWTJmLGFBQVcsWUFBdkIsQ0FBYjtBQUNBdEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWTJmLGFBQVcsWUFBdkIsQ0FBWDtBQUxJOztBQS9FTixTQXFGTSxPQXJGTjtBQXVGRUYsaUJBQVduRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFYO0FBQ0ExVSxjQUFRc1osRUFBRSx3Q0FBRixDQUFSO0FBQ0FqQixtQkFBYSxJQUFJbGYsSUFBSixDQUFZeWYsV0FBUyxZQUFyQixDQUFiO0FBQ0FwQyxpQkFBVyxJQUFJcmQsSUFBSixDQUFZeWYsV0FBUyxZQUFyQixDQUFYO0FBTEk7O0FBckZOLFNBMkZNLFVBM0ZOO0FBNkZFQyxvQkFBY3BFLE9BQU95RSxRQUFQLEVBQWlCeEUsTUFBakIsQ0FBd0IsWUFBeEIsQ0FBZDtBQUNBMVUsY0FBUXNaLEVBQUUsMkNBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWTBmLGNBQVksWUFBeEIsQ0FBYjtBQUNBckMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWTBmLGNBQVksWUFBeEIsQ0FBWDtBQUxJOztBQTNGTixTQWlHTSxhQWpHTjtBQW1HRUgsb0JBQWNqRSxPQUFPMkMsV0FBUCxFQUFvQjFDLE1BQXBCLENBQTJCLFlBQTNCLENBQWQ7QUFDQTRELGtCQUFZN0QsT0FBTzFLLEdBQVAsRUFBWTJLLE1BQVosQ0FBbUIsWUFBbkIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsOENBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQWpHTixTQXdHTSxjQXhHTjtBQTBHRUksb0JBQWNqRSxPQUFPeUMsWUFBUCxFQUFxQnhDLE1BQXJCLENBQTRCLFlBQTVCLENBQWQ7QUFDQTRELGtCQUFZN0QsT0FBTzFLLEdBQVAsRUFBWTJLLE1BQVosQ0FBbUIsWUFBbkIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQXhHTixTQStHTSxjQS9HTjtBQWlIRUksb0JBQWNqRSxPQUFPMEMsWUFBUCxFQUFxQnpDLE1BQXJCLENBQTRCLFlBQTVCLENBQWQ7QUFDQTRELGtCQUFZN0QsT0FBTzFLLEdBQVAsRUFBWTJLLE1BQVosQ0FBbUIsWUFBbkIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQS9HTixTQXNITSxjQXRITjtBQXdIRUksb0JBQWNqRSxPQUFPNEMsWUFBUCxFQUFxQjNDLE1BQXJCLENBQTRCLFlBQTVCLENBQWQ7QUFDQTRELGtCQUFZN0QsT0FBTzFLLEdBQVAsRUFBWTJLLE1BQVosQ0FBbUIsWUFBbkIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQXRITixTQTZITSxlQTdITjtBQStIRUksb0JBQWNqRSxPQUFPd0MsYUFBUCxFQUFzQnZDLE1BQXRCLENBQTZCLFlBQTdCLENBQWQ7QUFDQTRELGtCQUFZN0QsT0FBTzFLLEdBQVAsRUFBWTJLLE1BQVosQ0FBbUIsWUFBbkIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsZ0RBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQTdITixTQW9JTSxhQXBJTjtBQXNJRUksb0JBQWNqRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFkO0FBQ0E0RCxrQkFBWTdELE9BQU95RCxXQUFQLEVBQW9CeEQsTUFBcEIsQ0FBMkIsWUFBM0IsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsOENBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQXBJTixTQTJJTSxjQTNJTjtBQTZJRUksb0JBQWNqRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFkO0FBQ0E0RCxrQkFBWTdELE9BQU91RCxZQUFQLEVBQXFCdEQsTUFBckIsQ0FBNEIsWUFBNUIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQTNJTixTQWtKTSxjQWxKTjtBQW9KRUksb0JBQWNqRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFkO0FBQ0E0RCxrQkFBWTdELE9BQU93RCxZQUFQLEVBQXFCdkQsTUFBckIsQ0FBNEIsWUFBNUIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQWxKTixTQXlKTSxjQXpKTjtBQTJKRUksb0JBQWNqRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFkO0FBQ0E0RCxrQkFBWTdELE9BQU8wRCxZQUFQLEVBQXFCekQsTUFBckIsQ0FBNEIsWUFBNUIsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsK0NBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQU5JOztBQXpKTixTQWdLTSxlQWhLTjtBQWtLRUksb0JBQWNqRSxPQUFPMUssR0FBUCxFQUFZMkssTUFBWixDQUFtQixZQUFuQixDQUFkO0FBQ0E0RCxrQkFBWTdELE9BQU9zRCxhQUFQLEVBQXNCckQsTUFBdEIsQ0FBNkIsWUFBN0IsQ0FBWjtBQUNBMVUsY0FBUXNaLEVBQUUsZ0RBQUYsQ0FBUjtBQUNBakIsbUJBQWEsSUFBSWxmLElBQUosQ0FBWXVmLGNBQVksWUFBeEIsQ0FBYjtBQUNBbEMsaUJBQVcsSUFBSXJkLElBQUosQ0FBWW1mLFlBQVUsWUFBdEIsQ0FBWDtBQXRLRjs7QUF3S0FoZ0IsV0FBUyxDQUFDK2YsVUFBRCxFQUFhN0IsUUFBYixDQUFUOztBQUNBLE1BQUc1QixlQUFjLFVBQWpCO0FBSUMxZixNQUFFNE4sT0FBRixDQUFVeEssTUFBVixFQUFrQixVQUFDaWhCLEVBQUQ7QUFDakIsVUFBR0EsRUFBSDtBQzJCSyxlRDFCSkEsR0FBR0MsUUFBSCxDQUFZRCxHQUFHRSxRQUFILEtBQWdCRixHQUFHRyxpQkFBSCxLQUF5QixFQUFyRCxDQzBCSTtBQUNEO0FEN0JMO0FDK0JDOztBRDNCRixTQUFPO0FBQ04xWixXQUFPQSxLQUREO0FBRU45RyxTQUFLQSxHQUZDO0FBR05aLFlBQVFBO0FBSEYsR0FBUDtBQXBRd0MsQ0FBekM7O0FBMFFBMUwsUUFBUStzQix3QkFBUixHQUFtQyxVQUFDL0UsVUFBRDtBQUNsQyxNQUFHQSxjQUFjaG9CLFFBQVErbkIsaUNBQVIsQ0FBMENDLFVBQTFDLENBQWpCO0FBQ0MsV0FBTyxTQUFQO0FBREQsU0FFSyxJQUFHLENBQUMsVUFBRCxFQUFhLE1BQWIsRUFBcUIsTUFBckIsRUFBNkJDLFFBQTdCLENBQXNDRCxVQUF0QyxDQUFIO0FBQ0osV0FBTyxVQUFQO0FBREk7QUFHSixXQUFPLEdBQVA7QUM4QkM7QURwQ2dDLENBQW5DOztBQVFBaG9CLFFBQVFndEIsaUJBQVIsR0FBNEIsVUFBQ2hGLFVBQUQ7QUFRM0IsTUFBQUcsVUFBQSxFQUFBOEUsU0FBQTtBQUFBQSxjQUFZO0FBQ1hDLFdBQU87QUFBQzlaLGFBQU9zWixFQUFFLGdDQUFGLENBQVI7QUFBNkN4aEIsYUFBTztBQUFwRCxLQURJO0FBRVhpaUIsYUFBUztBQUFDL1osYUFBT3NaLEVBQUUsa0NBQUYsQ0FBUjtBQUErQ3hoQixhQUFPO0FBQXRELEtBRkU7QUFHWGtpQixlQUFXO0FBQUNoYSxhQUFPc1osRUFBRSxvQ0FBRixDQUFSO0FBQWlEeGhCLGFBQU87QUFBeEQsS0FIQTtBQUlYbWlCLGtCQUFjO0FBQUNqYSxhQUFPc1osRUFBRSx1Q0FBRixDQUFSO0FBQW9EeGhCLGFBQU87QUFBM0QsS0FKSDtBQUtYb2lCLG1CQUFlO0FBQUNsYSxhQUFPc1osRUFBRSx3Q0FBRixDQUFSO0FBQXFEeGhCLGFBQU87QUFBNUQsS0FMSjtBQU1YcWlCLHNCQUFrQjtBQUFDbmEsYUFBT3NaLEVBQUUsMkNBQUYsQ0FBUjtBQUF3RHhoQixhQUFPO0FBQS9ELEtBTlA7QUFPWGdZLGNBQVU7QUFBQzlQLGFBQU9zWixFQUFFLG1DQUFGLENBQVI7QUFBZ0R4aEIsYUFBTztBQUF2RCxLQVBDO0FBUVhzaUIsaUJBQWE7QUFBQ3BhLGFBQU9zWixFQUFFLDJDQUFGLENBQVI7QUFBd0R4aEIsYUFBTztBQUEvRCxLQVJGO0FBU1h1aUIsaUJBQWE7QUFBQ3JhLGFBQU9zWixFQUFFLHNDQUFGLENBQVI7QUFBbUR4aEIsYUFBTztBQUExRCxLQVRGO0FBVVh3aUIsYUFBUztBQUFDdGEsYUFBT3NaLEVBQUUsa0NBQUYsQ0FBUjtBQUErQ3hoQixhQUFPO0FBQXREO0FBVkUsR0FBWjs7QUFhQSxNQUFHOGMsZUFBYyxNQUFqQjtBQUNDLFdBQU8xZixFQUFFb0QsTUFBRixDQUFTdWhCLFNBQVQsQ0FBUDtBQ3VEQzs7QURyREY5RSxlQUFhLEVBQWI7O0FBRUEsTUFBR25vQixRQUFRK25CLGlDQUFSLENBQTBDQyxVQUExQyxDQUFIO0FBQ0NHLGVBQVdqYSxJQUFYLENBQWdCK2UsVUFBVVMsT0FBMUI7QUFDQTF0QixZQUFRa29CLDJCQUFSLENBQW9DRixVQUFwQyxFQUFnREcsVUFBaEQ7QUFGRCxTQUdLLElBQUdILGVBQWMsTUFBZCxJQUF3QkEsZUFBYyxVQUF0QyxJQUFvREEsZUFBYyxNQUFsRSxJQUE0RUEsZUFBYyxNQUE3RjtBQUVKRyxlQUFXamEsSUFBWCxDQUFnQitlLFVBQVUvSixRQUExQjtBQUZJLFNBR0EsSUFBRzhFLGVBQWMsUUFBZCxJQUEwQkEsZUFBYyxlQUF4QyxJQUEyREEsZUFBYyxRQUE1RTtBQUNKRyxlQUFXamEsSUFBWCxDQUFnQitlLFVBQVVDLEtBQTFCLEVBQWlDRCxVQUFVRSxPQUEzQztBQURJLFNBRUEsSUFBR25GLGVBQWMsVUFBZCxJQUE0QkEsZUFBYyxRQUE3QztBQUNKRyxlQUFXamEsSUFBWCxDQUFnQitlLFVBQVVDLEtBQTFCLEVBQWlDRCxVQUFVRSxPQUEzQyxFQUFvREYsVUFBVUcsU0FBOUQsRUFBeUVILFVBQVVJLFlBQW5GLEVBQWlHSixVQUFVSyxhQUEzRyxFQUEwSEwsVUFBVU0sZ0JBQXBJO0FBREksU0FFQSxJQUFHdkYsZUFBYyxTQUFqQjtBQUNKRyxlQUFXamEsSUFBWCxDQUFnQitlLFVBQVVDLEtBQTFCLEVBQWlDRCxVQUFVRSxPQUEzQztBQURJLFNBRUEsSUFBR25GLGVBQWMsVUFBakI7QUFDSkcsZUFBV2phLElBQVgsQ0FBZ0IrZSxVQUFVQyxLQUExQixFQUFpQ0QsVUFBVUUsT0FBM0M7QUFESSxTQUVBLElBQUduRixlQUFjLFFBQWpCO0FBQ0pHLGVBQVdqYSxJQUFYLENBQWdCK2UsVUFBVUMsS0FBMUIsRUFBaUNELFVBQVVFLE9BQTNDO0FBREk7QUFHSmhGLGVBQVdqYSxJQUFYLENBQWdCK2UsVUFBVUMsS0FBMUIsRUFBaUNELFVBQVVFLE9BQTNDO0FDcURDOztBRG5ERixTQUFPaEYsVUFBUDtBQTdDMkIsQ0FBNUIsQyxDQStDQTs7Ozs7QUFJQW5vQixRQUFRMnRCLG1CQUFSLEdBQThCLFVBQUMzbEIsV0FBRDtBQUM3QixNQUFBbUMsTUFBQSxFQUFBd1osU0FBQSxFQUFBaUssVUFBQSxFQUFBN2tCLEdBQUE7QUFBQW9CLFdBQUEsQ0FBQXBCLE1BQUEvSSxRQUFBNkksU0FBQSxDQUFBYixXQUFBLGFBQUFlLElBQXlDb0IsTUFBekMsR0FBeUMsTUFBekM7QUFDQXdaLGNBQVksRUFBWjs7QUFFQXJiLElBQUV5QyxJQUFGLENBQU9aLE1BQVAsRUFBZSxVQUFDNEosS0FBRDtBQ3dEWixXRHZERjRQLFVBQVV6VixJQUFWLENBQWU7QUFBQ2pKLFlBQU04TyxNQUFNOU8sSUFBYjtBQUFtQjRvQixlQUFTOVosTUFBTThaO0FBQWxDLEtBQWYsQ0N1REU7QUR4REg7O0FBR0FELGVBQWEsRUFBYjs7QUFDQXRsQixJQUFFeUMsSUFBRixDQUFPekMsRUFBRXNELE1BQUYsQ0FBUytYLFNBQVQsRUFBb0IsU0FBcEIsQ0FBUCxFQUF1QyxVQUFDNVAsS0FBRDtBQzJEcEMsV0QxREY2WixXQUFXMWYsSUFBWCxDQUFnQjZGLE1BQU05TyxJQUF0QixDQzBERTtBRDNESDs7QUFFQSxTQUFPMm9CLFVBQVA7QUFWNkIsQ0FBOUIsQzs7Ozs7Ozs7Ozs7O0FFOWlDQSxJQUFBRSxZQUFBLEVBQUFDLFdBQUE7QUFBQS90QixRQUFRZ3VCLGNBQVIsR0FBeUIsRUFBekI7O0FBRUFELGNBQWMsVUFBQy9sQixXQUFELEVBQWMrVCxPQUFkO0FBQ2IsTUFBQWxLLFVBQUEsRUFBQWxMLEtBQUEsRUFBQW9DLEdBQUEsRUFBQUMsSUFBQSxFQUFBaUwsSUFBQSxFQUFBa00sSUFBQSxFQUFBOE4sSUFBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUE7O0FBQUE7QUFDQ3RjLGlCQUFhN1IsUUFBUTRKLGFBQVIsQ0FBc0I1QixXQUF0QixDQUFiOztBQUNBLFFBQUcsQ0FBQytULFFBQVFLLElBQVo7QUFDQztBQ0lFOztBREhIK1Isa0JBQWM7QUFDWCxXQUFLbm1CLFdBQUwsR0FBbUJBLFdBQW5CO0FBQ0EsYUFBTytULFFBQVFLLElBQVIsQ0FBYWdTLEtBQWIsQ0FBbUIsSUFBbkIsRUFBeUJDLFNBQXpCLENBQVA7QUFGVyxLQUFkOztBQUdBLFFBQUd0UyxRQUFRdVMsSUFBUixLQUFnQixlQUFuQjtBQUNHLGFBQUF6YyxjQUFBLFFBQUE5SSxNQUFBOEksV0FBQTBjLE1BQUEsWUFBQXhsQixJQUEyQnlsQixNQUEzQixDQUFrQ0wsV0FBbEMsSUFBTyxNQUFQLEdBQU8sTUFBUDtBQURILFdBRU8sSUFBR3BTLFFBQVF1UyxJQUFSLEtBQWdCLGVBQW5CO0FBQ0osYUFBQXpjLGNBQUEsUUFBQTdJLE9BQUE2SSxXQUFBMGMsTUFBQSxZQUFBdmxCLEtBQTJCeWxCLE1BQTNCLENBQWtDTixXQUFsQyxJQUFPLE1BQVAsR0FBTyxNQUFQO0FBREksV0FFQSxJQUFHcFMsUUFBUXVTLElBQVIsS0FBZ0IsZUFBbkI7QUFDSixhQUFBemMsY0FBQSxRQUFBb0MsT0FBQXBDLFdBQUEwYyxNQUFBLFlBQUF0YSxLQUEyQnlhLE1BQTNCLENBQWtDUCxXQUFsQyxJQUFPLE1BQVAsR0FBTyxNQUFQO0FBREksV0FFQSxJQUFHcFMsUUFBUXVTLElBQVIsS0FBZ0IsY0FBbkI7QUFDSixhQUFBemMsY0FBQSxRQUFBc08sT0FBQXRPLFdBQUE4YyxLQUFBLFlBQUF4TyxLQUEwQnFPLE1BQTFCLENBQWlDTCxXQUFqQyxJQUFPLE1BQVAsR0FBTyxNQUFQO0FBREksV0FFQSxJQUFHcFMsUUFBUXVTLElBQVIsS0FBZ0IsY0FBbkI7QUFDSixhQUFBemMsY0FBQSxRQUFBb2MsT0FBQXBjLFdBQUE4YyxLQUFBLFlBQUFWLEtBQTBCUSxNQUExQixDQUFpQ04sV0FBakMsSUFBTyxNQUFQLEdBQU8sTUFBUDtBQURJLFdBRUEsSUFBR3BTLFFBQVF1UyxJQUFSLEtBQWdCLGNBQW5CO0FBQ0osYUFBQXpjLGNBQUEsUUFBQXFjLE9BQUFyYyxXQUFBOGMsS0FBQSxZQUFBVCxLQUEwQlEsTUFBMUIsQ0FBaUNQLFdBQWpDLElBQU8sTUFBUCxHQUFPLE1BQVA7QUFsQko7QUFBQSxXQUFBeFIsTUFBQTtBQW1CTWhXLFlBQUFnVyxNQUFBO0FDUUgsV0RQRnZXLFFBQVFPLEtBQVIsQ0FBYyxtQkFBZCxFQUFtQ0EsS0FBbkMsQ0NPRTtBQUNEO0FEN0JXLENBQWQ7O0FBdUJBbW5CLGVBQWUsVUFBQzlsQixXQUFEO0FBQ2Q7OztLQUFBLElBQUFlLEdBQUE7QUNlQyxTQUFPLENBQUNBLE1BQU0vSSxRQUFRZ3VCLGNBQVIsQ0FBdUJobUIsV0FBdkIsQ0FBUCxLQUErQyxJQUEvQyxHQUFzRGUsSURWekI0UyxPQ1V5QixHRFZmekYsT0NVZSxDRFZQLFVBQUMwWSxLQUFEO0FDV3BELFdEVkZBLE1BQU1GLE1BQU4sRUNVRTtBRFhILEdDVThELENBQXRELEdEVlIsTUNVQztBRGhCYSxDQUFmOztBQVNBMXVCLFFBQVEwSSxZQUFSLEdBQXVCLFVBQUNWLFdBQUQ7QUFFdEIsTUFBQUQsR0FBQTtBQUFBQSxRQUFNL0gsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQU47QUFFQThsQixlQUFhOWxCLFdBQWI7QUFFQWhJLFVBQVFndUIsY0FBUixDQUF1QmhtQixXQUF2QixJQUFzQyxFQUF0QztBQ1dDLFNEVERNLEVBQUV5QyxJQUFGLENBQU9oRCxJQUFJK1QsUUFBWCxFQUFxQixVQUFDQyxPQUFELEVBQVU4UyxZQUFWO0FBQ3BCLFFBQUFDLGFBQUE7O0FBQUEsUUFBR250QixPQUFPa0csUUFBUCxJQUFvQmtVLFFBQVFJLEVBQVIsS0FBYyxRQUFsQyxJQUErQ0osUUFBUUssSUFBdkQsSUFBZ0VMLFFBQVF1UyxJQUEzRTtBQUNDUSxzQkFBZ0JmLFlBQVkvbEIsV0FBWixFQUF5QitULE9BQXpCLENBQWhCOztBQUNBLFVBQUcrUyxhQUFIO0FBQ0M5dUIsZ0JBQVFndUIsY0FBUixDQUF1QmhtQixXQUF2QixFQUFvQ2tHLElBQXBDLENBQXlDNGdCLGFBQXpDO0FBSEY7QUNlRzs7QURYSCxRQUFHbnRCLE9BQU91SCxRQUFQLElBQW9CNlMsUUFBUUksRUFBUixLQUFjLFFBQWxDLElBQStDSixRQUFRSyxJQUF2RCxJQUFnRUwsUUFBUXVTLElBQTNFO0FBQ0NRLHNCQUFnQmYsWUFBWS9sQixXQUFaLEVBQXlCK1QsT0FBekIsQ0FBaEI7QUNhRyxhRFpIL2IsUUFBUWd1QixjQUFSLENBQXVCaG1CLFdBQXZCLEVBQW9Da0csSUFBcEMsQ0FBeUM0Z0IsYUFBekMsQ0NZRztBQUNEO0FEcEJKLElDU0M7QURqQnFCLENBQXZCLEM7Ozs7Ozs7Ozs7OztBRWxDQSxJQUFBQyw4QkFBQSxFQUFBeG1CLEtBQUEsRUFBQXltQixxQkFBQSxFQUFBQyx5QkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyx3QkFBQSxFQUFBQyxpQ0FBQSxFQUFBQyxtQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxTQUFBO0FBQUFqbkIsUUFBUWhILFFBQVEsT0FBUixDQUFSO0FBRUF3dEIsaUNBQWlDLENBQUMsYUFBRCxFQUFnQixhQUFoQixFQUErQixXQUEvQixFQUE0QyxXQUE1QyxFQUF5RCxrQkFBekQsRUFBNkUsZ0JBQTdFLEVBQStGLHNCQUEvRixFQUF1SCxvQkFBdkgsRUFDaEMsZ0JBRGdDLEVBQ2QsZ0JBRGMsRUFDSSxrQkFESixFQUN3QixrQkFEeEIsRUFDNEMsY0FENUMsRUFDNEQsZ0JBRDVELENBQWpDO0FBRUFLLDJCQUEyQixDQUFDLHFCQUFELEVBQXdCLGtCQUF4QixFQUE0QyxtQkFBNUMsRUFBaUUsbUJBQWpFLEVBQXNGLG1CQUF0RixFQUEyRyx5QkFBM0csQ0FBM0I7QUFDQUUsc0JBQXNCaG5CLEVBQUU2TSxLQUFGLENBQVE0Wiw4QkFBUixFQUF3Q0ssd0JBQXhDLENBQXRCOztBQUVBcHZCLFFBQVE4TixjQUFSLEdBQXlCLFVBQUM5RixXQUFELEVBQWM2QixPQUFkLEVBQXVCSSxNQUF2QjtBQUN4QixNQUFBbEMsR0FBQTs7QUFBQSxNQUFHcEcsT0FBT3VILFFBQVY7QUFDQyxRQUFHLENBQUNsQixXQUFKO0FBQ0NBLG9CQUFjb0IsUUFBUUMsR0FBUixDQUFZLGFBQVosQ0FBZDtBQ0tFOztBREpIdEIsVUFBTS9ILFFBQVE2SSxTQUFSLENBQWtCYixXQUFsQixDQUFOOztBQUNBLFFBQUcsQ0FBQ0QsR0FBSjtBQUNDO0FDTUU7O0FETEgsV0FBT0EsSUFBSStFLFdBQUosQ0FBZ0J6RCxHQUFoQixFQUFQO0FBTkQsU0FPSyxJQUFHMUgsT0FBT2tHLFFBQVY7QUNPRixXRE5GN0gsUUFBUXl2QixvQkFBUixDQUE2QjVsQixPQUE3QixFQUFzQ0ksTUFBdEMsRUFBOENqQyxXQUE5QyxDQ01FO0FBQ0Q7QURoQnNCLENBQXpCOztBQVdBaEksUUFBUTB2QixvQkFBUixHQUErQixVQUFDMW5CLFdBQUQsRUFBY21MLE1BQWQsRUFBc0JsSixNQUF0QixFQUE4QkosT0FBOUI7QUFDOUIsTUFBQThsQixPQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBQUEvaUIsV0FBQSxFQUFBZ2pCLGlCQUFBLEVBQUFDLGtCQUFBLEVBQUFobkIsR0FBQSxFQUFBaW5CLGdCQUFBOztBQUFBLE1BQUcsQ0FBQ2hvQixXQUFELElBQWlCckcsT0FBT3VILFFBQTNCO0FBQ0NsQixrQkFBY29CLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQWQ7QUNVQzs7QURSRixNQUFHLENBQUNRLE9BQUQsSUFBYWxJLE9BQU91SCxRQUF2QjtBQUNDVyxjQUFVVCxRQUFRQyxHQUFSLENBQVksU0FBWixDQUFWO0FDVUM7O0FEVUZ5RCxnQkFBY3hFLEVBQUVDLEtBQUYsQ0FBUXZJLFFBQVE4TixjQUFSLENBQXVCOUYsV0FBdkIsRUFBb0M2QixPQUFwQyxFQUE2Q0ksTUFBN0MsQ0FBUixDQUFkOztBQUVBLE1BQUdrSixNQUFIO0FBQ0MsUUFBRyxDQUFDN0ssRUFBRTRFLE9BQUYsQ0FBVWlHLE9BQU82SixrQkFBakIsQ0FBSjtBQUNDLGFBQU83SixPQUFPNkosa0JBQWQ7QUNURTs7QURXSDJTLGNBQVV4YyxPQUFPOGMsS0FBUCxLQUFnQmhtQixNQUFoQixNQUFBbEIsTUFBQW9LLE9BQUE4YyxLQUFBLFlBQUFsbkIsSUFBd0NXLEdBQXhDLEdBQXdDLE1BQXhDLE1BQStDTyxNQUF6RDs7QUFFQSxRQUFHakMsZ0JBQWUsV0FBbEI7QUFHQzRuQix5QkFBbUJ6YyxPQUFPK2MsTUFBUCxDQUFjLGlCQUFkLENBQW5CO0FBQ0FMLHlCQUFtQjd2QixRQUFROE4sY0FBUixDQUF1QjhoQixnQkFBdkIsRUFBeUMvbEIsT0FBekMsRUFBa0RJLE1BQWxELENBQW5CO0FBQ0E2QyxrQkFBWXlELFdBQVosR0FBMEJ6RCxZQUFZeUQsV0FBWixJQUEyQnNmLGlCQUFpQjdlLGdCQUF0RTtBQUNBbEUsa0JBQVkyRCxTQUFaLEdBQXdCM0QsWUFBWTJELFNBQVosSUFBeUJvZixpQkFBaUI1ZSxjQUFsRTtBQUNBbkUsa0JBQVk0RCxXQUFaLEdBQTBCNUQsWUFBWTRELFdBQVosSUFBMkJtZixpQkFBaUIzZSxnQkFBdEU7O0FBQ0EsVUFBRyxDQUFDMmUsaUJBQWlCMWUsY0FBbEIsSUFBcUMsQ0FBQ3dlLE9BQXpDO0FBQ0M3aUIsb0JBQVkyRCxTQUFaLEdBQXdCLEtBQXhCO0FBQ0EzRCxvQkFBWTRELFdBQVosR0FBMEIsS0FBMUI7QUNaRzs7QURhSjVELGtCQUFZMEQsU0FBWixHQUF3QjFELFlBQVkwRCxTQUFaLElBQXlCcWYsaUJBQWlCL2UsY0FBbEU7O0FBQ0EsVUFBRyxDQUFDK2UsaUJBQWlCOWUsWUFBbEIsSUFBbUMsQ0FBQzRlLE9BQXZDO0FBQ0M3aUIsb0JBQVkwRCxTQUFaLEdBQXdCLEtBQXhCO0FBYkY7QUFBQTtBQWVDLFVBQUc3TyxPQUFPdUgsUUFBVjtBQUNDOG1CLDJCQUFtQnZqQixRQUFRMkQsaUJBQVIsRUFBbkI7QUFERDtBQUdDNGYsMkJBQW1CaHdCLFFBQVFvUSxpQkFBUixDQUEwQm5HLE1BQTFCLEVBQWtDSixPQUFsQyxDQUFuQjtBQ1ZHOztBRFdKaW1CLDBCQUFBM2MsVUFBQSxPQUFvQkEsT0FBUTVELFVBQTVCLEdBQTRCLE1BQTVCOztBQUNBLFVBQUd1Z0IscUJBQXNCeG5CLEVBQUU4RSxRQUFGLENBQVcwaUIsaUJBQVgsQ0FBdEIsSUFBd0RBLGtCQUFrQnBtQixHQUE3RTtBQUVDb21CLDRCQUFvQkEsa0JBQWtCcG1CLEdBQXRDO0FDVkc7O0FEV0pxbUIsMkJBQUE1YyxVQUFBLE9BQXFCQSxPQUFRM0QsV0FBN0IsR0FBNkIsTUFBN0I7O0FBQ0EsVUFBR3VnQixzQkFBdUJBLG1CQUFtQjVrQixNQUExQyxJQUFxRDdDLEVBQUU4RSxRQUFGLENBQVcyaUIsbUJBQW1CLENBQW5CLENBQVgsQ0FBeEQ7QUFFQ0EsNkJBQXFCQSxtQkFBbUJ0YixHQUFuQixDQUF1QixVQUFDMGIsQ0FBRDtBQ1Z0QyxpQkRVNENBLEVBQUV6bUIsR0NWOUM7QURVZSxVQUFyQjtBQ1JHOztBRFNKcW1CLDJCQUFxQnpuQixFQUFFNk0sS0FBRixDQUFRNGEsa0JBQVIsRUFBNEIsQ0FBQ0QsaUJBQUQsQ0FBNUIsQ0FBckI7O0FBQ0EsVUFBRyxDQUFDaGpCLFlBQVlrQixnQkFBYixJQUFrQyxDQUFDMmhCLE9BQW5DLElBQStDLENBQUM3aUIsWUFBWStELG9CQUEvRDtBQUNDL0Qsb0JBQVkyRCxTQUFaLEdBQXdCLEtBQXhCO0FBQ0EzRCxvQkFBWTRELFdBQVosR0FBMEIsS0FBMUI7QUFGRCxhQUdLLElBQUcsQ0FBQzVELFlBQVlrQixnQkFBYixJQUFrQ2xCLFlBQVkrRCxvQkFBakQ7QUFDSixZQUFHa2Ysc0JBQXVCQSxtQkFBbUI1a0IsTUFBN0M7QUFDQyxjQUFHNmtCLG9CQUFxQkEsaUJBQWlCN2tCLE1BQXpDO0FBQ0MsZ0JBQUcsQ0FBQzdDLEVBQUU4bkIsWUFBRixDQUFlSixnQkFBZixFQUFpQ0Qsa0JBQWpDLEVBQXFENWtCLE1BQXpEO0FBRUMyQiwwQkFBWTJELFNBQVosR0FBd0IsS0FBeEI7QUFDQTNELDBCQUFZNEQsV0FBWixHQUEwQixLQUExQjtBQUpGO0FBQUE7QUFPQzVELHdCQUFZMkQsU0FBWixHQUF3QixLQUF4QjtBQUNBM0Qsd0JBQVk0RCxXQUFaLEdBQTBCLEtBQTFCO0FBVEY7QUFESTtBQ0lEOztBRFFKLFVBQUd5QyxPQUFPa2QsTUFBUCxJQUFrQixDQUFDdmpCLFlBQVlrQixnQkFBbEM7QUFDQ2xCLG9CQUFZMkQsU0FBWixHQUF3QixLQUF4QjtBQUNBM0Qsb0JBQVk0RCxXQUFaLEdBQTBCLEtBQTFCO0FDTkc7O0FEUUosVUFBRyxDQUFDNUQsWUFBWTZELGNBQWIsSUFBZ0MsQ0FBQ2dmLE9BQWpDLElBQTZDLENBQUM3aUIsWUFBWThELGtCQUE3RDtBQUNDOUQsb0JBQVkwRCxTQUFaLEdBQXdCLEtBQXhCO0FBREQsYUFFSyxJQUFHLENBQUMxRCxZQUFZNkQsY0FBYixJQUFnQzdELFlBQVk4RCxrQkFBL0M7QUFDSixZQUFHbWYsc0JBQXVCQSxtQkFBbUI1a0IsTUFBN0M7QUFDQyxjQUFHNmtCLG9CQUFxQkEsaUJBQWlCN2tCLE1BQXpDO0FBQ0MsZ0JBQUcsQ0FBQzdDLEVBQUU4bkIsWUFBRixDQUFlSixnQkFBZixFQUFpQ0Qsa0JBQWpDLEVBQXFENWtCLE1BQXpEO0FBRUMyQiwwQkFBWTBELFNBQVosR0FBd0IsS0FBeEI7QUFIRjtBQUFBO0FBTUMxRCx3QkFBWTBELFNBQVosR0FBd0IsS0FBeEI7QUFQRjtBQURJO0FBakROO0FBTkQ7QUM0REU7O0FES0YsU0FBTzFELFdBQVA7QUE1RjhCLENBQS9COztBQWtHQSxJQUFHbkwsT0FBT3VILFFBQVY7QUFDQ2xKLFVBQVFzd0IsK0JBQVIsR0FBMEMsVUFBQ0MsaUJBQUQsRUFBb0JDLGVBQXBCLEVBQXFDQyxhQUFyQyxFQUFvRHhtQixNQUFwRCxFQUE0REosT0FBNUQ7QUFDekMsUUFBQTZtQix3QkFBQSxFQUFBQyxXQUFBLEVBQUFkLGdCQUFBLEVBQUFlLHdCQUFBLEVBQUFuWCxNQUFBLEVBQUFvWCx1QkFBQSxFQUFBampCLDBCQUFBOztBQUFBLFFBQUcsQ0FBQzJpQixpQkFBRCxJQUF1QjV1QixPQUFPdUgsUUFBakM7QUFDQ3FuQiwwQkFBb0JubkIsUUFBUUMsR0FBUixDQUFZLGFBQVosQ0FBcEI7QUNMRTs7QURPSCxRQUFHLENBQUNtbkIsZUFBSjtBQUNDcHFCLGNBQVFPLEtBQVIsQ0FBYyw0RkFBZDtBQUNBLGFBQU8sRUFBUDtBQ0xFOztBRE9ILFFBQUcsQ0FBQzhwQixhQUFELElBQW1COXVCLE9BQU91SCxRQUE3QjtBQUNDdW5CLHNCQUFnQnp3QixRQUFROHdCLGVBQVIsRUFBaEI7QUNMRTs7QURPSCxRQUFHLENBQUM3bUIsTUFBRCxJQUFZdEksT0FBT3VILFFBQXRCO0FBQ0NlLGVBQVN0SSxPQUFPc0ksTUFBUCxFQUFUO0FDTEU7O0FET0gsUUFBRyxDQUFDSixPQUFELElBQWFsSSxPQUFPdUgsUUFBdkI7QUFDQ1csZ0JBQVVULFFBQVFDLEdBQVIsQ0FBWSxTQUFaLENBQVY7QUNMRTs7QURPSHdtQix1QkFBbUI3dkIsUUFBUTB2QixvQkFBUixDQUE2QmEsaUJBQTdCLEVBQWdERSxhQUFoRCxFQUErRHhtQixNQUEvRCxFQUF1RUosT0FBdkUsQ0FBbkI7QUFDQSttQiwrQkFBMkI1d0IsUUFBUThOLGNBQVIsQ0FBdUIwaUIsZ0JBQWdCeG9CLFdBQXZDLENBQTNCO0FBQ0F5UixhQUFTblIsRUFBRUMsS0FBRixDQUFRcW9CLHdCQUFSLENBQVQ7O0FBRUEsUUFBR0osZ0JBQWdCblosT0FBbkI7QUFDQ29DLGFBQU9sSixXQUFQLEdBQXFCcWdCLHlCQUF5QnJnQixXQUF6QixJQUF3Q3NmLGlCQUFpQjdlLGdCQUE5RTtBQUNBeUksYUFBT2hKLFNBQVAsR0FBbUJtZ0IseUJBQXlCbmdCLFNBQXpCLElBQXNDb2YsaUJBQWlCNWUsY0FBMUU7QUFGRDtBQUlDckQsbUNBQTZCNGlCLGdCQUFnQjVpQiwwQkFBaEIsSUFBOEMsS0FBM0U7QUFDQStpQixvQkFBYyxLQUFkOztBQUNBLFVBQUcvaUIsK0JBQThCLElBQWpDO0FBQ0MraUIsc0JBQWNkLGlCQUFpQnJmLFNBQS9CO0FBREQsYUFFSyxJQUFHNUMsK0JBQThCLEtBQWpDO0FBQ0oraUIsc0JBQWNkLGlCQUFpQnBmLFNBQS9CO0FDTkc7O0FEUUpvZ0IsZ0NBQTBCN3dCLFFBQVErd0Isd0JBQVIsQ0FBaUNOLGFBQWpDLEVBQWdERixpQkFBaEQsQ0FBMUI7QUFDQUcsaUNBQTJCRyx3QkFBd0J4bUIsT0FBeEIsQ0FBZ0NtbUIsZ0JBQWdCeG9CLFdBQWhELElBQStELENBQUMsQ0FBM0Y7QUFFQXlSLGFBQU9sSixXQUFQLEdBQXFCb2dCLGVBQWVDLHlCQUF5QnJnQixXQUF4QyxJQUF1RCxDQUFDbWdCLHdCQUE3RTtBQUNBalgsYUFBT2hKLFNBQVAsR0FBbUJrZ0IsZUFBZUMseUJBQXlCbmdCLFNBQXhDLElBQXFELENBQUNpZ0Isd0JBQXpFO0FDUEU7O0FEUUgsV0FBT2pYLE1BQVA7QUFyQ3lDLEdBQTFDO0FDZ0NBOztBRE9ELElBQUc5WCxPQUFPa0csUUFBVjtBQUVDN0gsVUFBUWd4QixpQkFBUixHQUE0QixVQUFDbm5CLE9BQUQsRUFBVUksTUFBVjtBQUMzQixRQUFBZ25CLEVBQUEsRUFBQWpuQixZQUFBLEVBQUE4QyxXQUFBLEVBQUFva0IsS0FBQSxFQUFBQyxVQUFBLEVBQUFDLGNBQUEsRUFBQUMsWUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxhQUFBLEVBQUFDLGlCQUFBLEVBQUFDLFVBQUEsRUFBQUMsY0FBQSxFQUFBQyxXQUFBLEVBQUFDLGVBQUEsRUFBQUMsYUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxTQUFBLEVBQUFDLGFBQUEsRUFBQUMsT0FBQSxFQUFBQyxTQUFBOztBQUFBcmxCLGtCQUNDO0FBQUFzbEIsZUFBUyxFQUFUO0FBQ0FDLHFCQUFlO0FBRGYsS0FERCxDQUQyQixDQUkzQjs7Ozs7OztBQVFBcm9CLG1CQUFlLEtBQWY7QUFDQW1vQixnQkFBWSxJQUFaOztBQUNBLFFBQUdsb0IsTUFBSDtBQUNDRCxxQkFBZWhLLFFBQVFnSyxZQUFSLENBQXFCSCxPQUFyQixFQUE4QkksTUFBOUIsQ0FBZjtBQUNBa29CLGtCQUFZbnlCLFFBQVE0SixhQUFSLENBQXNCLGFBQXRCLEVBQXFDTSxPQUFyQyxDQUE2QztBQUFFOUIsZUFBT3lCLE9BQVQ7QUFBa0I0RixjQUFNeEY7QUFBeEIsT0FBN0MsRUFBK0U7QUFBRUUsZ0JBQVE7QUFBRW1vQixtQkFBUztBQUFYO0FBQVYsT0FBL0UsQ0FBWjtBQ0lFOztBREZIbkIsaUJBQWFueEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQWlGO0FBQUNrRixjQUFPO0FBQUNULGFBQUksQ0FBTDtBQUFRMm9CLHVCQUFjO0FBQXRCO0FBQVIsS0FBakYsS0FBdUgsSUFBcEk7QUFDQUwsZ0JBQVloeUIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQWdGO0FBQUNrRixjQUFPO0FBQUNULGFBQUksQ0FBTDtBQUFRMm9CLHVCQUFjO0FBQXRCO0FBQVIsS0FBaEYsS0FBc0gsSUFBbEk7QUFDQVQsa0JBQWM1eEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQWtGO0FBQUNrRixjQUFPO0FBQUNULGFBQUksQ0FBTDtBQUFRMm9CLHVCQUFjO0FBQXRCO0FBQVIsS0FBbEYsS0FBd0gsSUFBdEk7QUFDQVgsaUJBQWExeEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQWlGO0FBQUNrRixjQUFPO0FBQUNULGFBQUksQ0FBTDtBQUFRMm9CLHVCQUFjO0FBQXRCO0FBQVIsS0FBakYsS0FBdUgsSUFBcEk7QUFFQVAsb0JBQWdCOXhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q00sT0FBeEMsQ0FBZ0Q7QUFBQzlCLGFBQU95QixPQUFSO0FBQWlCNUUsWUFBTTtBQUF2QixLQUFoRCxFQUFvRjtBQUFDa0YsY0FBTztBQUFDVCxhQUFJLENBQUw7QUFBUTJvQix1QkFBYztBQUF0QjtBQUFSLEtBQXBGLEtBQTBILElBQTFJO0FBQ0FiLG9CQUFnQnh4QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NNLE9BQXhDLENBQWdEO0FBQUM5QixhQUFPeUIsT0FBUjtBQUFpQjVFLFlBQU07QUFBdkIsS0FBaEQsRUFBb0Y7QUFBQ2tGLGNBQU87QUFBQ1QsYUFBSSxDQUFMO0FBQVEyb0IsdUJBQWM7QUFBdEI7QUFBUixLQUFwRixLQUEwSCxJQUExSTs7QUFDQSxRQUFHRixhQUFhQSxVQUFVRyxPQUExQjtBQUNDakIscUJBQWVyeEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDcUosSUFBeEMsQ0FBNkM7QUFBQzdLLGVBQU95QixPQUFSO0FBQWlCOEksYUFBSyxDQUFDO0FBQUM0ZixpQkFBT3RvQjtBQUFSLFNBQUQsRUFBa0I7QUFBQ2hGLGdCQUFNa3RCLFVBQVVHO0FBQWpCLFNBQWxCO0FBQXRCLE9BQTdDLEVBQWtIO0FBQUNub0IsZ0JBQU87QUFBQ1QsZUFBSSxDQUFMO0FBQVEyb0IseUJBQWMsQ0FBdEI7QUFBeUJwdEIsZ0JBQUs7QUFBOUI7QUFBUixPQUFsSCxFQUE2SmlPLEtBQTdKLEVBQWY7QUFERDtBQUdDbWUscUJBQWVyeEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDcUosSUFBeEMsQ0FBNkM7QUFBQ3NmLGVBQU90b0IsTUFBUjtBQUFnQjdCLGVBQU95QjtBQUF2QixPQUE3QyxFQUE4RTtBQUFDTSxnQkFBTztBQUFDVCxlQUFJLENBQUw7QUFBUTJvQix5QkFBYyxDQUF0QjtBQUF5QnB0QixnQkFBSztBQUE5QjtBQUFSLE9BQTlFLEVBQXlIaU8sS0FBekgsRUFBZjtBQzJFRTs7QUR6RUhrZSxxQkFBaUIsSUFBakI7QUFDQWEsb0JBQWdCLElBQWhCO0FBQ0FKLHNCQUFrQixJQUFsQjtBQUNBRixxQkFBaUIsSUFBakI7QUFDQUosdUJBQW1CLElBQW5CO0FBQ0FRLHdCQUFvQixJQUFwQjtBQUNBTix3QkFBb0IsSUFBcEI7O0FBRUEsUUFBQU4sY0FBQSxPQUFHQSxXQUFZem5CLEdBQWYsR0FBZSxNQUFmO0FBQ0MwbkIsdUJBQWlCcHhCLFFBQVE0SixhQUFSLENBQXNCLG9CQUF0QixFQUE0Q3FKLElBQTVDLENBQWlEO0FBQUN1ZiwyQkFBbUJyQixXQUFXem5CO0FBQS9CLE9BQWpELEVBQXNGO0FBQUNTLGdCQUFRO0FBQUN2RixtQkFBUyxDQUFWO0FBQWE2dEIsb0JBQVUsQ0FBdkI7QUFBMEJDLHNCQUFZLENBQXRDO0FBQXlDQyx1QkFBYTtBQUF0RDtBQUFULE9BQXRGLEVBQTBKemYsS0FBMUosRUFBakI7QUNtRkU7O0FEbEZILFFBQUE4ZSxhQUFBLE9BQUdBLFVBQVd0b0IsR0FBZCxHQUFjLE1BQWQ7QUFDQ3VvQixzQkFBZ0JqeUIsUUFBUTRKLGFBQVIsQ0FBc0Isb0JBQXRCLEVBQTRDcUosSUFBNUMsQ0FBaUQ7QUFBQ3VmLDJCQUFtQlIsVUFBVXRvQjtBQUE5QixPQUFqRCxFQUFxRjtBQUFDUyxnQkFBUTtBQUFDdkYsbUJBQVMsQ0FBVjtBQUFhNnRCLG9CQUFVLENBQXZCO0FBQTBCQyxzQkFBWSxDQUF0QztBQUF5Q0MsdUJBQWE7QUFBdEQ7QUFBVCxPQUFyRixFQUF5SnpmLEtBQXpKLEVBQWhCO0FDNkZFOztBRDVGSCxRQUFBMGUsZUFBQSxPQUFHQSxZQUFhbG9CLEdBQWhCLEdBQWdCLE1BQWhCO0FBQ0Ntb0Isd0JBQWtCN3hCLFFBQVE0SixhQUFSLENBQXNCLG9CQUF0QixFQUE0Q3FKLElBQTVDLENBQWlEO0FBQUN1ZiwyQkFBbUJaLFlBQVlsb0I7QUFBaEMsT0FBakQsRUFBdUY7QUFBQ1MsZ0JBQVE7QUFBQ3ZGLG1CQUFTLENBQVY7QUFBYTZ0QixvQkFBVSxDQUF2QjtBQUEwQkMsc0JBQVksQ0FBdEM7QUFBeUNDLHVCQUFhO0FBQXREO0FBQVQsT0FBdkYsRUFBMkp6ZixLQUEzSixFQUFsQjtBQ3VHRTs7QUR0R0gsUUFBQXdlLGNBQUEsT0FBR0EsV0FBWWhvQixHQUFmLEdBQWUsTUFBZjtBQUNDaW9CLHVCQUFpQjN4QixRQUFRNEosYUFBUixDQUFzQixvQkFBdEIsRUFBNENxSixJQUE1QyxDQUFpRDtBQUFDdWYsMkJBQW1CZCxXQUFXaG9CO0FBQS9CLE9BQWpELEVBQXNGO0FBQUNTLGdCQUFRO0FBQUN2RixtQkFBUyxDQUFWO0FBQWE2dEIsb0JBQVUsQ0FBdkI7QUFBMEJDLHNCQUFZLENBQXRDO0FBQXlDQyx1QkFBYTtBQUF0RDtBQUFULE9BQXRGLEVBQTBKemYsS0FBMUosRUFBakI7QUNpSEU7O0FEaEhILFFBQUE0ZSxpQkFBQSxPQUFHQSxjQUFlcG9CLEdBQWxCLEdBQWtCLE1BQWxCO0FBQ0Nxb0IsMEJBQW9CL3hCLFFBQVE0SixhQUFSLENBQXNCLG9CQUF0QixFQUE0Q3FKLElBQTVDLENBQWlEO0FBQUN1ZiwyQkFBbUJWLGNBQWNwb0I7QUFBbEMsT0FBakQsRUFBeUY7QUFBQ1MsZ0JBQVE7QUFBQ3ZGLG1CQUFTLENBQVY7QUFBYTZ0QixvQkFBVSxDQUF2QjtBQUEwQkMsc0JBQVksQ0FBdEM7QUFBeUNDLHVCQUFhO0FBQXREO0FBQVQsT0FBekYsRUFBNkp6ZixLQUE3SixFQUFwQjtBQzJIRTs7QUQxSEgsUUFBQXNlLGlCQUFBLE9BQUdBLGNBQWU5bkIsR0FBbEIsR0FBa0IsTUFBbEI7QUFDQytuQiwwQkFBb0J6eEIsUUFBUTRKLGFBQVIsQ0FBc0Isb0JBQXRCLEVBQTRDcUosSUFBNUMsQ0FBaUQ7QUFBQ3VmLDJCQUFtQmhCLGNBQWM5bkI7QUFBbEMsT0FBakQsRUFBeUY7QUFBQ1MsZ0JBQVE7QUFBQ3ZGLG1CQUFTLENBQVY7QUFBYTZ0QixvQkFBVSxDQUF2QjtBQUEwQkMsc0JBQVksQ0FBdEM7QUFBeUNDLHVCQUFhO0FBQXREO0FBQVQsT0FBekYsRUFBNkp6ZixLQUE3SixFQUFwQjtBQ3FJRTs7QURuSUgsUUFBR21lLGFBQWFsbUIsTUFBYixHQUFzQixDQUF6QjtBQUNDK21CLGdCQUFVNXBCLEVBQUU4UCxLQUFGLENBQVFpWixZQUFSLEVBQXNCLEtBQXRCLENBQVY7QUFDQUUseUJBQW1CdnhCLFFBQVE0SixhQUFSLENBQXNCLG9CQUF0QixFQUE0Q3FKLElBQTVDLENBQWlEO0FBQUN1ZiwyQkFBbUI7QUFBQzVmLGVBQUtzZjtBQUFOO0FBQXBCLE9BQWpELEVBQXNGaGYsS0FBdEYsRUFBbkI7QUFDQW9lLDBCQUFvQmhwQixFQUFFOFAsS0FBRixDQUFRaVosWUFBUixFQUFzQixNQUF0QixDQUFwQjtBQ3lJRTs7QUR4SUhILFlBQVE7QUFDUEMsNEJBRE87QUFFUGEsMEJBRk87QUFHUFgsZ0NBSE87QUFJUE8sOEJBSk87QUFLUEYsNEJBTE87QUFNUEksa0NBTk87QUFPUE4sa0NBUE87QUFRUHhuQixnQ0FSTztBQVNQbW9CLDBCQVRPO0FBVVBmLG9DQVZPO0FBV1BhLGtDQVhPO0FBWVBKLHNDQVpPO0FBYVBGLG9DQWJPO0FBY1BJLDBDQWRPO0FBZVBOLDBDQWZPO0FBZ0JQRjtBQWhCTyxLQUFSO0FBa0JBemtCLGdCQUFZdWxCLGFBQVosR0FBNEJyeUIsUUFBUTR5QixlQUFSLENBQXdCQyxJQUF4QixDQUE2QjNCLEtBQTdCLEVBQW9Dcm5CLE9BQXBDLEVBQTZDSSxNQUE3QyxDQUE1QjtBQUNBNkMsZ0JBQVlnbUIsY0FBWixHQUE2Qjl5QixRQUFRK3lCLGdCQUFSLENBQXlCRixJQUF6QixDQUE4QjNCLEtBQTlCLEVBQXFDcm5CLE9BQXJDLEVBQThDSSxNQUE5QyxDQUE3QjtBQUNBNkMsZ0JBQVlrbUIsb0JBQVosR0FBbUMxQixpQkFBbkM7QUFDQUwsU0FBSyxDQUFMOztBQUNBM29CLE1BQUV5QyxJQUFGLENBQU8vSyxRQUFRc0osYUFBZixFQUE4QixVQUFDckMsTUFBRCxFQUFTZSxXQUFUO0FBQzdCaXBCOztBQUNBLFVBQUcsQ0FBQzNvQixFQUFFd04sR0FBRixDQUFNN08sTUFBTixFQUFjLE9BQWQsQ0FBRCxJQUEyQixDQUFDQSxPQUFPbUIsS0FBbkMsSUFBNENuQixPQUFPbUIsS0FBUCxLQUFnQnlCLE9BQS9EO0FBQ0MsWUFBRyxDQUFDdkIsRUFBRXdOLEdBQUYsQ0FBTTdPLE1BQU4sRUFBYyxnQkFBZCxDQUFELElBQW9DQSxPQUFPa2IsY0FBUCxLQUF5QixHQUE3RCxJQUFxRWxiLE9BQU9rYixjQUFQLEtBQXlCLEdBQXpCLElBQWdDblksWUFBeEc7QUFDQzhDLHNCQUFZc2xCLE9BQVosQ0FBb0JwcUIsV0FBcEIsSUFBbUNoSSxRQUFRd0ksYUFBUixDQUFzQkQsTUFBTXZJLFFBQVFDLE9BQVIsQ0FBZ0IrSCxXQUFoQixDQUFOLENBQXRCLEVBQTJENkIsT0FBM0QsQ0FBbkM7QUMwSUssaUJEeklMaUQsWUFBWXNsQixPQUFaLENBQW9CcHFCLFdBQXBCLEVBQWlDLGFBQWpDLElBQWtEaEksUUFBUXl2QixvQkFBUixDQUE2Qm9ELElBQTdCLENBQWtDM0IsS0FBbEMsRUFBeUNybkIsT0FBekMsRUFBa0RJLE1BQWxELEVBQTBEakMsV0FBMUQsQ0N5STdDO0FENUlQO0FDOElJO0FEaEpMOztBQU1BLFdBQU84RSxXQUFQO0FBbkYyQixHQUE1Qjs7QUFxRkEwaUIsY0FBWSxVQUFDeUQsS0FBRCxFQUFRQyxLQUFSO0FBQ1gsUUFBRyxDQUFDRCxLQUFELElBQVcsQ0FBQ0MsS0FBZjtBQUNDLGFBQU8sTUFBUDtBQzZJRTs7QUQ1SUgsUUFBRyxDQUFDRCxLQUFKO0FBQ0NBLGNBQVEsRUFBUjtBQzhJRTs7QUQ3SUgsUUFBRyxDQUFDQyxLQUFKO0FBQ0NBLGNBQVEsRUFBUjtBQytJRTs7QUQ5SUgsV0FBTzVxQixFQUFFNk0sS0FBRixDQUFROGQsS0FBUixFQUFlQyxLQUFmLENBQVA7QUFQVyxHQUFaOztBQVNBL0QscUJBQW1CLFVBQUM4RCxLQUFELEVBQVFDLEtBQVI7QUFDbEIsUUFBRyxDQUFDRCxLQUFELElBQVcsQ0FBQ0MsS0FBZjtBQUNDLGFBQU8sTUFBUDtBQ2dKRTs7QUQvSUgsUUFBRyxDQUFDRCxLQUFKO0FBQ0NBLGNBQVEsRUFBUjtBQ2lKRTs7QURoSkgsUUFBRyxDQUFDQyxLQUFKO0FBQ0NBLGNBQVEsRUFBUjtBQ2tKRTs7QURqSkgsV0FBTzVxQixFQUFFOG5CLFlBQUYsQ0FBZTZDLEtBQWYsRUFBc0JDLEtBQXRCLENBQVA7QUFQa0IsR0FBbkI7O0FBU0FsRSwwQkFBd0IsVUFBQ21FLE1BQUQsRUFBU0MsS0FBVDtBQUN2QixRQUFBQyxhQUFBLEVBQUFDLFNBQUE7QUFBQUEsZ0JBQVloRSxtQkFBWjtBQ29KRSxXRG5KRitELGdCQUNHRCxRQUNGOXFCLEVBQUV5QyxJQUFGLENBQU91b0IsU0FBUCxFQUFrQixVQUFDQyxRQUFEO0FDa0pmLGFEakpGSixPQUFPSSxRQUFQLElBQW1CSCxNQUFNRyxRQUFOLENDaUpqQjtBRGxKSCxNQURFLEdBQUgsTUNrSkU7QURySnFCLEdBQXhCOztBQXNCQWxFLHNDQUFvQyxVQUFDOEQsTUFBRCxFQUFTQyxLQUFUO0FBQ25DLFFBQUFFLFNBQUE7QUFBQUEsZ0JBQVl2RSw4QkFBWjtBQ3FJRSxXRHBJRnptQixFQUFFeUMsSUFBRixDQUFPdW9CLFNBQVAsRUFBa0IsVUFBQ0MsUUFBRDtBQUNqQixVQUFHSCxNQUFNRyxRQUFOLENBQUg7QUNxSUssZURwSUpKLE9BQU9JLFFBQVAsSUFBbUIsSUNvSWY7QUFDRDtBRHZJTCxNQ29JRTtBRHRJaUMsR0FBcEM7O0FBd0JBdnpCLFVBQVE0eUIsZUFBUixHQUEwQixVQUFDL29CLE9BQUQsRUFBVUksTUFBVjtBQUN6QixRQUFBdXBCLElBQUEsRUFBQXhwQixZQUFBLEVBQUF5cEIsUUFBQSxFQUFBdkMsS0FBQSxFQUFBQyxVQUFBLEVBQUFLLGFBQUEsRUFBQU0sYUFBQSxFQUFBRSxTQUFBLEVBQUFqcEIsR0FBQSxFQUFBQyxJQUFBLEVBQUFtcEIsU0FBQSxFQUFBdUIsV0FBQTtBQUFBdkMsaUJBQWEsS0FBS0EsVUFBTCxJQUFtQm54QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NNLE9BQXhDLENBQWdEO0FBQUM5QixhQUFPeUIsT0FBUjtBQUFpQjVFLFlBQU07QUFBdkIsS0FBaEQsRUFBaUY7QUFBQ2tGLGNBQU87QUFBQ1QsYUFBSSxDQUFMO0FBQVEyb0IsdUJBQWM7QUFBdEI7QUFBUixLQUFqRixDQUFoQztBQUNBTCxnQkFBWSxLQUFLQSxTQUFMLElBQWtCaHlCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q00sT0FBeEMsQ0FBZ0Q7QUFBQzlCLGFBQU95QixPQUFSO0FBQWlCNUUsWUFBTTtBQUF2QixLQUFoRCxFQUFnRjtBQUFDa0YsY0FBTztBQUFDVCxhQUFJLENBQUw7QUFBUTJvQix1QkFBYztBQUF0QjtBQUFSLEtBQWhGLENBQTlCO0FBQ0FQLG9CQUFnQixLQUFLRixXQUFMLElBQW9CNXhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q00sT0FBeEMsQ0FBZ0Q7QUFBQzlCLGFBQU95QixPQUFSO0FBQWlCNUUsWUFBTTtBQUF2QixLQUFoRCxFQUFvRjtBQUFDa0YsY0FBTztBQUFDVCxhQUFJLENBQUw7QUFBUTJvQix1QkFBYztBQUF0QjtBQUFSLEtBQXBGLENBQXBDO0FBQ0FiLG9CQUFnQixLQUFLRSxVQUFMLElBQW1CMXhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q00sT0FBeEMsQ0FBZ0Q7QUFBQzlCLGFBQU95QixPQUFSO0FBQWlCNUUsWUFBTTtBQUF2QixLQUFoRCxFQUFvRjtBQUFDa0YsY0FBTztBQUFDVCxhQUFJLENBQUw7QUFBUTJvQix1QkFBYztBQUF0QjtBQUFSLEtBQXBGLENBQW5DO0FBR0FGLGdCQUFZLElBQVo7O0FBQ0EsUUFBR2xvQixNQUFIO0FBQ0Nrb0Isa0JBQVlueUIsUUFBUTRKLGFBQVIsQ0FBc0IsYUFBdEIsRUFBcUNNLE9BQXJDLENBQTZDO0FBQUU5QixlQUFPeUIsT0FBVDtBQUFrQjRGLGNBQU14RjtBQUF4QixPQUE3QyxFQUErRTtBQUFFRSxnQkFBUTtBQUFFbW9CLG1CQUFTO0FBQVg7QUFBVixPQUEvRSxDQUFaO0FDMkpFOztBRDFKSCxRQUFHSCxhQUFhQSxVQUFVRyxPQUExQjtBQUNDcEIsY0FBUWx4QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NxSixJQUF4QyxDQUE2QztBQUFDN0ssZUFBT3lCLE9BQVI7QUFBaUI4SSxhQUFLLENBQUM7QUFBQzRmLGlCQUFPdG9CO0FBQVIsU0FBRCxFQUFrQjtBQUFDaEYsZ0JBQU1rdEIsVUFBVUc7QUFBakIsU0FBbEI7QUFBdEIsT0FBN0MsRUFBa0g7QUFBQ25vQixnQkFBTztBQUFDVCxlQUFJLENBQUw7QUFBUTJvQix5QkFBYyxDQUF0QjtBQUF5QnB0QixnQkFBSztBQUE5QjtBQUFSLE9BQWxILEVBQTZKaU8sS0FBN0osRUFBUjtBQUREO0FBR0NnZSxjQUFRbHhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q3FKLElBQXhDLENBQTZDO0FBQUNzZixlQUFPdG9CLE1BQVI7QUFBZ0I3QixlQUFPeUI7QUFBdkIsT0FBN0MsRUFBOEU7QUFBQ00sZ0JBQU87QUFBQ1QsZUFBSSxDQUFMO0FBQVEyb0IseUJBQWMsQ0FBdEI7QUFBeUJwdEIsZ0JBQUs7QUFBOUI7QUFBUixPQUE5RSxFQUF5SGlPLEtBQXpILEVBQVI7QUNvTEU7O0FEbkxIbEosbUJBQWtCMUIsRUFBRXNYLFNBQUYsQ0FBWSxLQUFLNVYsWUFBakIsSUFBb0MsS0FBS0EsWUFBekMsR0FBMkRoSyxRQUFRZ0ssWUFBUixDQUFxQkgsT0FBckIsRUFBOEJJLE1BQTlCLENBQTdFO0FBQ0F1cEIsV0FBTyxFQUFQOztBQUNBLFFBQUd4cEIsWUFBSDtBQUNDLGFBQU8sRUFBUDtBQUREO0FBR0MwcEIsb0JBQUEsQ0FBQTNxQixNQUFBL0ksUUFBQTRKLGFBQUEsZ0JBQUFNLE9BQUE7QUNxTEs5QixlQUFPeUIsT0RyTFo7QUNzTEs0RixjQUFNeEY7QUR0TFgsU0N1TE07QUFDREUsZ0JBQVE7QUFDTm1vQixtQkFBUztBQURIO0FBRFAsT0R2TE4sTUMyTFUsSUQzTFYsR0MyTGlCdnBCLElEM0xtR3VwQixPQUFwSCxHQUFvSCxNQUFwSDtBQUNBbUIsaUJBQVd6QixTQUFYOztBQUNBLFVBQUcwQixXQUFIO0FBQ0MsWUFBR0EsZ0JBQWUsVUFBbEI7QUFDQ0QscUJBQVczQixhQUFYO0FBREQsZUFFSyxJQUFHNEIsZ0JBQWUsVUFBbEI7QUFDSkQscUJBQVdqQyxhQUFYO0FBSkY7QUNpTUk7O0FENUxKLFVBQUFpQyxZQUFBLFFBQUF6cUIsT0FBQXlxQixTQUFBcEIsYUFBQSxZQUFBcnBCLEtBQTRCbUMsTUFBNUIsR0FBNEIsTUFBNUIsR0FBNEIsTUFBNUI7QUFDQ3FvQixlQUFPbHJCLEVBQUU2TSxLQUFGLENBQVFxZSxJQUFSLEVBQWNDLFNBQVNwQixhQUF2QixDQUFQO0FBREQ7QUFJQyxlQUFPLEVBQVA7QUM2TEc7O0FENUxKL3BCLFFBQUV5QyxJQUFGLENBQU9tbUIsS0FBUCxFQUFjLFVBQUN5QyxJQUFEO0FBQ2IsWUFBRyxDQUFDQSxLQUFLdEIsYUFBVDtBQUNDO0FDOExJOztBRDdMTCxZQUFHc0IsS0FBSzF1QixJQUFMLEtBQWEsT0FBYixJQUF5QjB1QixLQUFLMXVCLElBQUwsS0FBYSxNQUF0QyxJQUFnRDB1QixLQUFLMXVCLElBQUwsS0FBYSxVQUE3RCxJQUEyRTB1QixLQUFLMXVCLElBQUwsS0FBYSxVQUEzRjtBQUVDO0FDOExJOztBQUNELGVEOUxKdXVCLE9BQU9sckIsRUFBRTZNLEtBQUYsQ0FBUXFlLElBQVIsRUFBY0csS0FBS3RCLGFBQW5CLENDOExIO0FEcE1MOztBQU9BLGFBQU8vcEIsRUFBRTJQLE9BQUYsQ0FBVTNQLEVBQUVzckIsSUFBRixDQUFPSixJQUFQLENBQVYsRUFBdUIsTUFBdkIsRUFBaUMsSUFBakMsQ0FBUDtBQ2dNRTtBRHRPc0IsR0FBMUI7O0FBd0NBeHpCLFVBQVEreUIsZ0JBQVIsR0FBMkIsVUFBQ2xwQixPQUFELEVBQVVJLE1BQVY7QUFDMUIsUUFBQTRwQixTQUFBLEVBQUFDLFVBQUEsRUFBQUMsUUFBQSxFQUFBQyxnQkFBQSxFQUFBaHFCLFlBQUEsRUFBQWlxQixLQUFBLEVBQUFDLGFBQUEsRUFBQUMsVUFBQSxFQUFBakQsS0FBQSxFQUFBbm9CLEdBQUEsRUFBQUMsSUFBQSxFQUFBeVEsTUFBQSxFQUFBaWEsV0FBQTtBQUFBeEMsWUFBUyxLQUFLRyxZQUFMLElBQXFCcnhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q3FKLElBQXhDLENBQTZDO0FBQUNzZixhQUFPdG9CLE1BQVI7QUFBZ0I3QixhQUFPeUI7QUFBdkIsS0FBN0MsRUFBOEU7QUFBQ00sY0FBTztBQUFDVCxhQUFJLENBQUw7QUFBUTJvQix1QkFBYyxDQUF0QjtBQUF5QnB0QixjQUFLO0FBQTlCO0FBQVIsS0FBOUUsRUFBeUhpTyxLQUF6SCxFQUE5QjtBQUNBbEosbUJBQWtCMUIsRUFBRXNYLFNBQUYsQ0FBWSxLQUFLNVYsWUFBakIsSUFBb0MsS0FBS0EsWUFBekMsR0FBMkRoSyxRQUFRZ0ssWUFBUixDQUFxQkgsT0FBckIsRUFBOEJJLE1BQTlCLENBQTdFO0FBQ0E2cEIsaUJBQUEsQ0FBQS9xQixNQUFBL0ksUUFBQUksSUFBQSxDQUFBdWlCLEtBQUEsWUFBQTVaLElBQWlDcXJCLFdBQWpDLEdBQWlDLE1BQWpDOztBQUVBLFNBQU9OLFVBQVA7QUFDQyxhQUFPLEVBQVA7QUMwTUU7O0FEek1IRCxnQkFBWUMsV0FBVzdnQixJQUFYLENBQWdCLFVBQUNrZCxDQUFEO0FDMk14QixhRDFNSEEsRUFBRXptQixHQUFGLEtBQVMsT0MwTU47QUQzTVEsTUFBWjtBQUVBb3FCLGlCQUFhQSxXQUFXOW9CLE1BQVgsQ0FBa0IsVUFBQ21sQixDQUFEO0FDNE0zQixhRDNNSEEsRUFBRXptQixHQUFGLEtBQVMsT0MyTU47QUQ1TVMsTUFBYjtBQUVBd3FCLG9CQUFnQjVyQixFQUFFc0QsTUFBRixDQUFTdEQsRUFBRTBDLE1BQUYsQ0FBUzFDLEVBQUVvRCxNQUFGLENBQVMxTCxRQUFRSSxJQUFqQixDQUFULEVBQWlDLFVBQUMrdkIsQ0FBRDtBQUN6RCxhQUFPQSxFQUFFaUUsV0FBRixJQUFrQmpFLEVBQUV6bUIsR0FBRixLQUFTLE9BQWxDO0FBRHdCLE1BQVQsRUFFYixNQUZhLENBQWhCO0FBR0F5cUIsaUJBQWE3ckIsRUFBRStyQixPQUFGLENBQVUvckIsRUFBRThQLEtBQUYsQ0FBUThiLGFBQVIsRUFBdUIsYUFBdkIsQ0FBVixDQUFiO0FBRUFILGVBQVd6ckIsRUFBRTZNLEtBQUYsQ0FBUTJlLFVBQVIsRUFBb0JLLFVBQXBCLEVBQWdDLENBQUNOLFNBQUQsQ0FBaEMsQ0FBWDs7QUFDQSxRQUFHN3BCLFlBQUg7QUFFQ3lQLGVBQVNzYSxRQUFUO0FBRkQ7QUFJQ0wsb0JBQUEsRUFBQTFxQixPQUFBaEosUUFBQTRKLGFBQUEsZ0JBQUFNLE9BQUE7QUMyTUs5QixlQUFPeUIsT0QzTVo7QUM0TUs0RixjQUFNeEY7QUQ1TVgsU0M2TU07QUFDREUsZ0JBQVE7QUFDTm1vQixtQkFBUztBQURIO0FBRFAsT0Q3TU4sTUNpTlUsSURqTlYsR0NpTmlCdHBCLEtEak5tR3NwQixPQUFwSCxHQUFvSCxNQUFwSCxLQUErSCxNQUEvSDtBQUNBMEIseUJBQW1COUMsTUFBTXpjLEdBQU4sQ0FBVSxVQUFDMGIsQ0FBRDtBQUM1QixlQUFPQSxFQUFFbHJCLElBQVQ7QUFEa0IsUUFBbkI7QUFFQWd2QixjQUFRRixTQUFTL29CLE1BQVQsQ0FBZ0IsVUFBQ3NwQixJQUFEO0FBQ3ZCLFlBQUFDLFNBQUE7QUFBQUEsb0JBQVlELEtBQUtFLGVBQWpCOztBQUVBLFlBQUdELGFBQWFBLFVBQVVscUIsT0FBVixDQUFrQnFwQixXQUFsQixJQUFpQyxDQUFDLENBQWxEO0FBQ0MsaUJBQU8sSUFBUDtBQ21OSTs7QURqTkwsZUFBT3ByQixFQUFFOG5CLFlBQUYsQ0FBZTRELGdCQUFmLEVBQWlDTyxTQUFqQyxFQUE0Q3BwQixNQUFuRDtBQU5PLFFBQVI7QUFPQXNPLGVBQVN3YSxLQUFUO0FDb05FOztBRGxOSCxXQUFPM3JCLEVBQUVzRCxNQUFGLENBQVM2TixNQUFULEVBQWdCLE1BQWhCLENBQVA7QUFqQzBCLEdBQTNCOztBQW1DQXdWLDhCQUE0QixVQUFDd0Ysa0JBQUQsRUFBcUJ6c0IsV0FBckIsRUFBa0N3cUIsaUJBQWxDO0FBRTNCLFFBQUdscUIsRUFBRW9zQixNQUFGLENBQVNELGtCQUFULENBQUg7QUFDQyxhQUFPLElBQVA7QUNtTkU7O0FEbE5ILFFBQUduc0IsRUFBRVcsT0FBRixDQUFVd3JCLGtCQUFWLENBQUg7QUFDQyxhQUFPbnNCLEVBQUUySyxJQUFGLENBQU93aEIsa0JBQVAsRUFBMkIsVUFBQ25rQixFQUFEO0FBQ2hDLGVBQU9BLEdBQUd0SSxXQUFILEtBQWtCQSxXQUF6QjtBQURLLFFBQVA7QUNzTkU7O0FEcE5ILFdBQU9oSSxRQUFRNEosYUFBUixDQUFzQixvQkFBdEIsRUFBNENNLE9BQTVDLENBQW9EO0FBQUNsQyxtQkFBYUEsV0FBZDtBQUEyQndxQix5QkFBbUJBO0FBQTlDLEtBQXBELENBQVA7QUFQMkIsR0FBNUI7O0FBU0F0RCwyQkFBeUIsVUFBQ3VGLGtCQUFELEVBQXFCenNCLFdBQXJCLEVBQWtDMnNCLGtCQUFsQztBQUN4QixRQUFHcnNCLEVBQUVvc0IsTUFBRixDQUFTRCxrQkFBVCxDQUFIO0FBQ0MsYUFBTyxJQUFQO0FDeU5FOztBRHhOSCxRQUFHbnNCLEVBQUVXLE9BQUYsQ0FBVXdyQixrQkFBVixDQUFIO0FBQ0MsYUFBT25zQixFQUFFMEMsTUFBRixDQUFTeXBCLGtCQUFULEVBQTZCLFVBQUNua0IsRUFBRDtBQUNuQyxlQUFPQSxHQUFHdEksV0FBSCxLQUFrQkEsV0FBekI7QUFETSxRQUFQO0FDNE5FOztBQUNELFdEM05GaEksUUFBUTRKLGFBQVIsQ0FBc0Isb0JBQXRCLEVBQTRDcUosSUFBNUMsQ0FBaUQ7QUFBQ2pMLG1CQUFhQSxXQUFkO0FBQTJCd3FCLHlCQUFtQjtBQUFDNWYsYUFBSytoQjtBQUFOO0FBQTlDLEtBQWpELEVBQTJIemhCLEtBQTNILEVDMk5FO0FEak9zQixHQUF6Qjs7QUFRQXFjLDJCQUF5QixVQUFDcUYsR0FBRCxFQUFNM3RCLE1BQU4sRUFBY2lxQixLQUFkO0FBRXhCLFFBQUF6WCxNQUFBO0FBQUFBLGFBQVMsRUFBVDs7QUFDQW5SLE1BQUV5QyxJQUFGLENBQU85RCxPQUFPc1osY0FBZCxFQUE4QixVQUFDc1UsR0FBRCxFQUFNQyxPQUFOO0FBRzdCLFVBQUFDLFdBQUEsRUFBQUMsT0FBQTs7QUFBQSxVQUFHLENBQUMsT0FBRCxFQUFVLE1BQVYsRUFBa0IsUUFBbEIsRUFBNEIsT0FBNUIsRUFBcUMzcUIsT0FBckMsQ0FBNkN5cUIsT0FBN0MsSUFBd0QsQ0FBM0Q7QUFDQ0Msc0JBQWM3RCxNQUFNamUsSUFBTixDQUFXLFVBQUMwZ0IsSUFBRDtBQUFTLGlCQUFPQSxLQUFLMXVCLElBQUwsS0FBYTZ2QixPQUFwQjtBQUFwQixVQUFkOztBQUNBLFlBQUdDLFdBQUg7QUFDQ0Msb0JBQVUxc0IsRUFBRUMsS0FBRixDQUFRc3NCLEdBQVIsS0FBZ0IsRUFBMUI7QUFDQUcsa0JBQVF4QyxpQkFBUixHQUE0QnVDLFlBQVlyckIsR0FBeEM7QUFDQXNyQixrQkFBUWh0QixXQUFSLEdBQXNCZixPQUFPZSxXQUE3QjtBQ2tPSyxpQkRqT0x5UixPQUFPdkwsSUFBUCxDQUFZOG1CLE9BQVosQ0NpT0s7QUR2T1A7QUN5T0k7QUQ1T0w7O0FBVUEsUUFBR3ZiLE9BQU90TyxNQUFWO0FBQ0N5cEIsVUFBSTFlLE9BQUosQ0FBWSxVQUFDNUYsRUFBRDtBQUNYLFlBQUEya0IsV0FBQSxFQUFBQyxRQUFBO0FBQUFELHNCQUFjLENBQWQ7QUFDQUMsbUJBQVd6YixPQUFPeEcsSUFBUCxDQUFZLFVBQUM2RCxJQUFELEVBQU9oQyxLQUFQO0FBQWdCbWdCLHdCQUFjbmdCLEtBQWQ7QUFBb0IsaUJBQU9nQyxLQUFLMGIsaUJBQUwsS0FBMEJsaUIsR0FBR2tpQixpQkFBcEM7QUFBaEQsVUFBWDs7QUFFQSxZQUFHMEMsUUFBSDtBQ3dPTSxpQkR2T0x6YixPQUFPd2IsV0FBUCxJQUFzQjNrQixFQ3VPakI7QUR4T047QUMwT00saUJEdk9MbUosT0FBT3ZMLElBQVAsQ0FBWW9DLEVBQVosQ0N1T0s7QUFDRDtBRC9PTjtBQVFBLGFBQU9tSixNQUFQO0FBVEQ7QUFXQyxhQUFPbWIsR0FBUDtBQzBPRTtBRGxRcUIsR0FBekI7O0FBMEJBNTBCLFVBQVF5dkIsb0JBQVIsR0FBK0IsVUFBQzVsQixPQUFELEVBQVVJLE1BQVYsRUFBa0JqQyxXQUFsQjtBQUM5QixRQUFBZ0MsWUFBQSxFQUFBL0MsTUFBQSxFQUFBa3VCLFVBQUEsRUFBQUMsYUFBQSxFQUFBQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsYUFBQSxFQUFBQyxTQUFBLEVBQUExb0IsV0FBQSxFQUFBOG5CLEdBQUEsRUFBQWEsUUFBQSxFQUFBQyxXQUFBLEVBQUFDLFFBQUEsRUFBQUMsU0FBQSxFQUFBQyxXQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBN0UsS0FBQSxFQUFBQyxVQUFBLEVBQUFDLGNBQUEsRUFBQUcsZ0JBQUEsRUFBQUMsYUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxVQUFBLEVBQUFDLGNBQUEsRUFBQUMsV0FBQSxFQUFBQyxlQUFBLEVBQUFDLGFBQUEsRUFBQUMsaUJBQUEsRUFBQUMsU0FBQSxFQUFBQyxhQUFBLEVBQUFDLE9BQUEsRUFBQUMsU0FBQTtBQUFBcmxCLGtCQUFjLEVBQWQ7QUFDQTdGLGFBQVNqSCxRQUFRNkksU0FBUixDQUFrQmIsV0FBbEIsRUFBK0I2QixPQUEvQixDQUFUOztBQUVBLFFBQUdBLFlBQVcsT0FBWCxJQUFzQjdCLGdCQUFlLE9BQXhDO0FBQ0M4RSxvQkFBY3hFLEVBQUVDLEtBQUYsQ0FBUXRCLE9BQU9zWixjQUFQLENBQXNCeVYsS0FBOUIsS0FBd0MsRUFBdEQ7QUFDQWgyQixjQUFRcVEsa0JBQVIsQ0FBMkJ2RCxXQUEzQjtBQUNBLGFBQU9BLFdBQVA7QUMyT0U7O0FEMU9IcWtCLGlCQUFnQjdvQixFQUFFb3NCLE1BQUYsQ0FBUyxLQUFLdkQsVUFBZCxLQUE2QixLQUFLQSxVQUFsQyxHQUFrRCxLQUFLQSxVQUF2RCxHQUF1RW54QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NNLE9BQXhDLENBQWdEO0FBQUM5QixhQUFPeUIsT0FBUjtBQUFpQjVFLFlBQU07QUFBdkIsS0FBaEQsRUFBaUY7QUFBQ2tGLGNBQU87QUFBQ1QsYUFBSTtBQUFMO0FBQVIsS0FBakYsQ0FBdkY7QUFDQXNvQixnQkFBZTFwQixFQUFFb3NCLE1BQUYsQ0FBUyxLQUFLMUMsU0FBZCxLQUE0QixLQUFLQSxTQUFqQyxHQUFnRCxLQUFLQSxTQUFyRCxHQUFvRWh5QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NNLE9BQXhDLENBQWdEO0FBQUM5QixhQUFPeUIsT0FBUjtBQUFpQjVFLFlBQU07QUFBdkIsS0FBaEQsRUFBZ0Y7QUFBQ2tGLGNBQU87QUFBQ1QsYUFBSTtBQUFMO0FBQVIsS0FBaEYsQ0FBbkY7QUFDQWtvQixrQkFBaUJ0cEIsRUFBRW9zQixNQUFGLENBQVMsS0FBSzlDLFdBQWQsS0FBOEIsS0FBS0EsV0FBbkMsR0FBb0QsS0FBS0EsV0FBekQsR0FBMEU1eEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQWtGO0FBQUNrRixjQUFPO0FBQUNULGFBQUk7QUFBTDtBQUFSLEtBQWxGLENBQTNGO0FBQ0Fnb0IsaUJBQWdCcHBCLEVBQUVvc0IsTUFBRixDQUFTLEtBQUtoRCxVQUFkLEtBQTZCLEtBQUtBLFVBQWxDLEdBQWtELEtBQUtBLFVBQXZELEdBQXVFMXhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q00sT0FBeEMsQ0FBZ0Q7QUFBQzlCLGFBQU95QixPQUFSO0FBQWlCNUUsWUFBTTtBQUF2QixLQUFoRCxFQUFpRjtBQUFDa0YsY0FBTztBQUFDVCxhQUFJO0FBQUw7QUFBUixLQUFqRixDQUF2RjtBQUVBb29CLG9CQUFtQnhwQixFQUFFb3NCLE1BQUYsQ0FBUyxLQUFLNUMsYUFBZCxLQUFnQyxLQUFLQSxhQUFyQyxHQUF3RCxLQUFLQSxhQUE3RCxHQUFnRjl4QixRQUFRNEosYUFBUixDQUFzQixnQkFBdEIsRUFBd0NNLE9BQXhDLENBQWdEO0FBQUM5QixhQUFPeUIsT0FBUjtBQUFpQjVFLFlBQU07QUFBdkIsS0FBaEQsRUFBb0Y7QUFBQ2tGLGNBQU87QUFBQ1QsYUFBSTtBQUFMO0FBQVIsS0FBcEYsQ0FBbkc7QUFDQThuQixvQkFBbUJscEIsRUFBRW9zQixNQUFGLENBQVMsS0FBS2xELGFBQWQsS0FBZ0MsS0FBS0EsYUFBckMsR0FBd0QsS0FBS0EsYUFBN0QsR0FBZ0Z4eEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDTSxPQUF4QyxDQUFnRDtBQUFDOUIsYUFBT3lCLE9BQVI7QUFBaUI1RSxZQUFNO0FBQXZCLEtBQWhELEVBQW9GO0FBQUNrRixjQUFPO0FBQUNULGFBQUk7QUFBTDtBQUFSLEtBQXBGLENBQW5HO0FBQ0F3bkIsWUFBUSxLQUFLRyxZQUFiOztBQUNBLFFBQUcsQ0FBQ0gsS0FBSjtBQUNDaUIsa0JBQVksSUFBWjs7QUFDQSxVQUFHbG9CLE1BQUg7QUFDQ2tvQixvQkFBWW55QixRQUFRNEosYUFBUixDQUFzQixhQUF0QixFQUFxQ00sT0FBckMsQ0FBNkM7QUFBRTlCLGlCQUFPeUIsT0FBVDtBQUFrQjRGLGdCQUFNeEY7QUFBeEIsU0FBN0MsRUFBK0U7QUFBRUUsa0JBQVE7QUFBRW1vQixxQkFBUztBQUFYO0FBQVYsU0FBL0UsQ0FBWjtBQzRSRzs7QUQzUkosVUFBR0gsYUFBYUEsVUFBVUcsT0FBMUI7QUFDQ3BCLGdCQUFRbHhCLFFBQVE0SixhQUFSLENBQXNCLGdCQUF0QixFQUF3Q3FKLElBQXhDLENBQTZDO0FBQUM3SyxpQkFBT3lCLE9BQVI7QUFBaUI4SSxlQUFLLENBQUM7QUFBQzRmLG1CQUFPdG9CO0FBQVIsV0FBRCxFQUFrQjtBQUFDaEYsa0JBQU1rdEIsVUFBVUc7QUFBakIsV0FBbEI7QUFBdEIsU0FBN0MsRUFBa0g7QUFBQ25vQixrQkFBTztBQUFDVCxpQkFBSSxDQUFMO0FBQVEyb0IsMkJBQWMsQ0FBdEI7QUFBeUJwdEIsa0JBQUs7QUFBOUI7QUFBUixTQUFsSCxFQUE2SmlPLEtBQTdKLEVBQVI7QUFERDtBQUdDZ2UsZ0JBQVFseEIsUUFBUTRKLGFBQVIsQ0FBc0IsZ0JBQXRCLEVBQXdDcUosSUFBeEMsQ0FBNkM7QUFBQ3NmLGlCQUFPdG9CLE1BQVI7QUFBZ0I3QixpQkFBT3lCO0FBQXZCLFNBQTdDLEVBQThFO0FBQUNNLGtCQUFPO0FBQUNULGlCQUFJLENBQUw7QUFBUTJvQiwyQkFBYyxDQUF0QjtBQUF5QnB0QixrQkFBSztBQUE5QjtBQUFSLFNBQTlFLEVBQXlIaU8sS0FBekgsRUFBUjtBQVBGO0FDNlRHOztBRHJUSGxKLG1CQUFrQjFCLEVBQUVzWCxTQUFGLENBQVksS0FBSzVWLFlBQWpCLElBQW9DLEtBQUtBLFlBQXpDLEdBQTJEaEssUUFBUWdLLFlBQVIsQ0FBcUJILE9BQXJCLEVBQThCSSxNQUE5QixDQUE3RTtBQUVBbW5CLHFCQUFpQixLQUFLQSxjQUF0QjtBQUNBYSxvQkFBZ0IsS0FBS0EsYUFBckI7QUFDQUosc0JBQWtCLEtBQUtBLGVBQXZCO0FBQ0FGLHFCQUFpQixLQUFLQSxjQUF0QjtBQUVBSSx3QkFBb0IsS0FBS0EsaUJBQXpCO0FBQ0FOLHdCQUFvQixLQUFLQSxpQkFBekI7QUFFQUYsdUJBQW1CLEtBQUtBLGdCQUF4QjtBQUVBNEQsaUJBQWE3c0IsRUFBRUMsS0FBRixDQUFRdEIsT0FBT3NaLGNBQVAsQ0FBc0JvQyxLQUE5QixLQUF3QyxFQUFyRDtBQUNBNlMsZ0JBQVlsdEIsRUFBRUMsS0FBRixDQUFRdEIsT0FBT3NaLGNBQVAsQ0FBc0I5USxJQUE5QixLQUF1QyxFQUFuRDtBQUNBNmxCLGtCQUFjaHRCLEVBQUVDLEtBQUYsQ0FBUXRCLE9BQU9zWixjQUFQLENBQXNCMFYsTUFBOUIsS0FBeUMsRUFBdkQ7QUFDQVosaUJBQWEvc0IsRUFBRUMsS0FBRixDQUFRdEIsT0FBT3NaLGNBQVAsQ0FBc0J5VixLQUE5QixLQUF3QyxFQUFyRDtBQUVBVCxvQkFBZ0JqdEIsRUFBRUMsS0FBRixDQUFRdEIsT0FBT3NaLGNBQVAsQ0FBc0IyVixRQUE5QixLQUEyQyxFQUEzRDtBQUNBZCxvQkFBZ0I5c0IsRUFBRUMsS0FBRixDQUFRdEIsT0FBT3NaLGNBQVAsQ0FBc0I0VixRQUE5QixLQUEyQyxFQUEzRDs7QUFZQSxRQUFHaEYsVUFBSDtBQUNDc0UsaUJBQVd4RywwQkFBMEJtQyxjQUExQixFQUEwQ3BwQixXQUExQyxFQUF1RG1wQixXQUFXem5CLEdBQWxFLENBQVg7QUFDQXNsQiw0QkFBc0JtRyxVQUF0QixFQUFrQ00sUUFBbEM7QUN1U0U7O0FEdFNILFFBQUd6RCxTQUFIO0FBQ0M4RCxnQkFBVTdHLDBCQUEwQmdELGFBQTFCLEVBQXlDanFCLFdBQXpDLEVBQXNEZ3FCLFVBQVV0b0IsR0FBaEUsQ0FBVjtBQUNBc2xCLDRCQUFzQndHLFNBQXRCLEVBQWlDTSxPQUFqQztBQ3dTRTs7QUR2U0gsUUFBR2xFLFdBQUg7QUFDQ2dFLGtCQUFZM0csMEJBQTBCNEMsZUFBMUIsRUFBMkM3cEIsV0FBM0MsRUFBd0Q0cEIsWUFBWWxvQixHQUFwRSxDQUFaO0FBQ0FzbEIsNEJBQXNCc0csV0FBdEIsRUFBbUNNLFNBQW5DO0FDeVNFOztBRHhTSCxRQUFHbEUsVUFBSDtBQUNDaUUsaUJBQVcxRywwQkFBMEIwQyxjQUExQixFQUEwQzNwQixXQUExQyxFQUF1RDBwQixXQUFXaG9CLEdBQWxFLENBQVg7QUFDQXNsQiw0QkFBc0JxRyxVQUF0QixFQUFrQ00sUUFBbEM7QUMwU0U7O0FEelNILFFBQUc3RCxhQUFIO0FBQ0MrRCxvQkFBYzVHLDBCQUEwQjhDLGlCQUExQixFQUE2Qy9wQixXQUE3QyxFQUEwRDhwQixjQUFjcG9CLEdBQXhFLENBQWQ7QUFDQXNsQiw0QkFBc0J1RyxhQUF0QixFQUFxQ00sV0FBckM7QUMyU0U7O0FEMVNILFFBQUdyRSxhQUFIO0FBQ0NrRSxvQkFBY3pHLDBCQUEwQndDLGlCQUExQixFQUE2Q3pwQixXQUE3QyxFQUEwRHdwQixjQUFjOW5CLEdBQXhFLENBQWQ7QUFDQXNsQiw0QkFBc0JvRyxhQUF0QixFQUFxQ00sV0FBckM7QUM0U0U7O0FEMVNILFFBQUcsQ0FBQ3pyQixNQUFKO0FBQ0M2QyxvQkFBY3FvQixVQUFkO0FBREQ7QUFHQyxVQUFHbnJCLFlBQUg7QUFDQzhDLHNCQUFjcW9CLFVBQWQ7QUFERDtBQUdDLFlBQUd0ckIsWUFBVyxRQUFkO0FBQ0NpRCx3QkFBYzBvQixTQUFkO0FBREQ7QUFHQ3JELHNCQUFlN3BCLEVBQUVvc0IsTUFBRixDQUFTLEtBQUt2QyxTQUFkLEtBQTRCLEtBQUtBLFNBQWpDLEdBQWdELEtBQUtBLFNBQXJELEdBQW9FbnlCLFFBQVE0SixhQUFSLENBQXNCLGFBQXRCLEVBQXFDTSxPQUFyQyxDQUE2QztBQUFFOUIsbUJBQU95QixPQUFUO0FBQWtCNEYsa0JBQU14RjtBQUF4QixXQUE3QyxFQUErRTtBQUFFRSxvQkFBUTtBQUFFbW9CLHVCQUFTO0FBQVg7QUFBVixXQUEvRSxDQUFuRjs7QUFDQSxjQUFHSCxTQUFIO0FBQ0M0RCxtQkFBTzVELFVBQVVHLE9BQWpCOztBQUNBLGdCQUFHeUQsSUFBSDtBQUNDLGtCQUFHQSxTQUFRLE1BQVg7QUFDQ2pwQiw4QkFBYzBvQixTQUFkO0FBREQscUJBRUssSUFBR08sU0FBUSxRQUFYO0FBQ0pqcEIsOEJBQWN3b0IsV0FBZDtBQURJLHFCQUVBLElBQUdTLFNBQVEsT0FBWDtBQUNKanBCLDhCQUFjdW9CLFVBQWQ7QUFESSxxQkFFQSxJQUFHVSxTQUFRLFVBQVg7QUFDSmpwQiw4QkFBY3lvQixhQUFkO0FBREkscUJBRUEsSUFBR1EsU0FBUSxVQUFYO0FBQ0pqcEIsOEJBQWNzb0IsYUFBZDtBQVZGO0FBQUE7QUFZQ3RvQiw0QkFBYzBvQixTQUFkO0FBZEY7QUFBQTtBQWdCQzFvQiwwQkFBY3VvQixVQUFkO0FBcEJGO0FBSEQ7QUFIRDtBQ2tWRzs7QUR2VEgsUUFBR25FLE1BQU0vbEIsTUFBTixHQUFlLENBQWxCO0FBQ0MrbUIsZ0JBQVU1cEIsRUFBRThQLEtBQUYsQ0FBUThZLEtBQVIsRUFBZSxLQUFmLENBQVY7QUFDQTBELFlBQU0xRix1QkFBdUJxQyxnQkFBdkIsRUFBeUN2cEIsV0FBekMsRUFBc0RrcUIsT0FBdEQsQ0FBTjtBQUNBMEMsWUFBTXJGLHVCQUF1QnFGLEdBQXZCLEVBQTRCM3RCLE1BQTVCLEVBQW9DaXFCLEtBQXBDLENBQU47O0FBQ0E1b0IsUUFBRXlDLElBQUYsQ0FBTzZwQixHQUFQLEVBQVksVUFBQ3RrQixFQUFEO0FBQ1gsWUFBR0EsR0FBR2tpQixpQkFBSCxNQUFBckIsY0FBQSxPQUF3QkEsV0FBWXpuQixHQUFwQyxHQUFvQyxNQUFwQyxLQUNINEcsR0FBR2tpQixpQkFBSCxNQUFBUixhQUFBLE9BQXdCQSxVQUFXdG9CLEdBQW5DLEdBQW1DLE1BQW5DLENBREcsSUFFSDRHLEdBQUdraUIsaUJBQUgsTUFBQVosZUFBQSxPQUF3QkEsWUFBYWxvQixHQUFyQyxHQUFxQyxNQUFyQyxDQUZHLElBR0g0RyxHQUFHa2lCLGlCQUFILE1BQUFkLGNBQUEsT0FBd0JBLFdBQVlob0IsR0FBcEMsR0FBb0MsTUFBcEMsQ0FIRyxJQUlINEcsR0FBR2tpQixpQkFBSCxNQUFBVixpQkFBQSxPQUF3QkEsY0FBZXBvQixHQUF2QyxHQUF1QyxNQUF2QyxDQUpHLElBS0g0RyxHQUFHa2lCLGlCQUFILE1BQUFoQixpQkFBQSxPQUF3QkEsY0FBZTluQixHQUF2QyxHQUF1QyxNQUF2QyxDQUxBO0FBT0M7QUNtVEk7O0FEbFRMLFlBQUdwQixFQUFFNEUsT0FBRixDQUFVSixXQUFWLENBQUg7QUFDQ0Esd0JBQWN3RCxFQUFkO0FDb1RJOztBRG5UTCtlLDBDQUFrQ3ZpQixXQUFsQyxFQUErQ3dELEVBQS9DO0FBRUF4RCxvQkFBWW9ULG1CQUFaLEdBQWtDaVAsaUJBQWlCcmlCLFlBQVlvVCxtQkFBN0IsRUFBa0Q1UCxHQUFHNFAsbUJBQXJELENBQWxDO0FBQ0FwVCxvQkFBWXNwQixnQkFBWixHQUErQmpILGlCQUFpQnJpQixZQUFZc3BCLGdCQUE3QixFQUErQzlsQixHQUFHOGxCLGdCQUFsRCxDQUEvQjtBQUNBdHBCLG9CQUFZdXBCLGlCQUFaLEdBQWdDbEgsaUJBQWlCcmlCLFlBQVl1cEIsaUJBQTdCLEVBQWdEL2xCLEdBQUcrbEIsaUJBQW5ELENBQWhDO0FBQ0F2cEIsb0JBQVl3cEIsaUJBQVosR0FBZ0NuSCxpQkFBaUJyaUIsWUFBWXdwQixpQkFBN0IsRUFBZ0RobUIsR0FBR2dtQixpQkFBbkQsQ0FBaEM7QUFDQXhwQixvQkFBWThKLGlCQUFaLEdBQWdDdVksaUJBQWlCcmlCLFlBQVk4SixpQkFBN0IsRUFBZ0R0RyxHQUFHc0csaUJBQW5ELENBQWhDO0FDb1RJLGVEblRKOUosWUFBWStqQix1QkFBWixHQUFzQzFCLGlCQUFpQnJpQixZQUFZK2pCLHVCQUE3QixFQUFzRHZnQixHQUFHdWdCLHVCQUF6RCxDQ21UbEM7QURyVUw7QUN1VUU7O0FEblRILFFBQUc1cEIsT0FBT3laLE9BQVY7QUFDQzVULGtCQUFZeUQsV0FBWixHQUEwQixLQUExQjtBQUNBekQsa0JBQVkyRCxTQUFaLEdBQXdCLEtBQXhCO0FBQ0EzRCxrQkFBWTRELFdBQVosR0FBMEIsS0FBMUI7QUFDQTVELGtCQUFZa0IsZ0JBQVosR0FBK0IsS0FBL0I7QUFDQWxCLGtCQUFZK0Qsb0JBQVosR0FBbUMsS0FBbkM7QUFDQS9ELGtCQUFZc3BCLGdCQUFaLEdBQStCLEVBQS9CO0FDcVRFOztBRHBUSHAyQixZQUFRcVEsa0JBQVIsQ0FBMkJ2RCxXQUEzQjs7QUFFQSxRQUFHN0YsT0FBT3NaLGNBQVAsQ0FBc0IwUCxLQUF6QjtBQUNDbmpCLGtCQUFZbWpCLEtBQVosR0FBb0JocEIsT0FBT3NaLGNBQVAsQ0FBc0IwUCxLQUExQztBQ3FURTs7QURwVEgsV0FBT25qQixXQUFQO0FBdkk4QixHQUEvQjs7QUEyS0FuTCxTQUFPaVEsT0FBUCxDQUVDO0FBQUEsa0NBQThCLFVBQUMvSCxPQUFEO0FBQzdCLGFBQU83SixRQUFRZ3hCLGlCQUFSLENBQTBCbm5CLE9BQTFCLEVBQW1DLEtBQUtJLE1BQXhDLENBQVA7QUFERDtBQUFBLEdBRkQ7QUN3UkEsQzs7Ozs7Ozs7Ozs7O0FDMzJCRCxJQUFBOUksV0FBQTtBQUFBQSxjQUFjSSxRQUFRLGVBQVIsQ0FBZDtBQUVBSSxPQUFPQyxPQUFQLENBQWU7QUFDZCxNQUFBMjBCLGNBQUEsRUFBQUMsU0FBQTtBQUFBRCxtQkFBaUJuMUIsUUFBUUMsR0FBUixDQUFZbzFCLGlCQUE3QjtBQUNBRCxjQUFZcDFCLFFBQVFDLEdBQVIsQ0FBWXExQix1QkFBeEI7O0FBQ0EsTUFBR0gsY0FBSDtBQUNDLFFBQUcsQ0FBQ0MsU0FBSjtBQUNDLFlBQU0sSUFBSTcwQixPQUFPc04sS0FBWCxDQUFpQixHQUFqQixFQUFzQixpRUFBdEIsQ0FBTjtBQ0dFOztBQUNELFdESEZqUCxRQUFRMjJCLG1CQUFSLEdBQThCO0FBQUNDLGVBQVMsSUFBSUMsZUFBZUMsc0JBQW5CLENBQTBDUCxjQUExQyxFQUEwRDtBQUFDUSxrQkFBVVA7QUFBWCxPQUExRDtBQUFWLEtDRzVCO0FBS0Q7QURkSDs7QUFRQXgyQixRQUFRcUksaUJBQVIsR0FBNEIsVUFBQ3BCLE1BQUQ7QUFLM0IsU0FBT0EsT0FBT2hDLElBQWQ7QUFMMkIsQ0FBNUI7O0FBTUFqRixRQUFRK2lCLGdCQUFSLEdBQTJCLFVBQUM5YixNQUFEO0FBQzFCLE1BQUErdkIsY0FBQTtBQUFBQSxtQkFBaUJoM0IsUUFBUXFJLGlCQUFSLENBQTBCcEIsTUFBMUIsQ0FBakI7O0FBQ0EsTUFBR2xILEdBQUdpM0IsY0FBSCxDQUFIO0FBQ0MsV0FBT2ozQixHQUFHaTNCLGNBQUgsQ0FBUDtBQURELFNBRUssSUFBRy92QixPQUFPbEgsRUFBVjtBQUNKLFdBQU9rSCxPQUFPbEgsRUFBZDtBQ1NDOztBRFBGLE1BQUdDLFFBQVFFLFdBQVIsQ0FBb0I4MkIsY0FBcEIsQ0FBSDtBQUNDLFdBQU9oM0IsUUFBUUUsV0FBUixDQUFvQjgyQixjQUFwQixDQUFQO0FBREQ7QUFHQyxRQUFHL3ZCLE9BQU9rYSxNQUFWO0FBQ0MsYUFBT2hnQixZQUFZODFCLGFBQVosQ0FBMEJELGNBQTFCLEVBQTBDaDNCLFFBQVEyMkIsbUJBQWxELENBQVA7QUFERDtBQUdDLFVBQUdLLG1CQUFrQixZQUFsQixZQUFBRSxRQUFBLG9CQUFBQSxhQUFBLE9BQWtDQSxTQUFVcmxCLFVBQTVDLEdBQTRDLE1BQTVDLENBQUg7QUFDQyxlQUFPcWxCLFNBQVNybEIsVUFBaEI7QUNTRzs7QURSSixhQUFPMVEsWUFBWTgxQixhQUFaLENBQTBCRCxjQUExQixDQUFQO0FBUkY7QUNtQkU7QUQxQndCLENBQTNCLEM7Ozs7Ozs7Ozs7OztBRWpCQSxJQUFBRyxhQUFBOztBQUFBbjNCLFFBQVE0YyxhQUFSLEdBQXdCLEVBQXhCOztBQUVBLElBQUdqYixPQUFPdUgsUUFBVjtBQUVDbEosVUFBUXVYLE9BQVIsR0FBa0IsVUFBQ0EsT0FBRDtBQ0VmLFdEREZqUCxFQUFFeUMsSUFBRixDQUFPd00sT0FBUCxFQUFnQixVQUFDNkUsSUFBRCxFQUFPZ2IsV0FBUDtBQ0VaLGFEREhwM0IsUUFBUTRjLGFBQVIsQ0FBc0J3YSxXQUF0QixJQUFxQ2hiLElDQ2xDO0FERkosTUNDRTtBREZlLEdBQWxCOztBQUlBcGMsVUFBUXEzQixhQUFSLEdBQXdCLFVBQUNydkIsV0FBRCxFQUFjaUQsTUFBZCxFQUFzQnVKLFNBQXRCLEVBQWlDOGlCLFlBQWpDLEVBQStDaGpCLFlBQS9DLEVBQTZEbkIsTUFBN0QsRUFBcUVva0IsUUFBckU7QUFDdkIsUUFBQTFzQixPQUFBLEVBQUEyc0IsUUFBQSxFQUFBenZCLEdBQUEsRUFBQXFVLElBQUEsRUFBQXFiLFFBQUEsRUFBQTduQixHQUFBOztBQUFBLFFBQUczRSxVQUFVQSxPQUFPNUcsSUFBUCxLQUFlLFlBQTVCO0FBQ0MsVUFBR21RLFNBQUg7QUFDQzNKLGtCQUFVLENBQUMsS0FBRCxFQUFRLEdBQVIsRUFBYTJKLFNBQWIsQ0FBVjtBQUREO0FBR0MzSixrQkFBVTZzQixXQUFXQyxVQUFYLENBQXNCM3ZCLFdBQXRCLEVBQW1Dc00sWUFBbkMsRUFBaUQsS0FBakQsRUFBd0QsSUFBeEQsRUFBOEQsSUFBOUQsQ0FBVjtBQ0lHOztBREhKMUUsWUFBTSw0QkFBNEIzRSxPQUFPMnNCLGFBQW5DLEdBQW1ELFFBQW5ELEdBQThELFdBQTlELEdBQTRFQyxlQUFlQyx5QkFBZixDQUF5Q2p0QixPQUF6QyxDQUFsRjtBQUNBK0UsWUFBTW5ELFFBQVFzckIsV0FBUixDQUFvQm5vQixHQUFwQixDQUFOO0FBQ0EsYUFBT29vQixPQUFPQyxJQUFQLENBQVlyb0IsR0FBWixDQUFQO0FDS0U7O0FESEg3SCxVQUFNL0gsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQU47O0FBQ0EsUUFBQWlELFVBQUEsT0FBR0EsT0FBUW1SLElBQVgsR0FBVyxNQUFYO0FBQ0MsVUFBRyxPQUFPblIsT0FBT21SLElBQWQsS0FBc0IsUUFBekI7QUFDQ0EsZUFBT3BjLFFBQVE0YyxhQUFSLENBQXNCM1IsT0FBT21SLElBQTdCLENBQVA7QUFERCxhQUVLLElBQUcsT0FBT25SLE9BQU9tUixJQUFkLEtBQXNCLFVBQXpCO0FBQ0pBLGVBQU9uUixPQUFPbVIsSUFBZDtBQ0tHOztBREpKLFVBQUcsQ0FBQ2pKLE1BQUQsSUFBV25MLFdBQVgsSUFBMEJ3TSxTQUE3QjtBQUNDckIsaUJBQVNuVCxRQUFRazRCLEtBQVIsQ0FBYzd1QixHQUFkLENBQWtCckIsV0FBbEIsRUFBK0J3TSxTQUEvQixDQUFUO0FDTUc7O0FETEosVUFBRzRILElBQUg7QUFFQ2tiLHVCQUFrQkEsZUFBa0JBLFlBQWxCLEdBQW9DLEVBQXREO0FBQ0FFLG1CQUFXM1EsTUFBTXNSLFNBQU4sQ0FBZ0JDLEtBQWhCLENBQXNCcGQsSUFBdEIsQ0FBMkJxVCxTQUEzQixFQUFzQyxDQUF0QyxDQUFYO0FBQ0FvSixtQkFBVyxDQUFDenZCLFdBQUQsRUFBY3dNLFNBQWQsRUFBeUI2akIsTUFBekIsQ0FBZ0NiLFFBQWhDLENBQVg7QUNNSSxlRExKcGIsS0FBS2dTLEtBQUwsQ0FBVztBQUNWcG1CLHVCQUFhQSxXQURIO0FBRVZ3TSxxQkFBV0EsU0FGRDtBQUdWdk4sa0JBQVFjLEdBSEU7QUFJVmtELGtCQUFRQSxNQUpFO0FBS1Zxc0Isd0JBQWNBLFlBTEo7QUFNVm5rQixrQkFBUUE7QUFORSxTQUFYLEVBT0dza0IsUUFQSCxDQ0tJO0FEVkw7QUNtQkssZURMSjVYLE9BQU95WSxPQUFQLENBQWU1TCxFQUFFLDJCQUFGLENBQWYsQ0NLSTtBRDFCTjtBQUFBO0FDNkJJLGFETkg3TSxPQUFPeVksT0FBUCxDQUFlNUwsRUFBRSwyQkFBRixDQUFmLENDTUc7QUFDRDtBRHpDb0IsR0FBeEI7O0FBcUNBeUssa0JBQWdCLFVBQUNudkIsV0FBRCxFQUFjd00sU0FBZCxFQUF5QitqQixZQUF6QixFQUF1Q2prQixZQUF2QyxFQUFxRG5CLE1BQXJELEVBQTZEcWxCLFNBQTdELEVBQXdFQyxlQUF4RTtBQUVmLFFBQUF4eEIsTUFBQSxFQUFBeXhCLFdBQUE7QUFBQXp4QixhQUFTakgsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVQ7QUFDQTB3QixrQkFBY0MsWUFBWUMsY0FBWixDQUEyQjV3QixXQUEzQixFQUF3Q3dNLFNBQXhDLEVBQW1ELFFBQW5ELENBQWQ7QUNPRSxXRE5GeFUsUUFBUWs0QixLQUFSLENBQWEsUUFBYixFQUFxQmx3QixXQUFyQixFQUFrQ3dNLFNBQWxDLEVBQTZDO0FBQzVDLFVBQUFxa0IsSUFBQTs7QUFBQSxVQUFHTixZQUFIO0FBRUNNLGVBQU1uTSxFQUFFLHNDQUFGLEVBQTBDemxCLE9BQU9tTSxLQUFQLElBQWUsT0FBS21sQixZQUFMLEdBQWtCLElBQWpDLENBQTFDLENBQU47QUFGRDtBQUlDTSxlQUFPbk0sRUFBRSxnQ0FBRixDQUFQO0FDT0c7O0FETko3TSxhQUFPaVosT0FBUCxDQUFlRCxJQUFmOztBQUNBLFVBQUdMLGFBQWMsT0FBT0EsU0FBUCxLQUFvQixVQUFyQztBQUNDQTtBQ1FHOztBQUNELGFEUEhHLFlBQVlJLE9BQVosQ0FBb0Ivd0IsV0FBcEIsRUFBaUMsUUFBakMsRUFBMkMsT0FBM0MsRUFBb0Q7QUFBQzBCLGFBQUs4SyxTQUFOO0FBQWlCa2tCLHFCQUFhQTtBQUE5QixPQUFwRCxDQ09HO0FEakJKLE9BV0UsVUFBQy94QixLQUFEO0FBQ0QsVUFBRzh4QixtQkFBb0IsT0FBT0EsZUFBUCxLQUEwQixVQUFqRDtBQUNDQTtBQ1dHOztBQUNELGFEWEhFLFlBQVlJLE9BQVosQ0FBb0Ivd0IsV0FBcEIsRUFBaUMsUUFBakMsRUFBMkMsT0FBM0MsRUFBb0Q7QUFBQzBCLGFBQUs4SyxTQUFOO0FBQWlCN04sZUFBT0E7QUFBeEIsT0FBcEQsQ0NXRztBRHpCSixNQ01FO0FEVmEsR0FBaEI7O0FBb0JBM0csVUFBUWc1Qix3QkFBUixHQUFtQyxVQUFDenJCLG1CQUFEO0FBQ2xDLFFBQUFzRSxVQUFBLEVBQUFvbkIsZUFBQSxFQUFBQyxtQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxVQUFBLEVBQUF2dEIsR0FBQSxFQUFBTixHQUFBLEVBQUE4dEIsYUFBQSxFQUFBN2tCLFNBQUEsRUFBQThrQixZQUFBO0FBQUFBLG1CQUFldDVCLFFBQVE2SSxTQUFSLENBQWtCMEUsbUJBQWxCLENBQWY7QUFDQTByQixzQkFBa0JLLGFBQWFsbUIsS0FBL0I7QUFDQXZCLGlCQUFhLHlCQUF1QjdSLFFBQVE2SSxTQUFSLENBQWtCMEUsbUJBQWxCLEVBQXVDekQsZ0JBQTNFO0FBQ0FvdkIsMEJBQXNCOXZCLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQXRCO0FBQ0E4dkIsd0JBQW9CL3ZCLFFBQVFDLEdBQVIsQ0FBWSxXQUFaLENBQXBCO0FBQ0FrQyxVQUFNdkwsUUFBUXFWLGtCQUFSLENBQTJCOUgsbUJBQTNCLENBQU47QUFDQThyQixvQkFBZ0IsRUFBaEI7O0FBQ0EsUUFBQTl0QixPQUFBLE9BQUdBLElBQUtKLE1BQVIsR0FBUSxNQUFSO0FBR0NxSixrQkFBWWpKLElBQUksQ0FBSixDQUFaO0FBQ0FNLFlBQU03TCxRQUFRazRCLEtBQVIsQ0FBYzd1QixHQUFkLENBQWtCa0UsbUJBQWxCLEVBQXVDaUgsU0FBdkMsQ0FBTjtBQUNBNmtCLHNCQUFnQnh0QixHQUFoQjtBQUVBekMsY0FBUW13QixHQUFSLENBQVksdUJBQVosRUFBcUMsSUFBckM7QUFQRDtBQVNDSCxtQkFBYVQsWUFBWWEsdUJBQVosQ0FBb0NOLG1CQUFwQyxFQUF5REMsaUJBQXpELEVBQTRFNXJCLG1CQUE1RSxDQUFiOztBQUNBLFVBQUcsQ0FBQ2pGLEVBQUU0RSxPQUFGLENBQVVrc0IsVUFBVixDQUFKO0FBQ0NDLHdCQUFnQkQsVUFBaEI7QUFYRjtBQzBCRzs7QURkSCxTQUFBRSxnQkFBQSxPQUFHQSxhQUFjMVksT0FBakIsR0FBaUIsTUFBakIsS0FBNEIsQ0FBNUI7QUFDQyxhQUFPNlksVUFBVUMsU0FBVixDQUFvQkMsT0FBT0MsaUJBQVAsQ0FBeUJDLFVBQXpCLENBQW9DQyxVQUF4RCxFQUFvRTtBQUMxRTcwQixjQUFTc0ksc0JBQW9CLG9CQUQ2QztBQUUxRXdzQix1QkFBZXhzQixtQkFGMkQ7QUFHMUV5c0IsZUFBTyxRQUFRVixhQUFhbG1CLEtBSDhDO0FBSTFFaW1CLHVCQUFlQSxhQUoyRDtBQUsxRVkscUJBQWEsVUFBQ3hnQixNQUFEO0FBQ1pwVSxxQkFBVztBQUVWLGdCQUFHckYsUUFBUTZJLFNBQVIsQ0FBa0Jxd0IsbUJBQWxCLEVBQXVDdFksT0FBdkMsR0FBaUQsQ0FBcEQ7QUFDQzZZLHdCQUFVUyxZQUFWLENBQXVCaEIsbUJBQXZCLEVBQTRDQyxpQkFBNUM7QUNlTTs7QUFDRCxtQkRmTmdCLFdBQVdDLE1BQVgsRUNlTTtBRG5CUCxhQUtFLENBTEY7QUFNQSxpQkFBTyxJQUFQO0FBWnlFO0FBQUEsT0FBcEUsRUFhSixJQWJJLEVBYUU7QUFBQ0Msa0JBQVU7QUFBWCxPQWJGLENBQVA7QUNnQ0U7O0FEaEJILFFBQUE5dUIsT0FBQSxPQUFHQSxJQUFLSixNQUFSLEdBQVEsTUFBUjtBQUdDL0IsY0FBUW13QixHQUFSLENBQVksT0FBWixFQUFxQkYsYUFBckI7QUFFQWp3QixjQUFRbXdCLEdBQVIsQ0FBWSx1QkFBWixFQUFxQyxJQUFyQztBQUxEO0FBT0MsVUFBRyxDQUFDanhCLEVBQUU0RSxPQUFGLENBQVVtc0IsYUFBVixDQUFKO0FBQ0Nqd0IsZ0JBQVFtd0IsR0FBUixDQUFZLE9BQVosRUFBcUJGLGFBQXJCO0FBUkY7QUN3Qkc7O0FEZEhqd0IsWUFBUW13QixHQUFSLENBQVksZUFBWixFQUE2QixNQUE3QjtBQUNBbndCLFlBQVFtd0IsR0FBUixDQUFZLG1CQUFaLEVBQWlDMW5CLFVBQWpDO0FBQ0F6SSxZQUFRbXdCLEdBQVIsQ0FBWSx3QkFBWixFQUFzQ04sZUFBdEM7QUFDQTd2QixZQUFRbXdCLEdBQVIsQ0FBWSx3QkFBWixFQUFzQyxLQUF0QztBQUNBNTNCLFdBQU8yNEIsS0FBUCxDQUFhO0FDZ0JULGFEZkhDLEVBQUUsc0JBQUYsRUFBMEJDLEtBQTFCLEVDZUc7QURoQko7QUFuRGtDLEdBQW5DOztBQXVEQXg2QixVQUFRdVgsT0FBUixDQUVDO0FBQUEsc0JBQWtCO0FDZWQsYURkSDZOLE1BQU1DLElBQU4sQ0FBVyxzQkFBWCxDQ2NHO0FEZko7QUFHQSxvQkFBZ0IsVUFBQ3JkLFdBQUQsRUFBY3dNLFNBQWQsRUFBeUJySyxNQUF6QjtBQU1mLFVBQUFzd0IsUUFBQSxFQUFBcEIsYUFBQSxFQUFBcUIsU0FBQSxFQUFBQyxjQUFBLEVBQUExekIsTUFBQSxFQUFBOEIsR0FBQSxFQUFBQyxJQUFBLEVBQUFpTCxJQUFBLEVBQUFrTSxJQUFBLEVBQUE4TixJQUFBLEVBQUFDLElBQUEsRUFBQTBNLGdCQUFBLEVBQUFDLFlBQUE7QUFBQTV6QixlQUFTakgsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVQ7QUFDQXl5QixpQkFBVyxLQUFLeHZCLE1BQUwsQ0FBWXd2QixRQUF2QjtBQUNBQyxrQkFBWSxLQUFLenZCLE1BQUwsQ0FBWXl2QixTQUF4Qjs7QUFDQSxVQUFHQSxTQUFIO0FBQ0NFLDJCQUFtQixLQUFLM3ZCLE1BQUwsQ0FBWTJ2QixnQkFBL0I7QUFDQUQseUJBQWlCLEtBQUsxdkIsTUFBTCxDQUFZMHZCLGNBQTdCO0FBQ0F0Qix3QkFBZ0IsS0FBS3B1QixNQUFMLENBQVlvdUIsYUFBNUI7O0FBQ0EsWUFBRyxDQUFDQSxhQUFKO0FBQ0NBLDBCQUFnQixFQUFoQjtBQUNBQSx3QkFBY3VCLGdCQUFkLElBQWtDRCxjQUFsQztBQU5GO0FBQUE7QUFRQ3RCLHdCQUFjLEVBQWQ7O0FBQ0EsWUFBR29CLFFBQUg7QUFDQ0kseUJBQUEsQ0FBQTl4QixNQUFBaXZCLE9BQUE4QyxRQUFBLGFBQUE5eEIsT0FBQUQsSUFBQTB4QixRQUFBLEVBQUFNLE9BQUEsYUFBQTltQixPQUFBakwsS0FBQWd5QixHQUFBLFlBQUEvbUIsS0FBd0RnbkIsZUFBeEQsS0FBZSxNQUFmLEdBQWUsTUFBZixHQUFlLE1BQWY7QUFERDtBQUdDSix5QkFBQSxDQUFBMWEsT0FBQTZYLE9BQUFrRCxPQUFBLGFBQUFqTixPQUFBOU4sS0FBQTRhLE9BQUEsYUFBQTdNLE9BQUFELEtBQUErTSxHQUFBLFlBQUE5TSxLQUE2QytNLGVBQTdDLEtBQWUsTUFBZixHQUFlLE1BQWYsR0FBZSxNQUFmO0FDWUk7O0FEVkwsWUFBQUosZ0JBQUEsT0FBR0EsYUFBYzF2QixNQUFqQixHQUFpQixNQUFqQjtBQUNDcUosc0JBQVlxbUIsYUFBYSxDQUFiLEVBQWdCbnhCLEdBQTVCOztBQUNBLGNBQUc4SyxTQUFIO0FBQ0M2a0IsNEJBQWdCcjVCLFFBQVFrNEIsS0FBUixDQUFjN3VCLEdBQWQsQ0FBa0JyQixXQUFsQixFQUErQndNLFNBQS9CLENBQWhCO0FBSEY7QUFBQTtBQU1DNmtCLDBCQUFnQlYsWUFBWXdDLGdCQUFaLENBQTZCbnpCLFdBQTdCLENBQWhCO0FBcEJGO0FDaUNJOztBRFhKLFdBQUFmLFVBQUEsT0FBR0EsT0FBUTJaLE9BQVgsR0FBVyxNQUFYLEtBQXNCLENBQXRCO0FBQ0MsZUFBT25VLFFBQVEydUIsSUFBUixDQUFhQyxJQUFiLENBQWtCQyxXQUFsQixDQUE4QkMsTUFBOUIsQ0FBcUNueUIsUUFBUUMsR0FBUixDQUFZLFFBQVosQ0FBckMsRUFBNERyQixXQUE1RCxFQUF5RTBrQixFQUFFLEtBQUYsSUFBVyxHQUFYLEdBQWlCemxCLE9BQU9tTSxLQUFqRyxFQUF3R2ltQixhQUF4RyxFQUF3SDtBQUFDb0Isb0JBQVVBO0FBQVgsU0FBeEgsQ0FBUDtBQ2VHOztBRGRKcnhCLGNBQVFtd0IsR0FBUixDQUFZLG9CQUFaLEVBQWtDdnhCLFdBQWxDOztBQUNBLFVBQUE2eUIsZ0JBQUEsT0FBR0EsYUFBYzF2QixNQUFqQixHQUFpQixNQUFqQjtBQUdDL0IsZ0JBQVFtd0IsR0FBUixDQUFZLE9BQVosRUFBcUJGLGFBQXJCO0FBRUFqd0IsZ0JBQVFtd0IsR0FBUixDQUFZLHVCQUFaLEVBQXFDLElBQXJDO0FBTEQ7QUFPQ253QixnQkFBUW13QixHQUFSLENBQVksT0FBWixFQUFxQkYsYUFBckI7QUNhRzs7QURaSjEzQixhQUFPMjRCLEtBQVAsQ0FBYTtBQ2NSLGVEYkpDLEVBQUUsY0FBRixFQUFrQkMsS0FBbEIsRUNhSTtBRGRMO0FBN0NEO0FBaURBLDBCQUFzQixVQUFDeHlCLFdBQUQsRUFBY3dNLFNBQWQsRUFBeUJySyxNQUF6QjtBQUNyQixVQUFBcXhCLElBQUE7QUFBQUEsYUFBT3g3QixRQUFReTdCLFlBQVIsQ0FBcUJ6ekIsV0FBckIsRUFBa0N3TSxTQUFsQyxDQUFQO0FBQ0EybEIsaUJBQVd1QixRQUFYLENBQW9CRixJQUFwQjtBQUNBLGFBQU8sS0FBUDtBQXBERDtBQXNEQSxxQkFBaUIsVUFBQ3h6QixXQUFELEVBQWN3TSxTQUFkLEVBQXlCckssTUFBekI7QUFDaEIsVUFBQWxELE1BQUE7O0FBQUEsVUFBR3VOLFNBQUg7QUFDQ3ZOLGlCQUFTakgsUUFBUTZJLFNBQVIsQ0FBa0JiLFdBQWxCLENBQVQ7O0FBQ0EsYUFBQWYsVUFBQSxPQUFHQSxPQUFRMlosT0FBWCxHQUFXLE1BQVgsS0FBc0IsQ0FBdEI7QUFDQyxpQkFBT25VLFFBQVEydUIsSUFBUixDQUFhQyxJQUFiLENBQWtCTSxZQUFsQixDQUErQkosTUFBL0IsQ0FBc0NueUIsUUFBUUMsR0FBUixDQUFZLFFBQVosQ0FBdEMsRUFBNkRyQixXQUE3RCxFQUEwRTBrQixFQUFFLE1BQUYsSUFBWSxHQUFaLEdBQWtCemxCLE9BQU9tTSxLQUFuRyxFQUEwR29CLFNBQTFHLEVBQXFIO0FBQzNIaW1CLHNCQUFVLEtBQUt4dkIsTUFBTCxDQUFZd3ZCO0FBRHFHLFdBQXJILENBQVA7QUNrQkk7O0FEZkwsWUFBR2h1QixRQUFRNFgsUUFBUixNQUFzQixLQUF6QjtBQUlDamIsa0JBQVFtd0IsR0FBUixDQUFZLG9CQUFaLEVBQWtDdnhCLFdBQWxDO0FBQ0FvQixrQkFBUW13QixHQUFSLENBQVksa0JBQVosRUFBZ0Mva0IsU0FBaEM7O0FBQ0EsY0FBRyxLQUFLckIsTUFBUjtBQUNDL0osb0JBQVFtd0IsR0FBUixDQUFZLE9BQVosRUFBcUIsS0FBS3BtQixNQUExQjtBQ2NLOztBQUNELGlCRGRMeFIsT0FBTzI0QixLQUFQLENBQWE7QUNlTixtQkRkTkMsRUFBRSxrQkFBRixFQUFzQkMsS0FBdEIsRUNjTTtBRGZQLFlDY0s7QUR0Qk47QUFXQ3B4QixrQkFBUW13QixHQUFSLENBQVksb0JBQVosRUFBa0N2eEIsV0FBbEM7QUFDQW9CLGtCQUFRbXdCLEdBQVIsQ0FBWSxrQkFBWixFQUFnQy9rQixTQUFoQzs7QUFDQSxjQUFHLEtBQUtyQixNQUFSO0FBQ0MvSixvQkFBUW13QixHQUFSLENBQVksT0FBWixFQUFxQixLQUFLcG1CLE1BQTFCO0FDZ0JNLG1CRGZOeFIsT0FBTzI0QixLQUFQLENBQWE7QUNnQkwscUJEZlBDLEVBQUUsbUJBQUYsRUFBdUJDLEtBQXZCLEVDZU87QURoQlIsY0NlTTtBRDlCUjtBQU5EO0FDeUNJO0FEaEdMO0FBK0VBLHVCQUFtQixVQUFDeHlCLFdBQUQsRUFBY3dNLFNBQWQsRUFBeUIrakIsWUFBekIsRUFBdUNqa0IsWUFBdkMsRUFBcURuQixNQUFyRCxFQUE2RHFsQixTQUE3RDtBQUNsQixVQUFBb0QsVUFBQSxFQUFBbkIsUUFBQSxFQUFBb0IsV0FBQSxFQUFBQyxZQUFBLEVBQUFDLFNBQUEsRUFBQTkwQixNQUFBLEVBQUErMEIsZUFBQSxFQUFBQyxJQUFBO0FBQUF4QixpQkFBVyxLQUFLeHZCLE1BQUwsQ0FBWXd2QixRQUF2Qjs7QUFFQSxVQUFHam1CLFNBQUg7QUFDQ29uQixxQkFBYWpELFlBQVlJLE9BQVosQ0FBb0Ivd0IsV0FBcEIsRUFBaUMsUUFBakMsRUFBMkMsUUFBM0MsRUFBcUQ7QUFBQzBCLGVBQUs4SztBQUFOLFNBQXJELENBQWI7O0FBQ0EsWUFBRyxDQUFDb25CLFVBQUo7QUFDQyxpQkFBTyxLQUFQO0FBSEY7QUMwQkk7O0FEdEJKMzBCLGVBQVNqSCxRQUFRNkksU0FBUixDQUFrQmIsV0FBbEIsQ0FBVDtBQUNBK3pCLGtCQUFZOTBCLE9BQU91TCxjQUFQLElBQXlCLE1BQXJDOztBQUVBLFdBQU84QixZQUFQO0FBQ0NBLHVCQUFlbEwsUUFBUUMsR0FBUixDQUFZLGNBQVosQ0FBZjtBQ3VCRzs7QUR0QkosV0FBT2lMLFlBQVA7QUFDQ0EsdUJBQWUsS0FBZjtBQ3dCRzs7QUR0QkosVUFBRyxDQUFDaE0sRUFBRW1DLFFBQUYsQ0FBVzh0QixZQUFYLENBQUQsSUFBNkJBLFlBQWhDO0FBQ0NBLHVCQUFlQSxhQUFhd0QsU0FBYixDQUFmO0FDd0JHOztBRHRCSixVQUFHNW9CLFVBQVUsQ0FBQ29sQixZQUFkO0FBQ0NBLHVCQUFlcGxCLE9BQU80b0IsU0FBUCxDQUFmO0FDd0JHOztBRHRCSkQscUJBQWUsa0NBQWY7QUFDQUQsb0JBQWMsaUNBQWQ7O0FBRUEsV0FBT3JuQixTQUFQO0FBQ0NzbkIsdUJBQWUsdUNBQWY7QUFDQUQsc0JBQWMsc0NBQWQ7QUFJQUcsMEJBQWtCdkMsVUFBVXlDLG9CQUFWLENBQStCekIsWUFBWW5tQixZQUEzQyxDQUFsQjs7QUFDQSxZQUFHLENBQUMwbkIsZUFBRCxJQUFvQixDQUFDQSxnQkFBZ0I3d0IsTUFBeEM7QUFDQzBVLGlCQUFPeVksT0FBUCxDQUFlNUwsRUFBRSx5Q0FBRixDQUFmO0FBQ0E7QUFURjtBQzhCSTs7QURuQkosVUFBRzZMLFlBQUg7QUFDQzBELGVBQU92UCxFQUFFbVAsV0FBRixFQUFrQjUwQixPQUFPbU0sS0FBUCxHQUFhLEtBQWIsR0FBa0JtbEIsWUFBbEIsR0FBK0IsSUFBakQsQ0FBUDtBQUREO0FBR0MwRCxlQUFPdlAsRUFBRW1QLFdBQUYsRUFBZSxLQUFHNTBCLE9BQU9tTSxLQUF6QixDQUFQO0FDcUJHOztBQUNELGFEckJIK29CLEtBQ0M7QUFBQW5DLGVBQU90TixFQUFFb1AsWUFBRixFQUFnQixLQUFHNzBCLE9BQU9tTSxLQUExQixDQUFQO0FBQ0E2b0IsY0FBTSx5Q0FBdUNBLElBQXZDLEdBQTRDLFFBRGxEO0FBRUFyVSxjQUFNLElBRk47QUFHQXdVLDBCQUFpQixJQUhqQjtBQUlBQywyQkFBbUIzUCxFQUFFLFFBQUYsQ0FKbkI7QUFLQTRQLDBCQUFrQjVQLEVBQUUsUUFBRjtBQUxsQixPQURELEVBT0MsVUFBQ3ZSLE1BQUQ7QUFDQyxZQUFBb2hCLGtCQUFBLEVBQUFDLGFBQUE7O0FBQUEsWUFBR3JoQixNQUFIO0FBQ0MsY0FBRzNHLFNBQUg7QUN1Qk0sbUJEckJMMmlCLGNBQWNudkIsV0FBZCxFQUEyQndNLFNBQTNCLEVBQXNDK2pCLFlBQXRDLEVBQW9EamtCLFlBQXBELEVBQWtFbkIsTUFBbEUsRUFBMEU7QUFFekUsa0JBQUFzcEIsRUFBQSxFQUFBQyxLQUFBLEVBQUF4RCxtQkFBQSxFQUFBQyxpQkFBQSxFQUFBd0Qsa0JBQUEsRUFBQUMsYUFBQSxFQUFBQyxtQkFBQSxFQUFBQyxjQUFBLEVBQUFDLFNBQUEsRUFBQWgwQixHQUFBLEVBQUFpMEIsY0FBQTs7QUFBQUgsb0NBQXNCNzBCLFlBQVltUSxPQUFaLENBQW9CLEtBQXBCLEVBQTBCLEdBQTFCLENBQXRCO0FBQ0F5a0IsOEJBQWdCckMsRUFBRSxvQkFBa0JzQyxtQkFBcEIsQ0FBaEI7O0FBQ0Esb0JBQUFELGlCQUFBLE9BQU9BLGNBQWV6eEIsTUFBdEIsR0FBc0IsTUFBdEI7QUFDQyxvQkFBRzZzQixPQUFPaUYsTUFBVjtBQUNDSCxtQ0FBaUIsS0FBakI7QUFDQUYsa0NBQWdCNUUsT0FBT2lGLE1BQVAsQ0FBYzFDLENBQWQsQ0FBZ0Isb0JBQWtCc0MsbUJBQWxDLENBQWhCO0FBSEY7QUMwQk87O0FEdEJQO0FBRUMzRCxzQ0FBc0I5dkIsUUFBUUMsR0FBUixDQUFZLGFBQVosQ0FBdEI7QUFDQTh2QixvQ0FBb0IvdkIsUUFBUUMsR0FBUixDQUFZLFdBQVosQ0FBcEI7O0FBQ0Esb0JBQUc2dkIsdUJBQUEsRUFBQW53QixNQUFBL0ksUUFBQTZJLFNBQUEsQ0FBQXF3QixtQkFBQSxhQUFBbndCLElBQStENlgsT0FBL0QsR0FBK0QsTUFBL0QsSUFBeUUsQ0FBNUU7QUFDQzZZLDRCQUFVUyxZQUFWLENBQXVCaEIsbUJBQXZCLEVBQTRDQyxpQkFBNUM7QUN1Qk87O0FEdEJSLG9CQUFHZ0IsV0FBV1ksT0FBWCxHQUFxQm1DLEtBQXJCLENBQTJCajhCLElBQTNCLENBQWdDazhCLFFBQWhDLENBQXlDLGFBQXpDLENBQUg7QUFDQyxzQkFBR24xQixnQkFBZW9CLFFBQVFDLEdBQVIsQ0FBWSxhQUFaLENBQWxCO0FBQ0M4d0IsK0JBQVdDLE1BQVg7QUFGRjtBQUFBO0FBSUNwQyx5QkFBT29GLFdBQVAsQ0FBbUIzQyxRQUFuQjtBQVZGO0FBQUEsdUJBQUE5ZCxNQUFBO0FBV004ZixxQkFBQTlmLE1BQUE7QUFDTHZXLHdCQUFRTyxLQUFSLENBQWM4MUIsRUFBZDtBQzJCTTs7QUQxQlAsa0JBQUFHLGlCQUFBLE9BQUdBLGNBQWV6eEIsTUFBbEIsR0FBa0IsTUFBbEI7QUFDQyxvQkFBR2xFLE9BQU9vYSxXQUFWO0FBQ0NzYix1Q0FBcUJDLGNBQWNTLFVBQWQsR0FBMkJBLFVBQTNCLENBQXNDLFVBQXRDLENBQXJCO0FBREQ7QUFHQ1YsdUNBQXFCQyxjQUFjVSxVQUFkLEdBQTJCQSxVQUEzQixDQUFzQyxVQUF0QyxDQUFyQjtBQUpGO0FDaUNPOztBRDVCUCxrQkFBR1gsa0JBQUg7QUFDQyxvQkFBRzExQixPQUFPb2EsV0FBVjtBQUNDc2IscUNBQW1CWSxPQUFuQjtBQUREO0FBR0Msc0JBQUd2MUIsZ0JBQWVvQixRQUFRQyxHQUFSLENBQVksYUFBWixDQUFsQjtBQUNDOHdCLCtCQUFXQyxNQUFYO0FBSkY7QUFERDtBQ3FDTzs7QUQ3QlAyQywwQkFBWS84QixRQUFReTdCLFlBQVIsQ0FBcUJ6ekIsV0FBckIsRUFBa0N3TSxTQUFsQyxDQUFaO0FBQ0F3b0IsK0JBQWlCaDlCLFFBQVF3OUIsaUJBQVIsQ0FBMEJ4MUIsV0FBMUIsRUFBdUMrMEIsU0FBdkMsQ0FBakI7O0FBQ0Esa0JBQUdELGtCQUFrQixDQUFDSCxrQkFBdEI7QUFDQyxvQkFBR0csY0FBSDtBQUNDOUUseUJBQU95RixLQUFQO0FBREQsdUJBRUssSUFBR2pwQixjQUFhcEwsUUFBUUMsR0FBUixDQUFZLFdBQVosQ0FBYixJQUEwQ2lMLGlCQUFnQixVQUE3RDtBQUNKb29CLDBCQUFRdHpCLFFBQVFDLEdBQVIsQ0FBWSxRQUFaLENBQVI7O0FBQ0EsdUJBQU8yekIsY0FBUDtBQUVDN0MsK0JBQVd1RCxFQUFYLENBQWMsVUFBUWhCLEtBQVIsR0FBYyxHQUFkLEdBQWlCMTBCLFdBQWpCLEdBQTZCLFFBQTdCLEdBQXFDc00sWUFBbkQ7QUFKRztBQUhOO0FDdUNPOztBRC9CUCxrQkFBR2trQixhQUFjLE9BQU9BLFNBQVAsS0FBb0IsVUFBckM7QUNpQ1EsdUJEaENQQSxXQ2dDTztBQUNEO0FEOUVSLGNDcUJLO0FEdkJOO0FBa0RDLGdCQUFHd0QsbUJBQW1CQSxnQkFBZ0I3d0IsTUFBdEM7QUFDQ292QixnQkFBRSxNQUFGLEVBQVVvRCxRQUFWLENBQW1CLFNBQW5CO0FBQ0FuQiw4QkFBZ0IsQ0FBaEI7O0FBQ0FELG1DQUFxQjtBQUNwQkM7O0FBQ0Esb0JBQUdBLGlCQUFpQlIsZ0JBQWdCN3dCLE1BQXBDO0FBRUNvdkIsb0JBQUUsTUFBRixFQUFVcUQsV0FBVixDQUFzQixTQUF0QjtBQ2lDUSx5QkRoQ1I1RixPQUFPb0YsV0FBUCxDQUFtQjNDLFFBQW5CLENDZ0NRO0FBQ0Q7QUR0Q1ksZUFBckI7O0FDd0NNLHFCRGxDTnVCLGdCQUFnQjlsQixPQUFoQixDQUF3QixVQUFDL0MsTUFBRDtBQUN2QixvQkFBQTBxQixXQUFBO0FBQUFycEIsNEJBQVlyQixPQUFPekosR0FBbkI7QUFDQWt5Qiw2QkFBYWpELFlBQVlJLE9BQVosQ0FBb0Ivd0IsV0FBcEIsRUFBaUMsUUFBakMsRUFBMkMsUUFBM0MsRUFBcUQ7QUFBQzBCLHVCQUFLOEs7QUFBTixpQkFBckQsQ0FBYjs7QUFDQSxvQkFBRyxDQUFDb25CLFVBQUo7QUFDQ1c7QUFDQTtBQ3NDTzs7QURyQ1JzQiw4QkFBYzFxQixPQUFPNG9CLFNBQVAsS0FBcUJ2bkIsU0FBbkM7QUN1Q08sdUJEdENQMmlCLGNBQWNudkIsV0FBZCxFQUEyQm1MLE9BQU96SixHQUFsQyxFQUF1Q20wQixXQUF2QyxFQUFvRHZwQixZQUFwRCxFQUFrRW5CLE1BQWxFLEVBQTJFO0FBQzFFLHNCQUFBNHBCLFNBQUE7QUFBQUEsOEJBQVkvOEIsUUFBUXk3QixZQUFSLENBQXFCenpCLFdBQXJCLEVBQWtDd00sU0FBbEMsQ0FBWjtBQUNBeFUsMEJBQVF3OUIsaUJBQVIsQ0FBMEJ4MUIsV0FBMUIsRUFBdUMrMEIsU0FBdkM7QUN3Q1EseUJEdkNSUixvQkN1Q1E7QUQxQ2lFLGlCQUExRSxFQUlHO0FDd0NNLHlCRHZDUkEsb0JDdUNRO0FENUNULGtCQ3NDTztBRDdDUixnQkNrQ007QUQ3RlI7QUFERDtBQ29ISTtBRDVITixRQ3FCRztBRDNJSjtBQUFBLEdBRkQ7QUN3UEEsQyIsImZpbGUiOiIvcGFja2FnZXMvc3RlZWRvc19vYmplY3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiQGRiID0ge31cbmlmICFDcmVhdG9yP1xuXHRAQ3JlYXRvciA9IHt9XG5DcmVhdG9yLk9iamVjdHMgPSB7fVxuQ3JlYXRvci5Db2xsZWN0aW9ucyA9IHt9XG5DcmVhdG9yLk1lbnVzID0gW11cbkNyZWF0b3IuQXBwcyA9IHt9XG5DcmVhdG9yLkRhc2hib2FyZHMgPSB7fVxuQ3JlYXRvci5SZXBvcnRzID0ge31cbkNyZWF0b3Iuc3VicyA9IHt9XG5DcmVhdG9yLnN0ZWVkb3NTY2hlbWEgPSB7fSIsInRoaXMuZGIgPSB7fTtcblxuaWYgKHR5cGVvZiBDcmVhdG9yID09PSBcInVuZGVmaW5lZFwiIHx8IENyZWF0b3IgPT09IG51bGwpIHtcbiAgdGhpcy5DcmVhdG9yID0ge307XG59XG5cbkNyZWF0b3IuT2JqZWN0cyA9IHt9O1xuXG5DcmVhdG9yLkNvbGxlY3Rpb25zID0ge307XG5cbkNyZWF0b3IuTWVudXMgPSBbXTtcblxuQ3JlYXRvci5BcHBzID0ge307XG5cbkNyZWF0b3IuRGFzaGJvYXJkcyA9IHt9O1xuXG5DcmVhdG9yLlJlcG9ydHMgPSB7fTtcblxuQ3JlYXRvci5zdWJzID0ge307XG5cbkNyZWF0b3Iuc3RlZWRvc1NjaGVtYSA9IHt9O1xuIiwidHJ5XG5cdGlmIHByb2Nlc3MuZW52LkNSRUFUT1JfTk9ERV9FTlYgPT0gJ2RldmVsb3BtZW50J1xuXHRcdHN0ZWVkb3NDb3JlID0gcmVxdWlyZSgnQHN0ZWVkb3MvY29yZScpXG5cdFx0b2JqZWN0cWwgPSByZXF1aXJlKCdAc3RlZWRvcy9vYmplY3RxbCcpXG5cdFx0bW9sZWN1bGVyID0gcmVxdWlyZShcIm1vbGVjdWxlclwiKTtcblx0XHRwYWNrYWdlTG9hZGVyID0gcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1tZXRlb3ItcGFja2FnZS1sb2FkZXInKTtcblx0XHRBUElTZXJ2aWNlID0gcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1hcGknKTtcblx0XHRNZXRhZGF0YVNlcnZpY2UgPSByZXF1aXJlKCdAc3RlZWRvcy9zZXJ2aWNlLW1ldGFkYXRhLXNlcnZlcicpO1xuXHRcdHBhY2thZ2VTZXJ2aWNlID0gcmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2UtcGFja2FnZS1yZWdpc3RyeVwiKTtcblx0XHRwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cblx0XHRjb25maWcgPSBvYmplY3RxbC5nZXRTdGVlZG9zQ29uZmlnKCk7XG5cdFx0c2V0dGluZ3MgPSB7XG5cdFx0XHRidWlsdF9pbl9wbHVnaW5zOiBbXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc3RhbmRhcmQtc3BhY2VcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zdGFuZGFyZC1vYmplY3QtZGF0YWJhc2VcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zdGFuZGFyZC1wcm9jZXNzLWFwcHJvdmFsXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc3RhbmRhcmQtY29sbGFib3JhdGlvblwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3N0YW5kYXJkLXVpXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc3RhbmRhcmQtcGVybWlzc2lvblwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3dlYmFwcC1wdWJsaWNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLWNhY2hlcnMtbWFuYWdlclwiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3VucGtnXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvd29ya2Zsb3dcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9hY2NvdW50c1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3BsdWdpbi1jb21wYW55XCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3MvbWV0YWRhdGEtYXBpXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3MvZGF0YS1pbXBvcnRcIixcblx0XHRcdFx0IyBcIkBzdGVlZG9zL3NlcnZpY2UtZmllbGRzLWluZGV4c1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3NlcnZpY2UtYWNjb3VudHNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLWNoYXJ0c1wiLFxuXHRcdFx0XHQjIFwiQHN0ZWVkb3Mvc2VydmljZS1wYWdlc1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3NlcnZpY2UtcGFja2FnZS1yZWdpc3RyeVwiLFxuXHRcdCAgIFx0XHRcIkBzdGVlZG9zL3NlcnZpY2UtcGFja2FnZS10b29sXCIsXG5cdFx0XHRcdCMgXCJAc3RlZWRvcy9zdGFuZGFyZC1wcm9jZXNzXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvd2ViYXBwLWFjY291bnRzXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS13b3JrZmxvd1wiLFxuXHRcdFx0XHRcIkBzdGVlZG9zL3NlcnZpY2UtcGx1Z2luLWFtaXNcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLWZpbGVzXCIsXG5cdFx0XHRcdFwiQHN0ZWVkb3Mvc2VydmljZS1zZW50cnlcIixcblx0XHRcdFx0XCJAc3RlZWRvcy9zZXJ2aWNlLWlkZW50aXR5LWp3dFwiXG5cdFx0XHRdLFxuXHRcdFx0cGx1Z2luczogY29uZmlnLnBsdWdpbnNcblx0XHR9XG5cdFx0TWV0ZW9yLnN0YXJ0dXAgLT5cblx0XHRcdHRyeVxuXHRcdFx0XHRicm9rZXIgPSBuZXcgbW9sZWN1bGVyLlNlcnZpY2VCcm9rZXIoe1xuXHRcdFx0XHRcdG5hbWVzcGFjZTogXCJzdGVlZG9zXCIsXG5cdFx0XHRcdFx0bm9kZUlEOiBcInN0ZWVkb3MtY3JlYXRvclwiLFxuXHRcdFx0XHRcdG1ldGFkYXRhOiB7fSxcblx0XHRcdFx0XHR0cmFuc3BvcnRlcjogcHJvY2Vzcy5lbnYuVFJBTlNQT1JURVIsXG5cdFx0XHRcdFx0Y2FjaGVyOiBwcm9jZXNzLmVudi5DQUNIRVIsXG5cdFx0XHRcdFx0bG9nTGV2ZWw6IFwid2FyblwiLFxuXHRcdFx0XHRcdHNlcmlhbGl6ZXI6IFwiSlNPTlwiLFxuXHRcdFx0XHRcdHJlcXVlc3RUaW1lb3V0OiA2MCAqIDEwMDAsXG5cdFx0XHRcdFx0bWF4Q2FsbExldmVsOiAxMDAsXG5cblx0XHRcdFx0XHRoZWFydGJlYXRJbnRlcnZhbDogMTAsXG5cdFx0XHRcdFx0aGVhcnRiZWF0VGltZW91dDogMzAsXG5cblx0XHRcdFx0XHRjb250ZXh0UGFyYW1zQ2xvbmluZzogZmFsc2UsXG5cblx0XHRcdFx0XHR0cmFja2luZzoge1xuXHRcdFx0XHRcdFx0ZW5hYmxlZDogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaHV0ZG93blRpbWVvdXQ6IDUwMDAsXG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdGRpc2FibGVCYWxhbmNlcjogZmFsc2UsXG5cblx0XHRcdFx0XHRyZWdpc3RyeToge1xuXHRcdFx0XHRcdFx0c3RyYXRlZ3k6IFwiUm91bmRSb2JpblwiLFxuXHRcdFx0XHRcdFx0cHJlZmVyTG9jYWw6IHRydWVcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0YnVsa2hlYWQ6IHtcblx0XHRcdFx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Y29uY3VycmVuY3k6IDEwLFxuXHRcdFx0XHRcdFx0bWF4UXVldWVTaXplOiAxMDAsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR2YWxpZGF0b3I6IHRydWUsXG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyOiBudWxsLFxuXHRcdFx0XHRcdHRyYWNpbmc6IHtcblx0XHRcdFx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0ZXhwb3J0ZXI6IHtcblx0XHRcdFx0XHRcdFx0dHlwZTogXCJDb25zb2xlXCIsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdFx0XHRsb2dnZXI6IG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0Y29sb3JzOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0XHRcdFx0Z2F1Z2VXaWR0aDogNDBcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2tpcFByb2Nlc3NFdmVudFJlZ2lzdHJhdGlvbjogdHJ1ZSxcblxuXHRcdFx0XHRcdGNyZWF0ZWQ6IChicm9rZXIpLT4gXG5cdFx0XHRcdFx0XHQjIENsZWFyIGFsbCBjYWNoZSBlbnRyaWVzXG5cdFx0XHRcdFx0XHRicm9rZXIubG9nZ2VyLndhcm4oJ0NsZWFyIGFsbCBjYWNoZSBlbnRyaWVzIG9uIHN0YXJ0dXAuJylcblx0XHRcdFx0XHRcdGJyb2tlci5jYWNoZXIuY2xlYW4oKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0b2JqZWN0cWwuYnJva2VyLmluaXQoYnJva2VyKTtcblxuXHRcdFx0XHRvYmplY3RxbFNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZShyZXF1aXJlKFwiQHN0ZWVkb3Mvc2VydmljZS1vYmplY3RxbFwiKSk7XG5cdFx0XHRcdFxuXHRcdFx0XHRwcm9qZWN0U2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcblx0XHRcdFx0XHRuYW1lOiBcInByb2plY3Qtc2VydmVyXCIsXG5cdFx0XHRcdFx0bmFtZXNwYWNlOiBcInN0ZWVkb3NcIixcblx0XHRcdFx0XHRtaXhpbnM6IFtwYWNrYWdlU2VydmljZV0sXG5cdFx0XHRcdH0pO1xuXG5cblx0XHRcdFx0bWV0YWRhdGFTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuXHRcdFx0XHRcdG5hbWU6ICdtZXRhZGF0YS1zZXJ2ZXInLFxuXHRcdFx0XHRcdG1peGluczogW01ldGFkYXRhU2VydmljZV0sXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHR9IFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR1aVNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZShyZXF1aXJlKFwiQHN0ZWVkb3Mvc2VydmljZS11aVwiKSk7XG5cblx0XHRcdFx0YXBpU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcblx0XHRcdFx0XHRuYW1lOiBcImFwaVwiLFxuXHRcdFx0XHRcdG1peGluczogW0FQSVNlcnZpY2VdLFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRwb3J0OiBudWxsXG5cdFx0XHRcdFx0fSBcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cGFnZVNlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG5cdFx0XHRcdFx0bmFtZTogXCJAc3RlZWRvcy9zZXJ2aWNlLXBhZ2VzXCIsXG5cdFx0XHRcdFx0bWl4aW5zOiBbcmVxdWlyZSgnQHN0ZWVkb3Mvc2VydmljZS1wYWdlcycpXSxcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0cG9ydDogbnVsbFxuXHRcdFx0XHRcdH0gXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHN0ZWVkb3NTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuXHRcdFx0XHRcdG5hbWU6IFwic3RlZWRvcy1zZXJ2ZXJcIixcblx0XHRcdFx0XHRtaXhpbnM6IFtdLFxuXHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRwb3J0OiBudWxsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzdGFydGVkOiAoKS0+XG5cdFx0XHRcdFx0XHRzZXRUaW1lb3V0IC0+XG5cdFx0XHRcdFx0XHRcdGJyb2tlci5lbWl0ICdzdGVlZG9zLXNlcnZlci5zdGFydGVkJ1xuXHRcdFx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0XHRcdCwgMTAwMFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRvYmplY3RxbC5nZXRTdGVlZG9zU2NoZW1hKGJyb2tlcik7XG5cdFx0XHRcdHN0YW5kYXJkT2JqZWN0c0RpciA9IG9iamVjdHFsLlN0YW5kYXJkT2JqZWN0c1BhdGg7XG5cdFx0XHRcdHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuXHRcdFx0XHRcdG5hbWU6ICdzdGFuZGFyZC1vYmplY3RzJyxcblx0XHRcdFx0XHRtaXhpbnM6IFtwYWNrYWdlTG9hZGVyXSxcblx0XHRcdFx0XHRzZXR0aW5nczogeyBwYWNrYWdlSW5mbzoge1xuXHRcdFx0XHRcdFx0cGF0aDogc3RhbmRhcmRPYmplY3RzRGlyLFxuXHRcdFx0XHRcdH0gfVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRNZXRlb3Iud3JhcEFzeW5jKChjYiktPlxuXHRcdFx0XHRcdGJyb2tlci5zdGFydCgpLnRoZW4oKCktPlxuXHRcdFx0XHRcdFx0aWYgIWJyb2tlci5zdGFydGVkIFxuXHRcdFx0XHRcdFx0XHRicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKG9iamVjdHFsU2VydmljZSk7XG5cdFx0XHRcdFx0XHRcdGJyb2tlci5fcmVzdGFydFNlcnZpY2Uoc3RhbmRhcmRPYmplY3RzUGFja2FnZUxvYWRlclNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0XHRicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKHVpU2VydmljZSk7XG5cblx0XHRcdFx0XHRcdGV4cHJlc3MgPSByZXF1aXJlKCdleHByZXNzJyk7XG5cdFx0XHRcdFx0XHRjb25uZWN0SGFuZGxlcnNFeHByZXNzID0gZXhwcmVzcygpO1xuXHRcdFx0XHRcdFx0Y29ubmVjdEhhbmRsZXJzRXhwcmVzcy51c2UocmVxdWlyZSgnQHN0ZWVkb3Mvcm91dGVyJykuc3RhdGljUm91dGVyKCkpO1xuXHRcdFx0XHRcdFx0YnJva2VyLndhaXRGb3JTZXJ2aWNlcygnfnBhY2thZ2VzLUBzdGVlZG9zL3NlcnZpY2UtdWknKS50aGVuICgpLT5cblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ3dhaXRGb3JTZXJ2aWNlcyB+cGFja2FnZXMtQHN0ZWVkb3Mvc2VydmljZS11aScpXG5cdFx0XHRcdFx0XHRcdGNvbm5lY3RIYW5kbGVyc0V4cHJlc3MudXNlKFN0ZWVkb3NBcGkuZXhwcmVzcygpKVxuXHRcdFx0XHRcdFx0XHRXZWJBcHAuY29ubmVjdEhhbmRsZXJzLnVzZShjb25uZWN0SGFuZGxlcnNFeHByZXNzKVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQjIHN0ZWVkb3NDb3JlLmluaXQoc2V0dGluZ3MpLnRoZW4gKCktPlxuXHRcdFx0XHRcdFx0IyBcdGNiKCk7XG5cblx0XHRcdFx0XHRcdGJyb2tlci53YWl0Rm9yU2VydmljZXMoc3RhbmRhcmRPYmplY3RzUGFja2FnZUxvYWRlclNlcnZpY2UubmFtZSkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuXHRcdFx0XHRcdFx0XHRzdGVlZG9zQ29yZS5pbml0KHNldHRpbmdzKS50aGVuICgpLT5cblx0XHRcdFx0XHRcdFx0XHRjYihyZWplY3QsIHJlc29sdmUpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpKClcblx0XHRcdGNhdGNoIGV4XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJlcnJvcjpcIixleClcbmNhdGNoIGVcblx0Y29uc29sZS5lcnJvcihcImVycm9yOlwiLGUpIiwidmFyIEFQSVNlcnZpY2UsIE1ldGFkYXRhU2VydmljZSwgY29uZmlnLCBlLCBtb2xlY3VsZXIsIG9iamVjdHFsLCBwYWNrYWdlTG9hZGVyLCBwYWNrYWdlU2VydmljZSwgcGF0aCwgc2V0dGluZ3MsIHN0ZWVkb3NDb3JlO1xuXG50cnkge1xuICBpZiAocHJvY2Vzcy5lbnYuQ1JFQVRPUl9OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgIHN0ZWVkb3NDb3JlID0gcmVxdWlyZSgnQHN0ZWVkb3MvY29yZScpO1xuICAgIG9iamVjdHFsID0gcmVxdWlyZSgnQHN0ZWVkb3Mvb2JqZWN0cWwnKTtcbiAgICBtb2xlY3VsZXIgPSByZXF1aXJlKFwibW9sZWN1bGVyXCIpO1xuICAgIHBhY2thZ2VMb2FkZXIgPSByZXF1aXJlKCdAc3RlZWRvcy9zZXJ2aWNlLW1ldGVvci1wYWNrYWdlLWxvYWRlcicpO1xuICAgIEFQSVNlcnZpY2UgPSByZXF1aXJlKCdAc3RlZWRvcy9zZXJ2aWNlLWFwaScpO1xuICAgIE1ldGFkYXRhU2VydmljZSA9IHJlcXVpcmUoJ0BzdGVlZG9zL3NlcnZpY2UtbWV0YWRhdGEtc2VydmVyJyk7XG4gICAgcGFja2FnZVNlcnZpY2UgPSByZXF1aXJlKFwiQHN0ZWVkb3Mvc2VydmljZS1wYWNrYWdlLXJlZ2lzdHJ5XCIpO1xuICAgIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4gICAgY29uZmlnID0gb2JqZWN0cWwuZ2V0U3RlZWRvc0NvbmZpZygpO1xuICAgIHNldHRpbmdzID0ge1xuICAgICAgYnVpbHRfaW5fcGx1Z2luczogW1wiQHN0ZWVkb3Mvc3RhbmRhcmQtc3BhY2VcIiwgXCJAc3RlZWRvcy9zdGFuZGFyZC1vYmplY3QtZGF0YWJhc2VcIiwgXCJAc3RlZWRvcy9zdGFuZGFyZC1wcm9jZXNzLWFwcHJvdmFsXCIsIFwiQHN0ZWVkb3Mvc3RhbmRhcmQtY29sbGFib3JhdGlvblwiLCBcIkBzdGVlZG9zL3N0YW5kYXJkLXVpXCIsIFwiQHN0ZWVkb3Mvc3RhbmRhcmQtcGVybWlzc2lvblwiLCBcIkBzdGVlZG9zL3dlYmFwcC1wdWJsaWNcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLWNhY2hlcnMtbWFuYWdlclwiLCBcIkBzdGVlZG9zL3VucGtnXCIsIFwiQHN0ZWVkb3Mvd29ya2Zsb3dcIiwgXCJAc3RlZWRvcy9hY2NvdW50c1wiLCBcIkBzdGVlZG9zL3BsdWdpbi1jb21wYW55XCIsIFwiQHN0ZWVkb3MvbWV0YWRhdGEtYXBpXCIsIFwiQHN0ZWVkb3MvZGF0YS1pbXBvcnRcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLWFjY291bnRzXCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1jaGFydHNcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLXBhY2thZ2UtcmVnaXN0cnlcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLXBhY2thZ2UtdG9vbFwiLCBcIkBzdGVlZG9zL3dlYmFwcC1hY2NvdW50c1wiLCBcIkBzdGVlZG9zL3NlcnZpY2Utd29ya2Zsb3dcIiwgXCJAc3RlZWRvcy9zZXJ2aWNlLXBsdWdpbi1hbWlzXCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1maWxlc1wiLCBcIkBzdGVlZG9zL3NlcnZpY2Utc2VudHJ5XCIsIFwiQHN0ZWVkb3Mvc2VydmljZS1pZGVudGl0eS1qd3RcIl0sXG4gICAgICBwbHVnaW5zOiBjb25maWcucGx1Z2luc1xuICAgIH07XG4gICAgTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXBpU2VydmljZSwgYnJva2VyLCBleCwgbWV0YWRhdGFTZXJ2aWNlLCBvYmplY3RxbFNlcnZpY2UsIHBhZ2VTZXJ2aWNlLCBwcm9qZWN0U2VydmljZSwgc3RhbmRhcmRPYmplY3RzRGlyLCBzdGFuZGFyZE9iamVjdHNQYWNrYWdlTG9hZGVyU2VydmljZSwgc3RlZWRvc1NlcnZpY2UsIHVpU2VydmljZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJyb2tlciA9IG5ldyBtb2xlY3VsZXIuU2VydmljZUJyb2tlcih7XG4gICAgICAgICAgbmFtZXNwYWNlOiBcInN0ZWVkb3NcIixcbiAgICAgICAgICBub2RlSUQ6IFwic3RlZWRvcy1jcmVhdG9yXCIsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICAgIHRyYW5zcG9ydGVyOiBwcm9jZXNzLmVudi5UUkFOU1BPUlRFUixcbiAgICAgICAgICBjYWNoZXI6IHByb2Nlc3MuZW52LkNBQ0hFUixcbiAgICAgICAgICBsb2dMZXZlbDogXCJ3YXJuXCIsXG4gICAgICAgICAgc2VyaWFsaXplcjogXCJKU09OXCIsXG4gICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IDYwICogMTAwMCxcbiAgICAgICAgICBtYXhDYWxsTGV2ZWw6IDEwMCxcbiAgICAgICAgICBoZWFydGJlYXRJbnRlcnZhbDogMTAsXG4gICAgICAgICAgaGVhcnRiZWF0VGltZW91dDogMzAsXG4gICAgICAgICAgY29udGV4dFBhcmFtc0Nsb25pbmc6IGZhbHNlLFxuICAgICAgICAgIHRyYWNraW5nOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHNodXRkb3duVGltZW91dDogNTAwMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlzYWJsZUJhbGFuY2VyOiBmYWxzZSxcbiAgICAgICAgICByZWdpc3RyeToge1xuICAgICAgICAgICAgc3RyYXRlZ3k6IFwiUm91bmRSb2JpblwiLFxuICAgICAgICAgICAgcHJlZmVyTG9jYWw6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJ1bGtoZWFkOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiAxMCxcbiAgICAgICAgICAgIG1heFF1ZXVlU2l6ZTogMTAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0b3I6IHRydWUsXG4gICAgICAgICAgZXJyb3JIYW5kbGVyOiBudWxsLFxuICAgICAgICAgIHRyYWNpbmc6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXhwb3J0ZXI6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJDb25zb2xlXCIsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBsb2dnZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgY29sb3JzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgZ2F1Z2VXaWR0aDogNDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2tpcFByb2Nlc3NFdmVudFJlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbihicm9rZXIpIHtcbiAgICAgICAgICAgIGJyb2tlci5sb2dnZXIud2FybignQ2xlYXIgYWxsIGNhY2hlIGVudHJpZXMgb24gc3RhcnR1cC4nKTtcbiAgICAgICAgICAgIHJldHVybiBicm9rZXIuY2FjaGVyLmNsZWFuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb2JqZWN0cWwuYnJva2VyLmluaXQoYnJva2VyKTtcbiAgICAgICAgb2JqZWN0cWxTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2UocmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2Utb2JqZWN0cWxcIikpO1xuICAgICAgICBwcm9qZWN0U2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgICBuYW1lOiBcInByb2plY3Qtc2VydmVyXCIsXG4gICAgICAgICAgbmFtZXNwYWNlOiBcInN0ZWVkb3NcIixcbiAgICAgICAgICBtaXhpbnM6IFtwYWNrYWdlU2VydmljZV1cbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGFkYXRhU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgICBuYW1lOiAnbWV0YWRhdGEtc2VydmVyJyxcbiAgICAgICAgICBtaXhpbnM6IFtNZXRhZGF0YVNlcnZpY2VdLFxuICAgICAgICAgIHNldHRpbmdzOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdWlTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2UocmVxdWlyZShcIkBzdGVlZG9zL3NlcnZpY2UtdWlcIikpO1xuICAgICAgICBhcGlTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuICAgICAgICAgIG5hbWU6IFwiYXBpXCIsXG4gICAgICAgICAgbWl4aW5zOiBbQVBJU2VydmljZV0sXG4gICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgIHBvcnQ6IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwYWdlU2VydmljZSA9IGJyb2tlci5jcmVhdGVTZXJ2aWNlKHtcbiAgICAgICAgICBuYW1lOiBcIkBzdGVlZG9zL3NlcnZpY2UtcGFnZXNcIixcbiAgICAgICAgICBtaXhpbnM6IFtyZXF1aXJlKCdAc3RlZWRvcy9zZXJ2aWNlLXBhZ2VzJyldLFxuICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICBwb3J0OiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3RlZWRvc1NlcnZpY2UgPSBicm9rZXIuY3JlYXRlU2VydmljZSh7XG4gICAgICAgICAgbmFtZTogXCJzdGVlZG9zLXNlcnZlclwiLFxuICAgICAgICAgIG1peGluczogW10sXG4gICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgIHBvcnQ6IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXJ0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGJyb2tlci5lbWl0KCdzdGVlZG9zLXNlcnZlci5zdGFydGVkJyk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvYmplY3RxbC5nZXRTdGVlZG9zU2NoZW1hKGJyb2tlcik7XG4gICAgICAgIHN0YW5kYXJkT2JqZWN0c0RpciA9IG9iamVjdHFsLlN0YW5kYXJkT2JqZWN0c1BhdGg7XG4gICAgICAgIHN0YW5kYXJkT2JqZWN0c1BhY2thZ2VMb2FkZXJTZXJ2aWNlID0gYnJva2VyLmNyZWF0ZVNlcnZpY2Uoe1xuICAgICAgICAgIG5hbWU6ICdzdGFuZGFyZC1vYmplY3RzJyxcbiAgICAgICAgICBtaXhpbnM6IFtwYWNrYWdlTG9hZGVyXSxcbiAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgcGFja2FnZUluZm86IHtcbiAgICAgICAgICAgICAgcGF0aDogc3RhbmRhcmRPYmplY3RzRGlyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIE1ldGVvci53cmFwQXN5bmMoZnVuY3Rpb24oY2IpIHtcbiAgICAgICAgICByZXR1cm4gYnJva2VyLnN0YXJ0KCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjb25uZWN0SGFuZGxlcnNFeHByZXNzLCBleHByZXNzO1xuICAgICAgICAgICAgaWYgKCFicm9rZXIuc3RhcnRlZCkge1xuICAgICAgICAgICAgICBicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKG9iamVjdHFsU2VydmljZSk7XG4gICAgICAgICAgICAgIGJyb2tlci5fcmVzdGFydFNlcnZpY2Uoc3RhbmRhcmRPYmplY3RzUGFja2FnZUxvYWRlclNlcnZpY2UpO1xuICAgICAgICAgICAgICBicm9rZXIuX3Jlc3RhcnRTZXJ2aWNlKHVpU2VydmljZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHByZXNzID0gcmVxdWlyZSgnZXhwcmVzcycpO1xuICAgICAgICAgICAgY29ubmVjdEhhbmRsZXJzRXhwcmVzcyA9IGV4cHJlc3MoKTtcbiAgICAgICAgICAgIGNvbm5lY3RIYW5kbGVyc0V4cHJlc3MudXNlKHJlcXVpcmUoJ0BzdGVlZG9zL3JvdXRlcicpLnN0YXRpY1JvdXRlcigpKTtcbiAgICAgICAgICAgIGJyb2tlci53YWl0Rm9yU2VydmljZXMoJ35wYWNrYWdlcy1Ac3RlZWRvcy9zZXJ2aWNlLXVpJykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3dhaXRGb3JTZXJ2aWNlcyB+cGFja2FnZXMtQHN0ZWVkb3Mvc2VydmljZS11aScpO1xuICAgICAgICAgICAgICBjb25uZWN0SGFuZGxlcnNFeHByZXNzLnVzZShTdGVlZG9zQXBpLmV4cHJlc3MoKSk7XG4gICAgICAgICAgICAgIHJldHVybiBXZWJBcHAuY29ubmVjdEhhbmRsZXJzLnVzZShjb25uZWN0SGFuZGxlcnNFeHByZXNzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJyb2tlci53YWl0Rm9yU2VydmljZXMoc3RhbmRhcmRPYmplY3RzUGFja2FnZUxvYWRlclNlcnZpY2UubmFtZSkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0ZWVkb3NDb3JlLmluaXQoc2V0dGluZ3MpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNiKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBleCA9IGVycm9yO1xuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcImVycm9yOlwiLCBleCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0gY2F0Y2ggKGVycm9yKSB7XG4gIGUgPSBlcnJvcjtcbiAgY29uc29sZS5lcnJvcihcImVycm9yOlwiLCBlKTtcbn1cbiIsIkNyZWF0b3IuZGVwcyA9IHtcblx0YXBwOiBuZXcgVHJhY2tlci5EZXBlbmRlbmN5XG5cdG9iamVjdDogbmV3IFRyYWNrZXIuRGVwZW5kZW5jeVxufTtcblxuQ3JlYXRvci5fVEVNUExBVEUgPSB7XG5cdEFwcHM6IHt9LFxuXHRPYmplY3RzOiB7fVxufVxuXG5NZXRlb3Iuc3RhcnR1cCAtPlxuXHRTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7ZmlsdGVyc0Z1bmN0aW9uOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSl9KVxuXHRTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7b3B0aW9uc0Z1bmN0aW9uOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSl9KVxuXHRTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7Y3JlYXRlRnVuY3Rpb246IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKX0pXG5cbiMgQ3JlYXRvci5maWJlckxvYWRPYmplY3RzIOS+m3N0ZWVkb3MtY2xp6aG555uu5L2/55SoXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblx0RmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKVxuXHRDcmVhdG9yLmZpYmVyTG9hZE9iamVjdHMgPSAob2JqLCBvYmplY3RfbmFtZSktPlxuXHRcdEZpYmVyKCgpLT5cblx0XHRcdENyZWF0b3IubG9hZE9iamVjdHMob2JqLCBvYmplY3RfbmFtZSlcblx0XHQpLnJ1bigpXG5cbkNyZWF0b3IubG9hZE9iamVjdHMgPSAob2JqLCBvYmplY3RfbmFtZSktPlxuXHRpZiAhb2JqZWN0X25hbWVcblx0XHRvYmplY3RfbmFtZSA9IG9iai5uYW1lXG5cblx0aWYgIW9iai5saXN0X3ZpZXdzXG5cdFx0b2JqLmxpc3Rfdmlld3MgPSB7fVxuXG5cdGlmIG9iai5zcGFjZVxuXHRcdG9iamVjdF9uYW1lID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uTmFtZShvYmopXG5cdGlmIG9iamVjdF9uYW1lID09ICdjZnNfZmlsZXNfZmlsZXJlY29yZCdcblx0XHRvYmplY3RfbmFtZSA9ICdjZnMuZmlsZXMuZmlsZXJlY29yZCdcblx0XHRvYmogPSBfLmNsb25lKG9iailcblx0XHRvYmoubmFtZSA9IG9iamVjdF9uYW1lXG5cdFx0Q3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXSA9IG9ialxuXG5cdENyZWF0b3IuY29udmVydE9iamVjdChvYmopXG5cdG5ldyBDcmVhdG9yLk9iamVjdChvYmopO1xuXG5cdENyZWF0b3IuaW5pdFRyaWdnZXJzKG9iamVjdF9uYW1lKVxuXHRDcmVhdG9yLmluaXRMaXN0Vmlld3Mob2JqZWN0X25hbWUpXG5cdHJldHVybiBvYmpcblxuQ3JlYXRvci5nZXRPYmplY3ROYW1lID0gKG9iamVjdCkgLT5cblx0aWYgb2JqZWN0LnNwYWNlXG5cdFx0cmV0dXJuIFwiY18je29iamVjdC5zcGFjZX1fI3tvYmplY3QubmFtZX1cIlxuXHRyZXR1cm4gb2JqZWN0Lm5hbWVcblxuQ3JlYXRvci5nZXRPYmplY3QgPSAob2JqZWN0X25hbWUsIHNwYWNlX2lkKS0+XG5cdGlmIF8uaXNBcnJheShvYmplY3RfbmFtZSlcblx0XHRyZXR1cm4gO1xuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRDcmVhdG9yLmRlcHM/Lm9iamVjdD8uZGVwZW5kKClcblx0aWYgIW9iamVjdF9uYW1lIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblxuI1x0aWYgIXNwYWNlX2lkICYmIG9iamVjdF9uYW1lXG4jXHRcdGlmIE1ldGVvci5pc0NsaWVudCAmJiAhb2JqZWN0X25hbWUuc3RhcnRzV2l0aCgnY18nKVxuI1x0XHRcdHNwYWNlX2lkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cblx0aWYgb2JqZWN0X25hbWVcbiNcdFx0aWYgc3BhY2VfaWRcbiNcdFx0XHRvYmogPSBDcmVhdG9yLm9iamVjdHNCeU5hbWVbXCJjXyN7c3BhY2VfaWR9XyN7b2JqZWN0X25hbWV9XCJdXG4jXHRcdFx0aWYgb2JqXG4jXHRcdFx0XHRyZXR1cm4gb2JqXG4jXG4jXHRcdG9iaiA9IF8uZmluZCBDcmVhdG9yLm9iamVjdHNCeU5hbWUsIChvKS0+XG4jXHRcdFx0XHRyZXR1cm4gby5fY29sbGVjdGlvbl9uYW1lID09IG9iamVjdF9uYW1lXG4jXHRcdGlmIG9ialxuI1x0XHRcdHJldHVybiBvYmpcblxuXHRcdHJldHVybiBDcmVhdG9yLm9iamVjdHNCeU5hbWVbb2JqZWN0X25hbWVdXG5cbkNyZWF0b3IuZ2V0T2JqZWN0QnlJZCA9IChvYmplY3RfaWQpLT5cblx0cmV0dXJuIF8uZmluZFdoZXJlKENyZWF0b3Iub2JqZWN0c0J5TmFtZSwge19pZDogb2JqZWN0X2lkfSlcblxuQ3JlYXRvci5yZW1vdmVPYmplY3QgPSAob2JqZWN0X25hbWUpLT5cblx0Y29uc29sZS5sb2coXCJyZW1vdmVPYmplY3RcIiwgb2JqZWN0X25hbWUpXG5cdGRlbGV0ZSBDcmVhdG9yLk9iamVjdHNbb2JqZWN0X25hbWVdXG5cdGRlbGV0ZSBDcmVhdG9yLm9iamVjdHNCeU5hbWVbb2JqZWN0X25hbWVdXG5cbkNyZWF0b3IuZ2V0Q29sbGVjdGlvbiA9IChvYmplY3RfbmFtZSwgc3BhY2VJZCktPlxuXHRpZiAhb2JqZWN0X25hbWVcblx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0aWYgb2JqZWN0X25hbWVcblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHJldHVybiBkYltvYmplY3RfbmFtZV1cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9uc1tDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSwgc3BhY2VJZCk/Ll9jb2xsZWN0aW9uX25hbWUgfHwgb2JqZWN0X25hbWVdXG5cbkNyZWF0b3IucmVtb3ZlQ29sbGVjdGlvbiA9IChvYmplY3RfbmFtZSktPlxuXHRkZWxldGUgQ3JlYXRvci5Db2xsZWN0aW9uc1tvYmplY3RfbmFtZV1cblxuQ3JlYXRvci5pc1NwYWNlQWRtaW4gPSAoc3BhY2VJZCwgdXNlcklkKS0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFx0aWYgIXVzZXJJZFxuXHRcdFx0dXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpXG5cblx0c3BhY2UgPSBDcmVhdG9yLmdldE9iamVjdChcInNwYWNlc1wiKT8uZGI/LmZpbmRPbmUoc3BhY2VJZCx7ZmllbGRzOnthZG1pbnM6MX19KVxuXHRpZiBzcGFjZT8uYWRtaW5zXG5cdFx0cmV0dXJuIHNwYWNlLmFkbWlucy5pbmRleE9mKHVzZXJJZCkgPj0gMFxuXG5cbkNyZWF0b3IuZXZhbHVhdGVGb3JtdWxhID0gKGZvcm11bGFyLCBjb250ZXh0LCBvcHRpb25zKS0+XG5cblx0aWYgIV8uaXNTdHJpbmcoZm9ybXVsYXIpXG5cdFx0cmV0dXJuIGZvcm11bGFyXG5cblx0aWYgQ3JlYXRvci5Gb3JtdWxhci5jaGVja0Zvcm11bGEoZm9ybXVsYXIpXG5cdFx0cmV0dXJuIENyZWF0b3IuRm9ybXVsYXIucnVuKGZvcm11bGFyLCBjb250ZXh0LCBvcHRpb25zKVxuXG5cdHJldHVybiBmb3JtdWxhclxuXG5DcmVhdG9yLmV2YWx1YXRlRmlsdGVycyA9IChmaWx0ZXJzLCBjb250ZXh0KS0+XG5cdHNlbGVjdG9yID0ge31cblx0Xy5lYWNoIGZpbHRlcnMsIChmaWx0ZXIpLT5cblx0XHRpZiBmaWx0ZXI/Lmxlbmd0aCA9PSAzXG5cdFx0XHRuYW1lID0gZmlsdGVyWzBdXG5cdFx0XHRhY3Rpb24gPSBmaWx0ZXJbMV1cblx0XHRcdHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdLCBjb250ZXh0KVxuXHRcdFx0c2VsZWN0b3JbbmFtZV0gPSB7fVxuXHRcdFx0c2VsZWN0b3JbbmFtZV1bYWN0aW9uXSA9IHZhbHVlXG5cdCMgY29uc29sZS5sb2coXCJldmFsdWF0ZUZpbHRlcnMtLT5zZWxlY3RvclwiLCBzZWxlY3Rvcilcblx0cmV0dXJuIHNlbGVjdG9yXG5cbkNyZWF0b3IuaXNDb21tb25TcGFjZSA9IChzcGFjZUlkKSAtPlxuXHRyZXR1cm4gc3BhY2VJZCA9PSAnY29tbW9uJ1xuXG4jIyNcblx0ZG9jc++8muW+heaOkuW6j+eahOaWh+aho+aVsOe7hFxuXHRpZHPvvJpfaWTpm4blkIhcblx0aWRfa2V5OiDpu5jorqTkuLpfaWRcblx0cmV0dXJuIOaMieeFp2lkc+eahOmhuuW6j+i/lOWbnuaWsOeahOaWh+aho+mbhuWQiFxuIyMjXG5DcmVhdG9yLmdldE9yZGVybHlTZXRCeUlkcyA9IChkb2NzLCBpZHMsIGlkX2tleSwgaGl0X2ZpcnN0KS0+XG5cblx0aWYgIWlkX2tleVxuXHRcdGlkX2tleSA9IFwiX2lkXCJcblxuXHRpZiBoaXRfZmlyc3RcblxuXHRcdCPnlLHkuo7kuI3og73kvb/nlKhfLmZpbmRJbmRleOWHveaVsO+8jOWboOatpOatpOWkhOWFiOWwhuWvueixoeaVsOe7hOi9rOS4uuaZrumAmuaVsOe7hOexu+Wei++8jOWcqOiOt+WPluWFtmluZGV4XG5cdFx0dmFsdWVzID0gZG9jcy5nZXRQcm9wZXJ0eShpZF9rZXkpXG5cblx0XHRyZXR1cm5cdF8uc29ydEJ5IGRvY3MsIChkb2MpLT5cblx0XHRcdFx0XHRfaW5kZXggPSBpZHMuaW5kZXhPZihkb2NbaWRfa2V5XSlcblx0XHRcdFx0XHRpZiBfaW5kZXggPiAtMVxuXHRcdFx0XHRcdFx0cmV0dXJuIF9pbmRleFxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJldHVybiBpZHMubGVuZ3RoICsgXy5pbmRleE9mKHZhbHVlcywgZG9jW2lkX2tleV0pXG5cdGVsc2Vcblx0XHRyZXR1cm5cdF8uc29ydEJ5IGRvY3MsIChkb2MpLT5cblx0XHRcdHYgPSBpZHMuaW5kZXhPZihkb2NbaWRfa2V5XSk7XG5cdFx0XHRpZiB2IDwgMFxuXHRcdFx0XHRyZXR1cm4gOTk5OTlcblx0XHRcdGVsc2UgXG5cdFx0XHRcdHJldHVybiB2XG5cbiMjI1xuXHTmjInnlKjmiLfmiYDlsZ7mnKzlnLDljJbor63oqIDov5vooYzmjpLluo/vvIzmlK/mjIHkuK3mlofjgIHmlbDlgLzjgIHml6XmnJ/nrYnlrZfmrrXmjpLluo9cblx05a+55LqOT2JqZWN057G75Z6L77yM5aaC5p6c5o+Q5L6b5L2c55So5Z+f5Lita2V55bGe5oCn77yM5YiZ5Y+W5YC85Li6dmFsdWVba2V5Xei/m+ihjOaOkuW6j+avlOi+g++8jOWPjeS5i+aVtOS4qk9iamVjdC50b1N0cmluZygp5ZCO5o6S5bqP5q+U6L6DXG4jIyNcbkNyZWF0b3Iuc29ydGluZ01ldGhvZCA9ICh2YWx1ZTEsIHZhbHVlMikgLT5cblx0aWYgdGhpcy5rZXlcblx0XHR2YWx1ZTEgPSB2YWx1ZTFbdGhpcy5rZXldXG5cdFx0dmFsdWUyID0gdmFsdWUyW3RoaXMua2V5XVxuXHRpZiB2YWx1ZTEgaW5zdGFuY2VvZiBEYXRlXG5cdFx0dmFsdWUxID0gdmFsdWUxLmdldFRpbWUoKVxuXHRpZiB2YWx1ZTIgaW5zdGFuY2VvZiBEYXRlXG5cdFx0dmFsdWUyID0gdmFsdWUyLmdldFRpbWUoKVxuXHRpZiB0eXBlb2YgdmFsdWUxIGlzIFwibnVtYmVyXCIgYW5kIHR5cGVvZiB2YWx1ZTIgaXMgXCJudW1iZXJcIlxuXHRcdHJldHVybiB2YWx1ZTEgLSB2YWx1ZTJcblx0IyBIYW5kbGluZyBudWxsIHZhbHVlc1xuXHRpc1ZhbHVlMUVtcHR5ID0gdmFsdWUxID09IG51bGwgb3IgdmFsdWUxID09IHVuZGVmaW5lZFxuXHRpc1ZhbHVlMkVtcHR5ID0gdmFsdWUyID09IG51bGwgb3IgdmFsdWUyID09IHVuZGVmaW5lZFxuXHRpZiBpc1ZhbHVlMUVtcHR5IGFuZCAhaXNWYWx1ZTJFbXB0eVxuXHRcdHJldHVybiAtMVxuXHRpZiBpc1ZhbHVlMUVtcHR5IGFuZCBpc1ZhbHVlMkVtcHR5XG5cdFx0cmV0dXJuIDBcblx0aWYgIWlzVmFsdWUxRW1wdHkgYW5kIGlzVmFsdWUyRW1wdHlcblx0XHRyZXR1cm4gMVxuXHRsb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSgpXG5cdHJldHVybiB2YWx1ZTEudG9TdHJpbmcoKS5sb2NhbGVDb21wYXJlIHZhbHVlMi50b1N0cmluZygpLCBsb2NhbGVcblxuXG4jIOivpeWHveaVsOWPquWcqOWIneWni+WMlk9iamVjdOaXtu+8jOaKiuebuOWFs+WvueixoeeahOiuoeeul+e7k+aenOS/neWtmOWIsE9iamVjdOeahHJlbGF0ZWRfb2JqZWN0c+WxnuaAp+S4re+8jOWQjue7reWPr+S7peebtOaOpeS7jnJlbGF0ZWRfb2JqZWN0c+WxnuaAp+S4reWPluW+l+iuoeeul+e7k+aenOiAjOS4jeeUqOWGjeasoeiwg+eUqOivpeWHveaVsOadpeiuoeeul1xuQ3JlYXRvci5nZXRPYmplY3RSZWxhdGVkcyA9IChvYmplY3RfbmFtZSktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdHJlbGF0ZWRfb2JqZWN0cyA9IFtdXG5cdCMgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHQjIOWboENyZWF0b3IuZ2V0T2JqZWN05Ye95pWw5YaF6YOo6KaB6LCD55So6K+l5Ye95pWw77yM5omA5Lul6L+Z6YeM5LiN5Y+v5Lul6LCD55SoQ3JlYXRvci5nZXRPYmplY3Tlj5blr7nosaHvvIzlj6rog73osIPnlKhDcmVhdG9yLk9iamVjdHPmnaXlj5blr7nosaFcblx0X29iamVjdCA9IENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV1cblx0aWYgIV9vYmplY3Rcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cdFxuXHRyZWxhdGVkTGlzdCA9IF9vYmplY3QucmVsYXRlZExpc3Rcblx0aWYgTWV0ZW9yLmlzQ2xpZW50ICYmICFfLmlzRW1wdHkgcmVsYXRlZExpc3Rcblx0XHRyZWxhdGVkTGlzdE1hcCA9IHt9XG5cdFx0Xy5lYWNoIHJlbGF0ZWRMaXN0LCAob2JqTmFtZSktPlxuXHRcdFx0aWYgXy5pc09iamVjdCBvYmpOYW1lXG5cdFx0XHRcdHJlbGF0ZWRMaXN0TWFwW29iak5hbWUub2JqZWN0TmFtZV0gPSB7fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZWxhdGVkTGlzdE1hcFtvYmpOYW1lXSA9IHt9XG5cdFx0Xy5lYWNoIENyZWF0b3IuT2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0XHRfLmVhY2ggcmVsYXRlZF9vYmplY3QuZmllbGRzLCAocmVsYXRlZF9maWVsZCwgcmVsYXRlZF9maWVsZF9uYW1lKS0+XG5cdFx0XHRcdGlmIChyZWxhdGVkX2ZpZWxkLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCIgfHwgcmVsYXRlZF9maWVsZC50eXBlID09IFwibG9va3VwXCIpIGFuZCByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0X25hbWUgYW5kIHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdXG5cdFx0XHRcdFx0IyDlvZNyZWxhdGVkX29iamVjdC5maWVsZHPkuK3mnInkuKTkuKrmiJbku6XkuIrnmoTlrZfmrrXmjIflkJFvYmplY3RfbmFtZeihqOekuueahOWvueixoeaXtu+8jOS8mOWFiOWPluesrOS4gOS4quS9nOS4uuWklumUruWFs+ezu+Wtl+aute+8jOS9huaYr3JlbGF0ZWRfZmllbGTkuLrkuLvlrZDooajml7blvLrooYzopobnm5bkuYvliY3nmoRyZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXeWAvFxuXHRcdFx0XHRcdGlmIF8uaXNFbXB0eSByZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXSB8fCByZWxhdGVkX2ZpZWxkLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCJcblx0XHRcdFx0XHRcdHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdID0geyBvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSwgZm9yZWlnbl9rZXk6IHJlbGF0ZWRfZmllbGRfbmFtZSwgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHJlbGF0ZWRfZmllbGQud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgfVxuXHRcdGlmIHJlbGF0ZWRMaXN0TWFwWydjbXNfZmlsZXMnXVxuXHRcdFx0cmVsYXRlZExpc3RNYXBbJ2Ntc19maWxlcyddID0geyBvYmplY3RfbmFtZTogXCJjbXNfZmlsZXNcIiwgZm9yZWlnbl9rZXk6IFwicGFyZW50XCIgfVxuXHRcdGlmIHJlbGF0ZWRMaXN0TWFwWydpbnN0YW5jZXMnXVxuXHRcdFx0cmVsYXRlZExpc3RNYXBbJ2luc3RhbmNlcyddID0geyBvYmplY3RfbmFtZTogXCJpbnN0YW5jZXNcIiwgZm9yZWlnbl9rZXk6IFwicmVjb3JkX2lkc1wiIH1cblx0XHRfLmVhY2ggWyd0YXNrcycsICdub3RlcycsICdldmVudHMnLCAnYXBwcm92YWxzJ10sIChlbmFibGVPYmpOYW1lKS0+XG5cdFx0XHRpZiByZWxhdGVkTGlzdE1hcFtlbmFibGVPYmpOYW1lXVxuXHRcdFx0XHRyZWxhdGVkTGlzdE1hcFtlbmFibGVPYmpOYW1lXSA9IHsgb2JqZWN0X25hbWU6IGVuYWJsZU9iak5hbWUsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIiB9XG5cdFx0aWYgcmVsYXRlZExpc3RNYXBbJ2F1ZGl0X3JlY29yZHMnXVxuXHRcdFx0I3JlY29yZCDor6bnu4bkuIvnmoRhdWRpdF9yZWNvcmRz5LuFbW9kaWZ5QWxsUmVjb3Jkc+adg+mZkOWPr+ingVxuXHRcdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lKVxuXHRcdFx0aWYgX29iamVjdC5lbmFibGVfYXVkaXQgJiYgcGVybWlzc2lvbnM/Lm1vZGlmeUFsbFJlY29yZHNcblx0XHRcdFx0cmVsYXRlZExpc3RNYXBbJ2F1ZGl0X3JlY29yZHMnXSA9IHsgb2JqZWN0X25hbWU6XCJhdWRpdF9yZWNvcmRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIiB9XG5cdFx0cmVsYXRlZF9vYmplY3RzID0gXy52YWx1ZXMgcmVsYXRlZExpc3RNYXBcblx0XHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cblx0aWYgX29iamVjdC5lbmFibGVfZmlsZXNcblx0XHRyZWxhdGVkX29iamVjdHMucHVzaCB7b2JqZWN0X25hbWU6XCJjbXNfZmlsZXNcIiwgZm9yZWlnbl9rZXk6IFwicGFyZW50XCJ9XG5cblx0Xy5lYWNoIENyZWF0b3IuT2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKS0+XG5cdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCJcblx0XHRcdCMgY2ZzLmZpbGVzLmZpbGVyZWNvcmTlr7nosaHlnKjnrKzkuozmrKHngrnlh7vnmoTml7blgJlyZWxhdGVkX29iamVjdOi/lOWbnueahOaYr2FwcC1idWlsZGVy5Lit55qEXCJtZXRhZGF0YS5wYXJlbnRcIuWtl+auteiiq+WIoOmZpOS6hu+8jOiusOWIsG1ldGFkYXRh5a2X5q6155qEc3ViX2ZpZWxkc+S4reS6hu+8jOaJgOS7peimgeWNleeLrOWkhOeQhuOAglxuXHRcdFx0c2ZzRmlsZXNPYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChcImNmcy5maWxlcy5maWxlcmVjb3JkXCIpXG5cdFx0XHRzZnNGaWxlc09iamVjdCAmJiByZWxhdGVkX29iamVjdCA9IHNmc0ZpbGVzT2JqZWN0XG5cdFx0Xy5lYWNoIHJlbGF0ZWRfb2JqZWN0LmZpZWxkcywgKHJlbGF0ZWRfZmllbGQsIHJlbGF0ZWRfZmllbGRfbmFtZSktPlxuXHRcdFx0aWYgKHJlbGF0ZWRfZmllbGQudHlwZSA9PSBcIm1hc3Rlcl9kZXRhaWxcIiB8fCAocmVsYXRlZF9maWVsZC50eXBlID09IFwibG9va3VwXCIgJiYgcmVsYXRlZF9maWVsZC5yZWxhdGVkTGlzdCkpIGFuZCByZWxhdGVkX2ZpZWxkLnJlZmVyZW5jZV90byBhbmQgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT0gb2JqZWN0X25hbWVcblx0XHRcdFx0aWYgcmVsYXRlZF9vYmplY3RfbmFtZSA9PSBcIm9iamVjdF9maWVsZHNcIlxuXHRcdFx0XHRcdCNUT0RPIOW+heebuOWFs+WIl+ihqOaUr+aMgeaOkuW6j+WQju+8jOWIoOmZpOatpOWIpOaWrVxuXHRcdFx0XHRcdHJlbGF0ZWRfb2JqZWN0cy5zcGxpY2UoMCwgMCwge29iamVjdF9uYW1lOnJlbGF0ZWRfb2JqZWN0X25hbWUsIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWV9KVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOnJlbGF0ZWRfb2JqZWN0X25hbWUsIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWUsIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkOiByZWxhdGVkX2ZpZWxkLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkfVxuXG5cdGlmIF9vYmplY3QuZW5hYmxlX3Rhc2tzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwidGFza3NcIiwgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wifVxuXHRpZiBfb2JqZWN0LmVuYWJsZV9ub3Rlc1xuXHRcdHJlbGF0ZWRfb2JqZWN0cy5wdXNoIHtvYmplY3RfbmFtZTpcIm5vdGVzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfZXZlbnRzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiZXZlbnRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfaW5zdGFuY2VzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiaW5zdGFuY2VzXCIsIGZvcmVpZ25fa2V5OiBcInJlY29yZF9pZHNcIn1cblx0aWYgX29iamVjdC5lbmFibGVfYXBwcm92YWxzXG5cdFx0cmVsYXRlZF9vYmplY3RzLnB1c2gge29iamVjdF9uYW1lOlwiYXBwcm92YWxzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblx0aWYgX29iamVjdC5lbmFibGVfcHJvY2Vzc1xuXHRcdHJlbGF0ZWRfb2JqZWN0cy5wdXNoIHtvYmplY3RfbmFtZTpcInByb2Nlc3NfaW5zdGFuY2VfaGlzdG9yeVwiLCBmb3JlaWduX2tleTogXCJ0YXJnZXRfb2JqZWN0XCJ9XG5cdCNyZWNvcmQg6K+m57uG5LiL55qEYXVkaXRfcmVjb3Jkc+S7hW1vZGlmeUFsbFJlY29yZHPmnYPpmZDlj6/op4Fcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lKVxuXHRcdGlmIF9vYmplY3QuZW5hYmxlX2F1ZGl0ICYmIHBlcm1pc3Npb25zPy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHRyZWxhdGVkX29iamVjdHMucHVzaCB7b2JqZWN0X25hbWU6XCJhdWRpdF9yZWNvcmRzXCIsIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIn1cblxuXHRyZXR1cm4gcmVsYXRlZF9vYmplY3RzXG5cbkNyZWF0b3IuZ2V0VXNlckNvbnRleHQgPSAodXNlcklkLCBzcGFjZUlkLCBpc1VuU2FmZU1vZGUpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0cmV0dXJuIENyZWF0b3IuVVNFUl9DT05URVhUXG5cdGVsc2Vcblx0XHRpZiAhKHVzZXJJZCBhbmQgc3BhY2VJZClcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IgNTAwLCBcInRoZSBwYXJhbXMgdXNlcklkIGFuZCBzcGFjZUlkIGlzIHJlcXVpcmVkIGZvciB0aGUgZnVuY3Rpb24gQ3JlYXRvci5nZXRVc2VyQ29udGV4dFwiXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdHN1RmllbGRzID0ge25hbWU6IDEsIG1vYmlsZTogMSwgcG9zaXRpb246IDEsIGVtYWlsOiAxLCBjb21wYW55OiAxLCBvcmdhbml6YXRpb246IDEsIHNwYWNlOiAxLCBjb21wYW55X2lkOiAxLCBjb21wYW55X2lkczogMX1cblx0XHQjIGNoZWNrIGlmIHVzZXIgaW4gdGhlIHNwYWNlXG5cdFx0c3UgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0sIHtmaWVsZHM6IHN1RmllbGRzfSlcblx0XHRpZiAhc3Vcblx0XHRcdHNwYWNlSWQgPSBudWxsXG5cblx0XHQjIGlmIHNwYWNlSWQgbm90IGV4aXN0cywgZ2V0IHRoZSBmaXJzdCBvbmUuXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdGlmIGlzVW5TYWZlTW9kZVxuXHRcdFx0XHRzdSA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJzcGFjZV91c2Vyc1wiXS5maW5kT25lKHt1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiBzdUZpZWxkc30pXG5cdFx0XHRcdGlmICFzdVxuXHRcdFx0XHRcdHJldHVybiBudWxsXG5cdFx0XHRcdHNwYWNlSWQgPSBzdS5zcGFjZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gbnVsbFxuXG5cdFx0VVNFUl9DT05URVhUID0ge31cblx0XHRVU0VSX0NPTlRFWFQudXNlcklkID0gdXNlcklkXG5cdFx0VVNFUl9DT05URVhULnNwYWNlSWQgPSBzcGFjZUlkXG5cdFx0VVNFUl9DT05URVhULnVzZXIgPSB7XG5cdFx0XHRfaWQ6IHVzZXJJZFxuXHRcdFx0bmFtZTogc3UubmFtZSxcblx0XHRcdG1vYmlsZTogc3UubW9iaWxlLFxuXHRcdFx0cG9zaXRpb246IHN1LnBvc2l0aW9uLFxuXHRcdFx0ZW1haWw6IHN1LmVtYWlsXG5cdFx0XHRjb21wYW55OiBzdS5jb21wYW55XG5cdFx0XHRjb21wYW55X2lkOiBzdS5jb21wYW55X2lkXG5cdFx0XHRjb21wYW55X2lkczogc3UuY29tcGFueV9pZHNcblx0XHR9XG5cdFx0c3BhY2VfdXNlcl9vcmcgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvcmdhbml6YXRpb25zXCIpPy5maW5kT25lKHN1Lm9yZ2FuaXphdGlvbilcblx0XHRpZiBzcGFjZV91c2VyX29yZ1xuXHRcdFx0VVNFUl9DT05URVhULnVzZXIub3JnYW5pemF0aW9uID0ge1xuXHRcdFx0XHRfaWQ6IHNwYWNlX3VzZXJfb3JnLl9pZCxcblx0XHRcdFx0bmFtZTogc3BhY2VfdXNlcl9vcmcubmFtZSxcblx0XHRcdFx0ZnVsbG5hbWU6IHNwYWNlX3VzZXJfb3JnLmZ1bGxuYW1lXG5cdFx0XHR9XG5cdFx0cmV0dXJuIFVTRVJfQ09OVEVYVFxuXG5DcmVhdG9yLmdldFJlbGF0aXZlVXJsID0gKHVybCktPlxuXG5cdGlmIF8uaXNGdW5jdGlvbihTdGVlZG9zLmlzQ29yZG92YSkgJiYgU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAodXJsPy5zdGFydHNXaXRoKFwiL2Fzc2V0c1wiKSB8fCB1cmw/LnN0YXJ0c1dpdGgoXCJhc3NldHNcIikgfHwgdXJsPy5zdGFydHNXaXRoKFwiL3BhY2thZ2VzXCIpKVxuXHRcdGlmICEvXlxcLy8udGVzdCh1cmwpXG5cdFx0XHR1cmwgPSBcIi9cIiArIHVybFxuXHRcdHJldHVybiB1cmxcblxuXHRpZiB1cmxcblx0XHQjIHVybOW8gOWktOayoeaciVwiL1wi77yM6ZyA6KaB5re75YqgXCIvXCJcblx0XHRpZiAhL15cXC8vLnRlc3QodXJsKVxuXHRcdFx0dXJsID0gXCIvXCIgKyB1cmxcblx0XHRyZXR1cm4gX19tZXRlb3JfcnVudGltZV9jb25maWdfXy5ST09UX1VSTF9QQVRIX1BSRUZJWCArIHVybFxuXHRlbHNlXG5cdFx0cmV0dXJuIF9fbWV0ZW9yX3J1bnRpbWVfY29uZmlnX18uUk9PVF9VUkxfUEFUSF9QUkVGSVhcblxuQ3JlYXRvci5nZXRVc2VyQ29tcGFueUlkID0gKHVzZXJJZCwgc3BhY2VJZCktPlxuXHR1c2VySWQgPSB1c2VySWQgfHwgTWV0ZW9yLnVzZXJJZCgpXG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHNwYWNlSWQgPSBzcGFjZUlkIHx8IFNlc3Npb24uZ2V0KCdzcGFjZUlkJylcblx0ZWxzZVxuXHRcdGlmICFzcGFjZUlkXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ21pc3Mgc3BhY2VJZCcpXG5cdHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7Y29tcGFueV9pZDoxfX0pXG5cdHJldHVybiBzdS5jb21wYW55X2lkXG5cbkNyZWF0b3IuZ2V0VXNlckNvbXBhbnlJZHMgPSAodXNlcklkLCBzcGFjZUlkKS0+XG5cdHVzZXJJZCA9IHVzZXJJZCB8fCBNZXRlb3IudXNlcklkKClcblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0c3BhY2VJZCA9IHNwYWNlSWQgfHwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKVxuXHRlbHNlXG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAnbWlzcyBzcGFjZUlkJylcblx0c3UgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ3NwYWNlX3VzZXJzJykuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0sIHtmaWVsZHM6IHtjb21wYW55X2lkczoxfX0pXG5cdHJldHVybiBzdT8uY29tcGFueV9pZHNcblxuQ3JlYXRvci5wcm9jZXNzUGVybWlzc2lvbnMgPSAocG8pLT5cblx0aWYgcG8uYWxsb3dDcmVhdGVcblx0XHRwby5hbGxvd1JlYWQgPSB0cnVlXG5cdGlmIHBvLmFsbG93RWRpdFxuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8uYWxsb3dEZWxldGVcblx0XHRwby5hbGxvd0VkaXQgPSB0cnVlXG5cdFx0cG8uYWxsb3dSZWFkID0gdHJ1ZVxuXHRpZiBwby52aWV3QWxsUmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8ubW9kaWZ5QWxsUmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0XHRwby5hbGxvd0VkaXQgPSB0cnVlXG5cdFx0cG8uYWxsb3dEZWxldGUgPSB0cnVlXG5cdFx0cG8udmlld0FsbFJlY29yZHMgPSB0cnVlXG5cdGlmIHBvLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdHBvLmFsbG93UmVhZCA9IHRydWVcblx0aWYgcG8ubW9kaWZ5Q29tcGFueVJlY29yZHNcblx0XHRwby5hbGxvd1JlYWQgPSB0cnVlXG5cdFx0cG8uYWxsb3dFZGl0ID0gdHJ1ZVxuXHRcdHBvLmFsbG93RGVsZXRlID0gdHJ1ZVxuXHRcdHBvLnZpZXdDb21wYW55UmVjb3JkcyA9IHRydWVcblx0XHRcblx0IyDlpoLmnpzpmYTku7bnm7jlhbPmnYPpmZDphY3nva7kuLrnqbrvvIzliJnlhbzlrrnkuYvliY3msqHmnInpmYTku7bmnYPpmZDphY3nva7ml7bnmoTop4TliJlcblx0aWYgcG8uYWxsb3dSZWFkXG5cdFx0dHlwZW9mIHBvLmFsbG93UmVhZEZpbGVzICE9IFwiYm9vbGVhblwiICYmIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZVxuXHRcdHR5cGVvZiBwby52aWV3QWxsRmlsZXMgIT0gXCJib29sZWFuXCIgJiYgcG8udmlld0FsbEZpbGVzID0gdHJ1ZVxuXHRpZiBwby5hbGxvd0VkaXRcblx0XHR0eXBlb2YgcG8uYWxsb3dDcmVhdGVGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0NyZWF0ZUZpbGVzID0gdHJ1ZVxuXHRcdHR5cGVvZiBwby5hbGxvd0VkaXRGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0VkaXRGaWxlcyA9IHRydWVcblx0XHR0eXBlb2YgcG8uYWxsb3dEZWxldGVGaWxlcyAhPSBcImJvb2xlYW5cIiAmJiBwby5hbGxvd0RlbGV0ZUZpbGVzID0gdHJ1ZVxuXHRpZiBwby5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0dHlwZW9mIHBvLm1vZGlmeUFsbEZpbGVzICE9IFwiYm9vbGVhblwiICYmIHBvLm1vZGlmeUFsbEZpbGVzID0gdHJ1ZVxuXG5cdGlmIHBvLmFsbG93Q3JlYXRlRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8uYWxsb3dFZGl0RmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8uYWxsb3dEZWxldGVGaWxlc1xuXHRcdHBvLmFsbG93RWRpdEZpbGVzID0gdHJ1ZVxuXHRcdHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZVxuXHRpZiBwby52aWV3QWxsRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0aWYgcG8ubW9kaWZ5QWxsRmlsZXNcblx0XHRwby5hbGxvd1JlYWRGaWxlcyA9IHRydWVcblx0XHRwby5hbGxvd0VkaXRGaWxlcyA9IHRydWVcblx0XHRwby5hbGxvd0RlbGV0ZUZpbGVzID0gdHJ1ZVxuXHRcdHBvLnZpZXdBbGxGaWxlcyA9IHRydWVcblxuXHRyZXR1cm4gcG9cblxuQ3JlYXRvci5nZXRUZW1wbGF0ZVNwYWNlSWQgPSAoKS0+XG5cdHJldHVybiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy50ZW1wbGF0ZVNwYWNlSWRcblxuQ3JlYXRvci5nZXRDbG91ZEFkbWluU3BhY2VJZCA9ICgpLT5cblx0cmV0dXJuIE1ldGVvci5zZXR0aW5ncy5wdWJsaWM/LmNsb3VkQWRtaW5TcGFjZUlkXG5cbkNyZWF0b3IuaXNUZW1wbGF0ZVNwYWNlID0gKHNwYWNlSWQpLT5cblx0aWYgc3BhY2VJZCAmJiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy50ZW1wbGF0ZVNwYWNlSWQgPT0gc3BhY2VJZFxuXHRcdHJldHVybiB0cnVlXG5cdHJldHVybiBmYWxzZVxuXG5DcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlID0gKHNwYWNlSWQpLT5cblx0aWYgc3BhY2VJZCAmJiBNZXRlb3Iuc2V0dGluZ3MucHVibGljPy5jbG91ZEFkbWluU3BhY2VJZCA9PSBzcGFjZUlkXG5cdFx0cmV0dXJuIHRydWVcblx0cmV0dXJuIGZhbHNlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDcmVhdG9yLnN0ZWVkb3NTdG9yYWdlRGlyID0gcHJvY2Vzcy5lbnYuU1RFRURPU19TVE9SQUdFX0RJUlxuXHQiLCJ2YXIgRmliZXI7XG5cbkNyZWF0b3IuZGVwcyA9IHtcbiAgYXBwOiBuZXcgVHJhY2tlci5EZXBlbmRlbmN5LFxuICBvYmplY3Q6IG5ldyBUcmFja2VyLkRlcGVuZGVuY3lcbn07XG5cbkNyZWF0b3IuX1RFTVBMQVRFID0ge1xuICBBcHBzOiB7fSxcbiAgT2JqZWN0czoge31cbn07XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICBTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7XG4gICAgZmlsdGVyc0Z1bmN0aW9uOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgU3RyaW5nKSlcbiAgfSk7XG4gIFNpbXBsZVNjaGVtYS5leHRlbmRPcHRpb25zKHtcbiAgICBvcHRpb25zRnVuY3Rpb246IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKVxuICB9KTtcbiAgcmV0dXJuIFNpbXBsZVNjaGVtYS5leHRlbmRPcHRpb25zKHtcbiAgICBjcmVhdGVGdW5jdGlvbjogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIFN0cmluZykpXG4gIH0pO1xufSk7XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgRmliZXIgPSByZXF1aXJlKCdmaWJlcnMnKTtcbiAgQ3JlYXRvci5maWJlckxvYWRPYmplY3RzID0gZnVuY3Rpb24ob2JqLCBvYmplY3RfbmFtZSkge1xuICAgIHJldHVybiBGaWJlcihmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBDcmVhdG9yLmxvYWRPYmplY3RzKG9iaiwgb2JqZWN0X25hbWUpO1xuICAgIH0pLnJ1bigpO1xuICB9O1xufVxuXG5DcmVhdG9yLmxvYWRPYmplY3RzID0gZnVuY3Rpb24ob2JqLCBvYmplY3RfbmFtZSkge1xuICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgb2JqZWN0X25hbWUgPSBvYmoubmFtZTtcbiAgfVxuICBpZiAoIW9iai5saXN0X3ZpZXdzKSB7XG4gICAgb2JqLmxpc3Rfdmlld3MgPSB7fTtcbiAgfVxuICBpZiAob2JqLnNwYWNlKSB7XG4gICAgb2JqZWN0X25hbWUgPSBDcmVhdG9yLmdldENvbGxlY3Rpb25OYW1lKG9iaik7XG4gIH1cbiAgaWYgKG9iamVjdF9uYW1lID09PSAnY2ZzX2ZpbGVzX2ZpbGVyZWNvcmQnKSB7XG4gICAgb2JqZWN0X25hbWUgPSAnY2ZzLmZpbGVzLmZpbGVyZWNvcmQnO1xuICAgIG9iaiA9IF8uY2xvbmUob2JqKTtcbiAgICBvYmoubmFtZSA9IG9iamVjdF9uYW1lO1xuICAgIENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV0gPSBvYmo7XG4gIH1cbiAgQ3JlYXRvci5jb252ZXJ0T2JqZWN0KG9iaik7XG4gIG5ldyBDcmVhdG9yLk9iamVjdChvYmopO1xuICBDcmVhdG9yLmluaXRUcmlnZ2VycyhvYmplY3RfbmFtZSk7XG4gIENyZWF0b3IuaW5pdExpc3RWaWV3cyhvYmplY3RfbmFtZSk7XG4gIHJldHVybiBvYmo7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdE5hbWUgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKG9iamVjdC5zcGFjZSkge1xuICAgIHJldHVybiBcImNfXCIgKyBvYmplY3Quc3BhY2UgKyBcIl9cIiArIG9iamVjdC5uYW1lO1xuICB9XG4gIHJldHVybiBvYmplY3QubmFtZTtcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlX2lkKSB7XG4gIHZhciByZWYsIHJlZjE7XG4gIGlmIChfLmlzQXJyYXkob2JqZWN0X25hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoKHJlZiA9IENyZWF0b3IuZGVwcykgIT0gbnVsbCkge1xuICAgICAgaWYgKChyZWYxID0gcmVmLm9iamVjdCkgIT0gbnVsbCkge1xuICAgICAgICByZWYxLmRlcGVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIW9iamVjdF9uYW1lICYmIE1ldGVvci5pc0NsaWVudCkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAob2JqZWN0X25hbWUpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5vYmplY3RzQnlOYW1lW29iamVjdF9uYW1lXTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRPYmplY3RCeUlkID0gZnVuY3Rpb24ob2JqZWN0X2lkKSB7XG4gIHJldHVybiBfLmZpbmRXaGVyZShDcmVhdG9yLm9iamVjdHNCeU5hbWUsIHtcbiAgICBfaWQ6IG9iamVjdF9pZFxuICB9KTtcbn07XG5cbkNyZWF0b3IucmVtb3ZlT2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgY29uc29sZS5sb2coXCJyZW1vdmVPYmplY3RcIiwgb2JqZWN0X25hbWUpO1xuICBkZWxldGUgQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXTtcbiAgcmV0dXJuIGRlbGV0ZSBDcmVhdG9yLm9iamVjdHNCeU5hbWVbb2JqZWN0X25hbWVdO1xufTtcblxuQ3JlYXRvci5nZXRDb2xsZWN0aW9uID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHNwYWNlSWQpIHtcbiAgdmFyIHJlZjtcbiAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgfVxuICBpZiAob2JqZWN0X25hbWUpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICByZXR1cm4gZGJbb2JqZWN0X25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQ3JlYXRvci5Db2xsZWN0aW9uc1soKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lLCBzcGFjZUlkKSkgIT0gbnVsbCA/IHJlZi5fY29sbGVjdGlvbl9uYW1lIDogdm9pZCAwKSB8fCBvYmplY3RfbmFtZV07XG4gICAgfVxuICB9XG59O1xuXG5DcmVhdG9yLnJlbW92ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICByZXR1cm4gZGVsZXRlIENyZWF0b3IuQ29sbGVjdGlvbnNbb2JqZWN0X25hbWVdO1xufTtcblxuQ3JlYXRvci5pc1NwYWNlQWRtaW4gPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIHJlZiwgcmVmMSwgc3BhY2U7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgfVxuICAgIGlmICghdXNlcklkKSB7XG4gICAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgfVxuICB9XG4gIHNwYWNlID0gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KFwic3BhY2VzXCIpKSAhPSBudWxsID8gKHJlZjEgPSByZWYuZGIpICE9IG51bGwgPyByZWYxLmZpbmRPbmUoc3BhY2VJZCwge1xuICAgIGZpZWxkczoge1xuICAgICAgYWRtaW5zOiAxXG4gICAgfVxuICB9KSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgaWYgKHNwYWNlICE9IG51bGwgPyBzcGFjZS5hZG1pbnMgOiB2b2lkIDApIHtcbiAgICByZXR1cm4gc3BhY2UuYWRtaW5zLmluZGV4T2YodXNlcklkKSA+PSAwO1xuICB9XG59O1xuXG5DcmVhdG9yLmV2YWx1YXRlRm9ybXVsYSA9IGZ1bmN0aW9uKGZvcm11bGFyLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghXy5pc1N0cmluZyhmb3JtdWxhcikpIHtcbiAgICByZXR1cm4gZm9ybXVsYXI7XG4gIH1cbiAgaWYgKENyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhKGZvcm11bGFyKSkge1xuICAgIHJldHVybiBDcmVhdG9yLkZvcm11bGFyLnJ1bihmb3JtdWxhciwgY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGZvcm11bGFyO1xufTtcblxuQ3JlYXRvci5ldmFsdWF0ZUZpbHRlcnMgPSBmdW5jdGlvbihmaWx0ZXJzLCBjb250ZXh0KSB7XG4gIHZhciBzZWxlY3RvcjtcbiAgc2VsZWN0b3IgPSB7fTtcbiAgXy5lYWNoKGZpbHRlcnMsIGZ1bmN0aW9uKGZpbHRlcikge1xuICAgIHZhciBhY3Rpb24sIG5hbWUsIHZhbHVlO1xuICAgIGlmICgoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIubGVuZ3RoIDogdm9pZCAwKSA9PT0gMykge1xuICAgICAgbmFtZSA9IGZpbHRlclswXTtcbiAgICAgIGFjdGlvbiA9IGZpbHRlclsxXTtcbiAgICAgIHZhbHVlID0gQ3JlYXRvci5ldmFsdWF0ZUZvcm11bGEoZmlsdGVyWzJdLCBjb250ZXh0KTtcbiAgICAgIHNlbGVjdG9yW25hbWVdID0ge307XG4gICAgICByZXR1cm4gc2VsZWN0b3JbbmFtZV1bYWN0aW9uXSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzZWxlY3Rvcjtcbn07XG5cbkNyZWF0b3IuaXNDb21tb25TcGFjZSA9IGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgcmV0dXJuIHNwYWNlSWQgPT09ICdjb21tb24nO1xufTtcblxuXG4vKlxuXHRkb2Nz77ya5b6F5o6S5bqP55qE5paH5qGj5pWw57uEXG5cdGlkc++8ml9pZOmbhuWQiFxuXHRpZF9rZXk6IOm7mOiupOS4ul9pZFxuXHRyZXR1cm4g5oyJ54WnaWRz55qE6aG65bqP6L+U5Zue5paw55qE5paH5qGj6ZuG5ZCIXG4gKi9cblxuQ3JlYXRvci5nZXRPcmRlcmx5U2V0QnlJZHMgPSBmdW5jdGlvbihkb2NzLCBpZHMsIGlkX2tleSwgaGl0X2ZpcnN0KSB7XG4gIHZhciB2YWx1ZXM7XG4gIGlmICghaWRfa2V5KSB7XG4gICAgaWRfa2V5ID0gXCJfaWRcIjtcbiAgfVxuICBpZiAoaGl0X2ZpcnN0KSB7XG4gICAgdmFsdWVzID0gZG9jcy5nZXRQcm9wZXJ0eShpZF9rZXkpO1xuICAgIHJldHVybiBfLnNvcnRCeShkb2NzLCBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciBfaW5kZXg7XG4gICAgICBfaW5kZXggPSBpZHMuaW5kZXhPZihkb2NbaWRfa2V5XSk7XG4gICAgICBpZiAoX2luZGV4ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIF9pbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpZHMubGVuZ3RoICsgXy5pbmRleE9mKHZhbHVlcywgZG9jW2lkX2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBfLnNvcnRCeShkb2NzLCBmdW5jdGlvbihkb2MpIHtcbiAgICAgIHZhciB2O1xuICAgICAgdiA9IGlkcy5pbmRleE9mKGRvY1tpZF9rZXldKTtcbiAgICAgIGlmICh2IDwgMCkge1xuICAgICAgICByZXR1cm4gOTk5OTk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcblxuXG4vKlxuXHTmjInnlKjmiLfmiYDlsZ7mnKzlnLDljJbor63oqIDov5vooYzmjpLluo/vvIzmlK/mjIHkuK3mlofjgIHmlbDlgLzjgIHml6XmnJ/nrYnlrZfmrrXmjpLluo9cblx05a+55LqOT2JqZWN057G75Z6L77yM5aaC5p6c5o+Q5L6b5L2c55So5Z+f5Lita2V55bGe5oCn77yM5YiZ5Y+W5YC85Li6dmFsdWVba2V5Xei/m+ihjOaOkuW6j+avlOi+g++8jOWPjeS5i+aVtOS4qk9iamVjdC50b1N0cmluZygp5ZCO5o6S5bqP5q+U6L6DXG4gKi9cblxuQ3JlYXRvci5zb3J0aW5nTWV0aG9kID0gZnVuY3Rpb24odmFsdWUxLCB2YWx1ZTIpIHtcbiAgdmFyIGlzVmFsdWUxRW1wdHksIGlzVmFsdWUyRW1wdHksIGxvY2FsZTtcbiAgaWYgKHRoaXMua2V5KSB7XG4gICAgdmFsdWUxID0gdmFsdWUxW3RoaXMua2V5XTtcbiAgICB2YWx1ZTIgPSB2YWx1ZTJbdGhpcy5rZXldO1xuICB9XG4gIGlmICh2YWx1ZTEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgdmFsdWUxID0gdmFsdWUxLmdldFRpbWUoKTtcbiAgfVxuICBpZiAodmFsdWUyIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHZhbHVlMiA9IHZhbHVlMi5nZXRUaW1lKCk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlMiA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB2YWx1ZTEgLSB2YWx1ZTI7XG4gIH1cbiAgaXNWYWx1ZTFFbXB0eSA9IHZhbHVlMSA9PT0gbnVsbCB8fCB2YWx1ZTEgPT09IHZvaWQgMDtcbiAgaXNWYWx1ZTJFbXB0eSA9IHZhbHVlMiA9PT0gbnVsbCB8fCB2YWx1ZTIgPT09IHZvaWQgMDtcbiAgaWYgKGlzVmFsdWUxRW1wdHkgJiYgIWlzVmFsdWUyRW1wdHkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGlzVmFsdWUxRW1wdHkgJiYgaXNWYWx1ZTJFbXB0eSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICghaXNWYWx1ZTFFbXB0eSAmJiBpc1ZhbHVlMkVtcHR5KSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgbG9jYWxlID0gU3RlZWRvcy5sb2NhbGUoKTtcbiAgcmV0dXJuIHZhbHVlMS50b1N0cmluZygpLmxvY2FsZUNvbXBhcmUodmFsdWUyLnRvU3RyaW5nKCksIGxvY2FsZSk7XG59O1xuXG5DcmVhdG9yLmdldE9iamVjdFJlbGF0ZWRzID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgdmFyIF9vYmplY3QsIHBlcm1pc3Npb25zLCByZWxhdGVkTGlzdCwgcmVsYXRlZExpc3RNYXAsIHJlbGF0ZWRfb2JqZWN0cztcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gIH1cbiAgcmVsYXRlZF9vYmplY3RzID0gW107XG4gIF9vYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbb2JqZWN0X25hbWVdO1xuICBpZiAoIV9vYmplY3QpIHtcbiAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RzO1xuICB9XG4gIHJlbGF0ZWRMaXN0ID0gX29iamVjdC5yZWxhdGVkTGlzdDtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiAhXy5pc0VtcHR5KHJlbGF0ZWRMaXN0KSkge1xuICAgIHJlbGF0ZWRMaXN0TWFwID0ge307XG4gICAgXy5lYWNoKHJlbGF0ZWRMaXN0LCBmdW5jdGlvbihvYmpOYW1lKSB7XG4gICAgICBpZiAoXy5pc09iamVjdChvYmpOYW1lKSkge1xuICAgICAgICByZXR1cm4gcmVsYXRlZExpc3RNYXBbb2JqTmFtZS5vYmplY3ROYW1lXSA9IHt9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0ZWRMaXN0TWFwW29iak5hbWVdID0ge307XG4gICAgICB9XG4gICAgfSk7XG4gICAgXy5lYWNoKENyZWF0b3IuT2JqZWN0cywgZnVuY3Rpb24ocmVsYXRlZF9vYmplY3QsIHJlbGF0ZWRfb2JqZWN0X25hbWUpIHtcbiAgICAgIHJldHVybiBfLmVhY2gocmVsYXRlZF9vYmplY3QuZmllbGRzLCBmdW5jdGlvbihyZWxhdGVkX2ZpZWxkLCByZWxhdGVkX2ZpZWxkX25hbWUpIHtcbiAgICAgICAgaWYgKChyZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiIHx8IHJlbGF0ZWRfZmllbGQudHlwZSA9PT0gXCJsb29rdXBcIikgJiYgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gJiYgcmVsYXRlZF9maWVsZC5yZWZlcmVuY2VfdG8gPT09IG9iamVjdF9uYW1lICYmIHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdKSB7XG4gICAgICAgICAgaWYgKF8uaXNFbXB0eShyZWxhdGVkTGlzdE1hcFtyZWxhdGVkX29iamVjdF9uYW1lXSB8fCByZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRMaXN0TWFwW3JlbGF0ZWRfb2JqZWN0X25hbWVdID0ge1xuICAgICAgICAgICAgICBvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSxcbiAgICAgICAgICAgICAgZm9yZWlnbl9rZXk6IHJlbGF0ZWRfZmllbGRfbmFtZSxcbiAgICAgICAgICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHJlbGF0ZWRfZmllbGQud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVsYXRlZExpc3RNYXBbJ2Ntc19maWxlcyddKSB7XG4gICAgICByZWxhdGVkTGlzdE1hcFsnY21zX2ZpbGVzJ10gPSB7XG4gICAgICAgIG9iamVjdF9uYW1lOiBcImNtc19maWxlc1wiLFxuICAgICAgICBmb3JlaWduX2tleTogXCJwYXJlbnRcIlxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlbGF0ZWRMaXN0TWFwWydpbnN0YW5jZXMnXSkge1xuICAgICAgcmVsYXRlZExpc3RNYXBbJ2luc3RhbmNlcyddID0ge1xuICAgICAgICBvYmplY3RfbmFtZTogXCJpbnN0YW5jZXNcIixcbiAgICAgICAgZm9yZWlnbl9rZXk6IFwicmVjb3JkX2lkc1wiXG4gICAgICB9O1xuICAgIH1cbiAgICBfLmVhY2goWyd0YXNrcycsICdub3RlcycsICdldmVudHMnLCAnYXBwcm92YWxzJ10sIGZ1bmN0aW9uKGVuYWJsZU9iak5hbWUpIHtcbiAgICAgIGlmIChyZWxhdGVkTGlzdE1hcFtlbmFibGVPYmpOYW1lXSkge1xuICAgICAgICByZXR1cm4gcmVsYXRlZExpc3RNYXBbZW5hYmxlT2JqTmFtZV0gPSB7XG4gICAgICAgICAgb2JqZWN0X25hbWU6IGVuYWJsZU9iak5hbWUsXG4gICAgICAgICAgZm9yZWlnbl9rZXk6IFwicmVsYXRlZF90b1wiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHJlbGF0ZWRMaXN0TWFwWydhdWRpdF9yZWNvcmRzJ10pIHtcbiAgICAgIHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSk7XG4gICAgICBpZiAoX29iamVjdC5lbmFibGVfYXVkaXQgJiYgKHBlcm1pc3Npb25zICE9IG51bGwgPyBwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzIDogdm9pZCAwKSkge1xuICAgICAgICByZWxhdGVkTGlzdE1hcFsnYXVkaXRfcmVjb3JkcyddID0ge1xuICAgICAgICAgIG9iamVjdF9uYW1lOiBcImF1ZGl0X3JlY29yZHNcIixcbiAgICAgICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVsYXRlZF9vYmplY3RzID0gXy52YWx1ZXMocmVsYXRlZExpc3RNYXApO1xuICAgIHJldHVybiByZWxhdGVkX29iamVjdHM7XG4gIH1cbiAgaWYgKF9vYmplY3QuZW5hYmxlX2ZpbGVzKSB7XG4gICAgcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgb2JqZWN0X25hbWU6IFwiY21zX2ZpbGVzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJwYXJlbnRcIlxuICAgIH0pO1xuICB9XG4gIF8uZWFjaChDcmVhdG9yLk9iamVjdHMsIGZ1bmN0aW9uKHJlbGF0ZWRfb2JqZWN0LCByZWxhdGVkX29iamVjdF9uYW1lKSB7XG4gICAgdmFyIHNmc0ZpbGVzT2JqZWN0O1xuICAgIGlmIChyZWxhdGVkX29iamVjdF9uYW1lID09PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCIpIHtcbiAgICAgIHNmc0ZpbGVzT2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QoXCJjZnMuZmlsZXMuZmlsZXJlY29yZFwiKTtcbiAgICAgIHNmc0ZpbGVzT2JqZWN0ICYmIChyZWxhdGVkX29iamVjdCA9IHNmc0ZpbGVzT2JqZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIF8uZWFjaChyZWxhdGVkX29iamVjdC5maWVsZHMsIGZ1bmN0aW9uKHJlbGF0ZWRfZmllbGQsIHJlbGF0ZWRfZmllbGRfbmFtZSkge1xuICAgICAgaWYgKChyZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiIHx8IChyZWxhdGVkX2ZpZWxkLnR5cGUgPT09IFwibG9va3VwXCIgJiYgcmVsYXRlZF9maWVsZC5yZWxhdGVkTGlzdCkpICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvICYmIHJlbGF0ZWRfZmllbGQucmVmZXJlbmNlX3RvID09PSBvYmplY3RfbmFtZSkge1xuICAgICAgICBpZiAocmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJvYmplY3RfZmllbGRzXCIpIHtcbiAgICAgICAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RzLnNwbGljZSgwLCAwLCB7XG4gICAgICAgICAgICBvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSxcbiAgICAgICAgICAgIGZvcmVpZ25fa2V5OiByZWxhdGVkX2ZpZWxkX25hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgICAgICAgb2JqZWN0X25hbWU6IHJlbGF0ZWRfb2JqZWN0X25hbWUsXG4gICAgICAgICAgICBmb3JlaWduX2tleTogcmVsYXRlZF9maWVsZF9uYW1lLFxuICAgICAgICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHJlbGF0ZWRfZmllbGQud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKF9vYmplY3QuZW5hYmxlX3Rhc2tzKSB7XG4gICAgcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgb2JqZWN0X25hbWU6IFwidGFza3NcIixcbiAgICAgIGZvcmVpZ25fa2V5OiBcInJlbGF0ZWRfdG9cIlxuICAgIH0pO1xuICB9XG4gIGlmIChfb2JqZWN0LmVuYWJsZV9ub3Rlcykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcIm5vdGVzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICB9KTtcbiAgfVxuICBpZiAoX29iamVjdC5lbmFibGVfZXZlbnRzKSB7XG4gICAgcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgb2JqZWN0X25hbWU6IFwiZXZlbnRzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICB9KTtcbiAgfVxuICBpZiAoX29iamVjdC5lbmFibGVfaW5zdGFuY2VzKSB7XG4gICAgcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgb2JqZWN0X25hbWU6IFwiaW5zdGFuY2VzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJyZWNvcmRfaWRzXCJcbiAgICB9KTtcbiAgfVxuICBpZiAoX29iamVjdC5lbmFibGVfYXBwcm92YWxzKSB7XG4gICAgcmVsYXRlZF9vYmplY3RzLnB1c2goe1xuICAgICAgb2JqZWN0X25hbWU6IFwiYXBwcm92YWxzXCIsXG4gICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICB9KTtcbiAgfVxuICBpZiAoX29iamVjdC5lbmFibGVfcHJvY2Vzcykge1xuICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgIG9iamVjdF9uYW1lOiBcInByb2Nlc3NfaW5zdGFuY2VfaGlzdG9yeVwiLFxuICAgICAgZm9yZWlnbl9rZXk6IFwidGFyZ2V0X29iamVjdFwiXG4gICAgfSk7XG4gIH1cbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSk7XG4gICAgaWYgKF9vYmplY3QuZW5hYmxlX2F1ZGl0ICYmIChwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyA6IHZvaWQgMCkpIHtcbiAgICAgIHJlbGF0ZWRfb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgb2JqZWN0X25hbWU6IFwiYXVkaXRfcmVjb3Jkc1wiLFxuICAgICAgICBmb3JlaWduX2tleTogXCJyZWxhdGVkX3RvXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVsYXRlZF9vYmplY3RzO1xufTtcblxuQ3JlYXRvci5nZXRVc2VyQ29udGV4dCA9IGZ1bmN0aW9uKHVzZXJJZCwgc3BhY2VJZCwgaXNVblNhZmVNb2RlKSB7XG4gIHZhciBVU0VSX0NPTlRFWFQsIHJlZiwgc3BhY2VfdXNlcl9vcmcsIHN1LCBzdUZpZWxkcztcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHJldHVybiBDcmVhdG9yLlVTRVJfQ09OVEVYVDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoISh1c2VySWQgJiYgc3BhY2VJZCkpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcInRoZSBwYXJhbXMgdXNlcklkIGFuZCBzcGFjZUlkIGlzIHJlcXVpcmVkIGZvciB0aGUgZnVuY3Rpb24gQ3JlYXRvci5nZXRVc2VyQ29udGV4dFwiKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdUZpZWxkcyA9IHtcbiAgICAgIG5hbWU6IDEsXG4gICAgICBtb2JpbGU6IDEsXG4gICAgICBwb3NpdGlvbjogMSxcbiAgICAgIGVtYWlsOiAxLFxuICAgICAgY29tcGFueTogMSxcbiAgICAgIG9yZ2FuaXphdGlvbjogMSxcbiAgICAgIHNwYWNlOiAxLFxuICAgICAgY29tcGFueV9pZDogMSxcbiAgICAgIGNvbXBhbnlfaWRzOiAxXG4gICAgfTtcbiAgICBzdSA9IENyZWF0b3IuQ29sbGVjdGlvbnNbXCJzcGFjZV91c2Vyc1wiXS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgdXNlcjogdXNlcklkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiBzdUZpZWxkc1xuICAgIH0pO1xuICAgIGlmICghc3UpIHtcbiAgICAgIHNwYWNlSWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIGlmIChpc1VuU2FmZU1vZGUpIHtcbiAgICAgICAgc3UgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7XG4gICAgICAgICAgdXNlcjogdXNlcklkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHN1RmllbGRzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXN1KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3BhY2VJZCA9IHN1LnNwYWNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIFVTRVJfQ09OVEVYVCA9IHt9O1xuICAgIFVTRVJfQ09OVEVYVC51c2VySWQgPSB1c2VySWQ7XG4gICAgVVNFUl9DT05URVhULnNwYWNlSWQgPSBzcGFjZUlkO1xuICAgIFVTRVJfQ09OVEVYVC51c2VyID0ge1xuICAgICAgX2lkOiB1c2VySWQsXG4gICAgICBuYW1lOiBzdS5uYW1lLFxuICAgICAgbW9iaWxlOiBzdS5tb2JpbGUsXG4gICAgICBwb3NpdGlvbjogc3UucG9zaXRpb24sXG4gICAgICBlbWFpbDogc3UuZW1haWwsXG4gICAgICBjb21wYW55OiBzdS5jb21wYW55LFxuICAgICAgY29tcGFueV9pZDogc3UuY29tcGFueV9pZCxcbiAgICAgIGNvbXBhbnlfaWRzOiBzdS5jb21wYW55X2lkc1xuICAgIH07XG4gICAgc3BhY2VfdXNlcl9vcmcgPSAocmVmID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwib3JnYW5pemF0aW9uc1wiKSkgIT0gbnVsbCA/IHJlZi5maW5kT25lKHN1Lm9yZ2FuaXphdGlvbikgOiB2b2lkIDA7XG4gICAgaWYgKHNwYWNlX3VzZXJfb3JnKSB7XG4gICAgICBVU0VSX0NPTlRFWFQudXNlci5vcmdhbml6YXRpb24gPSB7XG4gICAgICAgIF9pZDogc3BhY2VfdXNlcl9vcmcuX2lkLFxuICAgICAgICBuYW1lOiBzcGFjZV91c2VyX29yZy5uYW1lLFxuICAgICAgICBmdWxsbmFtZTogc3BhY2VfdXNlcl9vcmcuZnVsbG5hbWVcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBVU0VSX0NPTlRFWFQ7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0UmVsYXRpdmVVcmwgPSBmdW5jdGlvbih1cmwpIHtcbiAgaWYgKF8uaXNGdW5jdGlvbihTdGVlZG9zLmlzQ29yZG92YSkgJiYgU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAoKHVybCAhPSBudWxsID8gdXJsLnN0YXJ0c1dpdGgoXCIvYXNzZXRzXCIpIDogdm9pZCAwKSB8fCAodXJsICE9IG51bGwgPyB1cmwuc3RhcnRzV2l0aChcImFzc2V0c1wiKSA6IHZvaWQgMCkgfHwgKHVybCAhPSBudWxsID8gdXJsLnN0YXJ0c1dpdGgoXCIvcGFja2FnZXNcIikgOiB2b2lkIDApKSkge1xuICAgIGlmICghL15cXC8vLnRlc3QodXJsKSkge1xuICAgICAgdXJsID0gXCIvXCIgKyB1cmw7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgaWYgKHVybCkge1xuICAgIGlmICghL15cXC8vLnRlc3QodXJsKSkge1xuICAgICAgdXJsID0gXCIvXCIgKyB1cmw7XG4gICAgfVxuICAgIHJldHVybiBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYICsgdXJsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBfX21ldGVvcl9ydW50aW1lX2NvbmZpZ19fLlJPT1RfVVJMX1BBVEhfUFJFRklYO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldFVzZXJDb21wYW55SWQgPSBmdW5jdGlvbih1c2VySWQsIHNwYWNlSWQpIHtcbiAgdmFyIHN1O1xuICB1c2VySWQgPSB1c2VySWQgfHwgTWV0ZW9yLnVzZXJJZCgpO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgc3BhY2VJZCA9IHNwYWNlSWQgfHwgU2Vzc2lvbi5nZXQoJ3NwYWNlSWQnKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAnbWlzcyBzcGFjZUlkJyk7XG4gICAgfVxuICB9XG4gIHN1ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdzcGFjZV91c2VycycpLmZpbmRPbmUoe1xuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIHVzZXI6IHVzZXJJZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBjb21wYW55X2lkOiAxXG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHN1LmNvbXBhbnlfaWQ7XG59O1xuXG5DcmVhdG9yLmdldFVzZXJDb21wYW55SWRzID0gZnVuY3Rpb24odXNlcklkLCBzcGFjZUlkKSB7XG4gIHZhciBzdTtcbiAgdXNlcklkID0gdXNlcklkIHx8IE1ldGVvci51c2VySWQoKTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHNwYWNlSWQgPSBzcGFjZUlkIHx8IFNlc3Npb24uZ2V0KCdzcGFjZUlkJyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ21pc3Mgc3BhY2VJZCcpO1xuICAgIH1cbiAgfVxuICBzdSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignc3BhY2VfdXNlcnMnKS5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICB1c2VyOiB1c2VySWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgY29tcGFueV9pZHM6IDFcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3UgIT0gbnVsbCA/IHN1LmNvbXBhbnlfaWRzIDogdm9pZCAwO1xufTtcblxuQ3JlYXRvci5wcm9jZXNzUGVybWlzc2lvbnMgPSBmdW5jdGlvbihwbykge1xuICBpZiAocG8uYWxsb3dDcmVhdGUpIHtcbiAgICBwby5hbGxvd1JlYWQgPSB0cnVlO1xuICB9XG4gIGlmIChwby5hbGxvd0VkaXQpIHtcbiAgICBwby5hbGxvd1JlYWQgPSB0cnVlO1xuICB9XG4gIGlmIChwby5hbGxvd0RlbGV0ZSkge1xuICAgIHBvLmFsbG93RWRpdCA9IHRydWU7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8udmlld0FsbFJlY29yZHMpIHtcbiAgICBwby5hbGxvd1JlYWQgPSB0cnVlO1xuICB9XG4gIGlmIChwby5tb2RpZnlBbGxSZWNvcmRzKSB7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgICBwby5hbGxvd0VkaXQgPSB0cnVlO1xuICAgIHBvLmFsbG93RGVsZXRlID0gdHJ1ZTtcbiAgICBwby52aWV3QWxsUmVjb3JkcyA9IHRydWU7XG4gIH1cbiAgaWYgKHBvLnZpZXdDb21wYW55UmVjb3Jkcykge1xuICAgIHBvLmFsbG93UmVhZCA9IHRydWU7XG4gIH1cbiAgaWYgKHBvLm1vZGlmeUNvbXBhbnlSZWNvcmRzKSB7XG4gICAgcG8uYWxsb3dSZWFkID0gdHJ1ZTtcbiAgICBwby5hbGxvd0VkaXQgPSB0cnVlO1xuICAgIHBvLmFsbG93RGVsZXRlID0gdHJ1ZTtcbiAgICBwby52aWV3Q29tcGFueVJlY29yZHMgPSB0cnVlO1xuICB9XG4gIGlmIChwby5hbGxvd1JlYWQpIHtcbiAgICB0eXBlb2YgcG8uYWxsb3dSZWFkRmlsZXMgIT09IFwiYm9vbGVhblwiICYmIChwby5hbGxvd1JlYWRGaWxlcyA9IHRydWUpO1xuICAgIHR5cGVvZiBwby52aWV3QWxsRmlsZXMgIT09IFwiYm9vbGVhblwiICYmIChwby52aWV3QWxsRmlsZXMgPSB0cnVlKTtcbiAgfVxuICBpZiAocG8uYWxsb3dFZGl0KSB7XG4gICAgdHlwZW9mIHBvLmFsbG93Q3JlYXRlRmlsZXMgIT09IFwiYm9vbGVhblwiICYmIChwby5hbGxvd0NyZWF0ZUZpbGVzID0gdHJ1ZSk7XG4gICAgdHlwZW9mIHBvLmFsbG93RWRpdEZpbGVzICE9PSBcImJvb2xlYW5cIiAmJiAocG8uYWxsb3dFZGl0RmlsZXMgPSB0cnVlKTtcbiAgICB0eXBlb2YgcG8uYWxsb3dEZWxldGVGaWxlcyAhPT0gXCJib29sZWFuXCIgJiYgKHBvLmFsbG93RGVsZXRlRmlsZXMgPSB0cnVlKTtcbiAgfVxuICBpZiAocG8ubW9kaWZ5QWxsUmVjb3Jkcykge1xuICAgIHR5cGVvZiBwby5tb2RpZnlBbGxGaWxlcyAhPT0gXCJib29sZWFuXCIgJiYgKHBvLm1vZGlmeUFsbEZpbGVzID0gdHJ1ZSk7XG4gIH1cbiAgaWYgKHBvLmFsbG93Q3JlYXRlRmlsZXMpIHtcbiAgICBwby5hbGxvd1JlYWRGaWxlcyA9IHRydWU7XG4gIH1cbiAgaWYgKHBvLmFsbG93RWRpdEZpbGVzKSB7XG4gICAgcG8uYWxsb3dSZWFkRmlsZXMgPSB0cnVlO1xuICB9XG4gIGlmIChwby5hbGxvd0RlbGV0ZUZpbGVzKSB7XG4gICAgcG8uYWxsb3dFZGl0RmlsZXMgPSB0cnVlO1xuICAgIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZTtcbiAgfVxuICBpZiAocG8udmlld0FsbEZpbGVzKSB7XG4gICAgcG8uYWxsb3dSZWFkRmlsZXMgPSB0cnVlO1xuICB9XG4gIGlmIChwby5tb2RpZnlBbGxGaWxlcykge1xuICAgIHBvLmFsbG93UmVhZEZpbGVzID0gdHJ1ZTtcbiAgICBwby5hbGxvd0VkaXRGaWxlcyA9IHRydWU7XG4gICAgcG8uYWxsb3dEZWxldGVGaWxlcyA9IHRydWU7XG4gICAgcG8udmlld0FsbEZpbGVzID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcG87XG59O1xuXG5DcmVhdG9yLmdldFRlbXBsYXRlU3BhY2VJZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVmO1xuICByZXR1cm4gKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IHJlZi50ZW1wbGF0ZVNwYWNlSWQgOiB2b2lkIDA7XG59O1xuXG5DcmVhdG9yLmdldENsb3VkQWRtaW5TcGFjZUlkID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZWY7XG4gIHJldHVybiAocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gcmVmLmNsb3VkQWRtaW5TcGFjZUlkIDogdm9pZCAwO1xufTtcblxuQ3JlYXRvci5pc1RlbXBsYXRlU3BhY2UgPSBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIHZhciByZWY7XG4gIGlmIChzcGFjZUlkICYmICgocmVmID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gcmVmLnRlbXBsYXRlU3BhY2VJZCA6IHZvaWQgMCkgPT09IHNwYWNlSWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5DcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlID0gZnVuY3Rpb24oc3BhY2VJZCkge1xuICB2YXIgcmVmO1xuICBpZiAoc3BhY2VJZCAmJiAoKHJlZiA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IHJlZi5jbG91ZEFkbWluU3BhY2VJZCA6IHZvaWQgMCkgPT09IHNwYWNlSWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIENyZWF0b3Iuc3RlZWRvc1N0b3JhZ2VEaXIgPSBwcm9jZXNzLmVudi5TVEVFRE9TX1NUT1JBR0VfRElSO1xufVxuIiwiTWV0ZW9yLm1ldGhvZHNcblx0IyDnlKjmiLfojrflj5Zsb29rdXAg44CBbWFzdGVyX2RldGFpbOexu+Wei+Wtl+auteeahOmAiemhueWAvFxuXHRcImNyZWF0b3Iub2JqZWN0X29wdGlvbnNcIjogKG9wdGlvbnMpLT5cblx0XHRpZiBvcHRpb25zPy5wYXJhbXM/LnJlZmVyZW5jZV90b1xuXG5cdFx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvcHRpb25zLnBhcmFtcy5yZWZlcmVuY2VfdG8sIG9wdGlvbnMucGFyYW1zLnNwYWNlKVxuXG5cdFx0XHRuYW1lX2ZpZWxkX2tleSA9IG9iamVjdC5OQU1FX0ZJRUxEX0tFWVxuXG5cdFx0XHRxdWVyeSA9IHt9XG5cdFx0XHRpZiBvcHRpb25zLnBhcmFtcy5zcGFjZVxuXHRcdFx0XHRxdWVyeS5zcGFjZSA9IG9wdGlvbnMucGFyYW1zLnNwYWNlXG5cblx0XHRcdFx0c29ydCA9IG9wdGlvbnM/LnNvcnRcblxuXHRcdFx0XHRzZWxlY3RlZCA9IG9wdGlvbnM/LnNlbGVjdGVkIHx8IFtdXG5cblx0XHRcdFx0b3B0aW9uc19saW1pdCA9IG9wdGlvbnM/Lm9wdGlvbnNfbGltaXQgfHwgMTBcblxuXHRcdFx0XHRpZiBvcHRpb25zLnNlYXJjaFRleHRcblx0XHRcdFx0XHRzZWFyY2hUZXh0UXVlcnkgPSB7fVxuXHRcdFx0XHRcdHNlYXJjaFRleHRRdWVyeVtuYW1lX2ZpZWxkX2tleV0gPSB7JHJlZ2V4OiBvcHRpb25zLnNlYXJjaFRleHR9XG5cblx0XHRcdFx0aWYgb3B0aW9ucz8udmFsdWVzPy5sZW5ndGhcblx0XHRcdFx0XHRpZiBvcHRpb25zLnNlYXJjaFRleHRcblx0XHRcdFx0XHRcdHF1ZXJ5LiRvciA9IFt7X2lkOiB7JGluOiBvcHRpb25zLnZhbHVlc319LCBzZWFyY2hUZXh0UXVlcnldXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cXVlcnkuJG9yID0gW3tfaWQ6IHskaW46IG9wdGlvbnMudmFsdWVzfX1dXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRpZiBvcHRpb25zLnNlYXJjaFRleHRcblx0XHRcdFx0XHRcdF8uZXh0ZW5kKHF1ZXJ5LCBzZWFyY2hUZXh0UXVlcnkpXG5cdFx0XHRcdFx0cXVlcnkuX2lkID0geyRuaW46IHNlbGVjdGVkfVxuXG5cdFx0XHRcdGNvbGxlY3Rpb24gPSBvYmplY3QuZGJcblxuXHRcdFx0XHRpZiBvcHRpb25zLmZpbHRlclF1ZXJ5XG5cdFx0XHRcdFx0Xy5leHRlbmQgcXVlcnksIG9wdGlvbnMuZmlsdGVyUXVlcnlcblxuXHRcdFx0XHRxdWVyeV9vcHRpb25zID0ge2xpbWl0OiBvcHRpb25zX2xpbWl0fVxuXG5cdFx0XHRcdGlmIHNvcnQgJiYgXy5pc09iamVjdChzb3J0KVxuXHRcdFx0XHRcdHF1ZXJ5X29wdGlvbnMuc29ydCA9IHNvcnRcblxuXHRcdFx0XHRpZiBjb2xsZWN0aW9uXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRyZWNvcmRzID0gY29sbGVjdGlvbi5maW5kKHF1ZXJ5LCBxdWVyeV9vcHRpb25zKS5mZXRjaCgpXG5cdFx0XHRcdFx0XHRyZXN1bHRzID0gW11cblx0XHRcdFx0XHRcdF8uZWFjaCByZWNvcmRzLCAocmVjb3JkKS0+XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiByZWNvcmRbbmFtZV9maWVsZF9rZXldXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHJlY29yZC5faWRcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzXG5cdFx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvciA1MDAsIGUubWVzc2FnZSArIFwiLS0+XCIgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zKVxuXHRcdHJldHVybiBbXSAiLCJNZXRlb3IubWV0aG9kcyh7XG4gIFwiY3JlYXRvci5vYmplY3Rfb3B0aW9uc1wiOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24sIGUsIG5hbWVfZmllbGRfa2V5LCBvYmplY3QsIG9wdGlvbnNfbGltaXQsIHF1ZXJ5LCBxdWVyeV9vcHRpb25zLCByZWNvcmRzLCByZWYsIHJlZjEsIHJlc3VsdHMsIHNlYXJjaFRleHRRdWVyeSwgc2VsZWN0ZWQsIHNvcnQ7XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCA/IChyZWYgPSBvcHRpb25zLnBhcmFtcykgIT0gbnVsbCA/IHJlZi5yZWZlcmVuY2VfdG8gOiB2b2lkIDAgOiB2b2lkIDApIHtcbiAgICAgIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9wdGlvbnMucGFyYW1zLnJlZmVyZW5jZV90bywgb3B0aW9ucy5wYXJhbXMuc3BhY2UpO1xuICAgICAgbmFtZV9maWVsZF9rZXkgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVk7XG4gICAgICBxdWVyeSA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMucGFyYW1zLnNwYWNlKSB7XG4gICAgICAgIHF1ZXJ5LnNwYWNlID0gb3B0aW9ucy5wYXJhbXMuc3BhY2U7XG4gICAgICAgIHNvcnQgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnNvcnQgOiB2b2lkIDA7XG4gICAgICAgIHNlbGVjdGVkID0gKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMuc2VsZWN0ZWQgOiB2b2lkIDApIHx8IFtdO1xuICAgICAgICBvcHRpb25zX2xpbWl0ID0gKG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMub3B0aW9uc19saW1pdCA6IHZvaWQgMCkgfHwgMTA7XG4gICAgICAgIGlmIChvcHRpb25zLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICBzZWFyY2hUZXh0UXVlcnkgPSB7fTtcbiAgICAgICAgICBzZWFyY2hUZXh0UXVlcnlbbmFtZV9maWVsZF9rZXldID0ge1xuICAgICAgICAgICAgJHJlZ2V4OiBvcHRpb25zLnNlYXJjaFRleHRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwgPyAocmVmMSA9IG9wdGlvbnMudmFsdWVzKSAhPSBudWxsID8gcmVmMS5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICBxdWVyeS4kb3IgPSBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgICAgICAgICRpbjogb3B0aW9ucy52YWx1ZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIHNlYXJjaFRleHRRdWVyeVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkuJG9yID0gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX2lkOiB7XG4gICAgICAgICAgICAgICAgICAkaW46IG9wdGlvbnMudmFsdWVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICBfLmV4dGVuZChxdWVyeSwgc2VhcmNoVGV4dFF1ZXJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVlcnkuX2lkID0ge1xuICAgICAgICAgICAgJG5pbjogc2VsZWN0ZWRcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbGxlY3Rpb24gPSBvYmplY3QuZGI7XG4gICAgICAgIGlmIChvcHRpb25zLmZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgXy5leHRlbmQocXVlcnksIG9wdGlvbnMuZmlsdGVyUXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5X29wdGlvbnMgPSB7XG4gICAgICAgICAgbGltaXQ6IG9wdGlvbnNfbGltaXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNvcnQgJiYgXy5pc09iamVjdChzb3J0KSkge1xuICAgICAgICAgIHF1ZXJ5X29wdGlvbnMuc29ydCA9IHNvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVjb3JkcyA9IGNvbGxlY3Rpb24uZmluZChxdWVyeSwgcXVlcnlfb3B0aW9ucykuZmV0Y2goKTtcbiAgICAgICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgIF8uZWFjaChyZWNvcmRzLCBmdW5jdGlvbihyZWNvcmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHJlY29yZFtuYW1lX2ZpZWxkX2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5faWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDUwMCwgZS5tZXNzYWdlICsgXCItLT5cIiArIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG59KTtcbiIsIkNyZWF0b3IuZ2V0SW5pdFdpZHRoUGVyY2VudCA9IChvYmplY3RfbmFtZSwgY29sdW1ucykgLT5cblx0X3NjaGVtYSA9IENyZWF0b3IuZ2V0U2NoZW1hKG9iamVjdF9uYW1lKT8uX3NjaGVtYVxuXHRjb2x1bW5fbnVtID0gMFxuXHRpZiBfc2NoZW1hXG5cdFx0Xy5lYWNoIGNvbHVtbnMsIChmaWVsZF9uYW1lKSAtPlxuXHRcdFx0ZmllbGQgPSBfLnBpY2soX3NjaGVtYSwgZmllbGRfbmFtZSlcblx0XHRcdGlzX3dpZGUgPSBmaWVsZFtmaWVsZF9uYW1lXT8uYXV0b2Zvcm0/LmlzX3dpZGVcblx0XHRcdGlmIGlzX3dpZGVcblx0XHRcdFx0Y29sdW1uX251bSArPSAyXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGNvbHVtbl9udW0gKz0gMVxuXG5cdFx0aW5pdF93aWR0aF9wZXJjZW50ID0gMTAwIC8gY29sdW1uX251bVxuXHRcdHJldHVybiBpbml0X3dpZHRoX3BlcmNlbnRcblxuQ3JlYXRvci5nZXRGaWVsZElzV2lkZSA9IChvYmplY3RfbmFtZSwgZmllbGRfbmFtZSkgLT5cblx0X3NjaGVtYSA9IENyZWF0b3IuZ2V0U2NoZW1hKG9iamVjdF9uYW1lKS5fc2NoZW1hXG5cdGlmIF9zY2hlbWFcblx0XHRmaWVsZCA9IF8ucGljayhfc2NoZW1hLCBmaWVsZF9uYW1lKVxuXHRcdGlzX3dpZGUgPSBmaWVsZFtmaWVsZF9uYW1lXT8uYXV0b2Zvcm0/LmlzX3dpZGVcblx0XHRyZXR1cm4gaXNfd2lkZVxuXG5DcmVhdG9yLmdldFRhYnVsYXJPcmRlciA9IChvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5zKSAtPlxuXHRzZXR0aW5nID0gQ3JlYXRvci5Db2xsZWN0aW9ucz8uc2V0dGluZ3M/LmZpbmRPbmUoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgcmVjb3JkX2lkOiBcIm9iamVjdF9saXN0dmlld3NcIn0pXG5cdG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRjb2x1bW5zID0gXy5tYXAgY29sdW1ucywgKGNvbHVtbiktPlxuXHRcdGZpZWxkID0gb2JqLmZpZWxkc1tjb2x1bW5dXG5cdFx0aWYgZmllbGQ/LnR5cGUgYW5kICFmaWVsZC5oaWRkZW5cblx0XHRcdHJldHVybiBjb2x1bW5cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkXG5cdGNvbHVtbnMgPSBfLmNvbXBhY3QgY29sdW1uc1xuXHRpZiBzZXR0aW5nIGFuZCBzZXR0aW5nLnNldHRpbmdzXG5cdFx0c29ydCA9IHNldHRpbmcuc2V0dGluZ3NbbGlzdF92aWV3X2lkXT8uc29ydCB8fCBbXVxuXHRcdHNvcnQgPSBfLm1hcCBzb3J0LCAob3JkZXIpLT5cblx0XHRcdGtleSA9IG9yZGVyWzBdXG5cdFx0XHRpbmRleCA9IF8uaW5kZXhPZihjb2x1bW5zLCBrZXkpXG5cdFx0XHRvcmRlclswXSA9IGluZGV4ICsgMVxuXHRcdFx0cmV0dXJuIG9yZGVyXG5cdFx0cmV0dXJuIHNvcnRcblx0cmV0dXJuIFtdXG5cblxuQ3JlYXRvci5pbml0TGlzdFZpZXdzID0gKG9iamVjdF9uYW1lKS0+XG5cdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRjb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0Q29sdW1ucyhvYmplY3RfbmFtZSkgfHwgW1wibmFtZVwiXVxuXHRleHRyYV9jb2x1bW5zID0gW1wib3duZXJcIl1cblx0ZGVmYXVsdF9leHRyYV9jb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0RXh0cmFDb2x1bW5zKG9iamVjdF9uYW1lKSB8fCBbXCJvd25lclwiXVxuXHRpZiBkZWZhdWx0X2V4dHJhX2NvbHVtbnNcblx0XHRleHRyYV9jb2x1bW5zID0gXy51bmlvbiBleHRyYV9jb2x1bW5zLCBkZWZhdWx0X2V4dHJhX2NvbHVtbnNcblxuXHRvcmRlciA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQob2JqZWN0X25hbWUpIHx8IFtdXG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdENyZWF0b3IuVGFidWxhclNlbGVjdGVkSWRzP1tvYmplY3RfbmFtZV0gPSBbXVxuXG5DcmVhdG9yLmNvbnZlcnRMaXN0VmlldyA9IChkZWZhdWx0X3ZpZXcsIGxpc3RfdmlldywgbGlzdF92aWV3X25hbWUpLT5cblx0ZGVmYXVsdF9jb2x1bW5zID0gZGVmYXVsdF92aWV3Py5jb2x1bW5zXG5cdGRlZmF1bHRfbW9iaWxlX2NvbHVtbnMgPSBkZWZhdWx0X3ZpZXc/Lm1vYmlsZV9jb2x1bW5zXG5cdHVubGVzcyBsaXN0X3ZpZXdcblx0XHRyZXR1cm5cblx0b2l0ZW0gPSBfLmNsb25lKGxpc3Rfdmlldylcblx0aWYgIV8uaGFzKG9pdGVtLCBcIm5hbWVcIilcblx0XHRvaXRlbS5uYW1lID0gbGlzdF92aWV3X25hbWVcblx0aWYgIW9pdGVtLmNvbHVtbnNcblx0XHRpZiBkZWZhdWx0X2NvbHVtbnNcblx0XHRcdG9pdGVtLmNvbHVtbnMgPSBkZWZhdWx0X2NvbHVtbnNcblx0aWYgIW9pdGVtLmNvbHVtbnNcblx0XHRvaXRlbS5jb2x1bW5zID0gW1wibmFtZVwiXVxuXHRpZiAhb2l0ZW0ubW9iaWxlX2NvbHVtbnNcblx0XHRpZiBkZWZhdWx0X21vYmlsZV9jb2x1bW5zXG5cdFx0XHRvaXRlbS5tb2JpbGVfY29sdW1ucyA9IGRlZmF1bHRfbW9iaWxlX2NvbHVtbnNcblxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiBDcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlKFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSkgJiYgIV8uaW5jbHVkZShvaXRlbS5jb2x1bW5zLCAnc3BhY2UnKVxuXHRcdFx0b2l0ZW0uY29sdW1ucy5wdXNoKCdzcGFjZScpXG5cblxuXHRpZiAhb2l0ZW0uZmlsdGVyX3Njb3BlXG5cdFx0IyBsaXN0dmlld+inhuWbvueahGZpbHRlcl9zY29wZem7mOiupOWAvOaUueS4unNwYWNlICMxMzFcblx0XHRvaXRlbS5maWx0ZXJfc2NvcGUgPSBcInNwYWNlXCJcblxuXHRpZiAhXy5oYXMob2l0ZW0sIFwiX2lkXCIpXG5cdFx0b2l0ZW0uX2lkID0gbGlzdF92aWV3X25hbWVcblx0ZWxzZVxuXHRcdG9pdGVtLmxhYmVsID0gb2l0ZW0ubGFiZWwgfHwgbGlzdF92aWV3Lm5hbWVcblxuXHRpZiBfLmlzU3RyaW5nKG9pdGVtLm9wdGlvbnMpXG5cdFx0b2l0ZW0ub3B0aW9ucyA9IEpTT04ucGFyc2Uob2l0ZW0ub3B0aW9ucylcblxuXHRfLmZvckVhY2ggb2l0ZW0uZmlsdGVycywgKGZpbHRlciwgX2luZGV4KS0+XG5cdFx0aWYgIV8uaXNBcnJheShmaWx0ZXIpICYmIF8uaXNPYmplY3QoZmlsdGVyKVxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdGlmIF8uaXNGdW5jdGlvbihmaWx0ZXI/LnZhbHVlKVxuXHRcdFx0XHRcdGZpbHRlci5fdmFsdWUgPSBmaWx0ZXIudmFsdWUudG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpZiBfLmlzU3RyaW5nKGZpbHRlcj8uX3ZhbHVlKVxuXHRcdFx0XHRcdGZpbHRlci52YWx1ZSA9IENyZWF0b3IuZXZhbChcIigje2ZpbHRlci5fdmFsdWV9KVwiKVxuXHRyZXR1cm4gb2l0ZW1cblxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0Q3JlYXRvci5nZXRSZWxhdGVkTGlzdCA9IChvYmplY3RfbmFtZSktPlxuXHRcdHVubGVzcyBvYmplY3RfbmFtZVxuXHRcdFx0cmV0dXJuXG5cdFx0cmVsYXRlZExpc3RPYmplY3RzID0ge31cblx0XHRyZWxhdGVkTGlzdE5hbWVzID0gW11cblx0XHRvYmplY3RMYXlvdXRSZWxhdGVkTGlzdE9iamVjdHMgPSBbXTtcblx0XHRfb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdFx0aWYgX29iamVjdFxuXHRcdFx0bGF5b3V0UmVsYXRlZExpc3QgPSBfb2JqZWN0LnJlbGF0ZWRfbGlzdHM7XG5cdFx0XHQjIGxheW91dFJlbGF0ZWRMaXN0IOaYr+aVsOe7hOWwseihqOekuumFjee9rui/h+mhtemdouW4g+WxgO+8jOWwseWQr+eUqOmhtemdouW4g+WxgOeahOebuOWFs+WtkOihqOOAglxuXHRcdFx0aWYgXy5pc0FycmF5IGxheW91dFJlbGF0ZWRMaXN0XG5cdFx0XHRcdF8uZWFjaCBsYXlvdXRSZWxhdGVkTGlzdCwgKGl0ZW0pLT5cblx0XHRcdFx0XHRyZU9iamVjdE5hbWUgPSBpdGVtLnJlbGF0ZWRfZmllbGRfZnVsbG5hbWUuc3BsaXQoJy4nKVswXVxuXHRcdFx0XHRcdHJlRmllbGROYW1lID0gaXRlbS5yZWxhdGVkX2ZpZWxkX2Z1bGxuYW1lLnNwbGl0KCcuJylbMV1cblx0XHRcdFx0XHR3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlT2JqZWN0TmFtZSk/LmZpZWxkc1tyZUZpZWxkTmFtZV0/LndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG5cdFx0XHRcdFx0cmVsYXRlZCA9XG5cdFx0XHRcdFx0XHRvYmplY3RfbmFtZTogcmVPYmplY3ROYW1lXG5cdFx0XHRcdFx0XHRjb2x1bW5zOiBpdGVtLmZpZWxkX25hbWVzXG5cdFx0XHRcdFx0XHRtb2JpbGVfY29sdW1uczogaXRlbS5maWVsZF9uYW1lc1xuXHRcdFx0XHRcdFx0aXNfZmlsZTogcmVPYmplY3ROYW1lID09IFwiY21zX2ZpbGVzXCJcblx0XHRcdFx0XHRcdGZpbHRlcnNGdW5jdGlvbjogaXRlbS5maWx0ZXJzXG5cdFx0XHRcdFx0XHRzb3J0OiBpdGVtLnNvcnRcblx0XHRcdFx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZTogcmVGaWVsZE5hbWVcblx0XHRcdFx0XHRcdGN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0OiB0cnVlXG5cdFx0XHRcdFx0XHR3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZDogd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWRcblx0XHRcdFx0XHRcdGxhYmVsOiBpdGVtLmxhYmVsXG5cdFx0XHRcdFx0XHRhY3Rpb25zOiBpdGVtLmJ1dHRvbnNcblx0XHRcdFx0XHRcdHZpc2libGVfb246IGl0ZW0udmlzaWJsZV9vblxuXHRcdFx0XHRcdFx0cGFnZV9zaXplOiBpdGVtLnBhZ2Vfc2l6ZVxuXHRcdFx0XHRcdG9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cy5wdXNoKHJlbGF0ZWQpXG5cdFx0XHRcdHJldHVybiBvYmplY3RMYXlvdXRSZWxhdGVkTGlzdE9iamVjdHM7XG5cdFx0XHRyZWxhdGVkTGlzdCA9IF9vYmplY3QucmVsYXRlZExpc3Rcblx0XHRcdGlmICFfLmlzRW1wdHkgcmVsYXRlZExpc3Rcblx0XHRcdFx0Xy5lYWNoIHJlbGF0ZWRMaXN0LCAob2JqT3JOYW1lKS0+XG5cdFx0XHRcdFx0aWYgXy5pc09iamVjdCBvYmpPck5hbWVcblx0XHRcdFx0XHRcdHJlbGF0ZWQgPVxuXHRcdFx0XHRcdFx0XHRvYmplY3RfbmFtZTogb2JqT3JOYW1lLm9iamVjdE5hbWVcblx0XHRcdFx0XHRcdFx0Y29sdW1uczogb2JqT3JOYW1lLmNvbHVtbnNcblx0XHRcdFx0XHRcdFx0bW9iaWxlX2NvbHVtbnM6IG9iak9yTmFtZS5tb2JpbGVfY29sdW1uc1xuXHRcdFx0XHRcdFx0XHRpc19maWxlOiBvYmpPck5hbWUub2JqZWN0TmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHRcdFx0XHRcdGZpbHRlcnNGdW5jdGlvbjogb2JqT3JOYW1lLmZpbHRlcnNcblx0XHRcdFx0XHRcdFx0c29ydDogb2JqT3JOYW1lLnNvcnRcblx0XHRcdFx0XHRcdFx0cmVsYXRlZF9maWVsZF9uYW1lOiAnJ1xuXHRcdFx0XHRcdFx0XHRjdXN0b21SZWxhdGVkTGlzdE9iamVjdDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHRsYWJlbDogb2JqT3JOYW1lLmxhYmVsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbnM6IG9iak9yTmFtZS5hY3Rpb25zXG5cdFx0XHRcdFx0XHRcdHBhZ2Vfc2l6ZTogb2JqT3JOYW1lLnBhZ2Vfc2l6ZVxuXHRcdFx0XHRcdFx0cmVsYXRlZExpc3RPYmplY3RzW29iak9yTmFtZS5vYmplY3ROYW1lXSA9IHJlbGF0ZWRcblx0XHRcdFx0XHRcdHJlbGF0ZWRMaXN0TmFtZXMucHVzaCBvYmpPck5hbWUub2JqZWN0TmFtZVxuXHRcdFx0XHRcdGVsc2UgaWYgXy5pc1N0cmluZyBvYmpPck5hbWVcblx0XHRcdFx0XHRcdHJlbGF0ZWRMaXN0TmFtZXMucHVzaCBvYmpPck5hbWVcblxuXHRcdG1hcExpc3QgPSB7fVxuXHRcdHJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0UmVsYXRlZE9iamVjdHMob2JqZWN0X25hbWUpXG5cdFx0Xy5lYWNoIHJlbGF0ZWRfb2JqZWN0cywgKHJlbGF0ZWRfb2JqZWN0X2l0ZW0pIC0+XG5cdFx0XHRpZiAhcmVsYXRlZF9vYmplY3RfaXRlbT8ub2JqZWN0X25hbWVcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRyZWxhdGVkX29iamVjdF9uYW1lID0gcmVsYXRlZF9vYmplY3RfaXRlbS5vYmplY3RfbmFtZVxuXHRcdFx0cmVsYXRlZF9maWVsZF9uYW1lID0gcmVsYXRlZF9vYmplY3RfaXRlbS5mb3JlaWduX2tleVxuXHRcdFx0d3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPSByZWxhdGVkX29iamVjdF9pdGVtLndyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG5cdFx0XHRyZWxhdGVkX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlbGF0ZWRfb2JqZWN0X25hbWUpXG5cdFx0XHR1bmxlc3MgcmVsYXRlZF9vYmplY3Rcblx0XHRcdFx0cmV0dXJuXG5cdFx0XHRjb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3Q29sdW1ucyhyZWxhdGVkX29iamVjdF9uYW1lKSB8fCBbXCJuYW1lXCJdXG5cdFx0XHRjb2x1bW5zID0gXy53aXRob3V0KGNvbHVtbnMsIHJlbGF0ZWRfZmllbGRfbmFtZSlcblx0XHRcdG1vYmlsZV9jb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3Q29sdW1ucyhyZWxhdGVkX29iamVjdF9uYW1lLCB0cnVlKSB8fCBbXCJuYW1lXCJdXG5cdFx0XHRtb2JpbGVfY29sdW1ucyA9IF8ud2l0aG91dChtb2JpbGVfY29sdW1ucywgcmVsYXRlZF9maWVsZF9uYW1lKVxuXG5cdFx0XHRvcmRlciA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQocmVsYXRlZF9vYmplY3RfbmFtZSlcblx0XHRcdHRhYnVsYXJfb3JkZXIgPSBDcmVhdG9yLnRyYW5zZm9ybVNvcnRUb1RhYnVsYXIob3JkZXIsIGNvbHVtbnMpXG5cblx0XHRcdGlmIC9cXHcrXFwuXFwkXFwuXFx3Ky9nLnRlc3QocmVsYXRlZF9maWVsZF9uYW1lKVxuXHRcdFx0XHQjIG9iamVjdOexu+Wei+W4puWtkOWxnuaAp+eahHJlbGF0ZWRfZmllbGRfbmFtZeimgeWOu+aOieS4remXtOeahOe+juWFg+espuWPt++8jOWQpuWImeaYvuekuuS4jeWHuuWtl+auteWAvFxuXHRcdFx0XHRyZWxhdGVkX2ZpZWxkX25hbWUgPSByZWxhdGVkX2ZpZWxkX25hbWUucmVwbGFjZSgvXFwkXFwuLyxcIlwiKVxuXHRcdFx0cmVsYXRlZCA9XG5cdFx0XHRcdG9iamVjdF9uYW1lOiByZWxhdGVkX29iamVjdF9uYW1lXG5cdFx0XHRcdGNvbHVtbnM6IGNvbHVtbnNcblx0XHRcdFx0bW9iaWxlX2NvbHVtbnM6IG1vYmlsZV9jb2x1bW5zXG5cdFx0XHRcdHJlbGF0ZWRfZmllbGRfbmFtZTogcmVsYXRlZF9maWVsZF9uYW1lXG5cdFx0XHRcdGlzX2ZpbGU6IHJlbGF0ZWRfb2JqZWN0X25hbWUgPT0gXCJjbXNfZmlsZXNcIlxuXHRcdFx0XHR3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZDogd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWRcblxuXHRcdFx0cmVsYXRlZE9iamVjdCA9IHJlbGF0ZWRMaXN0T2JqZWN0c1tyZWxhdGVkX29iamVjdF9uYW1lXVxuXHRcdFx0aWYgcmVsYXRlZE9iamVjdFxuXHRcdFx0XHRpZiByZWxhdGVkT2JqZWN0LmNvbHVtbnNcblx0XHRcdFx0XHRyZWxhdGVkLmNvbHVtbnMgPSByZWxhdGVkT2JqZWN0LmNvbHVtbnNcblx0XHRcdFx0aWYgcmVsYXRlZE9iamVjdC5tb2JpbGVfY29sdW1uc1xuXHRcdFx0XHRcdHJlbGF0ZWQubW9iaWxlX2NvbHVtbnMgPSByZWxhdGVkT2JqZWN0Lm1vYmlsZV9jb2x1bW5zXG5cdFx0XHRcdGlmIHJlbGF0ZWRPYmplY3Quc29ydFxuXHRcdFx0XHRcdHJlbGF0ZWQuc29ydCA9IHJlbGF0ZWRPYmplY3Quc29ydFxuXHRcdFx0XHRpZiByZWxhdGVkT2JqZWN0LmZpbHRlcnNGdW5jdGlvblxuXHRcdFx0XHRcdHJlbGF0ZWQuZmlsdGVyc0Z1bmN0aW9uID0gcmVsYXRlZE9iamVjdC5maWx0ZXJzRnVuY3Rpb25cblx0XHRcdFx0aWYgcmVsYXRlZE9iamVjdC5jdXN0b21SZWxhdGVkTGlzdE9iamVjdFxuXHRcdFx0XHRcdHJlbGF0ZWQuY3VzdG9tUmVsYXRlZExpc3RPYmplY3QgPSByZWxhdGVkT2JqZWN0LmN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0XG5cdFx0XHRcdGlmIHJlbGF0ZWRPYmplY3QubGFiZWxcblx0XHRcdFx0XHRyZWxhdGVkLmxhYmVsID0gcmVsYXRlZE9iamVjdC5sYWJlbFxuXHRcdFx0XHRpZiByZWxhdGVkT2JqZWN0LnBhZ2Vfc2l6ZVxuXHRcdFx0XHRcdHJlbGF0ZWQucGFnZV9zaXplID0gcmVsYXRlZE9iamVjdC5wYWdlX3NpemVcblx0XHRcdFx0ZGVsZXRlIHJlbGF0ZWRMaXN0T2JqZWN0c1tyZWxhdGVkX29iamVjdF9uYW1lXVxuXG5cdFx0XHRtYXBMaXN0W3JlbGF0ZWQub2JqZWN0X25hbWVdID0gcmVsYXRlZFxuXG5cblx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFx0dXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpXG5cdFx0cmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLnBsdWNrKF8udmFsdWVzKHJlbGF0ZWRMaXN0T2JqZWN0cyksIFwib2JqZWN0X25hbWVcIilcblx0XHRwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZClcblx0XHR1bnJlbGF0ZWRfb2JqZWN0cyA9IHBlcm1pc3Npb25zLnVucmVsYXRlZF9vYmplY3RzXG5cdFx0cmVsYXRlZF9vYmplY3RfbmFtZXMgPSBfLmRpZmZlcmVuY2UgcmVsYXRlZF9vYmplY3RfbmFtZXMsIHVucmVsYXRlZF9vYmplY3RzXG5cdFx0Xy5lYWNoIHJlbGF0ZWRMaXN0T2JqZWN0cywgKHYsIHJlbGF0ZWRfb2JqZWN0X25hbWUpIC0+XG5cdFx0XHRpc0FjdGl2ZSA9IHJlbGF0ZWRfb2JqZWN0X25hbWVzLmluZGV4T2YocmVsYXRlZF9vYmplY3RfbmFtZSkgPiAtMVxuXHRcdFx0YWxsb3dSZWFkID0gQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhyZWxhdGVkX29iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpPy5hbGxvd1JlYWRcblx0XHRcdGlmIGlzQWN0aXZlICYmIGFsbG93UmVhZFxuXHRcdFx0XHRtYXBMaXN0W3JlbGF0ZWRfb2JqZWN0X25hbWVdID0gdlxuXG5cdFx0bGlzdCA9IFtdXG5cdFx0aWYgXy5pc0VtcHR5IHJlbGF0ZWRMaXN0TmFtZXNcblx0XHRcdGxpc3QgPSAgXy52YWx1ZXMgbWFwTGlzdFxuXHRcdGVsc2Vcblx0XHRcdF8uZWFjaCByZWxhdGVkTGlzdE5hbWVzLCAob2JqZWN0TmFtZSkgLT5cblx0XHRcdFx0aWYgbWFwTGlzdFtvYmplY3ROYW1lXVxuXHRcdFx0XHRcdGxpc3QucHVzaCBtYXBMaXN0W29iamVjdE5hbWVdXG5cblx0XHRpZiBfLmhhcyhfb2JqZWN0LCAnYWxsb3dfcmVsYXRlZExpc3QnKVxuXHRcdFx0bGlzdCA9IF8uZmlsdGVyIGxpc3QsIChpdGVtKS0+XG5cdFx0XHRcdHJldHVybiBfLmluY2x1ZGUoX29iamVjdC5hbGxvd19yZWxhdGVkTGlzdCwgaXRlbS5vYmplY3RfbmFtZSlcblxuXHRcdHJldHVybiBsaXN0XG5cbkNyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0VmlldyA9IChvYmplY3RfbmFtZSktPlxuXHRyZXR1cm4gXy5maXJzdChDcmVhdG9yLmdldExpc3RWaWV3cyhvYmplY3RfbmFtZSkpXG5cbiMjIyBcblx05Y+W5Ye6bGlzdF92aWV3X2lk5a+55bqU55qE6KeG5Zu+77yM5aaC5p6c5LiN5a2Y5Zyo5oiW6ICF5rKh5pyJ5p2D6ZmQ77yM5bCx6L+U5Zue56ys5LiA5Liq6KeG5Zu+XG5cdGV4YWPkuLp0cnVl5pe277yM6ZyA6KaB5by65Yi25oyJbGlzdF92aWV3X2lk57K+56Gu5p+l5om+77yM5LiN6buY6K6k6L+U5Zue56ys5LiA5Liq6KeG5Zu+XG4jIyNcbkNyZWF0b3IuZ2V0TGlzdFZpZXcgPSAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgZXhhYyktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdGlmICFsaXN0X3ZpZXdfaWRcblx0XHRcdGxpc3Rfdmlld19pZCA9IFNlc3Npb24uZ2V0KFwibGlzdF92aWV3X2lkXCIpXG5cdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRpZiAhb2JqZWN0XG5cdFx0cmV0dXJuXG5cdGxpc3RWaWV3cyA9IENyZWF0b3IuZ2V0TGlzdFZpZXdzKG9iamVjdF9uYW1lKVxuXHR1bmxlc3MgbGlzdFZpZXdzPy5sZW5ndGhcblx0XHRyZXR1cm5cblx0bGlzdF92aWV3ID0gXy5maW5kKGxpc3RWaWV3cywgKGl0ZW0pLT4gcmV0dXJuIGl0ZW0uX2lkID09IGxpc3Rfdmlld19pZCB8fCBpdGVtLm5hbWUgPT0gbGlzdF92aWV3X2lkKVxuXHR1bmxlc3MgbGlzdF92aWV3XG5cdFx0IyDlpoLmnpzkuI3pnIDopoHlvLrliLbmjIlsaXN0X3ZpZXdfaWTnsr7noa7mn6Xmib7vvIzliJnpu5jorqTov5Tlm57nrKzkuIDkuKrop4blm77vvIzlj43kuYvov5Tlm57nqbpcblx0XHRpZiBleGFjXG5cdFx0XHRyZXR1cm5cblx0XHRlbHNlXG5cdFx0XHRsaXN0X3ZpZXcgPSBsaXN0Vmlld3NbMF1cblx0cmV0dXJuIGxpc3Rfdmlld1xuXG4j6I635Y+WbGlzdF92aWV3X2lk5a+55bqU55qE6KeG5Zu+5piv5ZCm5piv5pyA6L+R5p+l55yL6KeG5Zu+XG5DcmVhdG9yLmdldExpc3RWaWV3SXNSZWNlbnQgPSAob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCktPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiAhb2JqZWN0X25hbWVcblx0XHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdGlmICFsaXN0X3ZpZXdfaWRcblx0XHRcdGxpc3Rfdmlld19pZCA9IFNlc3Npb24uZ2V0KFwibGlzdF92aWV3X2lkXCIpXG5cdGlmIHR5cGVvZihsaXN0X3ZpZXdfaWQpID09IFwic3RyaW5nXCJcblx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0XHRpZiAhb2JqZWN0XG5cdFx0XHRyZXR1cm5cblx0XHRsaXN0VmlldyA9IF8uZmluZFdoZXJlKG9iamVjdC5saXN0X3ZpZXdzLHtfaWQ6IGxpc3Rfdmlld19pZH0pXG5cdGVsc2Vcblx0XHRsaXN0VmlldyA9IGxpc3Rfdmlld19pZFxuXHRyZXR1cm4gbGlzdFZpZXc/Lm5hbWUgPT0gXCJyZWNlbnRcIlxuXG5cbiMjI1xuICAgIOS7jmNvbHVtbnPlj4LmlbDkuK3ov4fmu6Tlh7rnlKjkuo7miYvmnLrnq6/mmL7npLrnmoRjb2x1bW5zXG5cdOinhOWIme+8mlxuXHQxLuS8mOWFiOaKimNvbHVtbnPkuK3nmoRuYW1l5a2X5q615o6S5Zyo56ys5LiA5LiqXG5cdDIu5pyA5aSa5Y+q6L+U5ZueNOS4quWtl+autVxuXHQzLuiAg+iZkeWuveWtl+auteWNoOeUqOaVtOihjOinhOWImeadoeS7tuS4i++8jOacgOWkmuWPqui/lOWbnuS4pOihjFxuIyMjXG5DcmVhdG9yLnBpY2tPYmplY3RNb2JpbGVDb2x1bW5zID0gKG9iamVjdF9uYW1lLCBjb2x1bW5zKS0+XG5cdHJlc3VsdCA9IFtdXG5cdG1heFJvd3MgPSAyIFxuXHRtYXhDb3VudCA9IG1heFJvd3MgKiAyXG5cdGNvdW50ID0gMFxuXHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0ZmllbGRzID0gb2JqZWN0LmZpZWxkc1xuXHR1bmxlc3Mgb2JqZWN0XG5cdFx0cmV0dXJuIGNvbHVtbnNcblx0bmFtZUtleSA9IG9iamVjdC5OQU1FX0ZJRUxEX0tFWVxuXHRpc05hbWVDb2x1bW4gPSAoaXRlbSktPlxuXHRcdGlmIF8uaXNPYmplY3QoaXRlbSlcblx0XHRcdHJldHVybiBpdGVtLmZpZWxkID09IG5hbWVLZXlcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gaXRlbSA9PSBuYW1lS2V5XG5cdGdldEZpZWxkID0gKGl0ZW0pLT5cblx0XHRpZiBfLmlzT2JqZWN0KGl0ZW0pXG5cdFx0XHRyZXR1cm4gZmllbGRzW2l0ZW0uZmllbGRdXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGZpZWxkc1tpdGVtXVxuXHRpZiBuYW1lS2V5XG5cdFx0bmFtZUNvbHVtbiA9IGNvbHVtbnMuZmluZCAoaXRlbSktPlxuXHRcdFx0cmV0dXJuIGlzTmFtZUNvbHVtbihpdGVtKVxuXHRpZiBuYW1lQ29sdW1uXG5cdFx0ZmllbGQgPSBnZXRGaWVsZChuYW1lQ29sdW1uKVxuXHRcdGl0ZW1Db3VudCA9IGlmIGZpZWxkLmlzX3dpZGUgdGhlbiAyIGVsc2UgMVxuXHRcdGNvdW50ICs9IGl0ZW1Db3VudFxuXHRcdHJlc3VsdC5wdXNoIG5hbWVDb2x1bW5cblx0Y29sdW1ucy5mb3JFYWNoIChpdGVtKS0+XG5cdFx0ZmllbGQgPSBnZXRGaWVsZChpdGVtKVxuXHRcdHVubGVzcyBmaWVsZFxuXHRcdFx0cmV0dXJuXG5cdFx0aXRlbUNvdW50ID0gaWYgZmllbGQuaXNfd2lkZSB0aGVuIDIgZWxzZSAxXG5cdFx0aWYgY291bnQgPCBtYXhDb3VudCBhbmQgcmVzdWx0Lmxlbmd0aCA8IG1heENvdW50IGFuZCAhaXNOYW1lQ29sdW1uKGl0ZW0pXG5cdFx0XHRjb3VudCArPSBpdGVtQ291bnRcblx0XHRcdGlmIGNvdW50IDw9IG1heENvdW50XG5cdFx0XHRcdHJlc3VsdC5wdXNoIGl0ZW1cblx0XG5cdHJldHVybiByZXN1bHRcblxuIyMjXG4gICAg6I635Y+W6buY6K6k6KeG5Zu+XG4jIyNcbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcgPSAob2JqZWN0X25hbWUpLT5cblx0b2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpXG5cdGlmICFvYmplY3Rcblx0XHRvYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbb2JqZWN0X25hbWVdXG5cdGlmIG9iamVjdD8ubGlzdF92aWV3cz8uZGVmYXVsdFxuXHRcdCNUT0RPIOatpOS7o+eggeWPquaYr+aaguaXtuWFvOWuueS7peWJjWNvZGXkuK3lrprkuYnnmoRkZWZhdWx06KeG5Zu+77yM5b6FY29kZeS4reeahGRlZmF1bHTmuIXnkIblrozmiJDlkI7vvIzpnIDopoHliKDpmaTmraTku6PnoIFcblx0XHRkZWZhdWx0VmlldyA9IG9iamVjdC5saXN0X3ZpZXdzLmRlZmF1bHRcblx0ZWxzZVxuXHRcdF8uZWFjaCBvYmplY3Q/Lmxpc3Rfdmlld3MsIChsaXN0X3ZpZXcsIGtleSktPlxuXHRcdFx0aWYgbGlzdF92aWV3Lm5hbWUgPT0gXCJhbGxcIiB8fCBrZXkgPT0gXCJhbGxcIlxuXHRcdFx0XHRkZWZhdWx0VmlldyA9IGxpc3Rfdmlld1xuXHRyZXR1cm4gZGVmYXVsdFZpZXc7XG5cbiMjI1xuICAgIOiOt+WPluWvueixoeeahOWIl+ihqOm7mOiupOaYvuekuuWtl+autVxuIyMjXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRDb2x1bW5zID0gKG9iamVjdF9uYW1lLCB1c2VfbW9iaWxlX2NvbHVtbnMpLT5cblx0ZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KG9iamVjdF9uYW1lKVxuXHRjb2x1bW5zID0gZGVmYXVsdFZpZXc/LmNvbHVtbnNcblx0aWYgdXNlX21vYmlsZV9jb2x1bW5zXG5cdFx0aWYgZGVmYXVsdFZpZXc/Lm1vYmlsZV9jb2x1bW5zXG5cdFx0XHRjb2x1bW5zID0gZGVmYXVsdFZpZXcubW9iaWxlX2NvbHVtbnNcblx0XHRlbHNlIGlmIGNvbHVtbnNcblx0XHRcdGNvbHVtbnMgPSBDcmVhdG9yLnBpY2tPYmplY3RNb2JpbGVDb2x1bW5zKG9iamVjdF9uYW1lLCBjb2x1bW5zKVxuXHRyZXR1cm4gY29sdW1uc1xuXG4jIyNcbiAgICDojrflj5blr7nosaHnmoTliJfooajnrKzkuIDkuKrop4blm77mmL7npLrnmoTlrZfmrrVcbiMjI1xuQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3Q29sdW1ucyA9IChvYmplY3RfbmFtZSwgdXNlX21vYmlsZV9jb2x1bW5zKS0+XG5cdGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3KG9iamVjdF9uYW1lKVxuXHRjb2x1bW5zID0gZGVmYXVsdFZpZXc/LmNvbHVtbnNcblx0aWYgdXNlX21vYmlsZV9jb2x1bW5zXG5cdFx0aWYgZGVmYXVsdFZpZXc/Lm1vYmlsZV9jb2x1bW5zXG5cdFx0XHRjb2x1bW5zID0gZGVmYXVsdFZpZXcubW9iaWxlX2NvbHVtbnNcblx0XHRlbHNlIGlmIGNvbHVtbnNcblx0XHRcdGNvbHVtbnMgPSBDcmVhdG9yLnBpY2tPYmplY3RNb2JpbGVDb2x1bW5zKG9iamVjdF9uYW1lLCBjb2x1bW5zKVxuXHRyZXR1cm4gY29sdW1uc1xuXG4jIyNcblx06I635Y+W5a+56LGh55qE5YiX6KGo6buY6K6k6aKd5aSW5Yqg6L2955qE5a2X5q61XG4jIyNcbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdEV4dHJhQ29sdW1ucyA9IChvYmplY3RfbmFtZSktPlxuXHRkZWZhdWx0VmlldyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcob2JqZWN0X25hbWUpXG5cdHJldHVybiBkZWZhdWx0Vmlldz8uZXh0cmFfY29sdW1uc1xuXG4jIyNcblx06I635Y+W5a+56LGh55qE6buY6K6k5o6S5bqPXG4jIyNcbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQgPSAob2JqZWN0X25hbWUpLT5cblx0ZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KG9iamVjdF9uYW1lKVxuXHRpZiBkZWZhdWx0Vmlld1xuXHRcdGlmIGRlZmF1bHRWaWV3LnNvcnRcblx0XHRcdHJldHVybiBkZWZhdWx0Vmlldy5zb3J0XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIFtbXCJjcmVhdGVkXCIsIFwiZGVzY1wiXV1cblxuXG4jIyNcbiAgICDliKTmlq3mmK/lkKZBbGwgdmlld1xuIyMjXG5DcmVhdG9yLmlzQWxsVmlldyA9IChsaXN0X3ZpZXcpLT5cblx0cmV0dXJuIGxpc3Rfdmlldz8ubmFtZSA9PSBcImFsbFwiXG5cbiMjI1xuICAgIOWIpOaWreaYr+WQpuacgOi/keafpeeciyB2aWV3XG4jIyNcbkNyZWF0b3IuaXNSZWNlbnRWaWV3ID0gKGxpc3RfdmlldyktPlxuXHRyZXR1cm4gbGlzdF92aWV3Py5uYW1lID09IFwicmVjZW50XCJcblxuIyMjXG4gICAg5bCGc29ydOi9rOaNouS4ulRhYnVsYXLmjqfku7bmiYDpnIDopoHnmoTmoLzlvI9cbiMjI1xuQ3JlYXRvci50cmFuc2Zvcm1Tb3J0VG9UYWJ1bGFyID0gKHNvcnQsIHRhYnVsYXJDb2x1bW5zKS0+XG5cdHRhYnVsYXJfc29ydCA9IFtdXG5cdF8uZWFjaCBzb3J0LCAoaXRlbSktPlxuXHRcdGlmIF8uaXNBcnJheShpdGVtKVxuXHRcdFx0IyDlhbzlrrnml6fnmoTmlbDmja7moLzlvI9bW1wiZmllbGRfbmFtZVwiLCBcIm9yZGVyXCJdXVxuXHRcdFx0aWYgaXRlbS5sZW5ndGggPT0gMVxuXHRcdFx0XHRjb2x1bW5faW5kZXggPSB0YWJ1bGFyQ29sdW1ucy5pbmRleE9mKGl0ZW1bMF0pXG5cdFx0XHRcdGlmIGNvbHVtbl9pbmRleCA+IC0xXG5cdFx0XHRcdFx0dGFidWxhcl9zb3J0LnB1c2ggW2NvbHVtbl9pbmRleCwgXCJhc2NcIl1cblx0XHRcdGVsc2UgaWYgaXRlbS5sZW5ndGggPT0gMlxuXHRcdFx0XHRjb2x1bW5faW5kZXggPSB0YWJ1bGFyQ29sdW1ucy5pbmRleE9mKGl0ZW1bMF0pXG5cdFx0XHRcdGlmIGNvbHVtbl9pbmRleCA+IC0xXG5cdFx0XHRcdFx0dGFidWxhcl9zb3J0LnB1c2ggW2NvbHVtbl9pbmRleCwgaXRlbVsxXV1cblx0XHRlbHNlIGlmIF8uaXNPYmplY3QoaXRlbSlcblx0XHRcdCPmlrDmlbDmja7moLzlvI/vvJpbe2ZpZWxkX25hbWU6ICwgb3JkZXI6IH1dXG5cdFx0XHRmaWVsZF9uYW1lID0gaXRlbS5maWVsZF9uYW1lXG5cdFx0XHRvcmRlciA9IGl0ZW0ub3JkZXJcblx0XHRcdGlmIGZpZWxkX25hbWUgJiYgb3JkZXJcblx0XHRcdFx0Y29sdW1uX2luZGV4ID0gdGFidWxhckNvbHVtbnMuaW5kZXhPZihmaWVsZF9uYW1lKVxuXHRcdFx0XHRpZiBjb2x1bW5faW5kZXggPiAtMVxuXHRcdFx0XHRcdHRhYnVsYXJfc29ydC5wdXNoIFtjb2x1bW5faW5kZXgsIG9yZGVyXVxuXG5cdHJldHVybiB0YWJ1bGFyX3NvcnRcblxuIyMjXG4gICAg5bCGc29ydOi9rOaNouS4ukRldkV4cHJlc3Pmjqfku7bmiYDpnIDopoHnmoTmoLzlvI9cbiMjI1xuQ3JlYXRvci50cmFuc2Zvcm1Tb3J0VG9EWCA9IChzb3J0KS0+XG5cdGR4X3NvcnQgPSBbXVxuXHRfLmVhY2ggc29ydCwgKGl0ZW0pLT5cblx0XHRpZiBfLmlzQXJyYXkoaXRlbSlcblx0XHRcdCPlhbzlrrnml6fmoLzlvI/vvJpbW1wiZmllbGRfbmFtZVwiLCBcIm9yZGVyXCJdXVxuXHRcdFx0ZHhfc29ydC5wdXNoKGl0ZW0pXG5cdFx0ZWxzZSBpZiBfLmlzT2JqZWN0KGl0ZW0pXG5cdFx0XHQj5paw5pWw5o2u5qC85byP77yaW3tmaWVsZF9uYW1lOiAsIG9yZGVyOiB9XVxuXHRcdFx0ZmllbGRfbmFtZSA9IGl0ZW0uZmllbGRfbmFtZVxuXHRcdFx0b3JkZXIgPSBpdGVtLm9yZGVyXG5cdFx0XHRpZiBmaWVsZF9uYW1lICYmIG9yZGVyXG5cdFx0XHRcdGR4X3NvcnQucHVzaCBbZmllbGRfbmFtZSwgb3JkZXJdXG5cblx0cmV0dXJuIGR4X3NvcnRcbiIsIkNyZWF0b3IuZ2V0SW5pdFdpZHRoUGVyY2VudCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBjb2x1bW5zKSB7XG4gIHZhciBfc2NoZW1hLCBjb2x1bW5fbnVtLCBpbml0X3dpZHRoX3BlcmNlbnQsIHJlZjtcbiAgX3NjaGVtYSA9IChyZWYgPSBDcmVhdG9yLmdldFNjaGVtYShvYmplY3RfbmFtZSkpICE9IG51bGwgPyByZWYuX3NjaGVtYSA6IHZvaWQgMDtcbiAgY29sdW1uX251bSA9IDA7XG4gIGlmIChfc2NoZW1hKSB7XG4gICAgXy5lYWNoKGNvbHVtbnMsIGZ1bmN0aW9uKGZpZWxkX25hbWUpIHtcbiAgICAgIHZhciBmaWVsZCwgaXNfd2lkZSwgcmVmMSwgcmVmMjtcbiAgICAgIGZpZWxkID0gXy5waWNrKF9zY2hlbWEsIGZpZWxkX25hbWUpO1xuICAgICAgaXNfd2lkZSA9IChyZWYxID0gZmllbGRbZmllbGRfbmFtZV0pICE9IG51bGwgPyAocmVmMiA9IHJlZjEuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYyLmlzX3dpZGUgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICBpZiAoaXNfd2lkZSkge1xuICAgICAgICByZXR1cm4gY29sdW1uX251bSArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbl9udW0gKz0gMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbml0X3dpZHRoX3BlcmNlbnQgPSAxMDAgLyBjb2x1bW5fbnVtO1xuICAgIHJldHVybiBpbml0X3dpZHRoX3BlcmNlbnQ7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0RmllbGRJc1dpZGUgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgZmllbGRfbmFtZSkge1xuICB2YXIgX3NjaGVtYSwgZmllbGQsIGlzX3dpZGUsIHJlZiwgcmVmMTtcbiAgX3NjaGVtYSA9IENyZWF0b3IuZ2V0U2NoZW1hKG9iamVjdF9uYW1lKS5fc2NoZW1hO1xuICBpZiAoX3NjaGVtYSkge1xuICAgIGZpZWxkID0gXy5waWNrKF9zY2hlbWEsIGZpZWxkX25hbWUpO1xuICAgIGlzX3dpZGUgPSAocmVmID0gZmllbGRbZmllbGRfbmFtZV0pICE9IG51bGwgPyAocmVmMSA9IHJlZi5hdXRvZm9ybSkgIT0gbnVsbCA/IHJlZjEuaXNfd2lkZSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICByZXR1cm4gaXNfd2lkZTtcbiAgfVxufTtcblxuQ3JlYXRvci5nZXRUYWJ1bGFyT3JkZXIgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkLCBjb2x1bW5zKSB7XG4gIHZhciBvYmosIHJlZiwgcmVmMSwgcmVmMiwgc2V0dGluZywgc29ydDtcbiAgc2V0dGluZyA9IChyZWYgPSBDcmVhdG9yLkNvbGxlY3Rpb25zKSAhPSBudWxsID8gKHJlZjEgPSByZWYuc2V0dGluZ3MpICE9IG51bGwgPyByZWYxLmZpbmRPbmUoe1xuICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICByZWNvcmRfaWQ6IFwib2JqZWN0X2xpc3R2aWV3c1wiXG4gIH0pIDogdm9pZCAwIDogdm9pZCAwO1xuICBvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGNvbHVtbnMgPSBfLm1hcChjb2x1bW5zLCBmdW5jdGlvbihjb2x1bW4pIHtcbiAgICB2YXIgZmllbGQ7XG4gICAgZmllbGQgPSBvYmouZmllbGRzW2NvbHVtbl07XG4gICAgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQudHlwZSA6IHZvaWQgMCkgJiYgIWZpZWxkLmhpZGRlbikge1xuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gIH0pO1xuICBjb2x1bW5zID0gXy5jb21wYWN0KGNvbHVtbnMpO1xuICBpZiAoc2V0dGluZyAmJiBzZXR0aW5nLnNldHRpbmdzKSB7XG4gICAgc29ydCA9ICgocmVmMiA9IHNldHRpbmcuc2V0dGluZ3NbbGlzdF92aWV3X2lkXSkgIT0gbnVsbCA/IHJlZjIuc29ydCA6IHZvaWQgMCkgfHwgW107XG4gICAgc29ydCA9IF8ubWFwKHNvcnQsIGZ1bmN0aW9uKG9yZGVyKSB7XG4gICAgICB2YXIgaW5kZXgsIGtleTtcbiAgICAgIGtleSA9IG9yZGVyWzBdO1xuICAgICAgaW5kZXggPSBfLmluZGV4T2YoY29sdW1ucywga2V5KTtcbiAgICAgIG9yZGVyWzBdID0gaW5kZXggKyAxO1xuICAgICAgcmV0dXJuIG9yZGVyO1xuICAgIH0pO1xuICAgIHJldHVybiBzb3J0O1xuICB9XG4gIHJldHVybiBbXTtcbn07XG5cbkNyZWF0b3IuaW5pdExpc3RWaWV3cyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBjb2x1bW5zLCBkZWZhdWx0X2V4dHJhX2NvbHVtbnMsIGV4dHJhX2NvbHVtbnMsIG9iamVjdCwgb3JkZXIsIHJlZjtcbiAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBjb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0Q29sdW1ucyhvYmplY3RfbmFtZSkgfHwgW1wibmFtZVwiXTtcbiAgZXh0cmFfY29sdW1ucyA9IFtcIm93bmVyXCJdO1xuICBkZWZhdWx0X2V4dHJhX2NvbHVtbnMgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRFeHRyYUNvbHVtbnMob2JqZWN0X25hbWUpIHx8IFtcIm93bmVyXCJdO1xuICBpZiAoZGVmYXVsdF9leHRyYV9jb2x1bW5zKSB7XG4gICAgZXh0cmFfY29sdW1ucyA9IF8udW5pb24oZXh0cmFfY29sdW1ucywgZGVmYXVsdF9leHRyYV9jb2x1bW5zKTtcbiAgfVxuICBvcmRlciA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFNvcnQob2JqZWN0X25hbWUpIHx8IFtdO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgcmV0dXJuIChyZWYgPSBDcmVhdG9yLlRhYnVsYXJTZWxlY3RlZElkcykgIT0gbnVsbCA/IHJlZltvYmplY3RfbmFtZV0gPSBbXSA6IHZvaWQgMDtcbiAgfVxufTtcblxuQ3JlYXRvci5jb252ZXJ0TGlzdFZpZXcgPSBmdW5jdGlvbihkZWZhdWx0X3ZpZXcsIGxpc3RfdmlldywgbGlzdF92aWV3X25hbWUpIHtcbiAgdmFyIGRlZmF1bHRfY29sdW1ucywgZGVmYXVsdF9tb2JpbGVfY29sdW1ucywgb2l0ZW07XG4gIGRlZmF1bHRfY29sdW1ucyA9IGRlZmF1bHRfdmlldyAhPSBudWxsID8gZGVmYXVsdF92aWV3LmNvbHVtbnMgOiB2b2lkIDA7XG4gIGRlZmF1bHRfbW9iaWxlX2NvbHVtbnMgPSBkZWZhdWx0X3ZpZXcgIT0gbnVsbCA/IGRlZmF1bHRfdmlldy5tb2JpbGVfY29sdW1ucyA6IHZvaWQgMDtcbiAgaWYgKCFsaXN0X3ZpZXcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb2l0ZW0gPSBfLmNsb25lKGxpc3Rfdmlldyk7XG4gIGlmICghXy5oYXMob2l0ZW0sIFwibmFtZVwiKSkge1xuICAgIG9pdGVtLm5hbWUgPSBsaXN0X3ZpZXdfbmFtZTtcbiAgfVxuICBpZiAoIW9pdGVtLmNvbHVtbnMpIHtcbiAgICBpZiAoZGVmYXVsdF9jb2x1bW5zKSB7XG4gICAgICBvaXRlbS5jb2x1bW5zID0gZGVmYXVsdF9jb2x1bW5zO1xuICAgIH1cbiAgfVxuICBpZiAoIW9pdGVtLmNvbHVtbnMpIHtcbiAgICBvaXRlbS5jb2x1bW5zID0gW1wibmFtZVwiXTtcbiAgfVxuICBpZiAoIW9pdGVtLm1vYmlsZV9jb2x1bW5zKSB7XG4gICAgaWYgKGRlZmF1bHRfbW9iaWxlX2NvbHVtbnMpIHtcbiAgICAgIG9pdGVtLm1vYmlsZV9jb2x1bW5zID0gZGVmYXVsdF9tb2JpbGVfY29sdW1ucztcbiAgICB9XG4gIH1cbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmIChDcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlKFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSkgJiYgIV8uaW5jbHVkZShvaXRlbS5jb2x1bW5zLCAnc3BhY2UnKSkge1xuICAgICAgb2l0ZW0uY29sdW1ucy5wdXNoKCdzcGFjZScpO1xuICAgIH1cbiAgfVxuICBpZiAoIW9pdGVtLmZpbHRlcl9zY29wZSkge1xuICAgIG9pdGVtLmZpbHRlcl9zY29wZSA9IFwic3BhY2VcIjtcbiAgfVxuICBpZiAoIV8uaGFzKG9pdGVtLCBcIl9pZFwiKSkge1xuICAgIG9pdGVtLl9pZCA9IGxpc3Rfdmlld19uYW1lO1xuICB9IGVsc2Uge1xuICAgIG9pdGVtLmxhYmVsID0gb2l0ZW0ubGFiZWwgfHwgbGlzdF92aWV3Lm5hbWU7XG4gIH1cbiAgaWYgKF8uaXNTdHJpbmcob2l0ZW0ub3B0aW9ucykpIHtcbiAgICBvaXRlbS5vcHRpb25zID0gSlNPTi5wYXJzZShvaXRlbS5vcHRpb25zKTtcbiAgfVxuICBfLmZvckVhY2gob2l0ZW0uZmlsdGVycywgZnVuY3Rpb24oZmlsdGVyLCBfaW5kZXgpIHtcbiAgICBpZiAoIV8uaXNBcnJheShmaWx0ZXIpICYmIF8uaXNPYmplY3QoZmlsdGVyKSkge1xuICAgICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLnZhbHVlIDogdm9pZCAwKSkge1xuICAgICAgICAgIHJldHVybiBmaWx0ZXIuX3ZhbHVlID0gZmlsdGVyLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfLmlzU3RyaW5nKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLl92YWx1ZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICByZXR1cm4gZmlsdGVyLnZhbHVlID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBmaWx0ZXIuX3ZhbHVlICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9pdGVtO1xufTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBDcmVhdG9yLmdldFJlbGF0ZWRMaXN0ID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgICB2YXIgX29iamVjdCwgbGF5b3V0UmVsYXRlZExpc3QsIGxpc3QsIG1hcExpc3QsIG9iamVjdExheW91dFJlbGF0ZWRMaXN0T2JqZWN0cywgcGVybWlzc2lvbnMsIHJlbGF0ZWRMaXN0LCByZWxhdGVkTGlzdE5hbWVzLCByZWxhdGVkTGlzdE9iamVjdHMsIHJlbGF0ZWRfb2JqZWN0X25hbWVzLCByZWxhdGVkX29iamVjdHMsIHNwYWNlSWQsIHVucmVsYXRlZF9vYmplY3RzLCB1c2VySWQ7XG4gICAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWxhdGVkTGlzdE9iamVjdHMgPSB7fTtcbiAgICByZWxhdGVkTGlzdE5hbWVzID0gW107XG4gICAgb2JqZWN0TGF5b3V0UmVsYXRlZExpc3RPYmplY3RzID0gW107XG4gICAgX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICBpZiAoX29iamVjdCkge1xuICAgICAgbGF5b3V0UmVsYXRlZExpc3QgPSBfb2JqZWN0LnJlbGF0ZWRfbGlzdHM7XG4gICAgICBpZiAoXy5pc0FycmF5KGxheW91dFJlbGF0ZWRMaXN0KSkge1xuICAgICAgICBfLmVhY2gobGF5b3V0UmVsYXRlZExpc3QsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICB2YXIgcmVGaWVsZE5hbWUsIHJlT2JqZWN0TmFtZSwgcmVmLCByZWYxLCByZWxhdGVkLCB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZDtcbiAgICAgICAgICByZU9iamVjdE5hbWUgPSBpdGVtLnJlbGF0ZWRfZmllbGRfZnVsbG5hbWUuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICByZUZpZWxkTmFtZSA9IGl0ZW0ucmVsYXRlZF9maWVsZF9mdWxsbmFtZS5zcGxpdCgnLicpWzFdO1xuICAgICAgICAgIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID0gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlT2JqZWN0TmFtZSkpICE9IG51bGwgPyAocmVmMSA9IHJlZi5maWVsZHNbcmVGaWVsZE5hbWVdKSAhPSBudWxsID8gcmVmMS53cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgICByZWxhdGVkID0ge1xuICAgICAgICAgICAgb2JqZWN0X25hbWU6IHJlT2JqZWN0TmFtZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGl0ZW0uZmllbGRfbmFtZXMsXG4gICAgICAgICAgICBtb2JpbGVfY29sdW1uczogaXRlbS5maWVsZF9uYW1lcyxcbiAgICAgICAgICAgIGlzX2ZpbGU6IHJlT2JqZWN0TmFtZSA9PT0gXCJjbXNfZmlsZXNcIixcbiAgICAgICAgICAgIGZpbHRlcnNGdW5jdGlvbjogaXRlbS5maWx0ZXJzLFxuICAgICAgICAgICAgc29ydDogaXRlbS5zb3J0LFxuICAgICAgICAgICAgcmVsYXRlZF9maWVsZF9uYW1lOiByZUZpZWxkTmFtZSxcbiAgICAgICAgICAgIGN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0OiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkLFxuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICBhY3Rpb25zOiBpdGVtLmJ1dHRvbnMsXG4gICAgICAgICAgICB2aXNpYmxlX29uOiBpdGVtLnZpc2libGVfb24sXG4gICAgICAgICAgICBwYWdlX3NpemU6IGl0ZW0ucGFnZV9zaXplXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0TGF5b3V0UmVsYXRlZExpc3RPYmplY3RzLnB1c2gocmVsYXRlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqZWN0TGF5b3V0UmVsYXRlZExpc3RPYmplY3RzO1xuICAgICAgfVxuICAgICAgcmVsYXRlZExpc3QgPSBfb2JqZWN0LnJlbGF0ZWRMaXN0O1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVsYXRlZExpc3QpKSB7XG4gICAgICAgIF8uZWFjaChyZWxhdGVkTGlzdCwgZnVuY3Rpb24ob2JqT3JOYW1lKSB7XG4gICAgICAgICAgdmFyIHJlbGF0ZWQ7XG4gICAgICAgICAgaWYgKF8uaXNPYmplY3Qob2JqT3JOYW1lKSkge1xuICAgICAgICAgICAgcmVsYXRlZCA9IHtcbiAgICAgICAgICAgICAgb2JqZWN0X25hbWU6IG9iak9yTmFtZS5vYmplY3ROYW1lLFxuICAgICAgICAgICAgICBjb2x1bW5zOiBvYmpPck5hbWUuY29sdW1ucyxcbiAgICAgICAgICAgICAgbW9iaWxlX2NvbHVtbnM6IG9iak9yTmFtZS5tb2JpbGVfY29sdW1ucyxcbiAgICAgICAgICAgICAgaXNfZmlsZTogb2JqT3JOYW1lLm9iamVjdE5hbWUgPT09IFwiY21zX2ZpbGVzXCIsXG4gICAgICAgICAgICAgIGZpbHRlcnNGdW5jdGlvbjogb2JqT3JOYW1lLmZpbHRlcnMsXG4gICAgICAgICAgICAgIHNvcnQ6IG9iak9yTmFtZS5zb3J0LFxuICAgICAgICAgICAgICByZWxhdGVkX2ZpZWxkX25hbWU6ICcnLFxuICAgICAgICAgICAgICBjdXN0b21SZWxhdGVkTGlzdE9iamVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6IG9iak9yTmFtZS5sYWJlbCxcbiAgICAgICAgICAgICAgYWN0aW9uczogb2JqT3JOYW1lLmFjdGlvbnMsXG4gICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogb2JqT3JOYW1lLnBhZ2Vfc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlbGF0ZWRMaXN0T2JqZWN0c1tvYmpPck5hbWUub2JqZWN0TmFtZV0gPSByZWxhdGVkO1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRMaXN0TmFtZXMucHVzaChvYmpPck5hbWUub2JqZWN0TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKG9iak9yTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGVkTGlzdE5hbWVzLnB1c2gob2JqT3JOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXBMaXN0ID0ge307XG4gICAgcmVsYXRlZF9vYmplY3RzID0gQ3JlYXRvci5nZXRSZWxhdGVkT2JqZWN0cyhvYmplY3RfbmFtZSk7XG4gICAgXy5lYWNoKHJlbGF0ZWRfb2JqZWN0cywgZnVuY3Rpb24ocmVsYXRlZF9vYmplY3RfaXRlbSkge1xuICAgICAgdmFyIGNvbHVtbnMsIG1vYmlsZV9jb2x1bW5zLCBvcmRlciwgcmVsYXRlZCwgcmVsYXRlZE9iamVjdCwgcmVsYXRlZF9maWVsZF9uYW1lLCByZWxhdGVkX29iamVjdCwgcmVsYXRlZF9vYmplY3RfbmFtZSwgdGFidWxhcl9vcmRlciwgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ7XG4gICAgICBpZiAoIShyZWxhdGVkX29iamVjdF9pdGVtICE9IG51bGwgPyByZWxhdGVkX29iamVjdF9pdGVtLm9iamVjdF9uYW1lIDogdm9pZCAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZWxhdGVkX29iamVjdF9uYW1lID0gcmVsYXRlZF9vYmplY3RfaXRlbS5vYmplY3RfbmFtZTtcbiAgICAgIHJlbGF0ZWRfZmllbGRfbmFtZSA9IHJlbGF0ZWRfb2JqZWN0X2l0ZW0uZm9yZWlnbl9rZXk7XG4gICAgICB3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9IHJlbGF0ZWRfb2JqZWN0X2l0ZW0ud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ7XG4gICAgICByZWxhdGVkX29iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlbGF0ZWRfb2JqZWN0X25hbWUpO1xuICAgICAgaWYgKCFyZWxhdGVkX29iamVjdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb2x1bW5zID0gQ3JlYXRvci5nZXRPYmplY3RGaXJzdExpc3RWaWV3Q29sdW1ucyhyZWxhdGVkX29iamVjdF9uYW1lKSB8fCBbXCJuYW1lXCJdO1xuICAgICAgY29sdW1ucyA9IF8ud2l0aG91dChjb2x1bW5zLCByZWxhdGVkX2ZpZWxkX25hbWUpO1xuICAgICAgbW9iaWxlX2NvbHVtbnMgPSBDcmVhdG9yLmdldE9iamVjdEZpcnN0TGlzdFZpZXdDb2x1bW5zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHRydWUpIHx8IFtcIm5hbWVcIl07XG4gICAgICBtb2JpbGVfY29sdW1ucyA9IF8ud2l0aG91dChtb2JpbGVfY29sdW1ucywgcmVsYXRlZF9maWVsZF9uYW1lKTtcbiAgICAgIG9yZGVyID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0U29ydChyZWxhdGVkX29iamVjdF9uYW1lKTtcbiAgICAgIHRhYnVsYXJfb3JkZXIgPSBDcmVhdG9yLnRyYW5zZm9ybVNvcnRUb1RhYnVsYXIob3JkZXIsIGNvbHVtbnMpO1xuICAgICAgaWYgKC9cXHcrXFwuXFwkXFwuXFx3Ky9nLnRlc3QocmVsYXRlZF9maWVsZF9uYW1lKSkge1xuICAgICAgICByZWxhdGVkX2ZpZWxkX25hbWUgPSByZWxhdGVkX2ZpZWxkX25hbWUucmVwbGFjZSgvXFwkXFwuLywgXCJcIik7XG4gICAgICB9XG4gICAgICByZWxhdGVkID0ge1xuICAgICAgICBvYmplY3RfbmFtZTogcmVsYXRlZF9vYmplY3RfbmFtZSxcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgbW9iaWxlX2NvbHVtbnM6IG1vYmlsZV9jb2x1bW5zLFxuICAgICAgICByZWxhdGVkX2ZpZWxkX25hbWU6IHJlbGF0ZWRfZmllbGRfbmFtZSxcbiAgICAgICAgaXNfZmlsZTogcmVsYXRlZF9vYmplY3RfbmFtZSA9PT0gXCJjbXNfZmlsZXNcIixcbiAgICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQ6IHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkXG4gICAgICB9O1xuICAgICAgcmVsYXRlZE9iamVjdCA9IHJlbGF0ZWRMaXN0T2JqZWN0c1tyZWxhdGVkX29iamVjdF9uYW1lXTtcbiAgICAgIGlmIChyZWxhdGVkT2JqZWN0KSB7XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0LmNvbHVtbnMpIHtcbiAgICAgICAgICByZWxhdGVkLmNvbHVtbnMgPSByZWxhdGVkT2JqZWN0LmNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3QubW9iaWxlX2NvbHVtbnMpIHtcbiAgICAgICAgICByZWxhdGVkLm1vYmlsZV9jb2x1bW5zID0gcmVsYXRlZE9iamVjdC5tb2JpbGVfY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRlZE9iamVjdC5zb3J0KSB7XG4gICAgICAgICAgcmVsYXRlZC5zb3J0ID0gcmVsYXRlZE9iamVjdC5zb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0LmZpbHRlcnNGdW5jdGlvbikge1xuICAgICAgICAgIHJlbGF0ZWQuZmlsdGVyc0Z1bmN0aW9uID0gcmVsYXRlZE9iamVjdC5maWx0ZXJzRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbGF0ZWRPYmplY3QuY3VzdG9tUmVsYXRlZExpc3RPYmplY3QpIHtcbiAgICAgICAgICByZWxhdGVkLmN1c3RvbVJlbGF0ZWRMaXN0T2JqZWN0ID0gcmVsYXRlZE9iamVjdC5jdXN0b21SZWxhdGVkTGlzdE9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVsYXRlZE9iamVjdC5sYWJlbCkge1xuICAgICAgICAgIHJlbGF0ZWQubGFiZWwgPSByZWxhdGVkT2JqZWN0LmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWxhdGVkT2JqZWN0LnBhZ2Vfc2l6ZSkge1xuICAgICAgICAgIHJlbGF0ZWQucGFnZV9zaXplID0gcmVsYXRlZE9iamVjdC5wYWdlX3NpemU7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHJlbGF0ZWRMaXN0T2JqZWN0c1tyZWxhdGVkX29iamVjdF9uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXBMaXN0W3JlbGF0ZWQub2JqZWN0X25hbWVdID0gcmVsYXRlZDtcbiAgICB9KTtcbiAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICByZWxhdGVkX29iamVjdF9uYW1lcyA9IF8ucGx1Y2soXy52YWx1ZXMocmVsYXRlZExpc3RPYmplY3RzKSwgXCJvYmplY3RfbmFtZVwiKTtcbiAgICBwZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMob2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgdW5yZWxhdGVkX29iamVjdHMgPSBwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0cztcbiAgICByZWxhdGVkX29iamVjdF9uYW1lcyA9IF8uZGlmZmVyZW5jZShyZWxhdGVkX29iamVjdF9uYW1lcywgdW5yZWxhdGVkX29iamVjdHMpO1xuICAgIF8uZWFjaChyZWxhdGVkTGlzdE9iamVjdHMsIGZ1bmN0aW9uKHYsIHJlbGF0ZWRfb2JqZWN0X25hbWUpIHtcbiAgICAgIHZhciBhbGxvd1JlYWQsIGlzQWN0aXZlLCByZWY7XG4gICAgICBpc0FjdGl2ZSA9IHJlbGF0ZWRfb2JqZWN0X25hbWVzLmluZGV4T2YocmVsYXRlZF9vYmplY3RfbmFtZSkgPiAtMTtcbiAgICAgIGFsbG93UmVhZCA9IChyZWYgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRfb2JqZWN0X25hbWUsIHNwYWNlSWQsIHVzZXJJZCkpICE9IG51bGwgPyByZWYuYWxsb3dSZWFkIDogdm9pZCAwO1xuICAgICAgaWYgKGlzQWN0aXZlICYmIGFsbG93UmVhZCkge1xuICAgICAgICByZXR1cm4gbWFwTGlzdFtyZWxhdGVkX29iamVjdF9uYW1lXSA9IHY7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGlzdCA9IFtdO1xuICAgIGlmIChfLmlzRW1wdHkocmVsYXRlZExpc3ROYW1lcykpIHtcbiAgICAgIGxpc3QgPSBfLnZhbHVlcyhtYXBMaXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgXy5lYWNoKHJlbGF0ZWRMaXN0TmFtZXMsIGZ1bmN0aW9uKG9iamVjdE5hbWUpIHtcbiAgICAgICAgaWYgKG1hcExpc3Rbb2JqZWN0TmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gbGlzdC5wdXNoKG1hcExpc3Rbb2JqZWN0TmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKF8uaGFzKF9vYmplY3QsICdhbGxvd19yZWxhdGVkTGlzdCcpKSB7XG4gICAgICBsaXN0ID0gXy5maWx0ZXIobGlzdCwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICByZXR1cm4gXy5pbmNsdWRlKF9vYmplY3QuYWxsb3dfcmVsYXRlZExpc3QsIGl0ZW0ub2JqZWN0X25hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9O1xufVxuXG5DcmVhdG9yLmdldE9iamVjdEZpcnN0TGlzdFZpZXcgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICByZXR1cm4gXy5maXJzdChDcmVhdG9yLmdldExpc3RWaWV3cyhvYmplY3RfbmFtZSkpO1xufTtcblxuXG4vKiBcblx05Y+W5Ye6bGlzdF92aWV3X2lk5a+55bqU55qE6KeG5Zu+77yM5aaC5p6c5LiN5a2Y5Zyo5oiW6ICF5rKh5pyJ5p2D6ZmQ77yM5bCx6L+U5Zue56ys5LiA5Liq6KeG5Zu+XG5cdGV4YWPkuLp0cnVl5pe277yM6ZyA6KaB5by65Yi25oyJbGlzdF92aWV3X2lk57K+56Gu5p+l5om+77yM5LiN6buY6K6k6L+U5Zue56ys5LiA5Liq6KeG5Zu+XG4gKi9cblxuQ3JlYXRvci5nZXRMaXN0VmlldyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIGV4YWMpIHtcbiAgdmFyIGxpc3RWaWV3cywgbGlzdF92aWV3LCBvYmplY3Q7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoIW9iamVjdF9uYW1lKSB7XG4gICAgICBvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghbGlzdF92aWV3X2lkKSB7XG4gICAgICBsaXN0X3ZpZXdfaWQgPSBTZXNzaW9uLmdldChcImxpc3Rfdmlld19pZFwiKTtcbiAgICB9XG4gIH1cbiAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICBpZiAoIW9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaXN0Vmlld3MgPSBDcmVhdG9yLmdldExpc3RWaWV3cyhvYmplY3RfbmFtZSk7XG4gIGlmICghKGxpc3RWaWV3cyAhPSBudWxsID8gbGlzdFZpZXdzLmxlbmd0aCA6IHZvaWQgMCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGlzdF92aWV3ID0gXy5maW5kKGxpc3RWaWV3cywgZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLl9pZCA9PT0gbGlzdF92aWV3X2lkIHx8IGl0ZW0ubmFtZSA9PT0gbGlzdF92aWV3X2lkO1xuICB9KTtcbiAgaWYgKCFsaXN0X3ZpZXcpIHtcbiAgICBpZiAoZXhhYykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0X3ZpZXcgPSBsaXN0Vmlld3NbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiBsaXN0X3ZpZXc7XG59O1xuXG5DcmVhdG9yLmdldExpc3RWaWV3SXNSZWNlbnQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgbGlzdF92aWV3X2lkKSB7XG4gIHZhciBsaXN0Vmlldywgb2JqZWN0O1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgaWYgKCFvYmplY3RfbmFtZSkge1xuICAgICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICAgIH1cbiAgICBpZiAoIWxpc3Rfdmlld19pZCkge1xuICAgICAgbGlzdF92aWV3X2lkID0gU2Vzc2lvbi5nZXQoXCJsaXN0X3ZpZXdfaWRcIik7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbGlzdF92aWV3X2lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgb2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3RWaWV3ID0gXy5maW5kV2hlcmUob2JqZWN0Lmxpc3Rfdmlld3MsIHtcbiAgICAgIF9pZDogbGlzdF92aWV3X2lkXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdFZpZXcgPSBsaXN0X3ZpZXdfaWQ7XG4gIH1cbiAgcmV0dXJuIChsaXN0VmlldyAhPSBudWxsID8gbGlzdFZpZXcubmFtZSA6IHZvaWQgMCkgPT09IFwicmVjZW50XCI7XG59O1xuXG5cbi8qXG4gICAg5LuOY29sdW1uc+WPguaVsOS4rei/h+a7pOWHuueUqOS6juaJi+acuuerr+aYvuekuueahGNvbHVtbnNcblx06KeE5YiZ77yaXG5cdDEu5LyY5YWI5oqKY29sdW1uc+S4reeahG5hbWXlrZfmrrXmjpLlnKjnrKzkuIDkuKpcblx0Mi7mnIDlpJrlj6rov5Tlm5405Liq5a2X5q61XG5cdDMu6ICD6JmR5a695a2X5q615Y2g55So5pW06KGM6KeE5YiZ5p2h5Lu25LiL77yM5pyA5aSa5Y+q6L+U5Zue5Lik6KGMXG4gKi9cblxuQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBjb2x1bW5zKSB7XG4gIHZhciBjb3VudCwgZmllbGQsIGZpZWxkcywgZ2V0RmllbGQsIGlzTmFtZUNvbHVtbiwgaXRlbUNvdW50LCBtYXhDb3VudCwgbWF4Um93cywgbmFtZUNvbHVtbiwgbmFtZUtleSwgb2JqZWN0LCByZXN1bHQ7XG4gIHJlc3VsdCA9IFtdO1xuICBtYXhSb3dzID0gMjtcbiAgbWF4Q291bnQgPSBtYXhSb3dzICogMjtcbiAgY291bnQgPSAwO1xuICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGZpZWxkcyA9IG9iamVjdC5maWVsZHM7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cbiAgbmFtZUtleSA9IG9iamVjdC5OQU1FX0ZJRUxEX0tFWTtcbiAgaXNOYW1lQ29sdW1uID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChfLmlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICByZXR1cm4gaXRlbS5maWVsZCA9PT0gbmFtZUtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGl0ZW0gPT09IG5hbWVLZXk7XG4gICAgfVxuICB9O1xuICBnZXRGaWVsZCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICBpZiAoXy5pc09iamVjdChpdGVtKSkge1xuICAgICAgcmV0dXJuIGZpZWxkc1tpdGVtLmZpZWxkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpZWxkc1tpdGVtXTtcbiAgICB9XG4gIH07XG4gIGlmIChuYW1lS2V5KSB7XG4gICAgbmFtZUNvbHVtbiA9IGNvbHVtbnMuZmluZChmdW5jdGlvbihpdGVtKSB7XG4gICAgICByZXR1cm4gaXNOYW1lQ29sdW1uKGl0ZW0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChuYW1lQ29sdW1uKSB7XG4gICAgZmllbGQgPSBnZXRGaWVsZChuYW1lQ29sdW1uKTtcbiAgICBpdGVtQ291bnQgPSBmaWVsZC5pc193aWRlID8gMiA6IDE7XG4gICAgY291bnQgKz0gaXRlbUNvdW50O1xuICAgIHJlc3VsdC5wdXNoKG5hbWVDb2x1bW4pO1xuICB9XG4gIGNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgZmllbGQgPSBnZXRGaWVsZChpdGVtKTtcbiAgICBpZiAoIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW1Db3VudCA9IGZpZWxkLmlzX3dpZGUgPyAyIDogMTtcbiAgICBpZiAoY291bnQgPCBtYXhDb3VudCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4Q291bnQgJiYgIWlzTmFtZUNvbHVtbihpdGVtKSkge1xuICAgICAgY291bnQgKz0gaXRlbUNvdW50O1xuICAgICAgaWYgKGNvdW50IDw9IG1heENvdW50KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKlxuICAgIOiOt+WPlum7mOiupOinhuWbvlxuICovXG5cbkNyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgZGVmYXVsdFZpZXcsIG9iamVjdCwgcmVmO1xuICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgb2JqZWN0ID0gQ3JlYXRvci5PYmplY3RzW29iamVjdF9uYW1lXTtcbiAgfVxuICBpZiAob2JqZWN0ICE9IG51bGwgPyAocmVmID0gb2JqZWN0Lmxpc3Rfdmlld3MpICE9IG51bGwgPyByZWZbXCJkZWZhdWx0XCJdIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgZGVmYXVsdFZpZXcgPSBvYmplY3QubGlzdF92aWV3c1tcImRlZmF1bHRcIl07XG4gIH0gZWxzZSB7XG4gICAgXy5lYWNoKG9iamVjdCAhPSBudWxsID8gb2JqZWN0Lmxpc3Rfdmlld3MgOiB2b2lkIDAsIGZ1bmN0aW9uKGxpc3Rfdmlldywga2V5KSB7XG4gICAgICBpZiAobGlzdF92aWV3Lm5hbWUgPT09IFwiYWxsXCIgfHwga2V5ID09PSBcImFsbFwiKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmlldyA9IGxpc3RfdmlldztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdFZpZXc7XG59O1xuXG5cbi8qXG4gICAg6I635Y+W5a+56LGh55qE5YiX6KGo6buY6K6k5pi+56S65a2X5q61XG4gKi9cblxuQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0Q29sdW1ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCB1c2VfbW9iaWxlX2NvbHVtbnMpIHtcbiAgdmFyIGNvbHVtbnMsIGRlZmF1bHRWaWV3O1xuICBkZWZhdWx0VmlldyA9IENyZWF0b3IuZ2V0T2JqZWN0RGVmYXVsdFZpZXcob2JqZWN0X25hbWUpO1xuICBjb2x1bW5zID0gZGVmYXVsdFZpZXcgIT0gbnVsbCA/IGRlZmF1bHRWaWV3LmNvbHVtbnMgOiB2b2lkIDA7XG4gIGlmICh1c2VfbW9iaWxlX2NvbHVtbnMpIHtcbiAgICBpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCA/IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zIDogdm9pZCAwKSB7XG4gICAgICBjb2x1bW5zID0gZGVmYXVsdFZpZXcubW9iaWxlX2NvbHVtbnM7XG4gICAgfSBlbHNlIGlmIChjb2x1bW5zKSB7XG4gICAgICBjb2x1bW5zID0gQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyhvYmplY3RfbmFtZSwgY29sdW1ucyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2x1bW5zO1xufTtcblxuXG4vKlxuICAgIOiOt+WPluWvueixoeeahOWIl+ihqOesrOS4gOS4quinhuWbvuaYvuekuueahOWtl+autVxuICovXG5cbkNyZWF0b3IuZ2V0T2JqZWN0Rmlyc3RMaXN0Vmlld0NvbHVtbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgdXNlX21vYmlsZV9jb2x1bW5zKSB7XG4gIHZhciBjb2x1bW5zLCBkZWZhdWx0VmlldztcbiAgZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdEZpcnN0TGlzdFZpZXcob2JqZWN0X25hbWUpO1xuICBjb2x1bW5zID0gZGVmYXVsdFZpZXcgIT0gbnVsbCA/IGRlZmF1bHRWaWV3LmNvbHVtbnMgOiB2b2lkIDA7XG4gIGlmICh1c2VfbW9iaWxlX2NvbHVtbnMpIHtcbiAgICBpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCA/IGRlZmF1bHRWaWV3Lm1vYmlsZV9jb2x1bW5zIDogdm9pZCAwKSB7XG4gICAgICBjb2x1bW5zID0gZGVmYXVsdFZpZXcubW9iaWxlX2NvbHVtbnM7XG4gICAgfSBlbHNlIGlmIChjb2x1bW5zKSB7XG4gICAgICBjb2x1bW5zID0gQ3JlYXRvci5waWNrT2JqZWN0TW9iaWxlQ29sdW1ucyhvYmplY3RfbmFtZSwgY29sdW1ucyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2x1bW5zO1xufTtcblxuXG4vKlxuXHTojrflj5blr7nosaHnmoTliJfooajpu5jorqTpop3lpJbliqDovb3nmoTlrZfmrrVcbiAqL1xuXG5DcmVhdG9yLmdldE9iamVjdERlZmF1bHRFeHRyYUNvbHVtbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgZGVmYXVsdFZpZXc7XG4gIGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhvYmplY3RfbmFtZSk7XG4gIHJldHVybiBkZWZhdWx0VmlldyAhPSBudWxsID8gZGVmYXVsdFZpZXcuZXh0cmFfY29sdW1ucyA6IHZvaWQgMDtcbn07XG5cblxuLypcblx06I635Y+W5a+56LGh55qE6buY6K6k5o6S5bqPXG4gKi9cblxuQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0U29ydCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBkZWZhdWx0VmlldztcbiAgZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KG9iamVjdF9uYW1lKTtcbiAgaWYgKGRlZmF1bHRWaWV3KSB7XG4gICAgaWYgKGRlZmF1bHRWaWV3LnNvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlldy5zb3J0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1tcImNyZWF0ZWRcIiwgXCJkZXNjXCJdXTtcbiAgICB9XG4gIH1cbn07XG5cblxuLypcbiAgICDliKTmlq3mmK/lkKZBbGwgdmlld1xuICovXG5cbkNyZWF0b3IuaXNBbGxWaWV3ID0gZnVuY3Rpb24obGlzdF92aWV3KSB7XG4gIHJldHVybiAobGlzdF92aWV3ICE9IG51bGwgPyBsaXN0X3ZpZXcubmFtZSA6IHZvaWQgMCkgPT09IFwiYWxsXCI7XG59O1xuXG5cbi8qXG4gICAg5Yik5pat5piv5ZCm5pyA6L+R5p+l55yLIHZpZXdcbiAqL1xuXG5DcmVhdG9yLmlzUmVjZW50VmlldyA9IGZ1bmN0aW9uKGxpc3Rfdmlldykge1xuICByZXR1cm4gKGxpc3RfdmlldyAhPSBudWxsID8gbGlzdF92aWV3Lm5hbWUgOiB2b2lkIDApID09PSBcInJlY2VudFwiO1xufTtcblxuXG4vKlxuICAgIOWwhnNvcnTovazmjaLkuLpUYWJ1bGFy5o6n5Lu25omA6ZyA6KaB55qE5qC85byPXG4gKi9cblxuQ3JlYXRvci50cmFuc2Zvcm1Tb3J0VG9UYWJ1bGFyID0gZnVuY3Rpb24oc29ydCwgdGFidWxhckNvbHVtbnMpIHtcbiAgdmFyIHRhYnVsYXJfc29ydDtcbiAgdGFidWxhcl9zb3J0ID0gW107XG4gIF8uZWFjaChzb3J0LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgdmFyIGNvbHVtbl9pbmRleCwgZmllbGRfbmFtZSwgb3JkZXI7XG4gICAgaWYgKF8uaXNBcnJheShpdGVtKSkge1xuICAgICAgaWYgKGl0ZW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbHVtbl9pbmRleCA9IHRhYnVsYXJDb2x1bW5zLmluZGV4T2YoaXRlbVswXSk7XG4gICAgICAgIGlmIChjb2x1bW5faW5kZXggPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0YWJ1bGFyX3NvcnQucHVzaChbY29sdW1uX2luZGV4LCBcImFzY1wiXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29sdW1uX2luZGV4ID0gdGFidWxhckNvbHVtbnMuaW5kZXhPZihpdGVtWzBdKTtcbiAgICAgICAgaWYgKGNvbHVtbl9pbmRleCA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRhYnVsYXJfc29ydC5wdXNoKFtjb2x1bW5faW5kZXgsIGl0ZW1bMV1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChpdGVtKSkge1xuICAgICAgZmllbGRfbmFtZSA9IGl0ZW0uZmllbGRfbmFtZTtcbiAgICAgIG9yZGVyID0gaXRlbS5vcmRlcjtcbiAgICAgIGlmIChmaWVsZF9uYW1lICYmIG9yZGVyKSB7XG4gICAgICAgIGNvbHVtbl9pbmRleCA9IHRhYnVsYXJDb2x1bW5zLmluZGV4T2YoZmllbGRfbmFtZSk7XG4gICAgICAgIGlmIChjb2x1bW5faW5kZXggPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0YWJ1bGFyX3NvcnQucHVzaChbY29sdW1uX2luZGV4LCBvcmRlcl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRhYnVsYXJfc29ydDtcbn07XG5cblxuLypcbiAgICDlsIZzb3J06L2s5o2i5Li6RGV2RXhwcmVzc+aOp+S7tuaJgOmcgOimgeeahOagvOW8j1xuICovXG5cbkNyZWF0b3IudHJhbnNmb3JtU29ydFRvRFggPSBmdW5jdGlvbihzb3J0KSB7XG4gIHZhciBkeF9zb3J0O1xuICBkeF9zb3J0ID0gW107XG4gIF8uZWFjaChzb3J0LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgdmFyIGZpZWxkX25hbWUsIG9yZGVyO1xuICAgIGlmIChfLmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIHJldHVybiBkeF9zb3J0LnB1c2goaXRlbSk7XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBmaWVsZF9uYW1lID0gaXRlbS5maWVsZF9uYW1lO1xuICAgICAgb3JkZXIgPSBpdGVtLm9yZGVyO1xuICAgICAgaWYgKGZpZWxkX25hbWUgJiYgb3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIGR4X3NvcnQucHVzaChbZmllbGRfbmFtZSwgb3JkZXJdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZHhfc29ydDtcbn07XG4iLCJTaW1wbGVTY2hlbWEuUmVnRXguY29kZSA9IG5ldyBSZWdFeHAoJ15bYS16QS1aX11bYS16QS1aMC05X10qJCcpXG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXHRNZXRlb3Iuc3RhcnR1cCAoKS0+XG5cdFx0X3JlZ0V4TWVzc2FnZXMgPSBTaW1wbGVTY2hlbWEuX2dsb2JhbE1lc3NhZ2VzLnJlZ0V4IHx8IFtdXG5cdFx0X3JlZ0V4TWVzc2FnZXMucHVzaCB7ZXhwOiBTaW1wbGVTY2hlbWEuUmVnRXguY29kZSwgbXNnOiBcIltsYWJlbF0g5Y+q6IO95Lul5a2X5q+N44CBX+W8gOWktO+8jOS4lOWPquiDveWMheWQq+Wtl+avjeOAgeaVsOWtl+OAgV9cIn1cblx0XHRTaW1wbGVTY2hlbWEubWVzc2FnZXMoe1xuXHRcdFx0cmVnRXg6IF9yZWdFeE1lc3NhZ2VzLFxuXHRcdH0pIiwiU2ltcGxlU2NoZW1hLlJlZ0V4LmNvZGUgPSBuZXcgUmVnRXhwKCdeW2EtekEtWl9dW2EtekEtWjAtOV9dKiQnKTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgICB2YXIgX3JlZ0V4TWVzc2FnZXM7XG4gICAgX3JlZ0V4TWVzc2FnZXMgPSBTaW1wbGVTY2hlbWEuX2dsb2JhbE1lc3NhZ2VzLnJlZ0V4IHx8IFtdO1xuICAgIF9yZWdFeE1lc3NhZ2VzLnB1c2goe1xuICAgICAgZXhwOiBTaW1wbGVTY2hlbWEuUmVnRXguY29kZSxcbiAgICAgIG1zZzogXCJbbGFiZWxdIOWPquiDveS7peWtl+avjeOAgV/lvIDlpLTvvIzkuJTlj6rog73ljIXlkKvlrZfmr43jgIHmlbDlrZfjgIFfXCJcbiAgICB9KTtcbiAgICByZXR1cm4gU2ltcGxlU2NoZW1hLm1lc3NhZ2VzKHtcbiAgICAgIHJlZ0V4OiBfcmVnRXhNZXNzYWdlc1xuICAgIH0pO1xuICB9KTtcbn1cbiIsIlNpbXBsZVNjaGVtYS5SZWdFeC5maWVsZCA9IG5ldyBSZWdFeHAoJ15bYS16QS1aX11cXFxcdyooXFxcXC5cXFxcJFxcXFwuXFxcXHcrKT9bYS16QS1aMC05XSokJylcblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG5cdE1ldGVvci5zdGFydHVwICgpLT5cblx0XHRfcmVnRXhNZXNzYWdlcyA9IFNpbXBsZVNjaGVtYS5fZ2xvYmFsTWVzc2FnZXMucmVnRXggfHwgW11cblx0XHRfcmVnRXhNZXNzYWdlcy5wdXNoIHtleHA6IFNpbXBsZVNjaGVtYS5SZWdFeC5maWVsZCwgbXNnOiBcIltsYWJlbF0g5Y+q6IO95Lul5a2X5q+N44CBX+W8gOWktO+8jC4kLuWJjeWQjuW/hemhu+WMheWQq+Wtl+esplwifVxuXHRcdFNpbXBsZVNjaGVtYS5tZXNzYWdlcyh7XG5cdFx0XHRyZWdFeDogX3JlZ0V4TWVzc2FnZXMsXG5cdFx0fSkiLCJTaW1wbGVTY2hlbWEuUmVnRXguZmllbGQgPSBuZXcgUmVnRXhwKCdeW2EtekEtWl9dXFxcXHcqKFxcXFwuXFxcXCRcXFxcLlxcXFx3Kyk/W2EtekEtWjAtOV0qJCcpO1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIE1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICAgIHZhciBfcmVnRXhNZXNzYWdlcztcbiAgICBfcmVnRXhNZXNzYWdlcyA9IFNpbXBsZVNjaGVtYS5fZ2xvYmFsTWVzc2FnZXMucmVnRXggfHwgW107XG4gICAgX3JlZ0V4TWVzc2FnZXMucHVzaCh7XG4gICAgICBleHA6IFNpbXBsZVNjaGVtYS5SZWdFeC5maWVsZCxcbiAgICAgIG1zZzogXCJbbGFiZWxdIOWPquiDveS7peWtl+avjeOAgV/lvIDlpLTvvIwuJC7liY3lkI7lv4XpobvljIXlkKvlrZfnrKZcIlxuICAgIH0pO1xuICAgIHJldHVybiBTaW1wbGVTY2hlbWEubWVzc2FnZXMoe1xuICAgICAgcmVnRXg6IF9yZWdFeE1lc3NhZ2VzXG4gICAgfSk7XG4gIH0pO1xufVxuIiwiLy8g5Zug5Li6bWV0ZW9y57yW6K+RY29mZmVlc2NyaXB05Lya5a+86Ie0ZXZhbOWHveaVsOaKpemUme+8jOaJgOS7peWNleeLrOWGmeWcqOS4gOS4qmpz5paH5Lu25Lit44CCXG5DcmVhdG9yLmV2YWxJbkNvbnRleHQgPSBmdW5jdGlvbihqcywgY29udGV4dCkge1xuICAgIC8vIyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIGluLWxpbmUgYW5vbnltb3VzIGZ1bmN0aW9uIHdlIC5jYWxsIHdpdGggdGhlIHBhc3NlZCBjb250ZXh0XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBcbiAgICBcdHJldHVybiBldmFsKGpzKTsgXG5cdH0uY2FsbChjb250ZXh0KTtcbn1cblxuXG5DcmVhdG9yLmV2YWwgPSBmdW5jdGlvbihqcyl7XG5cdHRyeXtcblx0XHRyZXR1cm4gZXZhbChqcylcblx0fWNhdGNoIChlKXtcblx0XHRjb25zb2xlLmVycm9yKGUsIGpzKTtcblx0fVxufTsiLCJcdGdldE9wdGlvbiA9IChvcHRpb24pLT5cblx0XHRmb28gPSBvcHRpb24uc3BsaXQoXCI6XCIpXG5cdFx0aWYgZm9vLmxlbmd0aCA+IDJcblx0XHRcdHJldHVybiB7bGFiZWw6IGZvb1swXSwgdmFsdWU6IGZvb1sxXSwgY29sb3I6IGZvb1syXX1cblx0XHRlbHNlIGlmIGZvby5sZW5ndGggPiAxXG5cdFx0XHRyZXR1cm4ge2xhYmVsOiBmb29bMF0sIHZhbHVlOiBmb29bMV19XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHtsYWJlbDogZm9vWzBdLCB2YWx1ZTogZm9vWzBdfVxuXG5cdGNvbnZlcnRGaWVsZCA9IChvYmplY3RfbmFtZSwgZmllbGRfbmFtZSwgZmllbGQsIHNwYWNlSWQpLT5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXIgJiYgc3BhY2VJZCAmJiBmaWVsZC50eXBlID09ICdzZWxlY3QnXG5cdFx0XHRjb2RlID0gZmllbGQucGlja2xpc3QgfHwgXCIje29iamVjdF9uYW1lfS4je2ZpZWxkX25hbWV9XCI7XG5cdFx0XHRpZiBjb2RlXG5cdFx0XHRcdHBpY2tsaXN0ID0gQ3JlYXRvci5nZXRQaWNrbGlzdChjb2RlLCBzcGFjZUlkKTtcblx0XHRcdFx0aWYgcGlja2xpc3Rcblx0XHRcdFx0XHRvcHRpb25zID0gW107XG5cdFx0XHRcdFx0YWxsT3B0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdHBpY2tsaXN0T3B0aW9ucyA9IENyZWF0b3IuZ2V0UGlja0xpc3RPcHRpb25zKHBpY2tsaXN0KVxuXHRcdFx0XHRcdHBpY2tsaXN0T3B0aW9ucyA9IF8uc29ydEJ5KHBpY2tsaXN0T3B0aW9ucywgJ3NvcnRfbm8nKT8ucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdF8uZWFjaCBwaWNrbGlzdE9wdGlvbnMsIChpdGVtKS0+XG5cdFx0XHRcdFx0XHRsYWJlbCA9IGl0ZW0ubmFtZVxuXHRcdFx0XHRcdFx0dmFsdWUgPSBpdGVtLnZhbHVlIHx8IGl0ZW0ubmFtZVxuXHRcdFx0XHRcdFx0YWxsT3B0aW9ucy5wdXNoKHtsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSwgZW5hYmxlOiBpdGVtLmVuYWJsZSwgY29sb3I6IGl0ZW0uY29sb3J9KVxuXHRcdFx0XHRcdFx0aWYgaXRlbS5lbmFibGVcblx0XHRcdFx0XHRcdFx0b3B0aW9ucy5wdXNoKHtsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSwgY29sb3I6IGl0ZW0uY29sb3J9KVxuXHRcdFx0XHRcdFx0aWYgaXRlbS5kZWZhdWx0XG5cdFx0XHRcdFx0XHRcdGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlXG5cdFx0XHRcdFx0aWYgb3B0aW9ucy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0XHRmaWVsZC5vcHRpb25zID0gb3B0aW9uc1xuXHRcdFx0XHRcdGlmIGFsbE9wdGlvbnMubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0ZmllbGQuYWxsT3B0aW9ucyA9IGFsbE9wdGlvbnNcblx0XHRyZXR1cm4gZmllbGQ7XG5cblx0Q3JlYXRvci5jb252ZXJ0T2JqZWN0ID0gKG9iamVjdCwgc3BhY2VJZCktPlxuXHRcdGlmICFvYmplY3Rcblx0XHRcdHJldHVyblxuXHRcdF8uZm9yRWFjaCBvYmplY3QudHJpZ2dlcnMsICh0cmlnZ2VyLCBrZXkpLT5cblxuXHRcdFx0aWYgKE1ldGVvci5pc1NlcnZlciAmJiB0cmlnZ2VyLm9uID09IFwic2VydmVyXCIpIHx8IChNZXRlb3IuaXNDbGllbnQgJiYgdHJpZ2dlci5vbiA9PSBcImNsaWVudFwiKVxuXHRcdFx0XHRfdG9kb19mcm9tX2NvZGUgPSB0cmlnZ2VyPy5fdG9kb1xuXHRcdFx0XHRfdG9kb19mcm9tX2RiID0gdHJpZ2dlci50b2RvXG5cdFx0XHRcdGlmIF90b2RvX2Zyb21fY29kZSAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fY29kZSlcblx0XHRcdFx0XHR0cmlnZ2VyLnRvZG8gPSBDcmVhdG9yLmV2YWwoXCIoI3tfdG9kb19mcm9tX2NvZGV9KVwiKVxuXG5cdFx0XHRcdGlmIF90b2RvX2Zyb21fZGIgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2RiKVxuXHRcdFx0XHRcdCPlj6rmnIl1cGRhdGXml7bvvIwgZmllbGROYW1lcywgbW9kaWZpZXIsIG9wdGlvbnMg5omN5pyJ5YC8XG5cdFx0XHRcdFx0I1RPRE8g5o6n5Yi25Y+v5L2/55So55qE5Y+Y6YeP77yM5bCk5YW25pivQ29sbGVjdGlvblxuXHRcdFx0XHRcdGlmIF90b2RvX2Zyb21fZGIuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpXG5cdFx0XHRcdFx0XHR0cmlnZ2VyLnRvZG8gPSBDcmVhdG9yLmV2YWwoXCIoI3tfdG9kb19mcm9tX2RifSlcIilcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0cmlnZ2VyLnRvZG8gPSBDcmVhdG9yLmV2YWwoXCIoZnVuY3Rpb24odXNlcklkLCBkb2MsIGZpZWxkTmFtZXMsIG1vZGlmaWVyLCBvcHRpb25zKXsje190b2RvX2Zyb21fZGJ9fSlcIilcblxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyICYmIHRyaWdnZXIub24gPT0gXCJjbGllbnRcIlxuXHRcdFx0XHRfdG9kbyA9IHRyaWdnZXIudG9kb1xuXHRcdFx0XHRpZiBfdG9kbyAmJiBfLmlzRnVuY3Rpb24oX3RvZG8pXG5cdFx0XHRcdFx0dHJpZ2dlci5fdG9kbyA9IF90b2RvLnRvU3RyaW5nKClcblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0Xy5mb3JFYWNoIG9iamVjdC5maWVsZHMsIChmaWVsZCwga2V5KS0+XG5cblx0XHRcdFx0aWYgZmllbGQub21pdFxuXHRcdFx0XHRcdCMgb21pdOWtl+auteWujOWFqOmakOiXj+S4jeaYvuekulxuXHRcdFx0XHRcdGZpZWxkLmhpZGRlbiA9IHRydWVcblxuXHRcdFx0XHRpZiBmaWVsZC5yZXF1aXJlZCAmJiBmaWVsZC5yZWFkb25seVxuXHRcdFx0XHRcdCMg6YCa55So5b+F5aGr5a2X5q61ICMyOTUy77yM5b+F5aGr5a2X5q616K6+572u5Li66Z2e5Y+q6K+7XG5cdFx0XHRcdFx0ZmllbGQucmVhZG9ubHkgPSBmYWxzZVxuXG5cdFx0XHRcdHN5c3RlbUJhc2VGaWVsZHMgPSBDcmVhdG9yLmdldFN5c3RlbUJhc2VGaWVsZHMoKVxuXHRcdFx0XHRpZiBzeXN0ZW1CYXNlRmllbGRzLmluZGV4T2Yoa2V5KSA+IC0xXG5cdFx0XHRcdFx0IyDlvLrliLbliJvlu7rkurrliJvlu7rml7bpl7TnrYnlrZfmrrXkuLrlj6ror7tcblx0XHRcdFx0XHRmaWVsZC5yZWFkb25seSA9IHRydWVcblxuXHRcdFx0Xy5mb3JFYWNoIG9iamVjdC5hY3Rpb25zLCAoYWN0aW9uLCBrZXkpLT5cblx0XHRcdFx0X3RvZG9fZnJvbV9jb2RlID0gYWN0aW9uPy5fdG9kb1xuXHRcdFx0XHRfdG9kb19mcm9tX2RiID0gYWN0aW9uPy50b2RvXG5cdFx0XHRcdGlmIF90b2RvX2Zyb21fY29kZSAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fY29kZSlcblx0XHRcdFx0XHQjVE9ETyDmjqfliLblj6/kvb/nlKjnmoTlj5jph49cblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGFjdGlvbi50b2RvID0gQ3JlYXRvci5ldmFsKFwiKCN7X3RvZG9fZnJvbV9jb2RlfSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcInRvZG9fZnJvbV9jb2RlXCIsIF90b2RvX2Zyb21fY29kZVxuXHRcdFx0XHRpZiBfdG9kb19mcm9tX2RiICYmIF8uaXNTdHJpbmcoX3RvZG9fZnJvbV9kYilcblx0XHRcdFx0XHQjVE9ETyDmjqfliLblj6/kvb/nlKjnmoTlj5jph49cblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdGlmIF90b2RvX2Zyb21fZGIuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpXG5cdFx0XHRcdFx0XHRcdGFjdGlvbi50b2RvID0gQ3JlYXRvci5ldmFsKFwiKCN7X3RvZG9fZnJvbV9kYn0pXCIpXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGlmIF8uaXNGdW5jdGlvbihDcmVhdG9yLmFjdGlvbnNCeU5hbWVbX3RvZG9fZnJvbV9kYl0pXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uLnRvZG8gPSBfdG9kb19mcm9tX2RiXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb24udG9kbyA9IENyZWF0b3IuZXZhbChcIihmdW5jdGlvbigpeyN7X3RvZG9fZnJvbV9kYn19KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwidG9kb19mcm9tX2RiXCIsIF90b2RvX2Zyb21fZGIsIGVycm9yXG5cblx0XHRcdFx0X3Zpc2libGUgPSBhY3Rpb24/Ll92aXNpYmxlXG5cdFx0XHRcdGlmIF92aXNpYmxlXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRpZiBfLmlzU3RyaW5nKF92aXNpYmxlKVxuXHRcdFx0XHRcdFx0XHRfdmlzaWJsZSA9IF92aXNpYmxlLnRyaW0oKVxuXHRcdFx0XHRcdFx0aWYgU3RlZWRvcy5pc0V4cHJlc3Npb24oX3Zpc2libGUpXG5cdFx0XHRcdFx0XHRcdCMg5pSv5oyB6aG16Z2i5biD5bGA5Lit5YaZdmlzaWJsZV9vbuWHveaVsOihqOi+vuW8j++8jOmhtemdouW4g+WxgOaMiemSrueahOaYvuekuuadoeS7tuS4jeeUn+aViCAjMzM0MFxuXHRcdFx0XHRcdFx0XHRhY3Rpb24udmlzaWJsZSA9IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfcGVybWlzc2lvbnMsIHJlY29yZCkgLT5cblx0XHRcdFx0XHRcdFx0XHRnbG9iYWxEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgQ3JlYXRvci5VU0VSX0NPTlRFWFQsIHtub3c6IG5ldyBEYXRlKCl9KVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBTdGVlZG9zLnBhcnNlU2luZ2xlRXhwcmVzc2lvbihfdmlzaWJsZSwgcmVjb3JkLCBcIiNcIiwgZ2xvYmFsRGF0YSlcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0YWN0aW9uLnZpc2libGUgPSBDcmVhdG9yLmV2YWwoXCIoI3tfdmlzaWJsZX0pXCIpXG5cdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJhY3Rpb24udmlzaWJsZSB0byBmdW5jdGlvbiBlcnJvcjogXCIsIGVycm9yLCBfdmlzaWJsZVxuXHRcdGVsc2Vcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QuYWN0aW9ucywgKGFjdGlvbiwga2V5KS0+XG5cdFx0XHRcdF90b2RvID0gYWN0aW9uPy50b2RvXG5cdFx0XHRcdGlmIF90b2RvICYmIF8uaXNGdW5jdGlvbihfdG9kbylcblx0XHRcdFx0XHQjVE9ETyDmjqfliLblj6/kvb/nlKjnmoTlj5jph49cblx0XHRcdFx0XHRhY3Rpb24uX3RvZG8gPSBfdG9kby50b1N0cmluZygpXG5cblx0XHRcdFx0X3Zpc2libGUgPSBhY3Rpb24/LnZpc2libGVcblxuXHRcdFx0XHRpZiBfdmlzaWJsZSAmJiBfLmlzRnVuY3Rpb24oX3Zpc2libGUpXG5cdFx0XHRcdFx0YWN0aW9uLl92aXNpYmxlID0gX3Zpc2libGUudG9TdHJpbmcoKVxuXG5cdFx0Xy5mb3JFYWNoIG9iamVjdC5maWVsZHMsIChmaWVsZCwga2V5KS0+XG5cblx0XHRcdGZpZWxkID0gY29udmVydEZpZWxkKG9iamVjdC5uYW1lLCBrZXksIGZpZWxkLCBzcGFjZUlkKTtcblxuXHRcdFx0aWYgZmllbGQub3B0aW9ucyAmJiBfLmlzU3RyaW5nKGZpZWxkLm9wdGlvbnMpXG5cdFx0XHRcdHRyeVxuXHRcdFx0XHRcdF9vcHRpb25zID0gW11cblx0XHRcdFx0XHQj5pSv5oyBXFxu5oiW6ICF6Iux5paH6YCX5Y+35YiG5YmyLFxuXHRcdFx0XHRcdF8uZm9yRWFjaCBmaWVsZC5vcHRpb25zLnNwbGl0KFwiXFxuXCIpLCAob3B0aW9uKS0+XG5cdFx0XHRcdFx0XHRpZiBvcHRpb24uaW5kZXhPZihcIixcIilcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyA9IG9wdGlvbi5zcGxpdChcIixcIilcblx0XHRcdFx0XHRcdFx0Xy5mb3JFYWNoIG9wdGlvbnMsIChfb3B0aW9uKS0+XG5cdFx0XHRcdFx0XHRcdFx0X29wdGlvbnMucHVzaChnZXRPcHRpb24oX29wdGlvbikpXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdF9vcHRpb25zLnB1c2goZ2V0T3B0aW9uKG9wdGlvbikpXG5cdFx0XHRcdFx0ZmllbGQub3B0aW9ucyA9IF9vcHRpb25zXG5cdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcIkNyZWF0b3IuY29udmVydEZpZWxkc09wdGlvbnNcIiwgZmllbGQub3B0aW9ucywgZXJyb3JcblxuXHRcdFx0ZWxzZSBpZiBmaWVsZC5vcHRpb25zICYmIF8uaXNBcnJheShmaWVsZC5vcHRpb25zKVxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRfb3B0aW9ucyA9IFtdXG5cdFx0XHRcdFx0I+aUr+aMgeaVsOe7hOS4reebtOaOpeWumuS5ieavj+S4qumAiemhueeahOeugOeJiOagvOW8j+Wtl+espuS4slxuXHRcdFx0XHRcdF8uZm9yRWFjaCBmaWVsZC5vcHRpb25zLCAob3B0aW9uKS0+XG5cdFx0XHRcdFx0XHRpZiBfLmlzU3RyaW5nKG9wdGlvbilcblx0XHRcdFx0XHRcdFx0X29wdGlvbnMucHVzaChnZXRPcHRpb24ob3B0aW9uKSlcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0X29wdGlvbnMucHVzaChvcHRpb24pXG5cdFx0XHRcdFx0ZmllbGQub3B0aW9ucyA9IF9vcHRpb25zXG5cdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcIkNyZWF0b3IuY29udmVydEZpZWxkc09wdGlvbnNcIiwgZmllbGQub3B0aW9ucywgZXJyb3JcblxuXHRcdFx0ZWxzZSBpZiBmaWVsZC5vcHRpb25zICYmICFfLmlzRnVuY3Rpb24oZmllbGQub3B0aW9ucykgJiYgIV8uaXNBcnJheShmaWVsZC5vcHRpb25zKSAmJiBfLmlzT2JqZWN0KGZpZWxkLm9wdGlvbnMpXG5cdFx0XHRcdF9vcHRpb25zID0gW11cblx0XHRcdFx0Xy5lYWNoIGZpZWxkLm9wdGlvbnMsICh2LCBrKS0+XG5cdFx0XHRcdFx0X29wdGlvbnMucHVzaCB7bGFiZWw6IHYsIHZhbHVlOiBrfVxuXHRcdFx0XHRmaWVsZC5vcHRpb25zID0gX29wdGlvbnNcblxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zXG5cdFx0XHRcdGlmIG9wdGlvbnMgJiYgXy5pc0Z1bmN0aW9uKG9wdGlvbnMpXG5cdFx0XHRcdFx0ZmllbGQuX29wdGlvbnMgPSBmaWVsZC5vcHRpb25zLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0b3B0aW9ucyA9IGZpZWxkLl9vcHRpb25zXG5cdFx0XHRcdGlmIG9wdGlvbnMgJiYgXy5pc1N0cmluZyhvcHRpb25zKVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQub3B0aW9ucyA9IENyZWF0b3IuZXZhbChcIigje29wdGlvbnN9KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY29udmVydCBlcnJvciAje29iamVjdC5uYW1lfSAtPiAje2ZpZWxkLm5hbWV9XCIsIGVycm9yXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRyZWdFeCA9IGZpZWxkLnJlZ0V4XG5cdFx0XHRcdGlmIHJlZ0V4XG5cdFx0XHRcdFx0ZmllbGQuX3JlZ0V4ID0gZmllbGQucmVnRXgudG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZWdFeCA9IGZpZWxkLl9yZWdFeFxuXHRcdFx0XHRpZiByZWdFeFxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQucmVnRXggPSBDcmVhdG9yLmV2YWwoXCIoI3tyZWdFeH0pXCIpXG5cdFx0XHRcdFx0Y2F0Y2ggZXJyb3Jcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJjb252ZXJ0IGVycm9yICN7b2JqZWN0Lm5hbWV9IC0+ICN7ZmllbGQubmFtZX1cIiwgZXJyb3JcblxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdG1pbiA9IGZpZWxkLm1pblxuXHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24obWluKVxuXHRcdFx0XHRcdGZpZWxkLl9taW4gPSBtaW4udG9TdHJpbmcoKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRtaW4gPSBmaWVsZC5fbWluXG5cdFx0XHRcdGlmIF8uaXNTdHJpbmcobWluKVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQubWluID0gQ3JlYXRvci5ldmFsKFwiKCN7bWlufSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImNvbnZlcnQgZXJyb3IgI3tvYmplY3QubmFtZX0gLT4gI3tmaWVsZC5uYW1lfVwiLCBlcnJvclxuXG5cdFx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdFx0bWF4ID0gZmllbGQubWF4XG5cdFx0XHRcdGlmIF8uaXNGdW5jdGlvbihtYXgpXG5cdFx0XHRcdFx0ZmllbGQuX21heCA9IG1heC50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdG1heCA9IGZpZWxkLl9tYXhcblx0XHRcdFx0aWYgXy5pc1N0cmluZyhtYXgpXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRmaWVsZC5tYXggPSBDcmVhdG9yLmV2YWwoXCIoI3ttYXh9KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY29udmVydCBlcnJvciAje29iamVjdC5uYW1lfSAtPiAje2ZpZWxkLm5hbWV9XCIsIGVycm9yXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRpZiBmaWVsZC5hdXRvZm9ybVxuXHRcdFx0XHRcdF90eXBlID0gZmllbGQuYXV0b2Zvcm0udHlwZVxuXHRcdFx0XHRcdGlmIF90eXBlICYmIF8uaXNGdW5jdGlvbihfdHlwZSkgJiYgX3R5cGUgIT0gT2JqZWN0ICYmIF90eXBlICE9IFN0cmluZyAmJiBfdHlwZSAhPSBOdW1iZXIgJiYgX3R5cGUgIT0gQm9vbGVhbiAmJiAhXy5pc0FycmF5KF90eXBlKVxuXHRcdFx0XHRcdFx0ZmllbGQuYXV0b2Zvcm0uX3R5cGUgPSBfdHlwZS50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlmIGZpZWxkLmF1dG9mb3JtXG5cdFx0XHRcdFx0X3R5cGUgPSBmaWVsZC5hdXRvZm9ybS5fdHlwZVxuXHRcdFx0XHRcdGlmIF90eXBlICYmIF8uaXNTdHJpbmcoX3R5cGUpXG5cdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0ZmllbGQuYXV0b2Zvcm0udHlwZSA9IENyZWF0b3IuZXZhbChcIigje190eXBlfSlcIilcblx0XHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJjb252ZXJ0IGZpZWxkIC0+IHR5cGUgZXJyb3JcIiwgZmllbGQsIGVycm9yXG5cblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXG5cdFx0XHRcdG9wdGlvbnNGdW5jdGlvbiA9IGZpZWxkLm9wdGlvbnNGdW5jdGlvblxuXHRcdFx0XHRyZWZlcmVuY2VfdG8gPSBmaWVsZC5yZWZlcmVuY2VfdG9cblx0XHRcdFx0Y3JlYXRlRnVuY3Rpb24gPSBmaWVsZC5jcmVhdGVGdW5jdGlvblxuXHRcdFx0XHRiZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb25cblx0XHRcdFx0ZmlsdGVyc0Z1bmN0aW9uID0gZmllbGQuZmlsdGVyc0Z1bmN0aW9uXG5cblx0XHRcdFx0aWYgb3B0aW9uc0Z1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihvcHRpb25zRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuX29wdGlvbnNGdW5jdGlvbiA9IG9wdGlvbnNGdW5jdGlvbi50b1N0cmluZygpXG5cblx0XHRcdFx0aWYgcmVmZXJlbmNlX3RvICYmIF8uaXNGdW5jdGlvbihyZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0ZmllbGQuX3JlZmVyZW5jZV90byA9IHJlZmVyZW5jZV90by50b1N0cmluZygpXG5cblx0XHRcdFx0aWYgY3JlYXRlRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKGNyZWF0ZUZ1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLl9jcmVhdGVGdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uLnRvU3RyaW5nKClcblx0XHRcdFx0aWYgYmVmb3JlT3BlbkZ1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihiZWZvcmVPcGVuRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuX2JlZm9yZU9wZW5GdW5jdGlvbiA9IGJlZm9yZU9wZW5GdW5jdGlvbi50b1N0cmluZygpXG5cblx0XHRcdFx0aWYgZmlsdGVyc0Z1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihmaWx0ZXJzRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuX2ZpbHRlcnNGdW5jdGlvbiA9IGZpbHRlcnNGdW5jdGlvbi50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cblx0XHRcdFx0b3B0aW9uc0Z1bmN0aW9uID0gZmllbGQuX29wdGlvbnNGdW5jdGlvbiB8fCBmaWVsZC5vcHRpb25zRnVuY3Rpb25cblx0XHRcdFx0cmVmZXJlbmNlX3RvID0gZmllbGQuX3JlZmVyZW5jZV90b1xuXHRcdFx0XHRjcmVhdGVGdW5jdGlvbiA9IGZpZWxkLl9jcmVhdGVGdW5jdGlvblxuXHRcdFx0XHRiZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5fYmVmb3JlT3BlbkZ1bmN0aW9uXG5cdFx0XHRcdGZpbHRlcnNGdW5jdGlvbiA9IGZpZWxkLl9maWx0ZXJzRnVuY3Rpb24gfHwgZmllbGQuZmlsdGVyc0Z1bmN0aW9uXG5cblx0XHRcdFx0aWYgb3B0aW9uc0Z1bmN0aW9uICYmIF8uaXNTdHJpbmcob3B0aW9uc0Z1bmN0aW9uKVxuXHRcdFx0XHRcdGZpZWxkLm9wdGlvbnNGdW5jdGlvbiA9IENyZWF0b3IuZXZhbChcIigje29wdGlvbnNGdW5jdGlvbn0pXCIpXG5cblx0XHRcdFx0aWYgcmVmZXJlbmNlX3RvICYmIF8uaXNTdHJpbmcocmVmZXJlbmNlX3RvKVxuXHRcdFx0XHRcdGZpZWxkLnJlZmVyZW5jZV90byA9IENyZWF0b3IuZXZhbChcIigje3JlZmVyZW5jZV90b30pXCIpXG5cblx0XHRcdFx0aWYgY3JlYXRlRnVuY3Rpb24gJiYgXy5pc1N0cmluZyhjcmVhdGVGdW5jdGlvbilcblx0XHRcdFx0XHRmaWVsZC5jcmVhdGVGdW5jdGlvbiA9IENyZWF0b3IuZXZhbChcIigje2NyZWF0ZUZ1bmN0aW9ufSlcIilcblxuXHRcdFx0XHRpZiBiZWZvcmVPcGVuRnVuY3Rpb24gJiYgXy5pc1N0cmluZyhiZWZvcmVPcGVuRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuYmVmb3JlT3BlbkZ1bmN0aW9uID0gQ3JlYXRvci5ldmFsKFwiKCN7YmVmb3JlT3BlbkZ1bmN0aW9ufSlcIilcblxuXHRcdFx0XHRpZiBmaWx0ZXJzRnVuY3Rpb24gJiYgXy5pc1N0cmluZyhmaWx0ZXJzRnVuY3Rpb24pXG5cdFx0XHRcdFx0ZmllbGQuZmlsdGVyc0Z1bmN0aW9uID0gQ3JlYXRvci5ldmFsKFwiKCN7ZmlsdGVyc0Z1bmN0aW9ufSlcIilcblxuXHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdGRlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZVxuXHRcdFx0XHRpZiBkZWZhdWx0VmFsdWUgJiYgXy5pc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSlcblx0XHRcdFx0XHRmaWVsZC5fZGVmYXVsdFZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlLnRvU3RyaW5nKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZGVmYXVsdFZhbHVlID0gZmllbGQuX2RlZmF1bHRWYWx1ZVxuXG5cdFx0XHRcdGlmICFkZWZhdWx0VmFsdWUgJiYgXy5pc1N0cmluZyhmaWVsZC5kZWZhdWx0VmFsdWUpICYmIGZpZWxkLmRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIilcblx0XHRcdFx0XHRkZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWVcblxuXHRcdFx0XHRpZiBkZWZhdWx0VmFsdWUgJiYgXy5pc1N0cmluZyhkZWZhdWx0VmFsdWUpXG5cdFx0XHRcdFx0dHJ5XG5cdFx0XHRcdFx0XHRmaWVsZC5kZWZhdWx0VmFsdWUgPSBDcmVhdG9yLmV2YWwoXCIoI3tkZWZhdWx0VmFsdWV9KVwiKVxuXHRcdFx0XHRcdGNhdGNoIGVycm9yXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY29udmVydCBlcnJvciAje29iamVjdC5uYW1lfSAtPiAje2ZpZWxkLm5hbWV9XCIsIGVycm9yXG5cdFx0XHRcblx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRpc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0aWYgaXNfY29tcGFueV9saW1pdGVkICYmIF8uaXNGdW5jdGlvbihpc19jb21wYW55X2xpbWl0ZWQpXG5cdFx0XHRcdFx0ZmllbGQuX2lzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZC50b1N0cmluZygpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLl9pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0aWYgaXNfY29tcGFueV9saW1pdGVkICYmIF8uaXNTdHJpbmcoaXNfY29tcGFueV9saW1pdGVkKVxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0ZmllbGQuaXNfY29tcGFueV9saW1pdGVkID0gQ3JlYXRvci5ldmFsKFwiKCN7aXNfY29tcGFueV9saW1pdGVkfSlcIilcblx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImNvbnZlcnQgZXJyb3IgI3tvYmplY3QubmFtZX0gLT4gI3tmaWVsZC5uYW1lfVwiLCBlcnJvclxuXG5cdFx0Xy5mb3JFYWNoIG9iamVjdC5saXN0X3ZpZXdzLCAobGlzdF92aWV3LCBrZXkpIC0+XG5cdFx0XHQjIyNcblx0XHRcdOinhuWbvui/h+iZkeWZqOmcgOimgeaUr+aMgWZ1bmN0aW9u77yM5ZCO5Y+w6L2s5oiQ5a2X56ym5Liy77yM5YmN5Y+wZXZhbOaIkOWHveaVsFxuXHRcdFx06K6p6L+H6JmR5Zmo5pSv5oyB5Lik56eNZnVuY3Rpb27mlrnlvI/vvJpcblx0XHRcdDEuIOaVtOS4qmZpbHRlcnPkuLpmdW5jdGlvbjpcblx0XHRcdOWmgu+8mlxuXHRcdFx0ZmlsdGVyczogKCktPlxuXHRcdFx0XHRyZXR1cm4gW1tbXCJvYmplY3RfbmFtZVwiLFwiPVwiLFwicHJvamVjdF9pc3N1ZXNcIl0sJ29yJyxbXCJvYmplY3RfbmFtZVwiLFwiPVwiLFwidGFza3NcIl1dXVxuXHRcdFx0Mi4gZmlsdGVyc+WGheeahGZpbHRlci52YWx1ZeS4umZ1bmN0aW9uXG5cdFx0XHTlpoLvvJpcblx0XHRcdGZpbHRlcnM6IFtbXCJvYmplY3RfbmFtZVwiLCBcIj1cIiwgKCktPlxuXHRcdFx0XHRyZXR1cm4gXCJwcm9qZWN0X2lzc3Vlc1wiXG5cdFx0XHRdXVxuXHRcdFx05oiWXG5cdFx0XHRmaWx0ZXJzOiBbe1xuXHRcdFx0XHRcImZpZWxkXCI6IFwib2JqZWN0X25hbWVcIlxuXHRcdFx0XHRcIm9wZXJhdGlvblwiOiBcIj1cIlxuXHRcdFx0XHRcInZhbHVlXCI6ICgpLT5cblx0XHRcdFx0XHRyZXR1cm4gXCJwcm9qZWN0X2lzc3Vlc1wiXG5cdFx0XHR9XVxuXHRcdFx0IyMjXG5cdFx0XHRpZiBfLmlzRnVuY3Rpb24obGlzdF92aWV3LmZpbHRlcnMpXG5cdFx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdGxpc3Rfdmlldy5fZmlsdGVycyA9IGxpc3Rfdmlldy5maWx0ZXJzLnRvU3RyaW5nKClcblx0XHRcdGVsc2UgaWYgXy5pc1N0cmluZyhsaXN0X3ZpZXcuX2ZpbHRlcnMpXG5cdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdGxpc3Rfdmlldy5maWx0ZXJzID0gQ3JlYXRvci5ldmFsKFwiKCN7bGlzdF92aWV3Ll9maWx0ZXJzfSlcIilcblx0XHRcdGVsc2Vcblx0XHRcdFx0Xy5mb3JFYWNoIGxpc3Rfdmlldy5maWx0ZXJzLCAoZmlsdGVyLCBfaW5kZXgpLT5cblx0XHRcdFx0XHRpZiBfLmlzQXJyYXkoZmlsdGVyKVxuXHRcdFx0XHRcdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRcdFx0XHRcdGlmIGZpbHRlci5sZW5ndGggPT0gMyBhbmQgXy5pc0Z1bmN0aW9uKGZpbHRlclsyXSlcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJbMl0gPSBmaWx0ZXJbMl0udG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlclszXSA9IFwiRlVOQ1RJT05cIlxuXHRcdFx0XHRcdFx0XHRlbHNlIGlmIGZpbHRlci5sZW5ndGggPT0gMyBhbmQgXy5pc0RhdGUoZmlsdGVyWzJdKVxuXHRcdFx0XHRcdFx0XHRcdCMg5aaC5p6c5pivRGF0Zeexu+Wei++8jOWImWZpbHRlclsyXeWAvOWIsOWJjeerr+S8muiHquWKqOi9rOaIkOWtl+espuS4su+8jOagvOW8j++8mlwiMjAxOC0wMy0yOVQwMzo0MzoyMS43ODdaXCJcblx0XHRcdFx0XHRcdFx0XHQjIOWMheaLrGdyaWTliJfooajor7fmsYLnmoTmjqXlj6PlnKjlhoXnmoTmiYDmnIlPRGF0YeaOpeWPo++8jERhdGXnsbvlnovlrZfmrrXpg73kvJrku6XkuIrov7DmoLzlvI/ov5Tlm55cblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJbM10gPSBcIkRBVEVcIlxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRpZiBmaWx0ZXIubGVuZ3RoID09IDQgYW5kIF8uaXNTdHJpbmcoZmlsdGVyWzJdKSBhbmQgZmlsdGVyWzNdID09IFwiRlVOQ1RJT05cIlxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlclsyXSA9IENyZWF0b3IuZXZhbChcIigje2ZpbHRlclsyXX0pXCIpXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLnBvcCgpXG5cdFx0XHRcdFx0XHRcdGlmIGZpbHRlci5sZW5ndGggPT0gNCBhbmQgXy5pc1N0cmluZyhmaWx0ZXJbMl0pIGFuZCBmaWx0ZXJbM10gPT0gXCJEQVRFXCJcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJbMl0gPSBuZXcgRGF0ZShmaWx0ZXJbMl0pXG5cdFx0XHRcdFx0XHRcdFx0ZmlsdGVyLnBvcCgpXG5cdFx0XHRcdFx0ZWxzZSBpZiBfLmlzT2JqZWN0KGZpbHRlcilcblx0XHRcdFx0XHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0XHRcdFx0XHRpZiBfLmlzRnVuY3Rpb24oZmlsdGVyPy52YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXIuX3ZhbHVlID0gZmlsdGVyLnZhbHVlLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBfLmlzRGF0ZShmaWx0ZXI/LnZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlci5faXNfZGF0ZSA9IHRydWVcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0aWYgXy5pc1N0cmluZyhmaWx0ZXI/Ll92YWx1ZSlcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXIudmFsdWUgPSBDcmVhdG9yLmV2YWwoXCIoI3tmaWx0ZXIuX3ZhbHVlfSlcIilcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBmaWx0ZXIuX2lzX2RhdGUgPT0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRcdGZpbHRlci52YWx1ZSA9IG5ldyBEYXRlKGZpbHRlci52YWx1ZSlcblxuXHRcdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdFx0aWYgb2JqZWN0LmZvcm0gJiYgIV8uaXNTdHJpbmcob2JqZWN0LmZvcm0pXG5cdFx0XHRcdG9iamVjdC5mb3JtID0gSlNPTi5zdHJpbmdpZnkgb2JqZWN0LmZvcm0sIChrZXksIHZhbCktPlxuXHRcdFx0XHRcdGlmIF8uaXNGdW5jdGlvbih2YWwpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsICsgJyc7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbDtcblx0XHRlbHNlIGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgb2JqZWN0LmZvcm1cblx0XHRcdFx0b2JqZWN0LmZvcm0gPSBKU09OLnBhcnNlIG9iamVjdC5mb3JtLCAoa2V5LCB2YWwpLT5cblx0XHRcdFx0XHRpZiBfLmlzU3RyaW5nKHZhbCkgJiYgdmFsLnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uJylcblx0XHRcdFx0XHRcdHJldHVybiBDcmVhdG9yLmV2YWwoXCIoI3t2YWx9KVwiKVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJldHVybiB2YWw7XG5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdF8uZm9yRWFjaCBvYmplY3QucmVsYXRlZF9saXN0cywgKHJlbGF0ZWRPYmpJbmZvKS0+XG5cdFx0XHRcdGlmIF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pXG5cdFx0XHRcdFx0Xy5mb3JFYWNoIHJlbGF0ZWRPYmpJbmZvLCAodmFsLCBrZXkpLT5cblx0XHRcdFx0XHRcdGlmIGtleSA9PSAnZmlsdGVycycgJiYgXy5pc1N0cmluZyh2YWwpXG5cdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRcdHJlbGF0ZWRPYmpJbmZvW2tleV0gPSBDcmVhdG9yLmV2YWwoXCIoI3t2YWx9KVwiKVxuXHRcdFx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJmaWx0ZXJzX2NvZGVcIiwgdmFsXG5cdFx0ZWxzZVxuXHRcdFx0Xy5mb3JFYWNoIG9iamVjdC5yZWxhdGVkX2xpc3RzLCAocmVsYXRlZE9iakluZm8pLT5cblx0XHRcdFx0aWYgXy5pc09iamVjdChyZWxhdGVkT2JqSW5mbylcblx0XHRcdFx0XHRfLmZvckVhY2ggcmVsYXRlZE9iakluZm8sICh2YWwsIGtleSktPlxuXHRcdFx0XHRcdFx0aWYga2V5ID09ICdmaWx0ZXJzJyAmJiBfLmlzRnVuY3Rpb24odmFsKVxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkT2JqSW5mb1trZXldID0gdmFsLnRvU3RyaW5nKClcblxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0Xy5mb3JFYWNoIG9iamVjdC5yZWxhdGVkTGlzdCwgKHJlbGF0ZWRPYmpJbmZvKS0+XG5cdFx0XHRcdGlmIF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pXG5cdFx0XHRcdFx0Xy5mb3JFYWNoIHJlbGF0ZWRPYmpJbmZvLCAodmFsLCBrZXkpLT5cblx0XHRcdFx0XHRcdGlmIGtleSA9PSAnZmlsdGVycycgJiYgXy5pc1N0cmluZyh2YWwpXG5cdFx0XHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0XHRcdHJlbGF0ZWRPYmpJbmZvW2tleV0gPSBDcmVhdG9yLmV2YWwoXCIoI3t2YWx9KVwiKVxuXHRcdFx0XHRcdFx0XHRjYXRjaCBlcnJvclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJmaWx0ZXJzX2NvZGVcIiwgdmFsXG5cdFx0ZWxzZVxuXHRcdFx0Xy5mb3JFYWNoIG9iamVjdC5yZWxhdGVkTGlzdCwgKHJlbGF0ZWRPYmpJbmZvKS0+XG5cdFx0XHRcdGlmIF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pXG5cdFx0XHRcdFx0Xy5mb3JFYWNoIHJlbGF0ZWRPYmpJbmZvLCAodmFsLCBrZXkpLT5cblx0XHRcdFx0XHRcdGlmIGtleSA9PSAnZmlsdGVycycgJiYgXy5pc0Z1bmN0aW9uKHZhbClcblx0XHRcdFx0XHRcdFx0cmVsYXRlZE9iakluZm9ba2V5XSA9IHZhbC50b1N0cmluZygpXG5cblx0XHRyZXR1cm4gb2JqZWN0XG5cblxuIiwidmFyIGNvbnZlcnRGaWVsZCwgZ2V0T3B0aW9uO1xuXG5nZXRPcHRpb24gPSBmdW5jdGlvbihvcHRpb24pIHtcbiAgdmFyIGZvbztcbiAgZm9vID0gb3B0aW9uLnNwbGl0KFwiOlwiKTtcbiAgaWYgKGZvby5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBmb29bMF0sXG4gICAgICB2YWx1ZTogZm9vWzFdLFxuICAgICAgY29sb3I6IGZvb1syXVxuICAgIH07XG4gIH0gZWxzZSBpZiAoZm9vLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGZvb1swXSxcbiAgICAgIHZhbHVlOiBmb29bMV1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogZm9vWzBdLFxuICAgICAgdmFsdWU6IGZvb1swXVxuICAgIH07XG4gIH1cbn07XG5cbmNvbnZlcnRGaWVsZCA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBmaWVsZF9uYW1lLCBmaWVsZCwgc3BhY2VJZCkge1xuICB2YXIgYWxsT3B0aW9ucywgY29kZSwgb3B0aW9ucywgcGlja2xpc3QsIHBpY2tsaXN0T3B0aW9ucywgcmVmO1xuICBpZiAoTWV0ZW9yLmlzU2VydmVyICYmIHNwYWNlSWQgJiYgZmllbGQudHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICBjb2RlID0gZmllbGQucGlja2xpc3QgfHwgKG9iamVjdF9uYW1lICsgXCIuXCIgKyBmaWVsZF9uYW1lKTtcbiAgICBpZiAoY29kZSkge1xuICAgICAgcGlja2xpc3QgPSBDcmVhdG9yLmdldFBpY2tsaXN0KGNvZGUsIHNwYWNlSWQpO1xuICAgICAgaWYgKHBpY2tsaXN0KSB7XG4gICAgICAgIG9wdGlvbnMgPSBbXTtcbiAgICAgICAgYWxsT3B0aW9ucyA9IFtdO1xuICAgICAgICBwaWNrbGlzdE9wdGlvbnMgPSBDcmVhdG9yLmdldFBpY2tMaXN0T3B0aW9ucyhwaWNrbGlzdCk7XG4gICAgICAgIHBpY2tsaXN0T3B0aW9ucyA9IChyZWYgPSBfLnNvcnRCeShwaWNrbGlzdE9wdGlvbnMsICdzb3J0X25vJykpICE9IG51bGwgPyByZWYucmV2ZXJzZSgpIDogdm9pZCAwO1xuICAgICAgICBfLmVhY2gocGlja2xpc3RPcHRpb25zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgdmFyIGxhYmVsLCB2YWx1ZTtcbiAgICAgICAgICBsYWJlbCA9IGl0ZW0ubmFtZTtcbiAgICAgICAgICB2YWx1ZSA9IGl0ZW0udmFsdWUgfHwgaXRlbS5uYW1lO1xuICAgICAgICAgIGFsbE9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogbGFiZWwsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbmFibGU6IGl0ZW0uZW5hYmxlLFxuICAgICAgICAgICAgY29sb3I6IGl0ZW0uY29sb3JcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXRlbS5lbmFibGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICBjb2xvcjogaXRlbS5jb2xvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVtW1wiZGVmYXVsdFwiXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWVsZC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmllbGQuYWxsT3B0aW9ucyA9IGFsbE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpZWxkO1xufTtcblxuQ3JlYXRvci5jb252ZXJ0T2JqZWN0ID0gZnVuY3Rpb24ob2JqZWN0LCBzcGFjZUlkKSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIF8uZm9yRWFjaChvYmplY3QudHJpZ2dlcnMsIGZ1bmN0aW9uKHRyaWdnZXIsIGtleSkge1xuICAgIHZhciBfdG9kbywgX3RvZG9fZnJvbV9jb2RlLCBfdG9kb19mcm9tX2RiO1xuICAgIGlmICgoTWV0ZW9yLmlzU2VydmVyICYmIHRyaWdnZXIub24gPT09IFwic2VydmVyXCIpIHx8IChNZXRlb3IuaXNDbGllbnQgJiYgdHJpZ2dlci5vbiA9PT0gXCJjbGllbnRcIikpIHtcbiAgICAgIF90b2RvX2Zyb21fY29kZSA9IHRyaWdnZXIgIT0gbnVsbCA/IHRyaWdnZXIuX3RvZG8gOiB2b2lkIDA7XG4gICAgICBfdG9kb19mcm9tX2RiID0gdHJpZ2dlci50b2RvO1xuICAgICAgaWYgKF90b2RvX2Zyb21fY29kZSAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fY29kZSkpIHtcbiAgICAgICAgdHJpZ2dlci50b2RvID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBfdG9kb19mcm9tX2NvZGUgKyBcIilcIik7XG4gICAgICB9XG4gICAgICBpZiAoX3RvZG9fZnJvbV9kYiAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fZGIpKSB7XG4gICAgICAgIGlmIChfdG9kb19mcm9tX2RiLnN0YXJ0c1dpdGgoXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgIHRyaWdnZXIudG9kbyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgX3RvZG9fZnJvbV9kYiArIFwiKVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmlnZ2VyLnRvZG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihmdW5jdGlvbih1c2VySWQsIGRvYywgZmllbGROYW1lcywgbW9kaWZpZXIsIG9wdGlvbnMpe1wiICsgX3RvZG9fZnJvbV9kYiArIFwifSlcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlciAmJiB0cmlnZ2VyLm9uID09PSBcImNsaWVudFwiKSB7XG4gICAgICBfdG9kbyA9IHRyaWdnZXIudG9kbztcbiAgICAgIGlmIChfdG9kbyAmJiBfLmlzRnVuY3Rpb24oX3RvZG8pKSB7XG4gICAgICAgIHJldHVybiB0cmlnZ2VyLl90b2RvID0gX3RvZG8udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgXy5mb3JFYWNoKG9iamVjdC5maWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBrZXkpIHtcbiAgICAgIHZhciBzeXN0ZW1CYXNlRmllbGRzO1xuICAgICAgaWYgKGZpZWxkLm9taXQpIHtcbiAgICAgICAgZmllbGQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5yZXF1aXJlZCAmJiBmaWVsZC5yZWFkb25seSkge1xuICAgICAgICBmaWVsZC5yZWFkb25seSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgc3lzdGVtQmFzZUZpZWxkcyA9IENyZWF0b3IuZ2V0U3lzdGVtQmFzZUZpZWxkcygpO1xuICAgICAgaWYgKHN5c3RlbUJhc2VGaWVsZHMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfLmZvckVhY2gob2JqZWN0LmFjdGlvbnMsIGZ1bmN0aW9uKGFjdGlvbiwga2V5KSB7XG4gICAgICB2YXIgX3RvZG9fZnJvbV9jb2RlLCBfdG9kb19mcm9tX2RiLCBfdmlzaWJsZSwgZXJyb3I7XG4gICAgICBfdG9kb19mcm9tX2NvZGUgPSBhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi5fdG9kbyA6IHZvaWQgMDtcbiAgICAgIF90b2RvX2Zyb21fZGIgPSBhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi50b2RvIDogdm9pZCAwO1xuICAgICAgaWYgKF90b2RvX2Zyb21fY29kZSAmJiBfLmlzU3RyaW5nKF90b2RvX2Zyb21fY29kZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY3Rpb24udG9kbyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgX3RvZG9fZnJvbV9jb2RlICsgXCIpXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwidG9kb19mcm9tX2NvZGVcIiwgX3RvZG9fZnJvbV9jb2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKF90b2RvX2Zyb21fZGIgJiYgXy5pc1N0cmluZyhfdG9kb19mcm9tX2RiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChfdG9kb19mcm9tX2RiLnN0YXJ0c1dpdGgoXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgICAgYWN0aW9uLnRvZG8gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIF90b2RvX2Zyb21fZGIgKyBcIilcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfLmlzRnVuY3Rpb24oQ3JlYXRvci5hY3Rpb25zQnlOYW1lW190b2RvX2Zyb21fZGJdKSkge1xuICAgICAgICAgICAgICBhY3Rpb24udG9kbyA9IF90b2RvX2Zyb21fZGI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhY3Rpb24udG9kbyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKGZ1bmN0aW9uKCl7XCIgKyBfdG9kb19mcm9tX2RiICsgXCJ9KVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJ0b2RvX2Zyb21fZGJcIiwgX3RvZG9fZnJvbV9kYiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfdmlzaWJsZSA9IGFjdGlvbiAhPSBudWxsID8gYWN0aW9uLl92aXNpYmxlIDogdm9pZCAwO1xuICAgICAgaWYgKF92aXNpYmxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKF8uaXNTdHJpbmcoX3Zpc2libGUpKSB7XG4gICAgICAgICAgICBfdmlzaWJsZSA9IF92aXNpYmxlLnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNFeHByZXNzaW9uKF92aXNpYmxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi52aXNpYmxlID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgcmVjb3JkX3Blcm1pc3Npb25zLCByZWNvcmQpIHtcbiAgICAgICAgICAgICAgdmFyIGdsb2JhbERhdGE7XG4gICAgICAgICAgICAgIGdsb2JhbERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBDcmVhdG9yLlVTRVJfQ09OVEVYVCwge1xuICAgICAgICAgICAgICAgIG5vdzogbmV3IERhdGUoKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIFN0ZWVkb3MucGFyc2VTaW5nbGVFeHByZXNzaW9uKF92aXNpYmxlLCByZWNvcmQsIFwiI1wiLCBnbG9iYWxEYXRhKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24udmlzaWJsZSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgX3Zpc2libGUgKyBcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcImFjdGlvbi52aXNpYmxlIHRvIGZ1bmN0aW9uIGVycm9yOiBcIiwgZXJyb3IsIF92aXNpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIF8uZm9yRWFjaChvYmplY3QuYWN0aW9ucywgZnVuY3Rpb24oYWN0aW9uLCBrZXkpIHtcbiAgICAgIHZhciBfdG9kbywgX3Zpc2libGU7XG4gICAgICBfdG9kbyA9IGFjdGlvbiAhPSBudWxsID8gYWN0aW9uLnRvZG8gOiB2b2lkIDA7XG4gICAgICBpZiAoX3RvZG8gJiYgXy5pc0Z1bmN0aW9uKF90b2RvKSkge1xuICAgICAgICBhY3Rpb24uX3RvZG8gPSBfdG9kby50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgX3Zpc2libGUgPSBhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi52aXNpYmxlIDogdm9pZCAwO1xuICAgICAgaWYgKF92aXNpYmxlICYmIF8uaXNGdW5jdGlvbihfdmlzaWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5fdmlzaWJsZSA9IF92aXNpYmxlLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgXy5mb3JFYWNoKG9iamVjdC5maWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBrZXkpIHtcbiAgICB2YXIgX29wdGlvbnMsIF90eXBlLCBiZWZvcmVPcGVuRnVuY3Rpb24sIGNyZWF0ZUZ1bmN0aW9uLCBkZWZhdWx0VmFsdWUsIGVycm9yLCBmaWx0ZXJzRnVuY3Rpb24sIGlzX2NvbXBhbnlfbGltaXRlZCwgbWF4LCBtaW4sIG9wdGlvbnMsIG9wdGlvbnNGdW5jdGlvbiwgcmVmZXJlbmNlX3RvLCByZWdFeDtcbiAgICBmaWVsZCA9IGNvbnZlcnRGaWVsZChvYmplY3QubmFtZSwga2V5LCBmaWVsZCwgc3BhY2VJZCk7XG4gICAgaWYgKGZpZWxkLm9wdGlvbnMgJiYgXy5pc1N0cmluZyhmaWVsZC5vcHRpb25zKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgX29wdGlvbnMgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKGZpZWxkLm9wdGlvbnMuc3BsaXQoXCJcXG5cIiksIGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgICAgIHZhciBvcHRpb25zO1xuICAgICAgICAgIGlmIChvcHRpb24uaW5kZXhPZihcIixcIikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb24uc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgcmV0dXJuIF8uZm9yRWFjaChvcHRpb25zLCBmdW5jdGlvbihfb3B0aW9uKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKGdldE9wdGlvbihfb3B0aW9uKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goZ2V0T3B0aW9uKG9wdGlvbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNyZWF0b3IuY29udmVydEZpZWxkc09wdGlvbnNcIiwgZmllbGQub3B0aW9ucywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQub3B0aW9ucyAmJiBfLmlzQXJyYXkoZmllbGQub3B0aW9ucykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF9vcHRpb25zID0gW107XG4gICAgICAgIF8uZm9yRWFjaChmaWVsZC5vcHRpb25zLCBmdW5jdGlvbihvcHRpb24pIHtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhvcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gX29wdGlvbnMucHVzaChnZXRPcHRpb24ob3B0aW9uKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZmllbGQub3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ3JlYXRvci5jb252ZXJ0RmllbGRzT3B0aW9uc1wiLCBmaWVsZC5vcHRpb25zLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC5vcHRpb25zICYmICFfLmlzRnVuY3Rpb24oZmllbGQub3B0aW9ucykgJiYgIV8uaXNBcnJheShmaWVsZC5vcHRpb25zKSAmJiBfLmlzT2JqZWN0KGZpZWxkLm9wdGlvbnMpKSB7XG4gICAgICBfb3B0aW9ucyA9IFtdO1xuICAgICAgXy5lYWNoKGZpZWxkLm9wdGlvbnMsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICAgICAgcmV0dXJuIF9vcHRpb25zLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiB2LFxuICAgICAgICAgIHZhbHVlOiBrXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBmaWVsZC5vcHRpb25zID0gX29wdGlvbnM7XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIG9wdGlvbnMgPSBmaWVsZC5vcHRpb25zO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGZpZWxkLl9vcHRpb25zID0gZmllbGQub3B0aW9ucy50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gZmllbGQuX29wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucyAmJiBfLmlzU3RyaW5nKG9wdGlvbnMpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmllbGQub3B0aW9ucyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgb3B0aW9ucyArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImNvbnZlcnQgZXJyb3IgXCIgKyBvYmplY3QubmFtZSArIFwiIC0+IFwiICsgZmllbGQubmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIHJlZ0V4ID0gZmllbGQucmVnRXg7XG4gICAgICBpZiAocmVnRXgpIHtcbiAgICAgICAgZmllbGQuX3JlZ0V4ID0gZmllbGQucmVnRXgudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVnRXggPSBmaWVsZC5fcmVnRXg7XG4gICAgICBpZiAocmVnRXgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWVsZC5yZWdFeCA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgcmVnRXggKyBcIilcIik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGVycm9yIFwiICsgb2JqZWN0Lm5hbWUgKyBcIiAtPiBcIiArIGZpZWxkLm5hbWUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICBtaW4gPSBmaWVsZC5taW47XG4gICAgICBpZiAoXy5pc0Z1bmN0aW9uKG1pbikpIHtcbiAgICAgICAgZmllbGQuX21pbiA9IG1pbi50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtaW4gPSBmaWVsZC5fbWluO1xuICAgICAgaWYgKF8uaXNTdHJpbmcobWluKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpZWxkLm1pbiA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgbWluICsgXCIpXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udmVydCBlcnJvciBcIiArIG9iamVjdC5uYW1lICsgXCIgLT4gXCIgKyBmaWVsZC5uYW1lLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgbWF4ID0gZmllbGQubWF4O1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihtYXgpKSB7XG4gICAgICAgIGZpZWxkLl9tYXggPSBtYXgudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4ID0gZmllbGQuX21heDtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG1heCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWVsZC5tYXggPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIG1heCArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImNvbnZlcnQgZXJyb3IgXCIgKyBvYmplY3QubmFtZSArIFwiIC0+IFwiICsgZmllbGQubmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGlmIChmaWVsZC5hdXRvZm9ybSkge1xuICAgICAgICBfdHlwZSA9IGZpZWxkLmF1dG9mb3JtLnR5cGU7XG4gICAgICAgIGlmIChfdHlwZSAmJiBfLmlzRnVuY3Rpb24oX3R5cGUpICYmIF90eXBlICE9PSBPYmplY3QgJiYgX3R5cGUgIT09IFN0cmluZyAmJiBfdHlwZSAhPT0gTnVtYmVyICYmIF90eXBlICE9PSBCb29sZWFuICYmICFfLmlzQXJyYXkoX3R5cGUpKSB7XG4gICAgICAgICAgZmllbGQuYXV0b2Zvcm0uX3R5cGUgPSBfdHlwZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWVsZC5hdXRvZm9ybSkge1xuICAgICAgICBfdHlwZSA9IGZpZWxkLmF1dG9mb3JtLl90eXBlO1xuICAgICAgICBpZiAoX3R5cGUgJiYgXy5pc1N0cmluZyhfdHlwZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmllbGQuYXV0b2Zvcm0udHlwZSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgX3R5cGUgKyBcIilcIik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjb252ZXJ0IGZpZWxkIC0+IHR5cGUgZXJyb3JcIiwgZmllbGQsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgb3B0aW9uc0Z1bmN0aW9uID0gZmllbGQub3B0aW9uc0Z1bmN0aW9uO1xuICAgICAgcmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvO1xuICAgICAgY3JlYXRlRnVuY3Rpb24gPSBmaWVsZC5jcmVhdGVGdW5jdGlvbjtcbiAgICAgIGJlZm9yZU9wZW5GdW5jdGlvbiA9IGZpZWxkLmJlZm9yZU9wZW5GdW5jdGlvbjtcbiAgICAgIGZpbHRlcnNGdW5jdGlvbiA9IGZpZWxkLmZpbHRlcnNGdW5jdGlvbjtcbiAgICAgIGlmIChvcHRpb25zRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKG9wdGlvbnNGdW5jdGlvbikpIHtcbiAgICAgICAgZmllbGQuX29wdGlvbnNGdW5jdGlvbiA9IG9wdGlvbnNGdW5jdGlvbi50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKHJlZmVyZW5jZV90byAmJiBfLmlzRnVuY3Rpb24ocmVmZXJlbmNlX3RvKSkge1xuICAgICAgICBmaWVsZC5fcmVmZXJlbmNlX3RvID0gcmVmZXJlbmNlX3RvLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoY3JlYXRlRnVuY3Rpb24gJiYgXy5pc0Z1bmN0aW9uKGNyZWF0ZUZ1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5fY3JlYXRlRnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbi50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGJlZm9yZU9wZW5GdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oYmVmb3JlT3BlbkZ1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5fYmVmb3JlT3BlbkZ1bmN0aW9uID0gYmVmb3JlT3BlbkZ1bmN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyc0Z1bmN0aW9uICYmIF8uaXNGdW5jdGlvbihmaWx0ZXJzRnVuY3Rpb24pKSB7XG4gICAgICAgIGZpZWxkLl9maWx0ZXJzRnVuY3Rpb24gPSBmaWx0ZXJzRnVuY3Rpb24udG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uc0Z1bmN0aW9uID0gZmllbGQuX29wdGlvbnNGdW5jdGlvbiB8fCBmaWVsZC5vcHRpb25zRnVuY3Rpb247XG4gICAgICByZWZlcmVuY2VfdG8gPSBmaWVsZC5fcmVmZXJlbmNlX3RvO1xuICAgICAgY3JlYXRlRnVuY3Rpb24gPSBmaWVsZC5fY3JlYXRlRnVuY3Rpb247XG4gICAgICBiZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5fYmVmb3JlT3BlbkZ1bmN0aW9uO1xuICAgICAgZmlsdGVyc0Z1bmN0aW9uID0gZmllbGQuX2ZpbHRlcnNGdW5jdGlvbiB8fCBmaWVsZC5maWx0ZXJzRnVuY3Rpb247XG4gICAgICBpZiAob3B0aW9uc0Z1bmN0aW9uICYmIF8uaXNTdHJpbmcob3B0aW9uc0Z1bmN0aW9uKSkge1xuICAgICAgICBmaWVsZC5vcHRpb25zRnVuY3Rpb24gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIG9wdGlvbnNGdW5jdGlvbiArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZlcmVuY2VfdG8gJiYgXy5pc1N0cmluZyhyZWZlcmVuY2VfdG8pKSB7XG4gICAgICAgIGZpZWxkLnJlZmVyZW5jZV90byA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgcmVmZXJlbmNlX3RvICsgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGNyZWF0ZUZ1bmN0aW9uICYmIF8uaXNTdHJpbmcoY3JlYXRlRnVuY3Rpb24pKSB7XG4gICAgICAgIGZpZWxkLmNyZWF0ZUZ1bmN0aW9uID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBjcmVhdGVGdW5jdGlvbiArIFwiKVwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChiZWZvcmVPcGVuRnVuY3Rpb24gJiYgXy5pc1N0cmluZyhiZWZvcmVPcGVuRnVuY3Rpb24pKSB7XG4gICAgICAgIGZpZWxkLmJlZm9yZU9wZW5GdW5jdGlvbiA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgYmVmb3JlT3BlbkZ1bmN0aW9uICsgXCIpXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlcnNGdW5jdGlvbiAmJiBfLmlzU3RyaW5nKGZpbHRlcnNGdW5jdGlvbikpIHtcbiAgICAgICAgZmllbGQuZmlsdGVyc0Z1bmN0aW9uID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyBmaWx0ZXJzRnVuY3Rpb24gKyBcIilcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgJiYgXy5pc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgZmllbGQuX2RlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZS50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSBmaWVsZC5fZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKCFkZWZhdWx0VmFsdWUgJiYgXy5pc1N0cmluZyhmaWVsZC5kZWZhdWx0VmFsdWUpICYmIGZpZWxkLmRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwiZnVuY3Rpb25cIikpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAmJiBfLmlzU3RyaW5nKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIGRlZmF1bHRWYWx1ZSArIFwiKVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImNvbnZlcnQgZXJyb3IgXCIgKyBvYmplY3QubmFtZSArIFwiIC0+IFwiICsgZmllbGQubmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICAgIGlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZDtcbiAgICAgIGlmIChpc19jb21wYW55X2xpbWl0ZWQgJiYgXy5pc0Z1bmN0aW9uKGlzX2NvbXBhbnlfbGltaXRlZCkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLl9pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuX2lzX2NvbXBhbnlfbGltaXRlZDtcbiAgICAgIGlmIChpc19jb21wYW55X2xpbWl0ZWQgJiYgXy5pc1N0cmluZyhpc19jb21wYW55X2xpbWl0ZWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgaXNfY29tcGFueV9saW1pdGVkICsgXCIpXCIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcImNvbnZlcnQgZXJyb3IgXCIgKyBvYmplY3QubmFtZSArIFwiIC0+IFwiICsgZmllbGQubmFtZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgXy5mb3JFYWNoKG9iamVjdC5saXN0X3ZpZXdzLCBmdW5jdGlvbihsaXN0X3ZpZXcsIGtleSkge1xuXG4gICAgLypcbiAgICBcdFx0XHTop4blm77ov4fomZHlmajpnIDopoHmlK/mjIFmdW5jdGlvbu+8jOWQjuWPsOi9rOaIkOWtl+espuS4su+8jOWJjeWPsGV2YWzmiJDlh73mlbBcbiAgICBcdFx0XHTorqnov4fomZHlmajmlK/mjIHkuKTnp41mdW5jdGlvbuaWueW8j++8mlxuICAgIFx0XHRcdDEuIOaVtOS4qmZpbHRlcnPkuLpmdW5jdGlvbjpcbiAgICBcdFx0XHTlpoLvvJpcbiAgICBcdFx0XHRmaWx0ZXJzOiAoKS0+XG4gICAgXHRcdFx0XHRyZXR1cm4gW1tbXCJvYmplY3RfbmFtZVwiLFwiPVwiLFwicHJvamVjdF9pc3N1ZXNcIl0sJ29yJyxbXCJvYmplY3RfbmFtZVwiLFwiPVwiLFwidGFza3NcIl1dXVxuICAgIFx0XHRcdDIuIGZpbHRlcnPlhoXnmoRmaWx0ZXIudmFsdWXkuLpmdW5jdGlvblxuICAgIFx0XHRcdOWmgu+8mlxuICAgIFx0XHRcdGZpbHRlcnM6IFtbXCJvYmplY3RfbmFtZVwiLCBcIj1cIiwgKCktPlxuICAgIFx0XHRcdFx0cmV0dXJuIFwicHJvamVjdF9pc3N1ZXNcIlxuICAgIFx0XHRcdF1dXG4gICAgXHRcdFx05oiWXG4gICAgXHRcdFx0ZmlsdGVyczogW3tcbiAgICBcdFx0XHRcdFwiZmllbGRcIjogXCJvYmplY3RfbmFtZVwiXG4gICAgXHRcdFx0XHRcIm9wZXJhdGlvblwiOiBcIj1cIlxuICAgIFx0XHRcdFx0XCJ2YWx1ZVwiOiAoKS0+XG4gICAgXHRcdFx0XHRcdHJldHVybiBcInByb2plY3RfaXNzdWVzXCJcbiAgICBcdFx0XHR9XVxuICAgICAqL1xuICAgIGlmIChfLmlzRnVuY3Rpb24obGlzdF92aWV3LmZpbHRlcnMpKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgIHJldHVybiBsaXN0X3ZpZXcuX2ZpbHRlcnMgPSBsaXN0X3ZpZXcuZmlsdGVycy50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhsaXN0X3ZpZXcuX2ZpbHRlcnMpKSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHJldHVybiBsaXN0X3ZpZXcuZmlsdGVycyA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgbGlzdF92aWV3Ll9maWx0ZXJzICsgXCIpXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXy5mb3JFYWNoKGxpc3Rfdmlldy5maWx0ZXJzLCBmdW5jdGlvbihmaWx0ZXIsIF9pbmRleCkge1xuICAgICAgICBpZiAoXy5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmxlbmd0aCA9PT0gMyAmJiBfLmlzRnVuY3Rpb24oZmlsdGVyWzJdKSkge1xuICAgICAgICAgICAgICBmaWx0ZXJbMl0gPSBmaWx0ZXJbMl0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclszXSA9IFwiRlVOQ1RJT05cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLmxlbmd0aCA9PT0gMyAmJiBfLmlzRGF0ZShmaWx0ZXJbMl0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJbM10gPSBcIkRBVEVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT09IDQgJiYgXy5pc1N0cmluZyhmaWx0ZXJbMl0pICYmIGZpbHRlclszXSA9PT0gXCJGVU5DVElPTlwiKSB7XG4gICAgICAgICAgICAgIGZpbHRlclsyXSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgZmlsdGVyWzJdICsgXCIpXCIpO1xuICAgICAgICAgICAgICBmaWx0ZXIucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmxlbmd0aCA9PT0gNCAmJiBfLmlzU3RyaW5nKGZpbHRlclsyXSkgJiYgZmlsdGVyWzNdID09PSBcIkRBVEVcIikge1xuICAgICAgICAgICAgICBmaWx0ZXJbMl0gPSBuZXcgRGF0ZShmaWx0ZXJbMl0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KGZpbHRlcikpIHtcbiAgICAgICAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICAgICAgICBpZiAoXy5pc0Z1bmN0aW9uKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLnZhbHVlIDogdm9pZCAwKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLl92YWx1ZSA9IGZpbHRlci52YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfLmlzRGF0ZShmaWx0ZXIgIT0gbnVsbCA/IGZpbHRlci52YWx1ZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5faXNfZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLl92YWx1ZSA6IHZvaWQgMCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlci52YWx1ZSA9IENyZWF0b3JbXCJldmFsXCJdKFwiKFwiICsgZmlsdGVyLl92YWx1ZSArIFwiKVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLl9pc19kYXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShmaWx0ZXIudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIGlmIChvYmplY3QuZm9ybSAmJiAhXy5pc1N0cmluZyhvYmplY3QuZm9ybSkpIHtcbiAgICAgIG9iamVjdC5mb3JtID0gSlNPTi5zdHJpbmdpZnkob2JqZWN0LmZvcm0sIGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmIChfLmlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgICAgIHJldHVybiB2YWwgKyAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgaWYgKG9iamVjdC5mb3JtKSB7XG4gICAgICBvYmplY3QuZm9ybSA9IEpTT04ucGFyc2Uob2JqZWN0LmZvcm0sIGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgICAgIGlmIChfLmlzU3RyaW5nKHZhbCkgJiYgdmFsLnN0YXJ0c1dpdGgoJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICByZXR1cm4gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyB2YWwgKyBcIilcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBfLmZvckVhY2gob2JqZWN0LnJlbGF0ZWRfbGlzdHMsIGZ1bmN0aW9uKHJlbGF0ZWRPYmpJbmZvKSB7XG4gICAgICBpZiAoXy5pc09iamVjdChyZWxhdGVkT2JqSW5mbykpIHtcbiAgICAgICAgcmV0dXJuIF8uZm9yRWFjaChyZWxhdGVkT2JqSW5mbywgZnVuY3Rpb24odmFsLCBrZXkpIHtcbiAgICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ2ZpbHRlcnMnICYmIF8uaXNTdHJpbmcodmFsKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRPYmpJbmZvW2tleV0gPSBDcmVhdG9yW1wiZXZhbFwiXShcIihcIiArIHZhbCArIFwiKVwiKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJmaWx0ZXJzX2NvZGVcIiwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIF8uZm9yRWFjaChvYmplY3QucmVsYXRlZF9saXN0cywgZnVuY3Rpb24ocmVsYXRlZE9iakluZm8pIHtcbiAgICAgIGlmIChfLmlzT2JqZWN0KHJlbGF0ZWRPYmpJbmZvKSkge1xuICAgICAgICByZXR1cm4gXy5mb3JFYWNoKHJlbGF0ZWRPYmpJbmZvLCBmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXJzJyAmJiBfLmlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0ZWRPYmpJbmZvW2tleV0gPSB2YWwudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBfLmZvckVhY2gob2JqZWN0LnJlbGF0ZWRMaXN0LCBmdW5jdGlvbihyZWxhdGVkT2JqSW5mbykge1xuICAgICAgaWYgKF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pKSB7XG4gICAgICAgIHJldHVybiBfLmZvckVhY2gocmVsYXRlZE9iakluZm8sIGZ1bmN0aW9uKHZhbCwga2V5KSB7XG4gICAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXJzJyAmJiBfLmlzU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWxhdGVkT2JqSW5mb1trZXldID0gQ3JlYXRvcltcImV2YWxcIl0oXCIoXCIgKyB2YWwgKyBcIilcIik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiZmlsdGVyc19jb2RlXCIsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBfLmZvckVhY2gob2JqZWN0LnJlbGF0ZWRMaXN0LCBmdW5jdGlvbihyZWxhdGVkT2JqSW5mbykge1xuICAgICAgaWYgKF8uaXNPYmplY3QocmVsYXRlZE9iakluZm8pKSB7XG4gICAgICAgIHJldHVybiBfLmZvckVhY2gocmVsYXRlZE9iakluZm8sIGZ1bmN0aW9uKHZhbCwga2V5KSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ2ZpbHRlcnMnICYmIF8uaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRlZE9iakluZm9ba2V5XSA9IHZhbC50b1N0cmluZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJDcmVhdG9yLkZvcm11bGFyID0ge31cblxuQ3JlYXRvci5Gb3JtdWxhci5QUkVGSVggPSBcIl9WQUxVRVNcIlxuXG5DcmVhdG9yLkZvcm11bGFyLl9wcmVwZW5kUHJlZml4Rm9yRm9ybXVsYSA9IChwcmVmaXgsZmllbGRWYXJpYWJsZSktPlxuXHRyZWcgPSAvKFxce1tee31dKlxcfSkvZztcblxuXHRyZXYgPSBmaWVsZFZhcmlhYmxlLnJlcGxhY2UgcmVnLCAobSwgJDEpLT5cblx0XHRyZXR1cm4gcHJlZml4ICsgJDEucmVwbGFjZSgvXFx7XFxzKi8sXCJbXFxcIlwiKS5yZXBsYWNlKC9cXHMqXFx9LyxcIlxcXCJdXCIpLnJlcGxhY2UoL1xccypcXC5cXHMqL2csXCJcXFwiXVtcXFwiXCIpO1xuXG5cdHJldHVybiByZXZcblxuQ3JlYXRvci5Gb3JtdWxhci5jaGVja0Zvcm11bGEgPSAoZm9ybXVsYV9zdHIpLT5cblx0aWYgXy5pc1N0cmluZyhmb3JtdWxhX3N0cikgJiYgZm9ybXVsYV9zdHIuaW5kZXhPZihcIntcIikgPiAtMSAmJiBmb3JtdWxhX3N0ci5pbmRleE9mKFwifVwiKSA+IC0xXG5cdFx0cmV0dXJuIHRydWVcblx0cmV0dXJuIGZhbHNlXG5cbkNyZWF0b3IuRm9ybXVsYXIucnVuID0gKGZvcm11bGFfc3RyLCBfQ09OVEVYVCwgb3B0aW9ucyktPlxuXHRpZiBmb3JtdWxhX3N0ciAmJiBfLmlzU3RyaW5nKGZvcm11bGFfc3RyKVxuXG5cdFx0aWYgIV8uaXNCb29sZWFuKG9wdGlvbnM/LmV4dGVuZClcblx0XHRcdGV4dGVuZCA9IHRydWVcblxuXHRcdF9WQUxVRVMgPSB7fVxuXHRcdF9WQUxVRVMgPSBfLmV4dGVuZChfVkFMVUVTLCBfQ09OVEVYVClcblx0XHRpZiBleHRlbmRcblx0XHRcdF9WQUxVRVMgPSBfLmV4dGVuZChfVkFMVUVTLCBDcmVhdG9yLmdldFVzZXJDb250ZXh0KG9wdGlvbnM/LnVzZXJJZCwgb3B0aW9ucz8uc3BhY2VJZCkpXG5cdFx0Zm9ybXVsYV9zdHIgPSBDcmVhdG9yLkZvcm11bGFyLl9wcmVwZW5kUHJlZml4Rm9yRm9ybXVsYShcInRoaXNcIiwgZm9ybXVsYV9zdHIpXG5cblx0XHR0cnlcblx0XHRcdGRhdGEgPSBDcmVhdG9yLmV2YWxJbkNvbnRleHQoZm9ybXVsYV9zdHIsIF9WQUxVRVMpICAgIyDmraTlpITkuI3og73nlKh3aW5kb3cuZXZhbCDvvIzkvJrlr7zoh7Tlj5jph4/kvZznlKjln5/lvILluLhcblx0XHRcdHJldHVybiBkYXRhXG5cdFx0Y2F0Y2ggZVxuXHRcdFx0Y29uc29sZS5lcnJvcihcIkNyZWF0b3IuRm9ybXVsYXIucnVuOiAje2Zvcm11bGFfc3RyfVwiLCBlKVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdHRvYXN0cj8uZXJyb3IoXCLlhazlvI/miafooYzlh7rplJnkuobvvIzor7fmo4Dmn6XlhazlvI/phY3nva7mmK/lkKbmraPnoa7vvIFcIilcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IgNTAwLCBcIkNyZWF0b3IuRm9ybXVsYXIucnVuOiAje2Zvcm11bGFfc3RyfSN7ZX1cIlxuXG5cdHJldHVybiBmb3JtdWxhX3N0clxuIiwiQ3JlYXRvci5Gb3JtdWxhciA9IHt9O1xuXG5DcmVhdG9yLkZvcm11bGFyLlBSRUZJWCA9IFwiX1ZBTFVFU1wiO1xuXG5DcmVhdG9yLkZvcm11bGFyLl9wcmVwZW5kUHJlZml4Rm9yRm9ybXVsYSA9IGZ1bmN0aW9uKHByZWZpeCwgZmllbGRWYXJpYWJsZSkge1xuICB2YXIgcmVnLCByZXY7XG4gIHJlZyA9IC8oXFx7W157fV0qXFx9KS9nO1xuICByZXYgPSBmaWVsZFZhcmlhYmxlLnJlcGxhY2UocmVnLCBmdW5jdGlvbihtLCAkMSkge1xuICAgIHJldHVybiBwcmVmaXggKyAkMS5yZXBsYWNlKC9cXHtcXHMqLywgXCJbXFxcIlwiKS5yZXBsYWNlKC9cXHMqXFx9LywgXCJcXFwiXVwiKS5yZXBsYWNlKC9cXHMqXFwuXFxzKi9nLCBcIlxcXCJdW1xcXCJcIik7XG4gIH0pO1xuICByZXR1cm4gcmV2O1xufTtcblxuQ3JlYXRvci5Gb3JtdWxhci5jaGVja0Zvcm11bGEgPSBmdW5jdGlvbihmb3JtdWxhX3N0cikge1xuICBpZiAoXy5pc1N0cmluZyhmb3JtdWxhX3N0cikgJiYgZm9ybXVsYV9zdHIuaW5kZXhPZihcIntcIikgPiAtMSAmJiBmb3JtdWxhX3N0ci5pbmRleE9mKFwifVwiKSA+IC0xKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuQ3JlYXRvci5Gb3JtdWxhci5ydW4gPSBmdW5jdGlvbihmb3JtdWxhX3N0ciwgX0NPTlRFWFQsIG9wdGlvbnMpIHtcbiAgdmFyIF9WQUxVRVMsIGRhdGEsIGUsIGV4dGVuZDtcbiAgaWYgKGZvcm11bGFfc3RyICYmIF8uaXNTdHJpbmcoZm9ybXVsYV9zdHIpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmV4dGVuZCA6IHZvaWQgMCkpIHtcbiAgICAgIGV4dGVuZCA9IHRydWU7XG4gICAgfVxuICAgIF9WQUxVRVMgPSB7fTtcbiAgICBfVkFMVUVTID0gXy5leHRlbmQoX1ZBTFVFUywgX0NPTlRFWFQpO1xuICAgIGlmIChleHRlbmQpIHtcbiAgICAgIF9WQUxVRVMgPSBfLmV4dGVuZChfVkFMVUVTLCBDcmVhdG9yLmdldFVzZXJDb250ZXh0KG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMudXNlcklkIDogdm9pZCAwLCBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLnNwYWNlSWQgOiB2b2lkIDApKTtcbiAgICB9XG4gICAgZm9ybXVsYV9zdHIgPSBDcmVhdG9yLkZvcm11bGFyLl9wcmVwZW5kUHJlZml4Rm9yRm9ybXVsYShcInRoaXNcIiwgZm9ybXVsYV9zdHIpO1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0gQ3JlYXRvci5ldmFsSW5Db250ZXh0KGZvcm11bGFfc3RyLCBfVkFMVUVTKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlID0gZXJyb3I7XG4gICAgICBjb25zb2xlLmVycm9yKFwiQ3JlYXRvci5Gb3JtdWxhci5ydW46IFwiICsgZm9ybXVsYV9zdHIsIGUpO1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRvYXN0ciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0b2FzdHIgIT09IG51bGwpIHtcbiAgICAgICAgICB0b2FzdHIuZXJyb3IoXCLlhazlvI/miafooYzlh7rplJnkuobvvIzor7fmo4Dmn6XlhazlvI/phY3nva7mmK/lkKbmraPnoa7vvIFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNTAwLCBcIkNyZWF0b3IuRm9ybXVsYXIucnVuOiBcIiArIGZvcm11bGFfc3RyICsgZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtdWxhX3N0cjtcbn07XG4iLCJjbG9uZSA9IHJlcXVpcmUoJ2Nsb25lJyk7XG5DcmVhdG9yLm9iamVjdHNCeU5hbWUgPSB7fSAgICMg5q2k5a+56LGh5Y+q6IO95Zyo56Gu5L+d5omA5pyJT2JqZWN05Yid5aeL5YyW5a6M5oiQ5ZCO6LCD55So77yMIOWQpuWImeiOt+WPluWIsOeahG9iamVjdOS4jeWFqFxuXG5DcmVhdG9yLmZvcm1hdE9iamVjdE5hbWUgPSAob2JqZWN0X25hbWUpLT5cblx0aWYgb2JqZWN0X25hbWUuc3RhcnRzV2l0aCgnY2ZzLmZpbGVzLicpXG5cdFx0b2JqZWN0X25hbWUgPSBvYmplY3RfbmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwuJywgJ2cnKSwgJ18nKVxuXHRyZXR1cm4gb2JqZWN0X25hbWVcblxuQ3JlYXRvci5PYmplY3QgPSAob3B0aW9ucyktPlxuXHRfYmFzZU9iamVjdCA9IENyZWF0b3IuYmFzZU9iamVjdFxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRfYmFzZU9iamVjdCA9IHthY3Rpb25zOiBDcmVhdG9yLmJhc2VPYmplY3QuYWN0aW9ucyAsIGZpZWxkczoge30sIHRyaWdnZXJzOiB7fSwgcGVybWlzc2lvbl9zZXQ6IHt9fVxuXHRzZWxmID0gdGhpc1xuXHRpZiAoIW9wdGlvbnMubmFtZSlcblx0XHRjb25zb2xlLmVycm9yKG9wdGlvbnMpXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDcmVhdG9yLk9iamVjdCBvcHRpb25zIG11c3Qgc3BlY2lmeSBuYW1lJyk7XG5cblx0c2VsZi5faWQgPSBvcHRpb25zLl9pZCB8fCBvcHRpb25zLm5hbWVcblx0c2VsZi5zcGFjZSA9IG9wdGlvbnMuc3BhY2Vcblx0c2VsZi5uYW1lID0gb3B0aW9ucy5uYW1lXG5cdHNlbGYubGFiZWwgPSBvcHRpb25zLmxhYmVsXG5cdHNlbGYuaWNvbiA9IG9wdGlvbnMuaWNvblxuXHRzZWxmLmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvblxuXHRzZWxmLmlzX3ZpZXcgPSBvcHRpb25zLmlzX3ZpZXdcblx0c2VsZi5mb3JtID0gb3B0aW9ucy5mb3JtXG5cdHNlbGYucmVsYXRlZExpc3QgPSBvcHRpb25zLnJlbGF0ZWRMaXN0XG5cdHNlbGYucmVsYXRlZF9saXN0cyA9IG9wdGlvbnMucmVsYXRlZF9saXN0c1xuXHRzZWxmLmhhc0ltcG9ydFRlbXBsYXRlcyA9IG9wdGlvbnMuaGFzSW1wb3J0VGVtcGxhdGVzXG5cdHNlbGYudmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvbiB8fCAxLjBcblx0aWYgIV8uaXNCb29sZWFuKG9wdGlvbnMuaXNfZW5hYmxlKSAgfHwgb3B0aW9ucy5pc19lbmFibGUgPT0gdHJ1ZVxuXHRcdHNlbGYuaXNfZW5hYmxlID0gdHJ1ZVxuXHRlbHNlXG5cdFx0c2VsZi5pc19lbmFibGUgPSBmYWxzZVxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiBfLmhhcyhvcHRpb25zLCAnYWxsb3dfY3VzdG9tQWN0aW9ucycpXG5cdFx0XHRzZWxmLmFsbG93X2N1c3RvbUFjdGlvbnMgPSBvcHRpb25zLmFsbG93X2N1c3RvbUFjdGlvbnNcblx0XHRpZiBfLmhhcyhvcHRpb25zLCAnZXhjbHVkZV9hY3Rpb25zJylcblx0XHRcdHNlbGYuZXhjbHVkZV9hY3Rpb25zID0gb3B0aW9ucy5leGNsdWRlX2FjdGlvbnNcblx0XHRpZiBfLmhhcyhvcHRpb25zLCAnYWxsb3dfcmVsYXRlZExpc3QnKVxuXHRcdFx0c2VsZi5hbGxvd19yZWxhdGVkTGlzdCA9IG9wdGlvbnMuYWxsb3dfcmVsYXRlZExpc3Rcblx0c2VsZi5lbmFibGVfc2VhcmNoID0gb3B0aW9ucy5lbmFibGVfc2VhcmNoXG5cdHNlbGYuZW5hYmxlX2ZpbGVzID0gb3B0aW9ucy5lbmFibGVfZmlsZXNcblx0c2VsZi5lbmFibGVfdGFza3MgPSBvcHRpb25zLmVuYWJsZV90YXNrc1xuXHRzZWxmLmVuYWJsZV9ub3RlcyA9IG9wdGlvbnMuZW5hYmxlX25vdGVzXG5cdHNlbGYuZW5hYmxlX2F1ZGl0ID0gb3B0aW9ucy5lbmFibGVfYXVkaXRcblx0c2VsZi5lbmFibGVfZXZlbnRzID0gb3B0aW9ucy5lbmFibGVfZXZlbnRzXG5cdGlmIG9wdGlvbnMucGFnaW5nXG5cdFx0c2VsZi5wYWdpbmcgPSBvcHRpb25zLnBhZ2luZ1xuXHRzZWxmLmhpZGRlbiA9IG9wdGlvbnMuaGlkZGVuXG5cdHNlbGYuZW5hYmxlX2FwaSA9IChvcHRpb25zLmVuYWJsZV9hcGkgPT0gdW5kZWZpbmVkKSBvciBvcHRpb25zLmVuYWJsZV9hcGlcblx0c2VsZi5jdXN0b20gPSBvcHRpb25zLmN1c3RvbVxuXHRzZWxmLmVuYWJsZV9zaGFyZSA9IG9wdGlvbnMuZW5hYmxlX3NoYXJlXG5cdHNlbGYuZW5hYmxlX2luc3RhbmNlcyA9IG9wdGlvbnMuZW5hYmxlX2luc3RhbmNlc1xuXHRzZWxmLmVuYWJsZV9wcm9jZXNzID0gb3B0aW9ucy5lbmFibGVfcHJvY2Vzc1xuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRpZiBDcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlKFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSlcblx0XHRcdHNlbGYuZW5hYmxlX3RyZWUgPSBmYWxzZVxuXHRcdGVsc2Vcblx0XHRcdHNlbGYuZW5hYmxlX3RyZWUgPSBvcHRpb25zLmVuYWJsZV90cmVlXG5cdFx0XHRzZWxmLnNpZGViYXIgPSBfLmNsb25lKG9wdGlvbnMuc2lkZWJhcilcblx0ZWxzZVxuXHRcdHNlbGYuc2lkZWJhciA9IF8uY2xvbmUob3B0aW9ucy5zaWRlYmFyKVxuXHRcdHNlbGYuZW5hYmxlX3RyZWUgPSBvcHRpb25zLmVuYWJsZV90cmVlXG5cdHNlbGYub3Blbl93aW5kb3cgPSBvcHRpb25zLm9wZW5fd2luZG93XG5cdHNlbGYuZmlsdGVyX2NvbXBhbnkgPSBvcHRpb25zLmZpbHRlcl9jb21wYW55XG5cdHNlbGYuY2FsZW5kYXIgPSBfLmNsb25lKG9wdGlvbnMuY2FsZW5kYXIpXG5cdHNlbGYuZW5hYmxlX2NoYXR0ZXIgPSBvcHRpb25zLmVuYWJsZV9jaGF0dGVyXG5cdHNlbGYuZW5hYmxlX3RyYXNoID0gb3B0aW9ucy5lbmFibGVfdHJhc2hcblx0c2VsZi5lbmFibGVfc3BhY2VfZ2xvYmFsID0gb3B0aW9ucy5lbmFibGVfc3BhY2VfZ2xvYmFsXG5cdHNlbGYuZW5hYmxlX2FwcHJvdmFscyA9IG9wdGlvbnMuZW5hYmxlX2FwcHJvdmFsc1xuXHRzZWxmLmVuYWJsZV9mb2xsb3cgPSBvcHRpb25zLmVuYWJsZV9mb2xsb3dcblx0c2VsZi5lbmFibGVfd29ya2Zsb3cgPSBvcHRpb25zLmVuYWJsZV93b3JrZmxvd1xuXHRzZWxmLmVuYWJsZV9pbmxpbmVfZWRpdCA9IG9wdGlvbnMuZW5hYmxlX2lubGluZV9lZGl0XG5cdHNlbGYuZGV0YWlscyA9IG9wdGlvbnMuZGV0YWlsc1xuXHRzZWxmLm1hc3RlcnMgPSBvcHRpb25zLm1hc3RlcnNcblx0c2VsZi5sb29rdXBfZGV0YWlscyA9IG9wdGlvbnMubG9va3VwX2RldGFpbHNcblx0aWYgXy5oYXMob3B0aW9ucywgJ2luX2RldmVsb3BtZW50Jylcblx0XHRzZWxmLmluX2RldmVsb3BtZW50ID0gb3B0aW9ucy5pbl9kZXZlbG9wbWVudFxuXHRzZWxmLmlkRmllbGROYW1lID0gJ19pZCdcblx0aWYgb3B0aW9ucy5kYXRhYmFzZV9uYW1lXG5cdFx0c2VsZi5kYXRhYmFzZV9uYW1lID0gb3B0aW9ucy5kYXRhYmFzZV9uYW1lXG5cdGlmICghb3B0aW9ucy5maWVsZHMpXG5cdFx0Y29uc29sZS5lcnJvcihvcHRpb25zKVxuXHRcdHRocm93IG5ldyBFcnJvcignQ3JlYXRvci5PYmplY3Qgb3B0aW9ucyBtdXN0IHNwZWNpZnkgZmllbGRzJyk7XG5cblx0c2VsZi5maWVsZHMgPSBjbG9uZShvcHRpb25zLmZpZWxkcylcblxuXHRfLmVhY2ggc2VsZi5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuXHRcdGlmIGZpZWxkLmlzX25hbWVcblx0XHRcdHNlbGYuTkFNRV9GSUVMRF9LRVkgPSBmaWVsZF9uYW1lXG5cdFx0ZWxzZSBpZiBmaWVsZF9uYW1lID09ICduYW1lJyAmJiAhc2VsZi5OQU1FX0ZJRUxEX0tFWVxuXHRcdFx0c2VsZi5OQU1FX0ZJRUxEX0tFWSA9IGZpZWxkX25hbWVcblx0XHRpZiBmaWVsZC5wcmltYXJ5XG5cdFx0XHRzZWxmLmlkRmllbGROYW1lID0gZmllbGRfbmFtZVxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0aWYgQ3JlYXRvci5pc0Nsb3VkQWRtaW5TcGFjZShTZXNzaW9uLmdldChcInNwYWNlSWRcIikpXG5cdFx0XHRcdGlmIGZpZWxkX25hbWUgPT0gJ3NwYWNlJ1xuXHRcdFx0XHRcdGZpZWxkLmZpbHRlcmFibGUgPSB0cnVlXG5cdFx0XHRcdFx0ZmllbGQuaGlkZGVuID0gZmFsc2VcblxuXHRpZiAhb3B0aW9ucy5kYXRhYmFzZV9uYW1lIHx8IG9wdGlvbnMuZGF0YWJhc2VfbmFtZSA9PSAnbWV0ZW9yLW1vbmdvJ1xuXHRcdF8uZWFjaCBfYmFzZU9iamVjdC5maWVsZHMsIChmaWVsZCwgZmllbGRfbmFtZSktPlxuXHRcdFx0aWYgIXNlbGYuZmllbGRzW2ZpZWxkX25hbWVdXG5cdFx0XHRcdHNlbGYuZmllbGRzW2ZpZWxkX25hbWVdID0ge31cblx0XHRcdHNlbGYuZmllbGRzW2ZpZWxkX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShmaWVsZCksIHNlbGYuZmllbGRzW2ZpZWxkX25hbWVdKVxuXG5cdF8uZWFjaCBzZWxmLmZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG5cdFx0aWYgZmllbGQudHlwZSA9PSAnYXV0b251bWJlcidcblx0XHRcdGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnZm9ybXVsYSdcblx0XHRcdGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnc3VtbWFyeSdcblx0XHRcdGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZVxuXG5cdHNlbGYubGlzdF92aWV3cyA9IHt9XG5cdGRlZmF1bHRWaWV3ID0gQ3JlYXRvci5nZXRPYmplY3REZWZhdWx0VmlldyhzZWxmLm5hbWUpXG5cdF8uZWFjaCBvcHRpb25zLmxpc3Rfdmlld3MsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0XHRvaXRlbSA9IENyZWF0b3IuY29udmVydExpc3RWaWV3KGRlZmF1bHRWaWV3LCBpdGVtLCBpdGVtX25hbWUpXG5cdFx0c2VsZi5saXN0X3ZpZXdzW2l0ZW1fbmFtZV0gPSBvaXRlbVxuXG5cdHNlbGYudHJpZ2dlcnMgPSBfLmNsb25lKF9iYXNlT2JqZWN0LnRyaWdnZXJzKVxuXHRfLmVhY2ggb3B0aW9ucy50cmlnZ2VycywgKGl0ZW0sIGl0ZW1fbmFtZSktPlxuXHRcdGlmICFzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV1cblx0XHRcdHNlbGYudHJpZ2dlcnNbaXRlbV9uYW1lXSA9IHt9XG5cdFx0c2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdLm5hbWUgPSBpdGVtX25hbWVcblx0XHRzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0gPSBfLmV4dGVuZChfLmNsb25lKHNlbGYudHJpZ2dlcnNbaXRlbV9uYW1lXSksIGl0ZW0pXG5cblx0c2VsZi5hY3Rpb25zID0gXy5jbG9uZShfYmFzZU9iamVjdC5hY3Rpb25zKVxuXHRfLmVhY2ggb3B0aW9ucy5hY3Rpb25zLCAoaXRlbSwgaXRlbV9uYW1lKS0+XG5cdFx0aWYgIXNlbGYuYWN0aW9uc1tpdGVtX25hbWVdXG5cdFx0XHRzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSA9IHt9XG5cdFx0Y29weUl0ZW0gPSBfLmNsb25lKHNlbGYuYWN0aW9uc1tpdGVtX25hbWVdKVxuXHRcdGRlbGV0ZSBzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSAj5YWI5Yig6Zmk55u45YWz5bGe5oCn5YaN6YeN5bu65omN6IO95L+d6K+B5ZCO57ut6YeN5aSN5a6a5LmJ55qE5bGe5oCn6aG65bqP55Sf5pWIXG5cdFx0c2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0gPSBfLmV4dGVuZChjb3B5SXRlbSwgaXRlbSlcblx0XHRzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXS5vYmplY3RfbmFtZSA9IHNlbGYubmFtZVxuXG5cdF8uZWFjaCBzZWxmLmFjdGlvbnMsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0XHRpdGVtLm5hbWUgPSBpdGVtX25hbWVcblxuXHRzZWxmLnJlbGF0ZWRfb2JqZWN0cyA9IENyZWF0b3IuZ2V0T2JqZWN0UmVsYXRlZHMoc2VsZi5uYW1lKVxuXG5cdCMg6K6p5omA5pyJb2JqZWN06buY6K6k5pyJ5omA5pyJbGlzdF92aWV3cy9hY3Rpb25zL3JlbGF0ZWRfb2JqZWN0cy9yZWFkYWJsZV9maWVsZHMvZWRpdGFibGVfZmllbGRz5a6M5pW05p2D6ZmQ77yM6K+l5p2D6ZmQ5Y+v6IO96KKr5pWw5o2u5bqT5Lit6K6+572u55qEYWRtaW4vdXNlcuadg+mZkOimhuebllxuXHRzZWxmLnBlcm1pc3Npb25fc2V0ID0gXy5jbG9uZShfYmFzZU9iamVjdC5wZXJtaXNzaW9uX3NldClcblx0IyBkZWZhdWx0TGlzdFZpZXdzID0gXy5rZXlzKHNlbGYubGlzdF92aWV3cylcblx0IyBkZWZhdWx0QWN0aW9ucyA9IF8ua2V5cyhzZWxmLmFjdGlvbnMpXG5cdCMgZGVmYXVsdFJlbGF0ZWRPYmplY3RzID0gXy5wbHVjayhzZWxmLnJlbGF0ZWRfb2JqZWN0cyxcIm9iamVjdF9uYW1lXCIpXG5cdCMgZGVmYXVsdFJlYWRhYmxlRmllbGRzID0gW11cblx0IyBkZWZhdWx0RWRpdGFibGVGaWVsZHMgPSBbXVxuXHQjIF8uZWFjaCBzZWxmLmZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG5cdCMgXHRpZiAhKGZpZWxkLmhpZGRlbikgICAgIzIzMSBvbWl05a2X5q615pSv5oyB5Zyo6Z2e57yW6L6R6aG16Z2i5p+l55yLLCDlm6DmraTliKDpmaTkuobmraTlpITlr7lvbWl055qE5Yik5patXG5cdCMgXHRcdGRlZmF1bHRSZWFkYWJsZUZpZWxkcy5wdXNoIGZpZWxkX25hbWVcblx0IyBcdFx0aWYgIWZpZWxkLnJlYWRvbmx5XG5cdCMgXHRcdFx0ZGVmYXVsdEVkaXRhYmxlRmllbGRzLnB1c2ggZmllbGRfbmFtZVxuXG5cdCMgXy5lYWNoIHNlbGYucGVybWlzc2lvbl9zZXQsIChpdGVtLCBpdGVtX25hbWUpLT5cblx0IyBcdGlmIGl0ZW1fbmFtZSA9PSBcIm5vbmVcIlxuXHQjIFx0XHRyZXR1cm5cblx0IyBcdGlmIHNlbGYubGlzdF92aWV3c1xuXHQjIFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0ubGlzdF92aWV3cyA9IGRlZmF1bHRMaXN0Vmlld3Ncblx0IyBcdGlmIHNlbGYuYWN0aW9uc1xuXHQjIFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0uYWN0aW9ucyA9IGRlZmF1bHRBY3Rpb25zXG5cdCMgXHRpZiBzZWxmLnJlbGF0ZWRfb2JqZWN0c1xuXHQjIFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0ucmVsYXRlZF9vYmplY3RzID0gZGVmYXVsdFJlbGF0ZWRPYmplY3RzXG5cdCMgXHRpZiBzZWxmLmZpZWxkc1xuXHQjIFx0XHRzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0ucmVhZGFibGVfZmllbGRzID0gZGVmYXVsdFJlYWRhYmxlRmllbGRzXG5cdCMgXHRcdHNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXS5lZGl0YWJsZV9maWVsZHMgPSBkZWZhdWx0RWRpdGFibGVGaWVsZHNcblx0dW5sZXNzIG9wdGlvbnMucGVybWlzc2lvbl9zZXRcblx0XHRvcHRpb25zLnBlcm1pc3Npb25fc2V0ID0ge31cblx0aWYgIShvcHRpb25zLnBlcm1pc3Npb25fc2V0Py5hZG1pbilcblx0XHRvcHRpb25zLnBlcm1pc3Npb25fc2V0LmFkbWluID0gXy5jbG9uZShzZWxmLnBlcm1pc3Npb25fc2V0W1wiYWRtaW5cIl0pXG5cdGlmICEob3B0aW9ucy5wZXJtaXNzaW9uX3NldD8udXNlcilcblx0XHRvcHRpb25zLnBlcm1pc3Npb25fc2V0LnVzZXIgPSBfLmNsb25lKHNlbGYucGVybWlzc2lvbl9zZXRbXCJ1c2VyXCJdKVxuXHRfLmVhY2ggb3B0aW9ucy5wZXJtaXNzaW9uX3NldCwgKGl0ZW0sIGl0ZW1fbmFtZSktPlxuXHRcdGlmICFzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV1cblx0XHRcdHNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXSA9IHt9XG5cdFx0c2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0pLCBpdGVtKVxuXG5cdCMg5YmN56uv5qC55o2ucGVybWlzc2lvbnPmlLnlhplmaWVsZOebuOWFs+WxnuaAp++8jOWQjuerr+WPquimgei1sOm7mOiupOWxnuaAp+WwseihjO+8jOS4jemcgOimgeaUueWGmVxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRwZXJtaXNzaW9ucyA9IG9wdGlvbnMucGVybWlzc2lvbnNcblx0XHRkaXNhYmxlZF9saXN0X3ZpZXdzID0gcGVybWlzc2lvbnM/LmRpc2FibGVkX2xpc3Rfdmlld3Ncblx0XHRpZiBkaXNhYmxlZF9saXN0X3ZpZXdzPy5sZW5ndGhcblx0XHRcdGRlZmF1bHRMaXN0Vmlld0lkID0gb3B0aW9ucy5saXN0X3ZpZXdzPy5hbGw/Ll9pZFxuXHRcdFx0aWYgZGVmYXVsdExpc3RWaWV3SWRcblx0XHRcdFx0IyDmiorop4blm77mnYPpmZDphY3nva7kuK3pu5jorqTnmoRhbGzop4blm75pZOi9rOaNouaIkGFsbOWFs+mUruWtl1xuXHRcdFx0XHRwZXJtaXNzaW9ucy5kaXNhYmxlZF9saXN0X3ZpZXdzID0gXy5tYXAgZGlzYWJsZWRfbGlzdF92aWV3cywgKGxpc3Rfdmlld19pdGVtKSAtPlxuXHRcdFx0XHRcdHJldHVybiBpZiBkZWZhdWx0TGlzdFZpZXdJZCA9PSBsaXN0X3ZpZXdfaXRlbSB0aGVuIFwiYWxsXCIgZWxzZSBsaXN0X3ZpZXdfaXRlbVxuXHRcdHNlbGYucGVybWlzc2lvbnMgPSBuZXcgUmVhY3RpdmVWYXIocGVybWlzc2lvbnMpXG4jXHRcdF8uZWFjaCBzZWxmLmZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG4jXHRcdFx0aWYgZmllbGRcbiNcdFx0XHRcdGlmIF8uaW5kZXhPZihwZXJtaXNzaW9ucz8udW5yZWFkYWJsZV9maWVsZHMsIGZpZWxkX25hbWUpIDwgMFxuI1x0XHRcdFx0XHRpZiBmaWVsZC5oaWRkZW5cbiNcdFx0XHRcdFx0XHRyZXR1cm5cbiNcdFx0XHRcdFx0aWYgXy5pbmRleE9mKHBlcm1pc3Npb25zPy51bmVkaXRhYmxlX2ZpZWxkcywgZmllbGRfbmFtZSkgPiAtMVxuI1x0XHRcdFx0XHRcdGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZVxuI1x0XHRcdFx0XHRcdGZpZWxkLmRpc2FibGVkID0gdHJ1ZVxuI1x0XHRcdFx0XHRcdCMg5b2T5Y+q6K+75pe277yM5aaC5p6c5LiN5Y675o6J5b+F5aGr5a2X5q6177yMYXV0b2Zvcm3mmK/kvJrmiqXplJnnmoRcbiNcdFx0XHRcdFx0XHRmaWVsZC5yZXF1aXJlZCA9IGZhbHNlXG4jXHRcdFx0XHRlbHNlXG4jXHRcdFx0XHRcdGZpZWxkLmhpZGRlbiA9IHRydWVcblx0ZWxzZVxuXHRcdHNlbGYucGVybWlzc2lvbnMgPSBudWxsXG5cblx0X2RiID0gQ3JlYXRvci5jcmVhdGVDb2xsZWN0aW9uKG9wdGlvbnMpXG5cblx0Q3JlYXRvci5Db2xsZWN0aW9uc1tfZGIuX25hbWVdID0gX2RiXG5cblx0c2VsZi5kYiA9IF9kYlxuXG5cdHNlbGYuX2NvbGxlY3Rpb25fbmFtZSA9IF9kYi5fbmFtZVxuXG5cdHNjaGVtYSA9IENyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hKHNlbGYpXG5cdHNlbGYuc2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYShzY2hlbWEpXG5cdGlmIHNlbGYubmFtZSAhPSBcInVzZXJzXCIgYW5kIHNlbGYubmFtZSAhPSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCIgJiYgIXNlbGYuaXNfdmlldyAmJiAhXy5jb250YWlucyhbXCJmbG93c1wiLCBcImZvcm1zXCIsIFwiaW5zdGFuY2VzXCIsIFwib3JnYW5pemF0aW9uc1wiLCBcImFjdGlvbl9maWVsZF91cGRhdGVzXCIsIFwib2JqZWN0X2xpc3R2aWV3c1wiXSwgc2VsZi5uYW1lKVxuXHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0X2RiLmF0dGFjaFNjaGVtYShzZWxmLnNjaGVtYSwge3JlcGxhY2U6IHRydWV9KVxuXHRcdGVsc2Vcblx0XHRcdF9kYi5hdHRhY2hTY2hlbWEoc2VsZi5zY2hlbWEsIHtyZXBsYWNlOiB0cnVlfSlcblx0aWYgc2VsZi5uYW1lID09IFwidXNlcnNcIlxuXHRcdF9kYi5fc2ltcGxlU2NoZW1hID0gc2VsZi5zY2hlbWFcblxuXHRpZiBfLmNvbnRhaW5zKFtcImZsb3dzXCIsIFwiZm9ybXNcIiwgXCJpbnN0YW5jZXNcIiwgXCJvcmdhbml6YXRpb25zXCJdLCBzZWxmLm5hbWUpXG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRfZGIuYXR0YWNoU2NoZW1hKHNlbGYuc2NoZW1hLCB7cmVwbGFjZTogdHJ1ZX0pXG5cblx0Q3JlYXRvci5vYmplY3RzQnlOYW1lW3NlbGYuX2NvbGxlY3Rpb25fbmFtZV0gPSBzZWxmXG5cblx0cmV0dXJuIHNlbGZcblxuIyBDcmVhdG9yLk9iamVjdC5wcm90b3R5cGUuaTE4biA9ICgpLT5cbiMgXHQjIHNldCBvYmplY3QgbGFiZWxcbiMgXHRzZWxmID0gdGhpc1xuXG4jIFx0a2V5ID0gc2VsZi5uYW1lXG4jIFx0aWYgdChrZXkpID09IGtleVxuIyBcdFx0aWYgIXNlbGYubGFiZWxcbiMgXHRcdFx0c2VsZi5sYWJlbCA9IHNlbGYubmFtZVxuIyBcdGVsc2VcbiMgXHRcdHNlbGYubGFiZWwgPSB0KGtleSlcblxuIyBcdCMgc2V0IGZpZWxkIGxhYmVsc1xuIyBcdF8uZWFjaCBzZWxmLmZpZWxkcywgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG4jIFx0XHRma2V5ID0gc2VsZi5uYW1lICsgXCJfXCIgKyBmaWVsZF9uYW1lXG4jIFx0XHRpZiB0KGZrZXkpID09IGZrZXlcbiMgXHRcdFx0aWYgIWZpZWxkLmxhYmVsXG4jIFx0XHRcdFx0ZmllbGQubGFiZWwgPSBmaWVsZF9uYW1lXG4jIFx0XHRlbHNlXG4jIFx0XHRcdGZpZWxkLmxhYmVsID0gdChma2V5KVxuIyBcdFx0c2VsZi5zY2hlbWE/Ll9zY2hlbWE/W2ZpZWxkX25hbWVdPy5sYWJlbCA9IGZpZWxkLmxhYmVsXG5cblxuIyBcdCMgc2V0IGxpc3R2aWV3IGxhYmVsc1xuIyBcdF8uZWFjaCBzZWxmLmxpc3Rfdmlld3MsIChpdGVtLCBpdGVtX25hbWUpLT5cbiMgXHRcdGkxOG5fa2V5ID0gc2VsZi5uYW1lICsgXCJfbGlzdHZpZXdfXCIgKyBpdGVtX25hbWVcbiMgXHRcdGlmIHQoaTE4bl9rZXkpID09IGkxOG5fa2V5XG4jIFx0XHRcdGlmICFpdGVtLmxhYmVsXG4jIFx0XHRcdFx0aXRlbS5sYWJlbCA9IGl0ZW1fbmFtZVxuIyBcdFx0ZWxzZVxuIyBcdFx0XHRpdGVtLmxhYmVsID0gdChpMThuX2tleSlcblxuXG5DcmVhdG9yLmdldE9iamVjdE9EYXRhUm91dGVyUHJlZml4ID0gKG9iamVjdCktPlxuXHRyZXR1cm4gXCIvYXBpL29kYXRhL3Y0XCJcblx0IyBpZiBvYmplY3Rcblx0IyBcdGlmICFvYmplY3QuZGF0YWJhc2VfbmFtZSB8fCBvYmplY3QuZGF0YWJhc2VfbmFtZSA9PSAnbWV0ZW9yLW1vbmdvJ1xuXHQjIFx0XHRyZXR1cm4gXCIvYXBpL29kYXRhL3Y0XCJcblx0IyBcdGVsc2Vcblx0IyBcdFx0cmV0dXJuIFwiL2FwaS9vZGF0YS8je29iamVjdC5kYXRhYmFzZV9uYW1lfVwiXG5cbiMgaWYgTWV0ZW9yLmlzQ2xpZW50XG5cbiMgXHRNZXRlb3Iuc3RhcnR1cCAtPlxuIyBcdFx0VHJhY2tlci5hdXRvcnVuIC0+XG4jIFx0XHRcdGlmIFNlc3Npb24uZ2V0KFwic3RlZWRvcy1sb2NhbGVcIikgJiYgQ3JlYXRvci5ib290c3RyYXBMb2FkZWQ/LmdldCgpXG4jIFx0XHRcdFx0Xy5lYWNoIENyZWF0b3Iub2JqZWN0c0J5TmFtZSwgKG9iamVjdCwgb2JqZWN0X25hbWUpLT5cbiMgXHRcdFx0XHRcdG9iamVjdC5pMThuKClcblxuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0aWYgIUNyZWF0b3IuYm9vdHN0cmFwTG9hZGVkICYmIENyZWF0b3IuT2JqZWN0c1xuXHRcdF8uZWFjaCBDcmVhdG9yLk9iamVjdHMsIChvYmplY3QpLT5cblx0XHRcdG5ldyBDcmVhdG9yLk9iamVjdChvYmplY3QpXG5cbiIsInZhciBjbG9uZTtcblxuY2xvbmUgPSByZXF1aXJlKCdjbG9uZScpO1xuXG5DcmVhdG9yLm9iamVjdHNCeU5hbWUgPSB7fTtcblxuQ3JlYXRvci5mb3JtYXRPYmplY3ROYW1lID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcbiAgaWYgKG9iamVjdF9uYW1lLnN0YXJ0c1dpdGgoJ2Nmcy5maWxlcy4nKSkge1xuICAgIG9iamVjdF9uYW1lID0gb2JqZWN0X25hbWUucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcLicsICdnJyksICdfJyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdF9uYW1lO1xufTtcblxuQ3JlYXRvci5PYmplY3QgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBfYmFzZU9iamVjdCwgX2RiLCBkZWZhdWx0TGlzdFZpZXdJZCwgZGVmYXVsdFZpZXcsIGRpc2FibGVkX2xpc3Rfdmlld3MsIHBlcm1pc3Npb25zLCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHNjaGVtYSwgc2VsZjtcbiAgX2Jhc2VPYmplY3QgPSBDcmVhdG9yLmJhc2VPYmplY3Q7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBfYmFzZU9iamVjdCA9IHtcbiAgICAgIGFjdGlvbnM6IENyZWF0b3IuYmFzZU9iamVjdC5hY3Rpb25zLFxuICAgICAgZmllbGRzOiB7fSxcbiAgICAgIHRyaWdnZXJzOiB7fSxcbiAgICAgIHBlcm1pc3Npb25fc2V0OiB7fVxuICAgIH07XG4gIH1cbiAgc2VsZiA9IHRoaXM7XG4gIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgY29uc29sZS5lcnJvcihvcHRpb25zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NyZWF0b3IuT2JqZWN0IG9wdGlvbnMgbXVzdCBzcGVjaWZ5IG5hbWUnKTtcbiAgfVxuICBzZWxmLl9pZCA9IG9wdGlvbnMuX2lkIHx8IG9wdGlvbnMubmFtZTtcbiAgc2VsZi5zcGFjZSA9IG9wdGlvbnMuc3BhY2U7XG4gIHNlbGYubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgc2VsZi5sYWJlbCA9IG9wdGlvbnMubGFiZWw7XG4gIHNlbGYuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgc2VsZi5kZXNjcmlwdGlvbiA9IG9wdGlvbnMuZGVzY3JpcHRpb247XG4gIHNlbGYuaXNfdmlldyA9IG9wdGlvbnMuaXNfdmlldztcbiAgc2VsZi5mb3JtID0gb3B0aW9ucy5mb3JtO1xuICBzZWxmLnJlbGF0ZWRMaXN0ID0gb3B0aW9ucy5yZWxhdGVkTGlzdDtcbiAgc2VsZi5yZWxhdGVkX2xpc3RzID0gb3B0aW9ucy5yZWxhdGVkX2xpc3RzO1xuICBzZWxmLmhhc0ltcG9ydFRlbXBsYXRlcyA9IG9wdGlvbnMuaGFzSW1wb3J0VGVtcGxhdGVzO1xuICBzZWxmLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gfHwgMS4wO1xuICBpZiAoIV8uaXNCb29sZWFuKG9wdGlvbnMuaXNfZW5hYmxlKSB8fCBvcHRpb25zLmlzX2VuYWJsZSA9PT0gdHJ1ZSkge1xuICAgIHNlbGYuaXNfZW5hYmxlID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLmlzX2VuYWJsZSA9IGZhbHNlO1xuICB9XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBpZiAoXy5oYXMob3B0aW9ucywgJ2FsbG93X2N1c3RvbUFjdGlvbnMnKSkge1xuICAgICAgc2VsZi5hbGxvd19jdXN0b21BY3Rpb25zID0gb3B0aW9ucy5hbGxvd19jdXN0b21BY3Rpb25zO1xuICAgIH1cbiAgICBpZiAoXy5oYXMob3B0aW9ucywgJ2V4Y2x1ZGVfYWN0aW9ucycpKSB7XG4gICAgICBzZWxmLmV4Y2x1ZGVfYWN0aW9ucyA9IG9wdGlvbnMuZXhjbHVkZV9hY3Rpb25zO1xuICAgIH1cbiAgICBpZiAoXy5oYXMob3B0aW9ucywgJ2FsbG93X3JlbGF0ZWRMaXN0JykpIHtcbiAgICAgIHNlbGYuYWxsb3dfcmVsYXRlZExpc3QgPSBvcHRpb25zLmFsbG93X3JlbGF0ZWRMaXN0O1xuICAgIH1cbiAgfVxuICBzZWxmLmVuYWJsZV9zZWFyY2ggPSBvcHRpb25zLmVuYWJsZV9zZWFyY2g7XG4gIHNlbGYuZW5hYmxlX2ZpbGVzID0gb3B0aW9ucy5lbmFibGVfZmlsZXM7XG4gIHNlbGYuZW5hYmxlX3Rhc2tzID0gb3B0aW9ucy5lbmFibGVfdGFza3M7XG4gIHNlbGYuZW5hYmxlX25vdGVzID0gb3B0aW9ucy5lbmFibGVfbm90ZXM7XG4gIHNlbGYuZW5hYmxlX2F1ZGl0ID0gb3B0aW9ucy5lbmFibGVfYXVkaXQ7XG4gIHNlbGYuZW5hYmxlX2V2ZW50cyA9IG9wdGlvbnMuZW5hYmxlX2V2ZW50cztcbiAgaWYgKG9wdGlvbnMucGFnaW5nKSB7XG4gICAgc2VsZi5wYWdpbmcgPSBvcHRpb25zLnBhZ2luZztcbiAgfVxuICBzZWxmLmhpZGRlbiA9IG9wdGlvbnMuaGlkZGVuO1xuICBzZWxmLmVuYWJsZV9hcGkgPSAob3B0aW9ucy5lbmFibGVfYXBpID09PSB2b2lkIDApIHx8IG9wdGlvbnMuZW5hYmxlX2FwaTtcbiAgc2VsZi5jdXN0b20gPSBvcHRpb25zLmN1c3RvbTtcbiAgc2VsZi5lbmFibGVfc2hhcmUgPSBvcHRpb25zLmVuYWJsZV9zaGFyZTtcbiAgc2VsZi5lbmFibGVfaW5zdGFuY2VzID0gb3B0aW9ucy5lbmFibGVfaW5zdGFuY2VzO1xuICBzZWxmLmVuYWJsZV9wcm9jZXNzID0gb3B0aW9ucy5lbmFibGVfcHJvY2VzcztcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmIChDcmVhdG9yLmlzQ2xvdWRBZG1pblNwYWNlKFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSkpIHtcbiAgICAgIHNlbGYuZW5hYmxlX3RyZWUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5lbmFibGVfdHJlZSA9IG9wdGlvbnMuZW5hYmxlX3RyZWU7XG4gICAgICBzZWxmLnNpZGViYXIgPSBfLmNsb25lKG9wdGlvbnMuc2lkZWJhcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNlbGYuc2lkZWJhciA9IF8uY2xvbmUob3B0aW9ucy5zaWRlYmFyKTtcbiAgICBzZWxmLmVuYWJsZV90cmVlID0gb3B0aW9ucy5lbmFibGVfdHJlZTtcbiAgfVxuICBzZWxmLm9wZW5fd2luZG93ID0gb3B0aW9ucy5vcGVuX3dpbmRvdztcbiAgc2VsZi5maWx0ZXJfY29tcGFueSA9IG9wdGlvbnMuZmlsdGVyX2NvbXBhbnk7XG4gIHNlbGYuY2FsZW5kYXIgPSBfLmNsb25lKG9wdGlvbnMuY2FsZW5kYXIpO1xuICBzZWxmLmVuYWJsZV9jaGF0dGVyID0gb3B0aW9ucy5lbmFibGVfY2hhdHRlcjtcbiAgc2VsZi5lbmFibGVfdHJhc2ggPSBvcHRpb25zLmVuYWJsZV90cmFzaDtcbiAgc2VsZi5lbmFibGVfc3BhY2VfZ2xvYmFsID0gb3B0aW9ucy5lbmFibGVfc3BhY2VfZ2xvYmFsO1xuICBzZWxmLmVuYWJsZV9hcHByb3ZhbHMgPSBvcHRpb25zLmVuYWJsZV9hcHByb3ZhbHM7XG4gIHNlbGYuZW5hYmxlX2ZvbGxvdyA9IG9wdGlvbnMuZW5hYmxlX2ZvbGxvdztcbiAgc2VsZi5lbmFibGVfd29ya2Zsb3cgPSBvcHRpb25zLmVuYWJsZV93b3JrZmxvdztcbiAgc2VsZi5lbmFibGVfaW5saW5lX2VkaXQgPSBvcHRpb25zLmVuYWJsZV9pbmxpbmVfZWRpdDtcbiAgc2VsZi5kZXRhaWxzID0gb3B0aW9ucy5kZXRhaWxzO1xuICBzZWxmLm1hc3RlcnMgPSBvcHRpb25zLm1hc3RlcnM7XG4gIHNlbGYubG9va3VwX2RldGFpbHMgPSBvcHRpb25zLmxvb2t1cF9kZXRhaWxzO1xuICBpZiAoXy5oYXMob3B0aW9ucywgJ2luX2RldmVsb3BtZW50JykpIHtcbiAgICBzZWxmLmluX2RldmVsb3BtZW50ID0gb3B0aW9ucy5pbl9kZXZlbG9wbWVudDtcbiAgfVxuICBzZWxmLmlkRmllbGROYW1lID0gJ19pZCc7XG4gIGlmIChvcHRpb25zLmRhdGFiYXNlX25hbWUpIHtcbiAgICBzZWxmLmRhdGFiYXNlX25hbWUgPSBvcHRpb25zLmRhdGFiYXNlX25hbWU7XG4gIH1cbiAgaWYgKCFvcHRpb25zLmZpZWxkcykge1xuICAgIGNvbnNvbGUuZXJyb3Iob3B0aW9ucyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDcmVhdG9yLk9iamVjdCBvcHRpb25zIG11c3Qgc3BlY2lmeSBmaWVsZHMnKTtcbiAgfVxuICBzZWxmLmZpZWxkcyA9IGNsb25lKG9wdGlvbnMuZmllbGRzKTtcbiAgXy5lYWNoKHNlbGYuZmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRfbmFtZSkge1xuICAgIGlmIChmaWVsZC5pc19uYW1lKSB7XG4gICAgICBzZWxmLk5BTUVfRklFTERfS0VZID0gZmllbGRfbmFtZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkX25hbWUgPT09ICduYW1lJyAmJiAhc2VsZi5OQU1FX0ZJRUxEX0tFWSkge1xuICAgICAgc2VsZi5OQU1FX0ZJRUxEX0tFWSA9IGZpZWxkX25hbWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5wcmltYXJ5KSB7XG4gICAgICBzZWxmLmlkRmllbGROYW1lID0gZmllbGRfbmFtZTtcbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKENyZWF0b3IuaXNDbG91ZEFkbWluU3BhY2UoU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpKSkge1xuICAgICAgICBpZiAoZmllbGRfbmFtZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgIGZpZWxkLmZpbHRlcmFibGUgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBmaWVsZC5oaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmICghb3B0aW9ucy5kYXRhYmFzZV9uYW1lIHx8IG9wdGlvbnMuZGF0YWJhc2VfbmFtZSA9PT0gJ21ldGVvci1tb25nbycpIHtcbiAgICBfLmVhY2goX2Jhc2VPYmplY3QuZmllbGRzLCBmdW5jdGlvbihmaWVsZCwgZmllbGRfbmFtZSkge1xuICAgICAgaWYgKCFzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSkge1xuICAgICAgICBzZWxmLmZpZWxkc1tmaWVsZF9uYW1lXSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGYuZmllbGRzW2ZpZWxkX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShmaWVsZCksIHNlbGYuZmllbGRzW2ZpZWxkX25hbWVdKTtcbiAgICB9KTtcbiAgfVxuICBfLmVhY2goc2VsZi5maWVsZHMsIGZ1bmN0aW9uKGZpZWxkLCBmaWVsZF9uYW1lKSB7XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09ICdhdXRvbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdmb3JtdWxhJykge1xuICAgICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdzdW1tYXJ5Jykge1xuICAgICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5ID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICBzZWxmLmxpc3Rfdmlld3MgPSB7fTtcbiAgZGVmYXVsdFZpZXcgPSBDcmVhdG9yLmdldE9iamVjdERlZmF1bHRWaWV3KHNlbGYubmFtZSk7XG4gIF8uZWFjaChvcHRpb25zLmxpc3Rfdmlld3MsIGZ1bmN0aW9uKGl0ZW0sIGl0ZW1fbmFtZSkge1xuICAgIHZhciBvaXRlbTtcbiAgICBvaXRlbSA9IENyZWF0b3IuY29udmVydExpc3RWaWV3KGRlZmF1bHRWaWV3LCBpdGVtLCBpdGVtX25hbWUpO1xuICAgIHJldHVybiBzZWxmLmxpc3Rfdmlld3NbaXRlbV9uYW1lXSA9IG9pdGVtO1xuICB9KTtcbiAgc2VsZi50cmlnZ2VycyA9IF8uY2xvbmUoX2Jhc2VPYmplY3QudHJpZ2dlcnMpO1xuICBfLmVhY2gob3B0aW9ucy50cmlnZ2VycywgZnVuY3Rpb24oaXRlbSwgaXRlbV9uYW1lKSB7XG4gICAgaWYgKCFzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0pIHtcbiAgICAgIHNlbGYudHJpZ2dlcnNbaXRlbV9uYW1lXSA9IHt9O1xuICAgIH1cbiAgICBzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0ubmFtZSA9IGl0ZW1fbmFtZTtcbiAgICByZXR1cm4gc2VsZi50cmlnZ2Vyc1tpdGVtX25hbWVdID0gXy5leHRlbmQoXy5jbG9uZShzZWxmLnRyaWdnZXJzW2l0ZW1fbmFtZV0pLCBpdGVtKTtcbiAgfSk7XG4gIHNlbGYuYWN0aW9ucyA9IF8uY2xvbmUoX2Jhc2VPYmplY3QuYWN0aW9ucyk7XG4gIF8uZWFjaChvcHRpb25zLmFjdGlvbnMsIGZ1bmN0aW9uKGl0ZW0sIGl0ZW1fbmFtZSkge1xuICAgIHZhciBjb3B5SXRlbTtcbiAgICBpZiAoIXNlbGYuYWN0aW9uc1tpdGVtX25hbWVdKSB7XG4gICAgICBzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSA9IHt9O1xuICAgIH1cbiAgICBjb3B5SXRlbSA9IF8uY2xvbmUoc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0pO1xuICAgIGRlbGV0ZSBzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXTtcbiAgICBzZWxmLmFjdGlvbnNbaXRlbV9uYW1lXSA9IF8uZXh0ZW5kKGNvcHlJdGVtLCBpdGVtKTtcbiAgICByZXR1cm4gc2VsZi5hY3Rpb25zW2l0ZW1fbmFtZV0ub2JqZWN0X25hbWUgPSBzZWxmLm5hbWU7XG4gIH0pO1xuICBfLmVhY2goc2VsZi5hY3Rpb25zLCBmdW5jdGlvbihpdGVtLCBpdGVtX25hbWUpIHtcbiAgICByZXR1cm4gaXRlbS5uYW1lID0gaXRlbV9uYW1lO1xuICB9KTtcbiAgc2VsZi5yZWxhdGVkX29iamVjdHMgPSBDcmVhdG9yLmdldE9iamVjdFJlbGF0ZWRzKHNlbGYubmFtZSk7XG4gIHNlbGYucGVybWlzc2lvbl9zZXQgPSBfLmNsb25lKF9iYXNlT2JqZWN0LnBlcm1pc3Npb25fc2V0KTtcbiAgaWYgKCFvcHRpb25zLnBlcm1pc3Npb25fc2V0KSB7XG4gICAgb3B0aW9ucy5wZXJtaXNzaW9uX3NldCA9IHt9O1xuICB9XG4gIGlmICghKChyZWYgPSBvcHRpb25zLnBlcm1pc3Npb25fc2V0KSAhPSBudWxsID8gcmVmLmFkbWluIDogdm9pZCAwKSkge1xuICAgIG9wdGlvbnMucGVybWlzc2lvbl9zZXQuYWRtaW4gPSBfLmNsb25lKHNlbGYucGVybWlzc2lvbl9zZXRbXCJhZG1pblwiXSk7XG4gIH1cbiAgaWYgKCEoKHJlZjEgPSBvcHRpb25zLnBlcm1pc3Npb25fc2V0KSAhPSBudWxsID8gcmVmMS51c2VyIDogdm9pZCAwKSkge1xuICAgIG9wdGlvbnMucGVybWlzc2lvbl9zZXQudXNlciA9IF8uY2xvbmUoc2VsZi5wZXJtaXNzaW9uX3NldFtcInVzZXJcIl0pO1xuICB9XG4gIF8uZWFjaChvcHRpb25zLnBlcm1pc3Npb25fc2V0LCBmdW5jdGlvbihpdGVtLCBpdGVtX25hbWUpIHtcbiAgICBpZiAoIXNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXSkge1xuICAgICAgc2VsZi5wZXJtaXNzaW9uX3NldFtpdGVtX25hbWVdID0ge307XG4gICAgfVxuICAgIHJldHVybiBzZWxmLnBlcm1pc3Npb25fc2V0W2l0ZW1fbmFtZV0gPSBfLmV4dGVuZChfLmNsb25lKHNlbGYucGVybWlzc2lvbl9zZXRbaXRlbV9uYW1lXSksIGl0ZW0pO1xuICB9KTtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIHBlcm1pc3Npb25zID0gb3B0aW9ucy5wZXJtaXNzaW9ucztcbiAgICBkaXNhYmxlZF9saXN0X3ZpZXdzID0gcGVybWlzc2lvbnMgIT0gbnVsbCA/IHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MgOiB2b2lkIDA7XG4gICAgaWYgKGRpc2FibGVkX2xpc3Rfdmlld3MgIT0gbnVsbCA/IGRpc2FibGVkX2xpc3Rfdmlld3MubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0TGlzdFZpZXdJZCA9IChyZWYyID0gb3B0aW9ucy5saXN0X3ZpZXdzKSAhPSBudWxsID8gKHJlZjMgPSByZWYyLmFsbCkgIT0gbnVsbCA/IHJlZjMuX2lkIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgaWYgKGRlZmF1bHRMaXN0Vmlld0lkKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MgPSBfLm1hcChkaXNhYmxlZF9saXN0X3ZpZXdzLCBmdW5jdGlvbihsaXN0X3ZpZXdfaXRlbSkge1xuICAgICAgICAgIGlmIChkZWZhdWx0TGlzdFZpZXdJZCA9PT0gbGlzdF92aWV3X2l0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBcImFsbFwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdF92aWV3X2l0ZW07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZi5wZXJtaXNzaW9ucyA9IG5ldyBSZWFjdGl2ZVZhcihwZXJtaXNzaW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5wZXJtaXNzaW9ucyA9IG51bGw7XG4gIH1cbiAgX2RiID0gQ3JlYXRvci5jcmVhdGVDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICBDcmVhdG9yLkNvbGxlY3Rpb25zW19kYi5fbmFtZV0gPSBfZGI7XG4gIHNlbGYuZGIgPSBfZGI7XG4gIHNlbGYuX2NvbGxlY3Rpb25fbmFtZSA9IF9kYi5fbmFtZTtcbiAgc2NoZW1hID0gQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEoc2VsZik7XG4gIHNlbGYuc2NoZW1hID0gbmV3IFNpbXBsZVNjaGVtYShzY2hlbWEpO1xuICBpZiAoc2VsZi5uYW1lICE9PSBcInVzZXJzXCIgJiYgc2VsZi5uYW1lICE9PSBcImNmcy5maWxlcy5maWxlcmVjb3JkXCIgJiYgIXNlbGYuaXNfdmlldyAmJiAhXy5jb250YWlucyhbXCJmbG93c1wiLCBcImZvcm1zXCIsIFwiaW5zdGFuY2VzXCIsIFwib3JnYW5pemF0aW9uc1wiLCBcImFjdGlvbl9maWVsZF91cGRhdGVzXCIsIFwib2JqZWN0X2xpc3R2aWV3c1wiXSwgc2VsZi5uYW1lKSkge1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIF9kYi5hdHRhY2hTY2hlbWEoc2VsZi5zY2hlbWEsIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9kYi5hdHRhY2hTY2hlbWEoc2VsZi5zY2hlbWEsIHtcbiAgICAgICAgcmVwbGFjZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChzZWxmLm5hbWUgPT09IFwidXNlcnNcIikge1xuICAgIF9kYi5fc2ltcGxlU2NoZW1hID0gc2VsZi5zY2hlbWE7XG4gIH1cbiAgaWYgKF8uY29udGFpbnMoW1wiZmxvd3NcIiwgXCJmb3Jtc1wiLCBcImluc3RhbmNlc1wiLCBcIm9yZ2FuaXphdGlvbnNcIl0sIHNlbGYubmFtZSkpIHtcbiAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBfZGIuYXR0YWNoU2NoZW1hKHNlbGYuc2NoZW1hLCB7XG4gICAgICAgIHJlcGxhY2U6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBDcmVhdG9yLm9iamVjdHNCeU5hbWVbc2VsZi5fY29sbGVjdGlvbl9uYW1lXSA9IHNlbGY7XG4gIHJldHVybiBzZWxmO1xufTtcblxuQ3JlYXRvci5nZXRPYmplY3RPRGF0YVJvdXRlclByZWZpeCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gXCIvYXBpL29kYXRhL3Y0XCI7XG59O1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgaWYgKCFDcmVhdG9yLmJvb3RzdHJhcExvYWRlZCAmJiBDcmVhdG9yLk9iamVjdHMpIHtcbiAgICByZXR1cm4gXy5lYWNoKENyZWF0b3IuT2JqZWN0cywgZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gbmV3IENyZWF0b3IuT2JqZWN0KG9iamVjdCk7XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiQ3JlYXRvci5nZXRTZWxlY3RPcHRpb25zID0gKGZpZWxkU2NoZW1hKSAtPlxuXHRvcHRpb25zID0gZmllbGRTY2hlbWEub3B0aW9uc1xuXHR1bmxlc3Mgb3B0aW9uc1xuXHRcdHJldHVyblxuXHRkYXRhX3R5cGUgPSBmaWVsZFNjaGVtYS5kYXRhX3R5cGVcblx0aWYgIV8uaXNGdW5jdGlvbihvcHRpb25zKSBhbmQgZGF0YV90eXBlIGFuZCBkYXRhX3R5cGUgIT0gJ3RleHQnXG5cdFx0IyDpm7bku6PnoIHnlYzpnaLphY3nva5vcHRpb25z6YCJ6aG55YC85Y+q5pSv5oyB5a2X56ym5Liy77yM5omA5Lul5b2TZGF0YV90eXBl5Li65pWw5YC85oiWYm9vbGVhbuaXtu+8jOWPquiDveW8uuihjOaKiumAiemhueWAvOWFiOi9rOaNouS4uuWvueW6lOeahOexu+Wei1xuXHRcdG9wdGlvbnMuZm9yRWFjaCAob3B0aW9uSXRlbSkgLT5cblx0XHRcdGlmIHR5cGVvZiBvcHRpb25JdGVtLnZhbHVlICE9ICdzdHJpbmcnXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0aWYgW1xuXHRcdFx0XHQnbnVtYmVyJ1xuXHRcdFx0XHQnY3VycmVuY3knXG5cdFx0XHRcdCdwZXJjZW50J1xuXHRcdFx0XS5pbmRleE9mKGRhdGFfdHlwZSkgPiAtMVxuXHRcdFx0XHRvcHRpb25JdGVtLnZhbHVlID0gTnVtYmVyKG9wdGlvbkl0ZW0udmFsdWUpXG5cdFx0XHRlbHNlIGlmIGRhdGFfdHlwZSA9PSAnYm9vbGVhbidcblx0XHRcdFx0IyDlj6rmnInkuLp0cnVl5omN5Li655yfXG5cdFx0XHRcdG9wdGlvbkl0ZW0udmFsdWUgPSBvcHRpb25JdGVtLnZhbHVlID09ICd0cnVlJ1xuXHRyZXR1cm4gb3B0aW9uc1xuXG5DcmVhdG9yLmdldE9iamVjdFNjaGVtYSA9IChvYmopIC0+XG5cdHVubGVzcyBvYmpcblx0XHRyZXR1cm5cblx0c2NoZW1hID0ge31cblxuXHRmaWVsZHNBcnIgPSBbXVxuXG5cdF8uZWFjaCBvYmouZmllbGRzICwgKGZpZWxkLCBmaWVsZF9uYW1lKS0+XG5cdFx0aWYgIV8uaGFzKGZpZWxkLCBcIm5hbWVcIilcblx0XHRcdGZpZWxkLm5hbWUgPSBmaWVsZF9uYW1lXG5cdFx0ZmllbGRzQXJyLnB1c2ggZmllbGRcblxuXHRfLmVhY2ggXy5zb3J0QnkoZmllbGRzQXJyLCBcInNvcnRfbm9cIiksIChmaWVsZCktPlxuXG5cdFx0ZmllbGRfbmFtZSA9IGZpZWxkLm5hbWVcblxuXHRcdGZzID0ge31cblx0XHRpZiBmaWVsZC5yZWdFeFxuXHRcdFx0ZnMucmVnRXggPSBmaWVsZC5yZWdFeFxuXHRcdGZzLmF1dG9mb3JtID0ge31cblx0XHRmcy5hdXRvZm9ybS5tdWx0aXBsZSA9IGZpZWxkLm11bHRpcGxlXG5cdFx0ZnMuYXV0b2Zvcm0ucmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvXG5cblx0XHRhdXRvZm9ybV90eXBlID0gZmllbGQuYXV0b2Zvcm0/LnR5cGVcblxuXHRcdGlmIGZpZWxkLnR5cGUgPT0gXCJ0ZXh0XCIgb3IgZmllbGQudHlwZSA9PSBcInBob25lXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGlmIGZpZWxkLm11bHRpcGxlXG5cdFx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJ0YWdzXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJbdGV4dF1cIiBvciBmaWVsZC50eXBlID09IFwiW3Bob25lXVwiXG5cdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInRhZ3NcIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnY29kZSdcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcIndpZGVhcmVhXCJcblx0XHRcdGZzLmF1dG9mb3JtLnJvd3MgPSBmaWVsZC5yb3dzIHx8IDEyXG5cdFx0XHRpZiBmaWVsZC5sYW5ndWFnZVxuXHRcdFx0XHRmcy5hdXRvZm9ybS5sYW5ndWFnZSA9IGZpZWxkLmxhbmd1YWdlXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwidGV4dGFyZWFcIlxuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwid2lkZWFyZWFcIlxuXHRcdFx0ZnMuYXV0b2Zvcm0ucm93cyA9IGZpZWxkLnJvd3MgfHwgMlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcInBhc3N3b3JkXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInBhc3N3b3JkXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJkYXRlXCJcblx0XHRcdGZzLnR5cGUgPSBEYXRlXG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNQYWQoKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNpT1MoKVxuXHRcdFx0XHRcdFx0IyBGaXggaW9zIDE0LCDmiYvmnLrlrqLmiLfnq6/lvoXlrqHmoLjmlofku7bml6XmnJ/mjqfku7bmmL7npLrmlYXpmpwgIzk5Me+8jGlvc+e7n+S4gOeUqFBD56uv5LiA5qC355qEanPmjqfku7Zcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiZHgtZGF0ZS1ib3hcIlxuXHRcdFx0XHRcdFx0XHR0aW1lem9uZUlkOiBcInV0Y1wiXG5cdFx0XHRcdFx0XHRcdGR4RGF0ZUJveE9wdGlvbnM6XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJkYXRlXCJcblx0XHRcdFx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGRcIlxuXHRcdFx0XHRcdFx0XHRcdHBpY2tlclR5cGU6IFwicm9sbGVyc1wiXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0IyDov5nph4znlKhhZkZpZWxkSW5wdXTogIzkuI3nm7TmjqXnlKhhdXRvZm9ybeeahOWOn+WboOaYr+W9k+Wtl+auteiiq2hpZGRlbueahOaXtuWAmeWOu+aJp+ihjGR4RGF0ZUJveE9wdGlvbnPlj4LmlbDkvJrmiqXplJlcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwic3RlZWRvcy1kYXRlLW1vYmlsZVwiXG5cdFx0XHRcdFx0XHRcdGRhdGVNb2JpbGVPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZVwiXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5vdXRGb3JtYXQgPSAneXl5eS1NTS1kZCc7XG5cdFx0XHRcdFx0IyDov5nph4znlKhhZkZpZWxkSW5wdXTogIzkuI3nm7TmjqXnlKhhdXRvZm9ybeeahOWOn+WboOaYr+W9k+Wtl+auteiiq2hpZGRlbueahOaXtuWAmeWOu+aJp+ihjGR4RGF0ZUJveE9wdGlvbnPlj4LmlbDkvJrmiqXplJlcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdFx0dHlwZTogXCJkeC1kYXRlLWJveFwiXG5cdFx0XHRcdFx0XHR0aW1lem9uZUlkOiBcInV0Y1wiXG5cdFx0XHRcdFx0XHRkeERhdGVCb3hPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRhdGVcIlxuXHRcdFx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGRcIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcInRpbWVcIlxuXHRcdFx0ZnMudHlwZSA9IERhdGVcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHQjIOi/memHjOeUqGFmRmllbGRJbnB1dOiAjOS4jeebtOaOpeeUqGF1dG9mb3Jt55qE5Y6f5Zug5piv5b2T5a2X5q616KKraGlkZGVu55qE5pe25YCZ5Y675omn6KGMZHhEYXRlQm94T3B0aW9uc+WPguaVsOS8muaKpemUmVxuXHRcdFx0XHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0XHRcdHR5cGU6IFwiZHgtZGF0ZS1ib3hcIlxuXHRcdFx0XHRcdHRpbWV6b25lSWQ6IFwidXRjXCJcblx0XHRcdFx0XHRkeERhdGVCb3hPcHRpb25zOlxuXHRcdFx0XHRcdFx0dHlwZTogXCJ0aW1lXCJcblx0XHRcdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiSEg6bW1cIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImRhdGV0aW1lXCJcblx0XHRcdGZzLnR5cGUgPSBEYXRlXG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0aWYgU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNQYWQoKVxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuaXNpT1MoKVxuXHRcdFx0XHRcdFx0IyBGaXggaW9zIDE0LCDmiYvmnLrlrqLmiLfnq6/lvoXlrqHmoLjmlofku7bml6XmnJ/mjqfku7bmmL7npLrmlYXpmpwgIzk5Me+8jGlvc+e7n+S4gOeUqFBD56uv5LiA5qC355qEanPmjqfku7Zcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiZHgtZGF0ZS1ib3hcIlxuXHRcdFx0XHRcdFx0XHRkeERhdGVCb3hPcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZXRpbWVcIlxuXHRcdFx0XHRcdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwieXl5eS1NTS1kZCBISDptbVwiXG5cdFx0XHRcdFx0XHRcdFx0cGlja2VyVHlwZTogXCJyb2xsZXJzXCJcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHQjIOi/memHjOeUqGFmRmllbGRJbnB1dOiAjOS4jeebtOaOpeeUqGF1dG9mb3Jt55qE5Y6f5Zug5piv5b2T5a2X5q616KKraGlkZGVu55qE5pe25YCZ5Y675omn6KGMZHhEYXRlQm94T3B0aW9uc+WPguaVsOS8muaKpemUmVxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID1cblx0XHRcdFx0XHRcdFx0dHlwZTogXCJzdGVlZG9zLWRhdGUtbW9iaWxlXCJcblx0XHRcdFx0XHRcdFx0ZGF0ZU1vYmlsZU9wdGlvbnM6XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJkYXRldGltZVwiXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHQjIOi/memHjOeUqGFmRmllbGRJbnB1dOiAjOS4jeebtOaOpeeUqGF1dG9mb3Jt55qE5Y6f5Zug5piv5b2T5a2X5q616KKraGlkZGVu55qE5pe25YCZ5Y675omn6KGMZHhEYXRlQm94T3B0aW9uc+WPguaVsOS8muaKpemUmVxuXHRcdFx0XHRcdGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9XG5cdFx0XHRcdFx0XHR0eXBlOiBcImR4LWRhdGUtYm94XCJcblx0XHRcdFx0XHRcdGR4RGF0ZUJveE9wdGlvbnM6XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGF0ZXRpbWVcIlxuXHRcdFx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGQgSEg6bW1cIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcIltPYmplY3RdXCJcblx0XHRcdGZzLnR5cGUgPSBbT2JqZWN0XVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImh0bWxcIlxuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnc3RlZWRvc0h0bWwnO1xuXHRcdFx0IyBpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdCMgXHRsb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSgpXG5cdFx0XHQjIFx0aWYgbG9jYWxlID09IFwiemgtY25cIiB8fCBsb2NhbGUgPT0gXCJ6aC1DTlwiXG5cdFx0XHQjIFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRcdCMgXHRlbHNlXG5cdFx0XHQjIFx0XHRsb2NhbGUgPSBcImVuLVVTXCJcblx0XHRcdCMgXHRmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPVxuXHRcdFx0IyBcdFx0dHlwZTogXCJzdW1tZXJub3RlXCJcblx0XHRcdCMgXHRcdGNsYXNzOiAnc3VtbWVybm90ZS1lZGl0b3InXG5cdFx0XHQjIFx0XHRzZXR0aW5nczpcblx0XHRcdCMgXHRcdFx0aGVpZ2h0OiAyMDBcblx0XHRcdCMgXHRcdFx0ZGlhbG9nc0luQm9keTogdHJ1ZVxuXHRcdFx0IyBcdFx0XHR0b29sYmFyOiAgW1xuXHRcdFx0IyBcdFx0XHRcdFsnZm9udDEnLCBbJ3N0eWxlJ11dLFxuXHRcdFx0IyBcdFx0XHRcdFsnZm9udDInLCBbJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2l0YWxpYycsICdjbGVhciddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ2ZvbnQzJywgWydmb250bmFtZSddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ2NvbG9yJywgWydjb2xvciddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ3BhcmEnLCBbJ3VsJywgJ29sJywgJ3BhcmFncmFwaCddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ3RhYmxlJywgWyd0YWJsZSddXSxcblx0XHRcdCMgXHRcdFx0XHRbJ2luc2VydCcsIFsnbGluaycsICdwaWN0dXJlJ11dLFxuXHRcdFx0IyBcdFx0XHRcdFsndmlldycsIFsnY29kZXZpZXcnXV1cblx0XHRcdCMgXHRcdFx0XVxuXHRcdFx0IyBcdFx0XHRmb250TmFtZXM6IFsnQXJpYWwnLCAnQ29taWMgU2FucyBNUycsICdDb3VyaWVyIE5ldycsICdIZWx2ZXRpY2EnLCAnSW1wYWN0JywgJ+Wui+S9kycsJ+m7keS9kycsJ+W+rui9r+mbhem7kScsJ+S7v+WuiycsJ+alt+S9kycsJ+matuS5picsJ+W5vOWchiddXG5cdFx0XHQjIFx0XHRcdGxhbmc6IGxvY2FsZVxuXG5cdFx0ZWxzZSBpZiAoZmllbGQudHlwZSA9PSBcImxvb2t1cFwiIG9yIGZpZWxkLnR5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCIpXG5cdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRmcy5hdXRvZm9ybS5zaG93SWNvbiA9IGZpZWxkLnNob3dJY29uXG5cdFx0XHRpZiBmaWVsZC5tdWx0aXBsZVxuXHRcdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblxuXHRcdFx0aWYgIWZpZWxkLmhpZGRlblxuXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmZpbHRlcnMgPSBmaWVsZC5maWx0ZXJzXG5cblx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGVwZW5kT24gPSBmaWVsZC5kZXBlbmRfb25cblxuXHRcdFx0XHRpZiBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb25cblx0XHRcdFx0XHRmcy5iZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb25cblxuXHRcdFx0XHRmcy5maWx0ZXJzRnVuY3Rpb24gPSBpZiBmaWVsZC5maWx0ZXJzRnVuY3Rpb24gdGhlbiBmaWVsZC5maWx0ZXJzRnVuY3Rpb24gZWxzZSBDcmVhdG9yLmV2YWx1YXRlRmlsdGVyc1xuXG5cdFx0XHRcdGlmIGZpZWxkLm9wdGlvbnNGdW5jdGlvblxuXHRcdFx0XHRcdGZzLm9wdGlvbnNGdW5jdGlvbiA9IGZpZWxkLm9wdGlvbnNGdW5jdGlvblxuXG5cdFx0XHRcdGlmIGZpZWxkLnJlZmVyZW5jZV90b1xuXG5cdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0XHRpZiBmaWVsZC5jcmVhdGVGdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oZmllbGQuY3JlYXRlRnVuY3Rpb24pXG5cdFx0XHRcdFx0XHRcdGZzLmNyZWF0ZUZ1bmN0aW9uID0gZmllbGQuY3JlYXRlRnVuY3Rpb25cblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0aWYgXy5pc1N0cmluZyhmaWVsZC5yZWZlcmVuY2VfdG8pXG5cdFx0XHRcdFx0XHRcdFx0X3JlZl9vYmogPSBDcmVhdG9yLk9iamVjdHNbZmllbGQucmVmZXJlbmNlX3RvXVxuXHRcdFx0XHRcdFx0XHRcdGlmIF9yZWZfb2JqPy5wZXJtaXNzaW9ucz8uYWxsb3dDcmVhdGVcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmNyZWF0ZSA9IHRydWVcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmNyZWF0ZUZ1bmN0aW9uID0gKGxvb2t1cF9maWVsZCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRNb2RhbC5zaG93KFwiQ3JlYXRvck9iamVjdE1vZGFsXCIsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uOiBcIkNyZWF0b3IuQ29sbGVjdGlvbnMuI3tDcmVhdG9yLmdldENvbGxlY3Rpb24oZmllbGQucmVmZXJlbmNlX3RvKS5fbmFtZX1cIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3JtSWQ6IFwibmV3I3tmaWVsZC5yZWZlcmVuY2VfdG8ucmVwbGFjZSgnLicsJ18nKX1cIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvYmplY3RfbmFtZTogXCIje2ZpZWxkLnJlZmVyZW5jZV90b31cIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvcGVyYXRpb246IFwiaW5zZXJ0XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25TdWNjZXNzOiAob3BlcmF0aW9uLCByZXN1bHQpLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KHJlc3VsdC5vYmplY3RfbmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIHJlc3VsdC5vYmplY3RfbmFtZSA9PSBcIm9iamVjdHNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsb29rdXBfZmllbGQuYWRkSXRlbXMoW3tsYWJlbDogcmVzdWx0LnZhbHVlLmxhYmVsLCB2YWx1ZTogcmVzdWx0LnZhbHVlLm5hbWUsIGljb246IHJlc3VsdC52YWx1ZS5pY29ufV0sIHJlc3VsdC52YWx1ZS5uYW1lKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsb29rdXBfZmllbGQuYWRkSXRlbXMoW3tsYWJlbDogcmVzdWx0LnZhbHVlW29iamVjdC5OQU1FX0ZJRUxEX0tFWV0gfHwgcmVzdWx0LnZhbHVlLmxhYmVsIHx8IHJlc3VsdC52YWx1ZS5uYW1lLCB2YWx1ZTogcmVzdWx0Ll9pZH1dLCByZXN1bHQuX2lkKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmNyZWF0ZSA9IGZhbHNlXG5cblx0XHRcdFx0XHRpZiBfLmlzQm9vbGVhbihmaWVsZC5jcmVhdGUpXG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5jcmVhdGUgPSBmaWVsZC5jcmVhdGVcblxuXHRcdFx0XHRcdGlmIGZpZWxkLnJlZmVyZW5jZV9zb3J0XG5cdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zU29ydCA9IGZpZWxkLnJlZmVyZW5jZV9zb3J0XG5cblx0XHRcdFx0XHRpZiBmaWVsZC5yZWZlcmVuY2VfbGltaXRcblx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLm9wdGlvbnNMaW1pdCA9IGZpZWxkLnJlZmVyZW5jZV9saW1pdFxuXHRcdFx0XHRcdGlmIGZpZWxkLnJlZmVyZW5jZV90b19maWVsZFxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ucmVmZXJlbmNlVG9GaWVsZCA9IGZpZWxkLnJlZmVyZW5jZV90b19maWVsZFxuXG5cdFx0XHRcdFx0aWYgZmllbGQucmVmZXJlbmNlX3RvID09IFwidXNlcnNcIlxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0dXNlclwiXG5cdFx0XHRcdFx0XHRpZiAhZmllbGQuaGlkZGVuICYmICFmaWVsZC5vbWl0XG5cdFx0XHRcdFx0XHRcdCMgaXNfY29tcGFueV9saW1pdGVk6KGo56S66L+H5ruk5pWw5o2u5pe25piv5ZCm5Y+q5pi+56S65pys5YiG6YOo5LiL55qE5pWw5o2uXG5cdFx0XHRcdFx0XHRcdCMgaXNfY29tcGFueV9saW1pdGVk5Y+v5Lul6KKr5pS55YaZ6KaG55uW5oiQdHJ1ZS9mYWxzZeaIluWFtuS7lmZ1bmN0aW9uXG5cdFx0XHRcdFx0XHRcdGlmIGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCA9PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0XHQjIOacquWumuS5iWlzX2NvbXBhbnlfbGltaXRlZOWxnuaAp+aXtum7mOiupOWkhOeQhumAu+i+ke+8mlxuXHRcdFx0XHRcdFx0XHRcdCMg5a+55b2T5YmN5a+56LGh5pyJdmlld0FsbFJlY29yZHPmnYPpmZDliJnkuI3pmZDliLbmiYDlsZ7liIbpg6jliJfooajmn6XnnIvmnYPpmZDvvIzlkKbliJnlj6rmmL7npLrlvZPliY3miYDlsZ7liIbpg6hcblx0XHRcdFx0XHRcdFx0XHQjIOazqOaEj+S4jeaYr3JlZmVyZW5jZV90b+WvueixoeeahHZpZXdBbGxSZWNvcmRz5p2D6ZmQ77yM6ICM5piv5b2T5YmN5a+56LGh55qEXG5cdFx0XHRcdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9iai5wZXJtaXNzaW9uc1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucz8udmlld0FsbFJlY29yZHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmIF8uaW5jbHVkZShbXCJvcmdhbml6YXRpb25zXCIsIFwidXNlcnNcIiwgXCJzcGFjZV91c2Vyc1wiXSwgb2JqLm5hbWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCMg5aaC5p6c5a2X5q615omA5bGe5a+56LGh5piv55So5oi35oiW57uE57uH77yM5YiZ5piv5ZCm6ZmQ5Yi25pi+56S65omA5bGe5YiG6YOo6YOo6Zeo5LiObW9kaWZ5QWxsUmVjb3Jkc+adg+mZkOWFs+iBlFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpc1VuTGltaXRlZCA9IHBlcm1pc3Npb25zPy5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBpc1VuTGltaXRlZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmYWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSB0cnVlXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgXy5pc0Z1bmN0aW9uIGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdFx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0IyDkvKDlhaXlvZPliY3lr7nosaHnmoTmnYPpmZDvvIzlnKjlh73mlbDkuK3moLnmja7mnYPpmZDorqHnrpfmmK/lkKbopoHpmZDliLblj6rmn6XnnIvmnKzliIbpg6hcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZChvYmoucGVybWlzc2lvbnMpXG5cdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0IyDmnI3liqHnq6/nlKjkuI3liLBpc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWVcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWRcblx0XHRcdFx0XHRlbHNlIGlmIGZpZWxkLnJlZmVyZW5jZV90byA9PSBcIm9yZ2FuaXphdGlvbnNcIlxuXHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0b3JnXCJcblx0XHRcdFx0XHRcdGlmICFmaWVsZC5oaWRkZW4gJiYgIWZpZWxkLm9taXRcblx0XHRcdFx0XHRcdFx0IyBpc19jb21wYW55X2xpbWl0ZWTooajnpLrov4fmu6TmlbDmja7ml7bmmK/lkKblj6rmmL7npLrmnKzliIbpg6jkuIvnmoTmlbDmja5cblx0XHRcdFx0XHRcdFx0IyBpc19jb21wYW55X2xpbWl0ZWTlj6/ku6XooqvmlLnlhpnopobnm5bmiJB0cnVlL2ZhbHNl5oiW5YW25LuWZnVuY3Rpb25cblx0XHRcdFx0XHRcdFx0aWYgZmllbGQuaXNfY29tcGFueV9saW1pdGVkID09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHRcdCMg5pyq5a6a5LmJaXNfY29tcGFueV9saW1pdGVk5bGe5oCn5pe26buY6K6k5aSE55CG6YC76L6R77yaXG5cdFx0XHRcdFx0XHRcdFx0IyDlr7nlvZPliY3lr7nosaHmnIl2aWV3QWxsUmVjb3Jkc+adg+mZkOWImeS4jemZkOWItuaJgOWxnuWIhumDqOWIl+ihqOafpeeci+adg+mZkO+8jOWQpuWImeWPquaYvuekuuW9k+WJjeaJgOWxnuWIhumDqFxuXHRcdFx0XHRcdFx0XHRcdCMg5rOo5oSP5LiN5pivcmVmZXJlbmNlX3Rv5a+56LGh55qEdmlld0FsbFJlY29yZHPmnYPpmZDvvIzogIzmmK/lvZPliY3lr7nosaHnmoRcblx0XHRcdFx0XHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRcdFx0XHRcdHBlcm1pc3Npb25zID0gb2JqLnBlcm1pc3Npb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRpc1VuTGltaXRlZCA9IHBlcm1pc3Npb25zPy52aWV3QWxsUmVjb3Jkc1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgXy5pbmNsdWRlKFtcIm9yZ2FuaXphdGlvbnNcIiwgXCJ1c2Vyc1wiLCBcInNwYWNlX3VzZXJzXCJdLCBvYmoubmFtZSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0IyDlpoLmnpzlrZfmrrXmiYDlsZ7lr7nosaHmmK/nlKjmiLfmiJbnu4Tnu4fvvIzliJnmmK/lkKbpmZDliLbmmL7npLrmiYDlsZ7liIbpg6jpg6jpl6jkuI5tb2RpZnlBbGxSZWNvcmRz5p2D6ZmQ5YWz6IGUXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzVW5MaW1pdGVkID0gcGVybWlzc2lvbnM/Lm1vZGlmeUFsbFJlY29yZHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmIGlzVW5MaW1pdGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWVcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBfLmlzRnVuY3Rpb24gZmllbGQuaXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdFx0XHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdFx0XHRcdFx0XHQjIOS8oOWFpeW9k+WJjeWvueixoeeahOadg+mZkO+8jOWcqOWHveaVsOS4reagueaNruadg+mZkOiuoeeul+aYr+WQpuimgemZkOWItuWPquafpeeci+acrOWIhumDqFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkKG9iai5wZXJtaXNzaW9ucylcblx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHQjIOacjeWKoeerr+eUqOS4jeWIsGlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gdHJ1ZVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZFxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIHR5cGVvZihmaWVsZC5yZWZlcmVuY2VfdG8pID09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHRcdFx0XHRfcmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvKClcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0X3JlZmVyZW5jZV90byA9IGZpZWxkLnJlZmVyZW5jZV90b1xuXG5cdFx0XHRcdFx0XHRpZiBfLmlzQXJyYXkoX3JlZmVyZW5jZV90bylcblx0XHRcdFx0XHRcdFx0ZnMudHlwZSA9IE9iamVjdFxuXHRcdFx0XHRcdFx0XHRmcy5ibGFja2JveCA9IHRydWVcblx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ub2JqZWN0U3dpdGNoZSA9IHRydWVcblxuXHRcdFx0XHRcdFx0XHRzY2hlbWFbZmllbGRfbmFtZSArIFwiLm9cIl0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdFx0XHRcdFx0YXV0b2Zvcm06IHtvbWl0OiB0cnVlfVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0c2NoZW1hW2ZpZWxkX25hbWUgKyBcIi5pZHNcIl0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogW1N0cmluZ11cblx0XHRcdFx0XHRcdFx0XHRhdXRvZm9ybToge29taXQ6IHRydWV9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRfcmVmZXJlbmNlX3RvID0gW19yZWZlcmVuY2VfdG9dXG5cblx0XHRcdFx0XHRcdF9vYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbX3JlZmVyZW5jZV90b1swXV1cblx0XHRcdFx0XHRcdGlmIF9vYmplY3QgYW5kIF9vYmplY3QuZW5hYmxlX3RyZWVcblx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0VHJlZVwiXG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCJcblx0XHRcdFx0XHRcdFx0ZnMuYXV0b2Zvcm0ub3B0aW9uc01ldGhvZCA9IGZpZWxkLm9wdGlvbnNNZXRob2QgfHwgXCJjcmVhdG9yLm9iamVjdF9vcHRpb25zXCJcblxuXHRcdFx0XHRcdFx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zTWV0aG9kUGFyYW1zID0gKCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpfVxuXHRcdFx0XHRcdFx0XHRcdGZzLmF1dG9mb3JtLnJlZmVyZW5jZXMgPSBbXVxuXHRcdFx0XHRcdFx0XHRcdF9yZWZlcmVuY2VfdG8uZm9yRWFjaCAoX3JlZmVyZW5jZSktPlxuXHRcdFx0XHRcdFx0XHRcdFx0X29iamVjdCA9IENyZWF0b3IuT2JqZWN0c1tfcmVmZXJlbmNlXVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgX29iamVjdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5yZWZlcmVuY2VzLnB1c2gge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogX3JlZmVyZW5jZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfb2JqZWN0Py5sYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGljb246IF9vYmplY3Q/Lmljb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRsaW5rOiAoKS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCIvYXBwLyN7U2Vzc2lvbi5nZXQoJ2FwcF9pZCcpfS8je19yZWZlcmVuY2V9L3ZpZXcvXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcy5hdXRvZm9ybS5yZWZlcmVuY2VzLnB1c2gge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogX3JlZmVyZW5jZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxpbms6ICgpLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIi9hcHAvI3tTZXNzaW9uLmdldCgnYXBwX2lkJyl9LyN7X3JlZmVyZW5jZX0vdmlldy9cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCJcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5kZWZhdWx0SWNvbiA9IGZpZWxkLmRlZmF1bHRJY29uXG5cblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJzZWxlY3RcIlxuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCJcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uc2hvd0ljb24gPSBmYWxzZVxuXHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zID0gZmllbGQub3B0aW9uc1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzZWxlY3RcIlxuXHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zID0gZmllbGQub3B0aW9uc1xuXHRcdFx0XHRpZiBfLmhhcyhmaWVsZCwgJ2ZpcnN0T3B0aW9uJylcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5maXJzdE9wdGlvbiA9IGZpZWxkLmZpcnN0T3B0aW9uXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRmcy5hdXRvZm9ybS5maXJzdE9wdGlvbiA9IFwiXCJcblx0XHRcdCMg5Zug5Li65YiX6KGo6KeG5Zu+5Y+z5L6n6L+H5ruk5Zmo6L+Y5piv55So55qE6ICB6KGo5Y2V55qEbG9va3Vw5ZKMc2VsZWN05o6n5Lu277yM5omA5Lul5LiK6Z2i55qE5Luj56CB5aeL57uI5L+d5oyB5Y6f5qC36ZyA6KaB5omn6KGMXG5cdFx0XHQjIOS4i+mdouaYr+mFjee9ruS6hmRhdGFfdHlwZeaXtu+8jOmineWkluWkhOeQhueahOmAu+i+kVxuXHRcdFx0aWYgZmllbGQuZGF0YV90eXBlIGFuZCBmaWVsZC5kYXRhX3R5cGUgIT0gXCJ0ZXh0XCJcblx0XHRcdFx0aWYgW1wibnVtYmVyXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdLmluZGV4T2YoZmllbGQuZGF0YV90eXBlKSA+IC0xXG5cdFx0XHRcdFx0ZnNUeXBlID0gTnVtYmVyXG5cdFx0XHRcdFx0ZnMuZGVjaW1hbCA9IHRydWVcblx0XHRcdFx0ZWxzZSBpZiBmaWVsZC5kYXRhX3R5cGUgPT0gXCJib29sZWFuXCJcblx0XHRcdFx0XHRmc1R5cGUgPSBCb29sZWFuXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRmc1R5cGUgPSBTdHJpbmdcblx0XHRcdFx0ZnMudHlwZSA9IGZzVHlwZVxuXHRcdFx0XHRpZiBmaWVsZC5tdWx0aXBsZVxuXHRcdFx0XHRcdGZzLnR5cGUgPSBbZnNUeXBlXVxuXHRcdFx0XHRcdFxuXHRcdFx0XHRmcy5hdXRvZm9ybS5vcHRpb25zID0gQ3JlYXRvci5nZXRTZWxlY3RPcHRpb25zKGZpZWxkKVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImN1cnJlbmN5XCJcblx0XHRcdGZzLnR5cGUgPSBOdW1iZXJcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIlxuXHRcdFx0ZnMuYXV0b2Zvcm0ucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uIHx8IDE4XG5cdFx0XHRpZiBmaWVsZD8uc2NhbGVcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZVxuXHRcdFx0XHRmcy5kZWNpbWFsID0gdHJ1ZVxuXHRcdFx0ZWxzZSBpZiBmaWVsZD8uc2NhbGUgIT0gMFxuXHRcdFx0XHRmcy5hdXRvZm9ybS5zY2FsZSA9IDJcblx0XHRcdFx0ZnMuZGVjaW1hbCA9IHRydWVcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJudW1iZXJcIlxuXHRcdFx0ZnMudHlwZSA9IE51bWJlclxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc051bWJlclwiXG5cdFx0XHRmcy5hdXRvZm9ybS5wcmVjaXNpb24gPSBmaWVsZC5wcmVjaXNpb24gfHwgMThcblx0XHRcdGlmIGZpZWxkPy5zY2FsZVxuXHRcdFx0XHRmcy5hdXRvZm9ybS5zY2FsZSA9IGZpZWxkLnNjYWxlXG5cdFx0XHRcdGZzLmRlY2ltYWwgPSB0cnVlXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiYm9vbGVhblwiXG5cdFx0XHRmcy50eXBlID0gQm9vbGVhblxuXHRcdFx0aWYgZmllbGQucmVhZG9ubHlcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGlzYWJsZWQgPSB0cnVlXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zLWJvb2xlYW4tY2hlY2tib3hcIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcInRvZ2dsZVwiXG5cdFx0XHRmcy50eXBlID0gQm9vbGVhblxuXHRcdFx0aWYgZmllbGQucmVhZG9ubHlcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGlzYWJsZWQgPSB0cnVlXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zLWJvb2xlYW4tdG9nZ2xlXCJcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJyZWZlcmVuY2VcIlxuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImNoZWNrYm94XCJcblx0XHRcdGZzLnR5cGUgPSBbU3RyaW5nXVxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0LWNoZWNrYm94XCJcblx0XHRcdGZzLmF1dG9mb3JtLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiZmlsZVwiXG5cdFx0XHRjb2xsZWN0aW9uTmFtZSA9IGZpZWxkLmNvbGxlY3Rpb24gfHwgXCJmaWxlc1wiICMgY29sbGVjdGlvbiDpu5jorqTmmK8gJ2ZpbGVzJ1xuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdFx0YXV0b2Zvcm06XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmlsZVVwbG9hZCdcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25OYW1lXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gY29sbGVjdGlvbk5hbWVcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJmaWxlc2l6ZVwiXG5cdFx0XHRmcy50eXBlID0gTnVtYmVyXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVzaXplJ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcIk9iamVjdFwiIHx8IGZpZWxkLnR5cGUgPT0gXCJvYmplY3RcIlxuXHRcdFx0ZnMudHlwZSA9IE9iamVjdFxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImdyaWRcIiB8fCBmaWVsZC50eXBlID09IFwidGFibGVcIlxuXHRcdFx0ZnMudHlwZSA9IEFycmF5XG5cdFx0XHRmcy5hdXRvZm9ybS5lZGl0YWJsZSA9IHRydWVcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NHcmlkXCJcblxuXHRcdFx0c2NoZW1hW2ZpZWxkX25hbWUgKyBcIi4kXCJdID1cblx0XHRcdFx0dHlwZTogT2JqZWN0XG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwiaW1hZ2VcIlxuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdFx0YXV0b2Zvcm06XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmlsZVVwbG9hZCdcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb246ICdpbWFnZXMnXG5cdFx0XHRcdFx0XHRhY2NlcHQ6ICdpbWFnZS8qJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICdpbWFnZXMnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmFjY2VwdCA9ICdpbWFnZS8qJ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImF2YXRhclwiXG5cdFx0XHRpZiBmaWVsZC5tdWx0aXBsZVxuXHRcdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblx0XHRcdFx0c2NoZW1hW2ZpZWxkX25hbWUgKyBcIi4kXCJdID1cblx0XHRcdFx0XHRhdXRvZm9ybTpcblx0XHRcdFx0XHRcdHR5cGU6ICdmaWxlVXBsb2FkJ1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbjogJ2F2YXRhcnMnXG5cdFx0XHRcdFx0XHRhY2NlcHQ6ICdpbWFnZS8qJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICdhdmF0YXJzJ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS5hY2NlcHQgPSAnaW1hZ2UvKidcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gXCJhdWRpb1wiXG5cdFx0XHRpZiBmaWVsZC5tdWx0aXBsZVxuXHRcdFx0XHRmcy50eXBlID0gW1N0cmluZ11cblx0XHRcdFx0c2NoZW1hW2ZpZWxkX25hbWUgKyBcIi4kXCJdID1cblx0XHRcdFx0XHRhdXRvZm9ybTpcblx0XHRcdFx0XHRcdHR5cGU6ICdmaWxlVXBsb2FkJ1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbjogJ2F1ZGlvcydcblx0XHRcdFx0XHRcdGFjY2VwdDogJ2F1ZGlvLyonXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9ICdmaWxlVXBsb2FkJ1xuXHRcdFx0XHRmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gJ2F1ZGlvcydcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uYWNjZXB0ID0gJ2F1ZGlvLyonXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09IFwidmlkZW9cIlxuXHRcdFx0aWYgZmllbGQubXVsdGlwbGVcblx0XHRcdFx0ZnMudHlwZSA9IFtTdHJpbmddXG5cdFx0XHRcdHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9XG5cdFx0XHRcdFx0YXV0b2Zvcm06XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmlsZVVwbG9hZCdcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb246ICd2aWRlb3MnXG5cdFx0XHRcdFx0XHRhY2NlcHQ6ICd2aWRlby8qJ1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy50eXBlID0gU3RyaW5nXG5cdFx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCdcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uY29sbGVjdGlvbiA9ICd2aWRlb3MnXG5cdFx0XHRcdGZzLmF1dG9mb3JtLmFjY2VwdCA9ICd2aWRlby8qJ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImxvY2F0aW9uXCJcblx0XHRcdGZzLnR5cGUgPSBPYmplY3Rcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcImxvY2F0aW9uXCJcblx0XHRcdGZzLmF1dG9mb3JtLnN5c3RlbSA9IGZpZWxkLnN5c3RlbSB8fCBcIndnczg0XCJcblx0XHRcdGZzLmJsYWNrYm94ID0gdHJ1ZVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcIm1hcmtkb3duXCJcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInRleHRcIlxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAndXJsJ1xuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0IyBmcy5yZWdFeCA9IFNpbXBsZVNjaGVtYS5SZWdFeC5Vcmxcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnc3RlZWRvc1VybCdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2VtYWlsJ1xuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdFx0ZnMucmVnRXggPSBTaW1wbGVTY2hlbWEuUmVnRXguRW1haWxcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSAnc3RlZWRvc0VtYWlsJ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnYXV0b251bWJlcidcblx0XHRcdGZzLnR5cGUgPSBTdHJpbmdcblx0XHRlbHNlIGlmIGZpZWxkLnR5cGUgPT0gJ2NvbG9yJ1xuXHRcdFx0ZnMudHlwZSA9IFN0cmluZ1xuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAnZm9ybXVsYSdcblx0XHRcdGZzID0gQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEoe2ZpZWxkczoge2ZpZWxkOiBPYmplY3QuYXNzaWduKHt9LCBmaWVsZCwge3R5cGU6IGZpZWxkLmRhdGFfdHlwZX0pfX0pW2ZpZWxkLm5hbWVdXG5cdFx0ZWxzZSBpZiBmaWVsZC50eXBlID09ICdzdW1tYXJ5J1xuXHRcdFx0ZnMgPSBDcmVhdG9yLmdldE9iamVjdFNjaGVtYSh7ZmllbGRzOiB7ZmllbGQ6IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkLCB7dHlwZTogZmllbGQuZGF0YV90eXBlfSl9fSlbZmllbGQubmFtZV1cblx0XHQjIGVsc2UgaWYgZmllbGQudHlwZSA9PSAnc2VsZWN0J1xuXHRcdCMgXHRmcyA9IENyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hKHtmaWVsZHM6IHtmaWVsZDogT2JqZWN0LmFzc2lnbih7fSwgZmllbGQsIHt0eXBlOiBmaWVsZC5kYXRhX3R5cGV9KX19KVtmaWVsZC5uYW1lXVxuXHRcdGVsc2UgaWYgZmllbGQudHlwZSA9PSAncGVyY2VudCdcblx0XHRcdGZzLnR5cGUgPSBOdW1iZXJcblx0XHRcdGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIlxuXHRcdFx0ZnMuYXV0b2Zvcm0ucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uIHx8IDE4XG5cdFx0XHR1bmxlc3MgXy5pc051bWJlcihmaWVsZC5zY2FsZSlcblx0XHRcdFx0IyDmsqHphY3nva7lsI/mlbDkvY3mlbDliJnmjInlsI/mlbDkvY3mlbAw5p2l5aSE55CG77yM5Y2z6buY6K6k5pi+56S65Li65pW05pWw55qE55m+5YiG5q+U77yM5q+U5aaCMjAl77yM5q2k5pe25o6n5Lu25Y+v5Lul6L6T5YWlMuS9jeWwj+aVsO+8jOi9rOaIkOeZvuWIhuavlOWwseaYr+aVtOaVsFxuXHRcdFx0XHRmaWVsZC5zY2FsZSA9IDBcblx0XHRcdCMgYXV0b2Zvcm3mjqfku7bkuK3lsI/mlbDkvY3mlbDlp4vnu4jmr5TphY3nva7nmoTkvY3mlbDlpJoy5L2NXG5cdFx0XHRmcy5hdXRvZm9ybS5zY2FsZSA9IGZpZWxkLnNjYWxlICsgMlxuXHRcdFx0ZnMuZGVjaW1hbCA9IHRydWVcblx0XHRlbHNlXG5cdFx0XHRmcy50eXBlID0gZmllbGQudHlwZVxuXG5cdFx0aWYgZmllbGQubGFiZWxcblx0XHRcdGZzLmxhYmVsID0gZmllbGQubGFiZWxcblxuI1x0XHRpZiBmaWVsZC5hbGxvd2VkVmFsdWVzXG4jXHRcdFx0ZnMuYWxsb3dlZFZhbHVlcyA9IGZpZWxkLmFsbG93ZWRWYWx1ZXNcblxuXHRcdGlmICFmaWVsZC5yZXF1aXJlZFxuXHRcdFx0ZnMub3B0aW9uYWwgPSB0cnVlXG5cblx0XHQjIFvnrb7nuqblr7nosaHlkIzml7bphY3nva7kuoZjb21wYW55X2lkc+W/heWhq+WPinVuZWRpdGFibGVfZmllbGRz6YCg5oiQ6YOo5YiG55So5oi35paw5bu6562+57qm5a+56LGh5pe25oql6ZSZICMxOTJdKGh0dHBzOi8vZ2l0aHViLmNvbS9zdGVlZG9zL3N0ZWVkb3MtcHJvamVjdC1kenVnL2lzc3Vlcy8xOTIpXG5cdFx0IyDlkI7lj7Dlp4vnu4jorr7nva5yZXF1aXJlZOS4umZhbHNlXG5cdFx0aWYgIU1ldGVvci5pc0NsaWVudFxuXHRcdFx0ZnMub3B0aW9uYWwgPSB0cnVlXG5cblx0XHRpZiBmaWVsZC51bmlxdWVcblx0XHRcdGZzLnVuaXF1ZSA9IHRydWVcblxuXHRcdGlmIGZpZWxkLm9taXRcblx0XHRcdGZzLmF1dG9mb3JtLm9taXQgPSB0cnVlXG5cblx0XHRpZiBmaWVsZC5ncm91cFxuXHRcdFx0ZnMuYXV0b2Zvcm0uZ3JvdXAgPSBmaWVsZC5ncm91cFxuXG5cdFx0aWYgZmllbGQuaXNfd2lkZVxuXHRcdFx0ZnMuYXV0b2Zvcm0uaXNfd2lkZSA9IHRydWVcblxuXHRcdGlmIGZpZWxkLmhpZGRlblxuXHRcdFx0ZnMuYXV0b2Zvcm0udHlwZSA9IFwiaGlkZGVuXCJcblxuXHRcdGlmIChmaWVsZC50eXBlID09IFwic2VsZWN0XCIpIG9yIChmaWVsZC50eXBlID09IFwibG9va3VwXCIpIG9yIChmaWVsZC50eXBlID09IFwibWFzdGVyX2RldGFpbFwiKVxuXHRcdFx0aWYgdHlwZW9mKGZpZWxkLmZpbHRlcmFibGUpID09ICd1bmRlZmluZWQnXG5cdFx0XHRcdGZpZWxkLmZpbHRlcmFibGUgPSB0cnVlXG5cdFx0aWYgZmllbGQubmFtZSA9PSAnbmFtZScgfHwgZmllbGQuaXNfbmFtZVxuXHRcdFx0aWYgdHlwZW9mKGZpZWxkLnNlYXJjaGFibGUpID09ICd1bmRlZmluZWQnXG5cdFx0XHRcdGZpZWxkLnNlYXJjaGFibGUgPSB0cnVlXG5cblx0XHRpZiBhdXRvZm9ybV90eXBlXG5cdFx0XHRmcy5hdXRvZm9ybS50eXBlID0gYXV0b2Zvcm1fdHlwZVxuXG5cdFx0aWYgZmllbGQuZGVmYXVsdFZhbHVlXG5cdFx0XHRpZiBNZXRlb3IuaXNDbGllbnQgYW5kIENyZWF0b3IuRm9ybXVsYXIuY2hlY2tGb3JtdWxhKGZpZWxkLmRlZmF1bHRWYWx1ZSlcblx0XHRcdFx0ZnMuYXV0b2Zvcm0uZGVmYXVsdFZhbHVlID0gKCktPlxuXHRcdFx0XHRcdHJldHVybiBDcmVhdG9yLkZvcm11bGFyLnJ1bihmaWVsZC5kZWZhdWx0VmFsdWUsIHt1c2VySWQ6IE1ldGVvci51c2VySWQoKSwgc3BhY2VJZDogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLCBub3c6IG5ldyBEYXRlKCl9KVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmcy5hdXRvZm9ybS5kZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWVcblx0XHRcdCMgXHRpZiAhXy5pc0Z1bmN0aW9uKGZpZWxkLmRlZmF1bHRWYWx1ZSlcblx0XHRcdCMgXHRcdGZzLmRlZmF1bHRWYWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZVxuXG5cdFx0aWYgZmllbGQucmVhZG9ubHlcblx0XHRcdGZzLmF1dG9mb3JtLnJlYWRvbmx5ID0gdHJ1ZVxuXG5cdFx0aWYgZmllbGQuZGlzYWJsZWRcblx0XHRcdGZzLmF1dG9mb3JtLmRpc2FibGVkID0gdHJ1ZVxuXG5cdFx0aWYgZmllbGQuaW5saW5lSGVscFRleHRcblx0XHRcdGZzLmF1dG9mb3JtLmlubGluZUhlbHBUZXh0ID0gZmllbGQuaW5saW5lSGVscFRleHRcblxuXHRcdGlmIGZpZWxkLmJsYWNrYm94XG5cdFx0XHRmcy5ibGFja2JveCA9IHRydWVcblxuXHRcdGlmIF8uaGFzKGZpZWxkLCAnbWluJylcblx0XHRcdGZzLm1pbiA9IGZpZWxkLm1pblxuXHRcdGlmIF8uaGFzKGZpZWxkLCAnbWF4Jylcblx0XHRcdGZzLm1heCA9IGZpZWxkLm1heFxuXG5cdFx0IyDlj6rmnInnlJ/kuqfnjq/looPmiY3ph43lu7rntKLlvJVcblx0XHRpZiBNZXRlb3IuaXNQcm9kdWN0aW9uXG5cdFx0XHRpZiBmaWVsZC5pbmRleFxuXHRcdFx0XHRmcy5pbmRleCA9IGZpZWxkLmluZGV4XG5cdFx0XHRlbHNlIGlmIGZpZWxkLnNvcnRhYmxlXG5cdFx0XHRcdGZzLmluZGV4ID0gdHJ1ZVxuXG5cdFx0c2NoZW1hW2ZpZWxkX25hbWVdID0gZnNcblxuXHRyZXR1cm4gc2NoZW1hXG5cblxuQ3JlYXRvci5nZXRGaWVsZERpc3BsYXlWYWx1ZSA9IChvYmplY3RfbmFtZSwgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUpLT5cblx0aHRtbCA9IGZpZWxkX3ZhbHVlXG5cdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRpZiAhb2JqZWN0XG5cdFx0cmV0dXJuIFwiXCJcblx0ZmllbGQgPSBvYmplY3QuZmllbGRzKGZpZWxkX25hbWUpXG5cdGlmICFmaWVsZFxuXHRcdHJldHVybiBcIlwiXG5cblx0aWYgZmllbGQudHlwZSA9PSBcImRhdGV0aW1lXCJcblx0XHRodG1sID0gbW9tZW50KHRoaXMudmFsKS5mb3JtYXQoJ1lZWVktTU0tREQgSDptbScpXG5cdGVsc2UgaWYgZmllbGQudHlwZSA9PSBcImRhdGVcIlxuXHRcdGh0bWwgPSBtb21lbnQodGhpcy52YWwpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cblx0cmV0dXJuIGh0bWxcblxuQ3JlYXRvci5jaGVja0ZpZWxkVHlwZVN1cHBvcnRCZXR3ZWVuUXVlcnkgPSAoZmllbGRfdHlwZSktPlxuXHRyZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZVwiLCBcImN1cnJlbmN5XCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKGZpZWxkX3R5cGUpXG5cbkNyZWF0b3IucHVzaEJldHdlZW5CdWlsdGluT3B0aW9uYWxzID0gKGZpZWxkX3R5cGUsIG9wZXJhdGlvbnMpLT5cblx0YnVpbHRpblZhbHVlcyA9IENyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5WYWx1ZXMoZmllbGRfdHlwZSlcblx0aWYgYnVpbHRpblZhbHVlc1xuXHRcdF8uZm9yRWFjaCBidWlsdGluVmFsdWVzLCAoYnVpbHRpbkl0ZW0sIGtleSktPlxuXHRcdFx0b3BlcmF0aW9ucy5wdXNoKHtsYWJlbDogYnVpbHRpbkl0ZW0ubGFiZWwsIHZhbHVlOiBrZXl9KVxuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVzID0gKGZpZWxkX3R5cGUsIGlzX2NoZWNrX29ubHkpLT5cblx0IyDov4fmu6TlmajlrZfmrrXnsbvlnovlr7nlupTnmoTlhoXnva7pgInpoblcblx0aWYgW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCJdLmluY2x1ZGVzKGZpZWxkX3R5cGUpXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVzKGlzX2NoZWNrX29ubHksIGZpZWxkX3R5cGUpXG5cbkNyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5WYWx1ZUl0ZW0gPSAoZmllbGRfdHlwZSwga2V5KS0+XG5cdCMg6L+H5ruk5Zmo5a2X5q6157G75Z6L5a+55bqU55qE5YaF572u6YCJ6aG5XG5cdGlmIFtcImRhdGVcIiwgXCJkYXRldGltZVwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKVxuXHRcdHJldHVybiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBrZXkpXG5cbkNyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5PcGVyYXRpb24gPSAoZmllbGRfdHlwZSwgdmFsdWUpLT5cblx0IyDmoLnmja7ov4fmu6TlmajnmoTov4fmu6TlgLzvvIzojrflj5blr7nlupTnmoTlhoXnva7ov5DnrpfnrKZcblx0IyDmr5TlpoJ2YWx1ZeS4umxhc3RfeWVhcu+8jOi/lOWbnmJldHdlZW5fdGltZV9sYXN0X3llYXJcblx0dW5sZXNzIF8uaXNTdHJpbmcodmFsdWUpXG5cdFx0cmV0dXJuXG5cdGJldHdlZW5CdWlsdGluVmFsdWVzID0gQ3JlYXRvci5nZXRCZXR3ZWVuQnVpbHRpblZhbHVlcyhmaWVsZF90eXBlKVxuXHR1bmxlc3MgYmV0d2VlbkJ1aWx0aW5WYWx1ZXNcblx0XHRyZXR1cm5cblx0cmVzdWx0ID0gbnVsbFxuXHRfLmVhY2ggYmV0d2VlbkJ1aWx0aW5WYWx1ZXMsIChpdGVtLCBvcGVyYXRpb24pLT5cblx0XHRpZiBpdGVtLmtleSA9PSB2YWx1ZVxuXHRcdFx0cmVzdWx0ID0gb3BlcmF0aW9uXG5cdHJldHVybiByZXN1bHRcblxuIyDlpoLmnpzlj6rmmK/kuLrliKTmlq1vcGVyYXRpb27mmK/lkKblrZjlnKjvvIzliJnmsqHlv4XopoHorqHnrpd2YWx1ZXPvvIzkvKDlhaVpc19jaGVja19vbmx55Li6dHJ1ZeWNs+WPr1xuQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXMgPSAoaXNfY2hlY2tfb25seSwgZmllbGRfdHlwZSktPlxuXHQjIOi/h+a7pOWZqOaXtumXtOWtl+auteexu+Wei+WvueW6lOeahOWGhee9rumAiemhuVxuXHRyZXR1cm4ge1xuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfeWVhclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF95ZWFyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RoaXNfeWVhclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc195ZWFyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfeWVhclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF95ZWFyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfcXVhcnRlclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF9xdWFydGVyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RoaXNfcXVhcnRlclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc19xdWFydGVyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfcXVhcnRlclwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF9xdWFydGVyXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3RfbW9udGhcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfbW9udGhcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfdGhpc19tb250aFwiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc19tb250aFwiKSxcblx0XHRcImJldHdlZW5fdGltZV9uZXh0X21vbnRoXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0X21vbnRoXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX2xhc3Rfd2Vla1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF93ZWVrXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RoaXNfd2Vla1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidGhpc193ZWVrXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX25leHRfd2Vla1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF93ZWVrXCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3llc3RkYXlcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInllc3RkYXlcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfdG9kYXlcIjogaWYgaXNfY2hlY2tfb25seSB0aGVuIHRydWUgZWxzZSBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRvZGF5XCIpLFxuXHRcdFwiYmV0d2Vlbl90aW1lX3RvbW9ycm93XCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0b21vcnJvd1wiKSxcblx0XHRcImJldHdlZW5fdGltZV9sYXN0XzdfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF83X2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbGFzdF8zMF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzMwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbGFzdF82MF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzYwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbGFzdF85MF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzkwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbGFzdF8xMjBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF8xMjBfZGF5c1wiKSxcblx0XHRcImJldHdlZW5fdGltZV9uZXh0XzdfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF83X2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF8zMF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzMwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF82MF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzYwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF85MF9kYXlzXCI6IGlmIGlzX2NoZWNrX29ubHkgdGhlbiB0cnVlIGVsc2UgQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzkwX2RheXNcIiksXG5cdFx0XCJiZXR3ZWVuX3RpbWVfbmV4dF8xMjBfZGF5c1wiOiBpZiBpc19jaGVja19vbmx5IHRoZW4gdHJ1ZSBlbHNlIENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibmV4dF8xMjBfZGF5c1wiKVxuXHR9XG5cbkNyZWF0b3IuZ2V0UXVhcnRlclN0YXJ0TW9udGggPSAobW9udGgpLT5cblx0aWYgIW1vbnRoXG5cdFx0bW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKClcblx0XG5cdGlmIG1vbnRoIDwgM1xuXHRcdHJldHVybiAwXG5cdGVsc2UgaWYgbW9udGggPCA2XG5cdFx0cmV0dXJuIDNcblx0ZWxzZSBpZiBtb250aCA8IDlcblx0XHRyZXR1cm4gNlxuXHRcblx0cmV0dXJuIDlcblxuXG5DcmVhdG9yLmdldExhc3RRdWFydGVyRmlyc3REYXkgPSAoeWVhcixtb250aCktPlxuXHRpZiAheWVhclxuXHRcdHllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKClcblx0aWYgIW1vbnRoXG5cdFx0bW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKClcblx0XG5cdGlmIG1vbnRoIDwgM1xuXHRcdHllYXItLVxuXHRcdG1vbnRoID0gOVxuXHRlbHNlIGlmIG1vbnRoIDwgNlxuXHRcdG1vbnRoID0gMFxuXHRlbHNlIGlmIG1vbnRoIDwgOVxuXHRcdG1vbnRoID0gM1xuXHRlbHNlIFxuXHRcdG1vbnRoID0gNlxuXHRcblx0cmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuXHRcblxuQ3JlYXRvci5nZXROZXh0UXVhcnRlckZpcnN0RGF5ID0gKHllYXIsbW9udGgpLT5cblx0aWYgIXllYXJcblx0XHR5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpXG5cdGlmICFtb250aFxuXHRcdG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpXG5cdFxuXHRpZiBtb250aCA8IDNcblx0XHRtb250aCA9IDNcblx0ZWxzZSBpZiBtb250aCA8IDZcblx0XHRtb250aCA9IDZcblx0ZWxzZSBpZiBtb250aCA8IDlcblx0XHRtb250aCA9IDlcblx0ZWxzZVxuXHRcdHllYXIrK1xuXHRcdG1vbnRoID0gMFxuXHRcblx0cmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuXG5DcmVhdG9yLmdldE1vbnRoRGF5cyA9ICh5ZWFyLG1vbnRoKS0+XG5cdGlmIG1vbnRoID09IDExXG5cdFx0cmV0dXJuIDMxXG5cdFxuXHRtaWxsaXNlY29uZCA9IDEwMDAgKiA2MCAqIDYwICogMjRcblx0c3RhcnREYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG5cdGVuZERhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCsxLCAxKVxuXHRkYXlzID0gKGVuZERhdGUtc3RhcnREYXRlKS9taWxsaXNlY29uZFxuXHRyZXR1cm4gZGF5c1xuXG5DcmVhdG9yLmdldExhc3RNb250aEZpcnN0RGF5ID0gKHllYXIsIG1vbnRoKS0+XG5cdGlmICF5ZWFyXG5cdFx0eWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKVxuXHRpZiAhbW9udGhcblx0XHRtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKVxuXHRcblx0IyDmnIjku73kuLow5Luj6KGo5pys5bm055qE56ys5LiA5pyIXG5cdGlmIG1vbnRoID09IDBcblx0XHRtb250aCA9IDExXG5cdFx0eWVhci0tXG5cdFx0cmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKVxuXHRcblx0IyDlkKbliJks5Y+q5YeP5Y675pyI5Lu9XG5cdG1vbnRoLS07XG5cdHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcblx0XG5DcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbSA9IChmaWVsZF90eXBlLCBrZXkpLT5cblx0IyDov4fmu6TlmahiZXR3ZWVu6L+Q566X56ym77yM546w566X5pel5pyfL+aXpeacn+aXtumXtOexu+Wei+Wtl+auteeahHZhbHVlc+WAvFxuXHRub3cgPSBuZXcgRGF0ZSgpXG5cdCMg5LiA5aSp55qE5q+r56eS5pWwXG5cdG1pbGxpc2Vjb25kID0gMTAwMCAqIDYwICogNjAgKiAyNFxuXHR5ZXN0ZGF5ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKVxuXHR0b21vcnJvdyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBtaWxsaXNlY29uZClcblx0IyDkuIDlkajkuK3nmoTmn5DkuIDlpKlcblx0d2VlayA9IG5vdy5nZXREYXkoKVxuXHQjIOWHj+WOu+eahOWkqeaVsFxuXHRtaW51c0RheSA9IGlmIHdlZWsgIT0gMCB0aGVuIHdlZWsgLSAxIGVsc2UgNlxuXHRtb25kYXkgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKG1pbnVzRGF5ICogbWlsbGlzZWNvbmQpKVxuXHRzdW5kYXkgPSBuZXcgRGF0ZShtb25kYXkuZ2V0VGltZSgpICsgKDYgKiBtaWxsaXNlY29uZCkpXG5cdCMg5LiK5ZGo5pelXG5cdGxhc3RTdW5kYXkgPSBuZXcgRGF0ZShtb25kYXkuZ2V0VGltZSgpIC0gbWlsbGlzZWNvbmQpXG5cdCMg5LiK5ZGo5LiAXG5cdGxhc3RNb25kYXkgPSBuZXcgRGF0ZShsYXN0U3VuZGF5LmdldFRpbWUoKSAtIChtaWxsaXNlY29uZCAqIDYpKVxuXHQjIOS4i+WRqOS4gFxuXHRuZXh0TW9uZGF5ID0gbmV3IERhdGUoc3VuZGF5LmdldFRpbWUoKSArIG1pbGxpc2Vjb25kKVxuXHQjIOS4i+WRqOaXpVxuXHRuZXh0U3VuZGF5ID0gbmV3IERhdGUobmV4dE1vbmRheS5nZXRUaW1lKCkgKyAobWlsbGlzZWNvbmQgKiA2KSlcblx0Y3VycmVudFllYXIgPSBub3cuZ2V0RnVsbFllYXIoKVxuXHRwcmV2aW91c1llYXIgPSBjdXJyZW50WWVhciAtIDFcblx0bmV4dFllYXIgPSBjdXJyZW50WWVhciArIDFcblx0IyDlvZPliY3mnIjku71cblx0Y3VycmVudE1vbnRoID0gbm93LmdldE1vbnRoKClcblx0IyDorqHmlbDlubTjgIHmnIhcblx0eWVhciA9IG5vdy5nZXRGdWxsWWVhcigpXG5cdG1vbnRoID0gbm93LmdldE1vbnRoKClcblx0IyDmnKzmnIjnrKzkuIDlpKlcblx0Zmlyc3REYXkgPSBuZXcgRGF0ZShjdXJyZW50WWVhcixjdXJyZW50TW9udGgsMSlcblxuXHQjIOW9k+S4ujEy5pyI55qE5pe25YCZ5bm05Lu96ZyA6KaB5YqgMVxuXHQjIOaciOS7vemcgOimgeabtOaWsOS4ujAg5Lmf5bCx5piv5LiL5LiA5bm055qE56ys5LiA5Liq5pyIXG5cdGlmIGN1cnJlbnRNb250aCA9PSAxMVxuXHRcdHllYXIrK1xuXHRcdG1vbnRoKytcblx0ZWxzZVxuXHRcdG1vbnRoKytcblx0XG5cdCMg5LiL5pyI56ys5LiA5aSpXG5cdG5leHRNb250aEZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG5cdCMg5LiL5pyI5pyA5ZCO5LiA5aSpXG5cdG5leHRNb250aEZpbmFsRGF5ID0gbmV3IERhdGUoeWVhcixtb250aCxDcmVhdG9yLmdldE1vbnRoRGF5cyh5ZWFyLG1vbnRoKSlcblx0IyDmnKzmnIjmnIDlkI7kuIDlpKlcblx0bGFzdERheSA9IG5ldyBEYXRlKG5leHRNb250aEZpcnN0RGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKVxuXHQjIOS4iuaciOesrOS4gOWkqVxuXHRsYXN0TW9udGhGaXJzdERheSA9IENyZWF0b3IuZ2V0TGFzdE1vbnRoRmlyc3REYXkoY3VycmVudFllYXIsY3VycmVudE1vbnRoKVxuXHQjIOS4iuaciOacgOWQjuS4gOWkqVxuXHRsYXN0TW9udGhGaW5hbERheSA9IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKVxuXHQjIOacrOWto+W6puW8gOWni+aXpVxuXHR0aGlzUXVhcnRlclN0YXJ0RGF5ID0gbmV3IERhdGUoY3VycmVudFllYXIsQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpLDEpXG5cdCMg5pys5a2j5bqm57uT5p2f5pelXG5cdHRoaXNRdWFydGVyRW5kRGF5ID0gbmV3IERhdGUoY3VycmVudFllYXIsQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpKzIsQ3JlYXRvci5nZXRNb250aERheXMoY3VycmVudFllYXIsQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpKzIpKVxuXHQjIOS4iuWto+W6puW8gOWni+aXpVxuXHRsYXN0UXVhcnRlclN0YXJ0RGF5ID0gQ3JlYXRvci5nZXRMYXN0UXVhcnRlckZpcnN0RGF5KGN1cnJlbnRZZWFyLGN1cnJlbnRNb250aClcblx0IyDkuIrlraPluqbnu5PmnZ/ml6Vcblx0bGFzdFF1YXJ0ZXJFbmREYXkgPSBuZXcgRGF0ZShsYXN0UXVhcnRlclN0YXJ0RGF5LmdldEZ1bGxZZWFyKCksbGFzdFF1YXJ0ZXJTdGFydERheS5nZXRNb250aCgpKzIsQ3JlYXRvci5nZXRNb250aERheXMobGFzdFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0TW9udGgoKSsyKSlcblx0IyDkuIvlraPluqblvIDlp4vml6Vcblx0bmV4dFF1YXJ0ZXJTdGFydERheSA9IENyZWF0b3IuZ2V0TmV4dFF1YXJ0ZXJGaXJzdERheShjdXJyZW50WWVhcixjdXJyZW50TW9udGgpXG5cdCMg5LiL5a2j5bqm57uT5p2f5pelXG5cdG5leHRRdWFydGVyRW5kRGF5ID0gbmV3IERhdGUobmV4dFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLG5leHRRdWFydGVyU3RhcnREYXkuZ2V0TW9udGgoKSsyLENyZWF0b3IuZ2V0TW9udGhEYXlzKG5leHRRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSxuZXh0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkrMikpXG5cdCMg6L+H5Y67N+WkqSBcblx0bGFzdF83X2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDYgKiBtaWxsaXNlY29uZCkpXG5cdCMg6L+H5Y67MzDlpKlcblx0bGFzdF8zMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICgyOSAqIG1pbGxpc2Vjb25kKSlcblx0IyDov4fljrs2MOWkqVxuXHRsYXN0XzYwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDU5ICogbWlsbGlzZWNvbmQpKVxuXHQjIOi/h+WOuzkw5aSpXG5cdGxhc3RfOTBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAoODkgKiBtaWxsaXNlY29uZCkpXG5cdCMg6L+H5Y67MTIw5aSpXG5cdGxhc3RfMTIwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDExOSAqIG1pbGxpc2Vjb25kKSlcblx0IyDmnKrmnaU35aSpIFxuXHRuZXh0XzdfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoNiAqIG1pbGxpc2Vjb25kKSlcblx0IyDmnKrmnaUzMOWkqVxuXHRuZXh0XzMwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDI5ICogbWlsbGlzZWNvbmQpKVxuXHQjIOacquadpTYw5aSpXG5cdG5leHRfNjBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoNTkgKiBtaWxsaXNlY29uZCkpXG5cdCMg5pyq5p2lOTDlpKlcblx0bmV4dF85MF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArICg4OSAqIG1pbGxpc2Vjb25kKSlcblx0IyDmnKrmnaUxMjDlpKlcblx0bmV4dF8xMjBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoMTE5ICogbWlsbGlzZWNvbmQpKVxuXG5cdHN3aXRjaCBrZXlcblx0XHR3aGVuIFwibGFzdF95ZWFyXCJcblx0XHRcdCPljrvlubRcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfeWVhclwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3twcmV2aW91c1llYXJ9LTAxLTAxVDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7cHJldmlvdXNZZWFyfS0xMi0zMVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidGhpc195ZWFyXCJcblx0XHRcdCPku4rlubRcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfeWVhclwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tjdXJyZW50WWVhcn0tMDEtMDFUMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tjdXJyZW50WWVhcn0tMTItMzFUMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfeWVhclwiXG5cdFx0XHQj5piO5bm0XG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0X3llYXJcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7bmV4dFllYXJ9LTAxLTAxVDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7bmV4dFllYXJ9LTEyLTMxVDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJsYXN0X3F1YXJ0ZXJcIlxuXHRcdFx0I+S4iuWto+W6plxuXHRcdFx0c3RyRmlyc3REYXkgPSBtb21lbnQobGFzdFF1YXJ0ZXJTdGFydERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyTGFzdERheSA9IG1vbWVudChsYXN0UXVhcnRlckVuZERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF9xdWFydGVyXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJ0aGlzX3F1YXJ0ZXJcIlxuXHRcdFx0I+acrOWto+W6plxuXHRcdFx0c3RyRmlyc3REYXkgPSBtb21lbnQodGhpc1F1YXJ0ZXJTdGFydERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyTGFzdERheSA9IG1vbWVudCh0aGlzUXVhcnRlckVuZERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fdGhpc19xdWFydGVyXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJuZXh0X3F1YXJ0ZXJcIlxuXHRcdFx0I+S4i+Wto+W6plxuXHRcdFx0c3RyRmlyc3REYXkgPSBtb21lbnQobmV4dFF1YXJ0ZXJTdGFydERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyTGFzdERheSA9IG1vbWVudChuZXh0UXVhcnRlckVuZERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF9xdWFydGVyXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJsYXN0X21vbnRoXCJcblx0XHRcdCPkuIrmnIhcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KGxhc3RNb250aEZpcnN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJMYXN0RGF5ID0gbW9tZW50KGxhc3RNb250aEZpbmFsRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0X21vbnRoXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckZpcnN0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckxhc3REYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJ0aGlzX21vbnRoXCJcblx0XHRcdCPmnKzmnIhcblx0XHRcdHN0ckZpcnN0RGF5ID0gbW9tZW50KGZpcnN0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJMYXN0RGF5ID0gbW9tZW50KGxhc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfbW9udGhcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRmlyc3REYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyTGFzdERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfbW9udGhcIlxuXHRcdFx0I+S4i+aciFxuXHRcdFx0c3RyRmlyc3REYXkgPSBtb21lbnQobmV4dE1vbnRoRmlyc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckxhc3REYXkgPSBtb21lbnQobmV4dE1vbnRoRmluYWxEYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfbW9udGhcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRmlyc3REYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyTGFzdERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcImxhc3Rfd2Vla1wiXG5cdFx0XHQj5LiK5ZGoXG5cdFx0XHRzdHJNb25kYXkgPSBtb21lbnQobGFzdE1vbmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0c3RyU3VuZGF5ID0gbW9tZW50KGxhc3RTdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3Rfd2Vla1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJNb25kYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3VuZGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidGhpc193ZWVrXCJcblx0XHRcdCPmnKzlkahcblx0XHRcdHN0ck1vbmRheSA9IG1vbWVudChtb25kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0clN1bmRheSA9IG1vbWVudChzdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfd2Vla1wiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJNb25kYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3VuZGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF93ZWVrXCJcblx0XHRcdCPkuIvlkahcblx0XHRcdHN0ck1vbmRheSA9IG1vbWVudChuZXh0TW9uZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJTdW5kYXkgPSBtb21lbnQobmV4dFN1bmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF93ZWVrXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0ck1vbmRheX1UMDA6MDA6MDBaXCIpXG5cdFx0XHRlbmRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJTdW5kYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJ5ZXN0ZGF5XCJcblx0XHRcdCPmmKjlpKlcblx0XHRcdHN0clllc3RkYXkgPSBtb21lbnQoeWVzdGRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5feWVzdGRheVwiKVxuXHRcdFx0c3RhcnRWYWx1ZSA9IG5ldyBEYXRlKFwiI3tzdHJZZXN0ZGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0clllc3RkYXl9VDIzOjU5OjU5WlwiKVxuXHRcdHdoZW4gXCJ0b2RheVwiXG5cdFx0XHQj5LuK5aSpXG5cdFx0XHRzdHJUb2RheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RvZGF5XCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clRvZGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0clRvZGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwidG9tb3Jyb3dcIlxuXHRcdFx0I+aYjuWkqVxuXHRcdFx0c3RyVG9tb3Jyb3cgPSBtb21lbnQodG9tb3Jyb3cpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RvbW9ycm93XCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clRvbW9ycm93fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0clRvbW9ycm93fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF83X2RheXNcIlxuXHRcdFx0I+i/h+WOuzflpKlcblx0XHRcdHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfN19kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIFxuXHRcdFx0c3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF83X2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF8zMF9kYXlzXCJcblx0XHRcdCPov4fljrszMOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF8zMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzMwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF82MF9kYXlzXCJcblx0XHRcdCPov4fljrs2MOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF82MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzYwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF85MF9kYXlzXCJcblx0XHRcdCPov4fljrs5MOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF85MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzkwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibGFzdF8xMjBfZGF5c1wiXG5cdFx0XHQj6L+H5Y67MTIw5aSpXG5cdFx0XHRzdHJTdGFydERheSA9IG1vbWVudChsYXN0XzEyMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzEyMF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFx0d2hlbiBcIm5leHRfN19kYXlzXCJcblx0XHRcdCPmnKrmnaU35aSpXG5cdFx0XHRzdHJTdGFydERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckVuZERheSA9IG1vbWVudChuZXh0XzdfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKVxuXHRcdFx0bGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF83X2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF8zMF9kYXlzXCJcblx0XHRcdCPmnKrmnaUzMOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobmV4dF8zMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzMwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF82MF9kYXlzXCJcblx0XHRcdCPmnKrmnaU2MOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobmV4dF82MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzYwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF85MF9kYXlzXCJcblx0XHRcdCPmnKrmnaU5MOWkqVxuXHRcdFx0c3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRzdHJFbmREYXkgPSBtb21lbnQobmV4dF85MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzkwX2RheXNcIilcblx0XHRcdHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyU3RhcnREYXl9VDAwOjAwOjAwWlwiKVxuXHRcdFx0ZW5kVmFsdWUgPSBuZXcgRGF0ZShcIiN7c3RyRW5kRGF5fVQyMzo1OTo1OVpcIilcblx0XHR3aGVuIFwibmV4dF8xMjBfZGF5c1wiXG5cdFx0XHQj5pyq5p2lMTIw5aSpXG5cdFx0XHRzdHJTdGFydERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIilcblx0XHRcdHN0ckVuZERheSA9IG1vbWVudChuZXh0XzEyMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpXG5cdFx0XHRsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzEyMF9kYXlzXCIpXG5cdFx0XHRzdGFydFZhbHVlID0gbmV3IERhdGUoXCIje3N0clN0YXJ0RGF5fVQwMDowMDowMFpcIilcblx0XHRcdGVuZFZhbHVlID0gbmV3IERhdGUoXCIje3N0ckVuZERheX1UMjM6NTk6NTlaXCIpXG5cdFxuXHR2YWx1ZXMgPSBbc3RhcnRWYWx1ZSwgZW5kVmFsdWVdXG5cdGlmIGZpZWxkX3R5cGUgPT0gXCJkYXRldGltZVwiXG5cdFx0IyDml7bpl7TnsbvlnovlrZfmrrXvvIzlhoXnva7ml7bpl7TojIPlm7TlupTor6XogIPomZHlgY/np7vml7bljLrlgLzvvIzlkKbliJnov4fmu6TmlbDmja7lrZjlnKjlgY/lt65cblx0XHQjIOmdnuWGhee9ruaXtumXtOiMg+WbtOaXtu+8jOeUqOaIt+mAmui/h+aXtumXtOaOp+S7tumAieaLqeeahOiMg+WbtO+8jOS8muiHquWKqOWkhOeQhuaXtuWMuuWBj+W3ruaDheWGtVxuXHRcdCMg5pel5pyf57G75Z6L5a2X5q6177yM5pWw5o2u5bqT5pys5p2l5bCx5a2Y55qE5pivVVRD55qEMOeCue+8jOS4jeWtmOWcqOWBj+W3rlxuXHRcdF8uZm9yRWFjaCB2YWx1ZXMsIChmdiktPlxuXHRcdFx0aWYgZnZcblx0XHRcdFx0ZnYuc2V0SG91cnMoZnYuZ2V0SG91cnMoKSArIGZ2LmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCApXG5cdFxuXHRyZXR1cm4ge1xuXHRcdGxhYmVsOiBsYWJlbFxuXHRcdGtleToga2V5XG5cdFx0dmFsdWVzOiB2YWx1ZXNcblx0fVxuXG5DcmVhdG9yLmdldEZpZWxkRGVmYXVsdE9wZXJhdGlvbiA9IChmaWVsZF90eXBlKS0+XG5cdGlmIGZpZWxkX3R5cGUgJiYgQ3JlYXRvci5jaGVja0ZpZWxkVHlwZVN1cHBvcnRCZXR3ZWVuUXVlcnkoZmllbGRfdHlwZSlcblx0XHRyZXR1cm4gJ2JldHdlZW4nXG5cdGVsc2UgaWYgW1widGV4dGFyZWFcIiwgXCJ0ZXh0XCIsIFwiY29kZVwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKVxuXHRcdHJldHVybiAnY29udGFpbnMnXG5cdGVsc2Vcblx0XHRyZXR1cm4gXCI9XCJcblxuQ3JlYXRvci5nZXRGaWVsZE9wZXJhdGlvbiA9IChmaWVsZF90eXBlKSAtPlxuXHQjIOaXpeacn+exu+WeizogZGF0ZSwgZGF0ZXRpbWUgIOaUr+aMgeaTjeS9nOespjogXCI9XCIsIFwiPD5cIiwgXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIlxuXHQjIOaWh+acrOexu+WeizogdGV4dCwgdGV4dGFyZWEsIGh0bWwgIOaUr+aMgeaTjeS9nOespjogXCI9XCIsIFwiPD5cIiwgXCJjb250YWluc1wiLCBcIm5vdGNvbnRhaW5zXCIsIFwic3RhcnRzd2l0aFwiXG5cdCMg6YCJ5oup57G75Z6LOiBsb29rdXAsIG1hc3Rlcl9kZXRhaWwsIHNlbGVjdCDmlK/mjIHmk43kvZznrKY6IFwiPVwiLCBcIjw+XCJcblx0IyDmlbDlgLznsbvlnos6IGN1cnJlbmN5LCBudW1iZXIgIOaUr+aMgeaTjeS9nOespjogXCI9XCIsIFwiPD5cIiwgXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIlxuXHQjIOW4g+WwlOexu+WeizogYm9vbGVhbiAg5pSv5oyB5pON5L2c56ymOiBcIj1cIiwgXCI8PlwiXG5cdCMg5pWw57uE57G75Z6LOiBjaGVja2JveCwgW3RleHRdICDmlK/mjIHmk43kvZznrKY6IFwiPVwiLCBcIjw+XCJcblxuXHRvcHRpb25hbHMgPSB7XG5cdFx0ZXF1YWw6IHtsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9lcXVhbFwiKSwgdmFsdWU6IFwiPVwifSxcblx0XHR1bmVxdWFsOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fdW5lcXVhbFwiKSwgdmFsdWU6IFwiPD5cIn0sXG5cdFx0bGVzc190aGFuOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fbGVzc190aGFuXCIpLCB2YWx1ZTogXCI8XCJ9LFxuXHRcdGdyZWF0ZXJfdGhhbjoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2dyZWF0ZXJfdGhhblwiKSwgdmFsdWU6IFwiPlwifSxcblx0XHRsZXNzX29yX2VxdWFsOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fbGVzc19vcl9lcXVhbFwiKSwgdmFsdWU6IFwiPD1cIn0sXG5cdFx0Z3JlYXRlcl9vcl9lcXVhbDoge2xhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxcIiksIHZhbHVlOiBcIj49XCJ9LFxuXHRcdGNvbnRhaW5zOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fY29udGFpbnNcIiksIHZhbHVlOiBcImNvbnRhaW5zXCJ9LFxuXHRcdG5vdF9jb250YWluOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fZG9lc19ub3RfY29udGFpblwiKSwgdmFsdWU6IFwibm90Y29udGFpbnNcIn0sXG5cdFx0c3RhcnRzX3dpdGg6IHtsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9zdGFydHNfd2l0aFwiKSwgdmFsdWU6IFwic3RhcnRzd2l0aFwifSxcblx0XHRiZXR3ZWVuOiB7bGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2VlblwiKSwgdmFsdWU6IFwiYmV0d2VlblwifSxcblx0fVxuXG5cdGlmIGZpZWxkX3R5cGUgPT0gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIF8udmFsdWVzKG9wdGlvbmFscylcblxuXHRvcGVyYXRpb25zID0gW11cblxuXHRpZiBDcmVhdG9yLmNoZWNrRmllbGRUeXBlU3VwcG9ydEJldHdlZW5RdWVyeShmaWVsZF90eXBlKVxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuYmV0d2Vlbilcblx0XHRDcmVhdG9yLnB1c2hCZXR3ZWVuQnVpbHRpbk9wdGlvbmFscyhmaWVsZF90eXBlLCBvcGVyYXRpb25zKVxuXHRlbHNlIGlmIGZpZWxkX3R5cGUgPT0gXCJ0ZXh0XCIgb3IgZmllbGRfdHlwZSA9PSBcInRleHRhcmVhXCIgb3IgZmllbGRfdHlwZSA9PSBcImh0bWxcIiBvciBmaWVsZF90eXBlID09IFwiY29kZVwiXG4jXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsLCBvcHRpb25hbHMuY29udGFpbnMsIG9wdGlvbmFscy5ub3RfY29udGFpbiwgb3B0aW9uYWxzLnN0YXJ0c193aXRoKVxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuY29udGFpbnMpXG5cdGVsc2UgaWYgZmllbGRfdHlwZSA9PSBcImxvb2t1cFwiIG9yIGZpZWxkX3R5cGUgPT0gXCJtYXN0ZXJfZGV0YWlsXCIgb3IgZmllbGRfdHlwZSA9PSBcInNlbGVjdFwiXG5cdFx0b3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpXG5cdGVsc2UgaWYgZmllbGRfdHlwZSA9PSBcImN1cnJlbmN5XCIgb3IgZmllbGRfdHlwZSA9PSBcIm51bWJlclwiXG5cdFx0b3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwsIG9wdGlvbmFscy5sZXNzX3RoYW4sIG9wdGlvbmFscy5ncmVhdGVyX3RoYW4sIG9wdGlvbmFscy5sZXNzX29yX2VxdWFsLCBvcHRpb25hbHMuZ3JlYXRlcl9vcl9lcXVhbClcblx0ZWxzZSBpZiBmaWVsZF90eXBlID09IFwiYm9vbGVhblwiXG5cdFx0b3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpXG5cdGVsc2UgaWYgZmllbGRfdHlwZSA9PSBcImNoZWNrYm94XCJcblx0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbClcblx0ZWxzZSBpZiBmaWVsZF90eXBlID09IFwiW3RleHRdXCJcblx0XHRvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmVxdWFsLCBvcHRpb25hbHMudW5lcXVhbClcblx0ZWxzZVxuXHRcdG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKVxuXG5cdHJldHVybiBvcGVyYXRpb25zXG5cbiMjI1xuICAgIOWFiOaMieeFp+acieaOkuW6j+WPt+eahOWwj+eahOWcqOWJje+8jOWkp+eahOWcqOWQjlxuICAgIOWGjeWwhuayoeacieaOkuW6j+WPt+eahOaYvuekuuWcqFxuIyMjXG5DcmVhdG9yLmdldE9iamVjdEZpZWxkc05hbWUgPSAob2JqZWN0X25hbWUpLT5cblx0ZmllbGRzID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpPy5maWVsZHNcblx0ZmllbGRzQXJyID0gW11cblxuXHRfLmVhY2ggZmllbGRzLCAoZmllbGQpLT5cblx0XHRmaWVsZHNBcnIucHVzaCB7bmFtZTogZmllbGQubmFtZSwgc29ydF9ubzogZmllbGQuc29ydF9ub31cblxuXHRmaWVsZHNOYW1lID0gW11cblx0Xy5lYWNoIF8uc29ydEJ5KGZpZWxkc0FyciwgXCJzb3J0X25vXCIpLCAoZmllbGQpLT5cblx0XHRmaWVsZHNOYW1lLnB1c2goZmllbGQubmFtZSlcblx0cmV0dXJuIGZpZWxkc05hbWVcbiIsIkNyZWF0b3IuZ2V0U2VsZWN0T3B0aW9ucyA9IGZ1bmN0aW9uKGZpZWxkU2NoZW1hKSB7XG4gIHZhciBkYXRhX3R5cGUsIG9wdGlvbnM7XG4gIG9wdGlvbnMgPSBmaWVsZFNjaGVtYS5vcHRpb25zO1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGF0YV90eXBlID0gZmllbGRTY2hlbWEuZGF0YV90eXBlO1xuICBpZiAoIV8uaXNGdW5jdGlvbihvcHRpb25zKSAmJiBkYXRhX3R5cGUgJiYgZGF0YV90eXBlICE9PSAndGV4dCcpIHtcbiAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24ob3B0aW9uSXRlbSkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25JdGVtLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoWydudW1iZXInLCAnY3VycmVuY3knLCAncGVyY2VudCddLmluZGV4T2YoZGF0YV90eXBlKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25JdGVtLnZhbHVlID0gTnVtYmVyKG9wdGlvbkl0ZW0udmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhX3R5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gb3B0aW9uSXRlbS52YWx1ZSA9IG9wdGlvbkl0ZW0udmFsdWUgPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbkNyZWF0b3IuZ2V0T2JqZWN0U2NoZW1hID0gZnVuY3Rpb24ob2JqKSB7XG4gIHZhciBmaWVsZHNBcnIsIHNjaGVtYTtcbiAgaWYgKCFvYmopIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc2NoZW1hID0ge307XG4gIGZpZWxkc0FyciA9IFtdO1xuICBfLmVhY2gob2JqLmZpZWxkcywgZnVuY3Rpb24oZmllbGQsIGZpZWxkX25hbWUpIHtcbiAgICBpZiAoIV8uaGFzKGZpZWxkLCBcIm5hbWVcIikpIHtcbiAgICAgIGZpZWxkLm5hbWUgPSBmaWVsZF9uYW1lO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzQXJyLnB1c2goZmllbGQpO1xuICB9KTtcbiAgXy5lYWNoKF8uc29ydEJ5KGZpZWxkc0FyciwgXCJzb3J0X25vXCIpLCBmdW5jdGlvbihmaWVsZCkge1xuICAgIHZhciBfb2JqZWN0LCBfcmVmX29iaiwgX3JlZmVyZW5jZV90bywgYXV0b2Zvcm1fdHlwZSwgY29sbGVjdGlvbk5hbWUsIGZpZWxkX25hbWUsIGZzLCBmc1R5cGUsIGlzVW5MaW1pdGVkLCBwZXJtaXNzaW9ucywgcmVmLCByZWYxO1xuICAgIGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lO1xuICAgIGZzID0ge307XG4gICAgaWYgKGZpZWxkLnJlZ0V4KSB7XG4gICAgICBmcy5yZWdFeCA9IGZpZWxkLnJlZ0V4O1xuICAgIH1cbiAgICBmcy5hdXRvZm9ybSA9IHt9O1xuICAgIGZzLmF1dG9mb3JtLm11bHRpcGxlID0gZmllbGQubXVsdGlwbGU7XG4gICAgZnMuYXV0b2Zvcm0ucmVmZXJlbmNlX3RvID0gZmllbGQucmVmZXJlbmNlX3RvO1xuICAgIGF1dG9mb3JtX3R5cGUgPSAocmVmID0gZmllbGQuYXV0b2Zvcm0pICE9IG51bGwgPyByZWYudHlwZSA6IHZvaWQgMDtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZmllbGQudHlwZSA9PT0gXCJwaG9uZVwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgaWYgKGZpZWxkLm11bHRpcGxlKSB7XG4gICAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwidGFnc1wiO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJbdGV4dF1cIiB8fCBmaWVsZC50eXBlID09PSBcIltwaG9uZV1cIikge1xuICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwidGFnc1wiO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2NvZGUnKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwid2lkZWFyZWFcIjtcbiAgICAgIGZzLmF1dG9mb3JtLnJvd3MgPSBmaWVsZC5yb3dzIHx8IDEyO1xuICAgICAgaWYgKGZpZWxkLmxhbmd1YWdlKSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLmxhbmd1YWdlID0gZmllbGQubGFuZ3VhZ2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJ3aWRlYXJlYVwiO1xuICAgICAgZnMuYXV0b2Zvcm0ucm93cyA9IGZpZWxkLnJvd3MgfHwgMjtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwicGFzc3dvcmRcIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInBhc3N3b3JkXCI7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImRhdGVcIikge1xuICAgICAgZnMudHlwZSA9IERhdGU7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNpT1MoKSkge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcImR4LWRhdGUtYm94XCIsXG4gICAgICAgICAgICAgIHRpbWV6b25lSWQ6IFwidXRjXCIsXG4gICAgICAgICAgICAgIGR4RGF0ZUJveE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0OiBcInl5eXktTU0tZGRcIixcbiAgICAgICAgICAgICAgICBwaWNrZXJUeXBlOiBcInJvbGxlcnNcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RlZWRvcy1kYXRlLW1vYmlsZVwiLFxuICAgICAgICAgICAgICBkYXRlTW9iaWxlT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmF1dG9mb3JtLm91dEZvcm1hdCA9ICd5eXl5LU1NLWRkJztcbiAgICAgICAgICBmcy5hdXRvZm9ybS5hZkZpZWxkSW5wdXQgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImR4LWRhdGUtYm94XCIsXG4gICAgICAgICAgICB0aW1lem9uZUlkOiBcInV0Y1wiLFxuICAgICAgICAgICAgZHhEYXRlQm94T3B0aW9uczoge1xuICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInRpbWVcIikge1xuICAgICAgZnMudHlwZSA9IERhdGU7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLmFmRmllbGRJbnB1dCA9IHtcbiAgICAgICAgICB0eXBlOiBcImR4LWRhdGUtYm94XCIsXG4gICAgICAgICAgdGltZXpvbmVJZDogXCJ1dGNcIixcbiAgICAgICAgICBkeERhdGVCb3hPcHRpb25zOiB7XG4gICAgICAgICAgICB0eXBlOiBcInRpbWVcIixcbiAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IFwiSEg6bW1cIlxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgICAgZnMudHlwZSA9IERhdGU7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc1BhZCgpKSB7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuaXNpT1MoKSkge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcImR4LWRhdGUtYm94XCIsXG4gICAgICAgICAgICAgIGR4RGF0ZUJveE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdDogXCJ5eXl5LU1NLWRkIEhIOm1tXCIsXG4gICAgICAgICAgICAgICAgcGlja2VyVHlwZTogXCJyb2xsZXJzXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0ZWVkb3MtZGF0ZS1tb2JpbGVcIixcbiAgICAgICAgICAgICAgZGF0ZU1vYmlsZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGV0aW1lXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMuYXV0b2Zvcm0uYWZGaWVsZElucHV0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJkeC1kYXRlLWJveFwiLFxuICAgICAgICAgICAgZHhEYXRlQm94T3B0aW9uczoge1xuICAgICAgICAgICAgICB0eXBlOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IFwieXl5eS1NTS1kZCBISDptbVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJbT2JqZWN0XVwiKSB7XG4gICAgICBmcy50eXBlID0gW09iamVjdF07XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImh0bWxcIikge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdzdGVlZG9zSHRtbCc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImxvb2t1cFwiIHx8IGZpZWxkLnR5cGUgPT09IFwibWFzdGVyX2RldGFpbFwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgZnMuYXV0b2Zvcm0uc2hvd0ljb24gPSBmaWVsZC5zaG93SWNvbjtcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICB9XG4gICAgICBpZiAoIWZpZWxkLmhpZGRlbikge1xuICAgICAgICBmcy5hdXRvZm9ybS5maWx0ZXJzID0gZmllbGQuZmlsdGVycztcbiAgICAgICAgZnMuYXV0b2Zvcm0uZGVwZW5kT24gPSBmaWVsZC5kZXBlbmRfb247XG4gICAgICAgIGlmIChmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb24pIHtcbiAgICAgICAgICBmcy5iZWZvcmVPcGVuRnVuY3Rpb24gPSBmaWVsZC5iZWZvcmVPcGVuRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZnMuZmlsdGVyc0Z1bmN0aW9uID0gZmllbGQuZmlsdGVyc0Z1bmN0aW9uID8gZmllbGQuZmlsdGVyc0Z1bmN0aW9uIDogQ3JlYXRvci5ldmFsdWF0ZUZpbHRlcnM7XG4gICAgICAgIGlmIChmaWVsZC5vcHRpb25zRnVuY3Rpb24pIHtcbiAgICAgICAgICBmcy5vcHRpb25zRnVuY3Rpb24gPSBmaWVsZC5vcHRpb25zRnVuY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZV90bykge1xuICAgICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5jcmVhdGVGdW5jdGlvbiAmJiBfLmlzRnVuY3Rpb24oZmllbGQuY3JlYXRlRnVuY3Rpb24pKSB7XG4gICAgICAgICAgICAgIGZzLmNyZWF0ZUZ1bmN0aW9uID0gZmllbGQuY3JlYXRlRnVuY3Rpb247XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoXy5pc1N0cmluZyhmaWVsZC5yZWZlcmVuY2VfdG8pKSB7XG4gICAgICAgICAgICAgICAgX3JlZl9vYmogPSBDcmVhdG9yLk9iamVjdHNbZmllbGQucmVmZXJlbmNlX3RvXTtcbiAgICAgICAgICAgICAgICBpZiAoX3JlZl9vYmogIT0gbnVsbCA/IChyZWYxID0gX3JlZl9vYmoucGVybWlzc2lvbnMpICE9IG51bGwgPyByZWYxLmFsbG93Q3JlYXRlIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5jcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgZnMuY3JlYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihsb29rdXBfZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGFsLnNob3coXCJDcmVhdG9yT2JqZWN0TW9kYWxcIiwge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246IFwiQ3JlYXRvci5Db2xsZWN0aW9ucy5cIiArIChDcmVhdG9yLmdldENvbGxlY3Rpb24oZmllbGQucmVmZXJlbmNlX3RvKS5fbmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUlkOiBcIm5ld1wiICsgKGZpZWxkLnJlZmVyZW5jZV90by5yZXBsYWNlKCcuJywgJ18nKSksXG4gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25hbWU6IFwiXCIgKyBmaWVsZC5yZWZlcmVuY2VfdG8sXG4gICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImluc2VydFwiLFxuICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24ob3BlcmF0aW9uLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZXN1bHQub2JqZWN0X25hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5vYmplY3RfbmFtZSA9PT0gXCJvYmplY3RzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cF9maWVsZC5hZGRJdGVtcyhbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlc3VsdC52YWx1ZS5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHJlc3VsdC52YWx1ZS5pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLCByZXN1bHQudmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwX2ZpZWxkLmFkZEl0ZW1zKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmVzdWx0LnZhbHVlW29iamVjdC5OQU1FX0ZJRUxEX0tFWV0gfHwgcmVzdWx0LnZhbHVlLmxhYmVsIHx8IHJlc3VsdC52YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5faWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHJlc3VsdC5faWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5jcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF8uaXNCb29sZWFuKGZpZWxkLmNyZWF0ZSkpIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLmNyZWF0ZSA9IGZpZWxkLmNyZWF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkLnJlZmVyZW5jZV9zb3J0KSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS5vcHRpb25zU29ydCA9IGZpZWxkLnJlZmVyZW5jZV9zb3J0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQucmVmZXJlbmNlX2xpbWl0KSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS5vcHRpb25zTGltaXQgPSBmaWVsZC5yZWZlcmVuY2VfbGltaXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQpIHtcbiAgICAgICAgICAgIGZzLmF1dG9mb3JtLnJlZmVyZW5jZVRvRmllbGQgPSBmaWVsZC5yZWZlcmVuY2VfdG9fZmllbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC5yZWZlcmVuY2VfdG8gPT09IFwidXNlcnNcIikge1xuICAgICAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic2VsZWN0dXNlclwiO1xuICAgICAgICAgICAgaWYgKCFmaWVsZC5oaWRkZW4gJiYgIWZpZWxkLm9taXQpIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBvYmoucGVybWlzc2lvbnM7XG4gICAgICAgICAgICAgICAgICBpc1VuTGltaXRlZCA9IHBlcm1pc3Npb25zICE9IG51bGwgPyBwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIGlmIChfLmluY2x1ZGUoW1wib3JnYW5pemF0aW9uc1wiLCBcInVzZXJzXCIsIFwic3BhY2VfdXNlcnNcIl0sIG9iai5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBpc1VuTGltaXRlZCA9IHBlcm1pc3Npb25zICE9IG51bGwgPyBwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGlzVW5MaW1pdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQob2JqLnBlcm1pc3Npb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5yZWZlcmVuY2VfdG8gPT09IFwib3JnYW5pemF0aW9uc1wiKSB7XG4gICAgICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzZWxlY3RvcmdcIjtcbiAgICAgICAgICAgIGlmICghZmllbGQuaGlkZGVuICYmICFmaWVsZC5vbWl0KSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb2JqLnBlcm1pc3Npb25zO1xuICAgICAgICAgICAgICAgICAgaXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgOiB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlKFtcIm9yZ2FuaXphdGlvbnNcIiwgXCJ1c2Vyc1wiLCBcInNwYWNlX3VzZXJzXCJdLCBvYmoubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNVbkxpbWl0ZWQgPSBwZXJtaXNzaW9ucyAhPSBudWxsID8gcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChpc1VuTGltaXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBmcy5hdXRvZm9ybS5pc19jb21wYW55X2xpbWl0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNGdW5jdGlvbihmaWVsZC5pc19jb21wYW55X2xpbWl0ZWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkKG9iai5wZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLmlzX2NvbXBhbnlfbGltaXRlZCA9IGZpZWxkLmlzX2NvbXBhbnlfbGltaXRlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0uaXNfY29tcGFueV9saW1pdGVkID0gZmllbGQuaXNfY29tcGFueV9saW1pdGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkLnJlZmVyZW5jZV90byA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIF9yZWZlcmVuY2VfdG8gPSBmaWVsZC5yZWZlcmVuY2VfdG8oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF9yZWZlcmVuY2VfdG8gPSBmaWVsZC5yZWZlcmVuY2VfdG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KF9yZWZlcmVuY2VfdG8pKSB7XG4gICAgICAgICAgICAgIGZzLnR5cGUgPSBPYmplY3Q7XG4gICAgICAgICAgICAgIGZzLmJsYWNrYm94ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0ub2JqZWN0U3dpdGNoZSA9IHRydWU7XG4gICAgICAgICAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIub1wiXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgICAgICAgIG9taXQ6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuaWRzXCJdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFtTdHJpbmddLFxuICAgICAgICAgICAgICAgIGF1dG9mb3JtOiB7XG4gICAgICAgICAgICAgICAgICBvbWl0OiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3JlZmVyZW5jZV90byA9IFtfcmVmZXJlbmNlX3RvXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9vYmplY3QgPSBDcmVhdG9yLk9iamVjdHNbX3JlZmVyZW5jZV90b1swXV07XG4gICAgICAgICAgICBpZiAoX29iamVjdCAmJiBfb2JqZWN0LmVuYWJsZV90cmVlKSB7XG4gICAgICAgICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdFRyZWVcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NMb29rdXBzXCI7XG4gICAgICAgICAgICAgIGZzLmF1dG9mb3JtLm9wdGlvbnNNZXRob2QgPSBmaWVsZC5vcHRpb25zTWV0aG9kIHx8IFwiY3JlYXRvci5vYmplY3Rfb3B0aW9uc1wiO1xuICAgICAgICAgICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgICAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9uc01ldGhvZFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZzLmF1dG9mb3JtLnJlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBfcmVmZXJlbmNlX3RvLmZvckVhY2goZnVuY3Rpb24oX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgX29iamVjdCA9IENyZWF0b3IuT2JqZWN0c1tfcmVmZXJlbmNlXTtcbiAgICAgICAgICAgICAgICAgIGlmIChfb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcy5hdXRvZm9ybS5yZWZlcmVuY2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogX3JlZmVyZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogX29iamVjdCAhPSBudWxsID8gX29iamVjdC5sYWJlbCA6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgICBpY29uOiBfb2JqZWN0ICE9IG51bGwgPyBfb2JqZWN0Lmljb24gOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgICAgbGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIvYXBwL1wiICsgKFNlc3Npb24uZ2V0KCdhcHBfaWQnKSkgKyBcIi9cIiArIF9yZWZlcmVuY2UgKyBcIi92aWV3L1wiO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnMuYXV0b2Zvcm0ucmVmZXJlbmNlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IF9yZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgbGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIvYXBwL1wiICsgKFNlc3Npb24uZ2V0KCdhcHBfaWQnKSkgKyBcIi9cIiArIF9yZWZlcmVuY2UgKyBcIi92aWV3L1wiO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc0xvb2t1cHNcIjtcbiAgICAgICAgICBmcy5hdXRvZm9ybS5kZWZhdWx0SWNvbiA9IGZpZWxkLmRlZmF1bHRJY29uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgaWYgKGZpZWxkLm11bHRpcGxlKSB7XG4gICAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc0xvb2t1cHNcIjtcbiAgICAgICAgZnMuYXV0b2Zvcm0uc2hvd0ljb24gPSBmYWxzZTtcbiAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzZWxlY3RcIjtcbiAgICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIGlmIChfLmhhcyhmaWVsZCwgJ2ZpcnN0T3B0aW9uJykpIHtcbiAgICAgICAgICBmcy5hdXRvZm9ybS5maXJzdE9wdGlvbiA9IGZpZWxkLmZpcnN0T3B0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmF1dG9mb3JtLmZpcnN0T3B0aW9uID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmRhdGFfdHlwZSAmJiBmaWVsZC5kYXRhX3R5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICAgIGlmIChbXCJudW1iZXJcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIl0uaW5kZXhPZihmaWVsZC5kYXRhX3R5cGUpID4gLTEpIHtcbiAgICAgICAgICBmc1R5cGUgPSBOdW1iZXI7XG4gICAgICAgICAgZnMuZGVjaW1hbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZGF0YV90eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGZzVHlwZSA9IEJvb2xlYW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnNUeXBlID0gU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGZzLnR5cGUgPSBmc1R5cGU7XG4gICAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICAgIGZzLnR5cGUgPSBbZnNUeXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmcy5hdXRvZm9ybS5vcHRpb25zID0gQ3JlYXRvci5nZXRTZWxlY3RPcHRpb25zKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiY3VycmVuY3lcIikge1xuICAgICAgZnMudHlwZSA9IE51bWJlcjtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3NOdW1iZXJcIjtcbiAgICAgIGZzLmF1dG9mb3JtLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbiB8fCAxODtcbiAgICAgIGlmIChmaWVsZCAhPSBudWxsID8gZmllbGQuc2NhbGUgOiB2b2lkIDApIHtcbiAgICAgICAgZnMuYXV0b2Zvcm0uc2NhbGUgPSBmaWVsZC5zY2FsZTtcbiAgICAgICAgZnMuZGVjaW1hbCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKChmaWVsZCAhPSBudWxsID8gZmllbGQuc2NhbGUgOiB2b2lkIDApICE9PSAwKSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLnNjYWxlID0gMjtcbiAgICAgICAgZnMuZGVjaW1hbCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBmcy50eXBlID0gTnVtYmVyO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc051bWJlclwiO1xuICAgICAgZnMuYXV0b2Zvcm0ucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uIHx8IDE4O1xuICAgICAgaWYgKGZpZWxkICE9IG51bGwgPyBmaWVsZC5zY2FsZSA6IHZvaWQgMCkge1xuICAgICAgICBmcy5hdXRvZm9ybS5zY2FsZSA9IGZpZWxkLnNjYWxlO1xuICAgICAgICBmcy5kZWNpbWFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBmcy50eXBlID0gQm9vbGVhbjtcbiAgICAgIGlmIChmaWVsZC5yZWFkb25seSkge1xuICAgICAgICBmcy5hdXRvZm9ybS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gXCJzdGVlZG9zLWJvb2xlYW4tY2hlY2tib3hcIjtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwidG9nZ2xlXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBCb29sZWFuO1xuICAgICAgaWYgKGZpZWxkLnJlYWRvbmx5KSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInN0ZWVkb3MtYm9vbGVhbi10b2dnbGVcIjtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIGZzLnR5cGUgPSBbU3RyaW5nXTtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcInNlbGVjdC1jaGVja2JveFwiO1xuICAgICAgZnMuYXV0b2Zvcm0ub3B0aW9ucyA9IGZpZWxkLm9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgY29sbGVjdGlvbk5hbWUgPSBmaWVsZC5jb2xsZWN0aW9uIHx8IFwiZmlsZXNcIjtcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9IHtcbiAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgdHlwZTogJ2ZpbGVVcGxvYWQnLFxuICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbk5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnO1xuICAgICAgICBmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gY29sbGVjdGlvbk5hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImZpbGVzaXplXCIpIHtcbiAgICAgIGZzLnR5cGUgPSBOdW1iZXI7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVzaXplJztcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiT2JqZWN0XCIgfHwgZmllbGQudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZnMudHlwZSA9IE9iamVjdDtcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiZ3JpZFwiIHx8IGZpZWxkLnR5cGUgPT09IFwidGFibGVcIikge1xuICAgICAgZnMudHlwZSA9IEFycmF5O1xuICAgICAgZnMuYXV0b2Zvcm0uZWRpdGFibGUgPSB0cnVlO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc0dyaWRcIjtcbiAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9IHtcbiAgICAgICAgdHlwZTogT2JqZWN0XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlVXBsb2FkJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246ICdpbWFnZXMnLFxuICAgICAgICAgICAgYWNjZXB0OiAnaW1hZ2UvKidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnO1xuICAgICAgICBmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gJ2ltYWdlcyc7XG4gICAgICAgIGZzLmF1dG9mb3JtLmFjY2VwdCA9ICdpbWFnZS8qJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwiYXZhdGFyXCIpIHtcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9IHtcbiAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgdHlwZTogJ2ZpbGVVcGxvYWQnLFxuICAgICAgICAgICAgY29sbGVjdGlvbjogJ2F2YXRhcnMnLFxuICAgICAgICAgICAgYWNjZXB0OiAnaW1hZ2UvKidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnO1xuICAgICAgICBmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gJ2F2YXRhcnMnO1xuICAgICAgICBmcy5hdXRvZm9ybS5hY2NlcHQgPSAnaW1hZ2UvKic7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImF1ZGlvXCIpIHtcbiAgICAgIGlmIChmaWVsZC5tdWx0aXBsZSkge1xuICAgICAgICBmcy50eXBlID0gW1N0cmluZ107XG4gICAgICAgIHNjaGVtYVtmaWVsZF9uYW1lICsgXCIuJFwiXSA9IHtcbiAgICAgICAgICBhdXRvZm9ybToge1xuICAgICAgICAgICAgdHlwZTogJ2ZpbGVVcGxvYWQnLFxuICAgICAgICAgICAgY29sbGVjdGlvbjogJ2F1ZGlvcycsXG4gICAgICAgICAgICBhY2NlcHQ6ICdhdWRpby8qJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSAnZmlsZVVwbG9hZCc7XG4gICAgICAgIGZzLmF1dG9mb3JtLmNvbGxlY3Rpb24gPSAnYXVkaW9zJztcbiAgICAgICAgZnMuYXV0b2Zvcm0uYWNjZXB0ID0gJ2F1ZGlvLyonO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICBpZiAoZmllbGQubXVsdGlwbGUpIHtcbiAgICAgICAgZnMudHlwZSA9IFtTdHJpbmddO1xuICAgICAgICBzY2hlbWFbZmllbGRfbmFtZSArIFwiLiRcIl0gPSB7XG4gICAgICAgICAgYXV0b2Zvcm06IHtcbiAgICAgICAgICAgIHR5cGU6ICdmaWxlVXBsb2FkJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb246ICd2aWRlb3MnLFxuICAgICAgICAgICAgYWNjZXB0OiAndmlkZW8vKidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ2ZpbGVVcGxvYWQnO1xuICAgICAgICBmcy5hdXRvZm9ybS5jb2xsZWN0aW9uID0gJ3ZpZGVvcyc7XG4gICAgICAgIGZzLmF1dG9mb3JtLmFjY2VwdCA9ICd2aWRlby8qJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09IFwibG9jYXRpb25cIikge1xuICAgICAgZnMudHlwZSA9IE9iamVjdDtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcImxvY2F0aW9uXCI7XG4gICAgICBmcy5hdXRvZm9ybS5zeXN0ZW0gPSBmaWVsZC5zeXN0ZW0gfHwgXCJ3Z3M4NFwiO1xuICAgICAgZnMuYmxhY2tib3ggPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gXCJtYXJrZG93blwiKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwidGV4dFwiO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VybCcpIHtcbiAgICAgIGZzLnR5cGUgPSBTdHJpbmc7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gJ3N0ZWVkb3NVcmwnO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2VtYWlsJykge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICAgIGZzLnJlZ0V4ID0gU2ltcGxlU2NoZW1hLlJlZ0V4LkVtYWlsO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9ICdzdGVlZG9zRW1haWwnO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2F1dG9udW1iZXInKSB7XG4gICAgICBmcy50eXBlID0gU3RyaW5nO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgZnMudHlwZSA9IFN0cmluZztcbiAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdmb3JtdWxhJykge1xuICAgICAgZnMgPSBDcmVhdG9yLmdldE9iamVjdFNjaGVtYSh7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGZpZWxkOiBPYmplY3QuYXNzaWduKHt9LCBmaWVsZCwge1xuICAgICAgICAgICAgdHlwZTogZmllbGQuZGF0YV90eXBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlbZmllbGQubmFtZV07XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnc3VtbWFyeScpIHtcbiAgICAgIGZzID0gQ3JlYXRvci5nZXRPYmplY3RTY2hlbWEoe1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBmaWVsZDogT2JqZWN0LmFzc2lnbih7fSwgZmllbGQsIHtcbiAgICAgICAgICAgIHR5cGU6IGZpZWxkLmRhdGFfdHlwZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pW2ZpZWxkLm5hbWVdO1xuICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3BlcmNlbnQnKSB7XG4gICAgICBmcy50eXBlID0gTnVtYmVyO1xuICAgICAgZnMuYXV0b2Zvcm0udHlwZSA9IFwic3RlZWRvc051bWJlclwiO1xuICAgICAgZnMuYXV0b2Zvcm0ucHJlY2lzaW9uID0gZmllbGQucHJlY2lzaW9uIHx8IDE4O1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKGZpZWxkLnNjYWxlKSkge1xuICAgICAgICBmaWVsZC5zY2FsZSA9IDA7XG4gICAgICB9XG4gICAgICBmcy5hdXRvZm9ybS5zY2FsZSA9IGZpZWxkLnNjYWxlICsgMjtcbiAgICAgIGZzLmRlY2ltYWwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy50eXBlID0gZmllbGQudHlwZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmxhYmVsKSB7XG4gICAgICBmcy5sYWJlbCA9IGZpZWxkLmxhYmVsO1xuICAgIH1cbiAgICBpZiAoIWZpZWxkLnJlcXVpcmVkKSB7XG4gICAgICBmcy5vcHRpb25hbCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBmcy5vcHRpb25hbCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC51bmlxdWUpIHtcbiAgICAgIGZzLnVuaXF1ZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5vbWl0KSB7XG4gICAgICBmcy5hdXRvZm9ybS5vbWl0ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmdyb3VwKSB7XG4gICAgICBmcy5hdXRvZm9ybS5ncm91cCA9IGZpZWxkLmdyb3VwO1xuICAgIH1cbiAgICBpZiAoZmllbGQuaXNfd2lkZSkge1xuICAgICAgZnMuYXV0b2Zvcm0uaXNfd2lkZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWVsZC5oaWRkZW4pIHtcbiAgICAgIGZzLmF1dG9mb3JtLnR5cGUgPSBcImhpZGRlblwiO1xuICAgIH1cbiAgICBpZiAoKGZpZWxkLnR5cGUgPT09IFwic2VsZWN0XCIpIHx8IChmaWVsZC50eXBlID09PSBcImxvb2t1cFwiKSB8fCAoZmllbGQudHlwZSA9PT0gXCJtYXN0ZXJfZGV0YWlsXCIpKSB7XG4gICAgICBpZiAodHlwZW9mIGZpZWxkLmZpbHRlcmFibGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZpZWxkLmZpbHRlcmFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmllbGQubmFtZSA9PT0gJ25hbWUnIHx8IGZpZWxkLmlzX25hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgZmllbGQuc2VhcmNoYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZmllbGQuc2VhcmNoYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdXRvZm9ybV90eXBlKSB7XG4gICAgICBmcy5hdXRvZm9ybS50eXBlID0gYXV0b2Zvcm1fdHlwZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiBDcmVhdG9yLkZvcm11bGFyLmNoZWNrRm9ybXVsYShmaWVsZC5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGZzLmF1dG9mb3JtLmRlZmF1bHRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBDcmVhdG9yLkZvcm11bGFyLnJ1bihmaWVsZC5kZWZhdWx0VmFsdWUsIHtcbiAgICAgICAgICAgIHVzZXJJZDogTWV0ZW9yLnVzZXJJZCgpLFxuICAgICAgICAgICAgc3BhY2VJZDogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLFxuICAgICAgICAgICAgbm93OiBuZXcgRGF0ZSgpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcy5hdXRvZm9ybS5kZWZhdWx0VmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWVsZC5yZWFkb25seSkge1xuICAgICAgZnMuYXV0b2Zvcm0ucmVhZG9ubHkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGQuZGlzYWJsZWQpIHtcbiAgICAgIGZzLmF1dG9mb3JtLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZpZWxkLmlubGluZUhlbHBUZXh0KSB7XG4gICAgICBmcy5hdXRvZm9ybS5pbmxpbmVIZWxwVGV4dCA9IGZpZWxkLmlubGluZUhlbHBUZXh0O1xuICAgIH1cbiAgICBpZiAoZmllbGQuYmxhY2tib3gpIHtcbiAgICAgIGZzLmJsYWNrYm94ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKF8uaGFzKGZpZWxkLCAnbWluJykpIHtcbiAgICAgIGZzLm1pbiA9IGZpZWxkLm1pbjtcbiAgICB9XG4gICAgaWYgKF8uaGFzKGZpZWxkLCAnbWF4JykpIHtcbiAgICAgIGZzLm1heCA9IGZpZWxkLm1heDtcbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1Byb2R1Y3Rpb24pIHtcbiAgICAgIGlmIChmaWVsZC5pbmRleCkge1xuICAgICAgICBmcy5pbmRleCA9IGZpZWxkLmluZGV4O1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5zb3J0YWJsZSkge1xuICAgICAgICBmcy5pbmRleCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzY2hlbWFbZmllbGRfbmFtZV0gPSBmcztcbiAgfSk7XG4gIHJldHVybiBzY2hlbWE7XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkRGlzcGxheVZhbHVlID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKSB7XG4gIHZhciBmaWVsZCwgaHRtbCwgb2JqZWN0O1xuICBodG1sID0gZmllbGRfdmFsdWU7XG4gIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBmaWVsZCA9IG9iamVjdC5maWVsZHMoZmllbGRfbmFtZSk7XG4gIGlmICghZmllbGQpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBpZiAoZmllbGQudHlwZSA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgaHRtbCA9IG1vbWVudCh0aGlzLnZhbCkuZm9ybWF0KCdZWVlZLU1NLUREIEg6bW0nKTtcbiAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSBcImRhdGVcIikge1xuICAgIGh0bWwgPSBtb21lbnQodGhpcy52YWwpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICB9XG4gIHJldHVybiBodG1sO1xufTtcblxuQ3JlYXRvci5jaGVja0ZpZWxkVHlwZVN1cHBvcnRCZXR3ZWVuUXVlcnkgPSBmdW5jdGlvbihmaWVsZF90eXBlKSB7XG4gIHJldHVybiBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJ0aW1lXCIsIFwiY3VycmVuY3lcIiwgXCJudW1iZXJcIl0uaW5jbHVkZXMoZmllbGRfdHlwZSk7XG59O1xuXG5DcmVhdG9yLnB1c2hCZXR3ZWVuQnVpbHRpbk9wdGlvbmFscyA9IGZ1bmN0aW9uKGZpZWxkX3R5cGUsIG9wZXJhdGlvbnMpIHtcbiAgdmFyIGJ1aWx0aW5WYWx1ZXM7XG4gIGJ1aWx0aW5WYWx1ZXMgPSBDcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVzKGZpZWxkX3R5cGUpO1xuICBpZiAoYnVpbHRpblZhbHVlcykge1xuICAgIHJldHVybiBfLmZvckVhY2goYnVpbHRpblZhbHVlcywgZnVuY3Rpb24oYnVpbHRpbkl0ZW0sIGtleSkge1xuICAgICAgcmV0dXJuIG9wZXJhdGlvbnMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBidWlsdGluSXRlbS5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5WYWx1ZXMgPSBmdW5jdGlvbihmaWVsZF90eXBlLCBpc19jaGVja19vbmx5KSB7XG4gIGlmIChbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIl0uaW5jbHVkZXMoZmllbGRfdHlwZSkpIHtcbiAgICByZXR1cm4gQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXMoaXNfY2hlY2tfb25seSwgZmllbGRfdHlwZSk7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0QmV0d2VlbkJ1aWx0aW5WYWx1ZUl0ZW0gPSBmdW5jdGlvbihmaWVsZF90eXBlLCBrZXkpIHtcbiAgaWYgKFtcImRhdGVcIiwgXCJkYXRldGltZVwiXS5pbmNsdWRlcyhmaWVsZF90eXBlKSkge1xuICAgIHJldHVybiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBrZXkpO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEJldHdlZW5CdWlsdGluT3BlcmF0aW9uID0gZnVuY3Rpb24oZmllbGRfdHlwZSwgdmFsdWUpIHtcbiAgdmFyIGJldHdlZW5CdWlsdGluVmFsdWVzLCByZXN1bHQ7XG4gIGlmICghXy5pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYmV0d2VlbkJ1aWx0aW5WYWx1ZXMgPSBDcmVhdG9yLmdldEJldHdlZW5CdWlsdGluVmFsdWVzKGZpZWxkX3R5cGUpO1xuICBpZiAoIWJldHdlZW5CdWlsdGluVmFsdWVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc3VsdCA9IG51bGw7XG4gIF8uZWFjaChiZXR3ZWVuQnVpbHRpblZhbHVlcywgZnVuY3Rpb24oaXRlbSwgb3BlcmF0aW9uKSB7XG4gICAgaWYgKGl0ZW0ua2V5ID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdCA9IG9wZXJhdGlvbjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZXMgPSBmdW5jdGlvbihpc19jaGVja19vbmx5LCBmaWVsZF90eXBlKSB7XG4gIHJldHVybiB7XG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF95ZWFyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0X3llYXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdGhpc195ZWFyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0aGlzX3llYXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF95ZWFyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0X3llYXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF9xdWFydGVyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0X3F1YXJ0ZXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdGhpc19xdWFydGVyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0aGlzX3F1YXJ0ZXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF9xdWFydGVyXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0X3F1YXJ0ZXJcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF9tb250aFwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwibGFzdF9tb250aFwiKSxcbiAgICBcImJldHdlZW5fdGltZV90aGlzX21vbnRoXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0aGlzX21vbnRoXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX25leHRfbW9udGhcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfbW9udGhcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbGFzdF93ZWVrXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0X3dlZWtcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdGhpc193ZWVrXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJ0aGlzX3dlZWtcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfbmV4dF93ZWVrXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0X3dlZWtcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfeWVzdGRheVwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwieWVzdGRheVwiKSxcbiAgICBcImJldHdlZW5fdGltZV90b2RheVwiOiBpc19jaGVja19vbmx5ID8gdHJ1ZSA6IENyZWF0b3IuZ2V0QmV0d2VlblRpbWVCdWlsdGluVmFsdWVJdGVtKGZpZWxkX3R5cGUsIFwidG9kYXlcIiksXG4gICAgXCJiZXR3ZWVuX3RpbWVfdG9tb3Jyb3dcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcInRvbW9ycm93XCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX2xhc3RfN19kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzdfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9sYXN0XzMwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfMzBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9sYXN0XzYwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfNjBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9sYXN0XzkwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcImxhc3RfOTBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9sYXN0XzEyMF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJsYXN0XzEyMF9kYXlzXCIpLFxuICAgIFwiYmV0d2Vlbl90aW1lX25leHRfN19kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzdfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0XzMwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfMzBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0XzYwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfNjBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0XzkwX2RheXNcIjogaXNfY2hlY2tfb25seSA/IHRydWUgOiBDcmVhdG9yLmdldEJldHdlZW5UaW1lQnVpbHRpblZhbHVlSXRlbShmaWVsZF90eXBlLCBcIm5leHRfOTBfZGF5c1wiKSxcbiAgICBcImJldHdlZW5fdGltZV9uZXh0XzEyMF9kYXlzXCI6IGlzX2NoZWNrX29ubHkgPyB0cnVlIDogQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0oZmllbGRfdHlwZSwgXCJuZXh0XzEyMF9kYXlzXCIpXG4gIH07XG59O1xuXG5DcmVhdG9yLmdldFF1YXJ0ZXJTdGFydE1vbnRoID0gZnVuY3Rpb24obW9udGgpIHtcbiAgaWYgKCFtb250aCkge1xuICAgIG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpO1xuICB9XG4gIGlmIChtb250aCA8IDMpIHtcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIGlmIChtb250aCA8IDYpIHtcbiAgICByZXR1cm4gMztcbiAgfSBlbHNlIGlmIChtb250aCA8IDkpIHtcbiAgICByZXR1cm4gNjtcbiAgfVxuICByZXR1cm4gOTtcbn07XG5cbkNyZWF0b3IuZ2V0TGFzdFF1YXJ0ZXJGaXJzdERheSA9IGZ1bmN0aW9uKHllYXIsIG1vbnRoKSB7XG4gIGlmICgheWVhcikge1xuICAgIHllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gIH1cbiAgaWYgKCFtb250aCkge1xuICAgIG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpO1xuICB9XG4gIGlmIChtb250aCA8IDMpIHtcbiAgICB5ZWFyLS07XG4gICAgbW9udGggPSA5O1xuICB9IGVsc2UgaWYgKG1vbnRoIDwgNikge1xuICAgIG1vbnRoID0gMDtcbiAgfSBlbHNlIGlmIChtb250aCA8IDkpIHtcbiAgICBtb250aCA9IDM7XG4gIH0gZWxzZSB7XG4gICAgbW9udGggPSA2O1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG59O1xuXG5DcmVhdG9yLmdldE5leHRRdWFydGVyRmlyc3REYXkgPSBmdW5jdGlvbih5ZWFyLCBtb250aCkge1xuICBpZiAoIXllYXIpIHtcbiAgICB5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICB9XG4gIGlmICghbW9udGgpIHtcbiAgICBtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcbiAgfVxuICBpZiAobW9udGggPCAzKSB7XG4gICAgbW9udGggPSAzO1xuICB9IGVsc2UgaWYgKG1vbnRoIDwgNikge1xuICAgIG1vbnRoID0gNjtcbiAgfSBlbHNlIGlmIChtb250aCA8IDkpIHtcbiAgICBtb250aCA9IDk7XG4gIH0gZWxzZSB7XG4gICAgeWVhcisrO1xuICAgIG1vbnRoID0gMDtcbiAgfVxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xufTtcblxuQ3JlYXRvci5nZXRNb250aERheXMgPSBmdW5jdGlvbih5ZWFyLCBtb250aCkge1xuICB2YXIgZGF5cywgZW5kRGF0ZSwgbWlsbGlzZWNvbmQsIHN0YXJ0RGF0ZTtcbiAgaWYgKG1vbnRoID09PSAxMSkge1xuICAgIHJldHVybiAzMTtcbiAgfVxuICBtaWxsaXNlY29uZCA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG4gIHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgZW5kRGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMSk7XG4gIGRheXMgPSAoZW5kRGF0ZSAtIHN0YXJ0RGF0ZSkgLyBtaWxsaXNlY29uZDtcbiAgcmV0dXJuIGRheXM7XG59O1xuXG5DcmVhdG9yLmdldExhc3RNb250aEZpcnN0RGF5ID0gZnVuY3Rpb24oeWVhciwgbW9udGgpIHtcbiAgaWYgKCF5ZWFyKSB7XG4gICAgeWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgfVxuICBpZiAoIW1vbnRoKSB7XG4gICAgbW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XG4gIH1cbiAgaWYgKG1vbnRoID09PSAwKSB7XG4gICAgbW9udGggPSAxMTtcbiAgICB5ZWFyLS07XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgfVxuICBtb250aC0tO1xuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xufTtcblxuQ3JlYXRvci5nZXRCZXR3ZWVuVGltZUJ1aWx0aW5WYWx1ZUl0ZW0gPSBmdW5jdGlvbihmaWVsZF90eXBlLCBrZXkpIHtcbiAgdmFyIGN1cnJlbnRNb250aCwgY3VycmVudFllYXIsIGVuZFZhbHVlLCBmaXJzdERheSwgbGFiZWwsIGxhc3REYXksIGxhc3RNb25kYXksIGxhc3RNb250aEZpbmFsRGF5LCBsYXN0TW9udGhGaXJzdERheSwgbGFzdFF1YXJ0ZXJFbmREYXksIGxhc3RRdWFydGVyU3RhcnREYXksIGxhc3RTdW5kYXksIGxhc3RfMTIwX2RheXMsIGxhc3RfMzBfZGF5cywgbGFzdF82MF9kYXlzLCBsYXN0XzdfZGF5cywgbGFzdF85MF9kYXlzLCBtaWxsaXNlY29uZCwgbWludXNEYXksIG1vbmRheSwgbW9udGgsIG5leHRNb25kYXksIG5leHRNb250aEZpbmFsRGF5LCBuZXh0TW9udGhGaXJzdERheSwgbmV4dFF1YXJ0ZXJFbmREYXksIG5leHRRdWFydGVyU3RhcnREYXksIG5leHRTdW5kYXksIG5leHRZZWFyLCBuZXh0XzEyMF9kYXlzLCBuZXh0XzMwX2RheXMsIG5leHRfNjBfZGF5cywgbmV4dF83X2RheXMsIG5leHRfOTBfZGF5cywgbm93LCBwcmV2aW91c1llYXIsIHN0YXJ0VmFsdWUsIHN0ckVuZERheSwgc3RyRmlyc3REYXksIHN0ckxhc3REYXksIHN0ck1vbmRheSwgc3RyU3RhcnREYXksIHN0clN1bmRheSwgc3RyVG9kYXksIHN0clRvbW9ycm93LCBzdHJZZXN0ZGF5LCBzdW5kYXksIHRoaXNRdWFydGVyRW5kRGF5LCB0aGlzUXVhcnRlclN0YXJ0RGF5LCB0b21vcnJvdywgdmFsdWVzLCB3ZWVrLCB5ZWFyLCB5ZXN0ZGF5O1xuICBub3cgPSBuZXcgRGF0ZSgpO1xuICBtaWxsaXNlY29uZCA9IDEwMDAgKiA2MCAqIDYwICogMjQ7XG4gIHllc3RkYXkgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gbWlsbGlzZWNvbmQpO1xuICB0b21vcnJvdyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBtaWxsaXNlY29uZCk7XG4gIHdlZWsgPSBub3cuZ2V0RGF5KCk7XG4gIG1pbnVzRGF5ID0gd2VlayAhPT0gMCA/IHdlZWsgLSAxIDogNjtcbiAgbW9uZGF5ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIChtaW51c0RheSAqIG1pbGxpc2Vjb25kKSk7XG4gIHN1bmRheSA9IG5ldyBEYXRlKG1vbmRheS5nZXRUaW1lKCkgKyAoNiAqIG1pbGxpc2Vjb25kKSk7XG4gIGxhc3RTdW5kYXkgPSBuZXcgRGF0ZShtb25kYXkuZ2V0VGltZSgpIC0gbWlsbGlzZWNvbmQpO1xuICBsYXN0TW9uZGF5ID0gbmV3IERhdGUobGFzdFN1bmRheS5nZXRUaW1lKCkgLSAobWlsbGlzZWNvbmQgKiA2KSk7XG4gIG5leHRNb25kYXkgPSBuZXcgRGF0ZShzdW5kYXkuZ2V0VGltZSgpICsgbWlsbGlzZWNvbmQpO1xuICBuZXh0U3VuZGF5ID0gbmV3IERhdGUobmV4dE1vbmRheS5nZXRUaW1lKCkgKyAobWlsbGlzZWNvbmQgKiA2KSk7XG4gIGN1cnJlbnRZZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gIHByZXZpb3VzWWVhciA9IGN1cnJlbnRZZWFyIC0gMTtcbiAgbmV4dFllYXIgPSBjdXJyZW50WWVhciArIDE7XG4gIGN1cnJlbnRNb250aCA9IG5vdy5nZXRNb250aCgpO1xuICB5ZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gIG1vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gIGZpcnN0RGF5ID0gbmV3IERhdGUoY3VycmVudFllYXIsIGN1cnJlbnRNb250aCwgMSk7XG4gIGlmIChjdXJyZW50TW9udGggPT09IDExKSB7XG4gICAgeWVhcisrO1xuICAgIG1vbnRoKys7XG4gIH0gZWxzZSB7XG4gICAgbW9udGgrKztcbiAgfVxuICBuZXh0TW9udGhGaXJzdERheSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcbiAgbmV4dE1vbnRoRmluYWxEYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgQ3JlYXRvci5nZXRNb250aERheXMoeWVhciwgbW9udGgpKTtcbiAgbGFzdERheSA9IG5ldyBEYXRlKG5leHRNb250aEZpcnN0RGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKTtcbiAgbGFzdE1vbnRoRmlyc3REYXkgPSBDcmVhdG9yLmdldExhc3RNb250aEZpcnN0RGF5KGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgpO1xuICBsYXN0TW9udGhGaW5hbERheSA9IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSAtIG1pbGxpc2Vjb25kKTtcbiAgdGhpc1F1YXJ0ZXJTdGFydERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBDcmVhdG9yLmdldFF1YXJ0ZXJTdGFydE1vbnRoKGN1cnJlbnRNb250aCksIDEpO1xuICB0aGlzUXVhcnRlckVuZERheSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyLCBDcmVhdG9yLmdldFF1YXJ0ZXJTdGFydE1vbnRoKGN1cnJlbnRNb250aCkgKyAyLCBDcmVhdG9yLmdldE1vbnRoRGF5cyhjdXJyZW50WWVhciwgQ3JlYXRvci5nZXRRdWFydGVyU3RhcnRNb250aChjdXJyZW50TW9udGgpICsgMikpO1xuICBsYXN0UXVhcnRlclN0YXJ0RGF5ID0gQ3JlYXRvci5nZXRMYXN0UXVhcnRlckZpcnN0RGF5KGN1cnJlbnRZZWFyLCBjdXJyZW50TW9udGgpO1xuICBsYXN0UXVhcnRlckVuZERheSA9IG5ldyBEYXRlKGxhc3RRdWFydGVyU3RhcnREYXkuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydERheS5nZXRNb250aCgpICsgMiwgQ3JlYXRvci5nZXRNb250aERheXMobGFzdFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLCBsYXN0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkgKyAyKSk7XG4gIG5leHRRdWFydGVyU3RhcnREYXkgPSBDcmVhdG9yLmdldE5leHRRdWFydGVyRmlyc3REYXkoY3VycmVudFllYXIsIGN1cnJlbnRNb250aCk7XG4gIG5leHRRdWFydGVyRW5kRGF5ID0gbmV3IERhdGUobmV4dFF1YXJ0ZXJTdGFydERheS5nZXRGdWxsWWVhcigpLCBuZXh0UXVhcnRlclN0YXJ0RGF5LmdldE1vbnRoKCkgKyAyLCBDcmVhdG9yLmdldE1vbnRoRGF5cyhuZXh0UXVhcnRlclN0YXJ0RGF5LmdldEZ1bGxZZWFyKCksIG5leHRRdWFydGVyU3RhcnREYXkuZ2V0TW9udGgoKSArIDIpKTtcbiAgbGFzdF83X2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDYgKiBtaWxsaXNlY29uZCkpO1xuICBsYXN0XzMwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpIC0gKDI5ICogbWlsbGlzZWNvbmQpKTtcbiAgbGFzdF82MF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICg1OSAqIG1pbGxpc2Vjb25kKSk7XG4gIGxhc3RfOTBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgLSAoODkgKiBtaWxsaXNlY29uZCkpO1xuICBsYXN0XzEyMF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtICgxMTkgKiBtaWxsaXNlY29uZCkpO1xuICBuZXh0XzdfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoNiAqIG1pbGxpc2Vjb25kKSk7XG4gIG5leHRfMzBfZGF5cyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAoMjkgKiBtaWxsaXNlY29uZCkpO1xuICBuZXh0XzYwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDU5ICogbWlsbGlzZWNvbmQpKTtcbiAgbmV4dF85MF9kYXlzID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArICg4OSAqIG1pbGxpc2Vjb25kKSk7XG4gIG5leHRfMTIwX2RheXMgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgKDExOSAqIG1pbGxpc2Vjb25kKSk7XG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBcImxhc3RfeWVhclwiOlxuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF95ZWFyXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHByZXZpb3VzWWVhciArIFwiLTAxLTAxVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUocHJldmlvdXNZZWFyICsgXCItMTItMzFUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRoaXNfeWVhclwiOlxuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fdGhpc195ZWFyXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKGN1cnJlbnRZZWFyICsgXCItMDEtMDFUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShjdXJyZW50WWVhciArIFwiLTEyLTMxVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0X3llYXJcIjpcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfeWVhclwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShuZXh0WWVhciArIFwiLTAxLTAxVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUobmV4dFllYXIgKyBcIi0xMi0zMVQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibGFzdF9xdWFydGVyXCI6XG4gICAgICBzdHJGaXJzdERheSA9IG1vbWVudChsYXN0UXVhcnRlclN0YXJ0RGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyTGFzdERheSA9IG1vbWVudChsYXN0UXVhcnRlckVuZERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfcXVhcnRlclwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJGaXJzdERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyTGFzdERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0aGlzX3F1YXJ0ZXJcIjpcbiAgICAgIHN0ckZpcnN0RGF5ID0gbW9tZW50KHRoaXNRdWFydGVyU3RhcnREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJMYXN0RGF5ID0gbW9tZW50KHRoaXNRdWFydGVyRW5kRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fdGhpc19xdWFydGVyXCIpO1xuICAgICAgc3RhcnRWYWx1ZSA9IG5ldyBEYXRlKHN0ckZpcnN0RGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJMYXN0RGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfcXVhcnRlclwiOlxuICAgICAgc3RyRmlyc3REYXkgPSBtb21lbnQobmV4dFF1YXJ0ZXJTdGFydERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckxhc3REYXkgPSBtb21lbnQobmV4dFF1YXJ0ZXJFbmREYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0X3F1YXJ0ZXJcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyRmlyc3REYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckxhc3REYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibGFzdF9tb250aFwiOlxuICAgICAgc3RyRmlyc3REYXkgPSBtb21lbnQobGFzdE1vbnRoRmlyc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJMYXN0RGF5ID0gbW9tZW50KGxhc3RNb250aEZpbmFsRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF9tb250aFwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJGaXJzdERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyTGFzdERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0aGlzX21vbnRoXCI6XG4gICAgICBzdHJGaXJzdERheSA9IG1vbWVudChmaXJzdERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckxhc3REYXkgPSBtb21lbnQobGFzdERheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfbW9udGhcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyRmlyc3REYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0ckxhc3REYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmV4dF9tb250aFwiOlxuICAgICAgc3RyRmlyc3REYXkgPSBtb21lbnQobmV4dE1vbnRoRmlyc3REYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJMYXN0RGF5ID0gbW9tZW50KG5leHRNb250aEZpbmFsRGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF9tb250aFwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJGaXJzdERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyTGFzdERheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJsYXN0X3dlZWtcIjpcbiAgICAgIHN0ck1vbmRheSA9IG1vbWVudChsYXN0TW9uZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyU3VuZGF5ID0gbW9tZW50KGxhc3RTdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0X3dlZWtcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyTW9uZGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJTdW5kYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidGhpc193ZWVrXCI6XG4gICAgICBzdHJNb25kYXkgPSBtb21lbnQobW9uZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyU3VuZGF5ID0gbW9tZW50KHN1bmRheSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX3RoaXNfd2Vla1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJNb25kYXkgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0clN1bmRheSArIFwiVDIzOjU5OjU5WlwiKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJuZXh0X3dlZWtcIjpcbiAgICAgIHN0ck1vbmRheSA9IG1vbWVudChuZXh0TW9uZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyU3VuZGF5ID0gbW9tZW50KG5leHRTdW5kYXkpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0X3dlZWtcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyTW9uZGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJTdW5kYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwieWVzdGRheVwiOlxuICAgICAgc3RyWWVzdGRheSA9IG1vbWVudCh5ZXN0ZGF5KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5feWVzdGRheVwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJZZXN0ZGF5ICsgXCJUMDA6MDA6MDBaXCIpO1xuICAgICAgZW5kVmFsdWUgPSBuZXcgRGF0ZShzdHJZZXN0ZGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInRvZGF5XCI6XG4gICAgICBzdHJUb2RheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl90b2RheVwiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJUb2RheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyVG9kYXkgKyBcIlQyMzo1OTo1OVpcIik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidG9tb3Jyb3dcIjpcbiAgICAgIHN0clRvbW9ycm93ID0gbW9tZW50KHRvbW9ycm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fdG9tb3Jyb3dcIik7XG4gICAgICBzdGFydFZhbHVlID0gbmV3IERhdGUoc3RyVG9tb3Jyb3cgKyBcIlQwMDowMDowMFpcIik7XG4gICAgICBlbmRWYWx1ZSA9IG5ldyBEYXRlKHN0clRvbW9ycm93ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfN19kYXlzXCI6XG4gICAgICBzdHJTdGFydERheSA9IG1vbWVudChsYXN0XzdfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9sYXN0XzdfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfMzBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF8zMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfMzBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfNjBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF82MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfNjBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfOTBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobGFzdF85MF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX2xhc3RfOTBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImxhc3RfMTIwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KGxhc3RfMTIwX2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJFbmREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbGFzdF8xMjBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfN19kYXlzXCI6XG4gICAgICBzdHJTdGFydERheSA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBzdHJFbmREYXkgPSBtb21lbnQobmV4dF83X2RheXMpLmZvcm1hdChcIllZWVktTU0tRERcIik7XG4gICAgICBsYWJlbCA9IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fYmV0d2Vlbl9uZXh0XzdfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfMzBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5leHRfMzBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfMzBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfNjBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5leHRfNjBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfNjBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfOTBfZGF5c1wiOlxuICAgICAgc3RyU3RhcnREYXkgPSBtb21lbnQobm93KS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgc3RyRW5kRGF5ID0gbW9tZW50KG5leHRfOTBfZGF5cykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIGxhYmVsID0gdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuX25leHRfOTBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5leHRfMTIwX2RheXNcIjpcbiAgICAgIHN0clN0YXJ0RGF5ID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgIHN0ckVuZERheSA9IG1vbWVudChuZXh0XzEyMF9kYXlzKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuICAgICAgbGFiZWwgPSB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2JldHdlZW5fbmV4dF8xMjBfZGF5c1wiKTtcbiAgICAgIHN0YXJ0VmFsdWUgPSBuZXcgRGF0ZShzdHJTdGFydERheSArIFwiVDAwOjAwOjAwWlwiKTtcbiAgICAgIGVuZFZhbHVlID0gbmV3IERhdGUoc3RyRW5kRGF5ICsgXCJUMjM6NTk6NTlaXCIpO1xuICB9XG4gIHZhbHVlcyA9IFtzdGFydFZhbHVlLCBlbmRWYWx1ZV07XG4gIGlmIChmaWVsZF90eXBlID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICBfLmZvckVhY2godmFsdWVzLCBmdW5jdGlvbihmdikge1xuICAgICAgaWYgKGZ2KSB7XG4gICAgICAgIHJldHVybiBmdi5zZXRIb3Vycyhmdi5nZXRIb3VycygpICsgZnYuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGxhYmVsOiBsYWJlbCxcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZXM6IHZhbHVlc1xuICB9O1xufTtcblxuQ3JlYXRvci5nZXRGaWVsZERlZmF1bHRPcGVyYXRpb24gPSBmdW5jdGlvbihmaWVsZF90eXBlKSB7XG4gIGlmIChmaWVsZF90eXBlICYmIENyZWF0b3IuY2hlY2tGaWVsZFR5cGVTdXBwb3J0QmV0d2VlblF1ZXJ5KGZpZWxkX3R5cGUpKSB7XG4gICAgcmV0dXJuICdiZXR3ZWVuJztcbiAgfSBlbHNlIGlmIChbXCJ0ZXh0YXJlYVwiLCBcInRleHRcIiwgXCJjb2RlXCJdLmluY2x1ZGVzKGZpZWxkX3R5cGUpKSB7XG4gICAgcmV0dXJuICdjb250YWlucyc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiPVwiO1xuICB9XG59O1xuXG5DcmVhdG9yLmdldEZpZWxkT3BlcmF0aW9uID0gZnVuY3Rpb24oZmllbGRfdHlwZSkge1xuICB2YXIgb3BlcmF0aW9ucywgb3B0aW9uYWxzO1xuICBvcHRpb25hbHMgPSB7XG4gICAgZXF1YWw6IHtcbiAgICAgIGxhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX2VxdWFsXCIpLFxuICAgICAgdmFsdWU6IFwiPVwiXG4gICAgfSxcbiAgICB1bmVxdWFsOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl91bmVxdWFsXCIpLFxuICAgICAgdmFsdWU6IFwiPD5cIlxuICAgIH0sXG4gICAgbGVzc190aGFuOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9sZXNzX3RoYW5cIiksXG4gICAgICB2YWx1ZTogXCI8XCJcbiAgICB9LFxuICAgIGdyZWF0ZXJfdGhhbjoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fZ3JlYXRlcl90aGFuXCIpLFxuICAgICAgdmFsdWU6IFwiPlwiXG4gICAgfSxcbiAgICBsZXNzX29yX2VxdWFsOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9sZXNzX29yX2VxdWFsXCIpLFxuICAgICAgdmFsdWU6IFwiPD1cIlxuICAgIH0sXG4gICAgZ3JlYXRlcl9vcl9lcXVhbDoge1xuICAgICAgbGFiZWw6IHQoXCJjcmVhdG9yX2ZpbHRlcl9vcGVyYXRpb25fZ3JlYXRlcl9vcl9lcXVhbFwiKSxcbiAgICAgIHZhbHVlOiBcIj49XCJcbiAgICB9LFxuICAgIGNvbnRhaW5zOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9jb250YWluc1wiKSxcbiAgICAgIHZhbHVlOiBcImNvbnRhaW5zXCJcbiAgICB9LFxuICAgIG5vdF9jb250YWluOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9kb2VzX25vdF9jb250YWluXCIpLFxuICAgICAgdmFsdWU6IFwibm90Y29udGFpbnNcIlxuICAgIH0sXG4gICAgc3RhcnRzX3dpdGg6IHtcbiAgICAgIGxhYmVsOiB0KFwiY3JlYXRvcl9maWx0ZXJfb3BlcmF0aW9uX3N0YXJ0c193aXRoXCIpLFxuICAgICAgdmFsdWU6IFwic3RhcnRzd2l0aFwiXG4gICAgfSxcbiAgICBiZXR3ZWVuOiB7XG4gICAgICBsYWJlbDogdChcImNyZWF0b3JfZmlsdGVyX29wZXJhdGlvbl9iZXR3ZWVuXCIpLFxuICAgICAgdmFsdWU6IFwiYmV0d2VlblwiXG4gICAgfVxuICB9O1xuICBpZiAoZmllbGRfdHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIF8udmFsdWVzKG9wdGlvbmFscyk7XG4gIH1cbiAgb3BlcmF0aW9ucyA9IFtdO1xuICBpZiAoQ3JlYXRvci5jaGVja0ZpZWxkVHlwZVN1cHBvcnRCZXR3ZWVuUXVlcnkoZmllbGRfdHlwZSkpIHtcbiAgICBvcGVyYXRpb25zLnB1c2gob3B0aW9uYWxzLmJldHdlZW4pO1xuICAgIENyZWF0b3IucHVzaEJldHdlZW5CdWlsdGluT3B0aW9uYWxzKGZpZWxkX3R5cGUsIG9wZXJhdGlvbnMpO1xuICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT09IFwidGV4dFwiIHx8IGZpZWxkX3R5cGUgPT09IFwidGV4dGFyZWFcIiB8fCBmaWVsZF90eXBlID09PSBcImh0bWxcIiB8fCBmaWVsZF90eXBlID09PSBcImNvZGVcIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuY29udGFpbnMpO1xuICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT09IFwibG9va3VwXCIgfHwgZmllbGRfdHlwZSA9PT0gXCJtYXN0ZXJfZGV0YWlsXCIgfHwgZmllbGRfdHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcImN1cnJlbmN5XCIgfHwgZmllbGRfdHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsLCBvcHRpb25hbHMubGVzc190aGFuLCBvcHRpb25hbHMuZ3JlYXRlcl90aGFuLCBvcHRpb25hbHMubGVzc19vcl9lcXVhbCwgb3B0aW9uYWxzLmdyZWF0ZXJfb3JfZXF1YWwpO1xuICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgb3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpO1xuICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKTtcbiAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09PSBcIlt0ZXh0XVwiKSB7XG4gICAgb3BlcmF0aW9ucy5wdXNoKG9wdGlvbmFscy5lcXVhbCwgb3B0aW9uYWxzLnVuZXF1YWwpO1xuICB9IGVsc2Uge1xuICAgIG9wZXJhdGlvbnMucHVzaChvcHRpb25hbHMuZXF1YWwsIG9wdGlvbmFscy51bmVxdWFsKTtcbiAgfVxuICByZXR1cm4gb3BlcmF0aW9ucztcbn07XG5cblxuLypcbiAgICDlhYjmjInnhafmnInmjpLluo/lj7fnmoTlsI/nmoTlnKjliY3vvIzlpKfnmoTlnKjlkI5cbiAgICDlho3lsIbmsqHmnInmjpLluo/lj7fnmoTmmL7npLrlnKhcbiAqL1xuXG5DcmVhdG9yLmdldE9iamVjdEZpZWxkc05hbWUgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICB2YXIgZmllbGRzLCBmaWVsZHNBcnIsIGZpZWxkc05hbWUsIHJlZjtcbiAgZmllbGRzID0gKHJlZiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKSkgIT0gbnVsbCA/IHJlZi5maWVsZHMgOiB2b2lkIDA7XG4gIGZpZWxkc0FyciA9IFtdO1xuICBfLmVhY2goZmllbGRzLCBmdW5jdGlvbihmaWVsZCkge1xuICAgIHJldHVybiBmaWVsZHNBcnIucHVzaCh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgc29ydF9ubzogZmllbGQuc29ydF9ub1xuICAgIH0pO1xuICB9KTtcbiAgZmllbGRzTmFtZSA9IFtdO1xuICBfLmVhY2goXy5zb3J0QnkoZmllbGRzQXJyLCBcInNvcnRfbm9cIiksIGZ1bmN0aW9uKGZpZWxkKSB7XG4gICAgcmV0dXJuIGZpZWxkc05hbWUucHVzaChmaWVsZC5uYW1lKTtcbiAgfSk7XG4gIHJldHVybiBmaWVsZHNOYW1lO1xufTtcbiIsIkNyZWF0b3IuX3RyaWdnZXJfaG9va3MgPSB7fVxuXG5pbml0VHJpZ2dlciA9IChvYmplY3RfbmFtZSwgdHJpZ2dlciktPlxuXHR0cnlcblx0XHRjb2xsZWN0aW9uID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKG9iamVjdF9uYW1lKVxuXHRcdGlmICF0cmlnZ2VyLnRvZG9cblx0XHRcdHJldHVyblxuXHRcdHRvZG9XcmFwcGVyID0gKCktPlxuXHRcdFx0ICB0aGlzLm9iamVjdF9uYW1lID0gb2JqZWN0X25hbWVcblx0XHRcdCAgcmV0dXJuIHRyaWdnZXIudG9kby5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG5cdFx0aWYgdHJpZ2dlci53aGVuID09IFwiYmVmb3JlLmluc2VydFwiXG5cdFx0XHQgIHJldHVybiBjb2xsZWN0aW9uPy5iZWZvcmU/Lmluc2VydCh0b2RvV3JhcHBlcilcblx0XHQgIGVsc2UgaWYgdHJpZ2dlci53aGVuID09IFwiYmVmb3JlLnVwZGF0ZVwiXG5cdFx0XHQgIHJldHVybiBjb2xsZWN0aW9uPy5iZWZvcmU/LnVwZGF0ZSh0b2RvV3JhcHBlcilcblx0XHQgIGVsc2UgaWYgdHJpZ2dlci53aGVuID09IFwiYmVmb3JlLnJlbW92ZVwiXG5cdFx0XHQgIHJldHVybiBjb2xsZWN0aW9uPy5iZWZvcmU/LnJlbW92ZSh0b2RvV3JhcHBlcilcblx0XHQgIGVsc2UgaWYgdHJpZ2dlci53aGVuID09IFwiYWZ0ZXIuaW5zZXJ0XCJcblx0XHRcdCAgcmV0dXJuIGNvbGxlY3Rpb24/LmFmdGVyPy5pbnNlcnQodG9kb1dyYXBwZXIpXG5cdFx0ICBlbHNlIGlmIHRyaWdnZXIud2hlbiA9PSBcImFmdGVyLnVwZGF0ZVwiXG5cdFx0XHQgIHJldHVybiBjb2xsZWN0aW9uPy5hZnRlcj8udXBkYXRlKHRvZG9XcmFwcGVyKVxuXHRcdCAgZWxzZSBpZiB0cmlnZ2VyLndoZW4gPT0gXCJhZnRlci5yZW1vdmVcIlxuXHRcdFx0ICByZXR1cm4gY29sbGVjdGlvbj8uYWZ0ZXI/LnJlbW92ZSh0b2RvV3JhcHBlcilcblx0Y2F0Y2ggZXJyb3Jcblx0XHRjb25zb2xlLmVycm9yKCdpbml0VHJpZ2dlciBlcnJvcicsIGVycm9yKVxuXG5jbGVhblRyaWdnZXIgPSAob2JqZWN0X25hbWUpLT5cblx0IyMjXG4gICAgXHTnlLHkuo5jb2xsZWN0aW9uLWhvb2tzIHBhY2thZ2Ug55qEcmVtb3Zl5Ye95pWw5piv5L2/55So5LiL5qCH5Yig6Zmk5a+56LGh55qE77yM5omA5Lul5q2k5aSE5Y+N6L2saG9va3Ppm4blkIjlkI7vvIzlho3liKDpmaRcbiAgICBcdOWboOS4uuS4gOS4quaVsOe7hOWFg+e0oOWIoOmZpOWQju+8jOWFtuS7luWFg+e0oOeahOS4i+agh+S8muWPkeeUn+WPmOWMllxuXHQjIyNcbiAgICAjVE9ETyDnlLHkuo5jb2xsZWN0aW9uLWhvb2tzIHBhY2thZ2Ug55qEcmVtb3Zl5Ye95pWwYnVnXG5cdENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdPy5yZXZlcnNlKCkuZm9yRWFjaCAoX2hvb2spLT5cblx0XHRfaG9vay5yZW1vdmUoKVxuXG5DcmVhdG9yLmluaXRUcmlnZ2VycyA9IChvYmplY3RfbmFtZSktPlxuI1x0Y29uc29sZS5sb2coJ0NyZWF0b3IuaW5pdFRyaWdnZXJzIG9iamVjdF9uYW1lJywgb2JqZWN0X25hbWUpXG5cdG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXG5cdGNsZWFuVHJpZ2dlcihvYmplY3RfbmFtZSlcblxuXHRDcmVhdG9yLl90cmlnZ2VyX2hvb2tzW29iamVjdF9uYW1lXSA9IFtdXG5cblx0Xy5lYWNoIG9iai50cmlnZ2VycywgKHRyaWdnZXIsIHRyaWdnZXJfbmFtZSktPlxuXHRcdGlmIE1ldGVvci5pc1NlcnZlciBhbmQgdHJpZ2dlci5vbiA9PSBcInNlcnZlclwiIGFuZCB0cmlnZ2VyLnRvZG8gYW5kIHRyaWdnZXIud2hlblxuXHRcdFx0X3RyaWdnZXJfaG9vayA9IGluaXRUcmlnZ2VyIG9iamVjdF9uYW1lLCB0cmlnZ2VyXG5cdFx0XHRpZiBfdHJpZ2dlcl9ob29rXG5cdFx0XHRcdENyZWF0b3IuX3RyaWdnZXJfaG9va3Nbb2JqZWN0X25hbWVdLnB1c2goX3RyaWdnZXJfaG9vaylcblx0XHRpZiBNZXRlb3IuaXNDbGllbnQgYW5kIHRyaWdnZXIub24gPT0gXCJjbGllbnRcIiBhbmQgdHJpZ2dlci50b2RvIGFuZCB0cmlnZ2VyLndoZW5cblx0XHRcdF90cmlnZ2VyX2hvb2sgPSBpbml0VHJpZ2dlciBvYmplY3RfbmFtZSwgdHJpZ2dlclxuXHRcdFx0Q3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0ucHVzaChfdHJpZ2dlcl9ob29rKSIsInZhciBjbGVhblRyaWdnZXIsIGluaXRUcmlnZ2VyO1xuXG5DcmVhdG9yLl90cmlnZ2VyX2hvb2tzID0ge307XG5cbmluaXRUcmlnZ2VyID0gZnVuY3Rpb24ob2JqZWN0X25hbWUsIHRyaWdnZXIpIHtcbiAgdmFyIGNvbGxlY3Rpb24sIGVycm9yLCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHRvZG9XcmFwcGVyO1xuICB0cnkge1xuICAgIGNvbGxlY3Rpb24gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24ob2JqZWN0X25hbWUpO1xuICAgIGlmICghdHJpZ2dlci50b2RvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRvZG9XcmFwcGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLm9iamVjdF9uYW1lID0gb2JqZWN0X25hbWU7XG4gICAgICByZXR1cm4gdHJpZ2dlci50b2RvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBpZiAodHJpZ2dlci53aGVuID09PSBcImJlZm9yZS5pbnNlcnRcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWYgPSBjb2xsZWN0aW9uLmJlZm9yZSkgIT0gbnVsbCA/IHJlZi5pbnNlcnQodG9kb1dyYXBwZXIpIDogdm9pZCAwIDogdm9pZCAwO1xuICAgIH0gZWxzZSBpZiAodHJpZ2dlci53aGVuID09PSBcImJlZm9yZS51cGRhdGVcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWYxID0gY29sbGVjdGlvbi5iZWZvcmUpICE9IG51bGwgPyByZWYxLnVwZGF0ZSh0b2RvV3JhcHBlcikgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyLndoZW4gPT09IFwiYmVmb3JlLnJlbW92ZVwiKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbiAhPSBudWxsID8gKHJlZjIgPSBjb2xsZWN0aW9uLmJlZm9yZSkgIT0gbnVsbCA/IHJlZjIucmVtb3ZlKHRvZG9XcmFwcGVyKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXIud2hlbiA9PT0gXCJhZnRlci5pbnNlcnRcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWYzID0gY29sbGVjdGlvbi5hZnRlcikgIT0gbnVsbCA/IHJlZjMuaW5zZXJ0KHRvZG9XcmFwcGVyKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXIud2hlbiA9PT0gXCJhZnRlci51cGRhdGVcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWY0ID0gY29sbGVjdGlvbi5hZnRlcikgIT0gbnVsbCA/IHJlZjQudXBkYXRlKHRvZG9XcmFwcGVyKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXIud2hlbiA9PT0gXCJhZnRlci5yZW1vdmVcIikge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gIT0gbnVsbCA/IChyZWY1ID0gY29sbGVjdGlvbi5hZnRlcikgIT0gbnVsbCA/IHJlZjUucmVtb3ZlKHRvZG9XcmFwcGVyKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIGVycm9yID0gZXJyb3IxO1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdpbml0VHJpZ2dlciBlcnJvcicsIGVycm9yKTtcbiAgfVxufTtcblxuY2xlYW5UcmlnZ2VyID0gZnVuY3Rpb24ob2JqZWN0X25hbWUpIHtcblxuICAvKlxuICAgICBcdOeUseS6jmNvbGxlY3Rpb24taG9va3MgcGFja2FnZSDnmoRyZW1vdmXlh73mlbDmmK/kvb/nlKjkuIvmoIfliKDpmaTlr7nosaHnmoTvvIzmiYDku6XmraTlpITlj43ovaxob29rc+mbhuWQiOWQju+8jOWGjeWIoOmZpFxuICAgICBcdOWboOS4uuS4gOS4quaVsOe7hOWFg+e0oOWIoOmZpOWQju+8jOWFtuS7luWFg+e0oOeahOS4i+agh+S8muWPkeeUn+WPmOWMllxuICAgKi9cbiAgdmFyIHJlZjtcbiAgcmV0dXJuIChyZWYgPSBDcmVhdG9yLl90cmlnZ2VyX2hvb2tzW29iamVjdF9uYW1lXSkgIT0gbnVsbCA/IHJlZi5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihfaG9vaykge1xuICAgIHJldHVybiBfaG9vay5yZW1vdmUoKTtcbiAgfSkgOiB2b2lkIDA7XG59O1xuXG5DcmVhdG9yLmluaXRUcmlnZ2VycyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gIHZhciBvYmo7XG4gIG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgY2xlYW5UcmlnZ2VyKG9iamVjdF9uYW1lKTtcbiAgQ3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0gPSBbXTtcbiAgcmV0dXJuIF8uZWFjaChvYmoudHJpZ2dlcnMsIGZ1bmN0aW9uKHRyaWdnZXIsIHRyaWdnZXJfbmFtZSkge1xuICAgIHZhciBfdHJpZ2dlcl9ob29rO1xuICAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIgJiYgdHJpZ2dlci5vbiA9PT0gXCJzZXJ2ZXJcIiAmJiB0cmlnZ2VyLnRvZG8gJiYgdHJpZ2dlci53aGVuKSB7XG4gICAgICBfdHJpZ2dlcl9ob29rID0gaW5pdFRyaWdnZXIob2JqZWN0X25hbWUsIHRyaWdnZXIpO1xuICAgICAgaWYgKF90cmlnZ2VyX2hvb2spIHtcbiAgICAgICAgQ3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0ucHVzaChfdHJpZ2dlcl9ob29rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCAmJiB0cmlnZ2VyLm9uID09PSBcImNsaWVudFwiICYmIHRyaWdnZXIudG9kbyAmJiB0cmlnZ2VyLndoZW4pIHtcbiAgICAgIF90cmlnZ2VyX2hvb2sgPSBpbml0VHJpZ2dlcihvYmplY3RfbmFtZSwgdHJpZ2dlcik7XG4gICAgICByZXR1cm4gQ3JlYXRvci5fdHJpZ2dlcl9ob29rc1tvYmplY3RfbmFtZV0ucHVzaChfdHJpZ2dlcl9ob29rKTtcbiAgICB9XG4gIH0pO1xufTtcbiIsImNsb25lID0gcmVxdWlyZSgnY2xvbmUnKVxuXG5iYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wTmFtZXMgPSBbXCJhbGxvd0NyZWF0ZVwiLCBcImFsbG93RGVsZXRlXCIsIFwiYWxsb3dFZGl0XCIsIFwiYWxsb3dSZWFkXCIsIFwibW9kaWZ5QWxsUmVjb3Jkc1wiLCBcInZpZXdBbGxSZWNvcmRzXCIsIFwibW9kaWZ5Q29tcGFueVJlY29yZHNcIiwgXCJ2aWV3Q29tcGFueVJlY29yZHNcIiwgXG5cdFwiYWxsb3dSZWFkRmlsZXNcIiwgXCJhbGxvd0VkaXRGaWxlc1wiLCBcImFsbG93Q3JlYXRlRmlsZXNcIiwgXCJhbGxvd0RlbGV0ZUZpbGVzXCIsIFwidmlld0FsbEZpbGVzXCIsIFwibW9kaWZ5QWxsRmlsZXNcIl0gXG5vdGhlclBlcm1pc3Npb25Qcm9wTmFtZXMgPSBbXCJkaXNhYmxlZF9saXN0X3ZpZXdzXCIsIFwiZGlzYWJsZWRfYWN0aW9uc1wiLCBcInVucmVhZGFibGVfZmllbGRzXCIsIFwidW5lZGl0YWJsZV9maWVsZHNcIiwgXCJ1bnJlbGF0ZWRfb2JqZWN0c1wiLCBcInVuZWRpdGFibGVfcmVsYXRlZF9saXN0XCJdXG5wZXJtaXNzaW9uUHJvcE5hbWVzID0gXy51bmlvbiBiYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wTmFtZXMsIG90aGVyUGVybWlzc2lvblByb3BOYW1lc1xuXG5DcmVhdG9yLmdldFBlcm1pc3Npb25zID0gKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpLT5cblx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0aWYgIW9iamVjdF9uYW1lXG5cdFx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRvYmogPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0XHRpZiAhb2JqXG5cdFx0XHRyZXR1cm5cblx0XHRyZXR1cm4gb2JqLnBlcm1pc3Npb25zLmdldCgpXG5cdGVsc2UgaWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0Q3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyhzcGFjZUlkLCB1c2VySWQsIG9iamVjdF9uYW1lKVxuXG5DcmVhdG9yLmdldFJlY29yZFBlcm1pc3Npb25zID0gKG9iamVjdF9uYW1lLCByZWNvcmQsIHVzZXJJZCwgc3BhY2VJZCktPlxuXHRpZiAhb2JqZWN0X25hbWUgYW5kIE1ldGVvci5pc0NsaWVudFxuXHRcdG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXG5cdGlmICFzcGFjZUlkIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG5cdFxuXHQjIOmZhOS7tuadg+mZkOS4jeWGjeS4juWFtueItuiusOW9lee8lui+kemFjee9ruWFs+iBlFxuXHQjIGlmIHJlY29yZCBhbmQgb2JqZWN0X25hbWUgPT0gXCJjbXNfZmlsZXNcIiBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdCMgXHQjIOWmguaenOaYr2Ntc19maWxlc+mZhOS7tu+8jOWImeadg+mZkOWPluWFtueItuiusOW9leadg+mZkFxuXHQjIFx0aWYgb2JqZWN0X25hbWUgPT0gU2Vzc2lvbi5nZXQoJ29iamVjdF9uYW1lJylcblx0IyBcdFx0IyDlvZPliY3lpITkuo5jbXNfZmlsZXPpmYTku7bor6bnu4bnlYzpnaJcblx0IyBcdFx0b2JqZWN0X25hbWUgPSByZWNvcmQucGFyZW50WydyZWZlcmVuY2VfdG8uX28nXTtcblx0IyBcdFx0cmVjb3JkX2lkID0gcmVjb3JkLnBhcmVudC5faWQ7XG5cdCMgXHRlbHNlIFxuXHQjIFx0XHQjIOW9k+WJjeWkhOS6jmNtc19maWxlc+mZhOS7tueahOeItuiusOW9leeVjOmdolxuXHQjIFx0XHRvYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KCdvYmplY3RfbmFtZScpO1xuXHQjIFx0XHRyZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKTtcblx0IyBcdG9iamVjdF9maWVsZHNfa2V5cyA9IF8ua2V5cyhDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSwgc3BhY2VJZCk/LmZpZWxkcyBvciB7fSkgfHwgW107XG5cdCMgXHRzZWxlY3QgPSBfLmludGVyc2VjdGlvbihvYmplY3RfZmllbGRzX2tleXMsIFsnb3duZXInLCAnY29tcGFueV9pZCcsICdjb21wYW55X2lkcycsICdsb2NrZWQnXSkgfHwgW107XG5cdCMgXHRpZiBzZWxlY3QubGVuZ3RoID4gMFxuXHQjIFx0XHRyZWNvcmQgPSBDcmVhdG9yLmdldE9iamVjdFJlY29yZChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBzZWxlY3Quam9pbignLCcpKTtcblx0IyBcdGVsc2Vcblx0IyBcdFx0cmVjb3JkID0gbnVsbDtcblxuXHRwZXJtaXNzaW9ucyA9IF8uY2xvbmUoQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyhvYmplY3RfbmFtZSwgc3BhY2VJZCwgdXNlcklkKSlcblxuXHRpZiByZWNvcmRcblx0XHRpZiAhXy5pc0VtcHR5KHJlY29yZC5yZWNvcmRfcGVybWlzc2lvbnMpXG5cdFx0XHRyZXR1cm4gcmVjb3JkLnJlY29yZF9wZXJtaXNzaW9uc1xuXG5cdFx0aXNPd25lciA9IHJlY29yZC5vd25lciA9PSB1c2VySWQgfHwgcmVjb3JkLm93bmVyPy5faWQgPT0gdXNlcklkXG5cblx0XHRpZiBvYmplY3RfbmFtZSA9PSBcImNtc19maWxlc1wiXG5cdFx0XHQjIOmZhOS7tueahOafpeeci+aJgOacieS/ruaUueaJgOacieadg+mZkOS4jumZhOS7tuWvueixoeeahHZpZXdBbGxSZWNvcmRz44CBbW9kaWZ5QWxsUmVjb3Jkc+aXoOWFs++8jOWPquS4juWFtuS4u+ihqOiusOW9leeahHZpZXdBbGxGaWxlc+WSjG1vZGlmeUFsbEZpbGVz5pyJ5YWzXG5cdFx0XHQjIOWmguaenOaYr2Ntc19maWxlc+mZhOS7tu+8jOWImeadg+mZkOmcgOimgemineWkluiAg+iZkeWFtueItuWvueixoeS4iuWFs+S6jumZhOS7tueahOadg+mZkOmFjee9rlxuXHRcdFx0bWFzdGVyT2JqZWN0TmFtZSA9IHJlY29yZC5wYXJlbnRbJ3JlZmVyZW5jZV90by5fbyddO1xuXHRcdFx0bWFzdGVyUmVjb3JkUGVybSA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMobWFzdGVyT2JqZWN0TmFtZSwgc3BhY2VJZCwgdXNlcklkKVxuXHRcdFx0cGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgPSBwZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93Q3JlYXRlRmlsZXNcblx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IHBlcm1pc3Npb25zLmFsbG93RWRpdCAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RWRpdEZpbGVzXG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IHBlcm1pc3Npb25zLmFsbG93RGVsZXRlICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dEZWxldGVGaWxlc1xuXHRcdFx0aWYgIW1hc3RlclJlY29yZFBlcm0ubW9kaWZ5QWxsRmlsZXMgYW5kICFpc093bmVyXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2Vcblx0XHRcdHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IHBlcm1pc3Npb25zLmFsbG93UmVhZCAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93UmVhZEZpbGVzXG5cdFx0XHRpZiAhbWFzdGVyUmVjb3JkUGVybS52aWV3QWxsRmlsZXMgYW5kICFpc093bmVyXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlXG5cdFx0ZWxzZVxuXHRcdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRcdHVzZXJfY29tcGFueV9pZHMgPSBTdGVlZG9zLmdldFVzZXJDb21wYW55SWRzKClcblx0XHRcdGVsc2Vcblx0XHRcdFx0dXNlcl9jb21wYW55X2lkcyA9IENyZWF0b3IuZ2V0VXNlckNvbXBhbnlJZHModXNlcklkLCBzcGFjZUlkKVxuXHRcdFx0cmVjb3JkX2NvbXBhbnlfaWQgPSByZWNvcmQ/LmNvbXBhbnlfaWRcblx0XHRcdGlmIHJlY29yZF9jb21wYW55X2lkIGFuZCBfLmlzT2JqZWN0KHJlY29yZF9jb21wYW55X2lkKSBhbmQgcmVjb3JkX2NvbXBhbnlfaWQuX2lkXG5cdFx0XHRcdCMg5ZugcmVjb3JkX2NvbXBhbnlfaWTmmK9sb29rdXDnsbvlnovvvIzmnInlj6/og71keOaOp+S7tuS8muaKiuWug+aYoOWwhOi9rOS4uuWvueW6lOeahG9iamVjdO+8jOaJgOS7pei/memHjOWPluWHuuWFtl9pZOWAvFxuXHRcdFx0XHRyZWNvcmRfY29tcGFueV9pZCA9IHJlY29yZF9jb21wYW55X2lkLl9pZFxuXHRcdFx0cmVjb3JkX2NvbXBhbnlfaWRzID0gcmVjb3JkPy5jb21wYW55X2lkc1xuXHRcdFx0aWYgcmVjb3JkX2NvbXBhbnlfaWRzIGFuZCByZWNvcmRfY29tcGFueV9pZHMubGVuZ3RoIGFuZCBfLmlzT2JqZWN0KHJlY29yZF9jb21wYW55X2lkc1swXSlcblx0XHRcdFx0IyDlm6ByZWNvcmRfY29tcGFueV9pZHPmmK9sb29rdXDnsbvlnovvvIzmnInlj6/og71keOaOp+S7tuS8muaKiuWug+aYoOWwhOi9rOS4uuWvueW6lOeahFtvYmplY3Rd77yM5omA5Lul6L+Z6YeM5Y+W5Ye65YW2X2lk5YC8XG5cdFx0XHRcdHJlY29yZF9jb21wYW55X2lkcyA9IHJlY29yZF9jb21wYW55X2lkcy5tYXAoKG4pLT4gbi5faWQpXG5cdFx0XHRyZWNvcmRfY29tcGFueV9pZHMgPSBfLnVuaW9uKHJlY29yZF9jb21wYW55X2lkcywgW3JlY29yZF9jb21wYW55X2lkXSlcblx0XHRcdGlmICFwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzIGFuZCAhaXNPd25lciBhbmQgIXBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2Vcblx0XHRcdGVsc2UgaWYgIXBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgYW5kIHBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzXG5cdFx0XHRcdGlmIHJlY29yZF9jb21wYW55X2lkcyBhbmQgcmVjb3JkX2NvbXBhbnlfaWRzLmxlbmd0aFxuXHRcdFx0XHRcdGlmIHVzZXJfY29tcGFueV9pZHMgYW5kIHVzZXJfY29tcGFueV9pZHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRpZiAhXy5pbnRlcnNlY3Rpb24odXNlcl9jb21wYW55X2lkcywgcmVjb3JkX2NvbXBhbnlfaWRzKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0IyDorrDlvZXnmoRjb21wYW55X2lkL2NvbXBhbnlfaWRz5bGe5oCn5LiN5Zyo5b2T5YmN55So5oi3dXNlcl9jb21wYW55X2lkc+iMg+WbtOWGheaXtu+8jOiupOS4uuaXoOadg+S/ruaUuVxuXHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZVxuXHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0IyDorrDlvZXmnIljb21wYW55X2lkL2NvbXBhbnlfaWRz5bGe5oCn77yM5L2G5piv5b2T5YmN55So5oi3dXNlcl9jb21wYW55X2lkc+S4uuepuuaXtu+8jOiupOS4uuaXoOadg+S/ruaUuVxuXHRcdFx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2Vcblx0XHRcdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2Vcblx0XHRcdFxuXHRcdFx0aWYgcmVjb3JkLmxvY2tlZCBhbmQgIXBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHNcblx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2Vcblx0XHRcdFx0cGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZVxuXG5cdFx0XHRpZiAhcGVybWlzc2lvbnMudmlld0FsbFJlY29yZHMgYW5kICFpc093bmVyIGFuZCAhcGVybWlzc2lvbnMudmlld0NvbXBhbnlSZWNvcmRzXG5cdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlXG5cdFx0XHRlbHNlIGlmICFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyBhbmQgcGVybWlzc2lvbnMudmlld0NvbXBhbnlSZWNvcmRzXG5cdFx0XHRcdGlmIHJlY29yZF9jb21wYW55X2lkcyBhbmQgcmVjb3JkX2NvbXBhbnlfaWRzLmxlbmd0aFxuXHRcdFx0XHRcdGlmIHVzZXJfY29tcGFueV9pZHMgYW5kIHVzZXJfY29tcGFueV9pZHMubGVuZ3RoXG5cdFx0XHRcdFx0XHRpZiAhXy5pbnRlcnNlY3Rpb24odXNlcl9jb21wYW55X2lkcywgcmVjb3JkX2NvbXBhbnlfaWRzKS5sZW5ndGhcblx0XHRcdFx0XHRcdFx0IyDorrDlvZXnmoRjb21wYW55X2lkL2NvbXBhbnlfaWRz5bGe5oCn5LiN5Zyo5b2T5YmN55So5oi3dXNlcl9jb21wYW55X2lkc+iMg+WbtOWGheaXtu+8jOiupOS4uuaXoOadg+afpeeci1xuXHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBmYWxzZVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdCMg6K6w5b2V5pyJY29tcGFueV9pZOWxnuaAp++8jOS9huaYr+W9k+WJjeeUqOaIt3VzZXJfY29tcGFueV9pZHPkuLrnqbrml7bvvIzorqTkuLrml6DmnYPmn6XnnItcblx0XHRcdFx0XHRcdHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlXG5cdFxuXHRyZXR1cm4gcGVybWlzc2lvbnNcblxuXG4jIGN1cnJlbnRPYmplY3ROYW1l77ya5b2T5YmN5Li75a+56LGhXG4jIHJlbGF0ZWRMaXN0SXRlbe+8mkNyZWF0b3IuZ2V0UmVsYXRlZExpc3QoU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKSwgU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIikp5Lit5Y+WcmVsYXRlZF9vYmplY3RfbmFtZeWvueW6lOeahOWAvFxuIyBjdXJyZW50UmVjb3Jk5b2T5YmN5Li75a+56LGh55qE6K+m57uG6K6w5b2VXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0Q3JlYXRvci5nZXRSZWNvcmRSZWxhdGVkTGlzdFBlcm1pc3Npb25zID0gKGN1cnJlbnRPYmplY3ROYW1lLCByZWxhdGVkTGlzdEl0ZW0sIGN1cnJlbnRSZWNvcmQsIHVzZXJJZCwgc3BhY2VJZCktPlxuXHRcdGlmICFjdXJyZW50T2JqZWN0TmFtZSBhbmQgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRjdXJyZW50T2JqZWN0TmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblxuXHRcdGlmICFyZWxhdGVkTGlzdEl0ZW1cblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJyZWxhdGVkTGlzdEl0ZW0gbXVzdCBub3QgYmUgZW1wdHkgZm9yIHRoZSBmdW5jdGlvbiBDcmVhdG9yLmdldFJlY29yZFJlbGF0ZWRMaXN0UGVybWlzc2lvbnNcIik7XG5cdFx0XHRyZXR1cm4ge31cblxuXHRcdGlmICFjdXJyZW50UmVjb3JkIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGN1cnJlbnRSZWNvcmQgPSBDcmVhdG9yLmdldE9iamVjdFJlY29yZCgpXG5cblx0XHRpZiAhdXNlcklkIGFuZCBNZXRlb3IuaXNDbGllbnRcblx0XHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXG5cdFx0aWYgIXNwYWNlSWQgYW5kIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuXG5cdFx0bWFzdGVyUmVjb3JkUGVybSA9IENyZWF0b3IuZ2V0UmVjb3JkUGVybWlzc2lvbnMoY3VycmVudE9iamVjdE5hbWUsIGN1cnJlbnRSZWNvcmQsIHVzZXJJZCwgc3BhY2VJZClcblx0XHRyZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKHJlbGF0ZWRMaXN0SXRlbS5vYmplY3RfbmFtZSlcblx0XHRyZXN1bHQgPSBfLmNsb25lIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9uc1xuXG5cdFx0aWYgcmVsYXRlZExpc3RJdGVtLmlzX2ZpbGVcblx0XHRcdHJlc3VsdC5hbGxvd0NyZWF0ZSA9IHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93Q3JlYXRlRmlsZXNcblx0XHRcdHJlc3VsdC5hbGxvd0VkaXQgPSByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dFZGl0ICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dFZGl0RmlsZXNcblx0XHRlbHNlXG5cdFx0XHR3cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCA9IHJlbGF0ZWRMaXN0SXRlbS53cml0ZV9yZXF1aXJlc19tYXN0ZXJfcmVhZCB8fCBmYWxzZVxuXHRcdFx0bWFzdGVyQWxsb3cgPSBmYWxzZVxuXHRcdFx0aWYgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPT0gdHJ1ZVxuXHRcdFx0XHRtYXN0ZXJBbGxvdyA9IG1hc3RlclJlY29yZFBlcm0uYWxsb3dSZWFkXG5cdFx0XHRlbHNlIGlmIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID09IGZhbHNlXG5cdFx0XHRcdG1hc3RlckFsbG93ID0gbWFzdGVyUmVjb3JkUGVybS5hbGxvd0VkaXRcblxuXHRcdFx0dW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QgPSBDcmVhdG9yLmdldFJlY29yZFNhZmVSZWxhdGVkTGlzdChjdXJyZW50UmVjb3JkLCBjdXJyZW50T2JqZWN0TmFtZSlcblx0XHRcdGlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZSA9IHVuZWRpdGFibGVfcmVsYXRlZF9saXN0LmluZGV4T2YocmVsYXRlZExpc3RJdGVtLm9iamVjdF9uYW1lKSA+IC0xXG5cblx0XHRcdHJlc3VsdC5hbGxvd0NyZWF0ZSA9IG1hc3RlckFsbG93ICYmIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSAmJiAhaXNSZWxhdGVPYmplY3RVbmVkaXRhYmxlXG5cdFx0XHRyZXN1bHQuYWxsb3dFZGl0ID0gbWFzdGVyQWxsb3cgJiYgcmVsYXRlZE9iamVjdFBlcm1pc3Npb25zLmFsbG93RWRpdCAmJiAhaXNSZWxhdGVPYmplY3RVbmVkaXRhYmxlXG5cdFx0cmV0dXJuIHJlc3VsdFxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcblxuXHRDcmVhdG9yLmdldEFsbFBlcm1pc3Npb25zID0gKHNwYWNlSWQsIHVzZXJJZCkgLT5cblx0XHRwZXJtaXNzaW9ucyA9XG5cdFx0XHRvYmplY3RzOiB7fVxuXHRcdFx0YXNzaWduZWRfYXBwczogW11cblx0XHQjIyNcblx0XHTmnYPpmZDpm4bor7TmmI46XG5cdFx05YaF572u5p2D6ZmQ6ZuGLWFkbWluLHVzZXIsbWVtYmVyLGd1ZXN0LHdvcmtmbG93X2FkbWluLG9yZ2FuaXphdGlvbl9hZG1pblxuXHRcdOiHquWumuS5ieadg+mZkOmbhi3mlbDmja7lupPkuK3mlrDlu7rnmoTpmaTlhoXnva7mnYPpmZDpm4bku6XlpJbnmoTlhbbku5bmnYPpmZDpm4Zcblx0XHTnibnlrprnlKjmiLfpm4blkIjmnYPpmZDpm4bvvIjljbN1c2Vyc+WxnuaAp+S4jeWPr+mFjee9ru+8iS1hZG1pbix1c2VyLG1lbWJlcixndWVzdFxuXHRcdOWPr+mFjee9rueUqOaIt+mbhuWQiOadg+mZkOmbhu+8iOWNs3VzZXJz5bGe5oCn5Y+v6YWN572u77yJLXdvcmtmbG93X2FkbWluLG9yZ2FuaXphdGlvbl9hZG1pbuS7peWPiuiHquWumuS5ieadg+mZkOmbhlxuXHRcdCMjI1xuXG5cdFx0aXNTcGFjZUFkbWluID0gZmFsc2Vcblx0XHRzcGFjZVVzZXIgPSBudWxsXG5cdFx0aWYgdXNlcklkXG5cdFx0XHRpc1NwYWNlQWRtaW4gPSBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpXG5cdFx0XHRzcGFjZVVzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHsgc3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZCB9LCB7IGZpZWxkczogeyBwcm9maWxlOiAxIH0gfSlcblxuXHRcdHBzZXRzQWRtaW4gPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2FkbWluJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSkgfHwgbnVsbFxuXHRcdHBzZXRzVXNlciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAndXNlcid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pIHx8IG51bGxcblx0XHRwc2V0c01lbWJlciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnbWVtYmVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSkgfHwgbnVsbFxuXHRcdHBzZXRzR3Vlc3QgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2d1ZXN0J30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSkgfHwgbnVsbFxuXG5cdFx0cHNldHNTdXBwbGllciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnc3VwcGxpZXInfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KSB8fCBudWxsXG5cdFx0cHNldHNDdXN0b21lciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnY3VzdG9tZXInfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KSB8fCBudWxsXG5cdFx0aWYgc3BhY2VVc2VyICYmIHNwYWNlVXNlci5wcm9maWxlXG5cdFx0XHRwc2V0c0N1cnJlbnQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtzcGFjZTogc3BhY2VJZCwgJG9yOiBbe3VzZXJzOiB1c2VySWR9LCB7bmFtZTogc3BhY2VVc2VyLnByb2ZpbGV9XX0sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjEsIG5hbWU6MX19KS5mZXRjaCgpXG5cdFx0ZWxzZVxuXHRcdFx0cHNldHNDdXJyZW50ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7dXNlcnM6IHVzZXJJZCwgc3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxLCBuYW1lOjF9fSkuZmV0Y2goKVxuXG5cdFx0cHNldHNBZG1pbl9wb3MgPSBudWxsXG5cdFx0cHNldHNVc2VyX3BvcyA9IG51bGxcblx0XHRwc2V0c01lbWJlcl9wb3MgPSBudWxsXG5cdFx0cHNldHNHdWVzdF9wb3MgPSBudWxsXG5cdFx0cHNldHNDdXJyZW50X3BvcyA9IG51bGxcblx0XHRwc2V0c1N1cHBsaWVyX3BvcyA9IG51bGxcblx0XHRwc2V0c0N1c3RvbWVyX3BvcyA9IG51bGxcblxuXHRcdGlmIHBzZXRzQWRtaW4/Ll9pZFxuXHRcdFx0cHNldHNBZG1pbl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzQWRtaW4uX2lkfSwge2ZpZWxkczoge2NyZWF0ZWQ6IDAsIG1vZGlmaWVkOiAwLCBjcmVhdGVkX2J5OiAwLCBtb2RpZmllZF9ieTogMH19KS5mZXRjaCgpXG5cdFx0aWYgcHNldHNVc2VyPy5faWRcblx0XHRcdHBzZXRzVXNlcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzVXNlci5faWR9LCB7ZmllbGRzOiB7Y3JlYXRlZDogMCwgbW9kaWZpZWQ6IDAsIGNyZWF0ZWRfYnk6IDAsIG1vZGlmaWVkX2J5OiAwfX0pLmZldGNoKClcblx0XHRpZiBwc2V0c01lbWJlcj8uX2lkXG5cdFx0XHRwc2V0c01lbWJlcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzTWVtYmVyLl9pZH0sIHtmaWVsZHM6IHtjcmVhdGVkOiAwLCBtb2RpZmllZDogMCwgY3JlYXRlZF9ieTogMCwgbW9kaWZpZWRfYnk6IDB9fSkuZmV0Y2goKVxuXHRcdGlmIHBzZXRzR3Vlc3Q/Ll9pZFxuXHRcdFx0cHNldHNHdWVzdF9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7cGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzR3Vlc3QuX2lkfSwge2ZpZWxkczoge2NyZWF0ZWQ6IDAsIG1vZGlmaWVkOiAwLCBjcmVhdGVkX2J5OiAwLCBtb2RpZmllZF9ieTogMH19KS5mZXRjaCgpXG5cdFx0aWYgcHNldHNTdXBwbGllcj8uX2lkXG5cdFx0XHRwc2V0c1N1cHBsaWVyX3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtwZXJtaXNzaW9uX3NldF9pZDogcHNldHNTdXBwbGllci5faWR9LCB7ZmllbGRzOiB7Y3JlYXRlZDogMCwgbW9kaWZpZWQ6IDAsIGNyZWF0ZWRfYnk6IDAsIG1vZGlmaWVkX2J5OiAwfX0pLmZldGNoKClcblx0XHRpZiBwc2V0c0N1c3RvbWVyPy5faWRcblx0XHRcdHBzZXRzQ3VzdG9tZXJfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe3Blcm1pc3Npb25fc2V0X2lkOiBwc2V0c0N1c3RvbWVyLl9pZH0sIHtmaWVsZHM6IHtjcmVhdGVkOiAwLCBtb2RpZmllZDogMCwgY3JlYXRlZF9ieTogMCwgbW9kaWZpZWRfYnk6IDB9fSkuZmV0Y2goKVxuXG5cdFx0aWYgcHNldHNDdXJyZW50Lmxlbmd0aCA+IDBcblx0XHRcdHNldF9pZHMgPSBfLnBsdWNrIHBzZXRzQ3VycmVudCwgXCJfaWRcIlxuXHRcdFx0cHNldHNDdXJyZW50X3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtwZXJtaXNzaW9uX3NldF9pZDogeyRpbjogc2V0X2lkc319KS5mZXRjaCgpXG5cdFx0XHRwc2V0c0N1cnJlbnROYW1lcyA9IF8ucGx1Y2sgcHNldHNDdXJyZW50LCBcIm5hbWVcIlxuXHRcdHBzZXRzID0ge1xuXHRcdFx0cHNldHNBZG1pbiwgXG5cdFx0XHRwc2V0c1VzZXIsIFxuXHRcdFx0cHNldHNDdXJyZW50LCBcblx0XHRcdHBzZXRzTWVtYmVyLCBcblx0XHRcdHBzZXRzR3Vlc3QsXG5cdFx0XHRwc2V0c1N1cHBsaWVyLFxuXHRcdFx0cHNldHNDdXN0b21lcixcblx0XHRcdGlzU3BhY2VBZG1pbixcblx0XHRcdHNwYWNlVXNlciwgXG5cdFx0XHRwc2V0c0FkbWluX3BvcywgXG5cdFx0XHRwc2V0c1VzZXJfcG9zLCBcblx0XHRcdHBzZXRzTWVtYmVyX3BvcywgXG5cdFx0XHRwc2V0c0d1ZXN0X3Bvcyxcblx0XHRcdHBzZXRzU3VwcGxpZXJfcG9zLFxuXHRcdFx0cHNldHNDdXN0b21lcl9wb3MsXG5cdFx0XHRwc2V0c0N1cnJlbnRfcG9zXG5cdFx0fVxuXHRcdHBlcm1pc3Npb25zLmFzc2lnbmVkX2FwcHMgPSBDcmVhdG9yLmdldEFzc2lnbmVkQXBwcy5iaW5kKHBzZXRzKShzcGFjZUlkLCB1c2VySWQpXG5cdFx0cGVybWlzc2lvbnMuYXNzaWduZWRfbWVudXMgPSBDcmVhdG9yLmdldEFzc2lnbmVkTWVudXMuYmluZChwc2V0cykoc3BhY2VJZCwgdXNlcklkKVxuXHRcdHBlcm1pc3Npb25zLnVzZXJfcGVybWlzc2lvbl9zZXRzID0gcHNldHNDdXJyZW50TmFtZXNcblx0XHRfaSA9IDBcblx0XHRfLmVhY2ggQ3JlYXRvci5vYmplY3RzQnlOYW1lLCAob2JqZWN0LCBvYmplY3RfbmFtZSktPlxuXHRcdFx0X2krK1xuXHRcdFx0aWYgIV8uaGFzKG9iamVjdCwgJ3NwYWNlJykgfHwgIW9iamVjdC5zcGFjZSB8fCBvYmplY3Quc3BhY2UgPT0gc3BhY2VJZFxuXHRcdFx0XHRpZiAhXy5oYXMob2JqZWN0LCAnaW5fZGV2ZWxvcG1lbnQnKSB8fCBvYmplY3QuaW5fZGV2ZWxvcG1lbnQgPT0gJzAnIHx8IChvYmplY3QuaW5fZGV2ZWxvcG1lbnQgIT0gJzAnICYmIGlzU3BhY2VBZG1pbilcblx0XHRcdFx0XHRwZXJtaXNzaW9ucy5vYmplY3RzW29iamVjdF9uYW1lXSA9IENyZWF0b3IuY29udmVydE9iamVjdChjbG9uZShDcmVhdG9yLk9iamVjdHNbb2JqZWN0X25hbWVdKSwgc3BhY2VJZClcblx0XHRcdFx0XHRwZXJtaXNzaW9ucy5vYmplY3RzW29iamVjdF9uYW1lXVtcInBlcm1pc3Npb25zXCJdID0gQ3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucy5iaW5kKHBzZXRzKShzcGFjZUlkLCB1c2VySWQsIG9iamVjdF9uYW1lKVxuXHRcdHJldHVybiBwZXJtaXNzaW9uc1xuXG5cdHVuaW9uUGx1cyA9IChhcnJheSwgb3RoZXIpIC0+XG5cdFx0aWYgIWFycmF5IGFuZCAhb3RoZXJcblx0XHRcdHJldHVybiB1bmRlZmluZWRcblx0XHRpZiAhYXJyYXlcblx0XHRcdGFycmF5ID0gW11cblx0XHRpZiAhb3RoZXJcblx0XHRcdG90aGVyID0gW11cblx0XHRyZXR1cm4gXy51bmlvbihhcnJheSwgb3RoZXIpXG5cblx0aW50ZXJzZWN0aW9uUGx1cyA9IChhcnJheSwgb3RoZXIpIC0+XG5cdFx0aWYgIWFycmF5IGFuZCAhb3RoZXJcblx0XHRcdHJldHVybiB1bmRlZmluZWRcblx0XHRpZiAhYXJyYXlcblx0XHRcdGFycmF5ID0gW11cblx0XHRpZiAhb3RoZXJcblx0XHRcdG90aGVyID0gW11cblx0XHRyZXR1cm4gXy5pbnRlcnNlY3Rpb24oYXJyYXksIG90aGVyKVxuXG5cdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyA9ICh0YXJnZXQsIHByb3BzKSAtPlxuXHRcdHByb3BOYW1lcyA9IHBlcm1pc3Npb25Qcm9wTmFtZXNcblx0XHRmaWxlc1Byb05hbWVzID0gXG5cdFx0aWYgcHJvcHNcblx0XHRcdF8uZWFjaCBwcm9wTmFtZXMsIChwcm9wTmFtZSkgLT5cblx0XHRcdFx0dGFyZ2V0W3Byb3BOYW1lXSA9IHByb3BzW3Byb3BOYW1lXVxuXG5cdFx0XHQjIHRhcmdldC5hbGxvd0NyZWF0ZSA9IHByb3BzLmFsbG93Q3JlYXRlXG5cdFx0XHQjIHRhcmdldC5hbGxvd0RlbGV0ZSA9IHByb3BzLmFsbG93RGVsZXRlXG5cdFx0XHQjIHRhcmdldC5hbGxvd0VkaXQgPSBwcm9wcy5hbGxvd0VkaXRcblx0XHRcdCMgdGFyZ2V0LmFsbG93UmVhZCA9IHByb3BzLmFsbG93UmVhZFxuXHRcdFx0IyB0YXJnZXQubW9kaWZ5QWxsUmVjb3JkcyA9IHByb3BzLm1vZGlmeUFsbFJlY29yZHNcblx0XHRcdCMgdGFyZ2V0LnZpZXdBbGxSZWNvcmRzID0gcHJvcHMudmlld0FsbFJlY29yZHNcblx0XHRcdCMgdGFyZ2V0Lm1vZGlmeUNvbXBhbnlSZWNvcmRzID0gcHJvcHMubW9kaWZ5Q29tcGFueVJlY29yZHNcblx0XHRcdCMgdGFyZ2V0LnZpZXdDb21wYW55UmVjb3JkcyA9IHByb3BzLnZpZXdDb21wYW55UmVjb3Jkc1xuXHRcdFx0IyB0YXJnZXQuZGlzYWJsZWRfbGlzdF92aWV3cyA9IHByb3BzLmRpc2FibGVkX2xpc3Rfdmlld3Ncblx0XHRcdCMgdGFyZ2V0LmRpc2FibGVkX2FjdGlvbnMgPSBwcm9wcy5kaXNhYmxlZF9hY3Rpb25zXG5cdFx0XHQjIHRhcmdldC51bnJlYWRhYmxlX2ZpZWxkcyA9IHByb3BzLnVucmVhZGFibGVfZmllbGRzXG5cdFx0XHQjIHRhcmdldC51bmVkaXRhYmxlX2ZpZWxkcyA9IHByb3BzLnVuZWRpdGFibGVfZmllbGRzXG5cdFx0XHQjIHRhcmdldC51bnJlbGF0ZWRfb2JqZWN0cyA9IHByb3BzLnVucmVsYXRlZF9vYmplY3RzXG5cdFx0XHQjIHRhcmdldC51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdCA9IHByb3BzLnVuZWRpdGFibGVfcmVsYXRlZF9saXN0XG5cblx0b3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzID0gKHRhcmdldCwgcHJvcHMpIC0+XG5cdFx0cHJvcE5hbWVzID0gYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzXG5cdFx0Xy5lYWNoIHByb3BOYW1lcywgKHByb3BOYW1lKSAtPlxuXHRcdFx0aWYgcHJvcHNbcHJvcE5hbWVdXG5cdFx0XHRcdHRhcmdldFtwcm9wTmFtZV0gPSB0cnVlXG5cdFx0XG5cdFx0IyBpZiBwby5hbGxvd1JlYWRcblx0XHQjIFx0cGVybWlzc2lvbnMuYWxsb3dSZWFkID0gdHJ1ZVxuXHRcdCMgaWYgcG8uYWxsb3dDcmVhdGVcblx0XHQjIFx0cGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgPSB0cnVlXG5cdFx0IyBpZiBwby5hbGxvd0VkaXRcblx0XHQjIFx0cGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gdHJ1ZVxuXHRcdCMgaWYgcG8uYWxsb3dEZWxldGVcblx0XHQjIFx0cGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSB0cnVlXG5cdFx0IyBpZiBwby5tb2RpZnlBbGxSZWNvcmRzXG5cdFx0IyBcdHBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgPSB0cnVlXG5cdFx0IyBpZiBwby52aWV3QWxsUmVjb3Jkc1xuXHRcdCMgXHRwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyA9IHRydWVcblx0XHQjIGlmIHBvLm1vZGlmeUNvbXBhbnlSZWNvcmRzXG5cdFx0IyBcdHBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzID0gdHJ1ZVxuXHRcdCMgaWYgcG8udmlld0NvbXBhbnlSZWNvcmRzXG5cdFx0IyBcdHBlcm1pc3Npb25zLnZpZXdDb21wYW55UmVjb3JkcyA9IHRydWVcblxuXG5cdENyZWF0b3IuZ2V0QXNzaWduZWRBcHBzID0gKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRcdHBzZXRzQWRtaW4gPSB0aGlzLnBzZXRzQWRtaW4gfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdhZG1pbid9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pXG5cdFx0cHNldHNVc2VyID0gdGhpcy5wc2V0c1VzZXIgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICd1c2VyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSlcblx0XHRwc2V0c1N1cHBsaWVyID0gdGhpcy5wc2V0c01lbWJlciB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ3N1cHBsaWVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSlcblx0XHRwc2V0c0N1c3RvbWVyID0gdGhpcy5wc2V0c0d1ZXN0IHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnY3VzdG9tZXInfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MX19KVxuXHRcdCMgcHNldHNNZW1iZXIgPSB0aGlzLnBzZXRzTWVtYmVyIHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCBuYW1lOiAnbWVtYmVyJ30sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjF9fSlcblx0XHQjIHBzZXRzR3Vlc3QgPSB0aGlzLnBzZXRzR3Vlc3QgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdndWVzdCd9LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxfX0pXG5cdFx0c3BhY2VVc2VyID0gbnVsbDtcblx0XHRpZiB1c2VySWRcblx0XHRcdHNwYWNlVXNlciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoeyBzcGFjZTogc3BhY2VJZCwgdXNlcjogdXNlcklkIH0sIHsgZmllbGRzOiB7IHByb2ZpbGU6IDEgfSB9KVxuXHRcdGlmIHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZVxuXHRcdFx0cHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtzcGFjZTogc3BhY2VJZCwgJG9yOiBbe3VzZXJzOiB1c2VySWR9LCB7bmFtZTogc3BhY2VVc2VyLnByb2ZpbGV9XX0sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjEsIG5hbWU6MX19KS5mZXRjaCgpXG5cdFx0ZWxzZVxuXHRcdFx0cHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHt1c2VyczogdXNlcklkLCBzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6e19pZDoxLCBhc3NpZ25lZF9hcHBzOjEsIG5hbWU6MX19KS5mZXRjaCgpXG5cdFx0aXNTcGFjZUFkbWluID0gaWYgXy5pc0Jvb2xlYW4odGhpcy5pc1NwYWNlQWRtaW4pIHRoZW4gdGhpcy5pc1NwYWNlQWRtaW4gZWxzZSBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpXG5cdFx0YXBwcyA9IFtdXG5cdFx0aWYgaXNTcGFjZUFkbWluXG5cdFx0XHRyZXR1cm4gW11cblx0XHRlbHNlXG5cdFx0XHR1c2VyUHJvZmlsZSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7cHJvZmlsZTogMX19KT8ucHJvZmlsZVxuXHRcdFx0cHNldEJhc2UgPSBwc2V0c1VzZXJcblx0XHRcdGlmIHVzZXJQcm9maWxlXG5cdFx0XHRcdGlmIHVzZXJQcm9maWxlID09ICdzdXBwbGllcidcblx0XHRcdFx0XHRwc2V0QmFzZSA9IHBzZXRzU3VwcGxpZXJcblx0XHRcdFx0ZWxzZSBpZiB1c2VyUHJvZmlsZSA9PSAnY3VzdG9tZXInXG5cdFx0XHRcdFx0cHNldEJhc2UgPSBwc2V0c0N1c3RvbWVyXG5cdFx0XHRpZiBwc2V0QmFzZT8uYXNzaWduZWRfYXBwcz8ubGVuZ3RoXG5cdFx0XHRcdGFwcHMgPSBfLnVuaW9uIGFwcHMsIHBzZXRCYXNlLmFzc2lnbmVkX2FwcHNcblx0XHRcdGVsc2Vcblx0XHRcdFx0IyB1c2Vy5p2D6ZmQ6ZuG5Lit55qEYXNzaWduZWRfYXBwc+ihqOekuuaJgOacieeUqOaIt+WFt+acieeahGFwcHPmnYPpmZDvvIzkuLrnqbrliJnooajnpLrmnInmiYDmnIlhcHBz5p2D6ZmQ77yM5LiN6ZyA6KaB5L2c5p2D6ZmQ5Yik5pat5LqGXG5cdFx0XHRcdHJldHVybiBbXVxuXHRcdFx0Xy5lYWNoIHBzZXRzLCAocHNldCktPlxuXHRcdFx0XHRpZiAhcHNldC5hc3NpZ25lZF9hcHBzXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGlmIHBzZXQubmFtZSA9PSBcImFkbWluXCIgfHwgIHBzZXQubmFtZSA9PSBcInVzZXJcIiB8fCBwc2V0Lm5hbWUgPT0gJ3N1cHBsaWVyJyB8fCBwc2V0Lm5hbWUgPT0gJ2N1c3RvbWVyJ1xuXHRcdFx0XHRcdCMg6L+Z6YeM5LmL5omA5Lul6KaB5o6S6ZmkYWRtaW4vdXNlcu+8jOaYr+WboOS4uui/meS4pOS4quadg+mZkOmbhuaYr+aJgOacieadg+mZkOmbhuS4rXVzZXJz5bGe5oCn5peg5pWI55qE5p2D6ZmQ6ZuG77yM54m55oyH5bel5L2c5Yy6566h55CG5ZGY5ZKM5omA5pyJ55So5oi3XG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGFwcHMgPSBfLnVuaW9uIGFwcHMsIHBzZXQuYXNzaWduZWRfYXBwc1xuXHRcdFx0cmV0dXJuIF8ud2l0aG91dChfLnVuaXEoYXBwcyksdW5kZWZpbmVkLG51bGwpXG5cblx0Q3JlYXRvci5nZXRBc3NpZ25lZE1lbnVzID0gKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRcdHBzZXRzID0gIHRoaXMucHNldHNDdXJyZW50IHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe3VzZXJzOiB1c2VySWQsIHNwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MSwgbmFtZToxfX0pLmZldGNoKClcblx0XHRpc1NwYWNlQWRtaW4gPSBpZiBfLmlzQm9vbGVhbih0aGlzLmlzU3BhY2VBZG1pbikgdGhlbiB0aGlzLmlzU3BhY2VBZG1pbiBlbHNlIENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJJZClcblx0XHRhZG1pbk1lbnVzID0gQ3JlYXRvci5BcHBzLmFkbWluPy5hZG1pbl9tZW51c1xuXHRcdCMg5aaC5p6c5rKh5pyJYWRtaW7oj5zljZXor7TmmI7kuI3pnIDopoHnm7jlhbPlip/og73vvIznm7TmjqXov5Tlm57nqbpcblx0XHR1bmxlc3MgYWRtaW5NZW51c1xuXHRcdFx0cmV0dXJuIFtdXG5cdFx0YWJvdXRNZW51ID0gYWRtaW5NZW51cy5maW5kIChuKSAtPlxuXHRcdFx0bi5faWQgPT0gJ2Fib3V0J1xuXHRcdGFkbWluTWVudXMgPSBhZG1pbk1lbnVzLmZpbHRlciAobikgLT5cblx0XHRcdG4uX2lkICE9ICdhYm91dCdcblx0XHRvdGhlck1lbnVBcHBzID0gXy5zb3J0QnkgXy5maWx0ZXIoXy52YWx1ZXMoQ3JlYXRvci5BcHBzKSwgKG4pIC0+XG5cdFx0XHRyZXR1cm4gbi5hZG1pbl9tZW51cyBhbmQgbi5faWQgIT0gJ2FkbWluJ1xuXHRcdCksICdzb3J0J1xuXHRcdG90aGVyTWVudXMgPSBfLmZsYXR0ZW4oXy5wbHVjayhvdGhlck1lbnVBcHBzLCBcImFkbWluX21lbnVzXCIpKVxuXHRcdCMg6I+c5Y2V5pyJ5LiJ6YOo5YiG57uE5oiQ77yM6K6+572uQVBQ6I+c5Y2V44CB5YW25LuWQVBQ6I+c5Y2V5Lul5Y+KYWJvdXToj5zljZVcblx0XHRhbGxNZW51cyA9IF8udW5pb24oYWRtaW5NZW51cywgb3RoZXJNZW51cywgW2Fib3V0TWVudV0pXG5cdFx0aWYgaXNTcGFjZUFkbWluXG5cdFx0XHQjIOW3peS9nOWMuueuoeeQhuWRmOacieWFqOmDqOiPnOWNleWKn+iDvVxuXHRcdFx0cmVzdWx0ID0gYWxsTWVudXNcblx0XHRlbHNlXG5cdFx0XHR1c2VyUHJvZmlsZSA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7cHJvZmlsZTogMX19KT8ucHJvZmlsZSB8fCAndXNlcidcblx0XHRcdGN1cnJlbnRQc2V0TmFtZXMgPSBwc2V0cy5tYXAgKG4pIC0+XG5cdFx0XHRcdHJldHVybiBuLm5hbWVcblx0XHRcdG1lbnVzID0gYWxsTWVudXMuZmlsdGVyIChtZW51KS0+XG5cdFx0XHRcdHBzZXRzTWVudSA9IG1lbnUucGVybWlzc2lvbl9zZXRzXG5cdFx0XHRcdCMg5aaC5p6c5pmu6YCa55So5oi35pyJ5p2D6ZmQ77yM5YiZ55u05o6l6L+U5ZuedHJ1ZVxuXHRcdFx0XHRpZiBwc2V0c01lbnUgJiYgcHNldHNNZW51LmluZGV4T2YodXNlclByb2ZpbGUpID4gLTFcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0XHQjIOWQpuWImeWPluW9k+WJjeeUqOaIt+eahOadg+mZkOmbhuS4jm1lbnXoj5zljZXopoHmsYLnmoTmnYPpmZDpm4blr7nmr5TvvIzlpoLmnpzkuqTpm4blpKfkuo4x5Liq5YiZ6L+U5ZuedHJ1ZVxuXHRcdFx0XHRyZXR1cm4gXy5pbnRlcnNlY3Rpb24oY3VycmVudFBzZXROYW1lcywgcHNldHNNZW51KS5sZW5ndGhcblx0XHRcdHJlc3VsdCA9IG1lbnVzXG5cdFx0XG5cdFx0cmV0dXJuIF8uc29ydEJ5KHJlc3VsdCxcInNvcnRcIilcblxuXHRmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0ID0gKHBlcm1pc3Npb25fb2JqZWN0cywgb2JqZWN0X25hbWUsIHBlcm1pc3Npb25fc2V0X2lkKS0+XG5cblx0XHRpZiBfLmlzTnVsbChwZXJtaXNzaW9uX29iamVjdHMpXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdGlmIF8uaXNBcnJheShwZXJtaXNzaW9uX29iamVjdHMpXG5cdFx0XHRyZXR1cm4gXy5maW5kIHBlcm1pc3Npb25fb2JqZWN0cywgKHBvKS0+XG5cdFx0XHRcdFx0cmV0dXJuIHBvLm9iamVjdF9uYW1lID09IG9iamVjdF9uYW1lXG5cdFx0cmV0dXJuIENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kT25lKHtvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsIHBlcm1pc3Npb25fc2V0X2lkOiBwZXJtaXNzaW9uX3NldF9pZH0pXG5cblx0ZmluZF9wZXJtaXNzaW9uX29iamVjdCA9IChwZXJtaXNzaW9uX29iamVjdHMsIG9iamVjdF9uYW1lLCBwZXJtaXNzaW9uX3NldF9pZHMpLT5cblx0XHRpZiBfLmlzTnVsbChwZXJtaXNzaW9uX29iamVjdHMpXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdGlmIF8uaXNBcnJheShwZXJtaXNzaW9uX29iamVjdHMpXG5cdFx0XHRyZXR1cm4gXy5maWx0ZXIgcGVybWlzc2lvbl9vYmplY3RzLCAocG8pLT5cblx0XHRcdFx0cmV0dXJuIHBvLm9iamVjdF9uYW1lID09IG9iamVjdF9uYW1lXG5cdFx0Q3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe29iamVjdF9uYW1lOiBvYmplY3RfbmFtZSwgcGVybWlzc2lvbl9zZXRfaWQ6IHskaW46IHBlcm1pc3Npb25fc2V0X2lkc319KS5mZXRjaCgpXG5cblx0dW5pb25QZXJtaXNzaW9uT2JqZWN0cyA9IChwb3MsIG9iamVjdCwgcHNldHMpLT5cblx0XHQjIOaKimRi5Y+KeW1s5Lit55qEcGVybWlzc2lvbl9vYmplY3Rz5ZCI5bm277yM5LyY5YWI5Y+WZGLkuK3nmoRcblx0XHRyZXN1bHQgPSBbXVxuXHRcdF8uZWFjaCBvYmplY3QucGVybWlzc2lvbl9zZXQsIChvcHMsIG9wc19rZXkpLT5cblx0XHRcdCMg5oqKeW1s5Lit6Zmk5LqG54m55a6a55So5oi36ZuG5ZCI5p2D6ZmQ6ZuGXCJhZG1pblwiLCBcInVzZXJcIiwgXCJtZW1iZXJcIiwgXCJndWVzdFwi5aSW55qE5YW25LuW5a+56LGh5p2D6ZmQ5YWI5a2Y5YWlcmVzdWx0XG5cdFx0XHQjIGlmIFtcImFkbWluXCIsIFwidXNlclwiLCBcIm1lbWJlclwiLCBcImd1ZXN0XCIsIFwid29ya2Zsb3dfYWRtaW5cIiwgXCJvcmdhbml6YXRpb25fYWRtaW5cIl0uaW5kZXhPZihvcHNfa2V5KSA8IDBcblx0XHRcdGlmIFtcImFkbWluXCIsIFwidXNlclwiLCBcIm1lbWJlclwiLCBcImd1ZXN0XCJdLmluZGV4T2Yob3BzX2tleSkgPCAwXG5cdFx0XHRcdGN1cnJlbnRQc2V0ID0gcHNldHMuZmluZCAocHNldCktPiByZXR1cm4gcHNldC5uYW1lID09IG9wc19rZXlcblx0XHRcdFx0aWYgY3VycmVudFBzZXRcblx0XHRcdFx0XHR0ZW1wT3BzID0gXy5jbG9uZShvcHMpIHx8IHt9XG5cdFx0XHRcdFx0dGVtcE9wcy5wZXJtaXNzaW9uX3NldF9pZCA9IGN1cnJlbnRQc2V0Ll9pZFxuXHRcdFx0XHRcdHRlbXBPcHMub2JqZWN0X25hbWUgPSBvYmplY3Qub2JqZWN0X25hbWVcblx0XHRcdFx0XHRyZXN1bHQucHVzaCB0ZW1wT3BzXG5cdFx0aWYgcmVzdWx0Lmxlbmd0aFxuXHRcdFx0cG9zLmZvckVhY2ggKHBvKS0+XG5cdFx0XHRcdHJlcGVhdEluZGV4ID0gMFxuXHRcdFx0XHRyZXBlYXRQbyA9IHJlc3VsdC5maW5kKChpdGVtLCBpbmRleCktPiByZXBlYXRJbmRleCA9IGluZGV4O3JldHVybiBpdGVtLnBlcm1pc3Npb25fc2V0X2lkID09IHBvLnBlcm1pc3Npb25fc2V0X2lkKVxuXHRcdFx0XHQjIOWmguaenHltbOS4reW3sue7j+WtmOWcqHBv77yM5YiZ5pu/5o2i5Li65pWw5o2u5bqT5Lit55qEcG/vvIzlj43kuYvliJnmiormlbDmja7lupPkuK3nmoRwb+ebtOaOpee0r+WKoOi/m+WOu1xuXHRcdFx0XHRpZiByZXBlYXRQb1xuXHRcdFx0XHRcdHJlc3VsdFtyZXBlYXRJbmRleF0gPSBwb1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2ggcG9cblx0XHRcdHJldHVybiByZXN1bHRcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gcG9zXG5cblx0Q3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyA9IChzcGFjZUlkLCB1c2VySWQsIG9iamVjdF9uYW1lKS0+XG5cdFx0cGVybWlzc2lvbnMgPSB7fVxuXHRcdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lLCBzcGFjZUlkKVxuXG5cdFx0aWYgc3BhY2VJZCBpcyAnZ3Vlc3QnIHx8IG9iamVjdF9uYW1lID09IFwidXNlcnNcIlxuXHRcdFx0cGVybWlzc2lvbnMgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5ndWVzdCkgfHwge31cblx0XHRcdENyZWF0b3IucHJvY2Vzc1Blcm1pc3Npb25zIHBlcm1pc3Npb25zXG5cdFx0XHRyZXR1cm4gcGVybWlzc2lvbnNcblx0XHRwc2V0c0FkbWluID0gaWYgXy5pc051bGwodGhpcy5wc2V0c0FkbWluKSBvciB0aGlzLnBzZXRzQWRtaW4gdGhlbiB0aGlzLnBzZXRzQWRtaW4gZWxzZSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2FkbWluJ30sIHtmaWVsZHM6e19pZDoxfX0pXG5cdFx0cHNldHNVc2VyID0gaWYgXy5pc051bGwodGhpcy5wc2V0c1VzZXIpIG9yIHRoaXMucHNldHNVc2VyIHRoZW4gdGhpcy5wc2V0c1VzZXIgZWxzZSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ3VzZXInfSwge2ZpZWxkczp7X2lkOjF9fSlcblx0XHRwc2V0c01lbWJlciA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNNZW1iZXIpIG9yIHRoaXMucHNldHNNZW1iZXIgdGhlbiB0aGlzLnBzZXRzTWVtYmVyIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdtZW1iZXInfSwge2ZpZWxkczp7X2lkOjF9fSlcblx0XHRwc2V0c0d1ZXN0ID0gaWYgXy5pc051bGwodGhpcy5wc2V0c0d1ZXN0KSBvciB0aGlzLnBzZXRzR3Vlc3QgdGhlbiB0aGlzLnBzZXRzR3Vlc3QgZWxzZSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ2d1ZXN0J30sIHtmaWVsZHM6e19pZDoxfX0pXG5cblx0XHRwc2V0c1N1cHBsaWVyID0gaWYgXy5pc051bGwodGhpcy5wc2V0c1N1cHBsaWVyKSBvciB0aGlzLnBzZXRzU3VwcGxpZXIgdGhlbiB0aGlzLnBzZXRzU3VwcGxpZXIgZWxzZSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtzcGFjZTogc3BhY2VJZCwgbmFtZTogJ3N1cHBsaWVyJ30sIHtmaWVsZHM6e19pZDoxfX0pXG5cdFx0cHNldHNDdXN0b21lciA9IGlmIF8uaXNOdWxsKHRoaXMucHNldHNDdXN0b21lcikgb3IgdGhpcy5wc2V0c0N1c3RvbWVyIHRoZW4gdGhpcy5wc2V0c0N1c3RvbWVyIGVsc2UgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIG5hbWU6ICdjdXN0b21lcid9LCB7ZmllbGRzOntfaWQ6MX19KVxuXHRcdHBzZXRzID0gdGhpcy5wc2V0c0N1cnJlbnQ7XG5cdFx0aWYgIXBzZXRzXG5cdFx0XHRzcGFjZVVzZXIgPSBudWxsO1xuXHRcdFx0aWYgdXNlcklkXG5cdFx0XHRcdHNwYWNlVXNlciA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoeyBzcGFjZTogc3BhY2VJZCwgdXNlcjogdXNlcklkIH0sIHsgZmllbGRzOiB7IHByb2ZpbGU6IDEgfSB9KVxuXHRcdFx0aWYgc3BhY2VVc2VyICYmIHNwYWNlVXNlci5wcm9maWxlXG5cdFx0XHRcdHBzZXRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7c3BhY2U6IHNwYWNlSWQsICRvcjogW3t1c2VyczogdXNlcklkfSwge25hbWU6IHNwYWNlVXNlci5wcm9maWxlfV19LCB7ZmllbGRzOntfaWQ6MSwgYXNzaWduZWRfYXBwczoxLCBuYW1lOjF9fSkuZmV0Y2goKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRwc2V0cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe3VzZXJzOiB1c2VySWQsIHNwYWNlOiBzcGFjZUlkfSwge2ZpZWxkczp7X2lkOjEsIGFzc2lnbmVkX2FwcHM6MSwgbmFtZToxfX0pLmZldGNoKClcblx0XHRpc1NwYWNlQWRtaW4gPSBpZiBfLmlzQm9vbGVhbih0aGlzLmlzU3BhY2VBZG1pbikgdGhlbiB0aGlzLmlzU3BhY2VBZG1pbiBlbHNlIENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJJZClcblxuXHRcdHBzZXRzQWRtaW5fcG9zID0gdGhpcy5wc2V0c0FkbWluX3Bvc1xuXHRcdHBzZXRzVXNlcl9wb3MgPSB0aGlzLnBzZXRzVXNlcl9wb3Ncblx0XHRwc2V0c01lbWJlcl9wb3MgPSB0aGlzLnBzZXRzTWVtYmVyX3Bvc1xuXHRcdHBzZXRzR3Vlc3RfcG9zID0gdGhpcy5wc2V0c0d1ZXN0X3Bvc1xuXG5cdFx0cHNldHNTdXBwbGllcl9wb3MgPSB0aGlzLnBzZXRzU3VwcGxpZXJfcG9zXG5cdFx0cHNldHNDdXN0b21lcl9wb3MgPSB0aGlzLnBzZXRzQ3VzdG9tZXJfcG9zXG5cblx0XHRwc2V0c0N1cnJlbnRfcG9zID0gdGhpcy5wc2V0c0N1cnJlbnRfcG9zXG5cblx0XHRvcHNldEFkbWluID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuYWRtaW4pIHx8IHt9XG5cdFx0b3BzZXRVc2VyID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQudXNlcikgfHwge31cblx0XHRvcHNldE1lbWJlciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0Lm1lbWJlcikgfHwge31cblx0XHRvcHNldEd1ZXN0ID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuZ3Vlc3QpIHx8IHt9XG5cblx0XHRvcHNldFN1cHBsaWVyID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuc3VwcGxpZXIpIHx8IHt9XG5cdFx0b3BzZXRDdXN0b21lciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LmN1c3RvbWVyKSB8fCB7fVxuXG5cdFx0IyBzaGFyZWRMaXN0Vmlld3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29iamVjdF9saXN0dmlld3MnKS5maW5kKHtzcGFjZTogc3BhY2VJZCwgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLCBzaGFyZWQ6IHRydWV9LCB7ZmllbGRzOntfaWQ6MX19KS5mZXRjaCgpXG5cdFx0IyBzaGFyZWRMaXN0Vmlld3MgPSBfLnBsdWNrKHNoYXJlZExpc3RWaWV3cyxcIl9pZFwiKVxuXHRcdCMgaWYgc2hhcmVkTGlzdFZpZXdzLmxlbmd0aFxuXHRcdCMgXHR1bmxlc3Mgb3BzZXRBZG1pbi5saXN0X3ZpZXdzXG5cdFx0IyBcdFx0b3BzZXRBZG1pbi5saXN0X3ZpZXdzID0gW11cblx0XHQjIFx0b3BzZXRBZG1pbi5saXN0X3ZpZXdzID0gXy51bmlvbiBvcHNldEFkbWluLmxpc3Rfdmlld3MsIHNoYXJlZExpc3RWaWV3c1xuXHRcdCMgXHR1bmxlc3Mgb3BzZXRVc2VyLmxpc3Rfdmlld3Ncblx0XHQjIFx0XHRvcHNldFVzZXIubGlzdF92aWV3cyA9IFtdXG5cdFx0IyBcdG9wc2V0VXNlci5saXN0X3ZpZXdzID0gXy51bmlvbiBvcHNldFVzZXIubGlzdF92aWV3cywgc2hhcmVkTGlzdFZpZXdzXG5cdFx0IyDmlbDmja7lupPkuK3lpoLmnpzphY3nva7kuobpu5jorqTnmoRhZG1pbi91c2Vy5p2D6ZmQ6ZuG6K6+572u77yM5bqU6K+l6KaG55uW5Luj56CB5LitYWRtaW4vdXNlcueahOadg+mZkOmbhuiuvue9rlxuXHRcdGlmIHBzZXRzQWRtaW5cblx0XHRcdHBvc0FkbWluID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0FkbWluX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzQWRtaW4uX2lkKVxuXHRcdFx0ZXh0ZW5kUGVybWlzc2lvblByb3BzIG9wc2V0QWRtaW4sIHBvc0FkbWluXG5cdFx0aWYgcHNldHNVc2VyXG5cdFx0XHRwb3NVc2VyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c1VzZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNVc2VyLl9pZClcblx0XHRcdGV4dGVuZFBlcm1pc3Npb25Qcm9wcyBvcHNldFVzZXIsIHBvc1VzZXJcblx0XHRpZiBwc2V0c01lbWJlclxuXHRcdFx0cG9zTWVtYmVyID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c01lbWJlcl9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c01lbWJlci5faWQpXG5cdFx0XHRleHRlbmRQZXJtaXNzaW9uUHJvcHMgb3BzZXRNZW1iZXIsIHBvc01lbWJlclxuXHRcdGlmIHBzZXRzR3Vlc3Rcblx0XHRcdHBvc0d1ZXN0ID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0d1ZXN0X3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzR3Vlc3QuX2lkKVxuXHRcdFx0ZXh0ZW5kUGVybWlzc2lvblByb3BzIG9wc2V0R3Vlc3QsIHBvc0d1ZXN0XG5cdFx0aWYgcHNldHNTdXBwbGllclxuXHRcdFx0cG9zU3VwcGxpZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzU3VwcGxpZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNTdXBwbGllci5faWQpO1xuXHRcdFx0ZXh0ZW5kUGVybWlzc2lvblByb3BzIG9wc2V0U3VwcGxpZXIsIHBvc1N1cHBsaWVyXG5cdFx0aWYgcHNldHNDdXN0b21lclxuXHRcdFx0cG9zQ3VzdG9tZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzQ3VzdG9tZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNDdXN0b21lci5faWQpO1xuXHRcdFx0ZXh0ZW5kUGVybWlzc2lvblByb3BzIG9wc2V0Q3VzdG9tZXIsIHBvc0N1c3RvbWVyXG5cblx0XHRpZiAhdXNlcklkXG5cdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0QWRtaW5cblx0XHRlbHNlXG5cdFx0XHRpZiBpc1NwYWNlQWRtaW5cblx0XHRcdFx0cGVybWlzc2lvbnMgPSBvcHNldEFkbWluXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlmIHNwYWNlSWQgaXMgJ2NvbW1vbidcblx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0VXNlclxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c3BhY2VVc2VyID0gaWYgXy5pc051bGwodGhpcy5zcGFjZVVzZXIpIG9yIHRoaXMuc3BhY2VVc2VyIHRoZW4gdGhpcy5zcGFjZVVzZXIgZWxzZSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHsgc3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZCB9LCB7IGZpZWxkczogeyBwcm9maWxlOiAxIH0gfSlcblx0XHRcdFx0XHRpZiBzcGFjZVVzZXJcblx0XHRcdFx0XHRcdHByb2YgPSBzcGFjZVVzZXIucHJvZmlsZVxuXHRcdFx0XHRcdFx0aWYgcHJvZlxuXHRcdFx0XHRcdFx0XHRpZiBwcm9mIGlzICd1c2VyJ1xuXHRcdFx0XHRcdFx0XHRcdHBlcm1pc3Npb25zID0gb3BzZXRVc2VyXG5cdFx0XHRcdFx0XHRcdGVsc2UgaWYgcHJvZiBpcyAnbWVtYmVyJ1xuXHRcdFx0XHRcdFx0XHRcdHBlcm1pc3Npb25zID0gb3BzZXRNZW1iZXJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBwcm9mIGlzICdndWVzdCdcblx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0R3Vlc3Rcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBwcm9mIGlzICdzdXBwbGllcidcblx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0U3VwcGxpZXJcblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiBwcm9mIGlzICdjdXN0b21lcidcblx0XHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0Q3VzdG9tZXJcblx0XHRcdFx0XHRcdGVsc2UgIyDmsqHmnIlwcm9maWxl5YiZ6K6k5Li65pivdXNlcuadg+mZkFxuXHRcdFx0XHRcdFx0XHRwZXJtaXNzaW9ucyA9IG9wc2V0VXNlclxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHBlcm1pc3Npb25zID0gb3BzZXRHdWVzdFxuXHRcdGlmIHBzZXRzLmxlbmd0aCA+IDBcblx0XHRcdHNldF9pZHMgPSBfLnBsdWNrIHBzZXRzLCBcIl9pZFwiXG5cdFx0XHRwb3MgPSBmaW5kX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzQ3VycmVudF9wb3MsIG9iamVjdF9uYW1lLCBzZXRfaWRzKVxuXHRcdFx0cG9zID0gdW5pb25QZXJtaXNzaW9uT2JqZWN0cyhwb3MsIG9iamVjdCwgcHNldHMpXG5cdFx0XHRfLmVhY2ggcG9zLCAocG8pLT5cblx0XHRcdFx0aWYgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT0gcHNldHNBZG1pbj8uX2lkIG9yIFxuXHRcdFx0XHRwby5wZXJtaXNzaW9uX3NldF9pZCA9PSBwc2V0c1VzZXI/Ll9pZCBvciBcblx0XHRcdFx0cG8ucGVybWlzc2lvbl9zZXRfaWQgPT0gcHNldHNNZW1iZXI/Ll9pZCBvciBcblx0XHRcdFx0cG8ucGVybWlzc2lvbl9zZXRfaWQgPT0gcHNldHNHdWVzdD8uX2lkIG9yXG5cdFx0XHRcdHBvLnBlcm1pc3Npb25fc2V0X2lkID09IHBzZXRzU3VwcGxpZXI/Ll9pZCBvclxuXHRcdFx0XHRwby5wZXJtaXNzaW9uX3NldF9pZCA9PSBwc2V0c0N1c3RvbWVyPy5faWRcblx0XHRcdFx0XHQjIOm7mOiupOeahGFkbWluL3VzZXLmnYPpmZDlgLzlj6rlrp7ooYzkuIrpnaLnmoTpu5jorqTlgLzopobnm5bvvIzkuI3lgZrnrpfms5XliKTmlq1cblx0XHRcdFx0XHRyZXR1cm5cblx0XHRcdFx0aWYgXy5pc0VtcHR5KHBlcm1pc3Npb25zKVxuXHRcdFx0XHRcdHBlcm1pc3Npb25zID0gcG9cblx0XHRcdFx0b3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzIHBlcm1pc3Npb25zLCBwb1xuXG5cdFx0XHRcdHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MgPSBpbnRlcnNlY3Rpb25QbHVzKHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MsIHBvLmRpc2FibGVkX2xpc3Rfdmlld3MpXG5cdFx0XHRcdHBlcm1pc3Npb25zLmRpc2FibGVkX2FjdGlvbnMgPSBpbnRlcnNlY3Rpb25QbHVzKHBlcm1pc3Npb25zLmRpc2FibGVkX2FjdGlvbnMsIHBvLmRpc2FibGVkX2FjdGlvbnMpXG5cdFx0XHRcdHBlcm1pc3Npb25zLnVucmVhZGFibGVfZmllbGRzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bnJlYWRhYmxlX2ZpZWxkcywgcG8udW5yZWFkYWJsZV9maWVsZHMpXG5cdFx0XHRcdHBlcm1pc3Npb25zLnVuZWRpdGFibGVfZmllbGRzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bmVkaXRhYmxlX2ZpZWxkcywgcG8udW5lZGl0YWJsZV9maWVsZHMpXG5cdFx0XHRcdHBlcm1pc3Npb25zLnVucmVsYXRlZF9vYmplY3RzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0cywgcG8udW5yZWxhdGVkX29iamVjdHMpXG5cdFx0XHRcdHBlcm1pc3Npb25zLnVuZWRpdGFibGVfcmVsYXRlZF9saXN0ID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdCwgcG8udW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QpXG5cdFx0XG5cdFx0aWYgb2JqZWN0LmlzX3ZpZXdcblx0XHRcdHBlcm1pc3Npb25zLmFsbG93Q3JlYXRlID0gZmFsc2Vcblx0XHRcdHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlXG5cdFx0XHRwZXJtaXNzaW9ucy5tb2RpZnlBbGxSZWNvcmRzID0gZmFsc2Vcblx0XHRcdHBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzID0gZmFsc2Vcblx0XHRcdHBlcm1pc3Npb25zLmRpc2FibGVkX2FjdGlvbnMgPSBbXVxuXHRcdENyZWF0b3IucHJvY2Vzc1Blcm1pc3Npb25zIHBlcm1pc3Npb25zXG5cblx0XHRpZiBvYmplY3QucGVybWlzc2lvbl9zZXQub3duZXJcblx0XHRcdHBlcm1pc3Npb25zLm93bmVyID0gb2JqZWN0LnBlcm1pc3Npb25fc2V0Lm93bmVyXG5cdFx0cmV0dXJuIHBlcm1pc3Npb25zXG5cblxuXHQjIENyZWF0b3IuaW5pdFBlcm1pc3Npb25zID0gKG9iamVjdF9uYW1lKSAtPlxuXG5cdFx0IyAjIOW6lOivpeaKiuiuoeeul+WHuuadpeeahFxuXHRcdCMgQ3JlYXRvci5Db2xsZWN0aW9uc1tvYmplY3RfbmFtZV0uYWxsb3dcblx0XHQjIFx0aW5zZXJ0OiAodXNlcklkLCBkb2MpIC0+XG5cdFx0IyBcdFx0aWYgIXVzZXJJZFxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0IyBcdFx0aWYgIWRvYy5zcGFjZVxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cdCAgICBcdCMgXHRcdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyhkb2Muc3BhY2UsIHVzZXJJZCwgb2JqZWN0X25hbWUpXG5cdFx0IyBcdFx0aWYgIXBlcm1pc3Npb25zLmFsbG93Q3JlYXRlXG5cdFx0IyBcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdCMgXHRcdHJldHVybiB0cnVlXG5cdFx0IyBcdHVwZGF0ZTogKHVzZXJJZCwgZG9jKSAtPlxuXHRcdCMgXHRcdGlmICF1c2VySWRcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdGlmICFkb2Muc3BhY2Vcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdHBlcm1pc3Npb25zID0gQ3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyhkb2Muc3BhY2UsIHVzZXJJZCwgb2JqZWN0X25hbWUpXG5cdFx0IyBcdFx0aWYgIXBlcm1pc3Npb25zLmFsbG93RWRpdFxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0IyBcdFx0cmV0dXJuIHRydWVcblx0XHQjIFx0cmVtb3ZlOiAodXNlcklkLCBkb2MpIC0+XG5cdFx0IyBcdFx0aWYgIXVzZXJJZFxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0IyBcdFx0aWYgIWRvYy5zcGFjZVxuXHRcdCMgXHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0IyBcdFx0cGVybWlzc2lvbnMgPSBDcmVhdG9yLmdldE9iamVjdFBlcm1pc3Npb25zKGRvYy5zcGFjZSwgdXNlcklkLCBvYmplY3RfbmFtZSlcblx0XHQjIFx0XHRpZiAhcGVybWlzc2lvbnMuYWxsb3dEZWxldGVcblx0XHQjIFx0XHRcdHJldHVybiBmYWxzZVxuXHRcdCMgXHRcdHJldHVybiB0cnVlXG5cblx0TWV0ZW9yLm1ldGhvZHNcblx0XHQjIENhbGN1bGF0ZSBQZXJtaXNzaW9ucyBvbiBTZXJ2ZXJcblx0XHRcImNyZWF0b3Iub2JqZWN0X3Blcm1pc3Npb25zXCI6IChzcGFjZUlkKS0+XG5cdFx0XHRyZXR1cm4gQ3JlYXRvci5nZXRBbGxQZXJtaXNzaW9ucyhzcGFjZUlkLCB0aGlzLnVzZXJJZClcbiIsInZhciBiYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wTmFtZXMsIGNsb25lLCBleHRlbmRQZXJtaXNzaW9uUHJvcHMsIGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QsIGZpbmRfcGVybWlzc2lvbl9vYmplY3QsIGludGVyc2VjdGlvblBsdXMsIG90aGVyUGVybWlzc2lvblByb3BOYW1lcywgb3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzLCBwZXJtaXNzaW9uUHJvcE5hbWVzLCB1bmlvblBlcm1pc3Npb25PYmplY3RzLCB1bmlvblBsdXM7XG5cbmNsb25lID0gcmVxdWlyZSgnY2xvbmUnKTtcblxuYmFzZUJvb2xlYW5QZXJtaXNzaW9uUHJvcE5hbWVzID0gW1wiYWxsb3dDcmVhdGVcIiwgXCJhbGxvd0RlbGV0ZVwiLCBcImFsbG93RWRpdFwiLCBcImFsbG93UmVhZFwiLCBcIm1vZGlmeUFsbFJlY29yZHNcIiwgXCJ2aWV3QWxsUmVjb3Jkc1wiLCBcIm1vZGlmeUNvbXBhbnlSZWNvcmRzXCIsIFwidmlld0NvbXBhbnlSZWNvcmRzXCIsIFwiYWxsb3dSZWFkRmlsZXNcIiwgXCJhbGxvd0VkaXRGaWxlc1wiLCBcImFsbG93Q3JlYXRlRmlsZXNcIiwgXCJhbGxvd0RlbGV0ZUZpbGVzXCIsIFwidmlld0FsbEZpbGVzXCIsIFwibW9kaWZ5QWxsRmlsZXNcIl07XG5cbm90aGVyUGVybWlzc2lvblByb3BOYW1lcyA9IFtcImRpc2FibGVkX2xpc3Rfdmlld3NcIiwgXCJkaXNhYmxlZF9hY3Rpb25zXCIsIFwidW5yZWFkYWJsZV9maWVsZHNcIiwgXCJ1bmVkaXRhYmxlX2ZpZWxkc1wiLCBcInVucmVsYXRlZF9vYmplY3RzXCIsIFwidW5lZGl0YWJsZV9yZWxhdGVkX2xpc3RcIl07XG5cbnBlcm1pc3Npb25Qcm9wTmFtZXMgPSBfLnVuaW9uKGJhc2VCb29sZWFuUGVybWlzc2lvblByb3BOYW1lcywgb3RoZXJQZXJtaXNzaW9uUHJvcE5hbWVzKTtcblxuQ3JlYXRvci5nZXRQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpIHtcbiAgdmFyIG9iajtcbiAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgIGlmICghb2JqZWN0X25hbWUpIHtcbiAgICAgIG9iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICB9XG4gICAgb2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBvYmoucGVybWlzc2lvbnMuZ2V0KCk7XG4gIH0gZWxzZSBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgcmV0dXJuIENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMoc3BhY2VJZCwgdXNlcklkLCBvYmplY3RfbmFtZSk7XG4gIH1cbn07XG5cbkNyZWF0b3IuZ2V0UmVjb3JkUGVybWlzc2lvbnMgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpIHtcbiAgdmFyIGlzT3duZXIsIG1hc3Rlck9iamVjdE5hbWUsIG1hc3RlclJlY29yZFBlcm0sIHBlcm1pc3Npb25zLCByZWNvcmRfY29tcGFueV9pZCwgcmVjb3JkX2NvbXBhbnlfaWRzLCByZWYsIHVzZXJfY29tcGFueV9pZHM7XG4gIGlmICghb2JqZWN0X25hbWUgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgb2JqZWN0X25hbWUgPSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpO1xuICB9XG4gIGlmICghc3BhY2VJZCAmJiBNZXRlb3IuaXNDbGllbnQpIHtcbiAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICB9XG4gIHBlcm1pc3Npb25zID0gXy5jbG9uZShDcmVhdG9yLmdldFBlcm1pc3Npb25zKG9iamVjdF9uYW1lLCBzcGFjZUlkLCB1c2VySWQpKTtcbiAgaWYgKHJlY29yZCkge1xuICAgIGlmICghXy5pc0VtcHR5KHJlY29yZC5yZWNvcmRfcGVybWlzc2lvbnMpKSB7XG4gICAgICByZXR1cm4gcmVjb3JkLnJlY29yZF9wZXJtaXNzaW9ucztcbiAgICB9XG4gICAgaXNPd25lciA9IHJlY29yZC5vd25lciA9PT0gdXNlcklkIHx8ICgocmVmID0gcmVjb3JkLm93bmVyKSAhPSBudWxsID8gcmVmLl9pZCA6IHZvaWQgMCkgPT09IHVzZXJJZDtcbiAgICBpZiAob2JqZWN0X25hbWUgPT09IFwiY21zX2ZpbGVzXCIpIHtcbiAgICAgIG1hc3Rlck9iamVjdE5hbWUgPSByZWNvcmQucGFyZW50WydyZWZlcmVuY2VfdG8uX28nXTtcbiAgICAgIG1hc3RlclJlY29yZFBlcm0gPSBDcmVhdG9yLmdldFBlcm1pc3Npb25zKG1hc3Rlck9iamVjdE5hbWUsIHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgICBwZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSA9IHBlcm1pc3Npb25zLmFsbG93Q3JlYXRlICYmIG1hc3RlclJlY29yZFBlcm0uYWxsb3dDcmVhdGVGaWxlcztcbiAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IHBlcm1pc3Npb25zLmFsbG93RWRpdCAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RWRpdEZpbGVzO1xuICAgICAgcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSAmJiBtYXN0ZXJSZWNvcmRQZXJtLmFsbG93RGVsZXRlRmlsZXM7XG4gICAgICBpZiAoIW1hc3RlclJlY29yZFBlcm0ubW9kaWZ5QWxsRmlsZXMgJiYgIWlzT3duZXIpIHtcbiAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2U7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBwZXJtaXNzaW9ucy5hbGxvd1JlYWQgPSBwZXJtaXNzaW9ucy5hbGxvd1JlYWQgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd1JlYWRGaWxlcztcbiAgICAgIGlmICghbWFzdGVyUmVjb3JkUGVybS52aWV3QWxsRmlsZXMgJiYgIWlzT3duZXIpIHtcbiAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dSZWFkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgdXNlcl9jb21wYW55X2lkcyA9IFN0ZWVkb3MuZ2V0VXNlckNvbXBhbnlJZHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVzZXJfY29tcGFueV9pZHMgPSBDcmVhdG9yLmdldFVzZXJDb21wYW55SWRzKHVzZXJJZCwgc3BhY2VJZCk7XG4gICAgICB9XG4gICAgICByZWNvcmRfY29tcGFueV9pZCA9IHJlY29yZCAhPSBudWxsID8gcmVjb3JkLmNvbXBhbnlfaWQgOiB2b2lkIDA7XG4gICAgICBpZiAocmVjb3JkX2NvbXBhbnlfaWQgJiYgXy5pc09iamVjdChyZWNvcmRfY29tcGFueV9pZCkgJiYgcmVjb3JkX2NvbXBhbnlfaWQuX2lkKSB7XG4gICAgICAgIHJlY29yZF9jb21wYW55X2lkID0gcmVjb3JkX2NvbXBhbnlfaWQuX2lkO1xuICAgICAgfVxuICAgICAgcmVjb3JkX2NvbXBhbnlfaWRzID0gcmVjb3JkICE9IG51bGwgPyByZWNvcmQuY29tcGFueV9pZHMgOiB2b2lkIDA7XG4gICAgICBpZiAocmVjb3JkX2NvbXBhbnlfaWRzICYmIHJlY29yZF9jb21wYW55X2lkcy5sZW5ndGggJiYgXy5pc09iamVjdChyZWNvcmRfY29tcGFueV9pZHNbMF0pKSB7XG4gICAgICAgIHJlY29yZF9jb21wYW55X2lkcyA9IHJlY29yZF9jb21wYW55X2lkcy5tYXAoZnVuY3Rpb24obikge1xuICAgICAgICAgIHJldHVybiBuLl9pZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZWNvcmRfY29tcGFueV9pZHMgPSBfLnVuaW9uKHJlY29yZF9jb21wYW55X2lkcywgW3JlY29yZF9jb21wYW55X2lkXSk7XG4gICAgICBpZiAoIXBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgJiYgIWlzT3duZXIgJiYgIXBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzKSB7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlO1xuICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICghcGVybWlzc2lvbnMubW9kaWZ5QWxsUmVjb3JkcyAmJiBwZXJtaXNzaW9ucy5tb2RpZnlDb21wYW55UmVjb3Jkcykge1xuICAgICAgICBpZiAocmVjb3JkX2NvbXBhbnlfaWRzICYmIHJlY29yZF9jb21wYW55X2lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodXNlcl9jb21wYW55X2lkcyAmJiB1c2VyX2NvbXBhbnlfaWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCFfLmludGVyc2VjdGlvbih1c2VyX2NvbXBhbnlfaWRzLCByZWNvcmRfY29tcGFueV9pZHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0VkaXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2U7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5hbGxvd0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlY29yZC5sb2NrZWQgJiYgIXBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMpIHtcbiAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dFZGl0ID0gZmFsc2U7XG4gICAgICAgIHBlcm1pc3Npb25zLmFsbG93RGVsZXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXBlcm1pc3Npb25zLnZpZXdBbGxSZWNvcmRzICYmICFpc093bmVyICYmICFwZXJtaXNzaW9ucy52aWV3Q29tcGFueVJlY29yZHMpIHtcbiAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dSZWFkID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCFwZXJtaXNzaW9ucy52aWV3QWxsUmVjb3JkcyAmJiBwZXJtaXNzaW9ucy52aWV3Q29tcGFueVJlY29yZHMpIHtcbiAgICAgICAgaWYgKHJlY29yZF9jb21wYW55X2lkcyAmJiByZWNvcmRfY29tcGFueV9pZHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHVzZXJfY29tcGFueV9pZHMgJiYgdXNlcl9jb21wYW55X2lkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghXy5pbnRlcnNlY3Rpb24odXNlcl9jb21wYW55X2lkcywgcmVjb3JkX2NvbXBhbnlfaWRzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWxsb3dSZWFkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLmFsbG93UmVhZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGVybWlzc2lvbnM7XG59O1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIENyZWF0b3IuZ2V0UmVjb3JkUmVsYXRlZExpc3RQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKGN1cnJlbnRPYmplY3ROYW1lLCByZWxhdGVkTGlzdEl0ZW0sIGN1cnJlbnRSZWNvcmQsIHVzZXJJZCwgc3BhY2VJZCkge1xuICAgIHZhciBpc1JlbGF0ZU9iamVjdFVuZWRpdGFibGUsIG1hc3RlckFsbG93LCBtYXN0ZXJSZWNvcmRQZXJtLCByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMsIHJlc3VsdCwgdW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QsIHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkO1xuICAgIGlmICghY3VycmVudE9iamVjdE5hbWUgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBjdXJyZW50T2JqZWN0TmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgfVxuICAgIGlmICghcmVsYXRlZExpc3RJdGVtKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwicmVsYXRlZExpc3RJdGVtIG11c3Qgbm90IGJlIGVtcHR5IGZvciB0aGUgZnVuY3Rpb24gQ3JlYXRvci5nZXRSZWNvcmRSZWxhdGVkTGlzdFBlcm1pc3Npb25zXCIpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRSZWNvcmQgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICBjdXJyZW50UmVjb3JkID0gQ3JlYXRvci5nZXRPYmplY3RSZWNvcmQoKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQgJiYgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgfVxuICAgIGlmICghc3BhY2VJZCAmJiBNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgfVxuICAgIG1hc3RlclJlY29yZFBlcm0gPSBDcmVhdG9yLmdldFJlY29yZFBlcm1pc3Npb25zKGN1cnJlbnRPYmplY3ROYW1lLCBjdXJyZW50UmVjb3JkLCB1c2VySWQsIHNwYWNlSWQpO1xuICAgIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucyA9IENyZWF0b3IuZ2V0UGVybWlzc2lvbnMocmVsYXRlZExpc3RJdGVtLm9iamVjdF9uYW1lKTtcbiAgICByZXN1bHQgPSBfLmNsb25lKHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucyk7XG4gICAgaWYgKHJlbGF0ZWRMaXN0SXRlbS5pc19maWxlKSB7XG4gICAgICByZXN1bHQuYWxsb3dDcmVhdGUgPSByZWxhdGVkT2JqZWN0UGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0NyZWF0ZUZpbGVzO1xuICAgICAgcmVzdWx0LmFsbG93RWRpdCA9IHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0VkaXQgJiYgbWFzdGVyUmVjb3JkUGVybS5hbGxvd0VkaXRGaWxlcztcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgPSByZWxhdGVkTGlzdEl0ZW0ud3JpdGVfcmVxdWlyZXNfbWFzdGVyX3JlYWQgfHwgZmFsc2U7XG4gICAgICBtYXN0ZXJBbGxvdyA9IGZhbHNlO1xuICAgICAgaWYgKHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID09PSB0cnVlKSB7XG4gICAgICAgIG1hc3RlckFsbG93ID0gbWFzdGVyUmVjb3JkUGVybS5hbGxvd1JlYWQ7XG4gICAgICB9IGVsc2UgaWYgKHdyaXRlX3JlcXVpcmVzX21hc3Rlcl9yZWFkID09PSBmYWxzZSkge1xuICAgICAgICBtYXN0ZXJBbGxvdyA9IG1hc3RlclJlY29yZFBlcm0uYWxsb3dFZGl0O1xuICAgICAgfVxuICAgICAgdW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QgPSBDcmVhdG9yLmdldFJlY29yZFNhZmVSZWxhdGVkTGlzdChjdXJyZW50UmVjb3JkLCBjdXJyZW50T2JqZWN0TmFtZSk7XG4gICAgICBpc1JlbGF0ZU9iamVjdFVuZWRpdGFibGUgPSB1bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdC5pbmRleE9mKHJlbGF0ZWRMaXN0SXRlbS5vYmplY3RfbmFtZSkgPiAtMTtcbiAgICAgIHJlc3VsdC5hbGxvd0NyZWF0ZSA9IG1hc3RlckFsbG93ICYmIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0NyZWF0ZSAmJiAhaXNSZWxhdGVPYmplY3RVbmVkaXRhYmxlO1xuICAgICAgcmVzdWx0LmFsbG93RWRpdCA9IG1hc3RlckFsbG93ICYmIHJlbGF0ZWRPYmplY3RQZXJtaXNzaW9ucy5hbGxvd0VkaXQgJiYgIWlzUmVsYXRlT2JqZWN0VW5lZGl0YWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBDcmVhdG9yLmdldEFsbFBlcm1pc3Npb25zID0gZnVuY3Rpb24oc3BhY2VJZCwgdXNlcklkKSB7XG4gICAgdmFyIF9pLCBpc1NwYWNlQWRtaW4sIHBlcm1pc3Npb25zLCBwc2V0cywgcHNldHNBZG1pbiwgcHNldHNBZG1pbl9wb3MsIHBzZXRzQ3VycmVudCwgcHNldHNDdXJyZW50TmFtZXMsIHBzZXRzQ3VycmVudF9wb3MsIHBzZXRzQ3VzdG9tZXIsIHBzZXRzQ3VzdG9tZXJfcG9zLCBwc2V0c0d1ZXN0LCBwc2V0c0d1ZXN0X3BvcywgcHNldHNNZW1iZXIsIHBzZXRzTWVtYmVyX3BvcywgcHNldHNTdXBwbGllciwgcHNldHNTdXBwbGllcl9wb3MsIHBzZXRzVXNlciwgcHNldHNVc2VyX3Bvcywgc2V0X2lkcywgc3BhY2VVc2VyO1xuICAgIHBlcm1pc3Npb25zID0ge1xuICAgICAgb2JqZWN0czoge30sXG4gICAgICBhc3NpZ25lZF9hcHBzOiBbXVxuICAgIH07XG5cbiAgICAvKlxuICAgIFx0XHTmnYPpmZDpm4bor7TmmI46XG4gICAgXHRcdOWGhee9ruadg+mZkOmbhi1hZG1pbix1c2VyLG1lbWJlcixndWVzdCx3b3JrZmxvd19hZG1pbixvcmdhbml6YXRpb25fYWRtaW5cbiAgICBcdFx06Ieq5a6a5LmJ5p2D6ZmQ6ZuGLeaVsOaNruW6k+S4reaWsOW7uueahOmZpOWGhee9ruadg+mZkOmbhuS7peWklueahOWFtuS7luadg+mZkOmbhlxuICAgIFx0XHTnibnlrprnlKjmiLfpm4blkIjmnYPpmZDpm4bvvIjljbN1c2Vyc+WxnuaAp+S4jeWPr+mFjee9ru+8iS1hZG1pbix1c2VyLG1lbWJlcixndWVzdFxuICAgIFx0XHTlj6/phY3nva7nlKjmiLfpm4blkIjmnYPpmZDpm4bvvIjljbN1c2Vyc+WxnuaAp+WPr+mFjee9ru+8iS13b3JrZmxvd19hZG1pbixvcmdhbml6YXRpb25fYWRtaW7ku6Xlj4roh6rlrprkuYnmnYPpmZDpm4ZcbiAgICAgKi9cbiAgICBpc1NwYWNlQWRtaW4gPSBmYWxzZTtcbiAgICBzcGFjZVVzZXIgPSBudWxsO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGlzU3BhY2VBZG1pbiA9IENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgICBzcGFjZVVzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBwcm9maWxlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBwc2V0c0FkbWluID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdhZG1pbidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcbiAgICBwc2V0c1VzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ3VzZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG4gICAgcHNldHNNZW1iZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ21lbWJlcidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcbiAgICBwc2V0c0d1ZXN0ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdndWVzdCdcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcbiAgICBwc2V0c1N1cHBsaWVyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdzdXBwbGllcidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcbiAgICBwc2V0c0N1c3RvbWVyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdjdXN0b21lcidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcbiAgICBpZiAoc3BhY2VVc2VyICYmIHNwYWNlVXNlci5wcm9maWxlKSB7XG4gICAgICBwc2V0c0N1cnJlbnQgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXJzOiB1c2VySWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBzcGFjZVVzZXIucHJvZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgYXNzaWduZWRfYXBwczogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBzZXRzQ3VycmVudCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe1xuICAgICAgICB1c2VyczogdXNlcklkLFxuICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgYXNzaWduZWRfYXBwczogMSxcbiAgICAgICAgICBuYW1lOiAxXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIHBzZXRzQWRtaW5fcG9zID0gbnVsbDtcbiAgICBwc2V0c1VzZXJfcG9zID0gbnVsbDtcbiAgICBwc2V0c01lbWJlcl9wb3MgPSBudWxsO1xuICAgIHBzZXRzR3Vlc3RfcG9zID0gbnVsbDtcbiAgICBwc2V0c0N1cnJlbnRfcG9zID0gbnVsbDtcbiAgICBwc2V0c1N1cHBsaWVyX3BvcyA9IG51bGw7XG4gICAgcHNldHNDdXN0b21lcl9wb3MgPSBudWxsO1xuICAgIGlmIChwc2V0c0FkbWluICE9IG51bGwgPyBwc2V0c0FkbWluLl9pZCA6IHZvaWQgMCkge1xuICAgICAgcHNldHNBZG1pbl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiBwc2V0c0FkbWluLl9pZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBjcmVhdGVkOiAwLFxuICAgICAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzVXNlciAhPSBudWxsID8gcHNldHNVc2VyLl9pZCA6IHZvaWQgMCkge1xuICAgICAgcHNldHNVc2VyX3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtcbiAgICAgICAgcGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzVXNlci5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgICBtb2RpZmllZDogMCxcbiAgICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIGlmIChwc2V0c01lbWJlciAhPSBudWxsID8gcHNldHNNZW1iZXIuX2lkIDogdm9pZCAwKSB7XG4gICAgICBwc2V0c01lbWJlcl9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiBwc2V0c01lbWJlci5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgICBtb2RpZmllZDogMCxcbiAgICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIGlmIChwc2V0c0d1ZXN0ICE9IG51bGwgPyBwc2V0c0d1ZXN0Ll9pZCA6IHZvaWQgMCkge1xuICAgICAgcHNldHNHdWVzdF9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiBwc2V0c0d1ZXN0Ll9pZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBjcmVhdGVkOiAwLFxuICAgICAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzU3VwcGxpZXIgIT0gbnVsbCA/IHBzZXRzU3VwcGxpZXIuX2lkIDogdm9pZCAwKSB7XG4gICAgICBwc2V0c1N1cHBsaWVyX3BvcyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fb2JqZWN0c1wiKS5maW5kKHtcbiAgICAgICAgcGVybWlzc2lvbl9zZXRfaWQ6IHBzZXRzU3VwcGxpZXIuX2lkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICAgICAgbW9kaWZpZWQ6IDAsXG4gICAgICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgICAgICBtb2RpZmllZF9ieTogMFxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBpZiAocHNldHNDdXN0b21lciAhPSBudWxsID8gcHNldHNDdXN0b21lci5faWQgOiB2b2lkIDApIHtcbiAgICAgIHBzZXRzQ3VzdG9tZXJfcG9zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9vYmplY3RzXCIpLmZpbmQoe1xuICAgICAgICBwZXJtaXNzaW9uX3NldF9pZDogcHNldHNDdXN0b21lci5faWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgY3JlYXRlZDogMCxcbiAgICAgICAgICBtb2RpZmllZDogMCxcbiAgICAgICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgfVxuICAgIGlmIChwc2V0c0N1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgc2V0X2lkcyA9IF8ucGx1Y2socHNldHNDdXJyZW50LCBcIl9pZFwiKTtcbiAgICAgIHBzZXRzQ3VycmVudF9wb3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICAgIHBlcm1pc3Npb25fc2V0X2lkOiB7XG4gICAgICAgICAgJGluOiBzZXRfaWRzXG4gICAgICAgIH1cbiAgICAgIH0pLmZldGNoKCk7XG4gICAgICBwc2V0c0N1cnJlbnROYW1lcyA9IF8ucGx1Y2socHNldHNDdXJyZW50LCBcIm5hbWVcIik7XG4gICAgfVxuICAgIHBzZXRzID0ge1xuICAgICAgcHNldHNBZG1pbjogcHNldHNBZG1pbixcbiAgICAgIHBzZXRzVXNlcjogcHNldHNVc2VyLFxuICAgICAgcHNldHNDdXJyZW50OiBwc2V0c0N1cnJlbnQsXG4gICAgICBwc2V0c01lbWJlcjogcHNldHNNZW1iZXIsXG4gICAgICBwc2V0c0d1ZXN0OiBwc2V0c0d1ZXN0LFxuICAgICAgcHNldHNTdXBwbGllcjogcHNldHNTdXBwbGllcixcbiAgICAgIHBzZXRzQ3VzdG9tZXI6IHBzZXRzQ3VzdG9tZXIsXG4gICAgICBpc1NwYWNlQWRtaW46IGlzU3BhY2VBZG1pbixcbiAgICAgIHNwYWNlVXNlcjogc3BhY2VVc2VyLFxuICAgICAgcHNldHNBZG1pbl9wb3M6IHBzZXRzQWRtaW5fcG9zLFxuICAgICAgcHNldHNVc2VyX3BvczogcHNldHNVc2VyX3BvcyxcbiAgICAgIHBzZXRzTWVtYmVyX3BvczogcHNldHNNZW1iZXJfcG9zLFxuICAgICAgcHNldHNHdWVzdF9wb3M6IHBzZXRzR3Vlc3RfcG9zLFxuICAgICAgcHNldHNTdXBwbGllcl9wb3M6IHBzZXRzU3VwcGxpZXJfcG9zLFxuICAgICAgcHNldHNDdXN0b21lcl9wb3M6IHBzZXRzQ3VzdG9tZXJfcG9zLFxuICAgICAgcHNldHNDdXJyZW50X3BvczogcHNldHNDdXJyZW50X3Bvc1xuICAgIH07XG4gICAgcGVybWlzc2lvbnMuYXNzaWduZWRfYXBwcyA9IENyZWF0b3IuZ2V0QXNzaWduZWRBcHBzLmJpbmQocHNldHMpKHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgcGVybWlzc2lvbnMuYXNzaWduZWRfbWVudXMgPSBDcmVhdG9yLmdldEFzc2lnbmVkTWVudXMuYmluZChwc2V0cykoc3BhY2VJZCwgdXNlcklkKTtcbiAgICBwZXJtaXNzaW9ucy51c2VyX3Blcm1pc3Npb25fc2V0cyA9IHBzZXRzQ3VycmVudE5hbWVzO1xuICAgIF9pID0gMDtcbiAgICBfLmVhY2goQ3JlYXRvci5vYmplY3RzQnlOYW1lLCBmdW5jdGlvbihvYmplY3QsIG9iamVjdF9uYW1lKSB7XG4gICAgICBfaSsrO1xuICAgICAgaWYgKCFfLmhhcyhvYmplY3QsICdzcGFjZScpIHx8ICFvYmplY3Quc3BhY2UgfHwgb2JqZWN0LnNwYWNlID09PSBzcGFjZUlkKSB7XG4gICAgICAgIGlmICghXy5oYXMob2JqZWN0LCAnaW5fZGV2ZWxvcG1lbnQnKSB8fCBvYmplY3QuaW5fZGV2ZWxvcG1lbnQgPT09ICcwJyB8fCAob2JqZWN0LmluX2RldmVsb3BtZW50ICE9PSAnMCcgJiYgaXNTcGFjZUFkbWluKSkge1xuICAgICAgICAgIHBlcm1pc3Npb25zLm9iamVjdHNbb2JqZWN0X25hbWVdID0gQ3JlYXRvci5jb252ZXJ0T2JqZWN0KGNsb25lKENyZWF0b3IuT2JqZWN0c1tvYmplY3RfbmFtZV0pLCBzcGFjZUlkKTtcbiAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMub2JqZWN0c1tvYmplY3RfbmFtZV1bXCJwZXJtaXNzaW9uc1wiXSA9IENyZWF0b3IuZ2V0T2JqZWN0UGVybWlzc2lvbnMuYmluZChwc2V0cykoc3BhY2VJZCwgdXNlcklkLCBvYmplY3RfbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH07XG4gIHVuaW9uUGx1cyA9IGZ1bmN0aW9uKGFycmF5LCBvdGhlcikge1xuICAgIGlmICghYXJyYXkgJiYgIW90aGVyKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIWFycmF5KSB7XG4gICAgICBhcnJheSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIW90aGVyKSB7XG4gICAgICBvdGhlciA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gXy51bmlvbihhcnJheSwgb3RoZXIpO1xuICB9O1xuICBpbnRlcnNlY3Rpb25QbHVzID0gZnVuY3Rpb24oYXJyYXksIG90aGVyKSB7XG4gICAgaWYgKCFhcnJheSAmJiAhb3RoZXIpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGlmICghYXJyYXkpIHtcbiAgICAgIGFycmF5ID0gW107XG4gICAgfVxuICAgIGlmICghb3RoZXIpIHtcbiAgICAgIG90aGVyID0gW107XG4gICAgfVxuICAgIHJldHVybiBfLmludGVyc2VjdGlvbihhcnJheSwgb3RoZXIpO1xuICB9O1xuICBleHRlbmRQZXJtaXNzaW9uUHJvcHMgPSBmdW5jdGlvbih0YXJnZXQsIHByb3BzKSB7XG4gICAgdmFyIGZpbGVzUHJvTmFtZXMsIHByb3BOYW1lcztcbiAgICBwcm9wTmFtZXMgPSBwZXJtaXNzaW9uUHJvcE5hbWVzO1xuICAgIHJldHVybiBmaWxlc1Byb05hbWVzID0gcHJvcHMgPyBfLmVhY2gocHJvcE5hbWVzLCBmdW5jdGlvbihwcm9wTmFtZSkge1xuICAgICAgcmV0dXJuIHRhcmdldFtwcm9wTmFtZV0gPSBwcm9wc1twcm9wTmFtZV07XG4gICAgfSkgOiB2b2lkIDA7XG4gIH07XG4gIG92ZXJsYXlCYXNlQm9vbGVhblBlcm1pc3Npb25Qcm9wcyA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcHMpIHtcbiAgICB2YXIgcHJvcE5hbWVzO1xuICAgIHByb3BOYW1lcyA9IGJhc2VCb29sZWFuUGVybWlzc2lvblByb3BOYW1lcztcbiAgICByZXR1cm4gXy5lYWNoKHByb3BOYW1lcywgZnVuY3Rpb24ocHJvcE5hbWUpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wTmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBDcmVhdG9yLmdldEFzc2lnbmVkQXBwcyA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCkge1xuICAgIHZhciBhcHBzLCBpc1NwYWNlQWRtaW4sIHBzZXRCYXNlLCBwc2V0cywgcHNldHNBZG1pbiwgcHNldHNDdXN0b21lciwgcHNldHNTdXBwbGllciwgcHNldHNVc2VyLCByZWYsIHJlZjEsIHNwYWNlVXNlciwgdXNlclByb2ZpbGU7XG4gICAgcHNldHNBZG1pbiA9IHRoaXMucHNldHNBZG1pbiB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ2FkbWluJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIGFzc2lnbmVkX2FwcHM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c1VzZXIgPSB0aGlzLnBzZXRzVXNlciB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgbmFtZTogJ3VzZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzU3VwcGxpZXIgPSB0aGlzLnBzZXRzTWVtYmVyIHx8IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnc3VwcGxpZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMSxcbiAgICAgICAgYXNzaWduZWRfYXBwczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzQ3VzdG9tZXIgPSB0aGlzLnBzZXRzR3Vlc3QgfHwgQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdjdXN0b21lcidcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxLFxuICAgICAgICBhc3NpZ25lZF9hcHBzOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgc3BhY2VVc2VyID0gbnVsbDtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBzcGFjZVVzZXIgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBwcm9maWxlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3BhY2VVc2VyICYmIHNwYWNlVXNlci5wcm9maWxlKSB7XG4gICAgICBwc2V0cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe1xuICAgICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgICAgJG9yOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlcnM6IHVzZXJJZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIG5hbWU6IHNwYWNlVXNlci5wcm9maWxlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMSxcbiAgICAgICAgICBhc3NpZ25lZF9hcHBzOiAxLFxuICAgICAgICAgIG5hbWU6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHNldHMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgICAgdXNlcnM6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgIGFzc2lnbmVkX2FwcHM6IDEsXG4gICAgICAgICAgbmFtZTogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgIH1cbiAgICBpc1NwYWNlQWRtaW4gPSBfLmlzQm9vbGVhbih0aGlzLmlzU3BhY2VBZG1pbikgPyB0aGlzLmlzU3BhY2VBZG1pbiA6IENyZWF0b3IuaXNTcGFjZUFkbWluKHNwYWNlSWQsIHVzZXJJZCk7XG4gICAgYXBwcyA9IFtdO1xuICAgIGlmIChpc1NwYWNlQWRtaW4pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclByb2ZpbGUgPSAocmVmID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7XG4gICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICB1c2VyOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgcHJvZmlsZTogMVxuICAgICAgICB9XG4gICAgICB9KSkgIT0gbnVsbCA/IHJlZi5wcm9maWxlIDogdm9pZCAwO1xuICAgICAgcHNldEJhc2UgPSBwc2V0c1VzZXI7XG4gICAgICBpZiAodXNlclByb2ZpbGUpIHtcbiAgICAgICAgaWYgKHVzZXJQcm9maWxlID09PSAnc3VwcGxpZXInKSB7XG4gICAgICAgICAgcHNldEJhc2UgPSBwc2V0c1N1cHBsaWVyO1xuICAgICAgICB9IGVsc2UgaWYgKHVzZXJQcm9maWxlID09PSAnY3VzdG9tZXInKSB7XG4gICAgICAgICAgcHNldEJhc2UgPSBwc2V0c0N1c3RvbWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHNldEJhc2UgIT0gbnVsbCA/IChyZWYxID0gcHNldEJhc2UuYXNzaWduZWRfYXBwcykgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwKSB7XG4gICAgICAgIGFwcHMgPSBfLnVuaW9uKGFwcHMsIHBzZXRCYXNlLmFzc2lnbmVkX2FwcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgXy5lYWNoKHBzZXRzLCBmdW5jdGlvbihwc2V0KSB7XG4gICAgICAgIGlmICghcHNldC5hc3NpZ25lZF9hcHBzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwc2V0Lm5hbWUgPT09IFwiYWRtaW5cIiB8fCBwc2V0Lm5hbWUgPT09IFwidXNlclwiIHx8IHBzZXQubmFtZSA9PT0gJ3N1cHBsaWVyJyB8fCBwc2V0Lm5hbWUgPT09ICdjdXN0b21lcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcHMgPSBfLnVuaW9uKGFwcHMsIHBzZXQuYXNzaWduZWRfYXBwcyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfLndpdGhvdXQoXy51bmlxKGFwcHMpLCB2b2lkIDAsIG51bGwpO1xuICAgIH1cbiAgfTtcbiAgQ3JlYXRvci5nZXRBc3NpZ25lZE1lbnVzID0gZnVuY3Rpb24oc3BhY2VJZCwgdXNlcklkKSB7XG4gICAgdmFyIGFib3V0TWVudSwgYWRtaW5NZW51cywgYWxsTWVudXMsIGN1cnJlbnRQc2V0TmFtZXMsIGlzU3BhY2VBZG1pbiwgbWVudXMsIG90aGVyTWVudUFwcHMsIG90aGVyTWVudXMsIHBzZXRzLCByZWYsIHJlZjEsIHJlc3VsdCwgdXNlclByb2ZpbGU7XG4gICAgcHNldHMgPSB0aGlzLnBzZXRzQ3VycmVudCB8fCBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX3NldFwiKS5maW5kKHtcbiAgICAgIHVzZXJzOiB1c2VySWQsXG4gICAgICBzcGFjZTogc3BhY2VJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDEsXG4gICAgICAgIGFzc2lnbmVkX2FwcHM6IDEsXG4gICAgICAgIG5hbWU6IDFcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIGlzU3BhY2VBZG1pbiA9IF8uaXNCb29sZWFuKHRoaXMuaXNTcGFjZUFkbWluKSA/IHRoaXMuaXNTcGFjZUFkbWluIDogQ3JlYXRvci5pc1NwYWNlQWRtaW4oc3BhY2VJZCwgdXNlcklkKTtcbiAgICBhZG1pbk1lbnVzID0gKHJlZiA9IENyZWF0b3IuQXBwcy5hZG1pbikgIT0gbnVsbCA/IHJlZi5hZG1pbl9tZW51cyA6IHZvaWQgMDtcbiAgICBpZiAoIWFkbWluTWVudXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgYWJvdXRNZW51ID0gYWRtaW5NZW51cy5maW5kKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHJldHVybiBuLl9pZCA9PT0gJ2Fib3V0JztcbiAgICB9KTtcbiAgICBhZG1pbk1lbnVzID0gYWRtaW5NZW51cy5maWx0ZXIoZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIG4uX2lkICE9PSAnYWJvdXQnO1xuICAgIH0pO1xuICAgIG90aGVyTWVudUFwcHMgPSBfLnNvcnRCeShfLmZpbHRlcihfLnZhbHVlcyhDcmVhdG9yLkFwcHMpLCBmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gbi5hZG1pbl9tZW51cyAmJiBuLl9pZCAhPT0gJ2FkbWluJztcbiAgICB9KSwgJ3NvcnQnKTtcbiAgICBvdGhlck1lbnVzID0gXy5mbGF0dGVuKF8ucGx1Y2sob3RoZXJNZW51QXBwcywgXCJhZG1pbl9tZW51c1wiKSk7XG4gICAgYWxsTWVudXMgPSBfLnVuaW9uKGFkbWluTWVudXMsIG90aGVyTWVudXMsIFthYm91dE1lbnVdKTtcbiAgICBpZiAoaXNTcGFjZUFkbWluKSB7XG4gICAgICByZXN1bHQgPSBhbGxNZW51cztcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlclByb2ZpbGUgPSAoKHJlZjEgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJzcGFjZV91c2Vyc1wiKS5maW5kT25lKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBwcm9maWxlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSAhPSBudWxsID8gcmVmMS5wcm9maWxlIDogdm9pZCAwKSB8fCAndXNlcic7XG4gICAgICBjdXJyZW50UHNldE5hbWVzID0gcHNldHMubWFwKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIG4ubmFtZTtcbiAgICAgIH0pO1xuICAgICAgbWVudXMgPSBhbGxNZW51cy5maWx0ZXIoZnVuY3Rpb24obWVudSkge1xuICAgICAgICB2YXIgcHNldHNNZW51O1xuICAgICAgICBwc2V0c01lbnUgPSBtZW51LnBlcm1pc3Npb25fc2V0cztcbiAgICAgICAgaWYgKHBzZXRzTWVudSAmJiBwc2V0c01lbnUuaW5kZXhPZih1c2VyUHJvZmlsZSkgPiAtMSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfLmludGVyc2VjdGlvbihjdXJyZW50UHNldE5hbWVzLCBwc2V0c01lbnUpLmxlbmd0aDtcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0ID0gbWVudXM7XG4gICAgfVxuICAgIHJldHVybiBfLnNvcnRCeShyZXN1bHQsIFwic29ydFwiKTtcbiAgfTtcbiAgZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdCA9IGZ1bmN0aW9uKHBlcm1pc3Npb25fb2JqZWN0cywgb2JqZWN0X25hbWUsIHBlcm1pc3Npb25fc2V0X2lkKSB7XG4gICAgaWYgKF8uaXNOdWxsKHBlcm1pc3Npb25fb2JqZWN0cykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoXy5pc0FycmF5KHBlcm1pc3Npb25fb2JqZWN0cykpIHtcbiAgICAgIHJldHVybiBfLmZpbmQocGVybWlzc2lvbl9vYmplY3RzLCBmdW5jdGlvbihwbykge1xuICAgICAgICByZXR1cm4gcG8ub2JqZWN0X25hbWUgPT09IG9iamVjdF9uYW1lO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZE9uZSh7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgICBwZXJtaXNzaW9uX3NldF9pZDogcGVybWlzc2lvbl9zZXRfaWRcbiAgICB9KTtcbiAgfTtcbiAgZmluZF9wZXJtaXNzaW9uX29iamVjdCA9IGZ1bmN0aW9uKHBlcm1pc3Npb25fb2JqZWN0cywgb2JqZWN0X25hbWUsIHBlcm1pc3Npb25fc2V0X2lkcykge1xuICAgIGlmIChfLmlzTnVsbChwZXJtaXNzaW9uX29iamVjdHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF8uaXNBcnJheShwZXJtaXNzaW9uX29iamVjdHMpKSB7XG4gICAgICByZXR1cm4gXy5maWx0ZXIocGVybWlzc2lvbl9vYmplY3RzLCBmdW5jdGlvbihwbykge1xuICAgICAgICByZXR1cm4gcG8ub2JqZWN0X25hbWUgPT09IG9iamVjdF9uYW1lO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJwZXJtaXNzaW9uX29iamVjdHNcIikuZmluZCh7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgICBwZXJtaXNzaW9uX3NldF9pZDoge1xuICAgICAgICAkaW46IHBlcm1pc3Npb25fc2V0X2lkc1xuICAgICAgfVxuICAgIH0pLmZldGNoKCk7XG4gIH07XG4gIHVuaW9uUGVybWlzc2lvbk9iamVjdHMgPSBmdW5jdGlvbihwb3MsIG9iamVjdCwgcHNldHMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIHJlc3VsdCA9IFtdO1xuICAgIF8uZWFjaChvYmplY3QucGVybWlzc2lvbl9zZXQsIGZ1bmN0aW9uKG9wcywgb3BzX2tleSkge1xuICAgICAgdmFyIGN1cnJlbnRQc2V0LCB0ZW1wT3BzO1xuICAgICAgaWYgKFtcImFkbWluXCIsIFwidXNlclwiLCBcIm1lbWJlclwiLCBcImd1ZXN0XCJdLmluZGV4T2Yob3BzX2tleSkgPCAwKSB7XG4gICAgICAgIGN1cnJlbnRQc2V0ID0gcHNldHMuZmluZChmdW5jdGlvbihwc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHBzZXQubmFtZSA9PT0gb3BzX2tleTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdXJyZW50UHNldCkge1xuICAgICAgICAgIHRlbXBPcHMgPSBfLmNsb25lKG9wcykgfHwge307XG4gICAgICAgICAgdGVtcE9wcy5wZXJtaXNzaW9uX3NldF9pZCA9IGN1cnJlbnRQc2V0Ll9pZDtcbiAgICAgICAgICB0ZW1wT3BzLm9iamVjdF9uYW1lID0gb2JqZWN0Lm9iamVjdF9uYW1lO1xuICAgICAgICAgIHJldHVybiByZXN1bHQucHVzaCh0ZW1wT3BzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICBwb3MuZm9yRWFjaChmdW5jdGlvbihwbykge1xuICAgICAgICB2YXIgcmVwZWF0SW5kZXgsIHJlcGVhdFBvO1xuICAgICAgICByZXBlYXRJbmRleCA9IDA7XG4gICAgICAgIHJlcGVhdFBvID0gcmVzdWx0LmZpbmQoZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICByZXBlYXRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiBpdGVtLnBlcm1pc3Npb25fc2V0X2lkID09PSBwby5wZXJtaXNzaW9uX3NldF9pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXBlYXRQbykge1xuICAgICAgICAgIHJldHVybiByZXN1bHRbcmVwZWF0SW5kZXhdID0gcG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5wdXNoKHBvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgfTtcbiAgQ3JlYXRvci5nZXRPYmplY3RQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCwgb2JqZWN0X25hbWUpIHtcbiAgICB2YXIgaXNTcGFjZUFkbWluLCBvYmplY3QsIG9wc2V0QWRtaW4sIG9wc2V0Q3VzdG9tZXIsIG9wc2V0R3Vlc3QsIG9wc2V0TWVtYmVyLCBvcHNldFN1cHBsaWVyLCBvcHNldFVzZXIsIHBlcm1pc3Npb25zLCBwb3MsIHBvc0FkbWluLCBwb3NDdXN0b21lciwgcG9zR3Vlc3QsIHBvc01lbWJlciwgcG9zU3VwcGxpZXIsIHBvc1VzZXIsIHByb2YsIHBzZXRzLCBwc2V0c0FkbWluLCBwc2V0c0FkbWluX3BvcywgcHNldHNDdXJyZW50X3BvcywgcHNldHNDdXN0b21lciwgcHNldHNDdXN0b21lcl9wb3MsIHBzZXRzR3Vlc3QsIHBzZXRzR3Vlc3RfcG9zLCBwc2V0c01lbWJlciwgcHNldHNNZW1iZXJfcG9zLCBwc2V0c1N1cHBsaWVyLCBwc2V0c1N1cHBsaWVyX3BvcywgcHNldHNVc2VyLCBwc2V0c1VzZXJfcG9zLCBzZXRfaWRzLCBzcGFjZVVzZXI7XG4gICAgcGVybWlzc2lvbnMgPSB7fTtcbiAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSwgc3BhY2VJZCk7XG4gICAgaWYgKHNwYWNlSWQgPT09ICdndWVzdCcgfHwgb2JqZWN0X25hbWUgPT09IFwidXNlcnNcIikge1xuICAgICAgcGVybWlzc2lvbnMgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5ndWVzdCkgfHwge307XG4gICAgICBDcmVhdG9yLnByb2Nlc3NQZXJtaXNzaW9ucyhwZXJtaXNzaW9ucyk7XG4gICAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gICAgfVxuICAgIHBzZXRzQWRtaW4gPSBfLmlzTnVsbCh0aGlzLnBzZXRzQWRtaW4pIHx8IHRoaXMucHNldHNBZG1pbiA/IHRoaXMucHNldHNBZG1pbiA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnYWRtaW4nXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzVXNlciA9IF8uaXNOdWxsKHRoaXMucHNldHNVc2VyKSB8fCB0aGlzLnBzZXRzVXNlciA/IHRoaXMucHNldHNVc2VyIDogQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICd1c2VyJ1xuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBfaWQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwc2V0c01lbWJlciA9IF8uaXNOdWxsKHRoaXMucHNldHNNZW1iZXIpIHx8IHRoaXMucHNldHNNZW1iZXIgPyB0aGlzLnBzZXRzTWVtYmVyIDogQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIG5hbWU6ICdtZW1iZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzR3Vlc3QgPSBfLmlzTnVsbCh0aGlzLnBzZXRzR3Vlc3QpIHx8IHRoaXMucHNldHNHdWVzdCA/IHRoaXMucHNldHNHdWVzdCA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnZ3Vlc3QnXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzU3VwcGxpZXIgPSBfLmlzTnVsbCh0aGlzLnBzZXRzU3VwcGxpZXIpIHx8IHRoaXMucHNldHNTdXBwbGllciA/IHRoaXMucHNldHNTdXBwbGllciA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnc3VwcGxpZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzQ3VzdG9tZXIgPSBfLmlzTnVsbCh0aGlzLnBzZXRzQ3VzdG9tZXIpIHx8IHRoaXMucHNldHNDdXN0b21lciA/IHRoaXMucHNldHNDdXN0b21lciA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICBuYW1lOiAnY3VzdG9tZXInXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIHBzZXRzID0gdGhpcy5wc2V0c0N1cnJlbnQ7XG4gICAgaWYgKCFwc2V0cykge1xuICAgICAgc3BhY2VVc2VyID0gbnVsbDtcbiAgICAgIGlmICh1c2VySWQpIHtcbiAgICAgICAgc3BhY2VVc2VyID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwic3BhY2VfdXNlcnNcIikuZmluZE9uZSh7XG4gICAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICAgdXNlcjogdXNlcklkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHByb2ZpbGU6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNwYWNlVXNlciAmJiBzcGFjZVVzZXIucHJvZmlsZSkge1xuICAgICAgICBwc2V0cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInBlcm1pc3Npb25fc2V0XCIpLmZpbmQoe1xuICAgICAgICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgICAgICAgICRvcjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1c2VyczogdXNlcklkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIG5hbWU6IHNwYWNlVXNlci5wcm9maWxlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICBhc3NpZ25lZF9hcHBzOiAxLFxuICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSkuZmV0Y2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBzZXRzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwicGVybWlzc2lvbl9zZXRcIikuZmluZCh7XG4gICAgICAgICAgdXNlcnM6IHVzZXJJZCxcbiAgICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgICBhc3NpZ25lZF9hcHBzOiAxLFxuICAgICAgICAgICAgbmFtZTogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSkuZmV0Y2goKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXNTcGFjZUFkbWluID0gXy5pc0Jvb2xlYW4odGhpcy5pc1NwYWNlQWRtaW4pID8gdGhpcy5pc1NwYWNlQWRtaW4gOiBDcmVhdG9yLmlzU3BhY2VBZG1pbihzcGFjZUlkLCB1c2VySWQpO1xuICAgIHBzZXRzQWRtaW5fcG9zID0gdGhpcy5wc2V0c0FkbWluX3BvcztcbiAgICBwc2V0c1VzZXJfcG9zID0gdGhpcy5wc2V0c1VzZXJfcG9zO1xuICAgIHBzZXRzTWVtYmVyX3BvcyA9IHRoaXMucHNldHNNZW1iZXJfcG9zO1xuICAgIHBzZXRzR3Vlc3RfcG9zID0gdGhpcy5wc2V0c0d1ZXN0X3BvcztcbiAgICBwc2V0c1N1cHBsaWVyX3BvcyA9IHRoaXMucHNldHNTdXBwbGllcl9wb3M7XG4gICAgcHNldHNDdXN0b21lcl9wb3MgPSB0aGlzLnBzZXRzQ3VzdG9tZXJfcG9zO1xuICAgIHBzZXRzQ3VycmVudF9wb3MgPSB0aGlzLnBzZXRzQ3VycmVudF9wb3M7XG4gICAgb3BzZXRBZG1pbiA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0LmFkbWluKSB8fCB7fTtcbiAgICBvcHNldFVzZXIgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC51c2VyKSB8fCB7fTtcbiAgICBvcHNldE1lbWJlciA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0Lm1lbWJlcikgfHwge307XG4gICAgb3BzZXRHdWVzdCA9IF8uY2xvbmUob2JqZWN0LnBlcm1pc3Npb25fc2V0Lmd1ZXN0KSB8fCB7fTtcbiAgICBvcHNldFN1cHBsaWVyID0gXy5jbG9uZShvYmplY3QucGVybWlzc2lvbl9zZXQuc3VwcGxpZXIpIHx8IHt9O1xuICAgIG9wc2V0Q3VzdG9tZXIgPSBfLmNsb25lKG9iamVjdC5wZXJtaXNzaW9uX3NldC5jdXN0b21lcikgfHwge307XG4gICAgaWYgKHBzZXRzQWRtaW4pIHtcbiAgICAgIHBvc0FkbWluID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0FkbWluX3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzQWRtaW4uX2lkKTtcbiAgICAgIGV4dGVuZFBlcm1pc3Npb25Qcm9wcyhvcHNldEFkbWluLCBwb3NBZG1pbik7XG4gICAgfVxuICAgIGlmIChwc2V0c1VzZXIpIHtcbiAgICAgIHBvc1VzZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzVXNlcl9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c1VzZXIuX2lkKTtcbiAgICAgIGV4dGVuZFBlcm1pc3Npb25Qcm9wcyhvcHNldFVzZXIsIHBvc1VzZXIpO1xuICAgIH1cbiAgICBpZiAocHNldHNNZW1iZXIpIHtcbiAgICAgIHBvc01lbWJlciA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNNZW1iZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNNZW1iZXIuX2lkKTtcbiAgICAgIGV4dGVuZFBlcm1pc3Npb25Qcm9wcyhvcHNldE1lbWJlciwgcG9zTWVtYmVyKTtcbiAgICB9XG4gICAgaWYgKHBzZXRzR3Vlc3QpIHtcbiAgICAgIHBvc0d1ZXN0ID0gZmluZE9uZV9wZXJtaXNzaW9uX29iamVjdChwc2V0c0d1ZXN0X3Bvcywgb2JqZWN0X25hbWUsIHBzZXRzR3Vlc3QuX2lkKTtcbiAgICAgIGV4dGVuZFBlcm1pc3Npb25Qcm9wcyhvcHNldEd1ZXN0LCBwb3NHdWVzdCk7XG4gICAgfVxuICAgIGlmIChwc2V0c1N1cHBsaWVyKSB7XG4gICAgICBwb3NTdXBwbGllciA9IGZpbmRPbmVfcGVybWlzc2lvbl9vYmplY3QocHNldHNTdXBwbGllcl9wb3MsIG9iamVjdF9uYW1lLCBwc2V0c1N1cHBsaWVyLl9pZCk7XG4gICAgICBleHRlbmRQZXJtaXNzaW9uUHJvcHMob3BzZXRTdXBwbGllciwgcG9zU3VwcGxpZXIpO1xuICAgIH1cbiAgICBpZiAocHNldHNDdXN0b21lcikge1xuICAgICAgcG9zQ3VzdG9tZXIgPSBmaW5kT25lX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzQ3VzdG9tZXJfcG9zLCBvYmplY3RfbmFtZSwgcHNldHNDdXN0b21lci5faWQpO1xuICAgICAgZXh0ZW5kUGVybWlzc2lvblByb3BzKG9wc2V0Q3VzdG9tZXIsIHBvc0N1c3RvbWVyKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHBlcm1pc3Npb25zID0gb3BzZXRBZG1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzU3BhY2VBZG1pbikge1xuICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0QWRtaW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3BhY2VJZCA9PT0gJ2NvbW1vbicpIHtcbiAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0VXNlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGFjZVVzZXIgPSBfLmlzTnVsbCh0aGlzLnNwYWNlVXNlcikgfHwgdGhpcy5zcGFjZVVzZXIgPyB0aGlzLnNwYWNlVXNlciA6IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcInNwYWNlX3VzZXJzXCIpLmZpbmRPbmUoe1xuICAgICAgICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICAgICAgICB1c2VyOiB1c2VySWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgcHJvZmlsZTogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChzcGFjZVVzZXIpIHtcbiAgICAgICAgICAgIHByb2YgPSBzcGFjZVVzZXIucHJvZmlsZTtcbiAgICAgICAgICAgIGlmIChwcm9mKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9mID09PSAndXNlcicpIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0VXNlcjtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9mID09PSAnbWVtYmVyJykge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb3BzZXRNZW1iZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZiA9PT0gJ2d1ZXN0Jykge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb3BzZXRHdWVzdDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9mID09PSAnc3VwcGxpZXInKSB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBvcHNldFN1cHBsaWVyO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2YgPT09ICdjdXN0b21lcicpIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0Q3VzdG9tZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gb3BzZXRVc2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG9wc2V0R3Vlc3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRfaWRzID0gXy5wbHVjayhwc2V0cywgXCJfaWRcIik7XG4gICAgICBwb3MgPSBmaW5kX3Blcm1pc3Npb25fb2JqZWN0KHBzZXRzQ3VycmVudF9wb3MsIG9iamVjdF9uYW1lLCBzZXRfaWRzKTtcbiAgICAgIHBvcyA9IHVuaW9uUGVybWlzc2lvbk9iamVjdHMocG9zLCBvYmplY3QsIHBzZXRzKTtcbiAgICAgIF8uZWFjaChwb3MsIGZ1bmN0aW9uKHBvKSB7XG4gICAgICAgIGlmIChwby5wZXJtaXNzaW9uX3NldF9pZCA9PT0gKHBzZXRzQWRtaW4gIT0gbnVsbCA/IHBzZXRzQWRtaW4uX2lkIDogdm9pZCAwKSB8fCBwby5wZXJtaXNzaW9uX3NldF9pZCA9PT0gKHBzZXRzVXNlciAhPSBudWxsID8gcHNldHNVc2VyLl9pZCA6IHZvaWQgMCkgfHwgcG8ucGVybWlzc2lvbl9zZXRfaWQgPT09IChwc2V0c01lbWJlciAhPSBudWxsID8gcHNldHNNZW1iZXIuX2lkIDogdm9pZCAwKSB8fCBwby5wZXJtaXNzaW9uX3NldF9pZCA9PT0gKHBzZXRzR3Vlc3QgIT0gbnVsbCA/IHBzZXRzR3Vlc3QuX2lkIDogdm9pZCAwKSB8fCBwby5wZXJtaXNzaW9uX3NldF9pZCA9PT0gKHBzZXRzU3VwcGxpZXIgIT0gbnVsbCA/IHBzZXRzU3VwcGxpZXIuX2lkIDogdm9pZCAwKSB8fCBwby5wZXJtaXNzaW9uX3NldF9pZCA9PT0gKHBzZXRzQ3VzdG9tZXIgIT0gbnVsbCA/IHBzZXRzQ3VzdG9tZXIuX2lkIDogdm9pZCAwKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zKSkge1xuICAgICAgICAgIHBlcm1pc3Npb25zID0gcG87XG4gICAgICAgIH1cbiAgICAgICAgb3ZlcmxheUJhc2VCb29sZWFuUGVybWlzc2lvblByb3BzKHBlcm1pc3Npb25zLCBwbyk7XG4gICAgICAgIHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MgPSBpbnRlcnNlY3Rpb25QbHVzKHBlcm1pc3Npb25zLmRpc2FibGVkX2xpc3Rfdmlld3MsIHBvLmRpc2FibGVkX2xpc3Rfdmlld3MpO1xuICAgICAgICBwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zLCBwby5kaXNhYmxlZF9hY3Rpb25zKTtcbiAgICAgICAgcGVybWlzc2lvbnMudW5yZWFkYWJsZV9maWVsZHMgPSBpbnRlcnNlY3Rpb25QbHVzKHBlcm1pc3Npb25zLnVucmVhZGFibGVfZmllbGRzLCBwby51bnJlYWRhYmxlX2ZpZWxkcyk7XG4gICAgICAgIHBlcm1pc3Npb25zLnVuZWRpdGFibGVfZmllbGRzID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bmVkaXRhYmxlX2ZpZWxkcywgcG8udW5lZGl0YWJsZV9maWVsZHMpO1xuICAgICAgICBwZXJtaXNzaW9ucy51bnJlbGF0ZWRfb2JqZWN0cyA9IGludGVyc2VjdGlvblBsdXMocGVybWlzc2lvbnMudW5yZWxhdGVkX29iamVjdHMsIHBvLnVucmVsYXRlZF9vYmplY3RzKTtcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLnVuZWRpdGFibGVfcmVsYXRlZF9saXN0ID0gaW50ZXJzZWN0aW9uUGx1cyhwZXJtaXNzaW9ucy51bmVkaXRhYmxlX3JlbGF0ZWRfbGlzdCwgcG8udW5lZGl0YWJsZV9yZWxhdGVkX2xpc3QpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChvYmplY3QuaXNfdmlldykge1xuICAgICAgcGVybWlzc2lvbnMuYWxsb3dDcmVhdGUgPSBmYWxzZTtcbiAgICAgIHBlcm1pc3Npb25zLmFsbG93RWRpdCA9IGZhbHNlO1xuICAgICAgcGVybWlzc2lvbnMuYWxsb3dEZWxldGUgPSBmYWxzZTtcbiAgICAgIHBlcm1pc3Npb25zLm1vZGlmeUFsbFJlY29yZHMgPSBmYWxzZTtcbiAgICAgIHBlcm1pc3Npb25zLm1vZGlmeUNvbXBhbnlSZWNvcmRzID0gZmFsc2U7XG4gICAgICBwZXJtaXNzaW9ucy5kaXNhYmxlZF9hY3Rpb25zID0gW107XG4gICAgfVxuICAgIENyZWF0b3IucHJvY2Vzc1Blcm1pc3Npb25zKHBlcm1pc3Npb25zKTtcbiAgICBpZiAob2JqZWN0LnBlcm1pc3Npb25fc2V0Lm93bmVyKSB7XG4gICAgICBwZXJtaXNzaW9ucy5vd25lciA9IG9iamVjdC5wZXJtaXNzaW9uX3NldC5vd25lcjtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9O1xuICBNZXRlb3IubWV0aG9kcyh7XG4gICAgXCJjcmVhdG9yLm9iamVjdF9wZXJtaXNzaW9uc1wiOiBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgICByZXR1cm4gQ3JlYXRvci5nZXRBbGxQZXJtaXNzaW9ucyhzcGFjZUlkLCB0aGlzLnVzZXJJZCk7XG4gICAgfVxuICB9KTtcbn1cbiIsIlxuc3RlZWRvc0NvcmUgPSByZXF1aXJlKCdAc3RlZWRvcy9jb3JlJylcblxuTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRjcmVhdG9yX2RiX3VybCA9IHByb2Nlc3MuZW52Lk1PTkdPX1VSTF9DUkVBVE9SXG5cdG9wbG9nX3VybCA9IHByb2Nlc3MuZW52Lk1PTkdPX09QTE9HX1VSTF9DUkVBVE9SXG5cdGlmIGNyZWF0b3JfZGJfdXJsXG5cdFx0aWYgIW9wbG9nX3VybFxuXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcig1MDAsIFwiUGxlYXNlIGNvbmZpZ3VyZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IE1PTkdPX09QTE9HX1VSTF9DUkVBVE9SXCIpXG5cdFx0Q3JlYXRvci5fQ1JFQVRPUl9EQVRBU09VUkNFID0ge19kcml2ZXI6IG5ldyBNb25nb0ludGVybmFscy5SZW1vdGVDb2xsZWN0aW9uRHJpdmVyKGNyZWF0b3JfZGJfdXJsLCB7b3Bsb2dVcmw6IG9wbG9nX3VybH0pfVxuXG5DcmVhdG9yLmdldENvbGxlY3Rpb25OYW1lID0gKG9iamVjdCktPlxuI1x0aWYgb2JqZWN0LnRhYmxlX25hbWUgJiYgb2JqZWN0LnRhYmxlX25hbWUuZW5kc1dpdGgoXCJfX2NcIilcbiNcdFx0cmV0dXJuIG9iamVjdC50YWJsZV9uYW1lXG4jXHRlbHNlXG4jXHRcdHJldHVybiBvYmplY3QubmFtZVxuXHRyZXR1cm4gb2JqZWN0Lm5hbWVcbkNyZWF0b3IuY3JlYXRlQ29sbGVjdGlvbiA9IChvYmplY3QpLT5cblx0Y29sbGVjdGlvbl9rZXkgPSBDcmVhdG9yLmdldENvbGxlY3Rpb25OYW1lKG9iamVjdClcblx0aWYgZGJbY29sbGVjdGlvbl9rZXldXG5cdFx0cmV0dXJuIGRiW2NvbGxlY3Rpb25fa2V5XVxuXHRlbHNlIGlmIG9iamVjdC5kYlxuXHRcdHJldHVybiBvYmplY3QuZGJcblxuXHRpZiBDcmVhdG9yLkNvbGxlY3Rpb25zW2NvbGxlY3Rpb25fa2V5XVxuXHRcdHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zW2NvbGxlY3Rpb25fa2V5XVxuXHRlbHNlXG5cdFx0aWYgb2JqZWN0LmN1c3RvbVxuXHRcdFx0cmV0dXJuIHN0ZWVkb3NDb3JlLm5ld0NvbGxlY3Rpb24oY29sbGVjdGlvbl9rZXksIENyZWF0b3IuX0NSRUFUT1JfREFUQVNPVVJDRSlcblx0XHRlbHNlXG5cdFx0XHRpZiBjb2xsZWN0aW9uX2tleSA9PSAnX3Ntc19xdWV1ZScgJiYgU01TUXVldWU/LmNvbGxlY3Rpb25cblx0XHRcdFx0cmV0dXJuIFNNU1F1ZXVlLmNvbGxlY3Rpb25cblx0XHRcdHJldHVybiBzdGVlZG9zQ29yZS5uZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb25fa2V5KVxuXG5cbiIsInZhciBzdGVlZG9zQ29yZTtcblxuc3RlZWRvc0NvcmUgPSByZXF1aXJlKCdAc3RlZWRvcy9jb3JlJyk7XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB2YXIgY3JlYXRvcl9kYl91cmwsIG9wbG9nX3VybDtcbiAgY3JlYXRvcl9kYl91cmwgPSBwcm9jZXNzLmVudi5NT05HT19VUkxfQ1JFQVRPUjtcbiAgb3Bsb2dfdXJsID0gcHJvY2Vzcy5lbnYuTU9OR09fT1BMT0dfVVJMX0NSRUFUT1I7XG4gIGlmIChjcmVhdG9yX2RiX3VybCkge1xuICAgIGlmICghb3Bsb2dfdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDUwMCwgXCJQbGVhc2UgY29uZmlndXJlIGVudmlyb25tZW50IHZhcmlhYmxlczogTU9OR09fT1BMT0dfVVJMX0NSRUFUT1JcIik7XG4gICAgfVxuICAgIHJldHVybiBDcmVhdG9yLl9DUkVBVE9SX0RBVEFTT1VSQ0UgPSB7XG4gICAgICBfZHJpdmVyOiBuZXcgTW9uZ29JbnRlcm5hbHMuUmVtb3RlQ29sbGVjdGlvbkRyaXZlcihjcmVhdG9yX2RiX3VybCwge1xuICAgICAgICBvcGxvZ1VybDogb3Bsb2dfdXJsXG4gICAgICB9KVxuICAgIH07XG4gIH1cbn0pO1xuXG5DcmVhdG9yLmdldENvbGxlY3Rpb25OYW1lID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QubmFtZTtcbn07XG5cbkNyZWF0b3IuY3JlYXRlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgY29sbGVjdGlvbl9rZXk7XG4gIGNvbGxlY3Rpb25fa2V5ID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uTmFtZShvYmplY3QpO1xuICBpZiAoZGJbY29sbGVjdGlvbl9rZXldKSB7XG4gICAgcmV0dXJuIGRiW2NvbGxlY3Rpb25fa2V5XTtcbiAgfSBlbHNlIGlmIChvYmplY3QuZGIpIHtcbiAgICByZXR1cm4gb2JqZWN0LmRiO1xuICB9XG4gIGlmIChDcmVhdG9yLkNvbGxlY3Rpb25zW2NvbGxlY3Rpb25fa2V5XSkge1xuICAgIHJldHVybiBDcmVhdG9yLkNvbGxlY3Rpb25zW2NvbGxlY3Rpb25fa2V5XTtcbiAgfSBlbHNlIHtcbiAgICBpZiAob2JqZWN0LmN1c3RvbSkge1xuICAgICAgcmV0dXJuIHN0ZWVkb3NDb3JlLm5ld0NvbGxlY3Rpb24oY29sbGVjdGlvbl9rZXksIENyZWF0b3IuX0NSRUFUT1JfREFUQVNPVVJDRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uX2tleSA9PT0gJ19zbXNfcXVldWUnICYmICh0eXBlb2YgU01TUXVldWUgIT09IFwidW5kZWZpbmVkXCIgJiYgU01TUXVldWUgIT09IG51bGwgPyBTTVNRdWV1ZS5jb2xsZWN0aW9uIDogdm9pZCAwKSkge1xuICAgICAgICByZXR1cm4gU01TUXVldWUuY29sbGVjdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGVlZG9zQ29yZS5uZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb25fa2V5KTtcbiAgICB9XG4gIH1cbn07XG4iLCJDcmVhdG9yLmFjdGlvbnNCeU5hbWUgPSB7fVxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0IyDlrprkuYnlhajlsYAgYWN0aW9ucyDlh73mlbBcdFxuXHRDcmVhdG9yLmFjdGlvbnMgPSAoYWN0aW9ucyktPlxuXHRcdF8uZWFjaCBhY3Rpb25zLCAodG9kbywgYWN0aW9uX25hbWUpLT5cblx0XHRcdENyZWF0b3IuYWN0aW9uc0J5TmFtZVthY3Rpb25fbmFtZV0gPSB0b2RvIFxuXG5cdENyZWF0b3IuZXhlY3V0ZUFjdGlvbiA9IChvYmplY3RfbmFtZSwgYWN0aW9uLCByZWNvcmRfaWQsIGl0ZW1fZWxlbWVudCwgbGlzdF92aWV3X2lkLCByZWNvcmQsIGNhbGxiYWNrKS0+XG5cdFx0aWYgYWN0aW9uICYmIGFjdGlvbi50eXBlID09ICd3b3JkLXByaW50J1xuXHRcdFx0aWYgcmVjb3JkX2lkXG5cdFx0XHRcdGZpbHRlcnMgPSBbJ19pZCcsICc9JywgcmVjb3JkX2lkXVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmaWx0ZXJzID0gT2JqZWN0R3JpZC5nZXRGaWx0ZXJzKG9iamVjdF9uYW1lLCBsaXN0X3ZpZXdfaWQsIGZhbHNlLCBudWxsLCBudWxsKVxuXHRcdFx0dXJsID0gXCIvYXBpL3Y0L3dvcmRfdGVtcGxhdGVzL1wiICsgYWN0aW9uLndvcmRfdGVtcGxhdGUgKyBcIi9wcmludFwiICsgXCI/ZmlsdGVycz1cIiArIFN0ZWVkb3NGaWx0ZXJzLmZvcm1hdEZpbHRlcnNUb09EYXRhUXVlcnkoZmlsdGVycyk7XG5cdFx0XHR1cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKHVybCk7XG5cdFx0XHRyZXR1cm4gd2luZG93Lm9wZW4odXJsKTtcblxuXHRcdG9iaiA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKVxuXHRcdGlmIGFjdGlvbj8udG9kb1xuXHRcdFx0aWYgdHlwZW9mIGFjdGlvbi50b2RvID09IFwic3RyaW5nXCJcblx0XHRcdFx0dG9kbyA9IENyZWF0b3IuYWN0aW9uc0J5TmFtZVthY3Rpb24udG9kb11cblx0XHRcdGVsc2UgaWYgdHlwZW9mIGFjdGlvbi50b2RvID09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHR0b2RvID0gYWN0aW9uLnRvZG9cdFxuXHRcdFx0aWYgIXJlY29yZCAmJiBvYmplY3RfbmFtZSAmJiByZWNvcmRfaWRcblx0XHRcdFx0cmVjb3JkID0gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZClcblx0XHRcdGlmIHRvZG9cblx0XHRcdFx0IyBpdGVtX2VsZW1lbnTkuLrnqbrml7blupTor6Xorr7nva7pu5jorqTlgLzvvIjlr7nosaHnmoRuYW1l5a2X5q6177yJ77yM5ZCm5YiZbW9yZUFyZ3Pmi7/liLDnmoTlkI7nu63lj4LmlbDkvY3nva7lsLHkuI3lr7lcblx0XHRcdFx0aXRlbV9lbGVtZW50ID0gaWYgaXRlbV9lbGVtZW50IHRoZW4gaXRlbV9lbGVtZW50IGVsc2UgXCJcIlxuXHRcdFx0XHRtb3JlQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMylcblx0XHRcdFx0dG9kb0FyZ3MgPSBbb2JqZWN0X25hbWUsIHJlY29yZF9pZF0uY29uY2F0KG1vcmVBcmdzKVxuXHRcdFx0XHR0b2RvLmFwcGx5IHtcblx0XHRcdFx0XHRvYmplY3RfbmFtZTogb2JqZWN0X25hbWVcblx0XHRcdFx0XHRyZWNvcmRfaWQ6IHJlY29yZF9pZFxuXHRcdFx0XHRcdG9iamVjdDogb2JqXG5cdFx0XHRcdFx0YWN0aW9uOiBhY3Rpb25cblx0XHRcdFx0XHRpdGVtX2VsZW1lbnQ6IGl0ZW1fZWxlbWVudFxuXHRcdFx0XHRcdHJlY29yZDogcmVjb3JkXG5cdFx0XHRcdH0sIHRvZG9BcmdzXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRvYXN0ci53YXJuaW5nKHQoXCJfb2JqZWN0X2FjdGlvbnNfbm9uZV90b2RvXCIpKVxuXHRcdGVsc2Vcblx0XHRcdHRvYXN0ci53YXJuaW5nKHQoXCJfb2JqZWN0X2FjdGlvbnNfbm9uZV90b2RvXCIpKVxuXG5cblx0X2RlbGV0ZVJlY29yZCA9IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2ssIGNhbGxfYmFja19lcnJvciktPlxuXHRcdCMgY29uc29sZS5sb2coXCI9PT1fZGVsZXRlUmVjb3JkPT09XCIsIG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHJlY29yZF90aXRsZSwgbGlzdF92aWV3X2lkLCByZWNvcmQsIGNhbGxfYmFjaywgY2FsbF9iYWNrX2Vycm9yKTtcblx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0XHRwcmV2aW91c0RvYyA9IEZvcm1NYW5hZ2VyLmdldFByZXZpb3VzRG9jKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsICdkZWxldGUnKVxuXHRcdENyZWF0b3Iub2RhdGEuZGVsZXRlIG9iamVjdF9uYW1lLCByZWNvcmRfaWQsICgpLT5cblx0XHRcdGlmIHJlY29yZF90aXRsZVxuXHRcdFx0XHQjIGluZm8gPSBvYmplY3QubGFiZWwgKyBcIlxcXCIje3JlY29yZF90aXRsZX1cXFwiXCIgKyBcIuW3suWIoOmZpFwiXG5cdFx0XHRcdGluZm8gPXQgXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF90aXRsZV9zdWNcIiwgb2JqZWN0LmxhYmVsICsgXCJcXFwiI3tyZWNvcmRfdGl0bGV9XFxcIlwiXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGluZm8gPSB0KCdjcmVhdG9yX3JlY29yZF9yZW1vdmVfc3dhbF9zdWMnKVxuXHRcdFx0dG9hc3RyLnN1Y2Nlc3MgaW5mb1xuXHRcdFx0aWYgY2FsbF9iYWNrIGFuZCB0eXBlb2YgY2FsbF9iYWNrID09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHRjYWxsX2JhY2soKVxuXG5cdFx0XHRGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2FmdGVyJywge19pZDogcmVjb3JkX2lkLCBwcmV2aW91c0RvYzogcHJldmlvdXNEb2N9KVxuXHRcdCwgKGVycm9yKS0+XG5cdFx0XHRpZiBjYWxsX2JhY2tfZXJyb3IgYW5kIHR5cGVvZiBjYWxsX2JhY2tfZXJyb3IgPT0gXCJmdW5jdGlvblwiXG5cdFx0XHRcdGNhbGxfYmFja19lcnJvcigpXG5cdFx0XHRGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2Vycm9yJywge19pZDogcmVjb3JkX2lkLCBlcnJvcjogZXJyb3J9KVxuXG5cdENyZWF0b3IucmVsYXRlZE9iamVjdFN0YW5kYXJkTmV3ID0gKHJlbGF0ZWRfb2JqZWN0X25hbWUpLT5cblx0XHRyZWxhdGVPYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChyZWxhdGVkX29iamVjdF9uYW1lKVxuXHRcdGNvbGxlY3Rpb25fbmFtZSA9IHJlbGF0ZU9iamVjdC5sYWJlbFxuXHRcdGNvbGxlY3Rpb24gPSBcIkNyZWF0b3IuQ29sbGVjdGlvbnMuI3tDcmVhdG9yLmdldE9iamVjdChyZWxhdGVkX29iamVjdF9uYW1lKS5fY29sbGVjdGlvbl9uYW1lfVwiXG5cdFx0Y3VycmVudF9vYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRjdXJyZW50X3JlY29yZF9pZCA9IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpXG5cdFx0aWRzID0gQ3JlYXRvci5UYWJ1bGFyU2VsZWN0ZWRJZHNbcmVsYXRlZF9vYmplY3RfbmFtZV1cblx0XHRpbml0aWFsVmFsdWVzID0ge307XG5cdFx0aWYgaWRzPy5sZW5ndGhcblx0XHRcdCMg5YiX6KGo5pyJ6YCJ5Lit6aG55pe277yM5Y+W56ys5LiA5Liq6YCJ5Lit6aG577yM5aSN5Yi25YW25YaF5a655Yiw5paw5bu656qX5Y+j5LitXG5cdFx0XHQjIOi/meeahOesrOS4gOS4quaMh+eahOaYr+esrOS4gOasoeWLvumAieeahOmAieS4remhue+8jOiAjOS4jeaYr+WIl+ihqOS4reW3suWLvumAieeahOesrOS4gOmhuVxuXHRcdFx0cmVjb3JkX2lkID0gaWRzWzBdXG5cdFx0XHRkb2MgPSBDcmVhdG9yLm9kYXRhLmdldChyZWxhdGVkX29iamVjdF9uYW1lLCByZWNvcmRfaWQpXG5cdFx0XHRpbml0aWFsVmFsdWVzID0gZG9jXG5cdFx0XHQjIOKAnOS/neWtmOW5tuaWsOW7uuKAneaTjeS9nOS4reiHquWKqOaJk+W8gOeahOaWsOeql+WPo+S4remcgOimgeWGjeasoeWkjeWItuacgOaWsOeahGRvY+WGheWuueWIsOaWsOeql+WPo+S4rVxuXHRcdFx0U2Vzc2lvbi5zZXQgJ2NtU2hvd0FnYWluRHVwbGljYXRlZCcsIHRydWVcblx0XHRlbHNlXG5cdFx0XHRkZWZhdWx0RG9jID0gRm9ybU1hbmFnZXIuZ2V0UmVsYXRlZEluaXRpYWxWYWx1ZXMoY3VycmVudF9vYmplY3RfbmFtZSwgY3VycmVudF9yZWNvcmRfaWQsIHJlbGF0ZWRfb2JqZWN0X25hbWUpO1xuXHRcdFx0aWYgIV8uaXNFbXB0eShkZWZhdWx0RG9jKVxuXHRcdFx0XHRpbml0aWFsVmFsdWVzID0gZGVmYXVsdERvY1xuXHRcdGlmIHJlbGF0ZU9iamVjdD8udmVyc2lvbiA+PSAyXG5cdFx0XHRyZXR1cm4gU3RlZWRvc1VJLnNob3dNb2RhbChzdG9yZXMuQ29tcG9uZW50UmVnaXN0cnkuY29tcG9uZW50cy5PYmplY3RGb3JtLCB7XG5cdFx0XHRcdG5hbWU6IFwiI3tyZWxhdGVkX29iamVjdF9uYW1lfV9zdGFuZGFyZF9uZXdfZm9ybVwiLFxuXHRcdFx0XHRvYmplY3RBcGlOYW1lOiByZWxhdGVkX29iamVjdF9uYW1lLFxuXHRcdFx0XHR0aXRsZTogJ+aWsOW7uiAnICsgcmVsYXRlT2JqZWN0LmxhYmVsLFxuXHRcdFx0XHRpbml0aWFsVmFsdWVzOiBpbml0aWFsVmFsdWVzLFxuXHRcdFx0XHRhZnRlckluc2VydDogKHJlc3VsdCktPlxuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCktPlxuXHRcdFx0XHRcdFx0IyBPYmplY3RGb3Jt5pyJ57yT5a2Y77yM5paw5bu65a2Q6KGo6K6w5b2V5Y+v6IO95Lya5pyJ5rGH5oC75a2X5q6177yM6ZyA6KaB5Yi35paw6KGo5Y2V5pWw5o2uXG5cdFx0XHRcdFx0XHRpZiBDcmVhdG9yLmdldE9iamVjdChjdXJyZW50X29iamVjdF9uYW1lKS52ZXJzaW9uID4gMVxuXHRcdFx0XHRcdFx0XHRTdGVlZG9zVUkucmVsb2FkUmVjb3JkKGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkKVxuXHRcdFx0XHRcdFx0Rmxvd1JvdXRlci5yZWxvYWQoKTtcblx0XHRcdFx0XHQsIDEpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSwgbnVsbCwge2ljb25QYXRoOiAnL2Fzc2V0cy9pY29ucyd9KVxuXG5cblx0XHRpZiBpZHM/Lmxlbmd0aFxuXHRcdFx0IyDliJfooajmnInpgInkuK3pobnml7bvvIzlj5bnrKzkuIDkuKrpgInkuK3pobnvvIzlpI3liLblhbblhoXlrrnliLDmlrDlu7rnqpflj6PkuK1cblx0XHRcdCMg6L+Z55qE56ys5LiA5Liq5oyH55qE5piv56ys5LiA5qyh5Yu+6YCJ55qE6YCJ5Lit6aG577yM6ICM5LiN5piv5YiX6KGo5Lit5bey5Yu+6YCJ55qE56ys5LiA6aG5XG5cdFx0XHRTZXNzaW9uLnNldCAnY21Eb2MnLCBpbml0aWFsVmFsdWVzXG5cdFx0XHQjIOKAnOS/neWtmOW5tuaWsOW7uuKAneaTjeS9nOS4reiHquWKqOaJk+W8gOeahOaWsOeql+WPo+S4remcgOimgeWGjeasoeWkjeWItuacgOaWsOeahGRvY+WGheWuueWIsOaWsOeql+WPo+S4rVxuXHRcdFx0U2Vzc2lvbi5zZXQgJ2NtU2hvd0FnYWluRHVwbGljYXRlZCcsIHRydWVcblx0XHRlbHNlXG5cdFx0XHRpZiAhXy5pc0VtcHR5KGluaXRpYWxWYWx1ZXMpXG5cdFx0XHRcdFNlc3Npb24uc2V0ICdjbURvYycsIGluaXRpYWxWYWx1ZXNcblxuXHRcdFNlc3Npb24uc2V0KFwiYWN0aW9uX2ZpZWxkc1wiLCB1bmRlZmluZWQpXG5cdFx0U2Vzc2lvbi5zZXQoXCJhY3Rpb25fY29sbGVjdGlvblwiLCBjb2xsZWN0aW9uKVxuXHRcdFNlc3Npb24uc2V0KFwiYWN0aW9uX2NvbGxlY3Rpb25fbmFtZVwiLCBjb2xsZWN0aW9uX25hbWUpXG5cdFx0U2Vzc2lvbi5zZXQoXCJhY3Rpb25fc2F2ZV9hbmRfaW5zZXJ0XCIsIGZhbHNlKVxuXHRcdE1ldGVvci5kZWZlciAoKS0+XG5cdFx0XHQkKFwiLmNyZWF0b3ItYWRkLXJlbGF0ZWRcIikuY2xpY2soKVxuXHRcdHJldHVyblxuXG5cdENyZWF0b3IuYWN0aW9ucyBcblx0XHQjIOWcqOatpOWumuS5ieWFqOWxgCBhY3Rpb25zXG5cdFx0XCJzdGFuZGFyZF9xdWVyeVwiOiAoKS0+XG5cdFx0XHRNb2RhbC5zaG93KFwic3RhbmRhcmRfcXVlcnlfbW9kYWxcIilcblxuXHRcdFwic3RhbmRhcmRfbmV3XCI6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBmaWVsZHMpLT5cblx0XHRcdCMgY3VycmVudF9yZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKVxuXHRcdFx0IyBpZiBjdXJyZW50X3JlY29yZF9pZFxuXHRcdFx0IyBcdCMgYW1pcyDnm7jlhbPlrZDooajlj7PkuIrop5LmlrDlu7pcblx0XHRcdCMgXHRDcmVhdG9yLnJlbGF0ZWRPYmplY3RTdGFuZGFyZE5ldyhvYmplY3RfbmFtZSlcblx0XHRcdCMgXHRyZXR1cm4gXG5cdFx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG5cdFx0XHRncmlkTmFtZSA9IHRoaXMuYWN0aW9uLmdyaWROYW1lO1xuXHRcdFx0aXNSZWxhdGVkID0gdGhpcy5hY3Rpb24uaXNSZWxhdGVkO1xuXHRcdFx0aWYgaXNSZWxhdGVkXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZE5hbWUgPSB0aGlzLmFjdGlvbi5yZWxhdGVkRmllbGROYW1lO1xuXHRcdFx0XHRtYXN0ZXJSZWNvcmRJZCA9IHRoaXMuYWN0aW9uLm1hc3RlclJlY29yZElkO1xuXHRcdFx0XHRpbml0aWFsVmFsdWVzID0gdGhpcy5hY3Rpb24uaW5pdGlhbFZhbHVlc1xuXHRcdFx0XHRpZiAhaW5pdGlhbFZhbHVlc1xuXHRcdFx0XHRcdGluaXRpYWxWYWx1ZXMgPSB7fTtcblx0XHRcdFx0XHRpbml0aWFsVmFsdWVzW3JlbGF0ZWRGaWVsZE5hbWVdID0gbWFzdGVyUmVjb3JkSWRcblx0XHRcdGVsc2Vcblx0XHRcdFx0aW5pdGlhbFZhbHVlcz17fVxuXHRcdFx0XHRpZihncmlkTmFtZSlcblx0XHRcdFx0XHRzZWxlY3RlZFJvd3MgPSB3aW5kb3cuZ3JpZFJlZnM/W2dyaWROYW1lXS5jdXJyZW50Py5hcGk/LmdldFNlbGVjdGVkUm93cygpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRzZWxlY3RlZFJvd3MgPSB3aW5kb3cuZ3JpZFJlZj8uY3VycmVudD8uYXBpPy5nZXRTZWxlY3RlZFJvd3MoKVx0XG5cdFx0XHRcdFxuXHRcdFx0XHRpZiBzZWxlY3RlZFJvd3M/Lmxlbmd0aFxuXHRcdFx0XHRcdHJlY29yZF9pZCA9IHNlbGVjdGVkUm93c1swXS5faWQ7XG5cdFx0XHRcdFx0aWYgcmVjb3JkX2lkXG5cdFx0XHRcdFx0XHRpbml0aWFsVmFsdWVzID0gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZClcblxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0aW5pdGlhbFZhbHVlcyA9IEZvcm1NYW5hZ2VyLmdldEluaXRpYWxWYWx1ZXMob2JqZWN0X25hbWUpXG5cblx0XHRcdGlmIG9iamVjdD8udmVyc2lvbiA+PSAyXG5cdFx0XHRcdHJldHVybiBTdGVlZG9zLlBhZ2UuRm9ybS5TdGFuZGFyZE5ldy5yZW5kZXIoU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIiksIG9iamVjdF9uYW1lLCB0KCdOZXcnKSArICcgJyArIG9iamVjdC5sYWJlbCwgaW5pdGlhbFZhbHVlcyAsIHtncmlkTmFtZTogZ3JpZE5hbWV9KTtcblx0XHRcdFNlc3Npb24uc2V0ICdhY3Rpb25fb2JqZWN0X25hbWUnLCBvYmplY3RfbmFtZVxuXHRcdFx0aWYgc2VsZWN0ZWRSb3dzPy5sZW5ndGhcblx0XHRcdFx0IyDliJfooajmnInpgInkuK3pobnml7bvvIzlj5bnrKzkuIDkuKrpgInkuK3pobnvvIzlpI3liLblhbblhoXlrrnliLDmlrDlu7rnqpflj6PkuK1cblx0XHRcdFx0IyDov5nnmoTnrKzkuIDkuKrmjIfnmoTmmK/nrKzkuIDmrKHli77pgInnmoTpgInkuK3pobnvvIzogIzkuI3mmK/liJfooajkuK3lt7Lli77pgInnmoTnrKzkuIDpoblcblx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgaW5pdGlhbFZhbHVlc1xuXHRcdFx0XHQjIOKAnOS/neWtmOW5tuaWsOW7uuKAneaTjeS9nOS4reiHquWKqOaJk+W8gOeahOaWsOeql+WPo+S4remcgOimgeWGjeasoeWkjeWItuacgOaWsOeahGRvY+WGheWuueWIsOaWsOeql+WPo+S4rVxuXHRcdFx0XHRTZXNzaW9uLnNldCAnY21TaG93QWdhaW5EdXBsaWNhdGVkJywgdHJ1ZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRTZXNzaW9uLnNldCAnY21Eb2MnLCBpbml0aWFsVmFsdWVzXG5cdFx0XHRNZXRlb3IuZGVmZXIgKCktPlxuXHRcdFx0XHQkKFwiLmNyZWF0b3ItYWRkXCIpLmNsaWNrKClcblx0XHRcdHJldHVybiBcblxuXHRcdFwic3RhbmRhcmRfb3Blbl92aWV3XCI6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBmaWVsZHMpLT5cblx0XHRcdGhyZWYgPSBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkKVxuXHRcdFx0Rmxvd1JvdXRlci5yZWRpcmVjdChocmVmKVxuXHRcdFx0cmV0dXJuIGZhbHNlXG5cblx0XHRcInN0YW5kYXJkX2VkaXRcIjogKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIGZpZWxkcyktPlxuXHRcdFx0aWYgcmVjb3JkX2lkXG5cdFx0XHRcdG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcblx0XHRcdFx0aWYgb2JqZWN0Py52ZXJzaW9uID49IDJcblx0XHRcdFx0XHRyZXR1cm4gU3RlZWRvcy5QYWdlLkZvcm0uU3RhbmRhcmRFZGl0LnJlbmRlcihTZXNzaW9uLmdldChcImFwcF9pZFwiKSwgb2JqZWN0X25hbWUsIHQoJ0VkaXQnKSArICcgJyArIG9iamVjdC5sYWJlbCwgcmVjb3JkX2lkLCB7XG5cdFx0XHRcdFx0XHRncmlkTmFtZTogdGhpcy5hY3Rpb24uZ3JpZE5hbWVcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKCkgJiYgZmFsc2VcbiNcdFx0XHRcdFx0cmVjb3JkID0gQ3JlYXRvci5nZXRPYmplY3RSZWNvcmQob2JqZWN0X25hbWUsIHJlY29yZF9pZClcbiNcdFx0XHRcdFx0U2Vzc2lvbi5zZXQgJ2NtRG9jJywgcmVjb3JkXG4jXHRcdFx0XHRcdFNlc3Npb24uc2V0ICdyZWxvYWRfZHhsaXN0JywgZmFsc2Vcblx0XHRcdFx0XHRTZXNzaW9uLnNldCAnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWVcblx0XHRcdFx0XHRTZXNzaW9uLnNldCAnYWN0aW9uX3JlY29yZF9pZCcsIHJlY29yZF9pZFxuXHRcdFx0XHRcdGlmIHRoaXMucmVjb3JkXG5cdFx0XHRcdFx0XHRTZXNzaW9uLnNldCAnY21Eb2MnLCB0aGlzLnJlY29yZFxuXHRcdFx0XHRcdE1ldGVvci5kZWZlciAoKS0+XG5cdFx0XHRcdFx0XHQkKFwiLmJ0bi1lZGl0LXJlY29yZFwiKS5jbGljaygpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRTZXNzaW9uLnNldCAnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWVcblx0XHRcdFx0XHRTZXNzaW9uLnNldCAnYWN0aW9uX3JlY29yZF9pZCcsIHJlY29yZF9pZFxuXHRcdFx0XHRcdGlmIHRoaXMucmVjb3JkXG5cdFx0XHRcdFx0XHRTZXNzaW9uLnNldCAnY21Eb2MnLCB0aGlzLnJlY29yZFxuXHRcdFx0XHRcdFx0TWV0ZW9yLmRlZmVyICgpLT5cblx0XHRcdFx0XHRcdFx0JChcIi5idG4uY3JlYXRvci1lZGl0XCIpLmNsaWNrKClcblxuXHRcdFwic3RhbmRhcmRfZGVsZXRlXCI6IChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2spLT5cblx0XHRcdGdyaWROYW1lID0gdGhpcy5hY3Rpb24uZ3JpZE5hbWU7XG5cdFx0XHQjIGNvbnNvbGUubG9nKFwiPT09c3RhbmRhcmRfZGVsZXRlPT09XCIsIG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHJlY29yZF90aXRsZSwgbGlzdF92aWV3X2lkLCByZWNvcmQsIGNhbGxfYmFjayk7XG5cdFx0XHRpZiByZWNvcmRfaWRcblx0XHRcdFx0YmVmb3JlSG9vayA9IEZvcm1NYW5hZ2VyLnJ1bkhvb2sob2JqZWN0X25hbWUsICdkZWxldGUnLCAnYmVmb3JlJywge19pZDogcmVjb3JkX2lkfSlcblx0XHRcdFx0aWYgIWJlZm9yZUhvb2tcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSlcblx0XHRcdG5hbWVGaWVsZCA9IG9iamVjdC5OQU1FX0ZJRUxEX0tFWSB8fCBcIm5hbWVcIlxuXG5cdFx0XHR1bmxlc3MgbGlzdF92aWV3X2lkXG5cdFx0XHRcdGxpc3Rfdmlld19pZCA9IFNlc3Npb24uZ2V0KFwibGlzdF92aWV3X2lkXCIpXG5cdFx0XHR1bmxlc3MgbGlzdF92aWV3X2lkXG5cdFx0XHRcdGxpc3Rfdmlld19pZCA9IFwiYWxsXCJcblxuXHRcdFx0aWYoIV8uaXNTdHJpbmcocmVjb3JkX3RpdGxlKSAmJiByZWNvcmRfdGl0bGUpXG5cdFx0XHRcdHJlY29yZF90aXRsZSA9IHJlY29yZF90aXRsZVtuYW1lRmllbGRdXG5cdFx0XHRcblx0XHRcdGlmIHJlY29yZCAmJiAhcmVjb3JkX3RpdGxlXG5cdFx0XHRcdHJlY29yZF90aXRsZSA9IHJlY29yZFtuYW1lRmllbGRdXG5cdFx0XHRcblx0XHRcdGkxOG5UaXRsZUtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX3N3YWxfdGl0bGVcIlxuXHRcdFx0aTE4blRleHRLZXkgPSBcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3RleHRcIlxuXG5cdFx0XHR1bmxlc3MgcmVjb3JkX2lkXG5cdFx0XHRcdGkxOG5UaXRsZUtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX21hbnlfc3dhbF90aXRsZVwiXG5cdFx0XHRcdGkxOG5UZXh0S2V5ID0gXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfbWFueV9zd2FsX3RleHRcIlxuXG5cdFx0XHRcdCMg5aaC5p6c5piv5om56YeP5Yig6Zmk77yM5YiZ5Lyg5YWl55qEbGlzdF92aWV3X2lk5Li65YiX6KGo6KeG5Zu+55qEbmFtZe+8jOeUqOS6juiOt+WPluWIl+ihqOmAieS4remhuVxuXHRcdFx0XHQjIOS4u+WIl+ihqOinhOWImeaYr1wibGlzdHZpZXdfI3tvYmplY3RfbmFtZX1fI3tsaXN0X3ZpZXdfaWR9XCLvvIznm7jlhbPooajop4TliJnmmK9cInJlbGF0ZWRfbGlzdHZpZXdfI3tvYmplY3RfbmFtZX1fI3tyZWxhdGVkX29iamVjdF9uYW1lfV8je3JlbGF0ZWRfZmllbGRfbmFtZX1cIlxuXHRcdFx0XHRzZWxlY3RlZFJlY29yZHMgPSBTdGVlZG9zVUkuZ2V0VGFibGVTZWxlY3RlZFJvd3MoZ3JpZE5hbWUgfHwgbGlzdF92aWV3X2lkKVxuXHRcdFx0XHRpZiAhc2VsZWN0ZWRSZWNvcmRzIHx8ICFzZWxlY3RlZFJlY29yZHMubGVuZ3RoXG5cdFx0XHRcdFx0dG9hc3RyLndhcm5pbmcodChcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9tYW55X25vX3NlbGVjdGlvblwiKSlcblx0XHRcdFx0XHRyZXR1cm5cblxuXHRcdFx0aWYgcmVjb3JkX3RpdGxlXG5cdFx0XHRcdHRleHQgPSB0IGkxOG5UZXh0S2V5LCBcIiN7b2JqZWN0LmxhYmVsfSBcXFwiI3tyZWNvcmRfdGl0bGV9XFxcIlwiXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRleHQgPSB0IGkxOG5UZXh0S2V5LCBcIiN7b2JqZWN0LmxhYmVsfVwiXG5cdFx0XHRzd2FsXG5cdFx0XHRcdHRpdGxlOiB0IGkxOG5UaXRsZUtleSwgXCIje29iamVjdC5sYWJlbH1cIlxuXHRcdFx0XHR0ZXh0OiBcIjxkaXYgY2xhc3M9J2RlbGV0ZS1jcmVhdG9yLXdhcm5pbmcnPiN7dGV4dH08L2Rpdj5cIlxuXHRcdFx0XHRodG1sOiB0cnVlXG5cdFx0XHRcdHNob3dDYW5jZWxCdXR0b246dHJ1ZVxuXHRcdFx0XHRjb25maXJtQnV0dG9uVGV4dDogdCgnRGVsZXRlJylcblx0XHRcdFx0Y2FuY2VsQnV0dG9uVGV4dDogdCgnQ2FuY2VsJylcblx0XHRcdFx0KG9wdGlvbikgLT5cblx0XHRcdFx0XHRpZiBvcHRpb25cblx0XHRcdFx0XHRcdGlmIHJlY29yZF9pZFxuXHRcdFx0XHRcdFx0XHQjIOWNleadoeiusOW9leWIoOmZpFxuXHRcdFx0XHRcdFx0XHRfZGVsZXRlUmVjb3JkIG9iamVjdF9uYW1lLCByZWNvcmRfaWQsIHJlY29yZF90aXRsZSwgbGlzdF92aWV3X2lkLCByZWNvcmQsICgpLT5cblx0XHRcdFx0XHRcdFx0XHQjIOaWh+S7tueJiOacrOS4ulwiY2ZzLmZpbGVzLmZpbGVyZWNvcmRcIu+8jOmcgOimgeabv+aNouS4ulwiY2ZzLWZpbGVzLWZpbGVyZWNvcmRcIlxuXHRcdFx0XHRcdFx0XHRcdGdyaWRPYmplY3ROYW1lQ2xhc3MgPSBvYmplY3RfbmFtZS5yZXBsYWNlKC9cXC4vZyxcIi1cIilcblx0XHRcdFx0XHRcdFx0XHRncmlkQ29udGFpbmVyID0gJChcIi5ncmlkQ29udGFpbmVyLiN7Z3JpZE9iamVjdE5hbWVDbGFzc31cIilcblx0XHRcdFx0XHRcdFx0XHR1bmxlc3MgZ3JpZENvbnRhaW5lcj8ubGVuZ3RoXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiB3aW5kb3cub3BlbmVyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzT3BlbmVyUmVtb3ZlID0gZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JpZENvbnRhaW5lciA9IHdpbmRvdy5vcGVuZXIuJChcIi5ncmlkQ29udGFpbmVyLiN7Z3JpZE9iamVjdE5hbWVDbGFzc31cIilcblx0XHRcdFx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdFx0XHRcdCMgT2JqZWN0Rm9ybeaciee8k+WtmO+8jOWIoOmZpOWtkOihqOiusOW9leWPr+iDveS8muacieaxh+aAu+Wtl+aute+8jOmcgOimgeWIt+aWsOihqOWNleaVsOaNrlxuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudF9vYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIilcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRfcmVjb3JkX2lkID0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdGlmIGN1cnJlbnRfb2JqZWN0X25hbWUgJiYgQ3JlYXRvci5nZXRPYmplY3QoY3VycmVudF9vYmplY3RfbmFtZSk/LnZlcnNpb24gPiAxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFN0ZWVkb3NVSS5yZWxvYWRSZWNvcmQoY3VycmVudF9vYmplY3RfbmFtZSwgY3VycmVudF9yZWNvcmRfaWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBGbG93Um91dGVyLmN1cnJlbnQoKS5yb3V0ZS5wYXRoLmVuZHNXaXRoKFwiLzpyZWNvcmRfaWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgb2JqZWN0X25hbWUgIT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEZsb3dSb3V0ZXIucmVsb2FkKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5yZWZyZXNoR3JpZChncmlkTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0Y2F0Y2ggX2Vcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoX2UpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIGdyaWRDb250YWluZXI/Lmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgb2JqZWN0LmVuYWJsZV90cmVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGR4RGF0YUdyaWRJbnN0YW5jZSA9IGdyaWRDb250YWluZXIuZHhUcmVlTGlzdCgpLmR4VHJlZUxpc3QoJ2luc3RhbmNlJylcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZHhEYXRhR3JpZEluc3RhbmNlID0gZ3JpZENvbnRhaW5lci5keERhdGFHcmlkKCkuZHhEYXRhR3JpZCgnaW5zdGFuY2UnKVxuXHRcdFx0XHRcdFx0XHRcdGlmIGR4RGF0YUdyaWRJbnN0YW5jZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgb2JqZWN0LmVuYWJsZV90cmVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGR4RGF0YUdyaWRJbnN0YW5jZS5yZWZyZXNoKClcblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgb2JqZWN0X25hbWUgIT0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEZsb3dSb3V0ZXIucmVsb2FkKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCMgZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQjIFx0VGVtcGxhdGUuY3JlYXRvcl9ncmlkLnJlZnJlc2goZHhEYXRhR3JpZEluc3RhbmNlKVxuXHRcdFx0XHRcdFx0XHRcdHJlY29yZFVybCA9IENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQpXG5cdFx0XHRcdFx0XHRcdFx0dGVtcE5hdlJlbW92ZWQgPSBDcmVhdG9yLnJlbW92ZVRlbXBOYXZJdGVtKG9iamVjdF9uYW1lLCByZWNvcmRVcmwpICPml6DorrrmmK/lnKjorrDlvZXor6bnu4bnlYzpnaLov5jmmK/liJfooajnlYzpnaLmiafooYzliKDpmaTmk43kvZzvvIzpg73kvJrmiorkuLTml7blr7zoiKrliKDpmaTmjolcblx0XHRcdFx0XHRcdFx0XHRpZiBpc09wZW5lclJlbW92ZSBvciAhZHhEYXRhR3JpZEluc3RhbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiBpc09wZW5lclJlbW92ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuY2xvc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSBpZiByZWNvcmRfaWQgPT0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIikgYW5kIGxpc3Rfdmlld19pZCAhPSAnY2FsZW5kYXInXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFwcGlkID0gU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0dW5sZXNzIHRlbXBOYXZSZW1vdmVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IyDlpoLmnpznoa7lrp7liKDpmaTkuobkuLTml7blr7zoiKrvvIzlsLHlj6/og73lt7Lnu4/ph43lrprlkJHliLDkuIrkuIDkuKrpobXpnaLkuobvvIzmsqHlv4XopoHlho3ph43lrprlkJHkuIDmrKFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRGbG93Um91dGVyLmdvIFwiL2FwcC8je2FwcGlkfS8je29iamVjdF9uYW1lfS9ncmlkLyN7bGlzdF92aWV3X2lkfVwiXG5cdFx0XHRcdFx0XHRcdFx0aWYgY2FsbF9iYWNrIGFuZCB0eXBlb2YgY2FsbF9iYWNrID09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbF9iYWNrKClcdFx0XHRcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0IyDmibnph4/liKDpmaRcblx0XHRcdFx0XHRcdFx0aWYgc2VsZWN0ZWRSZWNvcmRzICYmIHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGhcblx0XHRcdFx0XHRcdFx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIilcblx0XHRcdFx0XHRcdFx0XHRkZWxldGVDb3VudGVyID0gMDtcblx0XHRcdFx0XHRcdFx0XHRhZnRlckJhdGNoZXNEZWxldGUgPSAoKS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWxldGVDb3VudGVyKytcblx0XHRcdFx0XHRcdFx0XHRcdGlmIGRlbGV0ZUNvdW50ZXIgPj0gc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQjIGNvbnNvbGUubG9nKFwiZGVsZXRlQ291bnRlciwgc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aD09PVwiLCBkZWxldGVDb3VudGVyLCBzZWxlY3RlZFJlY29yZHMubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5yZWZyZXNoR3JpZChncmlkTmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0ZWRSZWNvcmRzLmZvckVhY2ggKHJlY29yZCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0cmVjb3JkX2lkID0gcmVjb3JkLl9pZFxuXHRcdFx0XHRcdFx0XHRcdFx0YmVmb3JlSG9vayA9IEZvcm1NYW5hZ2VyLnJ1bkhvb2sob2JqZWN0X25hbWUsICdkZWxldGUnLCAnYmVmb3JlJywge19pZDogcmVjb3JkX2lkfSlcblx0XHRcdFx0XHRcdFx0XHRcdGlmICFiZWZvcmVIb29rXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFmdGVyQmF0Y2hlc0RlbGV0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdHJlY29yZFRpdGxlID0gcmVjb3JkW25hbWVGaWVsZF0gfHwgcmVjb3JkX2lkXG5cdFx0XHRcdFx0XHRcdFx0XHRfZGVsZXRlUmVjb3JkIG9iamVjdF9uYW1lLCByZWNvcmQuX2lkLCByZWNvcmRUaXRsZSwgbGlzdF92aWV3X2lkLCByZWNvcmQsICgoKS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlY29yZFVybCA9IENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdENyZWF0b3IucmVtb3ZlVGVtcE5hdkl0ZW0ob2JqZWN0X25hbWUsIHJlY29yZFVybCkgI+aXoOiuuuaYr+WcqOiusOW9leivpue7hueVjOmdoui/mOaYr+WIl+ihqOeVjOmdouaJp+ihjOWIoOmZpOaTjeS9nO+8jOmDveS8muaKiuS4tOaXtuWvvOiIquWIoOmZpOaOiVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhZnRlckJhdGNoZXNEZWxldGUoKVxuXHRcdFx0XHRcdFx0XHRcdFx0KSwgKCktPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhZnRlckJhdGNoZXNEZWxldGUoKSIsInZhciBfZGVsZXRlUmVjb3JkO1xuXG5DcmVhdG9yLmFjdGlvbnNCeU5hbWUgPSB7fTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBDcmVhdG9yLmFjdGlvbnMgPSBmdW5jdGlvbihhY3Rpb25zKSB7XG4gICAgcmV0dXJuIF8uZWFjaChhY3Rpb25zLCBmdW5jdGlvbih0b2RvLCBhY3Rpb25fbmFtZSkge1xuICAgICAgcmV0dXJuIENyZWF0b3IuYWN0aW9uc0J5TmFtZVthY3Rpb25fbmFtZV0gPSB0b2RvO1xuICAgIH0pO1xuICB9O1xuICBDcmVhdG9yLmV4ZWN1dGVBY3Rpb24gPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgYWN0aW9uLCByZWNvcmRfaWQsIGl0ZW1fZWxlbWVudCwgbGlzdF92aWV3X2lkLCByZWNvcmQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpbHRlcnMsIG1vcmVBcmdzLCBvYmosIHRvZG8sIHRvZG9BcmdzLCB1cmw7XG4gICAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gJ3dvcmQtcHJpbnQnKSB7XG4gICAgICBpZiAocmVjb3JkX2lkKSB7XG4gICAgICAgIGZpbHRlcnMgPSBbJ19pZCcsICc9JywgcmVjb3JkX2lkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlcnMgPSBPYmplY3RHcmlkLmdldEZpbHRlcnMob2JqZWN0X25hbWUsIGxpc3Rfdmlld19pZCwgZmFsc2UsIG51bGwsIG51bGwpO1xuICAgICAgfVxuICAgICAgdXJsID0gXCIvYXBpL3Y0L3dvcmRfdGVtcGxhdGVzL1wiICsgYWN0aW9uLndvcmRfdGVtcGxhdGUgKyBcIi9wcmludFwiICsgXCI/ZmlsdGVycz1cIiArIFN0ZWVkb3NGaWx0ZXJzLmZvcm1hdEZpbHRlcnNUb09EYXRhUXVlcnkoZmlsdGVycyk7XG4gICAgICB1cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKHVybCk7XG4gICAgICByZXR1cm4gd2luZG93Lm9wZW4odXJsKTtcbiAgICB9XG4gICAgb2JqID0gQ3JlYXRvci5nZXRPYmplY3Qob2JqZWN0X25hbWUpO1xuICAgIGlmIChhY3Rpb24gIT0gbnVsbCA/IGFjdGlvbi50b2RvIDogdm9pZCAwKSB7XG4gICAgICBpZiAodHlwZW9mIGFjdGlvbi50b2RvID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRvZG8gPSBDcmVhdG9yLmFjdGlvbnNCeU5hbWVbYWN0aW9uLnRvZG9dO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aW9uLnRvZG8gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0b2RvID0gYWN0aW9uLnRvZG87XG4gICAgICB9XG4gICAgICBpZiAoIXJlY29yZCAmJiBvYmplY3RfbmFtZSAmJiByZWNvcmRfaWQpIHtcbiAgICAgICAgcmVjb3JkID0gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZCk7XG4gICAgICB9XG4gICAgICBpZiAodG9kbykge1xuICAgICAgICBpdGVtX2VsZW1lbnQgPSBpdGVtX2VsZW1lbnQgPyBpdGVtX2VsZW1lbnQgOiBcIlwiO1xuICAgICAgICBtb3JlQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG4gICAgICAgIHRvZG9BcmdzID0gW29iamVjdF9uYW1lLCByZWNvcmRfaWRdLmNvbmNhdChtb3JlQXJncyk7XG4gICAgICAgIHJldHVybiB0b2RvLmFwcGx5KHtcbiAgICAgICAgICBvYmplY3RfbmFtZTogb2JqZWN0X25hbWUsXG4gICAgICAgICAgcmVjb3JkX2lkOiByZWNvcmRfaWQsXG4gICAgICAgICAgb2JqZWN0OiBvYmosXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgaXRlbV9lbGVtZW50OiBpdGVtX2VsZW1lbnQsXG4gICAgICAgICAgcmVjb3JkOiByZWNvcmRcbiAgICAgICAgfSwgdG9kb0FyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRvYXN0ci53YXJuaW5nKHQoXCJfb2JqZWN0X2FjdGlvbnNfbm9uZV90b2RvXCIpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvYXN0ci53YXJuaW5nKHQoXCJfb2JqZWN0X2FjdGlvbnNfbm9uZV90b2RvXCIpKTtcbiAgICB9XG4gIH07XG4gIF9kZWxldGVSZWNvcmQgPSBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2ssIGNhbGxfYmFja19lcnJvcikge1xuICAgIHZhciBvYmplY3QsIHByZXZpb3VzRG9jO1xuICAgIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICBwcmV2aW91c0RvYyA9IEZvcm1NYW5hZ2VyLmdldFByZXZpb3VzRG9jKG9iamVjdF9uYW1lLCByZWNvcmRfaWQsICdkZWxldGUnKTtcbiAgICByZXR1cm4gQ3JlYXRvci5vZGF0YVtcImRlbGV0ZVwiXShvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpbmZvO1xuICAgICAgaWYgKHJlY29yZF90aXRsZSkge1xuICAgICAgICBpbmZvID0gdChcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3RpdGxlX3N1Y1wiLCBvYmplY3QubGFiZWwgKyAoXCJcXFwiXCIgKyByZWNvcmRfdGl0bGUgKyBcIlxcXCJcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mbyA9IHQoJ2NyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3N1YycpO1xuICAgICAgfVxuICAgICAgdG9hc3RyLnN1Y2Nlc3MoaW5mbyk7XG4gICAgICBpZiAoY2FsbF9iYWNrICYmIHR5cGVvZiBjYWxsX2JhY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsX2JhY2soKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2FmdGVyJywge1xuICAgICAgICBfaWQ6IHJlY29yZF9pZCxcbiAgICAgICAgcHJldmlvdXNEb2M6IHByZXZpb3VzRG9jXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgaWYgKGNhbGxfYmFja19lcnJvciAmJiB0eXBlb2YgY2FsbF9iYWNrX2Vycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbF9iYWNrX2Vycm9yKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRm9ybU1hbmFnZXIucnVuSG9vayhvYmplY3RfbmFtZSwgJ2RlbGV0ZScsICdlcnJvcicsIHtcbiAgICAgICAgX2lkOiByZWNvcmRfaWQsXG4gICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIENyZWF0b3IucmVsYXRlZE9iamVjdFN0YW5kYXJkTmV3ID0gZnVuY3Rpb24ocmVsYXRlZF9vYmplY3RfbmFtZSkge1xuICAgIHZhciBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uX25hbWUsIGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkLCBkZWZhdWx0RG9jLCBkb2MsIGlkcywgaW5pdGlhbFZhbHVlcywgcmVjb3JkX2lkLCByZWxhdGVPYmplY3Q7XG4gICAgcmVsYXRlT2JqZWN0ID0gQ3JlYXRvci5nZXRPYmplY3QocmVsYXRlZF9vYmplY3RfbmFtZSk7XG4gICAgY29sbGVjdGlvbl9uYW1lID0gcmVsYXRlT2JqZWN0LmxhYmVsO1xuICAgIGNvbGxlY3Rpb24gPSBcIkNyZWF0b3IuQ29sbGVjdGlvbnMuXCIgKyAoQ3JlYXRvci5nZXRPYmplY3QocmVsYXRlZF9vYmplY3RfbmFtZSkuX2NvbGxlY3Rpb25fbmFtZSk7XG4gICAgY3VycmVudF9vYmplY3RfbmFtZSA9IFNlc3Npb24uZ2V0KFwib2JqZWN0X25hbWVcIik7XG4gICAgY3VycmVudF9yZWNvcmRfaWQgPSBTZXNzaW9uLmdldChcInJlY29yZF9pZFwiKTtcbiAgICBpZHMgPSBDcmVhdG9yLlRhYnVsYXJTZWxlY3RlZElkc1tyZWxhdGVkX29iamVjdF9uYW1lXTtcbiAgICBpbml0aWFsVmFsdWVzID0ge307XG4gICAgaWYgKGlkcyAhPSBudWxsID8gaWRzLmxlbmd0aCA6IHZvaWQgMCkge1xuICAgICAgcmVjb3JkX2lkID0gaWRzWzBdO1xuICAgICAgZG9jID0gQ3JlYXRvci5vZGF0YS5nZXQocmVsYXRlZF9vYmplY3RfbmFtZSwgcmVjb3JkX2lkKTtcbiAgICAgIGluaXRpYWxWYWx1ZXMgPSBkb2M7XG4gICAgICBTZXNzaW9uLnNldCgnY21TaG93QWdhaW5EdXBsaWNhdGVkJywgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmF1bHREb2MgPSBGb3JtTWFuYWdlci5nZXRSZWxhdGVkSW5pdGlhbFZhbHVlcyhjdXJyZW50X29iamVjdF9uYW1lLCBjdXJyZW50X3JlY29yZF9pZCwgcmVsYXRlZF9vYmplY3RfbmFtZSk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShkZWZhdWx0RG9jKSkge1xuICAgICAgICBpbml0aWFsVmFsdWVzID0gZGVmYXVsdERvYztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChyZWxhdGVPYmplY3QgIT0gbnVsbCA/IHJlbGF0ZU9iamVjdC52ZXJzaW9uIDogdm9pZCAwKSA+PSAyKSB7XG4gICAgICByZXR1cm4gU3RlZWRvc1VJLnNob3dNb2RhbChzdG9yZXMuQ29tcG9uZW50UmVnaXN0cnkuY29tcG9uZW50cy5PYmplY3RGb3JtLCB7XG4gICAgICAgIG5hbWU6IHJlbGF0ZWRfb2JqZWN0X25hbWUgKyBcIl9zdGFuZGFyZF9uZXdfZm9ybVwiLFxuICAgICAgICBvYmplY3RBcGlOYW1lOiByZWxhdGVkX29iamVjdF9uYW1lLFxuICAgICAgICB0aXRsZTogJ+aWsOW7uiAnICsgcmVsYXRlT2JqZWN0LmxhYmVsLFxuICAgICAgICBpbml0aWFsVmFsdWVzOiBpbml0aWFsVmFsdWVzLFxuICAgICAgICBhZnRlckluc2VydDogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChDcmVhdG9yLmdldE9iamVjdChjdXJyZW50X29iamVjdF9uYW1lKS52ZXJzaW9uID4gMSkge1xuICAgICAgICAgICAgICBTdGVlZG9zVUkucmVsb2FkUmVjb3JkKGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBGbG93Um91dGVyLnJlbG9hZCgpO1xuICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LCBudWxsLCB7XG4gICAgICAgIGljb25QYXRoOiAnL2Fzc2V0cy9pY29ucydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaWRzICE9IG51bGwgPyBpZHMubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICBTZXNzaW9uLnNldCgnY21Eb2MnLCBpbml0aWFsVmFsdWVzKTtcbiAgICAgIFNlc3Npb24uc2V0KCdjbVNob3dBZ2FpbkR1cGxpY2F0ZWQnLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzRW1wdHkoaW5pdGlhbFZhbHVlcykpIHtcbiAgICAgICAgU2Vzc2lvbi5zZXQoJ2NtRG9jJywgaW5pdGlhbFZhbHVlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIFNlc3Npb24uc2V0KFwiYWN0aW9uX2ZpZWxkc1wiLCB2b2lkIDApO1xuICAgIFNlc3Npb24uc2V0KFwiYWN0aW9uX2NvbGxlY3Rpb25cIiwgY29sbGVjdGlvbik7XG4gICAgU2Vzc2lvbi5zZXQoXCJhY3Rpb25fY29sbGVjdGlvbl9uYW1lXCIsIGNvbGxlY3Rpb25fbmFtZSk7XG4gICAgU2Vzc2lvbi5zZXQoXCJhY3Rpb25fc2F2ZV9hbmRfaW5zZXJ0XCIsIGZhbHNlKTtcbiAgICBNZXRlb3IuZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gJChcIi5jcmVhdG9yLWFkZC1yZWxhdGVkXCIpLmNsaWNrKCk7XG4gICAgfSk7XG4gIH07XG4gIENyZWF0b3IuYWN0aW9ucyh7XG4gICAgXCJzdGFuZGFyZF9xdWVyeVwiOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBNb2RhbC5zaG93KFwic3RhbmRhcmRfcXVlcnlfbW9kYWxcIik7XG4gICAgfSxcbiAgICBcInN0YW5kYXJkX25ld1wiOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCBmaWVsZHMpIHtcbiAgICAgIHZhciBncmlkTmFtZSwgaW5pdGlhbFZhbHVlcywgaXNSZWxhdGVkLCBtYXN0ZXJSZWNvcmRJZCwgb2JqZWN0LCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlbGF0ZWRGaWVsZE5hbWUsIHNlbGVjdGVkUm93cztcbiAgICAgIG9iamVjdCA9IENyZWF0b3IuZ2V0T2JqZWN0KG9iamVjdF9uYW1lKTtcbiAgICAgIGdyaWROYW1lID0gdGhpcy5hY3Rpb24uZ3JpZE5hbWU7XG4gICAgICBpc1JlbGF0ZWQgPSB0aGlzLmFjdGlvbi5pc1JlbGF0ZWQ7XG4gICAgICBpZiAoaXNSZWxhdGVkKSB7XG4gICAgICAgIHJlbGF0ZWRGaWVsZE5hbWUgPSB0aGlzLmFjdGlvbi5yZWxhdGVkRmllbGROYW1lO1xuICAgICAgICBtYXN0ZXJSZWNvcmRJZCA9IHRoaXMuYWN0aW9uLm1hc3RlclJlY29yZElkO1xuICAgICAgICBpbml0aWFsVmFsdWVzID0gdGhpcy5hY3Rpb24uaW5pdGlhbFZhbHVlcztcbiAgICAgICAgaWYgKCFpbml0aWFsVmFsdWVzKSB7XG4gICAgICAgICAgaW5pdGlhbFZhbHVlcyA9IHt9O1xuICAgICAgICAgIGluaXRpYWxWYWx1ZXNbcmVsYXRlZEZpZWxkTmFtZV0gPSBtYXN0ZXJSZWNvcmRJZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlcyA9IHt9O1xuICAgICAgICBpZiAoZ3JpZE5hbWUpIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd3MgPSAocmVmID0gd2luZG93LmdyaWRSZWZzKSAhPSBudWxsID8gKHJlZjEgPSByZWZbZ3JpZE5hbWVdLmN1cnJlbnQpICE9IG51bGwgPyAocmVmMiA9IHJlZjEuYXBpKSAhPSBudWxsID8gcmVmMi5nZXRTZWxlY3RlZFJvd3MoKSA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3RlZFJvd3MgPSAocmVmMyA9IHdpbmRvdy5ncmlkUmVmKSAhPSBudWxsID8gKHJlZjQgPSByZWYzLmN1cnJlbnQpICE9IG51bGwgPyAocmVmNSA9IHJlZjQuYXBpKSAhPSBudWxsID8gcmVmNS5nZXRTZWxlY3RlZFJvd3MoKSA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0ZWRSb3dzICE9IG51bGwgPyBzZWxlY3RlZFJvd3MubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICAgICAgcmVjb3JkX2lkID0gc2VsZWN0ZWRSb3dzWzBdLl9pZDtcbiAgICAgICAgICBpZiAocmVjb3JkX2lkKSB7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWVzID0gQ3JlYXRvci5vZGF0YS5nZXQob2JqZWN0X25hbWUsIHJlY29yZF9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluaXRpYWxWYWx1ZXMgPSBGb3JtTWFuYWdlci5nZXRJbml0aWFsVmFsdWVzKG9iamVjdF9uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKChvYmplY3QgIT0gbnVsbCA/IG9iamVjdC52ZXJzaW9uIDogdm9pZCAwKSA+PSAyKSB7XG4gICAgICAgIHJldHVybiBTdGVlZG9zLlBhZ2UuRm9ybS5TdGFuZGFyZE5ldy5yZW5kZXIoU2Vzc2lvbi5nZXQoXCJhcHBfaWRcIiksIG9iamVjdF9uYW1lLCB0KCdOZXcnKSArICcgJyArIG9iamVjdC5sYWJlbCwgaW5pdGlhbFZhbHVlcywge1xuICAgICAgICAgIGdyaWROYW1lOiBncmlkTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFNlc3Npb24uc2V0KCdhY3Rpb25fb2JqZWN0X25hbWUnLCBvYmplY3RfbmFtZSk7XG4gICAgICBpZiAoc2VsZWN0ZWRSb3dzICE9IG51bGwgPyBzZWxlY3RlZFJvd3MubGVuZ3RoIDogdm9pZCAwKSB7XG4gICAgICAgIFNlc3Npb24uc2V0KCdjbURvYycsIGluaXRpYWxWYWx1ZXMpO1xuICAgICAgICBTZXNzaW9uLnNldCgnY21TaG93QWdhaW5EdXBsaWNhdGVkJywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTZXNzaW9uLnNldCgnY21Eb2MnLCBpbml0aWFsVmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIE1ldGVvci5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICQoXCIuY3JlYXRvci1hZGRcIikuY2xpY2soKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgXCJzdGFuZGFyZF9vcGVuX3ZpZXdcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZmllbGRzKSB7XG4gICAgICB2YXIgaHJlZjtcbiAgICAgIGhyZWYgPSBDcmVhdG9yLmdldE9iamVjdFVybChvYmplY3RfbmFtZSwgcmVjb3JkX2lkKTtcbiAgICAgIEZsb3dSb3V0ZXIucmVkaXJlY3QoaHJlZik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBcInN0YW5kYXJkX2VkaXRcIjogZnVuY3Rpb24ob2JqZWN0X25hbWUsIHJlY29yZF9pZCwgZmllbGRzKSB7XG4gICAgICB2YXIgb2JqZWN0O1xuICAgICAgaWYgKHJlY29yZF9pZCkge1xuICAgICAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgICAgIGlmICgob2JqZWN0ICE9IG51bGwgPyBvYmplY3QudmVyc2lvbiA6IHZvaWQgMCkgPj0gMikge1xuICAgICAgICAgIHJldHVybiBTdGVlZG9zLlBhZ2UuRm9ybS5TdGFuZGFyZEVkaXQucmVuZGVyKFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpLCBvYmplY3RfbmFtZSwgdCgnRWRpdCcpICsgJyAnICsgb2JqZWN0LmxhYmVsLCByZWNvcmRfaWQsIHtcbiAgICAgICAgICAgIGdyaWROYW1lOiB0aGlzLmFjdGlvbi5ncmlkTmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgJiYgZmFsc2UpIHtcbiAgICAgICAgICBTZXNzaW9uLnNldCgnYWN0aW9uX29iamVjdF9uYW1lJywgb2JqZWN0X25hbWUpO1xuICAgICAgICAgIFNlc3Npb24uc2V0KCdhY3Rpb25fcmVjb3JkX2lkJywgcmVjb3JkX2lkKTtcbiAgICAgICAgICBpZiAodGhpcy5yZWNvcmQpIHtcbiAgICAgICAgICAgIFNlc3Npb24uc2V0KCdjbURvYycsIHRoaXMucmVjb3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIE1ldGVvci5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiAkKFwiLmJ0bi1lZGl0LXJlY29yZFwiKS5jbGljaygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFNlc3Npb24uc2V0KCdhY3Rpb25fb2JqZWN0X25hbWUnLCBvYmplY3RfbmFtZSk7XG4gICAgICAgICAgU2Vzc2lvbi5zZXQoJ2FjdGlvbl9yZWNvcmRfaWQnLCByZWNvcmRfaWQpO1xuICAgICAgICAgIGlmICh0aGlzLnJlY29yZCkge1xuICAgICAgICAgICAgU2Vzc2lvbi5zZXQoJ2NtRG9jJywgdGhpcy5yZWNvcmQpO1xuICAgICAgICAgICAgcmV0dXJuIE1ldGVvci5kZWZlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICQoXCIuYnRuLmNyZWF0b3ItZWRpdFwiKS5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBcInN0YW5kYXJkX2RlbGV0ZVwiOiBmdW5jdGlvbihvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBjYWxsX2JhY2spIHtcbiAgICAgIHZhciBiZWZvcmVIb29rLCBncmlkTmFtZSwgaTE4blRleHRLZXksIGkxOG5UaXRsZUtleSwgbmFtZUZpZWxkLCBvYmplY3QsIHNlbGVjdGVkUmVjb3JkcywgdGV4dDtcbiAgICAgIGdyaWROYW1lID0gdGhpcy5hY3Rpb24uZ3JpZE5hbWU7XG4gICAgICBpZiAocmVjb3JkX2lkKSB7XG4gICAgICAgIGJlZm9yZUhvb2sgPSBGb3JtTWFuYWdlci5ydW5Ib29rKG9iamVjdF9uYW1lLCAnZGVsZXRlJywgJ2JlZm9yZScsIHtcbiAgICAgICAgICBfaWQ6IHJlY29yZF9pZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFiZWZvcmVIb29rKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBDcmVhdG9yLmdldE9iamVjdChvYmplY3RfbmFtZSk7XG4gICAgICBuYW1lRmllbGQgPSBvYmplY3QuTkFNRV9GSUVMRF9LRVkgfHwgXCJuYW1lXCI7XG4gICAgICBpZiAoIWxpc3Rfdmlld19pZCkge1xuICAgICAgICBsaXN0X3ZpZXdfaWQgPSBTZXNzaW9uLmdldChcImxpc3Rfdmlld19pZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghbGlzdF92aWV3X2lkKSB7XG4gICAgICAgIGxpc3Rfdmlld19pZCA9IFwiYWxsXCI7XG4gICAgICB9XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocmVjb3JkX3RpdGxlKSAmJiByZWNvcmRfdGl0bGUpIHtcbiAgICAgICAgcmVjb3JkX3RpdGxlID0gcmVjb3JkX3RpdGxlW25hbWVGaWVsZF07XG4gICAgICB9XG4gICAgICBpZiAocmVjb3JkICYmICFyZWNvcmRfdGl0bGUpIHtcbiAgICAgICAgcmVjb3JkX3RpdGxlID0gcmVjb3JkW25hbWVGaWVsZF07XG4gICAgICB9XG4gICAgICBpMThuVGl0bGVLZXkgPSBcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9zd2FsX3RpdGxlXCI7XG4gICAgICBpMThuVGV4dEtleSA9IFwiY3JlYXRvcl9yZWNvcmRfcmVtb3ZlX3N3YWxfdGV4dFwiO1xuICAgICAgaWYgKCFyZWNvcmRfaWQpIHtcbiAgICAgICAgaTE4blRpdGxlS2V5ID0gXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfbWFueV9zd2FsX3RpdGxlXCI7XG4gICAgICAgIGkxOG5UZXh0S2V5ID0gXCJjcmVhdG9yX3JlY29yZF9yZW1vdmVfbWFueV9zd2FsX3RleHRcIjtcbiAgICAgICAgc2VsZWN0ZWRSZWNvcmRzID0gU3RlZWRvc1VJLmdldFRhYmxlU2VsZWN0ZWRSb3dzKGdyaWROYW1lIHx8IGxpc3Rfdmlld19pZCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWRSZWNvcmRzIHx8ICFzZWxlY3RlZFJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgdG9hc3RyLndhcm5pbmcodChcImNyZWF0b3JfcmVjb3JkX3JlbW92ZV9tYW55X25vX3NlbGVjdGlvblwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVjb3JkX3RpdGxlKSB7XG4gICAgICAgIHRleHQgPSB0KGkxOG5UZXh0S2V5LCBvYmplY3QubGFiZWwgKyBcIiBcXFwiXCIgKyByZWNvcmRfdGl0bGUgKyBcIlxcXCJcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gdChpMThuVGV4dEtleSwgXCJcIiArIG9iamVjdC5sYWJlbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3dhbCh7XG4gICAgICAgIHRpdGxlOiB0KGkxOG5UaXRsZUtleSwgXCJcIiArIG9iamVjdC5sYWJlbCksXG4gICAgICAgIHRleHQ6IFwiPGRpdiBjbGFzcz0nZGVsZXRlLWNyZWF0b3Itd2FybmluZyc+XCIgKyB0ZXh0ICsgXCI8L2Rpdj5cIixcbiAgICAgICAgaHRtbDogdHJ1ZSxcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IHQoJ0RlbGV0ZScpLFxuICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiB0KCdDYW5jZWwnKVxuICAgICAgfSwgZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgIHZhciBhZnRlckJhdGNoZXNEZWxldGUsIGRlbGV0ZUNvdW50ZXI7XG4gICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICBpZiAocmVjb3JkX2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gX2RlbGV0ZVJlY29yZChvYmplY3RfbmFtZSwgcmVjb3JkX2lkLCByZWNvcmRfdGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIF9lLCBhcHBpZCwgY3VycmVudF9vYmplY3RfbmFtZSwgY3VycmVudF9yZWNvcmRfaWQsIGR4RGF0YUdyaWRJbnN0YW5jZSwgZ3JpZENvbnRhaW5lciwgZ3JpZE9iamVjdE5hbWVDbGFzcywgaXNPcGVuZXJSZW1vdmUsIHJlY29yZFVybCwgcmVmLCB0ZW1wTmF2UmVtb3ZlZDtcbiAgICAgICAgICAgICAgZ3JpZE9iamVjdE5hbWVDbGFzcyA9IG9iamVjdF9uYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi1cIik7XG4gICAgICAgICAgICAgIGdyaWRDb250YWluZXIgPSAkKFwiLmdyaWRDb250YWluZXIuXCIgKyBncmlkT2JqZWN0TmFtZUNsYXNzKTtcbiAgICAgICAgICAgICAgaWYgKCEoZ3JpZENvbnRhaW5lciAhPSBudWxsID8gZ3JpZENvbnRhaW5lci5sZW5ndGggOiB2b2lkIDApKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5vcGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlzT3BlbmVyUmVtb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBncmlkQ29udGFpbmVyID0gd2luZG93Lm9wZW5lci4kKFwiLmdyaWRDb250YWluZXIuXCIgKyBncmlkT2JqZWN0TmFtZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50X29iamVjdF9uYW1lID0gU2Vzc2lvbi5nZXQoXCJvYmplY3RfbmFtZVwiKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50X3JlY29yZF9pZCA9IFNlc3Npb24uZ2V0KFwicmVjb3JkX2lkXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X29iamVjdF9uYW1lICYmICgocmVmID0gQ3JlYXRvci5nZXRPYmplY3QoY3VycmVudF9vYmplY3RfbmFtZSkpICE9IG51bGwgPyByZWYudmVyc2lvbiA6IHZvaWQgMCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgICBTdGVlZG9zVUkucmVsb2FkUmVjb3JkKGN1cnJlbnRfb2JqZWN0X25hbWUsIGN1cnJlbnRfcmVjb3JkX2lkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEZsb3dSb3V0ZXIuY3VycmVudCgpLnJvdXRlLnBhdGguZW5kc1dpdGgoXCIvOnJlY29yZF9pZFwiKSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdF9uYW1lICE9PSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIEZsb3dSb3V0ZXIucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZWZyZXNoR3JpZChncmlkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICAgICAgICBfZSA9IGVycm9yMTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKF9lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZ3JpZENvbnRhaW5lciAhPSBudWxsID8gZ3JpZENvbnRhaW5lci5sZW5ndGggOiB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmVuYWJsZV90cmVlKSB7XG4gICAgICAgICAgICAgICAgICBkeERhdGFHcmlkSW5zdGFuY2UgPSBncmlkQ29udGFpbmVyLmR4VHJlZUxpc3QoKS5keFRyZWVMaXN0KCdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBkeERhdGFHcmlkSW5zdGFuY2UgPSBncmlkQ29udGFpbmVyLmR4RGF0YUdyaWQoKS5keERhdGFHcmlkKCdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZHhEYXRhR3JpZEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5lbmFibGVfdHJlZSkge1xuICAgICAgICAgICAgICAgICAgZHhEYXRhR3JpZEluc3RhbmNlLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdF9uYW1lICE9PSBTZXNzaW9uLmdldChcIm9iamVjdF9uYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIEZsb3dSb3V0ZXIucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlY29yZFVybCA9IENyZWF0b3IuZ2V0T2JqZWN0VXJsKG9iamVjdF9uYW1lLCByZWNvcmRfaWQpO1xuICAgICAgICAgICAgICB0ZW1wTmF2UmVtb3ZlZCA9IENyZWF0b3IucmVtb3ZlVGVtcE5hdkl0ZW0ob2JqZWN0X25hbWUsIHJlY29yZFVybCk7XG4gICAgICAgICAgICAgIGlmIChpc09wZW5lclJlbW92ZSB8fCAhZHhEYXRhR3JpZEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3BlbmVyUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgICB3aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZF9pZCA9PT0gU2Vzc2lvbi5nZXQoXCJyZWNvcmRfaWRcIikgJiYgbGlzdF92aWV3X2lkICE9PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgICAgICAgICBhcHBpZCA9IFNlc3Npb24uZ2V0KFwiYXBwX2lkXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wTmF2UmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICBGbG93Um91dGVyLmdvKFwiL2FwcC9cIiArIGFwcGlkICsgXCIvXCIgKyBvYmplY3RfbmFtZSArIFwiL2dyaWQvXCIgKyBsaXN0X3ZpZXdfaWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY2FsbF9iYWNrICYmIHR5cGVvZiBjYWxsX2JhY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsX2JhY2soKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFJlY29yZHMgJiYgc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAkKFwiYm9keVwiKS5hZGRDbGFzcyhcImxvYWRpbmdcIik7XG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICBhZnRlckJhdGNoZXNEZWxldGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudGVyKys7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZUNvdW50ZXIgPj0gc2VsZWN0ZWRSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgJChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJsb2FkaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5yZWZyZXNoR3JpZChncmlkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRSZWNvcmRzLmZvckVhY2goZnVuY3Rpb24ocmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlY29yZFRpdGxlO1xuICAgICAgICAgICAgICAgIHJlY29yZF9pZCA9IHJlY29yZC5faWQ7XG4gICAgICAgICAgICAgICAgYmVmb3JlSG9vayA9IEZvcm1NYW5hZ2VyLnJ1bkhvb2sob2JqZWN0X25hbWUsICdkZWxldGUnLCAnYmVmb3JlJywge1xuICAgICAgICAgICAgICAgICAgX2lkOiByZWNvcmRfaWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZUhvb2spIHtcbiAgICAgICAgICAgICAgICAgIGFmdGVyQmF0Y2hlc0RlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWNvcmRUaXRsZSA9IHJlY29yZFtuYW1lRmllbGRdIHx8IHJlY29yZF9pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2RlbGV0ZVJlY29yZChvYmplY3RfbmFtZSwgcmVjb3JkLl9pZCwgcmVjb3JkVGl0bGUsIGxpc3Rfdmlld19pZCwgcmVjb3JkLCAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcmVjb3JkVXJsO1xuICAgICAgICAgICAgICAgICAgcmVjb3JkVXJsID0gQ3JlYXRvci5nZXRPYmplY3RVcmwob2JqZWN0X25hbWUsIHJlY29yZF9pZCk7XG4gICAgICAgICAgICAgICAgICBDcmVhdG9yLnJlbW92ZVRlbXBOYXZJdGVtKG9iamVjdF9uYW1lLCByZWNvcmRVcmwpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGFmdGVyQmF0Y2hlc0RlbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBhZnRlckJhdGNoZXNEZWxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuIl19 diff --git a/server/bundle/programs/server/packages/steedos_objects.js.map b/server/bundle/programs/server/packages/steedos_objects.js.map index 398faffbdb..cb0bbea5b4 100644 --- a/server/bundle/programs/server/packages/steedos_objects.js.map +++ b/server/bundle/programs/server/packages/steedos_objects.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/steedos_objects/core.coffee","meteor://💻app/core.coffee","meteor://💻app/packages/steedos_objects/loadStandardObjects.coffee","meteor://💻app/loadStandardObjects.coffee","meteor://💻app/packages/steedos_objects/coreSupport.coffee","meteor://💻app/coreSupport.coffee","meteor://💻app/packages/steedos_objects/server/methods/object_options.coffee","meteor://💻app/server/methods/object_options.coffee","meteor://💻app/packages/steedos_objects/lib/listviews.coffee","meteor://💻app/lib/listviews.coffee","meteor://💻app/packages/steedos_objects/lib/add_simple_schema_validation_error.coffee","meteor://💻app/lib/add_simple_schema_validation_error.coffee","meteor://💻app/packages/steedos_objects/lib/field_simple_schema_validation_error.coffee","meteor://💻app/lib/field_simple_schema_validation_error.coffee","meteor://💻app/packages/steedos:objects/lib/eval.js","meteor://💻app/packages/steedos_objects/lib/convert.coffee","meteor://💻app/lib/convert.coffee","meteor://💻app/packages/steedos_objects/lib/formular.coffee","meteor://💻app/lib/formular.coffee","meteor://💻app/packages/steedos_objects/lib/object.coffee","meteor://💻app/lib/object.coffee","meteor://💻app/packages/steedos_objects/lib/fields.coffee","meteor://💻app/lib/fields.coffee","meteor://💻app/packages/steedos_objects/lib/triggers.coffee","meteor://💻app/lib/triggers.coffee","meteor://💻app/packages/steedos_objects/lib/permission_sets.coffee","meteor://💻app/lib/permission_sets.coffee","meteor://💻app/packages/steedos_objects/lib/collections.coffee","meteor://💻app/lib/collections.coffee","meteor://💻app/packages/steedos_objects/lib/actions.coffee","meteor://💻app/lib/actions.coffee"],"names":["db","Creator","Objects","Collections","Menus","Apps","Dashboards","Reports","subs","steedosSchema","APIService","MetadataService","config","e","moleculer","objectql","packageLoader","packageService","path","settings","steedosCore","process","env","CREATOR_NODE_ENV","require","getSteedosConfig","built_in_plugins","plugins","Meteor","startup","apiService","broker","ex","metadataService","objectqlService","pageService","projectService","standardObjectsDir","standardObjectsPackageLoaderService","steedosService","uiService","ServiceBroker","namespace","nodeID","metadata","transporter","TRANSPORTER","cacher","CACHER","logLevel","serializer","requestTimeout","maxCallLevel","heartbeatInterval","heartbeatTimeout","contextParamsCloning","tracking","enabled","shutdownTimeout","disableBalancer","registry","strategy","preferLocal","bulkhead","concurrency","maxQueueSize","validator","errorHandler","tracing","exporter","type","options","logger","colors","width","gaugeWidth","skipProcessEventRegistration","created","warn","clean","init","createService","name","mixins","port","started","setTimeout","emit","getSteedosSchema","StandardObjectsPath","packageInfo","wrapAsync","cb","start","then","connectHandlersExpress","express","_restartService","use","staticRouter","waitForServices","console","log","SteedosApi","WebApp","connectHandlers","resolve","reject","error","Fiber","deps","app","Tracker","Dependency","object","_TEMPLATE","SimpleSchema","extendOptions","filtersFunction","Match","Optional","OneOf","Function","String","optionsFunction","createFunction","isServer","fiberLoadObjects","obj","object_name","loadObjects","run","list_views","space","getCollectionName","_","clone","convertObject","Object","initTriggers","initListViews","getObjectName","getObject","space_id","ref","ref1","isArray","isClient","depend","Session","get","objectsByName","getObjectById","object_id","findWhere","_id","removeObject","getCollection","spaceId","_collection_name","removeCollection","isSpaceAdmin","userId","findOne","fields","admins","indexOf","evaluateFormula","formular","context","isString","Formular","checkFormula","evaluateFilters","filters","selector","each","filter","action","value","length","isCommonSpace","getOrderlySetByIds","docs","ids","id_key","hit_first","values","getProperty","sortBy","doc","_index","sortingMethod","value1","value2","isValue1Empty","isValue2Empty","locale","key","Date","getTime","Steedos","toString","localeCompare","getObjectRelateds","_object","permissions","relatedList","relatedListMap","related_objects","isEmpty","objName","isObject","objectName","related_object","related_object_name","related_field","related_field_name","reference_to","foreign_key","write_requires_master_read","enableObjName","getPermissions","enable_audit","modifyAllRecords","enable_files","push","sfsFilesObject","splice","enable_tasks","enable_notes","enable_events","enable_instances","enable_approvals","enable_process","getUserContext","isUnSafeMode","USER_CONTEXT","space_user_org","su","suFields","Error","mobile","position","email","company","organization","company_id","company_ids","user","fullname","getRelativeUrl","url","isFunction","isCordova","startsWith","test","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","getUserCompanyId","getUserCompanyIds","processPermissions","po","allowCreate","allowRead","allowEdit","allowDelete","viewAllRecords","viewCompanyRecords","modifyCompanyRecords","allowReadFiles","viewAllFiles","allowCreateFiles","allowEditFiles","allowDeleteFiles","modifyAllFiles","getTemplateSpaceId","templateSpaceId","getCloudAdminSpaceId","cloudAdminSpaceId","isTemplateSpace","isCloudAdminSpace","steedosStorageDir","STEEDOS_STORAGE_DIR","methods","collection","name_field_key","options_limit","query","query_options","records","results","searchTextQuery","selected","sort","params","NAME_FIELD_KEY","searchText","$regex","$or","$in","extend","$nin","filterQuery","limit","find","fetch","record","label","message","JSON","stringify","getInitWidthPercent","columns","_schema","column_num","init_width_percent","getSchema","field_name","field","is_wide","ref2","pick","autoform","getFieldIsWide","getTabularOrder","list_view_id","setting","record_id","map","column","hidden","compact","order","index","default_extra_columns","extra_columns","getObjectDefaultColumns","getObjectDefaultExtraColumns","union","getObjectDefaultSort","TabularSelectedIds","convertListView","default_view","list_view","list_view_name","default_columns","default_mobile_columns","oitem","mobile_columns","has","include","filter_scope","parse","forEach","_value","getRelatedList","layoutRelatedList","list","mapList","objectLayoutRelatedListObjects","relatedListNames","relatedListObjects","related_object_names","unrelated_objects","related_lists","item","reFieldName","reObjectName","related","related_field_fullname","split","field_names","is_file","customRelatedListObject","actions","buttons","visible_on","page_size","objOrName","getRelatedObjects","related_object_item","relatedObject","tabular_order","getObjectFirstListViewColumns","without","transformSortToTabular","replace","pluck","difference","v","isActive","allow_relatedList","getObjectFirstListView","first","getListViews","getListView","exac","listViews","getListViewIsRecent","listView","pickObjectMobileColumns","count","getField","isNameColumn","itemCount","maxCount","maxRows","nameColumn","nameKey","result","getObjectDefaultView","defaultView","use_mobile_columns","isAllView","isRecentView","tabularColumns","tabular_sort","column_index","transformSortToDX","dx_sort","RegEx","code","RegExp","_regExMessages","_globalMessages","regEx","exp","msg","messages","evalInContext","js","eval","call","convertField","getOption","option","foo","color","allOptions","picklist","picklistOptions","getPicklist","getPickListOptions","reverse","enable","defaultValue","triggers","trigger","_todo","_todo_from_code","_todo_from_db","on","todo","systemBaseFields","omit","required","readonly","getSystemBaseFields","_visible","error1","actionsByName","trim","isExpression","visible","record_permissions","globalData","assign","now","parseSingleExpression","_options","_type","beforeOpenFunction","is_company_limited","max","min","_option","k","_regEx","_min","_max","Number","Boolean","_optionsFunction","_reference_to","_createFunction","_beforeOpenFunction","_filtersFunction","_defaultValue","_is_company_limited","_filters","isDate","pop","_is_date","form","val","relatedObjInfo","PREFIX","_prependPrefixForFormula","prefix","fieldVariable","reg","rev","m","$1","formula_str","_CONTEXT","_VALUES","data","isBoolean","toastr","formatObjectName","_baseObject","_db","defaultListViewId","disabled_list_views","ref3","schema","self","baseObject","permission_set","icon","description","is_view","hasImportTemplates","version","is_enable","allow_customActions","exclude_actions","enable_search","paging","enable_api","custom","enable_share","enable_tree","sidebar","open_window","filter_company","calendar","enable_chatter","enable_trash","enable_space_global","enable_follow","enable_workflow","enable_inline_edit","details","masters","lookup_details","in_development","idFieldName","database_name","is_name","primary","filterable","item_name","copyItem","admin","all","list_view_item","ReactiveVar","createCollection","_name","getObjectSchema","contains","attachSchema","_simpleSchema","getObjectODataRouterPrefix","bootstrapLoaded","getSelectOptions","fieldSchema","data_type","optionItem","fieldsArr","_ref_obj","autoform_type","collectionName","fs","fsType","isUnLimited","multiple","rows","language","isMobile","isPad","isiOS","afFieldInput","timezoneId","dxDateBoxOptions","displayFormat","pickerType","dateMobileOptions","outFormat","showIcon","dependOn","depend_on","create","lookup_field","Modal","show","formId","operation","onSuccess","addItems","reference_sort","optionsSort","reference_limit","optionsLimit","reference_to_field","referenceToField","blackbox","objectSwitche","optionsMethod","optionsMethodParams","references","_reference","link","defaultIcon","firstOption","decimal","precision","scale","disabled","Array","editable","accept","system","Email","isNumber","optional","unique","group","searchable","inlineHelpText","isProduction","sortable","getFieldDisplayValue","field_value","html","moment","format","checkFieldTypeSupportBetweenQuery","field_type","includes","pushBetweenBuiltinOptionals","operations","builtinValues","getBetweenBuiltinValues","builtinItem","is_check_only","getBetweenTimeBuiltinValues","getBetweenBuiltinValueItem","getBetweenTimeBuiltinValueItem","getBetweenBuiltinOperation","betweenBuiltinValues","getQuarterStartMonth","month","getMonth","getLastQuarterFirstDay","year","getFullYear","getNextQuarterFirstDay","getMonthDays","days","endDate","millisecond","startDate","getLastMonthFirstDay","currentMonth","currentYear","endValue","firstDay","lastDay","lastMonday","lastMonthFinalDay","lastMonthFirstDay","lastQuarterEndDay","lastQuarterStartDay","lastSunday","last_120_days","last_30_days","last_60_days","last_7_days","last_90_days","minusDay","monday","nextMonday","nextMonthFinalDay","nextMonthFirstDay","nextQuarterEndDay","nextQuarterStartDay","nextSunday","nextYear","next_120_days","next_30_days","next_60_days","next_7_days","next_90_days","previousYear","startValue","strEndDay","strFirstDay","strLastDay","strMonday","strStartDay","strSunday","strToday","strTomorrow","strYestday","sunday","thisQuarterEndDay","thisQuarterStartDay","tomorrow","week","yestday","getDay","t","fv","setHours","getHours","getTimezoneOffset","getFieldDefaultOperation","getFieldOperation","optionals","equal","unequal","less_than","greater_than","less_or_equal","greater_or_equal","not_contain","starts_with","between","getObjectFieldsName","fieldsName","sort_no","cleanTrigger","initTrigger","_trigger_hooks","ref4","ref5","todoWrapper","apply","arguments","when","before","insert","update","remove","after","_hook","trigger_name","_trigger_hook","baseBooleanPermissionPropNames","extendPermissionProps","findOne_permission_object","find_permission_object","intersectionPlus","otherPermissionPropNames","overlayBaseBooleanPermissionProps","permissionPropNames","unionPermissionObjects","unionPlus","getObjectPermissions","getRecordPermissions","isOwner","masterObjectName","masterRecordPerm","record_company_id","record_company_ids","user_company_ids","owner","parent","n","intersection","locked","getRecordRelatedListPermissions","currentObjectName","relatedListItem","currentRecord","isRelateObjectUneditable","masterAllow","relatedObjectPermissions","uneditable_related_list","getObjectRecord","getRecordSafeRelatedList","getAllPermissions","_i","psets","psetsAdmin","psetsAdmin_pos","psetsCurrent","psetsCurrentNames","psetsCurrent_pos","psetsCustomer","psetsCustomer_pos","psetsGuest","psetsGuest_pos","psetsMember","psetsMember_pos","psetsSupplier","psetsSupplier_pos","psetsUser","psetsUser_pos","set_ids","spaceUser","objects","assigned_apps","profile","users","permission_set_id","modified","created_by","modified_by","getAssignedApps","bind","assigned_menus","getAssignedMenus","user_permission_sets","array","other","target","props","filesProNames","propNames","propName","apps","psetBase","userProfile","pset","uniq","aboutMenu","adminMenus","allMenus","currentPsetNames","menus","otherMenuApps","otherMenus","admin_menus","flatten","menu","psetsMenu","permission_sets","permission_objects","isNull","permission_set_ids","pos","ops","ops_key","currentPset","tempOps","repeatIndex","repeatPo","opsetAdmin","opsetCustomer","opsetGuest","opsetMember","opsetSupplier","opsetUser","posAdmin","posCustomer","posGuest","posMember","posSupplier","posUser","prof","guest","member","supplier","customer","disabled_actions","unreadable_fields","uneditable_fields","creator_db_url","oplog_url","MONGO_URL_CREATOR","MONGO_OPLOG_URL_CREATOR","_CREATOR_DATASOURCE","_driver","MongoInternals","RemoteCollectionDriver","oplogUrl","collection_key","newCollection","SMSQueue","_deleteRecord","action_name","executeAction","item_element","callback","moreArgs","todoArgs","ObjectGrid","getFilters","word_template","SteedosFilters","formatFiltersToODataQuery","absoluteUrl","window","open","odata","prototype","slice","concat","warning","record_title","call_back","call_back_error","previousDoc","FormManager","getPreviousDoc","info","success","runHook","relatedObjectStandardNew","collection_name","current_object_name","current_record_id","defaultDoc","initialValues","relateObject","set","getRelatedInitialValues","SteedosUI","showModal","stores","ComponentRegistry","components","ObjectForm","objectApiName","title","afterInsert","reloadRecord","FlowRouter","reload","iconPath","defer","$","click","gridName","isRelated","masterRecordId","relatedFieldName","selectedRows","gridRefs","current","api","getSelectedRows","gridRef","getInitialValues","Page","Form","StandardNew","render","href","getObjectUrl","redirect","StandardEdit","beforeHook","i18nTextKey","i18nTitleKey","nameField","selectedRecords","text","getTableSelectedRows","swal","showCancelButton","confirmButtonText","cancelButtonText","afterBatchesDelete","deleteCounter","_e","appid","dxDataGridInstance","gridContainer","gridObjectNameClass","isOpenerRemove","recordUrl","tempNavRemoved","opener","route","endsWith","refreshGrid","dxTreeList","dxDataGrid","refresh","removeTempNavItem","close","go","addClass","removeClass","recordTitle"],"mappings":"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","file":"/packages/steedos_objects.js","sourcesContent":["@db = {}\nif !Creator?\n\t@Creator = {}\nCreator.Objects = {}\nCreator.Collections = {}\nCreator.Menus = []\nCreator.Apps = {}\nCreator.Dashboards = {}\nCreator.Reports = {}\nCreator.subs = {}\nCreator.steedosSchema = {}","this.db = {};\n\nif (typeof Creator === \"undefined\" || Creator === null) {\n this.Creator = {};\n}\n\nCreator.Objects = {};\n\nCreator.Collections = {};\n\nCreator.Menus = [];\n\nCreator.Apps = {};\n\nCreator.Dashboards = {};\n\nCreator.Reports = {};\n\nCreator.subs = {};\n\nCreator.steedosSchema = {};\n","try\n\tif process.env.CREATOR_NODE_ENV == 'development'\n\t\tsteedosCore = require('@steedos/core')\n\t\tobjectql = require('@steedos/objectql')\n\t\tmoleculer = require(\"moleculer\");\n\t\tpackageLoader = require('@steedos/service-meteor-package-loader');\n\t\tAPIService = require('@steedos/service-api');\n\t\tMetadataService = require('@steedos/service-metadata-server');\n\t\tpackageService = require(\"@steedos/service-package-registry\");\n\t\tpath = require('path')\n\n\t\tconfig = objectql.getSteedosConfig();\n\t\tsettings = {\n\t\t\tbuilt_in_plugins: [\n\t\t\t\t\"@steedos/standard-space\",\n\t\t\t\t\"@steedos/standard-object-database\",\n\t\t\t\t\"@steedos/standard-process-approval\",\n\t\t\t\t\"@steedos/standard-collaboration\",\n\t\t\t\t\"@steedos/standard-ui\",\n\t\t\t\t\"@steedos/standard-permission\",\n\t\t\t\t\"@steedos/webapp-public\",\n\t\t\t\t\"@steedos/service-cachers-manager\",\n\t\t\t\t\"@steedos/unpkg\",\n\t\t\t\t\"@steedos/workflow\",\n\t\t\t\t\"@steedos/accounts\",\n\t\t\t\t\"@steedos/plugin-company\",\n\t\t\t\t\"@steedos/metadata-api\",\n\t\t\t\t\"@steedos/data-import\",\n\t\t\t\t# \"@steedos/service-fields-indexs\",\n\t\t\t\t\"@steedos/service-accounts\",\n\t\t\t\t\"@steedos/service-charts\",\n\t\t\t\t# \"@steedos/service-pages\",\n\t\t\t\t\"@steedos/service-package-registry\",\n\t\t \t\t\"@steedos/service-package-tool\",\n\t\t\t\t# \"@steedos/standard-process\",\n\t\t\t\t\"@steedos/webapp-accounts\",\n\t\t\t\t\"@steedos/service-workflow\",\n\t\t\t\t\"@steedos/service-plugin-amis\",\n\t\t\t\t\"@steedos/service-files\",\n\t\t\t\t\"@steedos/service-sentry\",\n\t\t\t\t\"@steedos/service-identity-jwt\"\n\t\t\t],\n\t\t\tplugins: config.plugins\n\t\t}\n\t\tMeteor.startup ->\n\t\t\ttry\n\t\t\t\tbroker = new moleculer.ServiceBroker({\n\t\t\t\t\tnamespace: \"steedos\",\n\t\t\t\t\tnodeID: \"steedos-creator\",\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\ttransporter: process.env.TRANSPORTER,\n\t\t\t\t\tcacher: process.env.CACHER,\n\t\t\t\t\tlogLevel: \"warn\",\n\t\t\t\t\tserializer: \"JSON\",\n\t\t\t\t\trequestTimeout: 60 * 1000,\n\t\t\t\t\tmaxCallLevel: 100,\n\n\t\t\t\t\theartbeatInterval: 10,\n\t\t\t\t\theartbeatTimeout: 30,\n\n\t\t\t\t\tcontextParamsCloning: false,\n\n\t\t\t\t\ttracking: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tshutdownTimeout: 5000,\n\t\t\t\t\t},\n\n\t\t\t\t\tdisableBalancer: false,\n\n\t\t\t\t\tregistry: {\n\t\t\t\t\t\tstrategy: \"RoundRobin\",\n\t\t\t\t\t\tpreferLocal: true\n\t\t\t\t\t},\n\n\t\t\t\t\tbulkhead: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tconcurrency: 10,\n\t\t\t\t\t\tmaxQueueSize: 100,\n\t\t\t\t\t},\n\t\t\t\t\tvalidator: true,\n\t\t\t\t\terrorHandler: null,\n\t\t\t\t\ttracing: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\texporter: {\n\t\t\t\t\t\t\ttype: \"Console\",\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tlogger: null,\n\t\t\t\t\t\t\t\tcolors: true,\n\t\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\t\tgaugeWidth: 40\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tskipProcessEventRegistration: true,\n\n\t\t\t\t\tcreated: (broker)-> \n\t\t\t\t\t\t# Clear all cache entries\n\t\t\t\t\t\tbroker.logger.warn('Clear all cache entries on startup.')\n\t\t\t\t\t\tbroker.cacher.clean();\n\t\t\t\t});\n\n\t\t\t\tobjectql.broker.init(broker);\n\n\t\t\t\tobjectqlService = broker.createService(require(\"@steedos/service-objectql\"));\n\t\t\t\t\n\t\t\t\tprojectService = broker.createService({\n\t\t\t\t\tname: \"project-server\",\n\t\t\t\t\tnamespace: \"steedos\",\n\t\t\t\t\tmixins: [packageService],\n\t\t\t\t});\n\n\n\t\t\t\tmetadataService = broker.createService({\n\t\t\t\t\tname: 'metadata-server',\n\t\t\t\t\tmixins: [MetadataService],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tuiService = broker.createService(require(\"@steedos/service-ui\"));\n\n\t\t\t\tapiService = broker.createService({\n\t\t\t\t\tname: \"api\",\n\t\t\t\t\tmixins: [APIService],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tpageService = broker.createService({\n\t\t\t\t\tname: \"@steedos/service-pages\",\n\t\t\t\t\tmixins: [require('@steedos/service-pages')],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tsteedosService = broker.createService({\n\t\t\t\t\tname: \"steedos-server\",\n\t\t\t\t\tmixins: [],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t},\n\t\t\t\t\tstarted: ()->\n\t\t\t\t\t\tsetTimeout ->\n\t\t\t\t\t\t\tbroker.emit 'steedos-server.started'\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t, 1000\n\t\t\t\t});\n\n\t\t\t\tobjectql.getSteedosSchema(broker);\n\t\t\t\tstandardObjectsDir = objectql.StandardObjectsPath;\n\t\t\t\tstandardObjectsPackageLoaderService = broker.createService({\n\t\t\t\t\tname: 'standard-objects',\n\t\t\t\t\tmixins: [packageLoader],\n\t\t\t\t\tsettings: { packageInfo: {\n\t\t\t\t\t\tpath: standardObjectsDir,\n\t\t\t\t\t} }\n\t\t\t\t});\n\n\t\t\t\tMeteor.wrapAsync((cb)->\n\t\t\t\t\tbroker.start().then(()->\n\t\t\t\t\t\tif !broker.started \n\t\t\t\t\t\t\tbroker._restartService(objectqlService);\n\t\t\t\t\t\t\tbroker._restartService(standardObjectsPackageLoaderService);\n\t\t\t\t\t\t\tbroker._restartService(uiService);\n\n\t\t\t\t\t\texpress = require('express');\n\t\t\t\t\t\tconnectHandlersExpress = express();\n\t\t\t\t\t\tconnectHandlersExpress.use(require('@steedos/router').staticRouter());\n\t\t\t\t\t\tbroker.waitForServices('~packages-@steedos/service-ui').then ()->\n\t\t\t\t\t\t\tconsole.log('waitForServices ~packages-@steedos/service-ui')\n\t\t\t\t\t\t\tconnectHandlersExpress.use(SteedosApi.express())\n\t\t\t\t\t\t\tWebApp.connectHandlers.use(connectHandlersExpress)\n\t\t\t\t\t\t\n\t\t\t\t\t\t# steedosCore.init(settings).then ()->\n\t\t\t\t\t\t# \tcb();\n\n\t\t\t\t\t\tbroker.waitForServices(standardObjectsPackageLoaderService.name).then (resolve, reject) ->\n\t\t\t\t\t\t\tsteedosCore.init(settings).then ()->\n\t\t\t\t\t\t\t\tcb(reject, resolve)\n\t\t\t\t\t)\n\t\t\t\t)()\n\t\t\tcatch ex\n\t\t\t\tconsole.error(\"error:\",ex)\ncatch e\n\tconsole.error(\"error:\",e)","var APIService, MetadataService, config, e, moleculer, objectql, packageLoader, packageService, path, settings, steedosCore;\n\ntry {\n if (process.env.CREATOR_NODE_ENV === 'development') {\n steedosCore = require('@steedos/core');\n objectql = require('@steedos/objectql');\n moleculer = require(\"moleculer\");\n packageLoader = require('@steedos/service-meteor-package-loader');\n APIService = require('@steedos/service-api');\n MetadataService = require('@steedos/service-metadata-server');\n packageService = require(\"@steedos/service-package-registry\");\n path = require('path');\n config = objectql.getSteedosConfig();\n settings = {\n built_in_plugins: [\"@steedos/standard-space\", \"@steedos/standard-object-database\", \"@steedos/standard-process-approval\", \"@steedos/standard-collaboration\", \"@steedos/standard-ui\", \"@steedos/standard-permission\", \"@steedos/webapp-public\", \"@steedos/service-cachers-manager\", \"@steedos/unpkg\", \"@steedos/workflow\", \"@steedos/accounts\", \"@steedos/plugin-company\", \"@steedos/metadata-api\", \"@steedos/data-import\", \"@steedos/service-accounts\", \"@steedos/service-charts\", \"@steedos/service-package-registry\", \"@steedos/service-package-tool\", \"@steedos/webapp-accounts\", \"@steedos/service-workflow\", \"@steedos/service-plugin-amis\", \"@steedos/service-files\", \"@steedos/service-sentry\", \"@steedos/service-identity-jwt\"],\n plugins: config.plugins\n };\n Meteor.startup(function() {\n var apiService, broker, ex, metadataService, objectqlService, pageService, projectService, standardObjectsDir, standardObjectsPackageLoaderService, steedosService, uiService;\n try {\n broker = new moleculer.ServiceBroker({\n namespace: \"steedos\",\n nodeID: \"steedos-creator\",\n metadata: {},\n transporter: process.env.TRANSPORTER,\n cacher: process.env.CACHER,\n logLevel: \"warn\",\n serializer: \"JSON\",\n requestTimeout: 60 * 1000,\n maxCallLevel: 100,\n heartbeatInterval: 10,\n heartbeatTimeout: 30,\n contextParamsCloning: false,\n tracking: {\n enabled: false,\n shutdownTimeout: 5000\n },\n disableBalancer: false,\n registry: {\n strategy: \"RoundRobin\",\n preferLocal: true\n },\n bulkhead: {\n enabled: false,\n concurrency: 10,\n maxQueueSize: 100\n },\n validator: true,\n errorHandler: null,\n tracing: {\n enabled: false,\n exporter: {\n type: \"Console\",\n options: {\n logger: null,\n colors: true,\n width: 100,\n gaugeWidth: 40\n }\n }\n },\n skipProcessEventRegistration: true,\n created: function(broker) {\n broker.logger.warn('Clear all cache entries on startup.');\n return broker.cacher.clean();\n }\n });\n objectql.broker.init(broker);\n objectqlService = broker.createService(require(\"@steedos/service-objectql\"));\n projectService = broker.createService({\n name: \"project-server\",\n namespace: \"steedos\",\n mixins: [packageService]\n });\n metadataService = broker.createService({\n name: 'metadata-server',\n mixins: [MetadataService],\n settings: {}\n });\n uiService = broker.createService(require(\"@steedos/service-ui\"));\n apiService = broker.createService({\n name: \"api\",\n mixins: [APIService],\n settings: {\n port: null\n }\n });\n pageService = broker.createService({\n name: \"@steedos/service-pages\",\n mixins: [require('@steedos/service-pages')],\n settings: {\n port: null\n }\n });\n steedosService = broker.createService({\n name: \"steedos-server\",\n mixins: [],\n settings: {\n port: null\n },\n started: function() {\n return setTimeout(function() {\n broker.emit('steedos-server.started');\n }, 1000);\n }\n });\n objectql.getSteedosSchema(broker);\n standardObjectsDir = objectql.StandardObjectsPath;\n standardObjectsPackageLoaderService = broker.createService({\n name: 'standard-objects',\n mixins: [packageLoader],\n settings: {\n packageInfo: {\n path: standardObjectsDir\n }\n }\n });\n return Meteor.wrapAsync(function(cb) {\n return broker.start().then(function() {\n var connectHandlersExpress, express;\n if (!broker.started) {\n broker._restartService(objectqlService);\n broker._restartService(standardObjectsPackageLoaderService);\n broker._restartService(uiService);\n }\n express = require('express');\n connectHandlersExpress = express();\n connectHandlersExpress.use(require('@steedos/router').staticRouter());\n broker.waitForServices('~packages-@steedos/service-ui').then(function() {\n console.log('waitForServices ~packages-@steedos/service-ui');\n connectHandlersExpress.use(SteedosApi.express());\n return WebApp.connectHandlers.use(connectHandlersExpress);\n });\n return broker.waitForServices(standardObjectsPackageLoaderService.name).then(function(resolve, reject) {\n return steedosCore.init(settings).then(function() {\n return cb(reject, resolve);\n });\n });\n });\n })();\n } catch (error) {\n ex = error;\n return console.error(\"error:\", ex);\n }\n });\n }\n} catch (error) {\n e = error;\n console.error(\"error:\", e);\n}\n","Creator.deps = {\n\tapp: new Tracker.Dependency\n\tobject: new Tracker.Dependency\n};\n\nCreator._TEMPLATE = {\n\tApps: {},\n\tObjects: {}\n}\n\nMeteor.startup ->\n\tSimpleSchema.extendOptions({filtersFunction: Match.Optional(Match.OneOf(Function, String))})\n\tSimpleSchema.extendOptions({optionsFunction: Match.Optional(Match.OneOf(Function, String))})\n\tSimpleSchema.extendOptions({createFunction: Match.Optional(Match.OneOf(Function, String))})\n\n# Creator.fiberLoadObjects 供steedos-cli项目使用\nif Meteor.isServer\n\tFiber = require('fibers')\n\tCreator.fiberLoadObjects = (obj, object_name)->\n\t\tFiber(()->\n\t\t\tCreator.loadObjects(obj, object_name)\n\t\t).run()\n\nCreator.loadObjects = (obj, object_name)->\n\tif !object_name\n\t\tobject_name = obj.name\n\n\tif !obj.list_views\n\t\tobj.list_views = {}\n\n\tif obj.space\n\t\tobject_name = Creator.getCollectionName(obj)\n\tif object_name == 'cfs_files_filerecord'\n\t\tobject_name = 'cfs.files.filerecord'\n\t\tobj = _.clone(obj)\n\t\tobj.name = object_name\n\t\tCreator.Objects[object_name] = obj\n\n\tCreator.convertObject(obj)\n\tnew Creator.Object(obj);\n\n\tCreator.initTriggers(object_name)\n\tCreator.initListViews(object_name)\n\treturn obj\n\nCreator.getObjectName = (object) ->\n\tif object.space\n\t\treturn \"c_#{object.space}_#{object.name}\"\n\treturn object.name\n\nCreator.getObject = (object_name, space_id)->\n\tif _.isArray(object_name)\n\t\treturn ;\n\tif Meteor.isClient\n\t\tCreator.deps?.object?.depend()\n\tif !object_name and Meteor.isClient\n\t\tobject_name = Session.get(\"object_name\")\n\n#\tif !space_id && object_name\n#\t\tif Meteor.isClient && !object_name.startsWith('c_')\n#\t\t\tspace_id = Session.get(\"spaceId\")\n\n\tif object_name\n#\t\tif space_id\n#\t\t\tobj = Creator.objectsByName[\"c_#{space_id}_#{object_name}\"]\n#\t\t\tif obj\n#\t\t\t\treturn obj\n#\n#\t\tobj = _.find Creator.objectsByName, (o)->\n#\t\t\t\treturn o._collection_name == object_name\n#\t\tif obj\n#\t\t\treturn obj\n\n\t\treturn Creator.objectsByName[object_name]\n\nCreator.getObjectById = (object_id)->\n\treturn _.findWhere(Creator.objectsByName, {_id: object_id})\n\nCreator.removeObject = (object_name)->\n\tconsole.log(\"removeObject\", object_name)\n\tdelete Creator.Objects[object_name]\n\tdelete Creator.objectsByName[object_name]\n\nCreator.getCollection = (object_name, spaceId)->\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\tif object_name\n\t\tif Meteor.isClient\n\t\t\treturn db[object_name]\n\t\telse\n\t\t\treturn Creator.Collections[Creator.getObject(object_name, spaceId)?._collection_name || object_name]\n\nCreator.removeCollection = (object_name)->\n\tdelete Creator.Collections[object_name]\n\nCreator.isSpaceAdmin = (spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tspace = Creator.getObject(\"spaces\")?.db?.findOne(spaceId,{fields:{admins:1}})\n\tif space?.admins\n\t\treturn space.admins.indexOf(userId) >= 0\n\n\nCreator.evaluateFormula = (formular, context, options)->\n\n\tif !_.isString(formular)\n\t\treturn formular\n\n\tif Creator.Formular.checkFormula(formular)\n\t\treturn Creator.Formular.run(formular, context, options)\n\n\treturn formular\n\nCreator.evaluateFilters = (filters, context)->\n\tselector = {}\n\t_.each filters, (filter)->\n\t\tif filter?.length == 3\n\t\t\tname = filter[0]\n\t\t\taction = filter[1]\n\t\t\tvalue = Creator.evaluateFormula(filter[2], context)\n\t\t\tselector[name] = {}\n\t\t\tselector[name][action] = value\n\t# console.log(\"evaluateFilters-->selector\", selector)\n\treturn selector\n\nCreator.isCommonSpace = (spaceId) ->\n\treturn spaceId == 'common'\n\n###\n\tdocs:待排序的文档数组\n\tids:_id集合\n\tid_key: 默认为_id\n\treturn 按照ids的顺序返回新的文档集合\n###\nCreator.getOrderlySetByIds = (docs, ids, id_key, hit_first)->\n\n\tif !id_key\n\t\tid_key = \"_id\"\n\n\tif hit_first\n\n\t\t#由于不能使用_.findIndex函数,因此此处先将对象数组转为普通数组类型,在获取其index\n\t\tvalues = docs.getProperty(id_key)\n\n\t\treturn\t_.sortBy docs, (doc)->\n\t\t\t\t\t_index = ids.indexOf(doc[id_key])\n\t\t\t\t\tif _index > -1\n\t\t\t\t\t\treturn _index\n\t\t\t\t\telse\n\t\t\t\t\t\treturn ids.length + _.indexOf(values, doc[id_key])\n\telse\n\t\treturn\t_.sortBy docs, (doc)->\n\t\t\treturn ids.indexOf(doc[id_key])\n\n###\n\t按用户所属本地化语言进行排序,支持中文、数值、日期等字段排序\n\t对于Object类型,如果提供作用域中key属性,则取值为value[key]进行排序比较,反之整个Object.toString()后排序比较\n###\nCreator.sortingMethod = (value1, value2) ->\n\tif this.key\n\t\tvalue1 = value1[this.key]\n\t\tvalue2 = value2[this.key]\n\tif value1 instanceof Date\n\t\tvalue1 = value1.getTime()\n\tif value2 instanceof Date\n\t\tvalue2 = value2.getTime()\n\tif typeof value1 is \"number\" and typeof value2 is \"number\"\n\t\treturn value1 - value2\n\t# Handling null values\n\tisValue1Empty = value1 == null or value1 == undefined\n\tisValue2Empty = value2 == null or value2 == undefined\n\tif isValue1Empty and !isValue2Empty\n\t\treturn -1\n\tif isValue1Empty and isValue2Empty\n\t\treturn 0\n\tif !isValue1Empty and isValue2Empty\n\t\treturn 1\n\tlocale = Steedos.locale()\n\treturn value1.toString().localeCompare value2.toString(), locale\n\n\n# 该函数只在初始化Object时,把相关对象的计算结果保存到Object的related_objects属性中,后续可以直接从related_objects属性中取得计算结果而不用再次调用该函数来计算\nCreator.getObjectRelateds = (object_name)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\n\trelated_objects = []\n\t# _object = Creator.getObject(object_name)\n\t# 因Creator.getObject函数内部要调用该函数,所以这里不可以调用Creator.getObject取对象,只能调用Creator.Objects来取对象\n\t_object = Creator.Objects[object_name]\n\tif !_object\n\t\treturn related_objects\n\t\n\trelatedList = _object.relatedList\n\tif Meteor.isClient && !_.isEmpty relatedList\n\t\trelatedListMap = {}\n\t\t_.each relatedList, (objName)->\n\t\t\tif _.isObject objName\n\t\t\t\trelatedListMap[objName.objectName] = {}\n\t\t\telse\n\t\t\t\trelatedListMap[objName] = {}\n\t\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\t\tif (related_field.type == \"master_detail\" || related_field.type == \"lookup\") and related_field.reference_to and related_field.reference_to == object_name and relatedListMap[related_object_name]\n\t\t\t\t\t# 当related_object.fields中有两个或以上的字段指向object_name表示的对象时,优先取第一个作为外键关系字段,但是related_field为主子表时强行覆盖之前的relatedListMap[related_object_name]值\n\t\t\t\t\tif _.isEmpty relatedListMap[related_object_name] || related_field.type == \"master_detail\"\n\t\t\t\t\t\trelatedListMap[related_object_name] = { object_name: related_object_name, foreign_key: related_field_name, write_requires_master_read: related_field.write_requires_master_read }\n\t\tif relatedListMap['cms_files']\n\t\t\trelatedListMap['cms_files'] = { object_name: \"cms_files\", foreign_key: \"parent\" }\n\t\tif relatedListMap['instances']\n\t\t\trelatedListMap['instances'] = { object_name: \"instances\", foreign_key: \"record_ids\" }\n\t\t_.each ['tasks', 'notes', 'events', 'approvals'], (enableObjName)->\n\t\t\tif relatedListMap[enableObjName]\n\t\t\t\trelatedListMap[enableObjName] = { object_name: enableObjName, foreign_key: \"related_to\" }\n\t\tif relatedListMap['audit_records']\n\t\t\t#record 详细下的audit_records仅modifyAllRecords权限可见\n\t\t\tpermissions = Creator.getPermissions(object_name)\n\t\t\tif _object.enable_audit && permissions?.modifyAllRecords\n\t\t\t\trelatedListMap['audit_records'] = { object_name:\"audit_records\", foreign_key: \"related_to\" }\n\t\trelated_objects = _.values relatedListMap\n\t\treturn related_objects\n\n\tif _object.enable_files\n\t\trelated_objects.push {object_name:\"cms_files\", foreign_key: \"parent\"}\n\n\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\tif related_object_name == \"cfs.files.filerecord\"\n\t\t\t# cfs.files.filerecord对象在第二次点击的时候related_object返回的是app-builder中的\"metadata.parent\"字段被删除了,记到metadata字段的sub_fields中了,所以要单独处理。\n\t\t\tsfsFilesObject = Creator.getObject(\"cfs.files.filerecord\")\n\t\t\tsfsFilesObject && related_object = sfsFilesObject\n\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\tif (related_field.type == \"master_detail\" || (related_field.type == \"lookup\" && related_field.relatedList)) and related_field.reference_to and related_field.reference_to == object_name\n\t\t\t\tif related_object_name == \"object_fields\"\n\t\t\t\t\t#TODO 待相关列表支持排序后,删除此判断\n\t\t\t\t\trelated_objects.splice(0, 0, {object_name:related_object_name, foreign_key: related_field_name})\n\t\t\t\telse\n\t\t\t\t\trelated_objects.push {object_name:related_object_name, foreign_key: related_field_name, write_requires_master_read: related_field.write_requires_master_read}\n\n\tif _object.enable_tasks\n\t\trelated_objects.push {object_name:\"tasks\", foreign_key: \"related_to\"}\n\tif _object.enable_notes\n\t\trelated_objects.push {object_name:\"notes\", foreign_key: \"related_to\"}\n\tif _object.enable_events\n\t\trelated_objects.push {object_name:\"events\", foreign_key: \"related_to\"}\n\tif _object.enable_instances\n\t\trelated_objects.push {object_name:\"instances\", foreign_key: \"record_ids\"}\n\tif _object.enable_approvals\n\t\trelated_objects.push {object_name:\"approvals\", foreign_key: \"related_to\"}\n\tif _object.enable_process\n\t\trelated_objects.push {object_name:\"process_instance_history\", foreign_key: \"target_object\"}\n\t#record 详细下的audit_records仅modifyAllRecords权限可见\n\tif Meteor.isClient\n\t\tpermissions = Creator.getPermissions(object_name)\n\t\tif _object.enable_audit && permissions?.modifyAllRecords\n\t\t\trelated_objects.push {object_name:\"audit_records\", foreign_key: \"related_to\"}\n\n\treturn related_objects\n\nCreator.getUserContext = (userId, spaceId, isUnSafeMode)->\n\tif Meteor.isClient\n\t\treturn Creator.USER_CONTEXT\n\telse\n\t\tif !(userId and spaceId)\n\t\t\tthrow new Meteor.Error 500, \"the params userId and spaceId is required for the function Creator.getUserContext\"\n\t\t\treturn null\n\t\tsuFields = {name: 1, mobile: 1, position: 1, email: 1, company: 1, organization: 1, space: 1, company_id: 1, company_ids: 1}\n\t\t# check if user in the space\n\t\tsu = Creator.Collections[\"space_users\"].findOne({space: spaceId, user: userId}, {fields: suFields})\n\t\tif !su\n\t\t\tspaceId = null\n\n\t\t# if spaceId not exists, get the first one.\n\t\tif !spaceId\n\t\t\tif isUnSafeMode\n\t\t\t\tsu = Creator.Collections[\"space_users\"].findOne({user: userId}, {fields: suFields})\n\t\t\t\tif !su\n\t\t\t\t\treturn null\n\t\t\t\tspaceId = su.space\n\t\t\telse\n\t\t\t\treturn null\n\n\t\tUSER_CONTEXT = {}\n\t\tUSER_CONTEXT.userId = userId\n\t\tUSER_CONTEXT.spaceId = spaceId\n\t\tUSER_CONTEXT.user = {\n\t\t\t_id: userId\n\t\t\tname: su.name,\n\t\t\tmobile: su.mobile,\n\t\t\tposition: su.position,\n\t\t\temail: su.email\n\t\t\tcompany: su.company\n\t\t\tcompany_id: su.company_id\n\t\t\tcompany_ids: su.company_ids\n\t\t}\n\t\tspace_user_org = Creator.getCollection(\"organizations\")?.findOne(su.organization)\n\t\tif space_user_org\n\t\t\tUSER_CONTEXT.user.organization = {\n\t\t\t\t_id: space_user_org._id,\n\t\t\t\tname: space_user_org.name,\n\t\t\t\tfullname: space_user_org.fullname\n\t\t\t}\n\t\treturn USER_CONTEXT\n\nCreator.getRelativeUrl = (url)->\n\n\tif _.isFunction(Steedos.isCordova) && Steedos.isCordova() && (url?.startsWith(\"/assets\") || url?.startsWith(\"assets\") || url?.startsWith(\"/packages\"))\n\t\tif !/^\\//.test(url)\n\t\t\turl = \"/\" + url\n\t\treturn url\n\n\tif url\n\t\t# url开头没有\"/\",需要添加\"/\"\n\t\tif !/^\\//.test(url)\n\t\t\turl = \"/\" + url\n\t\treturn __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url\n\telse\n\t\treturn __meteor_runtime_config__.ROOT_URL_PATH_PREFIX\n\nCreator.getUserCompanyId = (userId, spaceId)->\n\tuserId = userId || Meteor.userId()\n\tif Meteor.isClient\n\t\tspaceId = spaceId || Session.get('spaceId')\n\telse\n\t\tif !spaceId\n\t\t\tthrow new Meteor.Error(400, 'miss spaceId')\n\tsu = Creator.getCollection('space_users').findOne({space: spaceId, user: userId}, {fields: {company_id:1}})\n\treturn su.company_id\n\nCreator.getUserCompanyIds = (userId, spaceId)->\n\tuserId = userId || Meteor.userId()\n\tif Meteor.isClient\n\t\tspaceId = spaceId || Session.get('spaceId')\n\telse\n\t\tif !spaceId\n\t\t\tthrow new Meteor.Error(400, 'miss spaceId')\n\tsu = Creator.getCollection('space_users').findOne({space: spaceId, user: userId}, {fields: {company_ids:1}})\n\treturn su?.company_ids\n\nCreator.processPermissions = (po)->\n\tif po.allowCreate\n\t\tpo.allowRead = true\n\tif po.allowEdit\n\t\tpo.allowRead = true\n\tif po.allowDelete\n\t\tpo.allowEdit = true\n\t\tpo.allowRead = true\n\tif po.viewAllRecords\n\t\tpo.allowRead = true\n\tif po.modifyAllRecords\n\t\tpo.allowRead = true\n\t\tpo.allowEdit = true\n\t\tpo.allowDelete = true\n\t\tpo.viewAllRecords = true\n\tif po.viewCompanyRecords\n\t\tpo.allowRead = true\n\tif po.modifyCompanyRecords\n\t\tpo.allowRead = true\n\t\tpo.allowEdit = true\n\t\tpo.allowDelete = true\n\t\tpo.viewCompanyRecords = true\n\t\t\n\t# 如果附件相关权限配置为空,则兼容之前没有附件权限配置时的规则\n\tif po.allowRead\n\t\ttypeof po.allowReadFiles != \"boolean\" && po.allowReadFiles = true\n\t\ttypeof po.viewAllFiles != \"boolean\" && po.viewAllFiles = true\n\tif po.allowEdit\n\t\ttypeof po.allowCreateFiles != \"boolean\" && po.allowCreateFiles = true\n\t\ttypeof po.allowEditFiles != \"boolean\" && po.allowEditFiles = true\n\t\ttypeof po.allowDeleteFiles != \"boolean\" && po.allowDeleteFiles = true\n\tif po.modifyAllRecords\n\t\ttypeof po.modifyAllFiles != \"boolean\" && po.modifyAllFiles = true\n\n\tif po.allowCreateFiles\n\t\tpo.allowReadFiles = true\n\tif po.allowEditFiles\n\t\tpo.allowReadFiles = true\n\tif po.allowDeleteFiles\n\t\tpo.allowEditFiles = true\n\t\tpo.allowReadFiles = true\n\tif po.viewAllFiles\n\t\tpo.allowReadFiles = true\n\tif po.modifyAllFiles\n\t\tpo.allowReadFiles = true\n\t\tpo.allowEditFiles = true\n\t\tpo.allowDeleteFiles = true\n\t\tpo.viewAllFiles = true\n\n\treturn po\n\nCreator.getTemplateSpaceId = ()->\n\treturn Meteor.settings.public?.templateSpaceId\n\nCreator.getCloudAdminSpaceId = ()->\n\treturn Meteor.settings.public?.cloudAdminSpaceId\n\nCreator.isTemplateSpace = (spaceId)->\n\tif spaceId && Meteor.settings.public?.templateSpaceId == spaceId\n\t\treturn true\n\treturn false\n\nCreator.isCloudAdminSpace = (spaceId)->\n\tif spaceId && Meteor.settings.public?.cloudAdminSpaceId == spaceId\n\t\treturn true\n\treturn false\n\nif Meteor.isServer\n\tCreator.steedosStorageDir = process.env.STEEDOS_STORAGE_DIR\n\t","var Fiber;\n\nCreator.deps = {\n app: new Tracker.Dependency,\n object: new Tracker.Dependency\n};\n\nCreator._TEMPLATE = {\n Apps: {},\n Objects: {}\n};\n\nMeteor.startup(function() {\n SimpleSchema.extendOptions({\n filtersFunction: Match.Optional(Match.OneOf(Function, String))\n });\n SimpleSchema.extendOptions({\n optionsFunction: Match.Optional(Match.OneOf(Function, String))\n });\n return SimpleSchema.extendOptions({\n createFunction: Match.Optional(Match.OneOf(Function, String))\n });\n});\n\nif (Meteor.isServer) {\n Fiber = require('fibers');\n Creator.fiberLoadObjects = function(obj, object_name) {\n return Fiber(function() {\n return Creator.loadObjects(obj, object_name);\n }).run();\n };\n}\n\nCreator.loadObjects = function(obj, object_name) {\n if (!object_name) {\n object_name = obj.name;\n }\n if (!obj.list_views) {\n obj.list_views = {};\n }\n if (obj.space) {\n object_name = Creator.getCollectionName(obj);\n }\n if (object_name === 'cfs_files_filerecord') {\n object_name = 'cfs.files.filerecord';\n obj = _.clone(obj);\n obj.name = object_name;\n Creator.Objects[object_name] = obj;\n }\n Creator.convertObject(obj);\n new Creator.Object(obj);\n Creator.initTriggers(object_name);\n Creator.initListViews(object_name);\n return obj;\n};\n\nCreator.getObjectName = function(object) {\n if (object.space) {\n return \"c_\" + object.space + \"_\" + object.name;\n }\n return object.name;\n};\n\nCreator.getObject = function(object_name, space_id) {\n var ref, ref1;\n if (_.isArray(object_name)) {\n return;\n }\n if (Meteor.isClient) {\n if ((ref = Creator.deps) != null) {\n if ((ref1 = ref.object) != null) {\n ref1.depend();\n }\n }\n }\n if (!object_name && Meteor.isClient) {\n object_name = Session.get(\"object_name\");\n }\n if (object_name) {\n return Creator.objectsByName[object_name];\n }\n};\n\nCreator.getObjectById = function(object_id) {\n return _.findWhere(Creator.objectsByName, {\n _id: object_id\n });\n};\n\nCreator.removeObject = function(object_name) {\n console.log(\"removeObject\", object_name);\n delete Creator.Objects[object_name];\n return delete Creator.objectsByName[object_name];\n};\n\nCreator.getCollection = function(object_name, spaceId) {\n var ref;\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (object_name) {\n if (Meteor.isClient) {\n return db[object_name];\n } else {\n return Creator.Collections[((ref = Creator.getObject(object_name, spaceId)) != null ? ref._collection_name : void 0) || object_name];\n }\n }\n};\n\nCreator.removeCollection = function(object_name) {\n return delete Creator.Collections[object_name];\n};\n\nCreator.isSpaceAdmin = function(spaceId, userId) {\n var ref, ref1, space;\n if (Meteor.isClient) {\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n space = (ref = Creator.getObject(\"spaces\")) != null ? (ref1 = ref.db) != null ? ref1.findOne(spaceId, {\n fields: {\n admins: 1\n }\n }) : void 0 : void 0;\n if (space != null ? space.admins : void 0) {\n return space.admins.indexOf(userId) >= 0;\n }\n};\n\nCreator.evaluateFormula = function(formular, context, options) {\n if (!_.isString(formular)) {\n return formular;\n }\n if (Creator.Formular.checkFormula(formular)) {\n return Creator.Formular.run(formular, context, options);\n }\n return formular;\n};\n\nCreator.evaluateFilters = function(filters, context) {\n var selector;\n selector = {};\n _.each(filters, function(filter) {\n var action, name, value;\n if ((filter != null ? filter.length : void 0) === 3) {\n name = filter[0];\n action = filter[1];\n value = Creator.evaluateFormula(filter[2], context);\n selector[name] = {};\n return selector[name][action] = value;\n }\n });\n return selector;\n};\n\nCreator.isCommonSpace = function(spaceId) {\n return spaceId === 'common';\n};\n\n\n/*\n\tdocs:待排序的文档数组\n\tids:_id集合\n\tid_key: 默认为_id\n\treturn 按照ids的顺序返回新的文档集合\n */\n\nCreator.getOrderlySetByIds = function(docs, ids, id_key, hit_first) {\n var values;\n if (!id_key) {\n id_key = \"_id\";\n }\n if (hit_first) {\n values = docs.getProperty(id_key);\n return _.sortBy(docs, function(doc) {\n var _index;\n _index = ids.indexOf(doc[id_key]);\n if (_index > -1) {\n return _index;\n } else {\n return ids.length + _.indexOf(values, doc[id_key]);\n }\n });\n } else {\n return _.sortBy(docs, function(doc) {\n return ids.indexOf(doc[id_key]);\n });\n }\n};\n\n\n/*\n\t按用户所属本地化语言进行排序,支持中文、数值、日期等字段排序\n\t对于Object类型,如果提供作用域中key属性,则取值为value[key]进行排序比较,反之整个Object.toString()后排序比较\n */\n\nCreator.sortingMethod = function(value1, value2) {\n var isValue1Empty, isValue2Empty, locale;\n if (this.key) {\n value1 = value1[this.key];\n value2 = value2[this.key];\n }\n if (value1 instanceof Date) {\n value1 = value1.getTime();\n }\n if (value2 instanceof Date) {\n value2 = value2.getTime();\n }\n if (typeof value1 === \"number\" && typeof value2 === \"number\") {\n return value1 - value2;\n }\n isValue1Empty = value1 === null || value1 === void 0;\n isValue2Empty = value2 === null || value2 === void 0;\n if (isValue1Empty && !isValue2Empty) {\n return -1;\n }\n if (isValue1Empty && isValue2Empty) {\n return 0;\n }\n if (!isValue1Empty && isValue2Empty) {\n return 1;\n }\n locale = Steedos.locale();\n return value1.toString().localeCompare(value2.toString(), locale);\n};\n\nCreator.getObjectRelateds = function(object_name) {\n var _object, permissions, relatedList, relatedListMap, related_objects;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n }\n related_objects = [];\n _object = Creator.Objects[object_name];\n if (!_object) {\n return related_objects;\n }\n relatedList = _object.relatedList;\n if (Meteor.isClient && !_.isEmpty(relatedList)) {\n relatedListMap = {};\n _.each(relatedList, function(objName) {\n if (_.isObject(objName)) {\n return relatedListMap[objName.objectName] = {};\n } else {\n return relatedListMap[objName] = {};\n }\n });\n _.each(Creator.Objects, function(related_object, related_object_name) {\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if ((related_field.type === \"master_detail\" || related_field.type === \"lookup\") && related_field.reference_to && related_field.reference_to === object_name && relatedListMap[related_object_name]) {\n if (_.isEmpty(relatedListMap[related_object_name] || related_field.type === \"master_detail\")) {\n return relatedListMap[related_object_name] = {\n object_name: related_object_name,\n foreign_key: related_field_name,\n write_requires_master_read: related_field.write_requires_master_read\n };\n }\n }\n });\n });\n if (relatedListMap['cms_files']) {\n relatedListMap['cms_files'] = {\n object_name: \"cms_files\",\n foreign_key: \"parent\"\n };\n }\n if (relatedListMap['instances']) {\n relatedListMap['instances'] = {\n object_name: \"instances\",\n foreign_key: \"record_ids\"\n };\n }\n _.each(['tasks', 'notes', 'events', 'approvals'], function(enableObjName) {\n if (relatedListMap[enableObjName]) {\n return relatedListMap[enableObjName] = {\n object_name: enableObjName,\n foreign_key: \"related_to\"\n };\n }\n });\n if (relatedListMap['audit_records']) {\n permissions = Creator.getPermissions(object_name);\n if (_object.enable_audit && (permissions != null ? permissions.modifyAllRecords : void 0)) {\n relatedListMap['audit_records'] = {\n object_name: \"audit_records\",\n foreign_key: \"related_to\"\n };\n }\n }\n related_objects = _.values(relatedListMap);\n return related_objects;\n }\n if (_object.enable_files) {\n related_objects.push({\n object_name: \"cms_files\",\n foreign_key: \"parent\"\n });\n }\n _.each(Creator.Objects, function(related_object, related_object_name) {\n var sfsFilesObject;\n if (related_object_name === \"cfs.files.filerecord\") {\n sfsFilesObject = Creator.getObject(\"cfs.files.filerecord\");\n sfsFilesObject && (related_object = sfsFilesObject);\n }\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if ((related_field.type === \"master_detail\" || (related_field.type === \"lookup\" && related_field.relatedList)) && related_field.reference_to && related_field.reference_to === object_name) {\n if (related_object_name === \"object_fields\") {\n return related_objects.splice(0, 0, {\n object_name: related_object_name,\n foreign_key: related_field_name\n });\n } else {\n return related_objects.push({\n object_name: related_object_name,\n foreign_key: related_field_name,\n write_requires_master_read: related_field.write_requires_master_read\n });\n }\n }\n });\n });\n if (_object.enable_tasks) {\n related_objects.push({\n object_name: \"tasks\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_notes) {\n related_objects.push({\n object_name: \"notes\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_events) {\n related_objects.push({\n object_name: \"events\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_instances) {\n related_objects.push({\n object_name: \"instances\",\n foreign_key: \"record_ids\"\n });\n }\n if (_object.enable_approvals) {\n related_objects.push({\n object_name: \"approvals\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_process) {\n related_objects.push({\n object_name: \"process_instance_history\",\n foreign_key: \"target_object\"\n });\n }\n if (Meteor.isClient) {\n permissions = Creator.getPermissions(object_name);\n if (_object.enable_audit && (permissions != null ? permissions.modifyAllRecords : void 0)) {\n related_objects.push({\n object_name: \"audit_records\",\n foreign_key: \"related_to\"\n });\n }\n }\n return related_objects;\n};\n\nCreator.getUserContext = function(userId, spaceId, isUnSafeMode) {\n var USER_CONTEXT, ref, space_user_org, su, suFields;\n if (Meteor.isClient) {\n return Creator.USER_CONTEXT;\n } else {\n if (!(userId && spaceId)) {\n throw new Meteor.Error(500, \"the params userId and spaceId is required for the function Creator.getUserContext\");\n return null;\n }\n suFields = {\n name: 1,\n mobile: 1,\n position: 1,\n email: 1,\n company: 1,\n organization: 1,\n space: 1,\n company_id: 1,\n company_ids: 1\n };\n su = Creator.Collections[\"space_users\"].findOne({\n space: spaceId,\n user: userId\n }, {\n fields: suFields\n });\n if (!su) {\n spaceId = null;\n }\n if (!spaceId) {\n if (isUnSafeMode) {\n su = Creator.Collections[\"space_users\"].findOne({\n user: userId\n }, {\n fields: suFields\n });\n if (!su) {\n return null;\n }\n spaceId = su.space;\n } else {\n return null;\n }\n }\n USER_CONTEXT = {};\n USER_CONTEXT.userId = userId;\n USER_CONTEXT.spaceId = spaceId;\n USER_CONTEXT.user = {\n _id: userId,\n name: su.name,\n mobile: su.mobile,\n position: su.position,\n email: su.email,\n company: su.company,\n company_id: su.company_id,\n company_ids: su.company_ids\n };\n space_user_org = (ref = Creator.getCollection(\"organizations\")) != null ? ref.findOne(su.organization) : void 0;\n if (space_user_org) {\n USER_CONTEXT.user.organization = {\n _id: space_user_org._id,\n name: space_user_org.name,\n fullname: space_user_org.fullname\n };\n }\n return USER_CONTEXT;\n }\n};\n\nCreator.getRelativeUrl = function(url) {\n if (_.isFunction(Steedos.isCordova) && Steedos.isCordova() && ((url != null ? url.startsWith(\"/assets\") : void 0) || (url != null ? url.startsWith(\"assets\") : void 0) || (url != null ? url.startsWith(\"/packages\") : void 0))) {\n if (!/^\\//.test(url)) {\n url = \"/\" + url;\n }\n return url;\n }\n if (url) {\n if (!/^\\//.test(url)) {\n url = \"/\" + url;\n }\n return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url;\n } else {\n return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;\n }\n};\n\nCreator.getUserCompanyId = function(userId, spaceId) {\n var su;\n userId = userId || Meteor.userId();\n if (Meteor.isClient) {\n spaceId = spaceId || Session.get('spaceId');\n } else {\n if (!spaceId) {\n throw new Meteor.Error(400, 'miss spaceId');\n }\n }\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n company_id: 1\n }\n });\n return su.company_id;\n};\n\nCreator.getUserCompanyIds = function(userId, spaceId) {\n var su;\n userId = userId || Meteor.userId();\n if (Meteor.isClient) {\n spaceId = spaceId || Session.get('spaceId');\n } else {\n if (!spaceId) {\n throw new Meteor.Error(400, 'miss spaceId');\n }\n }\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n company_ids: 1\n }\n });\n return su != null ? su.company_ids : void 0;\n};\n\nCreator.processPermissions = function(po) {\n if (po.allowCreate) {\n po.allowRead = true;\n }\n if (po.allowEdit) {\n po.allowRead = true;\n }\n if (po.allowDelete) {\n po.allowEdit = true;\n po.allowRead = true;\n }\n if (po.viewAllRecords) {\n po.allowRead = true;\n }\n if (po.modifyAllRecords) {\n po.allowRead = true;\n po.allowEdit = true;\n po.allowDelete = true;\n po.viewAllRecords = true;\n }\n if (po.viewCompanyRecords) {\n po.allowRead = true;\n }\n if (po.modifyCompanyRecords) {\n po.allowRead = true;\n po.allowEdit = true;\n po.allowDelete = true;\n po.viewCompanyRecords = true;\n }\n if (po.allowRead) {\n typeof po.allowReadFiles !== \"boolean\" && (po.allowReadFiles = true);\n typeof po.viewAllFiles !== \"boolean\" && (po.viewAllFiles = true);\n }\n if (po.allowEdit) {\n typeof po.allowCreateFiles !== \"boolean\" && (po.allowCreateFiles = true);\n typeof po.allowEditFiles !== \"boolean\" && (po.allowEditFiles = true);\n typeof po.allowDeleteFiles !== \"boolean\" && (po.allowDeleteFiles = true);\n }\n if (po.modifyAllRecords) {\n typeof po.modifyAllFiles !== \"boolean\" && (po.modifyAllFiles = true);\n }\n if (po.allowCreateFiles) {\n po.allowReadFiles = true;\n }\n if (po.allowEditFiles) {\n po.allowReadFiles = true;\n }\n if (po.allowDeleteFiles) {\n po.allowEditFiles = true;\n po.allowReadFiles = true;\n }\n if (po.viewAllFiles) {\n po.allowReadFiles = true;\n }\n if (po.modifyAllFiles) {\n po.allowReadFiles = true;\n po.allowEditFiles = true;\n po.allowDeleteFiles = true;\n po.viewAllFiles = true;\n }\n return po;\n};\n\nCreator.getTemplateSpaceId = function() {\n var ref;\n return (ref = Meteor.settings[\"public\"]) != null ? ref.templateSpaceId : void 0;\n};\n\nCreator.getCloudAdminSpaceId = function() {\n var ref;\n return (ref = Meteor.settings[\"public\"]) != null ? ref.cloudAdminSpaceId : void 0;\n};\n\nCreator.isTemplateSpace = function(spaceId) {\n var ref;\n if (spaceId && ((ref = Meteor.settings[\"public\"]) != null ? ref.templateSpaceId : void 0) === spaceId) {\n return true;\n }\n return false;\n};\n\nCreator.isCloudAdminSpace = function(spaceId) {\n var ref;\n if (spaceId && ((ref = Meteor.settings[\"public\"]) != null ? ref.cloudAdminSpaceId : void 0) === spaceId) {\n return true;\n }\n return false;\n};\n\nif (Meteor.isServer) {\n Creator.steedosStorageDir = process.env.STEEDOS_STORAGE_DIR;\n}\n","Meteor.methods\n\t# 用户获取lookup 、master_detail类型字段的选项值\n\t\"creator.object_options\": (options)->\n\t\tif options?.params?.reference_to\n\n\t\t\tobject = Creator.getObject(options.params.reference_to, options.params.space)\n\n\t\t\tname_field_key = object.NAME_FIELD_KEY\n\n\t\t\tquery = {}\n\t\t\tif options.params.space\n\t\t\t\tquery.space = options.params.space\n\n\t\t\t\tsort = options?.sort\n\n\t\t\t\tselected = options?.selected || []\n\n\t\t\t\toptions_limit = options?.options_limit || 10\n\n\t\t\t\tif options.searchText\n\t\t\t\t\tsearchTextQuery = {}\n\t\t\t\t\tsearchTextQuery[name_field_key] = {$regex: options.searchText}\n\n\t\t\t\tif options?.values?.length\n\t\t\t\t\tif options.searchText\n\t\t\t\t\t\tquery.$or = [{_id: {$in: options.values}}, searchTextQuery]\n\t\t\t\t\telse\n\t\t\t\t\t\tquery.$or = [{_id: {$in: options.values}}]\n\t\t\t\telse\n\t\t\t\t\tif options.searchText\n\t\t\t\t\t\t_.extend(query, searchTextQuery)\n\t\t\t\t\tquery._id = {$nin: selected}\n\n\t\t\t\tcollection = object.db\n\n\t\t\t\tif options.filterQuery\n\t\t\t\t\t_.extend query, options.filterQuery\n\n\t\t\t\tquery_options = {limit: options_limit}\n\n\t\t\t\tif sort && _.isObject(sort)\n\t\t\t\t\tquery_options.sort = sort\n\n\t\t\t\tif collection\n\t\t\t\t\ttry\n\t\t\t\t\t\trecords = collection.find(query, query_options).fetch()\n\t\t\t\t\t\tresults = []\n\t\t\t\t\t\t_.each records, (record)->\n\t\t\t\t\t\t\tresults.push\n\t\t\t\t\t\t\t\tlabel: record[name_field_key]\n\t\t\t\t\t\t\t\tvalue: record._id\n\t\t\t\t\t\treturn results\n\t\t\t\t\tcatch e\n\t\t\t\t\t\tthrow new Meteor.Error 500, e.message + \"-->\" + JSON.stringify(options)\n\t\treturn [] ","Meteor.methods({\n \"creator.object_options\": function(options) {\n var collection, e, name_field_key, object, options_limit, query, query_options, records, ref, ref1, results, searchTextQuery, selected, sort;\n if (options != null ? (ref = options.params) != null ? ref.reference_to : void 0 : void 0) {\n object = Creator.getObject(options.params.reference_to, options.params.space);\n name_field_key = object.NAME_FIELD_KEY;\n query = {};\n if (options.params.space) {\n query.space = options.params.space;\n sort = options != null ? options.sort : void 0;\n selected = (options != null ? options.selected : void 0) || [];\n options_limit = (options != null ? options.options_limit : void 0) || 10;\n if (options.searchText) {\n searchTextQuery = {};\n searchTextQuery[name_field_key] = {\n $regex: options.searchText\n };\n }\n if (options != null ? (ref1 = options.values) != null ? ref1.length : void 0 : void 0) {\n if (options.searchText) {\n query.$or = [\n {\n _id: {\n $in: options.values\n }\n }, searchTextQuery\n ];\n } else {\n query.$or = [\n {\n _id: {\n $in: options.values\n }\n }\n ];\n }\n } else {\n if (options.searchText) {\n _.extend(query, searchTextQuery);\n }\n query._id = {\n $nin: selected\n };\n }\n collection = object.db;\n if (options.filterQuery) {\n _.extend(query, options.filterQuery);\n }\n query_options = {\n limit: options_limit\n };\n if (sort && _.isObject(sort)) {\n query_options.sort = sort;\n }\n if (collection) {\n try {\n records = collection.find(query, query_options).fetch();\n results = [];\n _.each(records, function(record) {\n return results.push({\n label: record[name_field_key],\n value: record._id\n });\n });\n return results;\n } catch (error) {\n e = error;\n throw new Meteor.Error(500, e.message + \"-->\" + JSON.stringify(options));\n }\n }\n }\n }\n return [];\n }\n});\n","Creator.getInitWidthPercent = (object_name, columns) ->\n\t_schema = Creator.getSchema(object_name)?._schema\n\tcolumn_num = 0\n\tif _schema\n\t\t_.each columns, (field_name) ->\n\t\t\tfield = _.pick(_schema, field_name)\n\t\t\tis_wide = field[field_name]?.autoform?.is_wide\n\t\t\tif is_wide\n\t\t\t\tcolumn_num += 2\n\t\t\telse\n\t\t\t\tcolumn_num += 1\n\n\t\tinit_width_percent = 100 / column_num\n\t\treturn init_width_percent\n\nCreator.getFieldIsWide = (object_name, field_name) ->\n\t_schema = Creator.getSchema(object_name)._schema\n\tif _schema\n\t\tfield = _.pick(_schema, field_name)\n\t\tis_wide = field[field_name]?.autoform?.is_wide\n\t\treturn is_wide\n\nCreator.getTabularOrder = (object_name, list_view_id, columns) ->\n\tsetting = Creator.Collections?.settings?.findOne({object_name: object_name, record_id: \"object_listviews\"})\n\tobj = Creator.getObject(object_name)\n\tcolumns = _.map columns, (column)->\n\t\tfield = obj.fields[column]\n\t\tif field?.type and !field.hidden\n\t\t\treturn column\n\t\telse\n\t\t\treturn undefined\n\tcolumns = _.compact columns\n\tif setting and setting.settings\n\t\tsort = setting.settings[list_view_id]?.sort || []\n\t\tsort = _.map sort, (order)->\n\t\t\tkey = order[0]\n\t\t\tindex = _.indexOf(columns, key)\n\t\t\torder[0] = index + 1\n\t\t\treturn order\n\t\treturn sort\n\treturn []\n\n\nCreator.initListViews = (object_name)->\n\tobject = Creator.getObject(object_name)\n\tcolumns = Creator.getObjectDefaultColumns(object_name) || [\"name\"]\n\textra_columns = [\"owner\"]\n\tdefault_extra_columns = Creator.getObjectDefaultExtraColumns(object_name) || [\"owner\"]\n\tif default_extra_columns\n\t\textra_columns = _.union extra_columns, default_extra_columns\n\n\torder = Creator.getObjectDefaultSort(object_name) || []\n\tif Meteor.isClient\n\t\tCreator.TabularSelectedIds?[object_name] = []\n\nCreator.convertListView = (default_view, list_view, list_view_name)->\n\tdefault_columns = default_view?.columns\n\tdefault_mobile_columns = default_view?.mobile_columns\n\tunless list_view\n\t\treturn\n\toitem = _.clone(list_view)\n\tif !_.has(oitem, \"name\")\n\t\toitem.name = list_view_name\n\tif !oitem.columns\n\t\tif default_columns\n\t\t\toitem.columns = default_columns\n\tif !oitem.columns\n\t\toitem.columns = [\"name\"]\n\tif !oitem.mobile_columns\n\t\tif default_mobile_columns\n\t\t\toitem.mobile_columns = default_mobile_columns\n\n\tif Meteor.isClient\n\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\")) && !_.include(oitem.columns, 'space')\n\t\t\toitem.columns.push('space')\n\n\n\tif !oitem.filter_scope\n\t\t# listview视图的filter_scope默认值改为space #131\n\t\toitem.filter_scope = \"space\"\n\n\tif !_.has(oitem, \"_id\")\n\t\toitem._id = list_view_name\n\telse\n\t\toitem.label = oitem.label || list_view.name\n\n\tif _.isString(oitem.options)\n\t\toitem.options = JSON.parse(oitem.options)\n\n\t_.forEach oitem.filters, (filter, _index)->\n\t\tif !_.isArray(filter) && _.isObject(filter)\n\t\t\tif Meteor.isServer\n\t\t\t\tif _.isFunction(filter?.value)\n\t\t\t\t\tfilter._value = filter.value.toString()\n\t\t\telse\n\t\t\t\tif _.isString(filter?._value)\n\t\t\t\t\tfilter.value = Creator.eval(\"(#{filter._value})\")\n\treturn oitem\n\n\nif Meteor.isClient\n\tCreator.getRelatedList = (object_name)->\n\t\tunless object_name\n\t\t\treturn\n\t\trelatedListObjects = {}\n\t\trelatedListNames = []\n\t\tobjectLayoutRelatedListObjects = [];\n\t\t_object = Creator.getObject(object_name)\n\t\tif _object\n\t\t\tlayoutRelatedList = _object.related_lists;\n\t\t\t# layoutRelatedList 是数组就表示配置过页面布局,就启用页面布局的相关子表。\n\t\t\tif _.isArray layoutRelatedList\n\t\t\t\t_.each layoutRelatedList, (item)->\n\t\t\t\t\treObjectName = item.related_field_fullname.split('.')[0]\n\t\t\t\t\treFieldName = item.related_field_fullname.split('.')[1]\n\t\t\t\t\twrite_requires_master_read = Creator.getObject(reObjectName)?.fields[reFieldName]?.write_requires_master_read\n\t\t\t\t\trelated =\n\t\t\t\t\t\tobject_name: reObjectName\n\t\t\t\t\t\tcolumns: item.field_names\n\t\t\t\t\t\tmobile_columns: item.field_names\n\t\t\t\t\t\tis_file: reObjectName == \"cms_files\"\n\t\t\t\t\t\tfiltersFunction: item.filters\n\t\t\t\t\t\tsort: item.sort\n\t\t\t\t\t\trelated_field_name: reFieldName\n\t\t\t\t\t\tcustomRelatedListObject: true\n\t\t\t\t\t\twrite_requires_master_read: write_requires_master_read\n\t\t\t\t\t\tlabel: item.label\n\t\t\t\t\t\tactions: item.buttons\n\t\t\t\t\t\tvisible_on: item.visible_on\n\t\t\t\t\t\tpage_size: item.page_size\n\t\t\t\t\tobjectLayoutRelatedListObjects.push(related)\n\t\t\t\treturn objectLayoutRelatedListObjects;\n\t\t\trelatedList = _object.relatedList\n\t\t\tif !_.isEmpty relatedList\n\t\t\t\t_.each relatedList, (objOrName)->\n\t\t\t\t\tif _.isObject objOrName\n\t\t\t\t\t\trelated =\n\t\t\t\t\t\t\tobject_name: objOrName.objectName\n\t\t\t\t\t\t\tcolumns: objOrName.columns\n\t\t\t\t\t\t\tmobile_columns: objOrName.mobile_columns\n\t\t\t\t\t\t\tis_file: objOrName.objectName == \"cms_files\"\n\t\t\t\t\t\t\tfiltersFunction: objOrName.filters\n\t\t\t\t\t\t\tsort: objOrName.sort\n\t\t\t\t\t\t\trelated_field_name: ''\n\t\t\t\t\t\t\tcustomRelatedListObject: true\n\t\t\t\t\t\t\tlabel: objOrName.label\n\t\t\t\t\t\t\tactions: objOrName.actions\n\t\t\t\t\t\t\tpage_size: objOrName.page_size\n\t\t\t\t\t\trelatedListObjects[objOrName.objectName] = related\n\t\t\t\t\t\trelatedListNames.push objOrName.objectName\n\t\t\t\t\telse if _.isString objOrName\n\t\t\t\t\t\trelatedListNames.push objOrName\n\n\t\tmapList = {}\n\t\trelated_objects = Creator.getRelatedObjects(object_name)\n\t\t_.each related_objects, (related_object_item) ->\n\t\t\tif !related_object_item?.object_name\n\t\t\t\treturn\n\t\t\trelated_object_name = related_object_item.object_name\n\t\t\trelated_field_name = related_object_item.foreign_key\n\t\t\twrite_requires_master_read = related_object_item.write_requires_master_read\n\t\t\trelated_object = Creator.getObject(related_object_name)\n\t\t\tunless related_object\n\t\t\t\treturn\n\t\t\tcolumns = Creator.getObjectFirstListViewColumns(related_object_name) || [\"name\"]\n\t\t\tcolumns = _.without(columns, related_field_name)\n\t\t\tmobile_columns = Creator.getObjectFirstListViewColumns(related_object_name, true) || [\"name\"]\n\t\t\tmobile_columns = _.without(mobile_columns, related_field_name)\n\n\t\t\torder = Creator.getObjectDefaultSort(related_object_name)\n\t\t\ttabular_order = Creator.transformSortToTabular(order, columns)\n\n\t\t\tif /\\w+\\.\\$\\.\\w+/g.test(related_field_name)\n\t\t\t\t# object类型带子属性的related_field_name要去掉中间的美元符号,否则显示不出字段值\n\t\t\t\trelated_field_name = related_field_name.replace(/\\$\\./,\"\")\n\t\t\trelated =\n\t\t\t\tobject_name: related_object_name\n\t\t\t\tcolumns: columns\n\t\t\t\tmobile_columns: mobile_columns\n\t\t\t\trelated_field_name: related_field_name\n\t\t\t\tis_file: related_object_name == \"cms_files\"\n\t\t\t\twrite_requires_master_read: write_requires_master_read\n\n\t\t\trelatedObject = relatedListObjects[related_object_name]\n\t\t\tif relatedObject\n\t\t\t\tif relatedObject.columns\n\t\t\t\t\trelated.columns = relatedObject.columns\n\t\t\t\tif relatedObject.mobile_columns\n\t\t\t\t\trelated.mobile_columns = relatedObject.mobile_columns\n\t\t\t\tif relatedObject.sort\n\t\t\t\t\trelated.sort = relatedObject.sort\n\t\t\t\tif relatedObject.filtersFunction\n\t\t\t\t\trelated.filtersFunction = relatedObject.filtersFunction\n\t\t\t\tif relatedObject.customRelatedListObject\n\t\t\t\t\trelated.customRelatedListObject = relatedObject.customRelatedListObject\n\t\t\t\tif relatedObject.label\n\t\t\t\t\trelated.label = relatedObject.label\n\t\t\t\tif relatedObject.page_size\n\t\t\t\t\trelated.page_size = relatedObject.page_size\n\t\t\t\tdelete relatedListObjects[related_object_name]\n\n\t\t\tmapList[related.object_name] = related\n\n\n\t\tspaceId = Session.get(\"spaceId\")\n\t\tuserId = Meteor.userId()\n\t\trelated_object_names = _.pluck(_.values(relatedListObjects), \"object_name\")\n\t\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\t\tunrelated_objects = permissions.unrelated_objects\n\t\trelated_object_names = _.difference related_object_names, unrelated_objects\n\t\t_.each relatedListObjects, (v, related_object_name) ->\n\t\t\tisActive = related_object_names.indexOf(related_object_name) > -1\n\t\t\tallowRead = Creator.getPermissions(related_object_name, spaceId, userId)?.allowRead\n\t\t\tif isActive && allowRead\n\t\t\t\tmapList[related_object_name] = v\n\n\t\tlist = []\n\t\tif _.isEmpty relatedListNames\n\t\t\tlist = _.values mapList\n\t\telse\n\t\t\t_.each relatedListNames, (objectName) ->\n\t\t\t\tif mapList[objectName]\n\t\t\t\t\tlist.push mapList[objectName]\n\n\t\tif _.has(_object, 'allow_relatedList')\n\t\t\tlist = _.filter list, (item)->\n\t\t\t\treturn _.include(_object.allow_relatedList, item.object_name)\n\n\t\treturn list\n\nCreator.getObjectFirstListView = (object_name)->\n\treturn _.first(Creator.getListViews(object_name))\n\n### \n\t取出list_view_id对应的视图,如果不存在或者没有权限,就返回第一个视图\n\texac为true时,需要强制按list_view_id精确查找,不默认返回第一个视图\n###\nCreator.getListView = (object_name, list_view_id, exac)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !list_view_id\n\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\treturn\n\tlistViews = Creator.getListViews(object_name)\n\tunless listViews?.length\n\t\treturn\n\tlist_view = _.find(listViews, (item)-> return item._id == list_view_id || item.name == list_view_id)\n\tunless list_view\n\t\t# 如果不需要强制按list_view_id精确查找,则默认返回第一个视图,反之返回空\n\t\tif exac\n\t\t\treturn\n\t\telse\n\t\t\tlist_view = listViews[0]\n\treturn list_view\n\n#获取list_view_id对应的视图是否是最近查看视图\nCreator.getListViewIsRecent = (object_name, list_view_id)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !list_view_id\n\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\tif typeof(list_view_id) == \"string\"\n\t\tobject = Creator.getObject(object_name)\n\t\tif !object\n\t\t\treturn\n\t\tlistView = _.findWhere(object.list_views,{_id: list_view_id})\n\telse\n\t\tlistView = list_view_id\n\treturn listView?.name == \"recent\"\n\n\n###\n 从columns参数中过滤出用于手机端显示的columns\n\t规则:\n\t1.优先把columns中的name字段排在第一个\n\t2.最多只返回4个字段\n\t3.考虑宽字段占用整行规则条件下,最多只返回两行\n###\nCreator.pickObjectMobileColumns = (object_name, columns)->\n\tresult = []\n\tmaxRows = 2 \n\tmaxCount = maxRows * 2\n\tcount = 0\n\tobject = Creator.getObject(object_name)\n\tfields = object.fields\n\tunless object\n\t\treturn columns\n\tnameKey = object.NAME_FIELD_KEY\n\tisNameColumn = (item)->\n\t\tif _.isObject(item)\n\t\t\treturn item.field == nameKey\n\t\telse\n\t\t\treturn item == nameKey\n\tgetField = (item)->\n\t\tif _.isObject(item)\n\t\t\treturn fields[item.field]\n\t\telse\n\t\t\treturn fields[item]\n\tif nameKey\n\t\tnameColumn = columns.find (item)->\n\t\t\treturn isNameColumn(item)\n\tif nameColumn\n\t\tfield = getField(nameColumn)\n\t\titemCount = if field.is_wide then 2 else 1\n\t\tcount += itemCount\n\t\tresult.push nameColumn\n\tcolumns.forEach (item)->\n\t\tfield = getField(item)\n\t\tunless field\n\t\t\treturn\n\t\titemCount = if field.is_wide then 2 else 1\n\t\tif count < maxCount and result.length < maxCount and !isNameColumn(item)\n\t\t\tcount += itemCount\n\t\t\tif count <= maxCount\n\t\t\t\tresult.push item\n\t\n\treturn result\n\n###\n 获取默认视图\n###\nCreator.getObjectDefaultView = (object_name)->\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\tobject = Creator.Objects[object_name]\n\tif object?.list_views?.default\n\t\t#TODO 此代码只是暂时兼容以前code中定义的default视图,待code中的default清理完成后,需要删除此代码\n\t\tdefaultView = object.list_views.default\n\telse\n\t\t_.each object?.list_views, (list_view, key)->\n\t\t\tif list_view.name == \"all\" || key == \"all\"\n\t\t\t\tdefaultView = list_view\n\treturn defaultView;\n\n###\n 获取对象的列表默认显示字段\n###\nCreator.getObjectDefaultColumns = (object_name, use_mobile_columns)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\tcolumns = defaultView?.columns\n\tif use_mobile_columns\n\t\tif defaultView?.mobile_columns\n\t\t\tcolumns = defaultView.mobile_columns\n\t\telse if columns\n\t\t\tcolumns = Creator.pickObjectMobileColumns(object_name, columns)\n\treturn columns\n\n###\n 获取对象的列表第一个视图显示的字段\n###\nCreator.getObjectFirstListViewColumns = (object_name, use_mobile_columns)->\n\tdefaultView = Creator.getObjectFirstListView(object_name)\n\tcolumns = defaultView?.columns\n\tif use_mobile_columns\n\t\tif defaultView?.mobile_columns\n\t\t\tcolumns = defaultView.mobile_columns\n\t\telse if columns\n\t\t\tcolumns = Creator.pickObjectMobileColumns(object_name, columns)\n\treturn columns\n\n###\n\t获取对象的列表默认额外加载的字段\n###\nCreator.getObjectDefaultExtraColumns = (object_name)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\treturn defaultView?.extra_columns\n\n###\n\t获取对象的默认排序\n###\nCreator.getObjectDefaultSort = (object_name)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\tif defaultView\n\t\tif defaultView.sort\n\t\t\treturn defaultView.sort\n\t\telse\n\t\t\treturn [[\"created\", \"desc\"]]\n\n\n###\n 判断是否All view\n###\nCreator.isAllView = (list_view)->\n\treturn list_view?.name == \"all\"\n\n###\n 判断是否最近查看 view\n###\nCreator.isRecentView = (list_view)->\n\treturn list_view?.name == \"recent\"\n\n###\n 将sort转换为Tabular控件所需要的格式\n###\nCreator.transformSortToTabular = (sort, tabularColumns)->\n\ttabular_sort = []\n\t_.each sort, (item)->\n\t\tif _.isArray(item)\n\t\t\t# 兼容旧的数据格式[[\"field_name\", \"order\"]]\n\t\t\tif item.length == 1\n\t\t\t\tcolumn_index = tabularColumns.indexOf(item[0])\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, \"asc\"]\n\t\t\telse if item.length == 2\n\t\t\t\tcolumn_index = tabularColumns.indexOf(item[0])\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, item[1]]\n\t\telse if _.isObject(item)\n\t\t\t#新数据格式:[{field_name: , order: }]\n\t\t\tfield_name = item.field_name\n\t\t\torder = item.order\n\t\t\tif field_name && order\n\t\t\t\tcolumn_index = tabularColumns.indexOf(field_name)\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, order]\n\n\treturn tabular_sort\n\n###\n 将sort转换为DevExpress控件所需要的格式\n###\nCreator.transformSortToDX = (sort)->\n\tdx_sort = []\n\t_.each sort, (item)->\n\t\tif _.isArray(item)\n\t\t\t#兼容旧格式:[[\"field_name\", \"order\"]]\n\t\t\tdx_sort.push(item)\n\t\telse if _.isObject(item)\n\t\t\t#新数据格式:[{field_name: , order: }]\n\t\t\tfield_name = item.field_name\n\t\t\torder = item.order\n\t\t\tif field_name && order\n\t\t\t\tdx_sort.push [field_name, order]\n\n\treturn dx_sort\n","Creator.getInitWidthPercent = function(object_name, columns) {\n var _schema, column_num, init_width_percent, ref;\n _schema = (ref = Creator.getSchema(object_name)) != null ? ref._schema : void 0;\n column_num = 0;\n if (_schema) {\n _.each(columns, function(field_name) {\n var field, is_wide, ref1, ref2;\n field = _.pick(_schema, field_name);\n is_wide = (ref1 = field[field_name]) != null ? (ref2 = ref1.autoform) != null ? ref2.is_wide : void 0 : void 0;\n if (is_wide) {\n return column_num += 2;\n } else {\n return column_num += 1;\n }\n });\n init_width_percent = 100 / column_num;\n return init_width_percent;\n }\n};\n\nCreator.getFieldIsWide = function(object_name, field_name) {\n var _schema, field, is_wide, ref, ref1;\n _schema = Creator.getSchema(object_name)._schema;\n if (_schema) {\n field = _.pick(_schema, field_name);\n is_wide = (ref = field[field_name]) != null ? (ref1 = ref.autoform) != null ? ref1.is_wide : void 0 : void 0;\n return is_wide;\n }\n};\n\nCreator.getTabularOrder = function(object_name, list_view_id, columns) {\n var obj, ref, ref1, ref2, setting, sort;\n setting = (ref = Creator.Collections) != null ? (ref1 = ref.settings) != null ? ref1.findOne({\n object_name: object_name,\n record_id: \"object_listviews\"\n }) : void 0 : void 0;\n obj = Creator.getObject(object_name);\n columns = _.map(columns, function(column) {\n var field;\n field = obj.fields[column];\n if ((field != null ? field.type : void 0) && !field.hidden) {\n return column;\n } else {\n return void 0;\n }\n });\n columns = _.compact(columns);\n if (setting && setting.settings) {\n sort = ((ref2 = setting.settings[list_view_id]) != null ? ref2.sort : void 0) || [];\n sort = _.map(sort, function(order) {\n var index, key;\n key = order[0];\n index = _.indexOf(columns, key);\n order[0] = index + 1;\n return order;\n });\n return sort;\n }\n return [];\n};\n\nCreator.initListViews = function(object_name) {\n var columns, default_extra_columns, extra_columns, object, order, ref;\n object = Creator.getObject(object_name);\n columns = Creator.getObjectDefaultColumns(object_name) || [\"name\"];\n extra_columns = [\"owner\"];\n default_extra_columns = Creator.getObjectDefaultExtraColumns(object_name) || [\"owner\"];\n if (default_extra_columns) {\n extra_columns = _.union(extra_columns, default_extra_columns);\n }\n order = Creator.getObjectDefaultSort(object_name) || [];\n if (Meteor.isClient) {\n return (ref = Creator.TabularSelectedIds) != null ? ref[object_name] = [] : void 0;\n }\n};\n\nCreator.convertListView = function(default_view, list_view, list_view_name) {\n var default_columns, default_mobile_columns, oitem;\n default_columns = default_view != null ? default_view.columns : void 0;\n default_mobile_columns = default_view != null ? default_view.mobile_columns : void 0;\n if (!list_view) {\n return;\n }\n oitem = _.clone(list_view);\n if (!_.has(oitem, \"name\")) {\n oitem.name = list_view_name;\n }\n if (!oitem.columns) {\n if (default_columns) {\n oitem.columns = default_columns;\n }\n }\n if (!oitem.columns) {\n oitem.columns = [\"name\"];\n }\n if (!oitem.mobile_columns) {\n if (default_mobile_columns) {\n oitem.mobile_columns = default_mobile_columns;\n }\n }\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\")) && !_.include(oitem.columns, 'space')) {\n oitem.columns.push('space');\n }\n }\n if (!oitem.filter_scope) {\n oitem.filter_scope = \"space\";\n }\n if (!_.has(oitem, \"_id\")) {\n oitem._id = list_view_name;\n } else {\n oitem.label = oitem.label || list_view.name;\n }\n if (_.isString(oitem.options)) {\n oitem.options = JSON.parse(oitem.options);\n }\n _.forEach(oitem.filters, function(filter, _index) {\n if (!_.isArray(filter) && _.isObject(filter)) {\n if (Meteor.isServer) {\n if (_.isFunction(filter != null ? filter.value : void 0)) {\n return filter._value = filter.value.toString();\n }\n } else {\n if (_.isString(filter != null ? filter._value : void 0)) {\n return filter.value = Creator[\"eval\"](\"(\" + filter._value + \")\");\n }\n }\n }\n });\n return oitem;\n};\n\nif (Meteor.isClient) {\n Creator.getRelatedList = function(object_name) {\n var _object, layoutRelatedList, list, mapList, objectLayoutRelatedListObjects, permissions, relatedList, relatedListNames, relatedListObjects, related_object_names, related_objects, spaceId, unrelated_objects, userId;\n if (!object_name) {\n return;\n }\n relatedListObjects = {};\n relatedListNames = [];\n objectLayoutRelatedListObjects = [];\n _object = Creator.getObject(object_name);\n if (_object) {\n layoutRelatedList = _object.related_lists;\n if (_.isArray(layoutRelatedList)) {\n _.each(layoutRelatedList, function(item) {\n var reFieldName, reObjectName, ref, ref1, related, write_requires_master_read;\n reObjectName = item.related_field_fullname.split('.')[0];\n reFieldName = item.related_field_fullname.split('.')[1];\n write_requires_master_read = (ref = Creator.getObject(reObjectName)) != null ? (ref1 = ref.fields[reFieldName]) != null ? ref1.write_requires_master_read : void 0 : void 0;\n related = {\n object_name: reObjectName,\n columns: item.field_names,\n mobile_columns: item.field_names,\n is_file: reObjectName === \"cms_files\",\n filtersFunction: item.filters,\n sort: item.sort,\n related_field_name: reFieldName,\n customRelatedListObject: true,\n write_requires_master_read: write_requires_master_read,\n label: item.label,\n actions: item.buttons,\n visible_on: item.visible_on,\n page_size: item.page_size\n };\n return objectLayoutRelatedListObjects.push(related);\n });\n return objectLayoutRelatedListObjects;\n }\n relatedList = _object.relatedList;\n if (!_.isEmpty(relatedList)) {\n _.each(relatedList, function(objOrName) {\n var related;\n if (_.isObject(objOrName)) {\n related = {\n object_name: objOrName.objectName,\n columns: objOrName.columns,\n mobile_columns: objOrName.mobile_columns,\n is_file: objOrName.objectName === \"cms_files\",\n filtersFunction: objOrName.filters,\n sort: objOrName.sort,\n related_field_name: '',\n customRelatedListObject: true,\n label: objOrName.label,\n actions: objOrName.actions,\n page_size: objOrName.page_size\n };\n relatedListObjects[objOrName.objectName] = related;\n return relatedListNames.push(objOrName.objectName);\n } else if (_.isString(objOrName)) {\n return relatedListNames.push(objOrName);\n }\n });\n }\n }\n mapList = {};\n related_objects = Creator.getRelatedObjects(object_name);\n _.each(related_objects, function(related_object_item) {\n var columns, mobile_columns, order, related, relatedObject, related_field_name, related_object, related_object_name, tabular_order, write_requires_master_read;\n if (!(related_object_item != null ? related_object_item.object_name : void 0)) {\n return;\n }\n related_object_name = related_object_item.object_name;\n related_field_name = related_object_item.foreign_key;\n write_requires_master_read = related_object_item.write_requires_master_read;\n related_object = Creator.getObject(related_object_name);\n if (!related_object) {\n return;\n }\n columns = Creator.getObjectFirstListViewColumns(related_object_name) || [\"name\"];\n columns = _.without(columns, related_field_name);\n mobile_columns = Creator.getObjectFirstListViewColumns(related_object_name, true) || [\"name\"];\n mobile_columns = _.without(mobile_columns, related_field_name);\n order = Creator.getObjectDefaultSort(related_object_name);\n tabular_order = Creator.transformSortToTabular(order, columns);\n if (/\\w+\\.\\$\\.\\w+/g.test(related_field_name)) {\n related_field_name = related_field_name.replace(/\\$\\./, \"\");\n }\n related = {\n object_name: related_object_name,\n columns: columns,\n mobile_columns: mobile_columns,\n related_field_name: related_field_name,\n is_file: related_object_name === \"cms_files\",\n write_requires_master_read: write_requires_master_read\n };\n relatedObject = relatedListObjects[related_object_name];\n if (relatedObject) {\n if (relatedObject.columns) {\n related.columns = relatedObject.columns;\n }\n if (relatedObject.mobile_columns) {\n related.mobile_columns = relatedObject.mobile_columns;\n }\n if (relatedObject.sort) {\n related.sort = relatedObject.sort;\n }\n if (relatedObject.filtersFunction) {\n related.filtersFunction = relatedObject.filtersFunction;\n }\n if (relatedObject.customRelatedListObject) {\n related.customRelatedListObject = relatedObject.customRelatedListObject;\n }\n if (relatedObject.label) {\n related.label = relatedObject.label;\n }\n if (relatedObject.page_size) {\n related.page_size = relatedObject.page_size;\n }\n delete relatedListObjects[related_object_name];\n }\n return mapList[related.object_name] = related;\n });\n spaceId = Session.get(\"spaceId\");\n userId = Meteor.userId();\n related_object_names = _.pluck(_.values(relatedListObjects), \"object_name\");\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n unrelated_objects = permissions.unrelated_objects;\n related_object_names = _.difference(related_object_names, unrelated_objects);\n _.each(relatedListObjects, function(v, related_object_name) {\n var allowRead, isActive, ref;\n isActive = related_object_names.indexOf(related_object_name) > -1;\n allowRead = (ref = Creator.getPermissions(related_object_name, spaceId, userId)) != null ? ref.allowRead : void 0;\n if (isActive && allowRead) {\n return mapList[related_object_name] = v;\n }\n });\n list = [];\n if (_.isEmpty(relatedListNames)) {\n list = _.values(mapList);\n } else {\n _.each(relatedListNames, function(objectName) {\n if (mapList[objectName]) {\n return list.push(mapList[objectName]);\n }\n });\n }\n if (_.has(_object, 'allow_relatedList')) {\n list = _.filter(list, function(item) {\n return _.include(_object.allow_relatedList, item.object_name);\n });\n }\n return list;\n };\n}\n\nCreator.getObjectFirstListView = function(object_name) {\n return _.first(Creator.getListViews(object_name));\n};\n\n\n/* \n\t取出list_view_id对应的视图,如果不存在或者没有权限,就返回第一个视图\n\texac为true时,需要强制按list_view_id精确查找,不默认返回第一个视图\n */\n\nCreator.getListView = function(object_name, list_view_id, exac) {\n var listViews, list_view, object;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n }\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n listViews = Creator.getListViews(object_name);\n if (!(listViews != null ? listViews.length : void 0)) {\n return;\n }\n list_view = _.find(listViews, function(item) {\n return item._id === list_view_id || item.name === list_view_id;\n });\n if (!list_view) {\n if (exac) {\n return;\n } else {\n list_view = listViews[0];\n }\n }\n return list_view;\n};\n\nCreator.getListViewIsRecent = function(object_name, list_view_id) {\n var listView, object;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n }\n if (typeof list_view_id === \"string\") {\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n listView = _.findWhere(object.list_views, {\n _id: list_view_id\n });\n } else {\n listView = list_view_id;\n }\n return (listView != null ? listView.name : void 0) === \"recent\";\n};\n\n\n/*\n 从columns参数中过滤出用于手机端显示的columns\n\t规则:\n\t1.优先把columns中的name字段排在第一个\n\t2.最多只返回4个字段\n\t3.考虑宽字段占用整行规则条件下,最多只返回两行\n */\n\nCreator.pickObjectMobileColumns = function(object_name, columns) {\n var count, field, fields, getField, isNameColumn, itemCount, maxCount, maxRows, nameColumn, nameKey, object, result;\n result = [];\n maxRows = 2;\n maxCount = maxRows * 2;\n count = 0;\n object = Creator.getObject(object_name);\n fields = object.fields;\n if (!object) {\n return columns;\n }\n nameKey = object.NAME_FIELD_KEY;\n isNameColumn = function(item) {\n if (_.isObject(item)) {\n return item.field === nameKey;\n } else {\n return item === nameKey;\n }\n };\n getField = function(item) {\n if (_.isObject(item)) {\n return fields[item.field];\n } else {\n return fields[item];\n }\n };\n if (nameKey) {\n nameColumn = columns.find(function(item) {\n return isNameColumn(item);\n });\n }\n if (nameColumn) {\n field = getField(nameColumn);\n itemCount = field.is_wide ? 2 : 1;\n count += itemCount;\n result.push(nameColumn);\n }\n columns.forEach(function(item) {\n field = getField(item);\n if (!field) {\n return;\n }\n itemCount = field.is_wide ? 2 : 1;\n if (count < maxCount && result.length < maxCount && !isNameColumn(item)) {\n count += itemCount;\n if (count <= maxCount) {\n return result.push(item);\n }\n }\n });\n return result;\n};\n\n\n/*\n 获取默认视图\n */\n\nCreator.getObjectDefaultView = function(object_name) {\n var defaultView, object, ref;\n object = Creator.getObject(object_name);\n if (!object) {\n object = Creator.Objects[object_name];\n }\n if (object != null ? (ref = object.list_views) != null ? ref[\"default\"] : void 0 : void 0) {\n defaultView = object.list_views[\"default\"];\n } else {\n _.each(object != null ? object.list_views : void 0, function(list_view, key) {\n if (list_view.name === \"all\" || key === \"all\") {\n return defaultView = list_view;\n }\n });\n }\n return defaultView;\n};\n\n\n/*\n 获取对象的列表默认显示字段\n */\n\nCreator.getObjectDefaultColumns = function(object_name, use_mobile_columns) {\n var columns, defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n columns = defaultView != null ? defaultView.columns : void 0;\n if (use_mobile_columns) {\n if (defaultView != null ? defaultView.mobile_columns : void 0) {\n columns = defaultView.mobile_columns;\n } else if (columns) {\n columns = Creator.pickObjectMobileColumns(object_name, columns);\n }\n }\n return columns;\n};\n\n\n/*\n 获取对象的列表第一个视图显示的字段\n */\n\nCreator.getObjectFirstListViewColumns = function(object_name, use_mobile_columns) {\n var columns, defaultView;\n defaultView = Creator.getObjectFirstListView(object_name);\n columns = defaultView != null ? defaultView.columns : void 0;\n if (use_mobile_columns) {\n if (defaultView != null ? defaultView.mobile_columns : void 0) {\n columns = defaultView.mobile_columns;\n } else if (columns) {\n columns = Creator.pickObjectMobileColumns(object_name, columns);\n }\n }\n return columns;\n};\n\n\n/*\n\t获取对象的列表默认额外加载的字段\n */\n\nCreator.getObjectDefaultExtraColumns = function(object_name) {\n var defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n return defaultView != null ? defaultView.extra_columns : void 0;\n};\n\n\n/*\n\t获取对象的默认排序\n */\n\nCreator.getObjectDefaultSort = function(object_name) {\n var defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n if (defaultView) {\n if (defaultView.sort) {\n return defaultView.sort;\n } else {\n return [[\"created\", \"desc\"]];\n }\n }\n};\n\n\n/*\n 判断是否All view\n */\n\nCreator.isAllView = function(list_view) {\n return (list_view != null ? list_view.name : void 0) === \"all\";\n};\n\n\n/*\n 判断是否最近查看 view\n */\n\nCreator.isRecentView = function(list_view) {\n return (list_view != null ? list_view.name : void 0) === \"recent\";\n};\n\n\n/*\n 将sort转换为Tabular控件所需要的格式\n */\n\nCreator.transformSortToTabular = function(sort, tabularColumns) {\n var tabular_sort;\n tabular_sort = [];\n _.each(sort, function(item) {\n var column_index, field_name, order;\n if (_.isArray(item)) {\n if (item.length === 1) {\n column_index = tabularColumns.indexOf(item[0]);\n if (column_index > -1) {\n return tabular_sort.push([column_index, \"asc\"]);\n }\n } else if (item.length === 2) {\n column_index = tabularColumns.indexOf(item[0]);\n if (column_index > -1) {\n return tabular_sort.push([column_index, item[1]]);\n }\n }\n } else if (_.isObject(item)) {\n field_name = item.field_name;\n order = item.order;\n if (field_name && order) {\n column_index = tabularColumns.indexOf(field_name);\n if (column_index > -1) {\n return tabular_sort.push([column_index, order]);\n }\n }\n }\n });\n return tabular_sort;\n};\n\n\n/*\n 将sort转换为DevExpress控件所需要的格式\n */\n\nCreator.transformSortToDX = function(sort) {\n var dx_sort;\n dx_sort = [];\n _.each(sort, function(item) {\n var field_name, order;\n if (_.isArray(item)) {\n return dx_sort.push(item);\n } else if (_.isObject(item)) {\n field_name = item.field_name;\n order = item.order;\n if (field_name && order) {\n return dx_sort.push([field_name, order]);\n }\n }\n });\n return dx_sort;\n};\n","SimpleSchema.RegEx.code = new RegExp('^[a-zA-Z_][a-zA-Z0-9_]*$')\n\nif Meteor.isClient\n\tMeteor.startup ()->\n\t\t_regExMessages = SimpleSchema._globalMessages.regEx || []\n\t\t_regExMessages.push {exp: SimpleSchema.RegEx.code, msg: \"[label] 只能以字母、_开头,且只能包含字母、数字、_\"}\n\t\tSimpleSchema.messages({\n\t\t\tregEx: _regExMessages,\n\t\t})","SimpleSchema.RegEx.code = new RegExp('^[a-zA-Z_][a-zA-Z0-9_]*$');\n\nif (Meteor.isClient) {\n Meteor.startup(function() {\n var _regExMessages;\n _regExMessages = SimpleSchema._globalMessages.regEx || [];\n _regExMessages.push({\n exp: SimpleSchema.RegEx.code,\n msg: \"[label] 只能以字母、_开头,且只能包含字母、数字、_\"\n });\n return SimpleSchema.messages({\n regEx: _regExMessages\n });\n });\n}\n","SimpleSchema.RegEx.field = new RegExp('^[a-zA-Z_]\\\\w*(\\\\.\\\\$\\\\.\\\\w+)?[a-zA-Z0-9]*$')\n\nif Meteor.isClient\n\tMeteor.startup ()->\n\t\t_regExMessages = SimpleSchema._globalMessages.regEx || []\n\t\t_regExMessages.push {exp: SimpleSchema.RegEx.field, msg: \"[label] 只能以字母、_开头,.$.前后必须包含字符\"}\n\t\tSimpleSchema.messages({\n\t\t\tregEx: _regExMessages,\n\t\t})","SimpleSchema.RegEx.field = new RegExp('^[a-zA-Z_]\\\\w*(\\\\.\\\\$\\\\.\\\\w+)?[a-zA-Z0-9]*$');\n\nif (Meteor.isClient) {\n Meteor.startup(function() {\n var _regExMessages;\n _regExMessages = SimpleSchema._globalMessages.regEx || [];\n _regExMessages.push({\n exp: SimpleSchema.RegEx.field,\n msg: \"[label] 只能以字母、_开头,.$.前后必须包含字符\"\n });\n return SimpleSchema.messages({\n regEx: _regExMessages\n });\n });\n}\n","// 因为meteor编译coffeescript会导致eval函数报错,所以单独写在一个js文件中。\nCreator.evalInContext = function(js, context) {\n //# Return the results of the in-line anonymous function we .call with the passed context\n return function() { \n \treturn eval(js); \n\t}.call(context);\n}\n\n\nCreator.eval = function(js){\n\ttry{\n\t\treturn eval(js)\n\t}catch (e){\n\t\tconsole.error(e, js);\n\t}\n};","\tgetOption = (option)->\n\t\tfoo = option.split(\":\")\n\t\tif foo.length > 2\n\t\t\treturn {label: foo[0], value: foo[1], color: foo[2]}\n\t\telse if foo.length > 1\n\t\t\treturn {label: foo[0], value: foo[1]}\n\t\telse\n\t\t\treturn {label: foo[0], value: foo[0]}\n\n\tconvertField = (object_name, field_name, field, spaceId)->\n\t\tif Meteor.isServer && spaceId && field.type == 'select'\n\t\t\tcode = field.picklist || \"#{object_name}.#{field_name}\";\n\t\t\tif code\n\t\t\t\tpicklist = Creator.getPicklist(code, spaceId);\n\t\t\t\tif picklist\n\t\t\t\t\toptions = [];\n\t\t\t\t\tallOptions = [];\n\t\t\t\t\tpicklistOptions = Creator.getPickListOptions(picklist)\n\t\t\t\t\tpicklistOptions = _.sortBy(picklistOptions, 'sort_no')?.reverse();\n\t\t\t\t\t_.each picklistOptions, (item)->\n\t\t\t\t\t\tlabel = item.name\n\t\t\t\t\t\tvalue = item.value || item.name\n\t\t\t\t\t\tallOptions.push({label: label, value: value, enable: item.enable, color: item.color})\n\t\t\t\t\t\tif item.enable\n\t\t\t\t\t\t\toptions.push({label: label, value: value, color: item.color})\n\t\t\t\t\t\tif item.default\n\t\t\t\t\t\t\tfield.defaultValue = value\n\t\t\t\t\tif options.length > 0\n\t\t\t\t\t\tfield.options = options\n\t\t\t\t\tif allOptions.length > 0\n\t\t\t\t\t\tfield.allOptions = allOptions\n\t\treturn field;\n\n\tCreator.convertObject = (object, spaceId)->\n\t\tif !object\n\t\t\treturn\n\t\t_.forEach object.triggers, (trigger, key)->\n\n\t\t\tif (Meteor.isServer && trigger.on == \"server\") || (Meteor.isClient && trigger.on == \"client\")\n\t\t\t\t_todo_from_code = trigger?._todo\n\t\t\t\t_todo_from_db = trigger.todo\n\t\t\t\tif _todo_from_code && _.isString(_todo_from_code)\n\t\t\t\t\ttrigger.todo = Creator.eval(\"(#{_todo_from_code})\")\n\n\t\t\t\tif _todo_from_db && _.isString(_todo_from_db)\n\t\t\t\t\t#只有update时, fieldNames, modifier, options 才有值\n\t\t\t\t\t#TODO 控制可使用的变量,尤其是Collection\n\t\t\t\t\tif _todo_from_db.startsWith(\"function\")\n\t\t\t\t\t\ttrigger.todo = Creator.eval(\"(#{_todo_from_db})\")\n\t\t\t\t\telse\n\t\t\t\t\t\ttrigger.todo = Creator.eval(\"(function(userId, doc, fieldNames, modifier, options){#{_todo_from_db}})\")\n\n\t\t\tif Meteor.isServer && trigger.on == \"client\"\n\t\t\t\t_todo = trigger.todo\n\t\t\t\tif _todo && _.isFunction(_todo)\n\t\t\t\t\ttrigger._todo = _todo.toString()\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.fields, (field, key)->\n\n\t\t\t\tif field.omit\n\t\t\t\t\t# omit字段完全隐藏不显示\n\t\t\t\t\tfield.hidden = true\n\n\t\t\t\tif field.required && field.readonly\n\t\t\t\t\t# 通用必填字段 #2952,必填字段设置为非只读\n\t\t\t\t\tfield.readonly = false\n\n\t\t\t\tsystemBaseFields = Creator.getSystemBaseFields()\n\t\t\t\tif systemBaseFields.indexOf(key) > -1\n\t\t\t\t\t# 强制创建人创建时间等字段为只读\n\t\t\t\t\tfield.readonly = true\n\n\t\t\t_.forEach object.actions, (action, key)->\n\t\t\t\t_todo_from_code = action?._todo\n\t\t\t\t_todo_from_db = action?.todo\n\t\t\t\tif _todo_from_code && _.isString(_todo_from_code)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\ttry\n\t\t\t\t\t\taction.todo = Creator.eval(\"(#{_todo_from_code})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"todo_from_code\", _todo_from_code\n\t\t\t\tif _todo_from_db && _.isString(_todo_from_db)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\ttry\n\t\t\t\t\t\tif _todo_from_db.startsWith(\"function\")\n\t\t\t\t\t\t\taction.todo = Creator.eval(\"(#{_todo_from_db})\")\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isFunction(Creator.actionsByName[_todo_from_db])\n\t\t\t\t\t\t\t\taction.todo = _todo_from_db\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\taction.todo = Creator.eval(\"(function(){#{_todo_from_db}})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"todo_from_db\", _todo_from_db, error\n\n\t\t\t\t_visible = action?._visible\n\t\t\t\tif _visible\n\t\t\t\t\ttry\n\t\t\t\t\t\tif _.isString(_visible)\n\t\t\t\t\t\t\t_visible = _visible.trim()\n\t\t\t\t\t\tif Steedos.isExpression(_visible)\n\t\t\t\t\t\t\t# 支持页面布局中写visible_on函数表达式,页面布局按钮的显示条件不生效 #3340\n\t\t\t\t\t\t\taction.visible = (object_name, record_id, record_permissions, record) ->\n\t\t\t\t\t\t\t\tglobalData = Object.assign({}, Creator.USER_CONTEXT, {now: new Date()})\n\t\t\t\t\t\t\t\treturn Steedos.parseSingleExpression(_visible, record, \"#\", globalData)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\taction.visible = Creator.eval(\"(#{_visible})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"action.visible to function error: \", error, _visible\n\t\telse\n\t\t\t_.forEach object.actions, (action, key)->\n\t\t\t\t_todo = action?.todo\n\t\t\t\tif _todo && _.isFunction(_todo)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\taction._todo = _todo.toString()\n\n\t\t\t\t_visible = action?.visible\n\n\t\t\t\tif _visible && _.isFunction(_visible)\n\t\t\t\t\taction._visible = _visible.toString()\n\n\t\t_.forEach object.fields, (field, key)->\n\n\t\t\tfield = convertField(object.name, key, field, spaceId);\n\n\t\t\tif field.options && _.isString(field.options)\n\t\t\t\ttry\n\t\t\t\t\t_options = []\n\t\t\t\t\t#支持\\n或者英文逗号分割,\n\t\t\t\t\t_.forEach field.options.split(\"\\n\"), (option)->\n\t\t\t\t\t\tif option.indexOf(\",\")\n\t\t\t\t\t\t\toptions = option.split(\",\")\n\t\t\t\t\t\t\t_.forEach options, (_option)->\n\t\t\t\t\t\t\t\t_options.push(getOption(_option))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_options.push(getOption(option))\n\t\t\t\t\tfield.options = _options\n\t\t\t\tcatch error\n\t\t\t\t\tconsole.error \"Creator.convertFieldsOptions\", field.options, error\n\n\t\t\telse if field.options && _.isArray(field.options)\n\t\t\t\ttry\n\t\t\t\t\t_options = []\n\t\t\t\t\t#支持数组中直接定义每个选项的简版格式字符串\n\t\t\t\t\t_.forEach field.options, (option)->\n\t\t\t\t\t\tif _.isString(option)\n\t\t\t\t\t\t\t_options.push(getOption(option))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_options.push(option)\n\t\t\t\t\tfield.options = _options\n\t\t\t\tcatch error\n\t\t\t\t\tconsole.error \"Creator.convertFieldsOptions\", field.options, error\n\n\t\t\telse if field.options && !_.isFunction(field.options) && !_.isArray(field.options) && _.isObject(field.options)\n\t\t\t\t_options = []\n\t\t\t\t_.each field.options, (v, k)->\n\t\t\t\t\t_options.push {label: v, value: k}\n\t\t\t\tfield.options = _options\n\n\t\t\tif Meteor.isServer\n\t\t\t\toptions = field.options\n\t\t\t\tif options && _.isFunction(options)\n\t\t\t\t\tfield._options = field.options.toString()\n\t\t\telse\n\t\t\t\toptions = field._options\n\t\t\t\tif options && _.isString(options)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.options = Creator.eval(\"(#{options})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tregEx = field.regEx\n\t\t\t\tif regEx\n\t\t\t\t\tfield._regEx = field.regEx.toString()\n\t\t\telse\n\t\t\t\tregEx = field._regEx\n\t\t\t\tif regEx\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.regEx = Creator.eval(\"(#{regEx})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tmin = field.min\n\t\t\t\tif _.isFunction(min)\n\t\t\t\t\tfield._min = min.toString()\n\t\t\telse\n\t\t\t\tmin = field._min\n\t\t\t\tif _.isString(min)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.min = Creator.eval(\"(#{min})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tmax = field.max\n\t\t\t\tif _.isFunction(max)\n\t\t\t\t\tfield._max = max.toString()\n\t\t\telse\n\t\t\t\tmax = field._max\n\t\t\t\tif _.isString(max)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.max = Creator.eval(\"(#{max})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tif field.autoform\n\t\t\t\t\t_type = field.autoform.type\n\t\t\t\t\tif _type && _.isFunction(_type) && _type != Object && _type != String && _type != Number && _type != Boolean && !_.isArray(_type)\n\t\t\t\t\t\tfield.autoform._type = _type.toString()\n\t\t\telse\n\t\t\t\tif field.autoform\n\t\t\t\t\t_type = field.autoform._type\n\t\t\t\t\tif _type && _.isString(_type)\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t\tfield.autoform.type = Creator.eval(\"(#{_type})\")\n\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\tconsole.error \"convert field -> type error\", field, error\n\n\t\t\tif Meteor.isServer\n\n\t\t\t\toptionsFunction = field.optionsFunction\n\t\t\t\treference_to = field.reference_to\n\t\t\t\tcreateFunction = field.createFunction\n\t\t\t\tbeforeOpenFunction = field.beforeOpenFunction\n\t\t\t\tfiltersFunction = field.filtersFunction\n\n\t\t\t\tif optionsFunction && _.isFunction(optionsFunction)\n\t\t\t\t\tfield._optionsFunction = optionsFunction.toString()\n\n\t\t\t\tif reference_to && _.isFunction(reference_to)\n\t\t\t\t\tfield._reference_to = reference_to.toString()\n\n\t\t\t\tif createFunction && _.isFunction(createFunction)\n\t\t\t\t\tfield._createFunction = createFunction.toString()\n\t\t\t\tif beforeOpenFunction && _.isFunction(beforeOpenFunction)\n\t\t\t\t\tfield._beforeOpenFunction = beforeOpenFunction.toString()\n\n\t\t\t\tif filtersFunction && _.isFunction(filtersFunction)\n\t\t\t\t\tfield._filtersFunction = filtersFunction.toString()\n\t\t\telse\n\n\t\t\t\toptionsFunction = field._optionsFunction || field.optionsFunction\n\t\t\t\treference_to = field._reference_to\n\t\t\t\tcreateFunction = field._createFunction\n\t\t\t\tbeforeOpenFunction = field._beforeOpenFunction\n\t\t\t\tfiltersFunction = field._filtersFunction || field.filtersFunction\n\n\t\t\t\tif optionsFunction && _.isString(optionsFunction)\n\t\t\t\t\tfield.optionsFunction = Creator.eval(\"(#{optionsFunction})\")\n\n\t\t\t\tif reference_to && _.isString(reference_to)\n\t\t\t\t\tfield.reference_to = Creator.eval(\"(#{reference_to})\")\n\n\t\t\t\tif createFunction && _.isString(createFunction)\n\t\t\t\t\tfield.createFunction = Creator.eval(\"(#{createFunction})\")\n\n\t\t\t\tif beforeOpenFunction && _.isString(beforeOpenFunction)\n\t\t\t\t\tfield.beforeOpenFunction = Creator.eval(\"(#{beforeOpenFunction})\")\n\n\t\t\t\tif filtersFunction && _.isString(filtersFunction)\n\t\t\t\t\tfield.filtersFunction = Creator.eval(\"(#{filtersFunction})\")\n\n\t\t\tif Meteor.isServer\n\t\t\t\tdefaultValue = field.defaultValue\n\t\t\t\tif defaultValue && _.isFunction(defaultValue)\n\t\t\t\t\tfield._defaultValue = field.defaultValue.toString()\n\t\t\telse\n\t\t\t\tdefaultValue = field._defaultValue\n\n\t\t\t\tif !defaultValue && _.isString(field.defaultValue) && field.defaultValue.startsWith(\"function\")\n\t\t\t\t\tdefaultValue = field.defaultValue\n\n\t\t\t\tif defaultValue && _.isString(defaultValue)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.defaultValue = Creator.eval(\"(#{defaultValue})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\t\t\t\n\t\t\tif Meteor.isServer\n\t\t\t\tis_company_limited = field.is_company_limited\n\t\t\t\tif is_company_limited && _.isFunction(is_company_limited)\n\t\t\t\t\tfield._is_company_limited = field.is_company_limited.toString()\n\t\t\telse\n\t\t\t\tis_company_limited = field._is_company_limited\n\t\t\t\tif is_company_limited && _.isString(is_company_limited)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.is_company_limited = Creator.eval(\"(#{is_company_limited})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t_.forEach object.list_views, (list_view, key) ->\n\t\t\t###\n\t\t\t视图过虑器需要支持function,后台转成字符串,前台eval成函数\n\t\t\t让过虑器支持两种function方式:\n\t\t\t1. 整个filters为function:\n\t\t\t如:\n\t\t\tfilters: ()->\n\t\t\t\treturn [[[\"object_name\",\"=\",\"project_issues\"],'or',[\"object_name\",\"=\",\"tasks\"]]]\n\t\t\t2. filters内的filter.value为function\n\t\t\t如:\n\t\t\tfilters: [[\"object_name\", \"=\", ()->\n\t\t\t\treturn \"project_issues\"\n\t\t\t]]\n\t\t\t或\n\t\t\tfilters: [{\n\t\t\t\t\"field\": \"object_name\"\n\t\t\t\t\"operation\": \"=\"\n\t\t\t\t\"value\": ()->\n\t\t\t\t\treturn \"project_issues\"\n\t\t\t}]\n\t\t\t###\n\t\t\tif _.isFunction(list_view.filters)\n\t\t\t\tif Meteor.isServer\n\t\t\t\t\tlist_view._filters = list_view.filters.toString()\n\t\t\telse if _.isString(list_view._filters)\n\t\t\t\tif Meteor.isClient\n\t\t\t\t\tlist_view.filters = Creator.eval(\"(#{list_view._filters})\")\n\t\t\telse\n\t\t\t\t_.forEach list_view.filters, (filter, _index)->\n\t\t\t\t\tif _.isArray(filter)\n\t\t\t\t\t\tif Meteor.isServer\n\t\t\t\t\t\t\tif filter.length == 3 and _.isFunction(filter[2])\n\t\t\t\t\t\t\t\tfilter[2] = filter[2].toString()\n\t\t\t\t\t\t\t\tfilter[3] = \"FUNCTION\"\n\t\t\t\t\t\t\telse if filter.length == 3 and _.isDate(filter[2])\n\t\t\t\t\t\t\t\t# 如果是Date类型,则filter[2]值到前端会自动转成字符串,格式:\"2018-03-29T03:43:21.787Z\"\n\t\t\t\t\t\t\t\t# 包括grid列表请求的接口在内的所有OData接口,Date类型字段都会以上述格式返回\n\t\t\t\t\t\t\t\tfilter[3] = \"DATE\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif filter.length == 4 and _.isString(filter[2]) and filter[3] == \"FUNCTION\"\n\t\t\t\t\t\t\t\tfilter[2] = Creator.eval(\"(#{filter[2]})\")\n\t\t\t\t\t\t\t\tfilter.pop()\n\t\t\t\t\t\t\tif filter.length == 4 and _.isString(filter[2]) and filter[3] == \"DATE\"\n\t\t\t\t\t\t\t\tfilter[2] = new Date(filter[2])\n\t\t\t\t\t\t\t\tfilter.pop()\n\t\t\t\t\telse if _.isObject(filter)\n\t\t\t\t\t\tif Meteor.isServer\n\t\t\t\t\t\t\tif _.isFunction(filter?.value)\n\t\t\t\t\t\t\t\tfilter._value = filter.value.toString()\n\t\t\t\t\t\t\telse if _.isDate(filter?.value)\n\t\t\t\t\t\t\t\tfilter._is_date = true\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isString(filter?._value)\n\t\t\t\t\t\t\t\tfilter.value = Creator.eval(\"(#{filter._value})\")\n\t\t\t\t\t\t\telse if filter._is_date == true\n\t\t\t\t\t\t\t\tfilter.value = new Date(filter.value)\n\n\t\tif Meteor.isServer\n\t\t\tif object.form && !_.isString(object.form)\n\t\t\t\tobject.form = JSON.stringify object.form, (key, val)->\n\t\t\t\t\tif _.isFunction(val)\n\t\t\t\t\t\treturn val + '';\n\t\t\t\t\telse\n\t\t\t\t\t\treturn val;\n\t\telse if Meteor.isClient\n\t\t\tif object.form\n\t\t\t\tobject.form = JSON.parse object.form, (key, val)->\n\t\t\t\t\tif _.isString(val) && val.startsWith('function')\n\t\t\t\t\t\treturn Creator.eval(\"(#{val})\")\n\t\t\t\t\telse\n\t\t\t\t\t\treturn val;\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.related_lists, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isString(val)\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\trelatedObjInfo[key] = Creator.eval(\"(#{val})\")\n\t\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\t\tconsole.error \"filters_code\", val\n\t\telse\n\t\t\t_.forEach object.related_lists, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isFunction(val)\n\t\t\t\t\t\t\trelatedObjInfo[key] = val.toString()\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.relatedList, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isString(val)\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\trelatedObjInfo[key] = Creator.eval(\"(#{val})\")\n\t\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\t\tconsole.error \"filters_code\", val\n\t\telse\n\t\t\t_.forEach object.relatedList, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isFunction(val)\n\t\t\t\t\t\t\trelatedObjInfo[key] = val.toString()\n\n\t\treturn object\n\n\n","var convertField, getOption;\n\ngetOption = function(option) {\n var foo;\n foo = option.split(\":\");\n if (foo.length > 2) {\n return {\n label: foo[0],\n value: foo[1],\n color: foo[2]\n };\n } else if (foo.length > 1) {\n return {\n label: foo[0],\n value: foo[1]\n };\n } else {\n return {\n label: foo[0],\n value: foo[0]\n };\n }\n};\n\nconvertField = function(object_name, field_name, field, spaceId) {\n var allOptions, code, options, picklist, picklistOptions, ref;\n if (Meteor.isServer && spaceId && field.type === 'select') {\n code = field.picklist || (object_name + \".\" + field_name);\n if (code) {\n picklist = Creator.getPicklist(code, spaceId);\n if (picklist) {\n options = [];\n allOptions = [];\n picklistOptions = Creator.getPickListOptions(picklist);\n picklistOptions = (ref = _.sortBy(picklistOptions, 'sort_no')) != null ? ref.reverse() : void 0;\n _.each(picklistOptions, function(item) {\n var label, value;\n label = item.name;\n value = item.value || item.name;\n allOptions.push({\n label: label,\n value: value,\n enable: item.enable,\n color: item.color\n });\n if (item.enable) {\n options.push({\n label: label,\n value: value,\n color: item.color\n });\n }\n if (item[\"default\"]) {\n return field.defaultValue = value;\n }\n });\n if (options.length > 0) {\n field.options = options;\n }\n if (allOptions.length > 0) {\n field.allOptions = allOptions;\n }\n }\n }\n }\n return field;\n};\n\nCreator.convertObject = function(object, spaceId) {\n if (!object) {\n return;\n }\n _.forEach(object.triggers, function(trigger, key) {\n var _todo, _todo_from_code, _todo_from_db;\n if ((Meteor.isServer && trigger.on === \"server\") || (Meteor.isClient && trigger.on === \"client\")) {\n _todo_from_code = trigger != null ? trigger._todo : void 0;\n _todo_from_db = trigger.todo;\n if (_todo_from_code && _.isString(_todo_from_code)) {\n trigger.todo = Creator[\"eval\"](\"(\" + _todo_from_code + \")\");\n }\n if (_todo_from_db && _.isString(_todo_from_db)) {\n if (_todo_from_db.startsWith(\"function\")) {\n trigger.todo = Creator[\"eval\"](\"(\" + _todo_from_db + \")\");\n } else {\n trigger.todo = Creator[\"eval\"](\"(function(userId, doc, fieldNames, modifier, options){\" + _todo_from_db + \"})\");\n }\n }\n }\n if (Meteor.isServer && trigger.on === \"client\") {\n _todo = trigger.todo;\n if (_todo && _.isFunction(_todo)) {\n return trigger._todo = _todo.toString();\n }\n }\n });\n if (Meteor.isClient) {\n _.forEach(object.fields, function(field, key) {\n var systemBaseFields;\n if (field.omit) {\n field.hidden = true;\n }\n if (field.required && field.readonly) {\n field.readonly = false;\n }\n systemBaseFields = Creator.getSystemBaseFields();\n if (systemBaseFields.indexOf(key) > -1) {\n return field.readonly = true;\n }\n });\n _.forEach(object.actions, function(action, key) {\n var _todo_from_code, _todo_from_db, _visible, error;\n _todo_from_code = action != null ? action._todo : void 0;\n _todo_from_db = action != null ? action.todo : void 0;\n if (_todo_from_code && _.isString(_todo_from_code)) {\n try {\n action.todo = Creator[\"eval\"](\"(\" + _todo_from_code + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"todo_from_code\", _todo_from_code);\n }\n }\n if (_todo_from_db && _.isString(_todo_from_db)) {\n try {\n if (_todo_from_db.startsWith(\"function\")) {\n action.todo = Creator[\"eval\"](\"(\" + _todo_from_db + \")\");\n } else {\n if (_.isFunction(Creator.actionsByName[_todo_from_db])) {\n action.todo = _todo_from_db;\n } else {\n action.todo = Creator[\"eval\"](\"(function(){\" + _todo_from_db + \"})\");\n }\n }\n } catch (error1) {\n error = error1;\n console.error(\"todo_from_db\", _todo_from_db, error);\n }\n }\n _visible = action != null ? action._visible : void 0;\n if (_visible) {\n try {\n if (_.isString(_visible)) {\n _visible = _visible.trim();\n }\n if (Steedos.isExpression(_visible)) {\n return action.visible = function(object_name, record_id, record_permissions, record) {\n var globalData;\n globalData = Object.assign({}, Creator.USER_CONTEXT, {\n now: new Date()\n });\n return Steedos.parseSingleExpression(_visible, record, \"#\", globalData);\n };\n } else {\n return action.visible = Creator[\"eval\"](\"(\" + _visible + \")\");\n }\n } catch (error1) {\n error = error1;\n return console.error(\"action.visible to function error: \", error, _visible);\n }\n }\n });\n } else {\n _.forEach(object.actions, function(action, key) {\n var _todo, _visible;\n _todo = action != null ? action.todo : void 0;\n if (_todo && _.isFunction(_todo)) {\n action._todo = _todo.toString();\n }\n _visible = action != null ? action.visible : void 0;\n if (_visible && _.isFunction(_visible)) {\n return action._visible = _visible.toString();\n }\n });\n }\n _.forEach(object.fields, function(field, key) {\n var _options, _type, beforeOpenFunction, createFunction, defaultValue, error, filtersFunction, is_company_limited, max, min, options, optionsFunction, reference_to, regEx;\n field = convertField(object.name, key, field, spaceId);\n if (field.options && _.isString(field.options)) {\n try {\n _options = [];\n _.forEach(field.options.split(\"\\n\"), function(option) {\n var options;\n if (option.indexOf(\",\")) {\n options = option.split(\",\");\n return _.forEach(options, function(_option) {\n return _options.push(getOption(_option));\n });\n } else {\n return _options.push(getOption(option));\n }\n });\n field.options = _options;\n } catch (error1) {\n error = error1;\n console.error(\"Creator.convertFieldsOptions\", field.options, error);\n }\n } else if (field.options && _.isArray(field.options)) {\n try {\n _options = [];\n _.forEach(field.options, function(option) {\n if (_.isString(option)) {\n return _options.push(getOption(option));\n } else {\n return _options.push(option);\n }\n });\n field.options = _options;\n } catch (error1) {\n error = error1;\n console.error(\"Creator.convertFieldsOptions\", field.options, error);\n }\n } else if (field.options && !_.isFunction(field.options) && !_.isArray(field.options) && _.isObject(field.options)) {\n _options = [];\n _.each(field.options, function(v, k) {\n return _options.push({\n label: v,\n value: k\n });\n });\n field.options = _options;\n }\n if (Meteor.isServer) {\n options = field.options;\n if (options && _.isFunction(options)) {\n field._options = field.options.toString();\n }\n } else {\n options = field._options;\n if (options && _.isString(options)) {\n try {\n field.options = Creator[\"eval\"](\"(\" + options + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n regEx = field.regEx;\n if (regEx) {\n field._regEx = field.regEx.toString();\n }\n } else {\n regEx = field._regEx;\n if (regEx) {\n try {\n field.regEx = Creator[\"eval\"](\"(\" + regEx + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n min = field.min;\n if (_.isFunction(min)) {\n field._min = min.toString();\n }\n } else {\n min = field._min;\n if (_.isString(min)) {\n try {\n field.min = Creator[\"eval\"](\"(\" + min + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n max = field.max;\n if (_.isFunction(max)) {\n field._max = max.toString();\n }\n } else {\n max = field._max;\n if (_.isString(max)) {\n try {\n field.max = Creator[\"eval\"](\"(\" + max + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n if (field.autoform) {\n _type = field.autoform.type;\n if (_type && _.isFunction(_type) && _type !== Object && _type !== String && _type !== Number && _type !== Boolean && !_.isArray(_type)) {\n field.autoform._type = _type.toString();\n }\n }\n } else {\n if (field.autoform) {\n _type = field.autoform._type;\n if (_type && _.isString(_type)) {\n try {\n field.autoform.type = Creator[\"eval\"](\"(\" + _type + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert field -> type error\", field, error);\n }\n }\n }\n }\n if (Meteor.isServer) {\n optionsFunction = field.optionsFunction;\n reference_to = field.reference_to;\n createFunction = field.createFunction;\n beforeOpenFunction = field.beforeOpenFunction;\n filtersFunction = field.filtersFunction;\n if (optionsFunction && _.isFunction(optionsFunction)) {\n field._optionsFunction = optionsFunction.toString();\n }\n if (reference_to && _.isFunction(reference_to)) {\n field._reference_to = reference_to.toString();\n }\n if (createFunction && _.isFunction(createFunction)) {\n field._createFunction = createFunction.toString();\n }\n if (beforeOpenFunction && _.isFunction(beforeOpenFunction)) {\n field._beforeOpenFunction = beforeOpenFunction.toString();\n }\n if (filtersFunction && _.isFunction(filtersFunction)) {\n field._filtersFunction = filtersFunction.toString();\n }\n } else {\n optionsFunction = field._optionsFunction || field.optionsFunction;\n reference_to = field._reference_to;\n createFunction = field._createFunction;\n beforeOpenFunction = field._beforeOpenFunction;\n filtersFunction = field._filtersFunction || field.filtersFunction;\n if (optionsFunction && _.isString(optionsFunction)) {\n field.optionsFunction = Creator[\"eval\"](\"(\" + optionsFunction + \")\");\n }\n if (reference_to && _.isString(reference_to)) {\n field.reference_to = Creator[\"eval\"](\"(\" + reference_to + \")\");\n }\n if (createFunction && _.isString(createFunction)) {\n field.createFunction = Creator[\"eval\"](\"(\" + createFunction + \")\");\n }\n if (beforeOpenFunction && _.isString(beforeOpenFunction)) {\n field.beforeOpenFunction = Creator[\"eval\"](\"(\" + beforeOpenFunction + \")\");\n }\n if (filtersFunction && _.isString(filtersFunction)) {\n field.filtersFunction = Creator[\"eval\"](\"(\" + filtersFunction + \")\");\n }\n }\n if (Meteor.isServer) {\n defaultValue = field.defaultValue;\n if (defaultValue && _.isFunction(defaultValue)) {\n field._defaultValue = field.defaultValue.toString();\n }\n } else {\n defaultValue = field._defaultValue;\n if (!defaultValue && _.isString(field.defaultValue) && field.defaultValue.startsWith(\"function\")) {\n defaultValue = field.defaultValue;\n }\n if (defaultValue && _.isString(defaultValue)) {\n try {\n field.defaultValue = Creator[\"eval\"](\"(\" + defaultValue + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n is_company_limited = field.is_company_limited;\n if (is_company_limited && _.isFunction(is_company_limited)) {\n return field._is_company_limited = field.is_company_limited.toString();\n }\n } else {\n is_company_limited = field._is_company_limited;\n if (is_company_limited && _.isString(is_company_limited)) {\n try {\n return field.is_company_limited = Creator[\"eval\"](\"(\" + is_company_limited + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n });\n _.forEach(object.list_views, function(list_view, key) {\n\n /*\n \t\t\t视图过虑器需要支持function,后台转成字符串,前台eval成函数\n \t\t\t让过虑器支持两种function方式:\n \t\t\t1. 整个filters为function:\n \t\t\t如:\n \t\t\tfilters: ()->\n \t\t\t\treturn [[[\"object_name\",\"=\",\"project_issues\"],'or',[\"object_name\",\"=\",\"tasks\"]]]\n \t\t\t2. filters内的filter.value为function\n \t\t\t如:\n \t\t\tfilters: [[\"object_name\", \"=\", ()->\n \t\t\t\treturn \"project_issues\"\n \t\t\t]]\n \t\t\t或\n \t\t\tfilters: [{\n \t\t\t\t\"field\": \"object_name\"\n \t\t\t\t\"operation\": \"=\"\n \t\t\t\t\"value\": ()->\n \t\t\t\t\treturn \"project_issues\"\n \t\t\t}]\n */\n if (_.isFunction(list_view.filters)) {\n if (Meteor.isServer) {\n return list_view._filters = list_view.filters.toString();\n }\n } else if (_.isString(list_view._filters)) {\n if (Meteor.isClient) {\n return list_view.filters = Creator[\"eval\"](\"(\" + list_view._filters + \")\");\n }\n } else {\n return _.forEach(list_view.filters, function(filter, _index) {\n if (_.isArray(filter)) {\n if (Meteor.isServer) {\n if (filter.length === 3 && _.isFunction(filter[2])) {\n filter[2] = filter[2].toString();\n return filter[3] = \"FUNCTION\";\n } else if (filter.length === 3 && _.isDate(filter[2])) {\n return filter[3] = \"DATE\";\n }\n } else {\n if (filter.length === 4 && _.isString(filter[2]) && filter[3] === \"FUNCTION\") {\n filter[2] = Creator[\"eval\"](\"(\" + filter[2] + \")\");\n filter.pop();\n }\n if (filter.length === 4 && _.isString(filter[2]) && filter[3] === \"DATE\") {\n filter[2] = new Date(filter[2]);\n return filter.pop();\n }\n }\n } else if (_.isObject(filter)) {\n if (Meteor.isServer) {\n if (_.isFunction(filter != null ? filter.value : void 0)) {\n return filter._value = filter.value.toString();\n } else if (_.isDate(filter != null ? filter.value : void 0)) {\n return filter._is_date = true;\n }\n } else {\n if (_.isString(filter != null ? filter._value : void 0)) {\n return filter.value = Creator[\"eval\"](\"(\" + filter._value + \")\");\n } else if (filter._is_date === true) {\n return filter.value = new Date(filter.value);\n }\n }\n }\n });\n }\n });\n if (Meteor.isServer) {\n if (object.form && !_.isString(object.form)) {\n object.form = JSON.stringify(object.form, function(key, val) {\n if (_.isFunction(val)) {\n return val + '';\n } else {\n return val;\n }\n });\n }\n } else if (Meteor.isClient) {\n if (object.form) {\n object.form = JSON.parse(object.form, function(key, val) {\n if (_.isString(val) && val.startsWith('function')) {\n return Creator[\"eval\"](\"(\" + val + \")\");\n } else {\n return val;\n }\n });\n }\n }\n if (Meteor.isClient) {\n _.forEach(object.related_lists, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n var error;\n if (key === 'filters' && _.isString(val)) {\n try {\n return relatedObjInfo[key] = Creator[\"eval\"](\"(\" + val + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"filters_code\", val);\n }\n }\n });\n }\n });\n } else {\n _.forEach(object.related_lists, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n if (key === 'filters' && _.isFunction(val)) {\n return relatedObjInfo[key] = val.toString();\n }\n });\n }\n });\n }\n if (Meteor.isClient) {\n _.forEach(object.relatedList, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n var error;\n if (key === 'filters' && _.isString(val)) {\n try {\n return relatedObjInfo[key] = Creator[\"eval\"](\"(\" + val + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"filters_code\", val);\n }\n }\n });\n }\n });\n } else {\n _.forEach(object.relatedList, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n if (key === 'filters' && _.isFunction(val)) {\n return relatedObjInfo[key] = val.toString();\n }\n });\n }\n });\n }\n return object;\n};\n","Creator.Formular = {}\n\nCreator.Formular.PREFIX = \"_VALUES\"\n\nCreator.Formular._prependPrefixForFormula = (prefix,fieldVariable)->\n\treg = /(\\{[^{}]*\\})/g;\n\n\trev = fieldVariable.replace reg, (m, $1)->\n\t\treturn prefix + $1.replace(/\\{\\s*/,\"[\\\"\").replace(/\\s*\\}/,\"\\\"]\").replace(/\\s*\\.\\s*/g,\"\\\"][\\\"\");\n\n\treturn rev\n\nCreator.Formular.checkFormula = (formula_str)->\n\tif _.isString(formula_str) && formula_str.indexOf(\"{\") > -1 && formula_str.indexOf(\"}\") > -1\n\t\treturn true\n\treturn false\n\nCreator.Formular.run = (formula_str, _CONTEXT, options)->\n\tif formula_str && _.isString(formula_str)\n\n\t\tif !_.isBoolean(options?.extend)\n\t\t\textend = true\n\n\t\t_VALUES = {}\n\t\t_VALUES = _.extend(_VALUES, _CONTEXT)\n\t\tif extend\n\t\t\t_VALUES = _.extend(_VALUES, Creator.getUserContext(options?.userId, options?.spaceId))\n\t\tformula_str = Creator.Formular._prependPrefixForFormula(\"this\", formula_str)\n\n\t\ttry\n\t\t\tdata = Creator.evalInContext(formula_str, _VALUES) # 此处不能用window.eval ,会导致变量作用域异常\n\t\t\treturn data\n\t\tcatch e\n\t\t\tconsole.error(\"Creator.Formular.run: #{formula_str}\", e)\n\t\t\tif Meteor.isClient\n\t\t\t\ttoastr?.error(\"公式执行出错了,请检查公式配置是否正确!\")\n\t\t\tthrow new Meteor.Error 500, \"Creator.Formular.run: #{formula_str}#{e}\"\n\n\treturn formula_str\n","Creator.Formular = {};\n\nCreator.Formular.PREFIX = \"_VALUES\";\n\nCreator.Formular._prependPrefixForFormula = function(prefix, fieldVariable) {\n var reg, rev;\n reg = /(\\{[^{}]*\\})/g;\n rev = fieldVariable.replace(reg, function(m, $1) {\n return prefix + $1.replace(/\\{\\s*/, \"[\\\"\").replace(/\\s*\\}/, \"\\\"]\").replace(/\\s*\\.\\s*/g, \"\\\"][\\\"\");\n });\n return rev;\n};\n\nCreator.Formular.checkFormula = function(formula_str) {\n if (_.isString(formula_str) && formula_str.indexOf(\"{\") > -1 && formula_str.indexOf(\"}\") > -1) {\n return true;\n }\n return false;\n};\n\nCreator.Formular.run = function(formula_str, _CONTEXT, options) {\n var _VALUES, data, e, extend;\n if (formula_str && _.isString(formula_str)) {\n if (!_.isBoolean(options != null ? options.extend : void 0)) {\n extend = true;\n }\n _VALUES = {};\n _VALUES = _.extend(_VALUES, _CONTEXT);\n if (extend) {\n _VALUES = _.extend(_VALUES, Creator.getUserContext(options != null ? options.userId : void 0, options != null ? options.spaceId : void 0));\n }\n formula_str = Creator.Formular._prependPrefixForFormula(\"this\", formula_str);\n try {\n data = Creator.evalInContext(formula_str, _VALUES);\n return data;\n } catch (error) {\n e = error;\n console.error(\"Creator.Formular.run: \" + formula_str, e);\n if (Meteor.isClient) {\n if (typeof toastr !== \"undefined\" && toastr !== null) {\n toastr.error(\"公式执行出错了,请检查公式配置是否正确!\");\n }\n }\n throw new Meteor.Error(500, \"Creator.Formular.run: \" + formula_str + e);\n }\n }\n return formula_str;\n};\n","clone = require('clone');\nCreator.objectsByName = {} # 此对象只能在确保所有Object初始化完成后调用, 否则获取到的object不全\n\nCreator.formatObjectName = (object_name)->\n\tif object_name.startsWith('cfs.files.')\n\t\tobject_name = object_name.replace(new RegExp('\\\\.', 'g'), '_')\n\treturn object_name\n\nCreator.Object = (options)->\n\t_baseObject = Creator.baseObject\n\tif Meteor.isClient\n\t\t_baseObject = {actions: Creator.baseObject.actions , fields: {}, triggers: {}, permission_set: {}}\n\tself = this\n\tif (!options.name)\n\t\tconsole.error(options)\n\t\tthrow new Error('Creator.Object options must specify name');\n\n\tself._id = options._id || options.name\n\tself.space = options.space\n\tself.name = options.name\n\tself.label = options.label\n\tself.icon = options.icon\n\tself.description = options.description\n\tself.is_view = options.is_view\n\tself.form = options.form\n\tself.relatedList = options.relatedList\n\tself.related_lists = options.related_lists\n\tself.hasImportTemplates = options.hasImportTemplates\n\tself.version = options.version || 1.0\n\tif !_.isBoolean(options.is_enable) || options.is_enable == true\n\t\tself.is_enable = true\n\telse\n\t\tself.is_enable = false\n\tif Meteor.isClient\n\t\tif _.has(options, 'allow_customActions')\n\t\t\tself.allow_customActions = options.allow_customActions\n\t\tif _.has(options, 'exclude_actions')\n\t\t\tself.exclude_actions = options.exclude_actions\n\t\tif _.has(options, 'allow_relatedList')\n\t\t\tself.allow_relatedList = options.allow_relatedList\n\tself.enable_search = options.enable_search\n\tself.enable_files = options.enable_files\n\tself.enable_tasks = options.enable_tasks\n\tself.enable_notes = options.enable_notes\n\tself.enable_audit = options.enable_audit\n\tself.enable_events = options.enable_events\n\tif options.paging\n\t\tself.paging = options.paging\n\tself.hidden = options.hidden\n\tself.enable_api = (options.enable_api == undefined) or options.enable_api\n\tself.custom = options.custom\n\tself.enable_share = options.enable_share\n\tself.enable_instances = options.enable_instances\n\tself.enable_process = options.enable_process\n\tif Meteor.isClient\n\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\"))\n\t\t\tself.enable_tree = false\n\t\telse\n\t\t\tself.enable_tree = options.enable_tree\n\t\t\tself.sidebar = _.clone(options.sidebar)\n\telse\n\t\tself.sidebar = _.clone(options.sidebar)\n\t\tself.enable_tree = options.enable_tree\n\tself.open_window = options.open_window\n\tself.filter_company = options.filter_company\n\tself.calendar = _.clone(options.calendar)\n\tself.enable_chatter = options.enable_chatter\n\tself.enable_trash = options.enable_trash\n\tself.enable_space_global = options.enable_space_global\n\tself.enable_approvals = options.enable_approvals\n\tself.enable_follow = options.enable_follow\n\tself.enable_workflow = options.enable_workflow\n\tself.enable_inline_edit = options.enable_inline_edit\n\tself.details = options.details\n\tself.masters = options.masters\n\tself.lookup_details = options.lookup_details\n\tif _.has(options, 'in_development')\n\t\tself.in_development = options.in_development\n\tself.idFieldName = '_id'\n\tif options.database_name\n\t\tself.database_name = options.database_name\n\tif (!options.fields)\n\t\tconsole.error(options)\n\t\tthrow new Error('Creator.Object options must specify fields');\n\n\tself.fields = clone(options.fields)\n\n\t_.each self.fields, (field, field_name)->\n\t\tif field.is_name\n\t\t\tself.NAME_FIELD_KEY = field_name\n\t\telse if field_name == 'name' && !self.NAME_FIELD_KEY\n\t\t\tself.NAME_FIELD_KEY = field_name\n\t\tif field.primary\n\t\t\tself.idFieldName = field_name\n\t\tif Meteor.isClient\n\t\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\"))\n\t\t\t\tif field_name == 'space'\n\t\t\t\t\tfield.filterable = true\n\t\t\t\t\tfield.hidden = false\n\n\tif !options.database_name || options.database_name == 'meteor-mongo'\n\t\t_.each _baseObject.fields, (field, field_name)->\n\t\t\tif !self.fields[field_name]\n\t\t\t\tself.fields[field_name] = {}\n\t\t\tself.fields[field_name] = _.extend(_.clone(field), self.fields[field_name])\n\n\t_.each self.fields, (field, field_name)->\n\t\tif field.type == 'autonumber'\n\t\t\tfield.readonly = true\n\t\telse if field.type == 'formula'\n\t\t\tfield.readonly = true\n\t\telse if field.type == 'summary'\n\t\t\tfield.readonly = true\n\n\tself.list_views = {}\n\tdefaultView = Creator.getObjectDefaultView(self.name)\n\t_.each options.list_views, (item, item_name)->\n\t\toitem = Creator.convertListView(defaultView, item, item_name)\n\t\tself.list_views[item_name] = oitem\n\n\tself.triggers = _.clone(_baseObject.triggers)\n\t_.each options.triggers, (item, item_name)->\n\t\tif !self.triggers[item_name]\n\t\t\tself.triggers[item_name] = {}\n\t\tself.triggers[item_name].name = item_name\n\t\tself.triggers[item_name] = _.extend(_.clone(self.triggers[item_name]), item)\n\n\tself.actions = _.clone(_baseObject.actions)\n\t_.each options.actions, (item, item_name)->\n\t\tif !self.actions[item_name]\n\t\t\tself.actions[item_name] = {}\n\t\tcopyItem = _.clone(self.actions[item_name])\n\t\tdelete self.actions[item_name] #先删除相关属性再重建才能保证后续重复定义的属性顺序生效\n\t\tself.actions[item_name] = _.extend(copyItem, item)\n\t\tself.actions[item_name].object_name = self.name\n\n\t_.each self.actions, (item, item_name)->\n\t\titem.name = item_name\n\n\tself.related_objects = Creator.getObjectRelateds(self.name)\n\n\t# 让所有object默认有所有list_views/actions/related_objects/readable_fields/editable_fields完整权限,该权限可能被数据库中设置的admin/user权限覆盖\n\tself.permission_set = _.clone(_baseObject.permission_set)\n\t# defaultListViews = _.keys(self.list_views)\n\t# defaultActions = _.keys(self.actions)\n\t# defaultRelatedObjects = _.pluck(self.related_objects,\"object_name\")\n\t# defaultReadableFields = []\n\t# defaultEditableFields = []\n\t# _.each self.fields, (field, field_name)->\n\t# \tif !(field.hidden) #231 omit字段支持在非编辑页面查看, 因此删除了此处对omit的判断\n\t# \t\tdefaultReadableFields.push field_name\n\t# \t\tif !field.readonly\n\t# \t\t\tdefaultEditableFields.push field_name\n\n\t# _.each self.permission_set, (item, item_name)->\n\t# \tif item_name == \"none\"\n\t# \t\treturn\n\t# \tif self.list_views\n\t# \t\tself.permission_set[item_name].list_views = defaultListViews\n\t# \tif self.actions\n\t# \t\tself.permission_set[item_name].actions = defaultActions\n\t# \tif self.related_objects\n\t# \t\tself.permission_set[item_name].related_objects = defaultRelatedObjects\n\t# \tif self.fields\n\t# \t\tself.permission_set[item_name].readable_fields = defaultReadableFields\n\t# \t\tself.permission_set[item_name].editable_fields = defaultEditableFields\n\tunless options.permission_set\n\t\toptions.permission_set = {}\n\tif !(options.permission_set?.admin)\n\t\toptions.permission_set.admin = _.clone(self.permission_set[\"admin\"])\n\tif !(options.permission_set?.user)\n\t\toptions.permission_set.user = _.clone(self.permission_set[\"user\"])\n\t_.each options.permission_set, (item, item_name)->\n\t\tif !self.permission_set[item_name]\n\t\t\tself.permission_set[item_name] = {}\n\t\tself.permission_set[item_name] = _.extend(_.clone(self.permission_set[item_name]), item)\n\n\t# 前端根据permissions改写field相关属性,后端只要走默认属性就行,不需要改写\n\tif Meteor.isClient\n\t\tpermissions = options.permissions\n\t\tdisabled_list_views = permissions?.disabled_list_views\n\t\tif disabled_list_views?.length\n\t\t\tdefaultListViewId = options.list_views?.all?._id\n\t\t\tif defaultListViewId\n\t\t\t\t# 把视图权限配置中默认的all视图id转换成all关键字\n\t\t\t\tpermissions.disabled_list_views = _.map disabled_list_views, (list_view_item) ->\n\t\t\t\t\treturn if defaultListViewId == list_view_item then \"all\" else list_view_item\n\t\tself.permissions = new ReactiveVar(permissions)\n#\t\t_.each self.fields, (field, field_name)->\n#\t\t\tif field\n#\t\t\t\tif _.indexOf(permissions?.unreadable_fields, field_name) < 0\n#\t\t\t\t\tif field.hidden\n#\t\t\t\t\t\treturn\n#\t\t\t\t\tif _.indexOf(permissions?.uneditable_fields, field_name) > -1\n#\t\t\t\t\t\tfield.readonly = true\n#\t\t\t\t\t\tfield.disabled = true\n#\t\t\t\t\t\t# 当只读时,如果不去掉必填字段,autoform是会报错的\n#\t\t\t\t\t\tfield.required = false\n#\t\t\t\telse\n#\t\t\t\t\tfield.hidden = true\n\telse\n\t\tself.permissions = null\n\n\t_db = Creator.createCollection(options)\n\n\tCreator.Collections[_db._name] = _db\n\n\tself.db = _db\n\n\tself._collection_name = _db._name\n\n\tschema = Creator.getObjectSchema(self)\n\tself.schema = new SimpleSchema(schema)\n\tif self.name != \"users\" and self.name != \"cfs.files.filerecord\" && !self.is_view && !_.contains([\"flows\", \"forms\", \"instances\", \"organizations\", \"action_field_updates\", \"object_listviews\"], self.name)\n\t\tif Meteor.isClient\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\t\telse\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\tif self.name == \"users\"\n\t\t_db._simpleSchema = self.schema\n\n\tif _.contains([\"flows\", \"forms\", \"instances\", \"organizations\"], self.name)\n\t\tif Meteor.isClient\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\n\tCreator.objectsByName[self._collection_name] = self\n\n\treturn self\n\n# Creator.Object.prototype.i18n = ()->\n# \t# set object label\n# \tself = this\n\n# \tkey = self.name\n# \tif t(key) == key\n# \t\tif !self.label\n# \t\t\tself.label = self.name\n# \telse\n# \t\tself.label = t(key)\n\n# \t# set field labels\n# \t_.each self.fields, (field, field_name)->\n# \t\tfkey = self.name + \"_\" + field_name\n# \t\tif t(fkey) == fkey\n# \t\t\tif !field.label\n# \t\t\t\tfield.label = field_name\n# \t\telse\n# \t\t\tfield.label = t(fkey)\n# \t\tself.schema?._schema?[field_name]?.label = field.label\n\n\n# \t# set listview labels\n# \t_.each self.list_views, (item, item_name)->\n# \t\ti18n_key = self.name + \"_listview_\" + item_name\n# \t\tif t(i18n_key) == i18n_key\n# \t\t\tif !item.label\n# \t\t\t\titem.label = item_name\n# \t\telse\n# \t\t\titem.label = t(i18n_key)\n\n\nCreator.getObjectODataRouterPrefix = (object)->\n\treturn \"/api/odata/v4\"\n\t# if object\n\t# \tif !object.database_name || object.database_name == 'meteor-mongo'\n\t# \t\treturn \"/api/odata/v4\"\n\t# \telse\n\t# \t\treturn \"/api/odata/#{object.database_name}\"\n\n# if Meteor.isClient\n\n# \tMeteor.startup ->\n# \t\tTracker.autorun ->\n# \t\t\tif Session.get(\"steedos-locale\") && Creator.bootstrapLoaded?.get()\n# \t\t\t\t_.each Creator.objectsByName, (object, object_name)->\n# \t\t\t\t\tobject.i18n()\n\nMeteor.startup ->\n\tif !Creator.bootstrapLoaded && Creator.Objects\n\t\t_.each Creator.Objects, (object)->\n\t\t\tnew Creator.Object(object)\n\n","var clone;\n\nclone = require('clone');\n\nCreator.objectsByName = {};\n\nCreator.formatObjectName = function(object_name) {\n if (object_name.startsWith('cfs.files.')) {\n object_name = object_name.replace(new RegExp('\\\\.', 'g'), '_');\n }\n return object_name;\n};\n\nCreator.Object = function(options) {\n var _baseObject, _db, defaultListViewId, defaultView, disabled_list_views, permissions, ref, ref1, ref2, ref3, schema, self;\n _baseObject = Creator.baseObject;\n if (Meteor.isClient) {\n _baseObject = {\n actions: Creator.baseObject.actions,\n fields: {},\n triggers: {},\n permission_set: {}\n };\n }\n self = this;\n if (!options.name) {\n console.error(options);\n throw new Error('Creator.Object options must specify name');\n }\n self._id = options._id || options.name;\n self.space = options.space;\n self.name = options.name;\n self.label = options.label;\n self.icon = options.icon;\n self.description = options.description;\n self.is_view = options.is_view;\n self.form = options.form;\n self.relatedList = options.relatedList;\n self.related_lists = options.related_lists;\n self.hasImportTemplates = options.hasImportTemplates;\n self.version = options.version || 1.0;\n if (!_.isBoolean(options.is_enable) || options.is_enable === true) {\n self.is_enable = true;\n } else {\n self.is_enable = false;\n }\n if (Meteor.isClient) {\n if (_.has(options, 'allow_customActions')) {\n self.allow_customActions = options.allow_customActions;\n }\n if (_.has(options, 'exclude_actions')) {\n self.exclude_actions = options.exclude_actions;\n }\n if (_.has(options, 'allow_relatedList')) {\n self.allow_relatedList = options.allow_relatedList;\n }\n }\n self.enable_search = options.enable_search;\n self.enable_files = options.enable_files;\n self.enable_tasks = options.enable_tasks;\n self.enable_notes = options.enable_notes;\n self.enable_audit = options.enable_audit;\n self.enable_events = options.enable_events;\n if (options.paging) {\n self.paging = options.paging;\n }\n self.hidden = options.hidden;\n self.enable_api = (options.enable_api === void 0) || options.enable_api;\n self.custom = options.custom;\n self.enable_share = options.enable_share;\n self.enable_instances = options.enable_instances;\n self.enable_process = options.enable_process;\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\"))) {\n self.enable_tree = false;\n } else {\n self.enable_tree = options.enable_tree;\n self.sidebar = _.clone(options.sidebar);\n }\n } else {\n self.sidebar = _.clone(options.sidebar);\n self.enable_tree = options.enable_tree;\n }\n self.open_window = options.open_window;\n self.filter_company = options.filter_company;\n self.calendar = _.clone(options.calendar);\n self.enable_chatter = options.enable_chatter;\n self.enable_trash = options.enable_trash;\n self.enable_space_global = options.enable_space_global;\n self.enable_approvals = options.enable_approvals;\n self.enable_follow = options.enable_follow;\n self.enable_workflow = options.enable_workflow;\n self.enable_inline_edit = options.enable_inline_edit;\n self.details = options.details;\n self.masters = options.masters;\n self.lookup_details = options.lookup_details;\n if (_.has(options, 'in_development')) {\n self.in_development = options.in_development;\n }\n self.idFieldName = '_id';\n if (options.database_name) {\n self.database_name = options.database_name;\n }\n if (!options.fields) {\n console.error(options);\n throw new Error('Creator.Object options must specify fields');\n }\n self.fields = clone(options.fields);\n _.each(self.fields, function(field, field_name) {\n if (field.is_name) {\n self.NAME_FIELD_KEY = field_name;\n } else if (field_name === 'name' && !self.NAME_FIELD_KEY) {\n self.NAME_FIELD_KEY = field_name;\n }\n if (field.primary) {\n self.idFieldName = field_name;\n }\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\"))) {\n if (field_name === 'space') {\n field.filterable = true;\n return field.hidden = false;\n }\n }\n }\n });\n if (!options.database_name || options.database_name === 'meteor-mongo') {\n _.each(_baseObject.fields, function(field, field_name) {\n if (!self.fields[field_name]) {\n self.fields[field_name] = {};\n }\n return self.fields[field_name] = _.extend(_.clone(field), self.fields[field_name]);\n });\n }\n _.each(self.fields, function(field, field_name) {\n if (field.type === 'autonumber') {\n return field.readonly = true;\n } else if (field.type === 'formula') {\n return field.readonly = true;\n } else if (field.type === 'summary') {\n return field.readonly = true;\n }\n });\n self.list_views = {};\n defaultView = Creator.getObjectDefaultView(self.name);\n _.each(options.list_views, function(item, item_name) {\n var oitem;\n oitem = Creator.convertListView(defaultView, item, item_name);\n return self.list_views[item_name] = oitem;\n });\n self.triggers = _.clone(_baseObject.triggers);\n _.each(options.triggers, function(item, item_name) {\n if (!self.triggers[item_name]) {\n self.triggers[item_name] = {};\n }\n self.triggers[item_name].name = item_name;\n return self.triggers[item_name] = _.extend(_.clone(self.triggers[item_name]), item);\n });\n self.actions = _.clone(_baseObject.actions);\n _.each(options.actions, function(item, item_name) {\n var copyItem;\n if (!self.actions[item_name]) {\n self.actions[item_name] = {};\n }\n copyItem = _.clone(self.actions[item_name]);\n delete self.actions[item_name];\n self.actions[item_name] = _.extend(copyItem, item);\n return self.actions[item_name].object_name = self.name;\n });\n _.each(self.actions, function(item, item_name) {\n return item.name = item_name;\n });\n self.related_objects = Creator.getObjectRelateds(self.name);\n self.permission_set = _.clone(_baseObject.permission_set);\n if (!options.permission_set) {\n options.permission_set = {};\n }\n if (!((ref = options.permission_set) != null ? ref.admin : void 0)) {\n options.permission_set.admin = _.clone(self.permission_set[\"admin\"]);\n }\n if (!((ref1 = options.permission_set) != null ? ref1.user : void 0)) {\n options.permission_set.user = _.clone(self.permission_set[\"user\"]);\n }\n _.each(options.permission_set, function(item, item_name) {\n if (!self.permission_set[item_name]) {\n self.permission_set[item_name] = {};\n }\n return self.permission_set[item_name] = _.extend(_.clone(self.permission_set[item_name]), item);\n });\n if (Meteor.isClient) {\n permissions = options.permissions;\n disabled_list_views = permissions != null ? permissions.disabled_list_views : void 0;\n if (disabled_list_views != null ? disabled_list_views.length : void 0) {\n defaultListViewId = (ref2 = options.list_views) != null ? (ref3 = ref2.all) != null ? ref3._id : void 0 : void 0;\n if (defaultListViewId) {\n permissions.disabled_list_views = _.map(disabled_list_views, function(list_view_item) {\n if (defaultListViewId === list_view_item) {\n return \"all\";\n } else {\n return list_view_item;\n }\n });\n }\n }\n self.permissions = new ReactiveVar(permissions);\n } else {\n self.permissions = null;\n }\n _db = Creator.createCollection(options);\n Creator.Collections[_db._name] = _db;\n self.db = _db;\n self._collection_name = _db._name;\n schema = Creator.getObjectSchema(self);\n self.schema = new SimpleSchema(schema);\n if (self.name !== \"users\" && self.name !== \"cfs.files.filerecord\" && !self.is_view && !_.contains([\"flows\", \"forms\", \"instances\", \"organizations\", \"action_field_updates\", \"object_listviews\"], self.name)) {\n if (Meteor.isClient) {\n _db.attachSchema(self.schema, {\n replace: true\n });\n } else {\n _db.attachSchema(self.schema, {\n replace: true\n });\n }\n }\n if (self.name === \"users\") {\n _db._simpleSchema = self.schema;\n }\n if (_.contains([\"flows\", \"forms\", \"instances\", \"organizations\"], self.name)) {\n if (Meteor.isClient) {\n _db.attachSchema(self.schema, {\n replace: true\n });\n }\n }\n Creator.objectsByName[self._collection_name] = self;\n return self;\n};\n\nCreator.getObjectODataRouterPrefix = function(object) {\n return \"/api/odata/v4\";\n};\n\nMeteor.startup(function() {\n if (!Creator.bootstrapLoaded && Creator.Objects) {\n return _.each(Creator.Objects, function(object) {\n return new Creator.Object(object);\n });\n }\n});\n","Creator.getSelectOptions = (fieldSchema) ->\n\toptions = fieldSchema.options\n\tunless options\n\t\treturn\n\tdata_type = fieldSchema.data_type\n\tif !_.isFunction(options) and data_type and data_type != 'text'\n\t\t# 零代码界面配置options选项值只支持字符串,所以当data_type为数值或boolean时,只能强行把选项值先转换为对应的类型\n\t\toptions.forEach (optionItem) ->\n\t\t\tif typeof optionItem.value != 'string'\n\t\t\t\treturn\n\t\t\tif [\n\t\t\t\t'number'\n\t\t\t\t'currency'\n\t\t\t\t'percent'\n\t\t\t].indexOf(data_type) > -1\n\t\t\t\toptionItem.value = Number(optionItem.value)\n\t\t\telse if data_type == 'boolean'\n\t\t\t\t# 只有为true才为真\n\t\t\t\toptionItem.value = optionItem.value == 'true'\n\treturn options\n\nCreator.getObjectSchema = (obj) ->\n\tunless obj\n\t\treturn\n\tschema = {}\n\n\tfieldsArr = []\n\n\t_.each obj.fields , (field, field_name)->\n\t\tif !_.has(field, \"name\")\n\t\t\tfield.name = field_name\n\t\tfieldsArr.push field\n\n\t_.each _.sortBy(fieldsArr, \"sort_no\"), (field)->\n\n\t\tfield_name = field.name\n\n\t\tfs = {}\n\t\tif field.regEx\n\t\t\tfs.regEx = field.regEx\n\t\tfs.autoform = {}\n\t\tfs.autoform.multiple = field.multiple\n\t\tfs.autoform.reference_to = field.reference_to\n\n\t\tautoform_type = field.autoform?.type\n\n\t\tif field.type == \"text\" or field.type == \"phone\"\n\t\t\tfs.type = String\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tfs.autoform.type = \"tags\"\n\t\telse if field.type == \"[text]\" or field.type == \"[phone]\"\n\t\t\tfs.type = [String]\n\t\t\tfs.autoform.type = \"tags\"\n\t\telse if field.type == 'code'\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"widearea\"\n\t\t\tfs.autoform.rows = field.rows || 12\n\t\t\tif field.language\n\t\t\t\tfs.autoform.language = field.language\n\t\telse if field.type == \"textarea\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"widearea\"\n\t\t\tfs.autoform.rows = field.rows || 2\n\t\telse if field.type == \"password\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"password\"\n\t\telse if field.type == \"date\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\tif Steedos.isMobile() || Steedos.isPad()\n\t\t\t\t\tif Steedos.isiOS()\n\t\t\t\t\t\t# Fix ios 14, 手机客户端待审核文件日期控件显示故障 #991,ios统一用PC端一样的js控件\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd\"\n\t\t\t\t\t\t\t\tpickerType: \"rollers\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"steedos-date-mobile\"\n\t\t\t\t\t\t\tdateMobileOptions:\n\t\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.outFormat = 'yyyy-MM-dd';\n\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd\"\n\t\telse if field.type == \"time\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\ttype: \"time\"\n\t\t\t\t\t\tdisplayFormat: \"HH:mm\"\n\t\telse if field.type == \"datetime\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\tif Steedos.isMobile() || Steedos.isPad()\n\t\t\t\t\tif Steedos.isiOS()\n\t\t\t\t\t\t# Fix ios 14, 手机客户端待审核文件日期控件显示故障 #991,ios统一用PC端一样的js控件\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd HH:mm\"\n\t\t\t\t\t\t\t\tpickerType: \"rollers\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"steedos-date-mobile\"\n\t\t\t\t\t\t\tdateMobileOptions:\n\t\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\telse\n\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd HH:mm\"\n\t\telse if field.type == \"[Object]\"\n\t\t\tfs.type = [Object]\n\t\telse if field.type == \"html\"\n\t\t\tfs.type = String\n\t\t\tif Meteor.isClient\n\t\t\t\tfs.autoform.type = 'steedosHtml';\n\t\t\t# if Meteor.isClient\n\t\t\t# \tlocale = Steedos.locale()\n\t\t\t# \tif locale == \"zh-cn\" || locale == \"zh-CN\"\n\t\t\t# \t\tlocale = \"zh-CN\"\n\t\t\t# \telse\n\t\t\t# \t\tlocale = \"en-US\"\n\t\t\t# \tfs.autoform.afFieldInput =\n\t\t\t# \t\ttype: \"summernote\"\n\t\t\t# \t\tclass: 'summernote-editor'\n\t\t\t# \t\tsettings:\n\t\t\t# \t\t\theight: 200\n\t\t\t# \t\t\tdialogsInBody: true\n\t\t\t# \t\t\ttoolbar: [\n\t\t\t# \t\t\t\t['font1', ['style']],\n\t\t\t# \t\t\t\t['font2', ['bold', 'underline', 'italic', 'clear']],\n\t\t\t# \t\t\t\t['font3', ['fontname']],\n\t\t\t# \t\t\t\t['color', ['color']],\n\t\t\t# \t\t\t\t['para', ['ul', 'ol', 'paragraph']],\n\t\t\t# \t\t\t\t['table', ['table']],\n\t\t\t# \t\t\t\t['insert', ['link', 'picture']],\n\t\t\t# \t\t\t\t['view', ['codeview']]\n\t\t\t# \t\t\t]\n\t\t\t# \t\t\tfontNames: ['Arial', 'Comic Sans MS', 'Courier New', 'Helvetica', 'Impact', '宋体','黑体','微软雅黑','仿宋','楷体','隶书','幼圆']\n\t\t\t# \t\t\tlang: locale\n\n\t\telse if (field.type == \"lookup\" or field.type == \"master_detail\")\n\t\t\tfs.type = String\n\t\t\tfs.autoform.showIcon = field.showIcon\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\n\t\t\tif !field.hidden\n\n\t\t\t\tfs.autoform.filters = field.filters\n\n\t\t\t\tfs.autoform.dependOn = field.depend_on\n\n\t\t\t\tif field.beforeOpenFunction\n\t\t\t\t\tfs.beforeOpenFunction = field.beforeOpenFunction\n\n\t\t\t\tfs.filtersFunction = if field.filtersFunction then field.filtersFunction else Creator.evaluateFilters\n\n\t\t\t\tif field.optionsFunction\n\t\t\t\t\tfs.optionsFunction = field.optionsFunction\n\n\t\t\t\tif field.reference_to\n\n\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\tif field.createFunction && _.isFunction(field.createFunction)\n\t\t\t\t\t\t\tfs.createFunction = field.createFunction\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isString(field.reference_to)\n\t\t\t\t\t\t\t\t_ref_obj = Creator.Objects[field.reference_to]\n\t\t\t\t\t\t\t\tif _ref_obj?.permissions?.allowCreate\n\t\t\t\t\t\t\t\t\tfs.autoform.create = true\n\t\t\t\t\t\t\t\t\tfs.createFunction = (lookup_field)->\n\t\t\t\t\t\t\t\t\t\tModal.show(\"CreatorObjectModal\", {\n\t\t\t\t\t\t\t\t\t\t\tcollection: \"Creator.Collections.#{Creator.getCollection(field.reference_to)._name}\",\n\t\t\t\t\t\t\t\t\t\t\tformId: \"new#{field.reference_to.replace('.','_')}\",\n\t\t\t\t\t\t\t\t\t\t\tobject_name: \"#{field.reference_to}\",\n\t\t\t\t\t\t\t\t\t\t\toperation: \"insert\",\n\t\t\t\t\t\t\t\t\t\t\tonSuccess: (operation, result)->\n\t\t\t\t\t\t\t\t\t\t\t\tobject = Creator.getObject(result.object_name)\n\t\t\t\t\t\t\t\t\t\t\t\tif result.object_name == \"objects\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tlookup_field.addItems([{label: result.value.label, value: result.value.name, icon: result.value.icon}], result.value.name)\n\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\tlookup_field.addItems([{label: result.value[object.NAME_FIELD_KEY] || result.value.label || result.value.name, value: result._id}], result._id)\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tfs.autoform.create = false\n\n\t\t\t\t\tif _.isBoolean(field.create)\n\t\t\t\t\t\tfs.autoform.create = field.create\n\n\t\t\t\t\tif field.reference_sort\n\t\t\t\t\t\tfs.autoform.optionsSort = field.reference_sort\n\n\t\t\t\t\tif field.reference_limit\n\t\t\t\t\t\tfs.autoform.optionsLimit = field.reference_limit\n\t\t\t\t\tif field.reference_to_field\n\t\t\t\t\t\tfs.autoform.referenceToField = field.reference_to_field\n\n\t\t\t\t\tif field.reference_to == \"users\"\n\t\t\t\t\t\tfs.autoform.type = \"selectuser\"\n\t\t\t\t\t\tif !field.hidden && !field.omit\n\t\t\t\t\t\t\t# is_company_limited表示过滤数据时是否只显示本分部下的数据\n\t\t\t\t\t\t\t# is_company_limited可以被改写覆盖成true/false或其他function\n\t\t\t\t\t\t\tif field.is_company_limited == undefined\n\t\t\t\t\t\t\t\t# 未定义is_company_limited属性时默认处理逻辑:\n\t\t\t\t\t\t\t\t# 对当前对象有viewAllRecords权限则不限制所属分部列表查看权限,否则只显示当前所属分部\n\t\t\t\t\t\t\t\t# 注意不是reference_to对象的viewAllRecords权限,而是当前对象的\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\tpermissions = obj.permissions\n\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.viewAllRecords\n\t\t\t\t\t\t\t\t\tif _.include([\"organizations\", \"users\", \"space_users\"], obj.name)\n\t\t\t\t\t\t\t\t\t\t# 如果字段所属对象是用户或组织,则是否限制显示所属分部部门与modifyAllRecords权限关联\n\t\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.modifyAllRecords\n\t\t\t\t\t\t\t\t\tif isUnLimited\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = false\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse if _.isFunction field.is_company_limited\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\t# 传入当前对象的权限,在函数中根据权限计算是否要限制只查看本分部\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited(obj.permissions)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t# 服务端用不到is_company_limited\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\telse if field.reference_to == \"organizations\"\n\t\t\t\t\t\tfs.autoform.type = \"selectorg\"\n\t\t\t\t\t\tif !field.hidden && !field.omit\n\t\t\t\t\t\t\t# is_company_limited表示过滤数据时是否只显示本分部下的数据\n\t\t\t\t\t\t\t# is_company_limited可以被改写覆盖成true/false或其他function\n\t\t\t\t\t\t\tif field.is_company_limited == undefined\n\t\t\t\t\t\t\t\t# 未定义is_company_limited属性时默认处理逻辑:\n\t\t\t\t\t\t\t\t# 对当前对象有viewAllRecords权限则不限制所属分部列表查看权限,否则只显示当前所属分部\n\t\t\t\t\t\t\t\t# 注意不是reference_to对象的viewAllRecords权限,而是当前对象的\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\tpermissions = obj.permissions\n\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.viewAllRecords\n\t\t\t\t\t\t\t\t\tif _.include([\"organizations\", \"users\", \"space_users\"], obj.name)\n\t\t\t\t\t\t\t\t\t\t# 如果字段所属对象是用户或组织,则是否限制显示所属分部部门与modifyAllRecords权限关联\n\t\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.modifyAllRecords\n\t\t\t\t\t\t\t\t\tif isUnLimited\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = false\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse if _.isFunction field.is_company_limited\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\t# 传入当前对象的权限,在函数中根据权限计算是否要限制只查看本分部\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited(obj.permissions)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t# 服务端用不到is_company_limited\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\telse\n\t\t\t\t\t\tif typeof(field.reference_to) == \"function\"\n\t\t\t\t\t\t\t_reference_to = field.reference_to()\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_reference_to = field.reference_to\n\n\t\t\t\t\t\tif _.isArray(_reference_to)\n\t\t\t\t\t\t\tfs.type = Object\n\t\t\t\t\t\t\tfs.blackbox = true\n\t\t\t\t\t\t\tfs.autoform.objectSwitche = true\n\n\t\t\t\t\t\t\tschema[field_name + \".o\"] = {\n\t\t\t\t\t\t\t\ttype: String\n\t\t\t\t\t\t\t\tautoform: {omit: true}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tschema[field_name + \".ids\"] = {\n\t\t\t\t\t\t\t\ttype: [String]\n\t\t\t\t\t\t\t\tautoform: {omit: true}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_reference_to = [_reference_to]\n\n\t\t\t\t\t\t_object = Creator.Objects[_reference_to[0]]\n\t\t\t\t\t\tif _object and _object.enable_tree\n\t\t\t\t\t\t\tfs.autoform.type = \"selectTree\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\t\t\t\tfs.autoform.optionsMethod = field.optionsMethod || \"creator.object_options\"\n\n\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\tfs.autoform.optionsMethodParams = ()->\n\t\t\t\t\t\t\t\t\treturn {space: Session.get(\"spaceId\")}\n\t\t\t\t\t\t\t\tfs.autoform.references = []\n\t\t\t\t\t\t\t\t_reference_to.forEach (_reference)->\n\t\t\t\t\t\t\t\t\t_object = Creator.Objects[_reference]\n\t\t\t\t\t\t\t\t\tif _object\n\t\t\t\t\t\t\t\t\t\tfs.autoform.references.push {\n\t\t\t\t\t\t\t\t\t\t\tobject: _reference\n\t\t\t\t\t\t\t\t\t\t\tlabel: _object?.label\n\t\t\t\t\t\t\t\t\t\t\ticon: _object?.icon\n\t\t\t\t\t\t\t\t\t\t\tlink: ()->\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"/app/#{Session.get('app_id')}/#{_reference}/view/\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.references.push {\n\t\t\t\t\t\t\t\t\t\t\tobject: _reference\n\t\t\t\t\t\t\t\t\t\t\tlink: ()->\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"/app/#{Session.get('app_id')}/#{_reference}/view/\"\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\t\tfs.autoform.defaultIcon = field.defaultIcon\n\n\t\telse if field.type == \"select\"\n\t\t\tfs.type = String\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\tfs.autoform.showIcon = false\n\t\t\t\tfs.autoform.options = field.options\n\t\t\telse\n\t\t\t\tfs.autoform.type = \"select\"\n\t\t\t\tfs.autoform.options = field.options\n\t\t\t\tif _.has(field, 'firstOption')\n\t\t\t\t\tfs.autoform.firstOption = field.firstOption\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.firstOption = \"\"\n\t\t\t# 因为列表视图右侧过滤器还是用的老表单的lookup和select控件,所以上面的代码始终保持原样需要执行\n\t\t\t# 下面是配置了data_type时,额外处理的逻辑\n\t\t\tif field.data_type and field.data_type != \"text\"\n\t\t\t\tif [\"number\", \"currency\", \"percent\"].indexOf(field.data_type) > -1\n\t\t\t\t\tfsType = Number\n\t\t\t\t\tfs.decimal = true\n\t\t\t\telse if field.data_type == \"boolean\"\n\t\t\t\t\tfsType = Boolean\n\t\t\t\telse\n\t\t\t\t\tfsType = String\n\t\t\t\tfs.type = fsType\n\t\t\t\tif field.multiple\n\t\t\t\t\tfs.type = [fsType]\n\t\t\t\t\t\n\t\t\t\tfs.autoform.options = Creator.getSelectOptions(field)\n\t\telse if field.type == \"currency\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tif field?.scale\n\t\t\t\tfs.autoform.scale = field.scale\n\t\t\t\tfs.decimal = true\n\t\t\telse if field?.scale != 0\n\t\t\t\tfs.autoform.scale = 2\n\t\t\t\tfs.decimal = true\n\t\telse if field.type == \"number\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tif field?.scale\n\t\t\t\tfs.autoform.scale = field.scale\n\t\t\t\tfs.decimal = true\n\t\telse if field.type == \"boolean\"\n\t\t\tfs.type = Boolean\n\t\t\tif field.readonly\n\t\t\t\tfs.autoform.disabled = true\n\t\t\tfs.autoform.type = \"steedos-boolean-checkbox\"\n\t\telse if field.type == \"toggle\"\n\t\t\tfs.type = Boolean\n\t\t\tif field.readonly\n\t\t\t\tfs.autoform.disabled = true\n\t\t\tfs.autoform.type = \"steedos-boolean-toggle\"\n\t\telse if field.type == \"reference\"\n\t\t\tfs.type = String\n\t\telse if field.type == \"checkbox\"\n\t\t\tfs.type = [String]\n\t\t\tfs.autoform.type = \"select-checkbox\"\n\t\t\tfs.autoform.options = field.options\n\t\telse if field.type == \"file\"\n\t\t\tcollectionName = field.collection || \"files\" # collection 默认是 'files'\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: collectionName\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = collectionName\n\t\telse if field.type == \"filesize\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = 'filesize'\n\t\telse if field.type == \"Object\" || field.type == \"object\"\n\t\t\tfs.type = Object\n\t\telse if field.type == \"grid\" || field.type == \"table\"\n\t\t\tfs.type = Array\n\t\t\tfs.autoform.editable = true\n\t\t\tfs.autoform.type = \"steedosGrid\"\n\n\t\t\tschema[field_name + \".$\"] =\n\t\t\t\ttype: Object\n\t\telse if field.type == \"image\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'images'\n\t\t\t\t\t\taccept: 'image/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'images'\n\t\t\t\tfs.autoform.accept = 'image/*'\n\t\telse if field.type == \"avatar\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'avatars'\n\t\t\t\t\t\taccept: 'image/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'avatars'\n\t\t\t\tfs.autoform.accept = 'image/*'\n\t\telse if field.type == \"audio\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'audios'\n\t\t\t\t\t\taccept: 'audio/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'audios'\n\t\t\t\tfs.autoform.accept = 'audio/*'\n\t\telse if field.type == \"video\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'videos'\n\t\t\t\t\t\taccept: 'video/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'videos'\n\t\t\t\tfs.autoform.accept = 'video/*'\n\t\telse if field.type == \"location\"\n\t\t\tfs.type = Object\n\t\t\tfs.autoform.type = \"location\"\n\t\t\tfs.autoform.system = field.system || \"wgs84\"\n\t\t\tfs.blackbox = true\n\t\telse if field.type == \"markdown\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"text\"\n\t\telse if field.type == 'url'\n\t\t\tfs.type = String\n\t\t\t# fs.regEx = SimpleSchema.RegEx.Url\n\t\t\tfs.autoform.type = 'steedosUrl'\n\t\telse if field.type == 'email'\n\t\t\tfs.type = String\n\t\t\tfs.regEx = SimpleSchema.RegEx.Email\n\t\t\tfs.autoform.type = 'steedosEmail'\n\t\telse if field.type == 'autonumber'\n\t\t\tfs.type = String\n\t\telse if field.type == 'color'\n\t\t\tfs.type = String\n\t\telse if field.type == 'formula'\n\t\t\tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\telse if field.type == 'summary'\n\t\t\tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\t# else if field.type == 'select'\n\t\t# \tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\telse if field.type == 'percent'\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tunless _.isNumber(field.scale)\n\t\t\t\t# 没配置小数位数则按小数位数0来处理,即默认显示为整数的百分比,比如20%,此时控件可以输入2位小数,转成百分比就是整数\n\t\t\t\tfield.scale = 0\n\t\t\t# autoform控件中小数位数始终比配置的位数多2位\n\t\t\tfs.autoform.scale = field.scale + 2\n\t\t\tfs.decimal = true\n\t\telse\n\t\t\tfs.type = field.type\n\n\t\tif field.label\n\t\t\tfs.label = field.label\n\n#\t\tif field.allowedValues\n#\t\t\tfs.allowedValues = field.allowedValues\n\n\t\tif !field.required\n\t\t\tfs.optional = true\n\n\t\t# [签约对象同时配置了company_ids必填及uneditable_fields造成部分用户新建签约对象时报错 #192](https://github.com/steedos/steedos-project-dzug/issues/192)\n\t\t# 后台始终设置required为false\n\t\tif !Meteor.isClient\n\t\t\tfs.optional = true\n\n\t\tif field.unique\n\t\t\tfs.unique = true\n\n\t\tif field.omit\n\t\t\tfs.autoform.omit = true\n\n\t\tif field.group\n\t\t\tfs.autoform.group = field.group\n\n\t\tif field.is_wide\n\t\t\tfs.autoform.is_wide = true\n\n\t\tif field.hidden\n\t\t\tfs.autoform.type = \"hidden\"\n\n\t\tif (field.type == \"select\") or (field.type == \"lookup\") or (field.type == \"master_detail\")\n\t\t\tif typeof(field.filterable) == 'undefined'\n\t\t\t\tfield.filterable = true\n\t\tif field.name == 'name' || field.is_name\n\t\t\tif typeof(field.searchable) == 'undefined'\n\t\t\t\tfield.searchable = true\n\n\t\tif autoform_type\n\t\t\tfs.autoform.type = autoform_type\n\n\t\tif field.defaultValue\n\t\t\tif Meteor.isClient and Creator.Formular.checkFormula(field.defaultValue)\n\t\t\t\tfs.autoform.defaultValue = ()->\n\t\t\t\t\treturn Creator.Formular.run(field.defaultValue, {userId: Meteor.userId(), spaceId: Session.get(\"spaceId\"), now: new Date()})\n\t\t\telse\n\t\t\t\tfs.autoform.defaultValue = field.defaultValue\n\t\t\t# \tif !_.isFunction(field.defaultValue)\n\t\t\t# \t\tfs.defaultValue = field.defaultValue\n\n\t\tif field.readonly\n\t\t\tfs.autoform.readonly = true\n\n\t\tif field.disabled\n\t\t\tfs.autoform.disabled = true\n\n\t\tif field.inlineHelpText\n\t\t\tfs.autoform.inlineHelpText = field.inlineHelpText\n\n\t\tif field.blackbox\n\t\t\tfs.blackbox = true\n\n\t\tif _.has(field, 'min')\n\t\t\tfs.min = field.min\n\t\tif _.has(field, 'max')\n\t\t\tfs.max = field.max\n\n\t\t# 只有生产环境才重建索引\n\t\tif Meteor.isProduction\n\t\t\tif field.index\n\t\t\t\tfs.index = field.index\n\t\t\telse if field.sortable\n\t\t\t\tfs.index = true\n\n\t\tschema[field_name] = fs\n\n\treturn schema\n\n\nCreator.getFieldDisplayValue = (object_name, field_name, field_value)->\n\thtml = field_value\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\treturn \"\"\n\tfield = object.fields(field_name)\n\tif !field\n\t\treturn \"\"\n\n\tif field.type == \"datetime\"\n\t\thtml = moment(this.val).format('YYYY-MM-DD H:mm')\n\telse if field.type == \"date\"\n\t\thtml = moment(this.val).format('YYYY-MM-DD')\n\n\treturn html\n\nCreator.checkFieldTypeSupportBetweenQuery = (field_type)->\n\treturn [\"date\", \"datetime\", \"time\", \"currency\", \"number\"].includes(field_type)\n\nCreator.pushBetweenBuiltinOptionals = (field_type, operations)->\n\tbuiltinValues = Creator.getBetweenBuiltinValues(field_type)\n\tif builtinValues\n\t\t_.forEach builtinValues, (builtinItem, key)->\n\t\t\toperations.push({label: builtinItem.label, value: key})\n\nCreator.getBetweenBuiltinValues = (field_type, is_check_only)->\n\t# 过滤器字段类型对应的内置选项\n\tif [\"date\", \"datetime\"].includes(field_type)\n\t\treturn Creator.getBetweenTimeBuiltinValues(is_check_only, field_type)\n\nCreator.getBetweenBuiltinValueItem = (field_type, key)->\n\t# 过滤器字段类型对应的内置选项\n\tif [\"date\", \"datetime\"].includes(field_type)\n\t\treturn Creator.getBetweenTimeBuiltinValueItem(field_type, key)\n\nCreator.getBetweenBuiltinOperation = (field_type, value)->\n\t# 根据过滤器的过滤值,获取对应的内置运算符\n\t# 比如value为last_year,返回between_time_last_year\n\tunless _.isString(value)\n\t\treturn\n\tbetweenBuiltinValues = Creator.getBetweenBuiltinValues(field_type)\n\tunless betweenBuiltinValues\n\t\treturn\n\tresult = null\n\t_.each betweenBuiltinValues, (item, operation)->\n\t\tif item.key == value\n\t\t\tresult = operation\n\treturn result\n\n# 如果只是为判断operation是否存在,则没必要计算values,传入is_check_only为true即可\nCreator.getBetweenTimeBuiltinValues = (is_check_only, field_type)->\n\t# 过滤器时间字段类型对应的内置选项\n\treturn {\n\t\t\"between_time_last_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_year\"),\n\t\t\"between_time_this_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_year\"),\n\t\t\"between_time_next_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_year\"),\n\t\t\"between_time_last_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_quarter\"),\n\t\t\"between_time_this_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_quarter\"),\n\t\t\"between_time_next_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_quarter\"),\n\t\t\"between_time_last_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_month\"),\n\t\t\"between_time_this_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_month\"),\n\t\t\"between_time_next_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_month\"),\n\t\t\"between_time_last_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_week\"),\n\t\t\"between_time_this_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_week\"),\n\t\t\"between_time_next_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_week\"),\n\t\t\"between_time_yestday\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"yestday\"),\n\t\t\"between_time_today\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"today\"),\n\t\t\"between_time_tomorrow\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"tomorrow\"),\n\t\t\"between_time_last_7_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_7_days\"),\n\t\t\"between_time_last_30_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_30_days\"),\n\t\t\"between_time_last_60_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_60_days\"),\n\t\t\"between_time_last_90_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_90_days\"),\n\t\t\"between_time_last_120_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_120_days\"),\n\t\t\"between_time_next_7_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_7_days\"),\n\t\t\"between_time_next_30_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_30_days\"),\n\t\t\"between_time_next_60_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_60_days\"),\n\t\t\"between_time_next_90_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_90_days\"),\n\t\t\"between_time_next_120_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_120_days\")\n\t}\n\nCreator.getQuarterStartMonth = (month)->\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\treturn 0\n\telse if month < 6\n\t\treturn 3\n\telse if month < 9\n\t\treturn 6\n\t\n\treturn 9\n\n\nCreator.getLastQuarterFirstDay = (year,month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\tyear--\n\t\tmonth = 9\n\telse if month < 6\n\t\tmonth = 0\n\telse if month < 9\n\t\tmonth = 3\n\telse \n\t\tmonth = 6\n\t\n\treturn new Date(year, month, 1)\n\t\n\nCreator.getNextQuarterFirstDay = (year,month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\tmonth = 3\n\telse if month < 6\n\t\tmonth = 6\n\telse if month < 9\n\t\tmonth = 9\n\telse\n\t\tyear++\n\t\tmonth = 0\n\t\n\treturn new Date(year, month, 1)\n\nCreator.getMonthDays = (year,month)->\n\tif month == 11\n\t\treturn 31\n\t\n\tmillisecond = 1000 * 60 * 60 * 24\n\tstartDate = new Date(year, month, 1)\n\tendDate = new Date(year, month+1, 1)\n\tdays = (endDate-startDate)/millisecond\n\treturn days\n\nCreator.getLastMonthFirstDay = (year, month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\t# 月份为0代表本年的第一月\n\tif month == 0\n\t\tmonth = 11\n\t\tyear--\n\t\treturn new Date(year, month, 1)\n\t\n\t# 否则,只减去月份\n\tmonth--;\n\treturn new Date(year, month, 1)\n\t\nCreator.getBetweenTimeBuiltinValueItem = (field_type, key)->\n\t# 过滤器between运算符,现算日期/日期时间类型字段的values值\n\tnow = new Date()\n\t# 一天的毫秒数\n\tmillisecond = 1000 * 60 * 60 * 24\n\tyestday = new Date(now.getTime() - millisecond)\n\ttomorrow = new Date(now.getTime() + millisecond)\n\t# 一周中的某一天\n\tweek = now.getDay()\n\t# 减去的天数\n\tminusDay = if week != 0 then week - 1 else 6\n\tmonday = new Date(now.getTime() - (minusDay * millisecond))\n\tsunday = new Date(monday.getTime() + (6 * millisecond))\n\t# 上周日\n\tlastSunday = new Date(monday.getTime() - millisecond)\n\t# 上周一\n\tlastMonday = new Date(lastSunday.getTime() - (millisecond * 6))\n\t# 下周一\n\tnextMonday = new Date(sunday.getTime() + millisecond)\n\t# 下周日\n\tnextSunday = new Date(nextMonday.getTime() + (millisecond * 6))\n\tcurrentYear = now.getFullYear()\n\tpreviousYear = currentYear - 1\n\tnextYear = currentYear + 1\n\t# 当前月份\n\tcurrentMonth = now.getMonth()\n\t# 计数年、月\n\tyear = now.getFullYear()\n\tmonth = now.getMonth()\n\t# 本月第一天\n\tfirstDay = new Date(currentYear,currentMonth,1)\n\n\t# 当为12月的时候年份需要加1\n\t# 月份需要更新为0 也就是下一年的第一个月\n\tif currentMonth == 11\n\t\tyear++\n\t\tmonth++\n\telse\n\t\tmonth++\n\t\n\t# 下月第一天\n\tnextMonthFirstDay = new Date(year, month, 1)\n\t# 下月最后一天\n\tnextMonthFinalDay = new Date(year,month,Creator.getMonthDays(year,month))\n\t# 本月最后一天\n\tlastDay = new Date(nextMonthFirstDay.getTime() - millisecond)\n\t# 上月第一天\n\tlastMonthFirstDay = Creator.getLastMonthFirstDay(currentYear,currentMonth)\n\t# 上月最后一天\n\tlastMonthFinalDay = new Date(firstDay.getTime() - millisecond)\n\t# 本季度开始日\n\tthisQuarterStartDay = new Date(currentYear,Creator.getQuarterStartMonth(currentMonth),1)\n\t# 本季度结束日\n\tthisQuarterEndDay = new Date(currentYear,Creator.getQuarterStartMonth(currentMonth)+2,Creator.getMonthDays(currentYear,Creator.getQuarterStartMonth(currentMonth)+2))\n\t# 上季度开始日\n\tlastQuarterStartDay = Creator.getLastQuarterFirstDay(currentYear,currentMonth)\n\t# 上季度结束日\n\tlastQuarterEndDay = new Date(lastQuarterStartDay.getFullYear(),lastQuarterStartDay.getMonth()+2,Creator.getMonthDays(lastQuarterStartDay.getFullYear(),lastQuarterStartDay.getMonth()+2))\n\t# 下季度开始日\n\tnextQuarterStartDay = Creator.getNextQuarterFirstDay(currentYear,currentMonth)\n\t# 下季度结束日\n\tnextQuarterEndDay = new Date(nextQuarterStartDay.getFullYear(),nextQuarterStartDay.getMonth()+2,Creator.getMonthDays(nextQuarterStartDay.getFullYear(),nextQuarterStartDay.getMonth()+2))\n\t# 过去7天 \n\tlast_7_days = new Date(now.getTime() - (6 * millisecond))\n\t# 过去30天\n\tlast_30_days = new Date(now.getTime() - (29 * millisecond))\n\t# 过去60天\n\tlast_60_days = new Date(now.getTime() - (59 * millisecond))\n\t# 过去90天\n\tlast_90_days = new Date(now.getTime() - (89 * millisecond))\n\t# 过去120天\n\tlast_120_days = new Date(now.getTime() - (119 * millisecond))\n\t# 未来7天 \n\tnext_7_days = new Date(now.getTime() + (6 * millisecond))\n\t# 未来30天\n\tnext_30_days = new Date(now.getTime() + (29 * millisecond))\n\t# 未来60天\n\tnext_60_days = new Date(now.getTime() + (59 * millisecond))\n\t# 未来90天\n\tnext_90_days = new Date(now.getTime() + (89 * millisecond))\n\t# 未来120天\n\tnext_120_days = new Date(now.getTime() + (119 * millisecond))\n\n\tswitch key\n\t\twhen \"last_year\"\n\t\t\t#去年\n\t\t\tlabel = t(\"creator_filter_operation_between_last_year\")\n\t\t\tstartValue = new Date(\"#{previousYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{previousYear}-12-31T23:59:59Z\")\n\t\twhen \"this_year\"\n\t\t\t#今年\n\t\t\tlabel = t(\"creator_filter_operation_between_this_year\")\n\t\t\tstartValue = new Date(\"#{currentYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{currentYear}-12-31T23:59:59Z\")\n\t\twhen \"next_year\"\n\t\t\t#明年\n\t\t\tlabel = t(\"creator_filter_operation_between_next_year\")\n\t\t\tstartValue = new Date(\"#{nextYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{nextYear}-12-31T23:59:59Z\")\n\t\twhen \"last_quarter\"\n\t\t\t#上季度\n\t\t\tstrFirstDay = moment(lastQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"this_quarter\"\n\t\t\t#本季度\n\t\t\tstrFirstDay = moment(thisQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(thisQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"next_quarter\"\n\t\t\t#下季度\n\t\t\tstrFirstDay = moment(nextQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(nextQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"last_month\"\n\t\t\t#上月\n\t\t\tstrFirstDay = moment(lastMonthFirstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastMonthFinalDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"this_month\"\n\t\t\t#本月\n\t\t\tstrFirstDay = moment(firstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"next_month\"\n\t\t\t#下月\n\t\t\tstrFirstDay = moment(nextMonthFirstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(nextMonthFinalDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"last_week\"\n\t\t\t#上周\n\t\t\tstrMonday = moment(lastMonday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(lastSunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"this_week\"\n\t\t\t#本周\n\t\t\tstrMonday = moment(monday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(sunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"next_week\"\n\t\t\t#下周\n\t\t\tstrMonday = moment(nextMonday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(nextSunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"yestday\"\n\t\t\t#昨天\n\t\t\tstrYestday = moment(yestday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_yestday\")\n\t\t\tstartValue = new Date(\"#{strYestday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strYestday}T23:59:59Z\")\n\t\twhen \"today\"\n\t\t\t#今天\n\t\t\tstrToday = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_today\")\n\t\t\tstartValue = new Date(\"#{strToday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strToday}T23:59:59Z\")\n\t\twhen \"tomorrow\"\n\t\t\t#明天\n\t\t\tstrTomorrow = moment(tomorrow).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_tomorrow\")\n\t\t\tstartValue = new Date(\"#{strTomorrow}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strTomorrow}T23:59:59Z\")\n\t\twhen \"last_7_days\"\n\t\t\t#过去7天\n\t\t\tstrStartDay = moment(last_7_days).format(\"YYYY-MM-DD\") \n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_7_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_30_days\"\n\t\t\t#过去30天\n\t\t\tstrStartDay = moment(last_30_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_30_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_60_days\"\n\t\t\t#过去60天\n\t\t\tstrStartDay = moment(last_60_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_60_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_90_days\"\n\t\t\t#过去90天\n\t\t\tstrStartDay = moment(last_90_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_90_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_120_days\"\n\t\t\t#过去120天\n\t\t\tstrStartDay = moment(last_120_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_120_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_7_days\"\n\t\t\t#未来7天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_7_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_7_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_30_days\"\n\t\t\t#未来30天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_30_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_30_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_60_days\"\n\t\t\t#未来60天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_60_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_60_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_90_days\"\n\t\t\t#未来90天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_90_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_90_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_120_days\"\n\t\t\t#未来120天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_120_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_120_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\n\tvalues = [startValue, endValue]\n\tif field_type == \"datetime\"\n\t\t# 时间类型字段,内置时间范围应该考虑偏移时区值,否则过滤数据存在偏差\n\t\t# 非内置时间范围时,用户通过时间控件选择的范围,会自动处理时区偏差情况\n\t\t# 日期类型字段,数据库本来就存的是UTC的0点,不存在偏差\n\t\t_.forEach values, (fv)->\n\t\t\tif fv\n\t\t\t\tfv.setHours(fv.getHours() + fv.getTimezoneOffset() / 60 )\n\t\n\treturn {\n\t\tlabel: label\n\t\tkey: key\n\t\tvalues: values\n\t}\n\nCreator.getFieldDefaultOperation = (field_type)->\n\tif field_type && Creator.checkFieldTypeSupportBetweenQuery(field_type)\n\t\treturn 'between'\n\telse if [\"textarea\", \"text\", \"code\"].includes(field_type)\n\t\treturn 'contains'\n\telse\n\t\treturn \"=\"\n\nCreator.getFieldOperation = (field_type) ->\n\t# 日期类型: date, datetime 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n\t# 文本类型: text, textarea, html 支持操作符: \"=\", \"<>\", \"contains\", \"notcontains\", \"startswith\"\n\t# 选择类型: lookup, master_detail, select 支持操作符: \"=\", \"<>\"\n\t# 数值类型: currency, number 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n\t# 布尔类型: boolean 支持操作符: \"=\", \"<>\"\n\t# 数组类型: checkbox, [text] 支持操作符: \"=\", \"<>\"\n\n\toptionals = {\n\t\tequal: {label: t(\"creator_filter_operation_equal\"), value: \"=\"},\n\t\tunequal: {label: t(\"creator_filter_operation_unequal\"), value: \"<>\"},\n\t\tless_than: {label: t(\"creator_filter_operation_less_than\"), value: \"<\"},\n\t\tgreater_than: {label: t(\"creator_filter_operation_greater_than\"), value: \">\"},\n\t\tless_or_equal: {label: t(\"creator_filter_operation_less_or_equal\"), value: \"<=\"},\n\t\tgreater_or_equal: {label: t(\"creator_filter_operation_greater_or_equal\"), value: \">=\"},\n\t\tcontains: {label: t(\"creator_filter_operation_contains\"), value: \"contains\"},\n\t\tnot_contain: {label: t(\"creator_filter_operation_does_not_contain\"), value: \"notcontains\"},\n\t\tstarts_with: {label: t(\"creator_filter_operation_starts_with\"), value: \"startswith\"},\n\t\tbetween: {label: t(\"creator_filter_operation_between\"), value: \"between\"},\n\t}\n\n\tif field_type == undefined\n\t\treturn _.values(optionals)\n\n\toperations = []\n\n\tif Creator.checkFieldTypeSupportBetweenQuery(field_type)\n\t\toperations.push(optionals.between)\n\t\tCreator.pushBetweenBuiltinOptionals(field_type, operations)\n\telse if field_type == \"text\" or field_type == \"textarea\" or field_type == \"html\" or field_type == \"code\"\n#\t\toperations.push(optionals.equal, optionals.unequal, optionals.contains, optionals.not_contain, optionals.starts_with)\n\t\toperations.push(optionals.contains)\n\telse if field_type == \"lookup\" or field_type == \"master_detail\" or field_type == \"select\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"currency\" or field_type == \"number\"\n\t\toperations.push(optionals.equal, optionals.unequal, optionals.less_than, optionals.greater_than, optionals.less_or_equal, optionals.greater_or_equal)\n\telse if field_type == \"boolean\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"checkbox\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"[text]\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse\n\t\toperations.push(optionals.equal, optionals.unequal)\n\n\treturn operations\n\n###\n 先按照有排序号的小的在前,大的在后\n 再将没有排序号的显示在\n###\nCreator.getObjectFieldsName = (object_name)->\n\tfields = Creator.getObject(object_name)?.fields\n\tfieldsArr = []\n\n\t_.each fields, (field)->\n\t\tfieldsArr.push {name: field.name, sort_no: field.sort_no}\n\n\tfieldsName = []\n\t_.each _.sortBy(fieldsArr, \"sort_no\"), (field)->\n\t\tfieldsName.push(field.name)\n\treturn fieldsName\n","Creator.getSelectOptions = function(fieldSchema) {\n var data_type, options;\n options = fieldSchema.options;\n if (!options) {\n return;\n }\n data_type = fieldSchema.data_type;\n if (!_.isFunction(options) && data_type && data_type !== 'text') {\n options.forEach(function(optionItem) {\n if (typeof optionItem.value !== 'string') {\n return;\n }\n if (['number', 'currency', 'percent'].indexOf(data_type) > -1) {\n return optionItem.value = Number(optionItem.value);\n } else if (data_type === 'boolean') {\n return optionItem.value = optionItem.value === 'true';\n }\n });\n }\n return options;\n};\n\nCreator.getObjectSchema = function(obj) {\n var fieldsArr, schema;\n if (!obj) {\n return;\n }\n schema = {};\n fieldsArr = [];\n _.each(obj.fields, function(field, field_name) {\n if (!_.has(field, \"name\")) {\n field.name = field_name;\n }\n return fieldsArr.push(field);\n });\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field) {\n var _object, _ref_obj, _reference_to, autoform_type, collectionName, field_name, fs, fsType, isUnLimited, permissions, ref, ref1;\n field_name = field.name;\n fs = {};\n if (field.regEx) {\n fs.regEx = field.regEx;\n }\n fs.autoform = {};\n fs.autoform.multiple = field.multiple;\n fs.autoform.reference_to = field.reference_to;\n autoform_type = (ref = field.autoform) != null ? ref.type : void 0;\n if (field.type === \"text\" || field.type === \"phone\") {\n fs.type = String;\n if (field.multiple) {\n fs.type = [String];\n fs.autoform.type = \"tags\";\n }\n } else if (field.type === \"[text]\" || field.type === \"[phone]\") {\n fs.type = [String];\n fs.autoform.type = \"tags\";\n } else if (field.type === 'code') {\n fs.type = String;\n fs.autoform.type = \"widearea\";\n fs.autoform.rows = field.rows || 12;\n if (field.language) {\n fs.autoform.language = field.language;\n }\n } else if (field.type === \"textarea\") {\n fs.type = String;\n fs.autoform.type = \"widearea\";\n fs.autoform.rows = field.rows || 2;\n } else if (field.type === \"password\") {\n fs.type = String;\n fs.autoform.type = \"password\";\n } else if (field.type === \"date\") {\n fs.type = Date;\n if (Meteor.isClient) {\n if (Steedos.isMobile() || Steedos.isPad()) {\n if (Steedos.isiOS()) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"date\",\n displayFormat: \"yyyy-MM-dd\",\n pickerType: \"rollers\"\n }\n };\n } else {\n fs.autoform.afFieldInput = {\n type: \"steedos-date-mobile\",\n dateMobileOptions: {\n type: \"date\"\n }\n };\n }\n } else {\n fs.autoform.outFormat = 'yyyy-MM-dd';\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"date\",\n displayFormat: \"yyyy-MM-dd\"\n }\n };\n }\n }\n } else if (field.type === \"time\") {\n fs.type = Date;\n if (Meteor.isClient) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"time\",\n displayFormat: \"HH:mm\"\n }\n };\n }\n } else if (field.type === \"datetime\") {\n fs.type = Date;\n if (Meteor.isClient) {\n if (Steedos.isMobile() || Steedos.isPad()) {\n if (Steedos.isiOS()) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n dxDateBoxOptions: {\n type: \"datetime\",\n displayFormat: \"yyyy-MM-dd HH:mm\",\n pickerType: \"rollers\"\n }\n };\n } else {\n fs.autoform.afFieldInput = {\n type: \"steedos-date-mobile\",\n dateMobileOptions: {\n type: \"datetime\"\n }\n };\n }\n } else {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n dxDateBoxOptions: {\n type: \"datetime\",\n displayFormat: \"yyyy-MM-dd HH:mm\"\n }\n };\n }\n }\n } else if (field.type === \"[Object]\") {\n fs.type = [Object];\n } else if (field.type === \"html\") {\n fs.type = String;\n if (Meteor.isClient) {\n fs.autoform.type = 'steedosHtml';\n }\n } else if (field.type === \"lookup\" || field.type === \"master_detail\") {\n fs.type = String;\n fs.autoform.showIcon = field.showIcon;\n if (field.multiple) {\n fs.type = [String];\n }\n if (!field.hidden) {\n fs.autoform.filters = field.filters;\n fs.autoform.dependOn = field.depend_on;\n if (field.beforeOpenFunction) {\n fs.beforeOpenFunction = field.beforeOpenFunction;\n }\n fs.filtersFunction = field.filtersFunction ? field.filtersFunction : Creator.evaluateFilters;\n if (field.optionsFunction) {\n fs.optionsFunction = field.optionsFunction;\n }\n if (field.reference_to) {\n if (Meteor.isClient) {\n if (field.createFunction && _.isFunction(field.createFunction)) {\n fs.createFunction = field.createFunction;\n } else {\n if (_.isString(field.reference_to)) {\n _ref_obj = Creator.Objects[field.reference_to];\n if (_ref_obj != null ? (ref1 = _ref_obj.permissions) != null ? ref1.allowCreate : void 0 : void 0) {\n fs.autoform.create = true;\n fs.createFunction = function(lookup_field) {\n return Modal.show(\"CreatorObjectModal\", {\n collection: \"Creator.Collections.\" + (Creator.getCollection(field.reference_to)._name),\n formId: \"new\" + (field.reference_to.replace('.', '_')),\n object_name: \"\" + field.reference_to,\n operation: \"insert\",\n onSuccess: function(operation, result) {\n var object;\n object = Creator.getObject(result.object_name);\n if (result.object_name === \"objects\") {\n return lookup_field.addItems([\n {\n label: result.value.label,\n value: result.value.name,\n icon: result.value.icon\n }\n ], result.value.name);\n } else {\n return lookup_field.addItems([\n {\n label: result.value[object.NAME_FIELD_KEY] || result.value.label || result.value.name,\n value: result._id\n }\n ], result._id);\n }\n }\n });\n };\n } else {\n fs.autoform.create = false;\n }\n }\n }\n }\n if (_.isBoolean(field.create)) {\n fs.autoform.create = field.create;\n }\n if (field.reference_sort) {\n fs.autoform.optionsSort = field.reference_sort;\n }\n if (field.reference_limit) {\n fs.autoform.optionsLimit = field.reference_limit;\n }\n if (field.reference_to_field) {\n fs.autoform.referenceToField = field.reference_to_field;\n }\n if (field.reference_to === \"users\") {\n fs.autoform.type = \"selectuser\";\n if (!field.hidden && !field.omit) {\n if (field.is_company_limited === void 0) {\n if (Meteor.isClient) {\n permissions = obj.permissions;\n isUnLimited = permissions != null ? permissions.viewAllRecords : void 0;\n if (_.include([\"organizations\", \"users\", \"space_users\"], obj.name)) {\n isUnLimited = permissions != null ? permissions.modifyAllRecords : void 0;\n }\n if (isUnLimited) {\n fs.autoform.is_company_limited = false;\n } else {\n fs.autoform.is_company_limited = true;\n }\n }\n } else if (_.isFunction(field.is_company_limited)) {\n if (Meteor.isClient) {\n fs.autoform.is_company_limited = field.is_company_limited(obj.permissions);\n } else {\n fs.autoform.is_company_limited = true;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else if (field.reference_to === \"organizations\") {\n fs.autoform.type = \"selectorg\";\n if (!field.hidden && !field.omit) {\n if (field.is_company_limited === void 0) {\n if (Meteor.isClient) {\n permissions = obj.permissions;\n isUnLimited = permissions != null ? permissions.viewAllRecords : void 0;\n if (_.include([\"organizations\", \"users\", \"space_users\"], obj.name)) {\n isUnLimited = permissions != null ? permissions.modifyAllRecords : void 0;\n }\n if (isUnLimited) {\n fs.autoform.is_company_limited = false;\n } else {\n fs.autoform.is_company_limited = true;\n }\n }\n } else if (_.isFunction(field.is_company_limited)) {\n if (Meteor.isClient) {\n fs.autoform.is_company_limited = field.is_company_limited(obj.permissions);\n } else {\n fs.autoform.is_company_limited = true;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n if (typeof field.reference_to === \"function\") {\n _reference_to = field.reference_to();\n } else {\n _reference_to = field.reference_to;\n }\n if (_.isArray(_reference_to)) {\n fs.type = Object;\n fs.blackbox = true;\n fs.autoform.objectSwitche = true;\n schema[field_name + \".o\"] = {\n type: String,\n autoform: {\n omit: true\n }\n };\n schema[field_name + \".ids\"] = {\n type: [String],\n autoform: {\n omit: true\n }\n };\n } else {\n _reference_to = [_reference_to];\n }\n _object = Creator.Objects[_reference_to[0]];\n if (_object && _object.enable_tree) {\n fs.autoform.type = \"selectTree\";\n } else {\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.optionsMethod = field.optionsMethod || \"creator.object_options\";\n if (Meteor.isClient) {\n fs.autoform.optionsMethodParams = function() {\n return {\n space: Session.get(\"spaceId\")\n };\n };\n fs.autoform.references = [];\n _reference_to.forEach(function(_reference) {\n _object = Creator.Objects[_reference];\n if (_object) {\n return fs.autoform.references.push({\n object: _reference,\n label: _object != null ? _object.label : void 0,\n icon: _object != null ? _object.icon : void 0,\n link: function() {\n return \"/app/\" + (Session.get('app_id')) + \"/\" + _reference + \"/view/\";\n }\n });\n } else {\n return fs.autoform.references.push({\n object: _reference,\n link: function() {\n return \"/app/\" + (Session.get('app_id')) + \"/\" + _reference + \"/view/\";\n }\n });\n }\n });\n }\n }\n }\n } else {\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.defaultIcon = field.defaultIcon;\n }\n }\n } else if (field.type === \"select\") {\n fs.type = String;\n if (field.multiple) {\n fs.type = [String];\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.showIcon = false;\n fs.autoform.options = field.options;\n } else {\n fs.autoform.type = \"select\";\n fs.autoform.options = field.options;\n if (_.has(field, 'firstOption')) {\n fs.autoform.firstOption = field.firstOption;\n } else {\n fs.autoform.firstOption = \"\";\n }\n }\n if (field.data_type && field.data_type !== \"text\") {\n if ([\"number\", \"currency\", \"percent\"].indexOf(field.data_type) > -1) {\n fsType = Number;\n fs.decimal = true;\n } else if (field.data_type === \"boolean\") {\n fsType = Boolean;\n } else {\n fsType = String;\n }\n fs.type = fsType;\n if (field.multiple) {\n fs.type = [fsType];\n }\n fs.autoform.options = Creator.getSelectOptions(field);\n }\n } else if (field.type === \"currency\") {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (field != null ? field.scale : void 0) {\n fs.autoform.scale = field.scale;\n fs.decimal = true;\n } else if ((field != null ? field.scale : void 0) !== 0) {\n fs.autoform.scale = 2;\n fs.decimal = true;\n }\n } else if (field.type === \"number\") {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (field != null ? field.scale : void 0) {\n fs.autoform.scale = field.scale;\n fs.decimal = true;\n }\n } else if (field.type === \"boolean\") {\n fs.type = Boolean;\n if (field.readonly) {\n fs.autoform.disabled = true;\n }\n fs.autoform.type = \"steedos-boolean-checkbox\";\n } else if (field.type === \"toggle\") {\n fs.type = Boolean;\n if (field.readonly) {\n fs.autoform.disabled = true;\n }\n fs.autoform.type = \"steedos-boolean-toggle\";\n } else if (field.type === \"reference\") {\n fs.type = String;\n } else if (field.type === \"checkbox\") {\n fs.type = [String];\n fs.autoform.type = \"select-checkbox\";\n fs.autoform.options = field.options;\n } else if (field.type === \"file\") {\n collectionName = field.collection || \"files\";\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: collectionName\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = collectionName;\n }\n } else if (field.type === \"filesize\") {\n fs.type = Number;\n fs.autoform.type = 'filesize';\n } else if (field.type === \"Object\" || field.type === \"object\") {\n fs.type = Object;\n } else if (field.type === \"grid\" || field.type === \"table\") {\n fs.type = Array;\n fs.autoform.editable = true;\n fs.autoform.type = \"steedosGrid\";\n schema[field_name + \".$\"] = {\n type: Object\n };\n } else if (field.type === \"image\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'images',\n accept: 'image/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'images';\n fs.autoform.accept = 'image/*';\n }\n } else if (field.type === \"avatar\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'avatars',\n accept: 'image/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'avatars';\n fs.autoform.accept = 'image/*';\n }\n } else if (field.type === \"audio\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'audios',\n accept: 'audio/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'audios';\n fs.autoform.accept = 'audio/*';\n }\n } else if (field.type === \"video\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'videos',\n accept: 'video/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'videos';\n fs.autoform.accept = 'video/*';\n }\n } else if (field.type === \"location\") {\n fs.type = Object;\n fs.autoform.type = \"location\";\n fs.autoform.system = field.system || \"wgs84\";\n fs.blackbox = true;\n } else if (field.type === \"markdown\") {\n fs.type = String;\n fs.autoform.type = \"text\";\n } else if (field.type === 'url') {\n fs.type = String;\n fs.autoform.type = 'steedosUrl';\n } else if (field.type === 'email') {\n fs.type = String;\n fs.regEx = SimpleSchema.RegEx.Email;\n fs.autoform.type = 'steedosEmail';\n } else if (field.type === 'autonumber') {\n fs.type = String;\n } else if (field.type === 'color') {\n fs.type = String;\n } else if (field.type === 'formula') {\n fs = Creator.getObjectSchema({\n fields: {\n field: Object.assign({}, field, {\n type: field.data_type\n })\n }\n })[field.name];\n } else if (field.type === 'summary') {\n fs = Creator.getObjectSchema({\n fields: {\n field: Object.assign({}, field, {\n type: field.data_type\n })\n }\n })[field.name];\n } else if (field.type === 'percent') {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (!_.isNumber(field.scale)) {\n field.scale = 0;\n }\n fs.autoform.scale = field.scale + 2;\n fs.decimal = true;\n } else {\n fs.type = field.type;\n }\n if (field.label) {\n fs.label = field.label;\n }\n if (!field.required) {\n fs.optional = true;\n }\n if (!Meteor.isClient) {\n fs.optional = true;\n }\n if (field.unique) {\n fs.unique = true;\n }\n if (field.omit) {\n fs.autoform.omit = true;\n }\n if (field.group) {\n fs.autoform.group = field.group;\n }\n if (field.is_wide) {\n fs.autoform.is_wide = true;\n }\n if (field.hidden) {\n fs.autoform.type = \"hidden\";\n }\n if ((field.type === \"select\") || (field.type === \"lookup\") || (field.type === \"master_detail\")) {\n if (typeof field.filterable === 'undefined') {\n field.filterable = true;\n }\n }\n if (field.name === 'name' || field.is_name) {\n if (typeof field.searchable === 'undefined') {\n field.searchable = true;\n }\n }\n if (autoform_type) {\n fs.autoform.type = autoform_type;\n }\n if (field.defaultValue) {\n if (Meteor.isClient && Creator.Formular.checkFormula(field.defaultValue)) {\n fs.autoform.defaultValue = function() {\n return Creator.Formular.run(field.defaultValue, {\n userId: Meteor.userId(),\n spaceId: Session.get(\"spaceId\"),\n now: new Date()\n });\n };\n } else {\n fs.autoform.defaultValue = field.defaultValue;\n }\n }\n if (field.readonly) {\n fs.autoform.readonly = true;\n }\n if (field.disabled) {\n fs.autoform.disabled = true;\n }\n if (field.inlineHelpText) {\n fs.autoform.inlineHelpText = field.inlineHelpText;\n }\n if (field.blackbox) {\n fs.blackbox = true;\n }\n if (_.has(field, 'min')) {\n fs.min = field.min;\n }\n if (_.has(field, 'max')) {\n fs.max = field.max;\n }\n if (Meteor.isProduction) {\n if (field.index) {\n fs.index = field.index;\n } else if (field.sortable) {\n fs.index = true;\n }\n }\n return schema[field_name] = fs;\n });\n return schema;\n};\n\nCreator.getFieldDisplayValue = function(object_name, field_name, field_value) {\n var field, html, object;\n html = field_value;\n object = Creator.getObject(object_name);\n if (!object) {\n return \"\";\n }\n field = object.fields(field_name);\n if (!field) {\n return \"\";\n }\n if (field.type === \"datetime\") {\n html = moment(this.val).format('YYYY-MM-DD H:mm');\n } else if (field.type === \"date\") {\n html = moment(this.val).format('YYYY-MM-DD');\n }\n return html;\n};\n\nCreator.checkFieldTypeSupportBetweenQuery = function(field_type) {\n return [\"date\", \"datetime\", \"time\", \"currency\", \"number\"].includes(field_type);\n};\n\nCreator.pushBetweenBuiltinOptionals = function(field_type, operations) {\n var builtinValues;\n builtinValues = Creator.getBetweenBuiltinValues(field_type);\n if (builtinValues) {\n return _.forEach(builtinValues, function(builtinItem, key) {\n return operations.push({\n label: builtinItem.label,\n value: key\n });\n });\n }\n};\n\nCreator.getBetweenBuiltinValues = function(field_type, is_check_only) {\n if ([\"date\", \"datetime\"].includes(field_type)) {\n return Creator.getBetweenTimeBuiltinValues(is_check_only, field_type);\n }\n};\n\nCreator.getBetweenBuiltinValueItem = function(field_type, key) {\n if ([\"date\", \"datetime\"].includes(field_type)) {\n return Creator.getBetweenTimeBuiltinValueItem(field_type, key);\n }\n};\n\nCreator.getBetweenBuiltinOperation = function(field_type, value) {\n var betweenBuiltinValues, result;\n if (!_.isString(value)) {\n return;\n }\n betweenBuiltinValues = Creator.getBetweenBuiltinValues(field_type);\n if (!betweenBuiltinValues) {\n return;\n }\n result = null;\n _.each(betweenBuiltinValues, function(item, operation) {\n if (item.key === value) {\n return result = operation;\n }\n });\n return result;\n};\n\nCreator.getBetweenTimeBuiltinValues = function(is_check_only, field_type) {\n return {\n \"between_time_last_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_year\"),\n \"between_time_this_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_year\"),\n \"between_time_next_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_year\"),\n \"between_time_last_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_quarter\"),\n \"between_time_this_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_quarter\"),\n \"between_time_next_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_quarter\"),\n \"between_time_last_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_month\"),\n \"between_time_this_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_month\"),\n \"between_time_next_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_month\"),\n \"between_time_last_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_week\"),\n \"between_time_this_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_week\"),\n \"between_time_next_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_week\"),\n \"between_time_yestday\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"yestday\"),\n \"between_time_today\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"today\"),\n \"between_time_tomorrow\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"tomorrow\"),\n \"between_time_last_7_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_7_days\"),\n \"between_time_last_30_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_30_days\"),\n \"between_time_last_60_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_60_days\"),\n \"between_time_last_90_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_90_days\"),\n \"between_time_last_120_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_120_days\"),\n \"between_time_next_7_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_7_days\"),\n \"between_time_next_30_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_30_days\"),\n \"between_time_next_60_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_60_days\"),\n \"between_time_next_90_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_90_days\"),\n \"between_time_next_120_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_120_days\")\n };\n};\n\nCreator.getQuarterStartMonth = function(month) {\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n return 0;\n } else if (month < 6) {\n return 3;\n } else if (month < 9) {\n return 6;\n }\n return 9;\n};\n\nCreator.getLastQuarterFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n year--;\n month = 9;\n } else if (month < 6) {\n month = 0;\n } else if (month < 9) {\n month = 3;\n } else {\n month = 6;\n }\n return new Date(year, month, 1);\n};\n\nCreator.getNextQuarterFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n month = 3;\n } else if (month < 6) {\n month = 6;\n } else if (month < 9) {\n month = 9;\n } else {\n year++;\n month = 0;\n }\n return new Date(year, month, 1);\n};\n\nCreator.getMonthDays = function(year, month) {\n var days, endDate, millisecond, startDate;\n if (month === 11) {\n return 31;\n }\n millisecond = 1000 * 60 * 60 * 24;\n startDate = new Date(year, month, 1);\n endDate = new Date(year, month + 1, 1);\n days = (endDate - startDate) / millisecond;\n return days;\n};\n\nCreator.getLastMonthFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month === 0) {\n month = 11;\n year--;\n return new Date(year, month, 1);\n }\n month--;\n return new Date(year, month, 1);\n};\n\nCreator.getBetweenTimeBuiltinValueItem = function(field_type, key) {\n var currentMonth, currentYear, endValue, firstDay, label, lastDay, lastMonday, lastMonthFinalDay, lastMonthFirstDay, lastQuarterEndDay, lastQuarterStartDay, lastSunday, last_120_days, last_30_days, last_60_days, last_7_days, last_90_days, millisecond, minusDay, monday, month, nextMonday, nextMonthFinalDay, nextMonthFirstDay, nextQuarterEndDay, nextQuarterStartDay, nextSunday, nextYear, next_120_days, next_30_days, next_60_days, next_7_days, next_90_days, now, previousYear, startValue, strEndDay, strFirstDay, strLastDay, strMonday, strStartDay, strSunday, strToday, strTomorrow, strYestday, sunday, thisQuarterEndDay, thisQuarterStartDay, tomorrow, values, week, year, yestday;\n now = new Date();\n millisecond = 1000 * 60 * 60 * 24;\n yestday = new Date(now.getTime() - millisecond);\n tomorrow = new Date(now.getTime() + millisecond);\n week = now.getDay();\n minusDay = week !== 0 ? week - 1 : 6;\n monday = new Date(now.getTime() - (minusDay * millisecond));\n sunday = new Date(monday.getTime() + (6 * millisecond));\n lastSunday = new Date(monday.getTime() - millisecond);\n lastMonday = new Date(lastSunday.getTime() - (millisecond * 6));\n nextMonday = new Date(sunday.getTime() + millisecond);\n nextSunday = new Date(nextMonday.getTime() + (millisecond * 6));\n currentYear = now.getFullYear();\n previousYear = currentYear - 1;\n nextYear = currentYear + 1;\n currentMonth = now.getMonth();\n year = now.getFullYear();\n month = now.getMonth();\n firstDay = new Date(currentYear, currentMonth, 1);\n if (currentMonth === 11) {\n year++;\n month++;\n } else {\n month++;\n }\n nextMonthFirstDay = new Date(year, month, 1);\n nextMonthFinalDay = new Date(year, month, Creator.getMonthDays(year, month));\n lastDay = new Date(nextMonthFirstDay.getTime() - millisecond);\n lastMonthFirstDay = Creator.getLastMonthFirstDay(currentYear, currentMonth);\n lastMonthFinalDay = new Date(firstDay.getTime() - millisecond);\n thisQuarterStartDay = new Date(currentYear, Creator.getQuarterStartMonth(currentMonth), 1);\n thisQuarterEndDay = new Date(currentYear, Creator.getQuarterStartMonth(currentMonth) + 2, Creator.getMonthDays(currentYear, Creator.getQuarterStartMonth(currentMonth) + 2));\n lastQuarterStartDay = Creator.getLastQuarterFirstDay(currentYear, currentMonth);\n lastQuarterEndDay = new Date(lastQuarterStartDay.getFullYear(), lastQuarterStartDay.getMonth() + 2, Creator.getMonthDays(lastQuarterStartDay.getFullYear(), lastQuarterStartDay.getMonth() + 2));\n nextQuarterStartDay = Creator.getNextQuarterFirstDay(currentYear, currentMonth);\n nextQuarterEndDay = new Date(nextQuarterStartDay.getFullYear(), nextQuarterStartDay.getMonth() + 2, Creator.getMonthDays(nextQuarterStartDay.getFullYear(), nextQuarterStartDay.getMonth() + 2));\n last_7_days = new Date(now.getTime() - (6 * millisecond));\n last_30_days = new Date(now.getTime() - (29 * millisecond));\n last_60_days = new Date(now.getTime() - (59 * millisecond));\n last_90_days = new Date(now.getTime() - (89 * millisecond));\n last_120_days = new Date(now.getTime() - (119 * millisecond));\n next_7_days = new Date(now.getTime() + (6 * millisecond));\n next_30_days = new Date(now.getTime() + (29 * millisecond));\n next_60_days = new Date(now.getTime() + (59 * millisecond));\n next_90_days = new Date(now.getTime() + (89 * millisecond));\n next_120_days = new Date(now.getTime() + (119 * millisecond));\n switch (key) {\n case \"last_year\":\n label = t(\"creator_filter_operation_between_last_year\");\n startValue = new Date(previousYear + \"-01-01T00:00:00Z\");\n endValue = new Date(previousYear + \"-12-31T23:59:59Z\");\n break;\n case \"this_year\":\n label = t(\"creator_filter_operation_between_this_year\");\n startValue = new Date(currentYear + \"-01-01T00:00:00Z\");\n endValue = new Date(currentYear + \"-12-31T23:59:59Z\");\n break;\n case \"next_year\":\n label = t(\"creator_filter_operation_between_next_year\");\n startValue = new Date(nextYear + \"-01-01T00:00:00Z\");\n endValue = new Date(nextYear + \"-12-31T23:59:59Z\");\n break;\n case \"last_quarter\":\n strFirstDay = moment(lastQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"this_quarter\":\n strFirstDay = moment(thisQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(thisQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"next_quarter\":\n strFirstDay = moment(nextQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(nextQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"last_month\":\n strFirstDay = moment(lastMonthFirstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastMonthFinalDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"this_month\":\n strFirstDay = moment(firstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"next_month\":\n strFirstDay = moment(nextMonthFirstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(nextMonthFinalDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"last_week\":\n strMonday = moment(lastMonday).format(\"YYYY-MM-DD\");\n strSunday = moment(lastSunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"this_week\":\n strMonday = moment(monday).format(\"YYYY-MM-DD\");\n strSunday = moment(sunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"next_week\":\n strMonday = moment(nextMonday).format(\"YYYY-MM-DD\");\n strSunday = moment(nextSunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"yestday\":\n strYestday = moment(yestday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_yestday\");\n startValue = new Date(strYestday + \"T00:00:00Z\");\n endValue = new Date(strYestday + \"T23:59:59Z\");\n break;\n case \"today\":\n strToday = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_today\");\n startValue = new Date(strToday + \"T00:00:00Z\");\n endValue = new Date(strToday + \"T23:59:59Z\");\n break;\n case \"tomorrow\":\n strTomorrow = moment(tomorrow).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_tomorrow\");\n startValue = new Date(strTomorrow + \"T00:00:00Z\");\n endValue = new Date(strTomorrow + \"T23:59:59Z\");\n break;\n case \"last_7_days\":\n strStartDay = moment(last_7_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_7_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_30_days\":\n strStartDay = moment(last_30_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_30_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_60_days\":\n strStartDay = moment(last_60_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_60_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_90_days\":\n strStartDay = moment(last_90_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_90_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_120_days\":\n strStartDay = moment(last_120_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_120_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_7_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_7_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_7_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_30_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_30_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_30_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_60_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_60_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_60_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_90_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_90_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_90_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_120_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_120_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_120_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n }\n values = [startValue, endValue];\n if (field_type === \"datetime\") {\n _.forEach(values, function(fv) {\n if (fv) {\n return fv.setHours(fv.getHours() + fv.getTimezoneOffset() / 60);\n }\n });\n }\n return {\n label: label,\n key: key,\n values: values\n };\n};\n\nCreator.getFieldDefaultOperation = function(field_type) {\n if (field_type && Creator.checkFieldTypeSupportBetweenQuery(field_type)) {\n return 'between';\n } else if ([\"textarea\", \"text\", \"code\"].includes(field_type)) {\n return 'contains';\n } else {\n return \"=\";\n }\n};\n\nCreator.getFieldOperation = function(field_type) {\n var operations, optionals;\n optionals = {\n equal: {\n label: t(\"creator_filter_operation_equal\"),\n value: \"=\"\n },\n unequal: {\n label: t(\"creator_filter_operation_unequal\"),\n value: \"<>\"\n },\n less_than: {\n label: t(\"creator_filter_operation_less_than\"),\n value: \"<\"\n },\n greater_than: {\n label: t(\"creator_filter_operation_greater_than\"),\n value: \">\"\n },\n less_or_equal: {\n label: t(\"creator_filter_operation_less_or_equal\"),\n value: \"<=\"\n },\n greater_or_equal: {\n label: t(\"creator_filter_operation_greater_or_equal\"),\n value: \">=\"\n },\n contains: {\n label: t(\"creator_filter_operation_contains\"),\n value: \"contains\"\n },\n not_contain: {\n label: t(\"creator_filter_operation_does_not_contain\"),\n value: \"notcontains\"\n },\n starts_with: {\n label: t(\"creator_filter_operation_starts_with\"),\n value: \"startswith\"\n },\n between: {\n label: t(\"creator_filter_operation_between\"),\n value: \"between\"\n }\n };\n if (field_type === void 0) {\n return _.values(optionals);\n }\n operations = [];\n if (Creator.checkFieldTypeSupportBetweenQuery(field_type)) {\n operations.push(optionals.between);\n Creator.pushBetweenBuiltinOptionals(field_type, operations);\n } else if (field_type === \"text\" || field_type === \"textarea\" || field_type === \"html\" || field_type === \"code\") {\n operations.push(optionals.contains);\n } else if (field_type === \"lookup\" || field_type === \"master_detail\" || field_type === \"select\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"currency\" || field_type === \"number\") {\n operations.push(optionals.equal, optionals.unequal, optionals.less_than, optionals.greater_than, optionals.less_or_equal, optionals.greater_or_equal);\n } else if (field_type === \"boolean\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"checkbox\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"[text]\") {\n operations.push(optionals.equal, optionals.unequal);\n } else {\n operations.push(optionals.equal, optionals.unequal);\n }\n return operations;\n};\n\n\n/*\n 先按照有排序号的小的在前,大的在后\n 再将没有排序号的显示在\n */\n\nCreator.getObjectFieldsName = function(object_name) {\n var fields, fieldsArr, fieldsName, ref;\n fields = (ref = Creator.getObject(object_name)) != null ? ref.fields : void 0;\n fieldsArr = [];\n _.each(fields, function(field) {\n return fieldsArr.push({\n name: field.name,\n sort_no: field.sort_no\n });\n });\n fieldsName = [];\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field) {\n return fieldsName.push(field.name);\n });\n return fieldsName;\n};\n","Creator._trigger_hooks = {}\n\ninitTrigger = (object_name, trigger)->\n\ttry\n\t\tcollection = Creator.getCollection(object_name)\n\t\tif !trigger.todo\n\t\t\treturn\n\t\ttodoWrapper = ()->\n\t\t\t this.object_name = object_name\n\t\t\t return trigger.todo.apply(this, arguments)\n\t\tif trigger.when == \"before.insert\"\n\t\t\t return collection?.before?.insert(todoWrapper)\n\t\t else if trigger.when == \"before.update\"\n\t\t\t return collection?.before?.update(todoWrapper)\n\t\t else if trigger.when == \"before.remove\"\n\t\t\t return collection?.before?.remove(todoWrapper)\n\t\t else if trigger.when == \"after.insert\"\n\t\t\t return collection?.after?.insert(todoWrapper)\n\t\t else if trigger.when == \"after.update\"\n\t\t\t return collection?.after?.update(todoWrapper)\n\t\t else if trigger.when == \"after.remove\"\n\t\t\t return collection?.after?.remove(todoWrapper)\n\tcatch error\n\t\tconsole.error('initTrigger error', error)\n\ncleanTrigger = (object_name)->\n\t###\n \t由于collection-hooks package 的remove函数是使用下标删除对象的,所以此处反转hooks集合后,再删除\n \t因为一个数组元素删除后,其他元素的下标会发生变化\n\t###\n #TODO 由于collection-hooks package 的remove函数bug\n\tCreator._trigger_hooks[object_name]?.reverse().forEach (_hook)->\n\t\t_hook.remove()\n\nCreator.initTriggers = (object_name)->\n#\tconsole.log('Creator.initTriggers object_name', object_name)\n\tobj = Creator.getObject(object_name)\n\n\tcleanTrigger(object_name)\n\n\tCreator._trigger_hooks[object_name] = []\n\n\t_.each obj.triggers, (trigger, trigger_name)->\n\t\tif Meteor.isServer and trigger.on == \"server\" and trigger.todo and trigger.when\n\t\t\t_trigger_hook = initTrigger object_name, trigger\n\t\t\tif _trigger_hook\n\t\t\t\tCreator._trigger_hooks[object_name].push(_trigger_hook)\n\t\tif Meteor.isClient and trigger.on == \"client\" and trigger.todo and trigger.when\n\t\t\t_trigger_hook = initTrigger object_name, trigger\n\t\t\tCreator._trigger_hooks[object_name].push(_trigger_hook)","var cleanTrigger, initTrigger;\n\nCreator._trigger_hooks = {};\n\ninitTrigger = function(object_name, trigger) {\n var collection, error, ref, ref1, ref2, ref3, ref4, ref5, todoWrapper;\n try {\n collection = Creator.getCollection(object_name);\n if (!trigger.todo) {\n return;\n }\n todoWrapper = function() {\n this.object_name = object_name;\n return trigger.todo.apply(this, arguments);\n };\n if (trigger.when === \"before.insert\") {\n return collection != null ? (ref = collection.before) != null ? ref.insert(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"before.update\") {\n return collection != null ? (ref1 = collection.before) != null ? ref1.update(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"before.remove\") {\n return collection != null ? (ref2 = collection.before) != null ? ref2.remove(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.insert\") {\n return collection != null ? (ref3 = collection.after) != null ? ref3.insert(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.update\") {\n return collection != null ? (ref4 = collection.after) != null ? ref4.update(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.remove\") {\n return collection != null ? (ref5 = collection.after) != null ? ref5.remove(todoWrapper) : void 0 : void 0;\n }\n } catch (error1) {\n error = error1;\n return console.error('initTrigger error', error);\n }\n};\n\ncleanTrigger = function(object_name) {\n\n /*\n \t由于collection-hooks package 的remove函数是使用下标删除对象的,所以此处反转hooks集合后,再删除\n \t因为一个数组元素删除后,其他元素的下标会发生变化\n */\n var ref;\n return (ref = Creator._trigger_hooks[object_name]) != null ? ref.reverse().forEach(function(_hook) {\n return _hook.remove();\n }) : void 0;\n};\n\nCreator.initTriggers = function(object_name) {\n var obj;\n obj = Creator.getObject(object_name);\n cleanTrigger(object_name);\n Creator._trigger_hooks[object_name] = [];\n return _.each(obj.triggers, function(trigger, trigger_name) {\n var _trigger_hook;\n if (Meteor.isServer && trigger.on === \"server\" && trigger.todo && trigger.when) {\n _trigger_hook = initTrigger(object_name, trigger);\n if (_trigger_hook) {\n Creator._trigger_hooks[object_name].push(_trigger_hook);\n }\n }\n if (Meteor.isClient && trigger.on === \"client\" && trigger.todo && trigger.when) {\n _trigger_hook = initTrigger(object_name, trigger);\n return Creator._trigger_hooks[object_name].push(_trigger_hook);\n }\n });\n};\n","clone = require('clone')\n\nbaseBooleanPermissionPropNames = [\"allowCreate\", \"allowDelete\", \"allowEdit\", \"allowRead\", \"modifyAllRecords\", \"viewAllRecords\", \"modifyCompanyRecords\", \"viewCompanyRecords\", \n\t\"allowReadFiles\", \"allowEditFiles\", \"allowCreateFiles\", \"allowDeleteFiles\", \"viewAllFiles\", \"modifyAllFiles\"] \notherPermissionPropNames = [\"disabled_list_views\", \"disabled_actions\", \"unreadable_fields\", \"uneditable_fields\", \"unrelated_objects\", \"uneditable_related_list\"]\npermissionPropNames = _.union baseBooleanPermissionPropNames, otherPermissionPropNames\n\nCreator.getPermissions = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tobj = Creator.getObject(object_name)\n\t\tif !obj\n\t\t\treturn\n\t\treturn obj.permissions.get()\n\telse if Meteor.isServer\n\t\tCreator.getObjectPermissions(spaceId, userId, object_name)\n\nCreator.getRecordPermissions = (object_name, record, userId, spaceId)->\n\tif !object_name and Meteor.isClient\n\t\tobject_name = Session.get(\"object_name\")\n\n\tif !spaceId and Meteor.isClient\n\t\tspaceId = Session.get(\"spaceId\")\n\t\n\t# 附件权限不再与其父记录编辑配置关联\n\t# if record and object_name == \"cms_files\" and Meteor.isClient\n\t# \t# 如果是cms_files附件,则权限取其父记录权限\n\t# \tif object_name == Session.get('object_name')\n\t# \t\t# 当前处于cms_files附件详细界面\n\t# \t\tobject_name = record.parent['reference_to._o'];\n\t# \t\trecord_id = record.parent._id;\n\t# \telse \n\t# \t\t# 当前处于cms_files附件的父记录界面\n\t# \t\tobject_name = Session.get('object_name');\n\t# \t\trecord_id = Session.get(\"record_id\");\n\t# \tobject_fields_keys = _.keys(Creator.getObject(object_name, spaceId)?.fields or {}) || [];\n\t# \tselect = _.intersection(object_fields_keys, ['owner', 'company_id', 'company_ids', 'locked']) || [];\n\t# \tif select.length > 0\n\t# \t\trecord = Creator.getObjectRecord(object_name, record_id, select.join(','));\n\t# \telse\n\t# \t\trecord = null;\n\n\tpermissions = _.clone(Creator.getPermissions(object_name, spaceId, userId))\n\n\tif record\n\t\tif !_.isEmpty(record.record_permissions)\n\t\t\treturn record.record_permissions\n\n\t\tisOwner = record.owner == userId || record.owner?._id == userId\n\n\t\tif object_name == \"cms_files\"\n\t\t\t# 附件的查看所有修改所有权限与附件对象的viewAllRecords、modifyAllRecords无关,只与其主表记录的viewAllFiles和modifyAllFiles有关\n\t\t\t# 如果是cms_files附件,则权限需要额外考虑其父对象上关于附件的权限配置\n\t\t\tmasterObjectName = record.parent['reference_to._o'];\n\t\t\tmasterRecordPerm = Creator.getPermissions(masterObjectName, spaceId, userId)\n\t\t\tpermissions.allowCreate = permissions.allowCreate && masterRecordPerm.allowCreateFiles\n\t\t\tpermissions.allowEdit = permissions.allowEdit && masterRecordPerm.allowEditFiles\n\t\t\tpermissions.allowDelete = permissions.allowDelete && masterRecordPerm.allowDeleteFiles\n\t\t\tif !masterRecordPerm.modifyAllFiles and !isOwner\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\t\t\tpermissions.allowRead = permissions.allowRead && masterRecordPerm.allowReadFiles\n\t\t\tif !masterRecordPerm.viewAllFiles and !isOwner\n\t\t\t\tpermissions.allowRead = false\n\t\telse\n\t\t\tif Meteor.isClient\n\t\t\t\tuser_company_ids = Steedos.getUserCompanyIds()\n\t\t\telse\n\t\t\t\tuser_company_ids = Creator.getUserCompanyIds(userId, spaceId)\n\t\t\trecord_company_id = record?.company_id\n\t\t\tif record_company_id and _.isObject(record_company_id) and record_company_id._id\n\t\t\t\t# 因record_company_id是lookup类型,有可能dx控件会把它映射转为对应的object,所以这里取出其_id值\n\t\t\t\trecord_company_id = record_company_id._id\n\t\t\trecord_company_ids = record?.company_ids\n\t\t\tif record_company_ids and record_company_ids.length and _.isObject(record_company_ids[0])\n\t\t\t\t# 因record_company_ids是lookup类型,有可能dx控件会把它映射转为对应的[object],所以这里取出其_id值\n\t\t\t\trecord_company_ids = record_company_ids.map((n)-> n._id)\n\t\t\trecord_company_ids = _.union(record_company_ids, [record_company_id])\n\t\t\tif !permissions.modifyAllRecords and !isOwner and !permissions.modifyCompanyRecords\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\t\t\telse if !permissions.modifyAllRecords and permissions.modifyCompanyRecords\n\t\t\t\tif record_company_ids and record_company_ids.length\n\t\t\t\t\tif user_company_ids and user_company_ids.length\n\t\t\t\t\t\tif !_.intersection(user_company_ids, record_company_ids).length\n\t\t\t\t\t\t\t# 记录的company_id/company_ids属性不在当前用户user_company_ids范围内时,认为无权修改\n\t\t\t\t\t\t\tpermissions.allowEdit = false\n\t\t\t\t\t\t\tpermissions.allowDelete = false\n\t\t\t\t\telse\n\t\t\t\t\t\t# 记录有company_id/company_ids属性,但是当前用户user_company_ids为空时,认为无权修改\n\t\t\t\t\t\tpermissions.allowEdit = false\n\t\t\t\t\t\tpermissions.allowDelete = false\n\t\t\t\n\t\t\tif record.locked and !permissions.modifyAllRecords\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\n\t\t\tif !permissions.viewAllRecords and !isOwner and !permissions.viewCompanyRecords\n\t\t\t\tpermissions.allowRead = false\n\t\t\telse if !permissions.viewAllRecords and permissions.viewCompanyRecords\n\t\t\t\tif record_company_ids and record_company_ids.length\n\t\t\t\t\tif user_company_ids and user_company_ids.length\n\t\t\t\t\t\tif !_.intersection(user_company_ids, record_company_ids).length\n\t\t\t\t\t\t\t# 记录的company_id/company_ids属性不在当前用户user_company_ids范围内时,认为无权查看\n\t\t\t\t\t\t\tpermissions.allowRead = false\n\t\t\t\t\telse\n\t\t\t\t\t\t# 记录有company_id属性,但是当前用户user_company_ids为空时,认为无权查看\n\t\t\t\t\t\tpermissions.allowRead = false\n\t\n\treturn permissions\n\n\n# currentObjectName:当前主对象\n# relatedListItem:Creator.getRelatedList(Session.get(\"object_name\"), Session.get(\"record_id\"))中取related_object_name对应的值\n# currentRecord当前主对象的详细记录\nif Meteor.isClient\n\tCreator.getRecordRelatedListPermissions = (currentObjectName, relatedListItem, currentRecord, userId, spaceId)->\n\t\tif !currentObjectName and Meteor.isClient\n\t\t\tcurrentObjectName = Session.get(\"object_name\")\n\n\t\tif !relatedListItem\n\t\t\tconsole.error(\"relatedListItem must not be empty for the function Creator.getRecordRelatedListPermissions\");\n\t\t\treturn {}\n\n\t\tif !currentRecord and Meteor.isClient\n\t\t\tcurrentRecord = Creator.getObjectRecord()\n\n\t\tif !userId and Meteor.isClient\n\t\t\tuserId = Meteor.userId()\n\n\t\tif !spaceId and Meteor.isClient\n\t\t\tspaceId = Session.get(\"spaceId\")\n\n\t\tmasterRecordPerm = Creator.getRecordPermissions(currentObjectName, currentRecord, userId, spaceId)\n\t\trelatedObjectPermissions = Creator.getPermissions(relatedListItem.object_name)\n\t\tresult = _.clone relatedObjectPermissions\n\n\t\tif relatedListItem.is_file\n\t\t\tresult.allowCreate = relatedObjectPermissions.allowCreate && masterRecordPerm.allowCreateFiles\n\t\t\tresult.allowEdit = relatedObjectPermissions.allowEdit && masterRecordPerm.allowEditFiles\n\t\telse\n\t\t\twrite_requires_master_read = relatedListItem.write_requires_master_read || false\n\t\t\tmasterAllow = false\n\t\t\tif write_requires_master_read == true\n\t\t\t\tmasterAllow = masterRecordPerm.allowRead\n\t\t\telse if write_requires_master_read == false\n\t\t\t\tmasterAllow = masterRecordPerm.allowEdit\n\n\t\t\tuneditable_related_list = Creator.getRecordSafeRelatedList(currentRecord, currentObjectName)\n\t\t\tisRelateObjectUneditable = uneditable_related_list.indexOf(relatedListItem.object_name) > -1\n\n\t\t\tresult.allowCreate = masterAllow && relatedObjectPermissions.allowCreate && !isRelateObjectUneditable\n\t\t\tresult.allowEdit = masterAllow && relatedObjectPermissions.allowEdit && !isRelateObjectUneditable\n\t\treturn result\n\nif Meteor.isServer\n\n\tCreator.getAllPermissions = (spaceId, userId) ->\n\t\tpermissions =\n\t\t\tobjects: {}\n\t\t\tassigned_apps: []\n\t\t###\n\t\t权限集说明:\n\t\t内置权限集-admin,user,member,guest,workflow_admin,organization_admin\n\t\t自定义权限集-数据库中新建的除内置权限集以外的其他权限集\n\t\t特定用户集合权限集(即users属性不可配置)-admin,user,member,guest\n\t\t可配置用户集合权限集(即users属性可配置)-workflow_admin,organization_admin以及自定义权限集\n\t\t###\n\n\t\tisSpaceAdmin = false\n\t\tspaceUser = null\n\t\tif userId\n\t\t\tisSpaceAdmin = Creator.isSpaceAdmin(spaceId, userId)\n\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\n\t\tpsetsAdmin = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsUser = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsMember = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsGuest = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1, assigned_apps:1}}) || null\n\n\t\tpsetsSupplier = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsCustomer = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tif spaceUser && spaceUser.profile\n\t\t\tpsetsCurrent = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\telse\n\t\t\tpsetsCurrent = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\n\t\tpsetsAdmin_pos = null\n\t\tpsetsUser_pos = null\n\t\tpsetsMember_pos = null\n\t\tpsetsGuest_pos = null\n\t\tpsetsCurrent_pos = null\n\t\tpsetsSupplier_pos = null\n\t\tpsetsCustomer_pos = null\n\n\t\tif psetsAdmin?._id\n\t\t\tpsetsAdmin_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsAdmin._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsUser?._id\n\t\t\tpsetsUser_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsUser._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsMember?._id\n\t\t\tpsetsMember_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsMember._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsGuest?._id\n\t\t\tpsetsGuest_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsGuest._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsSupplier?._id\n\t\t\tpsetsSupplier_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsSupplier._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsCustomer?._id\n\t\t\tpsetsCustomer_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsCustomer._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\n\t\tif psetsCurrent.length > 0\n\t\t\tset_ids = _.pluck psetsCurrent, \"_id\"\n\t\t\tpsetsCurrent_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: {$in: set_ids}}).fetch()\n\t\t\tpsetsCurrentNames = _.pluck psetsCurrent, \"name\"\n\t\tpsets = {\n\t\t\tpsetsAdmin, \n\t\t\tpsetsUser, \n\t\t\tpsetsCurrent, \n\t\t\tpsetsMember, \n\t\t\tpsetsGuest,\n\t\t\tpsetsSupplier,\n\t\t\tpsetsCustomer,\n\t\t\tisSpaceAdmin,\n\t\t\tspaceUser, \n\t\t\tpsetsAdmin_pos, \n\t\t\tpsetsUser_pos, \n\t\t\tpsetsMember_pos, \n\t\t\tpsetsGuest_pos,\n\t\t\tpsetsSupplier_pos,\n\t\t\tpsetsCustomer_pos,\n\t\t\tpsetsCurrent_pos\n\t\t}\n\t\tpermissions.assigned_apps = Creator.getAssignedApps.bind(psets)(spaceId, userId)\n\t\tpermissions.assigned_menus = Creator.getAssignedMenus.bind(psets)(spaceId, userId)\n\t\tpermissions.user_permission_sets = psetsCurrentNames\n\t\t_i = 0\n\t\t_.each Creator.objectsByName, (object, object_name)->\n\t\t\t_i++\n\t\t\tif !_.has(object, 'space') || !object.space || object.space == spaceId\n\t\t\t\tif !_.has(object, 'in_development') || object.in_development == '0' || (object.in_development != '0' && isSpaceAdmin)\n\t\t\t\t\tpermissions.objects[object_name] = Creator.convertObject(clone(Creator.Objects[object_name]), spaceId)\n\t\t\t\t\tpermissions.objects[object_name][\"permissions\"] = Creator.getObjectPermissions.bind(psets)(spaceId, userId, object_name)\n\t\treturn permissions\n\n\tunionPlus = (array, other) ->\n\t\tif !array and !other\n\t\t\treturn undefined\n\t\tif !array\n\t\t\tarray = []\n\t\tif !other\n\t\t\tother = []\n\t\treturn _.union(array, other)\n\n\tintersectionPlus = (array, other) ->\n\t\tif !array and !other\n\t\t\treturn undefined\n\t\tif !array\n\t\t\tarray = []\n\t\tif !other\n\t\t\tother = []\n\t\treturn _.intersection(array, other)\n\n\textendPermissionProps = (target, props) ->\n\t\tpropNames = permissionPropNames\n\t\tfilesProNames = \n\t\tif props\n\t\t\t_.each propNames, (propName) ->\n\t\t\t\ttarget[propName] = props[propName]\n\n\t\t\t# target.allowCreate = props.allowCreate\n\t\t\t# target.allowDelete = props.allowDelete\n\t\t\t# target.allowEdit = props.allowEdit\n\t\t\t# target.allowRead = props.allowRead\n\t\t\t# target.modifyAllRecords = props.modifyAllRecords\n\t\t\t# target.viewAllRecords = props.viewAllRecords\n\t\t\t# target.modifyCompanyRecords = props.modifyCompanyRecords\n\t\t\t# target.viewCompanyRecords = props.viewCompanyRecords\n\t\t\t# target.disabled_list_views = props.disabled_list_views\n\t\t\t# target.disabled_actions = props.disabled_actions\n\t\t\t# target.unreadable_fields = props.unreadable_fields\n\t\t\t# target.uneditable_fields = props.uneditable_fields\n\t\t\t# target.unrelated_objects = props.unrelated_objects\n\t\t\t# target.uneditable_related_list = props.uneditable_related_list\n\n\toverlayBaseBooleanPermissionProps = (target, props) ->\n\t\tpropNames = baseBooleanPermissionPropNames\n\t\t_.each propNames, (propName) ->\n\t\t\tif props[propName]\n\t\t\t\ttarget[propName] = true\n\t\t\n\t\t# if po.allowRead\n\t\t# \tpermissions.allowRead = true\n\t\t# if po.allowCreate\n\t\t# \tpermissions.allowCreate = true\n\t\t# if po.allowEdit\n\t\t# \tpermissions.allowEdit = true\n\t\t# if po.allowDelete\n\t\t# \tpermissions.allowDelete = true\n\t\t# if po.modifyAllRecords\n\t\t# \tpermissions.modifyAllRecords = true\n\t\t# if po.viewAllRecords\n\t\t# \tpermissions.viewAllRecords = true\n\t\t# if po.modifyCompanyRecords\n\t\t# \tpermissions.modifyCompanyRecords = true\n\t\t# if po.viewCompanyRecords\n\t\t# \tpermissions.viewCompanyRecords = true\n\n\n\tCreator.getAssignedApps = (spaceId, userId)->\n\t\tpsetsAdmin = this.psetsAdmin || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsUser = this.psetsUser || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsSupplier = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsCustomer = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1, assigned_apps:1}})\n\t\t# psetsMember = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1, assigned_apps:1}})\n\t\t# psetsGuest = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1, assigned_apps:1}})\n\t\tspaceUser = null;\n\t\tif userId\n\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\tif spaceUser && spaceUser.profile\n\t\t\tpsets = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\telse\n\t\t\tpsets = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\t\tapps = []\n\t\tif isSpaceAdmin\n\t\t\treturn []\n\t\telse\n\t\t\tuserProfile = Creator.getCollection(\"space_users\").findOne({space: spaceId, user: userId}, {fields: {profile: 1}})?.profile\n\t\t\tpsetBase = psetsUser\n\t\t\tif userProfile\n\t\t\t\tif userProfile == 'supplier'\n\t\t\t\t\tpsetBase = psetsSupplier\n\t\t\t\telse if userProfile == 'customer'\n\t\t\t\t\tpsetBase = psetsCustomer\n\t\t\tif psetBase?.assigned_apps?.length\n\t\t\t\tapps = _.union apps, psetBase.assigned_apps\n\t\t\telse\n\t\t\t\t# user权限集中的assigned_apps表示所有用户具有的apps权限,为空则表示有所有apps权限,不需要作权限判断了\n\t\t\t\treturn []\n\t\t\t_.each psets, (pset)->\n\t\t\t\tif !pset.assigned_apps\n\t\t\t\t\treturn\n\t\t\t\tif pset.name == \"admin\" || pset.name == \"user\" || pset.name == 'supplier' || pset.name == 'customer'\n\t\t\t\t\t# 这里之所以要排除admin/user,是因为这两个权限集是所有权限集中users属性无效的权限集,特指工作区管理员和所有用户\n\t\t\t\t\treturn\n\t\t\t\tapps = _.union apps, pset.assigned_apps\n\t\t\treturn _.without(_.uniq(apps),undefined,null)\n\n\tCreator.getAssignedMenus = (spaceId, userId)->\n\t\tpsets = this.psetsCurrent || Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\t\tadminMenus = Creator.Apps.admin?.admin_menus\n\t\t# 如果没有admin菜单说明不需要相关功能,直接返回空\n\t\tunless adminMenus\n\t\t\treturn []\n\t\taboutMenu = adminMenus.find (n) ->\n\t\t\tn._id == 'about'\n\t\tadminMenus = adminMenus.filter (n) ->\n\t\t\tn._id != 'about'\n\t\totherMenuApps = _.sortBy _.filter(_.values(Creator.Apps), (n) ->\n\t\t\treturn n.admin_menus and n._id != 'admin'\n\t\t), 'sort'\n\t\totherMenus = _.flatten(_.pluck(otherMenuApps, \"admin_menus\"))\n\t\t# 菜单有三部分组成,设置APP菜单、其他APP菜单以及about菜单\n\t\tallMenus = _.union(adminMenus, otherMenus, [aboutMenu])\n\t\tif isSpaceAdmin\n\t\t\t# 工作区管理员有全部菜单功能\n\t\t\tresult = allMenus\n\t\telse\n\t\t\tuserProfile = Creator.getCollection(\"space_users\").findOne({space: spaceId, user: userId}, {fields: {profile: 1}})?.profile || 'user'\n\t\t\tcurrentPsetNames = psets.map (n) ->\n\t\t\t\treturn n.name\n\t\t\tmenus = allMenus.filter (menu)->\n\t\t\t\tpsetsMenu = menu.permission_sets\n\t\t\t\t# 如果普通用户有权限,则直接返回true\n\t\t\t\tif psetsMenu && psetsMenu.indexOf(userProfile) > -1\n\t\t\t\t\treturn true\n\t\t\t\t# 否则取当前用户的权限集与menu菜单要求的权限集对比,如果交集大于1个则返回true\n\t\t\t\treturn _.intersection(currentPsetNames, psetsMenu).length\n\t\t\tresult = menus\n\t\t\n\t\treturn _.sortBy(result,\"sort\")\n\n\tfindOne_permission_object = (permission_objects, object_name, permission_set_id)->\n\n\t\tif _.isNull(permission_objects)\n\t\t\treturn null\n\t\tif _.isArray(permission_objects)\n\t\t\treturn _.find permission_objects, (po)->\n\t\t\t\t\treturn po.object_name == object_name\n\t\treturn Creator.getCollection(\"permission_objects\").findOne({object_name: object_name, permission_set_id: permission_set_id})\n\n\tfind_permission_object = (permission_objects, object_name, permission_set_ids)->\n\t\tif _.isNull(permission_objects)\n\t\t\treturn null\n\t\tif _.isArray(permission_objects)\n\t\t\treturn _.filter permission_objects, (po)->\n\t\t\t\treturn po.object_name == object_name\n\t\tCreator.getCollection(\"permission_objects\").find({object_name: object_name, permission_set_id: {$in: permission_set_ids}}).fetch()\n\n\tunionPermissionObjects = (pos, object, psets)->\n\t\t# 把db及yml中的permission_objects合并,优先取db中的\n\t\tresult = []\n\t\t_.each object.permission_set, (ops, ops_key)->\n\t\t\t# 把yml中除了特定用户集合权限集\"admin\", \"user\", \"member\", \"guest\"外的其他对象权限先存入result\n\t\t\t# if [\"admin\", \"user\", \"member\", \"guest\", \"workflow_admin\", \"organization_admin\"].indexOf(ops_key) < 0\n\t\t\tif [\"admin\", \"user\", \"member\", \"guest\"].indexOf(ops_key) < 0\n\t\t\t\tcurrentPset = psets.find (pset)-> return pset.name == ops_key\n\t\t\t\tif currentPset\n\t\t\t\t\ttempOps = _.clone(ops) || {}\n\t\t\t\t\ttempOps.permission_set_id = currentPset._id\n\t\t\t\t\ttempOps.object_name = object.object_name\n\t\t\t\t\tresult.push tempOps\n\t\tif result.length\n\t\t\tpos.forEach (po)->\n\t\t\t\trepeatIndex = 0\n\t\t\t\trepeatPo = result.find((item, index)-> repeatIndex = index;return item.permission_set_id == po.permission_set_id)\n\t\t\t\t# 如果yml中已经存在po,则替换为数据库中的po,反之则把数据库中的po直接累加进去\n\t\t\t\tif repeatPo\n\t\t\t\t\tresult[repeatIndex] = po\n\t\t\t\telse\n\t\t\t\t\tresult.push po\n\t\t\treturn result\n\t\telse\n\t\t\treturn pos\n\n\tCreator.getObjectPermissions = (spaceId, userId, object_name)->\n\t\tpermissions = {}\n\t\tobject = Creator.getObject(object_name, spaceId)\n\n\t\tif spaceId is 'guest' || object_name == \"users\"\n\t\t\tpermissions = _.clone(object.permission_set.guest) || {}\n\t\t\tCreator.processPermissions permissions\n\t\t\treturn permissions\n\t\tpsetsAdmin = if _.isNull(this.psetsAdmin) or this.psetsAdmin then this.psetsAdmin else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1}})\n\t\tpsetsUser = if _.isNull(this.psetsUser) or this.psetsUser then this.psetsUser else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1}})\n\t\tpsetsMember = if _.isNull(this.psetsMember) or this.psetsMember then this.psetsMember else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1}})\n\t\tpsetsGuest = if _.isNull(this.psetsGuest) or this.psetsGuest then this.psetsGuest else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1}})\n\n\t\tpsetsSupplier = if _.isNull(this.psetsSupplier) or this.psetsSupplier then this.psetsSupplier else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1}})\n\t\tpsetsCustomer = if _.isNull(this.psetsCustomer) or this.psetsCustomer then this.psetsCustomer else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1}})\n\t\tpsets = this.psetsCurrent;\n\t\tif !psets\n\t\t\tspaceUser = null;\n\t\t\tif userId\n\t\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\t\tif spaceUser && spaceUser.profile\n\t\t\t\tpsets = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\t\telse\n\t\t\t\tpsets = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\n\t\tpsetsAdmin_pos = this.psetsAdmin_pos\n\t\tpsetsUser_pos = this.psetsUser_pos\n\t\tpsetsMember_pos = this.psetsMember_pos\n\t\tpsetsGuest_pos = this.psetsGuest_pos\n\n\t\tpsetsSupplier_pos = this.psetsSupplier_pos\n\t\tpsetsCustomer_pos = this.psetsCustomer_pos\n\n\t\tpsetsCurrent_pos = this.psetsCurrent_pos\n\n\t\topsetAdmin = _.clone(object.permission_set.admin) || {}\n\t\topsetUser = _.clone(object.permission_set.user) || {}\n\t\topsetMember = _.clone(object.permission_set.member) || {}\n\t\topsetGuest = _.clone(object.permission_set.guest) || {}\n\n\t\topsetSupplier = _.clone(object.permission_set.supplier) || {}\n\t\topsetCustomer = _.clone(object.permission_set.customer) || {}\n\n\t\t# sharedListViews = Creator.getCollection('object_listviews').find({space: spaceId, object_name: object_name, shared: true}, {fields:{_id:1}}).fetch()\n\t\t# sharedListViews = _.pluck(sharedListViews,\"_id\")\n\t\t# if sharedListViews.length\n\t\t# \tunless opsetAdmin.list_views\n\t\t# \t\topsetAdmin.list_views = []\n\t\t# \topsetAdmin.list_views = _.union opsetAdmin.list_views, sharedListViews\n\t\t# \tunless opsetUser.list_views\n\t\t# \t\topsetUser.list_views = []\n\t\t# \topsetUser.list_views = _.union opsetUser.list_views, sharedListViews\n\t\t# 数据库中如果配置了默认的admin/user权限集设置,应该覆盖代码中admin/user的权限集设置\n\t\tif psetsAdmin\n\t\t\tposAdmin = findOne_permission_object(psetsAdmin_pos, object_name, psetsAdmin._id)\n\t\t\textendPermissionProps opsetAdmin, posAdmin\n\t\tif psetsUser\n\t\t\tposUser = findOne_permission_object(psetsUser_pos, object_name, psetsUser._id)\n\t\t\textendPermissionProps opsetUser, posUser\n\t\tif psetsMember\n\t\t\tposMember = findOne_permission_object(psetsMember_pos, object_name, psetsMember._id)\n\t\t\textendPermissionProps opsetMember, posMember\n\t\tif psetsGuest\n\t\t\tposGuest = findOne_permission_object(psetsGuest_pos, object_name, psetsGuest._id)\n\t\t\textendPermissionProps opsetGuest, posGuest\n\t\tif psetsSupplier\n\t\t\tposSupplier = findOne_permission_object(psetsSupplier_pos, object_name, psetsSupplier._id);\n\t\t\textendPermissionProps opsetSupplier, posSupplier\n\t\tif psetsCustomer\n\t\t\tposCustomer = findOne_permission_object(psetsCustomer_pos, object_name, psetsCustomer._id);\n\t\t\textendPermissionProps opsetCustomer, posCustomer\n\n\t\tif !userId\n\t\t\tpermissions = opsetAdmin\n\t\telse\n\t\t\tif isSpaceAdmin\n\t\t\t\tpermissions = opsetAdmin\n\t\t\telse\n\t\t\t\tif spaceId is 'common'\n\t\t\t\t\tpermissions = opsetUser\n\t\t\t\telse\n\t\t\t\t\tspaceUser = if _.isNull(this.spaceUser) or this.spaceUser then this.spaceUser else Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\t\t\t\tif spaceUser\n\t\t\t\t\t\tprof = spaceUser.profile\n\t\t\t\t\t\tif prof\n\t\t\t\t\t\t\tif prof is 'user'\n\t\t\t\t\t\t\t\tpermissions = opsetUser\n\t\t\t\t\t\t\telse if prof is 'member'\n\t\t\t\t\t\t\t\tpermissions = opsetMember\n\t\t\t\t\t\t\telse if prof is 'guest'\n\t\t\t\t\t\t\t\tpermissions = opsetGuest\n\t\t\t\t\t\t\telse if prof is 'supplier'\n\t\t\t\t\t\t\t\tpermissions = opsetSupplier\n\t\t\t\t\t\t\telse if prof is 'customer'\n\t\t\t\t\t\t\t\tpermissions = opsetCustomer\n\t\t\t\t\t\telse # 没有profile则认为是user权限\n\t\t\t\t\t\t\tpermissions = opsetUser\n\t\t\t\t\telse\n\t\t\t\t\t\tpermissions = opsetGuest\n\t\tif psets.length > 0\n\t\t\tset_ids = _.pluck psets, \"_id\"\n\t\t\tpos = find_permission_object(psetsCurrent_pos, object_name, set_ids)\n\t\t\tpos = unionPermissionObjects(pos, object, psets)\n\t\t\t_.each pos, (po)->\n\t\t\t\tif po.permission_set_id == psetsAdmin?._id or \n\t\t\t\tpo.permission_set_id == psetsUser?._id or \n\t\t\t\tpo.permission_set_id == psetsMember?._id or \n\t\t\t\tpo.permission_set_id == psetsGuest?._id or\n\t\t\t\tpo.permission_set_id == psetsSupplier?._id or\n\t\t\t\tpo.permission_set_id == psetsCustomer?._id\n\t\t\t\t\t# 默认的admin/user权限值只实行上面的默认值覆盖,不做算法判断\n\t\t\t\t\treturn\n\t\t\t\tif _.isEmpty(permissions)\n\t\t\t\t\tpermissions = po\n\t\t\t\toverlayBaseBooleanPermissionProps permissions, po\n\n\t\t\t\tpermissions.disabled_list_views = intersectionPlus(permissions.disabled_list_views, po.disabled_list_views)\n\t\t\t\tpermissions.disabled_actions = intersectionPlus(permissions.disabled_actions, po.disabled_actions)\n\t\t\t\tpermissions.unreadable_fields = intersectionPlus(permissions.unreadable_fields, po.unreadable_fields)\n\t\t\t\tpermissions.uneditable_fields = intersectionPlus(permissions.uneditable_fields, po.uneditable_fields)\n\t\t\t\tpermissions.unrelated_objects = intersectionPlus(permissions.unrelated_objects, po.unrelated_objects)\n\t\t\t\tpermissions.uneditable_related_list = intersectionPlus(permissions.uneditable_related_list, po.uneditable_related_list)\n\t\t\n\t\tif object.is_view\n\t\t\tpermissions.allowCreate = false\n\t\t\tpermissions.allowEdit = false\n\t\t\tpermissions.allowDelete = false\n\t\t\tpermissions.modifyAllRecords = false\n\t\t\tpermissions.modifyCompanyRecords = false\n\t\t\tpermissions.disabled_actions = []\n\t\tCreator.processPermissions permissions\n\n\t\tif object.permission_set.owner\n\t\t\tpermissions.owner = object.permission_set.owner\n\t\treturn permissions\n\n\n\t# Creator.initPermissions = (object_name) ->\n\n\t\t# # 应该把计算出来的\n\t\t# Creator.Collections[object_name].allow\n\t\t# \tinsert: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t \t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowCreate\n\t\t# \t\t\treturn false\n\n\t\t# \t\treturn true\n\t\t# \tupdate: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t\t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowEdit\n\t\t# \t\t\treturn false\n\t\t# \t\treturn true\n\t\t# \tremove: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t\t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowDelete\n\t\t# \t\t\treturn false\n\t\t# \t\treturn true\n\n\tMeteor.methods\n\t\t# Calculate Permissions on Server\n\t\t\"creator.object_permissions\": (spaceId)->\n\t\t\treturn Creator.getAllPermissions(spaceId, this.userId)\n","var baseBooleanPermissionPropNames, clone, extendPermissionProps, findOne_permission_object, find_permission_object, intersectionPlus, otherPermissionPropNames, overlayBaseBooleanPermissionProps, permissionPropNames, unionPermissionObjects, unionPlus;\n\nclone = require('clone');\n\nbaseBooleanPermissionPropNames = [\"allowCreate\", \"allowDelete\", \"allowEdit\", \"allowRead\", \"modifyAllRecords\", \"viewAllRecords\", \"modifyCompanyRecords\", \"viewCompanyRecords\", \"allowReadFiles\", \"allowEditFiles\", \"allowCreateFiles\", \"allowDeleteFiles\", \"viewAllFiles\", \"modifyAllFiles\"];\n\notherPermissionPropNames = [\"disabled_list_views\", \"disabled_actions\", \"unreadable_fields\", \"uneditable_fields\", \"unrelated_objects\", \"uneditable_related_list\"];\n\npermissionPropNames = _.union(baseBooleanPermissionPropNames, otherPermissionPropNames);\n\nCreator.getPermissions = function(object_name, spaceId, userId) {\n var obj;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n obj = Creator.getObject(object_name);\n if (!obj) {\n return;\n }\n return obj.permissions.get();\n } else if (Meteor.isServer) {\n return Creator.getObjectPermissions(spaceId, userId, object_name);\n }\n};\n\nCreator.getRecordPermissions = function(object_name, record, userId, spaceId) {\n var isOwner, masterObjectName, masterRecordPerm, permissions, record_company_id, record_company_ids, ref, user_company_ids;\n if (!object_name && Meteor.isClient) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId && Meteor.isClient) {\n spaceId = Session.get(\"spaceId\");\n }\n permissions = _.clone(Creator.getPermissions(object_name, spaceId, userId));\n if (record) {\n if (!_.isEmpty(record.record_permissions)) {\n return record.record_permissions;\n }\n isOwner = record.owner === userId || ((ref = record.owner) != null ? ref._id : void 0) === userId;\n if (object_name === \"cms_files\") {\n masterObjectName = record.parent['reference_to._o'];\n masterRecordPerm = Creator.getPermissions(masterObjectName, spaceId, userId);\n permissions.allowCreate = permissions.allowCreate && masterRecordPerm.allowCreateFiles;\n permissions.allowEdit = permissions.allowEdit && masterRecordPerm.allowEditFiles;\n permissions.allowDelete = permissions.allowDelete && masterRecordPerm.allowDeleteFiles;\n if (!masterRecordPerm.modifyAllFiles && !isOwner) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n permissions.allowRead = permissions.allowRead && masterRecordPerm.allowReadFiles;\n if (!masterRecordPerm.viewAllFiles && !isOwner) {\n permissions.allowRead = false;\n }\n } else {\n if (Meteor.isClient) {\n user_company_ids = Steedos.getUserCompanyIds();\n } else {\n user_company_ids = Creator.getUserCompanyIds(userId, spaceId);\n }\n record_company_id = record != null ? record.company_id : void 0;\n if (record_company_id && _.isObject(record_company_id) && record_company_id._id) {\n record_company_id = record_company_id._id;\n }\n record_company_ids = record != null ? record.company_ids : void 0;\n if (record_company_ids && record_company_ids.length && _.isObject(record_company_ids[0])) {\n record_company_ids = record_company_ids.map(function(n) {\n return n._id;\n });\n }\n record_company_ids = _.union(record_company_ids, [record_company_id]);\n if (!permissions.modifyAllRecords && !isOwner && !permissions.modifyCompanyRecords) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n } else if (!permissions.modifyAllRecords && permissions.modifyCompanyRecords) {\n if (record_company_ids && record_company_ids.length) {\n if (user_company_ids && user_company_ids.length) {\n if (!_.intersection(user_company_ids, record_company_ids).length) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n } else {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n }\n }\n if (record.locked && !permissions.modifyAllRecords) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n if (!permissions.viewAllRecords && !isOwner && !permissions.viewCompanyRecords) {\n permissions.allowRead = false;\n } else if (!permissions.viewAllRecords && permissions.viewCompanyRecords) {\n if (record_company_ids && record_company_ids.length) {\n if (user_company_ids && user_company_ids.length) {\n if (!_.intersection(user_company_ids, record_company_ids).length) {\n permissions.allowRead = false;\n }\n } else {\n permissions.allowRead = false;\n }\n }\n }\n }\n }\n return permissions;\n};\n\nif (Meteor.isClient) {\n Creator.getRecordRelatedListPermissions = function(currentObjectName, relatedListItem, currentRecord, userId, spaceId) {\n var isRelateObjectUneditable, masterAllow, masterRecordPerm, relatedObjectPermissions, result, uneditable_related_list, write_requires_master_read;\n if (!currentObjectName && Meteor.isClient) {\n currentObjectName = Session.get(\"object_name\");\n }\n if (!relatedListItem) {\n console.error(\"relatedListItem must not be empty for the function Creator.getRecordRelatedListPermissions\");\n return {};\n }\n if (!currentRecord && Meteor.isClient) {\n currentRecord = Creator.getObjectRecord();\n }\n if (!userId && Meteor.isClient) {\n userId = Meteor.userId();\n }\n if (!spaceId && Meteor.isClient) {\n spaceId = Session.get(\"spaceId\");\n }\n masterRecordPerm = Creator.getRecordPermissions(currentObjectName, currentRecord, userId, spaceId);\n relatedObjectPermissions = Creator.getPermissions(relatedListItem.object_name);\n result = _.clone(relatedObjectPermissions);\n if (relatedListItem.is_file) {\n result.allowCreate = relatedObjectPermissions.allowCreate && masterRecordPerm.allowCreateFiles;\n result.allowEdit = relatedObjectPermissions.allowEdit && masterRecordPerm.allowEditFiles;\n } else {\n write_requires_master_read = relatedListItem.write_requires_master_read || false;\n masterAllow = false;\n if (write_requires_master_read === true) {\n masterAllow = masterRecordPerm.allowRead;\n } else if (write_requires_master_read === false) {\n masterAllow = masterRecordPerm.allowEdit;\n }\n uneditable_related_list = Creator.getRecordSafeRelatedList(currentRecord, currentObjectName);\n isRelateObjectUneditable = uneditable_related_list.indexOf(relatedListItem.object_name) > -1;\n result.allowCreate = masterAllow && relatedObjectPermissions.allowCreate && !isRelateObjectUneditable;\n result.allowEdit = masterAllow && relatedObjectPermissions.allowEdit && !isRelateObjectUneditable;\n }\n return result;\n };\n}\n\nif (Meteor.isServer) {\n Creator.getAllPermissions = function(spaceId, userId) {\n var _i, isSpaceAdmin, permissions, psets, psetsAdmin, psetsAdmin_pos, psetsCurrent, psetsCurrentNames, psetsCurrent_pos, psetsCustomer, psetsCustomer_pos, psetsGuest, psetsGuest_pos, psetsMember, psetsMember_pos, psetsSupplier, psetsSupplier_pos, psetsUser, psetsUser_pos, set_ids, spaceUser;\n permissions = {\n objects: {},\n assigned_apps: []\n };\n\n /*\n \t\t权限集说明:\n \t\t内置权限集-admin,user,member,guest,workflow_admin,organization_admin\n \t\t自定义权限集-数据库中新建的除内置权限集以外的其他权限集\n \t\t特定用户集合权限集(即users属性不可配置)-admin,user,member,guest\n \t\t可配置用户集合权限集(即users属性可配置)-workflow_admin,organization_admin以及自定义权限集\n */\n isSpaceAdmin = false;\n spaceUser = null;\n if (userId) {\n isSpaceAdmin = Creator.isSpaceAdmin(spaceId, userId);\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n psetsAdmin = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsUser = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsMember = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'member'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsGuest = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'guest'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsSupplier = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsCustomer = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n if (spaceUser && spaceUser.profile) {\n psetsCurrent = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psetsCurrent = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n psetsAdmin_pos = null;\n psetsUser_pos = null;\n psetsMember_pos = null;\n psetsGuest_pos = null;\n psetsCurrent_pos = null;\n psetsSupplier_pos = null;\n psetsCustomer_pos = null;\n if (psetsAdmin != null ? psetsAdmin._id : void 0) {\n psetsAdmin_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsAdmin._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsUser != null ? psetsUser._id : void 0) {\n psetsUser_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsUser._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsMember != null ? psetsMember._id : void 0) {\n psetsMember_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsMember._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsGuest != null ? psetsGuest._id : void 0) {\n psetsGuest_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsGuest._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsSupplier != null ? psetsSupplier._id : void 0) {\n psetsSupplier_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsSupplier._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsCustomer != null ? psetsCustomer._id : void 0) {\n psetsCustomer_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsCustomer._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsCurrent.length > 0) {\n set_ids = _.pluck(psetsCurrent, \"_id\");\n psetsCurrent_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: {\n $in: set_ids\n }\n }).fetch();\n psetsCurrentNames = _.pluck(psetsCurrent, \"name\");\n }\n psets = {\n psetsAdmin: psetsAdmin,\n psetsUser: psetsUser,\n psetsCurrent: psetsCurrent,\n psetsMember: psetsMember,\n psetsGuest: psetsGuest,\n psetsSupplier: psetsSupplier,\n psetsCustomer: psetsCustomer,\n isSpaceAdmin: isSpaceAdmin,\n spaceUser: spaceUser,\n psetsAdmin_pos: psetsAdmin_pos,\n psetsUser_pos: psetsUser_pos,\n psetsMember_pos: psetsMember_pos,\n psetsGuest_pos: psetsGuest_pos,\n psetsSupplier_pos: psetsSupplier_pos,\n psetsCustomer_pos: psetsCustomer_pos,\n psetsCurrent_pos: psetsCurrent_pos\n };\n permissions.assigned_apps = Creator.getAssignedApps.bind(psets)(spaceId, userId);\n permissions.assigned_menus = Creator.getAssignedMenus.bind(psets)(spaceId, userId);\n permissions.user_permission_sets = psetsCurrentNames;\n _i = 0;\n _.each(Creator.objectsByName, function(object, object_name) {\n _i++;\n if (!_.has(object, 'space') || !object.space || object.space === spaceId) {\n if (!_.has(object, 'in_development') || object.in_development === '0' || (object.in_development !== '0' && isSpaceAdmin)) {\n permissions.objects[object_name] = Creator.convertObject(clone(Creator.Objects[object_name]), spaceId);\n return permissions.objects[object_name][\"permissions\"] = Creator.getObjectPermissions.bind(psets)(spaceId, userId, object_name);\n }\n }\n });\n return permissions;\n };\n unionPlus = function(array, other) {\n if (!array && !other) {\n return void 0;\n }\n if (!array) {\n array = [];\n }\n if (!other) {\n other = [];\n }\n return _.union(array, other);\n };\n intersectionPlus = function(array, other) {\n if (!array && !other) {\n return void 0;\n }\n if (!array) {\n array = [];\n }\n if (!other) {\n other = [];\n }\n return _.intersection(array, other);\n };\n extendPermissionProps = function(target, props) {\n var filesProNames, propNames;\n propNames = permissionPropNames;\n return filesProNames = props ? _.each(propNames, function(propName) {\n return target[propName] = props[propName];\n }) : void 0;\n };\n overlayBaseBooleanPermissionProps = function(target, props) {\n var propNames;\n propNames = baseBooleanPermissionPropNames;\n return _.each(propNames, function(propName) {\n if (props[propName]) {\n return target[propName] = true;\n }\n });\n };\n Creator.getAssignedApps = function(spaceId, userId) {\n var apps, isSpaceAdmin, psetBase, psets, psetsAdmin, psetsCustomer, psetsSupplier, psetsUser, ref, ref1, spaceUser, userProfile;\n psetsAdmin = this.psetsAdmin || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsUser = this.psetsUser || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsSupplier = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsCustomer = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n spaceUser = null;\n if (userId) {\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n if (spaceUser && spaceUser.profile) {\n psets = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psets = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n apps = [];\n if (isSpaceAdmin) {\n return [];\n } else {\n userProfile = (ref = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n })) != null ? ref.profile : void 0;\n psetBase = psetsUser;\n if (userProfile) {\n if (userProfile === 'supplier') {\n psetBase = psetsSupplier;\n } else if (userProfile === 'customer') {\n psetBase = psetsCustomer;\n }\n }\n if (psetBase != null ? (ref1 = psetBase.assigned_apps) != null ? ref1.length : void 0 : void 0) {\n apps = _.union(apps, psetBase.assigned_apps);\n } else {\n return [];\n }\n _.each(psets, function(pset) {\n if (!pset.assigned_apps) {\n return;\n }\n if (pset.name === \"admin\" || pset.name === \"user\" || pset.name === 'supplier' || pset.name === 'customer') {\n return;\n }\n return apps = _.union(apps, pset.assigned_apps);\n });\n return _.without(_.uniq(apps), void 0, null);\n }\n };\n Creator.getAssignedMenus = function(spaceId, userId) {\n var aboutMenu, adminMenus, allMenus, currentPsetNames, isSpaceAdmin, menus, otherMenuApps, otherMenus, psets, ref, ref1, result, userProfile;\n psets = this.psetsCurrent || Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n adminMenus = (ref = Creator.Apps.admin) != null ? ref.admin_menus : void 0;\n if (!adminMenus) {\n return [];\n }\n aboutMenu = adminMenus.find(function(n) {\n return n._id === 'about';\n });\n adminMenus = adminMenus.filter(function(n) {\n return n._id !== 'about';\n });\n otherMenuApps = _.sortBy(_.filter(_.values(Creator.Apps), function(n) {\n return n.admin_menus && n._id !== 'admin';\n }), 'sort');\n otherMenus = _.flatten(_.pluck(otherMenuApps, \"admin_menus\"));\n allMenus = _.union(adminMenus, otherMenus, [aboutMenu]);\n if (isSpaceAdmin) {\n result = allMenus;\n } else {\n userProfile = ((ref1 = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n })) != null ? ref1.profile : void 0) || 'user';\n currentPsetNames = psets.map(function(n) {\n return n.name;\n });\n menus = allMenus.filter(function(menu) {\n var psetsMenu;\n psetsMenu = menu.permission_sets;\n if (psetsMenu && psetsMenu.indexOf(userProfile) > -1) {\n return true;\n }\n return _.intersection(currentPsetNames, psetsMenu).length;\n });\n result = menus;\n }\n return _.sortBy(result, \"sort\");\n };\n findOne_permission_object = function(permission_objects, object_name, permission_set_id) {\n if (_.isNull(permission_objects)) {\n return null;\n }\n if (_.isArray(permission_objects)) {\n return _.find(permission_objects, function(po) {\n return po.object_name === object_name;\n });\n }\n return Creator.getCollection(\"permission_objects\").findOne({\n object_name: object_name,\n permission_set_id: permission_set_id\n });\n };\n find_permission_object = function(permission_objects, object_name, permission_set_ids) {\n if (_.isNull(permission_objects)) {\n return null;\n }\n if (_.isArray(permission_objects)) {\n return _.filter(permission_objects, function(po) {\n return po.object_name === object_name;\n });\n }\n return Creator.getCollection(\"permission_objects\").find({\n object_name: object_name,\n permission_set_id: {\n $in: permission_set_ids\n }\n }).fetch();\n };\n unionPermissionObjects = function(pos, object, psets) {\n var result;\n result = [];\n _.each(object.permission_set, function(ops, ops_key) {\n var currentPset, tempOps;\n if ([\"admin\", \"user\", \"member\", \"guest\"].indexOf(ops_key) < 0) {\n currentPset = psets.find(function(pset) {\n return pset.name === ops_key;\n });\n if (currentPset) {\n tempOps = _.clone(ops) || {};\n tempOps.permission_set_id = currentPset._id;\n tempOps.object_name = object.object_name;\n return result.push(tempOps);\n }\n }\n });\n if (result.length) {\n pos.forEach(function(po) {\n var repeatIndex, repeatPo;\n repeatIndex = 0;\n repeatPo = result.find(function(item, index) {\n repeatIndex = index;\n return item.permission_set_id === po.permission_set_id;\n });\n if (repeatPo) {\n return result[repeatIndex] = po;\n } else {\n return result.push(po);\n }\n });\n return result;\n } else {\n return pos;\n }\n };\n Creator.getObjectPermissions = function(spaceId, userId, object_name) {\n var isSpaceAdmin, object, opsetAdmin, opsetCustomer, opsetGuest, opsetMember, opsetSupplier, opsetUser, permissions, pos, posAdmin, posCustomer, posGuest, posMember, posSupplier, posUser, prof, psets, psetsAdmin, psetsAdmin_pos, psetsCurrent_pos, psetsCustomer, psetsCustomer_pos, psetsGuest, psetsGuest_pos, psetsMember, psetsMember_pos, psetsSupplier, psetsSupplier_pos, psetsUser, psetsUser_pos, set_ids, spaceUser;\n permissions = {};\n object = Creator.getObject(object_name, spaceId);\n if (spaceId === 'guest' || object_name === \"users\") {\n permissions = _.clone(object.permission_set.guest) || {};\n Creator.processPermissions(permissions);\n return permissions;\n }\n psetsAdmin = _.isNull(this.psetsAdmin) || this.psetsAdmin ? this.psetsAdmin : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsUser = _.isNull(this.psetsUser) || this.psetsUser ? this.psetsUser : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsMember = _.isNull(this.psetsMember) || this.psetsMember ? this.psetsMember : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'member'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsGuest = _.isNull(this.psetsGuest) || this.psetsGuest ? this.psetsGuest : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'guest'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsSupplier = _.isNull(this.psetsSupplier) || this.psetsSupplier ? this.psetsSupplier : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsCustomer = _.isNull(this.psetsCustomer) || this.psetsCustomer ? this.psetsCustomer : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1\n }\n });\n psets = this.psetsCurrent;\n if (!psets) {\n spaceUser = null;\n if (userId) {\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n if (spaceUser && spaceUser.profile) {\n psets = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psets = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n }\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n psetsAdmin_pos = this.psetsAdmin_pos;\n psetsUser_pos = this.psetsUser_pos;\n psetsMember_pos = this.psetsMember_pos;\n psetsGuest_pos = this.psetsGuest_pos;\n psetsSupplier_pos = this.psetsSupplier_pos;\n psetsCustomer_pos = this.psetsCustomer_pos;\n psetsCurrent_pos = this.psetsCurrent_pos;\n opsetAdmin = _.clone(object.permission_set.admin) || {};\n opsetUser = _.clone(object.permission_set.user) || {};\n opsetMember = _.clone(object.permission_set.member) || {};\n opsetGuest = _.clone(object.permission_set.guest) || {};\n opsetSupplier = _.clone(object.permission_set.supplier) || {};\n opsetCustomer = _.clone(object.permission_set.customer) || {};\n if (psetsAdmin) {\n posAdmin = findOne_permission_object(psetsAdmin_pos, object_name, psetsAdmin._id);\n extendPermissionProps(opsetAdmin, posAdmin);\n }\n if (psetsUser) {\n posUser = findOne_permission_object(psetsUser_pos, object_name, psetsUser._id);\n extendPermissionProps(opsetUser, posUser);\n }\n if (psetsMember) {\n posMember = findOne_permission_object(psetsMember_pos, object_name, psetsMember._id);\n extendPermissionProps(opsetMember, posMember);\n }\n if (psetsGuest) {\n posGuest = findOne_permission_object(psetsGuest_pos, object_name, psetsGuest._id);\n extendPermissionProps(opsetGuest, posGuest);\n }\n if (psetsSupplier) {\n posSupplier = findOne_permission_object(psetsSupplier_pos, object_name, psetsSupplier._id);\n extendPermissionProps(opsetSupplier, posSupplier);\n }\n if (psetsCustomer) {\n posCustomer = findOne_permission_object(psetsCustomer_pos, object_name, psetsCustomer._id);\n extendPermissionProps(opsetCustomer, posCustomer);\n }\n if (!userId) {\n permissions = opsetAdmin;\n } else {\n if (isSpaceAdmin) {\n permissions = opsetAdmin;\n } else {\n if (spaceId === 'common') {\n permissions = opsetUser;\n } else {\n spaceUser = _.isNull(this.spaceUser) || this.spaceUser ? this.spaceUser : Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n if (spaceUser) {\n prof = spaceUser.profile;\n if (prof) {\n if (prof === 'user') {\n permissions = opsetUser;\n } else if (prof === 'member') {\n permissions = opsetMember;\n } else if (prof === 'guest') {\n permissions = opsetGuest;\n } else if (prof === 'supplier') {\n permissions = opsetSupplier;\n } else if (prof === 'customer') {\n permissions = opsetCustomer;\n }\n } else {\n permissions = opsetUser;\n }\n } else {\n permissions = opsetGuest;\n }\n }\n }\n }\n if (psets.length > 0) {\n set_ids = _.pluck(psets, \"_id\");\n pos = find_permission_object(psetsCurrent_pos, object_name, set_ids);\n pos = unionPermissionObjects(pos, object, psets);\n _.each(pos, function(po) {\n if (po.permission_set_id === (psetsAdmin != null ? psetsAdmin._id : void 0) || po.permission_set_id === (psetsUser != null ? psetsUser._id : void 0) || po.permission_set_id === (psetsMember != null ? psetsMember._id : void 0) || po.permission_set_id === (psetsGuest != null ? psetsGuest._id : void 0) || po.permission_set_id === (psetsSupplier != null ? psetsSupplier._id : void 0) || po.permission_set_id === (psetsCustomer != null ? psetsCustomer._id : void 0)) {\n return;\n }\n if (_.isEmpty(permissions)) {\n permissions = po;\n }\n overlayBaseBooleanPermissionProps(permissions, po);\n permissions.disabled_list_views = intersectionPlus(permissions.disabled_list_views, po.disabled_list_views);\n permissions.disabled_actions = intersectionPlus(permissions.disabled_actions, po.disabled_actions);\n permissions.unreadable_fields = intersectionPlus(permissions.unreadable_fields, po.unreadable_fields);\n permissions.uneditable_fields = intersectionPlus(permissions.uneditable_fields, po.uneditable_fields);\n permissions.unrelated_objects = intersectionPlus(permissions.unrelated_objects, po.unrelated_objects);\n return permissions.uneditable_related_list = intersectionPlus(permissions.uneditable_related_list, po.uneditable_related_list);\n });\n }\n if (object.is_view) {\n permissions.allowCreate = false;\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n permissions.modifyAllRecords = false;\n permissions.modifyCompanyRecords = false;\n permissions.disabled_actions = [];\n }\n Creator.processPermissions(permissions);\n if (object.permission_set.owner) {\n permissions.owner = object.permission_set.owner;\n }\n return permissions;\n };\n Meteor.methods({\n \"creator.object_permissions\": function(spaceId) {\n return Creator.getAllPermissions(spaceId, this.userId);\n }\n });\n}\n","\nsteedosCore = require('@steedos/core')\n\nMeteor.startup ()->\n\tcreator_db_url = process.env.MONGO_URL_CREATOR\n\toplog_url = process.env.MONGO_OPLOG_URL_CREATOR\n\tif creator_db_url\n\t\tif !oplog_url\n\t\t\tthrow new Meteor.Error(500, \"Please configure environment variables: MONGO_OPLOG_URL_CREATOR\")\n\t\tCreator._CREATOR_DATASOURCE = {_driver: new MongoInternals.RemoteCollectionDriver(creator_db_url, {oplogUrl: oplog_url})}\n\nCreator.getCollectionName = (object)->\n#\tif object.table_name && object.table_name.endsWith(\"__c\")\n#\t\treturn object.table_name\n#\telse\n#\t\treturn object.name\n\treturn object.name\nCreator.createCollection = (object)->\n\tcollection_key = Creator.getCollectionName(object)\n\tif db[collection_key]\n\t\treturn db[collection_key]\n\telse if object.db\n\t\treturn object.db\n\n\tif Creator.Collections[collection_key]\n\t\treturn Creator.Collections[collection_key]\n\telse\n\t\tif object.custom\n\t\t\treturn steedosCore.newCollection(collection_key, Creator._CREATOR_DATASOURCE)\n\t\telse\n\t\t\tif collection_key == '_sms_queue' && SMSQueue?.collection\n\t\t\t\treturn SMSQueue.collection\n\t\t\treturn steedosCore.newCollection(collection_key)\n\n\n","var steedosCore;\n\nsteedosCore = require('@steedos/core');\n\nMeteor.startup(function() {\n var creator_db_url, oplog_url;\n creator_db_url = process.env.MONGO_URL_CREATOR;\n oplog_url = process.env.MONGO_OPLOG_URL_CREATOR;\n if (creator_db_url) {\n if (!oplog_url) {\n throw new Meteor.Error(500, \"Please configure environment variables: MONGO_OPLOG_URL_CREATOR\");\n }\n return Creator._CREATOR_DATASOURCE = {\n _driver: new MongoInternals.RemoteCollectionDriver(creator_db_url, {\n oplogUrl: oplog_url\n })\n };\n }\n});\n\nCreator.getCollectionName = function(object) {\n return object.name;\n};\n\nCreator.createCollection = function(object) {\n var collection_key;\n collection_key = Creator.getCollectionName(object);\n if (db[collection_key]) {\n return db[collection_key];\n } else if (object.db) {\n return object.db;\n }\n if (Creator.Collections[collection_key]) {\n return Creator.Collections[collection_key];\n } else {\n if (object.custom) {\n return steedosCore.newCollection(collection_key, Creator._CREATOR_DATASOURCE);\n } else {\n if (collection_key === '_sms_queue' && (typeof SMSQueue !== \"undefined\" && SMSQueue !== null ? SMSQueue.collection : void 0)) {\n return SMSQueue.collection;\n }\n return steedosCore.newCollection(collection_key);\n }\n }\n};\n","Creator.actionsByName = {}\n\nif Meteor.isClient\n\t# 定义全局 actions 函数\t\n\tCreator.actions = (actions)->\n\t\t_.each actions, (todo, action_name)->\n\t\t\tCreator.actionsByName[action_name] = todo \n\n\tCreator.executeAction = (object_name, action, record_id, item_element, list_view_id, record, callback)->\n\t\tif action && action.type == 'word-print'\n\t\t\tif record_id\n\t\t\t\tfilters = ['_id', '=', record_id]\n\t\t\telse\n\t\t\t\tfilters = ObjectGrid.getFilters(object_name, list_view_id, false, null, null)\n\t\t\turl = \"/api/v4/word_templates/\" + action.word_template + \"/print\" + \"?filters=\" + SteedosFilters.formatFiltersToODataQuery(filters);\n\t\t\turl = Steedos.absoluteUrl(url);\n\t\t\treturn window.open(url);\n\n\t\tobj = Creator.getObject(object_name)\n\t\tif action?.todo\n\t\t\tif typeof action.todo == \"string\"\n\t\t\t\ttodo = Creator.actionsByName[action.todo]\n\t\t\telse if typeof action.todo == \"function\"\n\t\t\t\ttodo = action.todo\t\n\t\t\tif !record && object_name && record_id\n\t\t\t\trecord = Creator.odata.get(object_name, record_id)\n\t\t\tif todo\n\t\t\t\t# item_element为空时应该设置默认值(对象的name字段),否则moreArgs拿到的后续参数位置就不对\n\t\t\t\titem_element = if item_element then item_element else \"\"\n\t\t\t\tmoreArgs = Array.prototype.slice.call(arguments, 3)\n\t\t\t\ttodoArgs = [object_name, record_id].concat(moreArgs)\n\t\t\t\ttodo.apply {\n\t\t\t\t\tobject_name: object_name\n\t\t\t\t\trecord_id: record_id\n\t\t\t\t\tobject: obj\n\t\t\t\t\taction: action\n\t\t\t\t\titem_element: item_element\n\t\t\t\t\trecord: record\n\t\t\t\t}, todoArgs\n\t\t\telse\n\t\t\t\ttoastr.warning(t(\"_object_actions_none_todo\"))\n\t\telse\n\t\t\ttoastr.warning(t(\"_object_actions_none_todo\"))\n\n\n\t_deleteRecord = (object_name, record_id, record_title, list_view_id, record, call_back, call_back_error)->\n\t\t# console.log(\"===_deleteRecord===\", object_name, record_id, record_title, list_view_id, record, call_back, call_back_error);\n\t\tobject = Creator.getObject(object_name)\n\t\tpreviousDoc = FormManager.getPreviousDoc(object_name, record_id, 'delete')\n\t\tCreator.odata.delete object_name, record_id, ()->\n\t\t\tif record_title\n\t\t\t\t# info = object.label + \"\\\"#{record_title}\\\"\" + \"已删除\"\n\t\t\t\tinfo =t \"creator_record_remove_swal_title_suc\", object.label + \"\\\"#{record_title}\\\"\"\n\t\t\telse\n\t\t\t\tinfo = t('creator_record_remove_swal_suc')\n\t\t\ttoastr.success info\n\t\t\tif call_back and typeof call_back == \"function\"\n\t\t\t\tcall_back()\n\n\t\t\tFormManager.runHook(object_name, 'delete', 'after', {_id: record_id, previousDoc: previousDoc})\n\t\t, (error)->\n\t\t\tif call_back_error and typeof call_back_error == \"function\"\n\t\t\t\tcall_back_error()\n\t\t\tFormManager.runHook(object_name, 'delete', 'error', {_id: record_id, error: error})\n\n\tCreator.relatedObjectStandardNew = (related_object_name)->\n\t\trelateObject = Creator.getObject(related_object_name)\n\t\tcollection_name = relateObject.label\n\t\tcollection = \"Creator.Collections.#{Creator.getObject(related_object_name)._collection_name}\"\n\t\tcurrent_object_name = Session.get(\"object_name\")\n\t\tcurrent_record_id = Session.get(\"record_id\")\n\t\tids = Creator.TabularSelectedIds[related_object_name]\n\t\tinitialValues = {};\n\t\tif ids?.length\n\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\trecord_id = ids[0]\n\t\t\tdoc = Creator.odata.get(related_object_name, record_id)\n\t\t\tinitialValues = doc\n\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\telse\n\t\t\tdefaultDoc = FormManager.getRelatedInitialValues(current_object_name, current_record_id, related_object_name);\n\t\t\tif !_.isEmpty(defaultDoc)\n\t\t\t\tinitialValues = defaultDoc\n\t\tif relateObject?.version >= 2\n\t\t\treturn SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {\n\t\t\t\tname: \"#{related_object_name}_standard_new_form\",\n\t\t\t\tobjectApiName: related_object_name,\n\t\t\t\ttitle: '新建 ' + relateObject.label,\n\t\t\t\tinitialValues: initialValues,\n\t\t\t\tafterInsert: (result)->\n\t\t\t\t\tsetTimeout(()->\n\t\t\t\t\t\t# ObjectForm有缓存,新建子表记录可能会有汇总字段,需要刷新表单数据\n\t\t\t\t\t\tif Creator.getObject(current_object_name).version > 1\n\t\t\t\t\t\t\tSteedosUI.reloadRecord(current_object_name, current_record_id)\n\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t, 1);\n\t\t\t\t\treturn true;\n\t\t\t}, null, {iconPath: '/assets/icons'})\n\n\n\t\tif ids?.length\n\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\tSession.set 'cmDoc', initialValues\n\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\telse\n\t\t\tif !_.isEmpty(initialValues)\n\t\t\t\tSession.set 'cmDoc', initialValues\n\n\t\tSession.set(\"action_fields\", undefined)\n\t\tSession.set(\"action_collection\", collection)\n\t\tSession.set(\"action_collection_name\", collection_name)\n\t\tSession.set(\"action_save_and_insert\", false)\n\t\tMeteor.defer ()->\n\t\t\t$(\".creator-add-related\").click()\n\t\treturn\n\n\tCreator.actions \n\t\t# 在此定义全局 actions\n\t\t\"standard_query\": ()->\n\t\t\tModal.show(\"standard_query_modal\")\n\n\t\t\"standard_new\": (object_name, record_id, fields)->\n\t\t\t# current_record_id = Session.get(\"record_id\")\n\t\t\t# if current_record_id\n\t\t\t# \t# amis 相关子表右上角新建\n\t\t\t# \tCreator.relatedObjectStandardNew(object_name)\n\t\t\t# \treturn \n\t\t\tobject = Creator.getObject(object_name);\n\t\t\tgridName = this.action.gridName;\n\t\t\tisRelated = this.action.isRelated;\n\t\t\tif isRelated\n\t\t\t\trelatedFieldName = this.action.relatedFieldName;\n\t\t\t\tmasterRecordId = this.action.masterRecordId;\n\t\t\t\tinitialValues = this.action.initialValues\n\t\t\t\tif !initialValues\n\t\t\t\t\tinitialValues = {};\n\t\t\t\t\tinitialValues[relatedFieldName] = masterRecordId\n\t\t\telse\n\t\t\t\tinitialValues={}\n\t\t\t\tif(gridName)\n\t\t\t\t\tselectedRows = window.gridRefs?[gridName].current?.api?.getSelectedRows()\n\t\t\t\telse\n\t\t\t\t\tselectedRows = window.gridRef?.current?.api?.getSelectedRows()\t\n\t\t\t\t\n\t\t\t\tif selectedRows?.length\n\t\t\t\t\trecord_id = selectedRows[0]._id;\n\t\t\t\t\tif record_id\n\t\t\t\t\t\tinitialValues = Creator.odata.get(object_name, record_id)\n\n\t\t\t\telse\n\t\t\t\t\tinitialValues = FormManager.getInitialValues(object_name)\n\n\t\t\tif object?.version >= 2\n\t\t\t\treturn Steedos.Page.Form.StandardNew.render(Session.get(\"app_id\"), object_name, t('New') + ' ' + object.label, initialValues , {gridName: gridName});\n\t\t\tSession.set 'action_object_name', object_name\n\t\t\tif selectedRows?.length\n\t\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\t\tSession.set 'cmDoc', initialValues\n\t\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\t\telse\n\t\t\t\tSession.set 'cmDoc', initialValues\n\t\t\tMeteor.defer ()->\n\t\t\t\t$(\".creator-add\").click()\n\t\t\treturn \n\n\t\t\"standard_open_view\": (object_name, record_id, fields)->\n\t\t\thref = Creator.getObjectUrl(object_name, record_id)\n\t\t\tFlowRouter.redirect(href)\n\t\t\treturn false\n\n\t\t\"standard_edit\": (object_name, record_id, fields)->\n\t\t\tif record_id\n\t\t\t\tobject = Creator.getObject(object_name);\n\t\t\t\tif object?.version >= 2\n\t\t\t\t\treturn Steedos.Page.Form.StandardEdit.render(Session.get(\"app_id\"), object_name, t('Edit') + ' ' + object.label, record_id, {\n\t\t\t\t\t\tgridName: this.action.gridName\n\t\t\t\t\t})\n\t\t\t\tif Steedos.isMobile() && false\n#\t\t\t\t\trecord = Creator.getObjectRecord(object_name, record_id)\n#\t\t\t\t\tSession.set 'cmDoc', record\n#\t\t\t\t\tSession.set 'reload_dxlist', false\n\t\t\t\t\tSession.set 'action_object_name', object_name\n\t\t\t\t\tSession.set 'action_record_id', record_id\n\t\t\t\t\tif this.record\n\t\t\t\t\t\tSession.set 'cmDoc', this.record\n\t\t\t\t\tMeteor.defer ()->\n\t\t\t\t\t\t$(\".btn-edit-record\").click()\n\t\t\t\telse\n\t\t\t\t\tSession.set 'action_object_name', object_name\n\t\t\t\t\tSession.set 'action_record_id', record_id\n\t\t\t\t\tif this.record\n\t\t\t\t\t\tSession.set 'cmDoc', this.record\n\t\t\t\t\t\tMeteor.defer ()->\n\t\t\t\t\t\t\t$(\".btn.creator-edit\").click()\n\n\t\t\"standard_delete\": (object_name, record_id, record_title, list_view_id, record, call_back)->\n\t\t\tgridName = this.action.gridName;\n\t\t\t# console.log(\"===standard_delete===\", object_name, record_id, record_title, list_view_id, record, call_back);\n\t\t\tif record_id\n\t\t\t\tbeforeHook = FormManager.runHook(object_name, 'delete', 'before', {_id: record_id})\n\t\t\t\tif !beforeHook\n\t\t\t\t\treturn false;\n\t\t\tobject = Creator.getObject(object_name)\n\t\t\tnameField = object.NAME_FIELD_KEY || \"name\"\n\n\t\t\tunless list_view_id\n\t\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\t\t\tunless list_view_id\n\t\t\t\tlist_view_id = \"all\"\n\n\t\t\tif(!_.isString(record_title) && record_title)\n\t\t\t\trecord_title = record_title[nameField]\n\t\t\t\n\t\t\tif record && !record_title\n\t\t\t\trecord_title = record[nameField]\n\t\t\t\n\t\t\ti18nTitleKey = \"creator_record_remove_swal_title\"\n\t\t\ti18nTextKey = \"creator_record_remove_swal_text\"\n\n\t\t\tunless record_id\n\t\t\t\ti18nTitleKey = \"creator_record_remove_many_swal_title\"\n\t\t\t\ti18nTextKey = \"creator_record_remove_many_swal_text\"\n\n\t\t\t\t# 如果是批量删除,则传入的list_view_id为列表视图的name,用于获取列表选中项\n\t\t\t\t# 主列表规则是\"listview_#{object_name}_#{list_view_id}\",相关表规则是\"related_listview_#{object_name}_#{related_object_name}_#{related_field_name}\"\n\t\t\t\tselectedRecords = SteedosUI.getTableSelectedRows(gridName || list_view_id)\n\t\t\t\tif !selectedRecords || !selectedRecords.length\n\t\t\t\t\ttoastr.warning(t(\"creator_record_remove_many_no_selection\"))\n\t\t\t\t\treturn\n\n\t\t\tif record_title\n\t\t\t\ttext = t i18nTextKey, \"#{object.label} \\\"#{record_title}\\\"\"\n\t\t\telse\n\t\t\t\ttext = t i18nTextKey, \"#{object.label}\"\n\t\t\tswal\n\t\t\t\ttitle: t i18nTitleKey, \"#{object.label}\"\n\t\t\t\ttext: \"
#{text}
\"\n\t\t\t\thtml: true\n\t\t\t\tshowCancelButton:true\n\t\t\t\tconfirmButtonText: t('Delete')\n\t\t\t\tcancelButtonText: t('Cancel')\n\t\t\t\t(option) ->\n\t\t\t\t\tif option\n\t\t\t\t\t\tif record_id\n\t\t\t\t\t\t\t# 单条记录删除\n\t\t\t\t\t\t\t_deleteRecord object_name, record_id, record_title, list_view_id, record, ()->\n\t\t\t\t\t\t\t\t# 文件版本为\"cfs.files.filerecord\",需要替换为\"cfs-files-filerecord\"\n\t\t\t\t\t\t\t\tgridObjectNameClass = object_name.replace(/\\./g,\"-\")\n\t\t\t\t\t\t\t\tgridContainer = $(\".gridContainer.#{gridObjectNameClass}\")\n\t\t\t\t\t\t\t\tunless gridContainer?.length\n\t\t\t\t\t\t\t\t\tif window.opener\n\t\t\t\t\t\t\t\t\t\tisOpenerRemove = false\n\t\t\t\t\t\t\t\t\t\tgridContainer = window.opener.$(\".gridContainer.#{gridObjectNameClass}\")\n\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t\t# ObjectForm有缓存,删除子表记录可能会有汇总字段,需要刷新表单数据\n\t\t\t\t\t\t\t\t\tcurrent_object_name = Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\tcurrent_record_id = Session.get(\"record_id\")\n\t\t\t\t\t\t\t\t\tif current_object_name && Creator.getObject(current_object_name)?.version > 1\n\t\t\t\t\t\t\t\t\t\tSteedosUI.reloadRecord(current_object_name, current_record_id)\n\t\t\t\t\t\t\t\t\tif FlowRouter.current().route.path.endsWith(\"/:record_id\")\n\t\t\t\t\t\t\t\t\t\tif object_name != Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\twindow.refreshGrid(gridName);\n\t\t\t\t\t\t\t\tcatch _e\n\t\t\t\t\t\t\t\t\tconsole.error(_e);\n\t\t\t\t\t\t\t\tif gridContainer?.length\n\t\t\t\t\t\t\t\t\tif object.enable_tree\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance = gridContainer.dxTreeList().dxTreeList('instance')\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance = gridContainer.dxDataGrid().dxDataGrid('instance')\n\t\t\t\t\t\t\t\tif dxDataGridInstance\n\t\t\t\t\t\t\t\t\tif object.enable_tree\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance.refresh()\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tif object_name != Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t\t\t\t\t\t# else\n\t\t\t\t\t\t\t\t\t\t# \tTemplate.creator_grid.refresh(dxDataGridInstance)\n\t\t\t\t\t\t\t\trecordUrl = Creator.getObjectUrl(object_name, record_id)\n\t\t\t\t\t\t\t\ttempNavRemoved = Creator.removeTempNavItem(object_name, recordUrl) #无论是在记录详细界面还是列表界面执行删除操作,都会把临时导航删除掉\n\t\t\t\t\t\t\t\tif isOpenerRemove or !dxDataGridInstance\n\t\t\t\t\t\t\t\t\tif isOpenerRemove\n\t\t\t\t\t\t\t\t\t\twindow.close()\n\t\t\t\t\t\t\t\t\telse if record_id == Session.get(\"record_id\") and list_view_id != 'calendar'\n\t\t\t\t\t\t\t\t\t\tappid = Session.get(\"app_id\")\n\t\t\t\t\t\t\t\t\t\tunless tempNavRemoved\n\t\t\t\t\t\t\t\t\t\t\t# 如果确实删除了临时导航,就可能已经重定向到上一个页面了,没必要再重定向一次\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.go \"/app/#{appid}/#{object_name}/grid/#{list_view_id}\"\n\t\t\t\t\t\t\t\tif call_back and typeof call_back == \"function\"\n\t\t\t\t\t\t\t\t\tcall_back()\t\t\t\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t# 批量删除\n\t\t\t\t\t\t\tif selectedRecords && selectedRecords.length\n\t\t\t\t\t\t\t\t$(\"body\").addClass(\"loading\")\n\t\t\t\t\t\t\t\tdeleteCounter = 0;\n\t\t\t\t\t\t\t\tafterBatchesDelete = ()->\n\t\t\t\t\t\t\t\t\tdeleteCounter++\n\t\t\t\t\t\t\t\t\tif deleteCounter >= selectedRecords.length\n\t\t\t\t\t\t\t\t\t\t# console.log(\"deleteCounter, selectedRecords.length===\", deleteCounter, selectedRecords.length);\n\t\t\t\t\t\t\t\t\t\t$(\"body\").removeClass(\"loading\")\n\t\t\t\t\t\t\t\t\t\twindow.refreshGrid(gridName);\n\t\t\t\t\t\t\t\tselectedRecords.forEach (record)->\n\t\t\t\t\t\t\t\t\trecord_id = record._id\n\t\t\t\t\t\t\t\t\tbeforeHook = FormManager.runHook(object_name, 'delete', 'before', {_id: record_id})\n\t\t\t\t\t\t\t\t\tif !beforeHook\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\trecordTitle = record[nameField] || record_id\n\t\t\t\t\t\t\t\t\t_deleteRecord object_name, record._id, recordTitle, list_view_id, record, (()->\n\t\t\t\t\t\t\t\t\t\trecordUrl = Creator.getObjectUrl(object_name, record_id)\n\t\t\t\t\t\t\t\t\t\tCreator.removeTempNavItem(object_name, recordUrl) #无论是在记录详细界面还是列表界面执行删除操作,都会把临时导航删除掉\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()\n\t\t\t\t\t\t\t\t\t), ()->\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()","var _deleteRecord;\n\nCreator.actionsByName = {};\n\nif (Meteor.isClient) {\n Creator.actions = function(actions) {\n return _.each(actions, function(todo, action_name) {\n return Creator.actionsByName[action_name] = todo;\n });\n };\n Creator.executeAction = function(object_name, action, record_id, item_element, list_view_id, record, callback) {\n var filters, moreArgs, obj, todo, todoArgs, url;\n if (action && action.type === 'word-print') {\n if (record_id) {\n filters = ['_id', '=', record_id];\n } else {\n filters = ObjectGrid.getFilters(object_name, list_view_id, false, null, null);\n }\n url = \"/api/v4/word_templates/\" + action.word_template + \"/print\" + \"?filters=\" + SteedosFilters.formatFiltersToODataQuery(filters);\n url = Steedos.absoluteUrl(url);\n return window.open(url);\n }\n obj = Creator.getObject(object_name);\n if (action != null ? action.todo : void 0) {\n if (typeof action.todo === \"string\") {\n todo = Creator.actionsByName[action.todo];\n } else if (typeof action.todo === \"function\") {\n todo = action.todo;\n }\n if (!record && object_name && record_id) {\n record = Creator.odata.get(object_name, record_id);\n }\n if (todo) {\n item_element = item_element ? item_element : \"\";\n moreArgs = Array.prototype.slice.call(arguments, 3);\n todoArgs = [object_name, record_id].concat(moreArgs);\n return todo.apply({\n object_name: object_name,\n record_id: record_id,\n object: obj,\n action: action,\n item_element: item_element,\n record: record\n }, todoArgs);\n } else {\n return toastr.warning(t(\"_object_actions_none_todo\"));\n }\n } else {\n return toastr.warning(t(\"_object_actions_none_todo\"));\n }\n };\n _deleteRecord = function(object_name, record_id, record_title, list_view_id, record, call_back, call_back_error) {\n var object, previousDoc;\n object = Creator.getObject(object_name);\n previousDoc = FormManager.getPreviousDoc(object_name, record_id, 'delete');\n return Creator.odata[\"delete\"](object_name, record_id, function() {\n var info;\n if (record_title) {\n info = t(\"creator_record_remove_swal_title_suc\", object.label + (\"\\\"\" + record_title + \"\\\"\"));\n } else {\n info = t('creator_record_remove_swal_suc');\n }\n toastr.success(info);\n if (call_back && typeof call_back === \"function\") {\n call_back();\n }\n return FormManager.runHook(object_name, 'delete', 'after', {\n _id: record_id,\n previousDoc: previousDoc\n });\n }, function(error) {\n if (call_back_error && typeof call_back_error === \"function\") {\n call_back_error();\n }\n return FormManager.runHook(object_name, 'delete', 'error', {\n _id: record_id,\n error: error\n });\n });\n };\n Creator.relatedObjectStandardNew = function(related_object_name) {\n var collection, collection_name, current_object_name, current_record_id, defaultDoc, doc, ids, initialValues, record_id, relateObject;\n relateObject = Creator.getObject(related_object_name);\n collection_name = relateObject.label;\n collection = \"Creator.Collections.\" + (Creator.getObject(related_object_name)._collection_name);\n current_object_name = Session.get(\"object_name\");\n current_record_id = Session.get(\"record_id\");\n ids = Creator.TabularSelectedIds[related_object_name];\n initialValues = {};\n if (ids != null ? ids.length : void 0) {\n record_id = ids[0];\n doc = Creator.odata.get(related_object_name, record_id);\n initialValues = doc;\n Session.set('cmShowAgainDuplicated', true);\n } else {\n defaultDoc = FormManager.getRelatedInitialValues(current_object_name, current_record_id, related_object_name);\n if (!_.isEmpty(defaultDoc)) {\n initialValues = defaultDoc;\n }\n }\n if ((relateObject != null ? relateObject.version : void 0) >= 2) {\n return SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {\n name: related_object_name + \"_standard_new_form\",\n objectApiName: related_object_name,\n title: '新建 ' + relateObject.label,\n initialValues: initialValues,\n afterInsert: function(result) {\n setTimeout(function() {\n if (Creator.getObject(current_object_name).version > 1) {\n SteedosUI.reloadRecord(current_object_name, current_record_id);\n }\n return FlowRouter.reload();\n }, 1);\n return true;\n }\n }, null, {\n iconPath: '/assets/icons'\n });\n }\n if (ids != null ? ids.length : void 0) {\n Session.set('cmDoc', initialValues);\n Session.set('cmShowAgainDuplicated', true);\n } else {\n if (!_.isEmpty(initialValues)) {\n Session.set('cmDoc', initialValues);\n }\n }\n Session.set(\"action_fields\", void 0);\n Session.set(\"action_collection\", collection);\n Session.set(\"action_collection_name\", collection_name);\n Session.set(\"action_save_and_insert\", false);\n Meteor.defer(function() {\n return $(\".creator-add-related\").click();\n });\n };\n Creator.actions({\n \"standard_query\": function() {\n return Modal.show(\"standard_query_modal\");\n },\n \"standard_new\": function(object_name, record_id, fields) {\n var gridName, initialValues, isRelated, masterRecordId, object, ref, ref1, ref2, ref3, ref4, ref5, relatedFieldName, selectedRows;\n object = Creator.getObject(object_name);\n gridName = this.action.gridName;\n isRelated = this.action.isRelated;\n if (isRelated) {\n relatedFieldName = this.action.relatedFieldName;\n masterRecordId = this.action.masterRecordId;\n initialValues = this.action.initialValues;\n if (!initialValues) {\n initialValues = {};\n initialValues[relatedFieldName] = masterRecordId;\n }\n } else {\n initialValues = {};\n if (gridName) {\n selectedRows = (ref = window.gridRefs) != null ? (ref1 = ref[gridName].current) != null ? (ref2 = ref1.api) != null ? ref2.getSelectedRows() : void 0 : void 0 : void 0;\n } else {\n selectedRows = (ref3 = window.gridRef) != null ? (ref4 = ref3.current) != null ? (ref5 = ref4.api) != null ? ref5.getSelectedRows() : void 0 : void 0 : void 0;\n }\n if (selectedRows != null ? selectedRows.length : void 0) {\n record_id = selectedRows[0]._id;\n if (record_id) {\n initialValues = Creator.odata.get(object_name, record_id);\n }\n } else {\n initialValues = FormManager.getInitialValues(object_name);\n }\n }\n if ((object != null ? object.version : void 0) >= 2) {\n return Steedos.Page.Form.StandardNew.render(Session.get(\"app_id\"), object_name, t('New') + ' ' + object.label, initialValues, {\n gridName: gridName\n });\n }\n Session.set('action_object_name', object_name);\n if (selectedRows != null ? selectedRows.length : void 0) {\n Session.set('cmDoc', initialValues);\n Session.set('cmShowAgainDuplicated', true);\n } else {\n Session.set('cmDoc', initialValues);\n }\n Meteor.defer(function() {\n return $(\".creator-add\").click();\n });\n },\n \"standard_open_view\": function(object_name, record_id, fields) {\n var href;\n href = Creator.getObjectUrl(object_name, record_id);\n FlowRouter.redirect(href);\n return false;\n },\n \"standard_edit\": function(object_name, record_id, fields) {\n var object;\n if (record_id) {\n object = Creator.getObject(object_name);\n if ((object != null ? object.version : void 0) >= 2) {\n return Steedos.Page.Form.StandardEdit.render(Session.get(\"app_id\"), object_name, t('Edit') + ' ' + object.label, record_id, {\n gridName: this.action.gridName\n });\n }\n if (Steedos.isMobile() && false) {\n Session.set('action_object_name', object_name);\n Session.set('action_record_id', record_id);\n if (this.record) {\n Session.set('cmDoc', this.record);\n }\n return Meteor.defer(function() {\n return $(\".btn-edit-record\").click();\n });\n } else {\n Session.set('action_object_name', object_name);\n Session.set('action_record_id', record_id);\n if (this.record) {\n Session.set('cmDoc', this.record);\n return Meteor.defer(function() {\n return $(\".btn.creator-edit\").click();\n });\n }\n }\n }\n },\n \"standard_delete\": function(object_name, record_id, record_title, list_view_id, record, call_back) {\n var beforeHook, gridName, i18nTextKey, i18nTitleKey, nameField, object, selectedRecords, text;\n gridName = this.action.gridName;\n if (record_id) {\n beforeHook = FormManager.runHook(object_name, 'delete', 'before', {\n _id: record_id\n });\n if (!beforeHook) {\n return false;\n }\n }\n object = Creator.getObject(object_name);\n nameField = object.NAME_FIELD_KEY || \"name\";\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n if (!list_view_id) {\n list_view_id = \"all\";\n }\n if (!_.isString(record_title) && record_title) {\n record_title = record_title[nameField];\n }\n if (record && !record_title) {\n record_title = record[nameField];\n }\n i18nTitleKey = \"creator_record_remove_swal_title\";\n i18nTextKey = \"creator_record_remove_swal_text\";\n if (!record_id) {\n i18nTitleKey = \"creator_record_remove_many_swal_title\";\n i18nTextKey = \"creator_record_remove_many_swal_text\";\n selectedRecords = SteedosUI.getTableSelectedRows(gridName || list_view_id);\n if (!selectedRecords || !selectedRecords.length) {\n toastr.warning(t(\"creator_record_remove_many_no_selection\"));\n return;\n }\n }\n if (record_title) {\n text = t(i18nTextKey, object.label + \" \\\"\" + record_title + \"\\\"\");\n } else {\n text = t(i18nTextKey, \"\" + object.label);\n }\n return swal({\n title: t(i18nTitleKey, \"\" + object.label),\n text: \"
\" + text + \"
\",\n html: true,\n showCancelButton: true,\n confirmButtonText: t('Delete'),\n cancelButtonText: t('Cancel')\n }, function(option) {\n var afterBatchesDelete, deleteCounter;\n if (option) {\n if (record_id) {\n return _deleteRecord(object_name, record_id, record_title, list_view_id, record, function() {\n var _e, appid, current_object_name, current_record_id, dxDataGridInstance, gridContainer, gridObjectNameClass, isOpenerRemove, recordUrl, ref, tempNavRemoved;\n gridObjectNameClass = object_name.replace(/\\./g, \"-\");\n gridContainer = $(\".gridContainer.\" + gridObjectNameClass);\n if (!(gridContainer != null ? gridContainer.length : void 0)) {\n if (window.opener) {\n isOpenerRemove = false;\n gridContainer = window.opener.$(\".gridContainer.\" + gridObjectNameClass);\n }\n }\n try {\n current_object_name = Session.get(\"object_name\");\n current_record_id = Session.get(\"record_id\");\n if (current_object_name && ((ref = Creator.getObject(current_object_name)) != null ? ref.version : void 0) > 1) {\n SteedosUI.reloadRecord(current_object_name, current_record_id);\n }\n if (FlowRouter.current().route.path.endsWith(\"/:record_id\")) {\n if (object_name !== Session.get(\"object_name\")) {\n FlowRouter.reload();\n }\n } else {\n window.refreshGrid(gridName);\n }\n } catch (error1) {\n _e = error1;\n console.error(_e);\n }\n if (gridContainer != null ? gridContainer.length : void 0) {\n if (object.enable_tree) {\n dxDataGridInstance = gridContainer.dxTreeList().dxTreeList('instance');\n } else {\n dxDataGridInstance = gridContainer.dxDataGrid().dxDataGrid('instance');\n }\n }\n if (dxDataGridInstance) {\n if (object.enable_tree) {\n dxDataGridInstance.refresh();\n } else {\n if (object_name !== Session.get(\"object_name\")) {\n FlowRouter.reload();\n }\n }\n }\n recordUrl = Creator.getObjectUrl(object_name, record_id);\n tempNavRemoved = Creator.removeTempNavItem(object_name, recordUrl);\n if (isOpenerRemove || !dxDataGridInstance) {\n if (isOpenerRemove) {\n window.close();\n } else if (record_id === Session.get(\"record_id\") && list_view_id !== 'calendar') {\n appid = Session.get(\"app_id\");\n if (!tempNavRemoved) {\n FlowRouter.go(\"/app/\" + appid + \"/\" + object_name + \"/grid/\" + list_view_id);\n }\n }\n }\n if (call_back && typeof call_back === \"function\") {\n return call_back();\n }\n });\n } else {\n if (selectedRecords && selectedRecords.length) {\n $(\"body\").addClass(\"loading\");\n deleteCounter = 0;\n afterBatchesDelete = function() {\n deleteCounter++;\n if (deleteCounter >= selectedRecords.length) {\n $(\"body\").removeClass(\"loading\");\n return window.refreshGrid(gridName);\n }\n };\n return selectedRecords.forEach(function(record) {\n var recordTitle;\n record_id = record._id;\n beforeHook = FormManager.runHook(object_name, 'delete', 'before', {\n _id: record_id\n });\n if (!beforeHook) {\n afterBatchesDelete();\n return;\n }\n recordTitle = record[nameField] || record_id;\n return _deleteRecord(object_name, record._id, recordTitle, list_view_id, record, (function() {\n var recordUrl;\n recordUrl = Creator.getObjectUrl(object_name, record_id);\n Creator.removeTempNavItem(object_name, recordUrl);\n return afterBatchesDelete();\n }), function() {\n return afterBatchesDelete();\n });\n });\n }\n }\n }\n });\n }\n });\n}\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/steedos_objects/core.coffee","meteor://💻app/core.coffee","meteor://💻app/packages/steedos_objects/loadStandardObjects.coffee","meteor://💻app/loadStandardObjects.coffee","meteor://💻app/packages/steedos_objects/coreSupport.coffee","meteor://💻app/coreSupport.coffee","meteor://💻app/packages/steedos_objects/server/methods/object_options.coffee","meteor://💻app/server/methods/object_options.coffee","meteor://💻app/packages/steedos_objects/lib/listviews.coffee","meteor://💻app/lib/listviews.coffee","meteor://💻app/packages/steedos_objects/lib/add_simple_schema_validation_error.coffee","meteor://💻app/lib/add_simple_schema_validation_error.coffee","meteor://💻app/packages/steedos_objects/lib/field_simple_schema_validation_error.coffee","meteor://💻app/lib/field_simple_schema_validation_error.coffee","meteor://💻app/packages/steedos:objects/lib/eval.js","meteor://💻app/packages/steedos_objects/lib/convert.coffee","meteor://💻app/lib/convert.coffee","meteor://💻app/packages/steedos_objects/lib/formular.coffee","meteor://💻app/lib/formular.coffee","meteor://💻app/packages/steedos_objects/lib/object.coffee","meteor://💻app/lib/object.coffee","meteor://💻app/packages/steedos_objects/lib/fields.coffee","meteor://💻app/lib/fields.coffee","meteor://💻app/packages/steedos_objects/lib/triggers.coffee","meteor://💻app/lib/triggers.coffee","meteor://💻app/packages/steedos_objects/lib/permission_sets.coffee","meteor://💻app/lib/permission_sets.coffee","meteor://💻app/packages/steedos_objects/lib/collections.coffee","meteor://💻app/lib/collections.coffee","meteor://💻app/packages/steedos_objects/lib/actions.coffee","meteor://💻app/lib/actions.coffee"],"names":["db","Creator","Objects","Collections","Menus","Apps","Dashboards","Reports","subs","steedosSchema","APIService","MetadataService","config","e","moleculer","objectql","packageLoader","packageService","path","settings","steedosCore","process","env","CREATOR_NODE_ENV","require","getSteedosConfig","built_in_plugins","plugins","Meteor","startup","apiService","broker","ex","metadataService","objectqlService","pageService","projectService","standardObjectsDir","standardObjectsPackageLoaderService","steedosService","uiService","ServiceBroker","namespace","nodeID","metadata","transporter","TRANSPORTER","cacher","CACHER","logLevel","serializer","requestTimeout","maxCallLevel","heartbeatInterval","heartbeatTimeout","contextParamsCloning","tracking","enabled","shutdownTimeout","disableBalancer","registry","strategy","preferLocal","bulkhead","concurrency","maxQueueSize","validator","errorHandler","tracing","exporter","type","options","logger","colors","width","gaugeWidth","skipProcessEventRegistration","created","warn","clean","init","createService","name","mixins","port","started","setTimeout","emit","getSteedosSchema","StandardObjectsPath","packageInfo","wrapAsync","cb","start","then","connectHandlersExpress","express","_restartService","use","staticRouter","waitForServices","console","log","SteedosApi","WebApp","connectHandlers","resolve","reject","error","Fiber","deps","app","Tracker","Dependency","object","_TEMPLATE","SimpleSchema","extendOptions","filtersFunction","Match","Optional","OneOf","Function","String","optionsFunction","createFunction","isServer","fiberLoadObjects","obj","object_name","loadObjects","run","list_views","space","getCollectionName","_","clone","convertObject","Object","initTriggers","initListViews","getObjectName","getObject","space_id","ref","ref1","isArray","isClient","depend","Session","get","objectsByName","getObjectById","object_id","findWhere","_id","removeObject","getCollection","spaceId","_collection_name","removeCollection","isSpaceAdmin","userId","findOne","fields","admins","indexOf","evaluateFormula","formular","context","isString","Formular","checkFormula","evaluateFilters","filters","selector","each","filter","action","value","length","isCommonSpace","getOrderlySetByIds","docs","ids","id_key","hit_first","values","getProperty","sortBy","doc","_index","v","sortingMethod","value1","value2","isValue1Empty","isValue2Empty","locale","key","Date","getTime","Steedos","toString","localeCompare","getObjectRelateds","_object","permissions","relatedList","relatedListMap","related_objects","isEmpty","objName","isObject","objectName","related_object","related_object_name","related_field","related_field_name","reference_to","foreign_key","write_requires_master_read","enableObjName","getPermissions","enable_audit","modifyAllRecords","enable_files","push","sfsFilesObject","splice","enable_tasks","enable_notes","enable_events","enable_instances","enable_approvals","enable_process","getUserContext","isUnSafeMode","USER_CONTEXT","space_user_org","su","suFields","Error","mobile","position","email","company","organization","company_id","company_ids","user","fullname","getRelativeUrl","url","isFunction","isCordova","startsWith","test","__meteor_runtime_config__","ROOT_URL_PATH_PREFIX","getUserCompanyId","getUserCompanyIds","processPermissions","po","allowCreate","allowRead","allowEdit","allowDelete","viewAllRecords","viewCompanyRecords","modifyCompanyRecords","allowReadFiles","viewAllFiles","allowCreateFiles","allowEditFiles","allowDeleteFiles","modifyAllFiles","getTemplateSpaceId","templateSpaceId","getCloudAdminSpaceId","cloudAdminSpaceId","isTemplateSpace","isCloudAdminSpace","steedosStorageDir","STEEDOS_STORAGE_DIR","methods","collection","name_field_key","options_limit","query","query_options","records","results","searchTextQuery","selected","sort","params","NAME_FIELD_KEY","searchText","$regex","$or","$in","extend","$nin","filterQuery","limit","find","fetch","record","label","message","JSON","stringify","getInitWidthPercent","columns","_schema","column_num","init_width_percent","getSchema","field_name","field","is_wide","ref2","pick","autoform","getFieldIsWide","getTabularOrder","list_view_id","setting","record_id","map","column","hidden","compact","order","index","default_extra_columns","extra_columns","getObjectDefaultColumns","getObjectDefaultExtraColumns","union","getObjectDefaultSort","TabularSelectedIds","convertListView","default_view","list_view","list_view_name","default_columns","default_mobile_columns","oitem","mobile_columns","has","include","filter_scope","parse","forEach","_value","getRelatedList","layoutRelatedList","list","mapList","objectLayoutRelatedListObjects","relatedListNames","relatedListObjects","related_object_names","unrelated_objects","related_lists","item","reFieldName","reObjectName","related","related_field_fullname","split","field_names","is_file","customRelatedListObject","actions","buttons","visible_on","page_size","objOrName","getRelatedObjects","related_object_item","relatedObject","tabular_order","getObjectFirstListViewColumns","without","transformSortToTabular","replace","pluck","difference","isActive","allow_relatedList","getObjectFirstListView","first","getListViews","getListView","exac","listViews","getListViewIsRecent","listView","pickObjectMobileColumns","count","getField","isNameColumn","itemCount","maxCount","maxRows","nameColumn","nameKey","result","getObjectDefaultView","defaultView","use_mobile_columns","isAllView","isRecentView","tabularColumns","tabular_sort","column_index","transformSortToDX","dx_sort","RegEx","code","RegExp","_regExMessages","_globalMessages","regEx","exp","msg","messages","evalInContext","js","eval","call","convertField","getOption","option","foo","color","allOptions","picklist","picklistOptions","getPicklist","getPickListOptions","reverse","enable","defaultValue","triggers","trigger","_todo","_todo_from_code","_todo_from_db","on","todo","systemBaseFields","omit","required","readonly","getSystemBaseFields","_visible","error1","actionsByName","trim","isExpression","visible","record_permissions","globalData","assign","now","parseSingleExpression","_options","_type","beforeOpenFunction","is_company_limited","max","min","_option","k","_regEx","_min","_max","Number","Boolean","_optionsFunction","_reference_to","_createFunction","_beforeOpenFunction","_filtersFunction","_defaultValue","_is_company_limited","_filters","isDate","pop","_is_date","form","val","relatedObjInfo","PREFIX","_prependPrefixForFormula","prefix","fieldVariable","reg","rev","m","$1","formula_str","_CONTEXT","_VALUES","data","isBoolean","toastr","formatObjectName","_baseObject","_db","defaultListViewId","disabled_list_views","ref3","schema","self","baseObject","permission_set","icon","description","is_view","hasImportTemplates","version","is_enable","allow_customActions","exclude_actions","enable_search","paging","enable_api","custom","enable_share","enable_tree","sidebar","open_window","filter_company","calendar","enable_chatter","enable_trash","enable_space_global","enable_follow","enable_workflow","enable_inline_edit","details","masters","lookup_details","in_development","idFieldName","database_name","is_name","primary","filterable","item_name","copyItem","admin","all","list_view_item","ReactiveVar","createCollection","_name","getObjectSchema","contains","attachSchema","_simpleSchema","getObjectODataRouterPrefix","bootstrapLoaded","getSelectOptions","fieldSchema","data_type","optionItem","fieldsArr","_ref_obj","autoform_type","collectionName","fs","fsType","isUnLimited","multiple","rows","language","isMobile","isPad","isiOS","afFieldInput","timezoneId","dxDateBoxOptions","displayFormat","pickerType","dateMobileOptions","outFormat","showIcon","dependOn","depend_on","create","lookup_field","Modal","show","formId","operation","onSuccess","addItems","reference_sort","optionsSort","reference_limit","optionsLimit","reference_to_field","referenceToField","blackbox","objectSwitche","optionsMethod","optionsMethodParams","references","_reference","link","defaultIcon","firstOption","decimal","precision","scale","disabled","Array","editable","accept","system","Email","isNumber","optional","unique","group","searchable","inlineHelpText","isProduction","sortable","getFieldDisplayValue","field_value","html","moment","format","checkFieldTypeSupportBetweenQuery","field_type","includes","pushBetweenBuiltinOptionals","operations","builtinValues","getBetweenBuiltinValues","builtinItem","is_check_only","getBetweenTimeBuiltinValues","getBetweenBuiltinValueItem","getBetweenTimeBuiltinValueItem","getBetweenBuiltinOperation","betweenBuiltinValues","getQuarterStartMonth","month","getMonth","getLastQuarterFirstDay","year","getFullYear","getNextQuarterFirstDay","getMonthDays","days","endDate","millisecond","startDate","getLastMonthFirstDay","currentMonth","currentYear","endValue","firstDay","lastDay","lastMonday","lastMonthFinalDay","lastMonthFirstDay","lastQuarterEndDay","lastQuarterStartDay","lastSunday","last_120_days","last_30_days","last_60_days","last_7_days","last_90_days","minusDay","monday","nextMonday","nextMonthFinalDay","nextMonthFirstDay","nextQuarterEndDay","nextQuarterStartDay","nextSunday","nextYear","next_120_days","next_30_days","next_60_days","next_7_days","next_90_days","previousYear","startValue","strEndDay","strFirstDay","strLastDay","strMonday","strStartDay","strSunday","strToday","strTomorrow","strYestday","sunday","thisQuarterEndDay","thisQuarterStartDay","tomorrow","week","yestday","getDay","t","fv","setHours","getHours","getTimezoneOffset","getFieldDefaultOperation","getFieldOperation","optionals","equal","unequal","less_than","greater_than","less_or_equal","greater_or_equal","not_contain","starts_with","between","getObjectFieldsName","fieldsName","sort_no","cleanTrigger","initTrigger","_trigger_hooks","ref4","ref5","todoWrapper","apply","arguments","when","before","insert","update","remove","after","_hook","trigger_name","_trigger_hook","baseBooleanPermissionPropNames","extendPermissionProps","findOne_permission_object","find_permission_object","intersectionPlus","otherPermissionPropNames","overlayBaseBooleanPermissionProps","permissionPropNames","unionPermissionObjects","unionPlus","getObjectPermissions","getRecordPermissions","isOwner","masterObjectName","masterRecordPerm","record_company_id","record_company_ids","user_company_ids","owner","parent","n","intersection","locked","getRecordRelatedListPermissions","currentObjectName","relatedListItem","currentRecord","isRelateObjectUneditable","masterAllow","relatedObjectPermissions","uneditable_related_list","getObjectRecord","getRecordSafeRelatedList","getAllPermissions","_i","psets","psetsAdmin","psetsAdmin_pos","psetsCurrent","psetsCurrentNames","psetsCurrent_pos","psetsCustomer","psetsCustomer_pos","psetsGuest","psetsGuest_pos","psetsMember","psetsMember_pos","psetsSupplier","psetsSupplier_pos","psetsUser","psetsUser_pos","set_ids","spaceUser","objects","assigned_apps","profile","users","permission_set_id","modified","created_by","modified_by","getAssignedApps","bind","assigned_menus","getAssignedMenus","user_permission_sets","array","other","target","props","filesProNames","propNames","propName","apps","psetBase","userProfile","pset","uniq","aboutMenu","adminMenus","allMenus","currentPsetNames","menus","otherMenuApps","otherMenus","admin_menus","flatten","menu","psetsMenu","permission_sets","permission_objects","isNull","permission_set_ids","pos","ops","ops_key","currentPset","tempOps","repeatIndex","repeatPo","opsetAdmin","opsetCustomer","opsetGuest","opsetMember","opsetSupplier","opsetUser","posAdmin","posCustomer","posGuest","posMember","posSupplier","posUser","prof","guest","member","supplier","customer","disabled_actions","unreadable_fields","uneditable_fields","creator_db_url","oplog_url","MONGO_URL_CREATOR","MONGO_OPLOG_URL_CREATOR","_CREATOR_DATASOURCE","_driver","MongoInternals","RemoteCollectionDriver","oplogUrl","collection_key","newCollection","SMSQueue","_deleteRecord","action_name","executeAction","item_element","callback","moreArgs","todoArgs","ObjectGrid","getFilters","word_template","SteedosFilters","formatFiltersToODataQuery","absoluteUrl","window","open","odata","prototype","slice","concat","warning","record_title","call_back","call_back_error","previousDoc","FormManager","getPreviousDoc","info","success","runHook","relatedObjectStandardNew","collection_name","current_object_name","current_record_id","defaultDoc","initialValues","relateObject","set","getRelatedInitialValues","SteedosUI","showModal","stores","ComponentRegistry","components","ObjectForm","objectApiName","title","afterInsert","reloadRecord","FlowRouter","reload","iconPath","defer","$","click","gridName","isRelated","masterRecordId","relatedFieldName","selectedRows","gridRefs","current","api","getSelectedRows","gridRef","getInitialValues","Page","Form","StandardNew","render","href","getObjectUrl","redirect","StandardEdit","beforeHook","i18nTextKey","i18nTitleKey","nameField","selectedRecords","text","getTableSelectedRows","swal","showCancelButton","confirmButtonText","cancelButtonText","afterBatchesDelete","deleteCounter","_e","appid","dxDataGridInstance","gridContainer","gridObjectNameClass","isOpenerRemove","recordUrl","tempNavRemoved","opener","route","endsWith","refreshGrid","dxTreeList","dxDataGrid","refresh","removeTempNavItem","close","go","addClass","removeClass","recordTitle"],"mappings":"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","file":"/packages/steedos_objects.js","sourcesContent":["@db = {}\nif !Creator?\n\t@Creator = {}\nCreator.Objects = {}\nCreator.Collections = {}\nCreator.Menus = []\nCreator.Apps = {}\nCreator.Dashboards = {}\nCreator.Reports = {}\nCreator.subs = {}\nCreator.steedosSchema = {}","this.db = {};\n\nif (typeof Creator === \"undefined\" || Creator === null) {\n this.Creator = {};\n}\n\nCreator.Objects = {};\n\nCreator.Collections = {};\n\nCreator.Menus = [];\n\nCreator.Apps = {};\n\nCreator.Dashboards = {};\n\nCreator.Reports = {};\n\nCreator.subs = {};\n\nCreator.steedosSchema = {};\n","try\n\tif process.env.CREATOR_NODE_ENV == 'development'\n\t\tsteedosCore = require('@steedos/core')\n\t\tobjectql = require('@steedos/objectql')\n\t\tmoleculer = require(\"moleculer\");\n\t\tpackageLoader = require('@steedos/service-meteor-package-loader');\n\t\tAPIService = require('@steedos/service-api');\n\t\tMetadataService = require('@steedos/service-metadata-server');\n\t\tpackageService = require(\"@steedos/service-package-registry\");\n\t\tpath = require('path')\n\n\t\tconfig = objectql.getSteedosConfig();\n\t\tsettings = {\n\t\t\tbuilt_in_plugins: [\n\t\t\t\t\"@steedos/standard-space\",\n\t\t\t\t\"@steedos/standard-object-database\",\n\t\t\t\t\"@steedos/standard-process-approval\",\n\t\t\t\t\"@steedos/standard-collaboration\",\n\t\t\t\t\"@steedos/standard-ui\",\n\t\t\t\t\"@steedos/standard-permission\",\n\t\t\t\t\"@steedos/webapp-public\",\n\t\t\t\t\"@steedos/service-cachers-manager\",\n\t\t\t\t\"@steedos/unpkg\",\n\t\t\t\t\"@steedos/workflow\",\n\t\t\t\t\"@steedos/accounts\",\n\t\t\t\t\"@steedos/plugin-company\",\n\t\t\t\t\"@steedos/metadata-api\",\n\t\t\t\t\"@steedos/data-import\",\n\t\t\t\t# \"@steedos/service-fields-indexs\",\n\t\t\t\t\"@steedos/service-accounts\",\n\t\t\t\t\"@steedos/service-charts\",\n\t\t\t\t# \"@steedos/service-pages\",\n\t\t\t\t\"@steedos/service-package-registry\",\n\t\t \t\t\"@steedos/service-package-tool\",\n\t\t\t\t# \"@steedos/standard-process\",\n\t\t\t\t\"@steedos/webapp-accounts\",\n\t\t\t\t\"@steedos/service-workflow\",\n\t\t\t\t\"@steedos/service-plugin-amis\",\n\t\t\t\t\"@steedos/service-files\",\n\t\t\t\t\"@steedos/service-sentry\",\n\t\t\t\t\"@steedos/service-identity-jwt\"\n\t\t\t],\n\t\t\tplugins: config.plugins\n\t\t}\n\t\tMeteor.startup ->\n\t\t\ttry\n\t\t\t\tbroker = new moleculer.ServiceBroker({\n\t\t\t\t\tnamespace: \"steedos\",\n\t\t\t\t\tnodeID: \"steedos-creator\",\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\ttransporter: process.env.TRANSPORTER,\n\t\t\t\t\tcacher: process.env.CACHER,\n\t\t\t\t\tlogLevel: \"warn\",\n\t\t\t\t\tserializer: \"JSON\",\n\t\t\t\t\trequestTimeout: 60 * 1000,\n\t\t\t\t\tmaxCallLevel: 100,\n\n\t\t\t\t\theartbeatInterval: 10,\n\t\t\t\t\theartbeatTimeout: 30,\n\n\t\t\t\t\tcontextParamsCloning: false,\n\n\t\t\t\t\ttracking: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tshutdownTimeout: 5000,\n\t\t\t\t\t},\n\n\t\t\t\t\tdisableBalancer: false,\n\n\t\t\t\t\tregistry: {\n\t\t\t\t\t\tstrategy: \"RoundRobin\",\n\t\t\t\t\t\tpreferLocal: true\n\t\t\t\t\t},\n\n\t\t\t\t\tbulkhead: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\tconcurrency: 10,\n\t\t\t\t\t\tmaxQueueSize: 100,\n\t\t\t\t\t},\n\t\t\t\t\tvalidator: true,\n\t\t\t\t\terrorHandler: null,\n\t\t\t\t\ttracing: {\n\t\t\t\t\t\tenabled: false,\n\t\t\t\t\t\texporter: {\n\t\t\t\t\t\t\ttype: \"Console\",\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tlogger: null,\n\t\t\t\t\t\t\t\tcolors: true,\n\t\t\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\t\t\tgaugeWidth: 40\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tskipProcessEventRegistration: true,\n\n\t\t\t\t\tcreated: (broker)-> \n\t\t\t\t\t\t# Clear all cache entries\n\t\t\t\t\t\tbroker.logger.warn('Clear all cache entries on startup.')\n\t\t\t\t\t\tbroker.cacher.clean();\n\t\t\t\t});\n\n\t\t\t\tobjectql.broker.init(broker);\n\n\t\t\t\tobjectqlService = broker.createService(require(\"@steedos/service-objectql\"));\n\t\t\t\t\n\t\t\t\tprojectService = broker.createService({\n\t\t\t\t\tname: \"project-server\",\n\t\t\t\t\tnamespace: \"steedos\",\n\t\t\t\t\tmixins: [packageService],\n\t\t\t\t});\n\n\n\t\t\t\tmetadataService = broker.createService({\n\t\t\t\t\tname: 'metadata-server',\n\t\t\t\t\tmixins: [MetadataService],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tuiService = broker.createService(require(\"@steedos/service-ui\"));\n\n\t\t\t\tapiService = broker.createService({\n\t\t\t\t\tname: \"api\",\n\t\t\t\t\tmixins: [APIService],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tpageService = broker.createService({\n\t\t\t\t\tname: \"@steedos/service-pages\",\n\t\t\t\t\tmixins: [require('@steedos/service-pages')],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t} \n\t\t\t\t});\n\n\t\t\t\tsteedosService = broker.createService({\n\t\t\t\t\tname: \"steedos-server\",\n\t\t\t\t\tmixins: [],\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tport: null\n\t\t\t\t\t},\n\t\t\t\t\tstarted: ()->\n\t\t\t\t\t\tsetTimeout ->\n\t\t\t\t\t\t\tbroker.emit 'steedos-server.started'\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t, 1000\n\t\t\t\t});\n\n\t\t\t\tobjectql.getSteedosSchema(broker);\n\t\t\t\tstandardObjectsDir = objectql.StandardObjectsPath;\n\t\t\t\tstandardObjectsPackageLoaderService = broker.createService({\n\t\t\t\t\tname: 'standard-objects',\n\t\t\t\t\tmixins: [packageLoader],\n\t\t\t\t\tsettings: { packageInfo: {\n\t\t\t\t\t\tpath: standardObjectsDir,\n\t\t\t\t\t} }\n\t\t\t\t});\n\n\t\t\t\tMeteor.wrapAsync((cb)->\n\t\t\t\t\tbroker.start().then(()->\n\t\t\t\t\t\tif !broker.started \n\t\t\t\t\t\t\tbroker._restartService(objectqlService);\n\t\t\t\t\t\t\tbroker._restartService(standardObjectsPackageLoaderService);\n\t\t\t\t\t\t\tbroker._restartService(uiService);\n\n\t\t\t\t\t\texpress = require('express');\n\t\t\t\t\t\tconnectHandlersExpress = express();\n\t\t\t\t\t\tconnectHandlersExpress.use(require('@steedos/router').staticRouter());\n\t\t\t\t\t\tbroker.waitForServices('~packages-@steedos/service-ui').then ()->\n\t\t\t\t\t\t\tconsole.log('waitForServices ~packages-@steedos/service-ui')\n\t\t\t\t\t\t\tconnectHandlersExpress.use(SteedosApi.express())\n\t\t\t\t\t\t\tWebApp.connectHandlers.use(connectHandlersExpress)\n\t\t\t\t\t\t\n\t\t\t\t\t\t# steedosCore.init(settings).then ()->\n\t\t\t\t\t\t# \tcb();\n\n\t\t\t\t\t\tbroker.waitForServices(standardObjectsPackageLoaderService.name).then (resolve, reject) ->\n\t\t\t\t\t\t\tsteedosCore.init(settings).then ()->\n\t\t\t\t\t\t\t\tcb(reject, resolve)\n\t\t\t\t\t)\n\t\t\t\t)()\n\t\t\tcatch ex\n\t\t\t\tconsole.error(\"error:\",ex)\ncatch e\n\tconsole.error(\"error:\",e)","var APIService, MetadataService, config, e, moleculer, objectql, packageLoader, packageService, path, settings, steedosCore;\n\ntry {\n if (process.env.CREATOR_NODE_ENV === 'development') {\n steedosCore = require('@steedos/core');\n objectql = require('@steedos/objectql');\n moleculer = require(\"moleculer\");\n packageLoader = require('@steedos/service-meteor-package-loader');\n APIService = require('@steedos/service-api');\n MetadataService = require('@steedos/service-metadata-server');\n packageService = require(\"@steedos/service-package-registry\");\n path = require('path');\n config = objectql.getSteedosConfig();\n settings = {\n built_in_plugins: [\"@steedos/standard-space\", \"@steedos/standard-object-database\", \"@steedos/standard-process-approval\", \"@steedos/standard-collaboration\", \"@steedos/standard-ui\", \"@steedos/standard-permission\", \"@steedos/webapp-public\", \"@steedos/service-cachers-manager\", \"@steedos/unpkg\", \"@steedos/workflow\", \"@steedos/accounts\", \"@steedos/plugin-company\", \"@steedos/metadata-api\", \"@steedos/data-import\", \"@steedos/service-accounts\", \"@steedos/service-charts\", \"@steedos/service-package-registry\", \"@steedos/service-package-tool\", \"@steedos/webapp-accounts\", \"@steedos/service-workflow\", \"@steedos/service-plugin-amis\", \"@steedos/service-files\", \"@steedos/service-sentry\", \"@steedos/service-identity-jwt\"],\n plugins: config.plugins\n };\n Meteor.startup(function() {\n var apiService, broker, ex, metadataService, objectqlService, pageService, projectService, standardObjectsDir, standardObjectsPackageLoaderService, steedosService, uiService;\n try {\n broker = new moleculer.ServiceBroker({\n namespace: \"steedos\",\n nodeID: \"steedos-creator\",\n metadata: {},\n transporter: process.env.TRANSPORTER,\n cacher: process.env.CACHER,\n logLevel: \"warn\",\n serializer: \"JSON\",\n requestTimeout: 60 * 1000,\n maxCallLevel: 100,\n heartbeatInterval: 10,\n heartbeatTimeout: 30,\n contextParamsCloning: false,\n tracking: {\n enabled: false,\n shutdownTimeout: 5000\n },\n disableBalancer: false,\n registry: {\n strategy: \"RoundRobin\",\n preferLocal: true\n },\n bulkhead: {\n enabled: false,\n concurrency: 10,\n maxQueueSize: 100\n },\n validator: true,\n errorHandler: null,\n tracing: {\n enabled: false,\n exporter: {\n type: \"Console\",\n options: {\n logger: null,\n colors: true,\n width: 100,\n gaugeWidth: 40\n }\n }\n },\n skipProcessEventRegistration: true,\n created: function(broker) {\n broker.logger.warn('Clear all cache entries on startup.');\n return broker.cacher.clean();\n }\n });\n objectql.broker.init(broker);\n objectqlService = broker.createService(require(\"@steedos/service-objectql\"));\n projectService = broker.createService({\n name: \"project-server\",\n namespace: \"steedos\",\n mixins: [packageService]\n });\n metadataService = broker.createService({\n name: 'metadata-server',\n mixins: [MetadataService],\n settings: {}\n });\n uiService = broker.createService(require(\"@steedos/service-ui\"));\n apiService = broker.createService({\n name: \"api\",\n mixins: [APIService],\n settings: {\n port: null\n }\n });\n pageService = broker.createService({\n name: \"@steedos/service-pages\",\n mixins: [require('@steedos/service-pages')],\n settings: {\n port: null\n }\n });\n steedosService = broker.createService({\n name: \"steedos-server\",\n mixins: [],\n settings: {\n port: null\n },\n started: function() {\n return setTimeout(function() {\n broker.emit('steedos-server.started');\n }, 1000);\n }\n });\n objectql.getSteedosSchema(broker);\n standardObjectsDir = objectql.StandardObjectsPath;\n standardObjectsPackageLoaderService = broker.createService({\n name: 'standard-objects',\n mixins: [packageLoader],\n settings: {\n packageInfo: {\n path: standardObjectsDir\n }\n }\n });\n return Meteor.wrapAsync(function(cb) {\n return broker.start().then(function() {\n var connectHandlersExpress, express;\n if (!broker.started) {\n broker._restartService(objectqlService);\n broker._restartService(standardObjectsPackageLoaderService);\n broker._restartService(uiService);\n }\n express = require('express');\n connectHandlersExpress = express();\n connectHandlersExpress.use(require('@steedos/router').staticRouter());\n broker.waitForServices('~packages-@steedos/service-ui').then(function() {\n console.log('waitForServices ~packages-@steedos/service-ui');\n connectHandlersExpress.use(SteedosApi.express());\n return WebApp.connectHandlers.use(connectHandlersExpress);\n });\n return broker.waitForServices(standardObjectsPackageLoaderService.name).then(function(resolve, reject) {\n return steedosCore.init(settings).then(function() {\n return cb(reject, resolve);\n });\n });\n });\n })();\n } catch (error) {\n ex = error;\n return console.error(\"error:\", ex);\n }\n });\n }\n} catch (error) {\n e = error;\n console.error(\"error:\", e);\n}\n","Creator.deps = {\n\tapp: new Tracker.Dependency\n\tobject: new Tracker.Dependency\n};\n\nCreator._TEMPLATE = {\n\tApps: {},\n\tObjects: {}\n}\n\nMeteor.startup ->\n\tSimpleSchema.extendOptions({filtersFunction: Match.Optional(Match.OneOf(Function, String))})\n\tSimpleSchema.extendOptions({optionsFunction: Match.Optional(Match.OneOf(Function, String))})\n\tSimpleSchema.extendOptions({createFunction: Match.Optional(Match.OneOf(Function, String))})\n\n# Creator.fiberLoadObjects 供steedos-cli项目使用\nif Meteor.isServer\n\tFiber = require('fibers')\n\tCreator.fiberLoadObjects = (obj, object_name)->\n\t\tFiber(()->\n\t\t\tCreator.loadObjects(obj, object_name)\n\t\t).run()\n\nCreator.loadObjects = (obj, object_name)->\n\tif !object_name\n\t\tobject_name = obj.name\n\n\tif !obj.list_views\n\t\tobj.list_views = {}\n\n\tif obj.space\n\t\tobject_name = Creator.getCollectionName(obj)\n\tif object_name == 'cfs_files_filerecord'\n\t\tobject_name = 'cfs.files.filerecord'\n\t\tobj = _.clone(obj)\n\t\tobj.name = object_name\n\t\tCreator.Objects[object_name] = obj\n\n\tCreator.convertObject(obj)\n\tnew Creator.Object(obj);\n\n\tCreator.initTriggers(object_name)\n\tCreator.initListViews(object_name)\n\treturn obj\n\nCreator.getObjectName = (object) ->\n\tif object.space\n\t\treturn \"c_#{object.space}_#{object.name}\"\n\treturn object.name\n\nCreator.getObject = (object_name, space_id)->\n\tif _.isArray(object_name)\n\t\treturn ;\n\tif Meteor.isClient\n\t\tCreator.deps?.object?.depend()\n\tif !object_name and Meteor.isClient\n\t\tobject_name = Session.get(\"object_name\")\n\n#\tif !space_id && object_name\n#\t\tif Meteor.isClient && !object_name.startsWith('c_')\n#\t\t\tspace_id = Session.get(\"spaceId\")\n\n\tif object_name\n#\t\tif space_id\n#\t\t\tobj = Creator.objectsByName[\"c_#{space_id}_#{object_name}\"]\n#\t\t\tif obj\n#\t\t\t\treturn obj\n#\n#\t\tobj = _.find Creator.objectsByName, (o)->\n#\t\t\t\treturn o._collection_name == object_name\n#\t\tif obj\n#\t\t\treturn obj\n\n\t\treturn Creator.objectsByName[object_name]\n\nCreator.getObjectById = (object_id)->\n\treturn _.findWhere(Creator.objectsByName, {_id: object_id})\n\nCreator.removeObject = (object_name)->\n\tconsole.log(\"removeObject\", object_name)\n\tdelete Creator.Objects[object_name]\n\tdelete Creator.objectsByName[object_name]\n\nCreator.getCollection = (object_name, spaceId)->\n\tif !object_name\n\t\tobject_name = Session.get(\"object_name\")\n\tif object_name\n\t\tif Meteor.isClient\n\t\t\treturn db[object_name]\n\t\telse\n\t\t\treturn Creator.Collections[Creator.getObject(object_name, spaceId)?._collection_name || object_name]\n\nCreator.removeCollection = (object_name)->\n\tdelete Creator.Collections[object_name]\n\nCreator.isSpaceAdmin = (spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !spaceId\n\t\t\tspaceId = Session.get(\"spaceId\")\n\t\tif !userId\n\t\t\tuserId = Meteor.userId()\n\n\tspace = Creator.getObject(\"spaces\")?.db?.findOne(spaceId,{fields:{admins:1}})\n\tif space?.admins\n\t\treturn space.admins.indexOf(userId) >= 0\n\n\nCreator.evaluateFormula = (formular, context, options)->\n\n\tif !_.isString(formular)\n\t\treturn formular\n\n\tif Creator.Formular.checkFormula(formular)\n\t\treturn Creator.Formular.run(formular, context, options)\n\n\treturn formular\n\nCreator.evaluateFilters = (filters, context)->\n\tselector = {}\n\t_.each filters, (filter)->\n\t\tif filter?.length == 3\n\t\t\tname = filter[0]\n\t\t\taction = filter[1]\n\t\t\tvalue = Creator.evaluateFormula(filter[2], context)\n\t\t\tselector[name] = {}\n\t\t\tselector[name][action] = value\n\t# console.log(\"evaluateFilters-->selector\", selector)\n\treturn selector\n\nCreator.isCommonSpace = (spaceId) ->\n\treturn spaceId == 'common'\n\n###\n\tdocs:待排序的文档数组\n\tids:_id集合\n\tid_key: 默认为_id\n\treturn 按照ids的顺序返回新的文档集合\n###\nCreator.getOrderlySetByIds = (docs, ids, id_key, hit_first)->\n\n\tif !id_key\n\t\tid_key = \"_id\"\n\n\tif hit_first\n\n\t\t#由于不能使用_.findIndex函数,因此此处先将对象数组转为普通数组类型,在获取其index\n\t\tvalues = docs.getProperty(id_key)\n\n\t\treturn\t_.sortBy docs, (doc)->\n\t\t\t\t\t_index = ids.indexOf(doc[id_key])\n\t\t\t\t\tif _index > -1\n\t\t\t\t\t\treturn _index\n\t\t\t\t\telse\n\t\t\t\t\t\treturn ids.length + _.indexOf(values, doc[id_key])\n\telse\n\t\treturn\t_.sortBy docs, (doc)->\n\t\t\tv = ids.indexOf(doc[id_key]);\n\t\t\tif v < 0\n\t\t\t\treturn 99999\n\t\t\telse \n\t\t\t\treturn v\n\n###\n\t按用户所属本地化语言进行排序,支持中文、数值、日期等字段排序\n\t对于Object类型,如果提供作用域中key属性,则取值为value[key]进行排序比较,反之整个Object.toString()后排序比较\n###\nCreator.sortingMethod = (value1, value2) ->\n\tif this.key\n\t\tvalue1 = value1[this.key]\n\t\tvalue2 = value2[this.key]\n\tif value1 instanceof Date\n\t\tvalue1 = value1.getTime()\n\tif value2 instanceof Date\n\t\tvalue2 = value2.getTime()\n\tif typeof value1 is \"number\" and typeof value2 is \"number\"\n\t\treturn value1 - value2\n\t# Handling null values\n\tisValue1Empty = value1 == null or value1 == undefined\n\tisValue2Empty = value2 == null or value2 == undefined\n\tif isValue1Empty and !isValue2Empty\n\t\treturn -1\n\tif isValue1Empty and isValue2Empty\n\t\treturn 0\n\tif !isValue1Empty and isValue2Empty\n\t\treturn 1\n\tlocale = Steedos.locale()\n\treturn value1.toString().localeCompare value2.toString(), locale\n\n\n# 该函数只在初始化Object时,把相关对象的计算结果保存到Object的related_objects属性中,后续可以直接从related_objects属性中取得计算结果而不用再次调用该函数来计算\nCreator.getObjectRelateds = (object_name)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\n\trelated_objects = []\n\t# _object = Creator.getObject(object_name)\n\t# 因Creator.getObject函数内部要调用该函数,所以这里不可以调用Creator.getObject取对象,只能调用Creator.Objects来取对象\n\t_object = Creator.Objects[object_name]\n\tif !_object\n\t\treturn related_objects\n\t\n\trelatedList = _object.relatedList\n\tif Meteor.isClient && !_.isEmpty relatedList\n\t\trelatedListMap = {}\n\t\t_.each relatedList, (objName)->\n\t\t\tif _.isObject objName\n\t\t\t\trelatedListMap[objName.objectName] = {}\n\t\t\telse\n\t\t\t\trelatedListMap[objName] = {}\n\t\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\t\tif (related_field.type == \"master_detail\" || related_field.type == \"lookup\") and related_field.reference_to and related_field.reference_to == object_name and relatedListMap[related_object_name]\n\t\t\t\t\t# 当related_object.fields中有两个或以上的字段指向object_name表示的对象时,优先取第一个作为外键关系字段,但是related_field为主子表时强行覆盖之前的relatedListMap[related_object_name]值\n\t\t\t\t\tif _.isEmpty relatedListMap[related_object_name] || related_field.type == \"master_detail\"\n\t\t\t\t\t\trelatedListMap[related_object_name] = { object_name: related_object_name, foreign_key: related_field_name, write_requires_master_read: related_field.write_requires_master_read }\n\t\tif relatedListMap['cms_files']\n\t\t\trelatedListMap['cms_files'] = { object_name: \"cms_files\", foreign_key: \"parent\" }\n\t\tif relatedListMap['instances']\n\t\t\trelatedListMap['instances'] = { object_name: \"instances\", foreign_key: \"record_ids\" }\n\t\t_.each ['tasks', 'notes', 'events', 'approvals'], (enableObjName)->\n\t\t\tif relatedListMap[enableObjName]\n\t\t\t\trelatedListMap[enableObjName] = { object_name: enableObjName, foreign_key: \"related_to\" }\n\t\tif relatedListMap['audit_records']\n\t\t\t#record 详细下的audit_records仅modifyAllRecords权限可见\n\t\t\tpermissions = Creator.getPermissions(object_name)\n\t\t\tif _object.enable_audit && permissions?.modifyAllRecords\n\t\t\t\trelatedListMap['audit_records'] = { object_name:\"audit_records\", foreign_key: \"related_to\" }\n\t\trelated_objects = _.values relatedListMap\n\t\treturn related_objects\n\n\tif _object.enable_files\n\t\trelated_objects.push {object_name:\"cms_files\", foreign_key: \"parent\"}\n\n\t_.each Creator.Objects, (related_object, related_object_name)->\n\t\tif related_object_name == \"cfs.files.filerecord\"\n\t\t\t# cfs.files.filerecord对象在第二次点击的时候related_object返回的是app-builder中的\"metadata.parent\"字段被删除了,记到metadata字段的sub_fields中了,所以要单独处理。\n\t\t\tsfsFilesObject = Creator.getObject(\"cfs.files.filerecord\")\n\t\t\tsfsFilesObject && related_object = sfsFilesObject\n\t\t_.each related_object.fields, (related_field, related_field_name)->\n\t\t\tif (related_field.type == \"master_detail\" || (related_field.type == \"lookup\" && related_field.relatedList)) and related_field.reference_to and related_field.reference_to == object_name\n\t\t\t\tif related_object_name == \"object_fields\"\n\t\t\t\t\t#TODO 待相关列表支持排序后,删除此判断\n\t\t\t\t\trelated_objects.splice(0, 0, {object_name:related_object_name, foreign_key: related_field_name})\n\t\t\t\telse\n\t\t\t\t\trelated_objects.push {object_name:related_object_name, foreign_key: related_field_name, write_requires_master_read: related_field.write_requires_master_read}\n\n\tif _object.enable_tasks\n\t\trelated_objects.push {object_name:\"tasks\", foreign_key: \"related_to\"}\n\tif _object.enable_notes\n\t\trelated_objects.push {object_name:\"notes\", foreign_key: \"related_to\"}\n\tif _object.enable_events\n\t\trelated_objects.push {object_name:\"events\", foreign_key: \"related_to\"}\n\tif _object.enable_instances\n\t\trelated_objects.push {object_name:\"instances\", foreign_key: \"record_ids\"}\n\tif _object.enable_approvals\n\t\trelated_objects.push {object_name:\"approvals\", foreign_key: \"related_to\"}\n\tif _object.enable_process\n\t\trelated_objects.push {object_name:\"process_instance_history\", foreign_key: \"target_object\"}\n\t#record 详细下的audit_records仅modifyAllRecords权限可见\n\tif Meteor.isClient\n\t\tpermissions = Creator.getPermissions(object_name)\n\t\tif _object.enable_audit && permissions?.modifyAllRecords\n\t\t\trelated_objects.push {object_name:\"audit_records\", foreign_key: \"related_to\"}\n\n\treturn related_objects\n\nCreator.getUserContext = (userId, spaceId, isUnSafeMode)->\n\tif Meteor.isClient\n\t\treturn Creator.USER_CONTEXT\n\telse\n\t\tif !(userId and spaceId)\n\t\t\tthrow new Meteor.Error 500, \"the params userId and spaceId is required for the function Creator.getUserContext\"\n\t\t\treturn null\n\t\tsuFields = {name: 1, mobile: 1, position: 1, email: 1, company: 1, organization: 1, space: 1, company_id: 1, company_ids: 1}\n\t\t# check if user in the space\n\t\tsu = Creator.Collections[\"space_users\"].findOne({space: spaceId, user: userId}, {fields: suFields})\n\t\tif !su\n\t\t\tspaceId = null\n\n\t\t# if spaceId not exists, get the first one.\n\t\tif !spaceId\n\t\t\tif isUnSafeMode\n\t\t\t\tsu = Creator.Collections[\"space_users\"].findOne({user: userId}, {fields: suFields})\n\t\t\t\tif !su\n\t\t\t\t\treturn null\n\t\t\t\tspaceId = su.space\n\t\t\telse\n\t\t\t\treturn null\n\n\t\tUSER_CONTEXT = {}\n\t\tUSER_CONTEXT.userId = userId\n\t\tUSER_CONTEXT.spaceId = spaceId\n\t\tUSER_CONTEXT.user = {\n\t\t\t_id: userId\n\t\t\tname: su.name,\n\t\t\tmobile: su.mobile,\n\t\t\tposition: su.position,\n\t\t\temail: su.email\n\t\t\tcompany: su.company\n\t\t\tcompany_id: su.company_id\n\t\t\tcompany_ids: su.company_ids\n\t\t}\n\t\tspace_user_org = Creator.getCollection(\"organizations\")?.findOne(su.organization)\n\t\tif space_user_org\n\t\t\tUSER_CONTEXT.user.organization = {\n\t\t\t\t_id: space_user_org._id,\n\t\t\t\tname: space_user_org.name,\n\t\t\t\tfullname: space_user_org.fullname\n\t\t\t}\n\t\treturn USER_CONTEXT\n\nCreator.getRelativeUrl = (url)->\n\n\tif _.isFunction(Steedos.isCordova) && Steedos.isCordova() && (url?.startsWith(\"/assets\") || url?.startsWith(\"assets\") || url?.startsWith(\"/packages\"))\n\t\tif !/^\\//.test(url)\n\t\t\turl = \"/\" + url\n\t\treturn url\n\n\tif url\n\t\t# url开头没有\"/\",需要添加\"/\"\n\t\tif !/^\\//.test(url)\n\t\t\turl = \"/\" + url\n\t\treturn __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url\n\telse\n\t\treturn __meteor_runtime_config__.ROOT_URL_PATH_PREFIX\n\nCreator.getUserCompanyId = (userId, spaceId)->\n\tuserId = userId || Meteor.userId()\n\tif Meteor.isClient\n\t\tspaceId = spaceId || Session.get('spaceId')\n\telse\n\t\tif !spaceId\n\t\t\tthrow new Meteor.Error(400, 'miss spaceId')\n\tsu = Creator.getCollection('space_users').findOne({space: spaceId, user: userId}, {fields: {company_id:1}})\n\treturn su.company_id\n\nCreator.getUserCompanyIds = (userId, spaceId)->\n\tuserId = userId || Meteor.userId()\n\tif Meteor.isClient\n\t\tspaceId = spaceId || Session.get('spaceId')\n\telse\n\t\tif !spaceId\n\t\t\tthrow new Meteor.Error(400, 'miss spaceId')\n\tsu = Creator.getCollection('space_users').findOne({space: spaceId, user: userId}, {fields: {company_ids:1}})\n\treturn su?.company_ids\n\nCreator.processPermissions = (po)->\n\tif po.allowCreate\n\t\tpo.allowRead = true\n\tif po.allowEdit\n\t\tpo.allowRead = true\n\tif po.allowDelete\n\t\tpo.allowEdit = true\n\t\tpo.allowRead = true\n\tif po.viewAllRecords\n\t\tpo.allowRead = true\n\tif po.modifyAllRecords\n\t\tpo.allowRead = true\n\t\tpo.allowEdit = true\n\t\tpo.allowDelete = true\n\t\tpo.viewAllRecords = true\n\tif po.viewCompanyRecords\n\t\tpo.allowRead = true\n\tif po.modifyCompanyRecords\n\t\tpo.allowRead = true\n\t\tpo.allowEdit = true\n\t\tpo.allowDelete = true\n\t\tpo.viewCompanyRecords = true\n\t\t\n\t# 如果附件相关权限配置为空,则兼容之前没有附件权限配置时的规则\n\tif po.allowRead\n\t\ttypeof po.allowReadFiles != \"boolean\" && po.allowReadFiles = true\n\t\ttypeof po.viewAllFiles != \"boolean\" && po.viewAllFiles = true\n\tif po.allowEdit\n\t\ttypeof po.allowCreateFiles != \"boolean\" && po.allowCreateFiles = true\n\t\ttypeof po.allowEditFiles != \"boolean\" && po.allowEditFiles = true\n\t\ttypeof po.allowDeleteFiles != \"boolean\" && po.allowDeleteFiles = true\n\tif po.modifyAllRecords\n\t\ttypeof po.modifyAllFiles != \"boolean\" && po.modifyAllFiles = true\n\n\tif po.allowCreateFiles\n\t\tpo.allowReadFiles = true\n\tif po.allowEditFiles\n\t\tpo.allowReadFiles = true\n\tif po.allowDeleteFiles\n\t\tpo.allowEditFiles = true\n\t\tpo.allowReadFiles = true\n\tif po.viewAllFiles\n\t\tpo.allowReadFiles = true\n\tif po.modifyAllFiles\n\t\tpo.allowReadFiles = true\n\t\tpo.allowEditFiles = true\n\t\tpo.allowDeleteFiles = true\n\t\tpo.viewAllFiles = true\n\n\treturn po\n\nCreator.getTemplateSpaceId = ()->\n\treturn Meteor.settings.public?.templateSpaceId\n\nCreator.getCloudAdminSpaceId = ()->\n\treturn Meteor.settings.public?.cloudAdminSpaceId\n\nCreator.isTemplateSpace = (spaceId)->\n\tif spaceId && Meteor.settings.public?.templateSpaceId == spaceId\n\t\treturn true\n\treturn false\n\nCreator.isCloudAdminSpace = (spaceId)->\n\tif spaceId && Meteor.settings.public?.cloudAdminSpaceId == spaceId\n\t\treturn true\n\treturn false\n\nif Meteor.isServer\n\tCreator.steedosStorageDir = process.env.STEEDOS_STORAGE_DIR\n\t","var Fiber;\n\nCreator.deps = {\n app: new Tracker.Dependency,\n object: new Tracker.Dependency\n};\n\nCreator._TEMPLATE = {\n Apps: {},\n Objects: {}\n};\n\nMeteor.startup(function() {\n SimpleSchema.extendOptions({\n filtersFunction: Match.Optional(Match.OneOf(Function, String))\n });\n SimpleSchema.extendOptions({\n optionsFunction: Match.Optional(Match.OneOf(Function, String))\n });\n return SimpleSchema.extendOptions({\n createFunction: Match.Optional(Match.OneOf(Function, String))\n });\n});\n\nif (Meteor.isServer) {\n Fiber = require('fibers');\n Creator.fiberLoadObjects = function(obj, object_name) {\n return Fiber(function() {\n return Creator.loadObjects(obj, object_name);\n }).run();\n };\n}\n\nCreator.loadObjects = function(obj, object_name) {\n if (!object_name) {\n object_name = obj.name;\n }\n if (!obj.list_views) {\n obj.list_views = {};\n }\n if (obj.space) {\n object_name = Creator.getCollectionName(obj);\n }\n if (object_name === 'cfs_files_filerecord') {\n object_name = 'cfs.files.filerecord';\n obj = _.clone(obj);\n obj.name = object_name;\n Creator.Objects[object_name] = obj;\n }\n Creator.convertObject(obj);\n new Creator.Object(obj);\n Creator.initTriggers(object_name);\n Creator.initListViews(object_name);\n return obj;\n};\n\nCreator.getObjectName = function(object) {\n if (object.space) {\n return \"c_\" + object.space + \"_\" + object.name;\n }\n return object.name;\n};\n\nCreator.getObject = function(object_name, space_id) {\n var ref, ref1;\n if (_.isArray(object_name)) {\n return;\n }\n if (Meteor.isClient) {\n if ((ref = Creator.deps) != null) {\n if ((ref1 = ref.object) != null) {\n ref1.depend();\n }\n }\n }\n if (!object_name && Meteor.isClient) {\n object_name = Session.get(\"object_name\");\n }\n if (object_name) {\n return Creator.objectsByName[object_name];\n }\n};\n\nCreator.getObjectById = function(object_id) {\n return _.findWhere(Creator.objectsByName, {\n _id: object_id\n });\n};\n\nCreator.removeObject = function(object_name) {\n console.log(\"removeObject\", object_name);\n delete Creator.Objects[object_name];\n return delete Creator.objectsByName[object_name];\n};\n\nCreator.getCollection = function(object_name, spaceId) {\n var ref;\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (object_name) {\n if (Meteor.isClient) {\n return db[object_name];\n } else {\n return Creator.Collections[((ref = Creator.getObject(object_name, spaceId)) != null ? ref._collection_name : void 0) || object_name];\n }\n }\n};\n\nCreator.removeCollection = function(object_name) {\n return delete Creator.Collections[object_name];\n};\n\nCreator.isSpaceAdmin = function(spaceId, userId) {\n var ref, ref1, space;\n if (Meteor.isClient) {\n if (!spaceId) {\n spaceId = Session.get(\"spaceId\");\n }\n if (!userId) {\n userId = Meteor.userId();\n }\n }\n space = (ref = Creator.getObject(\"spaces\")) != null ? (ref1 = ref.db) != null ? ref1.findOne(spaceId, {\n fields: {\n admins: 1\n }\n }) : void 0 : void 0;\n if (space != null ? space.admins : void 0) {\n return space.admins.indexOf(userId) >= 0;\n }\n};\n\nCreator.evaluateFormula = function(formular, context, options) {\n if (!_.isString(formular)) {\n return formular;\n }\n if (Creator.Formular.checkFormula(formular)) {\n return Creator.Formular.run(formular, context, options);\n }\n return formular;\n};\n\nCreator.evaluateFilters = function(filters, context) {\n var selector;\n selector = {};\n _.each(filters, function(filter) {\n var action, name, value;\n if ((filter != null ? filter.length : void 0) === 3) {\n name = filter[0];\n action = filter[1];\n value = Creator.evaluateFormula(filter[2], context);\n selector[name] = {};\n return selector[name][action] = value;\n }\n });\n return selector;\n};\n\nCreator.isCommonSpace = function(spaceId) {\n return spaceId === 'common';\n};\n\n\n/*\n\tdocs:待排序的文档数组\n\tids:_id集合\n\tid_key: 默认为_id\n\treturn 按照ids的顺序返回新的文档集合\n */\n\nCreator.getOrderlySetByIds = function(docs, ids, id_key, hit_first) {\n var values;\n if (!id_key) {\n id_key = \"_id\";\n }\n if (hit_first) {\n values = docs.getProperty(id_key);\n return _.sortBy(docs, function(doc) {\n var _index;\n _index = ids.indexOf(doc[id_key]);\n if (_index > -1) {\n return _index;\n } else {\n return ids.length + _.indexOf(values, doc[id_key]);\n }\n });\n } else {\n return _.sortBy(docs, function(doc) {\n var v;\n v = ids.indexOf(doc[id_key]);\n if (v < 0) {\n return 99999;\n } else {\n return v;\n }\n });\n }\n};\n\n\n/*\n\t按用户所属本地化语言进行排序,支持中文、数值、日期等字段排序\n\t对于Object类型,如果提供作用域中key属性,则取值为value[key]进行排序比较,反之整个Object.toString()后排序比较\n */\n\nCreator.sortingMethod = function(value1, value2) {\n var isValue1Empty, isValue2Empty, locale;\n if (this.key) {\n value1 = value1[this.key];\n value2 = value2[this.key];\n }\n if (value1 instanceof Date) {\n value1 = value1.getTime();\n }\n if (value2 instanceof Date) {\n value2 = value2.getTime();\n }\n if (typeof value1 === \"number\" && typeof value2 === \"number\") {\n return value1 - value2;\n }\n isValue1Empty = value1 === null || value1 === void 0;\n isValue2Empty = value2 === null || value2 === void 0;\n if (isValue1Empty && !isValue2Empty) {\n return -1;\n }\n if (isValue1Empty && isValue2Empty) {\n return 0;\n }\n if (!isValue1Empty && isValue2Empty) {\n return 1;\n }\n locale = Steedos.locale();\n return value1.toString().localeCompare(value2.toString(), locale);\n};\n\nCreator.getObjectRelateds = function(object_name) {\n var _object, permissions, relatedList, relatedListMap, related_objects;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n }\n related_objects = [];\n _object = Creator.Objects[object_name];\n if (!_object) {\n return related_objects;\n }\n relatedList = _object.relatedList;\n if (Meteor.isClient && !_.isEmpty(relatedList)) {\n relatedListMap = {};\n _.each(relatedList, function(objName) {\n if (_.isObject(objName)) {\n return relatedListMap[objName.objectName] = {};\n } else {\n return relatedListMap[objName] = {};\n }\n });\n _.each(Creator.Objects, function(related_object, related_object_name) {\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if ((related_field.type === \"master_detail\" || related_field.type === \"lookup\") && related_field.reference_to && related_field.reference_to === object_name && relatedListMap[related_object_name]) {\n if (_.isEmpty(relatedListMap[related_object_name] || related_field.type === \"master_detail\")) {\n return relatedListMap[related_object_name] = {\n object_name: related_object_name,\n foreign_key: related_field_name,\n write_requires_master_read: related_field.write_requires_master_read\n };\n }\n }\n });\n });\n if (relatedListMap['cms_files']) {\n relatedListMap['cms_files'] = {\n object_name: \"cms_files\",\n foreign_key: \"parent\"\n };\n }\n if (relatedListMap['instances']) {\n relatedListMap['instances'] = {\n object_name: \"instances\",\n foreign_key: \"record_ids\"\n };\n }\n _.each(['tasks', 'notes', 'events', 'approvals'], function(enableObjName) {\n if (relatedListMap[enableObjName]) {\n return relatedListMap[enableObjName] = {\n object_name: enableObjName,\n foreign_key: \"related_to\"\n };\n }\n });\n if (relatedListMap['audit_records']) {\n permissions = Creator.getPermissions(object_name);\n if (_object.enable_audit && (permissions != null ? permissions.modifyAllRecords : void 0)) {\n relatedListMap['audit_records'] = {\n object_name: \"audit_records\",\n foreign_key: \"related_to\"\n };\n }\n }\n related_objects = _.values(relatedListMap);\n return related_objects;\n }\n if (_object.enable_files) {\n related_objects.push({\n object_name: \"cms_files\",\n foreign_key: \"parent\"\n });\n }\n _.each(Creator.Objects, function(related_object, related_object_name) {\n var sfsFilesObject;\n if (related_object_name === \"cfs.files.filerecord\") {\n sfsFilesObject = Creator.getObject(\"cfs.files.filerecord\");\n sfsFilesObject && (related_object = sfsFilesObject);\n }\n return _.each(related_object.fields, function(related_field, related_field_name) {\n if ((related_field.type === \"master_detail\" || (related_field.type === \"lookup\" && related_field.relatedList)) && related_field.reference_to && related_field.reference_to === object_name) {\n if (related_object_name === \"object_fields\") {\n return related_objects.splice(0, 0, {\n object_name: related_object_name,\n foreign_key: related_field_name\n });\n } else {\n return related_objects.push({\n object_name: related_object_name,\n foreign_key: related_field_name,\n write_requires_master_read: related_field.write_requires_master_read\n });\n }\n }\n });\n });\n if (_object.enable_tasks) {\n related_objects.push({\n object_name: \"tasks\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_notes) {\n related_objects.push({\n object_name: \"notes\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_events) {\n related_objects.push({\n object_name: \"events\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_instances) {\n related_objects.push({\n object_name: \"instances\",\n foreign_key: \"record_ids\"\n });\n }\n if (_object.enable_approvals) {\n related_objects.push({\n object_name: \"approvals\",\n foreign_key: \"related_to\"\n });\n }\n if (_object.enable_process) {\n related_objects.push({\n object_name: \"process_instance_history\",\n foreign_key: \"target_object\"\n });\n }\n if (Meteor.isClient) {\n permissions = Creator.getPermissions(object_name);\n if (_object.enable_audit && (permissions != null ? permissions.modifyAllRecords : void 0)) {\n related_objects.push({\n object_name: \"audit_records\",\n foreign_key: \"related_to\"\n });\n }\n }\n return related_objects;\n};\n\nCreator.getUserContext = function(userId, spaceId, isUnSafeMode) {\n var USER_CONTEXT, ref, space_user_org, su, suFields;\n if (Meteor.isClient) {\n return Creator.USER_CONTEXT;\n } else {\n if (!(userId && spaceId)) {\n throw new Meteor.Error(500, \"the params userId and spaceId is required for the function Creator.getUserContext\");\n return null;\n }\n suFields = {\n name: 1,\n mobile: 1,\n position: 1,\n email: 1,\n company: 1,\n organization: 1,\n space: 1,\n company_id: 1,\n company_ids: 1\n };\n su = Creator.Collections[\"space_users\"].findOne({\n space: spaceId,\n user: userId\n }, {\n fields: suFields\n });\n if (!su) {\n spaceId = null;\n }\n if (!spaceId) {\n if (isUnSafeMode) {\n su = Creator.Collections[\"space_users\"].findOne({\n user: userId\n }, {\n fields: suFields\n });\n if (!su) {\n return null;\n }\n spaceId = su.space;\n } else {\n return null;\n }\n }\n USER_CONTEXT = {};\n USER_CONTEXT.userId = userId;\n USER_CONTEXT.spaceId = spaceId;\n USER_CONTEXT.user = {\n _id: userId,\n name: su.name,\n mobile: su.mobile,\n position: su.position,\n email: su.email,\n company: su.company,\n company_id: su.company_id,\n company_ids: su.company_ids\n };\n space_user_org = (ref = Creator.getCollection(\"organizations\")) != null ? ref.findOne(su.organization) : void 0;\n if (space_user_org) {\n USER_CONTEXT.user.organization = {\n _id: space_user_org._id,\n name: space_user_org.name,\n fullname: space_user_org.fullname\n };\n }\n return USER_CONTEXT;\n }\n};\n\nCreator.getRelativeUrl = function(url) {\n if (_.isFunction(Steedos.isCordova) && Steedos.isCordova() && ((url != null ? url.startsWith(\"/assets\") : void 0) || (url != null ? url.startsWith(\"assets\") : void 0) || (url != null ? url.startsWith(\"/packages\") : void 0))) {\n if (!/^\\//.test(url)) {\n url = \"/\" + url;\n }\n return url;\n }\n if (url) {\n if (!/^\\//.test(url)) {\n url = \"/\" + url;\n }\n return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url;\n } else {\n return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;\n }\n};\n\nCreator.getUserCompanyId = function(userId, spaceId) {\n var su;\n userId = userId || Meteor.userId();\n if (Meteor.isClient) {\n spaceId = spaceId || Session.get('spaceId');\n } else {\n if (!spaceId) {\n throw new Meteor.Error(400, 'miss spaceId');\n }\n }\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n company_id: 1\n }\n });\n return su.company_id;\n};\n\nCreator.getUserCompanyIds = function(userId, spaceId) {\n var su;\n userId = userId || Meteor.userId();\n if (Meteor.isClient) {\n spaceId = spaceId || Session.get('spaceId');\n } else {\n if (!spaceId) {\n throw new Meteor.Error(400, 'miss spaceId');\n }\n }\n su = Creator.getCollection('space_users').findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n company_ids: 1\n }\n });\n return su != null ? su.company_ids : void 0;\n};\n\nCreator.processPermissions = function(po) {\n if (po.allowCreate) {\n po.allowRead = true;\n }\n if (po.allowEdit) {\n po.allowRead = true;\n }\n if (po.allowDelete) {\n po.allowEdit = true;\n po.allowRead = true;\n }\n if (po.viewAllRecords) {\n po.allowRead = true;\n }\n if (po.modifyAllRecords) {\n po.allowRead = true;\n po.allowEdit = true;\n po.allowDelete = true;\n po.viewAllRecords = true;\n }\n if (po.viewCompanyRecords) {\n po.allowRead = true;\n }\n if (po.modifyCompanyRecords) {\n po.allowRead = true;\n po.allowEdit = true;\n po.allowDelete = true;\n po.viewCompanyRecords = true;\n }\n if (po.allowRead) {\n typeof po.allowReadFiles !== \"boolean\" && (po.allowReadFiles = true);\n typeof po.viewAllFiles !== \"boolean\" && (po.viewAllFiles = true);\n }\n if (po.allowEdit) {\n typeof po.allowCreateFiles !== \"boolean\" && (po.allowCreateFiles = true);\n typeof po.allowEditFiles !== \"boolean\" && (po.allowEditFiles = true);\n typeof po.allowDeleteFiles !== \"boolean\" && (po.allowDeleteFiles = true);\n }\n if (po.modifyAllRecords) {\n typeof po.modifyAllFiles !== \"boolean\" && (po.modifyAllFiles = true);\n }\n if (po.allowCreateFiles) {\n po.allowReadFiles = true;\n }\n if (po.allowEditFiles) {\n po.allowReadFiles = true;\n }\n if (po.allowDeleteFiles) {\n po.allowEditFiles = true;\n po.allowReadFiles = true;\n }\n if (po.viewAllFiles) {\n po.allowReadFiles = true;\n }\n if (po.modifyAllFiles) {\n po.allowReadFiles = true;\n po.allowEditFiles = true;\n po.allowDeleteFiles = true;\n po.viewAllFiles = true;\n }\n return po;\n};\n\nCreator.getTemplateSpaceId = function() {\n var ref;\n return (ref = Meteor.settings[\"public\"]) != null ? ref.templateSpaceId : void 0;\n};\n\nCreator.getCloudAdminSpaceId = function() {\n var ref;\n return (ref = Meteor.settings[\"public\"]) != null ? ref.cloudAdminSpaceId : void 0;\n};\n\nCreator.isTemplateSpace = function(spaceId) {\n var ref;\n if (spaceId && ((ref = Meteor.settings[\"public\"]) != null ? ref.templateSpaceId : void 0) === spaceId) {\n return true;\n }\n return false;\n};\n\nCreator.isCloudAdminSpace = function(spaceId) {\n var ref;\n if (spaceId && ((ref = Meteor.settings[\"public\"]) != null ? ref.cloudAdminSpaceId : void 0) === spaceId) {\n return true;\n }\n return false;\n};\n\nif (Meteor.isServer) {\n Creator.steedosStorageDir = process.env.STEEDOS_STORAGE_DIR;\n}\n","Meteor.methods\n\t# 用户获取lookup 、master_detail类型字段的选项值\n\t\"creator.object_options\": (options)->\n\t\tif options?.params?.reference_to\n\n\t\t\tobject = Creator.getObject(options.params.reference_to, options.params.space)\n\n\t\t\tname_field_key = object.NAME_FIELD_KEY\n\n\t\t\tquery = {}\n\t\t\tif options.params.space\n\t\t\t\tquery.space = options.params.space\n\n\t\t\t\tsort = options?.sort\n\n\t\t\t\tselected = options?.selected || []\n\n\t\t\t\toptions_limit = options?.options_limit || 10\n\n\t\t\t\tif options.searchText\n\t\t\t\t\tsearchTextQuery = {}\n\t\t\t\t\tsearchTextQuery[name_field_key] = {$regex: options.searchText}\n\n\t\t\t\tif options?.values?.length\n\t\t\t\t\tif options.searchText\n\t\t\t\t\t\tquery.$or = [{_id: {$in: options.values}}, searchTextQuery]\n\t\t\t\t\telse\n\t\t\t\t\t\tquery.$or = [{_id: {$in: options.values}}]\n\t\t\t\telse\n\t\t\t\t\tif options.searchText\n\t\t\t\t\t\t_.extend(query, searchTextQuery)\n\t\t\t\t\tquery._id = {$nin: selected}\n\n\t\t\t\tcollection = object.db\n\n\t\t\t\tif options.filterQuery\n\t\t\t\t\t_.extend query, options.filterQuery\n\n\t\t\t\tquery_options = {limit: options_limit}\n\n\t\t\t\tif sort && _.isObject(sort)\n\t\t\t\t\tquery_options.sort = sort\n\n\t\t\t\tif collection\n\t\t\t\t\ttry\n\t\t\t\t\t\trecords = collection.find(query, query_options).fetch()\n\t\t\t\t\t\tresults = []\n\t\t\t\t\t\t_.each records, (record)->\n\t\t\t\t\t\t\tresults.push\n\t\t\t\t\t\t\t\tlabel: record[name_field_key]\n\t\t\t\t\t\t\t\tvalue: record._id\n\t\t\t\t\t\treturn results\n\t\t\t\t\tcatch e\n\t\t\t\t\t\tthrow new Meteor.Error 500, e.message + \"-->\" + JSON.stringify(options)\n\t\treturn [] ","Meteor.methods({\n \"creator.object_options\": function(options) {\n var collection, e, name_field_key, object, options_limit, query, query_options, records, ref, ref1, results, searchTextQuery, selected, sort;\n if (options != null ? (ref = options.params) != null ? ref.reference_to : void 0 : void 0) {\n object = Creator.getObject(options.params.reference_to, options.params.space);\n name_field_key = object.NAME_FIELD_KEY;\n query = {};\n if (options.params.space) {\n query.space = options.params.space;\n sort = options != null ? options.sort : void 0;\n selected = (options != null ? options.selected : void 0) || [];\n options_limit = (options != null ? options.options_limit : void 0) || 10;\n if (options.searchText) {\n searchTextQuery = {};\n searchTextQuery[name_field_key] = {\n $regex: options.searchText\n };\n }\n if (options != null ? (ref1 = options.values) != null ? ref1.length : void 0 : void 0) {\n if (options.searchText) {\n query.$or = [\n {\n _id: {\n $in: options.values\n }\n }, searchTextQuery\n ];\n } else {\n query.$or = [\n {\n _id: {\n $in: options.values\n }\n }\n ];\n }\n } else {\n if (options.searchText) {\n _.extend(query, searchTextQuery);\n }\n query._id = {\n $nin: selected\n };\n }\n collection = object.db;\n if (options.filterQuery) {\n _.extend(query, options.filterQuery);\n }\n query_options = {\n limit: options_limit\n };\n if (sort && _.isObject(sort)) {\n query_options.sort = sort;\n }\n if (collection) {\n try {\n records = collection.find(query, query_options).fetch();\n results = [];\n _.each(records, function(record) {\n return results.push({\n label: record[name_field_key],\n value: record._id\n });\n });\n return results;\n } catch (error) {\n e = error;\n throw new Meteor.Error(500, e.message + \"-->\" + JSON.stringify(options));\n }\n }\n }\n }\n return [];\n }\n});\n","Creator.getInitWidthPercent = (object_name, columns) ->\n\t_schema = Creator.getSchema(object_name)?._schema\n\tcolumn_num = 0\n\tif _schema\n\t\t_.each columns, (field_name) ->\n\t\t\tfield = _.pick(_schema, field_name)\n\t\t\tis_wide = field[field_name]?.autoform?.is_wide\n\t\t\tif is_wide\n\t\t\t\tcolumn_num += 2\n\t\t\telse\n\t\t\t\tcolumn_num += 1\n\n\t\tinit_width_percent = 100 / column_num\n\t\treturn init_width_percent\n\nCreator.getFieldIsWide = (object_name, field_name) ->\n\t_schema = Creator.getSchema(object_name)._schema\n\tif _schema\n\t\tfield = _.pick(_schema, field_name)\n\t\tis_wide = field[field_name]?.autoform?.is_wide\n\t\treturn is_wide\n\nCreator.getTabularOrder = (object_name, list_view_id, columns) ->\n\tsetting = Creator.Collections?.settings?.findOne({object_name: object_name, record_id: \"object_listviews\"})\n\tobj = Creator.getObject(object_name)\n\tcolumns = _.map columns, (column)->\n\t\tfield = obj.fields[column]\n\t\tif field?.type and !field.hidden\n\t\t\treturn column\n\t\telse\n\t\t\treturn undefined\n\tcolumns = _.compact columns\n\tif setting and setting.settings\n\t\tsort = setting.settings[list_view_id]?.sort || []\n\t\tsort = _.map sort, (order)->\n\t\t\tkey = order[0]\n\t\t\tindex = _.indexOf(columns, key)\n\t\t\torder[0] = index + 1\n\t\t\treturn order\n\t\treturn sort\n\treturn []\n\n\nCreator.initListViews = (object_name)->\n\tobject = Creator.getObject(object_name)\n\tcolumns = Creator.getObjectDefaultColumns(object_name) || [\"name\"]\n\textra_columns = [\"owner\"]\n\tdefault_extra_columns = Creator.getObjectDefaultExtraColumns(object_name) || [\"owner\"]\n\tif default_extra_columns\n\t\textra_columns = _.union extra_columns, default_extra_columns\n\n\torder = Creator.getObjectDefaultSort(object_name) || []\n\tif Meteor.isClient\n\t\tCreator.TabularSelectedIds?[object_name] = []\n\nCreator.convertListView = (default_view, list_view, list_view_name)->\n\tdefault_columns = default_view?.columns\n\tdefault_mobile_columns = default_view?.mobile_columns\n\tunless list_view\n\t\treturn\n\toitem = _.clone(list_view)\n\tif !_.has(oitem, \"name\")\n\t\toitem.name = list_view_name\n\tif !oitem.columns\n\t\tif default_columns\n\t\t\toitem.columns = default_columns\n\tif !oitem.columns\n\t\toitem.columns = [\"name\"]\n\tif !oitem.mobile_columns\n\t\tif default_mobile_columns\n\t\t\toitem.mobile_columns = default_mobile_columns\n\n\tif Meteor.isClient\n\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\")) && !_.include(oitem.columns, 'space')\n\t\t\toitem.columns.push('space')\n\n\n\tif !oitem.filter_scope\n\t\t# listview视图的filter_scope默认值改为space #131\n\t\toitem.filter_scope = \"space\"\n\n\tif !_.has(oitem, \"_id\")\n\t\toitem._id = list_view_name\n\telse\n\t\toitem.label = oitem.label || list_view.name\n\n\tif _.isString(oitem.options)\n\t\toitem.options = JSON.parse(oitem.options)\n\n\t_.forEach oitem.filters, (filter, _index)->\n\t\tif !_.isArray(filter) && _.isObject(filter)\n\t\t\tif Meteor.isServer\n\t\t\t\tif _.isFunction(filter?.value)\n\t\t\t\t\tfilter._value = filter.value.toString()\n\t\t\telse\n\t\t\t\tif _.isString(filter?._value)\n\t\t\t\t\tfilter.value = Creator.eval(\"(#{filter._value})\")\n\treturn oitem\n\n\nif Meteor.isClient\n\tCreator.getRelatedList = (object_name)->\n\t\tunless object_name\n\t\t\treturn\n\t\trelatedListObjects = {}\n\t\trelatedListNames = []\n\t\tobjectLayoutRelatedListObjects = [];\n\t\t_object = Creator.getObject(object_name)\n\t\tif _object\n\t\t\tlayoutRelatedList = _object.related_lists;\n\t\t\t# layoutRelatedList 是数组就表示配置过页面布局,就启用页面布局的相关子表。\n\t\t\tif _.isArray layoutRelatedList\n\t\t\t\t_.each layoutRelatedList, (item)->\n\t\t\t\t\treObjectName = item.related_field_fullname.split('.')[0]\n\t\t\t\t\treFieldName = item.related_field_fullname.split('.')[1]\n\t\t\t\t\twrite_requires_master_read = Creator.getObject(reObjectName)?.fields[reFieldName]?.write_requires_master_read\n\t\t\t\t\trelated =\n\t\t\t\t\t\tobject_name: reObjectName\n\t\t\t\t\t\tcolumns: item.field_names\n\t\t\t\t\t\tmobile_columns: item.field_names\n\t\t\t\t\t\tis_file: reObjectName == \"cms_files\"\n\t\t\t\t\t\tfiltersFunction: item.filters\n\t\t\t\t\t\tsort: item.sort\n\t\t\t\t\t\trelated_field_name: reFieldName\n\t\t\t\t\t\tcustomRelatedListObject: true\n\t\t\t\t\t\twrite_requires_master_read: write_requires_master_read\n\t\t\t\t\t\tlabel: item.label\n\t\t\t\t\t\tactions: item.buttons\n\t\t\t\t\t\tvisible_on: item.visible_on\n\t\t\t\t\t\tpage_size: item.page_size\n\t\t\t\t\tobjectLayoutRelatedListObjects.push(related)\n\t\t\t\treturn objectLayoutRelatedListObjects;\n\t\t\trelatedList = _object.relatedList\n\t\t\tif !_.isEmpty relatedList\n\t\t\t\t_.each relatedList, (objOrName)->\n\t\t\t\t\tif _.isObject objOrName\n\t\t\t\t\t\trelated =\n\t\t\t\t\t\t\tobject_name: objOrName.objectName\n\t\t\t\t\t\t\tcolumns: objOrName.columns\n\t\t\t\t\t\t\tmobile_columns: objOrName.mobile_columns\n\t\t\t\t\t\t\tis_file: objOrName.objectName == \"cms_files\"\n\t\t\t\t\t\t\tfiltersFunction: objOrName.filters\n\t\t\t\t\t\t\tsort: objOrName.sort\n\t\t\t\t\t\t\trelated_field_name: ''\n\t\t\t\t\t\t\tcustomRelatedListObject: true\n\t\t\t\t\t\t\tlabel: objOrName.label\n\t\t\t\t\t\t\tactions: objOrName.actions\n\t\t\t\t\t\t\tpage_size: objOrName.page_size\n\t\t\t\t\t\trelatedListObjects[objOrName.objectName] = related\n\t\t\t\t\t\trelatedListNames.push objOrName.objectName\n\t\t\t\t\telse if _.isString objOrName\n\t\t\t\t\t\trelatedListNames.push objOrName\n\n\t\tmapList = {}\n\t\trelated_objects = Creator.getRelatedObjects(object_name)\n\t\t_.each related_objects, (related_object_item) ->\n\t\t\tif !related_object_item?.object_name\n\t\t\t\treturn\n\t\t\trelated_object_name = related_object_item.object_name\n\t\t\trelated_field_name = related_object_item.foreign_key\n\t\t\twrite_requires_master_read = related_object_item.write_requires_master_read\n\t\t\trelated_object = Creator.getObject(related_object_name)\n\t\t\tunless related_object\n\t\t\t\treturn\n\t\t\tcolumns = Creator.getObjectFirstListViewColumns(related_object_name) || [\"name\"]\n\t\t\tcolumns = _.without(columns, related_field_name)\n\t\t\tmobile_columns = Creator.getObjectFirstListViewColumns(related_object_name, true) || [\"name\"]\n\t\t\tmobile_columns = _.without(mobile_columns, related_field_name)\n\n\t\t\torder = Creator.getObjectDefaultSort(related_object_name)\n\t\t\ttabular_order = Creator.transformSortToTabular(order, columns)\n\n\t\t\tif /\\w+\\.\\$\\.\\w+/g.test(related_field_name)\n\t\t\t\t# object类型带子属性的related_field_name要去掉中间的美元符号,否则显示不出字段值\n\t\t\t\trelated_field_name = related_field_name.replace(/\\$\\./,\"\")\n\t\t\trelated =\n\t\t\t\tobject_name: related_object_name\n\t\t\t\tcolumns: columns\n\t\t\t\tmobile_columns: mobile_columns\n\t\t\t\trelated_field_name: related_field_name\n\t\t\t\tis_file: related_object_name == \"cms_files\"\n\t\t\t\twrite_requires_master_read: write_requires_master_read\n\n\t\t\trelatedObject = relatedListObjects[related_object_name]\n\t\t\tif relatedObject\n\t\t\t\tif relatedObject.columns\n\t\t\t\t\trelated.columns = relatedObject.columns\n\t\t\t\tif relatedObject.mobile_columns\n\t\t\t\t\trelated.mobile_columns = relatedObject.mobile_columns\n\t\t\t\tif relatedObject.sort\n\t\t\t\t\trelated.sort = relatedObject.sort\n\t\t\t\tif relatedObject.filtersFunction\n\t\t\t\t\trelated.filtersFunction = relatedObject.filtersFunction\n\t\t\t\tif relatedObject.customRelatedListObject\n\t\t\t\t\trelated.customRelatedListObject = relatedObject.customRelatedListObject\n\t\t\t\tif relatedObject.label\n\t\t\t\t\trelated.label = relatedObject.label\n\t\t\t\tif relatedObject.page_size\n\t\t\t\t\trelated.page_size = relatedObject.page_size\n\t\t\t\tdelete relatedListObjects[related_object_name]\n\n\t\t\tmapList[related.object_name] = related\n\n\n\t\tspaceId = Session.get(\"spaceId\")\n\t\tuserId = Meteor.userId()\n\t\trelated_object_names = _.pluck(_.values(relatedListObjects), \"object_name\")\n\t\tpermissions = Creator.getPermissions(object_name, spaceId, userId)\n\t\tunrelated_objects = permissions.unrelated_objects\n\t\trelated_object_names = _.difference related_object_names, unrelated_objects\n\t\t_.each relatedListObjects, (v, related_object_name) ->\n\t\t\tisActive = related_object_names.indexOf(related_object_name) > -1\n\t\t\tallowRead = Creator.getPermissions(related_object_name, spaceId, userId)?.allowRead\n\t\t\tif isActive && allowRead\n\t\t\t\tmapList[related_object_name] = v\n\n\t\tlist = []\n\t\tif _.isEmpty relatedListNames\n\t\t\tlist = _.values mapList\n\t\telse\n\t\t\t_.each relatedListNames, (objectName) ->\n\t\t\t\tif mapList[objectName]\n\t\t\t\t\tlist.push mapList[objectName]\n\n\t\tif _.has(_object, 'allow_relatedList')\n\t\t\tlist = _.filter list, (item)->\n\t\t\t\treturn _.include(_object.allow_relatedList, item.object_name)\n\n\t\treturn list\n\nCreator.getObjectFirstListView = (object_name)->\n\treturn _.first(Creator.getListViews(object_name))\n\n### \n\t取出list_view_id对应的视图,如果不存在或者没有权限,就返回第一个视图\n\texac为true时,需要强制按list_view_id精确查找,不默认返回第一个视图\n###\nCreator.getListView = (object_name, list_view_id, exac)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !list_view_id\n\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\treturn\n\tlistViews = Creator.getListViews(object_name)\n\tunless listViews?.length\n\t\treturn\n\tlist_view = _.find(listViews, (item)-> return item._id == list_view_id || item.name == list_view_id)\n\tunless list_view\n\t\t# 如果不需要强制按list_view_id精确查找,则默认返回第一个视图,反之返回空\n\t\tif exac\n\t\t\treturn\n\t\telse\n\t\t\tlist_view = listViews[0]\n\treturn list_view\n\n#获取list_view_id对应的视图是否是最近查看视图\nCreator.getListViewIsRecent = (object_name, list_view_id)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tif !list_view_id\n\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\tif typeof(list_view_id) == \"string\"\n\t\tobject = Creator.getObject(object_name)\n\t\tif !object\n\t\t\treturn\n\t\tlistView = _.findWhere(object.list_views,{_id: list_view_id})\n\telse\n\t\tlistView = list_view_id\n\treturn listView?.name == \"recent\"\n\n\n###\n 从columns参数中过滤出用于手机端显示的columns\n\t规则:\n\t1.优先把columns中的name字段排在第一个\n\t2.最多只返回4个字段\n\t3.考虑宽字段占用整行规则条件下,最多只返回两行\n###\nCreator.pickObjectMobileColumns = (object_name, columns)->\n\tresult = []\n\tmaxRows = 2 \n\tmaxCount = maxRows * 2\n\tcount = 0\n\tobject = Creator.getObject(object_name)\n\tfields = object.fields\n\tunless object\n\t\treturn columns\n\tnameKey = object.NAME_FIELD_KEY\n\tisNameColumn = (item)->\n\t\tif _.isObject(item)\n\t\t\treturn item.field == nameKey\n\t\telse\n\t\t\treturn item == nameKey\n\tgetField = (item)->\n\t\tif _.isObject(item)\n\t\t\treturn fields[item.field]\n\t\telse\n\t\t\treturn fields[item]\n\tif nameKey\n\t\tnameColumn = columns.find (item)->\n\t\t\treturn isNameColumn(item)\n\tif nameColumn\n\t\tfield = getField(nameColumn)\n\t\titemCount = if field.is_wide then 2 else 1\n\t\tcount += itemCount\n\t\tresult.push nameColumn\n\tcolumns.forEach (item)->\n\t\tfield = getField(item)\n\t\tunless field\n\t\t\treturn\n\t\titemCount = if field.is_wide then 2 else 1\n\t\tif count < maxCount and result.length < maxCount and !isNameColumn(item)\n\t\t\tcount += itemCount\n\t\t\tif count <= maxCount\n\t\t\t\tresult.push item\n\t\n\treturn result\n\n###\n 获取默认视图\n###\nCreator.getObjectDefaultView = (object_name)->\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\tobject = Creator.Objects[object_name]\n\tif object?.list_views?.default\n\t\t#TODO 此代码只是暂时兼容以前code中定义的default视图,待code中的default清理完成后,需要删除此代码\n\t\tdefaultView = object.list_views.default\n\telse\n\t\t_.each object?.list_views, (list_view, key)->\n\t\t\tif list_view.name == \"all\" || key == \"all\"\n\t\t\t\tdefaultView = list_view\n\treturn defaultView;\n\n###\n 获取对象的列表默认显示字段\n###\nCreator.getObjectDefaultColumns = (object_name, use_mobile_columns)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\tcolumns = defaultView?.columns\n\tif use_mobile_columns\n\t\tif defaultView?.mobile_columns\n\t\t\tcolumns = defaultView.mobile_columns\n\t\telse if columns\n\t\t\tcolumns = Creator.pickObjectMobileColumns(object_name, columns)\n\treturn columns\n\n###\n 获取对象的列表第一个视图显示的字段\n###\nCreator.getObjectFirstListViewColumns = (object_name, use_mobile_columns)->\n\tdefaultView = Creator.getObjectFirstListView(object_name)\n\tcolumns = defaultView?.columns\n\tif use_mobile_columns\n\t\tif defaultView?.mobile_columns\n\t\t\tcolumns = defaultView.mobile_columns\n\t\telse if columns\n\t\t\tcolumns = Creator.pickObjectMobileColumns(object_name, columns)\n\treturn columns\n\n###\n\t获取对象的列表默认额外加载的字段\n###\nCreator.getObjectDefaultExtraColumns = (object_name)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\treturn defaultView?.extra_columns\n\n###\n\t获取对象的默认排序\n###\nCreator.getObjectDefaultSort = (object_name)->\n\tdefaultView = Creator.getObjectDefaultView(object_name)\n\tif defaultView\n\t\tif defaultView.sort\n\t\t\treturn defaultView.sort\n\t\telse\n\t\t\treturn [[\"created\", \"desc\"]]\n\n\n###\n 判断是否All view\n###\nCreator.isAllView = (list_view)->\n\treturn list_view?.name == \"all\"\n\n###\n 判断是否最近查看 view\n###\nCreator.isRecentView = (list_view)->\n\treturn list_view?.name == \"recent\"\n\n###\n 将sort转换为Tabular控件所需要的格式\n###\nCreator.transformSortToTabular = (sort, tabularColumns)->\n\ttabular_sort = []\n\t_.each sort, (item)->\n\t\tif _.isArray(item)\n\t\t\t# 兼容旧的数据格式[[\"field_name\", \"order\"]]\n\t\t\tif item.length == 1\n\t\t\t\tcolumn_index = tabularColumns.indexOf(item[0])\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, \"asc\"]\n\t\t\telse if item.length == 2\n\t\t\t\tcolumn_index = tabularColumns.indexOf(item[0])\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, item[1]]\n\t\telse if _.isObject(item)\n\t\t\t#新数据格式:[{field_name: , order: }]\n\t\t\tfield_name = item.field_name\n\t\t\torder = item.order\n\t\t\tif field_name && order\n\t\t\t\tcolumn_index = tabularColumns.indexOf(field_name)\n\t\t\t\tif column_index > -1\n\t\t\t\t\ttabular_sort.push [column_index, order]\n\n\treturn tabular_sort\n\n###\n 将sort转换为DevExpress控件所需要的格式\n###\nCreator.transformSortToDX = (sort)->\n\tdx_sort = []\n\t_.each sort, (item)->\n\t\tif _.isArray(item)\n\t\t\t#兼容旧格式:[[\"field_name\", \"order\"]]\n\t\t\tdx_sort.push(item)\n\t\telse if _.isObject(item)\n\t\t\t#新数据格式:[{field_name: , order: }]\n\t\t\tfield_name = item.field_name\n\t\t\torder = item.order\n\t\t\tif field_name && order\n\t\t\t\tdx_sort.push [field_name, order]\n\n\treturn dx_sort\n","Creator.getInitWidthPercent = function(object_name, columns) {\n var _schema, column_num, init_width_percent, ref;\n _schema = (ref = Creator.getSchema(object_name)) != null ? ref._schema : void 0;\n column_num = 0;\n if (_schema) {\n _.each(columns, function(field_name) {\n var field, is_wide, ref1, ref2;\n field = _.pick(_schema, field_name);\n is_wide = (ref1 = field[field_name]) != null ? (ref2 = ref1.autoform) != null ? ref2.is_wide : void 0 : void 0;\n if (is_wide) {\n return column_num += 2;\n } else {\n return column_num += 1;\n }\n });\n init_width_percent = 100 / column_num;\n return init_width_percent;\n }\n};\n\nCreator.getFieldIsWide = function(object_name, field_name) {\n var _schema, field, is_wide, ref, ref1;\n _schema = Creator.getSchema(object_name)._schema;\n if (_schema) {\n field = _.pick(_schema, field_name);\n is_wide = (ref = field[field_name]) != null ? (ref1 = ref.autoform) != null ? ref1.is_wide : void 0 : void 0;\n return is_wide;\n }\n};\n\nCreator.getTabularOrder = function(object_name, list_view_id, columns) {\n var obj, ref, ref1, ref2, setting, sort;\n setting = (ref = Creator.Collections) != null ? (ref1 = ref.settings) != null ? ref1.findOne({\n object_name: object_name,\n record_id: \"object_listviews\"\n }) : void 0 : void 0;\n obj = Creator.getObject(object_name);\n columns = _.map(columns, function(column) {\n var field;\n field = obj.fields[column];\n if ((field != null ? field.type : void 0) && !field.hidden) {\n return column;\n } else {\n return void 0;\n }\n });\n columns = _.compact(columns);\n if (setting && setting.settings) {\n sort = ((ref2 = setting.settings[list_view_id]) != null ? ref2.sort : void 0) || [];\n sort = _.map(sort, function(order) {\n var index, key;\n key = order[0];\n index = _.indexOf(columns, key);\n order[0] = index + 1;\n return order;\n });\n return sort;\n }\n return [];\n};\n\nCreator.initListViews = function(object_name) {\n var columns, default_extra_columns, extra_columns, object, order, ref;\n object = Creator.getObject(object_name);\n columns = Creator.getObjectDefaultColumns(object_name) || [\"name\"];\n extra_columns = [\"owner\"];\n default_extra_columns = Creator.getObjectDefaultExtraColumns(object_name) || [\"owner\"];\n if (default_extra_columns) {\n extra_columns = _.union(extra_columns, default_extra_columns);\n }\n order = Creator.getObjectDefaultSort(object_name) || [];\n if (Meteor.isClient) {\n return (ref = Creator.TabularSelectedIds) != null ? ref[object_name] = [] : void 0;\n }\n};\n\nCreator.convertListView = function(default_view, list_view, list_view_name) {\n var default_columns, default_mobile_columns, oitem;\n default_columns = default_view != null ? default_view.columns : void 0;\n default_mobile_columns = default_view != null ? default_view.mobile_columns : void 0;\n if (!list_view) {\n return;\n }\n oitem = _.clone(list_view);\n if (!_.has(oitem, \"name\")) {\n oitem.name = list_view_name;\n }\n if (!oitem.columns) {\n if (default_columns) {\n oitem.columns = default_columns;\n }\n }\n if (!oitem.columns) {\n oitem.columns = [\"name\"];\n }\n if (!oitem.mobile_columns) {\n if (default_mobile_columns) {\n oitem.mobile_columns = default_mobile_columns;\n }\n }\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\")) && !_.include(oitem.columns, 'space')) {\n oitem.columns.push('space');\n }\n }\n if (!oitem.filter_scope) {\n oitem.filter_scope = \"space\";\n }\n if (!_.has(oitem, \"_id\")) {\n oitem._id = list_view_name;\n } else {\n oitem.label = oitem.label || list_view.name;\n }\n if (_.isString(oitem.options)) {\n oitem.options = JSON.parse(oitem.options);\n }\n _.forEach(oitem.filters, function(filter, _index) {\n if (!_.isArray(filter) && _.isObject(filter)) {\n if (Meteor.isServer) {\n if (_.isFunction(filter != null ? filter.value : void 0)) {\n return filter._value = filter.value.toString();\n }\n } else {\n if (_.isString(filter != null ? filter._value : void 0)) {\n return filter.value = Creator[\"eval\"](\"(\" + filter._value + \")\");\n }\n }\n }\n });\n return oitem;\n};\n\nif (Meteor.isClient) {\n Creator.getRelatedList = function(object_name) {\n var _object, layoutRelatedList, list, mapList, objectLayoutRelatedListObjects, permissions, relatedList, relatedListNames, relatedListObjects, related_object_names, related_objects, spaceId, unrelated_objects, userId;\n if (!object_name) {\n return;\n }\n relatedListObjects = {};\n relatedListNames = [];\n objectLayoutRelatedListObjects = [];\n _object = Creator.getObject(object_name);\n if (_object) {\n layoutRelatedList = _object.related_lists;\n if (_.isArray(layoutRelatedList)) {\n _.each(layoutRelatedList, function(item) {\n var reFieldName, reObjectName, ref, ref1, related, write_requires_master_read;\n reObjectName = item.related_field_fullname.split('.')[0];\n reFieldName = item.related_field_fullname.split('.')[1];\n write_requires_master_read = (ref = Creator.getObject(reObjectName)) != null ? (ref1 = ref.fields[reFieldName]) != null ? ref1.write_requires_master_read : void 0 : void 0;\n related = {\n object_name: reObjectName,\n columns: item.field_names,\n mobile_columns: item.field_names,\n is_file: reObjectName === \"cms_files\",\n filtersFunction: item.filters,\n sort: item.sort,\n related_field_name: reFieldName,\n customRelatedListObject: true,\n write_requires_master_read: write_requires_master_read,\n label: item.label,\n actions: item.buttons,\n visible_on: item.visible_on,\n page_size: item.page_size\n };\n return objectLayoutRelatedListObjects.push(related);\n });\n return objectLayoutRelatedListObjects;\n }\n relatedList = _object.relatedList;\n if (!_.isEmpty(relatedList)) {\n _.each(relatedList, function(objOrName) {\n var related;\n if (_.isObject(objOrName)) {\n related = {\n object_name: objOrName.objectName,\n columns: objOrName.columns,\n mobile_columns: objOrName.mobile_columns,\n is_file: objOrName.objectName === \"cms_files\",\n filtersFunction: objOrName.filters,\n sort: objOrName.sort,\n related_field_name: '',\n customRelatedListObject: true,\n label: objOrName.label,\n actions: objOrName.actions,\n page_size: objOrName.page_size\n };\n relatedListObjects[objOrName.objectName] = related;\n return relatedListNames.push(objOrName.objectName);\n } else if (_.isString(objOrName)) {\n return relatedListNames.push(objOrName);\n }\n });\n }\n }\n mapList = {};\n related_objects = Creator.getRelatedObjects(object_name);\n _.each(related_objects, function(related_object_item) {\n var columns, mobile_columns, order, related, relatedObject, related_field_name, related_object, related_object_name, tabular_order, write_requires_master_read;\n if (!(related_object_item != null ? related_object_item.object_name : void 0)) {\n return;\n }\n related_object_name = related_object_item.object_name;\n related_field_name = related_object_item.foreign_key;\n write_requires_master_read = related_object_item.write_requires_master_read;\n related_object = Creator.getObject(related_object_name);\n if (!related_object) {\n return;\n }\n columns = Creator.getObjectFirstListViewColumns(related_object_name) || [\"name\"];\n columns = _.without(columns, related_field_name);\n mobile_columns = Creator.getObjectFirstListViewColumns(related_object_name, true) || [\"name\"];\n mobile_columns = _.without(mobile_columns, related_field_name);\n order = Creator.getObjectDefaultSort(related_object_name);\n tabular_order = Creator.transformSortToTabular(order, columns);\n if (/\\w+\\.\\$\\.\\w+/g.test(related_field_name)) {\n related_field_name = related_field_name.replace(/\\$\\./, \"\");\n }\n related = {\n object_name: related_object_name,\n columns: columns,\n mobile_columns: mobile_columns,\n related_field_name: related_field_name,\n is_file: related_object_name === \"cms_files\",\n write_requires_master_read: write_requires_master_read\n };\n relatedObject = relatedListObjects[related_object_name];\n if (relatedObject) {\n if (relatedObject.columns) {\n related.columns = relatedObject.columns;\n }\n if (relatedObject.mobile_columns) {\n related.mobile_columns = relatedObject.mobile_columns;\n }\n if (relatedObject.sort) {\n related.sort = relatedObject.sort;\n }\n if (relatedObject.filtersFunction) {\n related.filtersFunction = relatedObject.filtersFunction;\n }\n if (relatedObject.customRelatedListObject) {\n related.customRelatedListObject = relatedObject.customRelatedListObject;\n }\n if (relatedObject.label) {\n related.label = relatedObject.label;\n }\n if (relatedObject.page_size) {\n related.page_size = relatedObject.page_size;\n }\n delete relatedListObjects[related_object_name];\n }\n return mapList[related.object_name] = related;\n });\n spaceId = Session.get(\"spaceId\");\n userId = Meteor.userId();\n related_object_names = _.pluck(_.values(relatedListObjects), \"object_name\");\n permissions = Creator.getPermissions(object_name, spaceId, userId);\n unrelated_objects = permissions.unrelated_objects;\n related_object_names = _.difference(related_object_names, unrelated_objects);\n _.each(relatedListObjects, function(v, related_object_name) {\n var allowRead, isActive, ref;\n isActive = related_object_names.indexOf(related_object_name) > -1;\n allowRead = (ref = Creator.getPermissions(related_object_name, spaceId, userId)) != null ? ref.allowRead : void 0;\n if (isActive && allowRead) {\n return mapList[related_object_name] = v;\n }\n });\n list = [];\n if (_.isEmpty(relatedListNames)) {\n list = _.values(mapList);\n } else {\n _.each(relatedListNames, function(objectName) {\n if (mapList[objectName]) {\n return list.push(mapList[objectName]);\n }\n });\n }\n if (_.has(_object, 'allow_relatedList')) {\n list = _.filter(list, function(item) {\n return _.include(_object.allow_relatedList, item.object_name);\n });\n }\n return list;\n };\n}\n\nCreator.getObjectFirstListView = function(object_name) {\n return _.first(Creator.getListViews(object_name));\n};\n\n\n/* \n\t取出list_view_id对应的视图,如果不存在或者没有权限,就返回第一个视图\n\texac为true时,需要强制按list_view_id精确查找,不默认返回第一个视图\n */\n\nCreator.getListView = function(object_name, list_view_id, exac) {\n var listViews, list_view, object;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n }\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n listViews = Creator.getListViews(object_name);\n if (!(listViews != null ? listViews.length : void 0)) {\n return;\n }\n list_view = _.find(listViews, function(item) {\n return item._id === list_view_id || item.name === list_view_id;\n });\n if (!list_view) {\n if (exac) {\n return;\n } else {\n list_view = listViews[0];\n }\n }\n return list_view;\n};\n\nCreator.getListViewIsRecent = function(object_name, list_view_id) {\n var listView, object;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n }\n if (typeof list_view_id === \"string\") {\n object = Creator.getObject(object_name);\n if (!object) {\n return;\n }\n listView = _.findWhere(object.list_views, {\n _id: list_view_id\n });\n } else {\n listView = list_view_id;\n }\n return (listView != null ? listView.name : void 0) === \"recent\";\n};\n\n\n/*\n 从columns参数中过滤出用于手机端显示的columns\n\t规则:\n\t1.优先把columns中的name字段排在第一个\n\t2.最多只返回4个字段\n\t3.考虑宽字段占用整行规则条件下,最多只返回两行\n */\n\nCreator.pickObjectMobileColumns = function(object_name, columns) {\n var count, field, fields, getField, isNameColumn, itemCount, maxCount, maxRows, nameColumn, nameKey, object, result;\n result = [];\n maxRows = 2;\n maxCount = maxRows * 2;\n count = 0;\n object = Creator.getObject(object_name);\n fields = object.fields;\n if (!object) {\n return columns;\n }\n nameKey = object.NAME_FIELD_KEY;\n isNameColumn = function(item) {\n if (_.isObject(item)) {\n return item.field === nameKey;\n } else {\n return item === nameKey;\n }\n };\n getField = function(item) {\n if (_.isObject(item)) {\n return fields[item.field];\n } else {\n return fields[item];\n }\n };\n if (nameKey) {\n nameColumn = columns.find(function(item) {\n return isNameColumn(item);\n });\n }\n if (nameColumn) {\n field = getField(nameColumn);\n itemCount = field.is_wide ? 2 : 1;\n count += itemCount;\n result.push(nameColumn);\n }\n columns.forEach(function(item) {\n field = getField(item);\n if (!field) {\n return;\n }\n itemCount = field.is_wide ? 2 : 1;\n if (count < maxCount && result.length < maxCount && !isNameColumn(item)) {\n count += itemCount;\n if (count <= maxCount) {\n return result.push(item);\n }\n }\n });\n return result;\n};\n\n\n/*\n 获取默认视图\n */\n\nCreator.getObjectDefaultView = function(object_name) {\n var defaultView, object, ref;\n object = Creator.getObject(object_name);\n if (!object) {\n object = Creator.Objects[object_name];\n }\n if (object != null ? (ref = object.list_views) != null ? ref[\"default\"] : void 0 : void 0) {\n defaultView = object.list_views[\"default\"];\n } else {\n _.each(object != null ? object.list_views : void 0, function(list_view, key) {\n if (list_view.name === \"all\" || key === \"all\") {\n return defaultView = list_view;\n }\n });\n }\n return defaultView;\n};\n\n\n/*\n 获取对象的列表默认显示字段\n */\n\nCreator.getObjectDefaultColumns = function(object_name, use_mobile_columns) {\n var columns, defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n columns = defaultView != null ? defaultView.columns : void 0;\n if (use_mobile_columns) {\n if (defaultView != null ? defaultView.mobile_columns : void 0) {\n columns = defaultView.mobile_columns;\n } else if (columns) {\n columns = Creator.pickObjectMobileColumns(object_name, columns);\n }\n }\n return columns;\n};\n\n\n/*\n 获取对象的列表第一个视图显示的字段\n */\n\nCreator.getObjectFirstListViewColumns = function(object_name, use_mobile_columns) {\n var columns, defaultView;\n defaultView = Creator.getObjectFirstListView(object_name);\n columns = defaultView != null ? defaultView.columns : void 0;\n if (use_mobile_columns) {\n if (defaultView != null ? defaultView.mobile_columns : void 0) {\n columns = defaultView.mobile_columns;\n } else if (columns) {\n columns = Creator.pickObjectMobileColumns(object_name, columns);\n }\n }\n return columns;\n};\n\n\n/*\n\t获取对象的列表默认额外加载的字段\n */\n\nCreator.getObjectDefaultExtraColumns = function(object_name) {\n var defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n return defaultView != null ? defaultView.extra_columns : void 0;\n};\n\n\n/*\n\t获取对象的默认排序\n */\n\nCreator.getObjectDefaultSort = function(object_name) {\n var defaultView;\n defaultView = Creator.getObjectDefaultView(object_name);\n if (defaultView) {\n if (defaultView.sort) {\n return defaultView.sort;\n } else {\n return [[\"created\", \"desc\"]];\n }\n }\n};\n\n\n/*\n 判断是否All view\n */\n\nCreator.isAllView = function(list_view) {\n return (list_view != null ? list_view.name : void 0) === \"all\";\n};\n\n\n/*\n 判断是否最近查看 view\n */\n\nCreator.isRecentView = function(list_view) {\n return (list_view != null ? list_view.name : void 0) === \"recent\";\n};\n\n\n/*\n 将sort转换为Tabular控件所需要的格式\n */\n\nCreator.transformSortToTabular = function(sort, tabularColumns) {\n var tabular_sort;\n tabular_sort = [];\n _.each(sort, function(item) {\n var column_index, field_name, order;\n if (_.isArray(item)) {\n if (item.length === 1) {\n column_index = tabularColumns.indexOf(item[0]);\n if (column_index > -1) {\n return tabular_sort.push([column_index, \"asc\"]);\n }\n } else if (item.length === 2) {\n column_index = tabularColumns.indexOf(item[0]);\n if (column_index > -1) {\n return tabular_sort.push([column_index, item[1]]);\n }\n }\n } else if (_.isObject(item)) {\n field_name = item.field_name;\n order = item.order;\n if (field_name && order) {\n column_index = tabularColumns.indexOf(field_name);\n if (column_index > -1) {\n return tabular_sort.push([column_index, order]);\n }\n }\n }\n });\n return tabular_sort;\n};\n\n\n/*\n 将sort转换为DevExpress控件所需要的格式\n */\n\nCreator.transformSortToDX = function(sort) {\n var dx_sort;\n dx_sort = [];\n _.each(sort, function(item) {\n var field_name, order;\n if (_.isArray(item)) {\n return dx_sort.push(item);\n } else if (_.isObject(item)) {\n field_name = item.field_name;\n order = item.order;\n if (field_name && order) {\n return dx_sort.push([field_name, order]);\n }\n }\n });\n return dx_sort;\n};\n","SimpleSchema.RegEx.code = new RegExp('^[a-zA-Z_][a-zA-Z0-9_]*$')\n\nif Meteor.isClient\n\tMeteor.startup ()->\n\t\t_regExMessages = SimpleSchema._globalMessages.regEx || []\n\t\t_regExMessages.push {exp: SimpleSchema.RegEx.code, msg: \"[label] 只能以字母、_开头,且只能包含字母、数字、_\"}\n\t\tSimpleSchema.messages({\n\t\t\tregEx: _regExMessages,\n\t\t})","SimpleSchema.RegEx.code = new RegExp('^[a-zA-Z_][a-zA-Z0-9_]*$');\n\nif (Meteor.isClient) {\n Meteor.startup(function() {\n var _regExMessages;\n _regExMessages = SimpleSchema._globalMessages.regEx || [];\n _regExMessages.push({\n exp: SimpleSchema.RegEx.code,\n msg: \"[label] 只能以字母、_开头,且只能包含字母、数字、_\"\n });\n return SimpleSchema.messages({\n regEx: _regExMessages\n });\n });\n}\n","SimpleSchema.RegEx.field = new RegExp('^[a-zA-Z_]\\\\w*(\\\\.\\\\$\\\\.\\\\w+)?[a-zA-Z0-9]*$')\n\nif Meteor.isClient\n\tMeteor.startup ()->\n\t\t_regExMessages = SimpleSchema._globalMessages.regEx || []\n\t\t_regExMessages.push {exp: SimpleSchema.RegEx.field, msg: \"[label] 只能以字母、_开头,.$.前后必须包含字符\"}\n\t\tSimpleSchema.messages({\n\t\t\tregEx: _regExMessages,\n\t\t})","SimpleSchema.RegEx.field = new RegExp('^[a-zA-Z_]\\\\w*(\\\\.\\\\$\\\\.\\\\w+)?[a-zA-Z0-9]*$');\n\nif (Meteor.isClient) {\n Meteor.startup(function() {\n var _regExMessages;\n _regExMessages = SimpleSchema._globalMessages.regEx || [];\n _regExMessages.push({\n exp: SimpleSchema.RegEx.field,\n msg: \"[label] 只能以字母、_开头,.$.前后必须包含字符\"\n });\n return SimpleSchema.messages({\n regEx: _regExMessages\n });\n });\n}\n","// 因为meteor编译coffeescript会导致eval函数报错,所以单独写在一个js文件中。\nCreator.evalInContext = function(js, context) {\n //# Return the results of the in-line anonymous function we .call with the passed context\n return function() { \n \treturn eval(js); \n\t}.call(context);\n}\n\n\nCreator.eval = function(js){\n\ttry{\n\t\treturn eval(js)\n\t}catch (e){\n\t\tconsole.error(e, js);\n\t}\n};","\tgetOption = (option)->\n\t\tfoo = option.split(\":\")\n\t\tif foo.length > 2\n\t\t\treturn {label: foo[0], value: foo[1], color: foo[2]}\n\t\telse if foo.length > 1\n\t\t\treturn {label: foo[0], value: foo[1]}\n\t\telse\n\t\t\treturn {label: foo[0], value: foo[0]}\n\n\tconvertField = (object_name, field_name, field, spaceId)->\n\t\tif Meteor.isServer && spaceId && field.type == 'select'\n\t\t\tcode = field.picklist || \"#{object_name}.#{field_name}\";\n\t\t\tif code\n\t\t\t\tpicklist = Creator.getPicklist(code, spaceId);\n\t\t\t\tif picklist\n\t\t\t\t\toptions = [];\n\t\t\t\t\tallOptions = [];\n\t\t\t\t\tpicklistOptions = Creator.getPickListOptions(picklist)\n\t\t\t\t\tpicklistOptions = _.sortBy(picklistOptions, 'sort_no')?.reverse();\n\t\t\t\t\t_.each picklistOptions, (item)->\n\t\t\t\t\t\tlabel = item.name\n\t\t\t\t\t\tvalue = item.value || item.name\n\t\t\t\t\t\tallOptions.push({label: label, value: value, enable: item.enable, color: item.color})\n\t\t\t\t\t\tif item.enable\n\t\t\t\t\t\t\toptions.push({label: label, value: value, color: item.color})\n\t\t\t\t\t\tif item.default\n\t\t\t\t\t\t\tfield.defaultValue = value\n\t\t\t\t\tif options.length > 0\n\t\t\t\t\t\tfield.options = options\n\t\t\t\t\tif allOptions.length > 0\n\t\t\t\t\t\tfield.allOptions = allOptions\n\t\treturn field;\n\n\tCreator.convertObject = (object, spaceId)->\n\t\tif !object\n\t\t\treturn\n\t\t_.forEach object.triggers, (trigger, key)->\n\n\t\t\tif (Meteor.isServer && trigger.on == \"server\") || (Meteor.isClient && trigger.on == \"client\")\n\t\t\t\t_todo_from_code = trigger?._todo\n\t\t\t\t_todo_from_db = trigger.todo\n\t\t\t\tif _todo_from_code && _.isString(_todo_from_code)\n\t\t\t\t\ttrigger.todo = Creator.eval(\"(#{_todo_from_code})\")\n\n\t\t\t\tif _todo_from_db && _.isString(_todo_from_db)\n\t\t\t\t\t#只有update时, fieldNames, modifier, options 才有值\n\t\t\t\t\t#TODO 控制可使用的变量,尤其是Collection\n\t\t\t\t\tif _todo_from_db.startsWith(\"function\")\n\t\t\t\t\t\ttrigger.todo = Creator.eval(\"(#{_todo_from_db})\")\n\t\t\t\t\telse\n\t\t\t\t\t\ttrigger.todo = Creator.eval(\"(function(userId, doc, fieldNames, modifier, options){#{_todo_from_db}})\")\n\n\t\t\tif Meteor.isServer && trigger.on == \"client\"\n\t\t\t\t_todo = trigger.todo\n\t\t\t\tif _todo && _.isFunction(_todo)\n\t\t\t\t\ttrigger._todo = _todo.toString()\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.fields, (field, key)->\n\n\t\t\t\tif field.omit\n\t\t\t\t\t# omit字段完全隐藏不显示\n\t\t\t\t\tfield.hidden = true\n\n\t\t\t\tif field.required && field.readonly\n\t\t\t\t\t# 通用必填字段 #2952,必填字段设置为非只读\n\t\t\t\t\tfield.readonly = false\n\n\t\t\t\tsystemBaseFields = Creator.getSystemBaseFields()\n\t\t\t\tif systemBaseFields.indexOf(key) > -1\n\t\t\t\t\t# 强制创建人创建时间等字段为只读\n\t\t\t\t\tfield.readonly = true\n\n\t\t\t_.forEach object.actions, (action, key)->\n\t\t\t\t_todo_from_code = action?._todo\n\t\t\t\t_todo_from_db = action?.todo\n\t\t\t\tif _todo_from_code && _.isString(_todo_from_code)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\ttry\n\t\t\t\t\t\taction.todo = Creator.eval(\"(#{_todo_from_code})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"todo_from_code\", _todo_from_code\n\t\t\t\tif _todo_from_db && _.isString(_todo_from_db)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\ttry\n\t\t\t\t\t\tif _todo_from_db.startsWith(\"function\")\n\t\t\t\t\t\t\taction.todo = Creator.eval(\"(#{_todo_from_db})\")\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isFunction(Creator.actionsByName[_todo_from_db])\n\t\t\t\t\t\t\t\taction.todo = _todo_from_db\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\taction.todo = Creator.eval(\"(function(){#{_todo_from_db}})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"todo_from_db\", _todo_from_db, error\n\n\t\t\t\t_visible = action?._visible\n\t\t\t\tif _visible\n\t\t\t\t\ttry\n\t\t\t\t\t\tif _.isString(_visible)\n\t\t\t\t\t\t\t_visible = _visible.trim()\n\t\t\t\t\t\tif Steedos.isExpression(_visible)\n\t\t\t\t\t\t\t# 支持页面布局中写visible_on函数表达式,页面布局按钮的显示条件不生效 #3340\n\t\t\t\t\t\t\taction.visible = (object_name, record_id, record_permissions, record) ->\n\t\t\t\t\t\t\t\tglobalData = Object.assign({}, Creator.USER_CONTEXT, {now: new Date()})\n\t\t\t\t\t\t\t\treturn Steedos.parseSingleExpression(_visible, record, \"#\", globalData)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\taction.visible = Creator.eval(\"(#{_visible})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"action.visible to function error: \", error, _visible\n\t\telse\n\t\t\t_.forEach object.actions, (action, key)->\n\t\t\t\t_todo = action?.todo\n\t\t\t\tif _todo && _.isFunction(_todo)\n\t\t\t\t\t#TODO 控制可使用的变量\n\t\t\t\t\taction._todo = _todo.toString()\n\n\t\t\t\t_visible = action?.visible\n\n\t\t\t\tif _visible && _.isFunction(_visible)\n\t\t\t\t\taction._visible = _visible.toString()\n\n\t\t_.forEach object.fields, (field, key)->\n\n\t\t\tfield = convertField(object.name, key, field, spaceId);\n\n\t\t\tif field.options && _.isString(field.options)\n\t\t\t\ttry\n\t\t\t\t\t_options = []\n\t\t\t\t\t#支持\\n或者英文逗号分割,\n\t\t\t\t\t_.forEach field.options.split(\"\\n\"), (option)->\n\t\t\t\t\t\tif option.indexOf(\",\")\n\t\t\t\t\t\t\toptions = option.split(\",\")\n\t\t\t\t\t\t\t_.forEach options, (_option)->\n\t\t\t\t\t\t\t\t_options.push(getOption(_option))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_options.push(getOption(option))\n\t\t\t\t\tfield.options = _options\n\t\t\t\tcatch error\n\t\t\t\t\tconsole.error \"Creator.convertFieldsOptions\", field.options, error\n\n\t\t\telse if field.options && _.isArray(field.options)\n\t\t\t\ttry\n\t\t\t\t\t_options = []\n\t\t\t\t\t#支持数组中直接定义每个选项的简版格式字符串\n\t\t\t\t\t_.forEach field.options, (option)->\n\t\t\t\t\t\tif _.isString(option)\n\t\t\t\t\t\t\t_options.push(getOption(option))\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_options.push(option)\n\t\t\t\t\tfield.options = _options\n\t\t\t\tcatch error\n\t\t\t\t\tconsole.error \"Creator.convertFieldsOptions\", field.options, error\n\n\t\t\telse if field.options && !_.isFunction(field.options) && !_.isArray(field.options) && _.isObject(field.options)\n\t\t\t\t_options = []\n\t\t\t\t_.each field.options, (v, k)->\n\t\t\t\t\t_options.push {label: v, value: k}\n\t\t\t\tfield.options = _options\n\n\t\t\tif Meteor.isServer\n\t\t\t\toptions = field.options\n\t\t\t\tif options && _.isFunction(options)\n\t\t\t\t\tfield._options = field.options.toString()\n\t\t\telse\n\t\t\t\toptions = field._options\n\t\t\t\tif options && _.isString(options)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.options = Creator.eval(\"(#{options})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tregEx = field.regEx\n\t\t\t\tif regEx\n\t\t\t\t\tfield._regEx = field.regEx.toString()\n\t\t\telse\n\t\t\t\tregEx = field._regEx\n\t\t\t\tif regEx\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.regEx = Creator.eval(\"(#{regEx})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tmin = field.min\n\t\t\t\tif _.isFunction(min)\n\t\t\t\t\tfield._min = min.toString()\n\t\t\telse\n\t\t\t\tmin = field._min\n\t\t\t\tif _.isString(min)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.min = Creator.eval(\"(#{min})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tmax = field.max\n\t\t\t\tif _.isFunction(max)\n\t\t\t\t\tfield._max = max.toString()\n\t\t\telse\n\t\t\t\tmax = field._max\n\t\t\t\tif _.isString(max)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.max = Creator.eval(\"(#{max})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t\tif Meteor.isServer\n\t\t\t\tif field.autoform\n\t\t\t\t\t_type = field.autoform.type\n\t\t\t\t\tif _type && _.isFunction(_type) && _type != Object && _type != String && _type != Number && _type != Boolean && !_.isArray(_type)\n\t\t\t\t\t\tfield.autoform._type = _type.toString()\n\t\t\telse\n\t\t\t\tif field.autoform\n\t\t\t\t\t_type = field.autoform._type\n\t\t\t\t\tif _type && _.isString(_type)\n\t\t\t\t\t\ttry\n\t\t\t\t\t\t\tfield.autoform.type = Creator.eval(\"(#{_type})\")\n\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\tconsole.error \"convert field -> type error\", field, error\n\n\t\t\tif Meteor.isServer\n\n\t\t\t\toptionsFunction = field.optionsFunction\n\t\t\t\treference_to = field.reference_to\n\t\t\t\tcreateFunction = field.createFunction\n\t\t\t\tbeforeOpenFunction = field.beforeOpenFunction\n\t\t\t\tfiltersFunction = field.filtersFunction\n\n\t\t\t\tif optionsFunction && _.isFunction(optionsFunction)\n\t\t\t\t\tfield._optionsFunction = optionsFunction.toString()\n\n\t\t\t\tif reference_to && _.isFunction(reference_to)\n\t\t\t\t\tfield._reference_to = reference_to.toString()\n\n\t\t\t\tif createFunction && _.isFunction(createFunction)\n\t\t\t\t\tfield._createFunction = createFunction.toString()\n\t\t\t\tif beforeOpenFunction && _.isFunction(beforeOpenFunction)\n\t\t\t\t\tfield._beforeOpenFunction = beforeOpenFunction.toString()\n\n\t\t\t\tif filtersFunction && _.isFunction(filtersFunction)\n\t\t\t\t\tfield._filtersFunction = filtersFunction.toString()\n\t\t\telse\n\n\t\t\t\toptionsFunction = field._optionsFunction || field.optionsFunction\n\t\t\t\treference_to = field._reference_to\n\t\t\t\tcreateFunction = field._createFunction\n\t\t\t\tbeforeOpenFunction = field._beforeOpenFunction\n\t\t\t\tfiltersFunction = field._filtersFunction || field.filtersFunction\n\n\t\t\t\tif optionsFunction && _.isString(optionsFunction)\n\t\t\t\t\tfield.optionsFunction = Creator.eval(\"(#{optionsFunction})\")\n\n\t\t\t\tif reference_to && _.isString(reference_to)\n\t\t\t\t\tfield.reference_to = Creator.eval(\"(#{reference_to})\")\n\n\t\t\t\tif createFunction && _.isString(createFunction)\n\t\t\t\t\tfield.createFunction = Creator.eval(\"(#{createFunction})\")\n\n\t\t\t\tif beforeOpenFunction && _.isString(beforeOpenFunction)\n\t\t\t\t\tfield.beforeOpenFunction = Creator.eval(\"(#{beforeOpenFunction})\")\n\n\t\t\t\tif filtersFunction && _.isString(filtersFunction)\n\t\t\t\t\tfield.filtersFunction = Creator.eval(\"(#{filtersFunction})\")\n\n\t\t\tif Meteor.isServer\n\t\t\t\tdefaultValue = field.defaultValue\n\t\t\t\tif defaultValue && _.isFunction(defaultValue)\n\t\t\t\t\tfield._defaultValue = field.defaultValue.toString()\n\t\t\telse\n\t\t\t\tdefaultValue = field._defaultValue\n\n\t\t\t\tif !defaultValue && _.isString(field.defaultValue) && field.defaultValue.startsWith(\"function\")\n\t\t\t\t\tdefaultValue = field.defaultValue\n\n\t\t\t\tif defaultValue && _.isString(defaultValue)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.defaultValue = Creator.eval(\"(#{defaultValue})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\t\t\t\n\t\t\tif Meteor.isServer\n\t\t\t\tis_company_limited = field.is_company_limited\n\t\t\t\tif is_company_limited && _.isFunction(is_company_limited)\n\t\t\t\t\tfield._is_company_limited = field.is_company_limited.toString()\n\t\t\telse\n\t\t\t\tis_company_limited = field._is_company_limited\n\t\t\t\tif is_company_limited && _.isString(is_company_limited)\n\t\t\t\t\ttry\n\t\t\t\t\t\tfield.is_company_limited = Creator.eval(\"(#{is_company_limited})\")\n\t\t\t\t\tcatch error\n\t\t\t\t\t\tconsole.error \"convert error #{object.name} -> #{field.name}\", error\n\n\t\t_.forEach object.list_views, (list_view, key) ->\n\t\t\t###\n\t\t\t视图过虑器需要支持function,后台转成字符串,前台eval成函数\n\t\t\t让过虑器支持两种function方式:\n\t\t\t1. 整个filters为function:\n\t\t\t如:\n\t\t\tfilters: ()->\n\t\t\t\treturn [[[\"object_name\",\"=\",\"project_issues\"],'or',[\"object_name\",\"=\",\"tasks\"]]]\n\t\t\t2. filters内的filter.value为function\n\t\t\t如:\n\t\t\tfilters: [[\"object_name\", \"=\", ()->\n\t\t\t\treturn \"project_issues\"\n\t\t\t]]\n\t\t\t或\n\t\t\tfilters: [{\n\t\t\t\t\"field\": \"object_name\"\n\t\t\t\t\"operation\": \"=\"\n\t\t\t\t\"value\": ()->\n\t\t\t\t\treturn \"project_issues\"\n\t\t\t}]\n\t\t\t###\n\t\t\tif _.isFunction(list_view.filters)\n\t\t\t\tif Meteor.isServer\n\t\t\t\t\tlist_view._filters = list_view.filters.toString()\n\t\t\telse if _.isString(list_view._filters)\n\t\t\t\tif Meteor.isClient\n\t\t\t\t\tlist_view.filters = Creator.eval(\"(#{list_view._filters})\")\n\t\t\telse\n\t\t\t\t_.forEach list_view.filters, (filter, _index)->\n\t\t\t\t\tif _.isArray(filter)\n\t\t\t\t\t\tif Meteor.isServer\n\t\t\t\t\t\t\tif filter.length == 3 and _.isFunction(filter[2])\n\t\t\t\t\t\t\t\tfilter[2] = filter[2].toString()\n\t\t\t\t\t\t\t\tfilter[3] = \"FUNCTION\"\n\t\t\t\t\t\t\telse if filter.length == 3 and _.isDate(filter[2])\n\t\t\t\t\t\t\t\t# 如果是Date类型,则filter[2]值到前端会自动转成字符串,格式:\"2018-03-29T03:43:21.787Z\"\n\t\t\t\t\t\t\t\t# 包括grid列表请求的接口在内的所有OData接口,Date类型字段都会以上述格式返回\n\t\t\t\t\t\t\t\tfilter[3] = \"DATE\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif filter.length == 4 and _.isString(filter[2]) and filter[3] == \"FUNCTION\"\n\t\t\t\t\t\t\t\tfilter[2] = Creator.eval(\"(#{filter[2]})\")\n\t\t\t\t\t\t\t\tfilter.pop()\n\t\t\t\t\t\t\tif filter.length == 4 and _.isString(filter[2]) and filter[3] == \"DATE\"\n\t\t\t\t\t\t\t\tfilter[2] = new Date(filter[2])\n\t\t\t\t\t\t\t\tfilter.pop()\n\t\t\t\t\telse if _.isObject(filter)\n\t\t\t\t\t\tif Meteor.isServer\n\t\t\t\t\t\t\tif _.isFunction(filter?.value)\n\t\t\t\t\t\t\t\tfilter._value = filter.value.toString()\n\t\t\t\t\t\t\telse if _.isDate(filter?.value)\n\t\t\t\t\t\t\t\tfilter._is_date = true\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isString(filter?._value)\n\t\t\t\t\t\t\t\tfilter.value = Creator.eval(\"(#{filter._value})\")\n\t\t\t\t\t\t\telse if filter._is_date == true\n\t\t\t\t\t\t\t\tfilter.value = new Date(filter.value)\n\n\t\tif Meteor.isServer\n\t\t\tif object.form && !_.isString(object.form)\n\t\t\t\tobject.form = JSON.stringify object.form, (key, val)->\n\t\t\t\t\tif _.isFunction(val)\n\t\t\t\t\t\treturn val + '';\n\t\t\t\t\telse\n\t\t\t\t\t\treturn val;\n\t\telse if Meteor.isClient\n\t\t\tif object.form\n\t\t\t\tobject.form = JSON.parse object.form, (key, val)->\n\t\t\t\t\tif _.isString(val) && val.startsWith('function')\n\t\t\t\t\t\treturn Creator.eval(\"(#{val})\")\n\t\t\t\t\telse\n\t\t\t\t\t\treturn val;\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.related_lists, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isString(val)\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\trelatedObjInfo[key] = Creator.eval(\"(#{val})\")\n\t\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\t\tconsole.error \"filters_code\", val\n\t\telse\n\t\t\t_.forEach object.related_lists, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isFunction(val)\n\t\t\t\t\t\t\trelatedObjInfo[key] = val.toString()\n\n\t\tif Meteor.isClient\n\t\t\t_.forEach object.relatedList, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isString(val)\n\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\trelatedObjInfo[key] = Creator.eval(\"(#{val})\")\n\t\t\t\t\t\t\tcatch error\n\t\t\t\t\t\t\t\tconsole.error \"filters_code\", val\n\t\telse\n\t\t\t_.forEach object.relatedList, (relatedObjInfo)->\n\t\t\t\tif _.isObject(relatedObjInfo)\n\t\t\t\t\t_.forEach relatedObjInfo, (val, key)->\n\t\t\t\t\t\tif key == 'filters' && _.isFunction(val)\n\t\t\t\t\t\t\trelatedObjInfo[key] = val.toString()\n\n\t\treturn object\n\n\n","var convertField, getOption;\n\ngetOption = function(option) {\n var foo;\n foo = option.split(\":\");\n if (foo.length > 2) {\n return {\n label: foo[0],\n value: foo[1],\n color: foo[2]\n };\n } else if (foo.length > 1) {\n return {\n label: foo[0],\n value: foo[1]\n };\n } else {\n return {\n label: foo[0],\n value: foo[0]\n };\n }\n};\n\nconvertField = function(object_name, field_name, field, spaceId) {\n var allOptions, code, options, picklist, picklistOptions, ref;\n if (Meteor.isServer && spaceId && field.type === 'select') {\n code = field.picklist || (object_name + \".\" + field_name);\n if (code) {\n picklist = Creator.getPicklist(code, spaceId);\n if (picklist) {\n options = [];\n allOptions = [];\n picklistOptions = Creator.getPickListOptions(picklist);\n picklistOptions = (ref = _.sortBy(picklistOptions, 'sort_no')) != null ? ref.reverse() : void 0;\n _.each(picklistOptions, function(item) {\n var label, value;\n label = item.name;\n value = item.value || item.name;\n allOptions.push({\n label: label,\n value: value,\n enable: item.enable,\n color: item.color\n });\n if (item.enable) {\n options.push({\n label: label,\n value: value,\n color: item.color\n });\n }\n if (item[\"default\"]) {\n return field.defaultValue = value;\n }\n });\n if (options.length > 0) {\n field.options = options;\n }\n if (allOptions.length > 0) {\n field.allOptions = allOptions;\n }\n }\n }\n }\n return field;\n};\n\nCreator.convertObject = function(object, spaceId) {\n if (!object) {\n return;\n }\n _.forEach(object.triggers, function(trigger, key) {\n var _todo, _todo_from_code, _todo_from_db;\n if ((Meteor.isServer && trigger.on === \"server\") || (Meteor.isClient && trigger.on === \"client\")) {\n _todo_from_code = trigger != null ? trigger._todo : void 0;\n _todo_from_db = trigger.todo;\n if (_todo_from_code && _.isString(_todo_from_code)) {\n trigger.todo = Creator[\"eval\"](\"(\" + _todo_from_code + \")\");\n }\n if (_todo_from_db && _.isString(_todo_from_db)) {\n if (_todo_from_db.startsWith(\"function\")) {\n trigger.todo = Creator[\"eval\"](\"(\" + _todo_from_db + \")\");\n } else {\n trigger.todo = Creator[\"eval\"](\"(function(userId, doc, fieldNames, modifier, options){\" + _todo_from_db + \"})\");\n }\n }\n }\n if (Meteor.isServer && trigger.on === \"client\") {\n _todo = trigger.todo;\n if (_todo && _.isFunction(_todo)) {\n return trigger._todo = _todo.toString();\n }\n }\n });\n if (Meteor.isClient) {\n _.forEach(object.fields, function(field, key) {\n var systemBaseFields;\n if (field.omit) {\n field.hidden = true;\n }\n if (field.required && field.readonly) {\n field.readonly = false;\n }\n systemBaseFields = Creator.getSystemBaseFields();\n if (systemBaseFields.indexOf(key) > -1) {\n return field.readonly = true;\n }\n });\n _.forEach(object.actions, function(action, key) {\n var _todo_from_code, _todo_from_db, _visible, error;\n _todo_from_code = action != null ? action._todo : void 0;\n _todo_from_db = action != null ? action.todo : void 0;\n if (_todo_from_code && _.isString(_todo_from_code)) {\n try {\n action.todo = Creator[\"eval\"](\"(\" + _todo_from_code + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"todo_from_code\", _todo_from_code);\n }\n }\n if (_todo_from_db && _.isString(_todo_from_db)) {\n try {\n if (_todo_from_db.startsWith(\"function\")) {\n action.todo = Creator[\"eval\"](\"(\" + _todo_from_db + \")\");\n } else {\n if (_.isFunction(Creator.actionsByName[_todo_from_db])) {\n action.todo = _todo_from_db;\n } else {\n action.todo = Creator[\"eval\"](\"(function(){\" + _todo_from_db + \"})\");\n }\n }\n } catch (error1) {\n error = error1;\n console.error(\"todo_from_db\", _todo_from_db, error);\n }\n }\n _visible = action != null ? action._visible : void 0;\n if (_visible) {\n try {\n if (_.isString(_visible)) {\n _visible = _visible.trim();\n }\n if (Steedos.isExpression(_visible)) {\n return action.visible = function(object_name, record_id, record_permissions, record) {\n var globalData;\n globalData = Object.assign({}, Creator.USER_CONTEXT, {\n now: new Date()\n });\n return Steedos.parseSingleExpression(_visible, record, \"#\", globalData);\n };\n } else {\n return action.visible = Creator[\"eval\"](\"(\" + _visible + \")\");\n }\n } catch (error1) {\n error = error1;\n return console.error(\"action.visible to function error: \", error, _visible);\n }\n }\n });\n } else {\n _.forEach(object.actions, function(action, key) {\n var _todo, _visible;\n _todo = action != null ? action.todo : void 0;\n if (_todo && _.isFunction(_todo)) {\n action._todo = _todo.toString();\n }\n _visible = action != null ? action.visible : void 0;\n if (_visible && _.isFunction(_visible)) {\n return action._visible = _visible.toString();\n }\n });\n }\n _.forEach(object.fields, function(field, key) {\n var _options, _type, beforeOpenFunction, createFunction, defaultValue, error, filtersFunction, is_company_limited, max, min, options, optionsFunction, reference_to, regEx;\n field = convertField(object.name, key, field, spaceId);\n if (field.options && _.isString(field.options)) {\n try {\n _options = [];\n _.forEach(field.options.split(\"\\n\"), function(option) {\n var options;\n if (option.indexOf(\",\")) {\n options = option.split(\",\");\n return _.forEach(options, function(_option) {\n return _options.push(getOption(_option));\n });\n } else {\n return _options.push(getOption(option));\n }\n });\n field.options = _options;\n } catch (error1) {\n error = error1;\n console.error(\"Creator.convertFieldsOptions\", field.options, error);\n }\n } else if (field.options && _.isArray(field.options)) {\n try {\n _options = [];\n _.forEach(field.options, function(option) {\n if (_.isString(option)) {\n return _options.push(getOption(option));\n } else {\n return _options.push(option);\n }\n });\n field.options = _options;\n } catch (error1) {\n error = error1;\n console.error(\"Creator.convertFieldsOptions\", field.options, error);\n }\n } else if (field.options && !_.isFunction(field.options) && !_.isArray(field.options) && _.isObject(field.options)) {\n _options = [];\n _.each(field.options, function(v, k) {\n return _options.push({\n label: v,\n value: k\n });\n });\n field.options = _options;\n }\n if (Meteor.isServer) {\n options = field.options;\n if (options && _.isFunction(options)) {\n field._options = field.options.toString();\n }\n } else {\n options = field._options;\n if (options && _.isString(options)) {\n try {\n field.options = Creator[\"eval\"](\"(\" + options + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n regEx = field.regEx;\n if (regEx) {\n field._regEx = field.regEx.toString();\n }\n } else {\n regEx = field._regEx;\n if (regEx) {\n try {\n field.regEx = Creator[\"eval\"](\"(\" + regEx + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n min = field.min;\n if (_.isFunction(min)) {\n field._min = min.toString();\n }\n } else {\n min = field._min;\n if (_.isString(min)) {\n try {\n field.min = Creator[\"eval\"](\"(\" + min + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n max = field.max;\n if (_.isFunction(max)) {\n field._max = max.toString();\n }\n } else {\n max = field._max;\n if (_.isString(max)) {\n try {\n field.max = Creator[\"eval\"](\"(\" + max + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n if (field.autoform) {\n _type = field.autoform.type;\n if (_type && _.isFunction(_type) && _type !== Object && _type !== String && _type !== Number && _type !== Boolean && !_.isArray(_type)) {\n field.autoform._type = _type.toString();\n }\n }\n } else {\n if (field.autoform) {\n _type = field.autoform._type;\n if (_type && _.isString(_type)) {\n try {\n field.autoform.type = Creator[\"eval\"](\"(\" + _type + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert field -> type error\", field, error);\n }\n }\n }\n }\n if (Meteor.isServer) {\n optionsFunction = field.optionsFunction;\n reference_to = field.reference_to;\n createFunction = field.createFunction;\n beforeOpenFunction = field.beforeOpenFunction;\n filtersFunction = field.filtersFunction;\n if (optionsFunction && _.isFunction(optionsFunction)) {\n field._optionsFunction = optionsFunction.toString();\n }\n if (reference_to && _.isFunction(reference_to)) {\n field._reference_to = reference_to.toString();\n }\n if (createFunction && _.isFunction(createFunction)) {\n field._createFunction = createFunction.toString();\n }\n if (beforeOpenFunction && _.isFunction(beforeOpenFunction)) {\n field._beforeOpenFunction = beforeOpenFunction.toString();\n }\n if (filtersFunction && _.isFunction(filtersFunction)) {\n field._filtersFunction = filtersFunction.toString();\n }\n } else {\n optionsFunction = field._optionsFunction || field.optionsFunction;\n reference_to = field._reference_to;\n createFunction = field._createFunction;\n beforeOpenFunction = field._beforeOpenFunction;\n filtersFunction = field._filtersFunction || field.filtersFunction;\n if (optionsFunction && _.isString(optionsFunction)) {\n field.optionsFunction = Creator[\"eval\"](\"(\" + optionsFunction + \")\");\n }\n if (reference_to && _.isString(reference_to)) {\n field.reference_to = Creator[\"eval\"](\"(\" + reference_to + \")\");\n }\n if (createFunction && _.isString(createFunction)) {\n field.createFunction = Creator[\"eval\"](\"(\" + createFunction + \")\");\n }\n if (beforeOpenFunction && _.isString(beforeOpenFunction)) {\n field.beforeOpenFunction = Creator[\"eval\"](\"(\" + beforeOpenFunction + \")\");\n }\n if (filtersFunction && _.isString(filtersFunction)) {\n field.filtersFunction = Creator[\"eval\"](\"(\" + filtersFunction + \")\");\n }\n }\n if (Meteor.isServer) {\n defaultValue = field.defaultValue;\n if (defaultValue && _.isFunction(defaultValue)) {\n field._defaultValue = field.defaultValue.toString();\n }\n } else {\n defaultValue = field._defaultValue;\n if (!defaultValue && _.isString(field.defaultValue) && field.defaultValue.startsWith(\"function\")) {\n defaultValue = field.defaultValue;\n }\n if (defaultValue && _.isString(defaultValue)) {\n try {\n field.defaultValue = Creator[\"eval\"](\"(\" + defaultValue + \")\");\n } catch (error1) {\n error = error1;\n console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n if (Meteor.isServer) {\n is_company_limited = field.is_company_limited;\n if (is_company_limited && _.isFunction(is_company_limited)) {\n return field._is_company_limited = field.is_company_limited.toString();\n }\n } else {\n is_company_limited = field._is_company_limited;\n if (is_company_limited && _.isString(is_company_limited)) {\n try {\n return field.is_company_limited = Creator[\"eval\"](\"(\" + is_company_limited + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"convert error \" + object.name + \" -> \" + field.name, error);\n }\n }\n }\n });\n _.forEach(object.list_views, function(list_view, key) {\n\n /*\n \t\t\t视图过虑器需要支持function,后台转成字符串,前台eval成函数\n \t\t\t让过虑器支持两种function方式:\n \t\t\t1. 整个filters为function:\n \t\t\t如:\n \t\t\tfilters: ()->\n \t\t\t\treturn [[[\"object_name\",\"=\",\"project_issues\"],'or',[\"object_name\",\"=\",\"tasks\"]]]\n \t\t\t2. filters内的filter.value为function\n \t\t\t如:\n \t\t\tfilters: [[\"object_name\", \"=\", ()->\n \t\t\t\treturn \"project_issues\"\n \t\t\t]]\n \t\t\t或\n \t\t\tfilters: [{\n \t\t\t\t\"field\": \"object_name\"\n \t\t\t\t\"operation\": \"=\"\n \t\t\t\t\"value\": ()->\n \t\t\t\t\treturn \"project_issues\"\n \t\t\t}]\n */\n if (_.isFunction(list_view.filters)) {\n if (Meteor.isServer) {\n return list_view._filters = list_view.filters.toString();\n }\n } else if (_.isString(list_view._filters)) {\n if (Meteor.isClient) {\n return list_view.filters = Creator[\"eval\"](\"(\" + list_view._filters + \")\");\n }\n } else {\n return _.forEach(list_view.filters, function(filter, _index) {\n if (_.isArray(filter)) {\n if (Meteor.isServer) {\n if (filter.length === 3 && _.isFunction(filter[2])) {\n filter[2] = filter[2].toString();\n return filter[3] = \"FUNCTION\";\n } else if (filter.length === 3 && _.isDate(filter[2])) {\n return filter[3] = \"DATE\";\n }\n } else {\n if (filter.length === 4 && _.isString(filter[2]) && filter[3] === \"FUNCTION\") {\n filter[2] = Creator[\"eval\"](\"(\" + filter[2] + \")\");\n filter.pop();\n }\n if (filter.length === 4 && _.isString(filter[2]) && filter[3] === \"DATE\") {\n filter[2] = new Date(filter[2]);\n return filter.pop();\n }\n }\n } else if (_.isObject(filter)) {\n if (Meteor.isServer) {\n if (_.isFunction(filter != null ? filter.value : void 0)) {\n return filter._value = filter.value.toString();\n } else if (_.isDate(filter != null ? filter.value : void 0)) {\n return filter._is_date = true;\n }\n } else {\n if (_.isString(filter != null ? filter._value : void 0)) {\n return filter.value = Creator[\"eval\"](\"(\" + filter._value + \")\");\n } else if (filter._is_date === true) {\n return filter.value = new Date(filter.value);\n }\n }\n }\n });\n }\n });\n if (Meteor.isServer) {\n if (object.form && !_.isString(object.form)) {\n object.form = JSON.stringify(object.form, function(key, val) {\n if (_.isFunction(val)) {\n return val + '';\n } else {\n return val;\n }\n });\n }\n } else if (Meteor.isClient) {\n if (object.form) {\n object.form = JSON.parse(object.form, function(key, val) {\n if (_.isString(val) && val.startsWith('function')) {\n return Creator[\"eval\"](\"(\" + val + \")\");\n } else {\n return val;\n }\n });\n }\n }\n if (Meteor.isClient) {\n _.forEach(object.related_lists, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n var error;\n if (key === 'filters' && _.isString(val)) {\n try {\n return relatedObjInfo[key] = Creator[\"eval\"](\"(\" + val + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"filters_code\", val);\n }\n }\n });\n }\n });\n } else {\n _.forEach(object.related_lists, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n if (key === 'filters' && _.isFunction(val)) {\n return relatedObjInfo[key] = val.toString();\n }\n });\n }\n });\n }\n if (Meteor.isClient) {\n _.forEach(object.relatedList, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n var error;\n if (key === 'filters' && _.isString(val)) {\n try {\n return relatedObjInfo[key] = Creator[\"eval\"](\"(\" + val + \")\");\n } catch (error1) {\n error = error1;\n return console.error(\"filters_code\", val);\n }\n }\n });\n }\n });\n } else {\n _.forEach(object.relatedList, function(relatedObjInfo) {\n if (_.isObject(relatedObjInfo)) {\n return _.forEach(relatedObjInfo, function(val, key) {\n if (key === 'filters' && _.isFunction(val)) {\n return relatedObjInfo[key] = val.toString();\n }\n });\n }\n });\n }\n return object;\n};\n","Creator.Formular = {}\n\nCreator.Formular.PREFIX = \"_VALUES\"\n\nCreator.Formular._prependPrefixForFormula = (prefix,fieldVariable)->\n\treg = /(\\{[^{}]*\\})/g;\n\n\trev = fieldVariable.replace reg, (m, $1)->\n\t\treturn prefix + $1.replace(/\\{\\s*/,\"[\\\"\").replace(/\\s*\\}/,\"\\\"]\").replace(/\\s*\\.\\s*/g,\"\\\"][\\\"\");\n\n\treturn rev\n\nCreator.Formular.checkFormula = (formula_str)->\n\tif _.isString(formula_str) && formula_str.indexOf(\"{\") > -1 && formula_str.indexOf(\"}\") > -1\n\t\treturn true\n\treturn false\n\nCreator.Formular.run = (formula_str, _CONTEXT, options)->\n\tif formula_str && _.isString(formula_str)\n\n\t\tif !_.isBoolean(options?.extend)\n\t\t\textend = true\n\n\t\t_VALUES = {}\n\t\t_VALUES = _.extend(_VALUES, _CONTEXT)\n\t\tif extend\n\t\t\t_VALUES = _.extend(_VALUES, Creator.getUserContext(options?.userId, options?.spaceId))\n\t\tformula_str = Creator.Formular._prependPrefixForFormula(\"this\", formula_str)\n\n\t\ttry\n\t\t\tdata = Creator.evalInContext(formula_str, _VALUES) # 此处不能用window.eval ,会导致变量作用域异常\n\t\t\treturn data\n\t\tcatch e\n\t\t\tconsole.error(\"Creator.Formular.run: #{formula_str}\", e)\n\t\t\tif Meteor.isClient\n\t\t\t\ttoastr?.error(\"公式执行出错了,请检查公式配置是否正确!\")\n\t\t\tthrow new Meteor.Error 500, \"Creator.Formular.run: #{formula_str}#{e}\"\n\n\treturn formula_str\n","Creator.Formular = {};\n\nCreator.Formular.PREFIX = \"_VALUES\";\n\nCreator.Formular._prependPrefixForFormula = function(prefix, fieldVariable) {\n var reg, rev;\n reg = /(\\{[^{}]*\\})/g;\n rev = fieldVariable.replace(reg, function(m, $1) {\n return prefix + $1.replace(/\\{\\s*/, \"[\\\"\").replace(/\\s*\\}/, \"\\\"]\").replace(/\\s*\\.\\s*/g, \"\\\"][\\\"\");\n });\n return rev;\n};\n\nCreator.Formular.checkFormula = function(formula_str) {\n if (_.isString(formula_str) && formula_str.indexOf(\"{\") > -1 && formula_str.indexOf(\"}\") > -1) {\n return true;\n }\n return false;\n};\n\nCreator.Formular.run = function(formula_str, _CONTEXT, options) {\n var _VALUES, data, e, extend;\n if (formula_str && _.isString(formula_str)) {\n if (!_.isBoolean(options != null ? options.extend : void 0)) {\n extend = true;\n }\n _VALUES = {};\n _VALUES = _.extend(_VALUES, _CONTEXT);\n if (extend) {\n _VALUES = _.extend(_VALUES, Creator.getUserContext(options != null ? options.userId : void 0, options != null ? options.spaceId : void 0));\n }\n formula_str = Creator.Formular._prependPrefixForFormula(\"this\", formula_str);\n try {\n data = Creator.evalInContext(formula_str, _VALUES);\n return data;\n } catch (error) {\n e = error;\n console.error(\"Creator.Formular.run: \" + formula_str, e);\n if (Meteor.isClient) {\n if (typeof toastr !== \"undefined\" && toastr !== null) {\n toastr.error(\"公式执行出错了,请检查公式配置是否正确!\");\n }\n }\n throw new Meteor.Error(500, \"Creator.Formular.run: \" + formula_str + e);\n }\n }\n return formula_str;\n};\n","clone = require('clone');\nCreator.objectsByName = {} # 此对象只能在确保所有Object初始化完成后调用, 否则获取到的object不全\n\nCreator.formatObjectName = (object_name)->\n\tif object_name.startsWith('cfs.files.')\n\t\tobject_name = object_name.replace(new RegExp('\\\\.', 'g'), '_')\n\treturn object_name\n\nCreator.Object = (options)->\n\t_baseObject = Creator.baseObject\n\tif Meteor.isClient\n\t\t_baseObject = {actions: Creator.baseObject.actions , fields: {}, triggers: {}, permission_set: {}}\n\tself = this\n\tif (!options.name)\n\t\tconsole.error(options)\n\t\tthrow new Error('Creator.Object options must specify name');\n\n\tself._id = options._id || options.name\n\tself.space = options.space\n\tself.name = options.name\n\tself.label = options.label\n\tself.icon = options.icon\n\tself.description = options.description\n\tself.is_view = options.is_view\n\tself.form = options.form\n\tself.relatedList = options.relatedList\n\tself.related_lists = options.related_lists\n\tself.hasImportTemplates = options.hasImportTemplates\n\tself.version = options.version || 1.0\n\tif !_.isBoolean(options.is_enable) || options.is_enable == true\n\t\tself.is_enable = true\n\telse\n\t\tself.is_enable = false\n\tif Meteor.isClient\n\t\tif _.has(options, 'allow_customActions')\n\t\t\tself.allow_customActions = options.allow_customActions\n\t\tif _.has(options, 'exclude_actions')\n\t\t\tself.exclude_actions = options.exclude_actions\n\t\tif _.has(options, 'allow_relatedList')\n\t\t\tself.allow_relatedList = options.allow_relatedList\n\tself.enable_search = options.enable_search\n\tself.enable_files = options.enable_files\n\tself.enable_tasks = options.enable_tasks\n\tself.enable_notes = options.enable_notes\n\tself.enable_audit = options.enable_audit\n\tself.enable_events = options.enable_events\n\tif options.paging\n\t\tself.paging = options.paging\n\tself.hidden = options.hidden\n\tself.enable_api = (options.enable_api == undefined) or options.enable_api\n\tself.custom = options.custom\n\tself.enable_share = options.enable_share\n\tself.enable_instances = options.enable_instances\n\tself.enable_process = options.enable_process\n\tif Meteor.isClient\n\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\"))\n\t\t\tself.enable_tree = false\n\t\telse\n\t\t\tself.enable_tree = options.enable_tree\n\t\t\tself.sidebar = _.clone(options.sidebar)\n\telse\n\t\tself.sidebar = _.clone(options.sidebar)\n\t\tself.enable_tree = options.enable_tree\n\tself.open_window = options.open_window\n\tself.filter_company = options.filter_company\n\tself.calendar = _.clone(options.calendar)\n\tself.enable_chatter = options.enable_chatter\n\tself.enable_trash = options.enable_trash\n\tself.enable_space_global = options.enable_space_global\n\tself.enable_approvals = options.enable_approvals\n\tself.enable_follow = options.enable_follow\n\tself.enable_workflow = options.enable_workflow\n\tself.enable_inline_edit = options.enable_inline_edit\n\tself.details = options.details\n\tself.masters = options.masters\n\tself.lookup_details = options.lookup_details\n\tif _.has(options, 'in_development')\n\t\tself.in_development = options.in_development\n\tself.idFieldName = '_id'\n\tif options.database_name\n\t\tself.database_name = options.database_name\n\tif (!options.fields)\n\t\tconsole.error(options)\n\t\tthrow new Error('Creator.Object options must specify fields');\n\n\tself.fields = clone(options.fields)\n\n\t_.each self.fields, (field, field_name)->\n\t\tif field.is_name\n\t\t\tself.NAME_FIELD_KEY = field_name\n\t\telse if field_name == 'name' && !self.NAME_FIELD_KEY\n\t\t\tself.NAME_FIELD_KEY = field_name\n\t\tif field.primary\n\t\t\tself.idFieldName = field_name\n\t\tif Meteor.isClient\n\t\t\tif Creator.isCloudAdminSpace(Session.get(\"spaceId\"))\n\t\t\t\tif field_name == 'space'\n\t\t\t\t\tfield.filterable = true\n\t\t\t\t\tfield.hidden = false\n\n\tif !options.database_name || options.database_name == 'meteor-mongo'\n\t\t_.each _baseObject.fields, (field, field_name)->\n\t\t\tif !self.fields[field_name]\n\t\t\t\tself.fields[field_name] = {}\n\t\t\tself.fields[field_name] = _.extend(_.clone(field), self.fields[field_name])\n\n\t_.each self.fields, (field, field_name)->\n\t\tif field.type == 'autonumber'\n\t\t\tfield.readonly = true\n\t\telse if field.type == 'formula'\n\t\t\tfield.readonly = true\n\t\telse if field.type == 'summary'\n\t\t\tfield.readonly = true\n\n\tself.list_views = {}\n\tdefaultView = Creator.getObjectDefaultView(self.name)\n\t_.each options.list_views, (item, item_name)->\n\t\toitem = Creator.convertListView(defaultView, item, item_name)\n\t\tself.list_views[item_name] = oitem\n\n\tself.triggers = _.clone(_baseObject.triggers)\n\t_.each options.triggers, (item, item_name)->\n\t\tif !self.triggers[item_name]\n\t\t\tself.triggers[item_name] = {}\n\t\tself.triggers[item_name].name = item_name\n\t\tself.triggers[item_name] = _.extend(_.clone(self.triggers[item_name]), item)\n\n\tself.actions = _.clone(_baseObject.actions)\n\t_.each options.actions, (item, item_name)->\n\t\tif !self.actions[item_name]\n\t\t\tself.actions[item_name] = {}\n\t\tcopyItem = _.clone(self.actions[item_name])\n\t\tdelete self.actions[item_name] #先删除相关属性再重建才能保证后续重复定义的属性顺序生效\n\t\tself.actions[item_name] = _.extend(copyItem, item)\n\t\tself.actions[item_name].object_name = self.name\n\n\t_.each self.actions, (item, item_name)->\n\t\titem.name = item_name\n\n\tself.related_objects = Creator.getObjectRelateds(self.name)\n\n\t# 让所有object默认有所有list_views/actions/related_objects/readable_fields/editable_fields完整权限,该权限可能被数据库中设置的admin/user权限覆盖\n\tself.permission_set = _.clone(_baseObject.permission_set)\n\t# defaultListViews = _.keys(self.list_views)\n\t# defaultActions = _.keys(self.actions)\n\t# defaultRelatedObjects = _.pluck(self.related_objects,\"object_name\")\n\t# defaultReadableFields = []\n\t# defaultEditableFields = []\n\t# _.each self.fields, (field, field_name)->\n\t# \tif !(field.hidden) #231 omit字段支持在非编辑页面查看, 因此删除了此处对omit的判断\n\t# \t\tdefaultReadableFields.push field_name\n\t# \t\tif !field.readonly\n\t# \t\t\tdefaultEditableFields.push field_name\n\n\t# _.each self.permission_set, (item, item_name)->\n\t# \tif item_name == \"none\"\n\t# \t\treturn\n\t# \tif self.list_views\n\t# \t\tself.permission_set[item_name].list_views = defaultListViews\n\t# \tif self.actions\n\t# \t\tself.permission_set[item_name].actions = defaultActions\n\t# \tif self.related_objects\n\t# \t\tself.permission_set[item_name].related_objects = defaultRelatedObjects\n\t# \tif self.fields\n\t# \t\tself.permission_set[item_name].readable_fields = defaultReadableFields\n\t# \t\tself.permission_set[item_name].editable_fields = defaultEditableFields\n\tunless options.permission_set\n\t\toptions.permission_set = {}\n\tif !(options.permission_set?.admin)\n\t\toptions.permission_set.admin = _.clone(self.permission_set[\"admin\"])\n\tif !(options.permission_set?.user)\n\t\toptions.permission_set.user = _.clone(self.permission_set[\"user\"])\n\t_.each options.permission_set, (item, item_name)->\n\t\tif !self.permission_set[item_name]\n\t\t\tself.permission_set[item_name] = {}\n\t\tself.permission_set[item_name] = _.extend(_.clone(self.permission_set[item_name]), item)\n\n\t# 前端根据permissions改写field相关属性,后端只要走默认属性就行,不需要改写\n\tif Meteor.isClient\n\t\tpermissions = options.permissions\n\t\tdisabled_list_views = permissions?.disabled_list_views\n\t\tif disabled_list_views?.length\n\t\t\tdefaultListViewId = options.list_views?.all?._id\n\t\t\tif defaultListViewId\n\t\t\t\t# 把视图权限配置中默认的all视图id转换成all关键字\n\t\t\t\tpermissions.disabled_list_views = _.map disabled_list_views, (list_view_item) ->\n\t\t\t\t\treturn if defaultListViewId == list_view_item then \"all\" else list_view_item\n\t\tself.permissions = new ReactiveVar(permissions)\n#\t\t_.each self.fields, (field, field_name)->\n#\t\t\tif field\n#\t\t\t\tif _.indexOf(permissions?.unreadable_fields, field_name) < 0\n#\t\t\t\t\tif field.hidden\n#\t\t\t\t\t\treturn\n#\t\t\t\t\tif _.indexOf(permissions?.uneditable_fields, field_name) > -1\n#\t\t\t\t\t\tfield.readonly = true\n#\t\t\t\t\t\tfield.disabled = true\n#\t\t\t\t\t\t# 当只读时,如果不去掉必填字段,autoform是会报错的\n#\t\t\t\t\t\tfield.required = false\n#\t\t\t\telse\n#\t\t\t\t\tfield.hidden = true\n\telse\n\t\tself.permissions = null\n\n\t_db = Creator.createCollection(options)\n\n\tCreator.Collections[_db._name] = _db\n\n\tself.db = _db\n\n\tself._collection_name = _db._name\n\n\tschema = Creator.getObjectSchema(self)\n\tself.schema = new SimpleSchema(schema)\n\tif self.name != \"users\" and self.name != \"cfs.files.filerecord\" && !self.is_view && !_.contains([\"flows\", \"forms\", \"instances\", \"organizations\", \"action_field_updates\", \"object_listviews\"], self.name)\n\t\tif Meteor.isClient\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\t\telse\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\tif self.name == \"users\"\n\t\t_db._simpleSchema = self.schema\n\n\tif _.contains([\"flows\", \"forms\", \"instances\", \"organizations\"], self.name)\n\t\tif Meteor.isClient\n\t\t\t_db.attachSchema(self.schema, {replace: true})\n\n\tCreator.objectsByName[self._collection_name] = self\n\n\treturn self\n\n# Creator.Object.prototype.i18n = ()->\n# \t# set object label\n# \tself = this\n\n# \tkey = self.name\n# \tif t(key) == key\n# \t\tif !self.label\n# \t\t\tself.label = self.name\n# \telse\n# \t\tself.label = t(key)\n\n# \t# set field labels\n# \t_.each self.fields, (field, field_name)->\n# \t\tfkey = self.name + \"_\" + field_name\n# \t\tif t(fkey) == fkey\n# \t\t\tif !field.label\n# \t\t\t\tfield.label = field_name\n# \t\telse\n# \t\t\tfield.label = t(fkey)\n# \t\tself.schema?._schema?[field_name]?.label = field.label\n\n\n# \t# set listview labels\n# \t_.each self.list_views, (item, item_name)->\n# \t\ti18n_key = self.name + \"_listview_\" + item_name\n# \t\tif t(i18n_key) == i18n_key\n# \t\t\tif !item.label\n# \t\t\t\titem.label = item_name\n# \t\telse\n# \t\t\titem.label = t(i18n_key)\n\n\nCreator.getObjectODataRouterPrefix = (object)->\n\treturn \"/api/odata/v4\"\n\t# if object\n\t# \tif !object.database_name || object.database_name == 'meteor-mongo'\n\t# \t\treturn \"/api/odata/v4\"\n\t# \telse\n\t# \t\treturn \"/api/odata/#{object.database_name}\"\n\n# if Meteor.isClient\n\n# \tMeteor.startup ->\n# \t\tTracker.autorun ->\n# \t\t\tif Session.get(\"steedos-locale\") && Creator.bootstrapLoaded?.get()\n# \t\t\t\t_.each Creator.objectsByName, (object, object_name)->\n# \t\t\t\t\tobject.i18n()\n\nMeteor.startup ->\n\tif !Creator.bootstrapLoaded && Creator.Objects\n\t\t_.each Creator.Objects, (object)->\n\t\t\tnew Creator.Object(object)\n\n","var clone;\n\nclone = require('clone');\n\nCreator.objectsByName = {};\n\nCreator.formatObjectName = function(object_name) {\n if (object_name.startsWith('cfs.files.')) {\n object_name = object_name.replace(new RegExp('\\\\.', 'g'), '_');\n }\n return object_name;\n};\n\nCreator.Object = function(options) {\n var _baseObject, _db, defaultListViewId, defaultView, disabled_list_views, permissions, ref, ref1, ref2, ref3, schema, self;\n _baseObject = Creator.baseObject;\n if (Meteor.isClient) {\n _baseObject = {\n actions: Creator.baseObject.actions,\n fields: {},\n triggers: {},\n permission_set: {}\n };\n }\n self = this;\n if (!options.name) {\n console.error(options);\n throw new Error('Creator.Object options must specify name');\n }\n self._id = options._id || options.name;\n self.space = options.space;\n self.name = options.name;\n self.label = options.label;\n self.icon = options.icon;\n self.description = options.description;\n self.is_view = options.is_view;\n self.form = options.form;\n self.relatedList = options.relatedList;\n self.related_lists = options.related_lists;\n self.hasImportTemplates = options.hasImportTemplates;\n self.version = options.version || 1.0;\n if (!_.isBoolean(options.is_enable) || options.is_enable === true) {\n self.is_enable = true;\n } else {\n self.is_enable = false;\n }\n if (Meteor.isClient) {\n if (_.has(options, 'allow_customActions')) {\n self.allow_customActions = options.allow_customActions;\n }\n if (_.has(options, 'exclude_actions')) {\n self.exclude_actions = options.exclude_actions;\n }\n if (_.has(options, 'allow_relatedList')) {\n self.allow_relatedList = options.allow_relatedList;\n }\n }\n self.enable_search = options.enable_search;\n self.enable_files = options.enable_files;\n self.enable_tasks = options.enable_tasks;\n self.enable_notes = options.enable_notes;\n self.enable_audit = options.enable_audit;\n self.enable_events = options.enable_events;\n if (options.paging) {\n self.paging = options.paging;\n }\n self.hidden = options.hidden;\n self.enable_api = (options.enable_api === void 0) || options.enable_api;\n self.custom = options.custom;\n self.enable_share = options.enable_share;\n self.enable_instances = options.enable_instances;\n self.enable_process = options.enable_process;\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\"))) {\n self.enable_tree = false;\n } else {\n self.enable_tree = options.enable_tree;\n self.sidebar = _.clone(options.sidebar);\n }\n } else {\n self.sidebar = _.clone(options.sidebar);\n self.enable_tree = options.enable_tree;\n }\n self.open_window = options.open_window;\n self.filter_company = options.filter_company;\n self.calendar = _.clone(options.calendar);\n self.enable_chatter = options.enable_chatter;\n self.enable_trash = options.enable_trash;\n self.enable_space_global = options.enable_space_global;\n self.enable_approvals = options.enable_approvals;\n self.enable_follow = options.enable_follow;\n self.enable_workflow = options.enable_workflow;\n self.enable_inline_edit = options.enable_inline_edit;\n self.details = options.details;\n self.masters = options.masters;\n self.lookup_details = options.lookup_details;\n if (_.has(options, 'in_development')) {\n self.in_development = options.in_development;\n }\n self.idFieldName = '_id';\n if (options.database_name) {\n self.database_name = options.database_name;\n }\n if (!options.fields) {\n console.error(options);\n throw new Error('Creator.Object options must specify fields');\n }\n self.fields = clone(options.fields);\n _.each(self.fields, function(field, field_name) {\n if (field.is_name) {\n self.NAME_FIELD_KEY = field_name;\n } else if (field_name === 'name' && !self.NAME_FIELD_KEY) {\n self.NAME_FIELD_KEY = field_name;\n }\n if (field.primary) {\n self.idFieldName = field_name;\n }\n if (Meteor.isClient) {\n if (Creator.isCloudAdminSpace(Session.get(\"spaceId\"))) {\n if (field_name === 'space') {\n field.filterable = true;\n return field.hidden = false;\n }\n }\n }\n });\n if (!options.database_name || options.database_name === 'meteor-mongo') {\n _.each(_baseObject.fields, function(field, field_name) {\n if (!self.fields[field_name]) {\n self.fields[field_name] = {};\n }\n return self.fields[field_name] = _.extend(_.clone(field), self.fields[field_name]);\n });\n }\n _.each(self.fields, function(field, field_name) {\n if (field.type === 'autonumber') {\n return field.readonly = true;\n } else if (field.type === 'formula') {\n return field.readonly = true;\n } else if (field.type === 'summary') {\n return field.readonly = true;\n }\n });\n self.list_views = {};\n defaultView = Creator.getObjectDefaultView(self.name);\n _.each(options.list_views, function(item, item_name) {\n var oitem;\n oitem = Creator.convertListView(defaultView, item, item_name);\n return self.list_views[item_name] = oitem;\n });\n self.triggers = _.clone(_baseObject.triggers);\n _.each(options.triggers, function(item, item_name) {\n if (!self.triggers[item_name]) {\n self.triggers[item_name] = {};\n }\n self.triggers[item_name].name = item_name;\n return self.triggers[item_name] = _.extend(_.clone(self.triggers[item_name]), item);\n });\n self.actions = _.clone(_baseObject.actions);\n _.each(options.actions, function(item, item_name) {\n var copyItem;\n if (!self.actions[item_name]) {\n self.actions[item_name] = {};\n }\n copyItem = _.clone(self.actions[item_name]);\n delete self.actions[item_name];\n self.actions[item_name] = _.extend(copyItem, item);\n return self.actions[item_name].object_name = self.name;\n });\n _.each(self.actions, function(item, item_name) {\n return item.name = item_name;\n });\n self.related_objects = Creator.getObjectRelateds(self.name);\n self.permission_set = _.clone(_baseObject.permission_set);\n if (!options.permission_set) {\n options.permission_set = {};\n }\n if (!((ref = options.permission_set) != null ? ref.admin : void 0)) {\n options.permission_set.admin = _.clone(self.permission_set[\"admin\"]);\n }\n if (!((ref1 = options.permission_set) != null ? ref1.user : void 0)) {\n options.permission_set.user = _.clone(self.permission_set[\"user\"]);\n }\n _.each(options.permission_set, function(item, item_name) {\n if (!self.permission_set[item_name]) {\n self.permission_set[item_name] = {};\n }\n return self.permission_set[item_name] = _.extend(_.clone(self.permission_set[item_name]), item);\n });\n if (Meteor.isClient) {\n permissions = options.permissions;\n disabled_list_views = permissions != null ? permissions.disabled_list_views : void 0;\n if (disabled_list_views != null ? disabled_list_views.length : void 0) {\n defaultListViewId = (ref2 = options.list_views) != null ? (ref3 = ref2.all) != null ? ref3._id : void 0 : void 0;\n if (defaultListViewId) {\n permissions.disabled_list_views = _.map(disabled_list_views, function(list_view_item) {\n if (defaultListViewId === list_view_item) {\n return \"all\";\n } else {\n return list_view_item;\n }\n });\n }\n }\n self.permissions = new ReactiveVar(permissions);\n } else {\n self.permissions = null;\n }\n _db = Creator.createCollection(options);\n Creator.Collections[_db._name] = _db;\n self.db = _db;\n self._collection_name = _db._name;\n schema = Creator.getObjectSchema(self);\n self.schema = new SimpleSchema(schema);\n if (self.name !== \"users\" && self.name !== \"cfs.files.filerecord\" && !self.is_view && !_.contains([\"flows\", \"forms\", \"instances\", \"organizations\", \"action_field_updates\", \"object_listviews\"], self.name)) {\n if (Meteor.isClient) {\n _db.attachSchema(self.schema, {\n replace: true\n });\n } else {\n _db.attachSchema(self.schema, {\n replace: true\n });\n }\n }\n if (self.name === \"users\") {\n _db._simpleSchema = self.schema;\n }\n if (_.contains([\"flows\", \"forms\", \"instances\", \"organizations\"], self.name)) {\n if (Meteor.isClient) {\n _db.attachSchema(self.schema, {\n replace: true\n });\n }\n }\n Creator.objectsByName[self._collection_name] = self;\n return self;\n};\n\nCreator.getObjectODataRouterPrefix = function(object) {\n return \"/api/odata/v4\";\n};\n\nMeteor.startup(function() {\n if (!Creator.bootstrapLoaded && Creator.Objects) {\n return _.each(Creator.Objects, function(object) {\n return new Creator.Object(object);\n });\n }\n});\n","Creator.getSelectOptions = (fieldSchema) ->\n\toptions = fieldSchema.options\n\tunless options\n\t\treturn\n\tdata_type = fieldSchema.data_type\n\tif !_.isFunction(options) and data_type and data_type != 'text'\n\t\t# 零代码界面配置options选项值只支持字符串,所以当data_type为数值或boolean时,只能强行把选项值先转换为对应的类型\n\t\toptions.forEach (optionItem) ->\n\t\t\tif typeof optionItem.value != 'string'\n\t\t\t\treturn\n\t\t\tif [\n\t\t\t\t'number'\n\t\t\t\t'currency'\n\t\t\t\t'percent'\n\t\t\t].indexOf(data_type) > -1\n\t\t\t\toptionItem.value = Number(optionItem.value)\n\t\t\telse if data_type == 'boolean'\n\t\t\t\t# 只有为true才为真\n\t\t\t\toptionItem.value = optionItem.value == 'true'\n\treturn options\n\nCreator.getObjectSchema = (obj) ->\n\tunless obj\n\t\treturn\n\tschema = {}\n\n\tfieldsArr = []\n\n\t_.each obj.fields , (field, field_name)->\n\t\tif !_.has(field, \"name\")\n\t\t\tfield.name = field_name\n\t\tfieldsArr.push field\n\n\t_.each _.sortBy(fieldsArr, \"sort_no\"), (field)->\n\n\t\tfield_name = field.name\n\n\t\tfs = {}\n\t\tif field.regEx\n\t\t\tfs.regEx = field.regEx\n\t\tfs.autoform = {}\n\t\tfs.autoform.multiple = field.multiple\n\t\tfs.autoform.reference_to = field.reference_to\n\n\t\tautoform_type = field.autoform?.type\n\n\t\tif field.type == \"text\" or field.type == \"phone\"\n\t\t\tfs.type = String\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tfs.autoform.type = \"tags\"\n\t\telse if field.type == \"[text]\" or field.type == \"[phone]\"\n\t\t\tfs.type = [String]\n\t\t\tfs.autoform.type = \"tags\"\n\t\telse if field.type == 'code'\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"widearea\"\n\t\t\tfs.autoform.rows = field.rows || 12\n\t\t\tif field.language\n\t\t\t\tfs.autoform.language = field.language\n\t\telse if field.type == \"textarea\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"widearea\"\n\t\t\tfs.autoform.rows = field.rows || 2\n\t\telse if field.type == \"password\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"password\"\n\t\telse if field.type == \"date\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\tif Steedos.isMobile() || Steedos.isPad()\n\t\t\t\t\tif Steedos.isiOS()\n\t\t\t\t\t\t# Fix ios 14, 手机客户端待审核文件日期控件显示故障 #991,ios统一用PC端一样的js控件\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd\"\n\t\t\t\t\t\t\t\tpickerType: \"rollers\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"steedos-date-mobile\"\n\t\t\t\t\t\t\tdateMobileOptions:\n\t\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.outFormat = 'yyyy-MM-dd';\n\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\ttype: \"date\"\n\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd\"\n\t\telse if field.type == \"time\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\ttimezoneId: \"utc\"\n\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\ttype: \"time\"\n\t\t\t\t\t\tdisplayFormat: \"HH:mm\"\n\t\telse if field.type == \"datetime\"\n\t\t\tfs.type = Date\n\t\t\tif Meteor.isClient\n\t\t\t\tif Steedos.isMobile() || Steedos.isPad()\n\t\t\t\t\tif Steedos.isiOS()\n\t\t\t\t\t\t# Fix ios 14, 手机客户端待审核文件日期控件显示故障 #991,ios统一用PC端一样的js控件\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd HH:mm\"\n\t\t\t\t\t\t\t\tpickerType: \"rollers\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\t\ttype: \"steedos-date-mobile\"\n\t\t\t\t\t\t\tdateMobileOptions:\n\t\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\telse\n\t\t\t\t\t# 这里用afFieldInput而不直接用autoform的原因是当字段被hidden的时候去执行dxDateBoxOptions参数会报错\n\t\t\t\t\tfs.autoform.afFieldInput =\n\t\t\t\t\t\ttype: \"dx-date-box\"\n\t\t\t\t\t\tdxDateBoxOptions:\n\t\t\t\t\t\t\ttype: \"datetime\"\n\t\t\t\t\t\t\tdisplayFormat: \"yyyy-MM-dd HH:mm\"\n\t\telse if field.type == \"[Object]\"\n\t\t\tfs.type = [Object]\n\t\telse if field.type == \"html\"\n\t\t\tfs.type = String\n\t\t\tif Meteor.isClient\n\t\t\t\tfs.autoform.type = 'steedosHtml';\n\t\t\t# if Meteor.isClient\n\t\t\t# \tlocale = Steedos.locale()\n\t\t\t# \tif locale == \"zh-cn\" || locale == \"zh-CN\"\n\t\t\t# \t\tlocale = \"zh-CN\"\n\t\t\t# \telse\n\t\t\t# \t\tlocale = \"en-US\"\n\t\t\t# \tfs.autoform.afFieldInput =\n\t\t\t# \t\ttype: \"summernote\"\n\t\t\t# \t\tclass: 'summernote-editor'\n\t\t\t# \t\tsettings:\n\t\t\t# \t\t\theight: 200\n\t\t\t# \t\t\tdialogsInBody: true\n\t\t\t# \t\t\ttoolbar: [\n\t\t\t# \t\t\t\t['font1', ['style']],\n\t\t\t# \t\t\t\t['font2', ['bold', 'underline', 'italic', 'clear']],\n\t\t\t# \t\t\t\t['font3', ['fontname']],\n\t\t\t# \t\t\t\t['color', ['color']],\n\t\t\t# \t\t\t\t['para', ['ul', 'ol', 'paragraph']],\n\t\t\t# \t\t\t\t['table', ['table']],\n\t\t\t# \t\t\t\t['insert', ['link', 'picture']],\n\t\t\t# \t\t\t\t['view', ['codeview']]\n\t\t\t# \t\t\t]\n\t\t\t# \t\t\tfontNames: ['Arial', 'Comic Sans MS', 'Courier New', 'Helvetica', 'Impact', '宋体','黑体','微软雅黑','仿宋','楷体','隶书','幼圆']\n\t\t\t# \t\t\tlang: locale\n\n\t\telse if (field.type == \"lookup\" or field.type == \"master_detail\")\n\t\t\tfs.type = String\n\t\t\tfs.autoform.showIcon = field.showIcon\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\n\t\t\tif !field.hidden\n\n\t\t\t\tfs.autoform.filters = field.filters\n\n\t\t\t\tfs.autoform.dependOn = field.depend_on\n\n\t\t\t\tif field.beforeOpenFunction\n\t\t\t\t\tfs.beforeOpenFunction = field.beforeOpenFunction\n\n\t\t\t\tfs.filtersFunction = if field.filtersFunction then field.filtersFunction else Creator.evaluateFilters\n\n\t\t\t\tif field.optionsFunction\n\t\t\t\t\tfs.optionsFunction = field.optionsFunction\n\n\t\t\t\tif field.reference_to\n\n\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\tif field.createFunction && _.isFunction(field.createFunction)\n\t\t\t\t\t\t\tfs.createFunction = field.createFunction\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif _.isString(field.reference_to)\n\t\t\t\t\t\t\t\t_ref_obj = Creator.Objects[field.reference_to]\n\t\t\t\t\t\t\t\tif _ref_obj?.permissions?.allowCreate\n\t\t\t\t\t\t\t\t\tfs.autoform.create = true\n\t\t\t\t\t\t\t\t\tfs.createFunction = (lookup_field)->\n\t\t\t\t\t\t\t\t\t\tModal.show(\"CreatorObjectModal\", {\n\t\t\t\t\t\t\t\t\t\t\tcollection: \"Creator.Collections.#{Creator.getCollection(field.reference_to)._name}\",\n\t\t\t\t\t\t\t\t\t\t\tformId: \"new#{field.reference_to.replace('.','_')}\",\n\t\t\t\t\t\t\t\t\t\t\tobject_name: \"#{field.reference_to}\",\n\t\t\t\t\t\t\t\t\t\t\toperation: \"insert\",\n\t\t\t\t\t\t\t\t\t\t\tonSuccess: (operation, result)->\n\t\t\t\t\t\t\t\t\t\t\t\tobject = Creator.getObject(result.object_name)\n\t\t\t\t\t\t\t\t\t\t\t\tif result.object_name == \"objects\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tlookup_field.addItems([{label: result.value.label, value: result.value.name, icon: result.value.icon}], result.value.name)\n\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\tlookup_field.addItems([{label: result.value[object.NAME_FIELD_KEY] || result.value.label || result.value.name, value: result._id}], result._id)\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tfs.autoform.create = false\n\n\t\t\t\t\tif _.isBoolean(field.create)\n\t\t\t\t\t\tfs.autoform.create = field.create\n\n\t\t\t\t\tif field.reference_sort\n\t\t\t\t\t\tfs.autoform.optionsSort = field.reference_sort\n\n\t\t\t\t\tif field.reference_limit\n\t\t\t\t\t\tfs.autoform.optionsLimit = field.reference_limit\n\t\t\t\t\tif field.reference_to_field\n\t\t\t\t\t\tfs.autoform.referenceToField = field.reference_to_field\n\n\t\t\t\t\tif field.reference_to == \"users\"\n\t\t\t\t\t\tfs.autoform.type = \"selectuser\"\n\t\t\t\t\t\tif !field.hidden && !field.omit\n\t\t\t\t\t\t\t# is_company_limited表示过滤数据时是否只显示本分部下的数据\n\t\t\t\t\t\t\t# is_company_limited可以被改写覆盖成true/false或其他function\n\t\t\t\t\t\t\tif field.is_company_limited == undefined\n\t\t\t\t\t\t\t\t# 未定义is_company_limited属性时默认处理逻辑:\n\t\t\t\t\t\t\t\t# 对当前对象有viewAllRecords权限则不限制所属分部列表查看权限,否则只显示当前所属分部\n\t\t\t\t\t\t\t\t# 注意不是reference_to对象的viewAllRecords权限,而是当前对象的\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\tpermissions = obj.permissions\n\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.viewAllRecords\n\t\t\t\t\t\t\t\t\tif _.include([\"organizations\", \"users\", \"space_users\"], obj.name)\n\t\t\t\t\t\t\t\t\t\t# 如果字段所属对象是用户或组织,则是否限制显示所属分部部门与modifyAllRecords权限关联\n\t\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.modifyAllRecords\n\t\t\t\t\t\t\t\t\tif isUnLimited\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = false\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse if _.isFunction field.is_company_limited\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\t# 传入当前对象的权限,在函数中根据权限计算是否要限制只查看本分部\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited(obj.permissions)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t# 服务端用不到is_company_limited\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\telse if field.reference_to == \"organizations\"\n\t\t\t\t\t\tfs.autoform.type = \"selectorg\"\n\t\t\t\t\t\tif !field.hidden && !field.omit\n\t\t\t\t\t\t\t# is_company_limited表示过滤数据时是否只显示本分部下的数据\n\t\t\t\t\t\t\t# is_company_limited可以被改写覆盖成true/false或其他function\n\t\t\t\t\t\t\tif field.is_company_limited == undefined\n\t\t\t\t\t\t\t\t# 未定义is_company_limited属性时默认处理逻辑:\n\t\t\t\t\t\t\t\t# 对当前对象有viewAllRecords权限则不限制所属分部列表查看权限,否则只显示当前所属分部\n\t\t\t\t\t\t\t\t# 注意不是reference_to对象的viewAllRecords权限,而是当前对象的\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\tpermissions = obj.permissions\n\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.viewAllRecords\n\t\t\t\t\t\t\t\t\tif _.include([\"organizations\", \"users\", \"space_users\"], obj.name)\n\t\t\t\t\t\t\t\t\t\t# 如果字段所属对象是用户或组织,则是否限制显示所属分部部门与modifyAllRecords权限关联\n\t\t\t\t\t\t\t\t\t\tisUnLimited = permissions?.modifyAllRecords\n\t\t\t\t\t\t\t\t\tif isUnLimited\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = false\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse if _.isFunction field.is_company_limited\n\t\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\t\t# 传入当前对象的权限,在函数中根据权限计算是否要限制只查看本分部\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited(obj.permissions)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t# 服务端用不到is_company_limited\n\t\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = true\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.is_company_limited = field.is_company_limited\n\t\t\t\t\telse\n\t\t\t\t\t\tif typeof(field.reference_to) == \"function\"\n\t\t\t\t\t\t\t_reference_to = field.reference_to()\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_reference_to = field.reference_to\n\n\t\t\t\t\t\tif _.isArray(_reference_to)\n\t\t\t\t\t\t\tfs.type = Object\n\t\t\t\t\t\t\tfs.blackbox = true\n\t\t\t\t\t\t\tfs.autoform.objectSwitche = true\n\n\t\t\t\t\t\t\tschema[field_name + \".o\"] = {\n\t\t\t\t\t\t\t\ttype: String\n\t\t\t\t\t\t\t\tautoform: {omit: true}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tschema[field_name + \".ids\"] = {\n\t\t\t\t\t\t\t\ttype: [String]\n\t\t\t\t\t\t\t\tautoform: {omit: true}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_reference_to = [_reference_to]\n\n\t\t\t\t\t\t_object = Creator.Objects[_reference_to[0]]\n\t\t\t\t\t\tif _object and _object.enable_tree\n\t\t\t\t\t\t\tfs.autoform.type = \"selectTree\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\t\t\t\tfs.autoform.optionsMethod = field.optionsMethod || \"creator.object_options\"\n\n\t\t\t\t\t\t\tif Meteor.isClient\n\t\t\t\t\t\t\t\tfs.autoform.optionsMethodParams = ()->\n\t\t\t\t\t\t\t\t\treturn {space: Session.get(\"spaceId\")}\n\t\t\t\t\t\t\t\tfs.autoform.references = []\n\t\t\t\t\t\t\t\t_reference_to.forEach (_reference)->\n\t\t\t\t\t\t\t\t\t_object = Creator.Objects[_reference]\n\t\t\t\t\t\t\t\t\tif _object\n\t\t\t\t\t\t\t\t\t\tfs.autoform.references.push {\n\t\t\t\t\t\t\t\t\t\t\tobject: _reference\n\t\t\t\t\t\t\t\t\t\t\tlabel: _object?.label\n\t\t\t\t\t\t\t\t\t\t\ticon: _object?.icon\n\t\t\t\t\t\t\t\t\t\t\tlink: ()->\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"/app/#{Session.get('app_id')}/#{_reference}/view/\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tfs.autoform.references.push {\n\t\t\t\t\t\t\t\t\t\t\tobject: _reference\n\t\t\t\t\t\t\t\t\t\t\tlink: ()->\n\t\t\t\t\t\t\t\t\t\t\t\treturn \"/app/#{Session.get('app_id')}/#{_reference}/view/\"\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\t\tfs.autoform.defaultIcon = field.defaultIcon\n\n\t\telse if field.type == \"select\"\n\t\t\tfs.type = String\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tfs.autoform.type = \"steedosLookups\"\n\t\t\t\tfs.autoform.showIcon = false\n\t\t\t\tfs.autoform.options = field.options\n\t\t\telse\n\t\t\t\tfs.autoform.type = \"select\"\n\t\t\t\tfs.autoform.options = field.options\n\t\t\t\tif _.has(field, 'firstOption')\n\t\t\t\t\tfs.autoform.firstOption = field.firstOption\n\t\t\t\telse\n\t\t\t\t\tfs.autoform.firstOption = \"\"\n\t\t\t# 因为列表视图右侧过滤器还是用的老表单的lookup和select控件,所以上面的代码始终保持原样需要执行\n\t\t\t# 下面是配置了data_type时,额外处理的逻辑\n\t\t\tif field.data_type and field.data_type != \"text\"\n\t\t\t\tif [\"number\", \"currency\", \"percent\"].indexOf(field.data_type) > -1\n\t\t\t\t\tfsType = Number\n\t\t\t\t\tfs.decimal = true\n\t\t\t\telse if field.data_type == \"boolean\"\n\t\t\t\t\tfsType = Boolean\n\t\t\t\telse\n\t\t\t\t\tfsType = String\n\t\t\t\tfs.type = fsType\n\t\t\t\tif field.multiple\n\t\t\t\t\tfs.type = [fsType]\n\t\t\t\t\t\n\t\t\t\tfs.autoform.options = Creator.getSelectOptions(field)\n\t\telse if field.type == \"currency\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tif field?.scale\n\t\t\t\tfs.autoform.scale = field.scale\n\t\t\t\tfs.decimal = true\n\t\t\telse if field?.scale != 0\n\t\t\t\tfs.autoform.scale = 2\n\t\t\t\tfs.decimal = true\n\t\telse if field.type == \"number\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tif field?.scale\n\t\t\t\tfs.autoform.scale = field.scale\n\t\t\t\tfs.decimal = true\n\t\telse if field.type == \"boolean\"\n\t\t\tfs.type = Boolean\n\t\t\tif field.readonly\n\t\t\t\tfs.autoform.disabled = true\n\t\t\tfs.autoform.type = \"steedos-boolean-checkbox\"\n\t\telse if field.type == \"toggle\"\n\t\t\tfs.type = Boolean\n\t\t\tif field.readonly\n\t\t\t\tfs.autoform.disabled = true\n\t\t\tfs.autoform.type = \"steedos-boolean-toggle\"\n\t\telse if field.type == \"reference\"\n\t\t\tfs.type = String\n\t\telse if field.type == \"checkbox\"\n\t\t\tfs.type = [String]\n\t\t\tfs.autoform.type = \"select-checkbox\"\n\t\t\tfs.autoform.options = field.options\n\t\telse if field.type == \"file\"\n\t\t\tcollectionName = field.collection || \"files\" # collection 默认是 'files'\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: collectionName\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = collectionName\n\t\telse if field.type == \"filesize\"\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = 'filesize'\n\t\telse if field.type == \"Object\" || field.type == \"object\"\n\t\t\tfs.type = Object\n\t\telse if field.type == \"grid\" || field.type == \"table\"\n\t\t\tfs.type = Array\n\t\t\tfs.autoform.editable = true\n\t\t\tfs.autoform.type = \"steedosGrid\"\n\n\t\t\tschema[field_name + \".$\"] =\n\t\t\t\ttype: Object\n\t\telse if field.type == \"image\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'images'\n\t\t\t\t\t\taccept: 'image/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'images'\n\t\t\t\tfs.autoform.accept = 'image/*'\n\t\telse if field.type == \"avatar\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'avatars'\n\t\t\t\t\t\taccept: 'image/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'avatars'\n\t\t\t\tfs.autoform.accept = 'image/*'\n\t\telse if field.type == \"audio\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'audios'\n\t\t\t\t\t\taccept: 'audio/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'audios'\n\t\t\t\tfs.autoform.accept = 'audio/*'\n\t\telse if field.type == \"video\"\n\t\t\tif field.multiple\n\t\t\t\tfs.type = [String]\n\t\t\t\tschema[field_name + \".$\"] =\n\t\t\t\t\tautoform:\n\t\t\t\t\t\ttype: 'fileUpload'\n\t\t\t\t\t\tcollection: 'videos'\n\t\t\t\t\t\taccept: 'video/*'\n\t\t\telse\n\t\t\t\tfs.type = String\n\t\t\t\tfs.autoform.type = 'fileUpload'\n\t\t\t\tfs.autoform.collection = 'videos'\n\t\t\t\tfs.autoform.accept = 'video/*'\n\t\telse if field.type == \"location\"\n\t\t\tfs.type = Object\n\t\t\tfs.autoform.type = \"location\"\n\t\t\tfs.autoform.system = field.system || \"wgs84\"\n\t\t\tfs.blackbox = true\n\t\telse if field.type == \"markdown\"\n\t\t\tfs.type = String\n\t\t\tfs.autoform.type = \"text\"\n\t\telse if field.type == 'url'\n\t\t\tfs.type = String\n\t\t\t# fs.regEx = SimpleSchema.RegEx.Url\n\t\t\tfs.autoform.type = 'steedosUrl'\n\t\telse if field.type == 'email'\n\t\t\tfs.type = String\n\t\t\tfs.regEx = SimpleSchema.RegEx.Email\n\t\t\tfs.autoform.type = 'steedosEmail'\n\t\telse if field.type == 'autonumber'\n\t\t\tfs.type = String\n\t\telse if field.type == 'color'\n\t\t\tfs.type = String\n\t\telse if field.type == 'formula'\n\t\t\tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\telse if field.type == 'summary'\n\t\t\tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\t# else if field.type == 'select'\n\t\t# \tfs = Creator.getObjectSchema({fields: {field: Object.assign({}, field, {type: field.data_type})}})[field.name]\n\t\telse if field.type == 'percent'\n\t\t\tfs.type = Number\n\t\t\tfs.autoform.type = \"steedosNumber\"\n\t\t\tfs.autoform.precision = field.precision || 18\n\t\t\tunless _.isNumber(field.scale)\n\t\t\t\t# 没配置小数位数则按小数位数0来处理,即默认显示为整数的百分比,比如20%,此时控件可以输入2位小数,转成百分比就是整数\n\t\t\t\tfield.scale = 0\n\t\t\t# autoform控件中小数位数始终比配置的位数多2位\n\t\t\tfs.autoform.scale = field.scale + 2\n\t\t\tfs.decimal = true\n\t\telse\n\t\t\tfs.type = field.type\n\n\t\tif field.label\n\t\t\tfs.label = field.label\n\n#\t\tif field.allowedValues\n#\t\t\tfs.allowedValues = field.allowedValues\n\n\t\tif !field.required\n\t\t\tfs.optional = true\n\n\t\t# [签约对象同时配置了company_ids必填及uneditable_fields造成部分用户新建签约对象时报错 #192](https://github.com/steedos/steedos-project-dzug/issues/192)\n\t\t# 后台始终设置required为false\n\t\tif !Meteor.isClient\n\t\t\tfs.optional = true\n\n\t\tif field.unique\n\t\t\tfs.unique = true\n\n\t\tif field.omit\n\t\t\tfs.autoform.omit = true\n\n\t\tif field.group\n\t\t\tfs.autoform.group = field.group\n\n\t\tif field.is_wide\n\t\t\tfs.autoform.is_wide = true\n\n\t\tif field.hidden\n\t\t\tfs.autoform.type = \"hidden\"\n\n\t\tif (field.type == \"select\") or (field.type == \"lookup\") or (field.type == \"master_detail\")\n\t\t\tif typeof(field.filterable) == 'undefined'\n\t\t\t\tfield.filterable = true\n\t\tif field.name == 'name' || field.is_name\n\t\t\tif typeof(field.searchable) == 'undefined'\n\t\t\t\tfield.searchable = true\n\n\t\tif autoform_type\n\t\t\tfs.autoform.type = autoform_type\n\n\t\tif field.defaultValue\n\t\t\tif Meteor.isClient and Creator.Formular.checkFormula(field.defaultValue)\n\t\t\t\tfs.autoform.defaultValue = ()->\n\t\t\t\t\treturn Creator.Formular.run(field.defaultValue, {userId: Meteor.userId(), spaceId: Session.get(\"spaceId\"), now: new Date()})\n\t\t\telse\n\t\t\t\tfs.autoform.defaultValue = field.defaultValue\n\t\t\t# \tif !_.isFunction(field.defaultValue)\n\t\t\t# \t\tfs.defaultValue = field.defaultValue\n\n\t\tif field.readonly\n\t\t\tfs.autoform.readonly = true\n\n\t\tif field.disabled\n\t\t\tfs.autoform.disabled = true\n\n\t\tif field.inlineHelpText\n\t\t\tfs.autoform.inlineHelpText = field.inlineHelpText\n\n\t\tif field.blackbox\n\t\t\tfs.blackbox = true\n\n\t\tif _.has(field, 'min')\n\t\t\tfs.min = field.min\n\t\tif _.has(field, 'max')\n\t\t\tfs.max = field.max\n\n\t\t# 只有生产环境才重建索引\n\t\tif Meteor.isProduction\n\t\t\tif field.index\n\t\t\t\tfs.index = field.index\n\t\t\telse if field.sortable\n\t\t\t\tfs.index = true\n\n\t\tschema[field_name] = fs\n\n\treturn schema\n\n\nCreator.getFieldDisplayValue = (object_name, field_name, field_value)->\n\thtml = field_value\n\tobject = Creator.getObject(object_name)\n\tif !object\n\t\treturn \"\"\n\tfield = object.fields(field_name)\n\tif !field\n\t\treturn \"\"\n\n\tif field.type == \"datetime\"\n\t\thtml = moment(this.val).format('YYYY-MM-DD H:mm')\n\telse if field.type == \"date\"\n\t\thtml = moment(this.val).format('YYYY-MM-DD')\n\n\treturn html\n\nCreator.checkFieldTypeSupportBetweenQuery = (field_type)->\n\treturn [\"date\", \"datetime\", \"time\", \"currency\", \"number\"].includes(field_type)\n\nCreator.pushBetweenBuiltinOptionals = (field_type, operations)->\n\tbuiltinValues = Creator.getBetweenBuiltinValues(field_type)\n\tif builtinValues\n\t\t_.forEach builtinValues, (builtinItem, key)->\n\t\t\toperations.push({label: builtinItem.label, value: key})\n\nCreator.getBetweenBuiltinValues = (field_type, is_check_only)->\n\t# 过滤器字段类型对应的内置选项\n\tif [\"date\", \"datetime\"].includes(field_type)\n\t\treturn Creator.getBetweenTimeBuiltinValues(is_check_only, field_type)\n\nCreator.getBetweenBuiltinValueItem = (field_type, key)->\n\t# 过滤器字段类型对应的内置选项\n\tif [\"date\", \"datetime\"].includes(field_type)\n\t\treturn Creator.getBetweenTimeBuiltinValueItem(field_type, key)\n\nCreator.getBetweenBuiltinOperation = (field_type, value)->\n\t# 根据过滤器的过滤值,获取对应的内置运算符\n\t# 比如value为last_year,返回between_time_last_year\n\tunless _.isString(value)\n\t\treturn\n\tbetweenBuiltinValues = Creator.getBetweenBuiltinValues(field_type)\n\tunless betweenBuiltinValues\n\t\treturn\n\tresult = null\n\t_.each betweenBuiltinValues, (item, operation)->\n\t\tif item.key == value\n\t\t\tresult = operation\n\treturn result\n\n# 如果只是为判断operation是否存在,则没必要计算values,传入is_check_only为true即可\nCreator.getBetweenTimeBuiltinValues = (is_check_only, field_type)->\n\t# 过滤器时间字段类型对应的内置选项\n\treturn {\n\t\t\"between_time_last_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_year\"),\n\t\t\"between_time_this_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_year\"),\n\t\t\"between_time_next_year\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_year\"),\n\t\t\"between_time_last_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_quarter\"),\n\t\t\"between_time_this_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_quarter\"),\n\t\t\"between_time_next_quarter\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_quarter\"),\n\t\t\"between_time_last_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_month\"),\n\t\t\"between_time_this_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_month\"),\n\t\t\"between_time_next_month\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_month\"),\n\t\t\"between_time_last_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_week\"),\n\t\t\"between_time_this_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_week\"),\n\t\t\"between_time_next_week\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_week\"),\n\t\t\"between_time_yestday\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"yestday\"),\n\t\t\"between_time_today\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"today\"),\n\t\t\"between_time_tomorrow\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"tomorrow\"),\n\t\t\"between_time_last_7_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_7_days\"),\n\t\t\"between_time_last_30_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_30_days\"),\n\t\t\"between_time_last_60_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_60_days\"),\n\t\t\"between_time_last_90_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_90_days\"),\n\t\t\"between_time_last_120_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_120_days\"),\n\t\t\"between_time_next_7_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_7_days\"),\n\t\t\"between_time_next_30_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_30_days\"),\n\t\t\"between_time_next_60_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_60_days\"),\n\t\t\"between_time_next_90_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_90_days\"),\n\t\t\"between_time_next_120_days\": if is_check_only then true else Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_120_days\")\n\t}\n\nCreator.getQuarterStartMonth = (month)->\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\treturn 0\n\telse if month < 6\n\t\treturn 3\n\telse if month < 9\n\t\treturn 6\n\t\n\treturn 9\n\n\nCreator.getLastQuarterFirstDay = (year,month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\tyear--\n\t\tmonth = 9\n\telse if month < 6\n\t\tmonth = 0\n\telse if month < 9\n\t\tmonth = 3\n\telse \n\t\tmonth = 6\n\t\n\treturn new Date(year, month, 1)\n\t\n\nCreator.getNextQuarterFirstDay = (year,month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\tif month < 3\n\t\tmonth = 3\n\telse if month < 6\n\t\tmonth = 6\n\telse if month < 9\n\t\tmonth = 9\n\telse\n\t\tyear++\n\t\tmonth = 0\n\t\n\treturn new Date(year, month, 1)\n\nCreator.getMonthDays = (year,month)->\n\tif month == 11\n\t\treturn 31\n\t\n\tmillisecond = 1000 * 60 * 60 * 24\n\tstartDate = new Date(year, month, 1)\n\tendDate = new Date(year, month+1, 1)\n\tdays = (endDate-startDate)/millisecond\n\treturn days\n\nCreator.getLastMonthFirstDay = (year, month)->\n\tif !year\n\t\tyear = new Date().getFullYear()\n\tif !month\n\t\tmonth = new Date().getMonth()\n\t\n\t# 月份为0代表本年的第一月\n\tif month == 0\n\t\tmonth = 11\n\t\tyear--\n\t\treturn new Date(year, month, 1)\n\t\n\t# 否则,只减去月份\n\tmonth--;\n\treturn new Date(year, month, 1)\n\t\nCreator.getBetweenTimeBuiltinValueItem = (field_type, key)->\n\t# 过滤器between运算符,现算日期/日期时间类型字段的values值\n\tnow = new Date()\n\t# 一天的毫秒数\n\tmillisecond = 1000 * 60 * 60 * 24\n\tyestday = new Date(now.getTime() - millisecond)\n\ttomorrow = new Date(now.getTime() + millisecond)\n\t# 一周中的某一天\n\tweek = now.getDay()\n\t# 减去的天数\n\tminusDay = if week != 0 then week - 1 else 6\n\tmonday = new Date(now.getTime() - (minusDay * millisecond))\n\tsunday = new Date(monday.getTime() + (6 * millisecond))\n\t# 上周日\n\tlastSunday = new Date(monday.getTime() - millisecond)\n\t# 上周一\n\tlastMonday = new Date(lastSunday.getTime() - (millisecond * 6))\n\t# 下周一\n\tnextMonday = new Date(sunday.getTime() + millisecond)\n\t# 下周日\n\tnextSunday = new Date(nextMonday.getTime() + (millisecond * 6))\n\tcurrentYear = now.getFullYear()\n\tpreviousYear = currentYear - 1\n\tnextYear = currentYear + 1\n\t# 当前月份\n\tcurrentMonth = now.getMonth()\n\t# 计数年、月\n\tyear = now.getFullYear()\n\tmonth = now.getMonth()\n\t# 本月第一天\n\tfirstDay = new Date(currentYear,currentMonth,1)\n\n\t# 当为12月的时候年份需要加1\n\t# 月份需要更新为0 也就是下一年的第一个月\n\tif currentMonth == 11\n\t\tyear++\n\t\tmonth++\n\telse\n\t\tmonth++\n\t\n\t# 下月第一天\n\tnextMonthFirstDay = new Date(year, month, 1)\n\t# 下月最后一天\n\tnextMonthFinalDay = new Date(year,month,Creator.getMonthDays(year,month))\n\t# 本月最后一天\n\tlastDay = new Date(nextMonthFirstDay.getTime() - millisecond)\n\t# 上月第一天\n\tlastMonthFirstDay = Creator.getLastMonthFirstDay(currentYear,currentMonth)\n\t# 上月最后一天\n\tlastMonthFinalDay = new Date(firstDay.getTime() - millisecond)\n\t# 本季度开始日\n\tthisQuarterStartDay = new Date(currentYear,Creator.getQuarterStartMonth(currentMonth),1)\n\t# 本季度结束日\n\tthisQuarterEndDay = new Date(currentYear,Creator.getQuarterStartMonth(currentMonth)+2,Creator.getMonthDays(currentYear,Creator.getQuarterStartMonth(currentMonth)+2))\n\t# 上季度开始日\n\tlastQuarterStartDay = Creator.getLastQuarterFirstDay(currentYear,currentMonth)\n\t# 上季度结束日\n\tlastQuarterEndDay = new Date(lastQuarterStartDay.getFullYear(),lastQuarterStartDay.getMonth()+2,Creator.getMonthDays(lastQuarterStartDay.getFullYear(),lastQuarterStartDay.getMonth()+2))\n\t# 下季度开始日\n\tnextQuarterStartDay = Creator.getNextQuarterFirstDay(currentYear,currentMonth)\n\t# 下季度结束日\n\tnextQuarterEndDay = new Date(nextQuarterStartDay.getFullYear(),nextQuarterStartDay.getMonth()+2,Creator.getMonthDays(nextQuarterStartDay.getFullYear(),nextQuarterStartDay.getMonth()+2))\n\t# 过去7天 \n\tlast_7_days = new Date(now.getTime() - (6 * millisecond))\n\t# 过去30天\n\tlast_30_days = new Date(now.getTime() - (29 * millisecond))\n\t# 过去60天\n\tlast_60_days = new Date(now.getTime() - (59 * millisecond))\n\t# 过去90天\n\tlast_90_days = new Date(now.getTime() - (89 * millisecond))\n\t# 过去120天\n\tlast_120_days = new Date(now.getTime() - (119 * millisecond))\n\t# 未来7天 \n\tnext_7_days = new Date(now.getTime() + (6 * millisecond))\n\t# 未来30天\n\tnext_30_days = new Date(now.getTime() + (29 * millisecond))\n\t# 未来60天\n\tnext_60_days = new Date(now.getTime() + (59 * millisecond))\n\t# 未来90天\n\tnext_90_days = new Date(now.getTime() + (89 * millisecond))\n\t# 未来120天\n\tnext_120_days = new Date(now.getTime() + (119 * millisecond))\n\n\tswitch key\n\t\twhen \"last_year\"\n\t\t\t#去年\n\t\t\tlabel = t(\"creator_filter_operation_between_last_year\")\n\t\t\tstartValue = new Date(\"#{previousYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{previousYear}-12-31T23:59:59Z\")\n\t\twhen \"this_year\"\n\t\t\t#今年\n\t\t\tlabel = t(\"creator_filter_operation_between_this_year\")\n\t\t\tstartValue = new Date(\"#{currentYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{currentYear}-12-31T23:59:59Z\")\n\t\twhen \"next_year\"\n\t\t\t#明年\n\t\t\tlabel = t(\"creator_filter_operation_between_next_year\")\n\t\t\tstartValue = new Date(\"#{nextYear}-01-01T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{nextYear}-12-31T23:59:59Z\")\n\t\twhen \"last_quarter\"\n\t\t\t#上季度\n\t\t\tstrFirstDay = moment(lastQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"this_quarter\"\n\t\t\t#本季度\n\t\t\tstrFirstDay = moment(thisQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(thisQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"next_quarter\"\n\t\t\t#下季度\n\t\t\tstrFirstDay = moment(nextQuarterStartDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(nextQuarterEndDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_quarter\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"last_month\"\n\t\t\t#上月\n\t\t\tstrFirstDay = moment(lastMonthFirstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastMonthFinalDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"this_month\"\n\t\t\t#本月\n\t\t\tstrFirstDay = moment(firstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(lastDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"next_month\"\n\t\t\t#下月\n\t\t\tstrFirstDay = moment(nextMonthFirstDay).format(\"YYYY-MM-DD\")\n\t\t\tstrLastDay = moment(nextMonthFinalDay).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_month\")\n\t\t\tstartValue = new Date(\"#{strFirstDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strLastDay}T23:59:59Z\")\n\t\twhen \"last_week\"\n\t\t\t#上周\n\t\t\tstrMonday = moment(lastMonday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(lastSunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"this_week\"\n\t\t\t#本周\n\t\t\tstrMonday = moment(monday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(sunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_this_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"next_week\"\n\t\t\t#下周\n\t\t\tstrMonday = moment(nextMonday).format(\"YYYY-MM-DD\")\n\t\t\tstrSunday = moment(nextSunday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_week\")\n\t\t\tstartValue = new Date(\"#{strMonday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strSunday}T23:59:59Z\")\n\t\twhen \"yestday\"\n\t\t\t#昨天\n\t\t\tstrYestday = moment(yestday).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_yestday\")\n\t\t\tstartValue = new Date(\"#{strYestday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strYestday}T23:59:59Z\")\n\t\twhen \"today\"\n\t\t\t#今天\n\t\t\tstrToday = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_today\")\n\t\t\tstartValue = new Date(\"#{strToday}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strToday}T23:59:59Z\")\n\t\twhen \"tomorrow\"\n\t\t\t#明天\n\t\t\tstrTomorrow = moment(tomorrow).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_tomorrow\")\n\t\t\tstartValue = new Date(\"#{strTomorrow}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strTomorrow}T23:59:59Z\")\n\t\twhen \"last_7_days\"\n\t\t\t#过去7天\n\t\t\tstrStartDay = moment(last_7_days).format(\"YYYY-MM-DD\") \n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_7_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_30_days\"\n\t\t\t#过去30天\n\t\t\tstrStartDay = moment(last_30_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_30_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_60_days\"\n\t\t\t#过去60天\n\t\t\tstrStartDay = moment(last_60_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_60_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_90_days\"\n\t\t\t#过去90天\n\t\t\tstrStartDay = moment(last_90_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_90_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"last_120_days\"\n\t\t\t#过去120天\n\t\t\tstrStartDay = moment(last_120_days).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_last_120_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_7_days\"\n\t\t\t#未来7天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_7_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_7_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_30_days\"\n\t\t\t#未来30天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_30_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_30_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_60_days\"\n\t\t\t#未来60天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_60_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_60_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_90_days\"\n\t\t\t#未来90天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_90_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_90_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\twhen \"next_120_days\"\n\t\t\t#未来120天\n\t\t\tstrStartDay = moment(now).format(\"YYYY-MM-DD\")\n\t\t\tstrEndDay = moment(next_120_days).format(\"YYYY-MM-DD\")\n\t\t\tlabel = t(\"creator_filter_operation_between_next_120_days\")\n\t\t\tstartValue = new Date(\"#{strStartDay}T00:00:00Z\")\n\t\t\tendValue = new Date(\"#{strEndDay}T23:59:59Z\")\n\t\n\tvalues = [startValue, endValue]\n\tif field_type == \"datetime\"\n\t\t# 时间类型字段,内置时间范围应该考虑偏移时区值,否则过滤数据存在偏差\n\t\t# 非内置时间范围时,用户通过时间控件选择的范围,会自动处理时区偏差情况\n\t\t# 日期类型字段,数据库本来就存的是UTC的0点,不存在偏差\n\t\t_.forEach values, (fv)->\n\t\t\tif fv\n\t\t\t\tfv.setHours(fv.getHours() + fv.getTimezoneOffset() / 60 )\n\t\n\treturn {\n\t\tlabel: label\n\t\tkey: key\n\t\tvalues: values\n\t}\n\nCreator.getFieldDefaultOperation = (field_type)->\n\tif field_type && Creator.checkFieldTypeSupportBetweenQuery(field_type)\n\t\treturn 'between'\n\telse if [\"textarea\", \"text\", \"code\"].includes(field_type)\n\t\treturn 'contains'\n\telse\n\t\treturn \"=\"\n\nCreator.getFieldOperation = (field_type) ->\n\t# 日期类型: date, datetime 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n\t# 文本类型: text, textarea, html 支持操作符: \"=\", \"<>\", \"contains\", \"notcontains\", \"startswith\"\n\t# 选择类型: lookup, master_detail, select 支持操作符: \"=\", \"<>\"\n\t# 数值类型: currency, number 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n\t# 布尔类型: boolean 支持操作符: \"=\", \"<>\"\n\t# 数组类型: checkbox, [text] 支持操作符: \"=\", \"<>\"\n\n\toptionals = {\n\t\tequal: {label: t(\"creator_filter_operation_equal\"), value: \"=\"},\n\t\tunequal: {label: t(\"creator_filter_operation_unequal\"), value: \"<>\"},\n\t\tless_than: {label: t(\"creator_filter_operation_less_than\"), value: \"<\"},\n\t\tgreater_than: {label: t(\"creator_filter_operation_greater_than\"), value: \">\"},\n\t\tless_or_equal: {label: t(\"creator_filter_operation_less_or_equal\"), value: \"<=\"},\n\t\tgreater_or_equal: {label: t(\"creator_filter_operation_greater_or_equal\"), value: \">=\"},\n\t\tcontains: {label: t(\"creator_filter_operation_contains\"), value: \"contains\"},\n\t\tnot_contain: {label: t(\"creator_filter_operation_does_not_contain\"), value: \"notcontains\"},\n\t\tstarts_with: {label: t(\"creator_filter_operation_starts_with\"), value: \"startswith\"},\n\t\tbetween: {label: t(\"creator_filter_operation_between\"), value: \"between\"},\n\t}\n\n\tif field_type == undefined\n\t\treturn _.values(optionals)\n\n\toperations = []\n\n\tif Creator.checkFieldTypeSupportBetweenQuery(field_type)\n\t\toperations.push(optionals.between)\n\t\tCreator.pushBetweenBuiltinOptionals(field_type, operations)\n\telse if field_type == \"text\" or field_type == \"textarea\" or field_type == \"html\" or field_type == \"code\"\n#\t\toperations.push(optionals.equal, optionals.unequal, optionals.contains, optionals.not_contain, optionals.starts_with)\n\t\toperations.push(optionals.contains)\n\telse if field_type == \"lookup\" or field_type == \"master_detail\" or field_type == \"select\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"currency\" or field_type == \"number\"\n\t\toperations.push(optionals.equal, optionals.unequal, optionals.less_than, optionals.greater_than, optionals.less_or_equal, optionals.greater_or_equal)\n\telse if field_type == \"boolean\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"checkbox\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse if field_type == \"[text]\"\n\t\toperations.push(optionals.equal, optionals.unequal)\n\telse\n\t\toperations.push(optionals.equal, optionals.unequal)\n\n\treturn operations\n\n###\n 先按照有排序号的小的在前,大的在后\n 再将没有排序号的显示在\n###\nCreator.getObjectFieldsName = (object_name)->\n\tfields = Creator.getObject(object_name)?.fields\n\tfieldsArr = []\n\n\t_.each fields, (field)->\n\t\tfieldsArr.push {name: field.name, sort_no: field.sort_no}\n\n\tfieldsName = []\n\t_.each _.sortBy(fieldsArr, \"sort_no\"), (field)->\n\t\tfieldsName.push(field.name)\n\treturn fieldsName\n","Creator.getSelectOptions = function(fieldSchema) {\n var data_type, options;\n options = fieldSchema.options;\n if (!options) {\n return;\n }\n data_type = fieldSchema.data_type;\n if (!_.isFunction(options) && data_type && data_type !== 'text') {\n options.forEach(function(optionItem) {\n if (typeof optionItem.value !== 'string') {\n return;\n }\n if (['number', 'currency', 'percent'].indexOf(data_type) > -1) {\n return optionItem.value = Number(optionItem.value);\n } else if (data_type === 'boolean') {\n return optionItem.value = optionItem.value === 'true';\n }\n });\n }\n return options;\n};\n\nCreator.getObjectSchema = function(obj) {\n var fieldsArr, schema;\n if (!obj) {\n return;\n }\n schema = {};\n fieldsArr = [];\n _.each(obj.fields, function(field, field_name) {\n if (!_.has(field, \"name\")) {\n field.name = field_name;\n }\n return fieldsArr.push(field);\n });\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field) {\n var _object, _ref_obj, _reference_to, autoform_type, collectionName, field_name, fs, fsType, isUnLimited, permissions, ref, ref1;\n field_name = field.name;\n fs = {};\n if (field.regEx) {\n fs.regEx = field.regEx;\n }\n fs.autoform = {};\n fs.autoform.multiple = field.multiple;\n fs.autoform.reference_to = field.reference_to;\n autoform_type = (ref = field.autoform) != null ? ref.type : void 0;\n if (field.type === \"text\" || field.type === \"phone\") {\n fs.type = String;\n if (field.multiple) {\n fs.type = [String];\n fs.autoform.type = \"tags\";\n }\n } else if (field.type === \"[text]\" || field.type === \"[phone]\") {\n fs.type = [String];\n fs.autoform.type = \"tags\";\n } else if (field.type === 'code') {\n fs.type = String;\n fs.autoform.type = \"widearea\";\n fs.autoform.rows = field.rows || 12;\n if (field.language) {\n fs.autoform.language = field.language;\n }\n } else if (field.type === \"textarea\") {\n fs.type = String;\n fs.autoform.type = \"widearea\";\n fs.autoform.rows = field.rows || 2;\n } else if (field.type === \"password\") {\n fs.type = String;\n fs.autoform.type = \"password\";\n } else if (field.type === \"date\") {\n fs.type = Date;\n if (Meteor.isClient) {\n if (Steedos.isMobile() || Steedos.isPad()) {\n if (Steedos.isiOS()) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"date\",\n displayFormat: \"yyyy-MM-dd\",\n pickerType: \"rollers\"\n }\n };\n } else {\n fs.autoform.afFieldInput = {\n type: \"steedos-date-mobile\",\n dateMobileOptions: {\n type: \"date\"\n }\n };\n }\n } else {\n fs.autoform.outFormat = 'yyyy-MM-dd';\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"date\",\n displayFormat: \"yyyy-MM-dd\"\n }\n };\n }\n }\n } else if (field.type === \"time\") {\n fs.type = Date;\n if (Meteor.isClient) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n timezoneId: \"utc\",\n dxDateBoxOptions: {\n type: \"time\",\n displayFormat: \"HH:mm\"\n }\n };\n }\n } else if (field.type === \"datetime\") {\n fs.type = Date;\n if (Meteor.isClient) {\n if (Steedos.isMobile() || Steedos.isPad()) {\n if (Steedos.isiOS()) {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n dxDateBoxOptions: {\n type: \"datetime\",\n displayFormat: \"yyyy-MM-dd HH:mm\",\n pickerType: \"rollers\"\n }\n };\n } else {\n fs.autoform.afFieldInput = {\n type: \"steedos-date-mobile\",\n dateMobileOptions: {\n type: \"datetime\"\n }\n };\n }\n } else {\n fs.autoform.afFieldInput = {\n type: \"dx-date-box\",\n dxDateBoxOptions: {\n type: \"datetime\",\n displayFormat: \"yyyy-MM-dd HH:mm\"\n }\n };\n }\n }\n } else if (field.type === \"[Object]\") {\n fs.type = [Object];\n } else if (field.type === \"html\") {\n fs.type = String;\n if (Meteor.isClient) {\n fs.autoform.type = 'steedosHtml';\n }\n } else if (field.type === \"lookup\" || field.type === \"master_detail\") {\n fs.type = String;\n fs.autoform.showIcon = field.showIcon;\n if (field.multiple) {\n fs.type = [String];\n }\n if (!field.hidden) {\n fs.autoform.filters = field.filters;\n fs.autoform.dependOn = field.depend_on;\n if (field.beforeOpenFunction) {\n fs.beforeOpenFunction = field.beforeOpenFunction;\n }\n fs.filtersFunction = field.filtersFunction ? field.filtersFunction : Creator.evaluateFilters;\n if (field.optionsFunction) {\n fs.optionsFunction = field.optionsFunction;\n }\n if (field.reference_to) {\n if (Meteor.isClient) {\n if (field.createFunction && _.isFunction(field.createFunction)) {\n fs.createFunction = field.createFunction;\n } else {\n if (_.isString(field.reference_to)) {\n _ref_obj = Creator.Objects[field.reference_to];\n if (_ref_obj != null ? (ref1 = _ref_obj.permissions) != null ? ref1.allowCreate : void 0 : void 0) {\n fs.autoform.create = true;\n fs.createFunction = function(lookup_field) {\n return Modal.show(\"CreatorObjectModal\", {\n collection: \"Creator.Collections.\" + (Creator.getCollection(field.reference_to)._name),\n formId: \"new\" + (field.reference_to.replace('.', '_')),\n object_name: \"\" + field.reference_to,\n operation: \"insert\",\n onSuccess: function(operation, result) {\n var object;\n object = Creator.getObject(result.object_name);\n if (result.object_name === \"objects\") {\n return lookup_field.addItems([\n {\n label: result.value.label,\n value: result.value.name,\n icon: result.value.icon\n }\n ], result.value.name);\n } else {\n return lookup_field.addItems([\n {\n label: result.value[object.NAME_FIELD_KEY] || result.value.label || result.value.name,\n value: result._id\n }\n ], result._id);\n }\n }\n });\n };\n } else {\n fs.autoform.create = false;\n }\n }\n }\n }\n if (_.isBoolean(field.create)) {\n fs.autoform.create = field.create;\n }\n if (field.reference_sort) {\n fs.autoform.optionsSort = field.reference_sort;\n }\n if (field.reference_limit) {\n fs.autoform.optionsLimit = field.reference_limit;\n }\n if (field.reference_to_field) {\n fs.autoform.referenceToField = field.reference_to_field;\n }\n if (field.reference_to === \"users\") {\n fs.autoform.type = \"selectuser\";\n if (!field.hidden && !field.omit) {\n if (field.is_company_limited === void 0) {\n if (Meteor.isClient) {\n permissions = obj.permissions;\n isUnLimited = permissions != null ? permissions.viewAllRecords : void 0;\n if (_.include([\"organizations\", \"users\", \"space_users\"], obj.name)) {\n isUnLimited = permissions != null ? permissions.modifyAllRecords : void 0;\n }\n if (isUnLimited) {\n fs.autoform.is_company_limited = false;\n } else {\n fs.autoform.is_company_limited = true;\n }\n }\n } else if (_.isFunction(field.is_company_limited)) {\n if (Meteor.isClient) {\n fs.autoform.is_company_limited = field.is_company_limited(obj.permissions);\n } else {\n fs.autoform.is_company_limited = true;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else if (field.reference_to === \"organizations\") {\n fs.autoform.type = \"selectorg\";\n if (!field.hidden && !field.omit) {\n if (field.is_company_limited === void 0) {\n if (Meteor.isClient) {\n permissions = obj.permissions;\n isUnLimited = permissions != null ? permissions.viewAllRecords : void 0;\n if (_.include([\"organizations\", \"users\", \"space_users\"], obj.name)) {\n isUnLimited = permissions != null ? permissions.modifyAllRecords : void 0;\n }\n if (isUnLimited) {\n fs.autoform.is_company_limited = false;\n } else {\n fs.autoform.is_company_limited = true;\n }\n }\n } else if (_.isFunction(field.is_company_limited)) {\n if (Meteor.isClient) {\n fs.autoform.is_company_limited = field.is_company_limited(obj.permissions);\n } else {\n fs.autoform.is_company_limited = true;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n fs.autoform.is_company_limited = field.is_company_limited;\n }\n } else {\n if (typeof field.reference_to === \"function\") {\n _reference_to = field.reference_to();\n } else {\n _reference_to = field.reference_to;\n }\n if (_.isArray(_reference_to)) {\n fs.type = Object;\n fs.blackbox = true;\n fs.autoform.objectSwitche = true;\n schema[field_name + \".o\"] = {\n type: String,\n autoform: {\n omit: true\n }\n };\n schema[field_name + \".ids\"] = {\n type: [String],\n autoform: {\n omit: true\n }\n };\n } else {\n _reference_to = [_reference_to];\n }\n _object = Creator.Objects[_reference_to[0]];\n if (_object && _object.enable_tree) {\n fs.autoform.type = \"selectTree\";\n } else {\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.optionsMethod = field.optionsMethod || \"creator.object_options\";\n if (Meteor.isClient) {\n fs.autoform.optionsMethodParams = function() {\n return {\n space: Session.get(\"spaceId\")\n };\n };\n fs.autoform.references = [];\n _reference_to.forEach(function(_reference) {\n _object = Creator.Objects[_reference];\n if (_object) {\n return fs.autoform.references.push({\n object: _reference,\n label: _object != null ? _object.label : void 0,\n icon: _object != null ? _object.icon : void 0,\n link: function() {\n return \"/app/\" + (Session.get('app_id')) + \"/\" + _reference + \"/view/\";\n }\n });\n } else {\n return fs.autoform.references.push({\n object: _reference,\n link: function() {\n return \"/app/\" + (Session.get('app_id')) + \"/\" + _reference + \"/view/\";\n }\n });\n }\n });\n }\n }\n }\n } else {\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.defaultIcon = field.defaultIcon;\n }\n }\n } else if (field.type === \"select\") {\n fs.type = String;\n if (field.multiple) {\n fs.type = [String];\n fs.autoform.type = \"steedosLookups\";\n fs.autoform.showIcon = false;\n fs.autoform.options = field.options;\n } else {\n fs.autoform.type = \"select\";\n fs.autoform.options = field.options;\n if (_.has(field, 'firstOption')) {\n fs.autoform.firstOption = field.firstOption;\n } else {\n fs.autoform.firstOption = \"\";\n }\n }\n if (field.data_type && field.data_type !== \"text\") {\n if ([\"number\", \"currency\", \"percent\"].indexOf(field.data_type) > -1) {\n fsType = Number;\n fs.decimal = true;\n } else if (field.data_type === \"boolean\") {\n fsType = Boolean;\n } else {\n fsType = String;\n }\n fs.type = fsType;\n if (field.multiple) {\n fs.type = [fsType];\n }\n fs.autoform.options = Creator.getSelectOptions(field);\n }\n } else if (field.type === \"currency\") {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (field != null ? field.scale : void 0) {\n fs.autoform.scale = field.scale;\n fs.decimal = true;\n } else if ((field != null ? field.scale : void 0) !== 0) {\n fs.autoform.scale = 2;\n fs.decimal = true;\n }\n } else if (field.type === \"number\") {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (field != null ? field.scale : void 0) {\n fs.autoform.scale = field.scale;\n fs.decimal = true;\n }\n } else if (field.type === \"boolean\") {\n fs.type = Boolean;\n if (field.readonly) {\n fs.autoform.disabled = true;\n }\n fs.autoform.type = \"steedos-boolean-checkbox\";\n } else if (field.type === \"toggle\") {\n fs.type = Boolean;\n if (field.readonly) {\n fs.autoform.disabled = true;\n }\n fs.autoform.type = \"steedos-boolean-toggle\";\n } else if (field.type === \"reference\") {\n fs.type = String;\n } else if (field.type === \"checkbox\") {\n fs.type = [String];\n fs.autoform.type = \"select-checkbox\";\n fs.autoform.options = field.options;\n } else if (field.type === \"file\") {\n collectionName = field.collection || \"files\";\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: collectionName\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = collectionName;\n }\n } else if (field.type === \"filesize\") {\n fs.type = Number;\n fs.autoform.type = 'filesize';\n } else if (field.type === \"Object\" || field.type === \"object\") {\n fs.type = Object;\n } else if (field.type === \"grid\" || field.type === \"table\") {\n fs.type = Array;\n fs.autoform.editable = true;\n fs.autoform.type = \"steedosGrid\";\n schema[field_name + \".$\"] = {\n type: Object\n };\n } else if (field.type === \"image\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'images',\n accept: 'image/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'images';\n fs.autoform.accept = 'image/*';\n }\n } else if (field.type === \"avatar\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'avatars',\n accept: 'image/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'avatars';\n fs.autoform.accept = 'image/*';\n }\n } else if (field.type === \"audio\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'audios',\n accept: 'audio/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'audios';\n fs.autoform.accept = 'audio/*';\n }\n } else if (field.type === \"video\") {\n if (field.multiple) {\n fs.type = [String];\n schema[field_name + \".$\"] = {\n autoform: {\n type: 'fileUpload',\n collection: 'videos',\n accept: 'video/*'\n }\n };\n } else {\n fs.type = String;\n fs.autoform.type = 'fileUpload';\n fs.autoform.collection = 'videos';\n fs.autoform.accept = 'video/*';\n }\n } else if (field.type === \"location\") {\n fs.type = Object;\n fs.autoform.type = \"location\";\n fs.autoform.system = field.system || \"wgs84\";\n fs.blackbox = true;\n } else if (field.type === \"markdown\") {\n fs.type = String;\n fs.autoform.type = \"text\";\n } else if (field.type === 'url') {\n fs.type = String;\n fs.autoform.type = 'steedosUrl';\n } else if (field.type === 'email') {\n fs.type = String;\n fs.regEx = SimpleSchema.RegEx.Email;\n fs.autoform.type = 'steedosEmail';\n } else if (field.type === 'autonumber') {\n fs.type = String;\n } else if (field.type === 'color') {\n fs.type = String;\n } else if (field.type === 'formula') {\n fs = Creator.getObjectSchema({\n fields: {\n field: Object.assign({}, field, {\n type: field.data_type\n })\n }\n })[field.name];\n } else if (field.type === 'summary') {\n fs = Creator.getObjectSchema({\n fields: {\n field: Object.assign({}, field, {\n type: field.data_type\n })\n }\n })[field.name];\n } else if (field.type === 'percent') {\n fs.type = Number;\n fs.autoform.type = \"steedosNumber\";\n fs.autoform.precision = field.precision || 18;\n if (!_.isNumber(field.scale)) {\n field.scale = 0;\n }\n fs.autoform.scale = field.scale + 2;\n fs.decimal = true;\n } else {\n fs.type = field.type;\n }\n if (field.label) {\n fs.label = field.label;\n }\n if (!field.required) {\n fs.optional = true;\n }\n if (!Meteor.isClient) {\n fs.optional = true;\n }\n if (field.unique) {\n fs.unique = true;\n }\n if (field.omit) {\n fs.autoform.omit = true;\n }\n if (field.group) {\n fs.autoform.group = field.group;\n }\n if (field.is_wide) {\n fs.autoform.is_wide = true;\n }\n if (field.hidden) {\n fs.autoform.type = \"hidden\";\n }\n if ((field.type === \"select\") || (field.type === \"lookup\") || (field.type === \"master_detail\")) {\n if (typeof field.filterable === 'undefined') {\n field.filterable = true;\n }\n }\n if (field.name === 'name' || field.is_name) {\n if (typeof field.searchable === 'undefined') {\n field.searchable = true;\n }\n }\n if (autoform_type) {\n fs.autoform.type = autoform_type;\n }\n if (field.defaultValue) {\n if (Meteor.isClient && Creator.Formular.checkFormula(field.defaultValue)) {\n fs.autoform.defaultValue = function() {\n return Creator.Formular.run(field.defaultValue, {\n userId: Meteor.userId(),\n spaceId: Session.get(\"spaceId\"),\n now: new Date()\n });\n };\n } else {\n fs.autoform.defaultValue = field.defaultValue;\n }\n }\n if (field.readonly) {\n fs.autoform.readonly = true;\n }\n if (field.disabled) {\n fs.autoform.disabled = true;\n }\n if (field.inlineHelpText) {\n fs.autoform.inlineHelpText = field.inlineHelpText;\n }\n if (field.blackbox) {\n fs.blackbox = true;\n }\n if (_.has(field, 'min')) {\n fs.min = field.min;\n }\n if (_.has(field, 'max')) {\n fs.max = field.max;\n }\n if (Meteor.isProduction) {\n if (field.index) {\n fs.index = field.index;\n } else if (field.sortable) {\n fs.index = true;\n }\n }\n return schema[field_name] = fs;\n });\n return schema;\n};\n\nCreator.getFieldDisplayValue = function(object_name, field_name, field_value) {\n var field, html, object;\n html = field_value;\n object = Creator.getObject(object_name);\n if (!object) {\n return \"\";\n }\n field = object.fields(field_name);\n if (!field) {\n return \"\";\n }\n if (field.type === \"datetime\") {\n html = moment(this.val).format('YYYY-MM-DD H:mm');\n } else if (field.type === \"date\") {\n html = moment(this.val).format('YYYY-MM-DD');\n }\n return html;\n};\n\nCreator.checkFieldTypeSupportBetweenQuery = function(field_type) {\n return [\"date\", \"datetime\", \"time\", \"currency\", \"number\"].includes(field_type);\n};\n\nCreator.pushBetweenBuiltinOptionals = function(field_type, operations) {\n var builtinValues;\n builtinValues = Creator.getBetweenBuiltinValues(field_type);\n if (builtinValues) {\n return _.forEach(builtinValues, function(builtinItem, key) {\n return operations.push({\n label: builtinItem.label,\n value: key\n });\n });\n }\n};\n\nCreator.getBetweenBuiltinValues = function(field_type, is_check_only) {\n if ([\"date\", \"datetime\"].includes(field_type)) {\n return Creator.getBetweenTimeBuiltinValues(is_check_only, field_type);\n }\n};\n\nCreator.getBetweenBuiltinValueItem = function(field_type, key) {\n if ([\"date\", \"datetime\"].includes(field_type)) {\n return Creator.getBetweenTimeBuiltinValueItem(field_type, key);\n }\n};\n\nCreator.getBetweenBuiltinOperation = function(field_type, value) {\n var betweenBuiltinValues, result;\n if (!_.isString(value)) {\n return;\n }\n betweenBuiltinValues = Creator.getBetweenBuiltinValues(field_type);\n if (!betweenBuiltinValues) {\n return;\n }\n result = null;\n _.each(betweenBuiltinValues, function(item, operation) {\n if (item.key === value) {\n return result = operation;\n }\n });\n return result;\n};\n\nCreator.getBetweenTimeBuiltinValues = function(is_check_only, field_type) {\n return {\n \"between_time_last_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_year\"),\n \"between_time_this_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_year\"),\n \"between_time_next_year\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_year\"),\n \"between_time_last_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_quarter\"),\n \"between_time_this_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_quarter\"),\n \"between_time_next_quarter\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_quarter\"),\n \"between_time_last_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_month\"),\n \"between_time_this_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_month\"),\n \"between_time_next_month\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_month\"),\n \"between_time_last_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_week\"),\n \"between_time_this_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"this_week\"),\n \"between_time_next_week\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_week\"),\n \"between_time_yestday\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"yestday\"),\n \"between_time_today\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"today\"),\n \"between_time_tomorrow\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"tomorrow\"),\n \"between_time_last_7_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_7_days\"),\n \"between_time_last_30_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_30_days\"),\n \"between_time_last_60_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_60_days\"),\n \"between_time_last_90_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_90_days\"),\n \"between_time_last_120_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"last_120_days\"),\n \"between_time_next_7_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_7_days\"),\n \"between_time_next_30_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_30_days\"),\n \"between_time_next_60_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_60_days\"),\n \"between_time_next_90_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_90_days\"),\n \"between_time_next_120_days\": is_check_only ? true : Creator.getBetweenTimeBuiltinValueItem(field_type, \"next_120_days\")\n };\n};\n\nCreator.getQuarterStartMonth = function(month) {\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n return 0;\n } else if (month < 6) {\n return 3;\n } else if (month < 9) {\n return 6;\n }\n return 9;\n};\n\nCreator.getLastQuarterFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n year--;\n month = 9;\n } else if (month < 6) {\n month = 0;\n } else if (month < 9) {\n month = 3;\n } else {\n month = 6;\n }\n return new Date(year, month, 1);\n};\n\nCreator.getNextQuarterFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month < 3) {\n month = 3;\n } else if (month < 6) {\n month = 6;\n } else if (month < 9) {\n month = 9;\n } else {\n year++;\n month = 0;\n }\n return new Date(year, month, 1);\n};\n\nCreator.getMonthDays = function(year, month) {\n var days, endDate, millisecond, startDate;\n if (month === 11) {\n return 31;\n }\n millisecond = 1000 * 60 * 60 * 24;\n startDate = new Date(year, month, 1);\n endDate = new Date(year, month + 1, 1);\n days = (endDate - startDate) / millisecond;\n return days;\n};\n\nCreator.getLastMonthFirstDay = function(year, month) {\n if (!year) {\n year = new Date().getFullYear();\n }\n if (!month) {\n month = new Date().getMonth();\n }\n if (month === 0) {\n month = 11;\n year--;\n return new Date(year, month, 1);\n }\n month--;\n return new Date(year, month, 1);\n};\n\nCreator.getBetweenTimeBuiltinValueItem = function(field_type, key) {\n var currentMonth, currentYear, endValue, firstDay, label, lastDay, lastMonday, lastMonthFinalDay, lastMonthFirstDay, lastQuarterEndDay, lastQuarterStartDay, lastSunday, last_120_days, last_30_days, last_60_days, last_7_days, last_90_days, millisecond, minusDay, monday, month, nextMonday, nextMonthFinalDay, nextMonthFirstDay, nextQuarterEndDay, nextQuarterStartDay, nextSunday, nextYear, next_120_days, next_30_days, next_60_days, next_7_days, next_90_days, now, previousYear, startValue, strEndDay, strFirstDay, strLastDay, strMonday, strStartDay, strSunday, strToday, strTomorrow, strYestday, sunday, thisQuarterEndDay, thisQuarterStartDay, tomorrow, values, week, year, yestday;\n now = new Date();\n millisecond = 1000 * 60 * 60 * 24;\n yestday = new Date(now.getTime() - millisecond);\n tomorrow = new Date(now.getTime() + millisecond);\n week = now.getDay();\n minusDay = week !== 0 ? week - 1 : 6;\n monday = new Date(now.getTime() - (minusDay * millisecond));\n sunday = new Date(monday.getTime() + (6 * millisecond));\n lastSunday = new Date(monday.getTime() - millisecond);\n lastMonday = new Date(lastSunday.getTime() - (millisecond * 6));\n nextMonday = new Date(sunday.getTime() + millisecond);\n nextSunday = new Date(nextMonday.getTime() + (millisecond * 6));\n currentYear = now.getFullYear();\n previousYear = currentYear - 1;\n nextYear = currentYear + 1;\n currentMonth = now.getMonth();\n year = now.getFullYear();\n month = now.getMonth();\n firstDay = new Date(currentYear, currentMonth, 1);\n if (currentMonth === 11) {\n year++;\n month++;\n } else {\n month++;\n }\n nextMonthFirstDay = new Date(year, month, 1);\n nextMonthFinalDay = new Date(year, month, Creator.getMonthDays(year, month));\n lastDay = new Date(nextMonthFirstDay.getTime() - millisecond);\n lastMonthFirstDay = Creator.getLastMonthFirstDay(currentYear, currentMonth);\n lastMonthFinalDay = new Date(firstDay.getTime() - millisecond);\n thisQuarterStartDay = new Date(currentYear, Creator.getQuarterStartMonth(currentMonth), 1);\n thisQuarterEndDay = new Date(currentYear, Creator.getQuarterStartMonth(currentMonth) + 2, Creator.getMonthDays(currentYear, Creator.getQuarterStartMonth(currentMonth) + 2));\n lastQuarterStartDay = Creator.getLastQuarterFirstDay(currentYear, currentMonth);\n lastQuarterEndDay = new Date(lastQuarterStartDay.getFullYear(), lastQuarterStartDay.getMonth() + 2, Creator.getMonthDays(lastQuarterStartDay.getFullYear(), lastQuarterStartDay.getMonth() + 2));\n nextQuarterStartDay = Creator.getNextQuarterFirstDay(currentYear, currentMonth);\n nextQuarterEndDay = new Date(nextQuarterStartDay.getFullYear(), nextQuarterStartDay.getMonth() + 2, Creator.getMonthDays(nextQuarterStartDay.getFullYear(), nextQuarterStartDay.getMonth() + 2));\n last_7_days = new Date(now.getTime() - (6 * millisecond));\n last_30_days = new Date(now.getTime() - (29 * millisecond));\n last_60_days = new Date(now.getTime() - (59 * millisecond));\n last_90_days = new Date(now.getTime() - (89 * millisecond));\n last_120_days = new Date(now.getTime() - (119 * millisecond));\n next_7_days = new Date(now.getTime() + (6 * millisecond));\n next_30_days = new Date(now.getTime() + (29 * millisecond));\n next_60_days = new Date(now.getTime() + (59 * millisecond));\n next_90_days = new Date(now.getTime() + (89 * millisecond));\n next_120_days = new Date(now.getTime() + (119 * millisecond));\n switch (key) {\n case \"last_year\":\n label = t(\"creator_filter_operation_between_last_year\");\n startValue = new Date(previousYear + \"-01-01T00:00:00Z\");\n endValue = new Date(previousYear + \"-12-31T23:59:59Z\");\n break;\n case \"this_year\":\n label = t(\"creator_filter_operation_between_this_year\");\n startValue = new Date(currentYear + \"-01-01T00:00:00Z\");\n endValue = new Date(currentYear + \"-12-31T23:59:59Z\");\n break;\n case \"next_year\":\n label = t(\"creator_filter_operation_between_next_year\");\n startValue = new Date(nextYear + \"-01-01T00:00:00Z\");\n endValue = new Date(nextYear + \"-12-31T23:59:59Z\");\n break;\n case \"last_quarter\":\n strFirstDay = moment(lastQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"this_quarter\":\n strFirstDay = moment(thisQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(thisQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"next_quarter\":\n strFirstDay = moment(nextQuarterStartDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(nextQuarterEndDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_quarter\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"last_month\":\n strFirstDay = moment(lastMonthFirstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastMonthFinalDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"this_month\":\n strFirstDay = moment(firstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(lastDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"next_month\":\n strFirstDay = moment(nextMonthFirstDay).format(\"YYYY-MM-DD\");\n strLastDay = moment(nextMonthFinalDay).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_month\");\n startValue = new Date(strFirstDay + \"T00:00:00Z\");\n endValue = new Date(strLastDay + \"T23:59:59Z\");\n break;\n case \"last_week\":\n strMonday = moment(lastMonday).format(\"YYYY-MM-DD\");\n strSunday = moment(lastSunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"this_week\":\n strMonday = moment(monday).format(\"YYYY-MM-DD\");\n strSunday = moment(sunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_this_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"next_week\":\n strMonday = moment(nextMonday).format(\"YYYY-MM-DD\");\n strSunday = moment(nextSunday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_week\");\n startValue = new Date(strMonday + \"T00:00:00Z\");\n endValue = new Date(strSunday + \"T23:59:59Z\");\n break;\n case \"yestday\":\n strYestday = moment(yestday).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_yestday\");\n startValue = new Date(strYestday + \"T00:00:00Z\");\n endValue = new Date(strYestday + \"T23:59:59Z\");\n break;\n case \"today\":\n strToday = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_today\");\n startValue = new Date(strToday + \"T00:00:00Z\");\n endValue = new Date(strToday + \"T23:59:59Z\");\n break;\n case \"tomorrow\":\n strTomorrow = moment(tomorrow).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_tomorrow\");\n startValue = new Date(strTomorrow + \"T00:00:00Z\");\n endValue = new Date(strTomorrow + \"T23:59:59Z\");\n break;\n case \"last_7_days\":\n strStartDay = moment(last_7_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_7_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_30_days\":\n strStartDay = moment(last_30_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_30_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_60_days\":\n strStartDay = moment(last_60_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_60_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_90_days\":\n strStartDay = moment(last_90_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_90_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"last_120_days\":\n strStartDay = moment(last_120_days).format(\"YYYY-MM-DD\");\n strEndDay = moment(now).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_last_120_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_7_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_7_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_7_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_30_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_30_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_30_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_60_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_60_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_60_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_90_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_90_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_90_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n break;\n case \"next_120_days\":\n strStartDay = moment(now).format(\"YYYY-MM-DD\");\n strEndDay = moment(next_120_days).format(\"YYYY-MM-DD\");\n label = t(\"creator_filter_operation_between_next_120_days\");\n startValue = new Date(strStartDay + \"T00:00:00Z\");\n endValue = new Date(strEndDay + \"T23:59:59Z\");\n }\n values = [startValue, endValue];\n if (field_type === \"datetime\") {\n _.forEach(values, function(fv) {\n if (fv) {\n return fv.setHours(fv.getHours() + fv.getTimezoneOffset() / 60);\n }\n });\n }\n return {\n label: label,\n key: key,\n values: values\n };\n};\n\nCreator.getFieldDefaultOperation = function(field_type) {\n if (field_type && Creator.checkFieldTypeSupportBetweenQuery(field_type)) {\n return 'between';\n } else if ([\"textarea\", \"text\", \"code\"].includes(field_type)) {\n return 'contains';\n } else {\n return \"=\";\n }\n};\n\nCreator.getFieldOperation = function(field_type) {\n var operations, optionals;\n optionals = {\n equal: {\n label: t(\"creator_filter_operation_equal\"),\n value: \"=\"\n },\n unequal: {\n label: t(\"creator_filter_operation_unequal\"),\n value: \"<>\"\n },\n less_than: {\n label: t(\"creator_filter_operation_less_than\"),\n value: \"<\"\n },\n greater_than: {\n label: t(\"creator_filter_operation_greater_than\"),\n value: \">\"\n },\n less_or_equal: {\n label: t(\"creator_filter_operation_less_or_equal\"),\n value: \"<=\"\n },\n greater_or_equal: {\n label: t(\"creator_filter_operation_greater_or_equal\"),\n value: \">=\"\n },\n contains: {\n label: t(\"creator_filter_operation_contains\"),\n value: \"contains\"\n },\n not_contain: {\n label: t(\"creator_filter_operation_does_not_contain\"),\n value: \"notcontains\"\n },\n starts_with: {\n label: t(\"creator_filter_operation_starts_with\"),\n value: \"startswith\"\n },\n between: {\n label: t(\"creator_filter_operation_between\"),\n value: \"between\"\n }\n };\n if (field_type === void 0) {\n return _.values(optionals);\n }\n operations = [];\n if (Creator.checkFieldTypeSupportBetweenQuery(field_type)) {\n operations.push(optionals.between);\n Creator.pushBetweenBuiltinOptionals(field_type, operations);\n } else if (field_type === \"text\" || field_type === \"textarea\" || field_type === \"html\" || field_type === \"code\") {\n operations.push(optionals.contains);\n } else if (field_type === \"lookup\" || field_type === \"master_detail\" || field_type === \"select\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"currency\" || field_type === \"number\") {\n operations.push(optionals.equal, optionals.unequal, optionals.less_than, optionals.greater_than, optionals.less_or_equal, optionals.greater_or_equal);\n } else if (field_type === \"boolean\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"checkbox\") {\n operations.push(optionals.equal, optionals.unequal);\n } else if (field_type === \"[text]\") {\n operations.push(optionals.equal, optionals.unequal);\n } else {\n operations.push(optionals.equal, optionals.unequal);\n }\n return operations;\n};\n\n\n/*\n 先按照有排序号的小的在前,大的在后\n 再将没有排序号的显示在\n */\n\nCreator.getObjectFieldsName = function(object_name) {\n var fields, fieldsArr, fieldsName, ref;\n fields = (ref = Creator.getObject(object_name)) != null ? ref.fields : void 0;\n fieldsArr = [];\n _.each(fields, function(field) {\n return fieldsArr.push({\n name: field.name,\n sort_no: field.sort_no\n });\n });\n fieldsName = [];\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field) {\n return fieldsName.push(field.name);\n });\n return fieldsName;\n};\n","Creator._trigger_hooks = {}\n\ninitTrigger = (object_name, trigger)->\n\ttry\n\t\tcollection = Creator.getCollection(object_name)\n\t\tif !trigger.todo\n\t\t\treturn\n\t\ttodoWrapper = ()->\n\t\t\t this.object_name = object_name\n\t\t\t return trigger.todo.apply(this, arguments)\n\t\tif trigger.when == \"before.insert\"\n\t\t\t return collection?.before?.insert(todoWrapper)\n\t\t else if trigger.when == \"before.update\"\n\t\t\t return collection?.before?.update(todoWrapper)\n\t\t else if trigger.when == \"before.remove\"\n\t\t\t return collection?.before?.remove(todoWrapper)\n\t\t else if trigger.when == \"after.insert\"\n\t\t\t return collection?.after?.insert(todoWrapper)\n\t\t else if trigger.when == \"after.update\"\n\t\t\t return collection?.after?.update(todoWrapper)\n\t\t else if trigger.when == \"after.remove\"\n\t\t\t return collection?.after?.remove(todoWrapper)\n\tcatch error\n\t\tconsole.error('initTrigger error', error)\n\ncleanTrigger = (object_name)->\n\t###\n \t由于collection-hooks package 的remove函数是使用下标删除对象的,所以此处反转hooks集合后,再删除\n \t因为一个数组元素删除后,其他元素的下标会发生变化\n\t###\n #TODO 由于collection-hooks package 的remove函数bug\n\tCreator._trigger_hooks[object_name]?.reverse().forEach (_hook)->\n\t\t_hook.remove()\n\nCreator.initTriggers = (object_name)->\n#\tconsole.log('Creator.initTriggers object_name', object_name)\n\tobj = Creator.getObject(object_name)\n\n\tcleanTrigger(object_name)\n\n\tCreator._trigger_hooks[object_name] = []\n\n\t_.each obj.triggers, (trigger, trigger_name)->\n\t\tif Meteor.isServer and trigger.on == \"server\" and trigger.todo and trigger.when\n\t\t\t_trigger_hook = initTrigger object_name, trigger\n\t\t\tif _trigger_hook\n\t\t\t\tCreator._trigger_hooks[object_name].push(_trigger_hook)\n\t\tif Meteor.isClient and trigger.on == \"client\" and trigger.todo and trigger.when\n\t\t\t_trigger_hook = initTrigger object_name, trigger\n\t\t\tCreator._trigger_hooks[object_name].push(_trigger_hook)","var cleanTrigger, initTrigger;\n\nCreator._trigger_hooks = {};\n\ninitTrigger = function(object_name, trigger) {\n var collection, error, ref, ref1, ref2, ref3, ref4, ref5, todoWrapper;\n try {\n collection = Creator.getCollection(object_name);\n if (!trigger.todo) {\n return;\n }\n todoWrapper = function() {\n this.object_name = object_name;\n return trigger.todo.apply(this, arguments);\n };\n if (trigger.when === \"before.insert\") {\n return collection != null ? (ref = collection.before) != null ? ref.insert(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"before.update\") {\n return collection != null ? (ref1 = collection.before) != null ? ref1.update(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"before.remove\") {\n return collection != null ? (ref2 = collection.before) != null ? ref2.remove(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.insert\") {\n return collection != null ? (ref3 = collection.after) != null ? ref3.insert(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.update\") {\n return collection != null ? (ref4 = collection.after) != null ? ref4.update(todoWrapper) : void 0 : void 0;\n } else if (trigger.when === \"after.remove\") {\n return collection != null ? (ref5 = collection.after) != null ? ref5.remove(todoWrapper) : void 0 : void 0;\n }\n } catch (error1) {\n error = error1;\n return console.error('initTrigger error', error);\n }\n};\n\ncleanTrigger = function(object_name) {\n\n /*\n \t由于collection-hooks package 的remove函数是使用下标删除对象的,所以此处反转hooks集合后,再删除\n \t因为一个数组元素删除后,其他元素的下标会发生变化\n */\n var ref;\n return (ref = Creator._trigger_hooks[object_name]) != null ? ref.reverse().forEach(function(_hook) {\n return _hook.remove();\n }) : void 0;\n};\n\nCreator.initTriggers = function(object_name) {\n var obj;\n obj = Creator.getObject(object_name);\n cleanTrigger(object_name);\n Creator._trigger_hooks[object_name] = [];\n return _.each(obj.triggers, function(trigger, trigger_name) {\n var _trigger_hook;\n if (Meteor.isServer && trigger.on === \"server\" && trigger.todo && trigger.when) {\n _trigger_hook = initTrigger(object_name, trigger);\n if (_trigger_hook) {\n Creator._trigger_hooks[object_name].push(_trigger_hook);\n }\n }\n if (Meteor.isClient && trigger.on === \"client\" && trigger.todo && trigger.when) {\n _trigger_hook = initTrigger(object_name, trigger);\n return Creator._trigger_hooks[object_name].push(_trigger_hook);\n }\n });\n};\n","clone = require('clone')\n\nbaseBooleanPermissionPropNames = [\"allowCreate\", \"allowDelete\", \"allowEdit\", \"allowRead\", \"modifyAllRecords\", \"viewAllRecords\", \"modifyCompanyRecords\", \"viewCompanyRecords\", \n\t\"allowReadFiles\", \"allowEditFiles\", \"allowCreateFiles\", \"allowDeleteFiles\", \"viewAllFiles\", \"modifyAllFiles\"] \notherPermissionPropNames = [\"disabled_list_views\", \"disabled_actions\", \"unreadable_fields\", \"uneditable_fields\", \"unrelated_objects\", \"uneditable_related_list\"]\npermissionPropNames = _.union baseBooleanPermissionPropNames, otherPermissionPropNames\n\nCreator.getPermissions = (object_name, spaceId, userId)->\n\tif Meteor.isClient\n\t\tif !object_name\n\t\t\tobject_name = Session.get(\"object_name\")\n\t\tobj = Creator.getObject(object_name)\n\t\tif !obj\n\t\t\treturn\n\t\treturn obj.permissions.get()\n\telse if Meteor.isServer\n\t\tCreator.getObjectPermissions(spaceId, userId, object_name)\n\nCreator.getRecordPermissions = (object_name, record, userId, spaceId)->\n\tif !object_name and Meteor.isClient\n\t\tobject_name = Session.get(\"object_name\")\n\n\tif !spaceId and Meteor.isClient\n\t\tspaceId = Session.get(\"spaceId\")\n\t\n\t# 附件权限不再与其父记录编辑配置关联\n\t# if record and object_name == \"cms_files\" and Meteor.isClient\n\t# \t# 如果是cms_files附件,则权限取其父记录权限\n\t# \tif object_name == Session.get('object_name')\n\t# \t\t# 当前处于cms_files附件详细界面\n\t# \t\tobject_name = record.parent['reference_to._o'];\n\t# \t\trecord_id = record.parent._id;\n\t# \telse \n\t# \t\t# 当前处于cms_files附件的父记录界面\n\t# \t\tobject_name = Session.get('object_name');\n\t# \t\trecord_id = Session.get(\"record_id\");\n\t# \tobject_fields_keys = _.keys(Creator.getObject(object_name, spaceId)?.fields or {}) || [];\n\t# \tselect = _.intersection(object_fields_keys, ['owner', 'company_id', 'company_ids', 'locked']) || [];\n\t# \tif select.length > 0\n\t# \t\trecord = Creator.getObjectRecord(object_name, record_id, select.join(','));\n\t# \telse\n\t# \t\trecord = null;\n\n\tpermissions = _.clone(Creator.getPermissions(object_name, spaceId, userId))\n\n\tif record\n\t\tif !_.isEmpty(record.record_permissions)\n\t\t\treturn record.record_permissions\n\n\t\tisOwner = record.owner == userId || record.owner?._id == userId\n\n\t\tif object_name == \"cms_files\"\n\t\t\t# 附件的查看所有修改所有权限与附件对象的viewAllRecords、modifyAllRecords无关,只与其主表记录的viewAllFiles和modifyAllFiles有关\n\t\t\t# 如果是cms_files附件,则权限需要额外考虑其父对象上关于附件的权限配置\n\t\t\tmasterObjectName = record.parent['reference_to._o'];\n\t\t\tmasterRecordPerm = Creator.getPermissions(masterObjectName, spaceId, userId)\n\t\t\tpermissions.allowCreate = permissions.allowCreate && masterRecordPerm.allowCreateFiles\n\t\t\tpermissions.allowEdit = permissions.allowEdit && masterRecordPerm.allowEditFiles\n\t\t\tpermissions.allowDelete = permissions.allowDelete && masterRecordPerm.allowDeleteFiles\n\t\t\tif !masterRecordPerm.modifyAllFiles and !isOwner\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\t\t\tpermissions.allowRead = permissions.allowRead && masterRecordPerm.allowReadFiles\n\t\t\tif !masterRecordPerm.viewAllFiles and !isOwner\n\t\t\t\tpermissions.allowRead = false\n\t\telse\n\t\t\tif Meteor.isClient\n\t\t\t\tuser_company_ids = Steedos.getUserCompanyIds()\n\t\t\telse\n\t\t\t\tuser_company_ids = Creator.getUserCompanyIds(userId, spaceId)\n\t\t\trecord_company_id = record?.company_id\n\t\t\tif record_company_id and _.isObject(record_company_id) and record_company_id._id\n\t\t\t\t# 因record_company_id是lookup类型,有可能dx控件会把它映射转为对应的object,所以这里取出其_id值\n\t\t\t\trecord_company_id = record_company_id._id\n\t\t\trecord_company_ids = record?.company_ids\n\t\t\tif record_company_ids and record_company_ids.length and _.isObject(record_company_ids[0])\n\t\t\t\t# 因record_company_ids是lookup类型,有可能dx控件会把它映射转为对应的[object],所以这里取出其_id值\n\t\t\t\trecord_company_ids = record_company_ids.map((n)-> n._id)\n\t\t\trecord_company_ids = _.union(record_company_ids, [record_company_id])\n\t\t\tif !permissions.modifyAllRecords and !isOwner and !permissions.modifyCompanyRecords\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\t\t\telse if !permissions.modifyAllRecords and permissions.modifyCompanyRecords\n\t\t\t\tif record_company_ids and record_company_ids.length\n\t\t\t\t\tif user_company_ids and user_company_ids.length\n\t\t\t\t\t\tif !_.intersection(user_company_ids, record_company_ids).length\n\t\t\t\t\t\t\t# 记录的company_id/company_ids属性不在当前用户user_company_ids范围内时,认为无权修改\n\t\t\t\t\t\t\tpermissions.allowEdit = false\n\t\t\t\t\t\t\tpermissions.allowDelete = false\n\t\t\t\t\telse\n\t\t\t\t\t\t# 记录有company_id/company_ids属性,但是当前用户user_company_ids为空时,认为无权修改\n\t\t\t\t\t\tpermissions.allowEdit = false\n\t\t\t\t\t\tpermissions.allowDelete = false\n\t\t\t\n\t\t\tif record.locked and !permissions.modifyAllRecords\n\t\t\t\tpermissions.allowEdit = false\n\t\t\t\tpermissions.allowDelete = false\n\n\t\t\tif !permissions.viewAllRecords and !isOwner and !permissions.viewCompanyRecords\n\t\t\t\tpermissions.allowRead = false\n\t\t\telse if !permissions.viewAllRecords and permissions.viewCompanyRecords\n\t\t\t\tif record_company_ids and record_company_ids.length\n\t\t\t\t\tif user_company_ids and user_company_ids.length\n\t\t\t\t\t\tif !_.intersection(user_company_ids, record_company_ids).length\n\t\t\t\t\t\t\t# 记录的company_id/company_ids属性不在当前用户user_company_ids范围内时,认为无权查看\n\t\t\t\t\t\t\tpermissions.allowRead = false\n\t\t\t\t\telse\n\t\t\t\t\t\t# 记录有company_id属性,但是当前用户user_company_ids为空时,认为无权查看\n\t\t\t\t\t\tpermissions.allowRead = false\n\t\n\treturn permissions\n\n\n# currentObjectName:当前主对象\n# relatedListItem:Creator.getRelatedList(Session.get(\"object_name\"), Session.get(\"record_id\"))中取related_object_name对应的值\n# currentRecord当前主对象的详细记录\nif Meteor.isClient\n\tCreator.getRecordRelatedListPermissions = (currentObjectName, relatedListItem, currentRecord, userId, spaceId)->\n\t\tif !currentObjectName and Meteor.isClient\n\t\t\tcurrentObjectName = Session.get(\"object_name\")\n\n\t\tif !relatedListItem\n\t\t\tconsole.error(\"relatedListItem must not be empty for the function Creator.getRecordRelatedListPermissions\");\n\t\t\treturn {}\n\n\t\tif !currentRecord and Meteor.isClient\n\t\t\tcurrentRecord = Creator.getObjectRecord()\n\n\t\tif !userId and Meteor.isClient\n\t\t\tuserId = Meteor.userId()\n\n\t\tif !spaceId and Meteor.isClient\n\t\t\tspaceId = Session.get(\"spaceId\")\n\n\t\tmasterRecordPerm = Creator.getRecordPermissions(currentObjectName, currentRecord, userId, spaceId)\n\t\trelatedObjectPermissions = Creator.getPermissions(relatedListItem.object_name)\n\t\tresult = _.clone relatedObjectPermissions\n\n\t\tif relatedListItem.is_file\n\t\t\tresult.allowCreate = relatedObjectPermissions.allowCreate && masterRecordPerm.allowCreateFiles\n\t\t\tresult.allowEdit = relatedObjectPermissions.allowEdit && masterRecordPerm.allowEditFiles\n\t\telse\n\t\t\twrite_requires_master_read = relatedListItem.write_requires_master_read || false\n\t\t\tmasterAllow = false\n\t\t\tif write_requires_master_read == true\n\t\t\t\tmasterAllow = masterRecordPerm.allowRead\n\t\t\telse if write_requires_master_read == false\n\t\t\t\tmasterAllow = masterRecordPerm.allowEdit\n\n\t\t\tuneditable_related_list = Creator.getRecordSafeRelatedList(currentRecord, currentObjectName)\n\t\t\tisRelateObjectUneditable = uneditable_related_list.indexOf(relatedListItem.object_name) > -1\n\n\t\t\tresult.allowCreate = masterAllow && relatedObjectPermissions.allowCreate && !isRelateObjectUneditable\n\t\t\tresult.allowEdit = masterAllow && relatedObjectPermissions.allowEdit && !isRelateObjectUneditable\n\t\treturn result\n\nif Meteor.isServer\n\n\tCreator.getAllPermissions = (spaceId, userId) ->\n\t\tpermissions =\n\t\t\tobjects: {}\n\t\t\tassigned_apps: []\n\t\t###\n\t\t权限集说明:\n\t\t内置权限集-admin,user,member,guest,workflow_admin,organization_admin\n\t\t自定义权限集-数据库中新建的除内置权限集以外的其他权限集\n\t\t特定用户集合权限集(即users属性不可配置)-admin,user,member,guest\n\t\t可配置用户集合权限集(即users属性可配置)-workflow_admin,organization_admin以及自定义权限集\n\t\t###\n\n\t\tisSpaceAdmin = false\n\t\tspaceUser = null\n\t\tif userId\n\t\t\tisSpaceAdmin = Creator.isSpaceAdmin(spaceId, userId)\n\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\n\t\tpsetsAdmin = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsUser = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsMember = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsGuest = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1, assigned_apps:1}}) || null\n\n\t\tpsetsSupplier = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tpsetsCustomer = Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1, assigned_apps:1}}) || null\n\t\tif spaceUser && spaceUser.profile\n\t\t\tpsetsCurrent = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\telse\n\t\t\tpsetsCurrent = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\n\t\tpsetsAdmin_pos = null\n\t\tpsetsUser_pos = null\n\t\tpsetsMember_pos = null\n\t\tpsetsGuest_pos = null\n\t\tpsetsCurrent_pos = null\n\t\tpsetsSupplier_pos = null\n\t\tpsetsCustomer_pos = null\n\n\t\tif psetsAdmin?._id\n\t\t\tpsetsAdmin_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsAdmin._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsUser?._id\n\t\t\tpsetsUser_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsUser._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsMember?._id\n\t\t\tpsetsMember_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsMember._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsGuest?._id\n\t\t\tpsetsGuest_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsGuest._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsSupplier?._id\n\t\t\tpsetsSupplier_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsSupplier._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\t\tif psetsCustomer?._id\n\t\t\tpsetsCustomer_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: psetsCustomer._id}, {fields: {created: 0, modified: 0, created_by: 0, modified_by: 0}}).fetch()\n\n\t\tif psetsCurrent.length > 0\n\t\t\tset_ids = _.pluck psetsCurrent, \"_id\"\n\t\t\tpsetsCurrent_pos = Creator.getCollection(\"permission_objects\").find({permission_set_id: {$in: set_ids}}).fetch()\n\t\t\tpsetsCurrentNames = _.pluck psetsCurrent, \"name\"\n\t\tpsets = {\n\t\t\tpsetsAdmin, \n\t\t\tpsetsUser, \n\t\t\tpsetsCurrent, \n\t\t\tpsetsMember, \n\t\t\tpsetsGuest,\n\t\t\tpsetsSupplier,\n\t\t\tpsetsCustomer,\n\t\t\tisSpaceAdmin,\n\t\t\tspaceUser, \n\t\t\tpsetsAdmin_pos, \n\t\t\tpsetsUser_pos, \n\t\t\tpsetsMember_pos, \n\t\t\tpsetsGuest_pos,\n\t\t\tpsetsSupplier_pos,\n\t\t\tpsetsCustomer_pos,\n\t\t\tpsetsCurrent_pos\n\t\t}\n\t\tpermissions.assigned_apps = Creator.getAssignedApps.bind(psets)(spaceId, userId)\n\t\tpermissions.assigned_menus = Creator.getAssignedMenus.bind(psets)(spaceId, userId)\n\t\tpermissions.user_permission_sets = psetsCurrentNames\n\t\t_i = 0\n\t\t_.each Creator.objectsByName, (object, object_name)->\n\t\t\t_i++\n\t\t\tif !_.has(object, 'space') || !object.space || object.space == spaceId\n\t\t\t\tif !_.has(object, 'in_development') || object.in_development == '0' || (object.in_development != '0' && isSpaceAdmin)\n\t\t\t\t\tpermissions.objects[object_name] = Creator.convertObject(clone(Creator.Objects[object_name]), spaceId)\n\t\t\t\t\tpermissions.objects[object_name][\"permissions\"] = Creator.getObjectPermissions.bind(psets)(spaceId, userId, object_name)\n\t\treturn permissions\n\n\tunionPlus = (array, other) ->\n\t\tif !array and !other\n\t\t\treturn undefined\n\t\tif !array\n\t\t\tarray = []\n\t\tif !other\n\t\t\tother = []\n\t\treturn _.union(array, other)\n\n\tintersectionPlus = (array, other) ->\n\t\tif !array and !other\n\t\t\treturn undefined\n\t\tif !array\n\t\t\tarray = []\n\t\tif !other\n\t\t\tother = []\n\t\treturn _.intersection(array, other)\n\n\textendPermissionProps = (target, props) ->\n\t\tpropNames = permissionPropNames\n\t\tfilesProNames = \n\t\tif props\n\t\t\t_.each propNames, (propName) ->\n\t\t\t\ttarget[propName] = props[propName]\n\n\t\t\t# target.allowCreate = props.allowCreate\n\t\t\t# target.allowDelete = props.allowDelete\n\t\t\t# target.allowEdit = props.allowEdit\n\t\t\t# target.allowRead = props.allowRead\n\t\t\t# target.modifyAllRecords = props.modifyAllRecords\n\t\t\t# target.viewAllRecords = props.viewAllRecords\n\t\t\t# target.modifyCompanyRecords = props.modifyCompanyRecords\n\t\t\t# target.viewCompanyRecords = props.viewCompanyRecords\n\t\t\t# target.disabled_list_views = props.disabled_list_views\n\t\t\t# target.disabled_actions = props.disabled_actions\n\t\t\t# target.unreadable_fields = props.unreadable_fields\n\t\t\t# target.uneditable_fields = props.uneditable_fields\n\t\t\t# target.unrelated_objects = props.unrelated_objects\n\t\t\t# target.uneditable_related_list = props.uneditable_related_list\n\n\toverlayBaseBooleanPermissionProps = (target, props) ->\n\t\tpropNames = baseBooleanPermissionPropNames\n\t\t_.each propNames, (propName) ->\n\t\t\tif props[propName]\n\t\t\t\ttarget[propName] = true\n\t\t\n\t\t# if po.allowRead\n\t\t# \tpermissions.allowRead = true\n\t\t# if po.allowCreate\n\t\t# \tpermissions.allowCreate = true\n\t\t# if po.allowEdit\n\t\t# \tpermissions.allowEdit = true\n\t\t# if po.allowDelete\n\t\t# \tpermissions.allowDelete = true\n\t\t# if po.modifyAllRecords\n\t\t# \tpermissions.modifyAllRecords = true\n\t\t# if po.viewAllRecords\n\t\t# \tpermissions.viewAllRecords = true\n\t\t# if po.modifyCompanyRecords\n\t\t# \tpermissions.modifyCompanyRecords = true\n\t\t# if po.viewCompanyRecords\n\t\t# \tpermissions.viewCompanyRecords = true\n\n\n\tCreator.getAssignedApps = (spaceId, userId)->\n\t\tpsetsAdmin = this.psetsAdmin || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsUser = this.psetsUser || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsSupplier = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1, assigned_apps:1}})\n\t\tpsetsCustomer = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1, assigned_apps:1}})\n\t\t# psetsMember = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1, assigned_apps:1}})\n\t\t# psetsGuest = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1, assigned_apps:1}})\n\t\tspaceUser = null;\n\t\tif userId\n\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\tif spaceUser && spaceUser.profile\n\t\t\tpsets = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\telse\n\t\t\tpsets = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\t\tapps = []\n\t\tif isSpaceAdmin\n\t\t\treturn []\n\t\telse\n\t\t\tuserProfile = Creator.getCollection(\"space_users\").findOne({space: spaceId, user: userId}, {fields: {profile: 1}})?.profile\n\t\t\tpsetBase = psetsUser\n\t\t\tif userProfile\n\t\t\t\tif userProfile == 'supplier'\n\t\t\t\t\tpsetBase = psetsSupplier\n\t\t\t\telse if userProfile == 'customer'\n\t\t\t\t\tpsetBase = psetsCustomer\n\t\t\tif psetBase?.assigned_apps?.length\n\t\t\t\tapps = _.union apps, psetBase.assigned_apps\n\t\t\telse\n\t\t\t\t# user权限集中的assigned_apps表示所有用户具有的apps权限,为空则表示有所有apps权限,不需要作权限判断了\n\t\t\t\treturn []\n\t\t\t_.each psets, (pset)->\n\t\t\t\tif !pset.assigned_apps\n\t\t\t\t\treturn\n\t\t\t\tif pset.name == \"admin\" || pset.name == \"user\" || pset.name == 'supplier' || pset.name == 'customer'\n\t\t\t\t\t# 这里之所以要排除admin/user,是因为这两个权限集是所有权限集中users属性无效的权限集,特指工作区管理员和所有用户\n\t\t\t\t\treturn\n\t\t\t\tapps = _.union apps, pset.assigned_apps\n\t\t\treturn _.without(_.uniq(apps),undefined,null)\n\n\tCreator.getAssignedMenus = (spaceId, userId)->\n\t\tpsets = this.psetsCurrent || Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\t\tadminMenus = Creator.Apps.admin?.admin_menus\n\t\t# 如果没有admin菜单说明不需要相关功能,直接返回空\n\t\tunless adminMenus\n\t\t\treturn []\n\t\taboutMenu = adminMenus.find (n) ->\n\t\t\tn._id == 'about'\n\t\tadminMenus = adminMenus.filter (n) ->\n\t\t\tn._id != 'about'\n\t\totherMenuApps = _.sortBy _.filter(_.values(Creator.Apps), (n) ->\n\t\t\treturn n.admin_menus and n._id != 'admin'\n\t\t), 'sort'\n\t\totherMenus = _.flatten(_.pluck(otherMenuApps, \"admin_menus\"))\n\t\t# 菜单有三部分组成,设置APP菜单、其他APP菜单以及about菜单\n\t\tallMenus = _.union(adminMenus, otherMenus, [aboutMenu])\n\t\tif isSpaceAdmin\n\t\t\t# 工作区管理员有全部菜单功能\n\t\t\tresult = allMenus\n\t\telse\n\t\t\tuserProfile = Creator.getCollection(\"space_users\").findOne({space: spaceId, user: userId}, {fields: {profile: 1}})?.profile || 'user'\n\t\t\tcurrentPsetNames = psets.map (n) ->\n\t\t\t\treturn n.name\n\t\t\tmenus = allMenus.filter (menu)->\n\t\t\t\tpsetsMenu = menu.permission_sets\n\t\t\t\t# 如果普通用户有权限,则直接返回true\n\t\t\t\tif psetsMenu && psetsMenu.indexOf(userProfile) > -1\n\t\t\t\t\treturn true\n\t\t\t\t# 否则取当前用户的权限集与menu菜单要求的权限集对比,如果交集大于1个则返回true\n\t\t\t\treturn _.intersection(currentPsetNames, psetsMenu).length\n\t\t\tresult = menus\n\t\t\n\t\treturn _.sortBy(result,\"sort\")\n\n\tfindOne_permission_object = (permission_objects, object_name, permission_set_id)->\n\n\t\tif _.isNull(permission_objects)\n\t\t\treturn null\n\t\tif _.isArray(permission_objects)\n\t\t\treturn _.find permission_objects, (po)->\n\t\t\t\t\treturn po.object_name == object_name\n\t\treturn Creator.getCollection(\"permission_objects\").findOne({object_name: object_name, permission_set_id: permission_set_id})\n\n\tfind_permission_object = (permission_objects, object_name, permission_set_ids)->\n\t\tif _.isNull(permission_objects)\n\t\t\treturn null\n\t\tif _.isArray(permission_objects)\n\t\t\treturn _.filter permission_objects, (po)->\n\t\t\t\treturn po.object_name == object_name\n\t\tCreator.getCollection(\"permission_objects\").find({object_name: object_name, permission_set_id: {$in: permission_set_ids}}).fetch()\n\n\tunionPermissionObjects = (pos, object, psets)->\n\t\t# 把db及yml中的permission_objects合并,优先取db中的\n\t\tresult = []\n\t\t_.each object.permission_set, (ops, ops_key)->\n\t\t\t# 把yml中除了特定用户集合权限集\"admin\", \"user\", \"member\", \"guest\"外的其他对象权限先存入result\n\t\t\t# if [\"admin\", \"user\", \"member\", \"guest\", \"workflow_admin\", \"organization_admin\"].indexOf(ops_key) < 0\n\t\t\tif [\"admin\", \"user\", \"member\", \"guest\"].indexOf(ops_key) < 0\n\t\t\t\tcurrentPset = psets.find (pset)-> return pset.name == ops_key\n\t\t\t\tif currentPset\n\t\t\t\t\ttempOps = _.clone(ops) || {}\n\t\t\t\t\ttempOps.permission_set_id = currentPset._id\n\t\t\t\t\ttempOps.object_name = object.object_name\n\t\t\t\t\tresult.push tempOps\n\t\tif result.length\n\t\t\tpos.forEach (po)->\n\t\t\t\trepeatIndex = 0\n\t\t\t\trepeatPo = result.find((item, index)-> repeatIndex = index;return item.permission_set_id == po.permission_set_id)\n\t\t\t\t# 如果yml中已经存在po,则替换为数据库中的po,反之则把数据库中的po直接累加进去\n\t\t\t\tif repeatPo\n\t\t\t\t\tresult[repeatIndex] = po\n\t\t\t\telse\n\t\t\t\t\tresult.push po\n\t\t\treturn result\n\t\telse\n\t\t\treturn pos\n\n\tCreator.getObjectPermissions = (spaceId, userId, object_name)->\n\t\tpermissions = {}\n\t\tobject = Creator.getObject(object_name, spaceId)\n\n\t\tif spaceId is 'guest' || object_name == \"users\"\n\t\t\tpermissions = _.clone(object.permission_set.guest) || {}\n\t\t\tCreator.processPermissions permissions\n\t\t\treturn permissions\n\t\tpsetsAdmin = if _.isNull(this.psetsAdmin) or this.psetsAdmin then this.psetsAdmin else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'admin'}, {fields:{_id:1}})\n\t\tpsetsUser = if _.isNull(this.psetsUser) or this.psetsUser then this.psetsUser else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'user'}, {fields:{_id:1}})\n\t\tpsetsMember = if _.isNull(this.psetsMember) or this.psetsMember then this.psetsMember else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'member'}, {fields:{_id:1}})\n\t\tpsetsGuest = if _.isNull(this.psetsGuest) or this.psetsGuest then this.psetsGuest else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'guest'}, {fields:{_id:1}})\n\n\t\tpsetsSupplier = if _.isNull(this.psetsSupplier) or this.psetsSupplier then this.psetsSupplier else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'supplier'}, {fields:{_id:1}})\n\t\tpsetsCustomer = if _.isNull(this.psetsCustomer) or this.psetsCustomer then this.psetsCustomer else Creator.getCollection(\"permission_set\").findOne({space: spaceId, name: 'customer'}, {fields:{_id:1}})\n\t\tpsets = this.psetsCurrent;\n\t\tif !psets\n\t\t\tspaceUser = null;\n\t\t\tif userId\n\t\t\t\tspaceUser = Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\t\tif spaceUser && spaceUser.profile\n\t\t\t\tpsets = Creator.getCollection(\"permission_set\").find({space: spaceId, $or: [{users: userId}, {name: spaceUser.profile}]}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\t\telse\n\t\t\t\tpsets = Creator.getCollection(\"permission_set\").find({users: userId, space: spaceId}, {fields:{_id:1, assigned_apps:1, name:1}}).fetch()\n\t\tisSpaceAdmin = if _.isBoolean(this.isSpaceAdmin) then this.isSpaceAdmin else Creator.isSpaceAdmin(spaceId, userId)\n\n\t\tpsetsAdmin_pos = this.psetsAdmin_pos\n\t\tpsetsUser_pos = this.psetsUser_pos\n\t\tpsetsMember_pos = this.psetsMember_pos\n\t\tpsetsGuest_pos = this.psetsGuest_pos\n\n\t\tpsetsSupplier_pos = this.psetsSupplier_pos\n\t\tpsetsCustomer_pos = this.psetsCustomer_pos\n\n\t\tpsetsCurrent_pos = this.psetsCurrent_pos\n\n\t\topsetAdmin = _.clone(object.permission_set.admin) || {}\n\t\topsetUser = _.clone(object.permission_set.user) || {}\n\t\topsetMember = _.clone(object.permission_set.member) || {}\n\t\topsetGuest = _.clone(object.permission_set.guest) || {}\n\n\t\topsetSupplier = _.clone(object.permission_set.supplier) || {}\n\t\topsetCustomer = _.clone(object.permission_set.customer) || {}\n\n\t\t# sharedListViews = Creator.getCollection('object_listviews').find({space: spaceId, object_name: object_name, shared: true}, {fields:{_id:1}}).fetch()\n\t\t# sharedListViews = _.pluck(sharedListViews,\"_id\")\n\t\t# if sharedListViews.length\n\t\t# \tunless opsetAdmin.list_views\n\t\t# \t\topsetAdmin.list_views = []\n\t\t# \topsetAdmin.list_views = _.union opsetAdmin.list_views, sharedListViews\n\t\t# \tunless opsetUser.list_views\n\t\t# \t\topsetUser.list_views = []\n\t\t# \topsetUser.list_views = _.union opsetUser.list_views, sharedListViews\n\t\t# 数据库中如果配置了默认的admin/user权限集设置,应该覆盖代码中admin/user的权限集设置\n\t\tif psetsAdmin\n\t\t\tposAdmin = findOne_permission_object(psetsAdmin_pos, object_name, psetsAdmin._id)\n\t\t\textendPermissionProps opsetAdmin, posAdmin\n\t\tif psetsUser\n\t\t\tposUser = findOne_permission_object(psetsUser_pos, object_name, psetsUser._id)\n\t\t\textendPermissionProps opsetUser, posUser\n\t\tif psetsMember\n\t\t\tposMember = findOne_permission_object(psetsMember_pos, object_name, psetsMember._id)\n\t\t\textendPermissionProps opsetMember, posMember\n\t\tif psetsGuest\n\t\t\tposGuest = findOne_permission_object(psetsGuest_pos, object_name, psetsGuest._id)\n\t\t\textendPermissionProps opsetGuest, posGuest\n\t\tif psetsSupplier\n\t\t\tposSupplier = findOne_permission_object(psetsSupplier_pos, object_name, psetsSupplier._id);\n\t\t\textendPermissionProps opsetSupplier, posSupplier\n\t\tif psetsCustomer\n\t\t\tposCustomer = findOne_permission_object(psetsCustomer_pos, object_name, psetsCustomer._id);\n\t\t\textendPermissionProps opsetCustomer, posCustomer\n\n\t\tif !userId\n\t\t\tpermissions = opsetAdmin\n\t\telse\n\t\t\tif isSpaceAdmin\n\t\t\t\tpermissions = opsetAdmin\n\t\t\telse\n\t\t\t\tif spaceId is 'common'\n\t\t\t\t\tpermissions = opsetUser\n\t\t\t\telse\n\t\t\t\t\tspaceUser = if _.isNull(this.spaceUser) or this.spaceUser then this.spaceUser else Creator.getCollection(\"space_users\").findOne({ space: spaceId, user: userId }, { fields: { profile: 1 } })\n\t\t\t\t\tif spaceUser\n\t\t\t\t\t\tprof = spaceUser.profile\n\t\t\t\t\t\tif prof\n\t\t\t\t\t\t\tif prof is 'user'\n\t\t\t\t\t\t\t\tpermissions = opsetUser\n\t\t\t\t\t\t\telse if prof is 'member'\n\t\t\t\t\t\t\t\tpermissions = opsetMember\n\t\t\t\t\t\t\telse if prof is 'guest'\n\t\t\t\t\t\t\t\tpermissions = opsetGuest\n\t\t\t\t\t\t\telse if prof is 'supplier'\n\t\t\t\t\t\t\t\tpermissions = opsetSupplier\n\t\t\t\t\t\t\telse if prof is 'customer'\n\t\t\t\t\t\t\t\tpermissions = opsetCustomer\n\t\t\t\t\t\telse # 没有profile则认为是user权限\n\t\t\t\t\t\t\tpermissions = opsetUser\n\t\t\t\t\telse\n\t\t\t\t\t\tpermissions = opsetGuest\n\t\tif psets.length > 0\n\t\t\tset_ids = _.pluck psets, \"_id\"\n\t\t\tpos = find_permission_object(psetsCurrent_pos, object_name, set_ids)\n\t\t\tpos = unionPermissionObjects(pos, object, psets)\n\t\t\t_.each pos, (po)->\n\t\t\t\tif po.permission_set_id == psetsAdmin?._id or \n\t\t\t\tpo.permission_set_id == psetsUser?._id or \n\t\t\t\tpo.permission_set_id == psetsMember?._id or \n\t\t\t\tpo.permission_set_id == psetsGuest?._id or\n\t\t\t\tpo.permission_set_id == psetsSupplier?._id or\n\t\t\t\tpo.permission_set_id == psetsCustomer?._id\n\t\t\t\t\t# 默认的admin/user权限值只实行上面的默认值覆盖,不做算法判断\n\t\t\t\t\treturn\n\t\t\t\tif _.isEmpty(permissions)\n\t\t\t\t\tpermissions = po\n\t\t\t\toverlayBaseBooleanPermissionProps permissions, po\n\n\t\t\t\tpermissions.disabled_list_views = intersectionPlus(permissions.disabled_list_views, po.disabled_list_views)\n\t\t\t\tpermissions.disabled_actions = intersectionPlus(permissions.disabled_actions, po.disabled_actions)\n\t\t\t\tpermissions.unreadable_fields = intersectionPlus(permissions.unreadable_fields, po.unreadable_fields)\n\t\t\t\tpermissions.uneditable_fields = intersectionPlus(permissions.uneditable_fields, po.uneditable_fields)\n\t\t\t\tpermissions.unrelated_objects = intersectionPlus(permissions.unrelated_objects, po.unrelated_objects)\n\t\t\t\tpermissions.uneditable_related_list = intersectionPlus(permissions.uneditable_related_list, po.uneditable_related_list)\n\t\t\n\t\tif object.is_view\n\t\t\tpermissions.allowCreate = false\n\t\t\tpermissions.allowEdit = false\n\t\t\tpermissions.allowDelete = false\n\t\t\tpermissions.modifyAllRecords = false\n\t\t\tpermissions.modifyCompanyRecords = false\n\t\t\tpermissions.disabled_actions = []\n\t\tCreator.processPermissions permissions\n\n\t\tif object.permission_set.owner\n\t\t\tpermissions.owner = object.permission_set.owner\n\t\treturn permissions\n\n\n\t# Creator.initPermissions = (object_name) ->\n\n\t\t# # 应该把计算出来的\n\t\t# Creator.Collections[object_name].allow\n\t\t# \tinsert: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t \t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowCreate\n\t\t# \t\t\treturn false\n\n\t\t# \t\treturn true\n\t\t# \tupdate: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t\t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowEdit\n\t\t# \t\t\treturn false\n\t\t# \t\treturn true\n\t\t# \tremove: (userId, doc) ->\n\t\t# \t\tif !userId\n\t\t# \t\t\treturn false\n\t\t# \t\tif !doc.space\n\t\t# \t\t\treturn false\n\t\t# \t\tpermissions = Creator.getObjectPermissions(doc.space, userId, object_name)\n\t\t# \t\tif !permissions.allowDelete\n\t\t# \t\t\treturn false\n\t\t# \t\treturn true\n\n\tMeteor.methods\n\t\t# Calculate Permissions on Server\n\t\t\"creator.object_permissions\": (spaceId)->\n\t\t\treturn Creator.getAllPermissions(spaceId, this.userId)\n","var baseBooleanPermissionPropNames, clone, extendPermissionProps, findOne_permission_object, find_permission_object, intersectionPlus, otherPermissionPropNames, overlayBaseBooleanPermissionProps, permissionPropNames, unionPermissionObjects, unionPlus;\n\nclone = require('clone');\n\nbaseBooleanPermissionPropNames = [\"allowCreate\", \"allowDelete\", \"allowEdit\", \"allowRead\", \"modifyAllRecords\", \"viewAllRecords\", \"modifyCompanyRecords\", \"viewCompanyRecords\", \"allowReadFiles\", \"allowEditFiles\", \"allowCreateFiles\", \"allowDeleteFiles\", \"viewAllFiles\", \"modifyAllFiles\"];\n\notherPermissionPropNames = [\"disabled_list_views\", \"disabled_actions\", \"unreadable_fields\", \"uneditable_fields\", \"unrelated_objects\", \"uneditable_related_list\"];\n\npermissionPropNames = _.union(baseBooleanPermissionPropNames, otherPermissionPropNames);\n\nCreator.getPermissions = function(object_name, spaceId, userId) {\n var obj;\n if (Meteor.isClient) {\n if (!object_name) {\n object_name = Session.get(\"object_name\");\n }\n obj = Creator.getObject(object_name);\n if (!obj) {\n return;\n }\n return obj.permissions.get();\n } else if (Meteor.isServer) {\n return Creator.getObjectPermissions(spaceId, userId, object_name);\n }\n};\n\nCreator.getRecordPermissions = function(object_name, record, userId, spaceId) {\n var isOwner, masterObjectName, masterRecordPerm, permissions, record_company_id, record_company_ids, ref, user_company_ids;\n if (!object_name && Meteor.isClient) {\n object_name = Session.get(\"object_name\");\n }\n if (!spaceId && Meteor.isClient) {\n spaceId = Session.get(\"spaceId\");\n }\n permissions = _.clone(Creator.getPermissions(object_name, spaceId, userId));\n if (record) {\n if (!_.isEmpty(record.record_permissions)) {\n return record.record_permissions;\n }\n isOwner = record.owner === userId || ((ref = record.owner) != null ? ref._id : void 0) === userId;\n if (object_name === \"cms_files\") {\n masterObjectName = record.parent['reference_to._o'];\n masterRecordPerm = Creator.getPermissions(masterObjectName, spaceId, userId);\n permissions.allowCreate = permissions.allowCreate && masterRecordPerm.allowCreateFiles;\n permissions.allowEdit = permissions.allowEdit && masterRecordPerm.allowEditFiles;\n permissions.allowDelete = permissions.allowDelete && masterRecordPerm.allowDeleteFiles;\n if (!masterRecordPerm.modifyAllFiles && !isOwner) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n permissions.allowRead = permissions.allowRead && masterRecordPerm.allowReadFiles;\n if (!masterRecordPerm.viewAllFiles && !isOwner) {\n permissions.allowRead = false;\n }\n } else {\n if (Meteor.isClient) {\n user_company_ids = Steedos.getUserCompanyIds();\n } else {\n user_company_ids = Creator.getUserCompanyIds(userId, spaceId);\n }\n record_company_id = record != null ? record.company_id : void 0;\n if (record_company_id && _.isObject(record_company_id) && record_company_id._id) {\n record_company_id = record_company_id._id;\n }\n record_company_ids = record != null ? record.company_ids : void 0;\n if (record_company_ids && record_company_ids.length && _.isObject(record_company_ids[0])) {\n record_company_ids = record_company_ids.map(function(n) {\n return n._id;\n });\n }\n record_company_ids = _.union(record_company_ids, [record_company_id]);\n if (!permissions.modifyAllRecords && !isOwner && !permissions.modifyCompanyRecords) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n } else if (!permissions.modifyAllRecords && permissions.modifyCompanyRecords) {\n if (record_company_ids && record_company_ids.length) {\n if (user_company_ids && user_company_ids.length) {\n if (!_.intersection(user_company_ids, record_company_ids).length) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n } else {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n }\n }\n if (record.locked && !permissions.modifyAllRecords) {\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n }\n if (!permissions.viewAllRecords && !isOwner && !permissions.viewCompanyRecords) {\n permissions.allowRead = false;\n } else if (!permissions.viewAllRecords && permissions.viewCompanyRecords) {\n if (record_company_ids && record_company_ids.length) {\n if (user_company_ids && user_company_ids.length) {\n if (!_.intersection(user_company_ids, record_company_ids).length) {\n permissions.allowRead = false;\n }\n } else {\n permissions.allowRead = false;\n }\n }\n }\n }\n }\n return permissions;\n};\n\nif (Meteor.isClient) {\n Creator.getRecordRelatedListPermissions = function(currentObjectName, relatedListItem, currentRecord, userId, spaceId) {\n var isRelateObjectUneditable, masterAllow, masterRecordPerm, relatedObjectPermissions, result, uneditable_related_list, write_requires_master_read;\n if (!currentObjectName && Meteor.isClient) {\n currentObjectName = Session.get(\"object_name\");\n }\n if (!relatedListItem) {\n console.error(\"relatedListItem must not be empty for the function Creator.getRecordRelatedListPermissions\");\n return {};\n }\n if (!currentRecord && Meteor.isClient) {\n currentRecord = Creator.getObjectRecord();\n }\n if (!userId && Meteor.isClient) {\n userId = Meteor.userId();\n }\n if (!spaceId && Meteor.isClient) {\n spaceId = Session.get(\"spaceId\");\n }\n masterRecordPerm = Creator.getRecordPermissions(currentObjectName, currentRecord, userId, spaceId);\n relatedObjectPermissions = Creator.getPermissions(relatedListItem.object_name);\n result = _.clone(relatedObjectPermissions);\n if (relatedListItem.is_file) {\n result.allowCreate = relatedObjectPermissions.allowCreate && masterRecordPerm.allowCreateFiles;\n result.allowEdit = relatedObjectPermissions.allowEdit && masterRecordPerm.allowEditFiles;\n } else {\n write_requires_master_read = relatedListItem.write_requires_master_read || false;\n masterAllow = false;\n if (write_requires_master_read === true) {\n masterAllow = masterRecordPerm.allowRead;\n } else if (write_requires_master_read === false) {\n masterAllow = masterRecordPerm.allowEdit;\n }\n uneditable_related_list = Creator.getRecordSafeRelatedList(currentRecord, currentObjectName);\n isRelateObjectUneditable = uneditable_related_list.indexOf(relatedListItem.object_name) > -1;\n result.allowCreate = masterAllow && relatedObjectPermissions.allowCreate && !isRelateObjectUneditable;\n result.allowEdit = masterAllow && relatedObjectPermissions.allowEdit && !isRelateObjectUneditable;\n }\n return result;\n };\n}\n\nif (Meteor.isServer) {\n Creator.getAllPermissions = function(spaceId, userId) {\n var _i, isSpaceAdmin, permissions, psets, psetsAdmin, psetsAdmin_pos, psetsCurrent, psetsCurrentNames, psetsCurrent_pos, psetsCustomer, psetsCustomer_pos, psetsGuest, psetsGuest_pos, psetsMember, psetsMember_pos, psetsSupplier, psetsSupplier_pos, psetsUser, psetsUser_pos, set_ids, spaceUser;\n permissions = {\n objects: {},\n assigned_apps: []\n };\n\n /*\n \t\t权限集说明:\n \t\t内置权限集-admin,user,member,guest,workflow_admin,organization_admin\n \t\t自定义权限集-数据库中新建的除内置权限集以外的其他权限集\n \t\t特定用户集合权限集(即users属性不可配置)-admin,user,member,guest\n \t\t可配置用户集合权限集(即users属性可配置)-workflow_admin,organization_admin以及自定义权限集\n */\n isSpaceAdmin = false;\n spaceUser = null;\n if (userId) {\n isSpaceAdmin = Creator.isSpaceAdmin(spaceId, userId);\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n psetsAdmin = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsUser = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsMember = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'member'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsGuest = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'guest'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsSupplier = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n psetsCustomer = Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n }) || null;\n if (spaceUser && spaceUser.profile) {\n psetsCurrent = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psetsCurrent = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n psetsAdmin_pos = null;\n psetsUser_pos = null;\n psetsMember_pos = null;\n psetsGuest_pos = null;\n psetsCurrent_pos = null;\n psetsSupplier_pos = null;\n psetsCustomer_pos = null;\n if (psetsAdmin != null ? psetsAdmin._id : void 0) {\n psetsAdmin_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsAdmin._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsUser != null ? psetsUser._id : void 0) {\n psetsUser_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsUser._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsMember != null ? psetsMember._id : void 0) {\n psetsMember_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsMember._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsGuest != null ? psetsGuest._id : void 0) {\n psetsGuest_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsGuest._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsSupplier != null ? psetsSupplier._id : void 0) {\n psetsSupplier_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsSupplier._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsCustomer != null ? psetsCustomer._id : void 0) {\n psetsCustomer_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: psetsCustomer._id\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n }\n if (psetsCurrent.length > 0) {\n set_ids = _.pluck(psetsCurrent, \"_id\");\n psetsCurrent_pos = Creator.getCollection(\"permission_objects\").find({\n permission_set_id: {\n $in: set_ids\n }\n }).fetch();\n psetsCurrentNames = _.pluck(psetsCurrent, \"name\");\n }\n psets = {\n psetsAdmin: psetsAdmin,\n psetsUser: psetsUser,\n psetsCurrent: psetsCurrent,\n psetsMember: psetsMember,\n psetsGuest: psetsGuest,\n psetsSupplier: psetsSupplier,\n psetsCustomer: psetsCustomer,\n isSpaceAdmin: isSpaceAdmin,\n spaceUser: spaceUser,\n psetsAdmin_pos: psetsAdmin_pos,\n psetsUser_pos: psetsUser_pos,\n psetsMember_pos: psetsMember_pos,\n psetsGuest_pos: psetsGuest_pos,\n psetsSupplier_pos: psetsSupplier_pos,\n psetsCustomer_pos: psetsCustomer_pos,\n psetsCurrent_pos: psetsCurrent_pos\n };\n permissions.assigned_apps = Creator.getAssignedApps.bind(psets)(spaceId, userId);\n permissions.assigned_menus = Creator.getAssignedMenus.bind(psets)(spaceId, userId);\n permissions.user_permission_sets = psetsCurrentNames;\n _i = 0;\n _.each(Creator.objectsByName, function(object, object_name) {\n _i++;\n if (!_.has(object, 'space') || !object.space || object.space === spaceId) {\n if (!_.has(object, 'in_development') || object.in_development === '0' || (object.in_development !== '0' && isSpaceAdmin)) {\n permissions.objects[object_name] = Creator.convertObject(clone(Creator.Objects[object_name]), spaceId);\n return permissions.objects[object_name][\"permissions\"] = Creator.getObjectPermissions.bind(psets)(spaceId, userId, object_name);\n }\n }\n });\n return permissions;\n };\n unionPlus = function(array, other) {\n if (!array && !other) {\n return void 0;\n }\n if (!array) {\n array = [];\n }\n if (!other) {\n other = [];\n }\n return _.union(array, other);\n };\n intersectionPlus = function(array, other) {\n if (!array && !other) {\n return void 0;\n }\n if (!array) {\n array = [];\n }\n if (!other) {\n other = [];\n }\n return _.intersection(array, other);\n };\n extendPermissionProps = function(target, props) {\n var filesProNames, propNames;\n propNames = permissionPropNames;\n return filesProNames = props ? _.each(propNames, function(propName) {\n return target[propName] = props[propName];\n }) : void 0;\n };\n overlayBaseBooleanPermissionProps = function(target, props) {\n var propNames;\n propNames = baseBooleanPermissionPropNames;\n return _.each(propNames, function(propName) {\n if (props[propName]) {\n return target[propName] = true;\n }\n });\n };\n Creator.getAssignedApps = function(spaceId, userId) {\n var apps, isSpaceAdmin, psetBase, psets, psetsAdmin, psetsCustomer, psetsSupplier, psetsUser, ref, ref1, spaceUser, userProfile;\n psetsAdmin = this.psetsAdmin || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsUser = this.psetsUser || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsSupplier = this.psetsMember || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n psetsCustomer = this.psetsGuest || Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1\n }\n });\n spaceUser = null;\n if (userId) {\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n if (spaceUser && spaceUser.profile) {\n psets = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psets = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n apps = [];\n if (isSpaceAdmin) {\n return [];\n } else {\n userProfile = (ref = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n })) != null ? ref.profile : void 0;\n psetBase = psetsUser;\n if (userProfile) {\n if (userProfile === 'supplier') {\n psetBase = psetsSupplier;\n } else if (userProfile === 'customer') {\n psetBase = psetsCustomer;\n }\n }\n if (psetBase != null ? (ref1 = psetBase.assigned_apps) != null ? ref1.length : void 0 : void 0) {\n apps = _.union(apps, psetBase.assigned_apps);\n } else {\n return [];\n }\n _.each(psets, function(pset) {\n if (!pset.assigned_apps) {\n return;\n }\n if (pset.name === \"admin\" || pset.name === \"user\" || pset.name === 'supplier' || pset.name === 'customer') {\n return;\n }\n return apps = _.union(apps, pset.assigned_apps);\n });\n return _.without(_.uniq(apps), void 0, null);\n }\n };\n Creator.getAssignedMenus = function(spaceId, userId) {\n var aboutMenu, adminMenus, allMenus, currentPsetNames, isSpaceAdmin, menus, otherMenuApps, otherMenus, psets, ref, ref1, result, userProfile;\n psets = this.psetsCurrent || Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n adminMenus = (ref = Creator.Apps.admin) != null ? ref.admin_menus : void 0;\n if (!adminMenus) {\n return [];\n }\n aboutMenu = adminMenus.find(function(n) {\n return n._id === 'about';\n });\n adminMenus = adminMenus.filter(function(n) {\n return n._id !== 'about';\n });\n otherMenuApps = _.sortBy(_.filter(_.values(Creator.Apps), function(n) {\n return n.admin_menus && n._id !== 'admin';\n }), 'sort');\n otherMenus = _.flatten(_.pluck(otherMenuApps, \"admin_menus\"));\n allMenus = _.union(adminMenus, otherMenus, [aboutMenu]);\n if (isSpaceAdmin) {\n result = allMenus;\n } else {\n userProfile = ((ref1 = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n })) != null ? ref1.profile : void 0) || 'user';\n currentPsetNames = psets.map(function(n) {\n return n.name;\n });\n menus = allMenus.filter(function(menu) {\n var psetsMenu;\n psetsMenu = menu.permission_sets;\n if (psetsMenu && psetsMenu.indexOf(userProfile) > -1) {\n return true;\n }\n return _.intersection(currentPsetNames, psetsMenu).length;\n });\n result = menus;\n }\n return _.sortBy(result, \"sort\");\n };\n findOne_permission_object = function(permission_objects, object_name, permission_set_id) {\n if (_.isNull(permission_objects)) {\n return null;\n }\n if (_.isArray(permission_objects)) {\n return _.find(permission_objects, function(po) {\n return po.object_name === object_name;\n });\n }\n return Creator.getCollection(\"permission_objects\").findOne({\n object_name: object_name,\n permission_set_id: permission_set_id\n });\n };\n find_permission_object = function(permission_objects, object_name, permission_set_ids) {\n if (_.isNull(permission_objects)) {\n return null;\n }\n if (_.isArray(permission_objects)) {\n return _.filter(permission_objects, function(po) {\n return po.object_name === object_name;\n });\n }\n return Creator.getCollection(\"permission_objects\").find({\n object_name: object_name,\n permission_set_id: {\n $in: permission_set_ids\n }\n }).fetch();\n };\n unionPermissionObjects = function(pos, object, psets) {\n var result;\n result = [];\n _.each(object.permission_set, function(ops, ops_key) {\n var currentPset, tempOps;\n if ([\"admin\", \"user\", \"member\", \"guest\"].indexOf(ops_key) < 0) {\n currentPset = psets.find(function(pset) {\n return pset.name === ops_key;\n });\n if (currentPset) {\n tempOps = _.clone(ops) || {};\n tempOps.permission_set_id = currentPset._id;\n tempOps.object_name = object.object_name;\n return result.push(tempOps);\n }\n }\n });\n if (result.length) {\n pos.forEach(function(po) {\n var repeatIndex, repeatPo;\n repeatIndex = 0;\n repeatPo = result.find(function(item, index) {\n repeatIndex = index;\n return item.permission_set_id === po.permission_set_id;\n });\n if (repeatPo) {\n return result[repeatIndex] = po;\n } else {\n return result.push(po);\n }\n });\n return result;\n } else {\n return pos;\n }\n };\n Creator.getObjectPermissions = function(spaceId, userId, object_name) {\n var isSpaceAdmin, object, opsetAdmin, opsetCustomer, opsetGuest, opsetMember, opsetSupplier, opsetUser, permissions, pos, posAdmin, posCustomer, posGuest, posMember, posSupplier, posUser, prof, psets, psetsAdmin, psetsAdmin_pos, psetsCurrent_pos, psetsCustomer, psetsCustomer_pos, psetsGuest, psetsGuest_pos, psetsMember, psetsMember_pos, psetsSupplier, psetsSupplier_pos, psetsUser, psetsUser_pos, set_ids, spaceUser;\n permissions = {};\n object = Creator.getObject(object_name, spaceId);\n if (spaceId === 'guest' || object_name === \"users\") {\n permissions = _.clone(object.permission_set.guest) || {};\n Creator.processPermissions(permissions);\n return permissions;\n }\n psetsAdmin = _.isNull(this.psetsAdmin) || this.psetsAdmin ? this.psetsAdmin : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'admin'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsUser = _.isNull(this.psetsUser) || this.psetsUser ? this.psetsUser : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'user'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsMember = _.isNull(this.psetsMember) || this.psetsMember ? this.psetsMember : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'member'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsGuest = _.isNull(this.psetsGuest) || this.psetsGuest ? this.psetsGuest : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'guest'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsSupplier = _.isNull(this.psetsSupplier) || this.psetsSupplier ? this.psetsSupplier : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'supplier'\n }, {\n fields: {\n _id: 1\n }\n });\n psetsCustomer = _.isNull(this.psetsCustomer) || this.psetsCustomer ? this.psetsCustomer : Creator.getCollection(\"permission_set\").findOne({\n space: spaceId,\n name: 'customer'\n }, {\n fields: {\n _id: 1\n }\n });\n psets = this.psetsCurrent;\n if (!psets) {\n spaceUser = null;\n if (userId) {\n spaceUser = Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n }\n if (spaceUser && spaceUser.profile) {\n psets = Creator.getCollection(\"permission_set\").find({\n space: spaceId,\n $or: [\n {\n users: userId\n }, {\n name: spaceUser.profile\n }\n ]\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n } else {\n psets = Creator.getCollection(\"permission_set\").find({\n users: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1,\n assigned_apps: 1,\n name: 1\n }\n }).fetch();\n }\n }\n isSpaceAdmin = _.isBoolean(this.isSpaceAdmin) ? this.isSpaceAdmin : Creator.isSpaceAdmin(spaceId, userId);\n psetsAdmin_pos = this.psetsAdmin_pos;\n psetsUser_pos = this.psetsUser_pos;\n psetsMember_pos = this.psetsMember_pos;\n psetsGuest_pos = this.psetsGuest_pos;\n psetsSupplier_pos = this.psetsSupplier_pos;\n psetsCustomer_pos = this.psetsCustomer_pos;\n psetsCurrent_pos = this.psetsCurrent_pos;\n opsetAdmin = _.clone(object.permission_set.admin) || {};\n opsetUser = _.clone(object.permission_set.user) || {};\n opsetMember = _.clone(object.permission_set.member) || {};\n opsetGuest = _.clone(object.permission_set.guest) || {};\n opsetSupplier = _.clone(object.permission_set.supplier) || {};\n opsetCustomer = _.clone(object.permission_set.customer) || {};\n if (psetsAdmin) {\n posAdmin = findOne_permission_object(psetsAdmin_pos, object_name, psetsAdmin._id);\n extendPermissionProps(opsetAdmin, posAdmin);\n }\n if (psetsUser) {\n posUser = findOne_permission_object(psetsUser_pos, object_name, psetsUser._id);\n extendPermissionProps(opsetUser, posUser);\n }\n if (psetsMember) {\n posMember = findOne_permission_object(psetsMember_pos, object_name, psetsMember._id);\n extendPermissionProps(opsetMember, posMember);\n }\n if (psetsGuest) {\n posGuest = findOne_permission_object(psetsGuest_pos, object_name, psetsGuest._id);\n extendPermissionProps(opsetGuest, posGuest);\n }\n if (psetsSupplier) {\n posSupplier = findOne_permission_object(psetsSupplier_pos, object_name, psetsSupplier._id);\n extendPermissionProps(opsetSupplier, posSupplier);\n }\n if (psetsCustomer) {\n posCustomer = findOne_permission_object(psetsCustomer_pos, object_name, psetsCustomer._id);\n extendPermissionProps(opsetCustomer, posCustomer);\n }\n if (!userId) {\n permissions = opsetAdmin;\n } else {\n if (isSpaceAdmin) {\n permissions = opsetAdmin;\n } else {\n if (spaceId === 'common') {\n permissions = opsetUser;\n } else {\n spaceUser = _.isNull(this.spaceUser) || this.spaceUser ? this.spaceUser : Creator.getCollection(\"space_users\").findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n profile: 1\n }\n });\n if (spaceUser) {\n prof = spaceUser.profile;\n if (prof) {\n if (prof === 'user') {\n permissions = opsetUser;\n } else if (prof === 'member') {\n permissions = opsetMember;\n } else if (prof === 'guest') {\n permissions = opsetGuest;\n } else if (prof === 'supplier') {\n permissions = opsetSupplier;\n } else if (prof === 'customer') {\n permissions = opsetCustomer;\n }\n } else {\n permissions = opsetUser;\n }\n } else {\n permissions = opsetGuest;\n }\n }\n }\n }\n if (psets.length > 0) {\n set_ids = _.pluck(psets, \"_id\");\n pos = find_permission_object(psetsCurrent_pos, object_name, set_ids);\n pos = unionPermissionObjects(pos, object, psets);\n _.each(pos, function(po) {\n if (po.permission_set_id === (psetsAdmin != null ? psetsAdmin._id : void 0) || po.permission_set_id === (psetsUser != null ? psetsUser._id : void 0) || po.permission_set_id === (psetsMember != null ? psetsMember._id : void 0) || po.permission_set_id === (psetsGuest != null ? psetsGuest._id : void 0) || po.permission_set_id === (psetsSupplier != null ? psetsSupplier._id : void 0) || po.permission_set_id === (psetsCustomer != null ? psetsCustomer._id : void 0)) {\n return;\n }\n if (_.isEmpty(permissions)) {\n permissions = po;\n }\n overlayBaseBooleanPermissionProps(permissions, po);\n permissions.disabled_list_views = intersectionPlus(permissions.disabled_list_views, po.disabled_list_views);\n permissions.disabled_actions = intersectionPlus(permissions.disabled_actions, po.disabled_actions);\n permissions.unreadable_fields = intersectionPlus(permissions.unreadable_fields, po.unreadable_fields);\n permissions.uneditable_fields = intersectionPlus(permissions.uneditable_fields, po.uneditable_fields);\n permissions.unrelated_objects = intersectionPlus(permissions.unrelated_objects, po.unrelated_objects);\n return permissions.uneditable_related_list = intersectionPlus(permissions.uneditable_related_list, po.uneditable_related_list);\n });\n }\n if (object.is_view) {\n permissions.allowCreate = false;\n permissions.allowEdit = false;\n permissions.allowDelete = false;\n permissions.modifyAllRecords = false;\n permissions.modifyCompanyRecords = false;\n permissions.disabled_actions = [];\n }\n Creator.processPermissions(permissions);\n if (object.permission_set.owner) {\n permissions.owner = object.permission_set.owner;\n }\n return permissions;\n };\n Meteor.methods({\n \"creator.object_permissions\": function(spaceId) {\n return Creator.getAllPermissions(spaceId, this.userId);\n }\n });\n}\n","\nsteedosCore = require('@steedos/core')\n\nMeteor.startup ()->\n\tcreator_db_url = process.env.MONGO_URL_CREATOR\n\toplog_url = process.env.MONGO_OPLOG_URL_CREATOR\n\tif creator_db_url\n\t\tif !oplog_url\n\t\t\tthrow new Meteor.Error(500, \"Please configure environment variables: MONGO_OPLOG_URL_CREATOR\")\n\t\tCreator._CREATOR_DATASOURCE = {_driver: new MongoInternals.RemoteCollectionDriver(creator_db_url, {oplogUrl: oplog_url})}\n\nCreator.getCollectionName = (object)->\n#\tif object.table_name && object.table_name.endsWith(\"__c\")\n#\t\treturn object.table_name\n#\telse\n#\t\treturn object.name\n\treturn object.name\nCreator.createCollection = (object)->\n\tcollection_key = Creator.getCollectionName(object)\n\tif db[collection_key]\n\t\treturn db[collection_key]\n\telse if object.db\n\t\treturn object.db\n\n\tif Creator.Collections[collection_key]\n\t\treturn Creator.Collections[collection_key]\n\telse\n\t\tif object.custom\n\t\t\treturn steedosCore.newCollection(collection_key, Creator._CREATOR_DATASOURCE)\n\t\telse\n\t\t\tif collection_key == '_sms_queue' && SMSQueue?.collection\n\t\t\t\treturn SMSQueue.collection\n\t\t\treturn steedosCore.newCollection(collection_key)\n\n\n","var steedosCore;\n\nsteedosCore = require('@steedos/core');\n\nMeteor.startup(function() {\n var creator_db_url, oplog_url;\n creator_db_url = process.env.MONGO_URL_CREATOR;\n oplog_url = process.env.MONGO_OPLOG_URL_CREATOR;\n if (creator_db_url) {\n if (!oplog_url) {\n throw new Meteor.Error(500, \"Please configure environment variables: MONGO_OPLOG_URL_CREATOR\");\n }\n return Creator._CREATOR_DATASOURCE = {\n _driver: new MongoInternals.RemoteCollectionDriver(creator_db_url, {\n oplogUrl: oplog_url\n })\n };\n }\n});\n\nCreator.getCollectionName = function(object) {\n return object.name;\n};\n\nCreator.createCollection = function(object) {\n var collection_key;\n collection_key = Creator.getCollectionName(object);\n if (db[collection_key]) {\n return db[collection_key];\n } else if (object.db) {\n return object.db;\n }\n if (Creator.Collections[collection_key]) {\n return Creator.Collections[collection_key];\n } else {\n if (object.custom) {\n return steedosCore.newCollection(collection_key, Creator._CREATOR_DATASOURCE);\n } else {\n if (collection_key === '_sms_queue' && (typeof SMSQueue !== \"undefined\" && SMSQueue !== null ? SMSQueue.collection : void 0)) {\n return SMSQueue.collection;\n }\n return steedosCore.newCollection(collection_key);\n }\n }\n};\n","Creator.actionsByName = {}\n\nif Meteor.isClient\n\t# 定义全局 actions 函数\t\n\tCreator.actions = (actions)->\n\t\t_.each actions, (todo, action_name)->\n\t\t\tCreator.actionsByName[action_name] = todo \n\n\tCreator.executeAction = (object_name, action, record_id, item_element, list_view_id, record, callback)->\n\t\tif action && action.type == 'word-print'\n\t\t\tif record_id\n\t\t\t\tfilters = ['_id', '=', record_id]\n\t\t\telse\n\t\t\t\tfilters = ObjectGrid.getFilters(object_name, list_view_id, false, null, null)\n\t\t\turl = \"/api/v4/word_templates/\" + action.word_template + \"/print\" + \"?filters=\" + SteedosFilters.formatFiltersToODataQuery(filters);\n\t\t\turl = Steedos.absoluteUrl(url);\n\t\t\treturn window.open(url);\n\n\t\tobj = Creator.getObject(object_name)\n\t\tif action?.todo\n\t\t\tif typeof action.todo == \"string\"\n\t\t\t\ttodo = Creator.actionsByName[action.todo]\n\t\t\telse if typeof action.todo == \"function\"\n\t\t\t\ttodo = action.todo\t\n\t\t\tif !record && object_name && record_id\n\t\t\t\trecord = Creator.odata.get(object_name, record_id)\n\t\t\tif todo\n\t\t\t\t# item_element为空时应该设置默认值(对象的name字段),否则moreArgs拿到的后续参数位置就不对\n\t\t\t\titem_element = if item_element then item_element else \"\"\n\t\t\t\tmoreArgs = Array.prototype.slice.call(arguments, 3)\n\t\t\t\ttodoArgs = [object_name, record_id].concat(moreArgs)\n\t\t\t\ttodo.apply {\n\t\t\t\t\tobject_name: object_name\n\t\t\t\t\trecord_id: record_id\n\t\t\t\t\tobject: obj\n\t\t\t\t\taction: action\n\t\t\t\t\titem_element: item_element\n\t\t\t\t\trecord: record\n\t\t\t\t}, todoArgs\n\t\t\telse\n\t\t\t\ttoastr.warning(t(\"_object_actions_none_todo\"))\n\t\telse\n\t\t\ttoastr.warning(t(\"_object_actions_none_todo\"))\n\n\n\t_deleteRecord = (object_name, record_id, record_title, list_view_id, record, call_back, call_back_error)->\n\t\t# console.log(\"===_deleteRecord===\", object_name, record_id, record_title, list_view_id, record, call_back, call_back_error);\n\t\tobject = Creator.getObject(object_name)\n\t\tpreviousDoc = FormManager.getPreviousDoc(object_name, record_id, 'delete')\n\t\tCreator.odata.delete object_name, record_id, ()->\n\t\t\tif record_title\n\t\t\t\t# info = object.label + \"\\\"#{record_title}\\\"\" + \"已删除\"\n\t\t\t\tinfo =t \"creator_record_remove_swal_title_suc\", object.label + \"\\\"#{record_title}\\\"\"\n\t\t\telse\n\t\t\t\tinfo = t('creator_record_remove_swal_suc')\n\t\t\ttoastr.success info\n\t\t\tif call_back and typeof call_back == \"function\"\n\t\t\t\tcall_back()\n\n\t\t\tFormManager.runHook(object_name, 'delete', 'after', {_id: record_id, previousDoc: previousDoc})\n\t\t, (error)->\n\t\t\tif call_back_error and typeof call_back_error == \"function\"\n\t\t\t\tcall_back_error()\n\t\t\tFormManager.runHook(object_name, 'delete', 'error', {_id: record_id, error: error})\n\n\tCreator.relatedObjectStandardNew = (related_object_name)->\n\t\trelateObject = Creator.getObject(related_object_name)\n\t\tcollection_name = relateObject.label\n\t\tcollection = \"Creator.Collections.#{Creator.getObject(related_object_name)._collection_name}\"\n\t\tcurrent_object_name = Session.get(\"object_name\")\n\t\tcurrent_record_id = Session.get(\"record_id\")\n\t\tids = Creator.TabularSelectedIds[related_object_name]\n\t\tinitialValues = {};\n\t\tif ids?.length\n\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\trecord_id = ids[0]\n\t\t\tdoc = Creator.odata.get(related_object_name, record_id)\n\t\t\tinitialValues = doc\n\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\telse\n\t\t\tdefaultDoc = FormManager.getRelatedInitialValues(current_object_name, current_record_id, related_object_name);\n\t\t\tif !_.isEmpty(defaultDoc)\n\t\t\t\tinitialValues = defaultDoc\n\t\tif relateObject?.version >= 2\n\t\t\treturn SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {\n\t\t\t\tname: \"#{related_object_name}_standard_new_form\",\n\t\t\t\tobjectApiName: related_object_name,\n\t\t\t\ttitle: '新建 ' + relateObject.label,\n\t\t\t\tinitialValues: initialValues,\n\t\t\t\tafterInsert: (result)->\n\t\t\t\t\tsetTimeout(()->\n\t\t\t\t\t\t# ObjectForm有缓存,新建子表记录可能会有汇总字段,需要刷新表单数据\n\t\t\t\t\t\tif Creator.getObject(current_object_name).version > 1\n\t\t\t\t\t\t\tSteedosUI.reloadRecord(current_object_name, current_record_id)\n\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t, 1);\n\t\t\t\t\treturn true;\n\t\t\t}, null, {iconPath: '/assets/icons'})\n\n\n\t\tif ids?.length\n\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\tSession.set 'cmDoc', initialValues\n\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\telse\n\t\t\tif !_.isEmpty(initialValues)\n\t\t\t\tSession.set 'cmDoc', initialValues\n\n\t\tSession.set(\"action_fields\", undefined)\n\t\tSession.set(\"action_collection\", collection)\n\t\tSession.set(\"action_collection_name\", collection_name)\n\t\tSession.set(\"action_save_and_insert\", false)\n\t\tMeteor.defer ()->\n\t\t\t$(\".creator-add-related\").click()\n\t\treturn\n\n\tCreator.actions \n\t\t# 在此定义全局 actions\n\t\t\"standard_query\": ()->\n\t\t\tModal.show(\"standard_query_modal\")\n\n\t\t\"standard_new\": (object_name, record_id, fields)->\n\t\t\t# current_record_id = Session.get(\"record_id\")\n\t\t\t# if current_record_id\n\t\t\t# \t# amis 相关子表右上角新建\n\t\t\t# \tCreator.relatedObjectStandardNew(object_name)\n\t\t\t# \treturn \n\t\t\tobject = Creator.getObject(object_name);\n\t\t\tgridName = this.action.gridName;\n\t\t\tisRelated = this.action.isRelated;\n\t\t\tif isRelated\n\t\t\t\trelatedFieldName = this.action.relatedFieldName;\n\t\t\t\tmasterRecordId = this.action.masterRecordId;\n\t\t\t\tinitialValues = this.action.initialValues\n\t\t\t\tif !initialValues\n\t\t\t\t\tinitialValues = {};\n\t\t\t\t\tinitialValues[relatedFieldName] = masterRecordId\n\t\t\telse\n\t\t\t\tinitialValues={}\n\t\t\t\tif(gridName)\n\t\t\t\t\tselectedRows = window.gridRefs?[gridName].current?.api?.getSelectedRows()\n\t\t\t\telse\n\t\t\t\t\tselectedRows = window.gridRef?.current?.api?.getSelectedRows()\t\n\t\t\t\t\n\t\t\t\tif selectedRows?.length\n\t\t\t\t\trecord_id = selectedRows[0]._id;\n\t\t\t\t\tif record_id\n\t\t\t\t\t\tinitialValues = Creator.odata.get(object_name, record_id)\n\n\t\t\t\telse\n\t\t\t\t\tinitialValues = FormManager.getInitialValues(object_name)\n\n\t\t\tif object?.version >= 2\n\t\t\t\treturn Steedos.Page.Form.StandardNew.render(Session.get(\"app_id\"), object_name, t('New') + ' ' + object.label, initialValues , {gridName: gridName});\n\t\t\tSession.set 'action_object_name', object_name\n\t\t\tif selectedRows?.length\n\t\t\t\t# 列表有选中项时,取第一个选中项,复制其内容到新建窗口中\n\t\t\t\t# 这的第一个指的是第一次勾选的选中项,而不是列表中已勾选的第一项\n\t\t\t\tSession.set 'cmDoc', initialValues\n\t\t\t\t# “保存并新建”操作中自动打开的新窗口中需要再次复制最新的doc内容到新窗口中\n\t\t\t\tSession.set 'cmShowAgainDuplicated', true\n\t\t\telse\n\t\t\t\tSession.set 'cmDoc', initialValues\n\t\t\tMeteor.defer ()->\n\t\t\t\t$(\".creator-add\").click()\n\t\t\treturn \n\n\t\t\"standard_open_view\": (object_name, record_id, fields)->\n\t\t\thref = Creator.getObjectUrl(object_name, record_id)\n\t\t\tFlowRouter.redirect(href)\n\t\t\treturn false\n\n\t\t\"standard_edit\": (object_name, record_id, fields)->\n\t\t\tif record_id\n\t\t\t\tobject = Creator.getObject(object_name);\n\t\t\t\tif object?.version >= 2\n\t\t\t\t\treturn Steedos.Page.Form.StandardEdit.render(Session.get(\"app_id\"), object_name, t('Edit') + ' ' + object.label, record_id, {\n\t\t\t\t\t\tgridName: this.action.gridName\n\t\t\t\t\t})\n\t\t\t\tif Steedos.isMobile() && false\n#\t\t\t\t\trecord = Creator.getObjectRecord(object_name, record_id)\n#\t\t\t\t\tSession.set 'cmDoc', record\n#\t\t\t\t\tSession.set 'reload_dxlist', false\n\t\t\t\t\tSession.set 'action_object_name', object_name\n\t\t\t\t\tSession.set 'action_record_id', record_id\n\t\t\t\t\tif this.record\n\t\t\t\t\t\tSession.set 'cmDoc', this.record\n\t\t\t\t\tMeteor.defer ()->\n\t\t\t\t\t\t$(\".btn-edit-record\").click()\n\t\t\t\telse\n\t\t\t\t\tSession.set 'action_object_name', object_name\n\t\t\t\t\tSession.set 'action_record_id', record_id\n\t\t\t\t\tif this.record\n\t\t\t\t\t\tSession.set 'cmDoc', this.record\n\t\t\t\t\t\tMeteor.defer ()->\n\t\t\t\t\t\t\t$(\".btn.creator-edit\").click()\n\n\t\t\"standard_delete\": (object_name, record_id, record_title, list_view_id, record, call_back)->\n\t\t\tgridName = this.action.gridName;\n\t\t\t# console.log(\"===standard_delete===\", object_name, record_id, record_title, list_view_id, record, call_back);\n\t\t\tif record_id\n\t\t\t\tbeforeHook = FormManager.runHook(object_name, 'delete', 'before', {_id: record_id})\n\t\t\t\tif !beforeHook\n\t\t\t\t\treturn false;\n\t\t\tobject = Creator.getObject(object_name)\n\t\t\tnameField = object.NAME_FIELD_KEY || \"name\"\n\n\t\t\tunless list_view_id\n\t\t\t\tlist_view_id = Session.get(\"list_view_id\")\n\t\t\tunless list_view_id\n\t\t\t\tlist_view_id = \"all\"\n\n\t\t\tif(!_.isString(record_title) && record_title)\n\t\t\t\trecord_title = record_title[nameField]\n\t\t\t\n\t\t\tif record && !record_title\n\t\t\t\trecord_title = record[nameField]\n\t\t\t\n\t\t\ti18nTitleKey = \"creator_record_remove_swal_title\"\n\t\t\ti18nTextKey = \"creator_record_remove_swal_text\"\n\n\t\t\tunless record_id\n\t\t\t\ti18nTitleKey = \"creator_record_remove_many_swal_title\"\n\t\t\t\ti18nTextKey = \"creator_record_remove_many_swal_text\"\n\n\t\t\t\t# 如果是批量删除,则传入的list_view_id为列表视图的name,用于获取列表选中项\n\t\t\t\t# 主列表规则是\"listview_#{object_name}_#{list_view_id}\",相关表规则是\"related_listview_#{object_name}_#{related_object_name}_#{related_field_name}\"\n\t\t\t\tselectedRecords = SteedosUI.getTableSelectedRows(gridName || list_view_id)\n\t\t\t\tif !selectedRecords || !selectedRecords.length\n\t\t\t\t\ttoastr.warning(t(\"creator_record_remove_many_no_selection\"))\n\t\t\t\t\treturn\n\n\t\t\tif record_title\n\t\t\t\ttext = t i18nTextKey, \"#{object.label} \\\"#{record_title}\\\"\"\n\t\t\telse\n\t\t\t\ttext = t i18nTextKey, \"#{object.label}\"\n\t\t\tswal\n\t\t\t\ttitle: t i18nTitleKey, \"#{object.label}\"\n\t\t\t\ttext: \"
#{text}
\"\n\t\t\t\thtml: true\n\t\t\t\tshowCancelButton:true\n\t\t\t\tconfirmButtonText: t('Delete')\n\t\t\t\tcancelButtonText: t('Cancel')\n\t\t\t\t(option) ->\n\t\t\t\t\tif option\n\t\t\t\t\t\tif record_id\n\t\t\t\t\t\t\t# 单条记录删除\n\t\t\t\t\t\t\t_deleteRecord object_name, record_id, record_title, list_view_id, record, ()->\n\t\t\t\t\t\t\t\t# 文件版本为\"cfs.files.filerecord\",需要替换为\"cfs-files-filerecord\"\n\t\t\t\t\t\t\t\tgridObjectNameClass = object_name.replace(/\\./g,\"-\")\n\t\t\t\t\t\t\t\tgridContainer = $(\".gridContainer.#{gridObjectNameClass}\")\n\t\t\t\t\t\t\t\tunless gridContainer?.length\n\t\t\t\t\t\t\t\t\tif window.opener\n\t\t\t\t\t\t\t\t\t\tisOpenerRemove = false\n\t\t\t\t\t\t\t\t\t\tgridContainer = window.opener.$(\".gridContainer.#{gridObjectNameClass}\")\n\t\t\t\t\t\t\t\ttry\n\t\t\t\t\t\t\t\t\t# ObjectForm有缓存,删除子表记录可能会有汇总字段,需要刷新表单数据\n\t\t\t\t\t\t\t\t\tcurrent_object_name = Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\tcurrent_record_id = Session.get(\"record_id\")\n\t\t\t\t\t\t\t\t\tif current_object_name && Creator.getObject(current_object_name)?.version > 1\n\t\t\t\t\t\t\t\t\t\tSteedosUI.reloadRecord(current_object_name, current_record_id)\n\t\t\t\t\t\t\t\t\tif FlowRouter.current().route.path.endsWith(\"/:record_id\")\n\t\t\t\t\t\t\t\t\t\tif object_name != Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\twindow.refreshGrid(gridName);\n\t\t\t\t\t\t\t\tcatch _e\n\t\t\t\t\t\t\t\t\tconsole.error(_e);\n\t\t\t\t\t\t\t\tif gridContainer?.length\n\t\t\t\t\t\t\t\t\tif object.enable_tree\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance = gridContainer.dxTreeList().dxTreeList('instance')\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance = gridContainer.dxDataGrid().dxDataGrid('instance')\n\t\t\t\t\t\t\t\tif dxDataGridInstance\n\t\t\t\t\t\t\t\t\tif object.enable_tree\n\t\t\t\t\t\t\t\t\t\tdxDataGridInstance.refresh()\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tif object_name != Session.get(\"object_name\")\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.reload();\n\t\t\t\t\t\t\t\t\t\t# else\n\t\t\t\t\t\t\t\t\t\t# \tTemplate.creator_grid.refresh(dxDataGridInstance)\n\t\t\t\t\t\t\t\trecordUrl = Creator.getObjectUrl(object_name, record_id)\n\t\t\t\t\t\t\t\ttempNavRemoved = Creator.removeTempNavItem(object_name, recordUrl) #无论是在记录详细界面还是列表界面执行删除操作,都会把临时导航删除掉\n\t\t\t\t\t\t\t\tif isOpenerRemove or !dxDataGridInstance\n\t\t\t\t\t\t\t\t\tif isOpenerRemove\n\t\t\t\t\t\t\t\t\t\twindow.close()\n\t\t\t\t\t\t\t\t\telse if record_id == Session.get(\"record_id\") and list_view_id != 'calendar'\n\t\t\t\t\t\t\t\t\t\tappid = Session.get(\"app_id\")\n\t\t\t\t\t\t\t\t\t\tunless tempNavRemoved\n\t\t\t\t\t\t\t\t\t\t\t# 如果确实删除了临时导航,就可能已经重定向到上一个页面了,没必要再重定向一次\n\t\t\t\t\t\t\t\t\t\t\tFlowRouter.go \"/app/#{appid}/#{object_name}/grid/#{list_view_id}\"\n\t\t\t\t\t\t\t\tif call_back and typeof call_back == \"function\"\n\t\t\t\t\t\t\t\t\tcall_back()\t\t\t\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t# 批量删除\n\t\t\t\t\t\t\tif selectedRecords && selectedRecords.length\n\t\t\t\t\t\t\t\t$(\"body\").addClass(\"loading\")\n\t\t\t\t\t\t\t\tdeleteCounter = 0;\n\t\t\t\t\t\t\t\tafterBatchesDelete = ()->\n\t\t\t\t\t\t\t\t\tdeleteCounter++\n\t\t\t\t\t\t\t\t\tif deleteCounter >= selectedRecords.length\n\t\t\t\t\t\t\t\t\t\t# console.log(\"deleteCounter, selectedRecords.length===\", deleteCounter, selectedRecords.length);\n\t\t\t\t\t\t\t\t\t\t$(\"body\").removeClass(\"loading\")\n\t\t\t\t\t\t\t\t\t\twindow.refreshGrid(gridName);\n\t\t\t\t\t\t\t\tselectedRecords.forEach (record)->\n\t\t\t\t\t\t\t\t\trecord_id = record._id\n\t\t\t\t\t\t\t\t\tbeforeHook = FormManager.runHook(object_name, 'delete', 'before', {_id: record_id})\n\t\t\t\t\t\t\t\t\tif !beforeHook\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\trecordTitle = record[nameField] || record_id\n\t\t\t\t\t\t\t\t\t_deleteRecord object_name, record._id, recordTitle, list_view_id, record, (()->\n\t\t\t\t\t\t\t\t\t\trecordUrl = Creator.getObjectUrl(object_name, record_id)\n\t\t\t\t\t\t\t\t\t\tCreator.removeTempNavItem(object_name, recordUrl) #无论是在记录详细界面还是列表界面执行删除操作,都会把临时导航删除掉\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()\n\t\t\t\t\t\t\t\t\t), ()->\n\t\t\t\t\t\t\t\t\t\tafterBatchesDelete()","var _deleteRecord;\n\nCreator.actionsByName = {};\n\nif (Meteor.isClient) {\n Creator.actions = function(actions) {\n return _.each(actions, function(todo, action_name) {\n return Creator.actionsByName[action_name] = todo;\n });\n };\n Creator.executeAction = function(object_name, action, record_id, item_element, list_view_id, record, callback) {\n var filters, moreArgs, obj, todo, todoArgs, url;\n if (action && action.type === 'word-print') {\n if (record_id) {\n filters = ['_id', '=', record_id];\n } else {\n filters = ObjectGrid.getFilters(object_name, list_view_id, false, null, null);\n }\n url = \"/api/v4/word_templates/\" + action.word_template + \"/print\" + \"?filters=\" + SteedosFilters.formatFiltersToODataQuery(filters);\n url = Steedos.absoluteUrl(url);\n return window.open(url);\n }\n obj = Creator.getObject(object_name);\n if (action != null ? action.todo : void 0) {\n if (typeof action.todo === \"string\") {\n todo = Creator.actionsByName[action.todo];\n } else if (typeof action.todo === \"function\") {\n todo = action.todo;\n }\n if (!record && object_name && record_id) {\n record = Creator.odata.get(object_name, record_id);\n }\n if (todo) {\n item_element = item_element ? item_element : \"\";\n moreArgs = Array.prototype.slice.call(arguments, 3);\n todoArgs = [object_name, record_id].concat(moreArgs);\n return todo.apply({\n object_name: object_name,\n record_id: record_id,\n object: obj,\n action: action,\n item_element: item_element,\n record: record\n }, todoArgs);\n } else {\n return toastr.warning(t(\"_object_actions_none_todo\"));\n }\n } else {\n return toastr.warning(t(\"_object_actions_none_todo\"));\n }\n };\n _deleteRecord = function(object_name, record_id, record_title, list_view_id, record, call_back, call_back_error) {\n var object, previousDoc;\n object = Creator.getObject(object_name);\n previousDoc = FormManager.getPreviousDoc(object_name, record_id, 'delete');\n return Creator.odata[\"delete\"](object_name, record_id, function() {\n var info;\n if (record_title) {\n info = t(\"creator_record_remove_swal_title_suc\", object.label + (\"\\\"\" + record_title + \"\\\"\"));\n } else {\n info = t('creator_record_remove_swal_suc');\n }\n toastr.success(info);\n if (call_back && typeof call_back === \"function\") {\n call_back();\n }\n return FormManager.runHook(object_name, 'delete', 'after', {\n _id: record_id,\n previousDoc: previousDoc\n });\n }, function(error) {\n if (call_back_error && typeof call_back_error === \"function\") {\n call_back_error();\n }\n return FormManager.runHook(object_name, 'delete', 'error', {\n _id: record_id,\n error: error\n });\n });\n };\n Creator.relatedObjectStandardNew = function(related_object_name) {\n var collection, collection_name, current_object_name, current_record_id, defaultDoc, doc, ids, initialValues, record_id, relateObject;\n relateObject = Creator.getObject(related_object_name);\n collection_name = relateObject.label;\n collection = \"Creator.Collections.\" + (Creator.getObject(related_object_name)._collection_name);\n current_object_name = Session.get(\"object_name\");\n current_record_id = Session.get(\"record_id\");\n ids = Creator.TabularSelectedIds[related_object_name];\n initialValues = {};\n if (ids != null ? ids.length : void 0) {\n record_id = ids[0];\n doc = Creator.odata.get(related_object_name, record_id);\n initialValues = doc;\n Session.set('cmShowAgainDuplicated', true);\n } else {\n defaultDoc = FormManager.getRelatedInitialValues(current_object_name, current_record_id, related_object_name);\n if (!_.isEmpty(defaultDoc)) {\n initialValues = defaultDoc;\n }\n }\n if ((relateObject != null ? relateObject.version : void 0) >= 2) {\n return SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {\n name: related_object_name + \"_standard_new_form\",\n objectApiName: related_object_name,\n title: '新建 ' + relateObject.label,\n initialValues: initialValues,\n afterInsert: function(result) {\n setTimeout(function() {\n if (Creator.getObject(current_object_name).version > 1) {\n SteedosUI.reloadRecord(current_object_name, current_record_id);\n }\n return FlowRouter.reload();\n }, 1);\n return true;\n }\n }, null, {\n iconPath: '/assets/icons'\n });\n }\n if (ids != null ? ids.length : void 0) {\n Session.set('cmDoc', initialValues);\n Session.set('cmShowAgainDuplicated', true);\n } else {\n if (!_.isEmpty(initialValues)) {\n Session.set('cmDoc', initialValues);\n }\n }\n Session.set(\"action_fields\", void 0);\n Session.set(\"action_collection\", collection);\n Session.set(\"action_collection_name\", collection_name);\n Session.set(\"action_save_and_insert\", false);\n Meteor.defer(function() {\n return $(\".creator-add-related\").click();\n });\n };\n Creator.actions({\n \"standard_query\": function() {\n return Modal.show(\"standard_query_modal\");\n },\n \"standard_new\": function(object_name, record_id, fields) {\n var gridName, initialValues, isRelated, masterRecordId, object, ref, ref1, ref2, ref3, ref4, ref5, relatedFieldName, selectedRows;\n object = Creator.getObject(object_name);\n gridName = this.action.gridName;\n isRelated = this.action.isRelated;\n if (isRelated) {\n relatedFieldName = this.action.relatedFieldName;\n masterRecordId = this.action.masterRecordId;\n initialValues = this.action.initialValues;\n if (!initialValues) {\n initialValues = {};\n initialValues[relatedFieldName] = masterRecordId;\n }\n } else {\n initialValues = {};\n if (gridName) {\n selectedRows = (ref = window.gridRefs) != null ? (ref1 = ref[gridName].current) != null ? (ref2 = ref1.api) != null ? ref2.getSelectedRows() : void 0 : void 0 : void 0;\n } else {\n selectedRows = (ref3 = window.gridRef) != null ? (ref4 = ref3.current) != null ? (ref5 = ref4.api) != null ? ref5.getSelectedRows() : void 0 : void 0 : void 0;\n }\n if (selectedRows != null ? selectedRows.length : void 0) {\n record_id = selectedRows[0]._id;\n if (record_id) {\n initialValues = Creator.odata.get(object_name, record_id);\n }\n } else {\n initialValues = FormManager.getInitialValues(object_name);\n }\n }\n if ((object != null ? object.version : void 0) >= 2) {\n return Steedos.Page.Form.StandardNew.render(Session.get(\"app_id\"), object_name, t('New') + ' ' + object.label, initialValues, {\n gridName: gridName\n });\n }\n Session.set('action_object_name', object_name);\n if (selectedRows != null ? selectedRows.length : void 0) {\n Session.set('cmDoc', initialValues);\n Session.set('cmShowAgainDuplicated', true);\n } else {\n Session.set('cmDoc', initialValues);\n }\n Meteor.defer(function() {\n return $(\".creator-add\").click();\n });\n },\n \"standard_open_view\": function(object_name, record_id, fields) {\n var href;\n href = Creator.getObjectUrl(object_name, record_id);\n FlowRouter.redirect(href);\n return false;\n },\n \"standard_edit\": function(object_name, record_id, fields) {\n var object;\n if (record_id) {\n object = Creator.getObject(object_name);\n if ((object != null ? object.version : void 0) >= 2) {\n return Steedos.Page.Form.StandardEdit.render(Session.get(\"app_id\"), object_name, t('Edit') + ' ' + object.label, record_id, {\n gridName: this.action.gridName\n });\n }\n if (Steedos.isMobile() && false) {\n Session.set('action_object_name', object_name);\n Session.set('action_record_id', record_id);\n if (this.record) {\n Session.set('cmDoc', this.record);\n }\n return Meteor.defer(function() {\n return $(\".btn-edit-record\").click();\n });\n } else {\n Session.set('action_object_name', object_name);\n Session.set('action_record_id', record_id);\n if (this.record) {\n Session.set('cmDoc', this.record);\n return Meteor.defer(function() {\n return $(\".btn.creator-edit\").click();\n });\n }\n }\n }\n },\n \"standard_delete\": function(object_name, record_id, record_title, list_view_id, record, call_back) {\n var beforeHook, gridName, i18nTextKey, i18nTitleKey, nameField, object, selectedRecords, text;\n gridName = this.action.gridName;\n if (record_id) {\n beforeHook = FormManager.runHook(object_name, 'delete', 'before', {\n _id: record_id\n });\n if (!beforeHook) {\n return false;\n }\n }\n object = Creator.getObject(object_name);\n nameField = object.NAME_FIELD_KEY || \"name\";\n if (!list_view_id) {\n list_view_id = Session.get(\"list_view_id\");\n }\n if (!list_view_id) {\n list_view_id = \"all\";\n }\n if (!_.isString(record_title) && record_title) {\n record_title = record_title[nameField];\n }\n if (record && !record_title) {\n record_title = record[nameField];\n }\n i18nTitleKey = \"creator_record_remove_swal_title\";\n i18nTextKey = \"creator_record_remove_swal_text\";\n if (!record_id) {\n i18nTitleKey = \"creator_record_remove_many_swal_title\";\n i18nTextKey = \"creator_record_remove_many_swal_text\";\n selectedRecords = SteedosUI.getTableSelectedRows(gridName || list_view_id);\n if (!selectedRecords || !selectedRecords.length) {\n toastr.warning(t(\"creator_record_remove_many_no_selection\"));\n return;\n }\n }\n if (record_title) {\n text = t(i18nTextKey, object.label + \" \\\"\" + record_title + \"\\\"\");\n } else {\n text = t(i18nTextKey, \"\" + object.label);\n }\n return swal({\n title: t(i18nTitleKey, \"\" + object.label),\n text: \"
\" + text + \"
\",\n html: true,\n showCancelButton: true,\n confirmButtonText: t('Delete'),\n cancelButtonText: t('Cancel')\n }, function(option) {\n var afterBatchesDelete, deleteCounter;\n if (option) {\n if (record_id) {\n return _deleteRecord(object_name, record_id, record_title, list_view_id, record, function() {\n var _e, appid, current_object_name, current_record_id, dxDataGridInstance, gridContainer, gridObjectNameClass, isOpenerRemove, recordUrl, ref, tempNavRemoved;\n gridObjectNameClass = object_name.replace(/\\./g, \"-\");\n gridContainer = $(\".gridContainer.\" + gridObjectNameClass);\n if (!(gridContainer != null ? gridContainer.length : void 0)) {\n if (window.opener) {\n isOpenerRemove = false;\n gridContainer = window.opener.$(\".gridContainer.\" + gridObjectNameClass);\n }\n }\n try {\n current_object_name = Session.get(\"object_name\");\n current_record_id = Session.get(\"record_id\");\n if (current_object_name && ((ref = Creator.getObject(current_object_name)) != null ? ref.version : void 0) > 1) {\n SteedosUI.reloadRecord(current_object_name, current_record_id);\n }\n if (FlowRouter.current().route.path.endsWith(\"/:record_id\")) {\n if (object_name !== Session.get(\"object_name\")) {\n FlowRouter.reload();\n }\n } else {\n window.refreshGrid(gridName);\n }\n } catch (error1) {\n _e = error1;\n console.error(_e);\n }\n if (gridContainer != null ? gridContainer.length : void 0) {\n if (object.enable_tree) {\n dxDataGridInstance = gridContainer.dxTreeList().dxTreeList('instance');\n } else {\n dxDataGridInstance = gridContainer.dxDataGrid().dxDataGrid('instance');\n }\n }\n if (dxDataGridInstance) {\n if (object.enable_tree) {\n dxDataGridInstance.refresh();\n } else {\n if (object_name !== Session.get(\"object_name\")) {\n FlowRouter.reload();\n }\n }\n }\n recordUrl = Creator.getObjectUrl(object_name, record_id);\n tempNavRemoved = Creator.removeTempNavItem(object_name, recordUrl);\n if (isOpenerRemove || !dxDataGridInstance) {\n if (isOpenerRemove) {\n window.close();\n } else if (record_id === Session.get(\"record_id\") && list_view_id !== 'calendar') {\n appid = Session.get(\"app_id\");\n if (!tempNavRemoved) {\n FlowRouter.go(\"/app/\" + appid + \"/\" + object_name + \"/grid/\" + list_view_id);\n }\n }\n }\n if (call_back && typeof call_back === \"function\") {\n return call_back();\n }\n });\n } else {\n if (selectedRecords && selectedRecords.length) {\n $(\"body\").addClass(\"loading\");\n deleteCounter = 0;\n afterBatchesDelete = function() {\n deleteCounter++;\n if (deleteCounter >= selectedRecords.length) {\n $(\"body\").removeClass(\"loading\");\n return window.refreshGrid(gridName);\n }\n };\n return selectedRecords.forEach(function(record) {\n var recordTitle;\n record_id = record._id;\n beforeHook = FormManager.runHook(object_name, 'delete', 'before', {\n _id: record_id\n });\n if (!beforeHook) {\n afterBatchesDelete();\n return;\n }\n recordTitle = record[nameField] || record_id;\n return _deleteRecord(object_name, record._id, recordTitle, list_view_id, record, (function() {\n var recordUrl;\n recordUrl = Creator.getObjectUrl(object_name, record_id);\n Creator.removeTempNavItem(object_name, recordUrl);\n return afterBatchesDelete();\n }), function() {\n return afterBatchesDelete();\n });\n });\n }\n }\n }\n });\n }\n });\n}\n"]} \ No newline at end of file diff --git a/server/bundle/programs/web.browser.legacy/0e8e091408993e566bde6016e2c1649202635d18.js b/server/bundle/programs/web.browser.legacy/46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js similarity index 87% rename from server/bundle/programs/web.browser.legacy/0e8e091408993e566bde6016e2c1649202635d18.js rename to server/bundle/programs/web.browser.legacy/46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js index ccc3be90dd..67e9b7ca31 100644 --- a/server/bundle/programs/web.browser.legacy/0e8e091408993e566bde6016e2c1649202635d18.js +++ b/server/bundle/programs/web.browser.legacy/46d6afbfa6d571fa8e0eb86d000d02178fdf01c3.js @@ -31,14 +31,14 @@ Package._define("blaze-html-templates"); * * Date: 2015-10-17 */ -function(e){var t,n,r,i,o,s,a,u,f,c,l,h,d,p,g,b,m,v,y,_="sizzle"+1*new Date,w=e.document,k=0,j=0,x=oe(),S=oe(),D=oe(),E=function(e,t){return e===t&&(l=!0),0},A=1<<31,C={}.hasOwnProperty,M=[],O=M.pop,T=M.push,B=M.push,I=M.slice,R=function(e,t){for(var n=0,r=e.length;n+~]|"+P+")"+P+"*"),W=new RegExp("="+P+"*([^\\]'\"]*?)"+P+"*\\]","g"),Y=new RegExp(z),V=new RegExp("^"+N+"$"),K={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N+"|[*])"),ATTR:new RegExp("^"+L),PSEUDO:new RegExp("^"+z),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+F+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Q=/[+~]/,ee=/'|\\/g,te=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=function(){h()};try{B.apply(M=I.call(w.childNodes),w.childNodes),M[w.childNodes.length].nodeType}catch(je){B={apply:M.length?function(e,t){T.apply(e,I.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function ie(e,t,r,i){var o,a,f,c,l,p,m,v,k=t&&t.ownerDocument,j=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==j&&9!==j&&11!==j)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&h(t),t=t||d,g)){if(11!==j&&(p=J.exec(e)))if(o=p[1]){if(9===j){if(!(f=t.getElementById(o)))return r;if(f.id===o)return r.push(f),r}else if(k&&(f=k.getElementById(o))&&y(t,f)&&f.id===o)return r.push(f),r}else{if(p[2])return B.apply(r,t.getElementsByTagName(e)),r;if((o=p[3])&&n.getElementsByClassName&&t.getElementsByClassName)return B.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!D[e+" "]&&(!b||!b.test(e))){if(1!==j)k=t,v=e;else if("object"!==t.nodeName.toLowerCase()){for((c=t.getAttribute("id"))?c=c.replace(ee,"\\$&"):t.setAttribute("id",c=_),a=(m=s(e)).length,l=V.test(c)?"#"+c:"[id='"+c+"']";a--;)m[a]=l+" "+ge(m[a]);v=m.join(","),k=Q.test(e)&&de(t.parentNode)||t}if(v)try{return B.apply(r,k.querySelectorAll(v)),r}catch(x){}finally{c===_&&t.removeAttribute("id")}}}return u(e.replace(q,"$1"),t,r,i)}function oe(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[_]=!0,e}function ae(e){var t=d.createElement("div");try{return!!e(t)}catch(je){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||A)-(~e.sourceIndex||A);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function ce(e){return function(t){var n;return"input"===t.nodeName.toLowerCase()&&t.type===e}}function le(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function he(e){return se((function(t){return t=+t,se((function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))}))}))}function de(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=ie.support={},o=ie.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},h=ie.setDocument=function(e){var t,i,s=e?e.ownerDocument||e:w;return s!==d&&9===s.nodeType&&s.documentElement?(p=(d=s).documentElement,g=!o(d),(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ae((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=ae((function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(d.getElementsByClassName),n.getById=ae((function(e){return p.appendChild(e).id=_,!d.getElementsByName||!d.getElementsByName(_).length})),n.getById?(r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}},r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}}):(delete r.find.ID,r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},m=[],b=[],(n.qsa=Z.test(d.querySelectorAll))&&(ae((function(e){p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&b.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||b.push("\\["+P+"*(?:value|"+F+")"),e.querySelectorAll("[id~="+_+"-]").length||b.push("~="),e.querySelectorAll(":checked").length||b.push(":checked"),e.querySelectorAll("a#"+_+"+*").length||b.push(".#.+[+~]")})),ae((function(e){var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&b.push("name"+P+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||b.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),b.push(",.*:")}))),(n.matchesSelector=Z.test(v=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ae((function(e){n.disconnectedMatch=v.call(e,"div"),v.call(e,"[s!='']:x"),m.push("!=",z)})),b=b.length&&new RegExp(b.join("|")),m=m.length&&new RegExp(m.join("|")),t=Z.test(p.compareDocumentPosition),y=t||Z.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},E=t?function(e,t){if(e===t)return l=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&y(w,e)?-1:t===d||t.ownerDocument===w&&y(w,t)?1:c?R(c,e)-R(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],a=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?R(c,e)-R(c,t):0;if(i===o)return fe(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[r]===a[r];)r++;return r?fe(s[r],a[r]):s[r]===w?-1:a[r]===w?1:0},d):d},ie.matches=function(e,t){return ie(e,null,null,t)},ie.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&h(e),t=t.replace(W,"='$1']"),n.matchesSelector&&g&&!D[t+" "]&&(!m||!m.test(t))&&(!b||!b.test(t)))try{var r=v.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(je){}return ie(t,d,null,[e]).length>0},ie.contains=function(e,t){return(e.ownerDocument||e)!==d&&h(e),y(e,t)},ie.attr=function(e,t){(e.ownerDocument||e)!==d&&h(e);var i=r.attrHandle[t.toLowerCase()],o=i&&C.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},ie.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ie.uniqueSort=function(e){var t,r=[],i=0,o=0;if(l=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(E),l){for(;t=e[o++];)t===e[o]&&(i=r.push(o));for(;i--;)e.splice(r[i],1)}return c=null,e},i=ie.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=ie.selectors={cacheLength:50,createPseudo:se,match:K,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ie.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ie.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return K.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Y.test(n)&&(t=s(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=x[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&x(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=ie.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(U," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var f,c,l,h,d,p,g=o!==s?"nextSibling":"previousSibling",b=t.parentNode,m=a&&t.nodeName.toLowerCase(),v=!u&&!a,y=!1;if(b){if(o){for(;g;){for(h=t;h=h[g];)if(a?h.nodeName.toLowerCase()===m:1===h.nodeType)return!1;p=g="only"===e&&!p&&"nextSibling"}return!0}if(p=[s?b.firstChild:b.lastChild],s&&v){for(y=(d=(f=(c=(l=(h=b)[_]||(h[_]={}))[h.uniqueID]||(l[h.uniqueID]={}))[e]||[])[0]===k&&f[1])&&f[2],h=d&&b.childNodes[d];h=++d&&h&&h[g]||(y=d=0)||p.pop();)if(1===h.nodeType&&++y&&h===t){c[e]=[k,d,y];break}}else if(v&&(y=d=(f=(c=(l=(h=t)[_]||(h[_]={}))[h.uniqueID]||(l[h.uniqueID]={}))[e]||[])[0]===k&&f[1]),!1===y)for(;(h=++d&&h&&h[g]||(y=d=0)||p.pop())&&((a?h.nodeName.toLowerCase()!==m:1!==h.nodeType)||!++y||(v&&((c=(l=h[_]||(h[_]={}))[h.uniqueID]||(l[h.uniqueID]={}))[e]=[k,y]),h!==t)););return(y-=i)===r||y%r==0&&y/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||ie.error("unsupported pseudo: "+e);return i[_]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se((function(e,n){for(var r,o=i(e,t),s=o.length;s--;)e[r=R(e,o[s])]=!(n[r]=o[s])})):function(e){return i(e,0,n)}):i}},pseudos:{not:se((function(e){var t=[],n=[],r=a(e.replace(q,"$1"));return r[_]?se((function(e,t,n,i){for(var o,s=r(e,null,i,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))})):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}})),has:se((function(e){return function(t){return ie(e,t).length>0}})),contains:se((function(e){return e=e.replace(te,ne),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}})),lang:se((function(e){return V.test(e||"")||ie.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===p},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return X.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he((function(){return[0]})),last:he((function(e,t){return[t-1]})),eq:he((function(e,t,n){return[n<0?n+t:n]})),even:he((function(e,t){for(var n=0;n=0;)e.push(r);return e})),gt:he((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function ve(e,t,n){for(var r=0,i=t.length;r-1&&(o[f]=!(s[f]=l))}}else m=ye(m===s?m.splice(p,m.length):m),i?i(null,s,m,u):B.apply(s,m)}))}function we(e){for(var t,n,i,o=e.length,s=r.relative[e[0].type],a=s||r.relative[" "],u=s?1:0,c=be((function(e){return e===t}),a,!0),l=be((function(e){return R(t,e)>-1}),a,!0),h=[function(e,n,r){var i=!s&&(r||n!==f)||((t=n).nodeType?c(e,n,r):l(e,n,r));return t=null,i}];u1&&me(h),u>1&&ge(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(q,"$1"),n,u0,i=e.length>0,o=function(o,s,a,u,c){var l,p,b,m=0,v="0",y=o&&[],_=[],w=f,j=o||i&&r.find.TAG("*",c),x=k+=null==w?1:Math.random()||.1,S=j.length;for(c&&(f=s===d||s||c);v!==S&&null!=(l=j[v]);v++){if(i&&l){for(p=0,s||l.ownerDocument===d||(h(l),a=!g);b=e[p++];)if(b(l,s||d,a)){u.push(l);break}c&&(k=x)}n&&((l=!b&&l)&&m--,o&&y.push(l))}if(m+=v,n&&v!==m){for(p=0;b=t[p++];)b(y,_,s,a);if(o){if(m>0)for(;v--;)y[v]||_[v]||(_[v]=O.call(u));_=ye(_)}B.apply(u,_),c&&!o&&_.length>0&&m+t.length>1&&ie.uniqueSort(u)}return c&&(k=x,f=w),y};return n?se(o):o}return pe.prototype=r.filters=r.pseudos,r.setFilters=new pe,s=ie.tokenize=function(e,t){var n,i,o,s,a,u,f,c=S[e+" "];if(c)return t?0:c.slice(0);for(a=e,u=[],f=r.preFilter;a;){for(s in n&&!(i=$.exec(a))||(i&&(a=a.slice(i[0].length)||a),u.push(o=[])),n=!1,(i=H.exec(a))&&(n=i.shift(),o.push({value:n,type:i[0].replace(q," ")}),a=a.slice(n.length)),r.filter)!(i=K[s].exec(a))||f[s]&&!(i=f[s](i))||(n=i.shift(),o.push({value:n,type:s,matches:i}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ie.error(e):S(e,u).slice(0)},a=ie.compile=function(e,t){var n,r=[],i=[],o=D[e+" "];if(!o){for(t||(t=s(e)),n=t.length;n--;)(o=we(t[n]))[_]?r.push(o):i.push(o);(o=D(e,ke(i,r))).selector=e}return o},u=ie.select=function(e,t,i,o){var u,f,c,l,h,d="function"==typeof e&&e,p=!o&&s(e=d.selector||e);if(i=i||[],1===p.length){if((f=p[0]=p[0].slice(0)).length>2&&"ID"===(c=f[0]).type&&n.getById&&9===t.nodeType&&g&&r.relative[f[1].type]){if(!(t=(r.find.ID(c.matches[0].replace(te,ne),t)||[])[0]))return i;d&&(t=t.parentNode),e=e.slice(f.shift().value.length)}for(u=K.needsContext.test(e)?0:f.length;u--&&(c=f[u],!r.relative[l=c.type]);)if((h=r.find[l])&&(o=h(c.matches[0].replace(te,ne),Q.test(f[0].type)&&de(t.parentNode)||t))){if(f.splice(u,1),!(e=o.length&&ge(f)))return B.apply(i,o),i;break}}return(d||a(e,p))(o,t,!g,i,!t||Q.test(e)&&de(t.parentNode)||t),i},n.sortStable=_.split("").sort(E).join("")===_,n.detectDuplicates=!!l,h(),n.sortDetached=ae((function(e){return 1&e.compareDocumentPosition(d.createElement("div"))})),ae((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||ue("type|href|height|width",(function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)})),n.attributes&&ae((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||ue("value",(function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),ae((function(e){return null==e.getAttribute("disabled")}))||ue(F,(function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null})),ie}(e);d.find=y,d.expr=y.selectors,d.expr[":"]=d.expr.pseudos,d.uniqueSort=d.unique=y.uniqueSort,d.text=y.getText,d.isXMLDoc=y.isXML,d.contains=y.contains;var _=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&d(e).is(n))break;r.push(e)}return r},w=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=d.expr.match.needsContext,j=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,x=/^.[^:#\[\.,]*$/;function S(e,t,n){if(d.isFunction(t))return d.grep(e,(function(e,r){return!!t.call(e,r,e)!==n}));if(t.nodeType)return d.grep(e,(function(e){return e===t!==n}));if("string"==typeof t){if(x.test(t))return d.filter(t,e,n);t=d.filter(t,e)}return d.grep(e,(function(e){return a.call(t,e)>-1!==n}))}d.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?d.find.matchesSelector(r,e)?[r]:[]:d.find.matches(e,d.grep(t,(function(e){return 1===e.nodeType})))},d.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(d(e).filter((function(){for(t=0;t1?d.unique(r):r)).selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(S(this,e||[],!1))},not:function(e){return this.pushStack(S(this,e||[],!0))},is:function(e){return!!S(this,"string"==typeof e&&k.test(e)?d(e):e||[],!1).length}});var D,E=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A;(d.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:E.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof d?t[0]:t,d.merge(this,d.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),j.test(i[1])&&d.isPlainObject(t))for(i in t)d.isFunction(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&o.parentNode&&(this.length=1,this[0]=o),this.context=r,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):d.isFunction(e)?void 0!==n.ready?n.ready(e):e(d):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),d.makeArray(e,this))}).prototype=d.fn,D=d(r);var C=/^(?:parents|prev(?:Until|All))/,M={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}d.fn.extend({has:function(e){var t=d(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&d.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?d.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?a.call(d(e),this[0]):a.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(d.uniqueSort(d.merge(this.get(),d(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),d.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return _(e,"parentNode")},parentsUntil:function(e,t,n){return _(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return _(e,"nextSibling")},prevAll:function(e){return _(e,"previousSibling")},nextUntil:function(e,t,n){return _(e,"nextSibling",n)},prevUntil:function(e,t,n){return _(e,"previousSibling",n)},siblings:function(e){return w((e.parentNode||{}).firstChild,e)},children:function(e){return w(e.firstChild)},contents:function(e){return e.contentDocument||d.merge([],e.childNodes)}},(function(e,t){d.fn[e]=function(n,r){var i=d.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=d.filter(r,i)),this.length>1&&(M[e]||d.uniqueSort(i),C.test(e)&&i.reverse()),this.pushStack(i)}}));var T=/\S+/g,B;function I(e){var t={};return d.each(e.match(T)||[],(function(e,n){t[n]=!0})),t}function R(){r.removeEventListener("DOMContentLoaded",R),e.removeEventListener("load",R),d.ready()}d.Callbacks=function(e){e="string"==typeof e?I(e):d.extend({},e);var t,n,r,i,o=[],s=[],a=-1,u=function(){for(i=e.once,r=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--})),this},has:function(e){return e?d.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],s.push(n),t||u()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!r}};return f},d.extend({Deferred:function(e){var t=[["resolve","done",d.Callbacks("once memory"),"resolved"],["reject","fail",d.Callbacks("once memory"),"rejected"],["notify","progress",d.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return d.Deferred((function(n){d.each(t,(function(t,o){var s=d.isFunction(e[t])&&e[t];i[o[1]]((function(){var e=s&&s.apply(this,arguments);e&&d.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)}))})),e=null})).promise()},promise:function(e){return null!=e?d.extend(e,r):r}},i={};return r.pipe=r.then,d.each(t,(function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add((function(){n=a}),t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith})),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=i.call(arguments),r=n.length,o=1!==r||e&&d.isFunction(e.promise)?r:0,s=1===o?e:d.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?i.call(arguments):r,n===u?s.notifyWith(t,n):--o||s.resolveWith(t,n)}},u,f,c;if(r>1)for(u=new Array(r),f=new Array(r),c=new Array(r);t0||(B.resolveWith(r,[d]),d.fn.triggerHandler&&(d(r).triggerHandler("ready"),d(r).off("ready"))))}}),d.ready.promise=function(t){return B||(B=d.Deferred(),"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(d.ready):(r.addEventListener("DOMContentLoaded",R),e.addEventListener("load",R))),B.promise(t)},d.ready.promise();var F=function(e,t,n,r,i,o,s){var a=0,u=e.length,f=null==n;if("object"===d.type(n))for(a in i=!0,n)F(e,t,a,n[a],!0,o,s);else if(void 0!==r&&(i=!0,d.isFunction(r)||(s=!0),f&&(s?(t.call(e,r),t=null):(f=t,t=function(e,t,n){return f.call(d(e),n)})),t))for(;a-1&&void 0!==n&&z.set(this,e,t)}))}),null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each((function(){z.remove(this,e)}))}}),d.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=L.get(e,t),n&&(!r||d.isArray(n)?r=L.access(e,t,d.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=d.queue(e,t),r=n.length,i=n.shift(),o=d._queueHooks(e,t),s=function(){d.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return L.get(e,n)||L.access(e,n,{empty:d.Callbacks("once memory").add((function(){L.remove(e,[t+"queue",n])}))})}}),d.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Q(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&d.nodeName(e,t)?d.merge([e],n):n}function ee(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(f=d.contains(o.ownerDocument,o),s=Q(l.appendChild(o),"script"),f&&ee(s),n)for(c=0;o=s[c++];)Z.test(o.type||"")&&n.push(o);return l}re=r.createDocumentFragment().appendChild(r.createElement("div")),(ie=r.createElement("input")).setAttribute("type","radio"),ie.setAttribute("checked","checked"),ie.setAttribute("name","t"),re.appendChild(ie),l.checkClone=re.cloneNode(!0).cloneNode(!0).lastChild.checked,re.innerHTML="",l.noCloneChecked=!!re.cloneNode(!0).lastChild.defaultValue;var se=/^key/,ae=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ue=/^([^.]*)(?:\.(.+)|)/;function fe(){return!0}function ce(){return!1}function le(){try{return r.activeElement}catch(e){}}function he(e,t,n,r,i,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(r=r||n,n=void 0),t)he(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ce;else if(!i)return e;return 1===o&&(s=i,(i=function(e){return d().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=d.guid++)),e.each((function(){d.event.add(this,t,i,r,n)}))}d.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,f,c,l,h,p,g,b,m=L.get(e);if(m)for(n.handler&&(n=(o=n).handler,i=o.selector),n.guid||(n.guid=d.guid++),(u=m.events)||(u=m.events={}),(s=m.handle)||(s=m.handle=function(t){return void 0!==d&&d.event.triggered!==t.type?d.event.dispatch.apply(e,arguments):void 0}),f=(t=(t||"").match(T)||[""]).length;f--;)p=b=(a=ue.exec(t[f])||[])[1],g=(a[2]||"").split(".").sort(),p&&(l=d.event.special[p]||{},p=(i?l.delegateType:l.bindType)||p,l=d.event.special[p]||{},c=d.extend({type:p,origType:b,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&d.expr.match.needsContext.test(i),namespace:g.join(".")},o),(h=u[p])||((h=u[p]=[]).delegateCount=0,l.setup&&!1!==l.setup.call(e,r,g,s)||e.addEventListener&&e.addEventListener(p,s)),l.add&&(l.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,c):h.push(c),d.event.global[p]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,f,c,l,h,p,g,b,m=L.hasData(e)&&L.get(e);if(m&&(u=m.events)){for(f=(t=(t||"").match(T)||[""]).length;f--;)if(p=b=(a=ue.exec(t[f])||[])[1],g=(a[2]||"").split(".").sort(),p){for(l=d.event.special[p]||{},h=u[p=(r?l.delegateType:l.bindType)||p]||[],a=a[2]&&new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)c=h[o],!i&&b!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(h.splice(o,1),c.selector&&h.delegateCount--,l.remove&&l.remove.call(e,c));s&&!h.length&&(l.teardown&&!1!==l.teardown.call(e,g,m.handle)||d.removeEvent(e,p,m.handle),delete u[p])}else for(p in u)d.event.remove(e,p+t[f],n,r,!0);d.isEmptyObject(u)&&L.remove(e,"handle events")}},dispatch:function(e){e=d.event.fix(e);var t,n,r,o,s,a=[],u=i.call(arguments),f=(L.get(this,"events")||{})[e.type]||[],c=d.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,e)){for(a=d.event.handlers.call(this,e,f),t=0;(o=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,n=0;(s=o.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(s.namespace)||(e.handleObj=s,e.data=s.data,void 0!==(r=((d.event.special[s.origType]||{}).handle||s.handler).apply(o.elem,u))&&!1===(e.result=r)&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(!0!==u.disabled||"click"!==e.type)){for(r=[],n=0;n-1:d.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a]*)\/>/gi,pe=/\s*$/g;function ve(e,t){return d.nodeName(e,"table")&&d.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ye(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function _e(e){var t=be.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function we(e,t){var n,r,i,o,s,a,u,f;if(1===t.nodeType){if(L.hasData(e)&&(o=L.access(e),s=L.set(t,o),f=o.events))for(i in delete s.handle,s.events={},f)for(n=0,r=f[i].length;n1&&"string"==typeof b&&!l.checkClone&&ge.test(b))return e.each((function(i){var o=e.eq(i);m&&(t[0]=b.call(this,i,o.html())),je(o,t,n,r)}));if(p&&(s=(i=oe(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=s),s||r)){for(u=(a=d.map(Q(i,"script"),ye)).length;h")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=d.contains(e.ownerDocument,e);if(!(l.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||d.isXMLDoc(e)))for(s=Q(a),r=0,i=(o=Q(e)).length;r0&&ee(s,!u&&Q(e,"script")),a},cleanData:function(e){for(var t,n,r,i=d.event.special,o=0;void 0!==(n=e[o]);o++)if(P(n)){if(t=n[L.expando]){if(t.events)for(r in t.events)i[r]?d.event.remove(n,r):d.removeEvent(n,r,t.handle);n[L.expando]=void 0}n[z.expando]&&(n[z.expando]=void 0)}}}),d.fn.extend({domManip:je,detach:function(e){return xe(this,e,!0)},remove:function(e){return xe(this,e)},text:function(e){return F(this,(function(e){return void 0===e?d.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return je(this,arguments,(function(e){var t;1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||ve(this,e).appendChild(e)}))},prepend:function(){return je(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=ve(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return je(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return je(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(d.cleanData(Q(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return d.clone(this,e,t)}))},html:function(e){return F(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!pe.test(e)&&!J[(X.exec(e)||["",""])[1].toLowerCase()]){e=d.htmlPrefilter(e);try{for(;n")).appendTo(t.documentElement))[0].contentDocument).write(),t.close(),n=Ee(e,t),Se.detach()),De[e]=n),n}var Ce=/^margin/,Me=new RegExp("^("+H+")(?!px)[a-z%]+$","i"),Oe=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Te=function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=s[o];return i},Be=r.documentElement;function Ie(e,t,n){var r,i,o,s,a=e.style;return""!==(s=(n=n||Oe(e))?n.getPropertyValue(t)||n[t]:void 0)&&void 0!==s||d.contains(e.ownerDocument,e)||(s=d.style(e,t)),n&&!l.pixelMarginRight()&&Me.test(s)&&Ce.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function Re(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){var t,n,i,o,s=r.createElement("div"),a=r.createElement("div");function u(){a.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",a.innerHTML="",Be.appendChild(s);var r=e.getComputedStyle(a);t="1%"!==r.top,o="2px"===r.marginLeft,n="4px"===r.width,a.style.marginRight="50%",i="4px"===r.marginRight,Be.removeChild(s)}a.style&&(a.style.backgroundClip="content-box",a.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===a.style.backgroundClip,s.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",s.appendChild(a),d.extend(l,{pixelPosition:function(){return u(),t},boxSizingReliable:function(){return null==n&&u(),n},pixelMarginRight:function(){return null==n&&u(),i},reliableMarginLeft:function(){return null==n&&u(),o},reliableMarginRight:function(){var t,n=a.appendChild(r.createElement("div"));return n.style.cssText=a.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",n.style.marginRight=n.style.width="0",a.style.width="1px",Be.appendChild(s),t=!parseFloat(e.getComputedStyle(n).marginRight),Be.removeChild(s),a.removeChild(n),t}}))}();var Fe=/^(none|table(?!-c[ea]).+)/,Pe={position:"absolute",visibility:"hidden",display:"block"},Ne={letterSpacing:"0",fontWeight:"400"},Le=["Webkit","O","Moz","ms"],ze=r.createElement("div").style;function Ue(e){if(e in ze)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=Le.length;n--;)if((e=Le[n]+t)in ze)return e}function qe(e,t,n){var r=W.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function $e(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=d.css(e,n+Y[o],!0,i)),r?("content"===n&&(s-=d.css(e,"padding"+Y[o],!0,i)),"margin"!==n&&(s-=d.css(e,"border"+Y[o]+"Width",!0,i))):(s+=d.css(e,"padding"+Y[o],!0,i),"padding"!==n&&(s+=d.css(e,"border"+Y[o]+"Width",!0,i)));return s}function He(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Oe(e),s="border-box"===d.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(((i=Ie(e,t,o))<0||null==i)&&(i=e.style[t]),Me.test(i))return i;r=s&&(l.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+$e(e,t,n||(s?"border":"content"),r,o)+"px"}function We(e,t){for(var n,r,i,o=[],s=0,a=e.length;s1)},show:function(){return We(this,!0)},hide:function(){return We(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each((function(){V(this)?d(this).show():d(this).hide()}))}}),d.Tween=Ye,Ye.prototype={constructor:Ye,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||d.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(d.cssNumber[n]?"":"px")},cur:function(){var e=Ye.propHooks[this.prop];return e&&e.get?e.get(this):Ye.propHooks._default.get(this)},run:function(e){var t,n=Ye.propHooks[this.prop];return this.options.duration?this.pos=t=d.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ye.propHooks._default.set(this),this}},Ye.prototype.init.prototype=Ye.prototype,Ye.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=d.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){d.fx.step[e.prop]?d.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[d.cssProps[e.prop]]&&!d.cssHooks[e.prop]?e.elem[e.prop]=e.now:d.style(e.elem,e.prop,e.now+e.unit)}}},Ye.propHooks.scrollTop=Ye.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},d.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},d.fx=Ye.prototype.init,d.fx.step={};var Ve,Ke,Ge=/^(?:toggle|show|hide)$/,Xe=/queueHooks$/;function Ze(){return e.setTimeout((function(){Ve=void 0})),Ve=d.now()}function Je(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=Y[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function Qe(e,t,n){for(var r,i=(nt.tweeners[t]||[]).concat(nt.tweeners["*"]),o=0,s=i.length;o1)},removeAttr:function(e){return this.each((function(){d.removeAttr(this,e)}))}}),d.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?d.prop(e,t,n):(1===o&&d.isXMLDoc(e)||(t=t.toLowerCase(),i=d.attrHooks[t]||(d.expr.match.bool.test(t)?rt:void 0)),void 0!==n?null===n?void d.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=d.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!l.radioValue&&"radio"===t&&d.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)for(;n=o[i++];)r=d.propFix[n]||n,d.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),rt={set:function(e,t,n){return!1===t?d.removeAttr(e,n):e.setAttribute(n,n),n}},d.each(d.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=it[t]||d.find.attr;it[t]=function(e,t,r){var i,o;return r||(o=it[t],it[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,it[t]=o),i}}));var ot=/^(?:input|select|textarea|button)$/i,st=/^(?:a|area)$/i;d.fn.extend({prop:function(e,t){return F(this,d.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[d.propFix[e]||e]}))}}),d.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&d.isXMLDoc(e)||(t=d.propFix[t]||t,i=d.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=d.find.attr(e,"tabindex");return t?parseInt(t,10):ot.test(e.nodeName)||st.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),l.optSelected||(d.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),d.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){d.propFix[this.toLowerCase()]=this}));var at=/[\t\r\n\f]/g;function ut(e){return e.getAttribute&&e.getAttribute("class")||""}d.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(d.isFunction(e))return this.each((function(t){d(this).addClass(e.call(this,t,ut(this)))}));if("string"==typeof e&&e)for(t=e.match(T)||[];n=this[u++];)if(i=ut(n),r=1===n.nodeType&&(" "+i+" ").replace(at," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(a=d.trim(r))&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(d.isFunction(e))return this.each((function(t){d(this).removeClass(e.call(this,t,ut(this)))}));if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(T)||[];n=this[u++];)if(i=ut(n),r=1===n.nodeType&&(" "+i+" ").replace(at," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(a=d.trim(r))&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):d.isFunction(e)?this.each((function(n){d(this).toggleClass(e.call(this,n,ut(this),t),t)})):this.each((function(){var t,r,i,o;if("string"===n)for(r=0,i=d(this),o=e.match(T)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||((t=ut(this))&&L.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":L.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+ut(n)+" ").replace(at," ").indexOf(t)>-1)return!0;return!1}});var ft=/\r/g,ct=/[\x20\t\r\n\f]+/g;d.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=d.isFunction(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,d(this).val()):e)?i="":"number"==typeof i?i+="":d.isArray(i)&&(i=d.map(i,(function(e){return null==e?"":e+""}))),(t=d.valHooks[this.type]||d.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=d.valHooks[i.type]||d.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(ft,""):null==n?"":n:void 0}}),d.extend({valHooks:{option:{get:function(e){var t=d.find.attr(e,"value");return null!=t?t:d.trim(d.text(e)).replace(ct," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),d.each(["radio","checkbox"],(function(){d.valHooks[this]={set:function(e,t){if(d.isArray(t))return e.checked=d.inArray(d(e).val(),t)>-1}},l.checkOn||(d.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}));var lt=/^(?:focusinfocus|focusoutblur)$/;d.extend(d.event,{trigger:function(t,n,i,o){var s,a,u,f,l,h,p,g=[i||r],b=c.call(t,"type")?t.type:t,m=c.call(t,"namespace")?t.namespace.split("."):[];if(a=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!lt.test(b+d.event.triggered)&&(b.indexOf(".")>-1&&(m=b.split("."),b=m.shift(),m.sort()),l=b.indexOf(":")<0&&"on"+b,(t=t[d.expando]?t:new d.Event(b,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:d.makeArray(n,[t]),p=d.event.special[b]||{},o||!p.trigger||!1!==p.trigger.apply(i,n))){if(!o&&!p.noBubble&&!d.isWindow(i)){for(f=p.delegateType||b,lt.test(f+b)||(a=a.parentNode);a;a=a.parentNode)g.push(a),u=a;u===(i.ownerDocument||r)&&g.push(u.defaultView||u.parentWindow||e)}for(s=0;(a=g[s++])&&!t.isPropagationStopped();)t.type=s>1?f:p.bindType||b,(h=(L.get(a,"events")||{})[t.type]&&L.get(a,"handle"))&&h.apply(a,n),(h=l&&a[l])&&h.apply&&P(a)&&(t.result=h.apply(a,n),!1===t.result&&t.preventDefault());return t.type=b,o||t.isDefaultPrevented()||p._default&&!1!==p._default.apply(g.pop(),n)||!P(i)||l&&d.isFunction(i[b])&&!d.isWindow(i)&&((u=i[l])&&(i[l]=null),d.event.triggered=b,i[b](),d.event.triggered=void 0,u&&(i[l]=u)),t.result}},simulate:function(e,t,n){var r=d.extend(new d.Event,n,{type:e,isSimulated:!0});d.event.trigger(r,null,t)}}),d.fn.extend({trigger:function(e,t){return this.each((function(){d.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return d.event.trigger(e,t,n,!0)}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),(function(e,t){d.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}})),d.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),l.focusin="onfocusin"in e,l.focusin||d.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){d.event.simulate(t,e.target,d.event.fix(e))};d.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=L.access(r,t);i||r.addEventListener(e,n,!0),L.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=L.access(r,t)-1;i?L.access(r,t,i):(r.removeEventListener(e,n,!0),L.remove(r,t))}}}));var ht=e.location,dt=d.now(),pt=/\?/;d.parseJSON=function(e){return JSON.parse(e+"")},d.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(r){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||d.error("Invalid XML: "+t),n};var gt=/#.*$/,bt=/([?&])_=[^&]*/,mt=/^(.*?):[ \t]*([^\r\n]*)$/gm,vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,yt=/^(?:GET|HEAD)$/,_t=/^\/\//,wt={},kt={},jt="*/".concat("*"),xt=r.createElement("a");function St(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(d.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Dt(e,t,n,r){var i={},o=e===kt;function s(a){var u;return i[a]=!0,d.each(e[a]||[],(function(e,a){var f=a(t,n,r);return"string"!=typeof f||o||i[f]?o?!(u=f):void 0:(t.dataTypes.unshift(f),s(f),!1)})),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function Et(e,t){var n,r,i=d.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&d.extend(!0,e,r),e}function At(e,t,n){for(var r,i,o,s,a=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ct(e,t,n,r){var i,o,s,a,u,f={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)f[s.toLowerCase()]=e.converters[s];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(s=f[u+" "+o]||f["* "+o]))for(i in f)if((a=i.split(" "))[1]===o&&(s=f[u+" "+a[0]]||f["* "+a[0]])){!0===s?s=f[i]:!0!==f[i]&&(o=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(l){return{state:"parsererror",error:s?l:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}xt.href=ht.href,d.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ht.href,type:"GET",isLocal:vt.test(ht.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":jt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Et(Et(e,d.ajaxSettings),t):Et(d.ajaxSettings,e)},ajaxPrefilter:St(wt),ajaxTransport:St(kt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,s,a,u,f,c,l,h=d.ajaxSetup({},n),p=h.context||h,g=h.context&&(p.nodeType||p.jquery)?d(p):d.event,b=d.Deferred(),m=d.Callbacks("once memory"),v=h.statusCode||{},y={},_={},w=0,k="canceled",j={readyState:0,getResponseHeader:function(e){var t;if(2===w){if(!a)for(a={};t=mt.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===w?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return w||(e=_[n]=_[n]||e,y[e]=t),this},overrideMimeType:function(e){return w||(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(w<2)for(t in e)v[t]=[v[t],e[t]];else j.always(e[j.status]);return this},abort:function(e){var t=e||k;return i&&i.abort(t),x(0,t),this}};if(b.promise(j).complete=m.add,j.success=j.done,j.error=j.fail,h.url=((t||h.url||ht.href)+"").replace(gt,"").replace(_t,ht.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=d.trim(h.dataType||"*").toLowerCase().match(T)||[""],null==h.crossDomain){f=r.createElement("a");try{f.href=h.url,f.href=f.href,h.crossDomain=xt.protocol+"//"+xt.host!=f.protocol+"//"+f.host}catch(S){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=d.param(h.data,h.traditional)),Dt(wt,h,n,j),2===w)return j;for(l in(c=d.event&&h.global)&&0==d.active++&&d.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!yt.test(h.type),o=h.url,h.hasContent||(h.data&&(o=h.url+=(pt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(h.url=bt.test(o)?o.replace(bt,"$1_="+dt++):o+(pt.test(o)?"&":"?")+"_="+dt++)),h.ifModified&&(d.lastModified[o]&&j.setRequestHeader("If-Modified-Since",d.lastModified[o]),d.etag[o]&&j.setRequestHeader("If-None-Match",d.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&j.setRequestHeader("Content-Type",h.contentType),j.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+jt+"; q=0.01":""):h.accepts["*"]),h.headers)j.setRequestHeader(l,h.headers[l]);if(h.beforeSend&&(!1===h.beforeSend.call(p,j,h)||2===w))return j.abort();for(l in k="abort",{success:1,error:1,complete:1})j[l](h[l]);if(i=Dt(kt,h,n,j)){if(j.readyState=1,c&&g.trigger("ajaxSend",[j,h]),2===w)return j;h.async&&h.timeout>0&&(u=e.setTimeout((function(){j.abort("timeout")}),h.timeout));try{w=1,i.send(y,x)}catch(S){if(!(w<2))throw S;x(-1,S)}}else x(-1,"No Transport");function x(t,n,r,a){var f,l,y,_,k,x=n;2!==w&&(w=2,u&&e.clearTimeout(u),i=void 0,s=a||"",j.readyState=t>0?4:0,f=t>=200&&t<300||304===t,r&&(_=At(h,j,r)),_=Ct(h,_,j,f),f?(h.ifModified&&((k=j.getResponseHeader("Last-Modified"))&&(d.lastModified[o]=k),(k=j.getResponseHeader("etag"))&&(d.etag[o]=k)),204===t||"HEAD"===h.type?x="nocontent":304===t?x="notmodified":(x=_.state,l=_.data,f=!(y=_.error))):(y=x,!t&&x||(x="error",t<0&&(t=0))),j.status=t,j.statusText=(n||x)+"",f?b.resolveWith(p,[l,x,j]):b.rejectWith(p,[j,x,y]),j.statusCode(v),v=void 0,c&&g.trigger(f?"ajaxSuccess":"ajaxError",[j,h,f?l:y]),m.fireWith(p,[j,x]),c&&(g.trigger("ajaxComplete",[j,h]),--d.active||d.event.trigger("ajaxStop")))}return j},getJSON:function(e,t,n){return d.get(e,t,n,"json")},getScript:function(e,t){return d.get(e,void 0,t,"script")}}),d.each(["get","post"],(function(e,t){d[t]=function(e,n,r,i){return d.isFunction(n)&&(i=i||r,r=n,n=void 0),d.ajax(d.extend({url:e,type:t,dataType:i,data:n,success:r},d.isPlainObject(e)&&e))}})),d._evalUrl=function(e){return d.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},d.fn.extend({wrapAll:function(e){var t;return d.isFunction(e)?this.each((function(t){d(this).wrapAll(e.call(this,t))})):(this[0]&&(t=d(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this)},wrapInner:function(e){return d.isFunction(e)?this.each((function(t){d(this).wrapInner(e.call(this,t))})):this.each((function(){var t=d(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=d.isFunction(e);return this.each((function(n){d(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(){return this.parent().each((function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)})).end()}}),d.expr.filters.hidden=function(e){return!d.expr.filters.visible(e)},d.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Mt=/%20/g,Ot=/\[\]$/,Tt=/\r?\n/g,Bt=/^(?:submit|button|image|reset|file)$/i,It=/^(?:input|select|textarea|keygen)/i;function Rt(e,t,n,r){var i;if(d.isArray(t))d.each(t,(function(t,i){n||Ot.test(e)?r(e,i):Rt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==d.type(t))r(e,t);else for(i in t)Rt(e+"["+i+"]",t[i],n,r)}d.param=function(e,t){var n,r=[],i=function(e,t){t=d.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=d.ajaxSettings&&d.ajaxSettings.traditional),d.isArray(e)||e.jquery&&!d.isPlainObject(e))d.each(e,(function(){i(this.name,this.value)}));else for(n in e)Rt(n,e[n],t,i);return r.join("&").replace(Mt,"+")},d.fn.extend({serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=d.prop(this,"elements");return e?d.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!d(this).is(":disabled")&&It.test(this.nodeName)&&!Bt.test(e)&&(this.checked||!G.test(e))})).map((function(e,t){var n=d(this).val();return null==n?null:d.isArray(n)?d.map(n,(function(e){return{name:t.name,value:e.replace(Tt,"\r\n")}})):{name:t.name,value:n.replace(Tt,"\r\n")}})).get()}}),d.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(t){}};var Ft={0:200,1223:204},Pt=d.ajaxSettings.xhr();l.cors=!!Pt&&"withCredentials"in Pt,l.ajax=Pt=!!Pt,d.ajaxTransport((function(t){var n,r;if(l.cors||Pt&&!t.crossDomain)return{send:function(i,o){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)a.setRequestHeader(s,i[s]);n=function(e){return function(){n&&(n=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Ft[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=n(),r=a.onerror=n("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&e.setTimeout((function(){n&&r()}))},n=n("abort");try{a.send(t.hasContent&&t.data||null)}catch(u){if(n)throw u}},abort:function(){n&&n()}}})),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return d.globalEval(e),e}}}),d.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),d.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain)return{send:function(i,o){t=d("