next_sgad 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +34 -0
- data/Rakefile +37 -0
- data/app/assets/config/next_sgad_manifest.js +2 -0
- data/app/assets/javascripts/next_sgad/activities.js +2 -0
- data/app/assets/javascripts/next_sgad/application.js +108 -0
- data/app/assets/javascripts/next_sgad/assessments.js +2 -0
- data/app/assets/javascripts/next_sgad/attendances.js +2 -0
- data/app/assets/javascripts/next_sgad/configurations.js +2 -0
- data/app/assets/javascripts/next_sgad/departments.js +2 -0
- data/app/assets/javascripts/next_sgad/employee_goals.js +2 -0
- data/app/assets/javascripts/next_sgad/employees.js +2 -0
- data/app/assets/javascripts/next_sgad/functions.js +7 -0
- data/app/assets/javascripts/next_sgad/goals.js +2 -0
- data/app/assets/javascripts/next_sgad/jquery.orgchart.min.js +2 -0
- data/app/assets/javascripts/next_sgad/justifications.js +2 -0
- data/app/assets/javascripts/next_sgad/positions.js +2 -0
- data/app/assets/javascripts/next_sgad/results.js +2 -0
- data/app/assets/stylesheets/next_sgad/activities.css +4 -0
- data/app/assets/stylesheets/next_sgad/application.css +77 -0
- data/app/assets/stylesheets/next_sgad/assessments.css +4 -0
- data/app/assets/stylesheets/next_sgad/attendances.css +4 -0
- data/app/assets/stylesheets/next_sgad/configurations.css +4 -0
- data/app/assets/stylesheets/next_sgad/departments.css +4 -0
- data/app/assets/stylesheets/next_sgad/employee_goals.css +4 -0
- data/app/assets/stylesheets/next_sgad/employees.css +4 -0
- data/app/assets/stylesheets/next_sgad/functions.css +4 -0
- data/app/assets/stylesheets/next_sgad/goals.css +4 -0
- data/app/assets/stylesheets/next_sgad/jquery.orgchart.min.css +2 -0
- data/app/assets/stylesheets/next_sgad/justifications.css +4 -0
- data/app/assets/stylesheets/next_sgad/positions.css +4 -0
- data/app/assets/stylesheets/next_sgad/results.css +4 -0
- data/app/controllers/next_sgad/activities_controller.rb +63 -0
- data/app/controllers/next_sgad/application_controller.rb +5 -0
- data/app/controllers/next_sgad/assessments_controller.rb +62 -0
- data/app/controllers/next_sgad/attendances_controller.rb +62 -0
- data/app/controllers/next_sgad/configurations_controller.rb +62 -0
- data/app/controllers/next_sgad/departments_controller.rb +62 -0
- data/app/controllers/next_sgad/employee_goals_controller.rb +62 -0
- data/app/controllers/next_sgad/employees_controller.rb +62 -0
- data/app/controllers/next_sgad/functions_controller.rb +62 -0
- data/app/controllers/next_sgad/goals_controller.rb +62 -0
- data/app/controllers/next_sgad/justifications_controller.rb +62 -0
- data/app/controllers/next_sgad/positions_controller.rb +78 -0
- data/app/controllers/next_sgad/results_controller.rb +62 -0
- data/app/helpers/next_sgad/activities_helper.rb +4 -0
- data/app/helpers/next_sgad/application_helper.rb +4 -0
- data/app/helpers/next_sgad/assessments_helper.rb +4 -0
- data/app/helpers/next_sgad/attendances_helper.rb +4 -0
- data/app/helpers/next_sgad/configurations_helper.rb +4 -0
- data/app/helpers/next_sgad/departments_helper.rb +4 -0
- data/app/helpers/next_sgad/employee_goals_helper.rb +4 -0
- data/app/helpers/next_sgad/employees_helper.rb +4 -0
- data/app/helpers/next_sgad/functions_helper.rb +4 -0
- data/app/helpers/next_sgad/goals_helper.rb +4 -0
- data/app/helpers/next_sgad/justifications_helper.rb +4 -0
- data/app/helpers/next_sgad/positions_helper.rb +55 -0
- data/app/helpers/next_sgad/results_helper.rb +4 -0
- data/app/jobs/next_sgad/application_job.rb +4 -0
- data/app/mailers/next_sgad/application_mailer.rb +6 -0
- data/app/models/next_sgad/activity.rb +4 -0
- data/app/models/next_sgad/application_record.rb +18 -0
- data/app/models/next_sgad/assessment.rb +128 -0
- data/app/models/next_sgad/attendance.rb +70 -0
- data/app/models/next_sgad/configuration.rb +4 -0
- data/app/models/next_sgad/department.rb +20 -0
- data/app/models/next_sgad/employee.rb +28 -0
- data/app/models/next_sgad/employee_goal.rb +36 -0
- data/app/models/next_sgad/function.rb +8 -0
- data/app/models/next_sgad/goal.rb +37 -0
- data/app/models/next_sgad/justification.rb +47 -0
- data/app/models/next_sgad/position.rb +36 -0
- data/app/models/next_sgad/result.rb +27 -0
- data/app/models/next_sgad/setting.rb +13 -0
- data/app/views/layouts/next_sgad/application.html.erb +14 -0
- data/app/views/next_sgad/activities/_form.html.erb +27 -0
- data/app/views/next_sgad/activities/edit.html.erb +6 -0
- data/app/views/next_sgad/activities/index.html.erb +29 -0
- data/app/views/next_sgad/activities/new.html.erb +5 -0
- data/app/views/next_sgad/activities/show.html.erb +14 -0
- data/app/views/next_sgad/assessments/_form.html.erb +27 -0
- data/app/views/next_sgad/assessments/edit.html.erb +6 -0
- data/app/views/next_sgad/assessments/index.html.erb +29 -0
- data/app/views/next_sgad/assessments/new.html.erb +5 -0
- data/app/views/next_sgad/assessments/show.html.erb +14 -0
- data/app/views/next_sgad/attendances/_form.html.erb +37 -0
- data/app/views/next_sgad/attendances/edit.html.erb +6 -0
- data/app/views/next_sgad/attendances/index.html.erb +33 -0
- data/app/views/next_sgad/attendances/new.html.erb +5 -0
- data/app/views/next_sgad/attendances/show.html.erb +24 -0
- data/app/views/next_sgad/configurations/_form.html.erb +32 -0
- data/app/views/next_sgad/configurations/edit.html.erb +6 -0
- data/app/views/next_sgad/configurations/index.html.erb +31 -0
- data/app/views/next_sgad/configurations/new.html.erb +5 -0
- data/app/views/next_sgad/configurations/show.html.erb +19 -0
- data/app/views/next_sgad/departments/_form.html.erb +32 -0
- data/app/views/next_sgad/departments/edit.html.erb +6 -0
- data/app/views/next_sgad/departments/index.html.erb +33 -0
- data/app/views/next_sgad/departments/new.html.erb +5 -0
- data/app/views/next_sgad/departments/show.html.erb +24 -0
- data/app/views/next_sgad/employee_goals/_form.html.erb +42 -0
- data/app/views/next_sgad/employee_goals/edit.html.erb +6 -0
- data/app/views/next_sgad/employee_goals/index.html.erb +35 -0
- data/app/views/next_sgad/employee_goals/new.html.erb +5 -0
- data/app/views/next_sgad/employee_goals/show.html.erb +29 -0
- data/app/views/next_sgad/employees/_form.html.erb +27 -0
- data/app/views/next_sgad/employees/_organigrama.html.erb +7 -0
- data/app/views/next_sgad/employees/edit.html.erb +6 -0
- data/app/views/next_sgad/employees/index.html.erb +31 -0
- data/app/views/next_sgad/employees/new.html.erb +5 -0
- data/app/views/next_sgad/employees/show.html.erb +19 -0
- data/app/views/next_sgad/functions/_form.html.erb +22 -0
- data/app/views/next_sgad/functions/edit.html.erb +6 -0
- data/app/views/next_sgad/functions/index.html.erb +27 -0
- data/app/views/next_sgad/functions/new.html.erb +5 -0
- data/app/views/next_sgad/functions/show.html.erb +9 -0
- data/app/views/next_sgad/goals/_form.html.erb +62 -0
- data/app/views/next_sgad/goals/edit.html.erb +6 -0
- data/app/views/next_sgad/goals/index.html.erb +41 -0
- data/app/views/next_sgad/goals/new.html.erb +5 -0
- data/app/views/next_sgad/goals/show.html.erb +49 -0
- data/app/views/next_sgad/justifications/_form.html.erb +22 -0
- data/app/views/next_sgad/justifications/edit.html.erb +6 -0
- data/app/views/next_sgad/justifications/index.html.erb +27 -0
- data/app/views/next_sgad/justifications/new.html.erb +5 -0
- data/app/views/next_sgad/justifications/show.html.erb +9 -0
- data/app/views/next_sgad/positions/_form.html.erb +43 -0
- data/app/views/next_sgad/positions/edit.html.erb +6 -0
- data/app/views/next_sgad/positions/index.html.erb +94 -0
- data/app/views/next_sgad/positions/new.html.erb +5 -0
- data/app/views/next_sgad/positions/organigram.html.erb +1 -0
- data/app/views/next_sgad/positions/show.html.erb +34 -0
- data/app/views/next_sgad/results/_form.html.erb +37 -0
- data/app/views/next_sgad/results/edit.html.erb +6 -0
- data/app/views/next_sgad/results/index.html.erb +33 -0
- data/app/views/next_sgad/results/new.html.erb +5 -0
- data/app/views/next_sgad/results/show.html.erb +24 -0
- data/config/initializers/core_extentions.rb +1 -0
- data/config/initializers/initializer.rb +1 -0
- data/config/initializers/m.rb +1 -0
- data/config/initializers/semper.rb +1 -0
- data/config/routes.rb +16 -0
- data/db/migrate/20171014174705_create_next_sgad_departments.rb +11 -0
- data/db/migrate/20171014175212_create_next_sgad_employees.rb +11 -0
- data/db/migrate/20171014175507_create_next_sgad_positions.rb +13 -0
- data/db/migrate/20171014183337_create_next_sgad_configurations.rb +11 -0
- data/db/migrate/20171015073528_add_next_sgad_department_to_department.rb +6 -0
- data/db/migrate/20171019142918_remove_table_configurations.rb +5 -0
- data/db/migrate/20171019143336_create_next_sgad_settings.rb +11 -0
- data/db/migrate/20171022113005_add_paygrade_to_next_sgad_employee.rb +6 -0
- data/db/migrate/20171024154422_create_next_sgad_assessments.rb +10 -0
- data/db/migrate/20171024172007_create_next_sgad_goals.rb +18 -0
- data/db/migrate/20171024181227_create_next_sgad_employee_goals.rb +16 -0
- data/db/migrate/20171024192907_corrects_references.rb +8 -0
- data/db/migrate/20171024193750_copies_info_from_old_references.rb +8 -0
- data/db/migrate/20171025093224_change_column_year_from_assessments.rb +6 -0
- data/db/migrate/20171025134655_add_goal_type_to_employee_goals.rb +8 -0
- data/db/migrate/20171025135319_addname_to_next_sgad_employee_goals.rb +5 -0
- data/db/migrate/20171025153545_add_position_reference_to_goals.rb +4 -0
- data/db/migrate/20171026055530_add_position_to_next_sgad_goals.rb +5 -0
- data/db/migrate/20171026060110_add_position_to_next_sgad_employee.rb +5 -0
- data/db/migrate/20171026060351_copies_posiiton_id_to_employees.rb +9 -0
- data/db/migrate/20171026061315_remove_old_reference_columns.rb +8 -0
- data/db/migrate/20171026115447_add_description_to_next_sgad_goals.rb +6 -0
- data/db/migrate/20171026142240_add_position_to_next_sgad_employee_goals.rb +5 -0
- data/db/migrate/20171027210543_create_next_sgad_functions.rb +9 -0
- data/db/migrate/20171027210912_add_function_to_next_sgad_positions.rb +5 -0
- data/db/migrate/20171027213833_create_join_table_goal_position.rb +8 -0
- data/db/migrate/20171027221550_create_join_table_employee_position.rb +8 -0
- data/db/migrate/20171027223737_add_efective_to_next_sgad_positions.rb +5 -0
- data/db/migrate/20171027230032_remove_position_from_next_sgad_employee.rb +6 -0
- data/db/migrate/20171027230033_clear_data.rb +7 -0
- data/db/migrate/20171028061909_add_description_to_next_sgad_functions.rb +5 -0
- data/db/migrate/20171028140106_add_percentages_to_next_sagad_assessments.rb +6 -0
- data/db/migrate/20171029074321_rename_paygrade_and_level_from_employee.rb +7 -0
- data/db/migrate/20171029103212_add_email_to_next_sgad_employee.rb +5 -0
- data/db/migrate/20171029154047_add_coment_to_next_sgad_employee_goals.rb +6 -0
- data/db/migrate/20171029160044_add_amount_to_next_sgad_employee_goals.rb +5 -0
- data/db/migrate/20171101112232_change_self_assessment_from_next_sgad_employee_goals.rb +13 -0
- data/db/migrate/20171106113735_add_first_name_to_next_sgad_employees.rb +24 -0
- data/db/migrate/20171110103155_add_number_to_next_sgad_functions.rb +5 -0
- data/db/migrate/20171111081148_create_next_sgad_justifications.rb +9 -0
- data/db/migrate/20171111093506_create_next_sgad_attendances.rb +13 -0
- data/db/migrate/20171111093524_add_references_to_justifications_and_attendences.rb +10 -0
- data/db/migrate/20171111094154_create_join_table_attendance_justification.rb +8 -0
- data/db/migrate/20171111121753_create_next_sgad_results.rb +13 -0
- data/db/migrate/20171111121935_resolts_relationship.rb +9 -0
- data/db/migrate/20171112004221_add_attendance_percentage_to_next_sgad_assessment.rb +14 -0
- data/db/migrate/20171112121440_add_status_to_next_sgad_justifications.rb +7 -0
- data/db/migrate/20171112172436_add_department_to_attendances.rb +6 -0
- data/db/migrate/20171113125224_add_configuration_columns_to_nexts_sgad_assessment.rb +18 -0
- data/db/migrate/20171113143825_add_max_number_of_absences_for_five_to_next_sgad_assessments.rb +9 -0
- data/db/migrate/20171114135601_change_column_status_from_result.rb +6 -0
- data/db/migrate/20171115085324_create_next_sgad_activities.rb +10 -0
- data/db/migrate/20171115110522_add_column_nature_and_value_to_results.rb +7 -0
- data/db/migrate/20171115111821_remove_unused_columns.rb +19 -0
- data/db/migrate/20171115140048_corrects_status.rb +6 -0
- data/db/migrate/20171115160122_add_justification_status_to_next_sgad_attendances.rb +5 -0
- data/db/migrate/20171115161157_migrate_fill_justification_columns.rb +7 -0
- data/lib/concerns/models/employee.rb +25 -0
- data/lib/generators/initializer/USAGE +8 -0
- data/lib/generators/initializer/initializer_generator.rb +6 -0
- data/lib/generators/initializer/templates/initializer.rb +1 -0
- data/lib/generators/initializer_generator.rb +6 -0
- data/lib/generators/views/USAGE +8 -0
- data/lib/generators/views/views_generator.rb +3 -0
- data/lib/next_sgad/engine.rb +13 -0
- data/lib/next_sgad/version.rb +3 -0
- data/lib/next_sgad.rb +5 -0
- data/lib/tasks/next_sgad_tasks.rake +4 -0
- metadata +268 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f3d2263df5897d1a8a46a06f556dde164efcb389
|
4
|
+
data.tar.gz: 0d6dd526575479dea0ab4f220b7038ce4723f6fe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 904579b23e1e6a2a9a1c6caef1b24c578195798360bf431a3f7501e2b539d9b399ab5512587c5474e0013b3a35f0f1070c4694ddc4649715bf97152f140e903f
|
7
|
+
data.tar.gz: 5809d93cbc025dee6cd68e8e399cb67117eced7f29c11fa91735e3ecbd3d0e711780826247f5b52fee1ec5a50ad9526a43fc23a92cd56e6d2c8c8e9ee87b7020
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Ilton Flora Ingui
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# NextSgad
|
2
|
+
Short description and motivation.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
How to use my plugin.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'next_sgad', path: 'path/to/engine/folder'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
Configure the Routes:
|
20
|
+
```bash
|
21
|
+
mount NextSgad::Engine, at: 'sgad'
|
22
|
+
```
|
23
|
+
Copy the migrations
|
24
|
+
```bash
|
25
|
+
$ bin/rails next_sgad:install:migrations
|
26
|
+
```
|
27
|
+
|
28
|
+
Run the migrations
|
29
|
+
```bash
|
30
|
+
$ bin/rails db:migrate SCOPE=next_sgad
|
31
|
+
```
|
32
|
+
|
33
|
+
## License
|
34
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'NextSgad'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
require 'bundler/gem_tasks'
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task default: :test
|
@@ -0,0 +1,108 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require jquery_ujs
|
15
|
+
//= require Chart.bundle.min
|
16
|
+
//= require_tree .
|
17
|
+
|
18
|
+
jQuery(document).ready(function($) {
|
19
|
+
var datascource = {
|
20
|
+
'name': 'Lao Lao',
|
21
|
+
'title': 'general manager',
|
22
|
+
'relationship': { 'children_num': 5 },
|
23
|
+
'children': [
|
24
|
+
{ 'title': 'Bo Miao', 'name': '<span role="img" class="QhTRn" style="background-image: url("https://bitbucket.org/account/IltonFloraIngui/avatar/32/");"><img aria-hidden="true" src="/account/IltonFloraIngui/avatar/32/" class="cbFzAg"></span>', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 7 }},
|
25
|
+
{ 'name': 'Su Miao', 'title': 'department manager', 'relationship': { 'children_num': 2, 'parent_num': 1,'sibling_num': 7 },
|
26
|
+
'children': [
|
27
|
+
{ 'name': 'Tie Hua', 'title': 'senior engineer', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 1 }},
|
28
|
+
{ 'name': 'Hei Hei', 'title': 'senior engineer', 'relationship': { 'children_num': 2, 'parent_num': 1,'sibling_num': 1 },
|
29
|
+
'children': [
|
30
|
+
{ 'name': 'Pang Pang', 'title': 'engineer', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 1 }},
|
31
|
+
{ 'name': 'Xiang Xiang', 'title': 'UE engineer', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 1 }}
|
32
|
+
]
|
33
|
+
}
|
34
|
+
]
|
35
|
+
},
|
36
|
+
{ 'name': 'Yu Wei', 'title': 'department manager', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 7 }},
|
37
|
+
{ 'name': 'Chun Miao', 'title': 'department manager', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 7 }},
|
38
|
+
{ 'name': 'Yu Tie', 'title': 'department manager', 'relationship': { 'children_num': 0, 'parent_num': 1,'sibling_num': 7 }}
|
39
|
+
]
|
40
|
+
};
|
41
|
+
// {
|
42
|
+
// 'nodeTitle': 'name',
|
43
|
+
// 'nodeId': 'id',
|
44
|
+
// 'toggleSiblingsResp': false,
|
45
|
+
// 'depth': 999,
|
46
|
+
// 'chartClass': '',
|
47
|
+
// 'exportButton': false,
|
48
|
+
// 'exportFilename': 'OrgChart',
|
49
|
+
// 'exportFileextension': 'png',
|
50
|
+
// 'parentNodeSymbol': 'fa-users',
|
51
|
+
// 'draggable': false,
|
52
|
+
// 'direction': 't2b',
|
53
|
+
// 'pan': false,
|
54
|
+
// 'zoom': false,
|
55
|
+
// 'zoominLimit': 7,
|
56
|
+
// 'zoomoutLimit': 0.5
|
57
|
+
// };
|
58
|
+
// var oc = $('#orgchart').orgchart({
|
59
|
+
// 'data' : datascource,
|
60
|
+
// 'depth': 2,
|
61
|
+
// 'nodeTitle': 'name',
|
62
|
+
// 'nodeContent': 'title',
|
63
|
+
// 'toggleSiblingsResp': true
|
64
|
+
// });
|
65
|
+
|
66
|
+
$('[data-orgchart-type=1]').orgchart({
|
67
|
+
'data' : datascource,
|
68
|
+
'depth': 2,
|
69
|
+
'createNode': function(node, data) {
|
70
|
+
orgChartNode1(node, data);
|
71
|
+
},
|
72
|
+
'toggleSiblingsResp': true
|
73
|
+
});
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
function orgChartNode1(node, data){
|
81
|
+
// let secondMenuIcon = document.createElement('i'),
|
82
|
+
// secondMenu = document.createElement('div');
|
83
|
+
|
84
|
+
// secondMenuIcon.setAttribute('class', 'fa fa-info-circle second-menu-icon');
|
85
|
+
// secondMenuIcon.addEventListener('click', (event) => {
|
86
|
+
// event.target.nextElementSibling.classList.toggle('hidden');
|
87
|
+
// });
|
88
|
+
// secondMenu.setAttribute('class', 'second-menu hidden');
|
89
|
+
// secondMenu.innerHTML = `<img class="avatar" src="../img/avatar/${data.id}.jpg">`;
|
90
|
+
// node.append(secondMenuIcon);
|
91
|
+
// node.append(secondMenu);
|
92
|
+
|
93
|
+
node.append(
|
94
|
+
'<div class="content">' +
|
95
|
+
'<div class="orgchart-container">' +
|
96
|
+
`<img class="orgchart-avatar" src="/uploads/user/avatar/1/57394.jpg">` +
|
97
|
+
'<div class="text">' +
|
98
|
+
`<p class="">Ocup. ${data.title}</p>`+
|
99
|
+
`<p class="">Dep. ${data.title}</p>`+
|
100
|
+
`<p class="">Niv. ${data.title}</p>`+
|
101
|
+
'</div>'+
|
102
|
+
'</div>'+
|
103
|
+
'</div>'
|
104
|
+
);
|
105
|
+
|
106
|
+
}
|
107
|
+
|
108
|
+
});
|
@@ -0,0 +1,2 @@
|
|
1
|
+
"use strict";!function(e){"object"==typeof module&&"object"==typeof module.exports?e(require("jquery"),window,document):e(jQuery,window,document)}(function(e,t,i,n){var s=function(t,i){this.$chartContainer=e(t),this.opts=i,this.defaultOptions={nodeTitle:"name",nodeId:"id",toggleSiblingsResp:!1,depth:999,chartClass:"",exportButton:!1,exportFilename:"OrgChart",exportFileextension:"png",parentNodeSymbol:"fa-users",draggable:!1,direction:"t2b",pan:!1,zoom:!1,zoominLimit:7,zoomoutLimit:.5}};s.prototype={init:function(n){var s=this;this.options=e.extend({},this.defaultOptions,this.opts,n);var a=this.$chartContainer;this.$chart&&this.$chart.remove();var o=this.options.data,r=this.$chart=e("<div>",{data:{options:this.options},class:"orgchart"+(""!==this.options.chartClass?" "+this.options.chartClass:"")+("t2b"!==this.options.direction?" "+this.options.direction:""),click:function(t){e(t.target).closest(".node").length||r.find(".node.focused").removeClass("focused")}});if("undefined"!=typeof MutationObserver){var d=new MutationObserver(function(e){d.disconnect();e:for(var t=0;t<e.length;t++)for(var i=0;i<e[t].addedNodes.length;i++)if(e[t].addedNodes[i].classList.contains("orgchart")&&s.options.initCompleted&&"function"==typeof s.options.initCompleted){s.options.initCompleted(r),r.triggerHandler({type:"init.orgchart"});break e}});d.observe(a[0],{childList:!0})}if("object"===e.type(o)?o instanceof e?this.buildHierarchy(r,this.buildJsonDS(o.children()),0,this.options):this.buildHierarchy(r,this.options.ajaxURL?o:this.attachRel(o,"00"),0,this.options):e.ajax({url:o,dataType:"json",beforeSend:function(){r.append('<i class="fa fa-circle-o-notch fa-spin spinner"></i>')}}).done(function(e,t,i){s.buildHierarchy(r,s.options.ajaxURL?e:s.attachRel(e,"00"),0,s.options)}).fail(function(e,t,i){console.log(i)}).always(function(){r.children(".spinner").remove()}),a.append(r),this.options.exportButton&&!a.find(".oc-export-btn").length){var l=e("<button>",{class:"oc-export-btn"+(""!==this.options.chartClass?" "+this.options.chartClass:""),text:"Export",click:function(n){if(n.preventDefault(),e(this).children(".spinner").length)return!1;var o=a.find(".mask");o.length?o.removeClass("hidden"):a.append('<div class="mask"><i class="fa fa-circle-o-notch fa-spin spinner"></i></div>');var r=a.addClass("canvasContainer").find(".orgchart:visible").get(0),d="l2r"===s.options.direction||"r2l"===s.options.direction;html2canvas(r,{width:d?r.clientHeight:r.clientWidth,height:d?r.clientWidth:r.clientHeight,onclone:function(t){e(t).find(".canvasContainer").css("overflow","visible").find(".orgchart:visible:first").css("transform","")},onrendered:function(e){if(a.find(".mask").addClass("hidden"),"pdf"===s.options.exportFileextension.toLowerCase()){var n={},o=Math.floor(.2646*e.width),r=Math.floor(.2646*e.height);(n=o>r?new jsPDF("l","mm",[o,r]):new jsPDF("p","mm",[r,o])).addImage(e.toDataURL(),"png",0,0),n.save(s.options.exportFilename+".pdf")}else{var d="WebkitAppearance"in i.documentElement.style,l=!!t.sidebar,c="Microsoft Internet Explorer"===navigator.appName||"Netscape"===navigator.appName&&navigator.appVersion.indexOf("Edge")>-1;!d&&!l||c?t.navigator.msSaveBlob(e.msToBlob(),s.options.exportFilename+".png"):a.find(".oc-download-btn").attr("href",e.toDataURL())[0].click()}}}).then(function(){a.removeClass("canvasContainer")},function(){a.removeClass("canvasContainer")})}});if(a.append(l),"pdf"!==this.options.exportFileextension.toLowerCase()){var c='<a class="oc-download-btn'+(""!==this.options.chartClass?" "+this.options.chartClass:"")+'" download="'+this.options.exportFilename+'.png"></a>';l.after(c)}}return this.options.pan&&this.bindPan(),this.options.zoom&&this.bindZoom(),this},setOptions:function(e,t){return"string"==typeof e&&("pan"===e&&(t?this.bindPan():this.unbindPan()),"zoom"===e&&(t?this.bindZoom():this.unbindZoom())),"object"==typeof e&&(e.data?this.init(e):(void 0!==e.pan&&(e.pan?this.bindPan():this.unbindPan()),void 0!==e.zoom&&(e.zoom?this.bindZoom():this.unbindZoom()))),this},panStartHandler:function(t){var i=e(t.delegateTarget);if(e(t.target).closest(".node").length||t.touches&&t.touches.length>1)i.data("panning",!1);else{i.css("cursor","move").data("panning",!0);var n=0,s=0,a=i.css("transform");if("none"!==a){var o=a.split(",");-1===a.indexOf("3d")?(n=parseInt(o[4]),s=parseInt(o[5])):(n=parseInt(o[12]),s=parseInt(o[13]))}var r=0,d=0;if(t.targetTouches){if(1===t.targetTouches.length)r=t.targetTouches[0].pageX-n,d=t.targetTouches[0].pageY-s;else if(t.targetTouches.length>1)return}else r=t.pageX-n,d=t.pageY-s;i.on("mousemove touchmove",function(e){if(i.data("panning")){var t=0,n=0;if(e.targetTouches){if(1===e.targetTouches.length)t=e.targetTouches[0].pageX-r,n=e.targetTouches[0].pageY-d;else if(e.targetTouches.length>1)return}else t=e.pageX-r,n=e.pageY-d;var s=i.css("transform");if("none"===s)-1===s.indexOf("3d")?i.css("transform","matrix(1, 0, 0, 1, "+t+", "+n+")"):i.css("transform","matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, "+t+", "+n+", 0, 1)");else{var a=s.split(",");-1===s.indexOf("3d")?(a[4]=" "+t,a[5]=" "+n+")"):(a[12]=" "+t,a[13]=" "+n),i.css("transform",a.join(","))}}})}},panEndHandler:function(e){e.data.chart.data("panning")&&e.data.chart.data("panning",!1).css("cursor","default").off("mousemove")},bindPan:function(){this.$chartContainer.css("overflow","hidden"),this.$chart.on("mousedown touchstart",this.panStartHandler),e(i).on("mouseup touchend",{chart:this.$chart},this.panEndHandler)},unbindPan:function(){this.$chartContainer.css("overflow","auto"),this.$chart.off("mousedown touchstart",this.panStartHandler),e(i).off("mouseup touchend",this.panEndHandler)},zoomWheelHandler:function(e){var t=e.data.oc;e.preventDefault();var i=1+(e.originalEvent.deltaY>0?-.2:.2);t.setChartScale(t.$chart,i)},zoomStartHandler:function(e){if(e.touches&&2===e.touches.length){var t=e.data.oc;t.$chart.data("pinching",!0);var i=t.getPinchDist(e);t.$chart.data("pinchDistStart",i)}},zoomingHandler:function(e){var t=e.data.oc;if(t.$chart.data("pinching")){var i=t.getPinchDist(e);t.$chart.data("pinchDistEnd",i)}},zoomEndHandler:function(e){var t=e.data.oc;if(t.$chart.data("pinching")){t.$chart.data("pinching",!1);var i=t.$chart.data("pinchDistEnd")-t.$chart.data("pinchDistStart");i>0?t.setChartScale(t.$chart,1.2):i<0&&t.setChartScale(t.$chart,.8)}},bindZoom:function(){this.$chartContainer.on("wheel",{oc:this},this.zoomWheelHandler),this.$chartContainer.on("touchstart",{oc:this},this.zoomStartHandler),e(i).on("touchmove",{oc:this},this.zoomingHandler),e(i).on("touchend",{oc:this},this.zoomEndHandler)},unbindZoom:function(){this.$chartContainer.off("wheel",this.zoomWheelHandler),this.$chartContainer.off("touchstart",this.zoomStartHandler),e(i).off("touchmove",this.zoomingHandler),e(i).off("touchend",this.zoomEndHandler)},getPinchDist:function(e){return Math.sqrt((e.touches[0].clientX-e.touches[1].clientX)*(e.touches[0].clientX-e.touches[1].clientX)+(e.touches[0].clientY-e.touches[1].clientY)*(e.touches[0].clientY-e.touches[1].clientY))},setChartScale:function(e,i){var n=e.data("options"),s=e.css("transform"),a="",o=1;"none"===s?e.css("transform","scale("+i+","+i+")"):(a=s.split(","),-1===s.indexOf("3d")?(o=t.parseFloat(a[3])*i)>n.zoomoutLimit&&o<n.zoominLimit&&e.css("transform",s+" scale("+i+","+i+")"):(o=t.parseFloat(a[1])*i)>n.zoomoutLimit&&o<n.zoominLimit&&e.css("transform",s+" scale3d("+i+","+i+", 1)"))},buildJsonDS:function(t){var i=this,n={name:t.contents().eq(0).text().trim(),relationship:(t.parent().parent().is("li")?"1":"0")+(t.siblings("li").length?1:0)+(t.children("ul").length?1:0)};return t[0].id&&(n.id=t[0].id),t.children("ul").children().each(function(){n.children||(n.children=[]),n.children.push(i.buildJsonDS(e(this)))}),n},attachRel:function(e,t){var i=this;return e.relationship=t+(e.children&&e.children.length>0?1:0),e.children&&e.children.forEach(function(t){i.attachRel(t,"1"+(e.children.length>1?1:0))}),e},loopChart:function(t){var i=this,n=t.find("tr:first"),s={id:n.find(".node")[0].id};return n.siblings(":last").children().each(function(){s.children||(s.children=[]),s.children.push(i.loopChart(e(this)))}),s},getHierarchy:function(e){return(e=e||this.$chart).find(".node:first")[0].id?this.loopChart(e):"Error: Nodes of orghcart to be exported must have id attribute!"},getNodeState:function(e,t){var i={};return"parent"===t?i=e.closest(".nodes").siblings(":first"):"children"===t?i=e.closest("tr").siblings():"siblings"===t&&(i=e.closest("table").parent().siblings()),i.length?i.is(":visible")?{exist:!0,visible:!0}:{exist:!0,visible:!1}:{exist:!1,visible:!1}},getRelatedNodes:function(e,t){return"parent"===t?e.closest(".nodes").parent().children(":first").find(".node"):"children"===t?e.closest("table").children(":last").children().find(".node:first"):"siblings"===t?e.closest("table").parent().siblings().find(".node:first"):void 0},hideParent:function(e){var t=e.closest("table").closest("tr").siblings();t.eq(0).find(".spinner").length&&e.closest(".orgchart").data("inAjax",!1),this.getNodeState(e,"siblings").visible&&this.hideSiblings(e);var i=t.slice(1);i.css("visibility","hidden");var n=t.eq(0).find(".node"),s=this.getNodeState(n,"parent").visible;n.length&&n.is(":visible")&&n.addClass("slide slide-down").one("transitionend",function(){n.removeClass("slide"),i.removeAttr("style"),t.addClass("hidden")}),n.length&&s&&this.hideParent(n)},showParent:function(t){var i=this,n=t.closest("table").closest("tr").siblings().removeClass("hidden");n.eq(2).children().slice(1,-1).addClass("hidden");var s=n.eq(0).find(".node")[0];this.repaint(s),e(s).addClass("slide").removeClass("slide-down").one("transitionend",function(){e(s).removeClass("slide"),i.isInAction(t)&&i.switchVerticalArrow(t.children(".topEdge"))})},hideChildren:function(e){var t=this,i=e.closest("tr").siblings();i.last().find(".spinner").length&&e.closest(".orgchart").data("inAjax",!1);var n=i.last().find(".node:visible"),s=!!i.last().is(".verticalNodes");if(!s)var a=n.closest("table").closest("tr").prevAll(".lines").css("visibility","hidden");n.addClass("slide slide-up").eq(0).one("transitionend",function(){n.removeClass("slide"),s?i.addClass("hidden"):(a.removeAttr("style").addClass("hidden").siblings(".nodes").addClass("hidden"),i.last().find(".verticalNodes").addClass("hidden")),t.isInAction(e)&&t.switchVerticalArrow(e.children(".bottomEdge"))})},showChildren:function(e){var t=this,i=e.closest("tr").siblings(),n=!!i.is(".verticalNodes")?i.removeClass("hidden").find(".node:visible"):i.removeClass("hidden").eq(2).children().find(".node:first");this.repaint(n.get(0)),n.addClass("slide").removeClass("slide-up").eq(0).one("transitionend",function(){n.removeClass("slide"),t.isInAction(e)&&t.switchVerticalArrow(e.children(".bottomEdge"))})},hideSiblings:function(e,t){var i=this,n=e.closest("table").parent();n.siblings().find(".spinner").length&&e.closest(".orgchart").data("inAjax",!1),t?"left"===t?n.prevAll().find(".node:visible").addClass("slide slide-right"):n.nextAll().find(".node:visible").addClass("slide slide-left"):(n.prevAll().find(".node:visible").addClass("slide slide-right"),n.nextAll().find(".node:visible").addClass("slide slide-left"));var s=n.siblings().find(".slide"),a=s.closest(".nodes").prevAll(".lines").css("visibility","hidden");s.eq(0).one("transitionend",function(){a.removeAttr("style");var o=t?"left"===t?n.prevAll(":not(.hidden)"):n.nextAll(":not(.hidden)"):n.siblings();n.closest(".nodes").prev().children(":not(.hidden)").slice(1,t?2*o.length+1:-1).addClass("hidden"),s.removeClass("slide"),o.find(".node:visible:gt(0)").removeClass("slide-left slide-right").addClass("slide-up").end().find(".lines, .nodes, .verticalNodes").addClass("hidden").end().addClass("hidden"),i.isInAction(e)&&i.switchHorizontalArrow(e)})},showSiblings:function(t,i){var n=this,s=e();s=i?"left"===i?t.closest("table").parent().prevAll().removeClass("hidden"):t.closest("table").parent().nextAll().removeClass("hidden"):t.closest("table").parent().siblings().removeClass("hidden");var a=t.closest("table").closest("tr").siblings();if(i?a.eq(2).children(".hidden").slice(0,2*s.length).removeClass("hidden"):a.eq(2).children(".hidden").removeClass("hidden"),!this.getNodeState(t,"parent").visible){a.removeClass("hidden");var o=a.find(".node")[0];this.repaint(o),e(o).addClass("slide").removeClass("slide-down").one("transitionend",function(){e(this).removeClass("slide")})}s.find(".node:visible").addClass("slide").removeClass("slide-left slide-right").eq(-1).one("transitionend",function(){s.find(".node:visible").removeClass("slide"),n.isInAction(t)&&(n.switchHorizontalArrow(t),t.children(".topEdge").removeClass("fa-chevron-up").addClass("fa-chevron-down"))})},startLoading:function(t,i,n){var s=i.closest(".orgchart");return(void 0===s.data("inAjax")||!0!==s.data("inAjax"))&&(t.addClass("hidden"),i.append('<i class="fa fa-circle-o-notch fa-spin spinner"></i>'),i.children().not(".spinner").css("opacity",.2),s.data("inAjax",!0),e(".oc-export-btn"+(""!==n.chartClass?"."+n.chartClass:"")).prop("disabled",!0),!0)},endLoading:function(t,i,n){var s=i.closest("div.orgchart");t.removeClass("hidden"),i.find(".spinner").remove(),i.children().removeAttr("style"),s.data("inAjax",!1),e(".oc-export-btn"+(""!==n.chartClass?"."+n.chartClass:"")).prop("disabled",!1)},isInAction:function(e){return e.children(".edge").attr("class").indexOf("fa-")>-1},switchVerticalArrow:function(e){e.toggleClass("fa-chevron-up").toggleClass("fa-chevron-down")},switchHorizontalArrow:function(e){var t=e.closest(".orgchart").data("options");if(t.toggleSiblingsResp&&(void 0===t.ajaxURL||e.closest(".nodes").data("siblingsLoaded"))){var i=e.closest("table").parent().prev();i.length&&(i.is(".hidden")?e.children(".leftEdge").addClass("fa-chevron-left").removeClass("fa-chevron-right"):e.children(".leftEdge").addClass("fa-chevron-right").removeClass("fa-chevron-left"));var n=e.closest("table").parent().next();n.length&&(n.is(".hidden")?e.children(".rightEdge").addClass("fa-chevron-right").removeClass("fa-chevron-left"):e.children(".rightEdge").addClass("fa-chevron-left").removeClass("fa-chevron-right"))}else{var s=e.closest("table").parent().siblings(),a=!!s.length&&!s.is(".hidden");e.children(".leftEdge").toggleClass("fa-chevron-right",a).toggleClass("fa-chevron-left",!a),e.children(".rightEdge").toggleClass("fa-chevron-left",a).toggleClass("fa-chevron-right",!a)}},repaint:function(e){e&&(e.style.offsetWidth=e.offsetWidth)},createNode:function(n,s,a){var o=this;e.each(n.children,function(e,t){t.parentId=n.id});var r=e.Deferred(),d=e("<div"+(a.draggable?' draggable="true"':"")+(n[a.nodeId]?' id="'+n[a.nodeId]+'"':"")+(n.parentId?' data-parent="'+n.parentId+'"':"")+">").addClass("node "+(n.className||"")+(s>=a.depth?" slide-up":""));a.nodeTemplate?d.append(a.nodeTemplate(n)):d.append('<div class="title">'+n[a.nodeTitle]+"</div>").append(void 0!==a.nodeContent?'<div class="content">'+(n[a.nodeContent]||"")+"</div>":"");var l=n.relationship||"";if(a.verticalDepth&&s+2>a.verticalDepth){if(s+1>=a.verticalDepth&&Number(l.substr(2,1))){var c=s+1>=a.depth?"plus":"minus";d.append('<i class="toggleBtn fa fa-'+c+'-square"></i>')}}else Number(l.substr(0,1))&&d.append('<i class="edge verticalEdge topEdge fa"></i>'),Number(l.substr(1,1))&&d.append('<i class="edge horizontalEdge rightEdge fa"></i><i class="edge horizontalEdge leftEdge fa"></i>'),Number(l.substr(2,1))&&d.append('<i class="edge verticalEdge bottomEdge fa"></i>').children(".title").prepend('<i class="fa '+a.parentNodeSymbol+' symbol"></i>');return d.on("mouseenter mouseleave",function(t){var i=e(this),n=!1,s=i.children(".topEdge"),a=(i.children(".rightEdge"),i.children(".bottomEdge")),r=i.children(".leftEdge");"mouseenter"===t.type?(s.length&&(n=o.getNodeState(i,"parent").visible,s.toggleClass("fa-chevron-up",!n).toggleClass("fa-chevron-down",n)),a.length&&(n=o.getNodeState(i,"children").visible,a.toggleClass("fa-chevron-down",!n).toggleClass("fa-chevron-up",n)),r.length&&o.switchHorizontalArrow(i)):i.children(".edge").removeClass("fa-chevron-up fa-chevron-down fa-chevron-right fa-chevron-left")}),d.on("click",function(t){e(this).closest(".orgchart").find(".focused").removeClass("focused"),e(this).addClass("focused")}),d.on("click",".topEdge",function(t){t.stopPropagation();var i=e(this),s=i.parent(),r=o.getNodeState(s,"parent");if(r.exist){var d=s.closest("table").closest("tr").siblings(":first").find(".node");if(d.is(".slide"))return;r.visible?(o.hideParent(s),d.one("transitionend",function(){o.isInAction(s)&&(o.switchVerticalArrow(i),o.switchHorizontalArrow(s))})):o.showParent(s)}else{var l=i.parent()[0].id;o.startLoading(i,s,a)&&e.ajax({url:e.isFunction(a.ajaxURL.parent)?a.ajaxURL.parent(n):a.ajaxURL.parent+l,dataType:"json"}).done(function(t){s.closest(".orgchart").data("inAjax")&&(e.isEmptyObject(t)||o.addParent(s,t,a))}).fail(function(){console.log("Failed to get parent node data")}).always(function(){o.endLoading(i,s,a)})}}),d.on("click",".bottomEdge",function(t){t.stopPropagation();var i=e(this),s=i.parent(),r=o.getNodeState(s,"children");if(r.exist){if(s.closest("tr").siblings(":last").find(".node:visible").is(".slide"))return;r.visible?o.hideChildren(s):o.showChildren(s)}else{var d=i.parent()[0].id;o.startLoading(i,s,a)&&e.ajax({url:e.isFunction(a.ajaxURL.children)?a.ajaxURL.children(n):a.ajaxURL.children+d,dataType:"json"}).done(function(t,i,n){s.closest(".orgchart").data("inAjax")&&t.children.length&&o.addChildren(s,t,e.extend({},a,{depth:0}))}).fail(function(e,t,i){console.log("Failed to get children nodes data")}).always(function(){o.endLoading(i,s,a)})}}),d.on("click",".toggleBtn",function(t){var i=e(this),n=i.parent().next(),s=n.find(".node"),a=n.children().children(".node");a.is(".slide")||(i.toggleClass("fa-plus-square fa-minus-square"),s.eq(0).is(".slide-up")?(n.removeClass("hidden"),o.repaint(a.get(0)),a.addClass("slide").removeClass("slide-up").eq(0).one("transitionend",function(){a.removeClass("slide")})):(s.addClass("slide slide-up").eq(0).one("transitionend",function(){s.removeClass("slide"),s.closest("ul").addClass("hidden")}),s.find(".toggleBtn").removeClass("fa-minus-square").addClass("fa-plus-square")))}),d.on("click",".leftEdge, .rightEdge",function(t){t.stopPropagation();var i=e(this),s=i.parent(),r=o.getNodeState(s,"siblings");if(r.exist){if(s.closest("table").parent().siblings().find(".node:visible").is(".slide"))return;if(a.toggleSiblingsResp){var d=s.closest("table").parent().prev(),l=s.closest("table").parent().next();i.is(".leftEdge")?d.is(".hidden")?o.showSiblings(s,"left"):o.hideSiblings(s,"left"):l.is(".hidden")?o.showSiblings(s,"right"):o.hideSiblings(s,"right")}else r.visible?o.hideSiblings(s):o.showSiblings(s)}else{var c=i.parent()[0].id,h=o.getNodeState(s,"parent").exist?e.isFunction(a.ajaxURL.siblings)?a.ajaxURL.siblings(n):a.ajaxURL.siblings+c:e.isFunction(a.ajaxURL.families)?a.ajaxURL.families(n):a.ajaxURL.families+c;o.startLoading(i,s,a)&&e.ajax({url:h,dataType:"json"}).done(function(e,t,i){s.closest(".orgchart").data("inAjax")&&(e.siblings||e.children)&&o.addSiblings(s,e,a)}).fail(function(e,t,i){console.log("Failed to get sibling nodes data")}).always(function(){o.endLoading(i,s,a)})}}),a.draggable&&d.on("dragstart",function(n){var s=n.originalEvent,o=/firefox/.test(t.navigator.userAgent.toLowerCase());if(o&&s.dataTransfer.setData("text/html","hack for firefox"),"none"!==d.closest(".orgchart").css("transform")){var r,l;i.querySelector(".ghost-node")?(r=d.closest(".orgchart").children(".ghost-node").get(0),l=e(r).children().get(0)):((r=i.createElementNS("http://www.w3.org/2000/svg","svg")).classList.add("ghost-node"),l=i.createElementNS("http://www.w3.org/2000/svg","rect"),r.appendChild(l),d.closest(".orgchart").append(r));var c=d.closest(".orgchart").css("transform").split(","),h=Math.abs(t.parseFloat("t2b"===a.direction||"b2t"===a.direction?c[0].slice(c[0].indexOf("(")+1):c[1]));r.setAttribute("width",d.outerWidth(!1)),r.setAttribute("height",d.outerHeight(!1)),l.setAttribute("x",5*h),l.setAttribute("y",5*h),l.setAttribute("width",120*h),l.setAttribute("height",40*h),l.setAttribute("rx",4*h),l.setAttribute("ry",4*h),l.setAttribute("stroke-width",1*h);var p=s.offsetX*h,f=s.offsetY*h;if("l2r"===a.direction?(p=s.offsetY*h,f=s.offsetX*h):"r2l"===a.direction?(p=d.outerWidth(!1)-s.offsetY*h,f=s.offsetX*h):"b2t"===a.direction&&(p=d.outerWidth(!1)-s.offsetX*h,f=d.outerHeight(!1)-s.offsetY*h),o){l.setAttribute("fill","rgb(255, 255, 255)"),l.setAttribute("stroke","rgb(191, 0, 0)");var g=i.createElement("img");g.src="data:image/svg+xml;utf8,"+(new XMLSerializer).serializeToString(r),s.dataTransfer.setDragImage(g,p,f)}else s.dataTransfer.setDragImage(r,p,f)}var v=e(this),u=v.closest(".nodes").siblings().eq(0).find(".node:first"),b=v.closest("table").find(".node");v.closest(".orgchart").data("dragged",v).find(".node").each(function(t,i){-1===b.index(i)&&(a.dropCriteria?a.dropCriteria(v,u,e(i))&&e(i).addClass("allowedDrop"):e(i).addClass("allowedDrop"))})}).on("dragover",function(t){t.preventDefault(),e(this).is(".allowedDrop")||(t.originalEvent.dataTransfer.dropEffect="none")}).on("dragend",function(t){e(this).closest(".orgchart").find(".allowedDrop").removeClass("allowedDrop")}).on("drop",function(t){var i=e(this),n=i.closest(".orgchart"),s=n.data("dragged");n.find(".allowedDrop").removeClass("allowedDrop");var a=s.closest(".nodes").siblings().eq(0).children();if(i.closest("tr").siblings().length){var o=parseInt(i.parent().attr("colspan"))+2,r='<i class="edge horizontalEdge rightEdge fa"></i><i class="edge horizontalEdge leftEdge fa"></i>';i.closest("tr").next().addBack().children().attr("colspan",o),s.find(".horizontalEdge").length||s.append(r),i.closest("tr").siblings().eq(1).children(":last").before('<td class="leftLine topLine"> </td><td class="rightLine topLine"> </td>').end().next().append(s.closest("table").parent());var d=s.closest("table").parent().siblings().find(".node:first");1===d.length&&d.append(r)}else i.append('<i class="edge verticalEdge bottomEdge fa"></i>').parent().attr("colspan",2).parent().after('<tr class="lines"><td colspan="2"><div class="downLine"></div></td></tr><tr class="lines"><td class="rightLine"> </td><td class="leftLine"> </td></tr><tr class="nodes"></tr>').siblings(":last").append(s.find(".horizontalEdge").remove().end().closest("table").parent());var l=parseInt(a.attr("colspan"));if(l>2){a.attr("colspan",l-2).parent().next().children().attr("colspan",l-2).end().next().children().slice(1,3).remove();var c=a.parent().siblings(".nodes").children().find(".node:first");1===c.length&&c.find(".horizontalEdge").remove()}else a.removeAttr("colspan").find(".bottomEdge").remove().end().end().siblings().remove();n.triggerHandler({type:"nodedropped.orgchart",draggedNode:s,dragZone:a.children(),dropZone:i})}),a.createNode&&a.createNode(d,n),r.resolve(d),r.promise()},buildHierarchy:function(t,i,n,s,a){var o,r=this,d=i.children,l=!!d&&d.length,c=!!(s.verticalDepth&&n+1>=s.verticalDepth);if(Object.keys(i).length>1&&(o=c?t:e("<table>"),c||t.append(o),e.when(this.createNode(i,n,s)).done(function(e){c?o.append(e):o.append(e.wrap("<tr><td"+(l?' colspan="'+2*d.length+'"':"")+"></td></tr>").closest("tr")),a&&a()}).fail(function(){console.log("Failed to creat node")})),l){1===Object.keys(i).length&&(o=t);var h=n+1>=s.depth||i.collapsed?" hidden":"",p=!!(s.verticalDepth&&n+2>=s.verticalDepth);p||o.append('<tr class="lines'+h+'"><td colspan="'+2*d.length+'"><div class="downLine"></div></td></tr>');for(var f='<tr class="lines'+h+'"><td class="rightLine"> </td>',g=1;g<d.length;g++)f+='<td class="leftLine topLine"> </td><td class="rightLine topLine"> </td>';f+='<td class="leftLine"> </td></tr>';var v;p?(v=e("<ul>"),h&&v.addClass(h),n+2===s.verticalDepth?o.append('<tr class="verticalNodes'+h+'"><td></td></tr>').find(".verticalNodes").children().append(v):o.append(v)):(v=e('<tr class="nodes'+h+'">'),o.append(f).append(v)),e.each(d,function(){var t=e(p?"<li>":'<td colspan="2">');v.append(t),r.buildHierarchy(t,this,n+1,s,a)})}},buildChildNode:function(e,t,i,n){var i=i||e.closest(".orgchart").data("options"),s=t.children||t.siblings;e.find("td:first").attr("colspan",2*s.length),this.buildHierarchy(e,{children:s},0,i,n)},addChildren:function(e,t,i){var n=this,i=i||e.closest(".orgchart").data("options"),s=0;this.buildChildNode(e.closest("table"),t,i,function(){++s===t.children.length&&(e.children(".bottomEdge").length||e.append('<i class="edge verticalEdge bottomEdge fa"></i>'),e.find(".symbol").length||e.children(".title").prepend('<i class="fa '+i.parentNodeSymbol+' symbol"></i>'),n.showChildren(e))})},buildParentNode:function(t,i,n,s){var a=this,o=e("<table>");i.relationship=i.relationship||"001",e.when(this.createNode(i,0,n||t.closest(".orgchart").data("options"))).done(function(e){o.append(e.removeClass("slide-up").addClass("slide-down").wrap('<tr class="hidden"><td colspan="2"></td></tr>').closest("tr")),o.append('<tr class="lines hidden"><td colspan="2"><div class="downLine"></div></td></tr>');o.append('<tr class="lines hidden"><td class="rightLine"> </td><td class="leftLine"> </td></tr>');var t=a.$chart;t.prepend(o).children("table:first").append('<tr class="nodes"><td colspan="2"></td></tr>').children("tr:last").children().append(t.children("table").last()),s()}).fail(function(){console.log("Failed to create parent node")})},addParent:function(e,t,i){var n=this;this.buildParentNode(e,t,i,function(){e.children(".topEdge").length||e.children(".title").after('<i class="edge verticalEdge topEdge fa"></i>'),n.showParent(e)})},complementLine:function(e,t,i){for(var n="",s=0;s<i;s++)n+='<td class="leftLine topLine"> </td><td class="rightLine topLine"> </td>';e.parent().prevAll("tr:gt(0)").children().attr("colspan",2*t).end().next().children(":first").after(n)},buildSiblingNode:function(t,i,n,s){var a=this,n=n||t.closest(".orgchart").data("options"),o=i.siblings?i.siblings.length:i.children.length,r=t.parent().is("td")?t.closest("tr").children().length:1,d=r+o,l=d>1?Math.floor(d/2-1):0;if(t.parent().is("td")){t.closest("tr").prevAll("tr:last");t.closest("tr").prevAll("tr:lt(2)").remove();var c=0;this.buildChildNode(t.parent().closest("table"),i,n,function(){if(++c===o){var e=t.parent().closest("table").children("tr:last").children("td");r>1?(a.complementLine(e.eq(0).before(t.closest("td").siblings().addBack().unwrap()),d,r),e.addClass("hidden").find(".node").addClass("slide-left")):(a.complementLine(e.eq(l).after(t.closest("td").unwrap()),d,1),e.not(":eq("+l+"1)").addClass("hidden").slice(0,l).find(".node").addClass("slide-right").end().end().slice(l).find(".node").addClass("slide-left")),s()}})}else{var h=0;this.buildHierarchy(t.closest(".orgchart"),i,0,n,function(){++h===d&&(a.complementLine(t.next().children("tr:last").children().eq(l).after(e('<td colspan="2">').append(t)),d,1),t.closest("tr").siblings().eq(0).addClass("hidden").find(".node").addClass("slide-down"),t.parent().siblings().addClass("hidden").slice(0,l).find(".node").addClass("slide-right").end().end().slice(l).find(".node").addClass("slide-left"),s())})}},addSiblings:function(e,t,i){var n=this;this.buildSiblingNode(e.closest("table"),t,i,function(){e.closest(".nodes").data("siblingsLoaded",!0),e.children(".leftEdge").length||e.children(".topEdge").after('<i class="edge horizontalEdge rightEdge fa"></i><i class="edge horizontalEdge leftEdge fa"></i>'),n.showSiblings(e)})},removeNodes:function(e){var t=e.closest("table").parent(),i=t.parent().siblings();t.is("td")?this.getNodeState(e,"siblings").exist?(i.eq(2).children(".topLine:lt(2)").remove(),i.slice(0,2).children().attr("colspan",i.eq(2).children().length),t.remove()):i.eq(0).children().removeAttr("colspan").find(".bottomEdge").remove().end().end().siblings().remove():t.add(t.siblings()).remove()}},e.fn.orgchart=function(e){return new s(this,e).init()}});
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImpzL2pxdWVyeS5vcmdjaGFydC5qcyJdLCJuYW1lcyI6WyJmYWN0b3J5IiwibW9kdWxlIiwiZXhwb3J0cyIsInJlcXVpcmUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImpRdWVyeSIsIiQiLCJ1bmRlZmluZWQiLCJPcmdDaGFydCIsImVsZW0iLCJvcHRzIiwidGhpcyIsIiRjaGFydENvbnRhaW5lciIsImRlZmF1bHRPcHRpb25zIiwibm9kZVRpdGxlIiwibm9kZUlkIiwidG9nZ2xlU2libGluZ3NSZXNwIiwiZGVwdGgiLCJjaGFydENsYXNzIiwiZXhwb3J0QnV0dG9uIiwiZXhwb3J0RmlsZW5hbWUiLCJleHBvcnRGaWxlZXh0ZW5zaW9uIiwicGFyZW50Tm9kZVN5bWJvbCIsImRyYWdnYWJsZSIsImRpcmVjdGlvbiIsInBhbiIsInpvb20iLCJ6b29taW5MaW1pdCIsInpvb21vdXRMaW1pdCIsInByb3RvdHlwZSIsImluaXQiLCJ0aGF0Iiwib3B0aW9ucyIsImV4dGVuZCIsIiRjaGFydCIsInJlbW92ZSIsImRhdGEiLCJjbGFzcyIsImNsaWNrIiwiZXZlbnQiLCJ0YXJnZXQiLCJjbG9zZXN0IiwibGVuZ3RoIiwiZmluZCIsInJlbW92ZUNsYXNzIiwiTXV0YXRpb25PYnNlcnZlciIsIm1vIiwibXV0YXRpb25zIiwiZGlzY29ubmVjdCIsImluaXRUaW1lIiwiaSIsImoiLCJhZGRlZE5vZGVzIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJpbml0Q29tcGxldGVkIiwidHJpZ2dlckhhbmRsZXIiLCJ0eXBlIiwib2JzZXJ2ZSIsImNoaWxkTGlzdCIsImJ1aWxkSGllcmFyY2h5IiwiYnVpbGRKc29uRFMiLCJjaGlsZHJlbiIsImFqYXhVUkwiLCJhdHRhY2hSZWwiLCJhamF4IiwidXJsIiwiZGF0YVR5cGUiLCJiZWZvcmVTZW5kIiwiYXBwZW5kIiwiZG9uZSIsInRleHRTdGF0dXMiLCJqcVhIUiIsImZhaWwiLCJlcnJvclRocm93biIsImNvbnNvbGUiLCJsb2ciLCJhbHdheXMiLCIkZXhwb3J0QnRuIiwidGV4dCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsIiRtYXNrIiwic291cmNlQ2hhcnQiLCJhZGRDbGFzcyIsImdldCIsImZsYWciLCJodG1sMmNhbnZhcyIsIndpZHRoIiwiY2xpZW50SGVpZ2h0IiwiY2xpZW50V2lkdGgiLCJoZWlnaHQiLCJvbmNsb25lIiwiY2xvbmVEb2MiLCJjc3MiLCJvbnJlbmRlcmVkIiwiY2FudmFzIiwidG9Mb3dlckNhc2UiLCJkb2MiLCJkb2NXaWR0aCIsIk1hdGgiLCJmbG9vciIsImRvY0hlaWdodCIsImpzUERGIiwiYWRkSW1hZ2UiLCJ0b0RhdGFVUkwiLCJzYXZlIiwiaXNXZWJraXQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSIsImlzRmYiLCJzaWRlYmFyIiwiaXNFZGdlIiwibmF2aWdhdG9yIiwiYXBwTmFtZSIsImFwcFZlcnNpb24iLCJpbmRleE9mIiwibXNTYXZlQmxvYiIsIm1zVG9CbG9iIiwiYXR0ciIsInRoZW4iLCJkb3dubG9hZEJ0biIsImFmdGVyIiwiYmluZFBhbiIsImJpbmRab29tIiwic2V0T3B0aW9ucyIsInZhbCIsInVuYmluZFBhbiIsInVuYmluZFpvb20iLCJwYW5TdGFydEhhbmRsZXIiLCJkZWxlZ2F0ZVRhcmdldCIsInRvdWNoZXMiLCJsYXN0WCIsImxhc3RZIiwibGFzdFRmIiwidGVtcCIsInNwbGl0IiwicGFyc2VJbnQiLCJzdGFydFgiLCJzdGFydFkiLCJ0YXJnZXRUb3VjaGVzIiwicGFnZVgiLCJwYWdlWSIsIm9uIiwibmV3WCIsIm5ld1kiLCJtYXRyaXgiLCJqb2luIiwicGFuRW5kSGFuZGxlciIsImNoYXJ0Iiwib2ZmIiwiem9vbVdoZWVsSGFuZGxlciIsIm9jIiwibmV3U2NhbGUiLCJvcmlnaW5hbEV2ZW50IiwiZGVsdGFZIiwic2V0Q2hhcnRTY2FsZSIsInpvb21TdGFydEhhbmRsZXIiLCJkaXN0IiwiZ2V0UGluY2hEaXN0Iiwiem9vbWluZ0hhbmRsZXIiLCJ6b29tRW5kSGFuZGxlciIsImRpZmYiLCJzcXJ0IiwiY2xpZW50WCIsImNsaWVudFkiLCJ0YXJnZXRTY2FsZSIsInBhcnNlRmxvYXQiLCIkbGkiLCJzdWJPYmoiLCJuYW1lIiwiY29udGVudHMiLCJlcSIsInRyaW0iLCJyZWxhdGlvbnNoaXAiLCJwYXJlbnQiLCJpcyIsInNpYmxpbmdzIiwiaWQiLCJlYWNoIiwicHVzaCIsImZsYWdzIiwiZm9yRWFjaCIsIml0ZW0iLCJsb29wQ2hhcnQiLCIkdHIiLCJnZXRIaWVyYXJjaHkiLCJnZXROb2RlU3RhdGUiLCIkbm9kZSIsInJlbGF0aW9uIiwiJHRhcmdldCIsImV4aXN0IiwidmlzaWJsZSIsImdldFJlbGF0ZWROb2RlcyIsImhpZGVQYXJlbnQiLCIkdGVtcCIsImhpZGVTaWJsaW5ncyIsIiRsaW5lcyIsInNsaWNlIiwiJHBhcmVudCIsImdyYW5kZmF0aGVyVmlzaWJsZSIsIm9uZSIsInJlbW92ZUF0dHIiLCJzaG93UGFyZW50IiwicmVwYWludCIsImlzSW5BY3Rpb24iLCJzd2l0Y2hWZXJ0aWNhbEFycm93IiwiaGlkZUNoaWxkcmVuIiwibGFzdCIsIiR2aXNpYmxlTm9kZXMiLCJpc1ZlcnRpY2FsRGVzYyIsInByZXZBbGwiLCJzaG93Q2hpbGRyZW4iLCIkbGV2ZWxzIiwiJGRlc2NlbmRhbnRzIiwiJG5vZGVDb250YWluZXIiLCJuZXh0QWxsIiwiJGFuaW1hdGVkTm9kZXMiLCIkc2libGluZ3MiLCJwcmV2IiwiZW5kIiwic3dpdGNoSG9yaXpvbnRhbEFycm93Iiwic2hvd1NpYmxpbmdzIiwiJHVwcGVyTGV2ZWwiLCJzdGFydExvYWRpbmciLCIkYXJyb3ciLCJub3QiLCJwcm9wIiwiZW5kTG9hZGluZyIsInRvZ2dsZUNsYXNzIiwiJHByZXZTaWIiLCIkbmV4dFNpYiIsIm5leHQiLCIkc2licyIsInNpYnNWaXNpYmxlIiwibm9kZSIsIm9mZnNldFdpZHRoIiwiY3JlYXRlTm9kZSIsIm5vZGVEYXRhIiwibGV2ZWwiLCJpbmRleCIsImNoaWxkIiwicGFyZW50SWQiLCJkdGQiLCJEZWZlcnJlZCIsIiRub2RlRGl2IiwiY2xhc3NOYW1lIiwibm9kZVRlbXBsYXRlIiwibm9kZUNvbnRlbnQiLCJ2ZXJ0aWNhbERlcHRoIiwiTnVtYmVyIiwic3Vic3RyIiwiaWNvbiIsInByZXBlbmQiLCIkdG9wRWRnZSIsIiRib3R0b21FZGdlIiwiJGxlZnRFZGdlIiwic3RvcFByb3BhZ2F0aW9uIiwiJHRoYXQiLCJwYXJlbnRTdGF0ZSIsImlzRnVuY3Rpb24iLCJpc0VtcHR5T2JqZWN0IiwiYWRkUGFyZW50IiwiY2hpbGRyZW5TdGF0ZSIsImFkZENoaWxkcmVuIiwiJHRoaXMiLCIkZGVzY1dyYXBwZXIiLCIkY2hpbGRyZW4iLCJzaWJsaW5nc1N0YXRlIiwiZmFtaWxpZXMiLCJhZGRTaWJsaW5ncyIsIm9yaWdFdmVudCIsImlzRmlyZWZveCIsInRlc3QiLCJ1c2VyQWdlbnQiLCJkYXRhVHJhbnNmZXIiLCJzZXREYXRhIiwiZ2hvc3ROb2RlIiwibm9kZUNvdmVyIiwicXVlcnlTZWxlY3RvciIsImNyZWF0ZUVsZW1lbnROUyIsImFkZCIsImFwcGVuZENoaWxkIiwidHJhbnNWYWx1ZXMiLCJzY2FsZSIsImFicyIsInNldEF0dHJpYnV0ZSIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsInhPZmZzZXQiLCJvZmZzZXRYIiwieU9mZnNldCIsIm9mZnNldFkiLCJnaG9zdE5vZGVXcmFwcGVyIiwiY3JlYXRlRWxlbWVudCIsInNyYyIsIlhNTFNlcmlhbGl6ZXIiLCJzZXJpYWxpemVUb1N0cmluZyIsInNldERyYWdJbWFnZSIsIiRkcmFnZ2VkIiwiJGRyYWdab25lIiwiJGRyYWdIaWVyIiwiZHJvcENyaXRlcmlhIiwiZHJvcEVmZmVjdCIsIiRkcm9wWm9uZSIsIiRvcmdjaGFydCIsImRyb3BDb2xzcGFuIiwiaG9yaXpvbnRhbEVkZ2VzIiwiYWRkQmFjayIsImJlZm9yZSIsIiRkcm9wU2licyIsImRyYWdDb2xzcGFuIiwiJGRyYWdTaWJzIiwiZHJhZ2dlZE5vZGUiLCJkcmFnWm9uZSIsImRyb3Bab25lIiwicmVzb2x2ZSIsInByb21pc2UiLCIkYXBwZW5kVG8iLCJjYWxsYmFjayIsIiRub2RlV3JhcHBlciIsIiRjaGlsZE5vZGVzIiwiaGFzQ2hpbGRyZW4iLCJpc1ZlcnRpY2FsTm9kZSIsIk9iamVjdCIsImtleXMiLCJ3aGVuIiwid3JhcCIsImlzSGlkZGVuIiwiY29sbGFwc2VkIiwiaXNWZXJ0aWNhbExheWVyIiwibGluZUxheWVyIiwiJG5vZGVMYXllciIsIiRub2RlQ2VsbCIsImJ1aWxkQ2hpbGROb2RlIiwiY291bnQiLCJidWlsZFBhcmVudE5vZGUiLCIkY3VycmVudFJvb3QiLCIkdGFibGUiLCJjb21wbGVtZW50TGluZSIsIiRvbmVTaWJsaW5nIiwic2libGluZ0NvdW50IiwiZXhpc3RpbmdTaWJsaWdDb3VudCIsImxpbmVzIiwiYnVpbGRTaWJsaW5nTm9kZSIsIiRub2RlQ2hhcnQiLCJuZXdTaWJsaW5nQ291bnQiLCJpbnNlcnRQb3N0aW9uIiwiY2hpbGRDb3VudCIsIiRzaWJsaW5nVGRzIiwidW53cmFwIiwibm9kZUNvdW50IiwicmVtb3ZlTm9kZXMiLCJmbiIsIm9yZ2NoYXJ0Il0sIm1hcHBpbmdzIjoiQUFVQSxjQUVDLFNBQVVBLEdBQ2EsaUJBQVhDLFFBQWlELGlCQUFuQkEsT0FBT0MsUUFDOUNGLEVBQVFHLFFBQVEsVUFBV0MsT0FBUUMsVUFFbkNMLEVBQVFNLE9BQVFGLE9BQVFDLFVBSjVCLENBTUUsU0FBVUUsRUFBR0gsRUFBUUMsRUFBVUcsR0FDL0IsSUFBSUMsRUFBVyxTQUFVQyxFQUFNQyxHQUM3QkMsS0FBS0MsZ0JBQWtCTixFQUFFRyxHQUN6QkUsS0FBS0QsS0FBT0EsRUFDWkMsS0FBS0UsZ0JBQ0hDLFVBQWEsT0FDYkMsT0FBVSxLQUNWQyxvQkFBc0IsRUFDdEJDLE1BQVMsSUFDVEMsV0FBYyxHQUNkQyxjQUFnQixFQUNoQkMsZUFBa0IsV0FDbEJDLG9CQUF1QixNQUN2QkMsaUJBQW9CLFdBQ3BCQyxXQUFhLEVBQ2JDLFVBQWEsTUFDYkMsS0FBTyxFQUNQQyxNQUFRLEVBQ1JDLFlBQWUsRUFDZkMsYUFBZ0IsS0FJ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U0FNUmpELFlBQWEsU0FBVWxGLEVBQU94SixFQUFNMUIsR0FDbEMsSUFBSXFCLEVBQU9wQixLQUNYQSxLQUFLNlUsaUJBQWlCNUosRUFBTW5KLFFBQVEsU0FBVUwsRUFBTTFCLEVBQU0sV0FDeERrTCxFQUFNbkosUUFBUSxVQUFVTCxLQUFLLGtCQUFrQixHQUMxQ3dKLEVBQU05SCxTQUFTLGFBQWFwQixRQUMvQmtKLEVBQU05SCxTQUFTLFlBQVk0RCxNQUFNLG1HQUVuQzNGLEVBQUsrTCxhQUFhbEMsTUFJdEJvSyxZQUFhLFNBQVVwSyxHQUNyQixJQUFJVyxFQUFVWCxFQUFNbkosUUFBUSxTQUFTc0ksU0FDakMwRCxFQUFRbEMsRUFBUXhCLFNBQVNFLFdBQ3pCc0IsRUFBUXZCLEdBQUcsTUFDVHJLLEtBQUtnTCxhQUFhQyxFQUFPLFlBQVlHLE9BQ3ZDMEMsRUFBTTdELEdBQUcsR0FBRzlHLFNBQVMsa0JBQWtCM0IsU0FDdkNzTSxFQUFNbkMsTUFBTSxFQUFHLEdBQUd4SSxXQUFXeUQsS0FBSyxVQUFXa0gsRUFBTTdELEdBQUcsR0FBRzlHLFdBQVdwQixRQUNwRTZKLEVBQVFwSyxVQUVSc00sRUFBTTdELEdBQUcsR0FBRzlHLFdBQVc0SSxXQUFXLFdBQy9CL0osS0FBSyxlQUFlUixTQUNwQnlMLE1BQU1BLE1BQU0zQyxXQUFXOUksU0FHNUJvSyxFQUFRa0YsSUFBSWxGLEVBQVF0QixZQUFZOUksV0FLdEM3QixFQUFFMlYsR0FBR0MsU0FBVyxTQUFVeFYsR0FDeEIsT0FBTyxJQUFJRixFQUFTRyxLQUFNRCxHQUFNb0IiLCJmaWxlIjoianF1ZXJ5Lm9yZ2NoYXJ0Lm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBqUXVlcnkgT3JnQ2hhcnQgUGx1Z2luXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZGFiZW5nL09yZ0NoYXJ0XG4gKlxuICogQ29weXJpZ2h0IDIwMTYsIGRhYmVuZ1xuICogaHR0cHM6Ly9naXRodWIuY29tL2RhYmVuZ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSwgd2luZG93LCBkb2N1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgZmFjdG9yeShqUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuICB9XG59KGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgdmFyIE9yZ0NoYXJ0ID0gZnVuY3Rpb24gKGVsZW0sIG9wdHMpIHtcbiAgICB0aGlzLiRjaGFydENvbnRhaW5lciA9ICQoZWxlbSk7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgJ25vZGVUaXRsZSc6ICduYW1lJyxcbiAgICAgICdub2RlSWQnOiAnaWQnLFxuICAgICAgJ3RvZ2dsZVNpYmxpbmdzUmVzcCc6IGZhbHNlLFxuICAgICAgJ2RlcHRoJzogOTk5LFxuICAgICAgJ2NoYXJ0Q2xhc3MnOiAnJyxcbiAgICAgICdleHBvcnRCdXR0b24nOiBmYWxzZSxcbiAgICAgICdleHBvcnRGaWxlbmFtZSc6ICdPcmdDaGFydCcsXG4gICAgICAnZXhwb3J0RmlsZWV4dGVuc2lvbic6ICdwbmcnLFxuICAgICAgJ3BhcmVudE5vZGVTeW1ib2wnOiAnZmEtdXNlcnMnLFxuICAgICAgJ2RyYWdnYWJsZSc6IGZhbHNlLFxuICAgICAgJ2RpcmVjdGlvbic6ICd0MmInLFxuICAgICAgJ3Bhbic6IGZhbHNlLFxuICAgICAgJ3pvb20nOiBmYWxzZSxcbiAgICAgICd6b29taW5MaW1pdCc6IDcsXG4gICAgICAnem9vbW91dExpbWl0JzogMC41XG4gICAgfTtcbiAgfTtcbiAgLy9cbiAgT3JnQ2hhcnQucHJvdG90eXBlID0ge1xuICAgIC8vXG4gICAgaW5pdDogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRPcHRpb25zLCB0aGlzLm9wdHMsIG9wdHMpO1xuICAgICAgLy8gYnVpbGQgdGhlIG9yZy1jaGFydFxuICAgICAgdmFyICRjaGFydENvbnRhaW5lciA9IHRoaXMuJGNoYXJ0Q29udGFpbmVyO1xuICAgICAgaWYgKHRoaXMuJGNoYXJ0KSB7XG4gICAgICAgIHRoaXMuJGNoYXJ0LnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSB0aGlzLm9wdGlvbnMuZGF0YTtcbiAgICAgIHZhciAkY2hhcnQgPSB0aGlzLiRjaGFydCA9ICQoJzxkaXY+Jywge1xuICAgICAgICAnZGF0YSc6IHsgJ29wdGlvbnMnOiB0aGlzLm9wdGlvbnMgfSxcbiAgICAgICAgJ2NsYXNzJzogJ29yZ2NoYXJ0JyArICh0aGlzLm9wdGlvbnMuY2hhcnRDbGFzcyAhPT0gJycgPyAnICcgKyB0aGlzLm9wdGlvbnMuY2hhcnRDbGFzcyA6ICcnKSArICh0aGlzLm9wdGlvbnMuZGlyZWN0aW9uICE9PSAndDJiJyA/ICcgJyArIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gOiAnJyksXG4gICAgICAgICdjbGljayc6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLm5vZGUnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICRjaGFydC5maW5kKCcubm9kZS5mb2N1c2VkJykucmVtb3ZlQ2xhc3MoJ2ZvY3VzZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgbW8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgICAgbW8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIGluaXRUaW1lOlxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXV0YXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG11dGF0aW9uc1tpXS5hZGRlZE5vZGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgIGlmIChtdXRhdGlvbnNbaV0uYWRkZWROb2Rlc1tqXS5jbGFzc0xpc3QuY29udGFpbnMoJ29yZ2NoYXJ0JykpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmluaXRDb21wbGV0ZWQgJiYgdHlwZW9mIHRoYXQub3B0aW9ucy5pbml0Q29tcGxldGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICB0aGF0Lm9wdGlvbnMuaW5pdENvbXBsZXRlZCgkY2hhcnQpO1xuICAgICAgICAgICAgICAgICAgJGNoYXJ0LnRyaWdnZXJIYW5kbGVyKHsgJ3R5cGUnOiAnaW5pdC5vcmdjaGFydCcgfSk7XG4gICAgICAgICAgICAgICAgICBicmVhayBpbml0VGltZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgbW8ub2JzZXJ2ZSgkY2hhcnRDb250YWluZXJbMF0sIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCQudHlwZShkYXRhKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiAkKSB7IC8vIHVsIGRhdGFzb3VyY2VcbiAgICAgICAgICB0aGlzLmJ1aWxkSGllcmFyY2h5KCRjaGFydCwgdGhpcy5idWlsZEpzb25EUyhkYXRhLmNoaWxkcmVuKCkpLCAwLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgeyAvLyBsb2NhbCBqc29uIGRhdGFzb3VyY2VcbiAgICAgICAgICB0aGlzLmJ1aWxkSGllcmFyY2h5KCRjaGFydCwgdGhpcy5vcHRpb25zLmFqYXhVUkwgPyBkYXRhIDogdGhpcy5hdHRhY2hSZWwoZGF0YSwgJzAwJyksIDAsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgJ3VybCc6IGRhdGEsXG4gICAgICAgICAgJ2RhdGFUeXBlJzogJ2pzb24nLFxuICAgICAgICAgICdiZWZvcmVTZW5kJzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJGNoYXJ0LmFwcGVuZCgnPGkgY2xhc3M9XCJmYSBmYS1jaXJjbGUtby1ub3RjaCBmYS1zcGluIHNwaW5uZXJcIj48L2k+Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgIHRoYXQuYnVpbGRIaWVyYXJjaHkoJGNoYXJ0LCB0aGF0Lm9wdGlvbnMuYWpheFVSTCA/IGRhdGEgOiB0aGF0LmF0dGFjaFJlbChkYXRhLCAnMDAnKSwgMCwgdGhhdC5vcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZhaWwoZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3JUaHJvd24pO1xuICAgICAgICB9KVxuICAgICAgICAuYWx3YXlzKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICRjaGFydC5jaGlsZHJlbignLnNwaW5uZXInKS5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAkY2hhcnRDb250YWluZXIuYXBwZW5kKCRjaGFydCk7XG5cbiAgICAgIC8vIGFwcGVuZCB0aGUgZXhwb3J0IGJ1dHRvblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBvcnRCdXR0b24gJiYgISRjaGFydENvbnRhaW5lci5maW5kKCcub2MtZXhwb3J0LWJ0bicpLmxlbmd0aCkge1xuICAgICAgICB2YXIgJGV4cG9ydEJ0biA9ICQoJzxidXR0b24+Jywge1xuICAgICAgICAgICdjbGFzcyc6ICdvYy1leHBvcnQtYnRuJyArICh0aGlzLm9wdGlvbnMuY2hhcnRDbGFzcyAhPT0gJycgPyAnICcgKyB0aGlzLm9wdGlvbnMuY2hhcnRDbGFzcyA6ICcnKSxcbiAgICAgICAgICAndGV4dCc6ICdFeHBvcnQnLFxuICAgICAgICAgICdjbGljayc6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLmNoaWxkcmVuKCcuc3Bpbm5lcicpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgJG1hc2sgPSAkY2hhcnRDb250YWluZXIuZmluZCgnLm1hc2snKTtcbiAgICAgICAgICAgIGlmICghJG1hc2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICRjaGFydENvbnRhaW5lci5hcHBlbmQoJzxkaXYgY2xhc3M9XCJtYXNrXCI+PGkgY2xhc3M9XCJmYSBmYS1jaXJjbGUtby1ub3RjaCBmYS1zcGluIHNwaW5uZXJcIj48L2k+PC9kaXY+Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAkbWFzay5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc291cmNlQ2hhcnQgPSAkY2hhcnRDb250YWluZXIuYWRkQ2xhc3MoJ2NhbnZhc0NvbnRhaW5lcicpLmZpbmQoJy5vcmdjaGFydDp2aXNpYmxlJykuZ2V0KDApO1xuICAgICAgICAgICAgdmFyIGZsYWcgPSB0aGF0Lm9wdGlvbnMuZGlyZWN0aW9uID09PSAnbDJyJyB8fCB0aGF0Lm9wdGlvbnMuZGlyZWN0aW9uID09PSAncjJsJztcbiAgICAgICAgICAgIGh0bWwyY2FudmFzKHNvdXJjZUNoYXJ0LCB7XG4gICAgICAgICAgICAgICd3aWR0aCc6IGZsYWcgPyBzb3VyY2VDaGFydC5jbGllbnRIZWlnaHQgOiBzb3VyY2VDaGFydC5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgJ2hlaWdodCc6IGZsYWcgPyBzb3VyY2VDaGFydC5jbGllbnRXaWR0aCA6IHNvdXJjZUNoYXJ0LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgJ29uY2xvbmUnOiBmdW5jdGlvbihjbG9uZURvYykge1xuICAgICAgICAgICAgICAgICQoY2xvbmVEb2MpLmZpbmQoJy5jYW52YXNDb250YWluZXInKS5jc3MoJ292ZXJmbG93JywgJ3Zpc2libGUnKVxuICAgICAgICAgICAgICAgICAgLmZpbmQoJy5vcmdjaGFydDp2aXNpYmxlOmZpcnN0JykuY3NzKCd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdvbnJlbmRlcmVkJzogZnVuY3Rpb24oY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgJGNoYXJ0Q29udGFpbmVyLmZpbmQoJy5tYXNrJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuZXhwb3J0RmlsZWV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpID09PSAncGRmJykge1xuICAgICAgICAgICAgICAgICAgdmFyIGRvYyA9IHt9O1xuICAgICAgICAgICAgICAgICAgdmFyIGRvY1dpZHRoID0gTWF0aC5mbG9vcihjYW52YXMud2lkdGggKiAwLjI2NDYpO1xuICAgICAgICAgICAgICAgICAgdmFyIGRvY0hlaWdodCA9IE1hdGguZmxvb3IoY2FudmFzLmhlaWdodCAqIDAuMjY0Nik7XG4gICAgICAgICAgICAgICAgICBpZiAoZG9jV2lkdGggPiBkb2NIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jID0gbmV3IGpzUERGKCdsJywgJ21tJywgW2RvY1dpZHRoLCBkb2NIZWlnaHRdKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvYyA9IG5ldyBqc1BERigncCcsICdtbScsIFtkb2NIZWlnaHQsIGRvY1dpZHRoXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkb2MuYWRkSW1hZ2UoY2FudmFzLnRvRGF0YVVSTCgpLCAncG5nJywgMCwgMCk7XG4gICAgICAgICAgICAgICAgICBkb2Muc2F2ZSh0aGF0Lm9wdGlvbnMuZXhwb3J0RmlsZW5hbWUgKyAnLnBkZicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2YXIgaXNXZWJraXQgPSAnV2Via2l0QXBwZWFyYW5jZScgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuICAgICAgICAgICAgICAgICAgdmFyIGlzRmYgPSAhIXdpbmRvdy5zaWRlYmFyO1xuICAgICAgICAgICAgICAgICAgdmFyIGlzRWRnZSA9IG5hdmlnYXRvci5hcHBOYW1lID09PSAnTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyJyB8fCAobmF2aWdhdG9yLmFwcE5hbWUgPT09IFwiTmV0c2NhcGVcIiAmJiBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdFZGdlJykgPiAtMSk7XG5cbiAgICAgICAgICAgICAgICAgIGlmICgoIWlzV2Via2l0ICYmICFpc0ZmKSB8fCBpc0VkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGNhbnZhcy5tc1RvQmxvYigpLCB0aGF0Lm9wdGlvbnMuZXhwb3J0RmlsZW5hbWUgKyAnLnBuZycpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJGNoYXJ0Q29udGFpbmVyLmZpbmQoJy5vYy1kb3dubG9hZC1idG4nKS5hdHRyKCdocmVmJywgY2FudmFzLnRvRGF0YVVSTCgpKVswXS5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAkY2hhcnRDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2NhbnZhc0NvbnRhaW5lcicpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICRjaGFydENvbnRhaW5lci5yZW1vdmVDbGFzcygnY2FudmFzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAkY2hhcnRDb250YWluZXIuYXBwZW5kKCRleHBvcnRCdG4pO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4cG9ydEZpbGVleHRlbnNpb24udG9Mb3dlckNhc2UoKSAhPT0gJ3BkZicpIHtcbiAgICAgICAgICB2YXIgZG93bmxvYWRCdG4gPSAnPGEgY2xhc3M9XCJvYy1kb3dubG9hZC1idG4nICsgKHRoaXMub3B0aW9ucy5jaGFydENsYXNzICE9PSAnJyA/ICcgJyArIHRoaXMub3B0aW9ucy5jaGFydENsYXNzIDogJycpICsgJ1wiJ1xuICAgICAgICAgICsgJyBkb3dubG9hZD1cIicgKyB0aGlzLm9wdGlvbnMuZXhwb3J0RmlsZW5hbWUgKyAnLnBuZ1wiPjwvYT4nO1xuICAgICAgICAgICRleHBvcnRCdG4uYWZ0ZXIoZG93bmxvYWRCdG4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucGFuKSB7XG4gICAgICAgIHRoaXMuYmluZFBhbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnpvb20pIHtcbiAgICAgICAgdGhpcy5iaW5kWm9vbSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8vXG4gICAgc2V0T3B0aW9uczogZnVuY3Rpb24gKG9wdHMsIHZhbCkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAob3B0cyA9PT0gJ3BhbicpIHtcbiAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRQYW4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51bmJpbmRQYW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMgPT09ICd6b29tJykge1xuICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZFpvb20oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51bmJpbmRab29tKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChvcHRzLmRhdGEpIHtcbiAgICAgICAgICB0aGlzLmluaXQob3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBvcHRzLnBhbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLnBhbikge1xuICAgICAgICAgICAgICB0aGlzLmJpbmRQYW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMudW5iaW5kUGFuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy56b29tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKG9wdHMuem9vbSkge1xuICAgICAgICAgICAgICB0aGlzLmJpbmRab29tKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnVuYmluZFpvb20oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvL1xuICAgIHBhblN0YXJ0SGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciAkY2hhcnQgPSAkKGUuZGVsZWdhdGVUYXJnZXQpO1xuICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoJy5ub2RlJykubGVuZ3RoIHx8IChlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDEpKSB7XG4gICAgICAgICRjaGFydC5kYXRhKCdwYW5uaW5nJywgZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkY2hhcnQuY3NzKCdjdXJzb3InLCAnbW92ZScpLmRhdGEoJ3Bhbm5pbmcnLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0WCA9IDA7XG4gICAgICB2YXIgbGFzdFkgPSAwO1xuICAgICAgdmFyIGxhc3RUZiA9ICRjaGFydC5jc3MoJ3RyYW5zZm9ybScpO1xuICAgICAgaWYgKGxhc3RUZiAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHZhciB0ZW1wID0gbGFzdFRmLnNwbGl0KCcsJyk7XG4gICAgICAgIGlmIChsYXN0VGYuaW5kZXhPZignM2QnKSA9PT0gLTEpIHtcbiAgICAgICAgICBsYXN0WCA9IHBhcnNlSW50KHRlbXBbNF0pO1xuICAgICAgICAgIGxhc3RZID0gcGFyc2VJbnQodGVtcFs1XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFzdFggPSBwYXJzZUludCh0ZW1wWzEyXSk7XG4gICAgICAgICAgbGFzdFkgPSBwYXJzZUludCh0ZW1wWzEzXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBzdGFydFggPSAwO1xuICAgICAgdmFyIHN0YXJ0WSA9IDA7XG4gICAgICBpZiAoIWUudGFyZ2V0VG91Y2hlcykgeyAvLyBwYW5kIG9uIGRlc2t0b3BcbiAgICAgICAgc3RhcnRYID0gZS5wYWdlWCAtIGxhc3RYO1xuICAgICAgICBzdGFydFkgPSBlLnBhZ2VZIC0gbGFzdFk7XG4gICAgICB9IGVsc2UgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDEpIHsgLy8gcGFuIG9uIG1vYmlsZSBkZXZpY2VcbiAgICAgICAgc3RhcnRYID0gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VYIC0gbGFzdFg7XG4gICAgICAgIHN0YXJ0WSA9IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWSAtIGxhc3RZO1xuICAgICAgfSBlbHNlIGlmIChlLnRhcmdldFRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkY2hhcnQub24oJ21vdXNlbW92ZSB0b3VjaG1vdmUnLGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKCEkY2hhcnQuZGF0YSgncGFubmluZycpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdYID0gMDtcbiAgICAgICAgdmFyIG5ld1kgPSAwO1xuICAgICAgICBpZiAoIWUudGFyZ2V0VG91Y2hlcykgeyAvLyBwYW5kIG9uIGRlc2t0b3BcbiAgICAgICAgICBuZXdYID0gZS5wYWdlWCAtIHN0YXJ0WDtcbiAgICAgICAgICBuZXdZID0gZS5wYWdlWSAtIHN0YXJ0WTtcbiAgICAgICAgfSBlbHNlIGlmIChlLnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7IC8vIHBhbiBvbiBtb2JpbGUgZGV2aWNlXG4gICAgICAgICAgbmV3WCA9IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCAtIHN0YXJ0WDtcbiAgICAgICAgICBuZXdZID0gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZIC0gc3RhcnRZO1xuICAgICAgICB9IGVsc2UgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsYXN0VGYgPSAkY2hhcnQuY3NzKCd0cmFuc2Zvcm0nKTtcbiAgICAgICAgaWYgKGxhc3RUZiA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgaWYgKGxhc3RUZi5pbmRleE9mKCczZCcpID09PSAtMSkge1xuICAgICAgICAgICAgJGNoYXJ0LmNzcygndHJhbnNmb3JtJywgJ21hdHJpeCgxLCAwLCAwLCAxLCAnICsgbmV3WCArICcsICcgKyBuZXdZICsgJyknKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGNoYXJ0LmNzcygndHJhbnNmb3JtJywgJ21hdHJpeDNkKDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsICcgKyBuZXdYICsgJywgJyArIG5ld1kgKyAnLCAwLCAxKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgbWF0cml4ID0gbGFzdFRmLnNwbGl0KCcsJyk7XG4gICAgICAgICAgaWYgKGxhc3RUZi5pbmRleE9mKCczZCcpID09PSAtMSkge1xuICAgICAgICAgICAgbWF0cml4WzRdID0gJyAnICsgbmV3WDtcbiAgICAgICAgICAgIG1hdHJpeFs1XSA9ICcgJyArIG5ld1kgKyAnKSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdHJpeFsxMl0gPSAnICcgKyBuZXdYO1xuICAgICAgICAgICAgbWF0cml4WzEzXSA9ICcgJyArIG5ld1k7XG4gICAgICAgICAgfVxuICAgICAgICAgICRjaGFydC5jc3MoJ3RyYW5zZm9ybScsIG1hdHJpeC5qb2luKCcsJykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIC8vXG4gICAgcGFuRW5kSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmRhdGEuY2hhcnQuZGF0YSgncGFubmluZycpKSB7XG4gICAgICAgIGUuZGF0YS5jaGFydC5kYXRhKCdwYW5uaW5nJywgZmFsc2UpLmNzcygnY3Vyc29yJywgJ2RlZmF1bHQnKS5vZmYoJ21vdXNlbW92ZScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy9cbiAgICBiaW5kUGFuOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLiRjaGFydENvbnRhaW5lci5jc3MoJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuICAgICAgdGhpcy4kY2hhcnQub24oJ21vdXNlZG93biB0b3VjaHN0YXJ0JywgdGhpcy5wYW5TdGFydEhhbmRsZXIpO1xuICAgICAgJChkb2N1bWVudCkub24oJ21vdXNldXAgdG91Y2hlbmQnLCB7ICdjaGFydCc6IHRoaXMuJGNoYXJ0IH0sIHRoaXMucGFuRW5kSGFuZGxlcik7XG4gICAgfSxcbiAgICAvL1xuICAgIHVuYmluZFBhbjogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy4kY2hhcnRDb250YWluZXIuY3NzKCdvdmVyZmxvdycsICdhdXRvJyk7XG4gICAgICB0aGlzLiRjaGFydC5vZmYoJ21vdXNlZG93biB0b3VjaHN0YXJ0JywgdGhpcy5wYW5TdGFydEhhbmRsZXIpO1xuICAgICAgJChkb2N1bWVudCkub2ZmKCdtb3VzZXVwIHRvdWNoZW5kJywgdGhpcy5wYW5FbmRIYW5kbGVyKTtcbiAgICB9LFxuICAgIC8vXG4gICAgem9vbVdoZWVsSGFuZGxlcjogZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvYyA9IGUuZGF0YS5vYztcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBuZXdTY2FsZSAgPSAxICsgKGUub3JpZ2luYWxFdmVudC5kZWx0YVkgPiAwID8gLTAuMiA6IDAuMik7XG4gICAgICBvYy5zZXRDaGFydFNjYWxlKG9jLiRjaGFydCwgbmV3U2NhbGUpO1xuICAgIH0sXG4gICAgLy9cbiAgICB6b29tU3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYoZS50b3VjaGVzICYmIGUudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdmFyIG9jID0gZS5kYXRhLm9jO1xuICAgICAgICBvYy4kY2hhcnQuZGF0YSgncGluY2hpbmcnLCB0cnVlKTtcbiAgICAgICAgdmFyIGRpc3QgPSBvYy5nZXRQaW5jaERpc3QoZSk7XG4gICAgICAgIG9jLiRjaGFydC5kYXRhKCdwaW5jaERpc3RTdGFydCcsIGRpc3QpO1xuICAgICAgfVxuICAgIH0sXG4gICAgem9vbWluZ0hhbmRsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb2MgPSBlLmRhdGEub2M7XG4gICAgICBpZihvYy4kY2hhcnQuZGF0YSgncGluY2hpbmcnKSkge1xuICAgICAgICB2YXIgZGlzdCA9IG9jLmdldFBpbmNoRGlzdChlKTtcbiAgICAgICAgb2MuJGNoYXJ0LmRhdGEoJ3BpbmNoRGlzdEVuZCcsIGRpc3QpO1xuICAgICAgfVxuICAgIH0sXG4gICAgem9vbUVuZEhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb2MgPSBlLmRhdGEub2M7XG4gICAgICBpZihvYy4kY2hhcnQuZGF0YSgncGluY2hpbmcnKSkge1xuICAgICAgICBvYy4kY2hhcnQuZGF0YSgncGluY2hpbmcnLCBmYWxzZSk7XG4gICAgICAgIHZhciBkaWZmID0gb2MuJGNoYXJ0LmRhdGEoJ3BpbmNoRGlzdEVuZCcpIC0gb2MuJGNoYXJ0LmRhdGEoJ3BpbmNoRGlzdFN0YXJ0Jyk7XG4gICAgICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgICAgIG9jLnNldENoYXJ0U2NhbGUob2MuJGNoYXJ0LCAxLjIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7XG4gICAgICAgICAgb2Muc2V0Q2hhcnRTY2FsZShvYy4kY2hhcnQsIDAuOCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIC8vXG4gICAgYmluZFpvb206IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuJGNoYXJ0Q29udGFpbmVyLm9uKCd3aGVlbCcsIHsgJ29jJzogdGhpcyB9LCB0aGlzLnpvb21XaGVlbEhhbmRsZXIpO1xuICAgICAgdGhpcy4kY2hhcnRDb250YWluZXIub24oJ3RvdWNoc3RhcnQnLCB7ICdvYyc6IHRoaXMgfSwgdGhpcy56b29tU3RhcnRIYW5kbGVyKTtcbiAgICAgICQoZG9jdW1lbnQpLm9uKCd0b3VjaG1vdmUnLCB7ICdvYyc6IHRoaXMgfSwgdGhpcy56b29taW5nSGFuZGxlcik7XG4gICAgICAkKGRvY3VtZW50KS5vbigndG91Y2hlbmQnLCB7ICdvYyc6IHRoaXMgfSwgdGhpcy56b29tRW5kSGFuZGxlcik7XG4gICAgfSxcbiAgICB1bmJpbmRab29tOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLiRjaGFydENvbnRhaW5lci5vZmYoJ3doZWVsJywgdGhpcy56b29tV2hlZWxIYW5kbGVyKTtcbiAgICAgIHRoaXMuJGNoYXJ0Q29udGFpbmVyLm9mZigndG91Y2hzdGFydCcsIHRoaXMuem9vbVN0YXJ0SGFuZGxlcik7XG4gICAgICAkKGRvY3VtZW50KS5vZmYoJ3RvdWNobW92ZScsIHRoaXMuem9vbWluZ0hhbmRsZXIpO1xuICAgICAgJChkb2N1bWVudCkub2ZmKCd0b3VjaGVuZCcsIHRoaXMuem9vbUVuZEhhbmRsZXIpO1xuICAgIH0sXG4gICAgLy9cbiAgICBnZXRQaW5jaERpc3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KChlLnRvdWNoZXNbMF0uY2xpZW50WCAtIGUudG91Y2hlc1sxXS5jbGllbnRYKSAqIChlLnRvdWNoZXNbMF0uY2xpZW50WCAtIGUudG91Y2hlc1sxXS5jbGllbnRYKSArXG4gICAgICAoZS50b3VjaGVzWzBdLmNsaWVudFkgLSBlLnRvdWNoZXNbMV0uY2xpZW50WSkgKiAoZS50b3VjaGVzWzBdLmNsaWVudFkgLSBlLnRvdWNoZXNbMV0uY2xpZW50WSkpO1xuICAgIH0sXG4gICAgLy9cbiAgICBzZXRDaGFydFNjYWxlOiBmdW5jdGlvbiAoJGNoYXJ0LCBuZXdTY2FsZSkge1xuICAgICAgdmFyIG9wdHMgPSAkY2hhcnQuZGF0YSgnb3B0aW9ucycpO1xuICAgICAgdmFyIGxhc3RUZiA9ICRjaGFydC5jc3MoJ3RyYW5zZm9ybScpO1xuICAgICAgdmFyIG1hdHJpeCA9ICcnO1xuICAgICAgdmFyIHRhcmdldFNjYWxlID0gMTtcbiAgICAgIGlmIChsYXN0VGYgPT09ICdub25lJykge1xuICAgICAgICAkY2hhcnQuY3NzKCd0cmFuc2Zvcm0nLCAnc2NhbGUoJyArIG5ld1NjYWxlICsgJywnICsgbmV3U2NhbGUgKyAnKScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0cml4ID0gbGFzdFRmLnNwbGl0KCcsJyk7XG4gICAgICAgIGlmIChsYXN0VGYuaW5kZXhPZignM2QnKSA9PT0gLTEpIHtcbiAgICAgICAgICB0YXJnZXRTY2FsZSA9IHdpbmRvdy5wYXJzZUZsb2F0KG1hdHJpeFszXSkgKiBuZXdTY2FsZTtcbiAgICAgICAgICBpZiAodGFyZ2V0U2NhbGUgPiBvcHRzLnpvb21vdXRMaW1pdCAmJiB0YXJnZXRTY2FsZSA8IG9wdHMuem9vbWluTGltaXQpIHtcbiAgICAgICAgICAgICRjaGFydC5jc3MoJ3RyYW5zZm9ybScsIGxhc3RUZiArICcgc2NhbGUoJyArIG5ld1NjYWxlICsgJywnICsgbmV3U2NhbGUgKyAnKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRTY2FsZSA9IHdpbmRvdy5wYXJzZUZsb2F0KG1hdHJpeFsxXSkgKiBuZXdTY2FsZTtcbiAgICAgICAgICBpZiAodGFyZ2V0U2NhbGUgPiBvcHRzLnpvb21vdXRMaW1pdCAmJiB0YXJnZXRTY2FsZSA8IG9wdHMuem9vbWluTGltaXQpIHtcbiAgICAgICAgICAgICRjaGFydC5jc3MoJ3RyYW5zZm9ybScsIGxhc3RUZiArICcgc2NhbGUzZCgnICsgbmV3U2NhbGUgKyAnLCcgKyBuZXdTY2FsZSArICcsIDEpJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAvL1xuICAgIGJ1aWxkSnNvbkRTOiBmdW5jdGlvbiAoJGxpKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgc3ViT2JqID0ge1xuICAgICAgICAnbmFtZSc6ICRsaS5jb250ZW50cygpLmVxKDApLnRleHQoKS50cmltKCksXG4gICAgICAgICdyZWxhdGlvbnNoaXAnOiAoJGxpLnBhcmVudCgpLnBhcmVudCgpLmlzKCdsaScpID8gJzEnOiAnMCcpICsgKCRsaS5zaWJsaW5ncygnbGknKS5sZW5ndGggPyAxOiAwKSArICgkbGkuY2hpbGRyZW4oJ3VsJykubGVuZ3RoID8gMSA6IDApXG4gICAgICB9O1xuICAgICAgaWYgKCRsaVswXS5pZCkge1xuICAgICAgICBzdWJPYmouaWQgPSAkbGlbMF0uaWQ7XG4gICAgICB9XG4gICAgICAkbGkuY2hpbGRyZW4oJ3VsJykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXN1Yk9iai5jaGlsZHJlbikgeyBzdWJPYmouY2hpbGRyZW4gPSBbXTsgfVxuICAgICAgICBzdWJPYmouY2hpbGRyZW4ucHVzaCh0aGF0LmJ1aWxkSnNvbkRTKCQodGhpcykpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1Yk9iajtcbiAgICB9LFxuICAgIC8vXG4gICAgYXR0YWNoUmVsOiBmdW5jdGlvbiAoZGF0YSwgZmxhZ3MpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIGRhdGEucmVsYXRpb25zaGlwID0gZmxhZ3MgKyAoZGF0YS5jaGlsZHJlbiAmJiBkYXRhLmNoaWxkcmVuLmxlbmd0aCA+IDAgPyAxIDogMCk7XG4gICAgICBpZiAoZGF0YS5jaGlsZHJlbikge1xuICAgICAgICBkYXRhLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgIHRoYXQuYXR0YWNoUmVsKGl0ZW0sICcxJyArIChkYXRhLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyAxIDogMCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgLy9cbiAgICBsb29wQ2hhcnQ6IGZ1bmN0aW9uICgkY2hhcnQpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciAkdHIgPSAkY2hhcnQuZmluZCgndHI6Zmlyc3QnKTtcbiAgICAgIHZhciBzdWJPYmogPSB7ICdpZCc6ICR0ci5maW5kKCcubm9kZScpWzBdLmlkIH07XG4gICAgICAkdHIuc2libGluZ3MoJzpsYXN0JykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIXN1Yk9iai5jaGlsZHJlbikgeyBzdWJPYmouY2hpbGRyZW4gPSBbXTsgfVxuICAgICAgICBzdWJPYmouY2hpbGRyZW4ucHVzaCh0aGF0Lmxvb3BDaGFydCgkKHRoaXMpKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJPYmo7XG4gICAgfSxcbiAgICAvL1xuICAgIGdldEhpZXJhcmNoeTogZnVuY3Rpb24gKCRjaGFydCkge1xuICAgICAgdmFyICRjaGFydCA9ICRjaGFydCB8fCB0aGlzLiRjaGFydDtcbiAgICAgIGlmICghJGNoYXJ0LmZpbmQoJy5ub2RlOmZpcnN0JylbMF0uaWQpIHtcbiAgICAgICAgcmV0dXJuICdFcnJvcjogTm9kZXMgb2Ygb3JnaGNhcnQgdG8gYmUgZXhwb3J0ZWQgbXVzdCBoYXZlIGlkIGF0dHJpYnV0ZSEnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubG9vcENoYXJ0KCRjaGFydCk7XG4gICAgfSxcbiAgICAvLyBkZXRlY3QgdGhlIGV4aXN0L2Rpc3BsYXkgc3RhdGUgb2YgcmVsYXRlZCBub2RlXG4gICAgZ2V0Tm9kZVN0YXRlOiBmdW5jdGlvbiAoJG5vZGUsIHJlbGF0aW9uKSB7XG4gICAgICB2YXIgJHRhcmdldCA9IHt9O1xuICAgICAgaWYgKHJlbGF0aW9uID09PSAncGFyZW50Jykge1xuICAgICAgICAkdGFyZ2V0ID0gJG5vZGUuY2xvc2VzdCgnLm5vZGVzJykuc2libGluZ3MoJzpmaXJzdCcpO1xuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbiA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICAkdGFyZ2V0ID0gJG5vZGUuY2xvc2VzdCgndHInKS5zaWJsaW5ncygpO1xuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbiA9PT0gJ3NpYmxpbmdzJykge1xuICAgICAgICAkdGFyZ2V0ID0gJG5vZGUuY2xvc2VzdCgndGFibGUnKS5wYXJlbnQoKS5zaWJsaW5ncygpO1xuICAgICAgfVxuICAgICAgaWYgKCR0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgIGlmICgkdGFyZ2V0LmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgJ2V4aXN0JzogdHJ1ZSwgJ3Zpc2libGUnOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgJ2V4aXN0JzogdHJ1ZSwgJ3Zpc2libGUnOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgJ2V4aXN0JzogZmFsc2UsICd2aXNpYmxlJzogZmFsc2UgfTtcbiAgICB9LFxuICAgIC8vIGZpbmQgdGhlIHJlbGF0ZWQgbm9kZXNcbiAgICBnZXRSZWxhdGVkTm9kZXM6IGZ1bmN0aW9uICgkbm9kZSwgcmVsYXRpb24pIHtcbiAgICAgIGlmIChyZWxhdGlvbiA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgcmV0dXJuICRub2RlLmNsb3Nlc3QoJy5ub2RlcycpLnBhcmVudCgpLmNoaWxkcmVuKCc6Zmlyc3QnKS5maW5kKCcubm9kZScpO1xuICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbiA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICByZXR1cm4gJG5vZGUuY2xvc2VzdCgndGFibGUnKS5jaGlsZHJlbignOmxhc3QnKS5jaGlsZHJlbigpLmZpbmQoJy5ub2RlOmZpcnN0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uID09PSAnc2libGluZ3MnKSB7XG4gICAgICAgIHJldHVybiAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpLnNpYmxpbmdzKCkuZmluZCgnLm5vZGU6Zmlyc3QnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIHJlY3Vyc2l2ZWx5IGhpZGUgdGhlIGFuY2VzdG9yIG5vZGUgYW5kIHNpYmxpbmcgbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgaGlkZVBhcmVudDogZnVuY3Rpb24gKCRub2RlKSB7XG4gICAgICB2YXIgJHRlbXAgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLmNsb3Nlc3QoJ3RyJykuc2libGluZ3MoKTtcbiAgICAgIGlmICgkdGVtcC5lcSgwKS5maW5kKCcuc3Bpbm5lcicpLmxlbmd0aCkge1xuICAgICAgICAkbm9kZS5jbG9zZXN0KCcub3JnY2hhcnQnKS5kYXRhKCdpbkFqYXgnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBoaWRlIHRoZSBzaWJsaW5nIG5vZGVzXG4gICAgICBpZiAodGhpcy5nZXROb2RlU3RhdGUoJG5vZGUsICdzaWJsaW5ncycpLnZpc2libGUpIHtcbiAgICAgICAgdGhpcy5oaWRlU2libGluZ3MoJG5vZGUpO1xuICAgICAgfVxuICAgICAgLy8gaGlkZSB0aGUgbGluZXNcbiAgICAgIHZhciAkbGluZXMgPSAkdGVtcC5zbGljZSgxKTtcbiAgICAgICRsaW5lcy5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICAvLyBoaWRlIHRoZSBzdXBlcmlvciBub2RlcyB3aXRoIHRyYW5zaXRpb25cbiAgICAgIHZhciAkcGFyZW50ID0gJHRlbXAuZXEoMCkuZmluZCgnLm5vZGUnKTtcbiAgICAgIHZhciBncmFuZGZhdGhlclZpc2libGUgPSB0aGlzLmdldE5vZGVTdGF0ZSgkcGFyZW50LCAncGFyZW50JykudmlzaWJsZTtcbiAgICAgIGlmICgkcGFyZW50Lmxlbmd0aCAmJiAkcGFyZW50LmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAgICRwYXJlbnQuYWRkQ2xhc3MoJ3NsaWRlIHNsaWRlLWRvd24nKS5vbmUoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdzbGlkZScpO1xuICAgICAgICAgICRsaW5lcy5yZW1vdmVBdHRyKCdzdHlsZScpO1xuICAgICAgICAgICR0ZW1wLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgY3VycmVudCBub2RlIGhhcyB0aGUgcGFyZW50IG5vZGUsIGhpZGUgaXQgcmVjdXJzaXZlbHlcbiAgICAgIGlmICgkcGFyZW50Lmxlbmd0aCAmJiBncmFuZGZhdGhlclZpc2libGUpIHtcbiAgICAgICAgdGhpcy5oaWRlUGFyZW50KCRwYXJlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gc2hvdyB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgc2hvd1BhcmVudDogZnVuY3Rpb24gKCRub2RlKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAvLyBqdXN0IHNob3cgb25seSBvbmUgc3VwZXJpb3IgbGV2ZWxcbiAgICAgIHZhciAkdGVtcCA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykuY2xvc2VzdCgndHInKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgIC8vIGp1c3Qgc2hvdyBvbmx5IG9uZSBsaW5lXG4gICAgICAkdGVtcC5lcSgyKS5jaGlsZHJlbigpLnNsaWNlKDEsIC0xKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAvLyBzaG93IHBhcmVudCBub2RlIHdpdGggYW5pbWF0aW9uXG4gICAgICB2YXIgcGFyZW50ID0gJHRlbXAuZXEoMCkuZmluZCgnLm5vZGUnKVswXTtcbiAgICAgIHRoaXMucmVwYWludChwYXJlbnQpO1xuICAgICAgJChwYXJlbnQpLmFkZENsYXNzKCdzbGlkZScpLnJlbW92ZUNsYXNzKCdzbGlkZS1kb3duJykub25lKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICQocGFyZW50KS5yZW1vdmVDbGFzcygnc2xpZGUnKTtcbiAgICAgICAgaWYgKHRoYXQuaXNJbkFjdGlvbigkbm9kZSkpIHtcbiAgICAgICAgICB0aGF0LnN3aXRjaFZlcnRpY2FsQXJyb3coJG5vZGUuY2hpbGRyZW4oJy50b3BFZGdlJykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIC8vIHJlY3Vyc2l2ZWx5IGhpZGUgdGhlIGRlc2NlbmRhbnQgbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgaGlkZUNoaWxkcmVuOiBmdW5jdGlvbiAoJG5vZGUpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciAkdGVtcCA9ICRub2RlLmNsb3Nlc3QoJ3RyJykuc2libGluZ3MoKTtcbiAgICAgIGlmICgkdGVtcC5sYXN0KCkuZmluZCgnLnNwaW5uZXInKS5sZW5ndGgpIHtcbiAgICAgICAgJG5vZGUuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnaW5BamF4JywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgdmFyICR2aXNpYmxlTm9kZXMgPSAkdGVtcC5sYXN0KCkuZmluZCgnLm5vZGU6dmlzaWJsZScpO1xuICAgICAgdmFyIGlzVmVydGljYWxEZXNjID0gJHRlbXAubGFzdCgpLmlzKCcudmVydGljYWxOb2RlcycpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgaWYgKCFpc1ZlcnRpY2FsRGVzYykge1xuICAgICAgICB2YXIgJGxpbmVzID0gJHZpc2libGVOb2Rlcy5jbG9zZXN0KCd0YWJsZScpLmNsb3Nlc3QoJ3RyJykucHJldkFsbCgnLmxpbmVzJykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICAgICAgfVxuICAgICAgJHZpc2libGVOb2Rlcy5hZGRDbGFzcygnc2xpZGUgc2xpZGUtdXAnKS5lcSgwKS5vbmUoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJHZpc2libGVOb2Rlcy5yZW1vdmVDbGFzcygnc2xpZGUnKTtcbiAgICAgICAgaWYgKGlzVmVydGljYWxEZXNjKSB7XG4gICAgICAgICAgJHRlbXAuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRsaW5lcy5yZW1vdmVBdHRyKCdzdHlsZScpLmFkZENsYXNzKCdoaWRkZW4nKS5zaWJsaW5ncygnLm5vZGVzJykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICAgICR0ZW1wLmxhc3QoKS5maW5kKCcudmVydGljYWxOb2RlcycpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhhdC5pc0luQWN0aW9uKCRub2RlKSkge1xuICAgICAgICAgIHRoYXQuc3dpdGNoVmVydGljYWxBcnJvdygkbm9kZS5jaGlsZHJlbignLmJvdHRvbUVkZ2UnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gc2hvdyB0aGUgY2hpbGRyZW4gbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgc2hvd0NoaWxkcmVuOiBmdW5jdGlvbiAoJG5vZGUpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciAkbGV2ZWxzID0gJG5vZGUuY2xvc2VzdCgndHInKS5zaWJsaW5ncygpO1xuICAgICAgdmFyIGlzVmVydGljYWxEZXNjID0gJGxldmVscy5pcygnLnZlcnRpY2FsTm9kZXMnKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHZhciAkZGVzY2VuZGFudHMgPSBpc1ZlcnRpY2FsRGVzY1xuICAgICAgICA/ICRsZXZlbHMucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpLmZpbmQoJy5ub2RlOnZpc2libGUnKVxuICAgICAgICA6ICRsZXZlbHMucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpLmVxKDIpLmNoaWxkcmVuKCkuZmluZCgnLm5vZGU6Zmlyc3QnKTtcbiAgICAgIC8vIHRoZSB0d28gZm9sbG93aW5nIHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gZW5mb3JjZSBicm93c2VyIHRvIHJlcGFpbnRcbiAgICAgIHRoaXMucmVwYWludCgkZGVzY2VuZGFudHMuZ2V0KDApKTtcbiAgICAgICRkZXNjZW5kYW50cy5hZGRDbGFzcygnc2xpZGUnKS5yZW1vdmVDbGFzcygnc2xpZGUtdXAnKS5lcSgwKS5vbmUoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJGRlc2NlbmRhbnRzLnJlbW92ZUNsYXNzKCdzbGlkZScpO1xuICAgICAgICBpZiAodGhhdC5pc0luQWN0aW9uKCRub2RlKSkge1xuICAgICAgICAgIHRoYXQuc3dpdGNoVmVydGljYWxBcnJvdygkbm9kZS5jaGlsZHJlbignLmJvdHRvbUVkZ2UnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gaGlkZSB0aGUgc2libGluZyBub2RlcyBvZiB0aGUgc3BlY2lmaWVkIG5vZGVcbiAgICBoaWRlU2libGluZ3M6IGZ1bmN0aW9uICgkbm9kZSwgZGlyZWN0aW9uKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgJG5vZGVDb250YWluZXIgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpO1xuICAgICAgaWYgKCRub2RlQ29udGFpbmVyLnNpYmxpbmdzKCkuZmluZCgnLnNwaW5uZXInKS5sZW5ndGgpIHtcbiAgICAgICAgJG5vZGUuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnaW5BamF4JywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAkbm9kZUNvbnRhaW5lci5wcmV2QWxsKCkuZmluZCgnLm5vZGU6dmlzaWJsZScpLmFkZENsYXNzKCdzbGlkZSBzbGlkZS1yaWdodCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRub2RlQ29udGFpbmVyLm5leHRBbGwoKS5maW5kKCcubm9kZTp2aXNpYmxlJykuYWRkQ2xhc3MoJ3NsaWRlIHNsaWRlLWxlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJG5vZGVDb250YWluZXIucHJldkFsbCgpLmZpbmQoJy5ub2RlOnZpc2libGUnKS5hZGRDbGFzcygnc2xpZGUgc2xpZGUtcmlnaHQnKTtcbiAgICAgICAgJG5vZGVDb250YWluZXIubmV4dEFsbCgpLmZpbmQoJy5ub2RlOnZpc2libGUnKS5hZGRDbGFzcygnc2xpZGUgc2xpZGUtbGVmdCcpO1xuICAgICAgfVxuICAgICAgdmFyICRhbmltYXRlZE5vZGVzID0gJG5vZGVDb250YWluZXIuc2libGluZ3MoKS5maW5kKCcuc2xpZGUnKTtcbiAgICAgIHZhciAkbGluZXMgPSAkYW5pbWF0ZWROb2Rlcy5jbG9zZXN0KCcubm9kZXMnKS5wcmV2QWxsKCcubGluZXMnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICAkYW5pbWF0ZWROb2Rlcy5lcSgwKS5vbmUoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJGxpbmVzLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG4gICAgICAgIHZhciAkc2libGluZ3MgPSBkaXJlY3Rpb24gPyAoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAkbm9kZUNvbnRhaW5lci5wcmV2QWxsKCc6bm90KC5oaWRkZW4pJykgOiAkbm9kZUNvbnRhaW5lci5uZXh0QWxsKCc6bm90KC5oaWRkZW4pJykpIDogJG5vZGVDb250YWluZXIuc2libGluZ3MoKTtcbiAgICAgICAgJG5vZGVDb250YWluZXIuY2xvc2VzdCgnLm5vZGVzJykucHJldigpLmNoaWxkcmVuKCc6bm90KC5oaWRkZW4pJylcbiAgICAgICAgICAuc2xpY2UoMSwgZGlyZWN0aW9uID8gJHNpYmxpbmdzLmxlbmd0aCAqIDIgKyAxIDogLTEpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgJGFuaW1hdGVkTm9kZXMucmVtb3ZlQ2xhc3MoJ3NsaWRlJyk7XG4gICAgICAgICRzaWJsaW5ncy5maW5kKCcubm9kZTp2aXNpYmxlOmd0KDApJykucmVtb3ZlQ2xhc3MoJ3NsaWRlLWxlZnQgc2xpZGUtcmlnaHQnKS5hZGRDbGFzcygnc2xpZGUtdXAnKVxuICAgICAgICAgIC5lbmQoKS5maW5kKCcubGluZXMsIC5ub2RlcywgLnZlcnRpY2FsTm9kZXMnKS5hZGRDbGFzcygnaGlkZGVuJylcbiAgICAgICAgICAuZW5kKCkuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICAgIGlmICh0aGF0LmlzSW5BY3Rpb24oJG5vZGUpKSB7XG4gICAgICAgICAgdGhhdC5zd2l0Y2hIb3Jpem9udGFsQXJyb3coJG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIC8vIHNob3cgdGhlIHNpYmxpbmcgbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgc2hvd1NpYmxpbmdzOiBmdW5jdGlvbiAoJG5vZGUsIGRpcmVjdGlvbikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgLy8gZmlyc3RseSwgc2hvdyB0aGUgc2libGluZyB0ZCB0YWdzXG4gICAgICB2YXIgJHNpYmxpbmdzID0gJCgpO1xuICAgICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAkc2libGluZ3MgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpLnByZXZBbGwoKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHNpYmxpbmdzID0gJG5vZGUuY2xvc2VzdCgndGFibGUnKS5wYXJlbnQoKS5uZXh0QWxsKCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkc2libGluZ3MgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgfVxuICAgICAgLy8gc2Vjb25kbHksIHNob3cgdGhlIGxpbmVzXG4gICAgICB2YXIgJHVwcGVyTGV2ZWwgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLmNsb3Nlc3QoJ3RyJykuc2libGluZ3MoKTtcbiAgICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgJHVwcGVyTGV2ZWwuZXEoMikuY2hpbGRyZW4oJy5oaWRkZW4nKS5zbGljZSgwLCAkc2libGluZ3MubGVuZ3RoICogMikucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHVwcGVyTGV2ZWwuZXEoMikuY2hpbGRyZW4oJy5oaWRkZW4nKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICB9XG4gICAgICAvLyB0aGlyZGx5LCBkbyBzb21lIGNsZWFuaW5nIHN0dWZmXG4gICAgICBpZiAoIXRoaXMuZ2V0Tm9kZVN0YXRlKCRub2RlLCAncGFyZW50JykudmlzaWJsZSkge1xuICAgICAgICAkdXBwZXJMZXZlbC5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgIHZhciBwYXJlbnQgPSAkdXBwZXJMZXZlbC5maW5kKCcubm9kZScpWzBdO1xuICAgICAgICB0aGlzLnJlcGFpbnQocGFyZW50KTtcbiAgICAgICAgJChwYXJlbnQpLmFkZENsYXNzKCdzbGlkZScpLnJlbW92ZUNsYXNzKCdzbGlkZS1kb3duJykub25lKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnc2xpZGUnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBsYXN0bHksIHNob3cgdGhlIHNpYmxpbmcgbm9kZXMgd2l0aCBhbmltYXRpb25cbiAgICAgICRzaWJsaW5ncy5maW5kKCcubm9kZTp2aXNpYmxlJykuYWRkQ2xhc3MoJ3NsaWRlJykucmVtb3ZlQ2xhc3MoJ3NsaWRlLWxlZnQgc2xpZGUtcmlnaHQnKS5lcSgtMSkub25lKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICRzaWJsaW5ncy5maW5kKCcubm9kZTp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ3NsaWRlJyk7XG4gICAgICAgIGlmICh0aGF0LmlzSW5BY3Rpb24oJG5vZGUpKSB7XG4gICAgICAgICAgdGhhdC5zd2l0Y2hIb3Jpem9udGFsQXJyb3coJG5vZGUpO1xuICAgICAgICAgICRub2RlLmNoaWxkcmVuKCcudG9wRWRnZScpLnJlbW92ZUNsYXNzKCdmYS1jaGV2cm9uLXVwJykuYWRkQ2xhc3MoJ2ZhLWNoZXZyb24tZG93bicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIC8vIHN0YXJ0IHVwIGxvYWRpbmcgc3RhdHVzIGZvciByZXF1ZXN0aW5nIG5ldyBub2Rlc1xuICAgIHN0YXJ0TG9hZGluZzogZnVuY3Rpb24gKCRhcnJvdywgJG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgIHZhciAkY2hhcnQgPSAkbm9kZS5jbG9zZXN0KCcub3JnY2hhcnQnKTtcbiAgICAgIGlmICh0eXBlb2YgJGNoYXJ0LmRhdGEoJ2luQWpheCcpICE9PSAndW5kZWZpbmVkJyAmJiAkY2hhcnQuZGF0YSgnaW5BamF4JykgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAkYXJyb3cuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgJG5vZGUuYXBwZW5kKCc8aSBjbGFzcz1cImZhIGZhLWNpcmNsZS1vLW5vdGNoIGZhLXNwaW4gc3Bpbm5lclwiPjwvaT4nKTtcbiAgICAgICRub2RlLmNoaWxkcmVuKCkubm90KCcuc3Bpbm5lcicpLmNzcygnb3BhY2l0eScsIDAuMik7XG4gICAgICAkY2hhcnQuZGF0YSgnaW5BamF4JywgdHJ1ZSk7XG4gICAgICAkKCcub2MtZXhwb3J0LWJ0bicgKyAob3B0aW9ucy5jaGFydENsYXNzICE9PSAnJyA/ICcuJyArIG9wdGlvbnMuY2hhcnRDbGFzcyA6ICcnKSkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLy8gdGVybWluYXRlIGxvYWRpbmcgc3RhdHVzIGZvciByZXF1ZXN0aW5nIG5ldyBub2Rlc1xuICAgIGVuZExvYWRpbmc6IGZ1bmN0aW9uICgkYXJyb3csICRub2RlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgJGNoYXJ0ID0gJG5vZGUuY2xvc2VzdCgnZGl2Lm9yZ2NoYXJ0Jyk7XG4gICAgICAkYXJyb3cucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgJG5vZGUuZmluZCgnLnNwaW5uZXInKS5yZW1vdmUoKTtcbiAgICAgICRub2RlLmNoaWxkcmVuKCkucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgICRjaGFydC5kYXRhKCdpbkFqYXgnLCBmYWxzZSk7XG4gICAgICAkKCcub2MtZXhwb3J0LWJ0bicgKyAob3B0aW9ucy5jaGFydENsYXNzICE9PSAnJyA/ICcuJyArIG9wdGlvbnMuY2hhcnRDbGFzcyA6ICcnKSkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XG4gICAgfSxcbiAgICAvLyB3aGV0aGVyIHRoZSBjdXJzb3IgaXMgaG92ZXJpbmcgb3ZlciB0aGUgbm9kZVxuICAgIGlzSW5BY3Rpb246IGZ1bmN0aW9uICgkbm9kZSkge1xuICAgICAgcmV0dXJuICRub2RlLmNoaWxkcmVuKCcuZWRnZScpLmF0dHIoJ2NsYXNzJykuaW5kZXhPZignZmEtJykgPiAtMSA/IHRydWUgOiBmYWxzZTtcbiAgICB9LFxuICAgIC8vXG4gICAgc3dpdGNoVmVydGljYWxBcnJvdzogZnVuY3Rpb24gKCRhcnJvdykge1xuICAgICAgJGFycm93LnRvZ2dsZUNsYXNzKCdmYS1jaGV2cm9uLXVwJykudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tZG93bicpO1xuICAgIH0sXG4gICAgLy9cbiAgICBzd2l0Y2hIb3Jpem9udGFsQXJyb3c6IGZ1bmN0aW9uICgkbm9kZSkge1xuICAgICAgdmFyIG9wdHMgPSAkbm9kZS5jbG9zZXN0KCcub3JnY2hhcnQnKS5kYXRhKCdvcHRpb25zJyk7XG4gICAgICBpZiAob3B0cy50b2dnbGVTaWJsaW5nc1Jlc3AgJiYgKHR5cGVvZiBvcHRzLmFqYXhVUkwgPT09ICd1bmRlZmluZWQnIHx8ICRub2RlLmNsb3Nlc3QoJy5ub2RlcycpLmRhdGEoJ3NpYmxpbmdzTG9hZGVkJykpKSB7XG4gICAgICAgIHZhciAkcHJldlNpYiA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykucGFyZW50KCkucHJldigpO1xuICAgICAgICBpZiAoJHByZXZTaWIubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKCRwcmV2U2liLmlzKCcuaGlkZGVuJykpIHtcbiAgICAgICAgICAgICRub2RlLmNoaWxkcmVuKCcubGVmdEVkZ2UnKS5hZGRDbGFzcygnZmEtY2hldnJvbi1sZWZ0JykucmVtb3ZlQ2xhc3MoJ2ZhLWNoZXZyb24tcmlnaHQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJG5vZGUuY2hpbGRyZW4oJy5sZWZ0RWRnZScpLmFkZENsYXNzKCdmYS1jaGV2cm9uLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2ZhLWNoZXZyb24tbGVmdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgJG5leHRTaWIgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpLm5leHQoKTtcbiAgICAgICAgaWYgKCRuZXh0U2liLmxlbmd0aCkge1xuICAgICAgICAgIGlmICgkbmV4dFNpYi5pcygnLmhpZGRlbicpKSB7XG4gICAgICAgICAgICAkbm9kZS5jaGlsZHJlbignLnJpZ2h0RWRnZScpLmFkZENsYXNzKCdmYS1jaGV2cm9uLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2ZhLWNoZXZyb24tbGVmdCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkbm9kZS5jaGlsZHJlbignLnJpZ2h0RWRnZScpLmFkZENsYXNzKCdmYS1jaGV2cm9uLWxlZnQnKS5yZW1vdmVDbGFzcygnZmEtY2hldnJvbi1yaWdodCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyICRzaWJzID0gJG5vZGUuY2xvc2VzdCgndGFibGUnKS5wYXJlbnQoKS5zaWJsaW5ncygpO1xuICAgICAgICB2YXIgc2lic1Zpc2libGUgPSAkc2licy5sZW5ndGggPyAhJHNpYnMuaXMoJy5oaWRkZW4nKSA6IGZhbHNlO1xuICAgICAgICAkbm9kZS5jaGlsZHJlbignLmxlZnRFZGdlJykudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tcmlnaHQnLCBzaWJzVmlzaWJsZSkudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tbGVmdCcsICFzaWJzVmlzaWJsZSk7XG4gICAgICAgICRub2RlLmNoaWxkcmVuKCcucmlnaHRFZGdlJykudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tbGVmdCcsIHNpYnNWaXNpYmxlKS50b2dnbGVDbGFzcygnZmEtY2hldnJvbi1yaWdodCcsICFzaWJzVmlzaWJsZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvL1xuICAgIHJlcGFpbnQ6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlLnN0eWxlLm9mZnNldFdpZHRoID0gbm9kZS5vZmZzZXRXaWR0aDtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGNyZWF0ZSBub2RlXG4gICAgY3JlYXRlTm9kZTogZnVuY3Rpb24gKG5vZGVEYXRhLCBsZXZlbCwgb3B0cykge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgJC5lYWNoKG5vZGVEYXRhLmNoaWxkcmVuLCBmdW5jdGlvbiAoaW5kZXgsIGNoaWxkKSB7XG4gICAgICAgIGNoaWxkLnBhcmVudElkID0gbm9kZURhdGEuaWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBkdGQgPSAkLkRlZmVycmVkKCk7XG4gICAgICAvLyBjb25zdHJ1Y3QgdGhlIGNvbnRlbnQgb2Ygbm9kZVxuICAgICAgdmFyICRub2RlRGl2ID0gJCgnPGRpdicgKyAob3B0cy5kcmFnZ2FibGUgPyAnIGRyYWdnYWJsZT1cInRydWVcIicgOiAnJykgKyAobm9kZURhdGFbb3B0cy5ub2RlSWRdID8gJyBpZD1cIicgKyBub2RlRGF0YVtvcHRzLm5vZGVJZF0gKyAnXCInIDogJycpICsgKG5vZGVEYXRhLnBhcmVudElkID8gJyBkYXRhLXBhcmVudD1cIicgKyBub2RlRGF0YS5wYXJlbnRJZCArICdcIicgOiAnJykgKyAnPicpXG4gICAgICAgIC5hZGRDbGFzcygnbm9kZSAnICsgKG5vZGVEYXRhLmNsYXNzTmFtZSB8fCAnJykgKyAgKGxldmVsID49IG9wdHMuZGVwdGggPyAnIHNsaWRlLXVwJyA6ICcnKSk7XG4gICAgICBpZiAob3B0cy5ub2RlVGVtcGxhdGUpIHtcbiAgICAgICAgJG5vZGVEaXYuYXBwZW5kKG9wdHMubm9kZVRlbXBsYXRlKG5vZGVEYXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkbm9kZURpdi5hcHBlbmQoJzxkaXYgY2xhc3M9XCJ0aXRsZVwiPicgKyBub2RlRGF0YVtvcHRzLm5vZGVUaXRsZV0gKyAnPC9kaXY+JylcbiAgICAgICAgICAuYXBwZW5kKHR5cGVvZiBvcHRzLm5vZGVDb250ZW50ICE9PSAndW5kZWZpbmVkJyA/ICc8ZGl2IGNsYXNzPVwiY29udGVudFwiPicgKyAobm9kZURhdGFbb3B0cy5ub2RlQ29udGVudF0gfHwgJycpICsgJzwvZGl2PicgOiAnJyk7XG4gICAgICB9XG4gICAgICAvLyBhcHBlbmQgNCBkaXJlY3Rpb24gYXJyb3dzIG9yIGV4cGFuZC9jb2xsYXBzZSBidXR0b25zXG4gICAgICB2YXIgZmxhZ3MgPSBub2RlRGF0YS5yZWxhdGlvbnNoaXAgfHwgJyc7XG4gICAgICBpZiAob3B0cy52ZXJ0aWNhbERlcHRoICYmIChsZXZlbCArIDIpID4gb3B0cy52ZXJ0aWNhbERlcHRoKSB7XG4gICAgICAgIGlmICgobGV2ZWwgKyAxKSA+PSBvcHRzLnZlcnRpY2FsRGVwdGggJiYgTnVtYmVyKGZsYWdzLnN1YnN0cigyLDEpKSkge1xuICAgICAgICAgIHZhciBpY29uID0gbGV2ZWwgKyAxICA+PSBvcHRzLmRlcHRoID8gJ3BsdXMnIDogJ21pbnVzJztcbiAgICAgICAgICAkbm9kZURpdi5hcHBlbmQoJzxpIGNsYXNzPVwidG9nZ2xlQnRuIGZhIGZhLScgKyBpY29uICsgJy1zcXVhcmVcIj48L2k+Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChOdW1iZXIoZmxhZ3Muc3Vic3RyKDAsMSkpKSB7XG4gICAgICAgICAgJG5vZGVEaXYuYXBwZW5kKCc8aSBjbGFzcz1cImVkZ2UgdmVydGljYWxFZGdlIHRvcEVkZ2UgZmFcIj48L2k+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoTnVtYmVyKGZsYWdzLnN1YnN0cigxLDEpKSkge1xuICAgICAgICAgICRub2RlRGl2LmFwcGVuZCgnPGkgY2xhc3M9XCJlZGdlIGhvcml6b250YWxFZGdlIHJpZ2h0RWRnZSBmYVwiPjwvaT4nICtcbiAgICAgICAgICAgICc8aSBjbGFzcz1cImVkZ2UgaG9yaXpvbnRhbEVkZ2UgbGVmdEVkZ2UgZmFcIj48L2k+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoTnVtYmVyKGZsYWdzLnN1YnN0cigyLDEpKSkge1xuICAgICAgICAgICRub2RlRGl2LmFwcGVuZCgnPGkgY2xhc3M9XCJlZGdlIHZlcnRpY2FsRWRnZSBib3R0b21FZGdlIGZhXCI+PC9pPicpXG4gICAgICAgICAgICAuY2hpbGRyZW4oJy50aXRsZScpLnByZXBlbmQoJzxpIGNsYXNzPVwiZmEgJysgb3B0cy5wYXJlbnROb2RlU3ltYm9sICsgJyBzeW1ib2xcIj48L2k+Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJG5vZGVEaXYub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciAkbm9kZSA9ICQodGhpcyksIGZsYWcgPSBmYWxzZTtcbiAgICAgICAgdmFyICR0b3BFZGdlID0gJG5vZGUuY2hpbGRyZW4oJy50b3BFZGdlJyk7XG4gICAgICAgIHZhciAkcmlnaHRFZGdlID0gJG5vZGUuY2hpbGRyZW4oJy5yaWdodEVkZ2UnKTtcbiAgICAgICAgdmFyICRib3R0b21FZGdlID0gJG5vZGUuY2hpbGRyZW4oJy5ib3R0b21FZGdlJyk7XG4gICAgICAgIHZhciAkbGVmdEVkZ2UgPSAkbm9kZS5jaGlsZHJlbignLmxlZnRFZGdlJyk7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbW91c2VlbnRlcicpIHtcbiAgICAgICAgICBpZiAoJHRvcEVkZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBmbGFnID0gdGhhdC5nZXROb2RlU3RhdGUoJG5vZGUsICdwYXJlbnQnKS52aXNpYmxlO1xuICAgICAgICAgICAgJHRvcEVkZ2UudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tdXAnLCAhZmxhZykudG9nZ2xlQ2xhc3MoJ2ZhLWNoZXZyb24tZG93bicsIGZsYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJGJvdHRvbUVkZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICBmbGFnID0gdGhhdC5nZXROb2RlU3RhdGUoJG5vZGUsICdjaGlsZHJlbicpLnZpc2libGU7XG4gICAgICAgICAgICAkYm90dG9tRWRnZS50b2dnbGVDbGFzcygnZmEtY2hldnJvbi1kb3duJywgIWZsYWcpLnRvZ2dsZUNsYXNzKCdmYS1jaGV2cm9uLXVwJywgZmxhZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgkbGVmdEVkZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGF0LnN3aXRjaEhvcml6b250YWxBcnJvdygkbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRub2RlLmNoaWxkcmVuKCcuZWRnZScpLnJlbW92ZUNsYXNzKCdmYS1jaGV2cm9uLXVwIGZhLWNoZXZyb24tZG93biBmYS1jaGV2cm9uLXJpZ2h0IGZhLWNoZXZyb24tbGVmdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZGVmaW5lIGNsaWNrIGV2ZW50IGhhbmRsZXJcbiAgICAgICRub2RlRGl2Lm9uKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICQodGhpcykuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZmluZCgnLmZvY3VzZWQnKS5yZW1vdmVDbGFzcygnZm9jdXNlZCcpO1xuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdmb2N1c2VkJyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZGVmaW5lIGNsaWNrIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSB0b3AgZWRnZVxuICAgICAgJG5vZGVEaXYub24oJ2NsaWNrJywgJy50b3BFZGdlJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHZhciAkdGhhdCA9ICQodGhpcyk7XG4gICAgICAgIHZhciAkbm9kZSA9ICR0aGF0LnBhcmVudCgpO1xuICAgICAgICB2YXIgcGFyZW50U3RhdGUgPSB0aGF0LmdldE5vZGVTdGF0ZSgkbm9kZSwgJ3BhcmVudCcpO1xuICAgICAgICBpZiAocGFyZW50U3RhdGUuZXhpc3QpIHtcbiAgICAgICAgICB2YXIgJHBhcmVudCA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykuY2xvc2VzdCgndHInKS5zaWJsaW5ncygnOmZpcnN0JykuZmluZCgnLm5vZGUnKTtcbiAgICAgICAgICBpZiAoJHBhcmVudC5pcygnLnNsaWRlJykpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgLy8gaGlkZSB0aGUgYW5jZXN0b3Igbm9kZXMgYW5kIHNpYmxpbmcgbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlLnZpc2libGUpIHtcbiAgICAgICAgICAgIHRoYXQuaGlkZVBhcmVudCgkbm9kZSk7XG4gICAgICAgICAgICAkcGFyZW50Lm9uZSgndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAodGhhdC5pc0luQWN0aW9uKCRub2RlKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuc3dpdGNoVmVydGljYWxBcnJvdygkdGhhdCk7XG4gICAgICAgICAgICAgICAgdGhhdC5zd2l0Y2hIb3Jpem9udGFsQXJyb3coJG5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBzaG93IHRoZSBhbmNlc3RvcnMgYW5kIHNpYmxpbmdzXG4gICAgICAgICAgICB0aGF0LnNob3dQYXJlbnQoJG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBsb2FkIHRoZSBuZXcgcGFyZW50IG5vZGUgb2YgdGhlIHNwZWNpZmllZCBub2RlIGJ5IGFqYXggcmVxdWVzdFxuICAgICAgICAgIHZhciBub2RlSWQgPSAkdGhhdC5wYXJlbnQoKVswXS5pZDtcbiAgICAgICAgICAvLyBzdGFydCB1cCBsb2FkaW5nIHN0YXR1c1xuICAgICAgICAgIGlmICh0aGF0LnN0YXJ0TG9hZGluZygkdGhhdCwgJG5vZGUsIG9wdHMpKSB7XG4gICAgICAgICAgLy8gbG9hZCBuZXcgbm9kZXNcbiAgICAgICAgICAgICQuYWpheCh7ICd1cmwnOiAkLmlzRnVuY3Rpb24ob3B0cy5hamF4VVJMLnBhcmVudCkgPyBvcHRzLmFqYXhVUkwucGFyZW50KG5vZGVEYXRhKSA6IG9wdHMuYWpheFVSTC5wYXJlbnQgKyBub2RlSWQsICdkYXRhVHlwZSc6ICdqc29uJyB9KVxuICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoJG5vZGUuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnaW5BamF4JykpIHtcbiAgICAgICAgICAgICAgICBpZiAoISQuaXNFbXB0eU9iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgdGhhdC5hZGRQYXJlbnQoJG5vZGUsIGRhdGEsIG9wdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGdldCBwYXJlbnQgbm9kZSBkYXRhJyk7IH0pXG4gICAgICAgICAgICAuYWx3YXlzKGZ1bmN0aW9uKCkgeyB0aGF0LmVuZExvYWRpbmcoJHRoYXQsICRub2RlLCBvcHRzKTsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gYmluZCBjbGljayBldmVudCBoYW5kbGVyIGZvciB0aGUgYm90dG9tIGVkZ2VcbiAgICAgICRub2RlRGl2Lm9uKCdjbGljaycsICcuYm90dG9tRWRnZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB2YXIgJHRoYXQgPSAkKHRoaXMpO1xuICAgICAgICB2YXIgJG5vZGUgPSAkdGhhdC5wYXJlbnQoKTtcbiAgICAgICAgdmFyIGNoaWxkcmVuU3RhdGUgPSB0aGF0LmdldE5vZGVTdGF0ZSgkbm9kZSwgJ2NoaWxkcmVuJyk7XG4gICAgICAgIGlmIChjaGlsZHJlblN0YXRlLmV4aXN0KSB7XG4gICAgICAgICAgdmFyICRjaGlsZHJlbiA9ICRub2RlLmNsb3Nlc3QoJ3RyJykuc2libGluZ3MoJzpsYXN0Jyk7XG4gICAgICAgICAgaWYgKCRjaGlsZHJlbi5maW5kKCcubm9kZTp2aXNpYmxlJykuaXMoJy5zbGlkZScpKSB7IHJldHVybjsgfVxuICAgICAgICAgIC8vIGhpZGUgdGhlIGRlc2NlbmRhbnQgbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlXG4gICAgICAgICAgaWYgKGNoaWxkcmVuU3RhdGUudmlzaWJsZSkge1xuICAgICAgICAgICAgdGhhdC5oaWRlQ2hpbGRyZW4oJG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIHNob3cgdGhlIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICB0aGF0LnNob3dDaGlsZHJlbigkbm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBsb2FkIHRoZSBuZXcgY2hpbGRyZW4gbm9kZXMgb2YgdGhlIHNwZWNpZmllZCBub2RlIGJ5IGFqYXggcmVxdWVzdFxuICAgICAgICAgIHZhciBub2RlSWQgPSAkdGhhdC5wYXJlbnQoKVswXS5pZDtcbiAgICAgICAgICBpZiAodGhhdC5zdGFydExvYWRpbmcoJHRoYXQsICRub2RlLCBvcHRzKSkge1xuICAgICAgICAgICAgJC5hamF4KHsgJ3VybCc6ICQuaXNGdW5jdGlvbihvcHRzLmFqYXhVUkwuY2hpbGRyZW4pID8gb3B0cy5hamF4VVJMLmNoaWxkcmVuKG5vZGVEYXRhKSA6IG9wdHMuYWpheFVSTC5jaGlsZHJlbiArIG5vZGVJZCwgJ2RhdGFUeXBlJzogJ2pzb24nIH0pXG4gICAgICAgICAgICAuZG9uZShmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgICAgICBpZiAoJG5vZGUuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnaW5BamF4JykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoYXQuYWRkQ2hpbGRyZW4oJG5vZGUsIGRhdGEsICQuZXh0ZW5kKHt9LCBvcHRzLCB7IGRlcHRoOiAwIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byBnZXQgY2hpbGRyZW4gbm9kZXMgZGF0YScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hbHdheXMoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRoYXQuZW5kTG9hZGluZygkdGhhdCwgJG5vZGUsIG9wdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBmb3IgdG9nZ2xlIGJ1dHRvbnMgaW4gSHlicmlkKGhvcml6b250YWwgKyB2ZXJ0aWNhbCkgT3JnQ2hhcnRcbiAgICAgICRub2RlRGl2Lm9uKCdjbGljaycsICcudG9nZ2xlQnRuJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcbiAgICAgICAgdmFyICRkZXNjV3JhcHBlciA9ICR0aGlzLnBhcmVudCgpLm5leHQoKTtcbiAgICAgICAgdmFyICRkZXNjZW5kYW50cyA9ICRkZXNjV3JhcHBlci5maW5kKCcubm9kZScpO1xuICAgICAgICB2YXIgJGNoaWxkcmVuID0gJGRlc2NXcmFwcGVyLmNoaWxkcmVuKCkuY2hpbGRyZW4oJy5ub2RlJyk7XG4gICAgICAgIGlmICgkY2hpbGRyZW4uaXMoJy5zbGlkZScpKSB7IHJldHVybjsgfVxuICAgICAgICAkdGhpcy50b2dnbGVDbGFzcygnZmEtcGx1cy1zcXVhcmUgZmEtbWludXMtc3F1YXJlJyk7XG4gICAgICAgIGlmICgkZGVzY2VuZGFudHMuZXEoMCkuaXMoJy5zbGlkZS11cCcpKSB7XG4gICAgICAgICAgJGRlc2NXcmFwcGVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcbiAgICAgICAgICB0aGF0LnJlcGFpbnQoJGNoaWxkcmVuLmdldCgwKSk7XG4gICAgICAgICAgJGNoaWxkcmVuLmFkZENsYXNzKCdzbGlkZScpLnJlbW92ZUNsYXNzKCdzbGlkZS11cCcpLmVxKDApLm9uZSgndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJGNoaWxkcmVuLnJlbW92ZUNsYXNzKCdzbGlkZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRkZXNjZW5kYW50cy5hZGRDbGFzcygnc2xpZGUgc2xpZGUtdXAnKS5lcSgwKS5vbmUoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICRkZXNjZW5kYW50cy5yZW1vdmVDbGFzcygnc2xpZGUnKTtcbiAgICAgICAgICAgIC8vICRkZXNjV3JhcHBlci5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgICAkZGVzY2VuZGFudHMuY2xvc2VzdCgndWwnKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJGRlc2NlbmRhbnRzLmZpbmQoJy50b2dnbGVCdG4nKS5yZW1vdmVDbGFzcygnZmEtbWludXMtc3F1YXJlJykuYWRkQ2xhc3MoJ2ZhLXBsdXMtc3F1YXJlJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBiaW5kIGNsaWNrIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBsZWZ0IGFuZCByaWdodCBlZGdlc1xuICAgICAgJG5vZGVEaXYub24oJ2NsaWNrJywgJy5sZWZ0RWRnZSwgLnJpZ2h0RWRnZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB2YXIgJHRoYXQgPSAkKHRoaXMpO1xuICAgICAgICB2YXIgJG5vZGUgPSAkdGhhdC5wYXJlbnQoKTtcbiAgICAgICAgdmFyIHNpYmxpbmdzU3RhdGUgPSB0aGF0LmdldE5vZGVTdGF0ZSgkbm9kZSwgJ3NpYmxpbmdzJyk7XG4gICAgICAgIGlmIChzaWJsaW5nc1N0YXRlLmV4aXN0KSB7XG4gICAgICAgICAgdmFyICRzaWJsaW5ncyA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykucGFyZW50KCkuc2libGluZ3MoKTtcbiAgICAgICAgICBpZiAoJHNpYmxpbmdzLmZpbmQoJy5ub2RlOnZpc2libGUnKS5pcygnLnNsaWRlJykpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgaWYgKG9wdHMudG9nZ2xlU2libGluZ3NSZXNwKSB7XG4gICAgICAgICAgICB2YXIgJHByZXZTaWIgPSAkbm9kZS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpLnByZXYoKTtcbiAgICAgICAgICAgIHZhciAkbmV4dFNpYiA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykucGFyZW50KCkubmV4dCgpO1xuICAgICAgICAgICAgaWYgKCR0aGF0LmlzKCcubGVmdEVkZ2UnKSkge1xuICAgICAgICAgICAgICBpZiAoJHByZXZTaWIuaXMoJy5oaWRkZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuc2hvd1NpYmxpbmdzKCRub2RlLCAnbGVmdCcpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoYXQuaGlkZVNpYmxpbmdzKCRub2RlLCAnbGVmdCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoJG5leHRTaWIuaXMoJy5oaWRkZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoYXQuc2hvd1NpYmxpbmdzKCRub2RlLCAncmlnaHQnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGF0LmhpZGVTaWJsaW5ncygkbm9kZSwgJ3JpZ2h0Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNpYmxpbmdzU3RhdGUudmlzaWJsZSkge1xuICAgICAgICAgICAgICB0aGF0LmhpZGVTaWJsaW5ncygkbm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGF0LnNob3dTaWJsaW5ncygkbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGxvYWQgdGhlIG5ldyBzaWJsaW5nIG5vZGVzIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSBieSBhamF4IHJlcXVlc3RcbiAgICAgICAgICB2YXIgbm9kZUlkID0gJHRoYXQucGFyZW50KClbMF0uaWQ7XG4gICAgICAgICAgdmFyIHVybCA9ICh0aGF0LmdldE5vZGVTdGF0ZSgkbm9kZSwgJ3BhcmVudCcpLmV4aXN0KSA/XG4gICAgICAgICAgICAoJC5pc0Z1bmN0aW9uKG9wdHMuYWpheFVSTC5zaWJsaW5ncykgPyBvcHRzLmFqYXhVUkwuc2libGluZ3Mobm9kZURhdGEpIDogb3B0cy5hamF4VVJMLnNpYmxpbmdzICsgbm9kZUlkKSA6XG4gICAgICAgICAgICAoJC5pc0Z1bmN0aW9uKG9wdHMuYWpheFVSTC5mYW1pbGllcykgPyBvcHRzLmFqYXhVUkwuZmFtaWxpZXMobm9kZURhdGEpIDogb3B0cy5hamF4VVJMLmZhbWlsaWVzICsgbm9kZUlkKTtcbiAgICAgICAgICBpZiAodGhhdC5zdGFydExvYWRpbmcoJHRoYXQsICRub2RlLCBvcHRzKSkge1xuICAgICAgICAgICAgJC5hamF4KHsgJ3VybCc6IHVybCwgJ2RhdGFUeXBlJzogJ2pzb24nIH0pXG4gICAgICAgICAgICAuZG9uZShmdW5jdGlvbihkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUikge1xuICAgICAgICAgICAgICBpZiAoJG5vZGUuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnaW5BamF4JykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5zaWJsaW5ncyB8fCBkYXRhLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICB0aGF0LmFkZFNpYmxpbmdzKCRub2RlLCBkYXRhLCBvcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbChmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZhaWxlZCB0byBnZXQgc2libGluZyBub2RlcyBkYXRhJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFsd2F5cyhmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdGhhdC5lbmRMb2FkaW5nKCR0aGF0LCAkbm9kZSwgb3B0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKG9wdHMuZHJhZ2dhYmxlKSB7XG4gICAgICAgICRub2RlRGl2Lm9uKCdkcmFnc3RhcnQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHZhciBvcmlnRXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50O1xuICAgICAgICAgIHZhciBpc0ZpcmVmb3ggPSAvZmlyZWZveC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICBpZiAoaXNGaXJlZm94KSB7XG4gICAgICAgICAgICBvcmlnRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvaHRtbCcsICdoYWNrIGZvciBmaXJlZm94Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIHVzZXJzIGVuYWJsZSB6b29tIG9yIGRpcmVjdGlvbiBvcHRpb25zXG4gICAgICAgICAgaWYgKCRub2RlRGl2LmNsb3Nlc3QoJy5vcmdjaGFydCcpLmNzcygndHJhbnNmb3JtJykgIT09ICdub25lJykge1xuICAgICAgICAgICAgdmFyIGdob3N0Tm9kZSwgbm9kZUNvdmVyO1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZ2hvc3Qtbm9kZScpKSB7XG4gICAgICAgICAgICAgIGdob3N0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgICAgICAgICAgICBnaG9zdE5vZGUuY2xhc3NMaXN0LmFkZCgnZ2hvc3Qtbm9kZScpO1xuICAgICAgICAgICAgICBub2RlQ292ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywncmVjdCcpO1xuICAgICAgICAgICAgICBnaG9zdE5vZGUuYXBwZW5kQ2hpbGQobm9kZUNvdmVyKTtcbiAgICAgICAgICAgICAgJG5vZGVEaXYuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuYXBwZW5kKGdob3N0Tm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBnaG9zdE5vZGUgPSAkbm9kZURpdi5jbG9zZXN0KCcub3JnY2hhcnQnKS5jaGlsZHJlbignLmdob3N0LW5vZGUnKS5nZXQoMCk7XG4gICAgICAgICAgICAgIG5vZGVDb3ZlciA9ICQoZ2hvc3ROb2RlKS5jaGlsZHJlbigpLmdldCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0cmFuc1ZhbHVlcyA9ICRub2RlRGl2LmNsb3Nlc3QoJy5vcmdjaGFydCcpLmNzcygndHJhbnNmb3JtJykuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIHZhciBzY2FsZSA9IE1hdGguYWJzKHdpbmRvdy5wYXJzZUZsb2F0KChvcHRzLmRpcmVjdGlvbiA9PT0gJ3QyYicgfHwgb3B0cy5kaXJlY3Rpb24gPT09ICdiMnQnKSA/IHRyYW5zVmFsdWVzWzBdLnNsaWNlKHRyYW5zVmFsdWVzWzBdLmluZGV4T2YoJygnKSArIDEpIDogdHJhbnNWYWx1ZXNbMV0pKTtcbiAgICAgICAgICAgIGdob3N0Tm9kZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJG5vZGVEaXYub3V0ZXJXaWR0aChmYWxzZSkpO1xuICAgICAgICAgICAgZ2hvc3ROb2RlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJG5vZGVEaXYub3V0ZXJIZWlnaHQoZmFsc2UpKTtcbiAgICAgICAgICAgIG5vZGVDb3Zlci5zZXRBdHRyaWJ1dGUoJ3gnLDUgKiBzY2FsZSk7XG4gICAgICAgICAgICBub2RlQ292ZXIuc2V0QXR0cmlidXRlKCd5Jyw1ICogc2NhbGUpO1xuICAgICAgICAgICAgbm9kZUNvdmVyLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAxMjAgKiBzY2FsZSk7XG4gICAgICAgICAgICBub2RlQ292ZXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCA0MCAqIHNjYWxlKTtcbiAgICAgICAgICAgIG5vZGVDb3Zlci5zZXRBdHRyaWJ1dGUoJ3J4JywgNCAqIHNjYWxlKTtcbiAgICAgICAgICAgIG5vZGVDb3Zlci5zZXRBdHRyaWJ1dGUoJ3J5JywgNCAqIHNjYWxlKTtcbiAgICAgICAgICAgIG5vZGVDb3Zlci5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIDEgKiBzY2FsZSk7XG4gICAgICAgICAgICB2YXIgeE9mZnNldCA9IG9yaWdFdmVudC5vZmZzZXRYICogc2NhbGU7XG4gICAgICAgICAgICB2YXIgeU9mZnNldCA9IG9yaWdFdmVudC5vZmZzZXRZICogc2NhbGU7XG4gICAgICAgICAgICBpZiAob3B0cy5kaXJlY3Rpb24gPT09ICdsMnInKSB7XG4gICAgICAgICAgICAgIHhPZmZzZXQgPSBvcmlnRXZlbnQub2Zmc2V0WSAqIHNjYWxlO1xuICAgICAgICAgICAgICB5T2Zmc2V0ID0gb3JpZ0V2ZW50Lm9mZnNldFggKiBzY2FsZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0cy5kaXJlY3Rpb24gPT09ICdyMmwnKSB7XG4gICAgICAgICAgICAgIHhPZmZzZXQgPSAkbm9kZURpdi5vdXRlcldpZHRoKGZhbHNlKSAtIG9yaWdFdmVudC5vZmZzZXRZICogc2NhbGU7XG4gICAgICAgICAgICAgIHlPZmZzZXQgPSBvcmlnRXZlbnQub2Zmc2V0WCAqIHNjYWxlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRzLmRpcmVjdGlvbiA9PT0gJ2IydCcpIHtcbiAgICAgICAgICAgICAgeE9mZnNldCA9ICRub2RlRGl2Lm91dGVyV2lkdGgoZmFsc2UpIC0gb3JpZ0V2ZW50Lm9mZnNldFggKiBzY2FsZTtcbiAgICAgICAgICAgICAgeU9mZnNldCA9ICRub2RlRGl2Lm91dGVySGVpZ2h0KGZhbHNlKSAtIG9yaWdFdmVudC5vZmZzZXRZICogc2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNGaXJlZm94KSB7IC8vIGhhY2sgZm9yIG9sZCB2ZXJzaW9uIG9mIEZpcmVmb3goPCA0OC4wKVxuICAgICAgICAgICAgICBub2RlQ292ZXIuc2V0QXR0cmlidXRlKCdmaWxsJywgJ3JnYigyNTUsIDI1NSwgMjU1KScpO1xuICAgICAgICAgICAgICBub2RlQ292ZXIuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAncmdiKDE5MSwgMCwgMCknKTtcbiAgICAgICAgICAgICAgdmFyIGdob3N0Tm9kZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICAgICAgZ2hvc3ROb2RlV3JhcHBlci5zcmMgPSAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArIChuZXcgWE1MU2VyaWFsaXplcigpKS5zZXJpYWxpemVUb1N0cmluZyhnaG9zdE5vZGUpO1xuICAgICAgICAgICAgICBvcmlnRXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShnaG9zdE5vZGVXcmFwcGVyLCB4T2Zmc2V0LCB5T2Zmc2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9yaWdFdmVudC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGdob3N0Tm9kZSwgeE9mZnNldCwgeU9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciAkZHJhZ2dlZCA9ICQodGhpcyk7XG4gICAgICAgICAgdmFyICRkcmFnWm9uZSA9ICRkcmFnZ2VkLmNsb3Nlc3QoJy5ub2RlcycpLnNpYmxpbmdzKCkuZXEoMCkuZmluZCgnLm5vZGU6Zmlyc3QnKTtcbiAgICAgICAgICB2YXIgJGRyYWdIaWVyID0gJGRyYWdnZWQuY2xvc2VzdCgndGFibGUnKS5maW5kKCcubm9kZScpO1xuICAgICAgICAgICRkcmFnZ2VkLmNsb3Nlc3QoJy5vcmdjaGFydCcpXG4gICAgICAgICAgICAuZGF0YSgnZHJhZ2dlZCcsICRkcmFnZ2VkKVxuICAgICAgICAgICAgLmZpbmQoJy5ub2RlJykuZWFjaChmdW5jdGlvbihpbmRleCwgbm9kZSkge1xuICAgICAgICAgICAgICBpZiAoJGRyYWdIaWVyLmluZGV4KG5vZGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmRyb3BDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuZHJvcENyaXRlcmlhKCRkcmFnZ2VkLCAkZHJhZ1pvbmUsICQobm9kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICQobm9kZSkuYWRkQ2xhc3MoJ2FsbG93ZWREcm9wJyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICQobm9kZSkuYWRkQ2xhc3MoJ2FsbG93ZWREcm9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdkcmFnb3ZlcicsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoISQodGhpcykuaXMoJy5hbGxvd2VkRHJvcCcpKSB7XG4gICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5vcmdjaGFydCcpLmZpbmQoJy5hbGxvd2VkRHJvcCcpLnJlbW92ZUNsYXNzKCdhbGxvd2VkRHJvcCcpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2Ryb3AnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHZhciAkZHJvcFpvbmUgPSAkKHRoaXMpO1xuICAgICAgICAgIHZhciAkb3JnY2hhcnQgPSAkZHJvcFpvbmUuY2xvc2VzdCgnLm9yZ2NoYXJ0Jyk7XG4gICAgICAgICAgdmFyICRkcmFnZ2VkID0gJG9yZ2NoYXJ0LmRhdGEoJ2RyYWdnZWQnKTtcbiAgICAgICAgICAkb3JnY2hhcnQuZmluZCgnLmFsbG93ZWREcm9wJykucmVtb3ZlQ2xhc3MoJ2FsbG93ZWREcm9wJyk7XG4gICAgICAgICAgdmFyICRkcmFnWm9uZSA9ICRkcmFnZ2VkLmNsb3Nlc3QoJy5ub2RlcycpLnNpYmxpbmdzKCkuZXEoMCkuY2hpbGRyZW4oKTtcbiAgICAgICAgICAvLyBmaXJzdGx5LCBkZWFsIHdpdGggdGhlIGhpZXJhcmNoeSBvZiBkcm9wIHpvbmVcbiAgICAgICAgICBpZiAoISRkcm9wWm9uZS5jbG9zZXN0KCd0cicpLnNpYmxpbmdzKCkubGVuZ3RoKSB7IC8vIGlmIHRoZSBkcm9wIHpvbmUgaXMgYSBsZWFmIG5vZGVcbiAgICAgICAgICAgICRkcm9wWm9uZS5hcHBlbmQoJzxpIGNsYXNzPVwiZWRnZSB2ZXJ0aWNhbEVkZ2UgYm90dG9tRWRnZSBmYVwiPjwvaT4nKVxuICAgICAgICAgICAgICAucGFyZW50KCkuYXR0cignY29sc3BhbicsIDIpXG4gICAgICAgICAgICAgIC5wYXJlbnQoKS5hZnRlcignPHRyIGNsYXNzPVwibGluZXNcIj48dGQgY29sc3Bhbj1cIjJcIj48ZGl2IGNsYXNzPVwiZG93bkxpbmVcIj48L2Rpdj48L3RkPjwvdHI+J1xuICAgICAgICAgICAgICArICc8dHIgY2xhc3M9XCJsaW5lc1wiPjx0ZCBjbGFzcz1cInJpZ2h0TGluZVwiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPVwibGVmdExpbmVcIj4mbmJzcDs8L3RkPjwvdHI+J1xuICAgICAgICAgICAgICArICc8dHIgY2xhc3M9XCJub2Rlc1wiPjwvdHI+JylcbiAgICAgICAgICAgICAgLnNpYmxpbmdzKCc6bGFzdCcpLmFwcGVuZCgkZHJhZ2dlZC5maW5kKCcuaG9yaXpvbnRhbEVkZ2UnKS5yZW1vdmUoKS5lbmQoKS5jbG9zZXN0KCd0YWJsZScpLnBhcmVudCgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRyb3BDb2xzcGFuID0gcGFyc2VJbnQoJGRyb3Bab25lLnBhcmVudCgpLmF0dHIoJ2NvbHNwYW4nKSkgKyAyO1xuICAgICAgICAgICAgdmFyIGhvcml6b250YWxFZGdlcyA9ICc8aSBjbGFzcz1cImVkZ2UgaG9yaXpvbnRhbEVkZ2UgcmlnaHRFZGdlIGZhXCI+PC9pPjxpIGNsYXNzPVwiZWRnZSBob3Jpem9udGFsRWRnZSBsZWZ0RWRnZSBmYVwiPjwvaT4nO1xuICAgICAgICAgICAgJGRyb3Bab25lLmNsb3Nlc3QoJ3RyJykubmV4dCgpLmFkZEJhY2soKS5jaGlsZHJlbigpLmF0dHIoJ2NvbHNwYW4nLCBkcm9wQ29sc3Bhbik7XG4gICAgICAgICAgICBpZiAoISRkcmFnZ2VkLmZpbmQoJy5ob3Jpem9udGFsRWRnZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAkZHJhZ2dlZC5hcHBlbmQoaG9yaXpvbnRhbEVkZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRkcm9wWm9uZS5jbG9zZXN0KCd0cicpLnNpYmxpbmdzKCkuZXEoMSkuY2hpbGRyZW4oJzpsYXN0JykuYmVmb3JlKCc8dGQgY2xhc3M9XCJsZWZ0TGluZSB0b3BMaW5lXCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9XCJyaWdodExpbmUgdG9wTGluZVwiPiZuYnNwOzwvdGQ+JylcbiAgICAgICAgICAgICAgLmVuZCgpLm5leHQoKS5hcHBlbmQoJGRyYWdnZWQuY2xvc2VzdCgndGFibGUnKS5wYXJlbnQoKSk7XG4gICAgICAgICAgICB2YXIgJGRyb3BTaWJzID0gJGRyYWdnZWQuY2xvc2VzdCgndGFibGUnKS5wYXJlbnQoKS5zaWJsaW5ncygpLmZpbmQoJy5ub2RlOmZpcnN0Jyk7XG4gICAgICAgICAgICBpZiAoJGRyb3BTaWJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAkZHJvcFNpYnMuYXBwZW5kKGhvcml6b250YWxFZGdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHNlY29uZGx5LCBkZWFsIHdpdGggdGhlIGhpZXJhcmNoeSBvZiBkcmFnZ2VkIG5vZGVcbiAgICAgICAgICB2YXIgZHJhZ0NvbHNwYW4gPSBwYXJzZUludCgkZHJhZ1pvbmUuYXR0cignY29sc3BhbicpKTtcbiAgICAgICAgICBpZiAoZHJhZ0NvbHNwYW4gPiAyKSB7XG4gICAgICAgICAgICAkZHJhZ1pvbmUuYXR0cignY29sc3BhbicsIGRyYWdDb2xzcGFuIC0gMilcbiAgICAgICAgICAgICAgLnBhcmVudCgpLm5leHQoKS5jaGlsZHJlbigpLmF0dHIoJ2NvbHNwYW4nLCBkcmFnQ29sc3BhbiAtIDIpXG4gICAgICAgICAgICAgIC5lbmQoKS5uZXh0KCkuY2hpbGRyZW4oKS5zbGljZSgxLCAzKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIHZhciAkZHJhZ1NpYnMgPSAkZHJhZ1pvbmUucGFyZW50KCkuc2libGluZ3MoJy5ub2RlcycpLmNoaWxkcmVuKCkuZmluZCgnLm5vZGU6Zmlyc3QnKTtcbiAgICAgICAgICAgIGlmICgkZHJhZ1NpYnMubGVuZ3RoID09PTEpIHtcbiAgICAgICAgICAgICAgJGRyYWdTaWJzLmZpbmQoJy5ob3Jpem9udGFsRWRnZScpLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkZHJhZ1pvbmUucmVtb3ZlQXR0cignY29sc3BhbicpXG4gICAgICAgICAgICAgIC5maW5kKCcuYm90dG9tRWRnZScpLnJlbW92ZSgpXG4gICAgICAgICAgICAgIC5lbmQoKS5lbmQoKS5zaWJsaW5ncygpLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAkb3JnY2hhcnQudHJpZ2dlckhhbmRsZXIoeyAndHlwZSc6ICdub2RlZHJvcHBlZC5vcmdjaGFydCcsICdkcmFnZ2VkTm9kZSc6ICRkcmFnZ2VkLCAnZHJhZ1pvbmUnOiAkZHJhZ1pvbmUuY2hpbGRyZW4oKSwgJ2Ryb3Bab25lJzogJGRyb3Bab25lIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGFsbG93IHVzZXIgdG8gYXBwZW5kIGRvbSBtb2RpZmljYXRpb24gYWZ0ZXIgZmluaXNoaW5nIG5vZGUgY3JlYXRlIG9mIG9yZ2NoYXJ0XG4gICAgICBpZiAob3B0cy5jcmVhdGVOb2RlKSB7XG4gICAgICAgIG9wdHMuY3JlYXRlTm9kZSgkbm9kZURpdiwgbm9kZURhdGEpO1xuICAgICAgfVxuICAgICAgZHRkLnJlc29sdmUoJG5vZGVEaXYpO1xuICAgICAgcmV0dXJuIGR0ZC5wcm9taXNlKCk7XG4gICAgfSxcbiAgICAvLyByZWN1cnNpdmVseSBidWlsZCB0aGUgdHJlZVxuICAgIGJ1aWxkSGllcmFyY2h5OiBmdW5jdGlvbiAoJGFwcGVuZFRvLCBub2RlRGF0YSwgbGV2ZWwsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgJG5vZGVXcmFwcGVyO1xuICAgICAgLy8gQ29uc3RydWN0IHRoZSBub2RlXG4gICAgICB2YXIgJGNoaWxkTm9kZXMgPSBub2RlRGF0YS5jaGlsZHJlbjtcbiAgICAgIHZhciBoYXNDaGlsZHJlbiA9ICRjaGlsZE5vZGVzID8gJGNoaWxkTm9kZXMubGVuZ3RoIDogZmFsc2U7XG4gICAgICB2YXIgaXNWZXJ0aWNhbE5vZGUgPSAob3B0cy52ZXJ0aWNhbERlcHRoICYmIChsZXZlbCArIDEpID49IG9wdHMudmVydGljYWxEZXB0aCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICBpZiAoT2JqZWN0LmtleXMobm9kZURhdGEpLmxlbmd0aCA+IDEpIHsgLy8gaWYgbm9kZURhdGEgaGFzIG5lc3RlZCBzdHJ1Y3R1cmVcbiAgICAgICAgJG5vZGVXcmFwcGVyID0gaXNWZXJ0aWNhbE5vZGUgPyAkYXBwZW5kVG8gOiAkKCc8dGFibGU+Jyk7XG4gICAgICAgIGlmICghaXNWZXJ0aWNhbE5vZGUpIHtcbiAgICAgICAgICAkYXBwZW5kVG8uYXBwZW5kKCRub2RlV3JhcHBlcik7XG4gICAgICAgIH1cbiAgICAgICAgJC53aGVuKHRoaXMuY3JlYXRlTm9kZShub2RlRGF0YSwgbGV2ZWwsIG9wdHMpKVxuICAgICAgICAuZG9uZShmdW5jdGlvbigkbm9kZURpdikge1xuICAgICAgICAgIGlmIChpc1ZlcnRpY2FsTm9kZSkge1xuICAgICAgICAgICAgJG5vZGVXcmFwcGVyLmFwcGVuZCgkbm9kZURpdik7XG4gICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgJG5vZGVXcmFwcGVyLmFwcGVuZCgkbm9kZURpdi53cmFwKCc8dHI+PHRkJyArIChoYXNDaGlsZHJlbiA/ICcgY29sc3Bhbj1cIicgKyAkY2hpbGROb2Rlcy5sZW5ndGggKiAyICsgJ1wiJyA6ICcnKSArICc+PC90ZD48L3RyPicpLmNsb3Nlc3QoJ3RyJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmFpbChmdW5jdGlvbigpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGNyZWF0IG5vZGUnKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIENvbnN0cnVjdCB0aGUgaW5mZXJpb3Igbm9kZXMgYW5kIGNvbm5lY3Rpb25nIGxpbmVzXG4gICAgICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG5vZGVEYXRhKS5sZW5ndGggPT09IDEpIHsgLy8gaWYgbm9kZURhdGEgaXMganVzdCBhbiBhcnJheVxuICAgICAgICAgICRub2RlV3JhcHBlciA9ICRhcHBlbmRUbztcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNIaWRkZW4gPSAobGV2ZWwgKyAxID49IG9wdHMuZGVwdGggfHwgbm9kZURhdGEuY29sbGFwc2VkKSA/ICcgaGlkZGVuJyA6ICcnO1xuICAgICAgICB2YXIgaXNWZXJ0aWNhbExheWVyID0gKG9wdHMudmVydGljYWxEZXB0aCAmJiAobGV2ZWwgKyAyKSA+PSBvcHRzLnZlcnRpY2FsRGVwdGgpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIGRyYXcgdGhlIGxpbmUgY2xvc2UgdG8gcGFyZW50IG5vZGVcbiAgICAgICAgaWYgKCFpc1ZlcnRpY2FsTGF5ZXIpIHtcbiAgICAgICAgICAkbm9kZVdyYXBwZXIuYXBwZW5kKCc8dHIgY2xhc3M9XCJsaW5lcycgKyBpc0hpZGRlbiArICdcIj48dGQgY29sc3Bhbj1cIicgKyAkY2hpbGROb2Rlcy5sZW5ndGggKiAyICsgJ1wiPjxkaXYgY2xhc3M9XCJkb3duTGluZVwiPjwvZGl2PjwvdGQ+PC90cj4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkcmF3IHRoZSBsaW5lcyBjbG9zZSB0byBjaGlsZHJlbiBub2Rlc1xuICAgICAgICB2YXIgbGluZUxheWVyID0gJzx0ciBjbGFzcz1cImxpbmVzJyArIGlzSGlkZGVuICsgJ1wiPjx0ZCBjbGFzcz1cInJpZ2h0TGluZVwiPiZuYnNwOzwvdGQ+JztcbiAgICAgICAgZm9yICh2YXIgaT0xOyBpPCRjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGluZUxheWVyICs9ICc8dGQgY2xhc3M9XCJsZWZ0TGluZSB0b3BMaW5lXCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9XCJyaWdodExpbmUgdG9wTGluZVwiPiZuYnNwOzwvdGQ+JztcbiAgICAgICAgfVxuICAgICAgICBsaW5lTGF5ZXIgKz0gJzx0ZCBjbGFzcz1cImxlZnRMaW5lXCI+Jm5ic3A7PC90ZD48L3RyPic7XG4gICAgICAgIHZhciAkbm9kZUxheWVyO1xuICAgICAgICBpZiAoaXNWZXJ0aWNhbExheWVyKSB7XG4gICAgICAgICAgJG5vZGVMYXllciA9ICQoJzx1bD4nKTtcbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICRub2RlTGF5ZXIuYWRkQ2xhc3MoaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGV2ZWwgKyAyID09PSBvcHRzLnZlcnRpY2FsRGVwdGgpIHtcbiAgICAgICAgICAgICRub2RlV3JhcHBlci5hcHBlbmQoJzx0ciBjbGFzcz1cInZlcnRpY2FsTm9kZXMnICsgaXNIaWRkZW4gKyAnXCI+PHRkPjwvdGQ+PC90cj4nKVxuICAgICAgICAgICAgICAuZmluZCgnLnZlcnRpY2FsTm9kZXMnKS5jaGlsZHJlbigpLmFwcGVuZCgkbm9kZUxheWVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJG5vZGVXcmFwcGVyLmFwcGVuZCgkbm9kZUxheWVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJG5vZGVMYXllciA9ICQoJzx0ciBjbGFzcz1cIm5vZGVzJyArIGlzSGlkZGVuICsgJ1wiPicpO1xuICAgICAgICAgICRub2RlV3JhcHBlci5hcHBlbmQobGluZUxheWVyKS5hcHBlbmQoJG5vZGVMYXllcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVjdXJzZSB0aHJvdWdoIGNoaWxkcmVuIG5vZGVzXG4gICAgICAgICQuZWFjaCgkY2hpbGROb2RlcywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyICRub2RlQ2VsbCA9IGlzVmVydGljYWxMYXllciA/ICQoJzxsaT4nKSA6ICQoJzx0ZCBjb2xzcGFuPVwiMlwiPicpO1xuICAgICAgICAgICRub2RlTGF5ZXIuYXBwZW5kKCRub2RlQ2VsbCk7XG4gICAgICAgICAgdGhhdC5idWlsZEhpZXJhcmNoeSgkbm9kZUNlbGwsIHRoaXMsIGxldmVsICsgMSwgb3B0cywgY2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGJ1aWxkIHRoZSBjaGlsZCBub2RlcyBvZiBzcGVjaWZpYyBub2RlXG4gICAgYnVpbGRDaGlsZE5vZGU6IGZ1bmN0aW9uICgkYXBwZW5kVG8sIG5vZGVEYXRhLCBvcHRzLCBjYWxsYmFjaykge1xuICAgICAgdmFyIG9wdHMgPSBvcHRzIHx8ICRhcHBlbmRUby5jbG9zZXN0KCcub3JnY2hhcnQnKS5kYXRhKCdvcHRpb25zJyk7XG4gICAgICB2YXIgZGF0YSA9IG5vZGVEYXRhLmNoaWxkcmVuIHx8IG5vZGVEYXRhLnNpYmxpbmdzO1xuICAgICAgJGFwcGVuZFRvLmZpbmQoJ3RkOmZpcnN0JykuYXR0cignY29sc3BhbicsIGRhdGEubGVuZ3RoICogMik7XG4gICAgICB0aGlzLmJ1aWxkSGllcmFyY2h5KCRhcHBlbmRUbywgeyAnY2hpbGRyZW4nOiBkYXRhIH0sIDAsIG9wdHMsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIC8vIGV4cG9zZWQgbWV0aG9kXG4gICAgYWRkQ2hpbGRyZW46IGZ1bmN0aW9uICgkbm9kZSwgZGF0YSwgb3B0cykge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdHMgPSBvcHRzIHx8ICRub2RlLmNsb3Nlc3QoJy5vcmdjaGFydCcpLmRhdGEoJ29wdGlvbnMnKTtcbiAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICB0aGlzLmJ1aWxkQ2hpbGROb2RlKCRub2RlLmNsb3Nlc3QoJ3RhYmxlJyksIGRhdGEsIG9wdHMsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoKytjb3VudCA9PT0gZGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoISRub2RlLmNoaWxkcmVuKCcuYm90dG9tRWRnZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgJG5vZGUuYXBwZW5kKCc8aSBjbGFzcz1cImVkZ2UgdmVydGljYWxFZGdlIGJvdHRvbUVkZ2UgZmFcIj48L2k+Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghJG5vZGUuZmluZCgnLnN5bWJvbCcpLmxlbmd0aCkge1xuICAgICAgICAgICAgJG5vZGUuY2hpbGRyZW4oJy50aXRsZScpLnByZXBlbmQoJzxpIGNsYXNzPVwiZmEgJysgb3B0cy5wYXJlbnROb2RlU3ltYm9sICsgJyBzeW1ib2xcIj48L2k+Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoYXQuc2hvd0NoaWxkcmVuKCRub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBidWlsZCB0aGUgcGFyZW50IG5vZGUgb2Ygc3BlY2lmaWMgbm9kZVxuICAgIGJ1aWxkUGFyZW50Tm9kZTogZnVuY3Rpb24gKCRjdXJyZW50Um9vdCwgbm9kZURhdGEsIG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgJHRhYmxlID0gJCgnPHRhYmxlPicpO1xuICAgICAgbm9kZURhdGEucmVsYXRpb25zaGlwID0gbm9kZURhdGEucmVsYXRpb25zaGlwIHx8ICcwMDEnO1xuICAgICAgJC53aGVuKHRoaXMuY3JlYXRlTm9kZShub2RlRGF0YSwgMCwgb3B0cyB8fCAkY3VycmVudFJvb3QuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnb3B0aW9ucycpKSlcbiAgICAgICAgLmRvbmUoZnVuY3Rpb24oJG5vZGVEaXYpIHtcbiAgICAgICAgICAkdGFibGUuYXBwZW5kKCRub2RlRGl2LnJlbW92ZUNsYXNzKCdzbGlkZS11cCcpLmFkZENsYXNzKCdzbGlkZS1kb3duJykud3JhcCgnPHRyIGNsYXNzPVwiaGlkZGVuXCI+PHRkIGNvbHNwYW49XCIyXCI+PC90ZD48L3RyPicpLmNsb3Nlc3QoJ3RyJykpO1xuICAgICAgICAgICR0YWJsZS5hcHBlbmQoJzx0ciBjbGFzcz1cImxpbmVzIGhpZGRlblwiPjx0ZCBjb2xzcGFuPVwiMlwiPjxkaXYgY2xhc3M9XCJkb3duTGluZVwiPjwvZGl2PjwvdGQ+PC90cj4nKTtcbiAgICAgICAgICB2YXIgbGluZXNSb3cgPSAnPHRkIGNsYXNzPVwicmlnaHRMaW5lXCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9XCJsZWZ0TGluZVwiPiZuYnNwOzwvdGQ+JztcbiAgICAgICAgICAkdGFibGUuYXBwZW5kKCc8dHIgY2xhc3M9XCJsaW5lcyBoaWRkZW5cIj4nICsgbGluZXNSb3cgKyAnPC90cj4nKTtcbiAgICAgICAgICB2YXIgJGNoYXJ0ID0gdGhhdC4kY2hhcnQ7XG4gICAgICAgICAgJGNoYXJ0LnByZXBlbmQoJHRhYmxlKVxuICAgICAgICAgICAgLmNoaWxkcmVuKCd0YWJsZTpmaXJzdCcpLmFwcGVuZCgnPHRyIGNsYXNzPVwibm9kZXNcIj48dGQgY29sc3Bhbj1cIjJcIj48L3RkPjwvdHI+JylcbiAgICAgICAgICAgIC5jaGlsZHJlbigndHI6bGFzdCcpLmNoaWxkcmVuKCkuYXBwZW5kKCRjaGFydC5jaGlsZHJlbigndGFibGUnKS5sYXN0KCkpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5mYWlsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gY3JlYXRlIHBhcmVudCBub2RlJyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gZXhwb3NlZCBtZXRob2RcbiAgICBhZGRQYXJlbnQ6IGZ1bmN0aW9uICgkY3VycmVudFJvb3QsIGRhdGEsIG9wdHMpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMuYnVpbGRQYXJlbnROb2RlKCRjdXJyZW50Um9vdCwgZGF0YSwgb3B0cywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghJGN1cnJlbnRSb290LmNoaWxkcmVuKCcudG9wRWRnZScpLmxlbmd0aCkge1xuICAgICAgICAgICRjdXJyZW50Um9vdC5jaGlsZHJlbignLnRpdGxlJykuYWZ0ZXIoJzxpIGNsYXNzPVwiZWRnZSB2ZXJ0aWNhbEVkZ2UgdG9wRWRnZSBmYVwiPjwvaT4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0LnNob3dQYXJlbnQoJGN1cnJlbnRSb290KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gc3Vic2VxdWVudCBwcm9jZXNzaW5nIG9mIGJ1aWxkIHNpYmxpbmcgbm9kZXNcbiAgICBjb21wbGVtZW50TGluZTogZnVuY3Rpb24gKCRvbmVTaWJsaW5nLCBzaWJsaW5nQ291bnQsIGV4aXN0aW5nU2libGlnQ291bnQpIHtcbiAgICAgIHZhciBsaW5lcyA9ICcnO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGlzdGluZ1NpYmxpZ0NvdW50OyBpKyspIHtcbiAgICAgICAgbGluZXMgKz0gJzx0ZCBjbGFzcz1cImxlZnRMaW5lIHRvcExpbmVcIj4mbmJzcDs8L3RkPjx0ZCBjbGFzcz1cInJpZ2h0TGluZSB0b3BMaW5lXCI+Jm5ic3A7PC90ZD4nO1xuICAgICAgfVxuICAgICAgJG9uZVNpYmxpbmcucGFyZW50KCkucHJldkFsbCgndHI6Z3QoMCknKS5jaGlsZHJlbigpLmF0dHIoJ2NvbHNwYW4nLCBzaWJsaW5nQ291bnQgKiAyKVxuICAgICAgICAuZW5kKCkubmV4dCgpLmNoaWxkcmVuKCc6Zmlyc3QnKS5hZnRlcihsaW5lcyk7XG4gICAgfSxcbiAgICAvLyBidWlsZCB0aGUgc2libGluZyBub2RlcyBvZiBzcGVjaWZpYyBub2RlXG4gICAgYnVpbGRTaWJsaW5nTm9kZTogZnVuY3Rpb24gKCRub2RlQ2hhcnQsIG5vZGVEYXRhLCBvcHRzLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIG9wdHMgPSBvcHRzIHx8ICRub2RlQ2hhcnQuY2xvc2VzdCgnLm9yZ2NoYXJ0JykuZGF0YSgnb3B0aW9ucycpO1xuICAgICAgdmFyIG5ld1NpYmxpbmdDb3VudCA9IG5vZGVEYXRhLnNpYmxpbmdzID8gbm9kZURhdGEuc2libGluZ3MubGVuZ3RoIDogbm9kZURhdGEuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgdmFyIGV4aXN0aW5nU2libGlnQ291bnQgPSAkbm9kZUNoYXJ0LnBhcmVudCgpLmlzKCd0ZCcpID8gJG5vZGVDaGFydC5jbG9zZXN0KCd0cicpLmNoaWxkcmVuKCkubGVuZ3RoIDogMTtcbiAgICAgIHZhciBzaWJsaW5nQ291bnQgPSBleGlzdGluZ1NpYmxpZ0NvdW50ICsgbmV3U2libGluZ0NvdW50O1xuICAgICAgdmFyIGluc2VydFBvc3Rpb24gPSAoc2libGluZ0NvdW50ID4gMSkgPyBNYXRoLmZsb29yKHNpYmxpbmdDb3VudC8yIC0gMSkgOiAwO1xuICAgICAgLy8ganVzdCBidWlsZCB0aGUgc2libGluZyBub2RlcyBmb3IgdGhlIHNwZWNpZmljIG5vZGVcbiAgICAgIGlmICgkbm9kZUNoYXJ0LnBhcmVudCgpLmlzKCd0ZCcpKSB7XG4gICAgICAgIHZhciAkcGFyZW50ID0gJG5vZGVDaGFydC5jbG9zZXN0KCd0cicpLnByZXZBbGwoJ3RyOmxhc3QnKTtcbiAgICAgICAgJG5vZGVDaGFydC5jbG9zZXN0KCd0cicpLnByZXZBbGwoJ3RyOmx0KDIpJykucmVtb3ZlKCk7XG4gICAgICAgIHZhciBjaGlsZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5idWlsZENoaWxkTm9kZSgkbm9kZUNoYXJ0LnBhcmVudCgpLmNsb3Nlc3QoJ3RhYmxlJyksIG5vZGVEYXRhLCBvcHRzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoKytjaGlsZENvdW50ID09PSBuZXdTaWJsaW5nQ291bnQpIHtcbiAgICAgICAgICAgIHZhciAkc2libGluZ1RkcyA9ICRub2RlQ2hhcnQucGFyZW50KCkuY2xvc2VzdCgndGFibGUnKS5jaGlsZHJlbigndHI6bGFzdCcpLmNoaWxkcmVuKCd0ZCcpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nU2libGlnQ291bnQgPiAxKSB7XG4gICAgICAgICAgICAgIHRoYXQuY29tcGxlbWVudExpbmUoJHNpYmxpbmdUZHMuZXEoMCkuYmVmb3JlKCRub2RlQ2hhcnQuY2xvc2VzdCgndGQnKS5zaWJsaW5ncygpLmFkZEJhY2soKS51bndyYXAoKSksIHNpYmxpbmdDb3VudCwgZXhpc3RpbmdTaWJsaWdDb3VudCk7XG4gICAgICAgICAgICAgICRzaWJsaW5nVGRzLmFkZENsYXNzKCdoaWRkZW4nKS5maW5kKCcubm9kZScpLmFkZENsYXNzKCdzbGlkZS1sZWZ0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGF0LmNvbXBsZW1lbnRMaW5lKCRzaWJsaW5nVGRzLmVxKGluc2VydFBvc3Rpb24pLmFmdGVyKCRub2RlQ2hhcnQuY2xvc2VzdCgndGQnKS51bndyYXAoKSksIHNpYmxpbmdDb3VudCwgMSk7XG4gICAgICAgICAgICAgICRzaWJsaW5nVGRzLm5vdCgnOmVxKCcgKyBpbnNlcnRQb3N0aW9uICsgMSArICcpJykuYWRkQ2xhc3MoJ2hpZGRlbicpXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIGluc2VydFBvc3Rpb24pLmZpbmQoJy5ub2RlJykuYWRkQ2xhc3MoJ3NsaWRlLXJpZ2h0JylcbiAgICAgICAgICAgICAgICAuZW5kKCkuZW5kKCkuc2xpY2UoaW5zZXJ0UG9zdGlvbikuZmluZCgnLm5vZGUnKS5hZGRDbGFzcygnc2xpZGUtbGVmdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHsgLy8gYnVpbGQgdGhlIHNpYmxpbmcgbm9kZXMgYW5kIHBhcmVudCBub2RlIGZvciB0aGUgc3BlY2lmaWMgbmRvZVxuICAgICAgICB2YXIgbm9kZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5idWlsZEhpZXJhcmNoeSgkbm9kZUNoYXJ0LmNsb3Nlc3QoJy5vcmdjaGFydCcpLCBub2RlRGF0YSwgMCwgb3B0cywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKCsrbm9kZUNvdW50ID09PSBzaWJsaW5nQ291bnQpIHtcbiAgICAgICAgICAgIHRoYXQuY29tcGxlbWVudExpbmUoJG5vZGVDaGFydC5uZXh0KCkuY2hpbGRyZW4oJ3RyOmxhc3QnKVxuICAgICAgICAgICAgICAuY2hpbGRyZW4oKS5lcShpbnNlcnRQb3N0aW9uKS5hZnRlcigkKCc8dGQgY29sc3Bhbj1cIjJcIj4nKVxuICAgICAgICAgICAgICAuYXBwZW5kKCRub2RlQ2hhcnQpKSwgc2libGluZ0NvdW50LCAxKTtcbiAgICAgICAgICAgICRub2RlQ2hhcnQuY2xvc2VzdCgndHInKS5zaWJsaW5ncygpLmVxKDApLmFkZENsYXNzKCdoaWRkZW4nKS5maW5kKCcubm9kZScpLmFkZENsYXNzKCdzbGlkZS1kb3duJyk7XG4gICAgICAgICAgICAkbm9kZUNoYXJ0LnBhcmVudCgpLnNpYmxpbmdzKCkuYWRkQ2xhc3MoJ2hpZGRlbicpXG4gICAgICAgICAgICAgIC5zbGljZSgwLCBpbnNlcnRQb3N0aW9uKS5maW5kKCcubm9kZScpLmFkZENsYXNzKCdzbGlkZS1yaWdodCcpXG4gICAgICAgICAgICAgIC5lbmQoKS5lbmQoKS5zbGljZShpbnNlcnRQb3N0aW9uKS5maW5kKCcubm9kZScpLmFkZENsYXNzKCdzbGlkZS1sZWZ0Jyk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvL1xuICAgIGFkZFNpYmxpbmdzOiBmdW5jdGlvbiAoJG5vZGUsIGRhdGEsIG9wdHMpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMuYnVpbGRTaWJsaW5nTm9kZSgkbm9kZS5jbG9zZXN0KCd0YWJsZScpLCBkYXRhLCBvcHRzLCBmdW5jdGlvbigpIHtcbiAgICAgICAgJG5vZGUuY2xvc2VzdCgnLm5vZGVzJykuZGF0YSgnc2libGluZ3NMb2FkZWQnLCB0cnVlKTtcbiAgICAgICAgaWYgKCEkbm9kZS5jaGlsZHJlbignLmxlZnRFZGdlJykubGVuZ3RoKSB7XG4gICAgICAgICAgJG5vZGUuY2hpbGRyZW4oJy50b3BFZGdlJykuYWZ0ZXIoJzxpIGNsYXNzPVwiZWRnZSBob3Jpem9udGFsRWRnZSByaWdodEVkZ2UgZmFcIj48L2k+PGkgY2xhc3M9XCJlZGdlIGhvcml6b250YWxFZGdlIGxlZnRFZGdlIGZhXCI+PC9pPicpO1xuICAgICAgICB9XG4gICAgICAgIHRoYXQuc2hvd1NpYmxpbmdzKCRub2RlKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgLy9cbiAgICByZW1vdmVOb2RlczogZnVuY3Rpb24gKCRub2RlKSB7XG4gICAgICB2YXIgJHBhcmVudCA9ICRub2RlLmNsb3Nlc3QoJ3RhYmxlJykucGFyZW50KCk7XG4gICAgICB2YXIgJHNpYnMgPSAkcGFyZW50LnBhcmVudCgpLnNpYmxpbmdzKCk7XG4gICAgICBpZiAoJHBhcmVudC5pcygndGQnKSkge1xuICAgICAgICBpZiAodGhpcy5nZXROb2RlU3RhdGUoJG5vZGUsICdzaWJsaW5ncycpLmV4aXN0KSB7XG4gICAgICAgICAgJHNpYnMuZXEoMikuY2hpbGRyZW4oJy50b3BMaW5lOmx0KDIpJykucmVtb3ZlKCk7XG4gICAgICAgICAgJHNpYnMuc2xpY2UoMCwgMikuY2hpbGRyZW4oKS5hdHRyKCdjb2xzcGFuJywgJHNpYnMuZXEoMikuY2hpbGRyZW4oKS5sZW5ndGgpO1xuICAgICAgICAgICRwYXJlbnQucmVtb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJHNpYnMuZXEoMCkuY2hpbGRyZW4oKS5yZW1vdmVBdHRyKCdjb2xzcGFuJylcbiAgICAgICAgICAgIC5maW5kKCcuYm90dG9tRWRnZScpLnJlbW92ZSgpXG4gICAgICAgICAgICAuZW5kKCkuZW5kKCkuc2libGluZ3MoKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHBhcmVudC5hZGQoJHBhcmVudC5zaWJsaW5ncygpKS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJC5mbi5vcmdjaGFydCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBPcmdDaGFydCh0aGlzLCBvcHRzKS5pbml0KCk7XG4gIH07XG5cbn0pKTsiXX0=
|